// Code generated by protoc-gen-go. DO NOT EDIT.
// source: feeds.proto

/*
Package maps_booking_feeds is a generated protocol buffer package.

It is generated from these files:
	feeds.proto

It has these top-level messages:
	FeedMetadata
	AvailabilityFeed
	ServiceAvailability
	Availability
	Resources
	TimeRange
	ServiceFeed
	Service
	Price
	SchedulingRules
	TaxRate
	ServiceIntakeFormField
	ServiceIntakeForm
	Deposit
	NoShowFee
	PriceType
	RequireCreditCard
	ActionLink
	ActionPlatform
	TicketType
	RelatedMedia
	ServiceAttributeValueId
*/

package maps_booking_feeds

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

// Defines how a total price is determined from an availability.
type PriceType int32

const (
	// The price is for a fixed amount. This is the default value if the field is
	// not set.
	PriceType_FIXED_RATE_DEFAULT PriceType = 0
	// The price specified is per person, and the total price is calculated
	// according to the party size specified in Resources as
	// price_micros * party_size. A PER_PERSON price must be accompanied by a
	// party size in the availability resources. If it is not, a party size of one
	// is used.
	PriceType_PER_PERSON PriceType = 1
)

var PriceType_name = map[int32]string{
	0: "FIXED_RATE_DEFAULT",
	1: "PER_PERSON",
}
var PriceType_value = map[string]int32{
	"FIXED_RATE_DEFAULT": 0,
	"PER_PERSON":         1,
}

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}
func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0}
}

// Defines whether a credit card is required in order to book an appointment.
type RequireCreditCard int32

const (
	// The credit card requirement is not explicitly specified and the
	// behaviour is identical to the one specified for CONDITIONAL.
	RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED RequireCreditCard = 0
	// Google will require a credit card for the booking if any of the following
	// conditions are met:
	// * the availability has a price and the prepayment_type is REQUIRED
	// * the no_show_fee is set
	// * the deposit field is set.
	RequireCreditCard_REQUIRE_CREDIT_CARD_CONDITIONAL RequireCreditCard = 1
	// A credit card is always required in order to book this availability
	// regardless of other field values.
	RequireCreditCard_REQUIRE_CREDIT_CARD_ALWAYS RequireCreditCard = 2
)

var RequireCreditCard_name = map[int32]string{
	0: "REQUIRE_CREDIT_CARD_UNSPECIFIED",
	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
	2: "REQUIRE_CREDIT_CARD_ALWAYS",
}
var RequireCreditCard_value = map[string]int32{
	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
	"REQUIRE_CREDIT_CARD_ALWAYS":      2,
}

func (x RequireCreditCard) String() string {
	return proto.EnumName(RequireCreditCard_name, int32(x))
}
func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{1}
}

// The platform that the action is performed on. Web application is the general
// fallback. It is recommended to have at least one ActionLink with
// ACTION_PLATFORM_WEB_APPLICATION. Links with Android and iOS as platform are
// only used on the respective system.
type ActionPlatform int32

const (
	// The platform is unspecified.
	ActionPlatform_ACTION_PLATFORM_UNSPECIFIED ActionPlatform = 0
	// The action platform is web in general.
	ActionPlatform_ACTION_PLATFORM_WEB_APPLICATION ActionPlatform = 1
	// The action platform is web on mobile devices.
	ActionPlatform_ACTION_PLATFORM_MOBILE_WEB ActionPlatform = 2
	// The action platform is Android OS.
	ActionPlatform_ACTION_PLATFORM_ANDROID ActionPlatform = 3
	// The action platform is iOS.
	ActionPlatform_ACTION_PLATFORM_IOS ActionPlatform = 4
)

var ActionPlatform_name = map[int32]string{
	0: "ACTION_PLATFORM_UNSPECIFIED",
	1: "ACTION_PLATFORM_WEB_APPLICATION",
	2: "ACTION_PLATFORM_MOBILE_WEB",
	3: "ACTION_PLATFORM_ANDROID",
	4: "ACTION_PLATFORM_IOS",
}
var ActionPlatform_value = map[string]int32{
	"ACTION_PLATFORM_UNSPECIFIED":     0,
	"ACTION_PLATFORM_WEB_APPLICATION": 1,
	"ACTION_PLATFORM_MOBILE_WEB":      2,
	"ACTION_PLATFORM_ANDROID":         3,
	"ACTION_PLATFORM_IOS":             4,
}

func (x ActionPlatform) String() string {
	return proto.EnumName(ActionPlatform_name, int32(x))
}
func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{2}
}

type FeedMetadata_ProcessingInstruction int32

const (
	// By default we will assume that this feed is an incremental feed.
	FeedMetadata_PROCESS_UNKNOWN FeedMetadata_ProcessingInstruction = 0
	// This Feed message is one shard of a complete feed. Anything previously
	// supplied by this partner will be deleted; the contents of this feed
	// represent the entire state of the world.
	FeedMetadata_PROCESS_AS_COMPLETE FeedMetadata_ProcessingInstruction = 1
	// This Feed message is one shard of an incremental feed. Existing entities
	// will be left untouched except as modified in this feed.
	FeedMetadata_PROCESS_AS_INCREMENTAL FeedMetadata_ProcessingInstruction = 2
)

var FeedMetadata_ProcessingInstruction_name = map[int32]string{
	0: "PROCESS_UNKNOWN",
	1: "PROCESS_AS_COMPLETE",
	2: "PROCESS_AS_INCREMENTAL",
}
var FeedMetadata_ProcessingInstruction_value = map[string]int32{
	"PROCESS_UNKNOWN":        0,
	"PROCESS_AS_COMPLETE":    1,
	"PROCESS_AS_INCREMENTAL": 2,
}

func (x FeedMetadata_ProcessingInstruction) String() string {
	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
}
func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0, 0}
}

// Enum to indicate the prepayment type.
type Service_PrepaymentType int32

const (
	// By default we will assume that the prepayment is NOT_SUPPORTED.
	Service_PREPAYMENT_TYPE_UNSPECIFIED Service_PrepaymentType = 0
	// The user has to pay this service at the booking time.
	Service_REQUIRED Service_PrepaymentType = 1
	// The user can choose to pre-pay this service at the booking time or later,
	// but it is not required in order to book.
	Service_OPTIONAL Service_PrepaymentType = 2
	// The prepayment is not supported for this service.
	Service_NOT_SUPPORTED Service_PrepaymentType = 3
)

var Service_PrepaymentType_name = map[int32]string{
	0: "PREPAYMENT_TYPE_UNSPECIFIED",
	1: "REQUIRED",
	2: "OPTIONAL",
	3: "NOT_SUPPORTED",
}
var Service_PrepaymentType_value = map[string]int32{
	"PREPAYMENT_TYPE_UNSPECIFIED": 0,
	"REQUIRED":                    1,
	"OPTIONAL":                    2,
	"NOT_SUPPORTED":               3,
}

func (x Service_PrepaymentType) String() string {
	return proto.EnumName(Service_PrepaymentType_name, int32(x))
}
func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 0}
}

type Service_ServiceType int32

const (
	Service_SERVICE_TYPE_UNSPECIFIED        Service_ServiceType = 0
	Service_SERVICE_TYPE_DINING_RESERVATION Service_ServiceType = 1
	Service_SERVICE_TYPE_FOOD_ORDERING      Service_ServiceType = 2
	Service_SERVICE_TYPE_EVENT_TICKET       Service_ServiceType = 3
	Service_SERVICE_TYPE_TRIP_TOUR          Service_ServiceType = 4
)

var Service_ServiceType_name = map[int32]string{
	0: "SERVICE_TYPE_UNSPECIFIED",
	1: "SERVICE_TYPE_DINING_RESERVATION",
	2: "SERVICE_TYPE_FOOD_ORDERING",
	3: "SERVICE_TYPE_EVENT_TICKET",
	4: "SERVICE_TYPE_TRIP_TOUR",
}
var Service_ServiceType_value = map[string]int32{
	"SERVICE_TYPE_UNSPECIFIED":        0,
	"SERVICE_TYPE_DINING_RESERVATION": 1,
	"SERVICE_TYPE_FOOD_ORDERING":      2,
	"SERVICE_TYPE_EVENT_TICKET":       3,
	"SERVICE_TYPE_TRIP_TOUR":          4,
}

func (x Service_ServiceType) String() string {
	return proto.EnumName(Service_ServiceType_name, int32(x))
}
func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 1}
}

// Enum to indicate the type of field.
type ServiceIntakeFormField_FieldType int32

const (
	// Fields of unspecified or unknown type will be ignored.
	ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED ServiceIntakeFormField_FieldType = 0
	// A one-line input field for text.
	ServiceIntakeFormField_SHORT_ANSWER ServiceIntakeFormField_FieldType = 1
	// A multi-line input field for text.
	ServiceIntakeFormField_PARAGRAPH ServiceIntakeFormField_FieldType = 2
	// A set of radio buttons that requires one choice from many options.
	ServiceIntakeFormField_MULTIPLE_CHOICE ServiceIntakeFormField_FieldType = 3
	// One or more enumerated items with checkboxes.
	ServiceIntakeFormField_CHECKBOXES ServiceIntakeFormField_FieldType = 4
	// A selection from a dropdown.
	ServiceIntakeFormField_DROPDOWN ServiceIntakeFormField_FieldType = 5
	// A yes/no button.
	ServiceIntakeFormField_BOOLEAN ServiceIntakeFormField_FieldType = 6
)

var ServiceIntakeFormField_FieldType_name = map[int32]string{
	0: "FIELD_TYPE_UNSPECIFIED",
	1: "SHORT_ANSWER",
	2: "PARAGRAPH",
	3: "MULTIPLE_CHOICE",
	4: "CHECKBOXES",
	5: "DROPDOWN",
	6: "BOOLEAN",
}
var ServiceIntakeFormField_FieldType_value = map[string]int32{
	"FIELD_TYPE_UNSPECIFIED": 0,
	"SHORT_ANSWER":           1,
	"PARAGRAPH":              2,
	"MULTIPLE_CHOICE":        3,
	"CHECKBOXES":             4,
	"DROPDOWN":               5,
	"BOOLEAN":                6,
}

func (x ServiceIntakeFormField_FieldType) String() string {
	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
}
func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{11, 0}
}

// Enum to indicate the type of this media source. Only photos are supported.
// Please reach out to Google if supporting animations or videos is
// important to your feature and we will find the best solution for you.
type RelatedMedia_MediaType int32

const (
	// Unused.
	RelatedMedia_TYPE_UNSPECIFIED RelatedMedia_MediaType = 0
	// Indicates the media provided by the url is a photo.
	RelatedMedia_PHOTO RelatedMedia_MediaType = 1
)

var RelatedMedia_MediaType_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "PHOTO",
}
var RelatedMedia_MediaType_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"PHOTO":            1,
}

func (x RelatedMedia_MediaType) String() string {
	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
}
func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feeds_fc30b4ddff65807e, []int{17, 0}
}

type FeedMetadata struct {
	// Instructs us how to process the feed: either as a shard of a complete feed,
	// or as a shard of an incremental update.
	ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,proto3,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
	// The current shard and total number of shards for this feed.
	//
	// Shard number is assumed to be zero-based.
	//
	// There does not need to be any relationship to the file name.
	//
	// Shards do not need to be transferred in order, and they may not be
	// processed in order.
	ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber,proto3" json:"shard_number,omitempty"`
	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards,proto3" json:"total_shards,omitempty"`
	// An identifier that must be consistent across all shards in a feed.
	// This value must be globally unique across each feed type.
	//
	// This value ensures that complete feeds spanning multiple shards are
	// processed together correctly.
	//
	// Clients only need to set this value when the processing_instruction is set
	// to PROCESS_AS_COMPLETE and the feed spans multiple shards (defined by
	// total_shards).
	//
	// Feeds that span multiple shards must set this nonce to the same value.
	Nonce uint64 `protobuf:"varint,5,opt,name=nonce,proto3" json:"nonce,omitempty"`
	// The timestamp at which this feed shard was generated.
	//
	// In Unix time format (seconds since the epoch).
	GenerationTimestamp  int64    `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp,proto3" json:"generation_timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_FeedMetadata proto.InternalMessageInfo

func (m *FeedMetadata) GetProcessingInstruction() FeedMetadata_ProcessingInstruction {
	if m != nil {
		return m.ProcessingInstruction
	}
	return FeedMetadata_PROCESS_UNKNOWN
}

func (m *FeedMetadata) GetShardNumber() int32 {
	if m != nil {
		return m.ShardNumber
	}
	return 0
}

func (m *FeedMetadata) GetTotalShards() int32 {
	if m != nil {
		return m.TotalShards
	}
	return 0
}

func (m *FeedMetadata) GetNonce() uint64 {
	if m != nil {
		return m.Nonce
	}
	return 0
}

func (m *FeedMetadata) GetGenerationTimestamp() int64 {
	if m != nil {
		return m.GenerationTimestamp
	}
	return 0
}

type AvailabilityFeed struct {
	Metadata             *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	ServiceAvailability  []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability,proto3" json:"service_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

var xxx_messageInfo_AvailabilityFeed proto.InternalMessageInfo

func (m *AvailabilityFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *AvailabilityFeed) GetServiceAvailability() []*ServiceAvailability {
	if m != nil {
		return m.ServiceAvailability
	}
	return nil
}

type ServiceAvailability struct {
	// If provided, we will consider the Availability entities provided to be a
	// complete snapshot from [start_timestamp_restrict, end_timestamp_restrict).
	// That is, all existing availability will be deleted if the following
	// condition holds true:
	//
	//    start_timestamp_restrict <= Availability.start_sec &&
	//    Availability.start_sec < end_timestamp_restrict
	//
	// If a resource_restrict message is set, the condition is further restricted:
	//
	//    Availability.resource.staff_id == resource_restrict.staff_id &&
	//    Availability.resource.room_id == resource_restrict.room_id
	//
	// These fields are typically used to provide a complete update of
	// availability in a given time range.
	//
	// Setting start_timestamp_restrict while leaving end_timestamp_restrict unset
	// is interpreted to mean all time beginning at start_timestamp_restrict.
	//
	// Setting end_timestamp_restrict while leaving start_timestamp_restrict unset
	// is interpreted to mean all time up to the end_timestamp_restrict.
	//
	// In Unix time format (seconds since the epoch).
	StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict,proto3" json:"start_timestamp_restrict,omitempty"`
	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict,proto3" json:"end_timestamp_restrict,omitempty"`
	// If provided, the timestamp restricts will be applied only to the given
	// merchant or service.
	//
	// These fields are typically used to provide complete snapshot of
	// availability in a given range (defined above) for a specific merchant or
	// service.
	//
	// Leaving these fields unset, or setting these to the empty string or null,
	// is interpreted to mean that no restrict is intended.
	MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict,proto3" json:"merchant_id_restrict,omitempty"`
	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict,proto3" json:"service_id_restrict,omitempty"`
	// Setting resources_restrict further restricts the scope of the update to
	// just this set of resources. All id fields of the resources must match
	// exactly.
	ResourcesRestrict    *Resources      `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict,proto3" json:"resources_restrict,omitempty"`
	Availability         []*Availability `protobuf:"bytes,5,rep,name=availability,proto3" json:"availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

var xxx_messageInfo_ServiceAvailability proto.InternalMessageInfo

func (m *ServiceAvailability) GetStartTimestampRestrict() int64 {
	if m != nil {
		return m.StartTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetEndTimestampRestrict() int64 {
	if m != nil {
		return m.EndTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetMerchantIdRestrict() string {
	if m != nil {
		return m.MerchantIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetServiceIdRestrict() string {
	if m != nil {
		return m.ServiceIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetResourcesRestrict() *Resources {
	if m != nil {
		return m.ResourcesRestrict
	}
	return nil
}

func (m *ServiceAvailability) GetAvailability() []*Availability {
	if m != nil {
		return m.Availability
	}
	return nil
}

// An availability of the merchant's service, indicating time and number
// of spots.
// The availability feed should be a list of this message.
// Please note that it's up to the partner to call out all the possible
// availabilities.
// If a massage therapist is available 9am-12pm, and they provide
// one-hour massage sessions, the aggregator should provide the feed as
//   availability {start_sec: 9am, duration: 60 minutes, ...}
//   availability {start_sec: 10am, duration: 60 minutes, ...}
//   availability {start_sec: 11am, duration: 60 minutes, ...}
// instead of
//   availability {start_sec: 9am, duration: 180 minutes, ...}
//
type Availability struct {
	// An opaque string from an aggregator to identify a merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from aggregator to identify a service of the
	// merchant. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of this availability, using epoch time in seconds in UTC.
	// (required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the service in seconds, e.g. 30 minutes for a chair massage.
	// (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of total spots and open spots of this availability.
	// E.g. a Yoga class of 10 spots with 3 booked.
	//   availability {spots_total: 10, spots_open: 7 ...}
	// E.g. a chair massage session which was already booked.
	//   availability {spots_total: 1, spots_open: 0 ...}
	//
	// Note: If sending requests using the availability compression format defined
	//       below, these two fields will be inferred. A Recurrence
	//       implies spots_total=1 and spots_open=1. A ScheduleException implies
	//       spots_total=1 and spots_open=0.
	// (both required if recurrence not set)
	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal,proto3" json:"spots_total,omitempty"`
	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	// An optional opaque string to identify this availability slot. If set, it
	// will be included in the requests that book/update/cancel appointments.
	// (optional)
	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// Optional resources used to disambiguate this availability slot from
	// others when different staff, room, or party_size values are part
	// of the service.
	//
	// E.g. the same Yoga class with two 2 instructors.
	//  availability { resources { staff_id: "1" staff_name: "Amy" }
	//                 spots_total: 10 spots_open: 7 }
	//  availability { resources { staff_id: "2" staff_name: "John" }
	//                 spots_total: 5 spots_open: 2 }
	// (optional)
	Resources *Resources `protobuf:"bytes,8,opt,name=resources,proto3" json:"resources,omitempty"`
	// A list of IDs referencing the payment options which can be used to pay
	// for this slot. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants.
	//
	// This field overrides any payment_option_ids specified in the service
	// message. Similarly payment_option_ids specified here do NOT have to be
	// present in the service message, though must be defined at the
	// Merchant level.
	// Our current implementation limits the number of entries in this array to
	// one element. Multiple payment_option_id are still allowed at the Service
	// level, but an override at the availability slot level, is limited to a
	// single payment_option_id. (optional)
	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// The recurrence information for the availability, representing more than one
	// start time. A recurrence should contain appointments for one working day.
	// (optional)
	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence,proto3" json:"recurrence,omitempty"`
	// Times when this service cannot be scheduled. To limit the number of
	// schedule_exception messages, consider joining adjacent exceptions.
	// (optional)
	ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException,proto3" json:"schedule_exception,omitempty"`
	// Defines how a deposit may be charged to the user. Overrides the service
	// deposit if one was specified. Setting this to an empty Deposit message
	// removes any service-level deposit. (optional)
	Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Overrides the
	// service no show fee if one was specified. Setting this to an empty
	// NoShowFee message removes any service-level no show fee. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// availability slot.
	// If the value is not set, it is inherited from the service level if it's set
	// there. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// Indicates a list of supported ticket types for this availability slot. If
	// unset, all ticket types in the parent service are available for this slot.
	// Note that the values of this field must be defined in the parent service.
	// Examples:
	//
	// * Service with four ticket types:
	// TicketType {ticket_type_id: "adult_1" short_description: "Adult weekdays"}
	// TicketType {ticket_type_id: "adult_2" short_description: "Adult weekends"}
	// TicketType {ticket_type_id: "youth_1" short_description: "Youth weekdays"}
	// TicketType {ticket_type_id: "youth_2" short_description: "Youth weekends"}
	//
	// To represent the inventory during the weekdays:
	//   `availability {ticket_type_id: "adult_1" ticket_type_id: "youth_1"...}`.
	// To represent the inventory during the holidays:
	//   `availability {ticket_type_id: "adult_2" ticket_type_id: "youth_2"...}`.
	//
	// * Service with three ticket types:
	// TicketType {ticket_type_id: "adult" short_description: "Adult"}
	// TicketType {ticket_type_id: "youth" short_description: "Youth"}
	// TicketType {ticket_type_id: "senior" short_description: "Senior"}
	//
	// To indicate that all three ticket types are available for this time
	// slot, use either
	//   `availability {ticket_type_id: "adult" ticket_type_id: "youth"
	//   ticket_type_id: "senior" ...}`
	// or
	//   `availability {...}' (do not set ticket_type_id in this slot).
	//
	//  (optional)
	TicketTypeId         []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Availability proto.InternalMessageInfo

func (m *Availability) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Availability) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *Availability) GetStartSec() int64 {
	if m != nil {
		return m.StartSec
	}
	return 0
}

func (m *Availability) GetDurationSec() int64 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *Availability) GetSpotsTotal() int64 {
	if m != nil {
		return m.SpotsTotal
	}
	return 0
}

func (m *Availability) GetSpotsOpen() int64 {
	if m != nil {
		return m.SpotsOpen
	}
	return 0
}

func (m *Availability) GetAvailabilityTag() string {
	if m != nil {
		return m.AvailabilityTag
	}
	return ""
}

func (m *Availability) GetResources() *Resources {
	if m != nil {
		return m.Resources
	}
	return nil
}

func (m *Availability) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Availability) GetRecurrence() *Availability_Recurrence {
	if m != nil {
		return m.Recurrence
	}
	return nil
}

func (m *Availability) GetScheduleException() []*Availability_ScheduleException {
	if m != nil {
		return m.ScheduleException
	}
	return nil
}

func (m *Availability) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Availability) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Availability) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Availability) GetTicketTypeId() []string {
	if m != nil {
		return m.TicketTypeId
	}
	return nil
}

// Recurrence messages are optional, but allow for a more compact
// representation of consistently repeating availability slots. They typically
// represent a day's working schedule.
// ScheduleException messages are then used to represent booked/unavailable
// time ranges within the work day.
//
// Requirements:
//   1. The expansion of availability slots or recurrences must NOT create
//      identical slots. If the ids, start_sec, duration_sec, and resources
//      match, slots are considered identical.
//   2. Do NOT mix the standard availability format and recurrence within the
//      slots of a single service. Recurrence benefits merchants/services that
//      offer appointments. The standard format is geared towards
//      merchants/services with regularly scheduled classes.
type Availability_Recurrence struct {
	// The inclusive maximum UTC timestamp the availability repeats until.
	// (required)
	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"`
	// Defines the time between successive availability slots.
	//
	// Example: An availability with a duration of 20 min, a repeat_every_sec of
	// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
	// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
	// 11-11:20am. (required)
	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Availability_Recurrence proto.InternalMessageInfo

func (m *Availability_Recurrence) GetRepeatUntilSec() int64 {
	if m != nil {
		return m.RepeatUntilSec
	}
	return 0
}

func (m *Availability_Recurrence) GetRepeatEverySec() int32 {
	if m != nil {
		return m.RepeatEverySec
	}
	return 0
}

// ScheduleException messages represent booked/unavailable time ranges within
// the workday, which are exceptions to the recurrence described above. As
// time slots are booked, the list of exceptions should be updated to reflect
// the newly unavailable time ranges. The recurrence itself shouldn't be
// modified.
type Availability_ScheduleException struct {
	// The time range of the exception. Any slots described by the recurrence
	// which overlap this closed-open time range will be considered unavailable.
	//
	// Example: If the recurrence specifies a duration of 20 min, a
	// repeat_every_sec of 30 min, a start_time of 9:00am, and a
	// repeat_until_sec of 11:00am, then a ScheduleException with a time_range
	// of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am,
	// 10-10:20am, and 10:30-10:50am.
	//
	// Note that because the time range is closed-open, the slot beginning at
	// 11am slot would not be impacted.
	TimeRange            *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

var xxx_messageInfo_Availability_ScheduleException proto.InternalMessageInfo

func (m *Availability_ScheduleException) GetTimeRange() *TimeRange {
	if m != nil {
		return m.TimeRange
	}
	return nil
}

// A resource is used to disambiguate availability slots from one another when
// different staff, room or party_size values are part of the service.
// Multiple slots for the same service and time interval can co-exist when they
// have different resources.
type Resources struct {
	// Optional id for a staff member providing the service. This field identifies
	// the staff member across all merchants, services, and availability records.
	// It also needs to be stable over time to allow correlation with past
	// bookings.
	// This field must be present if staff_name is present.
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// Optional name of a staff member providing the service. This field will be
	// displayed to users making a booking, and should be human readable, as
	// opposed to an opaque identifier.
	// This field must be present if staff_id is present.
	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"`
	// An optional id for the room the service is located in. This field
	// identifies the room across all merchants, services, and availability
	// records. It also needs to be stable over time to allow correlation with
	// past bookings.
	// This field must be present if room_name is present.
	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// An optional name for the room the service is located in. This
	// field will be displayed to users making a booking, and should be human
	// readable, as opposed to an opaque identifier.
	// This field must be present if room_id is present.
	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"`
	// Applicable only for Dining: The party size which can be accommodated
	// during this time slot. A restaurant can be associated with multiple Slots
	// for the same time, each specifying a different party_size, if for instance
	// 2, 3, or 4 people can be seated with a reservation.
	PartySize            int32    `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Resources proto.InternalMessageInfo

func (m *Resources) GetStaffId() string {
	if m != nil {
		return m.StaffId
	}
	return ""
}

func (m *Resources) GetStaffName() string {
	if m != nil {
		return m.StaffName
	}
	return ""
}

func (m *Resources) GetRoomId() string {
	if m != nil {
		return m.RoomId
	}
	return ""
}

func (m *Resources) GetRoomName() string {
	if m != nil {
		return m.RoomName
	}
	return ""
}

func (m *Resources) GetPartySize() int32 {
	if m != nil {
		return m.PartySize
	}
	return 0
}

type TimeRange struct {
	BeginSec             int64    `protobuf:"varint,1,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"`
	EndSec               int64    `protobuf:"varint,2,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_TimeRange proto.InternalMessageInfo

func (m *TimeRange) GetBeginSec() int64 {
	if m != nil {
		return m.BeginSec
	}
	return 0
}

func (m *TimeRange) GetEndSec() int64 {
	if m != nil {
		return m.EndSec
	}
	return 0
}

type ServiceFeed struct {
	Metadata             *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Service              []*Service    `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

var xxx_messageInfo_ServiceFeed proto.InternalMessageInfo

func (m *ServiceFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *ServiceFeed) GetService() []*Service {
	if m != nil {
		return m.Service
	}
	return nil
}

// The definition of a service provided by a merchant.
type Service struct {
	// An opaque string from an aggregator partner which uniquely identifies a
	// merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from an aggregator partner which uniquely identifies the
	// service. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// The name of the service, suitable for display to users, e.g. "Men's
	// haircut". (required)
	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	// The description of the service, suitable for display to users.
	//
	// This field now supports both plain text and HTML-like formatting rules to
	// display structural contents to end-users. Unlike plain text sections,
	// customized layouts can be created here using headings, paragraphs, lists
	// and some phrase tags. Please read the following instructions and notes
	// carefully to create better user-experience.
	//
	// Supported HTML-like formatting tags:
	//
	// Heading tags: <h1>, <h2>, <h3>, <h4>, <h5>, <h6>
	//   Heading tags can be used to display titles and sub-titles. For example,
	//   <h1>Itinerary</h1> will display the inline text as the most important
	//   heading of the section. Note that any inner HTML tags, styles or
	//   attributes will be ignored. For example, <h1 style=".."> will be treated
	//   the same as <h1>. Only pure text wil be preserved.
	//
	// Paragraph tag: <p>:
	//   Paragraph tag can be used to wrap detailed introduction or contents. Any
	//   inner tags, styles or attributes will be ignored with a few exceptions:
	//   <br>, <strong> and <em>. Please see the phrase tag section below for more
	//   details.
	//
	// List tags: <ul>, <ol>, <li>
	//   <ul> tag can be used with <li> tag to display unordered lists, and <ol>
	//   tag can be used with <li> to display ordered lists. This is a good tool
	//   to display checklists, highlights or any other lists that fit your
	//   use-cases.
	// Example: To show a list of features of a cruise trip:
	//  <ol>
	//    <li>Wonderful ocean view and chances to play with wildlife.</li>
	//    <li>Carefully designed travel arrangements and services.</li>
	//    <li>Gauranteed lowest price.</li>
	// </ol>
	// Note that only <li> children under <ul> or <ol> tags will be converted. All
	// other children will be dropped. Also any inner tags, attributes and styles
	// will be ignored, only pure text contents are preserved.
	//
	// Division tag: <div>
	//   All supported inner tags of the <div> tag will be parsed with the rules
	//   stated above. But <div> tag itself does not mean any grouping or
	//   indenting here. Also any inner attributes and styles will be ignored.
	//
	// Phrase tags: <br>, <strong>, <em>:
	//   Only the three tags mentioned above are supported. <br> can be used to
	//   break lines in paragraphs, and <strong>/<em> can be used to highlight
	//   important text. Any other phrase tags will be ignored.
	//
	// Unsupported tags:
	//   * <html>, <header> and <body> tags are not allowed.
	//   * Any URLs, anchors, links will be striped, and will never be displayed
	//   to end-users. If you want to use photos to create a rich user experience,
	//   please use the "related_media" field below to send your photo urls
	//   * Any other tags not mentioned above are not supported (for example
	//   <table>, <td> ...).
	//
	// Important notes:
	//   * Try not to use other tags except for the supported ones mentioned
	//   above, because contents within unsupported tags will be excluded from UI
	//   rendering and may lead to undesired user experience.
	//   * Try avoid deep nested structures like more than 3 different heading
	//   levels or nested lists. Keeping the structure flat, simple and
	//   straightforward helps to create a better user experience.
	//   * If the currently supported layouts are not enough for your use cases,
	//   please contact Google with your requests and we will find the best
	//   approach for you.
	//
	// (required)
	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	// The price of the service. (optional, overridden when payment options or
	// ticket types present)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Rules to book/cancel an appointment. (optional)
	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
	// Intake forms to customize the service. (optional)
	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"`
	// Whether a prepayment is required, optional or not supported. (optional)
	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
	// The service's tax rate. If present this field overrides any tax_rate set at
	// the merchant level. An empty message (i.e. tax_rate { }) will reset the
	// applied tax rate to zero. (optional)
	TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate,proto3" json:"tax_rate,omitempty"`
	// A list of ids referencing the payment options which can be used to pay
	// for this service. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants. (optional)
	PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// Defines how a deposit may be charged to the user. Can be overridden at the
	// availability level. (optional)
	Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Can be overridden
	// at the availability level. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// service.
	// This value can be overridden at the availability level. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// An action link related to this service.
	ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"`
	// The predefined type of this service. Currently, only used with action_link.
	Type Service_ServiceType `protobuf:"varint,15,opt,name=type,proto3,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
	// Types of tickets that can be booked/purchased for this service, if tickets
	// are supported. (optional)
	TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	// Photos related to this service. Google will crawl these media to
	// ensure that they are displayed to end-users in the most efficient way.
	// (optional)
	RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia,proto3" json:"related_media,omitempty"`
	// Service attribute values that apply to this service (optional).
	// Each Service may have zero or more values for each service attribute
	// defined in the corresponding Merchant.
	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                   `json:"-"`
	XXX_unrecognized        []byte                     `json:"-"`
	XXX_sizecache           int32                      `json:"-"`
}

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

var xxx_messageInfo_Service proto.InternalMessageInfo

func (m *Service) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Service) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *Service) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Service) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Service) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *Service) GetRules() *SchedulingRules {
	if m != nil {
		return m.Rules
	}
	return nil
}

func (m *Service) GetForm() []*ServiceIntakeForm {
	if m != nil {
		return m.Form
	}
	return nil
}

func (m *Service) GetPrepaymentType() Service_PrepaymentType {
	if m != nil {
		return m.PrepaymentType
	}
	return Service_PREPAYMENT_TYPE_UNSPECIFIED
}

func (m *Service) GetTaxRate() *TaxRate {
	if m != nil {
		return m.TaxRate
	}
	return nil
}

func (m *Service) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Service) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Service) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Service) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Service) GetActionLink() []*ActionLink {
	if m != nil {
		return m.ActionLink
	}
	return nil
}

func (m *Service) GetType() Service_ServiceType {
	if m != nil {
		return m.Type
	}
	return Service_SERVICE_TYPE_UNSPECIFIED
}

func (m *Service) GetTicketType() []*TicketType {
	if m != nil {
		return m.TicketType
	}
	return nil
}

func (m *Service) GetRelatedMedia() []*RelatedMedia {
	if m != nil {
		return m.RelatedMedia
	}
	return nil
}

func (m *Service) GetServiceAttributeValueId() []*ServiceAttributeValueId {
	if m != nil {
		return m.ServiceAttributeValueId
	}
	return nil
}

// The price of a service or a fee.
type Price struct {
	// The price in micro-units of the currency.
	// Fractions of smallest currency unit will be rounded using nearest even
	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
	// (required)
	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217. (required)
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// An optional and opaque string that identifies the pricing option that is
	// associated with the extended price. (optional)
	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Price proto.InternalMessageInfo

func (m *Price) GetPriceMicros() int64 {
	if m != nil {
		return m.PriceMicros
	}
	return 0
}

func (m *Price) GetCurrencyCode() string {
	if m != nil {
		return m.CurrencyCode
	}
	return ""
}

func (m *Price) GetPricingOptionTag() string {
	if m != nil {
		return m.PricingOptionTag
	}
	return ""
}

// The scheduling rules for a service.
type SchedulingRules struct {
	// The minimum advance notice in seconds required to book an appointment.
	// (optional)
	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3" json:"min_advance_booking,omitempty"`
	// The minimum advance notice in seconds required to cancel a booked
	// appointment online. (optional)
	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling,proto3" json:"min_advance_online_canceling,omitempty"`
	// The fee for canceling within the minimum advance notice period.
	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
	// The fee for no-show without canceling.
	NoshowFee            *Price   `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_SchedulingRules proto.InternalMessageInfo

func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
	if m != nil {
		return m.MinAdvanceBooking
	}
	return 0
}

func (m *SchedulingRules) GetMinAdvanceOnlineCanceling() int64 {
	if m != nil {
		return m.MinAdvanceOnlineCanceling
	}
	return 0
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetLateCancellationFee() *Price {
	if m != nil {
		return m.LateCancellationFee
	}
	return nil
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetNoshowFee() *Price {
	if m != nil {
		return m.NoshowFee
	}
	return nil
}

// A tax rate applied when charging the user for a service, and which can be set
// on either a per merchant, or per service basis.
type TaxRate struct {
	// A tax rate in millionths of one percent, effectively giving 6 decimals of
	// precision. For example, if the tax rate is 7.253%, this field should be set
	// to 7253000.
	//
	// If this field is left unset or set to 0, the total price charged to a user
	// for any service provided by this merchant is the exact price specified by
	// Service.price. The service price is assumed to be exempt from or already
	// inclusive of applicable taxes. Taxes will not be shown to the user as a
	// separate line item.
	//
	// If this field is set to any nonzero value, the total price charged to a
	// user for any service provided by this merchant will include the service
	// price plus the tax assessed using the tax rate provided here. Fractions of
	// the smallest currency unit (for example, fractions of one cent) will be
	// rounded using nearest even rounding. Taxes will be shown to the user as a
	// separate line item. (required)
	MicroPercent         int32    `protobuf:"varint,1,opt,name=micro_percent,json=microPercent,proto3" json:"micro_percent,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_TaxRate proto.InternalMessageInfo

func (m *TaxRate) GetMicroPercent() int32 {
	if m != nil {
		return m.MicroPercent
	}
	return 0
}

// Defines a field that is included in a ServiceIntakeForm.
type ServiceIntakeFormField struct {
	// The type of this field. (required)
	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
	// The text shown to the user for this field. (required)
	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
	// For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate.
	// (optional)
	Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"`
	// Indicates whether an answer to this field is required by a user. (optional)
	IsRequired           bool     `protobuf:"varint,4,opt,name=is_required,json=isRequired,proto3" json:"is_required,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo

func (m *ServiceIntakeFormField) GetType() ServiceIntakeFormField_FieldType {
	if m != nil {
		return m.Type
	}
	return ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED
}

func (m *ServiceIntakeFormField) GetLabel() string {
	if m != nil {
		return m.Label
	}
	return ""
}

func (m *ServiceIntakeFormField) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *ServiceIntakeFormField) GetIsRequired() bool {
	if m != nil {
		return m.IsRequired
	}
	return false
}

// Defines an intake form that customizes the service provided by a merchant.
type ServiceIntakeForm struct {
	// Fields that will be displayed to the user. (required)
	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
	// If true, this form will be shown to first time customers.
	// (one of first_time_customers or returning_customers required)
	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"`
	// If true, this form will be shown to repeat customers.
	// (one of first_time_customers or returning_customers required)
	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_ServiceIntakeForm proto.InternalMessageInfo

func (m *ServiceIntakeForm) GetField() []*ServiceIntakeFormField {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
	if m != nil {
		return m.FirstTimeCustomers
	}
	return false
}

func (m *ServiceIntakeForm) GetReturningCustomers() bool {
	if m != nil {
		return m.ReturningCustomers
	}
	return false
}

// A deposit that the user may be charged or have a hold on their credit card
// for.
type Deposit struct {
	// Deposit amount.
	Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Minimum advance cancellation for the deposit.
	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec,proto3" json:"min_advance_cancellation_sec,omitempty"`
	// Defines how the deposit is determined from the availability.
	DepositType          PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

var xxx_messageInfo_Deposit proto.InternalMessageInfo

func (m *Deposit) GetDeposit() *Price {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
	if m != nil {
		return m.MinAdvanceCancellationSec
	}
	return 0
}

func (m *Deposit) GetDepositType() PriceType {
	if m != nil {
		return m.DepositType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// A fee that a user may be charged if they have made a booking but do not
// show up.
type NoShowFee struct {
	// The amount the user may be charged if they do not show up for their
	// reservation.
	Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

var xxx_messageInfo_NoShowFee proto.InternalMessageInfo

func (m *NoShowFee) GetFee() *Price {
	if m != nil {
		return m.Fee
	}
	return nil
}

func (m *NoShowFee) GetFeeType() PriceType {
	if m != nil {
		return m.FeeType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// An action URL with associated language, list of countries restricted to, and
// optional platform that indicates which platform this action should be
// performed on.
type ActionLink struct {
	// The entry point URL for this action link.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// The BCP-47 language tag identifying the language in which the content
	// from this URI is available.
	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
	// ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry,proto3" json:"restricted_country,omitempty"`
	// The platform that this action should be performed on. If this field is
	// unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.
	Platform             ActionPlatform `protobuf:"varint,4,opt,name=platform,proto3,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

var xxx_messageInfo_ActionLink proto.InternalMessageInfo

func (m *ActionLink) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ActionLink) GetLanguage() string {
	if m != nil {
		return m.Language
	}
	return ""
}

func (m *ActionLink) GetRestrictedCountry() []string {
	if m != nil {
		return m.RestrictedCountry
	}
	return nil
}

func (m *ActionLink) GetPlatform() ActionPlatform {
	if m != nil {
		return m.Platform
	}
	return ActionPlatform_ACTION_PLATFORM_UNSPECIFIED
}

// TicketType is used to differentiate among tickets (where a ticket can be a
// spot on a raft trip, an admission to a museum, etc.) with different prices
// and/or availabilities due to different user types or different service
// attributes.
type TicketType struct {
	// The ticket id is used to differentiate among different ticket types of the
	// same service, and is only expected to be unique within a service.
	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price                *Price   `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_TicketType proto.InternalMessageInfo

func (m *TicketType) GetTicketTypeId() string {
	if m != nil {
		return m.TicketTypeId
	}
	return ""
}

func (m *TicketType) GetShortDescription() string {
	if m != nil {
		return m.ShortDescription
	}
	return ""
}

func (m *TicketType) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

// Defines a media source. This field only contains the URL of this media source
// (only photos are supported for now). Google will crawl the media data to
// ensure that they are displayed to end-users in the most efficient way.
type RelatedMedia struct {
	// URL of this media source.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Type of this media source.
	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
	// Caption of the media, only plain text is supported. (optional)
	Caption              string   `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_RelatedMedia proto.InternalMessageInfo

func (m *RelatedMedia) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *RelatedMedia) GetType() RelatedMedia_MediaType {
	if m != nil {
		return m.Type
	}
	return RelatedMedia_TYPE_UNSPECIFIED
}

func (m *RelatedMedia) GetCaption() string {
	if m != nil {
		return m.Caption
	}
	return ""
}

// Identifies a particular value of a service attribute to be applied to a
// Service.
type ServiceAttributeValueId struct {
	// ID of an attribute as defined in Merchant.service_attribute, e.g.
	// "service-type".
	AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId,proto3" json:"attribute_id,omitempty"`
	// ID of the value for this attribute, e.g. "haircut". Must match a value_id
	// in the service attribute definition.
	ValueId              string   `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_ServiceAttributeValueId proto.InternalMessageInfo

func (m *ServiceAttributeValueId) GetAttributeId() string {
	if m != nil {
		return m.AttributeId
	}
	return ""
}

func (m *ServiceAttributeValueId) GetValueId() string {
	if m != nil {
		return m.ValueId
	}
	return ""
}

func init() {
	proto.RegisterType((*FeedMetadata)(nil), "maps.booking.feeds.FeedMetadata")
	proto.RegisterType((*AvailabilityFeed)(nil), "maps.booking.feeds.AvailabilityFeed")
	proto.RegisterType((*ServiceAvailability)(nil), "maps.booking.feeds.ServiceAvailability")
	proto.RegisterType((*Availability)(nil), "maps.booking.feeds.Availability")
	proto.RegisterType((*Availability_Recurrence)(nil), "maps.booking.feeds.Availability.Recurrence")
	proto.RegisterType((*Availability_ScheduleException)(nil), "maps.booking.feeds.Availability.ScheduleException")
	proto.RegisterType((*Resources)(nil), "maps.booking.feeds.Resources")
	proto.RegisterType((*TimeRange)(nil), "maps.booking.feeds.TimeRange")
	proto.RegisterType((*ServiceFeed)(nil), "maps.booking.feeds.ServiceFeed")
	proto.RegisterType((*Service)(nil), "maps.booking.feeds.Service")
	proto.RegisterType((*Price)(nil), "maps.booking.feeds.Price")
	proto.RegisterType((*SchedulingRules)(nil), "maps.booking.feeds.SchedulingRules")
	proto.RegisterType((*TaxRate)(nil), "maps.booking.feeds.TaxRate")
	proto.RegisterType((*ServiceIntakeFormField)(nil), "maps.booking.feeds.ServiceIntakeFormField")
	proto.RegisterType((*ServiceIntakeForm)(nil), "maps.booking.feeds.ServiceIntakeForm")
	proto.RegisterType((*Deposit)(nil), "maps.booking.feeds.Deposit")
	proto.RegisterType((*NoShowFee)(nil), "maps.booking.feeds.NoShowFee")
	proto.RegisterType((*ActionLink)(nil), "maps.booking.feeds.ActionLink")
	proto.RegisterType((*TicketType)(nil), "maps.booking.feeds.TicketType")
	proto.RegisterType((*RelatedMedia)(nil), "maps.booking.feeds.RelatedMedia")
	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
	proto.RegisterEnum("maps.booking.feeds.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("maps.booking.feeds.RequireCreditCard", RequireCreditCard_name, RequireCreditCard_value)
	proto.RegisterEnum("maps.booking.feeds.ActionPlatform", ActionPlatform_name, ActionPlatform_value)
	proto.RegisterEnum("maps.booking.feeds.FeedMetadata_ProcessingInstruction", FeedMetadata_ProcessingInstruction_name, FeedMetadata_ProcessingInstruction_value)
	proto.RegisterEnum("maps.booking.feeds.Service_PrepaymentType", Service_PrepaymentType_name, Service_PrepaymentType_value)
	proto.RegisterEnum("maps.booking.feeds.Service_ServiceType", Service_ServiceType_name, Service_ServiceType_value)
	proto.RegisterEnum("maps.booking.feeds.ServiceIntakeFormField_FieldType", ServiceIntakeFormField_FieldType_name, ServiceIntakeFormField_FieldType_value)
	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
}

func init() { proto.RegisterFile("feeds.proto", fileDescriptor_feeds_fc30b4ddff65807e) }

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