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

#import "ProtocolBuffers.h"

// @@protoc_insertion_point(imports)

@class SoftwareProfile;
@class SoftwareProfileBuilder;
#ifndef __has_feature
  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif // __has_feature

#ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
    #define NS_RETURNS_NOT_RETAINED
  #endif
#endif


@interface SoftwareProfileRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface SoftwareProfile : PBGeneratedMessage {
@private
  BOOL hasUpdateTime_:1;
  BOOL hasVersion_:1;
  BOOL hasDescription_:1;
  SInt64 updateTime;
  NSString* version;
  NSString* description;
}
- (BOOL) hasVersion;
- (BOOL) hasUpdateTime;
- (BOOL) hasDescription;
@property (readonly, strong) NSString* version;
@property (readonly) SInt64 updateTime;
@property (readonly, strong) NSString* description;

+ (SoftwareProfile*) defaultInstance;
- (SoftwareProfile*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (SoftwareProfileBuilder*) builder;
+ (SoftwareProfileBuilder*) builder;
+ (SoftwareProfileBuilder*) builderWithPrototype:(SoftwareProfile*) prototype;
- (SoftwareProfileBuilder*) toBuilder;

+ (SoftwareProfile*) parseFromData:(NSData*) data;
+ (SoftwareProfile*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (SoftwareProfile*) parseFromInputStream:(NSInputStream*) input;
+ (SoftwareProfile*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (SoftwareProfile*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (SoftwareProfile*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface SoftwareProfileBuilder : PBGeneratedMessageBuilder {
@private
  SoftwareProfile* result;
}

- (SoftwareProfile*) defaultInstance;

- (SoftwareProfileBuilder*) clear;
- (SoftwareProfileBuilder*) clone;

- (SoftwareProfile*) build;
- (SoftwareProfile*) buildPartial;

- (SoftwareProfileBuilder*) mergeFrom:(SoftwareProfile*) other;
- (SoftwareProfileBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (SoftwareProfileBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasVersion;
- (NSString*) version;
- (SoftwareProfileBuilder*) setVersion:(NSString*) value;
- (SoftwareProfileBuilder*) clearVersion;

- (BOOL) hasUpdateTime;
- (SInt64) updateTime;
- (SoftwareProfileBuilder*) setUpdateTime:(SInt64) value;
- (SoftwareProfileBuilder*) clearUpdateTime;

- (BOOL) hasDescription;
- (NSString*) description;
- (SoftwareProfileBuilder*) setDescription:(NSString*) value;
- (SoftwareProfileBuilder*) clearDescription;
@end


// @@protoc_insertion_point(global_scope)
