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

// Booking partner API protos
package ext_maps_booking_partner_v3

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
)

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

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

// Status of a booking.
//
// Updating booking status does not change the status of the associated payment.
// Prepayment status updates should be done using the PrepaymentStatus enum.
//
// nextID: 6
type BookingStatus int32

const (
	// Not specified.
	BookingStatus_BOOKING_STATUS_UNSPECIFIED BookingStatus = 0
	// Booking has been confirmed
	BookingStatus_CONFIRMED BookingStatus = 1
	// Booking is awaiting confirmation by the merchant before it can transition
	// into CONFIRMED status
	BookingStatus_PENDING_MERCHANT_CONFIRMATION BookingStatus = 2
	// Booking has been canceled on behalf of the user.
	// The merchant can still trigger a manual refund.
	BookingStatus_CANCELED BookingStatus = 3
	// User did not show for the appointment
	BookingStatus_NO_SHOW BookingStatus = 4
	// User did not show for the appointment in violation of the cancellation
	// policy.
	BookingStatus_NO_SHOW_PENALIZED BookingStatus = 5
)

var BookingStatus_name = map[int32]string{
	0: "BOOKING_STATUS_UNSPECIFIED",
	1: "CONFIRMED",
	2: "PENDING_MERCHANT_CONFIRMATION",
	3: "CANCELED",
	4: "NO_SHOW",
	5: "NO_SHOW_PENALIZED",
}

var BookingStatus_value = map[string]int32{
	"BOOKING_STATUS_UNSPECIFIED":    0,
	"CONFIRMED":                     1,
	"PENDING_MERCHANT_CONFIRMATION": 2,
	"CANCELED":                      3,
	"NO_SHOW":                       4,
	"NO_SHOW_PENALIZED":             5,
}

func (x BookingStatus) String() string {
	return proto.EnumName(BookingStatus_name, int32(x))
}

func (BookingStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{0}
}

// Used when booking/order failure cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to
// indicate the type of credit card that was rejected.
type CreditCardType int32

const (
	// Default value. Used if credit card type does not match to one below.
	CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED CreditCardType = 0
	CreditCardType_VISA                         CreditCardType = 1
	CreditCardType_MASTERCARD                   CreditCardType = 2
	CreditCardType_AMERICAN_EXPRESS             CreditCardType = 3
	CreditCardType_DISCOVER                     CreditCardType = 4
)

var CreditCardType_name = map[int32]string{
	0: "CREDIT_CARD_TYPE_UNSPECIFIED",
	1: "VISA",
	2: "MASTERCARD",
	3: "AMERICAN_EXPRESS",
	4: "DISCOVER",
}

var CreditCardType_value = map[string]int32{
	"CREDIT_CARD_TYPE_UNSPECIFIED": 0,
	"VISA":                         1,
	"MASTERCARD":                   2,
	"AMERICAN_EXPRESS":             3,
	"DISCOVER":                     4,
}

func (x CreditCardType) String() string {
	return proto.EnumName(CreditCardType_name, int32(x))
}

func (CreditCardType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{1}
}

type PaymentOptionType int32

const (
	PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED PaymentOptionType = 0
	PaymentOptionType_PAYMENT_OPTION_SINGLE_USE       PaymentOptionType = 1
	PaymentOptionType_PAYMENT_OPTION_MULTI_USE        PaymentOptionType = 2
	PaymentOptionType_PAYMENT_OPTION_UNLIMITED_USE    PaymentOptionType = 3
)

var PaymentOptionType_name = map[int32]string{
	0: "PAYMENT_OPTION_TYPE_UNSPECIFIED",
	1: "PAYMENT_OPTION_SINGLE_USE",
	2: "PAYMENT_OPTION_MULTI_USE",
	3: "PAYMENT_OPTION_UNLIMITED_USE",
}

var PaymentOptionType_value = map[string]int32{
	"PAYMENT_OPTION_TYPE_UNSPECIFIED": 0,
	"PAYMENT_OPTION_SINGLE_USE":       1,
	"PAYMENT_OPTION_MULTI_USE":        2,
	"PAYMENT_OPTION_UNLIMITED_USE":    3,
}

func (x PaymentOptionType) String() string {
	return proto.EnumName(PaymentOptionType_name, int32(x))
}

func (PaymentOptionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{2}
}

// Prepayment status of a booking.
// Updating payment status will trigger an update on the payment status of the
// associated booking (if applicable).
// Currently, the only supported transition is from PREPAYMENT_PROVIDED to
// PREPAYMENT_REFUNDED, which will initiate a non-reversible refund on the
// associated payment transaction.
type PrepaymentStatus int32

const (
	// Not specified, defaults to PREPAYMENT_NOT_PROVIDED.
	PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED PrepaymentStatus = 0
	// The fee for the booking has been paid in advance.
	PrepaymentStatus_PREPAYMENT_PROVIDED PrepaymentStatus = 1
	// The fee for the booking has not been paid in advance.
	PrepaymentStatus_PREPAYMENT_NOT_PROVIDED PrepaymentStatus = 2
	// The fee was previously PREPAYMENT_PROVIDED but has now been refunded.
	PrepaymentStatus_PREPAYMENT_REFUNDED PrepaymentStatus = 3
	// The fee was previously PREPAYMENT_PROVIDED but now has been credited
	// (user given a UserPaymentOption as a voucher for the booking).
	// If this is set, the response should also include the updated
	// UserPaymentOption.
	PrepaymentStatus_PREPAYMENT_CREDITED PrepaymentStatus = 4
)

var PrepaymentStatus_name = map[int32]string{
	0: "PREPAYMENT_STATUS_UNSPECIFIED",
	1: "PREPAYMENT_PROVIDED",
	2: "PREPAYMENT_NOT_PROVIDED",
	3: "PREPAYMENT_REFUNDED",
	4: "PREPAYMENT_CREDITED",
}

var PrepaymentStatus_value = map[string]int32{
	"PREPAYMENT_STATUS_UNSPECIFIED": 0,
	"PREPAYMENT_PROVIDED":           1,
	"PREPAYMENT_NOT_PROVIDED":       2,
	"PREPAYMENT_REFUNDED":           3,
	"PREPAYMENT_CREDITED":           4,
}

func (x PrepaymentStatus) String() string {
	return proto.EnumName(PrepaymentStatus_name, int32(x))
}

func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{3}
}

// 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_1820d8e1a9fad753, []int{4}
}

// This enum indicates what requirements exist for the user to acknowledge or
// view the requested slots duration/end time.
type CheckAvailabilityResponse_DurationRequirement int32

const (
	// The handling of the end time is not specified. This is the default.
	CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED CheckAvailabilityResponse_DurationRequirement = 0
	// The end time is not shown to the user.
	CheckAvailabilityResponse_DO_NOT_SHOW_DURATION CheckAvailabilityResponse_DurationRequirement = 1
	// The end time has to be shown to the user before an appointment can be
	// made.
	CheckAvailabilityResponse_MUST_SHOW_DURATION CheckAvailabilityResponse_DurationRequirement = 2
)

var CheckAvailabilityResponse_DurationRequirement_name = map[int32]string{
	0: "DURATION_REQUIREMENT_UNSPECIFIED",
	1: "DO_NOT_SHOW_DURATION",
	2: "MUST_SHOW_DURATION",
}

var CheckAvailabilityResponse_DurationRequirement_value = map[string]int32{
	"DURATION_REQUIREMENT_UNSPECIFIED": 0,
	"DO_NOT_SHOW_DURATION":             1,
	"MUST_SHOW_DURATION":               2,
}

func (x CheckAvailabilityResponse_DurationRequirement) String() string {
	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
}

func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{1, 0}
}

type BookingFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	BookingFailure_CAUSE_UNSPECIFIED BookingFailure_Cause = 0
	// The referenced availability slot is not available any longer.
	BookingFailure_SLOT_UNAVAILABLE BookingFailure_Cause = 1
	// The user has already booked an appointment for the referenced
	// availability slot.
	BookingFailure_SLOT_ALREADY_BOOKED_BY_USER BookingFailure_Cause = 2
	// The lease (if provided) has expired and cannot be used any longer to
	// complete the requested booking.
	BookingFailure_LEASE_EXPIRED BookingFailure_Cause = 3
	// The requested cancellation cannot be performed at the current time due
	// to time restrictions in the merchant's cancellation policy.
	BookingFailure_OUTSIDE_CANCELLATION_WINDOW BookingFailure_Cause = 4
	// An error was encountered while processing the payment because the
	// provided credit card type was not accepted by the merchant. The credit
	// card type must be supplied in rejected_card_type.
	BookingFailure_PAYMENT_ERROR_CARD_TYPE_REJECTED BookingFailure_Cause = 5
	// An error was encountered while processing the payment because the
	// provided credit card was declined.
	BookingFailure_PAYMENT_ERROR_CARD_DECLINED BookingFailure_Cause = 6
	// An error was encountered with the pack/membership used to pay for the
	// booking. There could be no valid uses left, it could have expired, etc.
	BookingFailure_PAYMENT_OPTION_NOT_VALID BookingFailure_Cause = 7
	// An error was encountered while processing the payment for this booking.
	// Use this value to indicate a general payment related error, only if the
	// error does not match to a specific payment error above.
	BookingFailure_PAYMENT_ERROR BookingFailure_Cause = 8
	// User cannot use the given payment option (e.g. user trying to use a
	// first time price for the second time).
	BookingFailure_USER_CANNOT_USE_PAYMENT_OPTION BookingFailure_Cause = 9
	// A booking that the user tried to cancel has already been cancelled.
	BookingFailure_BOOKING_ALREADY_CANCELLED BookingFailure_Cause = 10
	// A booking that the user tried to cancel is not cancellable.
	BookingFailure_BOOKING_NOT_CANCELLABLE BookingFailure_Cause = 11
	// User has an existing reservation too close to this time.
	BookingFailure_OVERLAPPING_RESERVATION BookingFailure_Cause = 12
)

var BookingFailure_Cause_name = map[int32]string{
	0:  "CAUSE_UNSPECIFIED",
	1:  "SLOT_UNAVAILABLE",
	2:  "SLOT_ALREADY_BOOKED_BY_USER",
	3:  "LEASE_EXPIRED",
	4:  "OUTSIDE_CANCELLATION_WINDOW",
	5:  "PAYMENT_ERROR_CARD_TYPE_REJECTED",
	6:  "PAYMENT_ERROR_CARD_DECLINED",
	7:  "PAYMENT_OPTION_NOT_VALID",
	8:  "PAYMENT_ERROR",
	9:  "USER_CANNOT_USE_PAYMENT_OPTION",
	10: "BOOKING_ALREADY_CANCELLED",
	11: "BOOKING_NOT_CANCELLABLE",
	12: "OVERLAPPING_RESERVATION",
}

var BookingFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":                0,
	"SLOT_UNAVAILABLE":                 1,
	"SLOT_ALREADY_BOOKED_BY_USER":      2,
	"LEASE_EXPIRED":                    3,
	"OUTSIDE_CANCELLATION_WINDOW":      4,
	"PAYMENT_ERROR_CARD_TYPE_REJECTED": 5,
	"PAYMENT_ERROR_CARD_DECLINED":      6,
	"PAYMENT_OPTION_NOT_VALID":         7,
	"PAYMENT_ERROR":                    8,
	"USER_CANNOT_USE_PAYMENT_OPTION":   9,
	"BOOKING_ALREADY_CANCELLED":        10,
	"BOOKING_NOT_CANCELLABLE":          11,
	"OVERLAPPING_RESERVATION":          12,
}

func (x BookingFailure_Cause) String() string {
	return proto.EnumName(BookingFailure_Cause_name, int32(x))
}

func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{23, 0}
}

type OrderFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	OrderFailure_CAUSE_UNSPECIFIED OrderFailure_Cause = 0
	// The order is no longer fulfillable.
	OrderFailure_ORDER_UNFULFILLABLE OrderFailure_Cause = 1
	// An error was encountered while processing the payment because the
	// provided credit card type was not accepted by the merchant. The credit
	// card type must be supplied in rejected_card_type.
	OrderFailure_PAYMENT_ERROR_CARD_TYPE_REJECTED OrderFailure_Cause = 2
	// An error was encountered while processing the payment because the
	// provided credit card was declined.
	OrderFailure_PAYMENT_ERROR_CARD_DECLINED OrderFailure_Cause = 3
	// An error was encountered while processing the payment for this order.
	// Use this value to indicate a general payment related error, only if the
	// error does not match to a specific payment error above.
	OrderFailure_PAYMENT_ERROR OrderFailure_Cause = 4
)

var OrderFailure_Cause_name = map[int32]string{
	0: "CAUSE_UNSPECIFIED",
	1: "ORDER_UNFULFILLABLE",
	2: "PAYMENT_ERROR_CARD_TYPE_REJECTED",
	3: "PAYMENT_ERROR_CARD_DECLINED",
	4: "PAYMENT_ERROR",
}

var OrderFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":                0,
	"ORDER_UNFULFILLABLE":              1,
	"PAYMENT_ERROR_CARD_TYPE_REJECTED": 2,
	"PAYMENT_ERROR_CARD_DECLINED":      3,
	"PAYMENT_ERROR":                    4,
}

func (x OrderFailure_Cause) String() string {
	return proto.EnumName(OrderFailure_Cause_name, int32(x))
}

func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{26, 0}
}

// The result of an order fulfillability check.
type OrderFulfillability_OrderFulfillabilityResult int32

const (
	// Default value: Don't use.
	OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED OrderFulfillability_OrderFulfillabilityResult = 0
	// The order can be fulfilled.
	OrderFulfillability_CAN_FULFILL OrderFulfillability_OrderFulfillabilityResult = 1
	// The order cannot be fulfilled due to one or more unfulfillable line
	// item(s).
	OrderFulfillability_UNFULFILLABLE_LINE_ITEM OrderFulfillability_OrderFulfillabilityResult = 2
	// The combination of the line items requested cannot be fulfilled.
	OrderFulfillability_UNFULFILLABLE_SERVICE_COMBINATION OrderFulfillability_OrderFulfillabilityResult = 3
	// The order cannot be fulfilled due to reasons that do not fall into the
	// categories above.
	OrderFulfillability_ORDER_UNFULFILLABLE_OTHER_REASON OrderFulfillability_OrderFulfillabilityResult = 4
)

var OrderFulfillability_OrderFulfillabilityResult_name = map[int32]string{
	0: "ORDER_FULFILLABILITY_RESULT_UNSPECIFIED",
	1: "CAN_FULFILL",
	2: "UNFULFILLABLE_LINE_ITEM",
	3: "UNFULFILLABLE_SERVICE_COMBINATION",
	4: "ORDER_UNFULFILLABLE_OTHER_REASON",
}

var OrderFulfillability_OrderFulfillabilityResult_value = map[string]int32{
	"ORDER_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
	"CAN_FULFILL":                       1,
	"UNFULFILLABLE_LINE_ITEM":           2,
	"UNFULFILLABLE_SERVICE_COMBINATION": 3,
	"ORDER_UNFULFILLABLE_OTHER_REASON":  4,
}

func (x OrderFulfillability_OrderFulfillabilityResult) String() string {
	return proto.EnumName(OrderFulfillability_OrderFulfillabilityResult_name, int32(x))
}

func (OrderFulfillability_OrderFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{27, 0}
}

// The result of a line item fulfillability check.
type LineItemFulfillability_ItemFulfillabilityResult int32

const (
	// Default value: Don't use.
	LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED LineItemFulfillability_ItemFulfillabilityResult = 0
	// This line item can be fulfilled.
	LineItemFulfillability_CAN_FULFILL LineItemFulfillability_ItemFulfillabilityResult = 1
	// No adequate availability for the slot requested.
	LineItemFulfillability_SLOT_UNAVAILABLE LineItemFulfillability_ItemFulfillabilityResult = 2
	// Child tickets cannot be booked without an adult ticket.
	LineItemFulfillability_CHILD_TICKETS_WITHOUT_ADULT LineItemFulfillability_ItemFulfillabilityResult = 6
	// The combination of ticket types requested cannot be fulfilled.
	LineItemFulfillability_UNFULFILLABLE_TICKET_COMBINATION LineItemFulfillability_ItemFulfillabilityResult = 3
	// The total price of this line item is not correct.
	LineItemFulfillability_INCORRECT_PRICE LineItemFulfillability_ItemFulfillabilityResult = 4
	// The line item cannot be fulfilled for reasons that do not fall into
	// the categories above.
	LineItemFulfillability_ITEM_UNFULFILLABLE_OTHER_REASON LineItemFulfillability_ItemFulfillabilityResult = 5
)

var LineItemFulfillability_ItemFulfillabilityResult_name = map[int32]string{
	0: "ITEM_FULFILLABILITY_RESULT_UNSPECIFIED",
	1: "CAN_FULFILL",
	2: "SLOT_UNAVAILABLE",
	6: "CHILD_TICKETS_WITHOUT_ADULT",
	3: "UNFULFILLABLE_TICKET_COMBINATION",
	4: "INCORRECT_PRICE",
	5: "ITEM_UNFULFILLABLE_OTHER_REASON",
}

var LineItemFulfillability_ItemFulfillabilityResult_value = map[string]int32{
	"ITEM_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
	"CAN_FULFILL":                            1,
	"SLOT_UNAVAILABLE":                       2,
	"CHILD_TICKETS_WITHOUT_ADULT":            6,
	"UNFULFILLABLE_TICKET_COMBINATION":       3,
	"INCORRECT_PRICE":                        4,
	"ITEM_UNFULFILLABLE_OTHER_REASON":        5,
}

func (x LineItemFulfillability_ItemFulfillabilityResult) String() string {
	return proto.EnumName(LineItemFulfillability_ItemFulfillabilityResult_name, int32(x))
}

func (LineItemFulfillability_ItemFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{28, 0}
}

type PaymentProcessingParameters_PaymentProcessor int32

const (
	PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED PaymentProcessingParameters_PaymentProcessor = 0
	PaymentProcessingParameters_PROCESSOR_STRIPE              PaymentProcessingParameters_PaymentProcessor = 1
	PaymentProcessingParameters_PROCESSOR_BRAINTREE           PaymentProcessingParameters_PaymentProcessor = 2
)

var PaymentProcessingParameters_PaymentProcessor_name = map[int32]string{
	0: "PAYMENT_PROCESSOR_UNSPECIFIED",
	1: "PROCESSOR_STRIPE",
	2: "PROCESSOR_BRAINTREE",
}

var PaymentProcessingParameters_PaymentProcessor_value = map[string]int32{
	"PAYMENT_PROCESSOR_UNSPECIFIED": 0,
	"PROCESSOR_STRIPE":              1,
	"PROCESSOR_BRAINTREE":           2,
}

func (x PaymentProcessingParameters_PaymentProcessor) String() string {
	return proto.EnumName(PaymentProcessingParameters_PaymentProcessor_name, int32(x))
}

func (PaymentProcessingParameters_PaymentProcessor) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{31, 0}
}

// Who handles payment processing?
// If payment is processed by the partner, CreateBooking request will
// include additional parameters (PaymentProcessingParameters) indicating
// the payment method to be used to process the payment.
type PaymentInformation_PaymentProcessedBy int32

const (
	PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED PaymentInformation_PaymentProcessedBy = 0
	PaymentInformation_PROCESSED_BY_GOOGLE              PaymentInformation_PaymentProcessedBy = 1
	PaymentInformation_PROCESSED_BY_PARTNER             PaymentInformation_PaymentProcessedBy = 2
)

var PaymentInformation_PaymentProcessedBy_name = map[int32]string{
	0: "PAYMENT_PROCESSED_BY_UNSPECIFIED",
	1: "PROCESSED_BY_GOOGLE",
	2: "PROCESSED_BY_PARTNER",
}

var PaymentInformation_PaymentProcessedBy_value = map[string]int32{
	"PAYMENT_PROCESSED_BY_UNSPECIFIED": 0,
	"PROCESSED_BY_GOOGLE":              1,
	"PROCESSED_BY_PARTNER":             2,
}

func (x PaymentInformation_PaymentProcessedBy) String() string {
	return proto.EnumName(PaymentInformation_PaymentProcessedBy_name, int32(x))
}

func (PaymentInformation_PaymentProcessedBy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{33, 0}
}

// Request to check availability for a Slot.
type CheckAvailabilityRequest struct {
	// The appointment slot that is being checked (required)
	Slot                 *Slot    `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityRequest proto.InternalMessageInfo

func (m *CheckAvailabilityRequest) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

// Response for the CheckAvailability RPC with the availability of the
// appointment slot.
type CheckAvailabilityResponse struct {
	// The requested slot. (required)
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available. (required)
	CountAvailable int32 `protobuf:"varint,2,opt,name=count_available,json=countAvailable,proto3" json:"count_available,omitempty"`
	// The requirement to show the slots duration and/or endtime. This field will
	// be ignored if the slot is unavailable. (optional)
	DurationRequirement CheckAvailabilityResponse_DurationRequirement `protobuf:"varint,3,opt,name=duration_requirement,json=durationRequirement,proto3,enum=ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement" json:"duration_requirement,omitempty"`
	// Optionally, the partner can return additional updated information about the
	// availability for this merchant if this information is present when
	// responding to the CheckAvailabilityRequest and if there is no negative
	// impact on the CheckAvailability request latency.
	// For instance an entire day of merchant availability for a superset of
	// resources can be returned here.
	AvailabilityUpdate   *AvailabilityUpdate `protobuf:"bytes,4,opt,name=availability_update,json=availabilityUpdate,proto3" json:"availability_update,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityResponse proto.InternalMessageInfo

func (m *CheckAvailabilityResponse) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *CheckAvailabilityResponse) GetCountAvailable() int32 {
	if m != nil {
		return m.CountAvailable
	}
	return 0
}

func (m *CheckAvailabilityResponse) GetDurationRequirement() CheckAvailabilityResponse_DurationRequirement {
	if m != nil {
		return m.DurationRequirement
	}
	return CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED
}

func (m *CheckAvailabilityResponse) GetAvailabilityUpdate() *AvailabilityUpdate {
	if m != nil {
		return m.AvailabilityUpdate
	}
	return nil
}

// An update to one ore more slots indicating that the availability for the
// associated time has potentially changed.
type AvailabilityUpdate struct {
	SlotAvailability     []*SlotAvailability `protobuf:"bytes,1,rep,name=slot_availability,json=slotAvailability,proto3" json:"slot_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_AvailabilityUpdate proto.InternalMessageInfo

func (m *AvailabilityUpdate) GetSlotAvailability() []*SlotAvailability {
	if m != nil {
		return m.SlotAvailability
	}
	return nil
}

// An inventory slot and associated count of open spots.
type SlotAvailability struct {
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available. (required)
	CountAvailable       int32    `protobuf:"varint,2,opt,name=count_available,json=countAvailable,proto3" json:"count_available,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SlotAvailability proto.InternalMessageInfo

func (m *SlotAvailability) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *SlotAvailability) GetCountAvailable() int32 {
	if m != nil {
		return m.CountAvailable
	}
	return 0
}

// Request to check the fulfillability of an order.
type CheckOrderFulfillabilityRequest struct {
	// The merchant that this order is intended for. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// The line items in this order. All services requested must belong to the
	// specified merchant. (required)
	Item                 []*LineItem `protobuf:"bytes,2,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityRequest proto.InternalMessageInfo

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

func (m *CheckOrderFulfillabilityRequest) GetItem() []*LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

// Response for the CheckOrderfulfillabilityRequest.
type CheckOrderFulfillabilityResponse struct {
	// Fulfillability status of the order, potentially contains updated
	// availabilities and prices of the requested line item. (required)
	Fulfillability *OrderFulfillability `protobuf:"bytes,1,opt,name=fulfillability,proto3" json:"fulfillability,omitempty"`
	// Total processing fees & taxes that need to be paid for this order.
	// (required)
	FeesAndTaxes         *Price   `protobuf:"bytes,2,opt,name=fees_and_taxes,json=feesAndTaxes,proto3" json:"fees_and_taxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityResponse proto.InternalMessageInfo

func (m *CheckOrderFulfillabilityResponse) GetFulfillability() *OrderFulfillability {
	if m != nil {
		return m.Fulfillability
	}
	return nil
}

func (m *CheckOrderFulfillabilityResponse) GetFeesAndTaxes() *Price {
	if m != nil {
		return m.FeesAndTaxes
	}
	return nil
}

// Request to get booking status and prepayment status for a Booking.
type GetBookingStatusRequest struct {
	// ID of the existing booking (required)
	BookingId            string   `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBookingStatusRequest proto.InternalMessageInfo

func (m *GetBookingStatusRequest) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

// Response for the GetBookingStatus RPC with booking status and prepayment
// status.
type GetBookingStatusResponse struct {
	// ID of the booking (required)
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	// Status of the booking (required)
	BookingStatus BookingStatus `protobuf:"varint,2,opt,name=booking_status,json=bookingStatus,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"booking_status,omitempty"`
	// Prepayment status of the booking (required)
	PrepaymentStatus     PrepaymentStatus `protobuf:"varint,3,opt,name=prepayment_status,json=prepaymentStatus,proto3,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_GetBookingStatusResponse proto.InternalMessageInfo

func (m *GetBookingStatusResponse) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

func (m *GetBookingStatusResponse) GetBookingStatus() BookingStatus {
	if m != nil {
		return m.BookingStatus
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

func (m *GetBookingStatusResponse) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

// Request to create a Booking for an inventory slot. Consumes the lease if
// provided.
type CreateBookingRequest struct {
	// The inventory slot that is being requested to make this booking.
	// If lease_ref is provided, slot must match the lease; slot is provided for
	// the partner to verify the lease information.
	// If lease_ref is absent, then create the booking for the slot. (required)
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// The lease that is being confirmed to make this booking.
	// If lease_ref is provided, then create the booking using the lease.
	// (optional)
	LeaseRef *LeaseReference `protobuf:"bytes,2,opt,name=lease_ref,json=leaseRef,proto3" json:"lease_ref,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Information about payments. When payment authorizations are handled by
	// Google, if the booking request does not succeed, payment authorizations are
	// automatically canceled. (optional)
	PaymentInformation *PaymentInformation `protobuf:"bytes,4,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (optional)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,5,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateBooking requests. (required)
	IdempotencyToken string `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	// A string from the user which contains any special requests or additional
	// information that they would like to notify the merchant about. (optional)
	AdditionalRequest    string   `protobuf:"bytes,7,opt,name=additional_request,json=additionalRequest,proto3" json:"additional_request,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateBookingRequest proto.InternalMessageInfo

func (m *CreateBookingRequest) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *CreateBookingRequest) GetLeaseRef() *LeaseReference {
	if m != nil {
		return m.LeaseRef
	}
	return nil
}

func (m *CreateBookingRequest) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *CreateBookingRequest) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

func (m *CreateBookingRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
	if m != nil {
		return m.PaymentProcessingParameters
	}
	return nil
}

func (m *CreateBookingRequest) GetIdempotencyToken() string {
	if m != nil {
		return m.IdempotencyToken
	}
	return ""
}

func (m *CreateBookingRequest) GetAdditionalRequest() string {
	if m != nil {
		return m.AdditionalRequest
	}
	return ""
}

// Response with the created Booking for an inventory slot.
type CreateBookingResponse struct {
	// The created booking (required)
	Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	// The updated user payment option used in this booking.
	// If a new payment option was purchased to pay for the booking, this should
	// be a newly created user payment option.
	// If an already purchased user payment option was used for this booking,
	// this should reflect an updated version of that user payment option.
	// (optional)
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption,proto3" json:"user_payment_option,omitempty"`
	// If creating a booking fails, this field should reflect the business logic
	// error (e.g., slot has become unavailable) and all other fields in the
	// CreateBookingResponse message are expected to be unset. (required if
	// failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_CreateBookingResponse proto.InternalMessageInfo

func (m *CreateBookingResponse) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

func (m *CreateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
	if m != nil {
		return m.UserPaymentOption
	}
	return nil
}

func (m *CreateBookingResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// Request to create a Lease for a slot in the inventory.  The expiration time
// in the returned Lease may be modified by the backend, e.g. if the requested
// lease period is too long.
type CreateLeaseRequest struct {
	// The lease to be created with information about the appointment slot
	// (required)
	Lease                *Lease   `protobuf:"bytes,1,opt,name=lease,proto3" json:"lease,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateLeaseRequest proto.InternalMessageInfo

func (m *CreateLeaseRequest) GetLease() *Lease {
	if m != nil {
		return m.Lease
	}
	return nil
}

// Response for the CreateLease RPC with the created Lease.
type CreateLeaseResponse struct {
	// The created Lease (required)
	Lease *Lease `protobuf:"bytes,1,opt,name=lease,proto3" json:"lease,omitempty"`
	// If creating a lease fails, this field should reflect the business logic
	// error (e.g., slot has become unavailable) and lease field is expected to be
	// unset. (required if failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,2,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_CreateLeaseResponse proto.InternalMessageInfo

func (m *CreateLeaseResponse) GetLease() *Lease {
	if m != nil {
		return m.Lease
	}
	return nil
}

func (m *CreateLeaseResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// Temporary lease for an inventory slot
type Lease struct {
	// ID of the lease.
	// Not populated in CreateLeaseRequest. The value is chosen by the partner and
	// has to be returned in the response of CreateLease. (required)
	LeaseId string `protobuf:"bytes,1,opt,name=lease_id,json=leaseId,proto3" json:"lease_id,omitempty"`
	// The appointment slot that the lease is created for. (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot,proto3" json:"slot,omitempty"`
	// Unique identifier for this lease, chosen by Reserve with Google. Serves as
	// an idempotency token for CreateLease requests. (required)
	UserReference string `protobuf:"bytes,3,opt,name=user_reference,json=userReference,proto3" json:"user_reference,omitempty"`
	// Expiration time of the lease in UTC Timestamp (required)
	LeaseExpirationTimeSec int64    `protobuf:"varint,4,opt,name=lease_expiration_time_sec,json=leaseExpirationTimeSec,proto3" json:"lease_expiration_time_sec,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_Lease proto.InternalMessageInfo

func (m *Lease) GetLeaseId() string {
	if m != nil {
		return m.LeaseId
	}
	return ""
}

func (m *Lease) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *Lease) GetUserReference() string {
	if m != nil {
		return m.UserReference
	}
	return ""
}

func (m *Lease) GetLeaseExpirationTimeSec() int64 {
	if m != nil {
		return m.LeaseExpirationTimeSec
	}
	return 0
}

// Reference to a Lease that has been created via CreateLease.
type LeaseReference struct {
	// Lease ID (required)
	LeaseId              string   `protobuf:"bytes,1,opt,name=lease_id,json=leaseId,proto3" json:"lease_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LeaseReference proto.InternalMessageInfo

func (m *LeaseReference) GetLeaseId() string {
	if m != nil {
		return m.LeaseId
	}
	return ""
}

// Request to create an order.
type CreateOrderRequest struct {
	// The order to create. (required)
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3" json:"order,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. order.payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (required if payment is processed by the partner)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,2,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateOrder requests. (required)
	IdempotencyToken     string   `protobuf:"bytes,3,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateOrderRequest proto.InternalMessageInfo

func (m *CreateOrderRequest) GetOrder() *Order {
	if m != nil {
		return m.Order
	}
	return nil
}

func (m *CreateOrderRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
	if m != nil {
		return m.PaymentProcessingParameters
	}
	return nil
}

func (m *CreateOrderRequest) GetIdempotencyToken() string {
	if m != nil {
		return m.IdempotencyToken
	}
	return ""
}

// Response for the CreateOrderRequest.
type CreateOrderResponse struct {
	// All line items in an order either fail or succeed together.
	// This means that if some of the items cannot be fulfilled, the entire
	// order must fail, the booking must not be made for any item, and the user
	// must not be charged.
	//
	// Types that are valid to be assigned to Result:
	//	*CreateOrderResponse_Order
	//	*CreateOrderResponse_OrderFailure
	Result               isCreateOrderResponse_Result `protobuf_oneof:"result"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_CreateOrderResponse proto.InternalMessageInfo

type isCreateOrderResponse_Result interface {
	isCreateOrderResponse_Result()
}

type CreateOrderResponse_Order struct {
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3,oneof"`
}

type CreateOrderResponse_OrderFailure struct {
	OrderFailure *OrderFailure `protobuf:"bytes,2,opt,name=order_failure,json=orderFailure,proto3,oneof"`
}

func (*CreateOrderResponse_Order) isCreateOrderResponse_Result() {}

func (*CreateOrderResponse_OrderFailure) isCreateOrderResponse_Result() {}

func (m *CreateOrderResponse) GetResult() isCreateOrderResponse_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *CreateOrderResponse) GetOrder() *Order {
	if x, ok := m.GetResult().(*CreateOrderResponse_Order); ok {
		return x.Order
	}
	return nil
}

func (m *CreateOrderResponse) GetOrderFailure() *OrderFailure {
	if x, ok := m.GetResult().(*CreateOrderResponse_OrderFailure); ok {
		return x.OrderFailure
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*CreateOrderResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _CreateOrderResponse_OneofMarshaler, _CreateOrderResponse_OneofUnmarshaler, _CreateOrderResponse_OneofSizer, []interface{}{
		(*CreateOrderResponse_Order)(nil),
		(*CreateOrderResponse_OrderFailure)(nil),
	}
}

func _CreateOrderResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*CreateOrderResponse)
	// result
	switch x := m.Result.(type) {
	case *CreateOrderResponse_Order:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Order); err != nil {
			return err
		}
	case *CreateOrderResponse_OrderFailure:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OrderFailure); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("CreateOrderResponse.Result has unexpected type %T", x)
	}
	return nil
}

func _CreateOrderResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*CreateOrderResponse)
	switch tag {
	case 1: // result.order
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Order)
		err := b.DecodeMessage(msg)
		m.Result = &CreateOrderResponse_Order{msg}
		return true, err
	case 2: // result.order_failure
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OrderFailure)
		err := b.DecodeMessage(msg)
		m.Result = &CreateOrderResponse_OrderFailure{msg}
		return true, err
	default:
		return false, nil
	}
}

func _CreateOrderResponse_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*CreateOrderResponse)
	// result
	switch x := m.Result.(type) {
	case *CreateOrderResponse_Order:
		s := proto.Size(x.Order)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *CreateOrderResponse_OrderFailure:
		s := proto.Size(x.OrderFailure)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Request to list all bookings for a user
type ListBookingsRequest struct {
	// ID of the user (required)
	UserId               string   `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListBookingsRequest proto.InternalMessageInfo

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

// Response for the ListBookings RPC with all bookings for the requested user.
type ListBookingsResponse struct {
	// All bookings of the user (required)
	Bookings             []*Booking `protobuf:"bytes,1,rep,name=bookings,proto3" json:"bookings,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_ListBookingsResponse proto.InternalMessageInfo

func (m *ListBookingsResponse) GetBookings() []*Booking {
	if m != nil {
		return m.Bookings
	}
	return nil
}

// Request to list orders.
type ListOrdersRequest struct {
	// Request of orders either by user ID, or by order ID.
	//
	// Types that are valid to be assigned to Ids:
	//	*ListOrdersRequest_UserId
	//	*ListOrdersRequest_OrderIds_
	Ids                  isListOrdersRequest_Ids `protobuf_oneof:"ids"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersRequest proto.InternalMessageInfo

type isListOrdersRequest_Ids interface {
	isListOrdersRequest_Ids()
}

type ListOrdersRequest_UserId struct {
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3,oneof"`
}

type ListOrdersRequest_OrderIds_ struct {
	OrderIds *ListOrdersRequest_OrderIds `protobuf:"bytes,2,opt,name=order_ids,json=orderIds,proto3,oneof"`
}

func (*ListOrdersRequest_UserId) isListOrdersRequest_Ids() {}

func (*ListOrdersRequest_OrderIds_) isListOrdersRequest_Ids() {}

func (m *ListOrdersRequest) GetIds() isListOrdersRequest_Ids {
	if m != nil {
		return m.Ids
	}
	return nil
}

func (m *ListOrdersRequest) GetUserId() string {
	if x, ok := m.GetIds().(*ListOrdersRequest_UserId); ok {
		return x.UserId
	}
	return ""
}

func (m *ListOrdersRequest) GetOrderIds() *ListOrdersRequest_OrderIds {
	if x, ok := m.GetIds().(*ListOrdersRequest_OrderIds_); ok {
		return x.OrderIds
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ListOrdersRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _ListOrdersRequest_OneofMarshaler, _ListOrdersRequest_OneofUnmarshaler, _ListOrdersRequest_OneofSizer, []interface{}{
		(*ListOrdersRequest_UserId)(nil),
		(*ListOrdersRequest_OrderIds_)(nil),
	}
}

func _ListOrdersRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*ListOrdersRequest)
	// ids
	switch x := m.Ids.(type) {
	case *ListOrdersRequest_UserId:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.UserId)
	case *ListOrdersRequest_OrderIds_:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OrderIds); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("ListOrdersRequest.Ids has unexpected type %T", x)
	}
	return nil
}

func _ListOrdersRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*ListOrdersRequest)
	switch tag {
	case 1: // ids.user_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.Ids = &ListOrdersRequest_UserId{x}
		return true, err
	case 2: // ids.order_ids
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(ListOrdersRequest_OrderIds)
		err := b.DecodeMessage(msg)
		m.Ids = &ListOrdersRequest_OrderIds_{msg}
		return true, err
	default:
		return false, nil
	}
}

func _ListOrdersRequest_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*ListOrdersRequest)
	// ids
	switch x := m.Ids.(type) {
	case *ListOrdersRequest_UserId:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.UserId)))
		n += len(x.UserId)
	case *ListOrdersRequest_OrderIds_:
		s := proto.Size(x.OrderIds)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type ListOrdersRequest_OrderIds struct {
	OrderId              []string `protobuf:"bytes,1,rep,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersRequest_OrderIds proto.InternalMessageInfo

func (m *ListOrdersRequest_OrderIds) GetOrderId() []string {
	if m != nil {
		return m.OrderId
	}
	return nil
}

// Response for the ListOrders RPC.
type ListOrdersResponse struct {
	// All requested orders (required)
	Order                []*Order `protobuf:"bytes,1,rep,name=order,proto3" json:"order,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersResponse proto.InternalMessageInfo

func (m *ListOrdersResponse) GetOrder() []*Order {
	if m != nil {
		return m.Order
	}
	return nil
}

// Request to update a Booking.
type UpdateBookingRequest struct {
	// The booking to be updated
	// The following fields can be set in a booking:
	// - status, to cancel a booking.
	// - start_time and duration in the slot, to reschedule a booking. (required)
	Booking              *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UpdateBookingRequest) Reset()         { *m = UpdateBookingRequest{} }
func (m *UpdateBookingRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateBookingRequest) ProtoMessage()    {}
func (*UpdateBookingRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{20}
}

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

var xxx_messageInfo_UpdateBookingRequest proto.InternalMessageInfo

func (m *UpdateBookingRequest) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

// Response with the updated Booking.
type UpdateBookingResponse struct {
	// The updated booking (required)
	Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	// The updated user payment option originally used to pay for this booking.
	// This should be set if the UpdateBookingRequest results in a change to
	// the UserPaymentOption.
	// For instance, if the booking is canceled, the UserPaymentOption should
	// reflect an additional credit to the user. In the case of a multi-use
	// payment option, the current_count should be increased by one to
	// allow the user to create another booking with this payment option. In the
	// case of a single-use payment option, a new single-use user payment option
	// should be returned. (required if altered in update)
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption,proto3" json:"user_payment_option,omitempty"`
	// If updating a booking fails, this field should reflect the business logic
	// error (e.g., booking is not cancellable) (required if failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *UpdateBookingResponse) Reset()         { *m = UpdateBookingResponse{} }
func (m *UpdateBookingResponse) String() string { return proto.CompactTextString(m) }
func (*UpdateBookingResponse) ProtoMessage()    {}
func (*UpdateBookingResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{21}
}

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

var xxx_messageInfo_UpdateBookingResponse proto.InternalMessageInfo

func (m *UpdateBookingResponse) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

func (m *UpdateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
	if m != nil {
		return m.UserPaymentOption
	}
	return nil
}

func (m *UpdateBookingResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// A booking for an inventory slot
type Booking struct {
	// ID of this booking (required)
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	// The appointment slot of this booking (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot,proto3" json:"slot,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Status of the booking (required)
	Status BookingStatus `protobuf:"varint,4,opt,name=status,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
	// Information about payment transactions that relate to the booking.
	// (optional)
	PaymentInformation   *PaymentInformation `protobuf:"bytes,5,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *Booking) Reset()         { *m = Booking{} }
func (m *Booking) String() string { return proto.CompactTextString(m) }
func (*Booking) ProtoMessage()    {}
func (*Booking) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{22}
}

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

var xxx_messageInfo_Booking proto.InternalMessageInfo

func (m *Booking) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

func (m *Booking) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *Booking) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *Booking) GetStatus() BookingStatus {
	if m != nil {
		return m.Status
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

func (m *Booking) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

// Status data that conveys why (1) creating a lease or (2) creating or updating
// a booking fails.
// BookingFailure is intended to primarily capture business logic errors.
type BookingFailure struct {
	// The reason why the booking failed. (required)
	Cause BookingFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.BookingFailure_Cause" json:"cause,omitempty"`
	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
	RejectedCardType CreditCardType `protobuf:"varint,2,opt,name=rejected_card_type,json=rejectedCardType,proto3,enum=ext.maps.booking.partner.v3.CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only. (optional)
	Description          string   `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BookingFailure) Reset()         { *m = BookingFailure{} }
func (m *BookingFailure) String() string { return proto.CompactTextString(m) }
func (*BookingFailure) ProtoMessage()    {}
func (*BookingFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{23}
}

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

var xxx_messageInfo_BookingFailure proto.InternalMessageInfo

func (m *BookingFailure) GetCause() BookingFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return BookingFailure_CAUSE_UNSPECIFIED
}

func (m *BookingFailure) GetRejectedCardType() CreditCardType {
	if m != nil {
		return m.RejectedCardType
	}
	return CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED
}

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

// An order for service appointments with a merchant.
type Order struct {
	// ID of this Order, chosen by the booking partner who handles the order
	// (required in CreateOrderResponse and ListOrdersResponse, must not be set in
	// CreateOrderRequest)
	OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
	// Personal information of the user making the order (required)
	UserInformation *UserInformation `protobuf:"bytes,2,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Information about payment transactions that relate to the Order.
	// (optional)
	PaymentInformation *PaymentInformation `protobuf:"bytes,3,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	// The merchant that all services in this Order belong to.
	MerchantId string `protobuf:"bytes,4,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// Line items in this order.
	Item                 []*LineItem `protobuf:"bytes,5,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Order) Reset()         { *m = Order{} }
func (m *Order) String() string { return proto.CompactTextString(m) }
func (*Order) ProtoMessage()    {}
func (*Order) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{24}
}

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

var xxx_messageInfo_Order proto.InternalMessageInfo

func (m *Order) GetOrderId() string {
	if m != nil {
		return m.OrderId
	}
	return ""
}

func (m *Order) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *Order) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

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

func (m *Order) GetItem() []*LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

// A single item in an Order--the booking of a single service in a single time
// slot.
type LineItem struct {
	// ID of the merchant Service. (required)
	ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
	// (required)
	StartSec int64 `protobuf:"varint,2,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds. (required)
	DurationSec int64 `protobuf:"varint,3,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of tickets ordered by Ticket Type.
	Tickets []*LineItem_OrderedTickets `protobuf:"bytes,4,rep,name=tickets,proto3" json:"tickets,omitempty"`
	// In handling CreateOrderRequest and CheckOrderFulfillabilityRequest,
	// the total price (excluding taxes) of the item must be verified to guard
	// against price changes. In CreateOrderResponse and
	// CheckOrderFulfillabilityResponse, the price should be updated to the
	// correct value if the value from the request was incorrect or outdated.
	// (reqired)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Status of the Line Item. (required in CreateOrderResponse and
	// ListOrdersResponse; should not be set in requests)
	Status               BookingStatus `protobuf:"varint,6,opt,name=status,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LineItem) Reset()         { *m = LineItem{} }
func (m *LineItem) String() string { return proto.CompactTextString(m) }
func (*LineItem) ProtoMessage()    {}
func (*LineItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{25}
}

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

var xxx_messageInfo_LineItem proto.InternalMessageInfo

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

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

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

func (m *LineItem) GetTickets() []*LineItem_OrderedTickets {
	if m != nil {
		return m.Tickets
	}
	return nil
}

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

func (m *LineItem) GetStatus() BookingStatus {
	if m != nil {
		return m.Status
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

type LineItem_OrderedTickets struct {
	TicketId             string   `protobuf:"bytes,1,opt,name=ticket_id,json=ticketId,proto3" json:"ticket_id,omitempty"`
	Count                int32    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LineItem_OrderedTickets proto.InternalMessageInfo

func (m *LineItem_OrderedTickets) GetTicketId() string {
	if m != nil {
		return m.TicketId
	}
	return ""
}

func (m *LineItem_OrderedTickets) GetCount() int32 {
	if m != nil {
		return m.Count
	}
	return 0
}

// Status data that conveys why creating an order fails.
// OrderFailure is intended to primarily capture business logic errors.
type OrderFailure struct {
	// The reason why the order failed. (required)
	Cause OrderFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.OrderFailure_Cause" json:"cause,omitempty"`
	// (required only if cause is ORDER_UNFULFILLABLE)
	Fulfillability *OrderFulfillability `protobuf:"bytes,2,opt,name=fulfillability,proto3" json:"fulfillability,omitempty"`
	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
	RejectedCardType CreditCardType `protobuf:"varint,3,opt,name=rejected_card_type,json=rejectedCardType,proto3,enum=ext.maps.booking.partner.v3.CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only. (optional)
	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OrderFailure) Reset()         { *m = OrderFailure{} }
func (m *OrderFailure) String() string { return proto.CompactTextString(m) }
func (*OrderFailure) ProtoMessage()    {}
func (*OrderFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{26}
}

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

var xxx_messageInfo_OrderFailure proto.InternalMessageInfo

func (m *OrderFailure) GetCause() OrderFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return OrderFailure_CAUSE_UNSPECIFIED
}

func (m *OrderFailure) GetFulfillability() *OrderFulfillability {
	if m != nil {
		return m.Fulfillability
	}
	return nil
}

func (m *OrderFailure) GetRejectedCardType() CreditCardType {
	if m != nil {
		return m.RejectedCardType
	}
	return CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED
}

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

type OrderFulfillability struct {
	Result OrderFulfillability_OrderFulfillabilityResult `protobuf:"varint,1,opt,name=result,proto3,enum=ext.maps.booking.partner.v3.OrderFulfillability_OrderFulfillabilityResult" json:"result,omitempty"`
	// Fulfillability results of all line items in this order (required).
	ItemFulfillability []*LineItemFulfillability `protobuf:"bytes,2,rep,name=item_fulfillability,json=itemFulfillability,proto3" json:"item_fulfillability,omitempty"`
	// Additional description of the reason if the item is unfulfillable.
	// (optional)
	UnfulfillableReason  string   `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason,proto3" json:"unfulfillable_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OrderFulfillability) Reset()         { *m = OrderFulfillability{} }
func (m *OrderFulfillability) String() string { return proto.CompactTextString(m) }
func (*OrderFulfillability) ProtoMessage()    {}
func (*OrderFulfillability) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{27}
}

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

var xxx_messageInfo_OrderFulfillability proto.InternalMessageInfo

func (m *OrderFulfillability) GetResult() OrderFulfillability_OrderFulfillabilityResult {
	if m != nil {
		return m.Result
	}
	return OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED
}

func (m *OrderFulfillability) GetItemFulfillability() []*LineItemFulfillability {
	if m != nil {
		return m.ItemFulfillability
	}
	return nil
}

func (m *OrderFulfillability) GetUnfulfillableReason() string {
	if m != nil {
		return m.UnfulfillableReason
	}
	return ""
}

// Fulfillability of a line item.
type LineItemFulfillability struct {
	// The line item of question. (required)
	Item *LineItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// (required)
	Result LineItemFulfillability_ItemFulfillabilityResult `protobuf:"varint,2,opt,name=result,proto3,enum=ext.maps.booking.partner.v3.LineItemFulfillability_ItemFulfillabilityResult" json:"result,omitempty"`
	// Additional description of the reason if the item is unfulfillable.
	// (optional)
	UnfulfillableReason string `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason,proto3" json:"unfulfillable_reason,omitempty"`
	// (optional)
	Availability *LineItemFulfillability_UpdatedAvailability `protobuf:"bytes,4,opt,name=availability,proto3" json:"availability,omitempty"`
	// Updated ticket types can be piggybacked in
	// CheckOrderFulfillabilityResponse. If non-empty, all available ticket types
	// for this slot with up-to-date prices should be listed without omitting any.
	// (optional)
	TicketType           []*TicketType `protobuf:"bytes,5,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LineItemFulfillability) Reset()         { *m = LineItemFulfillability{} }
func (m *LineItemFulfillability) String() string { return proto.CompactTextString(m) }
func (*LineItemFulfillability) ProtoMessage()    {}
func (*LineItemFulfillability) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{28}
}

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

var xxx_messageInfo_LineItemFulfillability proto.InternalMessageInfo

func (m *LineItemFulfillability) GetItem() *LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *LineItemFulfillability) GetResult() LineItemFulfillability_ItemFulfillabilityResult {
	if m != nil {
		return m.Result
	}
	return LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED
}

func (m *LineItemFulfillability) GetUnfulfillableReason() string {
	if m != nil {
		return m.UnfulfillableReason
	}
	return ""
}

func (m *LineItemFulfillability) GetAvailability() *LineItemFulfillability_UpdatedAvailability {
	if m != nil {
		return m.Availability
	}
	return nil
}

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

// Updated availability for this slot can be piggybacked in
// CheckOrderFulfillabilityResponse.
type LineItemFulfillability_UpdatedAvailability struct {
	// Number of available spots for the given slot. 0 indicates no
	// availability. (required)
	SpotsOpen            int32    `protobuf:"varint,1,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LineItemFulfillability_UpdatedAvailability proto.InternalMessageInfo

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

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

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

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
}

// Resource specification that disambiguates an appointment slot
type ResourceIds struct {
	// The staff ID as provided in the feed or empty if not applicable or no staff
	// was selected. (optional)
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// The room ID as provided in the feed or empty if not applicable or no room
	// was selected. (optional)
	RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// For Dining Reservations only: the number of seats requested in the booking.
	// (optional)
	PartySize            int32    `protobuf:"varint,3,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 *ResourceIds) Reset()         { *m = ResourceIds{} }
func (m *ResourceIds) String() string { return proto.CompactTextString(m) }
func (*ResourceIds) ProtoMessage()    {}
func (*ResourceIds) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{30}
}

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

var xxx_messageInfo_ResourceIds proto.InternalMessageInfo

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

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

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

type PaymentProcessingParameters struct {
	// The payment processor used to process payment for a given booking.
	// (required)
	//
	// Replaced by the payment_processor field.
	Processor PaymentProcessingParameters_PaymentProcessor `protobuf:"varint,1,opt,name=processor,proto3,enum=ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor" json:"processor,omitempty"` // Deprecated: Do not use.
	// The token representing the payment method that will be used to pay
	// for this booking. This token can be only used once. This token can be
	// only used for the merchant associated with this booking.
	//
	// Each processor may choose its own format for this field.
	// An example of Stripe's token is "tok_1C3orL2eZvKYlo2CxReMgS4K".
	//
	// Replaced by unparsed_payment_method_token, which contains
	// payment_method_token as one of its fields.
	// For example, for Stripe, unparsed_payment_method_token is a serialized
	// JSON object documented at https://stripe.com/docs/api#token_object.
	// payment_method_token is the 'id' field parsed out of that.
	PaymentMethodToken string `protobuf:"bytes,2,opt,name=payment_method_token,json=paymentMethodToken,proto3" json:"payment_method_token,omitempty"` // Deprecated: Do not use.
	// The full token received from Google Payments.  This is typically a
	// serialized JSON object.  See documentation from Google Payments and your
	// payment processor for the JSON format of the token for your processor.
	// https://developers.google.com/pay/api/#participating-google-pay-processors
	//
	// This token can only be used once, and only for the merchant associated with
	// this booking.
	UnparsedPaymentMethodToken string `protobuf:"bytes,5,opt,name=unparsed_payment_method_token,json=unparsedPaymentMethodToken,proto3" json:"unparsed_payment_method_token,omitempty"`
	// The payment processor API version that the given payment token is valid
	// for.
	//
	// Each processor may choose its own format for this field.
	// Stripe uses a date (e.g. "2017-06-15"). (required)
	Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	// The payment processor whose configuration was used to generate this token.
	// (required)
	PaymentProcessor     string   `protobuf:"bytes,4,opt,name=payment_processor,json=paymentProcessor,proto3" json:"payment_processor,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PaymentProcessingParameters) Reset()         { *m = PaymentProcessingParameters{} }
func (m *PaymentProcessingParameters) String() string { return proto.CompactTextString(m) }
func (*PaymentProcessingParameters) ProtoMessage()    {}
func (*PaymentProcessingParameters) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{31}
}

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

var xxx_messageInfo_PaymentProcessingParameters proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetProcessor() PaymentProcessingParameters_PaymentProcessor {
	if m != nil {
		return m.Processor
	}
	return PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED
}

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetPaymentMethodToken() string {
	if m != nil {
		return m.PaymentMethodToken
	}
	return ""
}

func (m *PaymentProcessingParameters) GetUnparsedPaymentMethodToken() string {
	if m != nil {
		return m.UnparsedPaymentMethodToken
	}
	return ""
}

func (m *PaymentProcessingParameters) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *PaymentProcessingParameters) GetPaymentProcessor() string {
	if m != nil {
		return m.PaymentProcessor
	}
	return ""
}

// This describes a payment option, such as a pack, membership, or
// single-session pass after it has been purchased by a user. It includes an
// identifier for the user payment option, as well as some information about
// the payment option with which it is associated.
type UserPaymentOption struct {
	// A unique identifier for the user payment option. This Id MUST be unique
	// for all UserPaymentOptions across all merchants and users. (required)
	UserPaymentOptionId string `protobuf:"bytes,1,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3" json:"user_payment_option_id,omitempty"`
	// The user payment option will be valid (usable) between start_time and
	// end_time set in UTC. Attempts to use a user payment option to make a
	// booking outside of this interval will fail. (both optional)
	ValidStartTimeSec int64 `protobuf:"varint,2,opt,name=valid_start_time_sec,json=validStartTimeSec,proto3" json:"valid_start_time_sec,omitempty"`
	ValidEndTimeSec   int64 `protobuf:"varint,3,opt,name=valid_end_time_sec,json=validEndTimeSec,proto3" json:"valid_end_time_sec,omitempty"`
	// The type of the payment option associated with this user payment option.
	// This can be unlimited for a membership or subscription, multi-use for a
	// pack, or single-use. (required)
	Type PaymentOptionType `protobuf:"varint,4,opt,name=type,proto3,enum=ext.maps.booking.partner.v3.PaymentOptionType" json:"type,omitempty"`
	// The original number of uses for this user payment option when it was
	// purchased. This value is ignored for unlimited payment options. (required)
	OriginalCount int32 `protobuf:"varint,5,opt,name=original_count,json=originalCount,proto3" json:"original_count,omitempty"`
	// The number of uses remaining for this user payment option. If this number
	// is 0 for a pack, attempts to use this payment option to make a booking will
	// fail. (required)
	CurrentCount int32 `protobuf:"varint,6,opt,name=current_count,json=currentCount,proto3" json:"current_count,omitempty"`
	// The id of the payment option that has been used to purchase this user
	// payment option. (required)
	PaymentOptionId      string   `protobuf:"bytes,7,opt,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserPaymentOption) Reset()         { *m = UserPaymentOption{} }
func (m *UserPaymentOption) String() string { return proto.CompactTextString(m) }
func (*UserPaymentOption) ProtoMessage()    {}
func (*UserPaymentOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{32}
}

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

var xxx_messageInfo_UserPaymentOption proto.InternalMessageInfo

func (m *UserPaymentOption) GetUserPaymentOptionId() string {
	if m != nil {
		return m.UserPaymentOptionId
	}
	return ""
}

func (m *UserPaymentOption) GetValidStartTimeSec() int64 {
	if m != nil {
		return m.ValidStartTimeSec
	}
	return 0
}

func (m *UserPaymentOption) GetValidEndTimeSec() int64 {
	if m != nil {
		return m.ValidEndTimeSec
	}
	return 0
}

func (m *UserPaymentOption) GetType() PaymentOptionType {
	if m != nil {
		return m.Type
	}
	return PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED
}

func (m *UserPaymentOption) GetOriginalCount() int32 {
	if m != nil {
		return m.OriginalCount
	}
	return 0
}

func (m *UserPaymentOption) GetCurrentCount() int32 {
	if m != nil {
		return m.CurrentCount
	}
	return 0
}

func (m *UserPaymentOption) GetPaymentOptionId() string {
	if m != nil {
		return m.PaymentOptionId
	}
	return ""
}

// Payment details that are sent when creating a new booking.
type PaymentInformation struct {
	// Prepayment status of the booking.
	// If the prepayment_status is PREPAYMENT_PROVIDED, then
	// payment_transaction_id contains the associated unique transaction id for
	// the purchase.
	// If the prepayment status is PREPAYMENT_REFUNDED, then
	// payment_transaction_id contains the associated unique transaction id for
	// the refund. (required)
	PrepaymentStatus PrepaymentStatus `protobuf:"varint,1,opt,name=prepayment_status,json=prepaymentStatus,proto3,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
	// Unique identifier for a payment transaction associated with the booking.
	// If the payment is PROCESSED_BY_GOOGLE, this field will be set by Google.
	// If the payment is PROCESSED_BY_PARTNER, this field will be left empty in
	// Google's CreateBooking or CreateOrder requests to the partner, and it must
	// be set by the partner in their responses.
	PaymentTransactionId string `protobuf:"bytes,2,opt,name=payment_transaction_id,json=paymentTransactionId,proto3" json:"payment_transaction_id,omitempty"`
	// These fields must match the service price (specified in the Services feed)
	// or the PaymentOption corresponding with this service.
	// They are included in the booking request and response to verify that
	// the price indicated in the feed has not changed since the last feed
	// update.
	//
	// The price of the booking or order, exclusive of any taxes.
	// Existence of price or taxes does not imply that they have been paid,
	// prepayment_state should be used for that purpose. (required)
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// Taxes that are calculated to be paid for this booking.
	// This field can only be absent in one of the following cases:
	// (1) the price is exempt from or already inclusive of applicable taxes; or
	// (2) the break down between taxes and fees is not available.
	// (required when neither of the above holds)
	TaxAmount *Price `protobuf:"bytes,4,opt,name=tax_amount,json=taxAmount,proto3" json:"tax_amount,omitempty"`
	// Whether the partner or Google processed the payment. (required)
	PaymentProcessedBy PaymentInformation_PaymentProcessedBy `protobuf:"varint,5,opt,name=payment_processed_by,json=paymentProcessedBy,proto3,enum=ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy" json:"payment_processed_by,omitempty"`
	// The id of the payment option or user payment option associated with the
	// booking.
	// If a payment option is purchased as part of a booking, payment_option_id
	// will be set with the id of that payment option.
	// If an already purchased user payment option is being used to pay for a
	// booking, user_payment_option_id will be set with the id of that user
	// payment option.
	// When included as part of a response proto, the user_payment_option_id
	// should be set and must match the UserPaymentOption that is returned in the
	// RPC response (e.g. the user_payment_option returned in
	// CreateBookingResponse). (one of these required)
	//
	// Types that are valid to be assigned to PaymentId:
	//	*PaymentInformation_PaymentOptionId
	//	*PaymentInformation_UserPaymentOptionId
	PaymentId isPaymentInformation_PaymentId `protobuf_oneof:"payment_id"`
	// Defines how a deposit may be charged to the user. If there is a deposit,
	// this field should be set. (optional)
	Deposit *Deposit `protobuf:"bytes,8,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. If the user can be
	// charged a no show fee, this field should be set. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,9,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Total processing fees & taxes that the user needs to pay for the order;
	// only applicable to partners that handle order based booking (e.g., with
	// CreateOrder method). (optional)
	FeesAndTaxes         *Price   `protobuf:"bytes,10,opt,name=fees_and_taxes,json=feesAndTaxes,proto3" json:"fees_and_taxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PaymentInformation) Reset()         { *m = PaymentInformation{} }
func (m *PaymentInformation) String() string { return proto.CompactTextString(m) }
func (*PaymentInformation) ProtoMessage()    {}
func (*PaymentInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{33}
}

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

var xxx_messageInfo_PaymentInformation proto.InternalMessageInfo

func (m *PaymentInformation) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

func (m *PaymentInformation) GetPaymentTransactionId() string {
	if m != nil {
		return m.PaymentTransactionId
	}
	return ""
}

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

func (m *PaymentInformation) GetTaxAmount() *Price {
	if m != nil {
		return m.TaxAmount
	}
	return nil
}

func (m *PaymentInformation) GetPaymentProcessedBy() PaymentInformation_PaymentProcessedBy {
	if m != nil {
		return m.PaymentProcessedBy
	}
	return PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED
}

type isPaymentInformation_PaymentId interface {
	isPaymentInformation_PaymentId()
}

type PaymentInformation_PaymentOptionId struct {
	PaymentOptionId string `protobuf:"bytes,6,opt,name=payment_option_id,json=paymentOptionId,proto3,oneof"`
}

type PaymentInformation_UserPaymentOptionId struct {
	UserPaymentOptionId string `protobuf:"bytes,7,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3,oneof"`
}

func (*PaymentInformation_PaymentOptionId) isPaymentInformation_PaymentId() {}

func (*PaymentInformation_UserPaymentOptionId) isPaymentInformation_PaymentId() {}

func (m *PaymentInformation) GetPaymentId() isPaymentInformation_PaymentId {
	if m != nil {
		return m.PaymentId
	}
	return nil
}

func (m *PaymentInformation) GetPaymentOptionId() string {
	if x, ok := m.GetPaymentId().(*PaymentInformation_PaymentOptionId); ok {
		return x.PaymentOptionId
	}
	return ""
}

func (m *PaymentInformation) GetUserPaymentOptionId() string {
	if x, ok := m.GetPaymentId().(*PaymentInformation_UserPaymentOptionId); ok {
		return x.UserPaymentOptionId
	}
	return ""
}

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

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

func (m *PaymentInformation) GetFeesAndTaxes() *Price {
	if m != nil {
		return m.FeesAndTaxes
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*PaymentInformation) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _PaymentInformation_OneofMarshaler, _PaymentInformation_OneofUnmarshaler, _PaymentInformation_OneofSizer, []interface{}{
		(*PaymentInformation_PaymentOptionId)(nil),
		(*PaymentInformation_UserPaymentOptionId)(nil),
	}
}

func _PaymentInformation_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*PaymentInformation)
	// payment_id
	switch x := m.PaymentId.(type) {
	case *PaymentInformation_PaymentOptionId:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.UserPaymentOptionId)
	case nil:
	default:
		return fmt.Errorf("PaymentInformation.PaymentId has unexpected type %T", x)
	}
	return nil
}

func _PaymentInformation_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*PaymentInformation)
	switch tag {
	case 6: // payment_id.payment_option_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PaymentId = &PaymentInformation_PaymentOptionId{x}
		return true, err
	case 7: // payment_id.user_payment_option_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PaymentId = &PaymentInformation_UserPaymentOptionId{x}
		return true, err
	default:
		return false, nil
	}
}

func _PaymentInformation_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*PaymentInformation)
	// payment_id
	switch x := m.PaymentId.(type) {
	case *PaymentInformation_PaymentOptionId:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.PaymentOptionId)))
		n += len(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.UserPaymentOptionId)))
		n += len(x.UserPaymentOptionId)
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// 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_1820d8e1a9fad753, []int{34}
}

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

// 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=ext.maps.booking.partner.v3.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_1820d8e1a9fad753, []int{35}
}

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
}

// 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=ext.maps.booking.partner.v3.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_1820d8e1a9fad753, []int{36}
}

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
}

// An inventory slot
type Slot struct {
	// ID of the merchant for the slot (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// ID of the merchant Service (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
	// (required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Opaque tag that identifies the availability slot and matches the value
	// provided in the availability feed (optional)
	AvailabilityTag string `protobuf:"bytes,5,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// The set of resources that disambiguates the appointment slot, e.g. by
	// indicating the staff member and room selected by the user (optional)
	Resources            *ResourceIds `protobuf:"bytes,6,opt,name=resources,proto3" json:"resources,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Slot) Reset()         { *m = Slot{} }
func (m *Slot) String() string { return proto.CompactTextString(m) }
func (*Slot) ProtoMessage()    {}
func (*Slot) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{37}
}

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

var xxx_messageInfo_Slot proto.InternalMessageInfo

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

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

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

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

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

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

// Personal information about the person making a booking
type UserInformation struct {
	// Unique ID of the user to the partner, chosen by Reserve with Google.
	// (required)
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	// Given name of the user (maximum 40 characters) (required)
	GivenName string `protobuf:"bytes,2,opt,name=given_name,json=givenName,proto3" json:"given_name,omitempty"`
	// Family name of the user (maximum 40 characters) (required)
	FamilyName string `protobuf:"bytes,3,opt,name=family_name,json=familyName,proto3" json:"family_name,omitempty"`
	// Address of the user (optional)
	Address *PostalAddress `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"`
	// Phone number of the user (required)
	Telephone string `protobuf:"bytes,5,opt,name=telephone,proto3" json:"telephone,omitempty"`
	// Email address of the user (required)
	Email                string   `protobuf:"bytes,6,opt,name=email,proto3" json:"email,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserInformation) Reset()         { *m = UserInformation{} }
func (m *UserInformation) String() string { return proto.CompactTextString(m) }
func (*UserInformation) ProtoMessage()    {}
func (*UserInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{38}
}

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

var xxx_messageInfo_UserInformation proto.InternalMessageInfo

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

func (m *UserInformation) GetGivenName() string {
	if m != nil {
		return m.GivenName
	}
	return ""
}

func (m *UserInformation) GetFamilyName() string {
	if m != nil {
		return m.FamilyName
	}
	return ""
}

func (m *UserInformation) GetAddress() *PostalAddress {
	if m != nil {
		return m.Address
	}
	return nil
}

func (m *UserInformation) GetTelephone() string {
	if m != nil {
		return m.Telephone
	}
	return ""
}

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

// The postal address for a merchant.
type PostalAddress struct {
	// The country, e.g. "USA". (required)
	Country string `protobuf:"bytes,1,opt,name=country,proto3" json:"country,omitempty"`
	// The locality/city, e.g. "Mountain View". (required)
	Locality string `protobuf:"bytes,2,opt,name=locality,proto3" json:"locality,omitempty"`
	// The region/state/province, e.g. "CA". (required)
	Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"`
	// The postal code, e.g. "94043". (required)
	PostalCode string `protobuf:"bytes,4,opt,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"`
	// The street address, e.g. "1600 Amphitheatre Pkwy". (required)
	StreetAddress        string   `protobuf:"bytes,5,opt,name=street_address,json=streetAddress,proto3" json:"street_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PostalAddress) Reset()         { *m = PostalAddress{} }
func (m *PostalAddress) String() string { return proto.CompactTextString(m) }
func (*PostalAddress) ProtoMessage()    {}
func (*PostalAddress) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{39}
}

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

var xxx_messageInfo_PostalAddress proto.InternalMessageInfo

func (m *PostalAddress) GetCountry() string {
	if m != nil {
		return m.Country
	}
	return ""
}

func (m *PostalAddress) GetLocality() string {
	if m != nil {
		return m.Locality
	}
	return ""
}

func (m *PostalAddress) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *PostalAddress) GetPostalCode() string {
	if m != nil {
		return m.PostalCode
	}
	return ""
}

func (m *PostalAddress) GetStreetAddress() string {
	if m != nil {
		return m.StreetAddress
	}
	return ""
}

func init() {
	proto.RegisterType((*CheckAvailabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityRequest")
	proto.RegisterType((*CheckAvailabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityResponse")
	proto.RegisterType((*AvailabilityUpdate)(nil), "ext.maps.booking.partner.v3.AvailabilityUpdate")
	proto.RegisterType((*SlotAvailability)(nil), "ext.maps.booking.partner.v3.SlotAvailability")
	proto.RegisterType((*CheckOrderFulfillabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityRequest")
	proto.RegisterType((*CheckOrderFulfillabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityResponse")
	proto.RegisterType((*GetBookingStatusRequest)(nil), "ext.maps.booking.partner.v3.GetBookingStatusRequest")
	proto.RegisterType((*GetBookingStatusResponse)(nil), "ext.maps.booking.partner.v3.GetBookingStatusResponse")
	proto.RegisterType((*CreateBookingRequest)(nil), "ext.maps.booking.partner.v3.CreateBookingRequest")
	proto.RegisterType((*CreateBookingResponse)(nil), "ext.maps.booking.partner.v3.CreateBookingResponse")
	proto.RegisterType((*CreateLeaseRequest)(nil), "ext.maps.booking.partner.v3.CreateLeaseRequest")
	proto.RegisterType((*CreateLeaseResponse)(nil), "ext.maps.booking.partner.v3.CreateLeaseResponse")
	proto.RegisterType((*Lease)(nil), "ext.maps.booking.partner.v3.Lease")
	proto.RegisterType((*LeaseReference)(nil), "ext.maps.booking.partner.v3.LeaseReference")
	proto.RegisterType((*CreateOrderRequest)(nil), "ext.maps.booking.partner.v3.CreateOrderRequest")
	proto.RegisterType((*CreateOrderResponse)(nil), "ext.maps.booking.partner.v3.CreateOrderResponse")
	proto.RegisterType((*ListBookingsRequest)(nil), "ext.maps.booking.partner.v3.ListBookingsRequest")
	proto.RegisterType((*ListBookingsResponse)(nil), "ext.maps.booking.partner.v3.ListBookingsResponse")
	proto.RegisterType((*ListOrdersRequest)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest")
	proto.RegisterType((*ListOrdersRequest_OrderIds)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest.OrderIds")
	proto.RegisterType((*ListOrdersResponse)(nil), "ext.maps.booking.partner.v3.ListOrdersResponse")
	proto.RegisterType((*UpdateBookingRequest)(nil), "ext.maps.booking.partner.v3.UpdateBookingRequest")
	proto.RegisterType((*UpdateBookingResponse)(nil), "ext.maps.booking.partner.v3.UpdateBookingResponse")
	proto.RegisterType((*Booking)(nil), "ext.maps.booking.partner.v3.Booking")
	proto.RegisterType((*BookingFailure)(nil), "ext.maps.booking.partner.v3.BookingFailure")
	proto.RegisterType((*Order)(nil), "ext.maps.booking.partner.v3.Order")
	proto.RegisterType((*LineItem)(nil), "ext.maps.booking.partner.v3.LineItem")
	proto.RegisterType((*LineItem_OrderedTickets)(nil), "ext.maps.booking.partner.v3.LineItem.OrderedTickets")
	proto.RegisterType((*OrderFailure)(nil), "ext.maps.booking.partner.v3.OrderFailure")
	proto.RegisterType((*OrderFulfillability)(nil), "ext.maps.booking.partner.v3.OrderFulfillability")
	proto.RegisterType((*LineItemFulfillability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability")
	proto.RegisterType((*LineItemFulfillability_UpdatedAvailability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability.UpdatedAvailability")
	proto.RegisterType((*TicketType)(nil), "ext.maps.booking.partner.v3.TicketType")
	proto.RegisterType((*ResourceIds)(nil), "ext.maps.booking.partner.v3.ResourceIds")
	proto.RegisterType((*PaymentProcessingParameters)(nil), "ext.maps.booking.partner.v3.PaymentProcessingParameters")
	proto.RegisterType((*UserPaymentOption)(nil), "ext.maps.booking.partner.v3.UserPaymentOption")
	proto.RegisterType((*PaymentInformation)(nil), "ext.maps.booking.partner.v3.PaymentInformation")
	proto.RegisterType((*Price)(nil), "ext.maps.booking.partner.v3.Price")
	proto.RegisterType((*NoShowFee)(nil), "ext.maps.booking.partner.v3.NoShowFee")
	proto.RegisterType((*Deposit)(nil), "ext.maps.booking.partner.v3.Deposit")
	proto.RegisterType((*Slot)(nil), "ext.maps.booking.partner.v3.Slot")
	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.UserInformation")
	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.PostalAddress")
	proto.RegisterEnum("ext.maps.booking.partner.v3.BookingStatus", BookingStatus_name, BookingStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CreditCardType", CreditCardType_name, CreditCardType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentOptionType", PaymentOptionType_name, PaymentOptionType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PrepaymentStatus", PrepaymentStatus_name, PrepaymentStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement", CheckAvailabilityResponse_DurationRequirement_name, CheckAvailabilityResponse_DurationRequirement_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.BookingFailure_Cause", BookingFailure_Cause_name, BookingFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.OrderFailure_Cause", OrderFailure_Cause_name, OrderFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.OrderFulfillability_OrderFulfillabilityResult", OrderFulfillability_OrderFulfillabilityResult_name, OrderFulfillability_OrderFulfillabilityResult_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.LineItemFulfillability_ItemFulfillabilityResult", LineItemFulfillability_ItemFulfillabilityResult_name, LineItemFulfillability_ItemFulfillabilityResult_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor", PaymentProcessingParameters_PaymentProcessor_name, PaymentProcessingParameters_PaymentProcessor_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy", PaymentInformation_PaymentProcessedBy_name, PaymentInformation_PaymentProcessedBy_value)
}

func init() { proto.RegisterFile("v3.proto", fileDescriptor_1820d8e1a9fad753) }

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