// Generated by the protocol buffer compiler.  DO NOT EDIT!


#import "Descriptor.pb.h"

// @@protoc_insertion_point(imports)

@implementation PBDescriptorRoot
static PBExtensionRegistry* extensionRegistry = nil;
+ (PBExtensionRegistry*) extensionRegistry {
  return extensionRegistry;
}

+ (void) initialize {
  if (self == [PBDescriptorRoot class]) {
    PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry];
    [self registerAllExtensions:registry];
    extensionRegistry = registry;
  }
}
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry {
}
@end

@interface PBFileDescriptorSet ()
@property (strong) NSMutableArray * fileArray;
@end

@implementation PBFileDescriptorSet

@synthesize fileArray;
@dynamic file;
- (id) init {
  if ((self = [super init])) {
  }
  return self;
}
static PBFileDescriptorSet* defaultPBFileDescriptorSetInstance = nil;
+ (void) initialize {
  if (self == [PBFileDescriptorSet class]) {
    defaultPBFileDescriptorSetInstance = [[PBFileDescriptorSet alloc] init];
  }
}
+ (PBFileDescriptorSet*) defaultInstance {
  return defaultPBFileDescriptorSetInstance;
}
- (PBFileDescriptorSet*) defaultInstance {
  return defaultPBFileDescriptorSetInstance;
}
- (NSArray *)file {
  return fileArray;
}
- (PBFileDescriptorProto*)fileAtIndex:(NSUInteger)index {
  return [fileArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInitfile = YES;
   [self.file enumerateObjectsUsingBlock:^(PBFileDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitfile = NO;
      *stop = YES;
    }
  }];
  if (!isInitfile) return isInitfile;
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  [self.fileArray enumerateObjectsUsingBlock:^(PBFileDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:1 value:element];
  }];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  [self.fileArray enumerateObjectsUsingBlock:^(PBFileDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(1, element);
  }];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBFileDescriptorSet*) parseFromData:(NSData*) data {
  return (PBFileDescriptorSet*)[[[PBFileDescriptorSet builder] mergeFromData:data] build];
}
+ (PBFileDescriptorSet*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileDescriptorSet*)[[[PBFileDescriptorSet builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBFileDescriptorSet*) parseFromInputStream:(NSInputStream*) input {
  return (PBFileDescriptorSet*)[[[PBFileDescriptorSet builder] mergeFromInputStream:input] build];
}
+ (PBFileDescriptorSet*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileDescriptorSet*)[[[PBFileDescriptorSet builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFileDescriptorSet*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBFileDescriptorSet*)[[[PBFileDescriptorSet builder] mergeFromCodedInputStream:input] build];
}
+ (PBFileDescriptorSet*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileDescriptorSet*)[[[PBFileDescriptorSet builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFileDescriptorSetBuilder*) builder {
  return [[PBFileDescriptorSetBuilder alloc] init];
}
+ (PBFileDescriptorSetBuilder*) builderWithPrototype:(PBFileDescriptorSet*) prototype {
  return [[PBFileDescriptorSet builder] mergeFrom:prototype];
}
- (PBFileDescriptorSetBuilder*) builder {
  return [PBFileDescriptorSet builder];
}
- (PBFileDescriptorSetBuilder*) toBuilder {
  return [PBFileDescriptorSet builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  [self.fileArray enumerateObjectsUsingBlock:^(PBFileDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"file"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBFileDescriptorSet class]]) {
    return NO;
  }
  PBFileDescriptorSet *otherMessage = other;
  return
      [self.fileArray isEqualToArray:otherMessage.fileArray] &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  [self.fileArray enumerateObjectsUsingBlock:^(PBFileDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBFileDescriptorSetBuilder()
@property (strong) PBFileDescriptorSet* result;
@end

@implementation PBFileDescriptorSetBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBFileDescriptorSet alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBFileDescriptorSetBuilder*) clear {
  self.result = [[PBFileDescriptorSet alloc] init];
  return self;
}
- (PBFileDescriptorSetBuilder*) clone {
  return [PBFileDescriptorSet builderWithPrototype:result];
}
- (PBFileDescriptorSet*) defaultInstance {
  return [PBFileDescriptorSet defaultInstance];
}
- (PBFileDescriptorSet*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBFileDescriptorSet*) buildPartial {
  PBFileDescriptorSet* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBFileDescriptorSetBuilder*) mergeFrom:(PBFileDescriptorSet*) other {
  if (other == [PBFileDescriptorSet defaultInstance]) {
    return self;
  }
  if (other.fileArray.count > 0) {
    if (result.fileArray == nil) {
      result.fileArray = [[NSMutableArray alloc] initWithArray:other.fileArray];
    } else {
      [result.fileArray addObjectsFromArray:other.fileArray];
    }
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBFileDescriptorSetBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBFileDescriptorSetBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        PBFileDescriptorProtoBuilder* subBuilder = [PBFileDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addFile:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (NSMutableArray *)file {
  return result.fileArray;
}
- (PBFileDescriptorProto*)fileAtIndex:(NSUInteger)index {
  return [result fileAtIndex:index];
}
- (PBFileDescriptorSetBuilder *)addFile:(PBFileDescriptorProto*)value {
  if (result.fileArray == nil) {
    result.fileArray = [[NSMutableArray alloc]init];
  }
  [result.fileArray addObject:value];
  return self;
}
- (PBFileDescriptorSetBuilder *)setFileArray:(NSArray *)array {
  result.fileArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFileDescriptorSetBuilder *)clearFile {
  result.fileArray = nil;
  return self;
}
@end

@interface PBFileDescriptorProto ()
@property (strong) NSString* name;
@property (strong) NSString* package;
@property (strong) NSMutableArray * dependencyArray;
@property (strong) PBAppendableArray * publicDependencyArray;
@property (strong) PBAppendableArray * weakDependencyArray;
@property (strong) NSMutableArray * messageTypeArray;
@property (strong) NSMutableArray * enumTypeArray;
@property (strong) NSMutableArray * serviceArray;
@property (strong) NSMutableArray * extensionArray;
@property (strong) PBFileOptions* options;
@property (strong) PBSourceCodeInfo* sourceCodeInfo;
@end

@implementation PBFileDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
- (BOOL) hasPackage {
  return !!hasPackage_;
}
- (void) setHasPackage:(BOOL) value_ {
  hasPackage_ = !!value_;
}
@synthesize package;
@synthesize dependencyArray;
@dynamic dependency;
@synthesize publicDependencyArray;
@dynamic publicDependency;
@synthesize weakDependencyArray;
@dynamic weakDependency;
@synthesize messageTypeArray;
@dynamic messageType;
@synthesize enumTypeArray;
@dynamic enumType;
@synthesize serviceArray;
@dynamic service;
@synthesize extensionArray;
@dynamic extension;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (BOOL) hasSourceCodeInfo {
  return !!hasSourceCodeInfo_;
}
- (void) setHasSourceCodeInfo:(BOOL) value_ {
  hasSourceCodeInfo_ = !!value_;
}
@synthesize sourceCodeInfo;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.package = @"";
    self.options = [PBFileOptions defaultInstance];
    self.sourceCodeInfo = [PBSourceCodeInfo defaultInstance];
  }
  return self;
}
static PBFileDescriptorProto* defaultPBFileDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBFileDescriptorProto class]) {
    defaultPBFileDescriptorProtoInstance = [[PBFileDescriptorProto alloc] init];
  }
}
+ (PBFileDescriptorProto*) defaultInstance {
  return defaultPBFileDescriptorProtoInstance;
}
- (PBFileDescriptorProto*) defaultInstance {
  return defaultPBFileDescriptorProtoInstance;
}
- (NSArray *)dependency {
  return dependencyArray;
}
- (NSString*)dependencyAtIndex:(NSUInteger)index {
  return [dependencyArray objectAtIndex:index];
}
- (PBArray *)publicDependency {
  return publicDependencyArray;
}
- (SInt32)publicDependencyAtIndex:(NSUInteger)index {
  return [publicDependencyArray int32AtIndex:index];
}
- (PBArray *)weakDependency {
  return weakDependencyArray;
}
- (SInt32)weakDependencyAtIndex:(NSUInteger)index {
  return [weakDependencyArray int32AtIndex:index];
}
- (NSArray *)messageType {
  return messageTypeArray;
}
- (PBDescriptorProto*)messageTypeAtIndex:(NSUInteger)index {
  return [messageTypeArray objectAtIndex:index];
}
- (NSArray *)enumType {
  return enumTypeArray;
}
- (PBEnumDescriptorProto*)enumTypeAtIndex:(NSUInteger)index {
  return [enumTypeArray objectAtIndex:index];
}
- (NSArray *)service {
  return serviceArray;
}
- (PBServiceDescriptorProto*)serviceAtIndex:(NSUInteger)index {
  return [serviceArray objectAtIndex:index];
}
- (NSArray *)extension {
  return extensionArray;
}
- (PBFieldDescriptorProto*)extensionAtIndex:(NSUInteger)index {
  return [extensionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInitmessageType = YES;
   [self.messageType enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitmessageType = NO;
      *stop = YES;
    }
  }];
  if (!isInitmessageType) return isInitmessageType;
  __block BOOL isInitenumType = YES;
   [self.enumType enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitenumType = NO;
      *stop = YES;
    }
  }];
  if (!isInitenumType) return isInitenumType;
  __block BOOL isInitservice = YES;
   [self.service enumerateObjectsUsingBlock:^(PBServiceDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitservice = NO;
      *stop = YES;
    }
  }];
  if (!isInitservice) return isInitservice;
  __block BOOL isInitextension = YES;
   [self.extension enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitextension = NO;
      *stop = YES;
    }
  }];
  if (!isInitextension) return isInitextension;
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  if (self.hasPackage) {
    [output writeString:2 value:self.package];
  }
  [self.dependencyArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) {
    [output writeString:3 value:element];
  }];
  [self.messageTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:4 value:element];
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:5 value:element];
  }];
  [self.serviceArray enumerateObjectsUsingBlock:^(PBServiceDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:6 value:element];
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:7 value:element];
  }];
  if (self.hasOptions) {
    [output writeMessage:8 value:self.options];
  }
  if (self.hasSourceCodeInfo) {
    [output writeMessage:9 value:self.sourceCodeInfo];
  }
  const NSUInteger publicDependencyArrayCount = self.publicDependencyArray.count;
  if (publicDependencyArrayCount > 0) {
    const SInt32 *values = (const SInt32 *)self.publicDependencyArray.data;
    for (NSUInteger i = 0; i < publicDependencyArrayCount; ++i) {
      [output writeInt32:10 value:values[i]];
    }
  }
  const NSUInteger weakDependencyArrayCount = self.weakDependencyArray.count;
  if (weakDependencyArrayCount > 0) {
    const SInt32 *values = (const SInt32 *)self.weakDependencyArray.data;
    for (NSUInteger i = 0; i < weakDependencyArrayCount; ++i) {
      [output writeInt32:11 value:values[i]];
    }
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  if (self.hasPackage) {
    size_ += computeStringSize(2, self.package);
  }
  {
    __block SInt32 dataSize = 0;
    const NSUInteger count = self.dependencyArray.count;
    [self.dependencyArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) {
      dataSize += computeStringSizeNoTag(element);
    }];
    size_ += dataSize;
    size_ += (SInt32)(1 * count);
  }
  [self.messageTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(4, element);
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(5, element);
  }];
  [self.serviceArray enumerateObjectsUsingBlock:^(PBServiceDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(6, element);
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(7, element);
  }];
  if (self.hasOptions) {
    size_ += computeMessageSize(8, self.options);
  }
  if (self.hasSourceCodeInfo) {
    size_ += computeMessageSize(9, self.sourceCodeInfo);
  }
  {
    __block SInt32 dataSize = 0;
    const NSUInteger count = self.publicDependencyArray.count;
    const SInt32 *values = (const SInt32 *)self.publicDependencyArray.data;
    for (NSUInteger i = 0; i < count; ++i) {
      dataSize += computeInt32SizeNoTag(values[i]);
    }
    size_ += dataSize;
    size_ += (SInt32)(1 * count);
  }
  {
    __block SInt32 dataSize = 0;
    const NSUInteger count = self.weakDependencyArray.count;
    const SInt32 *values = (const SInt32 *)self.weakDependencyArray.data;
    for (NSUInteger i = 0; i < count; ++i) {
      dataSize += computeInt32SizeNoTag(values[i]);
    }
    size_ += dataSize;
    size_ += (SInt32)(1 * count);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBFileDescriptorProto*) parseFromData:(NSData*) data {
  return (PBFileDescriptorProto*)[[[PBFileDescriptorProto builder] mergeFromData:data] build];
}
+ (PBFileDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileDescriptorProto*)[[[PBFileDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBFileDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBFileDescriptorProto*)[[[PBFileDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBFileDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileDescriptorProto*)[[[PBFileDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFileDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBFileDescriptorProto*)[[[PBFileDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBFileDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileDescriptorProto*)[[[PBFileDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFileDescriptorProtoBuilder*) builder {
  return [[PBFileDescriptorProtoBuilder alloc] init];
}
+ (PBFileDescriptorProtoBuilder*) builderWithPrototype:(PBFileDescriptorProto*) prototype {
  return [[PBFileDescriptorProto builder] mergeFrom:prototype];
}
- (PBFileDescriptorProtoBuilder*) builder {
  return [PBFileDescriptorProto builder];
}
- (PBFileDescriptorProtoBuilder*) toBuilder {
  return [PBFileDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  if (self.hasPackage) {
    [output appendFormat:@"%@%@: %@\n", indent, @"package", self.package];
  }
  [self.dependencyArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@: %@\n", indent, @"dependency", obj];
  }];
  [self.messageTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"messageType"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"enumType"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.serviceArray enumerateObjectsUsingBlock:^(PBServiceDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"service"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"extension"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  if (self.hasSourceCodeInfo) {
    [output appendFormat:@"%@%@ {\n", indent, @"sourceCodeInfo"];
    [self.sourceCodeInfo writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  [self.publicDependencyArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@: %@\n", indent, @"publicDependency", obj];
  }];
  [self.weakDependencyArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@: %@\n", indent, @"weakDependency", obj];
  }];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBFileDescriptorProto class]]) {
    return NO;
  }
  PBFileDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      self.hasPackage == otherMessage.hasPackage &&
      (!self.hasPackage || [self.package isEqual:otherMessage.package]) &&
      [self.dependencyArray isEqualToArray:otherMessage.dependencyArray] &&
      [self.messageTypeArray isEqualToArray:otherMessage.messageTypeArray] &&
      [self.enumTypeArray isEqualToArray:otherMessage.enumTypeArray] &&
      [self.serviceArray isEqualToArray:otherMessage.serviceArray] &&
      [self.extensionArray isEqualToArray:otherMessage.extensionArray] &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      self.hasSourceCodeInfo == otherMessage.hasSourceCodeInfo &&
      (!self.hasSourceCodeInfo || [self.sourceCodeInfo isEqual:otherMessage.sourceCodeInfo]) &&
      [self.publicDependencyArray isEqualToArray:otherMessage.publicDependencyArray] &&
      [self.weakDependencyArray isEqualToArray:otherMessage.weakDependencyArray] &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  if (self.hasPackage) {
    hashCode = hashCode * 31 + [self.package hash];
  }
  [self.dependencyArray enumerateObjectsUsingBlock:^(id element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.messageTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.serviceArray enumerateObjectsUsingBlock:^(PBServiceDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  if (self.hasSourceCodeInfo) {
    hashCode = hashCode * 31 + [self.sourceCodeInfo hash];
  }
  [self.publicDependencyArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [obj longValue];
  }];
  [self.weakDependencyArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [obj longValue];
  }];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBFileDescriptorProtoBuilder()
@property (strong) PBFileDescriptorProto* result;
@end

@implementation PBFileDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBFileDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBFileDescriptorProtoBuilder*) clear {
  self.result = [[PBFileDescriptorProto alloc] init];
  return self;
}
- (PBFileDescriptorProtoBuilder*) clone {
  return [PBFileDescriptorProto builderWithPrototype:result];
}
- (PBFileDescriptorProto*) defaultInstance {
  return [PBFileDescriptorProto defaultInstance];
}
- (PBFileDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBFileDescriptorProto*) buildPartial {
  PBFileDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBFileDescriptorProtoBuilder*) mergeFrom:(PBFileDescriptorProto*) other {
  if (other == [PBFileDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.hasPackage) {
    [self setPackage:other.package];
  }
  if (other.dependencyArray.count > 0) {
    if (result.dependencyArray == nil) {
      result.dependencyArray = [[NSMutableArray alloc] initWithArray:other.dependencyArray];
    } else {
      [result.dependencyArray addObjectsFromArray:other.dependencyArray];
    }
  }
  if (other.publicDependencyArray.count > 0) {
    if (result.publicDependencyArray == nil) {
      result.publicDependencyArray = [other.publicDependencyArray copy];
    } else {
      [result.publicDependencyArray appendArray:other.publicDependencyArray];
    }
  }
  if (other.weakDependencyArray.count > 0) {
    if (result.weakDependencyArray == nil) {
      result.weakDependencyArray = [other.weakDependencyArray copy];
    } else {
      [result.weakDependencyArray appendArray:other.weakDependencyArray];
    }
  }
  if (other.messageTypeArray.count > 0) {
    if (result.messageTypeArray == nil) {
      result.messageTypeArray = [[NSMutableArray alloc] initWithArray:other.messageTypeArray];
    } else {
      [result.messageTypeArray addObjectsFromArray:other.messageTypeArray];
    }
  }
  if (other.enumTypeArray.count > 0) {
    if (result.enumTypeArray == nil) {
      result.enumTypeArray = [[NSMutableArray alloc] initWithArray:other.enumTypeArray];
    } else {
      [result.enumTypeArray addObjectsFromArray:other.enumTypeArray];
    }
  }
  if (other.serviceArray.count > 0) {
    if (result.serviceArray == nil) {
      result.serviceArray = [[NSMutableArray alloc] initWithArray:other.serviceArray];
    } else {
      [result.serviceArray addObjectsFromArray:other.serviceArray];
    }
  }
  if (other.extensionArray.count > 0) {
    if (result.extensionArray == nil) {
      result.extensionArray = [[NSMutableArray alloc] initWithArray:other.extensionArray];
    } else {
      [result.extensionArray addObjectsFromArray:other.extensionArray];
    }
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  if (other.hasSourceCodeInfo) {
    [self mergeSourceCodeInfo:other.sourceCodeInfo];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBFileDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBFileDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 18: {
        [self setPackage:[input readString]];
        break;
      }
      case 26: {
        [self addDependency:[input readString]];
        break;
      }
      case 34: {
        PBDescriptorProtoBuilder* subBuilder = [PBDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addMessageType:[subBuilder buildPartial]];
        break;
      }
      case 42: {
        PBEnumDescriptorProtoBuilder* subBuilder = [PBEnumDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addEnumType:[subBuilder buildPartial]];
        break;
      }
      case 50: {
        PBServiceDescriptorProtoBuilder* subBuilder = [PBServiceDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addService:[subBuilder buildPartial]];
        break;
      }
      case 58: {
        PBFieldDescriptorProtoBuilder* subBuilder = [PBFieldDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addExtension:[subBuilder buildPartial]];
        break;
      }
      case 66: {
        PBFileOptionsBuilder* subBuilder = [PBFileOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
      case 74: {
        PBSourceCodeInfoBuilder* subBuilder = [PBSourceCodeInfo builder];
        if (self.hasSourceCodeInfo) {
          [subBuilder mergeFrom:self.sourceCodeInfo];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setSourceCodeInfo:[subBuilder buildPartial]];
        break;
      }
      case 80: {
        [self addPublicDependency:[input readInt32]];
        break;
      }
      case 88: {
        [self addWeakDependency:[input readInt32]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBFileDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBFileDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (BOOL) hasPackage {
  return result.hasPackage;
}
- (NSString*) package {
  return result.package;
}
- (PBFileDescriptorProtoBuilder*) setPackage:(NSString*) value {
  result.hasPackage = YES;
  result.package = value;
  return self;
}
- (PBFileDescriptorProtoBuilder*) clearPackage {
  result.hasPackage = NO;
  result.package = @"";
  return self;
}
- (NSMutableArray *)dependency {
  return result.dependencyArray;
}
- (NSString*)dependencyAtIndex:(NSUInteger)index {
  return [result dependencyAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addDependency:(NSString*)value {
  if (result.dependencyArray == nil) {
    result.dependencyArray = [[NSMutableArray alloc]init];
  }
  [result.dependencyArray addObject:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setDependencyArray:(NSArray *)array {
  result.dependencyArray = [[NSMutableArray alloc] initWithArray:array];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearDependency {
  result.dependencyArray = nil;
  return self;
}
- (PBAppendableArray *)publicDependency {
  return result.publicDependencyArray;
}
- (SInt32)publicDependencyAtIndex:(NSUInteger)index {
  return [result publicDependencyAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addPublicDependency:(SInt32)value {
  if (result.publicDependencyArray == nil) {
    result.publicDependencyArray = [PBAppendableArray arrayWithValueType:PBArrayValueTypeInt32];
  }
  [result.publicDependencyArray addInt32:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setPublicDependencyArray:(NSArray *)array {
  result.publicDependencyArray = [PBAppendableArray arrayWithArray:array valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setPublicDependencyValues:(const SInt32 *)values count:(NSUInteger)count {
  result.publicDependencyArray = [PBAppendableArray arrayWithValues:values count:count valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearPublicDependency {
  result.publicDependencyArray = nil;
  return self;
}
- (PBAppendableArray *)weakDependency {
  return result.weakDependencyArray;
}
- (SInt32)weakDependencyAtIndex:(NSUInteger)index {
  return [result weakDependencyAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addWeakDependency:(SInt32)value {
  if (result.weakDependencyArray == nil) {
    result.weakDependencyArray = [PBAppendableArray arrayWithValueType:PBArrayValueTypeInt32];
  }
  [result.weakDependencyArray addInt32:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setWeakDependencyArray:(NSArray *)array {
  result.weakDependencyArray = [PBAppendableArray arrayWithArray:array valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setWeakDependencyValues:(const SInt32 *)values count:(NSUInteger)count {
  result.weakDependencyArray = [PBAppendableArray arrayWithValues:values count:count valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearWeakDependency {
  result.weakDependencyArray = nil;
  return self;
}
- (NSMutableArray *)messageType {
  return result.messageTypeArray;
}
- (PBDescriptorProto*)messageTypeAtIndex:(NSUInteger)index {
  return [result messageTypeAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addMessageType:(PBDescriptorProto*)value {
  if (result.messageTypeArray == nil) {
    result.messageTypeArray = [[NSMutableArray alloc]init];
  }
  [result.messageTypeArray addObject:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setMessageTypeArray:(NSArray *)array {
  result.messageTypeArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearMessageType {
  result.messageTypeArray = nil;
  return self;
}
- (NSMutableArray *)enumType {
  return result.enumTypeArray;
}
- (PBEnumDescriptorProto*)enumTypeAtIndex:(NSUInteger)index {
  return [result enumTypeAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addEnumType:(PBEnumDescriptorProto*)value {
  if (result.enumTypeArray == nil) {
    result.enumTypeArray = [[NSMutableArray alloc]init];
  }
  [result.enumTypeArray addObject:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setEnumTypeArray:(NSArray *)array {
  result.enumTypeArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearEnumType {
  result.enumTypeArray = nil;
  return self;
}
- (NSMutableArray *)service {
  return result.serviceArray;
}
- (PBServiceDescriptorProto*)serviceAtIndex:(NSUInteger)index {
  return [result serviceAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addService:(PBServiceDescriptorProto*)value {
  if (result.serviceArray == nil) {
    result.serviceArray = [[NSMutableArray alloc]init];
  }
  [result.serviceArray addObject:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setServiceArray:(NSArray *)array {
  result.serviceArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearService {
  result.serviceArray = nil;
  return self;
}
- (NSMutableArray *)extension {
  return result.extensionArray;
}
- (PBFieldDescriptorProto*)extensionAtIndex:(NSUInteger)index {
  return [result extensionAtIndex:index];
}
- (PBFileDescriptorProtoBuilder *)addExtension:(PBFieldDescriptorProto*)value {
  if (result.extensionArray == nil) {
    result.extensionArray = [[NSMutableArray alloc]init];
  }
  [result.extensionArray addObject:value];
  return self;
}
- (PBFileDescriptorProtoBuilder *)setExtensionArray:(NSArray *)array {
  result.extensionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFileDescriptorProtoBuilder *)clearExtension {
  result.extensionArray = nil;
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBFileOptions*) options {
  return result.options;
}
- (PBFileDescriptorProtoBuilder*) setOptions:(PBFileOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBFileDescriptorProtoBuilder*) setOptionsBuilder:(PBFileOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBFileDescriptorProtoBuilder*) mergeOptions:(PBFileOptions*) value {
  if (result.hasOptions &&
      result.options != [PBFileOptions defaultInstance]) {
    result.options =
      [[[PBFileOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBFileDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBFileOptions defaultInstance];
  return self;
}
- (BOOL) hasSourceCodeInfo {
  return result.hasSourceCodeInfo;
}
- (PBSourceCodeInfo*) sourceCodeInfo {
  return result.sourceCodeInfo;
}
- (PBFileDescriptorProtoBuilder*) setSourceCodeInfo:(PBSourceCodeInfo*) value {
  result.hasSourceCodeInfo = YES;
  result.sourceCodeInfo = value;
  return self;
}
- (PBFileDescriptorProtoBuilder*) setSourceCodeInfoBuilder:(PBSourceCodeInfoBuilder*) builderForValue {
  return [self setSourceCodeInfo:[builderForValue build]];
}
- (PBFileDescriptorProtoBuilder*) mergeSourceCodeInfo:(PBSourceCodeInfo*) value {
  if (result.hasSourceCodeInfo &&
      result.sourceCodeInfo != [PBSourceCodeInfo defaultInstance]) {
    result.sourceCodeInfo =
      [[[PBSourceCodeInfo builderWithPrototype:result.sourceCodeInfo] mergeFrom:value] buildPartial];
  } else {
    result.sourceCodeInfo = value;
  }
  result.hasSourceCodeInfo = YES;
  return self;
}
- (PBFileDescriptorProtoBuilder*) clearSourceCodeInfo {
  result.hasSourceCodeInfo = NO;
  result.sourceCodeInfo = [PBSourceCodeInfo defaultInstance];
  return self;
}
@end

@interface PBDescriptorProto ()
@property (strong) NSString* name;
@property (strong) NSMutableArray * fieldArray;
@property (strong) NSMutableArray * extensionArray;
@property (strong) NSMutableArray * nestedTypeArray;
@property (strong) NSMutableArray * enumTypeArray;
@property (strong) NSMutableArray * extensionRangeArray;
@property (strong) NSMutableArray * oneofDeclArray;
@property (strong) PBMessageOptions* options;
@end

@implementation PBDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
@synthesize fieldArray;
@dynamic field;
@synthesize extensionArray;
@dynamic extension;
@synthesize nestedTypeArray;
@dynamic nestedType;
@synthesize enumTypeArray;
@dynamic enumType;
@synthesize extensionRangeArray;
@dynamic extensionRange;
@synthesize oneofDeclArray;
@dynamic oneofDecl;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.options = [PBMessageOptions defaultInstance];
  }
  return self;
}
static PBDescriptorProto* defaultPBDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBDescriptorProto class]) {
    defaultPBDescriptorProtoInstance = [[PBDescriptorProto alloc] init];
  }
}
+ (PBDescriptorProto*) defaultInstance {
  return defaultPBDescriptorProtoInstance;
}
- (PBDescriptorProto*) defaultInstance {
  return defaultPBDescriptorProtoInstance;
}
- (NSArray *)field {
  return fieldArray;
}
- (PBFieldDescriptorProto*)fieldAtIndex:(NSUInteger)index {
  return [fieldArray objectAtIndex:index];
}
- (NSArray *)extension {
  return extensionArray;
}
- (PBFieldDescriptorProto*)extensionAtIndex:(NSUInteger)index {
  return [extensionArray objectAtIndex:index];
}
- (NSArray *)nestedType {
  return nestedTypeArray;
}
- (PBDescriptorProto*)nestedTypeAtIndex:(NSUInteger)index {
  return [nestedTypeArray objectAtIndex:index];
}
- (NSArray *)enumType {
  return enumTypeArray;
}
- (PBEnumDescriptorProto*)enumTypeAtIndex:(NSUInteger)index {
  return [enumTypeArray objectAtIndex:index];
}
- (NSArray *)extensionRange {
  return extensionRangeArray;
}
- (PBDescriptorProtoExtensionRange*)extensionRangeAtIndex:(NSUInteger)index {
  return [extensionRangeArray objectAtIndex:index];
}
- (NSArray *)oneofDecl {
  return oneofDeclArray;
}
- (PBOneofDescriptorProto*)oneofDeclAtIndex:(NSUInteger)index {
  return [oneofDeclArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInitfield = YES;
   [self.field enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitfield = NO;
      *stop = YES;
    }
  }];
  if (!isInitfield) return isInitfield;
  __block BOOL isInitextension = YES;
   [self.extension enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitextension = NO;
      *stop = YES;
    }
  }];
  if (!isInitextension) return isInitextension;
  __block BOOL isInitnestedType = YES;
   [self.nestedType enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitnestedType = NO;
      *stop = YES;
    }
  }];
  if (!isInitnestedType) return isInitnestedType;
  __block BOOL isInitenumType = YES;
   [self.enumType enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitenumType = NO;
      *stop = YES;
    }
  }];
  if (!isInitenumType) return isInitenumType;
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  [self.fieldArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:2 value:element];
  }];
  [self.nestedTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:3 value:element];
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:4 value:element];
  }];
  [self.extensionRangeArray enumerateObjectsUsingBlock:^(PBDescriptorProtoExtensionRange *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:5 value:element];
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:6 value:element];
  }];
  if (self.hasOptions) {
    [output writeMessage:7 value:self.options];
  }
  [self.oneofDeclArray enumerateObjectsUsingBlock:^(PBOneofDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:8 value:element];
  }];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  [self.fieldArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(2, element);
  }];
  [self.nestedTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(3, element);
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(4, element);
  }];
  [self.extensionRangeArray enumerateObjectsUsingBlock:^(PBDescriptorProtoExtensionRange *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(5, element);
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(6, element);
  }];
  if (self.hasOptions) {
    size_ += computeMessageSize(7, self.options);
  }
  [self.oneofDeclArray enumerateObjectsUsingBlock:^(PBOneofDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(8, element);
  }];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBDescriptorProto*) parseFromData:(NSData*) data {
  return (PBDescriptorProto*)[[[PBDescriptorProto builder] mergeFromData:data] build];
}
+ (PBDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBDescriptorProto*)[[[PBDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBDescriptorProto*)[[[PBDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBDescriptorProto*)[[[PBDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBDescriptorProto*)[[[PBDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBDescriptorProto*)[[[PBDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBDescriptorProtoBuilder*) builder {
  return [[PBDescriptorProtoBuilder alloc] init];
}
+ (PBDescriptorProtoBuilder*) builderWithPrototype:(PBDescriptorProto*) prototype {
  return [[PBDescriptorProto builder] mergeFrom:prototype];
}
- (PBDescriptorProtoBuilder*) builder {
  return [PBDescriptorProto builder];
}
- (PBDescriptorProtoBuilder*) toBuilder {
  return [PBDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  [self.fieldArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"field"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.nestedTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"nestedType"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"enumType"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.extensionRangeArray enumerateObjectsUsingBlock:^(PBDescriptorProtoExtensionRange *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"extensionRange"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"extension"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  [self.oneofDeclArray enumerateObjectsUsingBlock:^(PBOneofDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"oneofDecl"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBDescriptorProto class]]) {
    return NO;
  }
  PBDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      [self.fieldArray isEqualToArray:otherMessage.fieldArray] &&
      [self.nestedTypeArray isEqualToArray:otherMessage.nestedTypeArray] &&
      [self.enumTypeArray isEqualToArray:otherMessage.enumTypeArray] &&
      [self.extensionRangeArray isEqualToArray:otherMessage.extensionRangeArray] &&
      [self.extensionArray isEqualToArray:otherMessage.extensionArray] &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      [self.oneofDeclArray isEqualToArray:otherMessage.oneofDeclArray] &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  [self.fieldArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.nestedTypeArray enumerateObjectsUsingBlock:^(PBDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.enumTypeArray enumerateObjectsUsingBlock:^(PBEnumDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.extensionRangeArray enumerateObjectsUsingBlock:^(PBDescriptorProtoExtensionRange *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  [self.extensionArray enumerateObjectsUsingBlock:^(PBFieldDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  [self.oneofDeclArray enumerateObjectsUsingBlock:^(PBOneofDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBDescriptorProtoExtensionRange ()
@property SInt32 start;
@property SInt32 end;
@end

@implementation PBDescriptorProtoExtensionRange

- (BOOL) hasStart {
  return !!hasStart_;
}
- (void) setHasStart:(BOOL) value_ {
  hasStart_ = !!value_;
}
@synthesize start;
- (BOOL) hasEnd {
  return !!hasEnd_;
}
- (void) setHasEnd:(BOOL) value_ {
  hasEnd_ = !!value_;
}
@synthesize end;
- (id) init {
  if ((self = [super init])) {
    self.start = 0;
    self.end = 0;
  }
  return self;
}
static PBDescriptorProtoExtensionRange* defaultPBDescriptorProtoExtensionRangeInstance = nil;
+ (void) initialize {
  if (self == [PBDescriptorProtoExtensionRange class]) {
    defaultPBDescriptorProtoExtensionRangeInstance = [[PBDescriptorProtoExtensionRange alloc] init];
  }
}
+ (PBDescriptorProtoExtensionRange*) defaultInstance {
  return defaultPBDescriptorProtoExtensionRangeInstance;
}
- (PBDescriptorProtoExtensionRange*) defaultInstance {
  return defaultPBDescriptorProtoExtensionRangeInstance;
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasStart) {
    [output writeInt32:1 value:self.start];
  }
  if (self.hasEnd) {
    [output writeInt32:2 value:self.end];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasStart) {
    size_ += computeInt32Size(1, self.start);
  }
  if (self.hasEnd) {
    size_ += computeInt32Size(2, self.end);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBDescriptorProtoExtensionRange*) parseFromData:(NSData*) data {
  return (PBDescriptorProtoExtensionRange*)[[[PBDescriptorProtoExtensionRange builder] mergeFromData:data] build];
}
+ (PBDescriptorProtoExtensionRange*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBDescriptorProtoExtensionRange*)[[[PBDescriptorProtoExtensionRange builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBDescriptorProtoExtensionRange*) parseFromInputStream:(NSInputStream*) input {
  return (PBDescriptorProtoExtensionRange*)[[[PBDescriptorProtoExtensionRange builder] mergeFromInputStream:input] build];
}
+ (PBDescriptorProtoExtensionRange*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBDescriptorProtoExtensionRange*)[[[PBDescriptorProtoExtensionRange builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBDescriptorProtoExtensionRange*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBDescriptorProtoExtensionRange*)[[[PBDescriptorProtoExtensionRange builder] mergeFromCodedInputStream:input] build];
}
+ (PBDescriptorProtoExtensionRange*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBDescriptorProtoExtensionRange*)[[[PBDescriptorProtoExtensionRange builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBDescriptorProtoExtensionRangeBuilder*) builder {
  return [[PBDescriptorProtoExtensionRangeBuilder alloc] init];
}
+ (PBDescriptorProtoExtensionRangeBuilder*) builderWithPrototype:(PBDescriptorProtoExtensionRange*) prototype {
  return [[PBDescriptorProtoExtensionRange builder] mergeFrom:prototype];
}
- (PBDescriptorProtoExtensionRangeBuilder*) builder {
  return [PBDescriptorProtoExtensionRange builder];
}
- (PBDescriptorProtoExtensionRangeBuilder*) toBuilder {
  return [PBDescriptorProtoExtensionRange builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasStart) {
    [output appendFormat:@"%@%@: %@\n", indent, @"start", [NSNumber numberWithInteger:self.start]];
  }
  if (self.hasEnd) {
    [output appendFormat:@"%@%@: %@\n", indent, @"end", [NSNumber numberWithInteger:self.end]];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBDescriptorProtoExtensionRange class]]) {
    return NO;
  }
  PBDescriptorProtoExtensionRange *otherMessage = other;
  return
      self.hasStart == otherMessage.hasStart &&
      (!self.hasStart || self.start == otherMessage.start) &&
      self.hasEnd == otherMessage.hasEnd &&
      (!self.hasEnd || self.end == otherMessage.end) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasStart) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.start] hash];
  }
  if (self.hasEnd) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.end] hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBDescriptorProtoExtensionRangeBuilder()
@property (strong) PBDescriptorProtoExtensionRange* result;
@end

@implementation PBDescriptorProtoExtensionRangeBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBDescriptorProtoExtensionRange alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBDescriptorProtoExtensionRangeBuilder*) clear {
  self.result = [[PBDescriptorProtoExtensionRange alloc] init];
  return self;
}
- (PBDescriptorProtoExtensionRangeBuilder*) clone {
  return [PBDescriptorProtoExtensionRange builderWithPrototype:result];
}
- (PBDescriptorProtoExtensionRange*) defaultInstance {
  return [PBDescriptorProtoExtensionRange defaultInstance];
}
- (PBDescriptorProtoExtensionRange*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBDescriptorProtoExtensionRange*) buildPartial {
  PBDescriptorProtoExtensionRange* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBDescriptorProtoExtensionRangeBuilder*) mergeFrom:(PBDescriptorProtoExtensionRange*) other {
  if (other == [PBDescriptorProtoExtensionRange defaultInstance]) {
    return self;
  }
  if (other.hasStart) {
    [self setStart:other.start];
  }
  if (other.hasEnd) {
    [self setEnd:other.end];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBDescriptorProtoExtensionRangeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBDescriptorProtoExtensionRangeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 8: {
        [self setStart:[input readInt32]];
        break;
      }
      case 16: {
        [self setEnd:[input readInt32]];
        break;
      }
    }
  }
}
- (BOOL) hasStart {
  return result.hasStart;
}
- (SInt32) start {
  return result.start;
}
- (PBDescriptorProtoExtensionRangeBuilder*) setStart:(SInt32) value {
  result.hasStart = YES;
  result.start = value;
  return self;
}
- (PBDescriptorProtoExtensionRangeBuilder*) clearStart {
  result.hasStart = NO;
  result.start = 0;
  return self;
}
- (BOOL) hasEnd {
  return result.hasEnd;
}
- (SInt32) end {
  return result.end;
}
- (PBDescriptorProtoExtensionRangeBuilder*) setEnd:(SInt32) value {
  result.hasEnd = YES;
  result.end = value;
  return self;
}
- (PBDescriptorProtoExtensionRangeBuilder*) clearEnd {
  result.hasEnd = NO;
  result.end = 0;
  return self;
}
@end

@interface PBDescriptorProtoBuilder()
@property (strong) PBDescriptorProto* result;
@end

@implementation PBDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBDescriptorProtoBuilder*) clear {
  self.result = [[PBDescriptorProto alloc] init];
  return self;
}
- (PBDescriptorProtoBuilder*) clone {
  return [PBDescriptorProto builderWithPrototype:result];
}
- (PBDescriptorProto*) defaultInstance {
  return [PBDescriptorProto defaultInstance];
}
- (PBDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBDescriptorProto*) buildPartial {
  PBDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBDescriptorProtoBuilder*) mergeFrom:(PBDescriptorProto*) other {
  if (other == [PBDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.fieldArray.count > 0) {
    if (result.fieldArray == nil) {
      result.fieldArray = [[NSMutableArray alloc] initWithArray:other.fieldArray];
    } else {
      [result.fieldArray addObjectsFromArray:other.fieldArray];
    }
  }
  if (other.extensionArray.count > 0) {
    if (result.extensionArray == nil) {
      result.extensionArray = [[NSMutableArray alloc] initWithArray:other.extensionArray];
    } else {
      [result.extensionArray addObjectsFromArray:other.extensionArray];
    }
  }
  if (other.nestedTypeArray.count > 0) {
    if (result.nestedTypeArray == nil) {
      result.nestedTypeArray = [[NSMutableArray alloc] initWithArray:other.nestedTypeArray];
    } else {
      [result.nestedTypeArray addObjectsFromArray:other.nestedTypeArray];
    }
  }
  if (other.enumTypeArray.count > 0) {
    if (result.enumTypeArray == nil) {
      result.enumTypeArray = [[NSMutableArray alloc] initWithArray:other.enumTypeArray];
    } else {
      [result.enumTypeArray addObjectsFromArray:other.enumTypeArray];
    }
  }
  if (other.extensionRangeArray.count > 0) {
    if (result.extensionRangeArray == nil) {
      result.extensionRangeArray = [[NSMutableArray alloc] initWithArray:other.extensionRangeArray];
    } else {
      [result.extensionRangeArray addObjectsFromArray:other.extensionRangeArray];
    }
  }
  if (other.oneofDeclArray.count > 0) {
    if (result.oneofDeclArray == nil) {
      result.oneofDeclArray = [[NSMutableArray alloc] initWithArray:other.oneofDeclArray];
    } else {
      [result.oneofDeclArray addObjectsFromArray:other.oneofDeclArray];
    }
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 18: {
        PBFieldDescriptorProtoBuilder* subBuilder = [PBFieldDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addField:[subBuilder buildPartial]];
        break;
      }
      case 26: {
        PBDescriptorProtoBuilder* subBuilder = [PBDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addNestedType:[subBuilder buildPartial]];
        break;
      }
      case 34: {
        PBEnumDescriptorProtoBuilder* subBuilder = [PBEnumDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addEnumType:[subBuilder buildPartial]];
        break;
      }
      case 42: {
        PBDescriptorProtoExtensionRangeBuilder* subBuilder = [PBDescriptorProtoExtensionRange builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addExtensionRange:[subBuilder buildPartial]];
        break;
      }
      case 50: {
        PBFieldDescriptorProtoBuilder* subBuilder = [PBFieldDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addExtension:[subBuilder buildPartial]];
        break;
      }
      case 58: {
        PBMessageOptionsBuilder* subBuilder = [PBMessageOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
      case 66: {
        PBOneofDescriptorProtoBuilder* subBuilder = [PBOneofDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addOneofDecl:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (NSMutableArray *)field {
  return result.fieldArray;
}
- (PBFieldDescriptorProto*)fieldAtIndex:(NSUInteger)index {
  return [result fieldAtIndex:index];
}
- (PBDescriptorProtoBuilder *)addField:(PBFieldDescriptorProto*)value {
  if (result.fieldArray == nil) {
    result.fieldArray = [[NSMutableArray alloc]init];
  }
  [result.fieldArray addObject:value];
  return self;
}
- (PBDescriptorProtoBuilder *)setFieldArray:(NSArray *)array {
  result.fieldArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBDescriptorProtoBuilder *)clearField {
  result.fieldArray = nil;
  return self;
}
- (NSMutableArray *)extension {
  return result.extensionArray;
}
- (PBFieldDescriptorProto*)extensionAtIndex:(NSUInteger)index {
  return [result extensionAtIndex:index];
}
- (PBDescriptorProtoBuilder *)addExtension:(PBFieldDescriptorProto*)value {
  if (result.extensionArray == nil) {
    result.extensionArray = [[NSMutableArray alloc]init];
  }
  [result.extensionArray addObject:value];
  return self;
}
- (PBDescriptorProtoBuilder *)setExtensionArray:(NSArray *)array {
  result.extensionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBDescriptorProtoBuilder *)clearExtension {
  result.extensionArray = nil;
  return self;
}
- (NSMutableArray *)nestedType {
  return result.nestedTypeArray;
}
- (PBDescriptorProto*)nestedTypeAtIndex:(NSUInteger)index {
  return [result nestedTypeAtIndex:index];
}
- (PBDescriptorProtoBuilder *)addNestedType:(PBDescriptorProto*)value {
  if (result.nestedTypeArray == nil) {
    result.nestedTypeArray = [[NSMutableArray alloc]init];
  }
  [result.nestedTypeArray addObject:value];
  return self;
}
- (PBDescriptorProtoBuilder *)setNestedTypeArray:(NSArray *)array {
  result.nestedTypeArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBDescriptorProtoBuilder *)clearNestedType {
  result.nestedTypeArray = nil;
  return self;
}
- (NSMutableArray *)enumType {
  return result.enumTypeArray;
}
- (PBEnumDescriptorProto*)enumTypeAtIndex:(NSUInteger)index {
  return [result enumTypeAtIndex:index];
}
- (PBDescriptorProtoBuilder *)addEnumType:(PBEnumDescriptorProto*)value {
  if (result.enumTypeArray == nil) {
    result.enumTypeArray = [[NSMutableArray alloc]init];
  }
  [result.enumTypeArray addObject:value];
  return self;
}
- (PBDescriptorProtoBuilder *)setEnumTypeArray:(NSArray *)array {
  result.enumTypeArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBDescriptorProtoBuilder *)clearEnumType {
  result.enumTypeArray = nil;
  return self;
}
- (NSMutableArray *)extensionRange {
  return result.extensionRangeArray;
}
- (PBDescriptorProtoExtensionRange*)extensionRangeAtIndex:(NSUInteger)index {
  return [result extensionRangeAtIndex:index];
}
- (PBDescriptorProtoBuilder *)addExtensionRange:(PBDescriptorProtoExtensionRange*)value {
  if (result.extensionRangeArray == nil) {
    result.extensionRangeArray = [[NSMutableArray alloc]init];
  }
  [result.extensionRangeArray addObject:value];
  return self;
}
- (PBDescriptorProtoBuilder *)setExtensionRangeArray:(NSArray *)array {
  result.extensionRangeArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBDescriptorProtoBuilder *)clearExtensionRange {
  result.extensionRangeArray = nil;
  return self;
}
- (NSMutableArray *)oneofDecl {
  return result.oneofDeclArray;
}
- (PBOneofDescriptorProto*)oneofDeclAtIndex:(NSUInteger)index {
  return [result oneofDeclAtIndex:index];
}
- (PBDescriptorProtoBuilder *)addOneofDecl:(PBOneofDescriptorProto*)value {
  if (result.oneofDeclArray == nil) {
    result.oneofDeclArray = [[NSMutableArray alloc]init];
  }
  [result.oneofDeclArray addObject:value];
  return self;
}
- (PBDescriptorProtoBuilder *)setOneofDeclArray:(NSArray *)array {
  result.oneofDeclArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBDescriptorProtoBuilder *)clearOneofDecl {
  result.oneofDeclArray = nil;
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBMessageOptions*) options {
  return result.options;
}
- (PBDescriptorProtoBuilder*) setOptions:(PBMessageOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBDescriptorProtoBuilder*) setOptionsBuilder:(PBMessageOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBDescriptorProtoBuilder*) mergeOptions:(PBMessageOptions*) value {
  if (result.hasOptions &&
      result.options != [PBMessageOptions defaultInstance]) {
    result.options =
      [[[PBMessageOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBMessageOptions defaultInstance];
  return self;
}
@end

@interface PBFieldDescriptorProto ()
@property (strong) NSString* name;
@property SInt32 number;
@property PBFieldDescriptorProtoLabel label;
@property PBFieldDescriptorProtoType type;
@property (strong) NSString* typeName;
@property (strong) NSString* extendee;
@property (strong) NSString* defaultValue;
@property SInt32 oneofIndex;
@property (strong) PBFieldOptions* options;
@end

@implementation PBFieldDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
- (BOOL) hasNumber {
  return !!hasNumber_;
}
- (void) setHasNumber:(BOOL) value_ {
  hasNumber_ = !!value_;
}
@synthesize number;
- (BOOL) hasLabel {
  return !!hasLabel_;
}
- (void) setHasLabel:(BOOL) value_ {
  hasLabel_ = !!value_;
}
@synthesize label;
- (BOOL) hasType {
  return !!hasType_;
}
- (void) setHasType:(BOOL) value_ {
  hasType_ = !!value_;
}
@synthesize type;
- (BOOL) hasTypeName {
  return !!hasTypeName_;
}
- (void) setHasTypeName:(BOOL) value_ {
  hasTypeName_ = !!value_;
}
@synthesize typeName;
- (BOOL) hasExtendee {
  return !!hasExtendee_;
}
- (void) setHasExtendee:(BOOL) value_ {
  hasExtendee_ = !!value_;
}
@synthesize extendee;
- (BOOL) hasDefaultValue {
  return !!hasDefaultValue_;
}
- (void) setHasDefaultValue:(BOOL) value_ {
  hasDefaultValue_ = !!value_;
}
@synthesize defaultValue;
- (BOOL) hasOneofIndex {
  return !!hasOneofIndex_;
}
- (void) setHasOneofIndex:(BOOL) value_ {
  hasOneofIndex_ = !!value_;
}
@synthesize oneofIndex;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.number = 0;
    self.label = PBFieldDescriptorProtoLabelLabelOptional;
    self.type = PBFieldDescriptorProtoTypeTypeDouble;
    self.typeName = @"";
    self.extendee = @"";
    self.defaultValue = @"";
    self.oneofIndex = 0;
    self.options = [PBFieldOptions defaultInstance];
  }
  return self;
}
static PBFieldDescriptorProto* defaultPBFieldDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBFieldDescriptorProto class]) {
    defaultPBFieldDescriptorProtoInstance = [[PBFieldDescriptorProto alloc] init];
  }
}
+ (PBFieldDescriptorProto*) defaultInstance {
  return defaultPBFieldDescriptorProtoInstance;
}
- (PBFieldDescriptorProto*) defaultInstance {
  return defaultPBFieldDescriptorProtoInstance;
}
- (BOOL) isInitialized {
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  if (self.hasExtendee) {
    [output writeString:2 value:self.extendee];
  }
  if (self.hasNumber) {
    [output writeInt32:3 value:self.number];
  }
  if (self.hasLabel) {
    [output writeEnum:4 value:self.label];
  }
  if (self.hasType) {
    [output writeEnum:5 value:self.type];
  }
  if (self.hasTypeName) {
    [output writeString:6 value:self.typeName];
  }
  if (self.hasDefaultValue) {
    [output writeString:7 value:self.defaultValue];
  }
  if (self.hasOptions) {
    [output writeMessage:8 value:self.options];
  }
  if (self.hasOneofIndex) {
    [output writeInt32:9 value:self.oneofIndex];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  if (self.hasExtendee) {
    size_ += computeStringSize(2, self.extendee);
  }
  if (self.hasNumber) {
    size_ += computeInt32Size(3, self.number);
  }
  if (self.hasLabel) {
    size_ += computeEnumSize(4, self.label);
  }
  if (self.hasType) {
    size_ += computeEnumSize(5, self.type);
  }
  if (self.hasTypeName) {
    size_ += computeStringSize(6, self.typeName);
  }
  if (self.hasDefaultValue) {
    size_ += computeStringSize(7, self.defaultValue);
  }
  if (self.hasOptions) {
    size_ += computeMessageSize(8, self.options);
  }
  if (self.hasOneofIndex) {
    size_ += computeInt32Size(9, self.oneofIndex);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBFieldDescriptorProto*) parseFromData:(NSData*) data {
  return (PBFieldDescriptorProto*)[[[PBFieldDescriptorProto builder] mergeFromData:data] build];
}
+ (PBFieldDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFieldDescriptorProto*)[[[PBFieldDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBFieldDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBFieldDescriptorProto*)[[[PBFieldDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBFieldDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFieldDescriptorProto*)[[[PBFieldDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFieldDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBFieldDescriptorProto*)[[[PBFieldDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBFieldDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFieldDescriptorProto*)[[[PBFieldDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFieldDescriptorProtoBuilder*) builder {
  return [[PBFieldDescriptorProtoBuilder alloc] init];
}
+ (PBFieldDescriptorProtoBuilder*) builderWithPrototype:(PBFieldDescriptorProto*) prototype {
  return [[PBFieldDescriptorProto builder] mergeFrom:prototype];
}
- (PBFieldDescriptorProtoBuilder*) builder {
  return [PBFieldDescriptorProto builder];
}
- (PBFieldDescriptorProtoBuilder*) toBuilder {
  return [PBFieldDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  if (self.hasExtendee) {
    [output appendFormat:@"%@%@: %@\n", indent, @"extendee", self.extendee];
  }
  if (self.hasNumber) {
    [output appendFormat:@"%@%@: %@\n", indent, @"number", [NSNumber numberWithInteger:self.number]];
  }
  if (self.hasLabel) {
    [output appendFormat:@"%@%@: %d\n", indent, @"label", self.label];
  }
  if (self.hasType) {
    [output appendFormat:@"%@%@: %d\n", indent, @"type", self.type];
  }
  if (self.hasTypeName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"typeName", self.typeName];
  }
  if (self.hasDefaultValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"defaultValue", self.defaultValue];
  }
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  if (self.hasOneofIndex) {
    [output appendFormat:@"%@%@: %@\n", indent, @"oneofIndex", [NSNumber numberWithInteger:self.oneofIndex]];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBFieldDescriptorProto class]]) {
    return NO;
  }
  PBFieldDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      self.hasExtendee == otherMessage.hasExtendee &&
      (!self.hasExtendee || [self.extendee isEqual:otherMessage.extendee]) &&
      self.hasNumber == otherMessage.hasNumber &&
      (!self.hasNumber || self.number == otherMessage.number) &&
      self.hasLabel == otherMessage.hasLabel &&
      (!self.hasLabel || self.label == otherMessage.label) &&
      self.hasType == otherMessage.hasType &&
      (!self.hasType || self.type == otherMessage.type) &&
      self.hasTypeName == otherMessage.hasTypeName &&
      (!self.hasTypeName || [self.typeName isEqual:otherMessage.typeName]) &&
      self.hasDefaultValue == otherMessage.hasDefaultValue &&
      (!self.hasDefaultValue || [self.defaultValue isEqual:otherMessage.defaultValue]) &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      self.hasOneofIndex == otherMessage.hasOneofIndex &&
      (!self.hasOneofIndex || self.oneofIndex == otherMessage.oneofIndex) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  if (self.hasExtendee) {
    hashCode = hashCode * 31 + [self.extendee hash];
  }
  if (self.hasNumber) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.number] hash];
  }
  if (self.hasLabel) {
    hashCode = hashCode * 31 + self.label;
  }
  if (self.hasType) {
    hashCode = hashCode * 31 + self.type;
  }
  if (self.hasTypeName) {
    hashCode = hashCode * 31 + [self.typeName hash];
  }
  if (self.hasDefaultValue) {
    hashCode = hashCode * 31 + [self.defaultValue hash];
  }
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  if (self.hasOneofIndex) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.oneofIndex] hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

BOOL PBFieldDescriptorProtoTypeIsValidValue(PBFieldDescriptorProtoType value) {
  switch (value) {
    case PBFieldDescriptorProtoTypeTypeDouble:
    case PBFieldDescriptorProtoTypeTypeFloat:
    case PBFieldDescriptorProtoTypeTypeInt64:
    case PBFieldDescriptorProtoTypeTypeUint64:
    case PBFieldDescriptorProtoTypeTypeInt32:
    case PBFieldDescriptorProtoTypeTypeFixed64:
    case PBFieldDescriptorProtoTypeTypeFixed32:
    case PBFieldDescriptorProtoTypeTypeBool:
    case PBFieldDescriptorProtoTypeTypeString:
    case PBFieldDescriptorProtoTypeTypeGroup:
    case PBFieldDescriptorProtoTypeTypeMessage:
    case PBFieldDescriptorProtoTypeTypeBytes:
    case PBFieldDescriptorProtoTypeTypeUint32:
    case PBFieldDescriptorProtoTypeTypeEnum:
    case PBFieldDescriptorProtoTypeTypeSfixed32:
    case PBFieldDescriptorProtoTypeTypeSfixed64:
    case PBFieldDescriptorProtoTypeTypeSint32:
    case PBFieldDescriptorProtoTypeTypeSint64:
      return YES;
    default:
      return NO;
  }
}
BOOL PBFieldDescriptorProtoLabelIsValidValue(PBFieldDescriptorProtoLabel value) {
  switch (value) {
    case PBFieldDescriptorProtoLabelLabelOptional:
    case PBFieldDescriptorProtoLabelLabelRequired:
    case PBFieldDescriptorProtoLabelLabelRepeated:
      return YES;
    default:
      return NO;
  }
}
@interface PBFieldDescriptorProtoBuilder()
@property (strong) PBFieldDescriptorProto* result;
@end

@implementation PBFieldDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBFieldDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBFieldDescriptorProtoBuilder*) clear {
  self.result = [[PBFieldDescriptorProto alloc] init];
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clone {
  return [PBFieldDescriptorProto builderWithPrototype:result];
}
- (PBFieldDescriptorProto*) defaultInstance {
  return [PBFieldDescriptorProto defaultInstance];
}
- (PBFieldDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBFieldDescriptorProto*) buildPartial {
  PBFieldDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBFieldDescriptorProtoBuilder*) mergeFrom:(PBFieldDescriptorProto*) other {
  if (other == [PBFieldDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.hasNumber) {
    [self setNumber:other.number];
  }
  if (other.hasLabel) {
    [self setLabel:other.label];
  }
  if (other.hasType) {
    [self setType:other.type];
  }
  if (other.hasTypeName) {
    [self setTypeName:other.typeName];
  }
  if (other.hasExtendee) {
    [self setExtendee:other.extendee];
  }
  if (other.hasDefaultValue) {
    [self setDefaultValue:other.defaultValue];
  }
  if (other.hasOneofIndex) {
    [self setOneofIndex:other.oneofIndex];
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBFieldDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBFieldDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 18: {
        [self setExtendee:[input readString]];
        break;
      }
      case 24: {
        [self setNumber:[input readInt32]];
        break;
      }
      case 32: {
        PBFieldDescriptorProtoLabel value = (PBFieldDescriptorProtoLabel)[input readEnum];
        if (PBFieldDescriptorProtoLabelIsValidValue(value)) {
          [self setLabel:value];
        } else {
          [unknownFields mergeVarintField:4 value:value];
        }
        break;
      }
      case 40: {
        PBFieldDescriptorProtoType value = (PBFieldDescriptorProtoType)[input readEnum];
        if (PBFieldDescriptorProtoTypeIsValidValue(value)) {
          [self setType:value];
        } else {
          [unknownFields mergeVarintField:5 value:value];
        }
        break;
      }
      case 50: {
        [self setTypeName:[input readString]];
        break;
      }
      case 58: {
        [self setDefaultValue:[input readString]];
        break;
      }
      case 66: {
        PBFieldOptionsBuilder* subBuilder = [PBFieldOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
      case 72: {
        [self setOneofIndex:[input readInt32]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBFieldDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (BOOL) hasNumber {
  return result.hasNumber;
}
- (SInt32) number {
  return result.number;
}
- (PBFieldDescriptorProtoBuilder*) setNumber:(SInt32) value {
  result.hasNumber = YES;
  result.number = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearNumber {
  result.hasNumber = NO;
  result.number = 0;
  return self;
}
- (BOOL) hasLabel {
  return result.hasLabel;
}
- (PBFieldDescriptorProtoLabel) label {
  return result.label;
}
- (PBFieldDescriptorProtoBuilder*) setLabel:(PBFieldDescriptorProtoLabel) value {
  result.hasLabel = YES;
  result.label = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearLabel {
  result.hasLabel = NO;
  result.label = PBFieldDescriptorProtoLabelLabelOptional;
  return self;
}
- (BOOL) hasType {
  return result.hasType;
}
- (PBFieldDescriptorProtoType) type {
  return result.type;
}
- (PBFieldDescriptorProtoBuilder*) setType:(PBFieldDescriptorProtoType) value {
  result.hasType = YES;
  result.type = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearType {
  result.hasType = NO;
  result.type = PBFieldDescriptorProtoTypeTypeDouble;
  return self;
}
- (BOOL) hasTypeName {
  return result.hasTypeName;
}
- (NSString*) typeName {
  return result.typeName;
}
- (PBFieldDescriptorProtoBuilder*) setTypeName:(NSString*) value {
  result.hasTypeName = YES;
  result.typeName = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearTypeName {
  result.hasTypeName = NO;
  result.typeName = @"";
  return self;
}
- (BOOL) hasExtendee {
  return result.hasExtendee;
}
- (NSString*) extendee {
  return result.extendee;
}
- (PBFieldDescriptorProtoBuilder*) setExtendee:(NSString*) value {
  result.hasExtendee = YES;
  result.extendee = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearExtendee {
  result.hasExtendee = NO;
  result.extendee = @"";
  return self;
}
- (BOOL) hasDefaultValue {
  return result.hasDefaultValue;
}
- (NSString*) defaultValue {
  return result.defaultValue;
}
- (PBFieldDescriptorProtoBuilder*) setDefaultValue:(NSString*) value {
  result.hasDefaultValue = YES;
  result.defaultValue = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearDefaultValue {
  result.hasDefaultValue = NO;
  result.defaultValue = @"";
  return self;
}
- (BOOL) hasOneofIndex {
  return result.hasOneofIndex;
}
- (SInt32) oneofIndex {
  return result.oneofIndex;
}
- (PBFieldDescriptorProtoBuilder*) setOneofIndex:(SInt32) value {
  result.hasOneofIndex = YES;
  result.oneofIndex = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearOneofIndex {
  result.hasOneofIndex = NO;
  result.oneofIndex = 0;
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBFieldOptions*) options {
  return result.options;
}
- (PBFieldDescriptorProtoBuilder*) setOptions:(PBFieldOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) setOptionsBuilder:(PBFieldOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBFieldDescriptorProtoBuilder*) mergeOptions:(PBFieldOptions*) value {
  if (result.hasOptions &&
      result.options != [PBFieldOptions defaultInstance]) {
    result.options =
      [[[PBFieldOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBFieldDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBFieldOptions defaultInstance];
  return self;
}
@end

@interface PBOneofDescriptorProto ()
@property (strong) NSString* name;
@end

@implementation PBOneofDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
  }
  return self;
}
static PBOneofDescriptorProto* defaultPBOneofDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBOneofDescriptorProto class]) {
    defaultPBOneofDescriptorProtoInstance = [[PBOneofDescriptorProto alloc] init];
  }
}
+ (PBOneofDescriptorProto*) defaultInstance {
  return defaultPBOneofDescriptorProtoInstance;
}
- (PBOneofDescriptorProto*) defaultInstance {
  return defaultPBOneofDescriptorProtoInstance;
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBOneofDescriptorProto*) parseFromData:(NSData*) data {
  return (PBOneofDescriptorProto*)[[[PBOneofDescriptorProto builder] mergeFromData:data] build];
}
+ (PBOneofDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBOneofDescriptorProto*)[[[PBOneofDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBOneofDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBOneofDescriptorProto*)[[[PBOneofDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBOneofDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBOneofDescriptorProto*)[[[PBOneofDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBOneofDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBOneofDescriptorProto*)[[[PBOneofDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBOneofDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBOneofDescriptorProto*)[[[PBOneofDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBOneofDescriptorProtoBuilder*) builder {
  return [[PBOneofDescriptorProtoBuilder alloc] init];
}
+ (PBOneofDescriptorProtoBuilder*) builderWithPrototype:(PBOneofDescriptorProto*) prototype {
  return [[PBOneofDescriptorProto builder] mergeFrom:prototype];
}
- (PBOneofDescriptorProtoBuilder*) builder {
  return [PBOneofDescriptorProto builder];
}
- (PBOneofDescriptorProtoBuilder*) toBuilder {
  return [PBOneofDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBOneofDescriptorProto class]]) {
    return NO;
  }
  PBOneofDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBOneofDescriptorProtoBuilder()
@property (strong) PBOneofDescriptorProto* result;
@end

@implementation PBOneofDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBOneofDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBOneofDescriptorProtoBuilder*) clear {
  self.result = [[PBOneofDescriptorProto alloc] init];
  return self;
}
- (PBOneofDescriptorProtoBuilder*) clone {
  return [PBOneofDescriptorProto builderWithPrototype:result];
}
- (PBOneofDescriptorProto*) defaultInstance {
  return [PBOneofDescriptorProto defaultInstance];
}
- (PBOneofDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBOneofDescriptorProto*) buildPartial {
  PBOneofDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBOneofDescriptorProtoBuilder*) mergeFrom:(PBOneofDescriptorProto*) other {
  if (other == [PBOneofDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBOneofDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBOneofDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBOneofDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBOneofDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
@end

@interface PBEnumDescriptorProto ()
@property (strong) NSString* name;
@property (strong) NSMutableArray * valueArray;
@property (strong) PBEnumOptions* options;
@end

@implementation PBEnumDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
@synthesize valueArray;
@dynamic value;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.options = [PBEnumOptions defaultInstance];
  }
  return self;
}
static PBEnumDescriptorProto* defaultPBEnumDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBEnumDescriptorProto class]) {
    defaultPBEnumDescriptorProtoInstance = [[PBEnumDescriptorProto alloc] init];
  }
}
+ (PBEnumDescriptorProto*) defaultInstance {
  return defaultPBEnumDescriptorProtoInstance;
}
- (PBEnumDescriptorProto*) defaultInstance {
  return defaultPBEnumDescriptorProtoInstance;
}
- (NSArray *)value {
  return valueArray;
}
- (PBEnumValueDescriptorProto*)valueAtIndex:(NSUInteger)index {
  return [valueArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInitvalue = YES;
   [self.value enumerateObjectsUsingBlock:^(PBEnumValueDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitvalue = NO;
      *stop = YES;
    }
  }];
  if (!isInitvalue) return isInitvalue;
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  [self.valueArray enumerateObjectsUsingBlock:^(PBEnumValueDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:2 value:element];
  }];
  if (self.hasOptions) {
    [output writeMessage:3 value:self.options];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  [self.valueArray enumerateObjectsUsingBlock:^(PBEnumValueDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(2, element);
  }];
  if (self.hasOptions) {
    size_ += computeMessageSize(3, self.options);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBEnumDescriptorProto*) parseFromData:(NSData*) data {
  return (PBEnumDescriptorProto*)[[[PBEnumDescriptorProto builder] mergeFromData:data] build];
}
+ (PBEnumDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumDescriptorProto*)[[[PBEnumDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBEnumDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBEnumDescriptorProto*)[[[PBEnumDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBEnumDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumDescriptorProto*)[[[PBEnumDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBEnumDescriptorProto*)[[[PBEnumDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBEnumDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumDescriptorProto*)[[[PBEnumDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumDescriptorProtoBuilder*) builder {
  return [[PBEnumDescriptorProtoBuilder alloc] init];
}
+ (PBEnumDescriptorProtoBuilder*) builderWithPrototype:(PBEnumDescriptorProto*) prototype {
  return [[PBEnumDescriptorProto builder] mergeFrom:prototype];
}
- (PBEnumDescriptorProtoBuilder*) builder {
  return [PBEnumDescriptorProto builder];
}
- (PBEnumDescriptorProtoBuilder*) toBuilder {
  return [PBEnumDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  [self.valueArray enumerateObjectsUsingBlock:^(PBEnumValueDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"value"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBEnumDescriptorProto class]]) {
    return NO;
  }
  PBEnumDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      [self.valueArray isEqualToArray:otherMessage.valueArray] &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  [self.valueArray enumerateObjectsUsingBlock:^(PBEnumValueDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBEnumDescriptorProtoBuilder()
@property (strong) PBEnumDescriptorProto* result;
@end

@implementation PBEnumDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBEnumDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBEnumDescriptorProtoBuilder*) clear {
  self.result = [[PBEnumDescriptorProto alloc] init];
  return self;
}
- (PBEnumDescriptorProtoBuilder*) clone {
  return [PBEnumDescriptorProto builderWithPrototype:result];
}
- (PBEnumDescriptorProto*) defaultInstance {
  return [PBEnumDescriptorProto defaultInstance];
}
- (PBEnumDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBEnumDescriptorProto*) buildPartial {
  PBEnumDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBEnumDescriptorProtoBuilder*) mergeFrom:(PBEnumDescriptorProto*) other {
  if (other == [PBEnumDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.valueArray.count > 0) {
    if (result.valueArray == nil) {
      result.valueArray = [[NSMutableArray alloc] initWithArray:other.valueArray];
    } else {
      [result.valueArray addObjectsFromArray:other.valueArray];
    }
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBEnumDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBEnumDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 18: {
        PBEnumValueDescriptorProtoBuilder* subBuilder = [PBEnumValueDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addValue:[subBuilder buildPartial]];
        break;
      }
      case 26: {
        PBEnumOptionsBuilder* subBuilder = [PBEnumOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBEnumDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBEnumDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (NSMutableArray *)value {
  return result.valueArray;
}
- (PBEnumValueDescriptorProto*)valueAtIndex:(NSUInteger)index {
  return [result valueAtIndex:index];
}
- (PBEnumDescriptorProtoBuilder *)addValue:(PBEnumValueDescriptorProto*)value {
  if (result.valueArray == nil) {
    result.valueArray = [[NSMutableArray alloc]init];
  }
  [result.valueArray addObject:value];
  return self;
}
- (PBEnumDescriptorProtoBuilder *)setValueArray:(NSArray *)array {
  result.valueArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBEnumDescriptorProtoBuilder *)clearValue {
  result.valueArray = nil;
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBEnumOptions*) options {
  return result.options;
}
- (PBEnumDescriptorProtoBuilder*) setOptions:(PBEnumOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBEnumDescriptorProtoBuilder*) setOptionsBuilder:(PBEnumOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBEnumDescriptorProtoBuilder*) mergeOptions:(PBEnumOptions*) value {
  if (result.hasOptions &&
      result.options != [PBEnumOptions defaultInstance]) {
    result.options =
      [[[PBEnumOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBEnumDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBEnumOptions defaultInstance];
  return self;
}
@end

@interface PBEnumValueDescriptorProto ()
@property (strong) NSString* name;
@property SInt32 number;
@property (strong) PBEnumValueOptions* options;
@end

@implementation PBEnumValueDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
- (BOOL) hasNumber {
  return !!hasNumber_;
}
- (void) setHasNumber:(BOOL) value_ {
  hasNumber_ = !!value_;
}
@synthesize number;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.number = 0;
    self.options = [PBEnumValueOptions defaultInstance];
  }
  return self;
}
static PBEnumValueDescriptorProto* defaultPBEnumValueDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBEnumValueDescriptorProto class]) {
    defaultPBEnumValueDescriptorProtoInstance = [[PBEnumValueDescriptorProto alloc] init];
  }
}
+ (PBEnumValueDescriptorProto*) defaultInstance {
  return defaultPBEnumValueDescriptorProtoInstance;
}
- (PBEnumValueDescriptorProto*) defaultInstance {
  return defaultPBEnumValueDescriptorProtoInstance;
}
- (BOOL) isInitialized {
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  if (self.hasNumber) {
    [output writeInt32:2 value:self.number];
  }
  if (self.hasOptions) {
    [output writeMessage:3 value:self.options];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  if (self.hasNumber) {
    size_ += computeInt32Size(2, self.number);
  }
  if (self.hasOptions) {
    size_ += computeMessageSize(3, self.options);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBEnumValueDescriptorProto*) parseFromData:(NSData*) data {
  return (PBEnumValueDescriptorProto*)[[[PBEnumValueDescriptorProto builder] mergeFromData:data] build];
}
+ (PBEnumValueDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumValueDescriptorProto*)[[[PBEnumValueDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBEnumValueDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBEnumValueDescriptorProto*)[[[PBEnumValueDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBEnumValueDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumValueDescriptorProto*)[[[PBEnumValueDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumValueDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBEnumValueDescriptorProto*)[[[PBEnumValueDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBEnumValueDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumValueDescriptorProto*)[[[PBEnumValueDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumValueDescriptorProtoBuilder*) builder {
  return [[PBEnumValueDescriptorProtoBuilder alloc] init];
}
+ (PBEnumValueDescriptorProtoBuilder*) builderWithPrototype:(PBEnumValueDescriptorProto*) prototype {
  return [[PBEnumValueDescriptorProto builder] mergeFrom:prototype];
}
- (PBEnumValueDescriptorProtoBuilder*) builder {
  return [PBEnumValueDescriptorProto builder];
}
- (PBEnumValueDescriptorProtoBuilder*) toBuilder {
  return [PBEnumValueDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  if (self.hasNumber) {
    [output appendFormat:@"%@%@: %@\n", indent, @"number", [NSNumber numberWithInteger:self.number]];
  }
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBEnumValueDescriptorProto class]]) {
    return NO;
  }
  PBEnumValueDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      self.hasNumber == otherMessage.hasNumber &&
      (!self.hasNumber || self.number == otherMessage.number) &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  if (self.hasNumber) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.number] hash];
  }
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBEnumValueDescriptorProtoBuilder()
@property (strong) PBEnumValueDescriptorProto* result;
@end

@implementation PBEnumValueDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBEnumValueDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBEnumValueDescriptorProtoBuilder*) clear {
  self.result = [[PBEnumValueDescriptorProto alloc] init];
  return self;
}
- (PBEnumValueDescriptorProtoBuilder*) clone {
  return [PBEnumValueDescriptorProto builderWithPrototype:result];
}
- (PBEnumValueDescriptorProto*) defaultInstance {
  return [PBEnumValueDescriptorProto defaultInstance];
}
- (PBEnumValueDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBEnumValueDescriptorProto*) buildPartial {
  PBEnumValueDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBEnumValueDescriptorProtoBuilder*) mergeFrom:(PBEnumValueDescriptorProto*) other {
  if (other == [PBEnumValueDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.hasNumber) {
    [self setNumber:other.number];
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBEnumValueDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBEnumValueDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 16: {
        [self setNumber:[input readInt32]];
        break;
      }
      case 26: {
        PBEnumValueOptionsBuilder* subBuilder = [PBEnumValueOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBEnumValueDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBEnumValueDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (BOOL) hasNumber {
  return result.hasNumber;
}
- (SInt32) number {
  return result.number;
}
- (PBEnumValueDescriptorProtoBuilder*) setNumber:(SInt32) value {
  result.hasNumber = YES;
  result.number = value;
  return self;
}
- (PBEnumValueDescriptorProtoBuilder*) clearNumber {
  result.hasNumber = NO;
  result.number = 0;
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBEnumValueOptions*) options {
  return result.options;
}
- (PBEnumValueDescriptorProtoBuilder*) setOptions:(PBEnumValueOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBEnumValueDescriptorProtoBuilder*) setOptionsBuilder:(PBEnumValueOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBEnumValueDescriptorProtoBuilder*) mergeOptions:(PBEnumValueOptions*) value {
  if (result.hasOptions &&
      result.options != [PBEnumValueOptions defaultInstance]) {
    result.options =
      [[[PBEnumValueOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBEnumValueDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBEnumValueOptions defaultInstance];
  return self;
}
@end

@interface PBServiceDescriptorProto ()
@property (strong) NSString* name;
@property (strong) NSMutableArray * methodArray;
@property (strong) PBServiceOptions* options;
@end

@implementation PBServiceDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
@synthesize methodArray;
@dynamic method;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.options = [PBServiceOptions defaultInstance];
  }
  return self;
}
static PBServiceDescriptorProto* defaultPBServiceDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBServiceDescriptorProto class]) {
    defaultPBServiceDescriptorProtoInstance = [[PBServiceDescriptorProto alloc] init];
  }
}
+ (PBServiceDescriptorProto*) defaultInstance {
  return defaultPBServiceDescriptorProtoInstance;
}
- (PBServiceDescriptorProto*) defaultInstance {
  return defaultPBServiceDescriptorProtoInstance;
}
- (NSArray *)method {
  return methodArray;
}
- (PBMethodDescriptorProto*)methodAtIndex:(NSUInteger)index {
  return [methodArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInitmethod = YES;
   [self.method enumerateObjectsUsingBlock:^(PBMethodDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitmethod = NO;
      *stop = YES;
    }
  }];
  if (!isInitmethod) return isInitmethod;
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  [self.methodArray enumerateObjectsUsingBlock:^(PBMethodDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:2 value:element];
  }];
  if (self.hasOptions) {
    [output writeMessage:3 value:self.options];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  [self.methodArray enumerateObjectsUsingBlock:^(PBMethodDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(2, element);
  }];
  if (self.hasOptions) {
    size_ += computeMessageSize(3, self.options);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBServiceDescriptorProto*) parseFromData:(NSData*) data {
  return (PBServiceDescriptorProto*)[[[PBServiceDescriptorProto builder] mergeFromData:data] build];
}
+ (PBServiceDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBServiceDescriptorProto*)[[[PBServiceDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBServiceDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBServiceDescriptorProto*)[[[PBServiceDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBServiceDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBServiceDescriptorProto*)[[[PBServiceDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBServiceDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBServiceDescriptorProto*)[[[PBServiceDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBServiceDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBServiceDescriptorProto*)[[[PBServiceDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBServiceDescriptorProtoBuilder*) builder {
  return [[PBServiceDescriptorProtoBuilder alloc] init];
}
+ (PBServiceDescriptorProtoBuilder*) builderWithPrototype:(PBServiceDescriptorProto*) prototype {
  return [[PBServiceDescriptorProto builder] mergeFrom:prototype];
}
- (PBServiceDescriptorProtoBuilder*) builder {
  return [PBServiceDescriptorProto builder];
}
- (PBServiceDescriptorProtoBuilder*) toBuilder {
  return [PBServiceDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  [self.methodArray enumerateObjectsUsingBlock:^(PBMethodDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"method"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBServiceDescriptorProto class]]) {
    return NO;
  }
  PBServiceDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      [self.methodArray isEqualToArray:otherMessage.methodArray] &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  [self.methodArray enumerateObjectsUsingBlock:^(PBMethodDescriptorProto *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBServiceDescriptorProtoBuilder()
@property (strong) PBServiceDescriptorProto* result;
@end

@implementation PBServiceDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBServiceDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBServiceDescriptorProtoBuilder*) clear {
  self.result = [[PBServiceDescriptorProto alloc] init];
  return self;
}
- (PBServiceDescriptorProtoBuilder*) clone {
  return [PBServiceDescriptorProto builderWithPrototype:result];
}
- (PBServiceDescriptorProto*) defaultInstance {
  return [PBServiceDescriptorProto defaultInstance];
}
- (PBServiceDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBServiceDescriptorProto*) buildPartial {
  PBServiceDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBServiceDescriptorProtoBuilder*) mergeFrom:(PBServiceDescriptorProto*) other {
  if (other == [PBServiceDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.methodArray.count > 0) {
    if (result.methodArray == nil) {
      result.methodArray = [[NSMutableArray alloc] initWithArray:other.methodArray];
    } else {
      [result.methodArray addObjectsFromArray:other.methodArray];
    }
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBServiceDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBServiceDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 18: {
        PBMethodDescriptorProtoBuilder* subBuilder = [PBMethodDescriptorProto builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addMethod:[subBuilder buildPartial]];
        break;
      }
      case 26: {
        PBServiceOptionsBuilder* subBuilder = [PBServiceOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBServiceDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBServiceDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (NSMutableArray *)method {
  return result.methodArray;
}
- (PBMethodDescriptorProto*)methodAtIndex:(NSUInteger)index {
  return [result methodAtIndex:index];
}
- (PBServiceDescriptorProtoBuilder *)addMethod:(PBMethodDescriptorProto*)value {
  if (result.methodArray == nil) {
    result.methodArray = [[NSMutableArray alloc]init];
  }
  [result.methodArray addObject:value];
  return self;
}
- (PBServiceDescriptorProtoBuilder *)setMethodArray:(NSArray *)array {
  result.methodArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBServiceDescriptorProtoBuilder *)clearMethod {
  result.methodArray = nil;
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBServiceOptions*) options {
  return result.options;
}
- (PBServiceDescriptorProtoBuilder*) setOptions:(PBServiceOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBServiceDescriptorProtoBuilder*) setOptionsBuilder:(PBServiceOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBServiceDescriptorProtoBuilder*) mergeOptions:(PBServiceOptions*) value {
  if (result.hasOptions &&
      result.options != [PBServiceOptions defaultInstance]) {
    result.options =
      [[[PBServiceOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBServiceDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBServiceOptions defaultInstance];
  return self;
}
@end

@interface PBMethodDescriptorProto ()
@property (strong) NSString* name;
@property (strong) NSString* inputType;
@property (strong) NSString* outputType;
@property (strong) PBMethodOptions* options;
@end

@implementation PBMethodDescriptorProto

- (BOOL) hasName {
  return !!hasName_;
}
- (void) setHasName:(BOOL) value_ {
  hasName_ = !!value_;
}
@synthesize name;
- (BOOL) hasInputType {
  return !!hasInputType_;
}
- (void) setHasInputType:(BOOL) value_ {
  hasInputType_ = !!value_;
}
@synthesize inputType;
- (BOOL) hasOutputType {
  return !!hasOutputType_;
}
- (void) setHasOutputType:(BOOL) value_ {
  hasOutputType_ = !!value_;
}
@synthesize outputType;
- (BOOL) hasOptions {
  return !!hasOptions_;
}
- (void) setHasOptions:(BOOL) value_ {
  hasOptions_ = !!value_;
}
@synthesize options;
- (id) init {
  if ((self = [super init])) {
    self.name = @"";
    self.inputType = @"";
    self.outputType = @"";
    self.options = [PBMethodOptions defaultInstance];
  }
  return self;
}
static PBMethodDescriptorProto* defaultPBMethodDescriptorProtoInstance = nil;
+ (void) initialize {
  if (self == [PBMethodDescriptorProto class]) {
    defaultPBMethodDescriptorProtoInstance = [[PBMethodDescriptorProto alloc] init];
  }
}
+ (PBMethodDescriptorProto*) defaultInstance {
  return defaultPBMethodDescriptorProtoInstance;
}
- (PBMethodDescriptorProto*) defaultInstance {
  return defaultPBMethodDescriptorProtoInstance;
}
- (BOOL) isInitialized {
  if (self.hasOptions) {
    if (!self.options.isInitialized) {
      return NO;
    }
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasName) {
    [output writeString:1 value:self.name];
  }
  if (self.hasInputType) {
    [output writeString:2 value:self.inputType];
  }
  if (self.hasOutputType) {
    [output writeString:3 value:self.outputType];
  }
  if (self.hasOptions) {
    [output writeMessage:4 value:self.options];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasName) {
    size_ += computeStringSize(1, self.name);
  }
  if (self.hasInputType) {
    size_ += computeStringSize(2, self.inputType);
  }
  if (self.hasOutputType) {
    size_ += computeStringSize(3, self.outputType);
  }
  if (self.hasOptions) {
    size_ += computeMessageSize(4, self.options);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBMethodDescriptorProto*) parseFromData:(NSData*) data {
  return (PBMethodDescriptorProto*)[[[PBMethodDescriptorProto builder] mergeFromData:data] build];
}
+ (PBMethodDescriptorProto*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMethodDescriptorProto*)[[[PBMethodDescriptorProto builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBMethodDescriptorProto*) parseFromInputStream:(NSInputStream*) input {
  return (PBMethodDescriptorProto*)[[[PBMethodDescriptorProto builder] mergeFromInputStream:input] build];
}
+ (PBMethodDescriptorProto*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMethodDescriptorProto*)[[[PBMethodDescriptorProto builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBMethodDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBMethodDescriptorProto*)[[[PBMethodDescriptorProto builder] mergeFromCodedInputStream:input] build];
}
+ (PBMethodDescriptorProto*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMethodDescriptorProto*)[[[PBMethodDescriptorProto builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBMethodDescriptorProtoBuilder*) builder {
  return [[PBMethodDescriptorProtoBuilder alloc] init];
}
+ (PBMethodDescriptorProtoBuilder*) builderWithPrototype:(PBMethodDescriptorProto*) prototype {
  return [[PBMethodDescriptorProto builder] mergeFrom:prototype];
}
- (PBMethodDescriptorProtoBuilder*) builder {
  return [PBMethodDescriptorProto builder];
}
- (PBMethodDescriptorProtoBuilder*) toBuilder {
  return [PBMethodDescriptorProto builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasName) {
    [output appendFormat:@"%@%@: %@\n", indent, @"name", self.name];
  }
  if (self.hasInputType) {
    [output appendFormat:@"%@%@: %@\n", indent, @"inputType", self.inputType];
  }
  if (self.hasOutputType) {
    [output appendFormat:@"%@%@: %@\n", indent, @"outputType", self.outputType];
  }
  if (self.hasOptions) {
    [output appendFormat:@"%@%@ {\n", indent, @"options"];
    [self.options writeDescriptionTo:output
                         withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBMethodDescriptorProto class]]) {
    return NO;
  }
  PBMethodDescriptorProto *otherMessage = other;
  return
      self.hasName == otherMessage.hasName &&
      (!self.hasName || [self.name isEqual:otherMessage.name]) &&
      self.hasInputType == otherMessage.hasInputType &&
      (!self.hasInputType || [self.inputType isEqual:otherMessage.inputType]) &&
      self.hasOutputType == otherMessage.hasOutputType &&
      (!self.hasOutputType || [self.outputType isEqual:otherMessage.outputType]) &&
      self.hasOptions == otherMessage.hasOptions &&
      (!self.hasOptions || [self.options isEqual:otherMessage.options]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasName) {
    hashCode = hashCode * 31 + [self.name hash];
  }
  if (self.hasInputType) {
    hashCode = hashCode * 31 + [self.inputType hash];
  }
  if (self.hasOutputType) {
    hashCode = hashCode * 31 + [self.outputType hash];
  }
  if (self.hasOptions) {
    hashCode = hashCode * 31 + [self.options hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBMethodDescriptorProtoBuilder()
@property (strong) PBMethodDescriptorProto* result;
@end

@implementation PBMethodDescriptorProtoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBMethodDescriptorProto alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBMethodDescriptorProtoBuilder*) clear {
  self.result = [[PBMethodDescriptorProto alloc] init];
  return self;
}
- (PBMethodDescriptorProtoBuilder*) clone {
  return [PBMethodDescriptorProto builderWithPrototype:result];
}
- (PBMethodDescriptorProto*) defaultInstance {
  return [PBMethodDescriptorProto defaultInstance];
}
- (PBMethodDescriptorProto*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBMethodDescriptorProto*) buildPartial {
  PBMethodDescriptorProto* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBMethodDescriptorProtoBuilder*) mergeFrom:(PBMethodDescriptorProto*) other {
  if (other == [PBMethodDescriptorProto defaultInstance]) {
    return self;
  }
  if (other.hasName) {
    [self setName:other.name];
  }
  if (other.hasInputType) {
    [self setInputType:other.inputType];
  }
  if (other.hasOutputType) {
    [self setOutputType:other.outputType];
  }
  if (other.hasOptions) {
    [self mergeOptions:other.options];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBMethodDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBMethodDescriptorProtoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setName:[input readString]];
        break;
      }
      case 18: {
        [self setInputType:[input readString]];
        break;
      }
      case 26: {
        [self setOutputType:[input readString]];
        break;
      }
      case 34: {
        PBMethodOptionsBuilder* subBuilder = [PBMethodOptions builder];
        if (self.hasOptions) {
          [subBuilder mergeFrom:self.options];
        }
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self setOptions:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasName {
  return result.hasName;
}
- (NSString*) name {
  return result.name;
}
- (PBMethodDescriptorProtoBuilder*) setName:(NSString*) value {
  result.hasName = YES;
  result.name = value;
  return self;
}
- (PBMethodDescriptorProtoBuilder*) clearName {
  result.hasName = NO;
  result.name = @"";
  return self;
}
- (BOOL) hasInputType {
  return result.hasInputType;
}
- (NSString*) inputType {
  return result.inputType;
}
- (PBMethodDescriptorProtoBuilder*) setInputType:(NSString*) value {
  result.hasInputType = YES;
  result.inputType = value;
  return self;
}
- (PBMethodDescriptorProtoBuilder*) clearInputType {
  result.hasInputType = NO;
  result.inputType = @"";
  return self;
}
- (BOOL) hasOutputType {
  return result.hasOutputType;
}
- (NSString*) outputType {
  return result.outputType;
}
- (PBMethodDescriptorProtoBuilder*) setOutputType:(NSString*) value {
  result.hasOutputType = YES;
  result.outputType = value;
  return self;
}
- (PBMethodDescriptorProtoBuilder*) clearOutputType {
  result.hasOutputType = NO;
  result.outputType = @"";
  return self;
}
- (BOOL) hasOptions {
  return result.hasOptions;
}
- (PBMethodOptions*) options {
  return result.options;
}
- (PBMethodDescriptorProtoBuilder*) setOptions:(PBMethodOptions*) value {
  result.hasOptions = YES;
  result.options = value;
  return self;
}
- (PBMethodDescriptorProtoBuilder*) setOptionsBuilder:(PBMethodOptionsBuilder*) builderForValue {
  return [self setOptions:[builderForValue build]];
}
- (PBMethodDescriptorProtoBuilder*) mergeOptions:(PBMethodOptions*) value {
  if (result.hasOptions &&
      result.options != [PBMethodOptions defaultInstance]) {
    result.options =
      [[[PBMethodOptions builderWithPrototype:result.options] mergeFrom:value] buildPartial];
  } else {
    result.options = value;
  }
  result.hasOptions = YES;
  return self;
}
- (PBMethodDescriptorProtoBuilder*) clearOptions {
  result.hasOptions = NO;
  result.options = [PBMethodOptions defaultInstance];
  return self;
}
@end

@interface PBFileOptions ()
@property (strong) NSString* javaPackage;
@property (strong) NSString* javaOuterClassname;
@property BOOL javaMultipleFiles;
@property BOOL javaGenerateEqualsAndHash;
@property BOOL javaStringCheckUtf8;
@property PBFileOptionsOptimizeMode optimizeFor;
@property (strong) NSString* goPackage;
@property BOOL ccGenericServices;
@property BOOL javaGenericServices;
@property BOOL pyGenericServices;
@property BOOL deprecated;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBFileOptions

- (BOOL) hasJavaPackage {
  return !!hasJavaPackage_;
}
- (void) setHasJavaPackage:(BOOL) value_ {
  hasJavaPackage_ = !!value_;
}
@synthesize javaPackage;
- (BOOL) hasJavaOuterClassname {
  return !!hasJavaOuterClassname_;
}
- (void) setHasJavaOuterClassname:(BOOL) value_ {
  hasJavaOuterClassname_ = !!value_;
}
@synthesize javaOuterClassname;
- (BOOL) hasJavaMultipleFiles {
  return !!hasJavaMultipleFiles_;
}
- (void) setHasJavaMultipleFiles:(BOOL) value_ {
  hasJavaMultipleFiles_ = !!value_;
}
- (BOOL) javaMultipleFiles {
  return !!javaMultipleFiles_;
}
- (void) setJavaMultipleFiles:(BOOL) value_ {
  javaMultipleFiles_ = !!value_;
}
- (BOOL) hasJavaGenerateEqualsAndHash {
  return !!hasJavaGenerateEqualsAndHash_;
}
- (void) setHasJavaGenerateEqualsAndHash:(BOOL) value_ {
  hasJavaGenerateEqualsAndHash_ = !!value_;
}
- (BOOL) javaGenerateEqualsAndHash {
  return !!javaGenerateEqualsAndHash_;
}
- (void) setJavaGenerateEqualsAndHash:(BOOL) value_ {
  javaGenerateEqualsAndHash_ = !!value_;
}
- (BOOL) hasJavaStringCheckUtf8 {
  return !!hasJavaStringCheckUtf8_;
}
- (void) setHasJavaStringCheckUtf8:(BOOL) value_ {
  hasJavaStringCheckUtf8_ = !!value_;
}
- (BOOL) javaStringCheckUtf8 {
  return !!javaStringCheckUtf8_;
}
- (void) setJavaStringCheckUtf8:(BOOL) value_ {
  javaStringCheckUtf8_ = !!value_;
}
- (BOOL) hasOptimizeFor {
  return !!hasOptimizeFor_;
}
- (void) setHasOptimizeFor:(BOOL) value_ {
  hasOptimizeFor_ = !!value_;
}
@synthesize optimizeFor;
- (BOOL) hasGoPackage {
  return !!hasGoPackage_;
}
- (void) setHasGoPackage:(BOOL) value_ {
  hasGoPackage_ = !!value_;
}
@synthesize goPackage;
- (BOOL) hasCcGenericServices {
  return !!hasCcGenericServices_;
}
- (void) setHasCcGenericServices:(BOOL) value_ {
  hasCcGenericServices_ = !!value_;
}
- (BOOL) ccGenericServices {
  return !!ccGenericServices_;
}
- (void) setCcGenericServices:(BOOL) value_ {
  ccGenericServices_ = !!value_;
}
- (BOOL) hasJavaGenericServices {
  return !!hasJavaGenericServices_;
}
- (void) setHasJavaGenericServices:(BOOL) value_ {
  hasJavaGenericServices_ = !!value_;
}
- (BOOL) javaGenericServices {
  return !!javaGenericServices_;
}
- (void) setJavaGenericServices:(BOOL) value_ {
  javaGenericServices_ = !!value_;
}
- (BOOL) hasPyGenericServices {
  return !!hasPyGenericServices_;
}
- (void) setHasPyGenericServices:(BOOL) value_ {
  hasPyGenericServices_ = !!value_;
}
- (BOOL) pyGenericServices {
  return !!pyGenericServices_;
}
- (void) setPyGenericServices:(BOOL) value_ {
  pyGenericServices_ = !!value_;
}
- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.javaPackage = @"";
    self.javaOuterClassname = @"";
    self.javaMultipleFiles = NO;
    self.javaGenerateEqualsAndHash = NO;
    self.javaStringCheckUtf8 = NO;
    self.optimizeFor = PBFileOptionsOptimizeModeSpeed;
    self.goPackage = @"";
    self.ccGenericServices = NO;
    self.javaGenericServices = NO;
    self.pyGenericServices = NO;
    self.deprecated = NO;
  }
  return self;
}
static PBFileOptions* defaultPBFileOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBFileOptions class]) {
    defaultPBFileOptionsInstance = [[PBFileOptions alloc] init];
  }
}
+ (PBFileOptions*) defaultInstance {
  return defaultPBFileOptionsInstance;
}
- (PBFileOptions*) defaultInstance {
  return defaultPBFileOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasJavaPackage) {
    [output writeString:1 value:self.javaPackage];
  }
  if (self.hasJavaOuterClassname) {
    [output writeString:8 value:self.javaOuterClassname];
  }
  if (self.hasOptimizeFor) {
    [output writeEnum:9 value:self.optimizeFor];
  }
  if (self.hasJavaMultipleFiles) {
    [output writeBool:10 value:self.javaMultipleFiles];
  }
  if (self.hasGoPackage) {
    [output writeString:11 value:self.goPackage];
  }
  if (self.hasCcGenericServices) {
    [output writeBool:16 value:self.ccGenericServices];
  }
  if (self.hasJavaGenericServices) {
    [output writeBool:17 value:self.javaGenericServices];
  }
  if (self.hasPyGenericServices) {
    [output writeBool:18 value:self.pyGenericServices];
  }
  if (self.hasJavaGenerateEqualsAndHash) {
    [output writeBool:20 value:self.javaGenerateEqualsAndHash];
  }
  if (self.hasDeprecated) {
    [output writeBool:23 value:self.deprecated];
  }
  if (self.hasJavaStringCheckUtf8) {
    [output writeBool:27 value:self.javaStringCheckUtf8];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasJavaPackage) {
    size_ += computeStringSize(1, self.javaPackage);
  }
  if (self.hasJavaOuterClassname) {
    size_ += computeStringSize(8, self.javaOuterClassname);
  }
  if (self.hasOptimizeFor) {
    size_ += computeEnumSize(9, self.optimizeFor);
  }
  if (self.hasJavaMultipleFiles) {
    size_ += computeBoolSize(10, self.javaMultipleFiles);
  }
  if (self.hasGoPackage) {
    size_ += computeStringSize(11, self.goPackage);
  }
  if (self.hasCcGenericServices) {
    size_ += computeBoolSize(16, self.ccGenericServices);
  }
  if (self.hasJavaGenericServices) {
    size_ += computeBoolSize(17, self.javaGenericServices);
  }
  if (self.hasPyGenericServices) {
    size_ += computeBoolSize(18, self.pyGenericServices);
  }
  if (self.hasJavaGenerateEqualsAndHash) {
    size_ += computeBoolSize(20, self.javaGenerateEqualsAndHash);
  }
  if (self.hasDeprecated) {
    size_ += computeBoolSize(23, self.deprecated);
  }
  if (self.hasJavaStringCheckUtf8) {
    size_ += computeBoolSize(27, self.javaStringCheckUtf8);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBFileOptions*) parseFromData:(NSData*) data {
  return (PBFileOptions*)[[[PBFileOptions builder] mergeFromData:data] build];
}
+ (PBFileOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileOptions*)[[[PBFileOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBFileOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBFileOptions*)[[[PBFileOptions builder] mergeFromInputStream:input] build];
}
+ (PBFileOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileOptions*)[[[PBFileOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFileOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBFileOptions*)[[[PBFileOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBFileOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFileOptions*)[[[PBFileOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFileOptionsBuilder*) builder {
  return [[PBFileOptionsBuilder alloc] init];
}
+ (PBFileOptionsBuilder*) builderWithPrototype:(PBFileOptions*) prototype {
  return [[PBFileOptions builder] mergeFrom:prototype];
}
- (PBFileOptionsBuilder*) builder {
  return [PBFileOptions builder];
}
- (PBFileOptionsBuilder*) toBuilder {
  return [PBFileOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasJavaPackage) {
    [output appendFormat:@"%@%@: %@\n", indent, @"javaPackage", self.javaPackage];
  }
  if (self.hasJavaOuterClassname) {
    [output appendFormat:@"%@%@: %@\n", indent, @"javaOuterClassname", self.javaOuterClassname];
  }
  if (self.hasOptimizeFor) {
    [output appendFormat:@"%@%@: %d\n", indent, @"optimizeFor", self.optimizeFor];
  }
  if (self.hasJavaMultipleFiles) {
    [output appendFormat:@"%@%@: %@\n", indent, @"javaMultipleFiles", [NSNumber numberWithBool:self.javaMultipleFiles]];
  }
  if (self.hasGoPackage) {
    [output appendFormat:@"%@%@: %@\n", indent, @"goPackage", self.goPackage];
  }
  if (self.hasCcGenericServices) {
    [output appendFormat:@"%@%@: %@\n", indent, @"ccGenericServices", [NSNumber numberWithBool:self.ccGenericServices]];
  }
  if (self.hasJavaGenericServices) {
    [output appendFormat:@"%@%@: %@\n", indent, @"javaGenericServices", [NSNumber numberWithBool:self.javaGenericServices]];
  }
  if (self.hasPyGenericServices) {
    [output appendFormat:@"%@%@: %@\n", indent, @"pyGenericServices", [NSNumber numberWithBool:self.pyGenericServices]];
  }
  if (self.hasJavaGenerateEqualsAndHash) {
    [output appendFormat:@"%@%@: %@\n", indent, @"javaGenerateEqualsAndHash", [NSNumber numberWithBool:self.javaGenerateEqualsAndHash]];
  }
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  if (self.hasJavaStringCheckUtf8) {
    [output appendFormat:@"%@%@: %@\n", indent, @"javaStringCheckUtf8", [NSNumber numberWithBool:self.javaStringCheckUtf8]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBFileOptions class]]) {
    return NO;
  }
  PBFileOptions *otherMessage = other;
  return
      self.hasJavaPackage == otherMessage.hasJavaPackage &&
      (!self.hasJavaPackage || [self.javaPackage isEqual:otherMessage.javaPackage]) &&
      self.hasJavaOuterClassname == otherMessage.hasJavaOuterClassname &&
      (!self.hasJavaOuterClassname || [self.javaOuterClassname isEqual:otherMessage.javaOuterClassname]) &&
      self.hasOptimizeFor == otherMessage.hasOptimizeFor &&
      (!self.hasOptimizeFor || self.optimizeFor == otherMessage.optimizeFor) &&
      self.hasJavaMultipleFiles == otherMessage.hasJavaMultipleFiles &&
      (!self.hasJavaMultipleFiles || self.javaMultipleFiles == otherMessage.javaMultipleFiles) &&
      self.hasGoPackage == otherMessage.hasGoPackage &&
      (!self.hasGoPackage || [self.goPackage isEqual:otherMessage.goPackage]) &&
      self.hasCcGenericServices == otherMessage.hasCcGenericServices &&
      (!self.hasCcGenericServices || self.ccGenericServices == otherMessage.ccGenericServices) &&
      self.hasJavaGenericServices == otherMessage.hasJavaGenericServices &&
      (!self.hasJavaGenericServices || self.javaGenericServices == otherMessage.javaGenericServices) &&
      self.hasPyGenericServices == otherMessage.hasPyGenericServices &&
      (!self.hasPyGenericServices || self.pyGenericServices == otherMessage.pyGenericServices) &&
      self.hasJavaGenerateEqualsAndHash == otherMessage.hasJavaGenerateEqualsAndHash &&
      (!self.hasJavaGenerateEqualsAndHash || self.javaGenerateEqualsAndHash == otherMessage.javaGenerateEqualsAndHash) &&
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      self.hasJavaStringCheckUtf8 == otherMessage.hasJavaStringCheckUtf8 &&
      (!self.hasJavaStringCheckUtf8 || self.javaStringCheckUtf8 == otherMessage.javaStringCheckUtf8) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasJavaPackage) {
    hashCode = hashCode * 31 + [self.javaPackage hash];
  }
  if (self.hasJavaOuterClassname) {
    hashCode = hashCode * 31 + [self.javaOuterClassname hash];
  }
  if (self.hasOptimizeFor) {
    hashCode = hashCode * 31 + self.optimizeFor;
  }
  if (self.hasJavaMultipleFiles) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.javaMultipleFiles] hash];
  }
  if (self.hasGoPackage) {
    hashCode = hashCode * 31 + [self.goPackage hash];
  }
  if (self.hasCcGenericServices) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.ccGenericServices] hash];
  }
  if (self.hasJavaGenericServices) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.javaGenericServices] hash];
  }
  if (self.hasPyGenericServices) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.pyGenericServices] hash];
  }
  if (self.hasJavaGenerateEqualsAndHash) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.javaGenerateEqualsAndHash] hash];
  }
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  if (self.hasJavaStringCheckUtf8) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.javaStringCheckUtf8] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

BOOL PBFileOptionsOptimizeModeIsValidValue(PBFileOptionsOptimizeMode value) {
  switch (value) {
    case PBFileOptionsOptimizeModeSpeed:
    case PBFileOptionsOptimizeModeCodeSize:
    case PBFileOptionsOptimizeModeLiteRuntime:
      return YES;
    default:
      return NO;
  }
}
@interface PBFileOptionsBuilder()
@property (strong) PBFileOptions* result;
@end

@implementation PBFileOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBFileOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBFileOptionsBuilder*) clear {
  self.result = [[PBFileOptions alloc] init];
  return self;
}
- (PBFileOptionsBuilder*) clone {
  return [PBFileOptions builderWithPrototype:result];
}
- (PBFileOptions*) defaultInstance {
  return [PBFileOptions defaultInstance];
}
- (PBFileOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBFileOptions*) buildPartial {
  PBFileOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBFileOptionsBuilder*) mergeFrom:(PBFileOptions*) other {
  if (other == [PBFileOptions defaultInstance]) {
    return self;
  }
  if (other.hasJavaPackage) {
    [self setJavaPackage:other.javaPackage];
  }
  if (other.hasJavaOuterClassname) {
    [self setJavaOuterClassname:other.javaOuterClassname];
  }
  if (other.hasJavaMultipleFiles) {
    [self setJavaMultipleFiles:other.javaMultipleFiles];
  }
  if (other.hasJavaGenerateEqualsAndHash) {
    [self setJavaGenerateEqualsAndHash:other.javaGenerateEqualsAndHash];
  }
  if (other.hasJavaStringCheckUtf8) {
    [self setJavaStringCheckUtf8:other.javaStringCheckUtf8];
  }
  if (other.hasOptimizeFor) {
    [self setOptimizeFor:other.optimizeFor];
  }
  if (other.hasGoPackage) {
    [self setGoPackage:other.goPackage];
  }
  if (other.hasCcGenericServices) {
    [self setCcGenericServices:other.ccGenericServices];
  }
  if (other.hasJavaGenericServices) {
    [self setJavaGenericServices:other.javaGenericServices];
  }
  if (other.hasPyGenericServices) {
    [self setPyGenericServices:other.pyGenericServices];
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBFileOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBFileOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setJavaPackage:[input readString]];
        break;
      }
      case 66: {
        [self setJavaOuterClassname:[input readString]];
        break;
      }
      case 72: {
        PBFileOptionsOptimizeMode value = (PBFileOptionsOptimizeMode)[input readEnum];
        if (PBFileOptionsOptimizeModeIsValidValue(value)) {
          [self setOptimizeFor:value];
        } else {
          [unknownFields mergeVarintField:9 value:value];
        }
        break;
      }
      case 80: {
        [self setJavaMultipleFiles:[input readBool]];
        break;
      }
      case 90: {
        [self setGoPackage:[input readString]];
        break;
      }
      case 128: {
        [self setCcGenericServices:[input readBool]];
        break;
      }
      case 136: {
        [self setJavaGenericServices:[input readBool]];
        break;
      }
      case 144: {
        [self setPyGenericServices:[input readBool]];
        break;
      }
      case 160: {
        [self setJavaGenerateEqualsAndHash:[input readBool]];
        break;
      }
      case 184: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 216: {
        [self setJavaStringCheckUtf8:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasJavaPackage {
  return result.hasJavaPackage;
}
- (NSString*) javaPackage {
  return result.javaPackage;
}
- (PBFileOptionsBuilder*) setJavaPackage:(NSString*) value {
  result.hasJavaPackage = YES;
  result.javaPackage = value;
  return self;
}
- (PBFileOptionsBuilder*) clearJavaPackage {
  result.hasJavaPackage = NO;
  result.javaPackage = @"";
  return self;
}
- (BOOL) hasJavaOuterClassname {
  return result.hasJavaOuterClassname;
}
- (NSString*) javaOuterClassname {
  return result.javaOuterClassname;
}
- (PBFileOptionsBuilder*) setJavaOuterClassname:(NSString*) value {
  result.hasJavaOuterClassname = YES;
  result.javaOuterClassname = value;
  return self;
}
- (PBFileOptionsBuilder*) clearJavaOuterClassname {
  result.hasJavaOuterClassname = NO;
  result.javaOuterClassname = @"";
  return self;
}
- (BOOL) hasJavaMultipleFiles {
  return result.hasJavaMultipleFiles;
}
- (BOOL) javaMultipleFiles {
  return result.javaMultipleFiles;
}
- (PBFileOptionsBuilder*) setJavaMultipleFiles:(BOOL) value {
  result.hasJavaMultipleFiles = YES;
  result.javaMultipleFiles = value;
  return self;
}
- (PBFileOptionsBuilder*) clearJavaMultipleFiles {
  result.hasJavaMultipleFiles = NO;
  result.javaMultipleFiles = NO;
  return self;
}
- (BOOL) hasJavaGenerateEqualsAndHash {
  return result.hasJavaGenerateEqualsAndHash;
}
- (BOOL) javaGenerateEqualsAndHash {
  return result.javaGenerateEqualsAndHash;
}
- (PBFileOptionsBuilder*) setJavaGenerateEqualsAndHash:(BOOL) value {
  result.hasJavaGenerateEqualsAndHash = YES;
  result.javaGenerateEqualsAndHash = value;
  return self;
}
- (PBFileOptionsBuilder*) clearJavaGenerateEqualsAndHash {
  result.hasJavaGenerateEqualsAndHash = NO;
  result.javaGenerateEqualsAndHash = NO;
  return self;
}
- (BOOL) hasJavaStringCheckUtf8 {
  return result.hasJavaStringCheckUtf8;
}
- (BOOL) javaStringCheckUtf8 {
  return result.javaStringCheckUtf8;
}
- (PBFileOptionsBuilder*) setJavaStringCheckUtf8:(BOOL) value {
  result.hasJavaStringCheckUtf8 = YES;
  result.javaStringCheckUtf8 = value;
  return self;
}
- (PBFileOptionsBuilder*) clearJavaStringCheckUtf8 {
  result.hasJavaStringCheckUtf8 = NO;
  result.javaStringCheckUtf8 = NO;
  return self;
}
- (BOOL) hasOptimizeFor {
  return result.hasOptimizeFor;
}
- (PBFileOptionsOptimizeMode) optimizeFor {
  return result.optimizeFor;
}
- (PBFileOptionsBuilder*) setOptimizeFor:(PBFileOptionsOptimizeMode) value {
  result.hasOptimizeFor = YES;
  result.optimizeFor = value;
  return self;
}
- (PBFileOptionsBuilder*) clearOptimizeFor {
  result.hasOptimizeFor = NO;
  result.optimizeFor = PBFileOptionsOptimizeModeSpeed;
  return self;
}
- (BOOL) hasGoPackage {
  return result.hasGoPackage;
}
- (NSString*) goPackage {
  return result.goPackage;
}
- (PBFileOptionsBuilder*) setGoPackage:(NSString*) value {
  result.hasGoPackage = YES;
  result.goPackage = value;
  return self;
}
- (PBFileOptionsBuilder*) clearGoPackage {
  result.hasGoPackage = NO;
  result.goPackage = @"";
  return self;
}
- (BOOL) hasCcGenericServices {
  return result.hasCcGenericServices;
}
- (BOOL) ccGenericServices {
  return result.ccGenericServices;
}
- (PBFileOptionsBuilder*) setCcGenericServices:(BOOL) value {
  result.hasCcGenericServices = YES;
  result.ccGenericServices = value;
  return self;
}
- (PBFileOptionsBuilder*) clearCcGenericServices {
  result.hasCcGenericServices = NO;
  result.ccGenericServices = NO;
  return self;
}
- (BOOL) hasJavaGenericServices {
  return result.hasJavaGenericServices;
}
- (BOOL) javaGenericServices {
  return result.javaGenericServices;
}
- (PBFileOptionsBuilder*) setJavaGenericServices:(BOOL) value {
  result.hasJavaGenericServices = YES;
  result.javaGenericServices = value;
  return self;
}
- (PBFileOptionsBuilder*) clearJavaGenericServices {
  result.hasJavaGenericServices = NO;
  result.javaGenericServices = NO;
  return self;
}
- (BOOL) hasPyGenericServices {
  return result.hasPyGenericServices;
}
- (BOOL) pyGenericServices {
  return result.pyGenericServices;
}
- (PBFileOptionsBuilder*) setPyGenericServices:(BOOL) value {
  result.hasPyGenericServices = YES;
  result.pyGenericServices = value;
  return self;
}
- (PBFileOptionsBuilder*) clearPyGenericServices {
  result.hasPyGenericServices = NO;
  result.pyGenericServices = NO;
  return self;
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBFileOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBFileOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBFileOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBFileOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFileOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBMessageOptions ()
@property BOOL messageSetWireFormat;
@property BOOL noStandardDescriptorAccessor;
@property BOOL deprecated;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBMessageOptions

- (BOOL) hasMessageSetWireFormat {
  return !!hasMessageSetWireFormat_;
}
- (void) setHasMessageSetWireFormat:(BOOL) value_ {
  hasMessageSetWireFormat_ = !!value_;
}
- (BOOL) messageSetWireFormat {
  return !!messageSetWireFormat_;
}
- (void) setMessageSetWireFormat:(BOOL) value_ {
  messageSetWireFormat_ = !!value_;
}
- (BOOL) hasNoStandardDescriptorAccessor {
  return !!hasNoStandardDescriptorAccessor_;
}
- (void) setHasNoStandardDescriptorAccessor:(BOOL) value_ {
  hasNoStandardDescriptorAccessor_ = !!value_;
}
- (BOOL) noStandardDescriptorAccessor {
  return !!noStandardDescriptorAccessor_;
}
- (void) setNoStandardDescriptorAccessor:(BOOL) value_ {
  noStandardDescriptorAccessor_ = !!value_;
}
- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.messageSetWireFormat = NO;
    self.noStandardDescriptorAccessor = NO;
    self.deprecated = NO;
  }
  return self;
}
static PBMessageOptions* defaultPBMessageOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBMessageOptions class]) {
    defaultPBMessageOptionsInstance = [[PBMessageOptions alloc] init];
  }
}
+ (PBMessageOptions*) defaultInstance {
  return defaultPBMessageOptionsInstance;
}
- (PBMessageOptions*) defaultInstance {
  return defaultPBMessageOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasMessageSetWireFormat) {
    [output writeBool:1 value:self.messageSetWireFormat];
  }
  if (self.hasNoStandardDescriptorAccessor) {
    [output writeBool:2 value:self.noStandardDescriptorAccessor];
  }
  if (self.hasDeprecated) {
    [output writeBool:3 value:self.deprecated];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasMessageSetWireFormat) {
    size_ += computeBoolSize(1, self.messageSetWireFormat);
  }
  if (self.hasNoStandardDescriptorAccessor) {
    size_ += computeBoolSize(2, self.noStandardDescriptorAccessor);
  }
  if (self.hasDeprecated) {
    size_ += computeBoolSize(3, self.deprecated);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBMessageOptions*) parseFromData:(NSData*) data {
  return (PBMessageOptions*)[[[PBMessageOptions builder] mergeFromData:data] build];
}
+ (PBMessageOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMessageOptions*)[[[PBMessageOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBMessageOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBMessageOptions*)[[[PBMessageOptions builder] mergeFromInputStream:input] build];
}
+ (PBMessageOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMessageOptions*)[[[PBMessageOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBMessageOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBMessageOptions*)[[[PBMessageOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBMessageOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMessageOptions*)[[[PBMessageOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBMessageOptionsBuilder*) builder {
  return [[PBMessageOptionsBuilder alloc] init];
}
+ (PBMessageOptionsBuilder*) builderWithPrototype:(PBMessageOptions*) prototype {
  return [[PBMessageOptions builder] mergeFrom:prototype];
}
- (PBMessageOptionsBuilder*) builder {
  return [PBMessageOptions builder];
}
- (PBMessageOptionsBuilder*) toBuilder {
  return [PBMessageOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasMessageSetWireFormat) {
    [output appendFormat:@"%@%@: %@\n", indent, @"messageSetWireFormat", [NSNumber numberWithBool:self.messageSetWireFormat]];
  }
  if (self.hasNoStandardDescriptorAccessor) {
    [output appendFormat:@"%@%@: %@\n", indent, @"noStandardDescriptorAccessor", [NSNumber numberWithBool:self.noStandardDescriptorAccessor]];
  }
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBMessageOptions class]]) {
    return NO;
  }
  PBMessageOptions *otherMessage = other;
  return
      self.hasMessageSetWireFormat == otherMessage.hasMessageSetWireFormat &&
      (!self.hasMessageSetWireFormat || self.messageSetWireFormat == otherMessage.messageSetWireFormat) &&
      self.hasNoStandardDescriptorAccessor == otherMessage.hasNoStandardDescriptorAccessor &&
      (!self.hasNoStandardDescriptorAccessor || self.noStandardDescriptorAccessor == otherMessage.noStandardDescriptorAccessor) &&
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasMessageSetWireFormat) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.messageSetWireFormat] hash];
  }
  if (self.hasNoStandardDescriptorAccessor) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.noStandardDescriptorAccessor] hash];
  }
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBMessageOptionsBuilder()
@property (strong) PBMessageOptions* result;
@end

@implementation PBMessageOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBMessageOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBMessageOptionsBuilder*) clear {
  self.result = [[PBMessageOptions alloc] init];
  return self;
}
- (PBMessageOptionsBuilder*) clone {
  return [PBMessageOptions builderWithPrototype:result];
}
- (PBMessageOptions*) defaultInstance {
  return [PBMessageOptions defaultInstance];
}
- (PBMessageOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBMessageOptions*) buildPartial {
  PBMessageOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBMessageOptionsBuilder*) mergeFrom:(PBMessageOptions*) other {
  if (other == [PBMessageOptions defaultInstance]) {
    return self;
  }
  if (other.hasMessageSetWireFormat) {
    [self setMessageSetWireFormat:other.messageSetWireFormat];
  }
  if (other.hasNoStandardDescriptorAccessor) {
    [self setNoStandardDescriptorAccessor:other.noStandardDescriptorAccessor];
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBMessageOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBMessageOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 8: {
        [self setMessageSetWireFormat:[input readBool]];
        break;
      }
      case 16: {
        [self setNoStandardDescriptorAccessor:[input readBool]];
        break;
      }
      case 24: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasMessageSetWireFormat {
  return result.hasMessageSetWireFormat;
}
- (BOOL) messageSetWireFormat {
  return result.messageSetWireFormat;
}
- (PBMessageOptionsBuilder*) setMessageSetWireFormat:(BOOL) value {
  result.hasMessageSetWireFormat = YES;
  result.messageSetWireFormat = value;
  return self;
}
- (PBMessageOptionsBuilder*) clearMessageSetWireFormat {
  result.hasMessageSetWireFormat = NO;
  result.messageSetWireFormat = NO;
  return self;
}
- (BOOL) hasNoStandardDescriptorAccessor {
  return result.hasNoStandardDescriptorAccessor;
}
- (BOOL) noStandardDescriptorAccessor {
  return result.noStandardDescriptorAccessor;
}
- (PBMessageOptionsBuilder*) setNoStandardDescriptorAccessor:(BOOL) value {
  result.hasNoStandardDescriptorAccessor = YES;
  result.noStandardDescriptorAccessor = value;
  return self;
}
- (PBMessageOptionsBuilder*) clearNoStandardDescriptorAccessor {
  result.hasNoStandardDescriptorAccessor = NO;
  result.noStandardDescriptorAccessor = NO;
  return self;
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBMessageOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBMessageOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBMessageOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBMessageOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBMessageOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBFieldOptions ()
@property PBFieldOptionsCType ctype;
@property BOOL packed;
@property BOOL lazy;
@property BOOL deprecated;
@property (strong) NSString* experimentalMapKey;
@property BOOL weak;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBFieldOptions

- (BOOL) hasCtype {
  return !!hasCtype_;
}
- (void) setHasCtype:(BOOL) value_ {
  hasCtype_ = !!value_;
}
@synthesize ctype;
- (BOOL) hasPacked {
  return !!hasPacked_;
}
- (void) setHasPacked:(BOOL) value_ {
  hasPacked_ = !!value_;
}
- (BOOL) packed {
  return !!packed_;
}
- (void) setPacked:(BOOL) value_ {
  packed_ = !!value_;
}
- (BOOL) hasLazy {
  return !!hasLazy_;
}
- (void) setHasLazy:(BOOL) value_ {
  hasLazy_ = !!value_;
}
- (BOOL) lazy {
  return !!lazy_;
}
- (void) setLazy:(BOOL) value_ {
  lazy_ = !!value_;
}
- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
- (BOOL) hasExperimentalMapKey {
  return !!hasExperimentalMapKey_;
}
- (void) setHasExperimentalMapKey:(BOOL) value_ {
  hasExperimentalMapKey_ = !!value_;
}
@synthesize experimentalMapKey;
- (BOOL) hasWeak {
  return !!hasWeak_;
}
- (void) setHasWeak:(BOOL) value_ {
  hasWeak_ = !!value_;
}
- (BOOL) weak {
  return !!weak_;
}
- (void) setWeak:(BOOL) value_ {
  weak_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.ctype = PBFieldOptionsCTypeString;
    self.packed = NO;
    self.lazy = NO;
    self.deprecated = NO;
    self.experimentalMapKey = @"";
    self.weak = NO;
  }
  return self;
}
static PBFieldOptions* defaultPBFieldOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBFieldOptions class]) {
    defaultPBFieldOptionsInstance = [[PBFieldOptions alloc] init];
  }
}
+ (PBFieldOptions*) defaultInstance {
  return defaultPBFieldOptionsInstance;
}
- (PBFieldOptions*) defaultInstance {
  return defaultPBFieldOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasCtype) {
    [output writeEnum:1 value:self.ctype];
  }
  if (self.hasPacked) {
    [output writeBool:2 value:self.packed];
  }
  if (self.hasDeprecated) {
    [output writeBool:3 value:self.deprecated];
  }
  if (self.hasLazy) {
    [output writeBool:5 value:self.lazy];
  }
  if (self.hasExperimentalMapKey) {
    [output writeString:9 value:self.experimentalMapKey];
  }
  if (self.hasWeak) {
    [output writeBool:10 value:self.weak];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasCtype) {
    size_ += computeEnumSize(1, self.ctype);
  }
  if (self.hasPacked) {
    size_ += computeBoolSize(2, self.packed);
  }
  if (self.hasDeprecated) {
    size_ += computeBoolSize(3, self.deprecated);
  }
  if (self.hasLazy) {
    size_ += computeBoolSize(5, self.lazy);
  }
  if (self.hasExperimentalMapKey) {
    size_ += computeStringSize(9, self.experimentalMapKey);
  }
  if (self.hasWeak) {
    size_ += computeBoolSize(10, self.weak);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBFieldOptions*) parseFromData:(NSData*) data {
  return (PBFieldOptions*)[[[PBFieldOptions builder] mergeFromData:data] build];
}
+ (PBFieldOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFieldOptions*)[[[PBFieldOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBFieldOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBFieldOptions*)[[[PBFieldOptions builder] mergeFromInputStream:input] build];
}
+ (PBFieldOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFieldOptions*)[[[PBFieldOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFieldOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBFieldOptions*)[[[PBFieldOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBFieldOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBFieldOptions*)[[[PBFieldOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBFieldOptionsBuilder*) builder {
  return [[PBFieldOptionsBuilder alloc] init];
}
+ (PBFieldOptionsBuilder*) builderWithPrototype:(PBFieldOptions*) prototype {
  return [[PBFieldOptions builder] mergeFrom:prototype];
}
- (PBFieldOptionsBuilder*) builder {
  return [PBFieldOptions builder];
}
- (PBFieldOptionsBuilder*) toBuilder {
  return [PBFieldOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasCtype) {
    [output appendFormat:@"%@%@: %d\n", indent, @"ctype", self.ctype];
  }
  if (self.hasPacked) {
    [output appendFormat:@"%@%@: %@\n", indent, @"packed", [NSNumber numberWithBool:self.packed]];
  }
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  if (self.hasLazy) {
    [output appendFormat:@"%@%@: %@\n", indent, @"lazy", [NSNumber numberWithBool:self.lazy]];
  }
  if (self.hasExperimentalMapKey) {
    [output appendFormat:@"%@%@: %@\n", indent, @"experimentalMapKey", self.experimentalMapKey];
  }
  if (self.hasWeak) {
    [output appendFormat:@"%@%@: %@\n", indent, @"weak", [NSNumber numberWithBool:self.weak]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBFieldOptions class]]) {
    return NO;
  }
  PBFieldOptions *otherMessage = other;
  return
      self.hasCtype == otherMessage.hasCtype &&
      (!self.hasCtype || self.ctype == otherMessage.ctype) &&
      self.hasPacked == otherMessage.hasPacked &&
      (!self.hasPacked || self.packed == otherMessage.packed) &&
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      self.hasLazy == otherMessage.hasLazy &&
      (!self.hasLazy || self.lazy == otherMessage.lazy) &&
      self.hasExperimentalMapKey == otherMessage.hasExperimentalMapKey &&
      (!self.hasExperimentalMapKey || [self.experimentalMapKey isEqual:otherMessage.experimentalMapKey]) &&
      self.hasWeak == otherMessage.hasWeak &&
      (!self.hasWeak || self.weak == otherMessage.weak) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasCtype) {
    hashCode = hashCode * 31 + self.ctype;
  }
  if (self.hasPacked) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.packed] hash];
  }
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  if (self.hasLazy) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.lazy] hash];
  }
  if (self.hasExperimentalMapKey) {
    hashCode = hashCode * 31 + [self.experimentalMapKey hash];
  }
  if (self.hasWeak) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.weak] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

BOOL PBFieldOptionsCTypeIsValidValue(PBFieldOptionsCType value) {
  switch (value) {
    case PBFieldOptionsCTypeString:
    case PBFieldOptionsCTypeCord:
    case PBFieldOptionsCTypeStringPiece:
      return YES;
    default:
      return NO;
  }
}
@interface PBFieldOptionsBuilder()
@property (strong) PBFieldOptions* result;
@end

@implementation PBFieldOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBFieldOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBFieldOptionsBuilder*) clear {
  self.result = [[PBFieldOptions alloc] init];
  return self;
}
- (PBFieldOptionsBuilder*) clone {
  return [PBFieldOptions builderWithPrototype:result];
}
- (PBFieldOptions*) defaultInstance {
  return [PBFieldOptions defaultInstance];
}
- (PBFieldOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBFieldOptions*) buildPartial {
  PBFieldOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBFieldOptionsBuilder*) mergeFrom:(PBFieldOptions*) other {
  if (other == [PBFieldOptions defaultInstance]) {
    return self;
  }
  if (other.hasCtype) {
    [self setCtype:other.ctype];
  }
  if (other.hasPacked) {
    [self setPacked:other.packed];
  }
  if (other.hasLazy) {
    [self setLazy:other.lazy];
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.hasExperimentalMapKey) {
    [self setExperimentalMapKey:other.experimentalMapKey];
  }
  if (other.hasWeak) {
    [self setWeak:other.weak];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBFieldOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBFieldOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 8: {
        PBFieldOptionsCType value = (PBFieldOptionsCType)[input readEnum];
        if (PBFieldOptionsCTypeIsValidValue(value)) {
          [self setCtype:value];
        } else {
          [unknownFields mergeVarintField:1 value:value];
        }
        break;
      }
      case 16: {
        [self setPacked:[input readBool]];
        break;
      }
      case 24: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 40: {
        [self setLazy:[input readBool]];
        break;
      }
      case 74: {
        [self setExperimentalMapKey:[input readString]];
        break;
      }
      case 80: {
        [self setWeak:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasCtype {
  return result.hasCtype;
}
- (PBFieldOptionsCType) ctype {
  return result.ctype;
}
- (PBFieldOptionsBuilder*) setCtype:(PBFieldOptionsCType) value {
  result.hasCtype = YES;
  result.ctype = value;
  return self;
}
- (PBFieldOptionsBuilder*) clearCtype {
  result.hasCtype = NO;
  result.ctype = PBFieldOptionsCTypeString;
  return self;
}
- (BOOL) hasPacked {
  return result.hasPacked;
}
- (BOOL) packed {
  return result.packed;
}
- (PBFieldOptionsBuilder*) setPacked:(BOOL) value {
  result.hasPacked = YES;
  result.packed = value;
  return self;
}
- (PBFieldOptionsBuilder*) clearPacked {
  result.hasPacked = NO;
  result.packed = NO;
  return self;
}
- (BOOL) hasLazy {
  return result.hasLazy;
}
- (BOOL) lazy {
  return result.lazy;
}
- (PBFieldOptionsBuilder*) setLazy:(BOOL) value {
  result.hasLazy = YES;
  result.lazy = value;
  return self;
}
- (PBFieldOptionsBuilder*) clearLazy {
  result.hasLazy = NO;
  result.lazy = NO;
  return self;
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBFieldOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBFieldOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (BOOL) hasExperimentalMapKey {
  return result.hasExperimentalMapKey;
}
- (NSString*) experimentalMapKey {
  return result.experimentalMapKey;
}
- (PBFieldOptionsBuilder*) setExperimentalMapKey:(NSString*) value {
  result.hasExperimentalMapKey = YES;
  result.experimentalMapKey = value;
  return self;
}
- (PBFieldOptionsBuilder*) clearExperimentalMapKey {
  result.hasExperimentalMapKey = NO;
  result.experimentalMapKey = @"";
  return self;
}
- (BOOL) hasWeak {
  return result.hasWeak;
}
- (BOOL) weak {
  return result.weak;
}
- (PBFieldOptionsBuilder*) setWeak:(BOOL) value {
  result.hasWeak = YES;
  result.weak = value;
  return self;
}
- (PBFieldOptionsBuilder*) clearWeak {
  result.hasWeak = NO;
  result.weak = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBFieldOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBFieldOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBFieldOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBEnumOptions ()
@property BOOL allowAlias;
@property BOOL deprecated;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBEnumOptions

- (BOOL) hasAllowAlias {
  return !!hasAllowAlias_;
}
- (void) setHasAllowAlias:(BOOL) value_ {
  hasAllowAlias_ = !!value_;
}
- (BOOL) allowAlias {
  return !!allowAlias_;
}
- (void) setAllowAlias:(BOOL) value_ {
  allowAlias_ = !!value_;
}
- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.allowAlias = NO;
    self.deprecated = NO;
  }
  return self;
}
static PBEnumOptions* defaultPBEnumOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBEnumOptions class]) {
    defaultPBEnumOptionsInstance = [[PBEnumOptions alloc] init];
  }
}
+ (PBEnumOptions*) defaultInstance {
  return defaultPBEnumOptionsInstance;
}
- (PBEnumOptions*) defaultInstance {
  return defaultPBEnumOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasAllowAlias) {
    [output writeBool:2 value:self.allowAlias];
  }
  if (self.hasDeprecated) {
    [output writeBool:3 value:self.deprecated];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasAllowAlias) {
    size_ += computeBoolSize(2, self.allowAlias);
  }
  if (self.hasDeprecated) {
    size_ += computeBoolSize(3, self.deprecated);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBEnumOptions*) parseFromData:(NSData*) data {
  return (PBEnumOptions*)[[[PBEnumOptions builder] mergeFromData:data] build];
}
+ (PBEnumOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumOptions*)[[[PBEnumOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBEnumOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBEnumOptions*)[[[PBEnumOptions builder] mergeFromInputStream:input] build];
}
+ (PBEnumOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumOptions*)[[[PBEnumOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBEnumOptions*)[[[PBEnumOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBEnumOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumOptions*)[[[PBEnumOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumOptionsBuilder*) builder {
  return [[PBEnumOptionsBuilder alloc] init];
}
+ (PBEnumOptionsBuilder*) builderWithPrototype:(PBEnumOptions*) prototype {
  return [[PBEnumOptions builder] mergeFrom:prototype];
}
- (PBEnumOptionsBuilder*) builder {
  return [PBEnumOptions builder];
}
- (PBEnumOptionsBuilder*) toBuilder {
  return [PBEnumOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasAllowAlias) {
    [output appendFormat:@"%@%@: %@\n", indent, @"allowAlias", [NSNumber numberWithBool:self.allowAlias]];
  }
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBEnumOptions class]]) {
    return NO;
  }
  PBEnumOptions *otherMessage = other;
  return
      self.hasAllowAlias == otherMessage.hasAllowAlias &&
      (!self.hasAllowAlias || self.allowAlias == otherMessage.allowAlias) &&
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasAllowAlias) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.allowAlias] hash];
  }
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBEnumOptionsBuilder()
@property (strong) PBEnumOptions* result;
@end

@implementation PBEnumOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBEnumOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBEnumOptionsBuilder*) clear {
  self.result = [[PBEnumOptions alloc] init];
  return self;
}
- (PBEnumOptionsBuilder*) clone {
  return [PBEnumOptions builderWithPrototype:result];
}
- (PBEnumOptions*) defaultInstance {
  return [PBEnumOptions defaultInstance];
}
- (PBEnumOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBEnumOptions*) buildPartial {
  PBEnumOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBEnumOptionsBuilder*) mergeFrom:(PBEnumOptions*) other {
  if (other == [PBEnumOptions defaultInstance]) {
    return self;
  }
  if (other.hasAllowAlias) {
    [self setAllowAlias:other.allowAlias];
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBEnumOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBEnumOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 16: {
        [self setAllowAlias:[input readBool]];
        break;
      }
      case 24: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasAllowAlias {
  return result.hasAllowAlias;
}
- (BOOL) allowAlias {
  return result.allowAlias;
}
- (PBEnumOptionsBuilder*) setAllowAlias:(BOOL) value {
  result.hasAllowAlias = YES;
  result.allowAlias = value;
  return self;
}
- (PBEnumOptionsBuilder*) clearAllowAlias {
  result.hasAllowAlias = NO;
  result.allowAlias = NO;
  return self;
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBEnumOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBEnumOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBEnumOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBEnumOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBEnumOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBEnumValueOptions ()
@property BOOL deprecated;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBEnumValueOptions

- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.deprecated = NO;
  }
  return self;
}
static PBEnumValueOptions* defaultPBEnumValueOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBEnumValueOptions class]) {
    defaultPBEnumValueOptionsInstance = [[PBEnumValueOptions alloc] init];
  }
}
+ (PBEnumValueOptions*) defaultInstance {
  return defaultPBEnumValueOptionsInstance;
}
- (PBEnumValueOptions*) defaultInstance {
  return defaultPBEnumValueOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasDeprecated) {
    [output writeBool:1 value:self.deprecated];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasDeprecated) {
    size_ += computeBoolSize(1, self.deprecated);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBEnumValueOptions*) parseFromData:(NSData*) data {
  return (PBEnumValueOptions*)[[[PBEnumValueOptions builder] mergeFromData:data] build];
}
+ (PBEnumValueOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumValueOptions*)[[[PBEnumValueOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBEnumValueOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBEnumValueOptions*)[[[PBEnumValueOptions builder] mergeFromInputStream:input] build];
}
+ (PBEnumValueOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumValueOptions*)[[[PBEnumValueOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumValueOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBEnumValueOptions*)[[[PBEnumValueOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBEnumValueOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBEnumValueOptions*)[[[PBEnumValueOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBEnumValueOptionsBuilder*) builder {
  return [[PBEnumValueOptionsBuilder alloc] init];
}
+ (PBEnumValueOptionsBuilder*) builderWithPrototype:(PBEnumValueOptions*) prototype {
  return [[PBEnumValueOptions builder] mergeFrom:prototype];
}
- (PBEnumValueOptionsBuilder*) builder {
  return [PBEnumValueOptions builder];
}
- (PBEnumValueOptionsBuilder*) toBuilder {
  return [PBEnumValueOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBEnumValueOptions class]]) {
    return NO;
  }
  PBEnumValueOptions *otherMessage = other;
  return
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBEnumValueOptionsBuilder()
@property (strong) PBEnumValueOptions* result;
@end

@implementation PBEnumValueOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBEnumValueOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBEnumValueOptionsBuilder*) clear {
  self.result = [[PBEnumValueOptions alloc] init];
  return self;
}
- (PBEnumValueOptionsBuilder*) clone {
  return [PBEnumValueOptions builderWithPrototype:result];
}
- (PBEnumValueOptions*) defaultInstance {
  return [PBEnumValueOptions defaultInstance];
}
- (PBEnumValueOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBEnumValueOptions*) buildPartial {
  PBEnumValueOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBEnumValueOptionsBuilder*) mergeFrom:(PBEnumValueOptions*) other {
  if (other == [PBEnumValueOptions defaultInstance]) {
    return self;
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBEnumValueOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBEnumValueOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 8: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBEnumValueOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBEnumValueOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBEnumValueOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBEnumValueOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBEnumValueOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBServiceOptions ()
@property BOOL deprecated;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBServiceOptions

- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.deprecated = NO;
  }
  return self;
}
static PBServiceOptions* defaultPBServiceOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBServiceOptions class]) {
    defaultPBServiceOptionsInstance = [[PBServiceOptions alloc] init];
  }
}
+ (PBServiceOptions*) defaultInstance {
  return defaultPBServiceOptionsInstance;
}
- (PBServiceOptions*) defaultInstance {
  return defaultPBServiceOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasDeprecated) {
    [output writeBool:33 value:self.deprecated];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasDeprecated) {
    size_ += computeBoolSize(33, self.deprecated);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBServiceOptions*) parseFromData:(NSData*) data {
  return (PBServiceOptions*)[[[PBServiceOptions builder] mergeFromData:data] build];
}
+ (PBServiceOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBServiceOptions*)[[[PBServiceOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBServiceOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBServiceOptions*)[[[PBServiceOptions builder] mergeFromInputStream:input] build];
}
+ (PBServiceOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBServiceOptions*)[[[PBServiceOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBServiceOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBServiceOptions*)[[[PBServiceOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBServiceOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBServiceOptions*)[[[PBServiceOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBServiceOptionsBuilder*) builder {
  return [[PBServiceOptionsBuilder alloc] init];
}
+ (PBServiceOptionsBuilder*) builderWithPrototype:(PBServiceOptions*) prototype {
  return [[PBServiceOptions builder] mergeFrom:prototype];
}
- (PBServiceOptionsBuilder*) builder {
  return [PBServiceOptions builder];
}
- (PBServiceOptionsBuilder*) toBuilder {
  return [PBServiceOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBServiceOptions class]]) {
    return NO;
  }
  PBServiceOptions *otherMessage = other;
  return
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBServiceOptionsBuilder()
@property (strong) PBServiceOptions* result;
@end

@implementation PBServiceOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBServiceOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBServiceOptionsBuilder*) clear {
  self.result = [[PBServiceOptions alloc] init];
  return self;
}
- (PBServiceOptionsBuilder*) clone {
  return [PBServiceOptions builderWithPrototype:result];
}
- (PBServiceOptions*) defaultInstance {
  return [PBServiceOptions defaultInstance];
}
- (PBServiceOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBServiceOptions*) buildPartial {
  PBServiceOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBServiceOptionsBuilder*) mergeFrom:(PBServiceOptions*) other {
  if (other == [PBServiceOptions defaultInstance]) {
    return self;
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBServiceOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBServiceOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 264: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBServiceOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBServiceOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBServiceOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBServiceOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBServiceOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBMethodOptions ()
@property BOOL deprecated;
@property (strong) NSMutableArray * uninterpretedOptionArray;
@end

@implementation PBMethodOptions

- (BOOL) hasDeprecated {
  return !!hasDeprecated_;
}
- (void) setHasDeprecated:(BOOL) value_ {
  hasDeprecated_ = !!value_;
}
- (BOOL) deprecated {
  return !!deprecated_;
}
- (void) setDeprecated:(BOOL) value_ {
  deprecated_ = !!value_;
}
@synthesize uninterpretedOptionArray;
@dynamic uninterpretedOption;
- (id) init {
  if ((self = [super init])) {
    self.deprecated = NO;
  }
  return self;
}
static PBMethodOptions* defaultPBMethodOptionsInstance = nil;
+ (void) initialize {
  if (self == [PBMethodOptions class]) {
    defaultPBMethodOptionsInstance = [[PBMethodOptions alloc] init];
  }
}
+ (PBMethodOptions*) defaultInstance {
  return defaultPBMethodOptionsInstance;
}
- (PBMethodOptions*) defaultInstance {
  return defaultPBMethodOptionsInstance;
}
- (NSArray *)uninterpretedOption {
  return uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [uninterpretedOptionArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInituninterpretedOption = YES;
   [self.uninterpretedOption enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInituninterpretedOption = NO;
      *stop = YES;
    }
  }];
  if (!isInituninterpretedOption) return isInituninterpretedOption;
  if (!self.extensionsAreInitialized) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasDeprecated) {
    [output writeBool:33 value:self.deprecated];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:999 value:element];
  }];
  [self writeExtensionsToCodedOutputStream:output
                                      from:1000
                                        to:536870912];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasDeprecated) {
    size_ += computeBoolSize(33, self.deprecated);
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(999, element);
  }];
  size_ += [self extensionsSerializedSize];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBMethodOptions*) parseFromData:(NSData*) data {
  return (PBMethodOptions*)[[[PBMethodOptions builder] mergeFromData:data] build];
}
+ (PBMethodOptions*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMethodOptions*)[[[PBMethodOptions builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBMethodOptions*) parseFromInputStream:(NSInputStream*) input {
  return (PBMethodOptions*)[[[PBMethodOptions builder] mergeFromInputStream:input] build];
}
+ (PBMethodOptions*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMethodOptions*)[[[PBMethodOptions builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBMethodOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBMethodOptions*)[[[PBMethodOptions builder] mergeFromCodedInputStream:input] build];
}
+ (PBMethodOptions*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBMethodOptions*)[[[PBMethodOptions builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBMethodOptionsBuilder*) builder {
  return [[PBMethodOptionsBuilder alloc] init];
}
+ (PBMethodOptionsBuilder*) builderWithPrototype:(PBMethodOptions*) prototype {
  return [[PBMethodOptions builder] mergeFrom:prototype];
}
- (PBMethodOptionsBuilder*) builder {
  return [PBMethodOptions builder];
}
- (PBMethodOptionsBuilder*) toBuilder {
  return [PBMethodOptions builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasDeprecated) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deprecated", [NSNumber numberWithBool:self.deprecated]];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"uninterpretedOption"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self writeExtensionDescriptionToMutableString:(NSMutableString*)output
                                            from:1000
                                              to:536870912
                                      withIndent:indent];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBMethodOptions class]]) {
    return NO;
  }
  PBMethodOptions *otherMessage = other;
  return
      self.hasDeprecated == otherMessage.hasDeprecated &&
      (!self.hasDeprecated || self.deprecated == otherMessage.deprecated) &&
      [self.uninterpretedOptionArray isEqualToArray:otherMessage.uninterpretedOptionArray] &&
      [self isEqualExtensionsInOther:otherMessage from:1000 to:536870912] &&

      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasDeprecated) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.deprecated] hash];
  }
  [self.uninterpretedOptionArray enumerateObjectsUsingBlock:^(PBUninterpretedOption *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self hashExtensionsFrom:1000 to:536870912];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBMethodOptionsBuilder()
@property (strong) PBMethodOptions* result;
@end

@implementation PBMethodOptionsBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBMethodOptions alloc] init];
  }
  return self;
}
- (PBExtendableMessage*) internalGetResult {
  return result;
}
- (PBMethodOptionsBuilder*) clear {
  self.result = [[PBMethodOptions alloc] init];
  return self;
}
- (PBMethodOptionsBuilder*) clone {
  return [PBMethodOptions builderWithPrototype:result];
}
- (PBMethodOptions*) defaultInstance {
  return [PBMethodOptions defaultInstance];
}
- (PBMethodOptions*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBMethodOptions*) buildPartial {
  PBMethodOptions* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBMethodOptionsBuilder*) mergeFrom:(PBMethodOptions*) other {
  if (other == [PBMethodOptions defaultInstance]) {
    return self;
  }
  if (other.hasDeprecated) {
    [self setDeprecated:other.deprecated];
  }
  if (other.uninterpretedOptionArray.count > 0) {
    if (result.uninterpretedOptionArray == nil) {
      result.uninterpretedOptionArray = [[NSMutableArray alloc] initWithArray:other.uninterpretedOptionArray];
    } else {
      [result.uninterpretedOptionArray addObjectsFromArray:other.uninterpretedOptionArray];
    }
  }
  [self mergeExtensionFields:other];
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBMethodOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBMethodOptionsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 264: {
        [self setDeprecated:[input readBool]];
        break;
      }
      case 7994: {
        PBUninterpretedOptionBuilder* subBuilder = [PBUninterpretedOption builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addUninterpretedOption:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (BOOL) hasDeprecated {
  return result.hasDeprecated;
}
- (BOOL) deprecated {
  return result.deprecated;
}
- (PBMethodOptionsBuilder*) setDeprecated:(BOOL) value {
  result.hasDeprecated = YES;
  result.deprecated = value;
  return self;
}
- (PBMethodOptionsBuilder*) clearDeprecated {
  result.hasDeprecated = NO;
  result.deprecated = NO;
  return self;
}
- (NSMutableArray *)uninterpretedOption {
  return result.uninterpretedOptionArray;
}
- (PBUninterpretedOption*)uninterpretedOptionAtIndex:(NSUInteger)index {
  return [result uninterpretedOptionAtIndex:index];
}
- (PBMethodOptionsBuilder *)addUninterpretedOption:(PBUninterpretedOption*)value {
  if (result.uninterpretedOptionArray == nil) {
    result.uninterpretedOptionArray = [[NSMutableArray alloc]init];
  }
  [result.uninterpretedOptionArray addObject:value];
  return self;
}
- (PBMethodOptionsBuilder *)setUninterpretedOptionArray:(NSArray *)array {
  result.uninterpretedOptionArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBMethodOptionsBuilder *)clearUninterpretedOption {
  result.uninterpretedOptionArray = nil;
  return self;
}
@end

@interface PBUninterpretedOption ()
@property (strong) NSMutableArray * nameArray;
@property (strong) NSString* identifierValue;
@property UInt64 positiveIntValue;
@property SInt64 negativeIntValue;
@property Float64 doubleValue;
@property (strong) NSData* stringValue;
@property (strong) NSString* aggregateValue;
@end

@implementation PBUninterpretedOption

@synthesize nameArray;
@dynamic name;
- (BOOL) hasIdentifierValue {
  return !!hasIdentifierValue_;
}
- (void) setHasIdentifierValue:(BOOL) value_ {
  hasIdentifierValue_ = !!value_;
}
@synthesize identifierValue;
- (BOOL) hasPositiveIntValue {
  return !!hasPositiveIntValue_;
}
- (void) setHasPositiveIntValue:(BOOL) value_ {
  hasPositiveIntValue_ = !!value_;
}
@synthesize positiveIntValue;
- (BOOL) hasNegativeIntValue {
  return !!hasNegativeIntValue_;
}
- (void) setHasNegativeIntValue:(BOOL) value_ {
  hasNegativeIntValue_ = !!value_;
}
@synthesize negativeIntValue;
- (BOOL) hasDoubleValue {
  return !!hasDoubleValue_;
}
- (void) setHasDoubleValue:(BOOL) value_ {
  hasDoubleValue_ = !!value_;
}
@synthesize doubleValue;
- (BOOL) hasStringValue {
  return !!hasStringValue_;
}
- (void) setHasStringValue:(BOOL) value_ {
  hasStringValue_ = !!value_;
}
@synthesize stringValue;
- (BOOL) hasAggregateValue {
  return !!hasAggregateValue_;
}
- (void) setHasAggregateValue:(BOOL) value_ {
  hasAggregateValue_ = !!value_;
}
@synthesize aggregateValue;
- (id) init {
  if ((self = [super init])) {
    self.identifierValue = @"";
    self.positiveIntValue = 0L;
    self.negativeIntValue = 0L;
    self.doubleValue = 0;
    self.stringValue = [NSData data];
    self.aggregateValue = @"";
  }
  return self;
}
static PBUninterpretedOption* defaultPBUninterpretedOptionInstance = nil;
+ (void) initialize {
  if (self == [PBUninterpretedOption class]) {
    defaultPBUninterpretedOptionInstance = [[PBUninterpretedOption alloc] init];
  }
}
+ (PBUninterpretedOption*) defaultInstance {
  return defaultPBUninterpretedOptionInstance;
}
- (PBUninterpretedOption*) defaultInstance {
  return defaultPBUninterpretedOptionInstance;
}
- (NSArray *)name {
  return nameArray;
}
- (PBUninterpretedOptionNamePart*)nameAtIndex:(NSUInteger)index {
  return [nameArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  __block BOOL isInitname = YES;
   [self.name enumerateObjectsUsingBlock:^(PBUninterpretedOptionNamePart *element, NSUInteger idx, BOOL *stop) {
    if (!element.isInitialized) {
      isInitname = NO;
      *stop = YES;
    }
  }];
  if (!isInitname) return isInitname;
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  [self.nameArray enumerateObjectsUsingBlock:^(PBUninterpretedOptionNamePart *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:2 value:element];
  }];
  if (self.hasIdentifierValue) {
    [output writeString:3 value:self.identifierValue];
  }
  if (self.hasPositiveIntValue) {
    [output writeUInt64:4 value:self.positiveIntValue];
  }
  if (self.hasNegativeIntValue) {
    [output writeInt64:5 value:self.negativeIntValue];
  }
  if (self.hasDoubleValue) {
    [output writeDouble:6 value:self.doubleValue];
  }
  if (self.hasStringValue) {
    [output writeData:7 value:self.stringValue];
  }
  if (self.hasAggregateValue) {
    [output writeString:8 value:self.aggregateValue];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  [self.nameArray enumerateObjectsUsingBlock:^(PBUninterpretedOptionNamePart *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(2, element);
  }];
  if (self.hasIdentifierValue) {
    size_ += computeStringSize(3, self.identifierValue);
  }
  if (self.hasPositiveIntValue) {
    size_ += computeUInt64Size(4, self.positiveIntValue);
  }
  if (self.hasNegativeIntValue) {
    size_ += computeInt64Size(5, self.negativeIntValue);
  }
  if (self.hasDoubleValue) {
    size_ += computeDoubleSize(6, self.doubleValue);
  }
  if (self.hasStringValue) {
    size_ += computeDataSize(7, self.stringValue);
  }
  if (self.hasAggregateValue) {
    size_ += computeStringSize(8, self.aggregateValue);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBUninterpretedOption*) parseFromData:(NSData*) data {
  return (PBUninterpretedOption*)[[[PBUninterpretedOption builder] mergeFromData:data] build];
}
+ (PBUninterpretedOption*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBUninterpretedOption*)[[[PBUninterpretedOption builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBUninterpretedOption*) parseFromInputStream:(NSInputStream*) input {
  return (PBUninterpretedOption*)[[[PBUninterpretedOption builder] mergeFromInputStream:input] build];
}
+ (PBUninterpretedOption*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBUninterpretedOption*)[[[PBUninterpretedOption builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBUninterpretedOption*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBUninterpretedOption*)[[[PBUninterpretedOption builder] mergeFromCodedInputStream:input] build];
}
+ (PBUninterpretedOption*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBUninterpretedOption*)[[[PBUninterpretedOption builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBUninterpretedOptionBuilder*) builder {
  return [[PBUninterpretedOptionBuilder alloc] init];
}
+ (PBUninterpretedOptionBuilder*) builderWithPrototype:(PBUninterpretedOption*) prototype {
  return [[PBUninterpretedOption builder] mergeFrom:prototype];
}
- (PBUninterpretedOptionBuilder*) builder {
  return [PBUninterpretedOption builder];
}
- (PBUninterpretedOptionBuilder*) toBuilder {
  return [PBUninterpretedOption builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  [self.nameArray enumerateObjectsUsingBlock:^(PBUninterpretedOptionNamePart *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"name"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  if (self.hasIdentifierValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"identifierValue", self.identifierValue];
  }
  if (self.hasPositiveIntValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"positiveIntValue", [NSNumber numberWithLongLong:self.positiveIntValue]];
  }
  if (self.hasNegativeIntValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"negativeIntValue", [NSNumber numberWithLongLong:self.negativeIntValue]];
  }
  if (self.hasDoubleValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"doubleValue", [NSNumber numberWithDouble:self.doubleValue]];
  }
  if (self.hasStringValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"stringValue", self.stringValue];
  }
  if (self.hasAggregateValue) {
    [output appendFormat:@"%@%@: %@\n", indent, @"aggregateValue", self.aggregateValue];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBUninterpretedOption class]]) {
    return NO;
  }
  PBUninterpretedOption *otherMessage = other;
  return
      [self.nameArray isEqualToArray:otherMessage.nameArray] &&
      self.hasIdentifierValue == otherMessage.hasIdentifierValue &&
      (!self.hasIdentifierValue || [self.identifierValue isEqual:otherMessage.identifierValue]) &&
      self.hasPositiveIntValue == otherMessage.hasPositiveIntValue &&
      (!self.hasPositiveIntValue || self.positiveIntValue == otherMessage.positiveIntValue) &&
      self.hasNegativeIntValue == otherMessage.hasNegativeIntValue &&
      (!self.hasNegativeIntValue || self.negativeIntValue == otherMessage.negativeIntValue) &&
      self.hasDoubleValue == otherMessage.hasDoubleValue &&
      (!self.hasDoubleValue || self.doubleValue == otherMessage.doubleValue) &&
      self.hasStringValue == otherMessage.hasStringValue &&
      (!self.hasStringValue || [self.stringValue isEqual:otherMessage.stringValue]) &&
      self.hasAggregateValue == otherMessage.hasAggregateValue &&
      (!self.hasAggregateValue || [self.aggregateValue isEqual:otherMessage.aggregateValue]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  [self.nameArray enumerateObjectsUsingBlock:^(PBUninterpretedOptionNamePart *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  if (self.hasIdentifierValue) {
    hashCode = hashCode * 31 + [self.identifierValue hash];
  }
  if (self.hasPositiveIntValue) {
    hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.positiveIntValue] hash];
  }
  if (self.hasNegativeIntValue) {
    hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.negativeIntValue] hash];
  }
  if (self.hasDoubleValue) {
    hashCode = hashCode * 31 + [[NSNumber numberWithDouble:self.doubleValue] hash];
  }
  if (self.hasStringValue) {
    hashCode = hashCode * 31 + [self.stringValue hash];
  }
  if (self.hasAggregateValue) {
    hashCode = hashCode * 31 + [self.aggregateValue hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBUninterpretedOptionNamePart ()
@property (strong) NSString* namePart;
@property BOOL isExtension;
@end

@implementation PBUninterpretedOptionNamePart

- (BOOL) hasNamePart {
  return !!hasNamePart_;
}
- (void) setHasNamePart:(BOOL) value_ {
  hasNamePart_ = !!value_;
}
@synthesize namePart;
- (BOOL) hasIsExtension {
  return !!hasIsExtension_;
}
- (void) setHasIsExtension:(BOOL) value_ {
  hasIsExtension_ = !!value_;
}
- (BOOL) isExtension {
  return !!isExtension_;
}
- (void) setIsExtension:(BOOL) value_ {
  isExtension_ = !!value_;
}
- (id) init {
  if ((self = [super init])) {
    self.namePart = @"";
    self.isExtension = NO;
  }
  return self;
}
static PBUninterpretedOptionNamePart* defaultPBUninterpretedOptionNamePartInstance = nil;
+ (void) initialize {
  if (self == [PBUninterpretedOptionNamePart class]) {
    defaultPBUninterpretedOptionNamePartInstance = [[PBUninterpretedOptionNamePart alloc] init];
  }
}
+ (PBUninterpretedOptionNamePart*) defaultInstance {
  return defaultPBUninterpretedOptionNamePartInstance;
}
- (PBUninterpretedOptionNamePart*) defaultInstance {
  return defaultPBUninterpretedOptionNamePartInstance;
}
- (BOOL) isInitialized {
  if (!self.hasNamePart) {
    return NO;
  }
  if (!self.hasIsExtension) {
    return NO;
  }
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasNamePart) {
    [output writeString:1 value:self.namePart];
  }
  if (self.hasIsExtension) {
    [output writeBool:2 value:self.isExtension];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasNamePart) {
    size_ += computeStringSize(1, self.namePart);
  }
  if (self.hasIsExtension) {
    size_ += computeBoolSize(2, self.isExtension);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBUninterpretedOptionNamePart*) parseFromData:(NSData*) data {
  return (PBUninterpretedOptionNamePart*)[[[PBUninterpretedOptionNamePart builder] mergeFromData:data] build];
}
+ (PBUninterpretedOptionNamePart*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBUninterpretedOptionNamePart*)[[[PBUninterpretedOptionNamePart builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBUninterpretedOptionNamePart*) parseFromInputStream:(NSInputStream*) input {
  return (PBUninterpretedOptionNamePart*)[[[PBUninterpretedOptionNamePart builder] mergeFromInputStream:input] build];
}
+ (PBUninterpretedOptionNamePart*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBUninterpretedOptionNamePart*)[[[PBUninterpretedOptionNamePart builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBUninterpretedOptionNamePart*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBUninterpretedOptionNamePart*)[[[PBUninterpretedOptionNamePart builder] mergeFromCodedInputStream:input] build];
}
+ (PBUninterpretedOptionNamePart*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBUninterpretedOptionNamePart*)[[[PBUninterpretedOptionNamePart builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBUninterpretedOptionNamePartBuilder*) builder {
  return [[PBUninterpretedOptionNamePartBuilder alloc] init];
}
+ (PBUninterpretedOptionNamePartBuilder*) builderWithPrototype:(PBUninterpretedOptionNamePart*) prototype {
  return [[PBUninterpretedOptionNamePart builder] mergeFrom:prototype];
}
- (PBUninterpretedOptionNamePartBuilder*) builder {
  return [PBUninterpretedOptionNamePart builder];
}
- (PBUninterpretedOptionNamePartBuilder*) toBuilder {
  return [PBUninterpretedOptionNamePart builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasNamePart) {
    [output appendFormat:@"%@%@: %@\n", indent, @"namePart", self.namePart];
  }
  if (self.hasIsExtension) {
    [output appendFormat:@"%@%@: %@\n", indent, @"isExtension", [NSNumber numberWithBool:self.isExtension]];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBUninterpretedOptionNamePart class]]) {
    return NO;
  }
  PBUninterpretedOptionNamePart *otherMessage = other;
  return
      self.hasNamePart == otherMessage.hasNamePart &&
      (!self.hasNamePart || [self.namePart isEqual:otherMessage.namePart]) &&
      self.hasIsExtension == otherMessage.hasIsExtension &&
      (!self.hasIsExtension || self.isExtension == otherMessage.isExtension) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasNamePart) {
    hashCode = hashCode * 31 + [self.namePart hash];
  }
  if (self.hasIsExtension) {
    hashCode = hashCode * 31 + [[NSNumber numberWithBool:self.isExtension] hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBUninterpretedOptionNamePartBuilder()
@property (strong) PBUninterpretedOptionNamePart* result;
@end

@implementation PBUninterpretedOptionNamePartBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBUninterpretedOptionNamePart alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBUninterpretedOptionNamePartBuilder*) clear {
  self.result = [[PBUninterpretedOptionNamePart alloc] init];
  return self;
}
- (PBUninterpretedOptionNamePartBuilder*) clone {
  return [PBUninterpretedOptionNamePart builderWithPrototype:result];
}
- (PBUninterpretedOptionNamePart*) defaultInstance {
  return [PBUninterpretedOptionNamePart defaultInstance];
}
- (PBUninterpretedOptionNamePart*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBUninterpretedOptionNamePart*) buildPartial {
  PBUninterpretedOptionNamePart* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBUninterpretedOptionNamePartBuilder*) mergeFrom:(PBUninterpretedOptionNamePart*) other {
  if (other == [PBUninterpretedOptionNamePart defaultInstance]) {
    return self;
  }
  if (other.hasNamePart) {
    [self setNamePart:other.namePart];
  }
  if (other.hasIsExtension) {
    [self setIsExtension:other.isExtension];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBUninterpretedOptionNamePartBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBUninterpretedOptionNamePartBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setNamePart:[input readString]];
        break;
      }
      case 16: {
        [self setIsExtension:[input readBool]];
        break;
      }
    }
  }
}
- (BOOL) hasNamePart {
  return result.hasNamePart;
}
- (NSString*) namePart {
  return result.namePart;
}
- (PBUninterpretedOptionNamePartBuilder*) setNamePart:(NSString*) value {
  result.hasNamePart = YES;
  result.namePart = value;
  return self;
}
- (PBUninterpretedOptionNamePartBuilder*) clearNamePart {
  result.hasNamePart = NO;
  result.namePart = @"";
  return self;
}
- (BOOL) hasIsExtension {
  return result.hasIsExtension;
}
- (BOOL) isExtension {
  return result.isExtension;
}
- (PBUninterpretedOptionNamePartBuilder*) setIsExtension:(BOOL) value {
  result.hasIsExtension = YES;
  result.isExtension = value;
  return self;
}
- (PBUninterpretedOptionNamePartBuilder*) clearIsExtension {
  result.hasIsExtension = NO;
  result.isExtension = NO;
  return self;
}
@end

@interface PBUninterpretedOptionBuilder()
@property (strong) PBUninterpretedOption* result;
@end

@implementation PBUninterpretedOptionBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBUninterpretedOption alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBUninterpretedOptionBuilder*) clear {
  self.result = [[PBUninterpretedOption alloc] init];
  return self;
}
- (PBUninterpretedOptionBuilder*) clone {
  return [PBUninterpretedOption builderWithPrototype:result];
}
- (PBUninterpretedOption*) defaultInstance {
  return [PBUninterpretedOption defaultInstance];
}
- (PBUninterpretedOption*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBUninterpretedOption*) buildPartial {
  PBUninterpretedOption* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBUninterpretedOptionBuilder*) mergeFrom:(PBUninterpretedOption*) other {
  if (other == [PBUninterpretedOption defaultInstance]) {
    return self;
  }
  if (other.nameArray.count > 0) {
    if (result.nameArray == nil) {
      result.nameArray = [[NSMutableArray alloc] initWithArray:other.nameArray];
    } else {
      [result.nameArray addObjectsFromArray:other.nameArray];
    }
  }
  if (other.hasIdentifierValue) {
    [self setIdentifierValue:other.identifierValue];
  }
  if (other.hasPositiveIntValue) {
    [self setPositiveIntValue:other.positiveIntValue];
  }
  if (other.hasNegativeIntValue) {
    [self setNegativeIntValue:other.negativeIntValue];
  }
  if (other.hasDoubleValue) {
    [self setDoubleValue:other.doubleValue];
  }
  if (other.hasStringValue) {
    [self setStringValue:other.stringValue];
  }
  if (other.hasAggregateValue) {
    [self setAggregateValue:other.aggregateValue];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBUninterpretedOptionBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBUninterpretedOptionBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 18: {
        PBUninterpretedOptionNamePartBuilder* subBuilder = [PBUninterpretedOptionNamePart builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addName:[subBuilder buildPartial]];
        break;
      }
      case 26: {
        [self setIdentifierValue:[input readString]];
        break;
      }
      case 32: {
        [self setPositiveIntValue:[input readUInt64]];
        break;
      }
      case 40: {
        [self setNegativeIntValue:[input readInt64]];
        break;
      }
      case 49: {
        [self setDoubleValue:[input readDouble]];
        break;
      }
      case 58: {
        [self setStringValue:[input readData]];
        break;
      }
      case 66: {
        [self setAggregateValue:[input readString]];
        break;
      }
    }
  }
}
- (NSMutableArray *)name {
  return result.nameArray;
}
- (PBUninterpretedOptionNamePart*)nameAtIndex:(NSUInteger)index {
  return [result nameAtIndex:index];
}
- (PBUninterpretedOptionBuilder *)addName:(PBUninterpretedOptionNamePart*)value {
  if (result.nameArray == nil) {
    result.nameArray = [[NSMutableArray alloc]init];
  }
  [result.nameArray addObject:value];
  return self;
}
- (PBUninterpretedOptionBuilder *)setNameArray:(NSArray *)array {
  result.nameArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBUninterpretedOptionBuilder *)clearName {
  result.nameArray = nil;
  return self;
}
- (BOOL) hasIdentifierValue {
  return result.hasIdentifierValue;
}
- (NSString*) identifierValue {
  return result.identifierValue;
}
- (PBUninterpretedOptionBuilder*) setIdentifierValue:(NSString*) value {
  result.hasIdentifierValue = YES;
  result.identifierValue = value;
  return self;
}
- (PBUninterpretedOptionBuilder*) clearIdentifierValue {
  result.hasIdentifierValue = NO;
  result.identifierValue = @"";
  return self;
}
- (BOOL) hasPositiveIntValue {
  return result.hasPositiveIntValue;
}
- (UInt64) positiveIntValue {
  return result.positiveIntValue;
}
- (PBUninterpretedOptionBuilder*) setPositiveIntValue:(UInt64) value {
  result.hasPositiveIntValue = YES;
  result.positiveIntValue = value;
  return self;
}
- (PBUninterpretedOptionBuilder*) clearPositiveIntValue {
  result.hasPositiveIntValue = NO;
  result.positiveIntValue = 0L;
  return self;
}
- (BOOL) hasNegativeIntValue {
  return result.hasNegativeIntValue;
}
- (SInt64) negativeIntValue {
  return result.negativeIntValue;
}
- (PBUninterpretedOptionBuilder*) setNegativeIntValue:(SInt64) value {
  result.hasNegativeIntValue = YES;
  result.negativeIntValue = value;
  return self;
}
- (PBUninterpretedOptionBuilder*) clearNegativeIntValue {
  result.hasNegativeIntValue = NO;
  result.negativeIntValue = 0L;
  return self;
}
- (BOOL) hasDoubleValue {
  return result.hasDoubleValue;
}
- (Float64) doubleValue {
  return result.doubleValue;
}
- (PBUninterpretedOptionBuilder*) setDoubleValue:(Float64) value {
  result.hasDoubleValue = YES;
  result.doubleValue = value;
  return self;
}
- (PBUninterpretedOptionBuilder*) clearDoubleValue {
  result.hasDoubleValue = NO;
  result.doubleValue = 0;
  return self;
}
- (BOOL) hasStringValue {
  return result.hasStringValue;
}
- (NSData*) stringValue {
  return result.stringValue;
}
- (PBUninterpretedOptionBuilder*) setStringValue:(NSData*) value {
  result.hasStringValue = YES;
  result.stringValue = value;
  return self;
}
- (PBUninterpretedOptionBuilder*) clearStringValue {
  result.hasStringValue = NO;
  result.stringValue = [NSData data];
  return self;
}
- (BOOL) hasAggregateValue {
  return result.hasAggregateValue;
}
- (NSString*) aggregateValue {
  return result.aggregateValue;
}
- (PBUninterpretedOptionBuilder*) setAggregateValue:(NSString*) value {
  result.hasAggregateValue = YES;
  result.aggregateValue = value;
  return self;
}
- (PBUninterpretedOptionBuilder*) clearAggregateValue {
  result.hasAggregateValue = NO;
  result.aggregateValue = @"";
  return self;
}
@end

@interface PBSourceCodeInfo ()
@property (strong) NSMutableArray * locationArray;
@end

@implementation PBSourceCodeInfo

@synthesize locationArray;
@dynamic location;
- (id) init {
  if ((self = [super init])) {
  }
  return self;
}
static PBSourceCodeInfo* defaultPBSourceCodeInfoInstance = nil;
+ (void) initialize {
  if (self == [PBSourceCodeInfo class]) {
    defaultPBSourceCodeInfoInstance = [[PBSourceCodeInfo alloc] init];
  }
}
+ (PBSourceCodeInfo*) defaultInstance {
  return defaultPBSourceCodeInfoInstance;
}
- (PBSourceCodeInfo*) defaultInstance {
  return defaultPBSourceCodeInfoInstance;
}
- (NSArray *)location {
  return locationArray;
}
- (PBSourceCodeInfoLocation*)locationAtIndex:(NSUInteger)index {
  return [locationArray objectAtIndex:index];
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  [self.locationArray enumerateObjectsUsingBlock:^(PBSourceCodeInfoLocation *element, NSUInteger idx, BOOL *stop) {
    [output writeMessage:1 value:element];
  }];
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  [self.locationArray enumerateObjectsUsingBlock:^(PBSourceCodeInfoLocation *element, NSUInteger idx, BOOL *stop) {
    size_ += computeMessageSize(1, element);
  }];
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBSourceCodeInfo*) parseFromData:(NSData*) data {
  return (PBSourceCodeInfo*)[[[PBSourceCodeInfo builder] mergeFromData:data] build];
}
+ (PBSourceCodeInfo*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBSourceCodeInfo*)[[[PBSourceCodeInfo builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBSourceCodeInfo*) parseFromInputStream:(NSInputStream*) input {
  return (PBSourceCodeInfo*)[[[PBSourceCodeInfo builder] mergeFromInputStream:input] build];
}
+ (PBSourceCodeInfo*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBSourceCodeInfo*)[[[PBSourceCodeInfo builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBSourceCodeInfo*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBSourceCodeInfo*)[[[PBSourceCodeInfo builder] mergeFromCodedInputStream:input] build];
}
+ (PBSourceCodeInfo*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBSourceCodeInfo*)[[[PBSourceCodeInfo builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBSourceCodeInfoBuilder*) builder {
  return [[PBSourceCodeInfoBuilder alloc] init];
}
+ (PBSourceCodeInfoBuilder*) builderWithPrototype:(PBSourceCodeInfo*) prototype {
  return [[PBSourceCodeInfo builder] mergeFrom:prototype];
}
- (PBSourceCodeInfoBuilder*) builder {
  return [PBSourceCodeInfo builder];
}
- (PBSourceCodeInfoBuilder*) toBuilder {
  return [PBSourceCodeInfo builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  [self.locationArray enumerateObjectsUsingBlock:^(PBSourceCodeInfoLocation *element, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@ {\n", indent, @"location"];
    [element writeDescriptionTo:output
                     withIndent:[NSString stringWithFormat:@"%@  ", indent]];
    [output appendFormat:@"%@}\n", indent];
  }];
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBSourceCodeInfo class]]) {
    return NO;
  }
  PBSourceCodeInfo *otherMessage = other;
  return
      [self.locationArray isEqualToArray:otherMessage.locationArray] &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  [self.locationArray enumerateObjectsUsingBlock:^(PBSourceCodeInfoLocation *element, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [element hash];
  }];
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBSourceCodeInfoLocation ()
@property (strong) PBAppendableArray * pathArray;
@property (strong) PBAppendableArray * spanArray;
@property (strong) NSString* leadingComments;
@property (strong) NSString* trailingComments;
@end

@implementation PBSourceCodeInfoLocation

@synthesize pathArray;
@dynamic path;
@synthesize spanArray;
@dynamic span;
- (BOOL) hasLeadingComments {
  return !!hasLeadingComments_;
}
- (void) setHasLeadingComments:(BOOL) value_ {
  hasLeadingComments_ = !!value_;
}
@synthesize leadingComments;
- (BOOL) hasTrailingComments {
  return !!hasTrailingComments_;
}
- (void) setHasTrailingComments:(BOOL) value_ {
  hasTrailingComments_ = !!value_;
}
@synthesize trailingComments;
- (id) init {
  if ((self = [super init])) {
    self.leadingComments = @"";
    self.trailingComments = @"";
  }
  return self;
}
static PBSourceCodeInfoLocation* defaultPBSourceCodeInfoLocationInstance = nil;
+ (void) initialize {
  if (self == [PBSourceCodeInfoLocation class]) {
    defaultPBSourceCodeInfoLocationInstance = [[PBSourceCodeInfoLocation alloc] init];
  }
}
+ (PBSourceCodeInfoLocation*) defaultInstance {
  return defaultPBSourceCodeInfoLocationInstance;
}
- (PBSourceCodeInfoLocation*) defaultInstance {
  return defaultPBSourceCodeInfoLocationInstance;
}
- (PBArray *)path {
  return pathArray;
}
- (SInt32)pathAtIndex:(NSUInteger)index {
  return [pathArray int32AtIndex:index];
}
- (PBArray *)span {
  return spanArray;
}
- (SInt32)spanAtIndex:(NSUInteger)index {
  return [spanArray int32AtIndex:index];
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  const NSUInteger pathArrayCount = self.pathArray.count;
  if (pathArrayCount > 0) {
    const SInt32 *values = (const SInt32 *)self.pathArray.data;
    [output writeRawVarint32:10];
    [output writeRawVarint32:pathMemoizedSerializedSize];
    for (NSUInteger i = 0; i < pathArrayCount; ++i) {
      [output writeInt32NoTag:values[i]];
    }
  }
  const NSUInteger spanArrayCount = self.spanArray.count;
  if (spanArrayCount > 0) {
    const SInt32 *values = (const SInt32 *)self.spanArray.data;
    [output writeRawVarint32:18];
    [output writeRawVarint32:spanMemoizedSerializedSize];
    for (NSUInteger i = 0; i < spanArrayCount; ++i) {
      [output writeInt32NoTag:values[i]];
    }
  }
  if (self.hasLeadingComments) {
    [output writeString:3 value:self.leadingComments];
  }
  if (self.hasTrailingComments) {
    [output writeString:4 value:self.trailingComments];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  {
    __block SInt32 dataSize = 0;
    const NSUInteger count = self.pathArray.count;
    const SInt32 *values = (const SInt32 *)self.pathArray.data;
    for (NSUInteger i = 0; i < count; ++i) {
      dataSize += computeInt32SizeNoTag(values[i]);
    }
    size_ += dataSize;
    if (count > 0) {
      size_ += 1;
      size_ += computeInt32SizeNoTag(dataSize);
    }
    pathMemoizedSerializedSize = dataSize;
  }
  {
    __block SInt32 dataSize = 0;
    const NSUInteger count = self.spanArray.count;
    const SInt32 *values = (const SInt32 *)self.spanArray.data;
    for (NSUInteger i = 0; i < count; ++i) {
      dataSize += computeInt32SizeNoTag(values[i]);
    }
    size_ += dataSize;
    if (count > 0) {
      size_ += 1;
      size_ += computeInt32SizeNoTag(dataSize);
    }
    spanMemoizedSerializedSize = dataSize;
  }
  if (self.hasLeadingComments) {
    size_ += computeStringSize(3, self.leadingComments);
  }
  if (self.hasTrailingComments) {
    size_ += computeStringSize(4, self.trailingComments);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (PBSourceCodeInfoLocation*) parseFromData:(NSData*) data {
  return (PBSourceCodeInfoLocation*)[[[PBSourceCodeInfoLocation builder] mergeFromData:data] build];
}
+ (PBSourceCodeInfoLocation*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBSourceCodeInfoLocation*)[[[PBSourceCodeInfoLocation builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (PBSourceCodeInfoLocation*) parseFromInputStream:(NSInputStream*) input {
  return (PBSourceCodeInfoLocation*)[[[PBSourceCodeInfoLocation builder] mergeFromInputStream:input] build];
}
+ (PBSourceCodeInfoLocation*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBSourceCodeInfoLocation*)[[[PBSourceCodeInfoLocation builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBSourceCodeInfoLocation*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (PBSourceCodeInfoLocation*)[[[PBSourceCodeInfoLocation builder] mergeFromCodedInputStream:input] build];
}
+ (PBSourceCodeInfoLocation*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (PBSourceCodeInfoLocation*)[[[PBSourceCodeInfoLocation builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (PBSourceCodeInfoLocationBuilder*) builder {
  return [[PBSourceCodeInfoLocationBuilder alloc] init];
}
+ (PBSourceCodeInfoLocationBuilder*) builderWithPrototype:(PBSourceCodeInfoLocation*) prototype {
  return [[PBSourceCodeInfoLocation builder] mergeFrom:prototype];
}
- (PBSourceCodeInfoLocationBuilder*) builder {
  return [PBSourceCodeInfoLocation builder];
}
- (PBSourceCodeInfoLocationBuilder*) toBuilder {
  return [PBSourceCodeInfoLocation builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  [self.pathArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@: %@\n", indent, @"path", obj];
  }];
  [self.spanArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [output appendFormat:@"%@%@: %@\n", indent, @"span", obj];
  }];
  if (self.hasLeadingComments) {
    [output appendFormat:@"%@%@: %@\n", indent, @"leadingComments", self.leadingComments];
  }
  if (self.hasTrailingComments) {
    [output appendFormat:@"%@%@: %@\n", indent, @"trailingComments", self.trailingComments];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[PBSourceCodeInfoLocation class]]) {
    return NO;
  }
  PBSourceCodeInfoLocation *otherMessage = other;
  return
      [self.pathArray isEqualToArray:otherMessage.pathArray] &&
      [self.spanArray isEqualToArray:otherMessage.spanArray] &&
      self.hasLeadingComments == otherMessage.hasLeadingComments &&
      (!self.hasLeadingComments || [self.leadingComments isEqual:otherMessage.leadingComments]) &&
      self.hasTrailingComments == otherMessage.hasTrailingComments &&
      (!self.hasTrailingComments || [self.trailingComments isEqual:otherMessage.trailingComments]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  [self.pathArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [obj longValue];
  }];
  [self.spanArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    hashCode = hashCode * 31 + [obj longValue];
  }];
  if (self.hasLeadingComments) {
    hashCode = hashCode * 31 + [self.leadingComments hash];
  }
  if (self.hasTrailingComments) {
    hashCode = hashCode * 31 + [self.trailingComments hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface PBSourceCodeInfoLocationBuilder()
@property (strong) PBSourceCodeInfoLocation* result;
@end

@implementation PBSourceCodeInfoLocationBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBSourceCodeInfoLocation alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBSourceCodeInfoLocationBuilder*) clear {
  self.result = [[PBSourceCodeInfoLocation alloc] init];
  return self;
}
- (PBSourceCodeInfoLocationBuilder*) clone {
  return [PBSourceCodeInfoLocation builderWithPrototype:result];
}
- (PBSourceCodeInfoLocation*) defaultInstance {
  return [PBSourceCodeInfoLocation defaultInstance];
}
- (PBSourceCodeInfoLocation*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBSourceCodeInfoLocation*) buildPartial {
  PBSourceCodeInfoLocation* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBSourceCodeInfoLocationBuilder*) mergeFrom:(PBSourceCodeInfoLocation*) other {
  if (other == [PBSourceCodeInfoLocation defaultInstance]) {
    return self;
  }
  if (other.pathArray.count > 0) {
    if (result.pathArray == nil) {
      result.pathArray = [other.pathArray copy];
    } else {
      [result.pathArray appendArray:other.pathArray];
    }
  }
  if (other.spanArray.count > 0) {
    if (result.spanArray == nil) {
      result.spanArray = [other.spanArray copy];
    } else {
      [result.spanArray appendArray:other.spanArray];
    }
  }
  if (other.hasLeadingComments) {
    [self setLeadingComments:other.leadingComments];
  }
  if (other.hasTrailingComments) {
    [self setTrailingComments:other.trailingComments];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBSourceCodeInfoLocationBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBSourceCodeInfoLocationBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        SInt32 length = [input readRawVarint32];
        SInt32 limit = [input pushLimit:length];
        if (result.pathArray == nil) {
          result.pathArray = [PBAppendableArray arrayWithValueType:PBArrayValueTypeInt32];
        }
        while (input.bytesUntilLimit > 0) {
          [result.pathArray addInt32:[input readInt32]];
        }
        [input popLimit:limit];
        break;
      }
      case 18: {
        SInt32 length = [input readRawVarint32];
        SInt32 limit = [input pushLimit:length];
        if (result.spanArray == nil) {
          result.spanArray = [PBAppendableArray arrayWithValueType:PBArrayValueTypeInt32];
        }
        while (input.bytesUntilLimit > 0) {
          [result.spanArray addInt32:[input readInt32]];
        }
        [input popLimit:limit];
        break;
      }
      case 26: {
        [self setLeadingComments:[input readString]];
        break;
      }
      case 34: {
        [self setTrailingComments:[input readString]];
        break;
      }
    }
  }
}
- (PBAppendableArray *)path {
  return result.pathArray;
}
- (SInt32)pathAtIndex:(NSUInteger)index {
  return [result pathAtIndex:index];
}
- (PBSourceCodeInfoLocationBuilder *)addPath:(SInt32)value {
  if (result.pathArray == nil) {
    result.pathArray = [PBAppendableArray arrayWithValueType:PBArrayValueTypeInt32];
  }
  [result.pathArray addInt32:value];
  return self;
}
- (PBSourceCodeInfoLocationBuilder *)setPathArray:(NSArray *)array {
  result.pathArray = [PBAppendableArray arrayWithArray:array valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBSourceCodeInfoLocationBuilder *)setPathValues:(const SInt32 *)values count:(NSUInteger)count {
  result.pathArray = [PBAppendableArray arrayWithValues:values count:count valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBSourceCodeInfoLocationBuilder *)clearPath {
  result.pathArray = nil;
  return self;
}
- (PBAppendableArray *)span {
  return result.spanArray;
}
- (SInt32)spanAtIndex:(NSUInteger)index {
  return [result spanAtIndex:index];
}
- (PBSourceCodeInfoLocationBuilder *)addSpan:(SInt32)value {
  if (result.spanArray == nil) {
    result.spanArray = [PBAppendableArray arrayWithValueType:PBArrayValueTypeInt32];
  }
  [result.spanArray addInt32:value];
  return self;
}
- (PBSourceCodeInfoLocationBuilder *)setSpanArray:(NSArray *)array {
  result.spanArray = [PBAppendableArray arrayWithArray:array valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBSourceCodeInfoLocationBuilder *)setSpanValues:(const SInt32 *)values count:(NSUInteger)count {
  result.spanArray = [PBAppendableArray arrayWithValues:values count:count valueType:PBArrayValueTypeInt32];
  return self;
}
- (PBSourceCodeInfoLocationBuilder *)clearSpan {
  result.spanArray = nil;
  return self;
}
- (BOOL) hasLeadingComments {
  return result.hasLeadingComments;
}
- (NSString*) leadingComments {
  return result.leadingComments;
}
- (PBSourceCodeInfoLocationBuilder*) setLeadingComments:(NSString*) value {
  result.hasLeadingComments = YES;
  result.leadingComments = value;
  return self;
}
- (PBSourceCodeInfoLocationBuilder*) clearLeadingComments {
  result.hasLeadingComments = NO;
  result.leadingComments = @"";
  return self;
}
- (BOOL) hasTrailingComments {
  return result.hasTrailingComments;
}
- (NSString*) trailingComments {
  return result.trailingComments;
}
- (PBSourceCodeInfoLocationBuilder*) setTrailingComments:(NSString*) value {
  result.hasTrailingComments = YES;
  result.trailingComments = value;
  return self;
}
- (PBSourceCodeInfoLocationBuilder*) clearTrailingComments {
  result.hasTrailingComments = NO;
  result.trailingComments = @"";
  return self;
}
@end

@interface PBSourceCodeInfoBuilder()
@property (strong) PBSourceCodeInfo* result;
@end

@implementation PBSourceCodeInfoBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[PBSourceCodeInfo alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (PBSourceCodeInfoBuilder*) clear {
  self.result = [[PBSourceCodeInfo alloc] init];
  return self;
}
- (PBSourceCodeInfoBuilder*) clone {
  return [PBSourceCodeInfo builderWithPrototype:result];
}
- (PBSourceCodeInfo*) defaultInstance {
  return [PBSourceCodeInfo defaultInstance];
}
- (PBSourceCodeInfo*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (PBSourceCodeInfo*) buildPartial {
  PBSourceCodeInfo* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (PBSourceCodeInfoBuilder*) mergeFrom:(PBSourceCodeInfo*) other {
  if (other == [PBSourceCodeInfo defaultInstance]) {
    return self;
  }
  if (other.locationArray.count > 0) {
    if (result.locationArray == nil) {
      result.locationArray = [[NSMutableArray alloc] initWithArray:other.locationArray];
    } else {
      [result.locationArray addObjectsFromArray:other.locationArray];
    }
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (PBSourceCodeInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (PBSourceCodeInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        PBSourceCodeInfoLocationBuilder* subBuilder = [PBSourceCodeInfoLocation builder];
        [input readMessage:subBuilder extensionRegistry:extensionRegistry];
        [self addLocation:[subBuilder buildPartial]];
        break;
      }
    }
  }
}
- (NSMutableArray *)location {
  return result.locationArray;
}
- (PBSourceCodeInfoLocation*)locationAtIndex:(NSUInteger)index {
  return [result locationAtIndex:index];
}
- (PBSourceCodeInfoBuilder *)addLocation:(PBSourceCodeInfoLocation*)value {
  if (result.locationArray == nil) {
    result.locationArray = [[NSMutableArray alloc]init];
  }
  [result.locationArray addObject:value];
  return self;
}
- (PBSourceCodeInfoBuilder *)setLocationArray:(NSArray *)array {
  result.locationArray = [[NSMutableArray alloc]initWithArray:array];
  return self;
}
- (PBSourceCodeInfoBuilder *)clearLocation {
  result.locationArray = nil;
  return self;
}
@end


// @@protoc_insertion_point(global_scope)
