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

package maps_booking_feeds

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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.ProtoPackageIsVersion3 // please upgrade the proto package

// Describes how a Price should be interpreted and displayed to the user.
type PriceInterpretation int32

const (
	// Price interpretation unspecified, defaults to EXACT_AMOUNT.
	PriceInterpretation_PRICE_INTERPRETATION_UNSPECIFIED PriceInterpretation = 0
	// When the price should be interpreted as a specific value.
	//
	// Examples:
	//   $20 for a yoga class; $15 for a child haircut
	PriceInterpretation_EXACT_AMOUNT PriceInterpretation = 1
	// When the price of a service is variable but a minimum price is known and
	// displayed to consumers. Consumers may make choices which increase the
	// price.
	//
	// Note that any service that uses this PriceInterpretation must use
	// PrepaymentType NOT_SUPPORTED.
	//
	// Examples:
	//   $30 for dog grooming, but additional consumer choices may increase the
	//   price
	PriceInterpretation_STARTS_AT PriceInterpretation = 2
	// When the price of a service is variable and no price information is
	// displayed to consumers ahead of time.
	//
	// Note that any service that uses this PriceInterpretation must use
	// PrepaymentType NOT_SUPPORTED and Price must be empty.
	//
	// Examples:
	//   A consultation for a home service
	PriceInterpretation_NOT_DISPLAYED PriceInterpretation = 3
)

var PriceInterpretation_name = map[int32]string{
	0: "PRICE_INTERPRETATION_UNSPECIFIED",
	1: "EXACT_AMOUNT",
	2: "STARTS_AT",
	3: "NOT_DISPLAYED",
}

var PriceInterpretation_value = map[string]int32{
	"PRICE_INTERPRETATION_UNSPECIFIED": 0,
	"EXACT_AMOUNT":                     1,
	"STARTS_AT":                        2,
	"NOT_DISPLAYED":                    3,
}

func (x PriceInterpretation) String() string {
	return proto.EnumName(PriceInterpretation_name, int32(x))
}

func (PriceInterpretation) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
}

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

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

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

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

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}

func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
}

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

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

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

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

func (x RequireCreditCard) String() string {
	return proto.EnumName(RequireCreditCard_name, int32(x))
}

func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
}

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

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

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

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

func (x ActionPlatform) String() string {
	return proto.EnumName(ActionPlatform_name, int32(x))
}

func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3}
}

type FeedMetadata_ProcessingInstruction int32

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

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

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

func (x FeedMetadata_ProcessingInstruction) String() string {
	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
}

func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0, 0}
}

// The confirmation modes used when booking availabilities.
type Availability_ConfirmationMode int32

const (
	// The confirmation mode was not specified.
	// Synchronous confirmation will be assumed.
	Availability_CONFIRMATION_MODE_UNSPECIFIED Availability_ConfirmationMode = 0
	// Bookings for this availability will be confirmed synchronously.
	Availability_CONFIRMATION_MODE_SYNCHRONOUS Availability_ConfirmationMode = 1
	// Bookings for this availability will be confirmed asynchronously.
	Availability_CONFIRMATION_MODE_ASYNCHRONOUS Availability_ConfirmationMode = 2
)

var Availability_ConfirmationMode_name = map[int32]string{
	0: "CONFIRMATION_MODE_UNSPECIFIED",
	1: "CONFIRMATION_MODE_SYNCHRONOUS",
	2: "CONFIRMATION_MODE_ASYNCHRONOUS",
}

var Availability_ConfirmationMode_value = map[string]int32{
	"CONFIRMATION_MODE_UNSPECIFIED":  0,
	"CONFIRMATION_MODE_SYNCHRONOUS":  1,
	"CONFIRMATION_MODE_ASYNCHRONOUS": 2,
}

func (x Availability_ConfirmationMode) String() string {
	return proto.EnumName(Availability_ConfirmationMode_name, int32(x))
}

func (Availability_ConfirmationMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 0}
}

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

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

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

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

func (x Service_PrepaymentType) String() string {
	return proto.EnumName(Service_PrepaymentType_name, int32(x))
}

func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 0}
}

type Service_ServiceType int32

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

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

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

func (x Service_ServiceType) String() string {
	return proto.EnumName(Service_ServiceType_name, int32(x))
}

func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []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 fileDescriptor_7aa923a38d4cd9d3, []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 fileDescriptor_7aa923a38d4cd9d3, []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 fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
}

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

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

func (m *FeedMetadata) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FeedMetadata.Unmarshal(m, b)
}
func (m *FeedMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FeedMetadata.Marshal(b, m, deterministic)
}
func (m *FeedMetadata) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FeedMetadata.Merge(m, src)
}
func (m *FeedMetadata) XXX_Size() int {
	return xxx_messageInfo_FeedMetadata.Size(m)
}
func (m *FeedMetadata) XXX_DiscardUnknown() {
	xxx_messageInfo_FeedMetadata.DiscardUnknown(m)
}

var xxx_messageInfo_FeedMetadata proto.InternalMessageInfo

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

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

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

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

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

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

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

func (m *AvailabilityFeed) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AvailabilityFeed.Unmarshal(m, b)
}
func (m *AvailabilityFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AvailabilityFeed.Marshal(b, m, deterministic)
}
func (m *AvailabilityFeed) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AvailabilityFeed.Merge(m, src)
}
func (m *AvailabilityFeed) XXX_Size() int {
	return xxx_messageInfo_AvailabilityFeed.Size(m)
}
func (m *AvailabilityFeed) XXX_DiscardUnknown() {
	xxx_messageInfo_AvailabilityFeed.DiscardUnknown(m)
}

var xxx_messageInfo_AvailabilityFeed proto.InternalMessageInfo

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

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

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

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

func (m *ServiceAvailability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceAvailability.Unmarshal(m, b)
}
func (m *ServiceAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceAvailability.Marshal(b, m, deterministic)
}
func (m *ServiceAvailability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceAvailability.Merge(m, src)
}
func (m *ServiceAvailability) XXX_Size() int {
	return xxx_messageInfo_ServiceAvailability.Size(m)
}
func (m *ServiceAvailability) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceAvailability.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceAvailability proto.InternalMessageInfo

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

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

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

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

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

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

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

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

func (m *Availability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability.Unmarshal(m, b)
}
func (m *Availability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability.Marshal(b, m, deterministic)
}
func (m *Availability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability.Merge(m, src)
}
func (m *Availability) XXX_Size() int {
	return xxx_messageInfo_Availability.Size(m)
}
func (m *Availability) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability.DiscardUnknown(m)
}

var xxx_messageInfo_Availability proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

func (m *Availability) GetSchedulingRuleOverrides() *Availability_SchedulingRuleOverrides {
	if m != nil {
		return m.SchedulingRuleOverrides
	}
	return nil
}

func (m *Availability) GetConfirmationMode() Availability_ConfirmationMode {
	if m != nil {
		return m.ConfirmationMode
	}
	return Availability_CONFIRMATION_MODE_UNSPECIFIED
}

// 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.
//   3. Recurrences should not last for more than 24 hours.
type Availability_Recurrence struct {
	// The inclusive maximum UTC timestamp the availability repeats until.
	// (required)
	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"`
	// Defines the time between successive availability slots.
	//
	// Example: An availability with a duration of 20 min, a repeat_every_sec of
	// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
	// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
	// 11-11:20am. (required)
	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

func (m *Availability_Recurrence) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability_Recurrence.Unmarshal(m, b)
}
func (m *Availability_Recurrence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability_Recurrence.Marshal(b, m, deterministic)
}
func (m *Availability_Recurrence) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability_Recurrence.Merge(m, src)
}
func (m *Availability_Recurrence) XXX_Size() int {
	return xxx_messageInfo_Availability_Recurrence.Size(m)
}
func (m *Availability_Recurrence) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability_Recurrence.DiscardUnknown(m)
}

var xxx_messageInfo_Availability_Recurrence proto.InternalMessageInfo

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

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

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

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

func (m *Availability_ScheduleException) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability_ScheduleException.Unmarshal(m, b)
}
func (m *Availability_ScheduleException) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability_ScheduleException.Marshal(b, m, deterministic)
}
func (m *Availability_ScheduleException) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability_ScheduleException.Merge(m, src)
}
func (m *Availability_ScheduleException) XXX_Size() int {
	return xxx_messageInfo_Availability_ScheduleException.Size(m)
}
func (m *Availability_ScheduleException) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability_ScheduleException.DiscardUnknown(m)
}

var xxx_messageInfo_Availability_ScheduleException proto.InternalMessageInfo

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

// 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,proto3" json:"last_bookable_sec,omitempty"`
	// The first time (in seconds) that this slot is able to be booked.
	FirstBookableSec     int64    `protobuf:"varint,2,opt,name=first_bookable_sec,json=firstBookableSec,proto3" json:"first_bookable_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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 fileDescriptor_7aa923a38d4cd9d3, []int{3, 2}
}

func (m *Availability_SchedulingRuleOverrides) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Availability_SchedulingRuleOverrides.Unmarshal(m, b)
}
func (m *Availability_SchedulingRuleOverrides) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Availability_SchedulingRuleOverrides.Marshal(b, m, deterministic)
}
func (m *Availability_SchedulingRuleOverrides) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Availability_SchedulingRuleOverrides.Merge(m, src)
}
func (m *Availability_SchedulingRuleOverrides) XXX_Size() int {
	return xxx_messageInfo_Availability_SchedulingRuleOverrides.Size(m)
}
func (m *Availability_SchedulingRuleOverrides) XXX_DiscardUnknown() {
	xxx_messageInfo_Availability_SchedulingRuleOverrides.DiscardUnknown(m)
}

var xxx_messageInfo_Availability_SchedulingRuleOverrides proto.InternalMessageInfo

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

func (m *Availability_SchedulingRuleOverrides) GetFirstBookableSec() int64 {
	if m != nil {
		return m.FirstBookableSec
	}
	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,proto3" json:"staff_id,omitempty"`
	// Optional name of a staff member providing the service. This field will be
	// displayed to users making a booking, and should be human readable, as
	// opposed to an opaque identifier.
	// This field must be present if staff_id is present.
	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"`
	// An optional id for the room the service is located in. This field
	// identifies the room across all merchants, services, and availability
	// records. It also needs to be stable over time to allow correlation with
	// past bookings.
	// This field must be present if room_name is present.
	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// An optional name for the room the service is located in. This
	// field will be displayed to users making a booking, and should be human
	// readable, as opposed to an opaque identifier.
	// This field must be present if room_id is present.
	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"`
	// Applicable only for Dining: The party size which can be accommodated
	// during this time slot. A restaurant can be associated with multiple Slots
	// for the same time, each specifying a different party_size, if for instance
	// 2, 3, or 4 people can be seated with a reservation.
	PartySize            int32    `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

func (m *Resources) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Resources.Unmarshal(m, b)
}
func (m *Resources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Resources.Marshal(b, m, deterministic)
}
func (m *Resources) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Resources.Merge(m, src)
}
func (m *Resources) XXX_Size() int {
	return xxx_messageInfo_Resources.Size(m)
}
func (m *Resources) XXX_DiscardUnknown() {
	xxx_messageInfo_Resources.DiscardUnknown(m)
}

var xxx_messageInfo_Resources proto.InternalMessageInfo

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

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

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

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

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

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

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

func (m *TimeRange) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TimeRange.Unmarshal(m, b)
}
func (m *TimeRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TimeRange.Marshal(b, m, deterministic)
}
func (m *TimeRange) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TimeRange.Merge(m, src)
}
func (m *TimeRange) XXX_Size() int {
	return xxx_messageInfo_TimeRange.Size(m)
}
func (m *TimeRange) XXX_DiscardUnknown() {
	xxx_messageInfo_TimeRange.DiscardUnknown(m)
}

var xxx_messageInfo_TimeRange proto.InternalMessageInfo

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

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

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

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

func (m *ServiceFeed) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceFeed.Unmarshal(m, b)
}
func (m *ServiceFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceFeed.Marshal(b, m, deterministic)
}
func (m *ServiceFeed) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceFeed.Merge(m, src)
}
func (m *ServiceFeed) XXX_Size() int {
	return xxx_messageInfo_ServiceFeed.Size(m)
}
func (m *ServiceFeed) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceFeed.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceFeed proto.InternalMessageInfo

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

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

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

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

func (m *Service) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Service.Unmarshal(m, b)
}
func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Service.Marshal(b, m, deterministic)
}
func (m *Service) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Service.Merge(m, src)
}
func (m *Service) XXX_Size() int {
	return xxx_messageInfo_Service.Size(m)
}
func (m *Service) XXX_DiscardUnknown() {
	xxx_messageInfo_Service.DiscardUnknown(m)
}

var xxx_messageInfo_Service proto.InternalMessageInfo

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

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

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

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

func (m *Service) GetPriceInterpretation() PriceInterpretation {
	if m != nil {
		return m.PriceInterpretation
	}
	return PriceInterpretation_PRICE_INTERPRETATION_UNSPECIFIED
}

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
}

// Deprecated: Do not use.
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,proto3" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217. (required)
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// An optional and opaque string that identifies the pricing option that is
	// associated with the extended price. (optional)
	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

func (m *Price) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Price.Unmarshal(m, b)
}
func (m *Price) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Price.Marshal(b, m, deterministic)
}
func (m *Price) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Price.Merge(m, src)
}
func (m *Price) XXX_Size() int {
	return xxx_messageInfo_Price.Size(m)
}
func (m *Price) XXX_DiscardUnknown() {
	xxx_messageInfo_Price.DiscardUnknown(m)
}

var xxx_messageInfo_Price proto.InternalMessageInfo

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

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

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

// The scheduling rules for a service.
type SchedulingRules struct {
	// The 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,proto3" json:"min_advance_online_canceling,omitempty"`
	// The fee for canceling within the minimum advance notice period.
	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
	// The fee for no-show without canceling.
	NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
	// 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,proto3,enum=maps.booking.feeds.SchedulingRules_AdmissionPolicy" json:"admission_policy,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

func (m *SchedulingRules) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SchedulingRules.Unmarshal(m, b)
}
func (m *SchedulingRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SchedulingRules.Marshal(b, m, deterministic)
}
func (m *SchedulingRules) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SchedulingRules.Merge(m, src)
}
func (m *SchedulingRules) XXX_Size() int {
	return xxx_messageInfo_SchedulingRules.Size(m)
}
func (m *SchedulingRules) XXX_DiscardUnknown() {
	xxx_messageInfo_SchedulingRules.DiscardUnknown(m)
}

var xxx_messageInfo_SchedulingRules proto.InternalMessageInfo

type isSchedulingRules_MinBookingBuffer interface {
	isSchedulingRules_MinBookingBuffer()
}

type SchedulingRules_MinAdvanceBooking struct {
	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3,oneof"`
}

type SchedulingRules_MinBookingBufferBeforeEndTime struct {
	MinBookingBufferBeforeEndTime int64 `protobuf:"varint,6,opt,name=min_booking_buffer_before_end_time,json=minBookingBufferBeforeEndTime,proto3,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
}

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*SchedulingRules) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*SchedulingRules_MinAdvanceBooking)(nil),
		(*SchedulingRules_MinBookingBufferBeforeEndTime)(nil),
	}
}

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

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

func (m *TaxRate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TaxRate.Unmarshal(m, b)
}
func (m *TaxRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TaxRate.Marshal(b, m, deterministic)
}
func (m *TaxRate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TaxRate.Merge(m, src)
}
func (m *TaxRate) XXX_Size() int {
	return xxx_messageInfo_TaxRate.Size(m)
}
func (m *TaxRate) XXX_DiscardUnknown() {
	xxx_messageInfo_TaxRate.DiscardUnknown(m)
}

var xxx_messageInfo_TaxRate proto.InternalMessageInfo

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

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

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

func (m *ServiceIntakeFormField) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceIntakeFormField.Unmarshal(m, b)
}
func (m *ServiceIntakeFormField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceIntakeFormField.Marshal(b, m, deterministic)
}
func (m *ServiceIntakeFormField) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceIntakeFormField.Merge(m, src)
}
func (m *ServiceIntakeFormField) XXX_Size() int {
	return xxx_messageInfo_ServiceIntakeFormField.Size(m)
}
func (m *ServiceIntakeFormField) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceIntakeFormField.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo

func (m *ServiceIntakeFormField) 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,proto3" 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,proto3" json:"first_time_customers,omitempty"` // Deprecated: Do not use.
	// 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,proto3" json:"returning_customers,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

func (m *ServiceIntakeForm) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceIntakeForm.Unmarshal(m, b)
}
func (m *ServiceIntakeForm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceIntakeForm.Marshal(b, m, deterministic)
}
func (m *ServiceIntakeForm) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceIntakeForm.Merge(m, src)
}
func (m *ServiceIntakeForm) XXX_Size() int {
	return xxx_messageInfo_ServiceIntakeForm.Size(m)
}
func (m *ServiceIntakeForm) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceIntakeForm.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceIntakeForm proto.InternalMessageInfo

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

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
	if m != nil {
		return m.FirstTimeCustomers
	}
	return false
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetReturningCustomers() bool {
	if m != nil {
		return m.ReturningCustomers
	}
	return false
}

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

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

func (m *Deposit) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Deposit.Unmarshal(m, b)
}
func (m *Deposit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Deposit.Marshal(b, m, deterministic)
}
func (m *Deposit) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Deposit.Merge(m, src)
}
func (m *Deposit) XXX_Size() int {
	return xxx_messageInfo_Deposit.Size(m)
}
func (m *Deposit) XXX_DiscardUnknown() {
	xxx_messageInfo_Deposit.DiscardUnknown(m)
}

var xxx_messageInfo_Deposit proto.InternalMessageInfo

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

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

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

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

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

func (m *NoShowFee) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NoShowFee.Unmarshal(m, b)
}
func (m *NoShowFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NoShowFee.Marshal(b, m, deterministic)
}
func (m *NoShowFee) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NoShowFee.Merge(m, src)
}
func (m *NoShowFee) XXX_Size() int {
	return xxx_messageInfo_NoShowFee.Size(m)
}
func (m *NoShowFee) XXX_DiscardUnknown() {
	xxx_messageInfo_NoShowFee.DiscardUnknown(m)
}

var xxx_messageInfo_NoShowFee proto.InternalMessageInfo

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

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

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

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

func (m *ActionLink) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ActionLink.Unmarshal(m, b)
}
func (m *ActionLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ActionLink.Marshal(b, m, deterministic)
}
func (m *ActionLink) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ActionLink.Merge(m, src)
}
func (m *ActionLink) XXX_Size() int {
	return xxx_messageInfo_ActionLink.Size(m)
}
func (m *ActionLink) XXX_DiscardUnknown() {
	xxx_messageInfo_ActionLink.DiscardUnknown(m)
}

var xxx_messageInfo_ActionLink proto.InternalMessageInfo

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

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

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

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

// TicketType is used to differentiate among tickets with different prices
// and/or availabilities due to different user types, different
// service attributes, or different options/add-ons.
//
// A ticket is the minimal bookable unit to a service, e.g. a spot on a rafting
// trip, an admission to a museum, a full day double kayak rental.
type TicketType struct {
	// The ticket id is used to differentiate among different ticket types of the
	// same service, and is only expected to be unique within a service.
	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// A short description to this TicketType.
	//
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	// Required, each ticket type should have a description to be user visible.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// Description of any additional option which this ticket type represents, if
	// any.
	//
	// This is useful when the ticket type represents multiple dimensions.
	//
	// Example 1: an admission ticket with different types 'adult', 'child' and
	// language as an additional option, the expected TicketType list would be:
	//     - { ticket_type_id: "ticket_type_1" short_description: "adult"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "adult"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "child"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "child"
	//         option_description: "spanish" }
	//
	// Example 2: an multi-hour kayak rental with optional dry bag add-on, the
	// short_description could be "3 hours" and the option_description could be
	// either "with dry bag" or "without dry bag":
	//     - { ticket_type_id: "ticket_type_1" short_description: "2 hours"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "3 hours"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "2 hours"
	//          option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "3 hours"
	//          option_description: "spanish" }
	//
	// Optional, but if any ticket type within the service has this field set, we
	// expect all other ticket types to have this field set as well (a default
	// option_description could be used). E.g.
	// [{ticket_type_1, adult, english}, {ticket_type_1, adult, ''}] is not a
	// valid list.
	OptionDescription    string   `protobuf:"bytes,4,opt,name=option_description,json=optionDescription,proto3" json:"option_description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

func (m *TicketType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TicketType.Unmarshal(m, b)
}
func (m *TicketType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TicketType.Marshal(b, m, deterministic)
}
func (m *TicketType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TicketType.Merge(m, src)
}
func (m *TicketType) XXX_Size() int {
	return xxx_messageInfo_TicketType.Size(m)
}
func (m *TicketType) XXX_DiscardUnknown() {
	xxx_messageInfo_TicketType.DiscardUnknown(m)
}

var xxx_messageInfo_TicketType proto.InternalMessageInfo

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

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

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

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

// 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,proto3" json:"url,omitempty"`
	// Type of this media source.
	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
	// Caption of the media, only plain text is supported. Any HTML components
	// will be stripped. (optional)
	Caption string `protobuf:"bytes,3,opt,name=caption,proto3" 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,proto3" json:"attribution,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

func (m *RelatedMedia) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RelatedMedia.Unmarshal(m, b)
}
func (m *RelatedMedia) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RelatedMedia.Marshal(b, m, deterministic)
}
func (m *RelatedMedia) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RelatedMedia.Merge(m, src)
}
func (m *RelatedMedia) XXX_Size() int {
	return xxx_messageInfo_RelatedMedia.Size(m)
}
func (m *RelatedMedia) XXX_DiscardUnknown() {
	xxx_messageInfo_RelatedMedia.DiscardUnknown(m)
}

var xxx_messageInfo_RelatedMedia proto.InternalMessageInfo

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

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

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

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,proto3" json:"text,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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 fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
}

func (m *RelatedMedia_Attribution) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RelatedMedia_Attribution.Unmarshal(m, b)
}
func (m *RelatedMedia_Attribution) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RelatedMedia_Attribution.Marshal(b, m, deterministic)
}
func (m *RelatedMedia_Attribution) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RelatedMedia_Attribution.Merge(m, src)
}
func (m *RelatedMedia_Attribution) XXX_Size() int {
	return xxx_messageInfo_RelatedMedia_Attribution.Size(m)
}
func (m *RelatedMedia_Attribution) XXX_DiscardUnknown() {
	xxx_messageInfo_RelatedMedia_Attribution.DiscardUnknown(m)
}

var xxx_messageInfo_RelatedMedia_Attribution proto.InternalMessageInfo

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,proto3" json:"attribute_id,omitempty"`
	// ID of the value for this attribute, e.g. "haircut". Must match a value_id
	// in the service attribute definition.
	ValueId              string   `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

func (m *ServiceAttributeValueId) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServiceAttributeValueId.Unmarshal(m, b)
}
func (m *ServiceAttributeValueId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServiceAttributeValueId.Marshal(b, m, deterministic)
}
func (m *ServiceAttributeValueId) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServiceAttributeValueId.Merge(m, src)
}
func (m *ServiceAttributeValueId) XXX_Size() int {
	return xxx_messageInfo_ServiceAttributeValueId.Size(m)
}
func (m *ServiceAttributeValueId) XXX_DiscardUnknown() {
	xxx_messageInfo_ServiceAttributeValueId.DiscardUnknown(m)
}

var xxx_messageInfo_ServiceAttributeValueId proto.InternalMessageInfo

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

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

// 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,proto3" 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,proto3" 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,proto3" json:"supports_additional_request,omitempty"`
	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
	XXX_unrecognized          []byte   `json:"-"`
	XXX_sizecache             int32    `json:"-"`
}

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

func (m *WaitlistRules) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitlistRules.Unmarshal(m, b)
}
func (m *WaitlistRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitlistRules.Marshal(b, m, deterministic)
}
func (m *WaitlistRules) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitlistRules.Merge(m, src)
}
func (m *WaitlistRules) XXX_Size() int {
	return xxx_messageInfo_WaitlistRules.Size(m)
}
func (m *WaitlistRules) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitlistRules.DiscardUnknown(m)
}

var xxx_messageInfo_WaitlistRules proto.InternalMessageInfo

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.RegisterEnum("maps.booking.feeds.PriceInterpretation", PriceInterpretation_name, PriceInterpretation_value)
	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.Availability_ConfirmationMode", Availability_ConfirmationMode_name, Availability_ConfirmationMode_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)
	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")
}

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

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