// Code generated by protoc-gen-go. DO NOT EDIT.
// source: github.com/maps-booking-v3/feeds/feeds.proto

/*
Package maps_booking_feeds is a generated protocol buffer package.

It is generated from these files:
	github.com/maps-booking-v3/feeds/feeds.proto

It has these top-level messages:
	FeedMetadata
	AvailabilityFeed
	ServiceAvailability
	Availability
	Resources
	TimeRange
	ServiceFeed
	Service
	Price
	SchedulingRules
	TaxRate
	ServiceIntakeFormField
	ServiceIntakeForm
	Deposit
	NoShowFee
	ActionLink
	TicketType
	RelatedMedia
	ServiceAttributeValueId
	WaitlistRules
*/
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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []int{7, 1} }

// The admission policy of this service.
type SchedulingRules_AdmissionPolicy int32

const (
	// Unused.
	SchedulingRules_ADMISSION_POLICY_UNSPECIFIED SchedulingRules_AdmissionPolicy = 0
	// Customers are required to be present at the start time of the
	// availability slot, and the service is expected to finish at the
	// end time of the slot.
	// Examples of TIME_STRICT use cases:
	//   * A tour that starts at 9am that requires all attendees to arrive
	//     at the start time, and returns at around 12pm.
	//   * A haircut reservation at 3pm on Saturday that will take approximately
	//   30 minutes.
	//   * A fitness class from 6pm to 8pm.
	SchedulingRules_TIME_STRICT SchedulingRules_AdmissionPolicy = 1
	// Customers can arrive at any time between the start and end time of the
	// availability slot to use this booking.
	//
	// Examples of TIME_FLEXIBLE use cases:
	//   * A museum ticket that can be used during any time on the purchase
	//     date.
	//   * An afternoon admission to an amusement park that can be used from
	//     12pm to 9pm.
	SchedulingRules_TIME_FLEXIBLE SchedulingRules_AdmissionPolicy = 2
	// Customers need to arrive at the merchant at the start time of the
	// availability slot but can leave any time they want.
	//
	// For example, in the museum admission scenario, a timed entry ticket
	// for 10am requires the user to be at the museum at 10am. The start time of
	// availability slots for this service represents the designated entry
	// time. The end time, however, is used solely as a key to identify the
	// availability slot for booking.
	SchedulingRules_TIMED_ENTRY_WITH_FLEXIBLE_DURATION SchedulingRules_AdmissionPolicy = 3
)

var SchedulingRules_AdmissionPolicy_name = map[int32]string{
	0: "ADMISSION_POLICY_UNSPECIFIED",
	1: "TIME_STRICT",
	2: "TIME_FLEXIBLE",
	3: "TIMED_ENTRY_WITH_FLEXIBLE_DURATION",
}
var SchedulingRules_AdmissionPolicy_value = map[string]int32{
	"ADMISSION_POLICY_UNSPECIFIED":       0,
	"TIME_STRICT":                        1,
	"TIME_FLEXIBLE":                      2,
	"TIMED_ENTRY_WITH_FLEXIBLE_DURATION": 3,
}

func (x SchedulingRules_AdmissionPolicy) String() string {
	return proto.EnumName(SchedulingRules_AdmissionPolicy_name, int32(x))
}
func (SchedulingRules_AdmissionPolicy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor0, []int{9, 0}
}

// 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 fileDescriptor0, []int{11, 0}
}

// Enum to indicate the type of this media source. Only photos are supported.
// Please reach out to the Reserve with Google team if other media beyond
// photos need to be supported.
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 fileDescriptor0, []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,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" json:"shard_number,omitempty"`
	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards" 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" 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" json:"generation_timestamp,omitempty"`
}

func (m *FeedMetadata) Reset()                    { *m = FeedMetadata{} }
func (m *FeedMetadata) String() string            { return proto.CompactTextString(m) }
func (*FeedMetadata) ProtoMessage()               {}
func (*FeedMetadata) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

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" json:"metadata,omitempty"`
	ServiceAvailability []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability" json:"service_availability,omitempty"`
}

func (m *AvailabilityFeed) Reset()                    { *m = AvailabilityFeed{} }
func (m *AvailabilityFeed) String() string            { return proto.CompactTextString(m) }
func (*AvailabilityFeed) ProtoMessage()               {}
func (*AvailabilityFeed) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }

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" json:"start_timestamp_restrict,omitempty"`
	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict" 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" json:"merchant_id_restrict,omitempty"`
	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict" 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" json:"resources_restrict,omitempty"`
	Availability      []*Availability `protobuf:"bytes,5,rep,name=availability" json:"availability,omitempty"`
}

func (m *ServiceAvailability) Reset()                    { *m = ServiceAvailability{} }
func (m *ServiceAvailability) String() string            { return proto.CompactTextString(m) }
func (*ServiceAvailability) ProtoMessage()               {}
func (*ServiceAvailability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }

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" 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" 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" 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" 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" json:"spots_total,omitempty"`
	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen" 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" 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" 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" 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" 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" 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" 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" 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,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" json:"ticket_type_id,omitempty"`
	// Availability scheduling rules. If fields are populated, they will override
	// any corresponding scheduling rules on the service-level SchedulingRules.
	SchedulingRuleOverrides *Availability_SchedulingRuleOverrides `protobuf:"bytes,16,opt,name=scheduling_rule_overrides,json=schedulingRuleOverrides" json:"scheduling_rule_overrides,omitempty"`
}

func (m *Availability) Reset()                    { *m = Availability{} }
func (m *Availability) String() string            { return proto.CompactTextString(m) }
func (*Availability) ProtoMessage()               {}
func (*Availability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }

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
}

func (m *Availability) GetSchedulingRuleOverrides() *Availability_SchedulingRuleOverrides {
	if m != nil {
		return m.SchedulingRuleOverrides
	}
	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" 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" json:"repeat_every_sec,omitempty"`
}

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 fileDescriptor0, []int{3, 0} }

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" json:"time_range,omitempty"`
}

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 fileDescriptor0, []int{3, 1}
}

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

// Availability level scheduling rules.
type Availability_SchedulingRuleOverrides struct {
	// The last time (in seconds) that this slot is able to be booked. This
	// timestamp must be before the start_sec of the slot to be respected
	// (if users should be able to book after the start time, use service level
	// SchedulingRules.min_booking_before_end_time). If present, will override
	// anything specified in the min_booking_buffer of the corresponding
	// Service's SchedulingRules.
	LastBookableSec int64 `protobuf:"varint,1,opt,name=last_bookable_sec,json=lastBookableSec" json:"last_bookable_sec,omitempty"`
}

func (m *Availability_SchedulingRuleOverrides) Reset()         { *m = Availability_SchedulingRuleOverrides{} }
func (m *Availability_SchedulingRuleOverrides) String() string { return proto.CompactTextString(m) }
func (*Availability_SchedulingRuleOverrides) ProtoMessage()    {}
func (*Availability_SchedulingRuleOverrides) Descriptor() ([]byte, []int) {
	return fileDescriptor0, []int{3, 2}
}

func (m *Availability_SchedulingRuleOverrides) GetLastBookableSec() int64 {
	if m != nil {
		return m.LastBookableSec
	}
	return 0
}

// 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" 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" 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" 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" 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" json:"party_size,omitempty"`
}

func (m *Resources) Reset()                    { *m = Resources{} }
func (m *Resources) String() string            { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage()               {}
func (*Resources) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }

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" json:"begin_sec,omitempty"`
	EndSec   int64 `protobuf:"varint,2,opt,name=end_sec,json=endSec" json:"end_sec,omitempty"`
}

func (m *TimeRange) Reset()                    { *m = TimeRange{} }
func (m *TimeRange) String() string            { return proto.CompactTextString(m) }
func (*TimeRange) ProtoMessage()               {}
func (*TimeRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }

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" json:"metadata,omitempty"`
	Service  []*Service    `protobuf:"bytes,2,rep,name=service" json:"service,omitempty"`
}

func (m *ServiceFeed) Reset()                    { *m = ServiceFeed{} }
func (m *ServiceFeed) String() string            { return proto.CompactTextString(m) }
func (*ServiceFeed) ProtoMessage()               {}
func (*ServiceFeed) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }

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" 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" 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" 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" 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" json:"price,omitempty"`
	// Rules to book/cancel an appointment. (optional)
	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules" json:"rules,omitempty"`
	// Intake forms to customize the service. (optional)
	//
	// Deprecated. Please see intake_form and per_ticket_intake_form.
	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form" json:"form,omitempty"`
	// A form requesting additional information from the user when they book this
	// service. (optional)
	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm" json:"intake_form,omitempty"`
	// A form requesting additional information from the user when they book this
	// service. This form must be filled out once for each ticket the user is
	// booking. (optional)
	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm" json:"per_ticket_intake_form,omitempty"`
	// Whether a prepayment is required, optional or not supported. (optional)
	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,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" 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" 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" 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" 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,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" 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,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" 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" 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" json:"service_attribute_value_id,omitempty"`
	// Rules related to joining the waitlist. Should be populated if the service
	// and merchant support waitlist functionality. Should not be populated
	// otherwise.
	WaitlistRules *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules" json:"waitlist_rules,omitempty"`
}

func (m *Service) Reset()                    { *m = Service{} }
func (m *Service) String() string            { return proto.CompactTextString(m) }
func (*Service) ProtoMessage()               {}
func (*Service) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }

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) GetIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.IntakeForm
	}
	return nil
}

func (m *Service) GetPerTicketIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.PerTicketIntakeForm
	}
	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
}

func (m *Service) GetWaitlistRules() *WaitlistRules {
	if m != nil {
		return m.WaitlistRules
	}
	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" 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" 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" json:"pricing_option_tag,omitempty"`
}

func (m *Price) Reset()                    { *m = Price{} }
func (m *Price) String() string            { return proto.CompactTextString(m) }
func (*Price) ProtoMessage()               {}
func (*Price) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }

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 duration (in seconds) from when the last booking can be made to
	// when the availability slot starts or ends.
	//
	// If "min_advance_booking" is set, the last bookable time is calculated as
	// (<slot start time> - "min_advance_booking").
	// If "min_booking_buffer_before_end_time" is set, the last bookable time is
	// calculated as (<slot end time> - "min_booking_buffer_before_end_time").
	// Note that the value of "min_booking_buffer_before_end_time" must be
	// positive if set.
	// If both are unset, the slot is bookable until the slot begin time.
	//
	// Examples:
	//  * A haircut that needs to be booked at least 1 hour before the start time.
	//      'scheduling_rules{ min_advance_booking: 3600 ...}`
	//
	//  * A museum where the last ticket can be purchased 30 mins before closing:
	//     'scheduling_rules{ min_booking_buffer_before_end_time: 1800 ...}'
	//
	//  * A movie ticket that needs to be purchased before the start time.
	//        'scheduling_rules{ ...}' (leave this field empty)
	// (optional)
	//
	// Types that are valid to be assigned to MinBookingBuffer:
	//	*SchedulingRules_MinAdvanceBooking
	//	*SchedulingRules_MinBookingBufferBeforeEndTime
	MinBookingBuffer isSchedulingRules_MinBookingBuffer `protobuf_oneof:"min_booking_buffer"`
	// 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" 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" json:"late_cancellation_fee,omitempty"`
	// The fee for no-show without canceling.
	NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee" json:"noshow_fee,omitempty"`
	// The admission policy that applied to this service. If unset, defaults to
	// TIME_STRICT. (optional)
	AdmissionPolicy SchedulingRules_AdmissionPolicy `protobuf:"varint,5,opt,name=admission_policy,json=admissionPolicy,enum=maps.booking.feeds.SchedulingRules_AdmissionPolicy" json:"admission_policy,omitempty"`
}

func (m *SchedulingRules) Reset()                    { *m = SchedulingRules{} }
func (m *SchedulingRules) String() string            { return proto.CompactTextString(m) }
func (*SchedulingRules) ProtoMessage()               {}
func (*SchedulingRules) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }

type isSchedulingRules_MinBookingBuffer interface {
	isSchedulingRules_MinBookingBuffer()
}

type SchedulingRules_MinAdvanceBooking struct {
	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,oneof"`
}
type SchedulingRules_MinBookingBufferBeforeEndTime struct {
	MinBookingBufferBeforeEndTime int64 `protobuf:"varint,6,opt,name=min_booking_buffer_before_end_time,json=minBookingBufferBeforeEndTime,oneof"`
}

func (*SchedulingRules_MinAdvanceBooking) isSchedulingRules_MinBookingBuffer()             {}
func (*SchedulingRules_MinBookingBufferBeforeEndTime) isSchedulingRules_MinBookingBuffer() {}

func (m *SchedulingRules) GetMinBookingBuffer() isSchedulingRules_MinBookingBuffer {
	if m != nil {
		return m.MinBookingBuffer
	}
	return nil
}

func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinAdvanceBooking); ok {
		return x.MinAdvanceBooking
	}
	return 0
}

func (m *SchedulingRules) GetMinBookingBufferBeforeEndTime() int64 {
	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinBookingBufferBeforeEndTime); ok {
		return x.MinBookingBufferBeforeEndTime
	}
	return 0
}

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

func (m *SchedulingRules) GetLateCancellationFee() *Price {
	if m != nil {
		return m.LateCancellationFee
	}
	return nil
}

func (m *SchedulingRules) GetNoshowFee() *Price {
	if m != nil {
		return m.NoshowFee
	}
	return nil
}

func (m *SchedulingRules) GetAdmissionPolicy() SchedulingRules_AdmissionPolicy {
	if m != nil {
		return m.AdmissionPolicy
	}
	return SchedulingRules_ADMISSION_POLICY_UNSPECIFIED
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*SchedulingRules) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _SchedulingRules_OneofMarshaler, _SchedulingRules_OneofUnmarshaler, _SchedulingRules_OneofSizer, []interface{}{
		(*SchedulingRules_MinAdvanceBooking)(nil),
		(*SchedulingRules_MinBookingBufferBeforeEndTime)(nil),
	}
}

func _SchedulingRules_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*SchedulingRules)
	// min_booking_buffer
	switch x := m.MinBookingBuffer.(type) {
	case *SchedulingRules_MinAdvanceBooking:
		b.EncodeVarint(1<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.MinAdvanceBooking))
	case *SchedulingRules_MinBookingBufferBeforeEndTime:
		b.EncodeVarint(6<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.MinBookingBufferBeforeEndTime))
	case nil:
	default:
		return fmt.Errorf("SchedulingRules.MinBookingBuffer has unexpected type %T", x)
	}
	return nil
}

func _SchedulingRules_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*SchedulingRules)
	switch tag {
	case 1: // min_booking_buffer.min_advance_booking
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.MinBookingBuffer = &SchedulingRules_MinAdvanceBooking{int64(x)}
		return true, err
	case 6: // min_booking_buffer.min_booking_buffer_before_end_time
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.MinBookingBuffer = &SchedulingRules_MinBookingBufferBeforeEndTime{int64(x)}
		return true, err
	default:
		return false, nil
	}
}

func _SchedulingRules_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*SchedulingRules)
	// min_booking_buffer
	switch x := m.MinBookingBuffer.(type) {
	case *SchedulingRules_MinAdvanceBooking:
		n += proto.SizeVarint(1<<3 | proto.WireVarint)
		n += proto.SizeVarint(uint64(x.MinAdvanceBooking))
	case *SchedulingRules_MinBookingBufferBeforeEndTime:
		n += proto.SizeVarint(6<<3 | proto.WireVarint)
		n += proto.SizeVarint(uint64(x.MinBookingBufferBeforeEndTime))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// 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" json:"micro_percent,omitempty"`
}

func (m *TaxRate) Reset()                    { *m = TaxRate{} }
func (m *TaxRate) String() string            { return proto.CompactTextString(m) }
func (*TaxRate) ProtoMessage()               {}
func (*TaxRate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }

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 {
	// A string from an aggregator partner which uniquely identifies a form field.
	// This id should be the same as the id in the corresponding form field
	// answer. (required)
	Id string `protobuf:"bytes,5,opt,name=id" json:"id,omitempty"`
	// The type of this field. (required)
	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,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" json:"label,omitempty"`
	// For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate.
	// (optional)
	Value []string `protobuf:"bytes,3,rep,name=value" 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" json:"is_required,omitempty"`
}

func (m *ServiceIntakeFormField) Reset()                    { *m = ServiceIntakeFormField{} }
func (m *ServiceIntakeFormField) String() string            { return proto.CompactTextString(m) }
func (*ServiceIntakeFormField) ProtoMessage()               {}
func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }

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

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" json:"field,omitempty"`
	// If true, this form will be shown to first time customers.
	// Deprecated. This functionality is not supported for intake forms.
	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers" json:"first_time_customers,omitempty"`
	// If true, this form will be shown to repeat customers.
	// Deprecated. This functionality is not supported for intake forms.
	ReturningCustomers bool `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers" json:"returning_customers,omitempty"`
}

func (m *ServiceIntakeForm) Reset()                    { *m = ServiceIntakeForm{} }
func (m *ServiceIntakeForm) String() string            { return proto.CompactTextString(m) }
func (*ServiceIntakeForm) ProtoMessage()               {}
func (*ServiceIntakeForm) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }

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" json:"deposit,omitempty"`
	// Minimum advance cancellation for the deposit.
	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec" 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,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
}

func (m *Deposit) Reset()                    { *m = Deposit{} }
func (m *Deposit) String() string            { return proto.CompactTextString(m) }
func (*Deposit) ProtoMessage()               {}
func (*Deposit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }

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" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
}

func (m *NoShowFee) Reset()                    { *m = NoShowFee{} }
func (m *NoShowFee) String() string            { return proto.CompactTextString(m) }
func (*NoShowFee) ProtoMessage()               {}
func (*NoShowFee) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }

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" 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" 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" 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,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
}

func (m *ActionLink) Reset()                    { *m = ActionLink{} }
func (m *ActionLink) String() string            { return proto.CompactTextString(m) }
func (*ActionLink) ProtoMessage()               {}
func (*ActionLink) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }

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" 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" 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" json:"price,omitempty"`
}

func (m *TicketType) Reset()                    { *m = TicketType{} }
func (m *TicketType) String() string            { return proto.CompactTextString(m) }
func (*TicketType) ProtoMessage()               {}
func (*TicketType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }

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. Google will crawl the media hosted at this URL.
	Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
	// Type of this media source.
	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
	// Caption of the media, only plain text is supported. Any HTML components
	// will be stripped. (optional)
	Caption string `protobuf:"bytes,3,opt,name=caption" json:"caption,omitempty"`
	// Attribution information about the source of the media. Note that if
	// the attribution is required to display with the media to give credit to
	// photographer or agency, this field must be set. (optional)
	Attribution *RelatedMedia_Attribution `protobuf:"bytes,4,opt,name=attribution" json:"attribution,omitempty"`
}

func (m *RelatedMedia) Reset()                    { *m = RelatedMedia{} }
func (m *RelatedMedia) String() string            { return proto.CompactTextString(m) }
func (*RelatedMedia) ProtoMessage()               {}
func (*RelatedMedia) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }

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 ""
}

func (m *RelatedMedia) GetAttribution() *RelatedMedia_Attribution {
	if m != nil {
		return m.Attribution
	}
	return nil
}

// Attribution information for this media.
type RelatedMedia_Attribution struct {
	// The text to give credit to the photographer or agency. This text will be
	// displayed together with the source media. Note that only plain text is
	// supported for this field, any HTML components will be stripped (hyperlink
	// based attribution is not supported).
	Text string `protobuf:"bytes,1,opt,name=text" json:"text,omitempty"`
}

func (m *RelatedMedia_Attribution) Reset()                    { *m = RelatedMedia_Attribution{} }
func (m *RelatedMedia_Attribution) String() string            { return proto.CompactTextString(m) }
func (*RelatedMedia_Attribution) ProtoMessage()               {}
func (*RelatedMedia_Attribution) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17, 0} }

func (m *RelatedMedia_Attribution) GetText() string {
	if m != nil {
		return m.Text
	}
	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" 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" json:"value_id,omitempty"`
}

func (m *ServiceAttributeValueId) Reset()                    { *m = ServiceAttributeValueId{} }
func (m *ServiceAttributeValueId) String() string            { return proto.CompactTextString(m) }
func (*ServiceAttributeValueId) ProtoMessage()               {}
func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }

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

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

// Rules related to joining the waitlist.
type WaitlistRules struct {
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize" json:"min_party_size,omitempty"`
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize" json:"max_party_size,omitempty"`
	// If true, the user will be able to send a free-form additional text request
	// when joining the waitlist for this service.
	SupportsAdditionalRequest bool `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest" json:"supports_additional_request,omitempty"`
}

func (m *WaitlistRules) Reset()                    { *m = WaitlistRules{} }
func (m *WaitlistRules) String() string            { return proto.CompactTextString(m) }
func (*WaitlistRules) ProtoMessage()               {}
func (*WaitlistRules) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }

func (m *WaitlistRules) GetMinPartySize() int32 {
	if m != nil {
		return m.MinPartySize
	}
	return 0
}

func (m *WaitlistRules) GetMaxPartySize() int32 {
	if m != nil {
		return m.MaxPartySize
	}
	return 0
}

func (m *WaitlistRules) GetSupportsAdditionalRequest() bool {
	if m != nil {
		return m.SupportsAdditionalRequest
	}
	return false
}

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((*Availability_SchedulingRuleOverrides)(nil), "maps.booking.feeds.Availability.SchedulingRuleOverrides")
	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((*RelatedMedia_Attribution)(nil), "maps.booking.feeds.RelatedMedia.Attribution")
	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
	proto.RegisterType((*WaitlistRules)(nil), "maps.booking.feeds.WaitlistRules")
	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.SchedulingRules_AdmissionPolicy", SchedulingRules_AdmissionPolicy_name, SchedulingRules_AdmissionPolicy_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("github.com/maps-booking-v3/feeds/feeds.proto", fileDescriptor0) }

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