blob: c41f821a983bd8995d316a55f9b306d9c26377e9 [file] [log] [blame]
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: availability_feed.proto
/*
Package maps_booking_feeds is a generated protocol buffer package.
It is generated from these files:
availability_feed.proto
It has these top-level messages:
FeedMetadata
AvailabilityFeed
ServiceAvailability
Availability
Resources
TimeRange
*/
package maps_booking_feeds
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type FeedMetadata_ProcessingInstruction int32
const (
// By default we will assume that this feed is an incremental feed.
FeedMetadata_PROCESS_UNKNOWN FeedMetadata_ProcessingInstruction = 0
// This Feed message is one shard of a complete feed. Anything previously
// supplied by this partner will be deleted; the contents of this feed
// represent the entire state of the world.
FeedMetadata_PROCESS_AS_COMPLETE FeedMetadata_ProcessingInstruction = 1
// This Feed message is one shard of an incremental feed. Existing entities
// will be left untouched except as modified in this feed.
FeedMetadata_PROCESS_AS_INCREMENTAL FeedMetadata_ProcessingInstruction = 2
)
var FeedMetadata_ProcessingInstruction_name = map[int32]string{
0: "PROCESS_UNKNOWN",
1: "PROCESS_AS_COMPLETE",
2: "PROCESS_AS_INCREMENTAL",
}
var FeedMetadata_ProcessingInstruction_value = map[string]int32{
"PROCESS_UNKNOWN": 0,
"PROCESS_AS_COMPLETE": 1,
"PROCESS_AS_INCREMENTAL": 2,
}
func (x FeedMetadata_ProcessingInstruction) String() string {
return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
}
func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{0, 0}
}
type FeedMetadata struct {
// Instructs us how to process the feed: either as a shard of a complete feed,
// or as a shard of an incremental update.
ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
// The current shard and total number of shards for this feed.
//
// Shard number is assumed to be zero-based.
//
// There does not need to be any relationship to the file name.
//
// Shards do not need to be transferred in order, and they may not be
// processed in order.
ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber" json:"shard_number,omitempty"`
TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards" json:"total_shards,omitempty"`
// An identifier that must be consistent across all shards in a feed.
// This value must be globally unique across each feed type.
//
// This value ensures that complete feeds spanning multiple shards are
// processed together correctly.
//
// Clients only need to set this value when the processing_instruction is set
// to PROCESS_AS_COMPLETE and the feed spans multiple shards (defined by
// total_shards).
//
// Feeds that span multiple shards must set this nonce to the same value.
Nonce uint64 `protobuf:"varint,5,opt,name=nonce" json:"nonce,omitempty"`
// The timestamp at which this feed shard was generated.
//
// In Unix time format (seconds since the epoch).
GenerationTimestamp int64 `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp" json:"generation_timestamp,omitempty"`
}
func (m *FeedMetadata) Reset() { *m = FeedMetadata{} }
func (m *FeedMetadata) String() string { return proto.CompactTextString(m) }
func (*FeedMetadata) ProtoMessage() {}
func (*FeedMetadata) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *FeedMetadata) GetProcessingInstruction() FeedMetadata_ProcessingInstruction {
if m != nil {
return m.ProcessingInstruction
}
return FeedMetadata_PROCESS_UNKNOWN
}
func (m *FeedMetadata) GetShardNumber() int32 {
if m != nil {
return m.ShardNumber
}
return 0
}
func (m *FeedMetadata) GetTotalShards() int32 {
if m != nil {
return m.TotalShards
}
return 0
}
func (m *FeedMetadata) GetNonce() uint64 {
if m != nil {
return m.Nonce
}
return 0
}
func (m *FeedMetadata) GetGenerationTimestamp() int64 {
if m != nil {
return m.GenerationTimestamp
}
return 0
}
type AvailabilityFeed struct {
Metadata *FeedMetadata `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"`
ServiceAvailability []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability" json:"service_availability,omitempty"`
}
func (m *AvailabilityFeed) Reset() { *m = AvailabilityFeed{} }
func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) }
func (*AvailabilityFeed) ProtoMessage() {}
func (*AvailabilityFeed) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (m *AvailabilityFeed) GetMetadata() *FeedMetadata {
if m != nil {
return m.Metadata
}
return nil
}
func (m *AvailabilityFeed) GetServiceAvailability() []*ServiceAvailability {
if m != nil {
return m.ServiceAvailability
}
return nil
}
type ServiceAvailability struct {
// If provided, we will consider the Availability entities provided to be a
// complete snapshot from [start_timestamp_restrict, end_timestamp_restrict).
// That is, all existing availability will be deleted if the following
// condition holds true:
//
// start_timestamp_restrict <= Availability.start_sec &&
// Availability.start_sec < end_timestamp_restrict
//
// If a resource_restrict message is set, the condition is further restricted:
//
// Availability.resource.staff_id == resource_restrict.staff_id &&
// Availability.resource.room_id == resource_restrict.room_id
//
// These fields are typically used to provide a complete update of
// availability in a given time range.
//
// Setting start_timestamp_restrict while leaving end_timestamp_restrict unset
// is interpreted to mean all time beginning at start_timestamp_restrict.
//
// Setting end_timestamp_restrict while leaving start_timestamp_restrict unset
// is interpreted to mean all time up to the end_timestamp_restrict.
//
// In Unix time format (seconds since the epoch).
StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict" json:"start_timestamp_restrict,omitempty"`
EndTimestampRestrict int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict" json:"end_timestamp_restrict,omitempty"`
// If provided, the timestamp restricts will be applied only to the given
// merchant or service.
//
// These fields are typically used to provide complete snapshot of
// availability in a given range (defined above) for a specific merchant or
// service.
//
// Leaving these fields unset, or setting these to the empty string or null,
// is interpreted to mean that no restrict is intended.
MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict" json:"merchant_id_restrict,omitempty"`
ServiceIdRestrict string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict" json:"service_id_restrict,omitempty"`
// Setting resources_restrict further restricts the scope of the update to
// just this set of resources. All id fields of the resources must match
// exactly.
ResourcesRestrict *Resources `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict" json:"resources_restrict,omitempty"`
Availability []*Availability `protobuf:"bytes,5,rep,name=availability" json:"availability,omitempty"`
}
func (m *ServiceAvailability) Reset() { *m = ServiceAvailability{} }
func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) }
func (*ServiceAvailability) ProtoMessage() {}
func (*ServiceAvailability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *ServiceAvailability) GetStartTimestampRestrict() int64 {
if m != nil {
return m.StartTimestampRestrict
}
return 0
}
func (m *ServiceAvailability) GetEndTimestampRestrict() int64 {
if m != nil {
return m.EndTimestampRestrict
}
return 0
}
func (m *ServiceAvailability) GetMerchantIdRestrict() string {
if m != nil {
return m.MerchantIdRestrict
}
return ""
}
func (m *ServiceAvailability) GetServiceIdRestrict() string {
if m != nil {
return m.ServiceIdRestrict
}
return ""
}
func (m *ServiceAvailability) GetResourcesRestrict() *Resources {
if m != nil {
return m.ResourcesRestrict
}
return nil
}
func (m *ServiceAvailability) GetAvailability() []*Availability {
if m != nil {
return m.Availability
}
return nil
}
// An availability of the merchant's service, indicating time and number
// of spots.
// The availability feed should be a list of this message.
// Please note that it's up to the partner to call out all the possible
// availabilities.
// If a massage therapist is available 9am-12pm, and they provide
// one-hour massage sessions, the aggregator should provide the feed as
// availability {start_sec: 9am, duration: 60 minutes, ...}
// availability {start_sec: 10am, duration: 60 minutes, ...}
// availability {start_sec: 11am, duration: 60 minutes, ...}
// instead of
// availability {start_sec: 9am, duration: 180 minutes, ...}
//
type Availability struct {
// An opaque string from an aggregator to identify a merchant.
MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
// An opaque string from aggregator to identify a service of the
// merchant.
ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
// Start time of this availability, using epoch time in seconds.
StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"`
// Duration of the service in seconds, e.g. 30 minutes for a chair massage.
DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"`
// Number of total spots and open spots of this availability.
// E.g. a Yoga class of 10 spots with 3 booked.
// availability {spots_total: 10, spots_open: 7 ...}
// E.g. a chair massage session which was already booked.
// availability {spots_total: 1, spots_open: 0 ...}
//
// Note: If sending requests using the availability compression format defined
// below, these two fields will be inferred. A Recurrence
// implies spots_total=1 and spots_open=1. A ScheduleException implies
// spots_total=1 and spots_open=0.
SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal" json:"spots_total,omitempty"`
SpotsOpen int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen" json:"spots_open,omitempty"`
// An optional opaque string to identify this availability slot. If set, it
// will be included in the requests that book/update/cancel appointments.
AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag" json:"availability_tag,omitempty"`
// Optional resources used to disambiguate this availability slot from
// others when different staff, room, or party_size values are part
// of the service.
//
// E.g. the same Yoga class with two 2 instructors.
// availability { resources { staff_id: "1" staff_name: "Amy" }
// spots_total: 10 spots_open: 7 }
// availability { resources { staff_id: "2" staff_name: "John" }
// spots_total: 5 spots_open: 2 }
Resources *Resources `protobuf:"bytes,8,opt,name=resources" json:"resources,omitempty"`
// A list of ids referencing the payment options which can be used to pay
// for this slot. The actual payment options are defined at the Merchant
// level, and can also be shared among multiple Merchants.
//
// This field overrides any payment_option_ids specified in the service
// message. Similarly payment_option_ids specified here do NOT have to be
// present in the service message, though must be defined at the
// Merchant level.
PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"`
// The recurrence information for the availability, representing more than one
// start time. A recurrence should contain appointments for one working day.
Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence" json:"recurrence,omitempty"`
// When this service cannot be scheduled. To limit the number of
// schedule_exception messages consider joining adjacent exceptions.
ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException" json:"schedule_exception,omitempty"`
}
func (m *Availability) Reset() { *m = Availability{} }
func (m *Availability) String() string { return proto.CompactTextString(m) }
func (*Availability) ProtoMessage() {}
func (*Availability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *Availability) GetMerchantId() string {
if m != nil {
return m.MerchantId
}
return ""
}
func (m *Availability) GetServiceId() string {
if m != nil {
return m.ServiceId
}
return ""
}
func (m *Availability) GetStartSec() int64 {
if m != nil {
return m.StartSec
}
return 0
}
func (m *Availability) GetDurationSec() int64 {
if m != nil {
return m.DurationSec
}
return 0
}
func (m *Availability) GetSpotsTotal() int64 {
if m != nil {
return m.SpotsTotal
}
return 0
}
func (m *Availability) GetSpotsOpen() int64 {
if m != nil {
return m.SpotsOpen
}
return 0
}
func (m *Availability) GetAvailabilityTag() string {
if m != nil {
return m.AvailabilityTag
}
return ""
}
func (m *Availability) GetResources() *Resources {
if m != nil {
return m.Resources
}
return nil
}
func (m *Availability) GetPaymentOptionId() []string {
if m != nil {
return m.PaymentOptionId
}
return nil
}
func (m *Availability) GetRecurrence() *Availability_Recurrence {
if m != nil {
return m.Recurrence
}
return nil
}
func (m *Availability) GetScheduleException() []*Availability_ScheduleException {
if m != nil {
return m.ScheduleException
}
return nil
}
// Recurrence messages are optional, but allow for a more compact
// representation of consistently repeating availability slots. They typically
// represent a day's working schedule.
// ScheduleException messages are then used to represent booked/unavailable
// time ranges within the work day.
//
// Requirements:
// 1. The expansion of availability slots or recurrences must NOT create
// identical slots. If the ids, start_sec, duration_sec, and resources
// match, slots are considered identical.
// 2. Do NOT mix the standard availability format and recurrence within the
// slots of a single service. Recurrence benefits merchants/services that
// offer appointments. The standard format is geared towards
// merchants/services with regularly scheduled classes.
type Availability_Recurrence struct {
// The inclusive maximum UTC timestamp the availability repeats until.
RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec" json:"repeat_until_sec,omitempty"`
// Defines the time between successive availability slots.
//
// E.g. An availability with a duration of 20 min, a repeat_every_sec of
// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
// 11-11:20am.
RepeatEverySec int32 `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec" json:"repeat_every_sec,omitempty"`
}
func (m *Availability_Recurrence) Reset() { *m = Availability_Recurrence{} }
func (m *Availability_Recurrence) String() string { return proto.CompactTextString(m) }
func (*Availability_Recurrence) ProtoMessage() {}
func (*Availability_Recurrence) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} }
func (m *Availability_Recurrence) GetRepeatUntilSec() int64 {
if m != nil {
return m.RepeatUntilSec
}
return 0
}
func (m *Availability_Recurrence) GetRepeatEverySec() int32 {
if m != nil {
return m.RepeatEverySec
}
return 0
}
// ScheduleException messages are used to represent booked/unavailable time
// ranges within the work day. As time slots are booked, the list of
// exceptions should grow to reflect the newly unavailable time ranges.
// The recurrence itself shouldn't be modified.
type Availability_ScheduleException struct {
// The time range of the exception.
TimeRange *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange" json:"time_range,omitempty"`
}
func (m *Availability_ScheduleException) Reset() { *m = Availability_ScheduleException{} }
func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) }
func (*Availability_ScheduleException) ProtoMessage() {}
func (*Availability_ScheduleException) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{3, 1}
}
func (m *Availability_ScheduleException) GetTimeRange() *TimeRange {
if m != nil {
return m.TimeRange
}
return nil
}
// A resource is used to disambiguate availability slots from one another when
// different staff, room or party_size values are part of the service.
// Multiple slots for the same service and time interval can co-exist when they
// have different resources.
type Resources struct {
// Optional id for a staff member providing the service. This field identifies
// the staff member across all merchants, services, and availability records.
// It also needs to be stable over time to allow correlation with past
// bookings.
// This field must be present if staff_name is present.
StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId" json:"staff_id,omitempty"`
// Optional name of a staff member providing the service. This field will be
// displayed to users making a booking, and should be human readable, as
// opposed to an opaque identifier.
// This field must be present if staff_id is present.
StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName" json:"staff_name,omitempty"`
// An optional id for the room the service is located in. This field
// identifies the room across all merchants, services, and availability
// records. It also needs to be stable over time to allow correlation with
// past bookings.
// This field must be present if room_name is present.
RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId" json:"room_id,omitempty"`
// An optional name for the room the service is located in. This
// field will be displayed to users making a booking, and should be human
// readable, as opposed to an opaque identifier.
// This field must be present if room_id is present.
RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName" json:"room_name,omitempty"`
// Applicable only for Dining: The party size which can be accommodated
// during this time slot. A restaurant can be associated with multiple Slots
// for the same time, each specifying a different party_size, if for instance
// 2, 3, or 4 people can be seated with a reservation.
PartySize int32 `protobuf:"varint,5,opt,name=party_size,json=partySize" json:"party_size,omitempty"`
}
func (m *Resources) Reset() { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage() {}
func (*Resources) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *Resources) GetStaffId() string {
if m != nil {
return m.StaffId
}
return ""
}
func (m *Resources) GetStaffName() string {
if m != nil {
return m.StaffName
}
return ""
}
func (m *Resources) GetRoomId() string {
if m != nil {
return m.RoomId
}
return ""
}
func (m *Resources) GetRoomName() string {
if m != nil {
return m.RoomName
}
return ""
}
func (m *Resources) GetPartySize() int32 {
if m != nil {
return m.PartySize
}
return 0
}
type TimeRange struct {
BeginSec int64 `protobuf:"varint,1,opt,name=begin_sec,json=beginSec" json:"begin_sec,omitempty"`
EndSec int64 `protobuf:"varint,2,opt,name=end_sec,json=endSec" json:"end_sec,omitempty"`
}
func (m *TimeRange) Reset() { *m = TimeRange{} }
func (m *TimeRange) String() string { return proto.CompactTextString(m) }
func (*TimeRange) ProtoMessage() {}
func (*TimeRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *TimeRange) GetBeginSec() int64 {
if m != nil {
return m.BeginSec
}
return 0
}
func (m *TimeRange) GetEndSec() int64 {
if m != nil {
return m.EndSec
}
return 0
}
func init() {
proto.RegisterType((*FeedMetadata)(nil), "maps.booking.feeds.FeedMetadata")
proto.RegisterType((*AvailabilityFeed)(nil), "maps.booking.feeds.AvailabilityFeed")
proto.RegisterType((*ServiceAvailability)(nil), "maps.booking.feeds.ServiceAvailability")
proto.RegisterType((*Availability)(nil), "maps.booking.feeds.Availability")
proto.RegisterType((*Availability_Recurrence)(nil), "maps.booking.feeds.Availability.Recurrence")
proto.RegisterType((*Availability_ScheduleException)(nil), "maps.booking.feeds.Availability.ScheduleException")
proto.RegisterType((*Resources)(nil), "maps.booking.feeds.Resources")
proto.RegisterType((*TimeRange)(nil), "maps.booking.feeds.TimeRange")
proto.RegisterEnum("maps.booking.feeds.FeedMetadata_ProcessingInstruction", FeedMetadata_ProcessingInstruction_name, FeedMetadata_ProcessingInstruction_value)
}
func init() { proto.RegisterFile("availability_feed.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 859 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdb, 0x6e, 0x23, 0x45,
0x10, 0xc5, 0x76, 0x9c, 0x64, 0xca, 0xd1, 0xae, 0xdd, 0xf6, 0x26, 0x43, 0x50, 0xb4, 0xc6, 0x2f,
0x18, 0x90, 0x2c, 0x08, 0x08, 0x21, 0xb1, 0x2f, 0x51, 0x30, 0x52, 0xb4, 0x89, 0x1d, 0x7a, 0xbc,
0x42, 0xe2, 0x65, 0x68, 0xcf, 0x54, 0x9c, 0x11, 0x9e, 0x9e, 0x51, 0x77, 0x3b, 0x22, 0xfb, 0x29,
0x7c, 0x03, 0xff, 0xc1, 0xe7, 0xf0, 0x01, 0xbc, 0xa0, 0xae, 0xb9, 0x9a, 0x58, 0xca, 0xbe, 0x79,
0x4e, 0x9d, 0xd3, 0x97, 0x73, 0xaa, 0xda, 0x70, 0x22, 0x1e, 0x44, 0xb4, 0x16, 0xcb, 0x68, 0x1d,
0x99, 0x47, 0xff, 0x0e, 0x31, 0x9c, 0xa4, 0x2a, 0x31, 0x09, 0x63, 0xb1, 0x48, 0xf5, 0x64, 0x99,
0x24, 0xbf, 0x47, 0x72, 0x35, 0xb1, 0x05, 0x3d, 0xfa, 0xa7, 0x09, 0x47, 0x3f, 0x21, 0x86, 0x37,
0x68, 0x44, 0x28, 0x8c, 0x60, 0x31, 0x1c, 0xa7, 0x2a, 0x09, 0x50, 0xeb, 0x48, 0xae, 0xfc, 0x48,
0x6a, 0xa3, 0x36, 0x81, 0x89, 0x12, 0xe9, 0x36, 0x86, 0x8d, 0xf1, 0x8b, 0xf3, 0xef, 0x26, 0x4f,
0x57, 0x99, 0xd4, 0x57, 0x98, 0xdc, 0x96, 0xf2, 0xab, 0x4a, 0xcd, 0x5f, 0xa5, 0xbb, 0x60, 0xf6,
0x29, 0x1c, 0xe9, 0x7b, 0xa1, 0x42, 0x5f, 0x6e, 0xe2, 0x25, 0x2a, 0xb7, 0x39, 0x6c, 0x8c, 0xdb,
0xbc, 0x43, 0xd8, 0x8c, 0x20, 0x4b, 0x31, 0x89, 0x11, 0x6b, 0x9f, 0x40, 0xed, 0xb6, 0x32, 0x0a,
0x61, 0x1e, 0x41, 0x6c, 0x00, 0x6d, 0x99, 0xc8, 0x00, 0xdd, 0xf6, 0xb0, 0x31, 0xde, 0xe3, 0xd9,
0x07, 0xfb, 0x1a, 0x06, 0x2b, 0x94, 0xa8, 0x84, 0xdd, 0xc9, 0x37, 0x51, 0x8c, 0xda, 0x88, 0x38,
0x75, 0xf7, 0x86, 0x8d, 0x71, 0x8b, 0xf7, 0xab, 0xda, 0xa2, 0x28, 0x8d, 0x04, 0xbc, 0xda, 0x79,
0x7c, 0xd6, 0x87, 0x97, 0xb7, 0x7c, 0x7e, 0x39, 0xf5, 0x3c, 0xff, 0xdd, 0xec, 0xed, 0x6c, 0xfe,
0xcb, 0xac, 0xfb, 0x11, 0x3b, 0x81, 0x7e, 0x01, 0x5e, 0x78, 0xfe, 0xe5, 0xfc, 0xe6, 0xf6, 0x7a,
0xba, 0x98, 0x76, 0x1b, 0xec, 0x14, 0x8e, 0x6b, 0x85, 0xab, 0xd9, 0x25, 0x9f, 0xde, 0x4c, 0x67,
0x8b, 0x8b, 0xeb, 0x6e, 0x73, 0xf4, 0x57, 0x03, 0xba, 0x17, 0xb5, 0x84, 0xac, 0x77, 0xec, 0x0d,
0x1c, 0xc6, 0xb9, 0x7f, 0xe4, 0x73, 0xe7, 0x7c, 0xf8, 0x9c, 0xcf, 0xbc, 0x54, 0xb0, 0x5f, 0x61,
0xa0, 0x51, 0x3d, 0x44, 0x01, 0xfa, 0xf5, 0xec, 0xdd, 0xe6, 0xb0, 0x35, 0xee, 0x9c, 0x7f, 0xb6,
0x6b, 0x25, 0x2f, 0xe3, 0xd7, 0x0f, 0xc2, 0xfb, 0xfa, 0x29, 0x38, 0xfa, 0xb7, 0x09, 0xfd, 0x1d,
0x64, 0xf6, 0x3d, 0xb8, 0xda, 0x08, 0x65, 0x2a, 0x5f, 0x7d, 0x85, 0xda, 0xa8, 0x28, 0x30, 0x74,
0x83, 0x16, 0x3f, 0xa6, 0x7a, 0xe9, 0x2d, 0xcf, 0xab, 0xec, 0x5b, 0x38, 0x46, 0x19, 0xee, 0xd2,
0x35, 0x49, 0x37, 0x40, 0x19, 0x3e, 0x55, 0x7d, 0x05, 0x83, 0x18, 0x55, 0x70, 0x2f, 0xa4, 0xf1,
0xa3, 0xb0, 0xd2, 0xd8, 0x6e, 0x70, 0x38, 0x2b, 0x6a, 0x57, 0x61, 0xa9, 0x98, 0x40, 0x71, 0xa1,
0x2d, 0xc1, 0x1e, 0x09, 0x7a, 0x79, 0xa9, 0xc6, 0xbf, 0x06, 0xa6, 0x50, 0x27, 0x1b, 0x15, 0xa0,
0xae, 0xe8, 0xfb, 0x94, 0xc6, 0xd9, 0x2e, 0x0f, 0x79, 0xc1, 0xe6, 0xbd, 0x52, 0x58, 0xae, 0xf6,
0x23, 0x1c, 0x6d, 0x65, 0xd1, 0xa6, 0x2c, 0x76, 0xa6, 0xba, 0x15, 0xc2, 0x96, 0x6a, 0xf4, 0x77,
0x1b, 0x8e, 0xb6, 0x6c, 0x7f, 0x0d, 0x9d, 0x9a, 0x0d, 0xe4, 0xb4, 0xc3, 0xa1, 0xba, 0x3d, 0x3b,
0x03, 0xa8, 0x6e, 0x4d, 0x8e, 0x3a, 0xdc, 0x29, 0x2f, 0xcb, 0x3e, 0x01, 0x27, 0x8b, 0x4d, 0x63,
0x40, 0xde, 0xb5, 0xf8, 0x21, 0x01, 0x1e, 0x06, 0x76, 0xd2, 0xc2, 0x4d, 0x3e, 0x2e, 0xb6, 0x9e,
0x0d, 0x4a, 0xa7, 0xc0, 0x2c, 0xe5, 0x35, 0x74, 0x74, 0x9a, 0x18, 0xed, 0xd3, 0xf8, 0xd1, 0xbc,
0xb5, 0x38, 0x10, 0xb4, 0xb0, 0x08, 0xed, 0x4f, 0x84, 0x24, 0x45, 0x49, 0xee, 0xb5, 0xb8, 0x43,
0xc8, 0x3c, 0x45, 0xc9, 0x3e, 0x87, 0xee, 0xd6, 0xf3, 0x64, 0xc4, 0xca, 0x3d, 0xa0, 0x43, 0xbe,
0xac, 0xe3, 0x0b, 0xb1, 0x62, 0x3f, 0x80, 0x53, 0xda, 0xea, 0x1e, 0x7e, 0x48, 0x0c, 0x15, 0x9f,
0x7d, 0x01, 0xbd, 0x54, 0x3c, 0xc6, 0x28, 0x8d, 0x9f, 0xa4, 0x74, 0xa1, 0x28, 0x74, 0x9d, 0x61,
0xcb, 0x6e, 0x94, 0x17, 0xe6, 0x84, 0x5f, 0x85, 0xec, 0x2d, 0x80, 0xc2, 0x60, 0xa3, 0x14, 0xda,
0x27, 0x04, 0x68, 0xa7, 0x2f, 0x9f, 0x0b, 0x6a, 0xc2, 0x4b, 0x09, 0xaf, 0xc9, 0x99, 0x00, 0xa6,
0x83, 0x7b, 0x0c, 0x37, 0x6b, 0xf4, 0xf1, 0x8f, 0x00, 0x69, 0x13, 0xb7, 0x43, 0xe9, 0x9f, 0x3f,
0xbb, 0xa8, 0x97, 0x4b, 0xa7, 0x85, 0x92, 0xf7, 0xf4, 0xff, 0xa1, 0xd3, 0xdf, 0x00, 0xaa, 0xcd,
0xd9, 0x18, 0xba, 0x0a, 0x53, 0x14, 0xc6, 0xdf, 0x48, 0x13, 0xad, 0x29, 0xb8, 0x6c, 0x00, 0x5f,
0x64, 0xf8, 0x3b, 0x0b, 0xdb, 0xec, 0x2a, 0x26, 0x3e, 0xa0, 0x7a, 0x24, 0x66, 0xf6, 0xde, 0xe6,
0xcc, 0xa9, 0x85, 0x3d, 0x0c, 0x4e, 0x7f, 0x86, 0xde, 0x93, 0x93, 0xb0, 0x37, 0x00, 0x76, 0x66,
0x7d, 0x25, 0xe4, 0x0a, 0xf3, 0x57, 0x6a, 0x67, 0x20, 0x76, 0x78, 0xb9, 0x25, 0x71, 0xc7, 0x14,
0x3f, 0x47, 0x7f, 0x36, 0xc0, 0x29, 0x93, 0x62, 0x1f, 0x83, 0xed, 0xba, 0xbb, 0xbb, 0xaa, 0x87,
0x0f, 0xe8, 0x3b, 0x6f, 0x60, 0x2a, 0x49, 0x11, 0x63, 0xd9, 0xc0, 0x16, 0x99, 0x89, 0x18, 0xd9,
0x09, 0x1c, 0xa8, 0x24, 0x89, 0xad, 0x30, 0x1b, 0xfd, 0x7d, 0xfb, 0x99, 0x75, 0x36, 0x15, 0x48,
0x96, 0x0d, 0xf9, 0xa1, 0x05, 0x48, 0x75, 0x06, 0x90, 0x0a, 0x65, 0x1e, 0x7d, 0x1d, 0xbd, 0xcf,
0xfe, 0x25, 0xda, 0xdc, 0x21, 0xc4, 0x8b, 0xde, 0xe3, 0xe8, 0x02, 0x9c, 0xf2, 0xd0, 0x76, 0xa1,
0x25, 0xae, 0x22, 0x59, 0x73, 0xf2, 0x90, 0x00, 0xeb, 0xe1, 0x09, 0x1c, 0xd8, 0xc7, 0xab, 0xb0,
0xae, 0xc5, 0xf7, 0x51, 0x86, 0x1e, 0x06, 0xcb, 0x7d, 0xfa, 0x8f, 0xfd, 0xe6, 0xbf, 0x00, 0x00,
0x00, 0xff, 0xff, 0x08, 0xf3, 0x9e, 0x1d, 0x7e, 0x07, 0x00, 0x00,
}