// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google.golang.org/appengine/internal/user/user_service.proto

package user

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type UserServiceError_ErrorCode int32

const (
	UserServiceError_OK                    UserServiceError_ErrorCode = 0
	UserServiceError_REDIRECT_URL_TOO_LONG UserServiceError_ErrorCode = 1
	UserServiceError_NOT_ALLOWED           UserServiceError_ErrorCode = 2
	UserServiceError_OAUTH_INVALID_TOKEN   UserServiceError_ErrorCode = 3
	UserServiceError_OAUTH_INVALID_REQUEST UserServiceError_ErrorCode = 4
	UserServiceError_OAUTH_ERROR           UserServiceError_ErrorCode = 5
)

var UserServiceError_ErrorCode_name = map[int32]string{
	0: "OK",
	1: "REDIRECT_URL_TOO_LONG",
	2: "NOT_ALLOWED",
	3: "OAUTH_INVALID_TOKEN",
	4: "OAUTH_INVALID_REQUEST",
	5: "OAUTH_ERROR",
}
var UserServiceError_ErrorCode_value = map[string]int32{
	"OK": 0,
	"REDIRECT_URL_TOO_LONG": 1,
	"NOT_ALLOWED":           2,
	"OAUTH_INVALID_TOKEN":   3,
	"OAUTH_INVALID_REQUEST": 4,
	"OAUTH_ERROR":           5,
}

func (x UserServiceError_ErrorCode) Enum() *UserServiceError_ErrorCode {
	p := new(UserServiceError_ErrorCode)
	*p = x
	return p
}
func (x UserServiceError_ErrorCode) String() string {
	return proto.EnumName(UserServiceError_ErrorCode_name, int32(x))
}
func (x *UserServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(UserServiceError_ErrorCode_value, data, "UserServiceError_ErrorCode")
	if err != nil {
		return err
	}
	*x = UserServiceError_ErrorCode(value)
	return nil
}
func (UserServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{0, 0}
}

type UserServiceError struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserServiceError) Reset()         { *m = UserServiceError{} }
func (m *UserServiceError) String() string { return proto.CompactTextString(m) }
func (*UserServiceError) ProtoMessage()    {}
func (*UserServiceError) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{0}
}
func (m *UserServiceError) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UserServiceError.Unmarshal(m, b)
}
func (m *UserServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UserServiceError.Marshal(b, m, deterministic)
}
func (dst *UserServiceError) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UserServiceError.Merge(dst, src)
}
func (m *UserServiceError) XXX_Size() int {
	return xxx_messageInfo_UserServiceError.Size(m)
}
func (m *UserServiceError) XXX_DiscardUnknown() {
	xxx_messageInfo_UserServiceError.DiscardUnknown(m)
}

var xxx_messageInfo_UserServiceError proto.InternalMessageInfo

type CreateLoginURLRequest struct {
	DestinationUrl       *string  `protobuf:"bytes,1,req,name=destination_url,json=destinationUrl" json:"destination_url,omitempty"`
	AuthDomain           *string  `protobuf:"bytes,2,opt,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"`
	FederatedIdentity    *string  `protobuf:"bytes,3,opt,name=federated_identity,json=federatedIdentity,def=" json:"federated_identity,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateLoginURLRequest) Reset()         { *m = CreateLoginURLRequest{} }
func (m *CreateLoginURLRequest) String() string { return proto.CompactTextString(m) }
func (*CreateLoginURLRequest) ProtoMessage()    {}
func (*CreateLoginURLRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{1}
}
func (m *CreateLoginURLRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateLoginURLRequest.Unmarshal(m, b)
}
func (m *CreateLoginURLRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateLoginURLRequest.Marshal(b, m, deterministic)
}
func (dst *CreateLoginURLRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateLoginURLRequest.Merge(dst, src)
}
func (m *CreateLoginURLRequest) XXX_Size() int {
	return xxx_messageInfo_CreateLoginURLRequest.Size(m)
}
func (m *CreateLoginURLRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateLoginURLRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateLoginURLRequest proto.InternalMessageInfo

func (m *CreateLoginURLRequest) GetDestinationUrl() string {
	if m != nil && m.DestinationUrl != nil {
		return *m.DestinationUrl
	}
	return ""
}

func (m *CreateLoginURLRequest) GetAuthDomain() string {
	if m != nil && m.AuthDomain != nil {
		return *m.AuthDomain
	}
	return ""
}

func (m *CreateLoginURLRequest) GetFederatedIdentity() string {
	if m != nil && m.FederatedIdentity != nil {
		return *m.FederatedIdentity
	}
	return ""
}

type CreateLoginURLResponse struct {
	LoginUrl             *string  `protobuf:"bytes,1,req,name=login_url,json=loginUrl" json:"login_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateLoginURLResponse) Reset()         { *m = CreateLoginURLResponse{} }
func (m *CreateLoginURLResponse) String() string { return proto.CompactTextString(m) }
func (*CreateLoginURLResponse) ProtoMessage()    {}
func (*CreateLoginURLResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{2}
}
func (m *CreateLoginURLResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateLoginURLResponse.Unmarshal(m, b)
}
func (m *CreateLoginURLResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateLoginURLResponse.Marshal(b, m, deterministic)
}
func (dst *CreateLoginURLResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateLoginURLResponse.Merge(dst, src)
}
func (m *CreateLoginURLResponse) XXX_Size() int {
	return xxx_messageInfo_CreateLoginURLResponse.Size(m)
}
func (m *CreateLoginURLResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateLoginURLResponse.DiscardUnknown(m)
}

var xxx_messageInfo_CreateLoginURLResponse proto.InternalMessageInfo

func (m *CreateLoginURLResponse) GetLoginUrl() string {
	if m != nil && m.LoginUrl != nil {
		return *m.LoginUrl
	}
	return ""
}

type CreateLogoutURLRequest struct {
	DestinationUrl       *string  `protobuf:"bytes,1,req,name=destination_url,json=destinationUrl" json:"destination_url,omitempty"`
	AuthDomain           *string  `protobuf:"bytes,2,opt,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateLogoutURLRequest) Reset()         { *m = CreateLogoutURLRequest{} }
func (m *CreateLogoutURLRequest) String() string { return proto.CompactTextString(m) }
func (*CreateLogoutURLRequest) ProtoMessage()    {}
func (*CreateLogoutURLRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{3}
}
func (m *CreateLogoutURLRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateLogoutURLRequest.Unmarshal(m, b)
}
func (m *CreateLogoutURLRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateLogoutURLRequest.Marshal(b, m, deterministic)
}
func (dst *CreateLogoutURLRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateLogoutURLRequest.Merge(dst, src)
}
func (m *CreateLogoutURLRequest) XXX_Size() int {
	return xxx_messageInfo_CreateLogoutURLRequest.Size(m)
}
func (m *CreateLogoutURLRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateLogoutURLRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateLogoutURLRequest proto.InternalMessageInfo

func (m *CreateLogoutURLRequest) GetDestinationUrl() string {
	if m != nil && m.DestinationUrl != nil {
		return *m.DestinationUrl
	}
	return ""
}

func (m *CreateLogoutURLRequest) GetAuthDomain() string {
	if m != nil && m.AuthDomain != nil {
		return *m.AuthDomain
	}
	return ""
}

type CreateLogoutURLResponse struct {
	LogoutUrl            *string  `protobuf:"bytes,1,req,name=logout_url,json=logoutUrl" json:"logout_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateLogoutURLResponse) Reset()         { *m = CreateLogoutURLResponse{} }
func (m *CreateLogoutURLResponse) String() string { return proto.CompactTextString(m) }
func (*CreateLogoutURLResponse) ProtoMessage()    {}
func (*CreateLogoutURLResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{4}
}
func (m *CreateLogoutURLResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateLogoutURLResponse.Unmarshal(m, b)
}
func (m *CreateLogoutURLResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateLogoutURLResponse.Marshal(b, m, deterministic)
}
func (dst *CreateLogoutURLResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateLogoutURLResponse.Merge(dst, src)
}
func (m *CreateLogoutURLResponse) XXX_Size() int {
	return xxx_messageInfo_CreateLogoutURLResponse.Size(m)
}
func (m *CreateLogoutURLResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateLogoutURLResponse.DiscardUnknown(m)
}

var xxx_messageInfo_CreateLogoutURLResponse proto.InternalMessageInfo

func (m *CreateLogoutURLResponse) GetLogoutUrl() string {
	if m != nil && m.LogoutUrl != nil {
		return *m.LogoutUrl
	}
	return ""
}

type GetOAuthUserRequest struct {
	Scope                *string  `protobuf:"bytes,1,opt,name=scope" json:"scope,omitempty"`
	Scopes               []string `protobuf:"bytes,2,rep,name=scopes" json:"scopes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetOAuthUserRequest) Reset()         { *m = GetOAuthUserRequest{} }
func (m *GetOAuthUserRequest) String() string { return proto.CompactTextString(m) }
func (*GetOAuthUserRequest) ProtoMessage()    {}
func (*GetOAuthUserRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{5}
}
func (m *GetOAuthUserRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetOAuthUserRequest.Unmarshal(m, b)
}
func (m *GetOAuthUserRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetOAuthUserRequest.Marshal(b, m, deterministic)
}
func (dst *GetOAuthUserRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetOAuthUserRequest.Merge(dst, src)
}
func (m *GetOAuthUserRequest) XXX_Size() int {
	return xxx_messageInfo_GetOAuthUserRequest.Size(m)
}
func (m *GetOAuthUserRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetOAuthUserRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetOAuthUserRequest proto.InternalMessageInfo

func (m *GetOAuthUserRequest) GetScope() string {
	if m != nil && m.Scope != nil {
		return *m.Scope
	}
	return ""
}

func (m *GetOAuthUserRequest) GetScopes() []string {
	if m != nil {
		return m.Scopes
	}
	return nil
}

type GetOAuthUserResponse struct {
	Email                *string  `protobuf:"bytes,1,req,name=email" json:"email,omitempty"`
	UserId               *string  `protobuf:"bytes,2,req,name=user_id,json=userId" json:"user_id,omitempty"`
	AuthDomain           *string  `protobuf:"bytes,3,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"`
	UserOrganization     *string  `protobuf:"bytes,4,opt,name=user_organization,json=userOrganization,def=" json:"user_organization,omitempty"`
	IsAdmin              *bool    `protobuf:"varint,5,opt,name=is_admin,json=isAdmin,def=0" json:"is_admin,omitempty"`
	ClientId             *string  `protobuf:"bytes,6,opt,name=client_id,json=clientId,def=" json:"client_id,omitempty"`
	Scopes               []string `protobuf:"bytes,7,rep,name=scopes" json:"scopes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetOAuthUserResponse) Reset()         { *m = GetOAuthUserResponse{} }
func (m *GetOAuthUserResponse) String() string { return proto.CompactTextString(m) }
func (*GetOAuthUserResponse) ProtoMessage()    {}
func (*GetOAuthUserResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{6}
}
func (m *GetOAuthUserResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetOAuthUserResponse.Unmarshal(m, b)
}
func (m *GetOAuthUserResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetOAuthUserResponse.Marshal(b, m, deterministic)
}
func (dst *GetOAuthUserResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetOAuthUserResponse.Merge(dst, src)
}
func (m *GetOAuthUserResponse) XXX_Size() int {
	return xxx_messageInfo_GetOAuthUserResponse.Size(m)
}
func (m *GetOAuthUserResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_GetOAuthUserResponse.DiscardUnknown(m)
}

var xxx_messageInfo_GetOAuthUserResponse proto.InternalMessageInfo

const Default_GetOAuthUserResponse_IsAdmin bool = false

func (m *GetOAuthUserResponse) GetEmail() string {
	if m != nil && m.Email != nil {
		return *m.Email
	}
	return ""
}

func (m *GetOAuthUserResponse) GetUserId() string {
	if m != nil && m.UserId != nil {
		return *m.UserId
	}
	return ""
}

func (m *GetOAuthUserResponse) GetAuthDomain() string {
	if m != nil && m.AuthDomain != nil {
		return *m.AuthDomain
	}
	return ""
}

func (m *GetOAuthUserResponse) GetUserOrganization() string {
	if m != nil && m.UserOrganization != nil {
		return *m.UserOrganization
	}
	return ""
}

func (m *GetOAuthUserResponse) GetIsAdmin() bool {
	if m != nil && m.IsAdmin != nil {
		return *m.IsAdmin
	}
	return Default_GetOAuthUserResponse_IsAdmin
}

func (m *GetOAuthUserResponse) GetClientId() string {
	if m != nil && m.ClientId != nil {
		return *m.ClientId
	}
	return ""
}

func (m *GetOAuthUserResponse) GetScopes() []string {
	if m != nil {
		return m.Scopes
	}
	return nil
}

type CheckOAuthSignatureRequest struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CheckOAuthSignatureRequest) Reset()         { *m = CheckOAuthSignatureRequest{} }
func (m *CheckOAuthSignatureRequest) String() string { return proto.CompactTextString(m) }
func (*CheckOAuthSignatureRequest) ProtoMessage()    {}
func (*CheckOAuthSignatureRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{7}
}
func (m *CheckOAuthSignatureRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CheckOAuthSignatureRequest.Unmarshal(m, b)
}
func (m *CheckOAuthSignatureRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CheckOAuthSignatureRequest.Marshal(b, m, deterministic)
}
func (dst *CheckOAuthSignatureRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CheckOAuthSignatureRequest.Merge(dst, src)
}
func (m *CheckOAuthSignatureRequest) XXX_Size() int {
	return xxx_messageInfo_CheckOAuthSignatureRequest.Size(m)
}
func (m *CheckOAuthSignatureRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CheckOAuthSignatureRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CheckOAuthSignatureRequest proto.InternalMessageInfo

type CheckOAuthSignatureResponse struct {
	OauthConsumerKey     *string  `protobuf:"bytes,1,req,name=oauth_consumer_key,json=oauthConsumerKey" json:"oauth_consumer_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CheckOAuthSignatureResponse) Reset()         { *m = CheckOAuthSignatureResponse{} }
func (m *CheckOAuthSignatureResponse) String() string { return proto.CompactTextString(m) }
func (*CheckOAuthSignatureResponse) ProtoMessage()    {}
func (*CheckOAuthSignatureResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_user_service_faa685423dd20b0a, []int{8}
}
func (m *CheckOAuthSignatureResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CheckOAuthSignatureResponse.Unmarshal(m, b)
}
func (m *CheckOAuthSignatureResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CheckOAuthSignatureResponse.Marshal(b, m, deterministic)
}
func (dst *CheckOAuthSignatureResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CheckOAuthSignatureResponse.Merge(dst, src)
}
func (m *CheckOAuthSignatureResponse) XXX_Size() int {
	return xxx_messageInfo_CheckOAuthSignatureResponse.Size(m)
}
func (m *CheckOAuthSignatureResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_CheckOAuthSignatureResponse.DiscardUnknown(m)
}

var xxx_messageInfo_CheckOAuthSignatureResponse proto.InternalMessageInfo

func (m *CheckOAuthSignatureResponse) GetOauthConsumerKey() string {
	if m != nil && m.OauthConsumerKey != nil {
		return *m.OauthConsumerKey
	}
	return ""
}

func init() {
	proto.RegisterType((*UserServiceError)(nil), "appengine.UserServiceError")
	proto.RegisterType((*CreateLoginURLRequest)(nil), "appengine.CreateLoginURLRequest")
	proto.RegisterType((*CreateLoginURLResponse)(nil), "appengine.CreateLoginURLResponse")
	proto.RegisterType((*CreateLogoutURLRequest)(nil), "appengine.CreateLogoutURLRequest")
	proto.RegisterType((*CreateLogoutURLResponse)(nil), "appengine.CreateLogoutURLResponse")
	proto.RegisterType((*GetOAuthUserRequest)(nil), "appengine.GetOAuthUserRequest")
	proto.RegisterType((*GetOAuthUserResponse)(nil), "appengine.GetOAuthUserResponse")
	proto.RegisterType((*CheckOAuthSignatureRequest)(nil), "appengine.CheckOAuthSignatureRequest")
	proto.RegisterType((*CheckOAuthSignatureResponse)(nil), "appengine.CheckOAuthSignatureResponse")
}

func init() {
	proto.RegisterFile("google.golang.org/appengine/internal/user/user_service.proto", fileDescriptor_user_service_faa685423dd20b0a)
}

var fileDescriptor_user_service_faa685423dd20b0a = []byte{
	// 573 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x52, 0x4d, 0x6f, 0xdb, 0x38,
	0x10, 0x8d, 0xec, 0xd8, 0xb1, 0x26, 0xc0, 0x46, 0x61, 0xbe, 0xb4, 0x9b, 0x0d, 0xd6, 0xd0, 0x65,
	0x7d, 0x68, 0xe3, 0x53, 0x81, 0x22, 0xe8, 0xc5, 0xb5, 0x85, 0xd4, 0xb0, 0x60, 0xa1, 0x8c, 0xd5,
	0x02, 0xbd, 0x08, 0xac, 0x35, 0x51, 0x88, 0xc8, 0xa4, 0x4b, 0x52, 0x05, 0xd2, 0x73, 0x7f, 0x41,
	0x6f, 0xfd, 0x93, 0xfd, 0x0d, 0x85, 0x68, 0x25, 0x50, 0xd2, 0x5e, 0x7b, 0x11, 0x34, 0xef, 0x0d,
	0xdf, 0xbc, 0x37, 0x24, 0xbc, 0xca, 0xa5, 0xcc, 0x0b, 0x3c, 0xcf, 0x65, 0xc1, 0x44, 0x7e, 0x2e,
	0x55, 0x3e, 0x64, 0xeb, 0x35, 0x8a, 0x9c, 0x0b, 0x1c, 0x72, 0x61, 0x50, 0x09, 0x56, 0x0c, 0x4b,
	0x8d, 0xca, 0x7e, 0x52, 0x8d, 0xea, 0x33, 0x5f, 0xe2, 0xf9, 0x5a, 0x49, 0x23, 0x89, 0xfb, 0xd0,
	0x1b, 0x7c, 0x77, 0xc0, 0x4b, 0x34, 0xaa, 0xab, 0x4d, 0x43, 0xa8, 0x94, 0x54, 0xc1, 0x57, 0x07,
	0x5c, 0xfb, 0x37, 0x96, 0x19, 0x92, 0x2e, 0xb4, 0xe2, 0x99, 0xb7, 0x45, 0xfe, 0x86, 0x23, 0x1a,
	0x4e, 0xa6, 0x34, 0x1c, 0x2f, 0xd2, 0x84, 0x46, 0xe9, 0x22, 0x8e, 0xd3, 0x28, 0x9e, 0x5f, 0x7a,
	0x0e, 0xd9, 0x83, 0xdd, 0x79, 0xbc, 0x48, 0x47, 0x51, 0x14, 0xbf, 0x0f, 0x27, 0x5e, 0x8b, 0x9c,
	0xc0, 0x41, 0x3c, 0x4a, 0x16, 0x6f, 0xd2, 0xe9, 0xfc, 0xdd, 0x28, 0x9a, 0x4e, 0xd2, 0x45, 0x3c,
	0x0b, 0xe7, 0x5e, 0xbb, 0x12, 0x79, 0x4c, 0xd0, 0xf0, 0x6d, 0x12, 0x5e, 0x2d, 0xbc, 0xed, 0x4a,
	0x64, 0x43, 0x85, 0x94, 0xc6, 0xd4, 0xeb, 0x04, 0xdf, 0x1c, 0x38, 0x1a, 0x2b, 0x64, 0x06, 0x23,
	0x99, 0x73, 0x91, 0xd0, 0x88, 0xe2, 0xa7, 0x12, 0xb5, 0x21, 0xff, 0xc3, 0x5e, 0x86, 0xda, 0x70,
	0xc1, 0x0c, 0x97, 0x22, 0x2d, 0x55, 0xe1, 0x3b, 0xfd, 0xd6, 0xc0, 0xa5, 0x7f, 0x35, 0xe0, 0x44,
	0x15, 0xe4, 0x3f, 0xd8, 0x65, 0xa5, 0xb9, 0x49, 0x33, 0xb9, 0x62, 0x5c, 0xf8, 0xad, 0xbe, 0x33,
	0x70, 0x29, 0x54, 0xd0, 0xc4, 0x22, 0x64, 0x08, 0xe4, 0x1a, 0x33, 0x54, 0xcc, 0x60, 0x96, 0xf2,
	0x0c, 0x85, 0xe1, 0xe6, 0xce, 0x6f, 0x57, 0x7d, 0x17, 0x5b, 0x74, 0xff, 0x81, 0x9b, 0xd6, 0x54,
	0xf0, 0x02, 0x8e, 0x9f, 0x7a, 0xd2, 0x6b, 0x29, 0x34, 0x92, 0x53, 0x70, 0x8b, 0x0a, 0x6b, 0xd8,
	0xe9, 0x59, 0x20, 0x51, 0x45, 0xf0, 0xb1, 0x71, 0x4c, 0x96, 0xe6, 0x4f, 0x64, 0x09, 0x5e, 0xc2,
	0xc9, 0x2f, 0x33, 0x6a, 0x6f, 0x67, 0x00, 0x85, 0x05, 0x1b, 0xfa, 0xee, 0x06, 0xa9, 0xdc, 0x8d,
	0xe1, 0xe0, 0x12, 0x4d, 0x3c, 0x2a, 0xcd, 0x4d, 0xf5, 0x18, 0xee, 0xad, 0x1d, 0x42, 0x47, 0x2f,
	0xe5, 0x1a, 0x7d, 0xc7, 0xce, 0xda, 0x14, 0xe4, 0x18, 0xba, 0xf6, 0x47, 0xfb, 0xad, 0x7e, 0x7b,
	0xe0, 0xd2, 0xba, 0x0a, 0x7e, 0x38, 0x70, 0xf8, 0x58, 0xa5, 0x1e, 0x7e, 0x08, 0x1d, 0x5c, 0x31,
	0x7e, 0x3f, 0x77, 0x53, 0x90, 0x13, 0xd8, 0xb1, 0x4f, 0x93, 0x67, 0x7e, 0xcb, 0xe2, 0xdd, 0xaa,
	0x9c, 0x66, 0x4f, 0x73, 0xb6, 0x2d, 0xd9, 0xbc, 0xb3, 0xe7, 0xb0, 0x6f, 0x4f, 0x4a, 0x95, 0x33,
	0xc1, 0xbf, 0xd8, 0x05, 0xf9, 0xdb, 0xf5, 0x95, 0x79, 0x15, 0x15, 0x37, 0x18, 0xd2, 0x87, 0x1e,
	0xd7, 0x29, 0xcb, 0x56, 0x5c, 0xf8, 0x9d, 0xbe, 0x33, 0xe8, 0x5d, 0x74, 0xae, 0x59, 0xa1, 0x91,
	0xee, 0x70, 0x3d, 0xaa, 0x50, 0x72, 0x06, 0xee, 0xb2, 0xe0, 0x28, 0x4c, 0x65, 0xa6, 0x5b, 0x0b,
	0xf5, 0x36, 0xd0, 0x34, 0x6b, 0x04, 0xde, 0x79, 0x14, 0xf8, 0x5f, 0xf8, 0x67, 0x7c, 0x83, 0xcb,
	0x5b, 0x9b, 0xf8, 0x8a, 0xe7, 0x82, 0x99, 0x52, 0x61, 0xbd, 0xbc, 0x60, 0x06, 0xa7, 0xbf, 0x65,
	0xeb, 0xa5, 0x3c, 0x03, 0x22, 0x6d, 0xcc, 0xa5, 0x14, 0xba, 0x5c, 0xa1, 0x4a, 0x6f, 0xf1, 0xae,
	0xde, 0x90, 0x67, 0x99, 0x71, 0x4d, 0xcc, 0xf0, 0xee, 0x75, 0xf7, 0xc3, 0x76, 0x95, 0xeb, 0x67,
	0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x04, 0x53, 0xcc, 0xf8, 0x03, 0x00, 0x00,
}
