From ae75931d1b2f3a7568187181a1fd584f43829534 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 19 Nov 2020 17:11:44 +0100 Subject: [PATCH 1/4] make+poolrpc: add rpc-format command --- Makefile | 4 ++++ poolrpc/.clang-format | 7 +++++++ poolrpc/auctioneer.proto | 39 ++++++++++++++++++++++++++------------- poolrpc/trader.proto | 12 ++++++++---- 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 poolrpc/.clang-format diff --git a/Makefile b/Makefile index d5b8b30..9d21298 100644 --- a/Makefile +++ b/Makefile @@ -146,6 +146,10 @@ rpc: @$(call print, "Compiling protos.") cd ./poolrpc; ./gen_protos.sh +rpc-format: + @$(call print, "Formatting protos.") + cd ./poolrpc; find . -name "*.proto" | xargs clang-format --style=file -i + clean: @$(call print, "Cleaning source.$(NC)") $(RM) ./pool diff --git a/poolrpc/.clang-format b/poolrpc/.clang-format new file mode 100644 index 0000000..f191427 --- /dev/null +++ b/poolrpc/.clang-format @@ -0,0 +1,7 @@ +--- +Language: Proto +BasedOnStyle: Google +IndentWidth: 4 +AllowShortFunctionsOnASingleLine: None +SpaceBeforeParens: Always +CompactNamespaces: false diff --git a/poolrpc/auctioneer.proto b/poolrpc/auctioneer.proto index 7c5bfde..a262ed1 100644 --- a/poolrpc/auctioneer.proto +++ b/poolrpc/auctioneer.proto @@ -6,16 +6,31 @@ option go_package = "github.com/lightninglabs/pool/poolrpc"; service ChannelAuctioneer { rpc ReserveAccount (ReserveAccountRequest) returns (ReserveAccountResponse); - rpc InitAccount (ServerInitAccountRequest) returns (ServerInitAccountResponse); - rpc ModifyAccount (ServerModifyAccountRequest) returns (ServerModifyAccountResponse); - rpc SubmitOrder (ServerSubmitOrderRequest) returns (ServerSubmitOrderResponse); - rpc CancelOrder (ServerCancelOrderRequest) returns (ServerCancelOrderResponse); + + rpc InitAccount (ServerInitAccountRequest) + returns (ServerInitAccountResponse); + + rpc ModifyAccount (ServerModifyAccountRequest) + returns (ServerModifyAccountResponse); + + rpc SubmitOrder (ServerSubmitOrderRequest) + returns (ServerSubmitOrderResponse); + + rpc CancelOrder (ServerCancelOrderRequest) + returns (ServerCancelOrderResponse); + rpc OrderState (ServerOrderStateRequest) returns (ServerOrderStateResponse); - rpc SubscribeBatchAuction (stream ClientAuctionMessage) returns (stream ServerAuctionMessage); + + rpc SubscribeBatchAuction (stream ClientAuctionMessage) + returns (stream ServerAuctionMessage); + rpc Terms (TermsRequest) returns (TermsResponse); + rpc RelevantBatchSnapshot (RelevantBatchRequest) returns (RelevantBatch); + rpc BatchSnapshot (BatchSnapshotRequest) returns (BatchSnapshotResponse); - rpc NodeRating(ServerNodeRatingRequest) returns (ServerNodeRatingResponse); + + rpc NodeRating (ServerNodeRatingRequest) returns (ServerNodeRatingResponse); } message ReserveAccountRequest { @@ -525,7 +540,7 @@ message SubscribeError { /* The account the trader tried to subscribe to does not exist in the - auctioneer's database. + auctioneer's database. */ ACCOUNT_DOES_NOT_EXIST = 2; @@ -758,7 +773,7 @@ message ServerOrder { /* The multi signature key of the node creating the order, will be used for the - target channel's funding TX 2-of-2 multi signature output. + target channel's funding TX 2-of-2 multi signature output. */ bytes multi_sig_key = 8; @@ -773,7 +788,7 @@ message ServerOrder { repeated NodeAddress node_addr = 10; /* - // TODO(guggero): implement + // TODO(guggero): implement int64 min_node_score = 11; */ reserved 11; @@ -860,9 +875,7 @@ message CancelOrder { } message InvalidOrder { - enum FailReason { - INVALID_AMT = 0; - } + enum FailReason { INVALID_AMT = 0; } bytes order_nonce = 1; FailReason fail_reason = 2; @@ -965,7 +978,7 @@ message TermsResponse { /* The maximum order duration in blocks currently allowed by the auctioneer. */ - uint32 max_order_duration_blocks = 2 [deprecated=true]; + uint32 max_order_duration_blocks = 2 [deprecated = true]; /* The execution fee charged per matched order. diff --git a/poolrpc/trader.proto b/poolrpc/trader.proto index 4741226..5e68f6c 100644 --- a/poolrpc/trader.proto +++ b/poolrpc/trader.proto @@ -55,7 +55,8 @@ service Trader { WithdrawAccount splits off parts of the account balance into the specified outputs while recreating the account with a reduced balance. */ - rpc WithdrawAccount (WithdrawAccountRequest) returns (WithdrawAccountResponse) { + rpc WithdrawAccount (WithdrawAccountRequest) + returns (WithdrawAccountResponse) { option (google.api.http) = { post: "/v1/pool/accounts/withdraw" body: "*" @@ -66,7 +67,8 @@ service Trader { DepositAccount adds more funds from the connected lnd node's wallet to an account. */ - rpc DepositAccount (DepositAccountRequest) returns (DepositAccountResponse) { + rpc DepositAccount (DepositAccountRequest) + returns (DepositAccountResponse) { option (google.api.http) = { post: "/v1/pool/accounts/deposit" body: "*" @@ -81,7 +83,8 @@ service Trader { account, and this RPC is invoked again, then a replacing transaction (RBF) of the child will be broadcast. */ - rpc BumpAccountFee (BumpAccountFeeRequest) returns (BumpAccountFeeResponse) { + rpc BumpAccountFee (BumpAccountFeeRequest) + returns (BumpAccountFeeResponse) { option (google.api.http) = { post: "/v1/pool/accounts/bump" body: "*" @@ -92,7 +95,8 @@ service Trader { RecoverAccounts queries the auction server for this trader daemon's accounts in case we lost our local account database. */ - rpc RecoverAccounts (RecoverAccountsRequest) returns (RecoverAccountsResponse) { + rpc RecoverAccounts (RecoverAccountsRequest) + returns (RecoverAccountsResponse) { option (google.api.http) = { post: "/v1/pool/accounts/recover" body: "*" From fde059c09628a7fa26fcb03f5b24a49314165b89 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 19 Nov 2020 17:11:45 +0100 Subject: [PATCH 2/4] poolrpc: add batch query RPCs --- auctioneer/client.go | 15 + macaroons.go | 4 + poolrpc/auctioneer.pb.go | 607 ++++++++++++++++++++++-------------- poolrpc/auctioneer.proto | 22 ++ poolrpc/trader.pb.go | 443 ++++++++++++++------------ poolrpc/trader.pb.gw.go | 120 +++++++ poolrpc/trader.proto | 16 + poolrpc/trader.swagger.json | 55 +++- rpcserver.go | 12 + 9 files changed, 864 insertions(+), 430 deletions(-) diff --git a/auctioneer/client.go b/auctioneer/client.go index fa34b54..6008a62 100644 --- a/auctioneer/client.go +++ b/auctioneer/client.go @@ -1182,6 +1182,21 @@ func (c *Client) BatchSnapshot(ctx context.Context, }) } +// BatchSnapshots returns a list of batch snapshots starting at the start batch +// ID and going back through the history of batches, returning at most the +// number of specified batches. A maximum of 100 snapshots can be queried in +// one call. If no start batch ID is provided, the most recent finalized batch +// is used as the starting point to go back from. +// +// NOTE: This isn't wrapped in "native" types, as atm we only use this to +// shuffle information back to the client over our RPC interface. +func (c *Client) BatchSnapshots(ctx context.Context, + req *poolrpc.BatchSnapshotsRequest) (*poolrpc.BatchSnapshotsResponse, + error) { + + return c.client.BatchSnapshots(ctx, req) +} + // NodeRating returns the current up to date ratings information for the target // node pubkey. func (c *Client) NodeRating(ctx context.Context, diff --git a/macaroons.go b/macaroons.go index 6982a7c..597a4c3 100644 --- a/macaroons.go +++ b/macaroons.go @@ -94,6 +94,10 @@ var ( Entity: "auction", Action: "read", }}, + "/poolrpc.Trader/BatchSnapshots": {{ + Entity: "auction", + Action: "read", + }}, } // allPermissions is the list of all existing permissions that exist diff --git a/poolrpc/auctioneer.pb.go b/poolrpc/auctioneer.pb.go index f9c7e20..6c2aa76 100644 --- a/poolrpc/auctioneer.pb.go +++ b/poolrpc/auctioneer.pb.go @@ -4011,6 +4011,100 @@ func (m *ServerNodeRatingResponse) GetNodeRatings() []*NodeRating { return nil } +type BatchSnapshotsRequest struct { + // + //The unique identifier of the first batch to return, encoded as a compressed + //pubkey. This represents the newest/most current batch to fetch. If this is + //empty or a zero batch ID, the most recent finalized batch is used as the + //starting point to go back from. + StartBatchId []byte `protobuf:"bytes,1,opt,name=start_batch_id,json=startBatchId,proto3" json:"start_batch_id,omitempty"` + // + //The number of batches to return at most, including the start batch. + NumBatchesBack uint32 `protobuf:"varint,2,opt,name=num_batches_back,json=numBatchesBack,proto3" json:"num_batches_back,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BatchSnapshotsRequest) Reset() { *m = BatchSnapshotsRequest{} } +func (m *BatchSnapshotsRequest) String() string { return proto.CompactTextString(m) } +func (*BatchSnapshotsRequest) ProtoMessage() {} +func (*BatchSnapshotsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f3883418d94ca37f, []int{55} +} + +func (m *BatchSnapshotsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BatchSnapshotsRequest.Unmarshal(m, b) +} +func (m *BatchSnapshotsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BatchSnapshotsRequest.Marshal(b, m, deterministic) +} +func (m *BatchSnapshotsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_BatchSnapshotsRequest.Merge(m, src) +} +func (m *BatchSnapshotsRequest) XXX_Size() int { + return xxx_messageInfo_BatchSnapshotsRequest.Size(m) +} +func (m *BatchSnapshotsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_BatchSnapshotsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_BatchSnapshotsRequest proto.InternalMessageInfo + +func (m *BatchSnapshotsRequest) GetStartBatchId() []byte { + if m != nil { + return m.StartBatchId + } + return nil +} + +func (m *BatchSnapshotsRequest) GetNumBatchesBack() uint32 { + if m != nil { + return m.NumBatchesBack + } + return 0 +} + +type BatchSnapshotsResponse struct { + // The list of batches requested. + Batches []*BatchSnapshotResponse `protobuf:"bytes,1,rep,name=batches,proto3" json:"batches,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BatchSnapshotsResponse) Reset() { *m = BatchSnapshotsResponse{} } +func (m *BatchSnapshotsResponse) String() string { return proto.CompactTextString(m) } +func (*BatchSnapshotsResponse) ProtoMessage() {} +func (*BatchSnapshotsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f3883418d94ca37f, []int{56} +} + +func (m *BatchSnapshotsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BatchSnapshotsResponse.Unmarshal(m, b) +} +func (m *BatchSnapshotsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BatchSnapshotsResponse.Marshal(b, m, deterministic) +} +func (m *BatchSnapshotsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_BatchSnapshotsResponse.Merge(m, src) +} +func (m *BatchSnapshotsResponse) XXX_Size() int { + return xxx_messageInfo_BatchSnapshotsResponse.Size(m) +} +func (m *BatchSnapshotsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_BatchSnapshotsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_BatchSnapshotsResponse proto.InternalMessageInfo + +func (m *BatchSnapshotsResponse) GetBatches() []*BatchSnapshotResponse { + if m != nil { + return m.Batches + } + return nil +} + func init() { proto.RegisterEnum("poolrpc.ChannelType", ChannelType_name, ChannelType_value) proto.RegisterEnum("poolrpc.AuctionAccountState", AuctionAccountState_name, AuctionAccountState_value) @@ -4083,246 +4177,253 @@ func init() { proto.RegisterType((*ServerNodeRatingRequest)(nil), "poolrpc.ServerNodeRatingRequest") proto.RegisterType((*NodeRating)(nil), "poolrpc.NodeRating") proto.RegisterType((*ServerNodeRatingResponse)(nil), "poolrpc.ServerNodeRatingResponse") + proto.RegisterType((*BatchSnapshotsRequest)(nil), "poolrpc.BatchSnapshotsRequest") + proto.RegisterType((*BatchSnapshotsResponse)(nil), "poolrpc.BatchSnapshotsResponse") } func init() { proto.RegisterFile("auctioneer.proto", fileDescriptor_f3883418d94ca37f) } var fileDescriptor_f3883418d94ca37f = []byte{ - // 3741 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0xcb, 0x72, 0xdb, 0x58, - 0x76, 0xe2, 0x43, 0x22, 0x79, 0x08, 0x52, 0xd0, 0xd5, 0xc3, 0x14, 0xdb, 0x72, 0xcb, 0xe8, 0x9e, - 0x8e, 0x5b, 0xdd, 0x96, 0x6d, 0xb9, 0xc7, 0xe9, 0xe9, 0x71, 0x3a, 0x01, 0x49, 0x68, 0x48, 0x9b, - 0x22, 0x39, 0x20, 0x69, 0xb7, 0x27, 0x95, 0x42, 0x81, 0xe4, 0x25, 0x85, 0x88, 0x04, 0x18, 0x00, - 0xb4, 0xa5, 0x2c, 0x66, 0x31, 0xbb, 0x7c, 0x40, 0x2a, 0xa9, 0x4a, 0xcd, 0x2e, 0xfb, 0xa4, 0x92, - 0x4d, 0x96, 0xa9, 0x2c, 0xf2, 0x19, 0x99, 0xa4, 0x2a, 0x3f, 0x91, 0x5d, 0xea, 0x3e, 0x00, 0x02, - 0x20, 0x28, 0x39, 0x93, 0xa4, 0x6a, 0x36, 0x12, 0x70, 0x1e, 0xf7, 0x9e, 0x7b, 0xee, 0x79, 0x83, - 0x20, 0xea, 0x8b, 0xa1, 0x6b, 0x58, 0x26, 0xc6, 0xf6, 0xe9, 0xdc, 0xb6, 0x5c, 0x0b, 0x65, 0xe6, - 0x96, 0x35, 0xb5, 0xe7, 0x43, 0xe9, 0x57, 0x09, 0xd8, 0x57, 0xb1, 0x83, 0xed, 0xf7, 0x58, 0x1e, - 0x0e, 0xad, 0x85, 0xe9, 0xaa, 0xf8, 0xcf, 0x16, 0xd8, 0x71, 0xd1, 0x67, 0x50, 0xd0, 0x19, 0x44, - 0x7b, 0xaf, 0x4f, 0x17, 0xb8, 0x94, 0x38, 0x4e, 0x3c, 0x4a, 0xab, 0x02, 0x07, 0xbe, 0x21, 0x30, - 0xf4, 0x23, 0x28, 0x7a, 0x44, 0xf8, 0x7a, 0x6e, 0xd8, 0x37, 0xa5, 0xe4, 0x71, 0xe2, 0x51, 0x41, - 0xf5, 0x58, 0x15, 0x0a, 0x44, 0x47, 0x00, 0xae, 0xad, 0x8f, 0xb0, 0xad, 0x5d, 0xe1, 0x9b, 0x52, - 0xea, 0x38, 0xf1, 0x48, 0x50, 0x73, 0x0c, 0xf2, 0x1a, 0xdf, 0x48, 0x57, 0x70, 0x10, 0x95, 0xc1, - 0x99, 0x5b, 0xa6, 0xc3, 0xd6, 0xf7, 0x65, 0xa7, 0xcc, 0x09, 0xca, 0x5c, 0x58, 0x42, 0x5f, 0xe3, - 0x1b, 0x74, 0x02, 0x3b, 0x86, 0x69, 0xb8, 0x86, 0x3e, 0xd5, 0x06, 0xba, 0x3b, 0xbc, 0xa4, 0x94, - 0x49, 0x4a, 0xb9, 0xcd, 0x11, 0x15, 0x02, 0x27, 0x9b, 0xfd, 0x67, 0x02, 0x4a, 0x5d, 0xb2, 0x97, - 0xdd, 0x30, 0x0d, 0x37, 0x72, 0xe8, 0x17, 0xcb, 0x43, 0xcf, 0x2d, 0xc3, 0x74, 0xe9, 0x76, 0xf9, - 0xb3, 0x9d, 0x53, 0xae, 0xaf, 0xd3, 0xf6, 0xc2, 0xed, 0x10, 0x84, 0xaf, 0x07, 0xfa, 0x16, 0xd4, - 0x83, 0x33, 0xb4, 0x8d, 0xb9, 0xcb, 0x77, 0xf7, 0x56, 0xeb, 0x52, 0xe0, 0xaa, 0x4e, 0x53, 0x1f, - 0xa5, 0xd3, 0xf4, 0xdd, 0x3a, 0xdd, 0x8c, 0xea, 0xf4, 0x13, 0x38, 0x8c, 0x39, 0x25, 0x53, 0xab, - 0xb4, 0xf0, 0x54, 0xd0, 0x5d, 0x0c, 0x66, 0x86, 0xdb, 0xb6, 0x47, 0xd8, 0xf6, 0x54, 0xf0, 0x05, - 0xa4, 0x74, 0xe7, 0x8a, 0x1f, 0x1c, 0xf9, 0x07, 0x67, 0xf4, 0xb2, 0x73, 0x55, 0xdf, 0x50, 0x09, - 0x01, 0xa1, 0x1b, 0x18, 0x23, 0x7a, 0xce, 0x55, 0xba, 0x8a, 0x31, 0x22, 0x74, 0x03, 0x63, 0x54, - 0xc9, 0x41, 0x66, 0x84, 0x5d, 0xdd, 0x98, 0x3a, 0xc4, 0xd8, 0x0e, 0x63, 0xf6, 0xe5, 0x77, 0xfd, - 0x12, 0x0a, 0x86, 0xf9, 0x5e, 0x9f, 0x1a, 0x23, 0xcd, 0x22, 0x08, 0x2e, 0xc2, 0xbe, 0xbf, 0x74, - 0x83, 0x61, 0x29, 0x57, 0x7d, 0x43, 0x15, 0x8c, 0xc0, 0x3b, 0xba, 0x0f, 0x59, 0x7d, 0x38, 0xc4, - 0x73, 0x17, 0x33, 0x99, 0xb2, 0xf5, 0x0d, 0xd5, 0x87, 0x04, 0x85, 0x68, 0x7a, 0x67, 0xaf, 0xea, - 0xe6, 0x10, 0x4f, 0x43, 0x67, 0x7f, 0x0a, 0x7b, 0x74, 0x6b, 0xcd, 0xb4, 0xcc, 0x21, 0xd6, 0xe6, - 0x36, 0x36, 0x66, 0xfa, 0x04, 0x73, 0xa3, 0x43, 0x14, 0xd7, 0x22, 0xa8, 0x0e, 0xc7, 0x2c, 0xd5, - 0x1c, 0x5a, 0x8d, 0xab, 0xf9, 0xdf, 0x93, 0xb0, 0x57, 0x9d, 0x1a, 0xd8, 0x74, 0x65, 0x66, 0xae, - 0x17, 0xd8, 0x71, 0xf4, 0x09, 0x46, 0xdf, 0xc0, 0xd6, 0xd0, 0x9a, 0xcd, 0x0c, 0xcf, 0xbe, 0xca, - 0xfe, 0x19, 0xf9, 0x4d, 0x55, 0x29, 0x76, 0x86, 0x4d, 0xb7, 0xbe, 0xa1, 0x72, 0x5a, 0xf4, 0x12, - 0x72, 0xce, 0x62, 0x40, 0xec, 0x6b, 0x80, 0xb9, 0xde, 0xef, 0x47, 0x19, 0xbb, 0x8c, 0x60, 0x4e, - 0x76, 0xab, 0x6f, 0xa8, 0x4b, 0x06, 0xf4, 0x1c, 0xb6, 0x98, 0x3a, 0xa8, 0xd1, 0xe5, 0xcf, 0x0e, - 0x97, 0x36, 0x4d, 0x84, 0xbe, 0x20, 0xfe, 0x21, 0x53, 0x02, 0xb2, 0x25, 0x23, 0x25, 0x4c, 0x36, - 0xfe, 0x53, 0x3c, 0x74, 0xa9, 0x0d, 0xc6, 0x33, 0xa9, 0x94, 0x80, 0x30, 0x31, 0x52, 0xf4, 0x18, - 0xd2, 0x8e, 0x31, 0x31, 0xa9, 0x4d, 0xe6, 0xcf, 0xee, 0xc5, 0xb0, 0x74, 0x8d, 0x09, 0x91, 0x8e, - 0x92, 0xa1, 0x6f, 0x20, 0x63, 0xe3, 0xa1, 0xf5, 0x1e, 0xdb, 0xa5, 0x2d, 0xca, 0x51, 0x8a, 0x1e, - 0x4a, 0x65, 0xe8, 0x9b, 0xfa, 0x86, 0xea, 0x91, 0x56, 0x36, 0x21, 0x35, 0x73, 0x26, 0xd2, 0x3b, - 0xd8, 0x59, 0x51, 0x19, 0xfa, 0x14, 0xf2, 0x4c, 0x65, 0xda, 0xa5, 0xee, 0x5c, 0xf2, 0xdb, 0x03, - 0x06, 0xaa, 0xeb, 0xce, 0x25, 0xf1, 0x43, 0x16, 0x27, 0xde, 0x63, 0xdb, 0x31, 0x2c, 0x93, 0x47, - 0x2d, 0x81, 0x02, 0xdf, 0x30, 0x98, 0x64, 0xc3, 0x6e, 0x8c, 0x52, 0x23, 0x7e, 0x97, 0x88, 0xf8, - 0x1d, 0x7a, 0x08, 0x02, 0xdf, 0x9b, 0xda, 0x10, 0x8f, 0x03, 0x5c, 0x1e, 0x6a, 0x3b, 0xe8, 0x10, - 0xb2, 0xfa, 0xc2, 0xbd, 0xd4, 0x1c, 0x63, 0xc2, 0x63, 0x61, 0x86, 0xbc, 0x77, 0x8d, 0x89, 0xf4, - 0x18, 0xc4, 0xe8, 0x6d, 0x10, 0x72, 0x26, 0xac, 0x31, 0xe2, 0xdb, 0x65, 0xe8, 0x7b, 0x63, 0x24, - 0xfd, 0x6d, 0x2a, 0x48, 0xcf, 0x2e, 0xe2, 0x16, 0x7a, 0x74, 0x40, 0xae, 0x53, 0x77, 0xf8, 0x81, - 0x73, 0x2a, 0x7f, 0x43, 0x3f, 0x83, 0x3c, 0x7b, 0xd2, 0x86, 0xd6, 0x88, 0x45, 0xa5, 0xe2, 0xd9, - 0x17, 0x6b, 0xef, 0xfa, 0x94, 0xfd, 0x53, 0x29, 0x8b, 0x0a, 0x8c, 0xb5, 0x6a, 0x8d, 0x30, 0x7a, - 0x03, 0xdb, 0xcc, 0x08, 0x30, 0x77, 0x62, 0xa7, 0x94, 0x3e, 0x4e, 0x3d, 0xca, 0x9f, 0x3d, 0xbe, - 0x6b, 0x31, 0xcc, 0xfc, 0xd8, 0x51, 0x4c, 0xd7, 0xbe, 0x51, 0x8b, 0x76, 0x08, 0x58, 0x7e, 0x0b, - 0xbb, 0x31, 0x64, 0x48, 0x84, 0x94, 0x77, 0x09, 0x39, 0x95, 0x3c, 0xa2, 0x13, 0xd8, 0x64, 0x91, - 0x95, 0xf9, 0xc7, 0x5e, 0x78, 0x5b, 0x2e, 0x37, 0x23, 0xf9, 0x2e, 0xf9, 0x6d, 0x42, 0x1a, 0x82, - 0x10, 0x3c, 0x0c, 0xca, 0x43, 0xa6, 0xdf, 0x7a, 0xdd, 0x6a, 0xbf, 0x6d, 0x89, 0x1b, 0xe8, 0x00, - 0x50, 0x57, 0x51, 0xdf, 0x28, 0xaa, 0x76, 0xd1, 0xe8, 0x56, 0x94, 0xba, 0xfc, 0xa6, 0xd1, 0x56, - 0xc5, 0x04, 0x2a, 0xc3, 0x41, 0x45, 0xee, 0x55, 0xeb, 0xda, 0x1b, 0x45, 0xed, 0x36, 0xda, 0x2d, - 0x82, 0xbe, 0x20, 0x00, 0x31, 0x89, 0x10, 0x14, 0x3b, 0xb2, 0xda, 0x6b, 0xc8, 0x4d, 0x4d, 0x55, - 0x5e, 0x29, 0xd5, 0x9e, 0x98, 0x92, 0xfe, 0x31, 0x01, 0xf9, 0xc0, 0xfe, 0x81, 0x6b, 0x48, 0xdc, - 0x76, 0x0d, 0xc9, 0xb8, 0x6b, 0xe0, 0x4a, 0x0b, 0x1e, 0x67, 0xe5, 0x1a, 0xa4, 0x2a, 0xec, 0xac, - 0x10, 0x10, 0xc9, 0x6a, 0xfd, 0x4e, 0xb3, 0x51, 0x95, 0x7b, 0x8a, 0xd6, 0x51, 0x14, 0x55, 0xdc, - 0x20, 0x27, 0xa9, 0xd6, 0xe5, 0x56, 0x4b, 0x69, 0x6a, 0xe7, 0xfd, 0x56, 0xad, 0xd1, 0xfa, 0x99, - 0x76, 0x2e, 0x37, 0x9a, 0x4a, 0x4d, 0x4c, 0x48, 0xff, 0x95, 0x80, 0x7c, 0xf5, 0x52, 0x37, 0x4d, - 0x3c, 0x6d, 0x98, 0x63, 0x0b, 0x3d, 0x82, 0xb4, 0x7b, 0x33, 0x67, 0xc1, 0xb0, 0x18, 0xd0, 0x2c, - 0xa7, 0xe9, 0xdd, 0xcc, 0xb1, 0x4a, 0x29, 0xd0, 0xe7, 0x50, 0x9c, 0x5a, 0x43, 0x7d, 0xaa, 0x99, - 0xd6, 0x08, 0x07, 0x72, 0xb1, 0x40, 0xa1, 0x2d, 0x6b, 0x84, 0x89, 0xa7, 0x7c, 0x41, 0x6c, 0x65, - 0x66, 0xb9, 0x78, 0x49, 0xc6, 0xbc, 0xa1, 0xc0, 0xc0, 0x1e, 0xdd, 0xef, 0x43, 0x89, 0xad, 0x36, - 0xd7, 0x6f, 0x88, 0x7b, 0x6b, 0x03, 0xdd, 0xc1, 0x3c, 0x3d, 0xa7, 0x29, 0xc3, 0x3e, 0xc5, 0x77, - 0x18, 0xba, 0xa2, 0x3b, 0x98, 0x25, 0xe5, 0x9f, 0xc0, 0x21, 0xdf, 0x20, 0x86, 0x93, 0x25, 0xcc, - 0x03, 0x46, 0x10, 0x65, 0x95, 0x7e, 0x93, 0x84, 0x62, 0x38, 0x5c, 0xdd, 0xe6, 0x56, 0xaf, 0x41, - 0xf0, 0xb3, 0xbf, 0x31, 0x71, 0x4a, 0x49, 0x6a, 0xf2, 0x8f, 0xd6, 0x04, 0x3e, 0x3f, 0x54, 0x1b, - 0x13, 0x6e, 0xed, 0x79, 0x7d, 0x09, 0x41, 0x2d, 0x28, 0x0c, 0x99, 0x46, 0x35, 0xc3, 0x1c, 0x5b, - 0x4e, 0x29, 0x45, 0x57, 0xfb, 0x72, 0xdd, 0x6a, 0x81, 0x2b, 0xe2, 0xcb, 0x09, 0xc3, 0x00, 0xa8, - 0xfc, 0x3d, 0x88, 0xd1, 0x0d, 0x63, 0xfc, 0x66, 0x2f, 0xe8, 0x37, 0x42, 0xc0, 0x43, 0xca, 0x7d, - 0xd8, 0x59, 0xd9, 0xe2, 0x7f, 0xe2, 0x78, 0x01, 0xe6, 0xa0, 0xe3, 0x3d, 0x85, 0xed, 0x48, 0x74, - 0xbf, 0x23, 0xb2, 0x4a, 0x7f, 0x93, 0x82, 0x3d, 0x5e, 0x85, 0x84, 0xb3, 0xe9, 0xb7, 0x90, 0x1b, - 0x5e, 0xea, 0xd3, 0x29, 0x36, 0x79, 0xaa, 0x0e, 0xa6, 0x10, 0x9e, 0x9d, 0x3d, 0x3c, 0xc9, 0x89, - 0x3e, 0x31, 0xfa, 0x31, 0x64, 0x9c, 0xc5, 0x70, 0x88, 0x1d, 0x87, 0x8b, 0xbd, 0xcc, 0x6f, 0x5d, - 0x2f, 0x71, 0x76, 0x19, 0x01, 0xc9, 0x3d, 0x9c, 0x16, 0x3d, 0x81, 0x4d, 0x6c, 0xdb, 0x96, 0xcd, - 0x33, 0xe9, 0xbd, 0x55, 0x26, 0x85, 0xa0, 0xeb, 0x1b, 0x2a, 0xa3, 0x43, 0x2f, 0x20, 0x33, 0xb7, - 0xf1, 0x5c, 0xb7, 0x31, 0xcf, 0xa3, 0xe5, 0x98, 0xdb, 0xec, 0x30, 0x0a, 0xb2, 0x11, 0x27, 0x46, - 0x67, 0xa1, 0x4c, 0x7a, 0x7f, 0x8d, 0x09, 0x54, 0xf0, 0xc4, 0x58, 0xa6, 0xd3, 0x9f, 0x40, 0x76, - 0x6c, 0x98, 0xfa, 0xd4, 0xf8, 0x73, 0xcc, 0xf3, 0xe9, 0x27, 0x31, 0x7c, 0xe7, 0x9c, 0x84, 0x54, - 0x49, 0x1e, 0x39, 0x7a, 0x0e, 0x19, 0x6e, 0x89, 0xa5, 0x4c, 0xe4, 0x64, 0x5c, 0xe5, 0xfc, 0xca, - 0x88, 0x8c, 0x9c, 0xd2, 0x4b, 0xc4, 0x1d, 0xd8, 0x8e, 0xa8, 0x1a, 0xdd, 0x8f, 0xde, 0x8b, 0x10, - 0xd4, 0x7d, 0x24, 0x49, 0x27, 0xa3, 0x49, 0x5a, 0x7a, 0x06, 0x62, 0xf4, 0x12, 0xee, 0x32, 0x91, - 0xbf, 0x4f, 0xf3, 0xc0, 0x17, 0x54, 0x28, 0xea, 0x41, 0x71, 0x46, 0xde, 0x97, 0x39, 0x29, 0xb1, - 0x36, 0x27, 0x71, 0x9e, 0xd3, 0x0b, 0xc6, 0x10, 0xcc, 0x49, 0x85, 0x59, 0x10, 0x86, 0x4e, 0x61, - 0x77, 0x38, 0xc5, 0xba, 0x6d, 0x98, 0x13, 0x6d, 0x6e, 0x1b, 0x43, 0xac, 0xd9, 0xba, 0x8b, 0x79, - 0x25, 0xb1, 0xe3, 0xa1, 0x3a, 0x04, 0xa3, 0xea, 0x2e, 0x46, 0x7f, 0x08, 0xe2, 0xf0, 0x52, 0xb7, - 0x27, 0x78, 0xa4, 0x71, 0xd5, 0x79, 0xae, 0xbd, 0x17, 0xad, 0x77, 0x6a, 0xc6, 0x78, 0xac, 0x6e, - 0x73, 0x6a, 0x0e, 0x73, 0xd0, 0x77, 0x50, 0xc0, 0xd7, 0x78, 0xb8, 0x20, 0xf7, 0xa0, 0x8d, 0xb1, - 0x67, 0x4a, 0xcb, 0xfa, 0x58, 0xf1, 0xb0, 0xe7, 0x18, 0xab, 0x02, 0x0e, 0xbc, 0xa1, 0xaf, 0x60, - 0x87, 0x05, 0x2f, 0xd7, 0xd6, 0x4d, 0x47, 0xa7, 0x77, 0xc9, 0x43, 0xa0, 0x48, 0x11, 0xbd, 0x25, - 0x1c, 0x7d, 0x0d, 0xbb, 0x63, 0xcc, 0x8e, 0xa3, 0x39, 0xba, 0xab, 0xcd, 0x89, 0xba, 0x3f, 0x50, - 0x63, 0x4a, 0xab, 0xdb, 0x63, 0x4c, 0xcf, 0xd3, 0xd5, 0xdd, 0x0e, 0xb6, 0x5f, 0x7f, 0x20, 0xc1, - 0x9e, 0x52, 0xe3, 0x01, 0xa7, 0xa7, 0xb6, 0x93, 0x56, 0x05, 0x42, 0x48, 0x81, 0x5d, 0x3d, 0x5c, - 0x94, 0x64, 0xc3, 0xd1, 0x73, 0xa5, 0x18, 0xcb, 0xad, 0x16, 0x63, 0xe5, 0xb7, 0x80, 0x56, 0xaf, - 0x24, 0x26, 0x0c, 0x7d, 0x15, 0x0e, 0x43, 0x4b, 0xe5, 0x04, 0xb9, 0xc3, 0x71, 0x68, 0x37, 0xc6, - 0x9b, 0x6e, 0x2b, 0xba, 0x2c, 0x40, 0xab, 0x7e, 0x74, 0x5b, 0x7a, 0x38, 0x02, 0xe0, 0xca, 0xbf, - 0xe6, 0x0d, 0x93, 0xa0, 0xe6, 0x98, 0xd6, 0xaf, 0x8d, 0x11, 0x71, 0x84, 0x4b, 0x6c, 0x4c, 0x2e, - 0x5d, 0xed, 0x92, 0x24, 0xa6, 0x14, 0x3d, 0x3d, 0x30, 0x50, 0x9d, 0x24, 0xa3, 0x7f, 0x4a, 0x42, - 0x31, 0x1c, 0x59, 0x48, 0xb8, 0x66, 0x11, 0x88, 0x1d, 0x9d, 0x87, 0x99, 0x97, 0x00, 0xf4, 0x21, - 0x58, 0x3e, 0x1c, 0xad, 0x09, 0x4e, 0xa7, 0xf4, 0xaf, 0x9a, 0xa3, 0x0c, 0xb4, 0x76, 0xbb, 0xbd, - 0x49, 0x47, 0x75, 0xd8, 0xf5, 0x92, 0x9c, 0x4d, 0x9b, 0x75, 0x9d, 0x1a, 0x51, 0xfa, 0xd6, 0x40, - 0xa1, 0x22, 0xdd, 0x6f, 0x3d, 0x3d, 0x16, 0xc9, 0x80, 0x4d, 0x76, 0x8a, 0x50, 0xb1, 0xb5, 0x0b, - 0xdb, 0xbc, 0xd8, 0xea, 0xd6, 0xfb, 0xbd, 0x1a, 0x01, 0xd2, 0x4a, 0x4b, 0xae, 0x56, 0xdb, 0xfd, - 0x56, 0x4f, 0xab, 0xb5, 0x95, 0xae, 0xd6, 0x6a, 0xf7, 0x34, 0xe5, 0x87, 0x46, 0xb7, 0x27, 0x26, - 0x91, 0x04, 0x0f, 0x1a, 0xad, 0x6a, 0xfb, 0xa2, 0xd3, 0x54, 0x7a, 0x8a, 0xe6, 0x91, 0xa9, 0x0a, - 0x59, 0x45, 0xee, 0x35, 0xda, 0x2d, 0x31, 0x25, 0xfd, 0x4b, 0x12, 0x8a, 0x61, 0x89, 0x96, 0x99, - 0x8e, 0xcd, 0x33, 0xd8, 0x0b, 0x29, 0xc9, 0x42, 0x03, 0x0c, 0xfe, 0x76, 0x97, 0x52, 0x56, 0xe7, - 0x13, 0xe9, 0xb8, 0xf9, 0xc4, 0x27, 0x90, 0x5b, 0xce, 0x25, 0x98, 0xdb, 0x31, 0x6b, 0x21, 0xc8, - 0x33, 0xd8, 0x74, 0x5c, 0x12, 0x3a, 0xb6, 0xe8, 0x85, 0xdd, 0x5f, 0xa3, 0xca, 0x2e, 0xa1, 0x51, - 0x19, 0x69, 0xd4, 0x66, 0x32, 0x51, 0x9b, 0x41, 0x8f, 0x21, 0x6b, 0x2d, 0x5c, 0x56, 0xea, 0x64, - 0xd7, 0xcd, 0x30, 0x7c, 0x12, 0x22, 0xe0, 0x54, 0x77, 0xb1, 0xe3, 0x6a, 0xee, 0x35, 0xf5, 0x3f, - 0x41, 0xcd, 0x32, 0x40, 0xef, 0x5a, 0xfa, 0x25, 0x08, 0x41, 0xef, 0x41, 0x2f, 0x40, 0xf0, 0xe2, - 0xe9, 0xc0, 0x18, 0x79, 0xd1, 0x74, 0x37, 0xea, 0x6a, 0x15, 0x63, 0xa4, 0xe6, 0x67, 0xfe, 0xb3, - 0x13, 0xe4, 0xd3, 0x9d, 0x2b, 0xaf, 0x4c, 0x5a, 0xe1, 0x93, 0x9d, 0x2b, 0x9f, 0x4f, 0x76, 0xae, - 0x1c, 0xa9, 0x0f, 0xb0, 0x44, 0xa1, 0xcf, 0xef, 0x98, 0x4f, 0xb0, 0xe9, 0xc4, 0x43, 0x10, 0x16, - 0xa6, 0xe1, 0x3a, 0xda, 0xd8, 0x98, 0x4e, 0xf9, 0x48, 0xa0, 0xa0, 0xe6, 0x29, 0xec, 0x9c, 0x82, - 0x02, 0xcb, 0x56, 0x8c, 0x11, 0x59, 0x76, 0xc0, 0x5d, 0x37, 0x76, 0x9c, 0x41, 0x87, 0x19, 0x1f, - 0xb3, 0xec, 0x3f, 0x27, 0x21, 0x1f, 0x88, 0xe3, 0xc4, 0x44, 0xb0, 0x39, 0x22, 0x59, 0x62, 0xa0, - 0x4f, 0x75, 0xd2, 0x12, 0x32, 0xc3, 0x2b, 0x30, 0x68, 0x85, 0x01, 0x51, 0x0d, 0x04, 0x4e, 0xc6, - 0x8c, 0x81, 0x79, 0xef, 0xc3, 0xb8, 0xd4, 0x70, 0x1a, 0xb2, 0x88, 0x3c, 0x63, 0xa3, 0x2f, 0x64, - 0x33, 0xef, 0x4e, 0x35, 0xc3, 0x1c, 0xe1, 0x6b, 0x6a, 0xb2, 0x9b, 0x6a, 0xc1, 0x83, 0x36, 0x08, - 0x30, 0x62, 0xd5, 0xe9, 0x68, 0x1a, 0xfd, 0x25, 0x08, 0xc1, 0x2d, 0xd0, 0x1e, 0x88, 0xed, 0x7e, - 0xaf, 0xd3, 0x27, 0xde, 0x55, 0x55, 0x15, 0xb9, 0xa7, 0xd4, 0xc4, 0x0d, 0xf4, 0x10, 0x8e, 0x38, - 0xb4, 0xd6, 0xef, 0x12, 0xb7, 0xec, 0x29, 0xad, 0x9a, 0x52, 0xd3, 0xda, 0xe7, 0xe7, 0xd5, 0xba, - 0xdc, 0x20, 0xee, 0x7b, 0x04, 0x87, 0x41, 0x12, 0xb9, 0x46, 0xf0, 0xbd, 0xb6, 0x76, 0xae, 0x28, - 0x5d, 0x31, 0x49, 0xfa, 0x2b, 0x8e, 0x3e, 0xef, 0x37, 0x9b, 0xef, 0xb4, 0x6e, 0x47, 0x69, 0x91, - 0x7e, 0xe9, 0xaf, 0x53, 0x90, 0x67, 0x8a, 0x67, 0x06, 0x77, 0x47, 0xcb, 0x7d, 0x04, 0x40, 0x73, - 0xd5, 0xd8, 0xb8, 0xf6, 0xaf, 0x24, 0x47, 0x20, 0xe7, 0x04, 0x40, 0x92, 0x84, 0x3e, 0x73, 0xf9, - 0xa8, 0x8d, 0x3c, 0xa2, 0x63, 0x10, 0x66, 0x86, 0xa9, 0x91, 0x32, 0x59, 0x23, 0xa8, 0x34, 0x45, - 0xc1, 0xcc, 0x30, 0x49, 0xb1, 0x2a, 0xcf, 0xe8, 0x04, 0x21, 0x30, 0x08, 0xa2, 0x9e, 0x29, 0xa8, - 0xb0, 0x9c, 0xff, 0x10, 0x87, 0x61, 0x04, 0xa4, 0x89, 0xcf, 0x30, 0x87, 0xa1, 0x80, 0xae, 0x31, - 0x41, 0x12, 0x14, 0x66, 0x8b, 0xa9, 0x6b, 0x10, 0x24, 0x15, 0x99, 0x65, 0xbc, 0x3c, 0x05, 0x76, - 0x8d, 0x09, 0x11, 0xfa, 0x10, 0xb2, 0xb4, 0xed, 0x99, 0x2f, 0x06, 0xdc, 0xe1, 0x32, 0xe4, 0xbd, - 0xb3, 0x18, 0xa0, 0x67, 0x90, 0xa3, 0x28, 0x7d, 0x34, 0xb2, 0x4b, 0x10, 0x29, 0x11, 0x48, 0x57, - 0x24, 0x8f, 0x46, 0x36, 0x76, 0x1c, 0x95, 0xae, 0x40, 0x5e, 0x88, 0x38, 0xf4, 0x34, 0xb4, 0x41, - 0x13, 0xa8, 0x06, 0xb2, 0x04, 0x40, 0x9a, 0x32, 0xf4, 0x3d, 0x1c, 0xcd, 0xf4, 0x6b, 0x3e, 0x19, - 0x8d, 0xcb, 0xec, 0x05, 0x7a, 0xfe, 0x7b, 0x33, 0xfd, 0x9a, 0x4e, 0x49, 0xcf, 0xc3, 0x19, 0xfe, - 0x55, 0x3a, 0xbb, 0x29, 0x6e, 0xbd, 0x4a, 0x67, 0xf3, 0xa2, 0x20, 0xfd, 0x6b, 0x02, 0x72, 0xbe, - 0x4f, 0xa0, 0x53, 0x7f, 0xac, 0xc6, 0x1d, 0x67, 0x2f, 0xe2, 0x38, 0x2c, 0xdd, 0x7a, 0x44, 0xe8, - 0x0c, 0xf6, 0xa7, 0x98, 0xf4, 0x60, 0xa3, 0x85, 0x4d, 0x73, 0x81, 0x36, 0x98, 0x5a, 0xc3, 0x2b, - 0x87, 0x5f, 0xda, 0x2e, 0x45, 0xd6, 0x38, 0xae, 0x42, 0x51, 0xa8, 0x04, 0x19, 0xaf, 0x30, 0x60, - 0x73, 0x50, 0xef, 0x15, 0xfd, 0x18, 0x0a, 0xe4, 0x1a, 0xa9, 0xae, 0x5c, 0x03, 0xdb, 0x34, 0xb2, - 0x16, 0x03, 0x81, 0x8e, 0xe8, 0xaa, 0x67, 0x60, 0x5b, 0xcd, 0xcf, 0x0c, 0xd3, 0x7b, 0x79, 0x95, - 0xce, 0xa6, 0xc4, 0xb4, 0xf4, 0x17, 0xfe, 0x41, 0x48, 0x50, 0xf9, 0x3f, 0x3b, 0x48, 0xfa, 0xa3, - 0x0e, 0xb2, 0x19, 0x3a, 0x88, 0x74, 0x0a, 0xf9, 0xc0, 0xf8, 0x30, 0x6a, 0x7c, 0x89, 0xa8, 0xf1, - 0x49, 0xff, 0x90, 0x00, 0x21, 0x38, 0x0c, 0xbd, 0x93, 0x03, 0xc9, 0x90, 0x1f, 0xeb, 0xc6, 0x54, - 0x0b, 0x4c, 0x7f, 0x8a, 0x67, 0xc7, 0xb1, 0x93, 0xd5, 0xd3, 0x73, 0xdd, 0x98, 0x7a, 0x33, 0x85, - 0xb1, 0xff, 0x4c, 0xf6, 0xa0, 0x4b, 0x38, 0x2e, 0xa9, 0x6b, 0xa9, 0x3b, 0xe5, 0x18, 0x41, 0x97, - 0x42, 0xa4, 0x23, 0x80, 0x25, 0x2b, 0xda, 0x86, 0x7c, 0xa3, 0xf5, 0x46, 0x6e, 0x36, 0x6a, 0x9a, - 0x7c, 0xd1, 0x13, 0x37, 0xa4, 0x3f, 0xf6, 0x7c, 0xba, 0x61, 0xce, 0x17, 0xe1, 0x04, 0x95, 0xb8, - 0x3b, 0x41, 0x1d, 0x01, 0x10, 0x67, 0x0a, 0x0d, 0xd7, 0x73, 0x8e, 0x31, 0x61, 0x83, 0x75, 0xe9, - 0x25, 0x08, 0xfc, 0x9e, 0x16, 0x2e, 0x59, 0x7d, 0x6d, 0x92, 0x0f, 0x2d, 0xc0, 0xdf, 0xa4, 0xbf, - 0x4b, 0x42, 0x99, 0xb1, 0x5f, 0x58, 0x23, 0x63, 0x7c, 0x13, 0xf9, 0x28, 0x70, 0x47, 0xf8, 0x79, - 0x0e, 0x60, 0xe2, 0x0f, 0x9a, 0x41, 0x8e, 0xe5, 0x25, 0xb5, 0xa8, 0xf9, 0xd0, 0x33, 0xab, 0x39, - 0x13, 0x7f, 0xa0, 0x4f, 0x24, 0x17, 0xe6, 0x09, 0x93, 0x45, 0xc5, 0xf5, 0x1a, 0x81, 0xfd, 0xa8, - 0xd1, 0x51, 0xac, 0x4a, 0x96, 0x67, 0x8f, 0x0e, 0x7a, 0xcb, 0x36, 0x9b, 0xeb, 0xb6, 0x3e, 0x73, - 0x78, 0xf1, 0xf5, 0x6d, 0x84, 0x2d, 0xee, 0x10, 0xa7, 0x2d, 0xfc, 0x81, 0x43, 0x3a, 0x84, 0x17, - 0xbb, 0xd8, 0x76, 0xa8, 0x40, 0xf4, 0xd5, 0x29, 0x7f, 0x0d, 0x7b, 0x71, 0x24, 0xf1, 0x9a, 0x94, - 0xbe, 0x87, 0x4f, 0x62, 0xf7, 0xe2, 0xa3, 0xfc, 0x4f, 0x21, 0x1f, 0x18, 0x88, 0x78, 0xf6, 0xb8, - 0x9c, 0x72, 0x48, 0xdf, 0xc1, 0xbd, 0x80, 0x5f, 0xb1, 0x44, 0xc6, 0xb5, 0x7d, 0xa7, 0xf5, 0xdb, - 0xde, 0x00, 0x3f, 0xc8, 0xcb, 0x37, 0xfe, 0xd2, 0xab, 0xa5, 0xd8, 0x90, 0x6a, 0x37, 0xdc, 0xe1, - 0x85, 0x4a, 0xa8, 0xaf, 0x60, 0x87, 0xa5, 0xf2, 0x85, 0x39, 0x5e, 0x4c, 0x43, 0xf9, 0x5c, 0xa4, - 0x88, 0xfe, 0x12, 0x2e, 0x15, 0x41, 0xe8, 0x61, 0x7b, 0xe6, 0x70, 0x21, 0xa5, 0x5f, 0xa5, 0xa1, - 0xc0, 0x01, 0x7c, 0xe7, 0x13, 0xd8, 0x21, 0x41, 0x36, 0xee, 0x93, 0xd9, 0xf6, 0x4c, 0xbf, 0x96, - 0x83, 0x5f, 0x78, 0xfe, 0x00, 0x0e, 0x09, 0x2d, 0x3b, 0x66, 0x6c, 0x28, 0xac, 0x24, 0x4b, 0x09, - 0xf5, 0x60, 0xa6, 0x5f, 0x53, 0xb9, 0x23, 0x81, 0x64, 0xa5, 0x11, 0x4c, 0x7d, 0x7c, 0x23, 0xd8, - 0x85, 0xed, 0x70, 0xe0, 0xf2, 0x06, 0xb4, 0x27, 0x3e, 0x77, 0xe8, 0x5c, 0xa7, 0xcd, 0x60, 0x24, - 0xf3, 0xa6, 0xb3, 0xa1, 0xf0, 0xe6, 0xa0, 0xe7, 0x70, 0x60, 0xe2, 0x6b, 0x97, 0x67, 0x98, 0xa1, - 0x65, 0x8e, 0x35, 0x97, 0xf4, 0xae, 0x2e, 0x0f, 0x74, 0xbb, 0x04, 0x4b, 0x53, 0x4b, 0xd5, 0x32, - 0xc7, 0x3d, 0x8a, 0x42, 0x7f, 0x04, 0x0f, 0x02, 0x4c, 0xeb, 0x1b, 0xce, 0x92, 0xcf, 0x1c, 0xc9, - 0x4b, 0xe8, 0xa7, 0x50, 0x0e, 0x6e, 0x4b, 0x3a, 0x6e, 0xcd, 0x35, 0x66, 0xd8, 0x71, 0xf5, 0xd9, - 0x9c, 0x77, 0xa1, 0xf7, 0x96, 0x5b, 0x13, 0x7c, 0xcf, 0x43, 0x97, 0x65, 0xd8, 0x8d, 0x39, 0x5a, - 0xb0, 0xa3, 0x2c, 0xc4, 0x4c, 0xc6, 0xb2, 0xc1, 0xd6, 0xb1, 0x02, 0x7b, 0x2a, 0x9e, 0xe2, 0xf7, - 0xba, 0xc9, 0x76, 0xf0, 0x2c, 0xb8, 0x08, 0x49, 0xbf, 0x09, 0x4c, 0x1a, 0x23, 0x54, 0xa6, 0x9f, - 0xa6, 0x58, 0xc7, 0x4f, 0xc2, 0x83, 0xa0, 0xfa, 0xef, 0xd2, 0x7f, 0xa4, 0xa0, 0x10, 0x5a, 0x24, - 0x98, 0x26, 0x12, 0xe1, 0x7c, 0xc7, 0xd6, 0x4d, 0xfa, 0xeb, 0xfe, 0xaf, 0x27, 0x0a, 0x9d, 0x95, - 0xc1, 0x48, 0x3a, 0x32, 0x6b, 0x0c, 0x89, 0xf6, 0xdb, 0x0f, 0x45, 0x36, 0xd7, 0x0d, 0x45, 0x56, - 0x4c, 0x79, 0xeb, 0xe3, 0x4d, 0xf9, 0x18, 0xf2, 0xc1, 0x69, 0x06, 0x2b, 0xc2, 0x82, 0xa0, 0x75, - 0x83, 0x8c, 0x6c, 0xec, 0x20, 0xe3, 0xff, 0x6f, 0xc4, 0x50, 0x03, 0x21, 0x78, 0x0c, 0x36, 0x2a, - 0x70, 0x30, 0x3d, 0x2f, 0x8b, 0x10, 0x19, 0xf2, 0xce, 0x51, 0x9e, 0xc4, 0x74, 0xf9, 0xb4, 0x9a, - 0xe1, 0x62, 0x4a, 0x3f, 0x85, 0x7c, 0xa0, 0xf6, 0x23, 0x66, 0x62, 0x62, 0xf7, 0x83, 0x65, 0x5f, - 0x71, 0xd9, 0xbc, 0x57, 0x84, 0x20, 0x4d, 0x2b, 0x47, 0xf6, 0x89, 0x87, 0x3e, 0x4b, 0x32, 0x64, - 0xbd, 0xa4, 0x4a, 0xf0, 0x74, 0x10, 0xc1, 0x0c, 0x94, 0x3e, 0x93, 0xbe, 0x86, 0xa5, 0x22, 0xde, - 0x35, 0xf0, 0xbe, 0x86, 0xc1, 0x68, 0xcf, 0x20, 0xfd, 0x55, 0x02, 0xf2, 0xb2, 0x73, 0xd5, 0x35, - 0xf5, 0xb9, 0x73, 0x69, 0xb9, 0xb7, 0xd8, 0xe9, 0x6f, 0x53, 0xe5, 0x85, 0x6b, 0xf8, 0x54, 0xb4, - 0x86, 0x0f, 0xd5, 0xb7, 0xe9, 0x70, 0x7d, 0x4b, 0x25, 0xab, 0x18, 0xa3, 0xdf, 0x41, 0xc9, 0xfe, - 0x2d, 0x01, 0x7b, 0x41, 0xab, 0xf0, 0x45, 0x0c, 0x7d, 0x64, 0x0f, 0x78, 0xeb, 0x52, 0xbf, 0x31, - 0x1f, 0xd9, 0x97, 0x74, 0x81, 0xd3, 0xb2, 0xbe, 0xf4, 0x33, 0x60, 0x8e, 0x48, 0xfc, 0x8e, 0x1a, - 0x0f, 0x93, 0x53, 0xf0, 0x80, 0xd4, 0xd9, 0xbe, 0x06, 0xe4, 0x5a, 0xae, 0x3e, 0x25, 0xbe, 0xe0, - 0xb0, 0x78, 0x89, 0x47, 0xbc, 0xf9, 0x11, 0x29, 0xa6, 0xab, 0xbb, 0x4e, 0x95, 0xc1, 0xc9, 0x92, - 0x2c, 0x3f, 0x72, 0x0f, 0xe7, 0x4e, 0xcc, 0xfa, 0x5f, 0x7e, 0x28, 0xe9, 0x19, 0xec, 0xd1, 0xd0, - 0xe0, 0x4b, 0xc3, 0x43, 0xe0, 0x2d, 0xe3, 0xb3, 0xdf, 0x24, 0x61, 0x3f, 0xc2, 0xc3, 0x53, 0xe8, - 0xfa, 0x7b, 0x0b, 0x2e, 0x97, 0x0c, 0x0f, 0xd7, 0x24, 0x28, 0xcc, 0x6d, 0xfc, 0x5e, 0xf3, 0xf1, - 0x6c, 0x46, 0x93, 0x27, 0xc0, 0x0a, 0xa7, 0x59, 0x13, 0x95, 0xd2, 0xeb, 0xa2, 0x52, 0x6d, 0x25, - 0x2e, 0x6e, 0xd2, 0xb8, 0x78, 0x14, 0xeb, 0xea, 0xfe, 0x39, 0x22, 0xb1, 0xf0, 0x01, 0xe4, 0xbd, - 0xb1, 0x1f, 0x91, 0x2b, 0x43, 0xdd, 0xd1, 0x9b, 0xfb, 0x35, 0x46, 0xcb, 0x43, 0xb9, 0xd7, 0xbc, - 0xc1, 0xcc, 0x70, 0x24, 0x7a, 0x09, 0xf7, 0x7d, 0xd6, 0xf5, 0x11, 0xec, 0x80, 0x93, 0x47, 0xf2, - 0xa2, 0xf4, 0xd2, 0x2b, 0xae, 0x48, 0xbc, 0x50, 0x75, 0x97, 0xdc, 0x3f, 0xbf, 0x97, 0x87, 0x20, - 0x78, 0x5d, 0xe7, 0x15, 0xbe, 0x61, 0xa3, 0x1b, 0x41, 0xcd, 0xf3, 0xce, 0x93, 0x80, 0xa4, 0x3f, - 0x01, 0x58, 0xf2, 0x91, 0x6a, 0x2c, 0xc0, 0xe0, 0x55, 0x63, 0x4b, 0x7a, 0x74, 0xca, 0x9b, 0x55, - 0xda, 0x80, 0x25, 0xd7, 0x35, 0x60, 0xb4, 0x53, 0x25, 0x4f, 0x92, 0xea, 0x55, 0x6f, 0x41, 0xe1, - 0xb8, 0x01, 0xbc, 0xe0, 0xd2, 0xd9, 0x14, 0xbc, 0x3a, 0x58, 0x0a, 0xb0, 0x50, 0xa9, 0xd8, 0xb3, - 0x73, 0xf2, 0xa5, 0xff, 0xa1, 0x92, 0xf6, 0xbb, 0x05, 0xc8, 0xf5, 0xde, 0x2a, 0xf2, 0xeb, 0xa6, - 0xd2, 0xed, 0x8a, 0x1b, 0x28, 0x0f, 0x19, 0xb9, 0x55, 0xad, 0xb7, 0xd5, 0xae, 0x98, 0x38, 0xf9, - 0xcb, 0x04, 0xec, 0xc6, 0xcc, 0xd5, 0xe8, 0xa7, 0xde, 0x1e, 0xfb, 0x30, 0xca, 0x3e, 0x83, 0xb6, - 0x3b, 0x4a, 0x4b, 0xdc, 0x40, 0x45, 0x00, 0x06, 0xa7, 0xef, 0x09, 0xb4, 0x03, 0x05, 0xf6, 0xae, - 0xfc, 0xd0, 0x69, 0xa8, 0x4a, 0x4d, 0x4c, 0xa2, 0x12, 0xec, 0x85, 0x59, 0xfb, 0x9d, 0x9a, 0xdc, - 0x53, 0xc4, 0x14, 0x12, 0x41, 0x60, 0x98, 0x6a, 0xb3, 0xdd, 0x55, 0x6a, 0x62, 0x1a, 0xdd, 0x83, - 0xdd, 0x30, 0x2d, 0xfd, 0x8e, 0x2c, 0x6e, 0x9e, 0x7c, 0x03, 0x59, 0x4f, 0x59, 0x84, 0xad, 0xd7, - 0x50, 0x54, 0xad, 0xa6, 0x9c, 0xcb, 0xfd, 0x66, 0x4f, 0xdc, 0x40, 0x00, 0x5b, 0x14, 0xf2, 0x54, - 0x4c, 0xf8, 0xcf, 0xcf, 0xc4, 0xe4, 0xc9, 0xaf, 0x13, 0x00, 0xcb, 0xca, 0x16, 0xed, 0xc2, 0x76, - 0x5b, 0xad, 0x29, 0xaa, 0xd6, 0xed, 0x57, 0x2e, 0x1a, 0x3d, 0x36, 0xa6, 0xd9, 0x81, 0x02, 0x03, - 0x56, 0x9b, 0x8a, 0x4c, 0x24, 0xa6, 0x53, 0x55, 0x06, 0xe2, 0x5f, 0xaa, 0x9b, 0xef, 0xb4, 0xf3, - 0x46, 0xb3, 0x49, 0x4f, 0x83, 0xa0, 0xc8, 0x70, 0xca, 0x0f, 0x4a, 0xb5, 0x4f, 0x96, 0x48, 0x2d, - 0x61, 0x55, 0xb9, 0x55, 0x55, 0x9a, 0xf4, 0x24, 0xfe, 0xb2, 0x9e, 0x22, 0x36, 0x89, 0xdc, 0x0c, - 0xc4, 0x3f, 0x21, 0x6f, 0x9d, 0xfd, 0x3a, 0xe3, 0x7f, 0x3c, 0x94, 0xfd, 0x81, 0x28, 0xfa, 0x39, - 0x14, 0xc3, 0x3f, 0xf7, 0x42, 0x0f, 0x02, 0x05, 0x47, 0xcc, 0x6f, 0xd1, 0xca, 0x9f, 0xae, 0xc5, - 0x73, 0xcb, 0xe9, 0x41, 0x3e, 0xf0, 0x3b, 0x27, 0xf4, 0x70, 0xa5, 0xfd, 0x8a, 0xfe, 0xd2, 0xab, - 0x2c, 0xdd, 0x46, 0xc2, 0x57, 0xfd, 0x05, 0x14, 0x42, 0xfd, 0x0d, 0xfa, 0xec, 0x23, 0x3a, 0xad, - 0xf2, 0xe7, 0xb7, 0x13, 0x2d, 0x25, 0x0e, 0xfc, 0x08, 0x6a, 0x45, 0xe2, 0xd5, 0x1f, 0x66, 0xad, - 0x48, 0x1c, 0xf7, 0x1b, 0xaa, 0x5e, 0x78, 0x92, 0x10, 0x5d, 0x75, 0xf5, 0x27, 0x4f, 0x2b, 0xab, - 0xc6, 0xfc, 0x8e, 0x09, 0xfd, 0x3c, 0x64, 0x65, 0xc7, 0x71, 0xa3, 0x91, 0x60, 0x0b, 0x57, 0x7e, - 0x78, 0x0b, 0x05, 0x5f, 0xf2, 0x1d, 0xec, 0xfb, 0xdf, 0x23, 0x68, 0x98, 0xe6, 0xf6, 0x81, 0x96, - 0x31, 0x36, 0xee, 0x97, 0x53, 0xe5, 0xa3, 0xe8, 0xc0, 0x37, 0x84, 0x7e, 0x94, 0x78, 0x9a, 0x40, - 0x2f, 0x60, 0x93, 0xb6, 0x30, 0x68, 0x3f, 0xda, 0xd2, 0x30, 0xe9, 0x0e, 0xe2, 0x3b, 0x1d, 0xd4, - 0x82, 0xfd, 0x50, 0xb9, 0xeb, 0x27, 0xeb, 0xa3, 0xf8, 0x72, 0x78, 0x75, 0xbd, 0x70, 0x21, 0xdf, - 0x82, 0xc2, 0xba, 0x75, 0xe2, 0x72, 0x66, 0xf9, 0xc1, 0x3a, 0xf4, 0xf2, 0x16, 0x02, 0x81, 0x39, - 0x7a, 0x0b, 0x2b, 0xb1, 0x7e, 0xe5, 0x16, 0x56, 0x03, 0x6e, 0xe5, 0xf7, 0x7e, 0xf1, 0xa3, 0x89, - 0xe1, 0x5e, 0x2e, 0x06, 0xa7, 0x43, 0x6b, 0xf6, 0x64, 0x6a, 0x4c, 0x2e, 0x5d, 0xd3, 0x30, 0x27, - 0x53, 0x7d, 0xe0, 0x3c, 0x21, 0xcc, 0x4f, 0xf8, 0x0a, 0x83, 0x2d, 0xfa, 0xb3, 0xd1, 0xe7, 0xff, - 0x1d, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x3b, 0x3f, 0x30, 0x4a, 0x2a, 0x00, 0x00, + // 3822 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0x4b, 0x73, 0xe3, 0xd8, + 0x5a, 0xf1, 0x23, 0xb1, 0xfd, 0x59, 0x76, 0x94, 0x93, 0x47, 0x3b, 0x9e, 0x4e, 0x4f, 0x5a, 0x33, + 0x77, 0xc8, 0x64, 0x66, 0x32, 0x33, 0xe9, 0xb9, 0x4d, 0xdf, 0xb9, 0xcd, 0x80, 0x6c, 0x2b, 0xd7, + 0xee, 0x76, 0x6c, 0x8f, 0x6c, 0x77, 0x4f, 0x5f, 0x8a, 0x52, 0xc9, 0xf6, 0xb1, 0x23, 0x62, 0x4b, + 0x46, 0x92, 0xbb, 0x13, 0x16, 0x77, 0x71, 0x77, 0xfc, 0x00, 0x0a, 0xaa, 0x28, 0x76, 0xec, 0xa1, + 0x60, 0xc3, 0x92, 0x62, 0xc1, 0xcf, 0xe0, 0x42, 0x15, 0x3f, 0x80, 0x2d, 0x3b, 0xea, 0x3c, 0x24, + 0x4b, 0xb2, 0x9c, 0x34, 0x03, 0x54, 0xdd, 0x4d, 0x22, 0x7d, 0x8f, 0x73, 0xbe, 0xef, 0x9c, 0xef, + 0x2d, 0x83, 0xa8, 0x2f, 0x86, 0xae, 0x61, 0x99, 0x18, 0xdb, 0x67, 0x73, 0xdb, 0x72, 0x2d, 0x94, + 0x99, 0x5b, 0xd6, 0xd4, 0x9e, 0x0f, 0xa5, 0x5f, 0x27, 0x60, 0x5f, 0xc5, 0x0e, 0xb6, 0xdf, 0x62, + 0x79, 0x38, 0xb4, 0x16, 0xa6, 0xab, 0xe2, 0x3f, 0x59, 0x60, 0xc7, 0x45, 0x1f, 0x41, 0x41, 0x67, + 0x10, 0xed, 0xad, 0x3e, 0x5d, 0xe0, 0x52, 0xe2, 0x38, 0x71, 0x92, 0x56, 0x05, 0x0e, 0x7c, 0x45, + 0x60, 0xe8, 0x27, 0x50, 0xf4, 0x88, 0xf0, 0xcd, 0xdc, 0xb0, 0x6f, 0x4b, 0xc9, 0xe3, 0xc4, 0x49, + 0x41, 0xf5, 0x58, 0x15, 0x0a, 0x44, 0x47, 0x00, 0xae, 0xad, 0x8f, 0xb0, 0xad, 0x5d, 0xe3, 0xdb, + 0x52, 0xea, 0x38, 0x71, 0x22, 0xa8, 0x39, 0x06, 0x79, 0x89, 0x6f, 0xa5, 0x6b, 0x38, 0x88, 0xca, + 0xe0, 0xcc, 0x2d, 0xd3, 0x61, 0xeb, 0xfb, 0xb2, 0x53, 0xe6, 0x04, 0x65, 0x2e, 0x2c, 0xa1, 0x2f, + 0xf1, 0x2d, 0x3a, 0x85, 0x1d, 0xc3, 0x34, 0x5c, 0x43, 0x9f, 0x6a, 0x03, 0xdd, 0x1d, 0x5e, 0x51, + 0xca, 0x24, 0xa5, 0xdc, 0xe6, 0x88, 0x0a, 0x81, 0x93, 0xcd, 0xfe, 0x23, 0x01, 0xa5, 0x2e, 0xd9, + 0xcb, 0x6e, 0x98, 0x86, 0x1b, 0x51, 0xfa, 0xe9, 0x52, 0xe9, 0xb9, 0x65, 0x98, 0x2e, 0xdd, 0x2e, + 0x7f, 0xbe, 0x73, 0xc6, 0xcf, 0xeb, 0xac, 0xbd, 0x70, 0x3b, 0x04, 0xe1, 0x9f, 0x03, 0x7d, 0x0b, + 0x9e, 0x83, 0x33, 0xb4, 0x8d, 0xb9, 0xcb, 0x77, 0xf7, 0x56, 0xeb, 0x52, 0xe0, 0xea, 0x99, 0xa6, + 0xde, 0xeb, 0x4c, 0xd3, 0xf7, 0x9f, 0xe9, 0x66, 0xf4, 0x4c, 0x3f, 0x80, 0xc3, 0x18, 0x2d, 0xd9, + 0xb1, 0x4a, 0x0b, 0xef, 0x08, 0xba, 0x8b, 0xc1, 0xcc, 0x70, 0xdb, 0xf6, 0x08, 0xdb, 0xde, 0x11, + 0x7c, 0x02, 0x29, 0xdd, 0xb9, 0xe6, 0x8a, 0x23, 0x5f, 0x71, 0x46, 0x2f, 0x3b, 0xd7, 0xf5, 0x0d, + 0x95, 0x10, 0x10, 0xba, 0x81, 0x31, 0xa2, 0x7a, 0xae, 0xd2, 0x55, 0x8c, 0x11, 0xa1, 0x1b, 0x18, + 0xa3, 0x4a, 0x0e, 0x32, 0x23, 0xec, 0xea, 0xc6, 0xd4, 0x21, 0xc6, 0x76, 0x18, 0xb3, 0x2f, 0xbf, + 0xeb, 0xe7, 0x50, 0x30, 0xcc, 0xb7, 0xfa, 0xd4, 0x18, 0x69, 0x16, 0x41, 0x70, 0x11, 0xf6, 0xfd, + 0xa5, 0x1b, 0x0c, 0x4b, 0xb9, 0xea, 0x1b, 0xaa, 0x60, 0x04, 0xde, 0xd1, 0x43, 0xc8, 0xea, 0xc3, + 0x21, 0x9e, 0xbb, 0x98, 0xc9, 0x94, 0xad, 0x6f, 0xa8, 0x3e, 0x24, 0x28, 0x44, 0xd3, 0xd3, 0xbd, + 0xaa, 0x9b, 0x43, 0x3c, 0x0d, 0xe9, 0xfe, 0x15, 0xec, 0xd1, 0xad, 0x35, 0xd3, 0x32, 0x87, 0x58, + 0x9b, 0xdb, 0xd8, 0x98, 0xe9, 0x13, 0xcc, 0x8d, 0x0e, 0x51, 0x5c, 0x8b, 0xa0, 0x3a, 0x1c, 0xb3, + 0x3c, 0xe6, 0xd0, 0x6a, 0xfc, 0x98, 0xff, 0x2d, 0x09, 0x7b, 0xd5, 0xa9, 0x81, 0x4d, 0x57, 0x66, + 0xe6, 0x7a, 0x89, 0x1d, 0x47, 0x9f, 0x60, 0xf4, 0x0d, 0x6c, 0x0d, 0xad, 0xd9, 0xcc, 0xf0, 0xec, + 0xab, 0xec, 0xeb, 0xc8, 0x6f, 0xaa, 0x4a, 0xb1, 0x33, 0x6c, 0xba, 0xf5, 0x0d, 0x95, 0xd3, 0xa2, + 0xe7, 0x90, 0x73, 0x16, 0x03, 0x62, 0x5f, 0x03, 0xcc, 0xcf, 0xfd, 0x61, 0x94, 0xb1, 0xcb, 0x08, + 0xe6, 0x64, 0xb7, 0xfa, 0x86, 0xba, 0x64, 0x40, 0x4f, 0x60, 0x8b, 0x1d, 0x07, 0x35, 0xba, 0xfc, + 0xf9, 0xe1, 0xd2, 0xa6, 0x89, 0xd0, 0x97, 0xc4, 0x3f, 0x64, 0x4a, 0x40, 0xb6, 0x64, 0xa4, 0x84, + 0xc9, 0xc6, 0x7f, 0x8c, 0x87, 0x2e, 0xb5, 0xc1, 0x78, 0x26, 0x95, 0x12, 0x10, 0x26, 0x46, 0x8a, + 0xbe, 0x80, 0xb4, 0x63, 0x4c, 0x4c, 0x6a, 0x93, 0xf9, 0xf3, 0x07, 0x31, 0x2c, 0x5d, 0x63, 0x42, + 0xa4, 0xa3, 0x64, 0xe8, 0x1b, 0xc8, 0xd8, 0x78, 0x68, 0xbd, 0xc5, 0x76, 0x69, 0x8b, 0x72, 0x94, + 0xa2, 0x4a, 0xa9, 0x0c, 0x7d, 0x5b, 0xdf, 0x50, 0x3d, 0xd2, 0xca, 0x26, 0xa4, 0x66, 0xce, 0x44, + 0x7a, 0x03, 0x3b, 0x2b, 0x47, 0x86, 0x3e, 0x84, 0x3c, 0x3b, 0x32, 0xed, 0x4a, 0x77, 0xae, 0xf8, + 0xed, 0x01, 0x03, 0xd5, 0x75, 0xe7, 0x8a, 0xf8, 0x21, 0x8b, 0x13, 0x6f, 0xb1, 0xed, 0x18, 0x96, + 0xc9, 0xa3, 0x96, 0x40, 0x81, 0xaf, 0x18, 0x4c, 0xb2, 0x61, 0x37, 0xe6, 0x50, 0x23, 0x7e, 0x97, + 0x88, 0xf8, 0x1d, 0x7a, 0x0c, 0x02, 0xdf, 0x9b, 0xda, 0x10, 0x8f, 0x03, 0x5c, 0x1e, 0x6a, 0x3b, + 0xe8, 0x10, 0xb2, 0xfa, 0xc2, 0xbd, 0xd2, 0x1c, 0x63, 0xc2, 0x63, 0x61, 0x86, 0xbc, 0x77, 0x8d, + 0x89, 0xf4, 0x05, 0x88, 0xd1, 0xdb, 0x20, 0xe4, 0x4c, 0x58, 0x63, 0xc4, 0xb7, 0xcb, 0xd0, 0xf7, + 0xc6, 0x48, 0xfa, 0x9b, 0x54, 0x90, 0x9e, 0x5d, 0xc4, 0x1d, 0xf4, 0xe8, 0x80, 0x5c, 0xa7, 0xee, + 0x70, 0x85, 0x73, 0x2a, 0x7f, 0x43, 0xbf, 0x80, 0x3c, 0x7b, 0xd2, 0x86, 0xd6, 0x88, 0x45, 0xa5, + 0xe2, 0xf9, 0x27, 0x6b, 0xef, 0xfa, 0x8c, 0xfd, 0x53, 0x29, 0x8b, 0x0a, 0x8c, 0xb5, 0x6a, 0x8d, + 0x30, 0x7a, 0x05, 0xdb, 0xcc, 0x08, 0x30, 0x77, 0x62, 0xa7, 0x94, 0x3e, 0x4e, 0x9d, 0xe4, 0xcf, + 0xbf, 0xb8, 0x6f, 0x31, 0xcc, 0xfc, 0xd8, 0x51, 0x4c, 0xd7, 0xbe, 0x55, 0x8b, 0x76, 0x08, 0x58, + 0x7e, 0x0d, 0xbb, 0x31, 0x64, 0x48, 0x84, 0x94, 0x77, 0x09, 0x39, 0x95, 0x3c, 0xa2, 0x53, 0xd8, + 0x64, 0x91, 0x95, 0xf9, 0xc7, 0x5e, 0x78, 0x5b, 0x2e, 0x37, 0x23, 0xf9, 0x36, 0xf9, 0x2c, 0x21, + 0x0d, 0x41, 0x08, 0x2a, 0x83, 0xf2, 0x90, 0xe9, 0xb7, 0x5e, 0xb6, 0xda, 0xaf, 0x5b, 0xe2, 0x06, + 0x3a, 0x00, 0xd4, 0x55, 0xd4, 0x57, 0x8a, 0xaa, 0x5d, 0x36, 0xba, 0x15, 0xa5, 0x2e, 0xbf, 0x6a, + 0xb4, 0x55, 0x31, 0x81, 0xca, 0x70, 0x50, 0x91, 0x7b, 0xd5, 0xba, 0xf6, 0x4a, 0x51, 0xbb, 0x8d, + 0x76, 0x8b, 0xa0, 0x2f, 0x09, 0x40, 0x4c, 0x22, 0x04, 0xc5, 0x8e, 0xac, 0xf6, 0x1a, 0x72, 0x53, + 0x53, 0x95, 0x17, 0x4a, 0xb5, 0x27, 0xa6, 0xa4, 0x7f, 0x48, 0x40, 0x3e, 0xb0, 0x7f, 0xe0, 0x1a, + 0x12, 0x77, 0x5d, 0x43, 0x32, 0xee, 0x1a, 0xf8, 0xa1, 0x05, 0xd5, 0x59, 0xb9, 0x06, 0xa9, 0x0a, + 0x3b, 0x2b, 0x04, 0x44, 0xb2, 0x5a, 0xbf, 0xd3, 0x6c, 0x54, 0xe5, 0x9e, 0xa2, 0x75, 0x14, 0x45, + 0x15, 0x37, 0x88, 0x26, 0xd5, 0xba, 0xdc, 0x6a, 0x29, 0x4d, 0xed, 0xa2, 0xdf, 0xaa, 0x35, 0x5a, + 0xbf, 0xd0, 0x2e, 0xe4, 0x46, 0x53, 0xa9, 0x89, 0x09, 0xe9, 0xbf, 0x12, 0x90, 0xaf, 0x5e, 0xe9, + 0xa6, 0x89, 0xa7, 0x0d, 0x73, 0x6c, 0xa1, 0x13, 0x48, 0xbb, 0xb7, 0x73, 0x16, 0x0c, 0x8b, 0x81, + 0x93, 0xe5, 0x34, 0xbd, 0xdb, 0x39, 0x56, 0x29, 0x05, 0xfa, 0x18, 0x8a, 0x53, 0x6b, 0xa8, 0x4f, + 0x35, 0xd3, 0x1a, 0xe1, 0x40, 0x2e, 0x16, 0x28, 0xb4, 0x65, 0x8d, 0x30, 0xf1, 0x94, 0x4f, 0x88, + 0xad, 0xcc, 0x2c, 0x17, 0x2f, 0xc9, 0x98, 0x37, 0x14, 0x18, 0xd8, 0xa3, 0xfb, 0x5d, 0x28, 0xb1, + 0xd5, 0xe6, 0xfa, 0x2d, 0x71, 0x6f, 0x6d, 0xa0, 0x3b, 0x98, 0xa7, 0xe7, 0x34, 0x65, 0xd8, 0xa7, + 0xf8, 0x0e, 0x43, 0x57, 0x74, 0x07, 0xb3, 0xa4, 0xfc, 0x33, 0x38, 0xe4, 0x1b, 0xc4, 0x70, 0xb2, + 0x84, 0x79, 0xc0, 0x08, 0xa2, 0xac, 0xd2, 0x6f, 0x92, 0x50, 0x0c, 0x87, 0xab, 0xbb, 0xdc, 0xea, + 0x25, 0x08, 0x7e, 0xf6, 0x37, 0x26, 0x4e, 0x29, 0x49, 0x4d, 0xfe, 0x64, 0x4d, 0xe0, 0xf3, 0x43, + 0xb5, 0x31, 0xe1, 0xd6, 0x9e, 0xd7, 0x97, 0x10, 0xd4, 0x82, 0xc2, 0x90, 0x9d, 0xa8, 0x66, 0x98, + 0x63, 0xcb, 0x29, 0xa5, 0xe8, 0x6a, 0x9f, 0xae, 0x5b, 0x2d, 0x70, 0x45, 0x7c, 0x39, 0x61, 0x18, + 0x00, 0x95, 0xbf, 0x03, 0x31, 0xba, 0x61, 0x8c, 0xdf, 0xec, 0x05, 0xfd, 0x46, 0x08, 0x78, 0x48, + 0xb9, 0x0f, 0x3b, 0x2b, 0x5b, 0xfc, 0x4f, 0x1c, 0x2f, 0xc0, 0x1c, 0x74, 0xbc, 0xaf, 0x60, 0x3b, + 0x12, 0xdd, 0xef, 0x89, 0xac, 0xd2, 0x5f, 0xa5, 0x60, 0x8f, 0x57, 0x21, 0xe1, 0x6c, 0xfa, 0x0c, + 0x72, 0xc3, 0x2b, 0x7d, 0x3a, 0xc5, 0x26, 0x4f, 0xd5, 0xc1, 0x14, 0xc2, 0xb3, 0xb3, 0x87, 0x27, + 0x39, 0xd1, 0x27, 0x46, 0x3f, 0x85, 0x8c, 0xb3, 0x18, 0x0e, 0xb1, 0xe3, 0x70, 0xb1, 0x97, 0xf9, + 0xad, 0xeb, 0x25, 0xce, 0x2e, 0x23, 0x20, 0xb9, 0x87, 0xd3, 0xa2, 0x2f, 0x61, 0x13, 0xdb, 0xb6, + 0x65, 0xf3, 0x4c, 0xfa, 0x60, 0x95, 0x49, 0x21, 0xe8, 0xfa, 0x86, 0xca, 0xe8, 0xd0, 0x53, 0xc8, + 0xcc, 0x6d, 0x3c, 0xd7, 0x6d, 0xcc, 0xf3, 0x68, 0x39, 0xe6, 0x36, 0x3b, 0x8c, 0x82, 0x6c, 0xc4, + 0x89, 0xd1, 0x79, 0x28, 0x93, 0x3e, 0x5c, 0x63, 0x02, 0x15, 0x3c, 0x31, 0x96, 0xe9, 0xf4, 0x67, + 0x90, 0x1d, 0x1b, 0xa6, 0x3e, 0x35, 0xfe, 0x14, 0xf3, 0x7c, 0xfa, 0x41, 0x0c, 0xdf, 0x05, 0x27, + 0x21, 0x55, 0x92, 0x47, 0x8e, 0x9e, 0x40, 0x86, 0x5b, 0x62, 0x29, 0x13, 0xd1, 0x8c, 0x1f, 0x39, + 0xbf, 0x32, 0x22, 0x23, 0xa7, 0xf4, 0x12, 0x71, 0x07, 0xb6, 0x23, 0x47, 0x8d, 0x1e, 0x46, 0xef, + 0x45, 0x08, 0x9e, 0x7d, 0x24, 0x49, 0x27, 0xa3, 0x49, 0x5a, 0xfa, 0x1a, 0xc4, 0xe8, 0x25, 0xdc, + 0x67, 0x22, 0x7f, 0x97, 0xe6, 0x81, 0x2f, 0x78, 0xa0, 0xa8, 0x07, 0xc5, 0x19, 0x79, 0x5f, 0xe6, + 0xa4, 0xc4, 0xda, 0x9c, 0xc4, 0x79, 0xce, 0x2e, 0x19, 0x43, 0x30, 0x27, 0x15, 0x66, 0x41, 0x18, + 0x3a, 0x83, 0xdd, 0xe1, 0x14, 0xeb, 0xb6, 0x61, 0x4e, 0xb4, 0xb9, 0x6d, 0x0c, 0xb1, 0x66, 0xeb, + 0x2e, 0xe6, 0x95, 0xc4, 0x8e, 0x87, 0xea, 0x10, 0x8c, 0xaa, 0xbb, 0x18, 0xfd, 0x3e, 0x88, 0xc3, + 0x2b, 0xdd, 0x9e, 0xe0, 0x91, 0xc6, 0x8f, 0xce, 0x73, 0xed, 0xbd, 0x68, 0xbd, 0x53, 0x33, 0xc6, + 0x63, 0x75, 0x9b, 0x53, 0x73, 0x98, 0x83, 0xbe, 0x85, 0x02, 0xbe, 0xc1, 0xc3, 0x05, 0xb9, 0x07, + 0x6d, 0x8c, 0x3d, 0x53, 0x5a, 0xd6, 0xc7, 0x8a, 0x87, 0xbd, 0xc0, 0x58, 0x15, 0x70, 0xe0, 0x0d, + 0x7d, 0x06, 0x3b, 0x2c, 0x78, 0xb9, 0xb6, 0x6e, 0x3a, 0x3a, 0xbd, 0x4b, 0x1e, 0x02, 0x45, 0x8a, + 0xe8, 0x2d, 0xe1, 0xe8, 0x73, 0xd8, 0x1d, 0x63, 0xa6, 0x8e, 0xe6, 0xe8, 0xae, 0x36, 0x27, 0xc7, + 0xfd, 0x8e, 0x1a, 0x53, 0x5a, 0xdd, 0x1e, 0x63, 0xaa, 0x4f, 0x57, 0x77, 0x3b, 0xd8, 0x7e, 0xf9, + 0x8e, 0x04, 0x7b, 0x4a, 0x8d, 0x07, 0x9c, 0x9e, 0xda, 0x4e, 0x5a, 0x15, 0x08, 0x21, 0x05, 0x76, + 0xf5, 0x70, 0x51, 0x92, 0x0d, 0x47, 0xcf, 0x95, 0x62, 0x2c, 0xb7, 0x5a, 0x8c, 0x95, 0x5f, 0x03, + 0x5a, 0xbd, 0x92, 0x98, 0x30, 0xf4, 0x59, 0x38, 0x0c, 0x2d, 0x0f, 0x27, 0xc8, 0x1d, 0x8e, 0x43, + 0xbb, 0x31, 0xde, 0x74, 0x57, 0xd1, 0x65, 0x01, 0x5a, 0xf5, 0xa3, 0xbb, 0xd2, 0xc3, 0x11, 0x00, + 0x3f, 0xfc, 0x1b, 0xde, 0x30, 0x09, 0x6a, 0x8e, 0x9d, 0xfa, 0x8d, 0x31, 0x22, 0x8e, 0x70, 0x85, + 0x8d, 0xc9, 0x95, 0xab, 0x5d, 0x91, 0xc4, 0x94, 0xa2, 0xda, 0x03, 0x03, 0xd5, 0x49, 0x32, 0xfa, + 0xc7, 0x24, 0x14, 0xc3, 0x91, 0x85, 0x84, 0x6b, 0x16, 0x81, 0x98, 0xea, 0x3c, 0xcc, 0x3c, 0x07, + 0xa0, 0x0f, 0xc1, 0xf2, 0xe1, 0x68, 0x4d, 0x70, 0x3a, 0xa3, 0x7f, 0xd5, 0x1c, 0x65, 0xa0, 0xb5, + 0xdb, 0xdd, 0x4d, 0x3a, 0xaa, 0xc3, 0xae, 0x97, 0xe4, 0x6c, 0xda, 0xac, 0xeb, 0xd4, 0x88, 0xd2, + 0x77, 0x06, 0x0a, 0x15, 0xe9, 0x7e, 0xeb, 0xe9, 0xb1, 0x48, 0x06, 0x6c, 0x32, 0x2d, 0x42, 0xc5, + 0xd6, 0x2e, 0x6c, 0xf3, 0x62, 0xab, 0x5b, 0xef, 0xf7, 0x6a, 0x04, 0x48, 0x2b, 0x2d, 0xb9, 0x5a, + 0x6d, 0xf7, 0x5b, 0x3d, 0xad, 0xd6, 0x56, 0xba, 0x5a, 0xab, 0xdd, 0xd3, 0x94, 0x1f, 0x1a, 0xdd, + 0x9e, 0x98, 0x44, 0x12, 0x3c, 0x6a, 0xb4, 0xaa, 0xed, 0xcb, 0x4e, 0x53, 0xe9, 0x29, 0x9a, 0x47, + 0xa6, 0x2a, 0x64, 0x15, 0xb9, 0xd7, 0x68, 0xb7, 0xc4, 0x94, 0xf4, 0xcf, 0x49, 0x28, 0x86, 0x25, + 0x5a, 0x66, 0x3a, 0x36, 0xcf, 0x60, 0x2f, 0xa4, 0x24, 0x0b, 0x0d, 0x30, 0xf8, 0xdb, 0x7d, 0x87, + 0xb2, 0x3a, 0x9f, 0x48, 0xc7, 0xcd, 0x27, 0x3e, 0x80, 0xdc, 0x72, 0x2e, 0xc1, 0xdc, 0x8e, 0x59, + 0x0b, 0x41, 0x9e, 0xc3, 0xa6, 0xe3, 0x92, 0xd0, 0xb1, 0x45, 0x2f, 0xec, 0xe1, 0x9a, 0xa3, 0xec, + 0x12, 0x1a, 0x95, 0x91, 0x46, 0x6d, 0x26, 0x13, 0xb5, 0x19, 0xf4, 0x05, 0x64, 0xad, 0x85, 0xcb, + 0x4a, 0x9d, 0xec, 0xba, 0x19, 0x86, 0x4f, 0x42, 0x04, 0x9c, 0xea, 0x2e, 0x76, 0x5c, 0xcd, 0xbd, + 0xa1, 0xfe, 0x27, 0xa8, 0x59, 0x06, 0xe8, 0xdd, 0x48, 0xbf, 0x02, 0x21, 0xe8, 0x3d, 0xe8, 0x29, + 0x08, 0x5e, 0x3c, 0x1d, 0x18, 0x23, 0x2f, 0x9a, 0xee, 0x46, 0x5d, 0xad, 0x62, 0x8c, 0xd4, 0xfc, + 0xcc, 0x7f, 0x76, 0x82, 0x7c, 0xba, 0x73, 0xed, 0x95, 0x49, 0x2b, 0x7c, 0xb2, 0x73, 0xed, 0xf3, + 0xc9, 0xce, 0xb5, 0x23, 0xf5, 0x01, 0x96, 0x28, 0xf4, 0xf1, 0x3d, 0xf3, 0x09, 0x36, 0x9d, 0x78, + 0x0c, 0xc2, 0xc2, 0x34, 0x5c, 0x47, 0x1b, 0x1b, 0xd3, 0x29, 0x1f, 0x09, 0x14, 0xd4, 0x3c, 0x85, + 0x5d, 0x50, 0x50, 0x60, 0xd9, 0x8a, 0x31, 0x22, 0xcb, 0x0e, 0xb8, 0xeb, 0xc6, 0x8e, 0x33, 0xe8, + 0x30, 0xe3, 0x7d, 0x96, 0xfd, 0xa7, 0x24, 0xe4, 0x03, 0x71, 0x9c, 0x98, 0x08, 0x36, 0x47, 0x24, + 0x4b, 0x0c, 0xf4, 0xa9, 0x4e, 0x5a, 0x42, 0x66, 0x78, 0x05, 0x06, 0xad, 0x30, 0x20, 0xaa, 0x81, + 0xc0, 0xc9, 0x98, 0x31, 0x30, 0xef, 0x7d, 0x1c, 0x97, 0x1a, 0xce, 0x42, 0x16, 0x91, 0x67, 0x6c, + 0xf4, 0x85, 0x6c, 0xe6, 0xdd, 0xa9, 0x66, 0x98, 0x23, 0x7c, 0x43, 0x4d, 0x76, 0x53, 0x2d, 0x78, + 0xd0, 0x06, 0x01, 0x46, 0xac, 0x3a, 0x1d, 0x4d, 0xa3, 0xbf, 0x02, 0x21, 0xb8, 0x05, 0xda, 0x03, + 0xb1, 0xdd, 0xef, 0x75, 0xfa, 0xc4, 0xbb, 0xaa, 0xaa, 0x22, 0xf7, 0x94, 0x9a, 0xb8, 0x81, 0x1e, + 0xc3, 0x11, 0x87, 0xd6, 0xfa, 0x5d, 0xe2, 0x96, 0x3d, 0xa5, 0x55, 0x53, 0x6a, 0x5a, 0xfb, 0xe2, + 0xa2, 0x5a, 0x97, 0x1b, 0xc4, 0x7d, 0x8f, 0xe0, 0x30, 0x48, 0x22, 0xd7, 0x08, 0xbe, 0xd7, 0xd6, + 0x2e, 0x14, 0xa5, 0x2b, 0x26, 0x49, 0x7f, 0xc5, 0xd1, 0x17, 0xfd, 0x66, 0xf3, 0x8d, 0xd6, 0xed, + 0x28, 0x2d, 0xd2, 0x2f, 0xfd, 0x65, 0x0a, 0xf2, 0xec, 0xe0, 0x99, 0xc1, 0xdd, 0xd3, 0x72, 0x1f, + 0x01, 0xd0, 0x5c, 0x35, 0x36, 0x6e, 0xfc, 0x2b, 0xc9, 0x11, 0xc8, 0x05, 0x01, 0x90, 0x24, 0xa1, + 0xcf, 0x5c, 0x3e, 0x6a, 0x23, 0x8f, 0xe8, 0x18, 0x84, 0x99, 0x61, 0x6a, 0xa4, 0x4c, 0xd6, 0x08, + 0x2a, 0x4d, 0x51, 0x30, 0x33, 0x4c, 0x52, 0xac, 0xca, 0x33, 0x3a, 0x41, 0x08, 0x0c, 0x82, 0xa8, + 0x67, 0x0a, 0x2a, 0x2c, 0xe7, 0x3f, 0xc4, 0x61, 0x18, 0x01, 0x69, 0xe2, 0x33, 0xcc, 0x61, 0x28, + 0xa0, 0x6b, 0x4c, 0x90, 0x04, 0x85, 0xd9, 0x62, 0xea, 0x1a, 0x04, 0x49, 0x45, 0x66, 0x19, 0x2f, + 0x4f, 0x81, 0x5d, 0x63, 0x42, 0x84, 0x3e, 0x84, 0x2c, 0x6d, 0x7b, 0xe6, 0x8b, 0x01, 0x77, 0xb8, + 0x0c, 0x79, 0xef, 0x2c, 0x06, 0xe8, 0x6b, 0xc8, 0x51, 0x94, 0x3e, 0x1a, 0xd9, 0x25, 0x88, 0x94, + 0x08, 0xa4, 0x2b, 0x92, 0x47, 0x23, 0x1b, 0x3b, 0x8e, 0x4a, 0x57, 0x20, 0x2f, 0x44, 0x1c, 0xaa, + 0x0d, 0x6d, 0xd0, 0x04, 0x7a, 0x02, 0x59, 0x02, 0x20, 0x4d, 0x19, 0xfa, 0x0e, 0x8e, 0x66, 0xfa, + 0x0d, 0x9f, 0x8c, 0xc6, 0x65, 0xf6, 0x02, 0xd5, 0xff, 0xc1, 0x4c, 0xbf, 0xa1, 0x53, 0xd2, 0x8b, + 0x70, 0x86, 0x7f, 0x91, 0xce, 0x6e, 0x8a, 0x5b, 0x2f, 0xd2, 0xd9, 0xbc, 0x28, 0x48, 0xff, 0x92, + 0x80, 0x9c, 0xef, 0x13, 0xe8, 0xcc, 0x1f, 0xab, 0x71, 0xc7, 0xd9, 0x8b, 0x38, 0x0e, 0x4b, 0xb7, + 0x1e, 0x11, 0x3a, 0x87, 0xfd, 0x29, 0x26, 0x3d, 0xd8, 0x68, 0x61, 0xd3, 0x5c, 0xa0, 0x0d, 0xa6, + 0xd6, 0xf0, 0xda, 0xe1, 0x97, 0xb6, 0x4b, 0x91, 0x35, 0x8e, 0xab, 0x50, 0x14, 0x2a, 0x41, 0xc6, + 0x2b, 0x0c, 0xd8, 0x1c, 0xd4, 0x7b, 0x45, 0x3f, 0x85, 0x02, 0xb9, 0x46, 0x7a, 0x56, 0xae, 0x81, + 0x6d, 0x1a, 0x59, 0x8b, 0x81, 0x40, 0x47, 0xce, 0xaa, 0x67, 0x60, 0x5b, 0xcd, 0xcf, 0x0c, 0xd3, + 0x7b, 0x79, 0x91, 0xce, 0xa6, 0xc4, 0xb4, 0xf4, 0x67, 0xbe, 0x22, 0x24, 0xa8, 0xfc, 0x9f, 0x29, + 0x92, 0x7e, 0x2f, 0x45, 0x36, 0x43, 0x8a, 0x48, 0x67, 0x90, 0x0f, 0x8c, 0x0f, 0xa3, 0xc6, 0x97, + 0x88, 0x1a, 0x9f, 0xf4, 0xf7, 0x09, 0x10, 0x82, 0xc3, 0xd0, 0x7b, 0x39, 0x90, 0x0c, 0xf9, 0xb1, + 0x6e, 0x4c, 0xb5, 0xc0, 0xf4, 0xa7, 0x78, 0x7e, 0x1c, 0x3b, 0x59, 0x3d, 0xbb, 0xd0, 0x8d, 0xa9, + 0x37, 0x53, 0x18, 0xfb, 0xcf, 0x64, 0x0f, 0xba, 0x84, 0xe3, 0x92, 0xba, 0x96, 0xba, 0x53, 0x8e, + 0x11, 0x74, 0x29, 0x44, 0x3a, 0x02, 0x58, 0xb2, 0xa2, 0x6d, 0xc8, 0x37, 0x5a, 0xaf, 0xe4, 0x66, + 0xa3, 0xa6, 0xc9, 0x97, 0x3d, 0x71, 0x43, 0xfa, 0x43, 0xcf, 0xa7, 0x1b, 0xe6, 0x7c, 0x11, 0x4e, + 0x50, 0x89, 0xfb, 0x13, 0xd4, 0x11, 0x00, 0x71, 0xa6, 0xd0, 0x70, 0x3d, 0xe7, 0x18, 0x13, 0x36, + 0x58, 0x97, 0x9e, 0x83, 0xc0, 0xef, 0x69, 0xe1, 0x92, 0xd5, 0xd7, 0x26, 0xf9, 0xd0, 0x02, 0xfc, + 0x4d, 0xfa, 0xdb, 0x24, 0x94, 0x19, 0xfb, 0xa5, 0x35, 0x32, 0xc6, 0xb7, 0x91, 0x8f, 0x02, 0xf7, + 0x84, 0x9f, 0x27, 0x00, 0x26, 0x7e, 0xa7, 0x19, 0x44, 0x2d, 0x2f, 0xa9, 0x45, 0xcd, 0x87, 0xea, + 0xac, 0xe6, 0x4c, 0xfc, 0x8e, 0x3e, 0x91, 0x5c, 0x98, 0x27, 0x4c, 0x16, 0x15, 0xd7, 0x6b, 0x04, + 0xf6, 0xa3, 0x46, 0x47, 0xb1, 0x2a, 0x59, 0x9e, 0x3d, 0x3a, 0xe8, 0x35, 0xdb, 0x6c, 0xae, 0xdb, + 0xfa, 0xcc, 0xe1, 0xc5, 0xd7, 0xb3, 0x08, 0x5b, 0x9c, 0x12, 0x67, 0x2d, 0xfc, 0x8e, 0x43, 0x3a, + 0x84, 0x17, 0xbb, 0xd8, 0x76, 0xa8, 0x40, 0xf4, 0xd5, 0x29, 0x7f, 0x0e, 0x7b, 0x71, 0x24, 0xf1, + 0x27, 0x29, 0x7d, 0x07, 0x1f, 0xc4, 0xee, 0xc5, 0x47, 0xf9, 0x1f, 0x42, 0x3e, 0x30, 0x10, 0xf1, + 0xec, 0x71, 0x39, 0xe5, 0x90, 0xbe, 0x85, 0x07, 0x01, 0xbf, 0x62, 0x89, 0x8c, 0x9f, 0xf6, 0xbd, + 0xd6, 0x6f, 0x7b, 0x03, 0xfc, 0x20, 0x2f, 0xdf, 0xf8, 0x53, 0xaf, 0x96, 0x62, 0x43, 0xaa, 0xdd, + 0x70, 0x87, 0x17, 0x2a, 0xa1, 0x3e, 0x83, 0x1d, 0x96, 0xca, 0x17, 0xe6, 0x78, 0x31, 0x0d, 0xe5, + 0x73, 0x91, 0x22, 0xfa, 0x4b, 0xb8, 0x54, 0x04, 0xa1, 0x87, 0xed, 0x99, 0xc3, 0x85, 0x94, 0x7e, + 0x9d, 0x86, 0x02, 0x07, 0xf0, 0x9d, 0x4f, 0x61, 0x87, 0x04, 0xd9, 0xb8, 0x4f, 0x66, 0xdb, 0x33, + 0xfd, 0x46, 0x0e, 0x7e, 0xe1, 0xf9, 0x3d, 0x38, 0x24, 0xb4, 0x4c, 0xcd, 0xd8, 0x50, 0x58, 0x49, + 0x96, 0x12, 0xea, 0xc1, 0x4c, 0xbf, 0xa1, 0x72, 0x47, 0x02, 0xc9, 0x4a, 0x23, 0x98, 0x7a, 0xff, + 0x46, 0xb0, 0x0b, 0xdb, 0xe1, 0xc0, 0xe5, 0x0d, 0x68, 0x4f, 0x7d, 0xee, 0x90, 0x5e, 0x67, 0xcd, + 0x60, 0x24, 0xf3, 0xa6, 0xb3, 0xa1, 0xf0, 0xe6, 0xa0, 0x27, 0x70, 0x60, 0xe2, 0x1b, 0x97, 0x67, + 0x98, 0xa1, 0x65, 0x8e, 0x35, 0x97, 0xf4, 0xae, 0x2e, 0x0f, 0x74, 0xbb, 0x04, 0x4b, 0x53, 0x4b, + 0xd5, 0x32, 0xc7, 0x3d, 0x8a, 0x42, 0x7f, 0x00, 0x8f, 0x02, 0x4c, 0xeb, 0x1b, 0xce, 0x92, 0xcf, + 0x1c, 0xc9, 0x4b, 0xe8, 0xe7, 0x50, 0x0e, 0x6e, 0x4b, 0x3a, 0x6e, 0xcd, 0x35, 0x66, 0xd8, 0x71, + 0xf5, 0xd9, 0x9c, 0x77, 0xa1, 0x0f, 0x96, 0x5b, 0x13, 0x7c, 0xcf, 0x43, 0x97, 0x65, 0xd8, 0x8d, + 0x51, 0x2d, 0xd8, 0x51, 0x16, 0x62, 0x26, 0x63, 0xd9, 0x60, 0xeb, 0x58, 0x81, 0x3d, 0x15, 0x4f, + 0xf1, 0x5b, 0xdd, 0x64, 0x3b, 0x78, 0x16, 0x5c, 0x84, 0xa4, 0xdf, 0x04, 0x26, 0x8d, 0x11, 0x2a, + 0xd3, 0x4f, 0x53, 0xac, 0xe3, 0x27, 0xe1, 0x41, 0x50, 0xfd, 0x77, 0xe9, 0xdf, 0x53, 0x50, 0x08, + 0x2d, 0x12, 0x4c, 0x13, 0x89, 0x70, 0xbe, 0x63, 0xeb, 0x26, 0xfd, 0x75, 0xff, 0xd7, 0x13, 0x85, + 0xce, 0xca, 0x60, 0x24, 0x1d, 0x99, 0x35, 0x86, 0x44, 0xfb, 0xf1, 0x43, 0x91, 0xcd, 0x75, 0x43, + 0x91, 0x15, 0x53, 0xde, 0x7a, 0x7f, 0x53, 0x3e, 0x86, 0x7c, 0x70, 0x9a, 0xc1, 0x8a, 0xb0, 0x20, + 0x68, 0xdd, 0x20, 0x23, 0x1b, 0x3b, 0xc8, 0xf8, 0xff, 0x1b, 0x31, 0xd4, 0x40, 0x08, 0xaa, 0xc1, + 0x46, 0x05, 0x0e, 0xa6, 0xfa, 0xb2, 0x08, 0x91, 0x21, 0xef, 0x1c, 0xe5, 0x49, 0x4c, 0x97, 0x4f, + 0xab, 0x19, 0x2e, 0xa6, 0xf4, 0x73, 0xc8, 0x07, 0x6a, 0x3f, 0x62, 0x26, 0x26, 0x76, 0xdf, 0x59, + 0xf6, 0x35, 0x97, 0xcd, 0x7b, 0x45, 0x08, 0xd2, 0xb4, 0x72, 0x64, 0x9f, 0x78, 0xe8, 0xb3, 0x24, + 0x43, 0xd6, 0x4b, 0xaa, 0x04, 0x4f, 0x07, 0x11, 0xcc, 0x40, 0xe9, 0x33, 0xe9, 0x6b, 0x58, 0x2a, + 0xe2, 0x5d, 0x03, 0xef, 0x6b, 0x18, 0x8c, 0xf6, 0x0c, 0xd2, 0x5f, 0x24, 0x20, 0x2f, 0x3b, 0xd7, + 0x5d, 0x53, 0x9f, 0x3b, 0x57, 0x96, 0x7b, 0x87, 0x9d, 0xfe, 0x98, 0x2a, 0x2f, 0x5c, 0xc3, 0xa7, + 0xa2, 0x35, 0x7c, 0xa8, 0xbe, 0x4d, 0x87, 0xeb, 0x5b, 0x2a, 0x59, 0xc5, 0x18, 0xfd, 0x16, 0x4a, + 0xf6, 0xaf, 0x09, 0xd8, 0x0b, 0x5a, 0x85, 0x2f, 0x62, 0xe8, 0x23, 0x7b, 0xc0, 0x5b, 0x97, 0xe7, + 0x1b, 0xf3, 0x91, 0x7d, 0x49, 0x17, 0xd0, 0x96, 0xf5, 0xa5, 0x1f, 0x01, 0x73, 0x44, 0xe2, 0x77, + 0xd4, 0x78, 0x98, 0x9c, 0x82, 0x07, 0xa4, 0xce, 0xf6, 0x39, 0x20, 0xd7, 0x72, 0xf5, 0x29, 0xf1, + 0x05, 0x87, 0xc5, 0x4b, 0x3c, 0xe2, 0xcd, 0x8f, 0x48, 0x31, 0x5d, 0xdd, 0x75, 0xaa, 0x0c, 0x4e, + 0x96, 0x64, 0xf9, 0x91, 0x7b, 0x38, 0x77, 0x62, 0xd6, 0xff, 0x72, 0xa5, 0xa4, 0xaf, 0x61, 0x8f, + 0x86, 0x06, 0x5f, 0x1a, 0x1e, 0x02, 0xef, 0x18, 0x9f, 0xfd, 0x26, 0x09, 0xfb, 0x11, 0x1e, 0x9e, + 0x42, 0xd7, 0xdf, 0x5b, 0x70, 0xb9, 0x64, 0x78, 0xb8, 0x26, 0x41, 0x61, 0x6e, 0xe3, 0xb7, 0x9a, + 0x8f, 0x67, 0x33, 0x9a, 0x3c, 0x01, 0x56, 0x38, 0xcd, 0x9a, 0xa8, 0x94, 0x5e, 0x17, 0x95, 0x6a, + 0x2b, 0x71, 0x71, 0x93, 0xc6, 0xc5, 0xa3, 0x58, 0x57, 0xf7, 0xf5, 0x88, 0xc4, 0xc2, 0x47, 0x90, + 0xf7, 0xc6, 0x7e, 0x44, 0xae, 0x0c, 0x75, 0x47, 0x6f, 0xee, 0xd7, 0x18, 0x2d, 0x95, 0x72, 0x6f, + 0x78, 0x83, 0x99, 0xe1, 0x48, 0xf4, 0x1c, 0x1e, 0xfa, 0xac, 0xeb, 0x23, 0xd8, 0x01, 0x27, 0x8f, + 0xe4, 0x45, 0xe9, 0xb9, 0x57, 0x5c, 0x91, 0x78, 0xa1, 0xea, 0x2e, 0xb9, 0x7f, 0x7e, 0x2f, 0x8f, + 0x41, 0xf0, 0xba, 0xce, 0x6b, 0x7c, 0xcb, 0x46, 0x37, 0x82, 0x9a, 0xe7, 0x9d, 0x27, 0x01, 0x49, + 0x7f, 0x04, 0xb0, 0xe4, 0x23, 0xd5, 0x58, 0x80, 0xc1, 0xab, 0xc6, 0x96, 0xf4, 0xe8, 0x8c, 0x37, + 0xab, 0xb4, 0x01, 0x4b, 0xae, 0x6b, 0xc0, 0x68, 0xa7, 0x4a, 0x9e, 0x24, 0xd5, 0xab, 0xde, 0x82, + 0xc2, 0x71, 0x03, 0x78, 0xca, 0xa5, 0xb3, 0x29, 0x78, 0x75, 0xb0, 0x14, 0x60, 0xa1, 0x52, 0xb1, + 0x67, 0x47, 0x9a, 0x44, 0x2c, 0xca, 0x2b, 0xd3, 0xd0, 0xc7, 0x50, 0x74, 0x5c, 0xdd, 0x76, 0xb5, + 0x88, 0x31, 0x0a, 0x14, 0xea, 0x99, 0xc7, 0x09, 0x88, 0xe6, 0x62, 0xc6, 0x68, 0xb0, 0xa3, 0x0d, + 0xf4, 0xe1, 0x35, 0x0f, 0x08, 0x45, 0x73, 0x31, 0xab, 0x30, 0x70, 0x45, 0x1f, 0x5e, 0x4b, 0x2a, + 0x1c, 0x44, 0x37, 0xe2, 0xa2, 0x3f, 0x83, 0x0c, 0xe7, 0xe7, 0x52, 0x3f, 0x5a, 0x3a, 0x6b, 0x9c, + 0xb1, 0xab, 0x1e, 0xf9, 0xe9, 0xa7, 0xfe, 0x57, 0x56, 0xda, 0xac, 0x17, 0x20, 0xd7, 0x7b, 0xad, + 0xc8, 0x2f, 0x9b, 0x4a, 0xb7, 0x2b, 0x6e, 0xa0, 0x3c, 0x64, 0xe4, 0x56, 0xb5, 0xde, 0x56, 0xbb, + 0x62, 0xe2, 0xf4, 0xcf, 0x13, 0xb0, 0x1b, 0x33, 0x14, 0xa4, 0xdf, 0xa9, 0x7b, 0xec, 0xab, 0x2e, + 0xfb, 0x86, 0xdb, 0xee, 0x28, 0x2d, 0x71, 0x03, 0x15, 0x01, 0x18, 0x9c, 0xbe, 0x27, 0xd0, 0x0e, + 0x14, 0xd8, 0xbb, 0xf2, 0x43, 0xa7, 0xa1, 0x2a, 0x35, 0x31, 0x89, 0x4a, 0xb0, 0x17, 0x66, 0xed, + 0x77, 0x6a, 0x72, 0x4f, 0x11, 0x53, 0x48, 0x04, 0x81, 0x61, 0xaa, 0xcd, 0x76, 0x57, 0xa9, 0x89, + 0x69, 0xf4, 0x00, 0x76, 0xc3, 0xb4, 0xf4, 0x23, 0xb8, 0xb8, 0x79, 0xfa, 0x0d, 0x64, 0xbd, 0x9b, + 0x26, 0x6c, 0xbd, 0x86, 0xa2, 0x6a, 0x35, 0xe5, 0x42, 0xee, 0x37, 0x7b, 0xe2, 0x06, 0x02, 0xd8, + 0xa2, 0x90, 0xaf, 0xc4, 0x84, 0xff, 0xfc, 0xb5, 0x98, 0x3c, 0xfd, 0xeb, 0x04, 0xc0, 0xb2, 0x2c, + 0x47, 0xbb, 0xb0, 0xdd, 0x56, 0x6b, 0x8a, 0xaa, 0x75, 0xfb, 0x95, 0xcb, 0x46, 0x8f, 0xcd, 0x98, + 0x76, 0xa0, 0xc0, 0x80, 0xd5, 0xa6, 0x22, 0x13, 0x89, 0xe9, 0x48, 0x98, 0x81, 0xf8, 0x67, 0xf6, + 0xe6, 0x1b, 0xed, 0xa2, 0xd1, 0x6c, 0x52, 0x6d, 0x10, 0x14, 0x19, 0x4e, 0xf9, 0x41, 0xa9, 0xf6, + 0xc9, 0x12, 0xa9, 0x25, 0xac, 0x2a, 0xb7, 0xaa, 0x4a, 0x93, 0x6a, 0xe2, 0x2f, 0xeb, 0x1d, 0xc4, + 0x26, 0x91, 0x9b, 0x81, 0xf8, 0xf7, 0xef, 0xad, 0xf3, 0xff, 0xcc, 0xf8, 0x5f, 0x3e, 0x65, 0x7f, + 0x9a, 0x8b, 0xbe, 0x87, 0x62, 0xf8, 0xb7, 0x6a, 0xe8, 0x51, 0xa0, 0x5a, 0x8a, 0xf9, 0x21, 0x5d, + 0xf9, 0xc3, 0xb5, 0x78, 0x6e, 0x3b, 0x3d, 0xc8, 0x07, 0x7e, 0xa4, 0x85, 0x1e, 0xaf, 0xf4, 0x8e, + 0xd1, 0x9f, 0xa9, 0x95, 0xa5, 0xbb, 0x48, 0xf8, 0xaa, 0xbf, 0x84, 0x42, 0xa8, 0x39, 0x43, 0x1f, + 0xbd, 0x47, 0x9b, 0x58, 0xfe, 0xf8, 0x6e, 0xa2, 0xa5, 0xc4, 0x81, 0x5f, 0x70, 0xad, 0x48, 0xbc, + 0xfa, 0xab, 0xb2, 0x15, 0x89, 0xe3, 0x7e, 0x00, 0xd6, 0x0b, 0x8f, 0x41, 0xa2, 0xab, 0xae, 0xfe, + 0x5e, 0x6b, 0x65, 0xd5, 0x98, 0x1f, 0x61, 0xa1, 0xef, 0x43, 0x56, 0x76, 0x1c, 0x37, 0xd7, 0x09, + 0xf6, 0x9f, 0xe5, 0xc7, 0x77, 0x50, 0xf0, 0x25, 0xdf, 0xc0, 0xbe, 0xff, 0x31, 0x85, 0x7a, 0x37, + 0xb7, 0x0f, 0xb4, 0x4c, 0x10, 0x71, 0x3f, 0xfb, 0x2a, 0x1f, 0x45, 0xa7, 0xd5, 0x21, 0xf4, 0x49, + 0xe2, 0xab, 0x04, 0x7a, 0x0a, 0x9b, 0xb4, 0xff, 0x42, 0xfb, 0xd1, 0x7e, 0x8c, 0x49, 0x77, 0x10, + 0xdf, 0xa6, 0xa1, 0x16, 0xec, 0x87, 0x6a, 0x75, 0xbf, 0xd2, 0x38, 0x8a, 0xaf, 0xe5, 0x57, 0xd7, + 0x0b, 0x77, 0x21, 0x2d, 0x28, 0xac, 0x5b, 0x27, 0x2e, 0xe1, 0x97, 0xef, 0x09, 0x77, 0xe4, 0x16, + 0x02, 0x59, 0x25, 0x7a, 0x0b, 0x2b, 0x89, 0x6a, 0xe5, 0x16, 0x62, 0xb2, 0xc5, 0xf7, 0x50, 0x0c, + 0x07, 0x63, 0xb4, 0x46, 0x08, 0x67, 0xd5, 0x13, 0xe3, 0xa3, 0x78, 0xe5, 0x77, 0x7e, 0xf9, 0x93, + 0x89, 0xe1, 0x5e, 0x2d, 0x06, 0x67, 0x43, 0x6b, 0xf6, 0xe5, 0xd4, 0x98, 0x5c, 0xb9, 0xa6, 0x61, + 0x4e, 0xa6, 0xfa, 0xc0, 0xf9, 0x92, 0xb0, 0x7e, 0xc9, 0xf9, 0x07, 0x5b, 0xf4, 0x67, 0xb4, 0x4f, + 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x8e, 0x2b, 0x7b, 0x3b, 0x5a, 0x2b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4348,6 +4449,7 @@ type ChannelAuctioneerClient interface { RelevantBatchSnapshot(ctx context.Context, in *RelevantBatchRequest, opts ...grpc.CallOption) (*RelevantBatch, error) BatchSnapshot(ctx context.Context, in *BatchSnapshotRequest, opts ...grpc.CallOption) (*BatchSnapshotResponse, error) NodeRating(ctx context.Context, in *ServerNodeRatingRequest, opts ...grpc.CallOption) (*ServerNodeRatingResponse, error) + BatchSnapshots(ctx context.Context, in *BatchSnapshotsRequest, opts ...grpc.CallOption) (*BatchSnapshotsResponse, error) } type channelAuctioneerClient struct { @@ -4479,6 +4581,15 @@ func (c *channelAuctioneerClient) NodeRating(ctx context.Context, in *ServerNode return out, nil } +func (c *channelAuctioneerClient) BatchSnapshots(ctx context.Context, in *BatchSnapshotsRequest, opts ...grpc.CallOption) (*BatchSnapshotsResponse, error) { + out := new(BatchSnapshotsResponse) + err := c.cc.Invoke(ctx, "/poolrpc.ChannelAuctioneer/BatchSnapshots", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ChannelAuctioneerServer is the server API for ChannelAuctioneer service. type ChannelAuctioneerServer interface { ReserveAccount(context.Context, *ReserveAccountRequest) (*ReserveAccountResponse, error) @@ -4492,6 +4603,7 @@ type ChannelAuctioneerServer interface { RelevantBatchSnapshot(context.Context, *RelevantBatchRequest) (*RelevantBatch, error) BatchSnapshot(context.Context, *BatchSnapshotRequest) (*BatchSnapshotResponse, error) NodeRating(context.Context, *ServerNodeRatingRequest) (*ServerNodeRatingResponse, error) + BatchSnapshots(context.Context, *BatchSnapshotsRequest) (*BatchSnapshotsResponse, error) } // UnimplementedChannelAuctioneerServer can be embedded to have forward compatible implementations. @@ -4531,6 +4643,9 @@ func (*UnimplementedChannelAuctioneerServer) BatchSnapshot(ctx context.Context, func (*UnimplementedChannelAuctioneerServer) NodeRating(ctx context.Context, req *ServerNodeRatingRequest) (*ServerNodeRatingResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NodeRating not implemented") } +func (*UnimplementedChannelAuctioneerServer) BatchSnapshots(ctx context.Context, req *BatchSnapshotsRequest) (*BatchSnapshotsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BatchSnapshots not implemented") +} func RegisterChannelAuctioneerServer(s *grpc.Server, srv ChannelAuctioneerServer) { s.RegisterService(&_ChannelAuctioneer_serviceDesc, srv) @@ -4742,6 +4857,24 @@ func _ChannelAuctioneer_NodeRating_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ChannelAuctioneer_BatchSnapshots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchSnapshotsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ChannelAuctioneerServer).BatchSnapshots(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/poolrpc.ChannelAuctioneer/BatchSnapshots", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ChannelAuctioneerServer).BatchSnapshots(ctx, req.(*BatchSnapshotsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _ChannelAuctioneer_serviceDesc = grpc.ServiceDesc{ ServiceName: "poolrpc.ChannelAuctioneer", HandlerType: (*ChannelAuctioneerServer)(nil), @@ -4786,6 +4919,10 @@ var _ChannelAuctioneer_serviceDesc = grpc.ServiceDesc{ MethodName: "NodeRating", Handler: _ChannelAuctioneer_NodeRating_Handler, }, + { + MethodName: "BatchSnapshots", + Handler: _ChannelAuctioneer_BatchSnapshots_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/poolrpc/auctioneer.proto b/poolrpc/auctioneer.proto index a262ed1..4f17e7f 100644 --- a/poolrpc/auctioneer.proto +++ b/poolrpc/auctioneer.proto @@ -31,6 +31,8 @@ service ChannelAuctioneer { rpc BatchSnapshot (BatchSnapshotRequest) returns (BatchSnapshotResponse); rpc NodeRating (ServerNodeRatingRequest) returns (ServerNodeRatingResponse); + + rpc BatchSnapshots (BatchSnapshotsRequest) returns (BatchSnapshotsResponse); } message ReserveAccountRequest { @@ -1176,3 +1178,23 @@ message ServerNodeRatingResponse { // A series of node ratings for each of the queried nodes. repeated NodeRating node_ratings = 1; } + +message BatchSnapshotsRequest { + /* + The unique identifier of the first batch to return, encoded as a compressed + pubkey. This represents the newest/most current batch to fetch. If this is + empty or a zero batch ID, the most recent finalized batch is used as the + starting point to go back from. + */ + bytes start_batch_id = 1; + + /* + The number of batches to return at most, including the start batch. + */ + uint32 num_batches_back = 2; +} + +message BatchSnapshotsResponse { + // The list of batches requested. + repeated BatchSnapshotResponse batches = 1; +} diff --git a/poolrpc/trader.pb.go b/poolrpc/trader.pb.go index f865b49..b0b3c06 100644 --- a/poolrpc/trader.pb.go +++ b/poolrpc/trader.pb.go @@ -2968,200 +2968,203 @@ func init() { func init() { proto.RegisterFile("trader.proto", fileDescriptor_b8f61804588c75fe) } var fileDescriptor_b8f61804588c75fe = []byte{ - // 3080 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xcb, 0x73, 0x1b, 0xc7, - 0xd1, 0x27, 0xc0, 0x77, 0xe3, 0x41, 0x70, 0xc0, 0x97, 0x20, 0xd1, 0xa2, 0xf6, 0xfb, 0x6c, 0x4b, - 0xb4, 0x3f, 0xd1, 0xd6, 0x67, 0xe9, 0xfb, 0x4a, 0x71, 0xe2, 0x80, 0x24, 0x68, 0x22, 0xa6, 0x40, - 0x64, 0x48, 0x29, 0x7e, 0x54, 0x65, 0x6b, 0x80, 0x1d, 0x92, 0x6b, 0x02, 0xbb, 0xf0, 0xee, 0x80, - 0x8f, 0xb8, 0x7c, 0x49, 0x72, 0xc8, 0x2d, 0xa9, 0xb8, 0x92, 0x6b, 0xfe, 0x89, 0x54, 0xe5, 0x90, - 0xaa, 0x1c, 0x72, 0x4a, 0x55, 0x72, 0x49, 0xe5, 0x9c, 0x5b, 0xfe, 0x90, 0xd4, 0xf4, 0xcc, 0x00, - 0xb3, 0x0b, 0x50, 0x7e, 0x5c, 0x72, 0xc3, 0x76, 0xf7, 0xcc, 0x6f, 0xfa, 0x35, 0xdd, 0xd3, 0x80, - 0xbc, 0x88, 0x98, 0xc7, 0xa3, 0x87, 0xbd, 0x28, 0x14, 0x21, 0x99, 0xed, 0x85, 0x61, 0x27, 0xea, - 0xb5, 0x2b, 0x77, 0x4e, 0xc3, 0xf0, 0xb4, 0xc3, 0xb7, 0x58, 0xcf, 0xdf, 0x62, 0x41, 0x10, 0x0a, - 0x26, 0xfc, 0x30, 0x88, 0x95, 0x58, 0xa5, 0xc4, 0xfa, 0x6d, 0xf9, 0xcd, 0xcd, 0x42, 0xe7, 0x6f, - 0x19, 0x20, 0xf5, 0xc0, 0x17, 0xd5, 0x76, 0x3b, 0xec, 0x07, 0x82, 0xf2, 0xcf, 0xfa, 0x3c, 0x16, - 0xe4, 0xbf, 0xa0, 0xc0, 0x14, 0xc5, 0xbd, 0x60, 0x9d, 0x3e, 0x5f, 0xcb, 0x6c, 0x64, 0xee, 0x4f, - 0xd1, 0xbc, 0x26, 0xbe, 0x90, 0x34, 0xf2, 0x00, 0x16, 0x58, 0x2b, 0x0e, 0x3b, 0x7d, 0xc1, 0xdd, - 0x33, 0xee, 0x9f, 0x9e, 0x89, 0xb5, 0xec, 0x46, 0xe6, 0x7e, 0x61, 0x7f, 0x82, 0x16, 0x0d, 0x63, - 0x1f, 0xe9, 0x52, 0x34, 0xe2, 0x1d, 0x26, 0xfc, 0x8b, 0x81, 0xe8, 0xa4, 0x11, 0x35, 0x0c, 0x2d, - 0x7a, 0x0f, 0x72, 0xed, 0x30, 0x38, 0x71, 0x05, 0x8b, 0x4e, 0xb9, 0x58, 0x9b, 0x42, 0xb1, 0x0c, - 0x05, 0x49, 0x3c, 0x46, 0xda, 0x76, 0x09, 0x8a, 0xe6, 0x74, 0xfc, 0xaa, 0xe7, 0x47, 0xd7, 0xdb, - 0x33, 0x30, 0x75, 0xc2, 0x79, 0xec, 0x70, 0x28, 0xff, 0xb0, 0x1f, 0x0a, 0xfe, 0x6d, 0xd4, 0x49, - 0x01, 0x1b, 0x55, 0x6c, 0x60, 0x03, 0x73, 0x09, 0x4b, 0x49, 0x98, 0xb8, 0x17, 0x06, 0x31, 0x27, - 0xff, 0x07, 0xb7, 0xba, 0x7e, 0xc0, 0x23, 0xf7, 0x84, 0x73, 0x37, 0x62, 0x82, 0xbb, 0x31, 0x13, - 0x6e, 0x8f, 0x47, 0xee, 0xf9, 0xa5, 0xc6, 0x5c, 0x42, 0x81, 0x3d, 0xce, 0x29, 0x13, 0xfc, 0x88, - 0x89, 0x26, 0x8f, 0x3e, 0xb8, 0x24, 0xaf, 0xc1, 0xc2, 0x70, 0xa1, 0x08, 0x05, 0xeb, 0x20, 0xfe, - 0x14, 0x2d, 0x18, 0xf1, 0x63, 0x49, 0x74, 0x9e, 0x40, 0xf9, 0xc0, 0x8f, 0x8d, 0xb7, 0x62, 0xa3, - 0xdf, 0x5d, 0xc8, 0xb1, 0x36, 0x1a, 0x37, 0x0c, 0x3a, 0xd7, 0x88, 0x34, 0x47, 0x41, 0x91, 0x0e, - 0x83, 0xce, 0xb5, 0xb3, 0x0b, 0x4b, 0xc9, 0x75, 0xfa, 0xc0, 0x6f, 0xc2, 0x9c, 0xb6, 0x41, 0xbc, - 0x96, 0xd9, 0x98, 0xbc, 0x9f, 0x7b, 0x54, 0x7a, 0xa8, 0x43, 0xe9, 0xa1, 0x51, 0x6e, 0x20, 0xe1, - 0xbc, 0x07, 0x33, 0x87, 0x7d, 0xd1, 0xeb, 0x0b, 0x72, 0x1b, 0xe6, 0xd1, 0x90, 0x52, 0x3f, 0xad, - 0xd8, 0x1c, 0x12, 0x8e, 0x98, 0x20, 0x6b, 0x30, 0xcb, 0x3c, 0x2f, 0xe2, 0x71, 0x8c, 0x4a, 0xcc, - 0x53, 0xf3, 0xe9, 0xfc, 0x3c, 0x03, 0x05, 0xb5, 0xc3, 0x8f, 0x7c, 0x71, 0xb6, 0xc7, 0xb9, 0x2d, - 0x9b, 0x49, 0xc8, 0x7e, 0x0d, 0x77, 0x90, 0x87, 0x50, 0x1e, 0x67, 0x68, 0x19, 0x59, 0x53, 0xfb, - 0x13, 0x74, 0xe1, 0x24, 0x69, 0xe5, 0x81, 0xfb, 0x76, 0x60, 0x45, 0x9d, 0x22, 0x96, 0xc7, 0xa8, - 0x77, 0x7b, 0x1d, 0xbf, 0xed, 0x0b, 0x79, 0x9c, 0x07, 0x30, 0x1b, 0x2a, 0x8e, 0x36, 0xc7, 0xc2, - 0xc0, 0x1c, 0x6a, 0x05, 0x35, 0x7c, 0xe7, 0x2f, 0x19, 0x28, 0xef, 0x74, 0xc2, 0x38, 0x1d, 0x6b, - 0xeb, 0x00, 0x2a, 0x35, 0xdd, 0x73, 0xae, 0x5c, 0x91, 0xa7, 0xf3, 0x8a, 0xf2, 0x01, 0xbf, 0x26, - 0xdf, 0x87, 0x05, 0xb5, 0x83, 0x7b, 0xe9, 0x8b, 0x33, 0xe9, 0x6f, 0x54, 0x2d, 0xf7, 0x68, 0x25, - 0x85, 0xa4, 0x2d, 0xb4, 0x3f, 0x41, 0x0b, 0x61, 0xc2, 0x64, 0xdf, 0x19, 0x9e, 0x71, 0x12, 0x57, - 0xde, 0x4d, 0xad, 0x4c, 0x6b, 0xb5, 0x3f, 0x31, 0x38, 0xf5, 0x76, 0x19, 0x16, 0x4f, 0xfa, 0x81, - 0x17, 0xbb, 0x1e, 0x8f, 0x85, 0x1f, 0xe0, 0xed, 0xe0, 0x3c, 0x86, 0xa5, 0xa4, 0x26, 0x3a, 0x3a, - 0xd6, 0x01, 0xda, 0x92, 0xee, 0x8a, 0x2b, 0xdf, 0x33, 0xaa, 0x20, 0xe5, 0xf8, 0xca, 0xf7, 0x9c, - 0x5f, 0x65, 0x60, 0x45, 0x42, 0x79, 0x11, 0xbb, 0xfc, 0x66, 0x46, 0xb0, 0xcc, 0x9c, 0x7d, 0xb9, - 0x99, 0xc9, 0x9b, 0x2f, 0xf1, 0xf1, 0x88, 0x87, 0x9d, 0x4f, 0x61, 0x75, 0xe4, 0x44, 0x5a, 0x99, - 0x4d, 0x98, 0xd5, 0x81, 0x8c, 0xe7, 0x19, 0x17, 0xe9, 0x46, 0x40, 0xde, 0x17, 0x97, 0x7a, 0x1b, - 0xa5, 0x7b, 0x16, 0x35, 0xc8, 0x1b, 0x22, 0xaa, 0xff, 0xb3, 0x0c, 0x2c, 0xef, 0xf2, 0x5e, 0x18, - 0x8f, 0xdc, 0x9e, 0x5f, 0xa1, 0xfd, 0x3a, 0x00, 0xeb, 0xe2, 0x65, 0x24, 0xb3, 0x47, 0xe5, 0xf9, - 0xbc, 0xa2, 0xc8, 0xf4, 0xf9, 0x66, 0x1a, 0x9f, 0xc2, 0x4a, 0xfa, 0x10, 0xdf, 0x42, 0xe1, 0x7b, - 0x90, 0xf7, 0xd4, 0x2e, 0xb6, 0xbe, 0x39, 0x4d, 0x43, 0x75, 0x3d, 0x58, 0xde, 0xee, 0x77, 0x7b, - 0x7a, 0xa9, 0xbc, 0xc0, 0xbe, 0x9e, 0xb6, 0x37, 0xa8, 0x93, 0x1d, 0xaf, 0xce, 0x1a, 0xac, 0xa4, - 0x51, 0x94, 0x3a, 0xce, 0x6f, 0xb2, 0x30, 0xab, 0xc9, 0x5f, 0x05, 0xf9, 0x3f, 0x30, 0x27, 0xc3, - 0x27, 0xf4, 0x03, 0xa1, 0x93, 0x6b, 0xd1, 0x8e, 0xaf, 0xa6, 0x64, 0xd0, 0x81, 0x08, 0x59, 0x82, - 0x69, 0x55, 0x15, 0x94, 0x89, 0xd5, 0x07, 0x79, 0x03, 0x16, 0xd9, 0x05, 0xf3, 0x3b, 0xac, 0xd5, - 0xe1, 0x6e, 0x8b, 0x75, 0x58, 0xd0, 0xe6, 0x58, 0x8d, 0xa6, 0x68, 0x69, 0xc0, 0xd8, 0x56, 0x74, - 0x29, 0x8c, 0x95, 0x08, 0xf3, 0xc9, 0x54, 0xb8, 0x69, 0x79, 0x65, 0xd1, 0xd2, 0x90, 0xa1, 0x2b, - 0xdc, 0x1b, 0x30, 0x1d, 0x0b, 0x26, 0xf8, 0xda, 0xcc, 0x46, 0xe6, 0x7e, 0xf1, 0xd1, 0x72, 0xda, - 0x2d, 0x47, 0x92, 0x49, 0x95, 0x8c, 0xbc, 0xda, 0x3b, 0x4c, 0xf0, 0x58, 0x3b, 0x66, 0x16, 0x75, - 0x05, 0x45, 0x42, 0xbf, 0xb4, 0x81, 0x1c, 0xf5, 0x5b, 0x5d, 0x5f, 0x1c, 0x46, 0x1e, 0x8f, 0x8c, - 0x53, 0x36, 0x60, 0x92, 0xc5, 0xe7, 0xda, 0xf1, 0xf9, 0x21, 0x42, 0x7c, 0xbe, 0x3f, 0x41, 0x25, - 0x4b, 0x4a, 0xb4, 0xb4, 0xa7, 0x6d, 0x89, 0x6d, 0xdf, 0x93, 0x12, 0x2d, 0xdf, 0xdb, 0x9e, 0x87, - 0x59, 0x8f, 0x0b, 0xe6, 0x77, 0x62, 0xe7, 0xd7, 0x19, 0x28, 0x27, 0x50, 0x74, 0x8c, 0xbd, 0x0b, - 0x05, 0x3f, 0xb8, 0x60, 0x1d, 0xdf, 0x73, 0x43, 0xc9, 0xd0, 0x80, 0x43, 0x95, 0xea, 0x8a, 0x8b, - 0xab, 0xf6, 0x27, 0x68, 0xde, 0xb7, 0xbe, 0xc9, 0x23, 0x58, 0x62, 0xed, 0x36, 0xef, 0x09, 0xae, - 0x97, 0xbb, 0x41, 0x28, 0xad, 0x8c, 0xd1, 0xb7, 0x3f, 0x41, 0x89, 0xe1, 0xa2, 0x78, 0x43, 0xf2, - 0xec, 0x43, 0x35, 0x60, 0x51, 0x16, 0x35, 0x64, 0x0e, 0x4a, 0xe1, 0x1a, 0xcc, 0x5e, 0xf0, 0xa8, - 0x15, 0xc6, 0x5c, 0x97, 0x41, 0xf3, 0x99, 0x2e, 0x92, 0xd9, 0x91, 0x22, 0xf9, 0x21, 0x10, 0x7b, - 0x3f, 0xad, 0xe2, 0x06, 0x4c, 0xb1, 0xf8, 0xdc, 0xd4, 0x83, 0x84, 0x29, 0x29, 0x72, 0xa4, 0x44, - 0xcb, 0xf7, 0xcc, 0x55, 0x96, 0x30, 0x25, 0x45, 0x8e, 0xf3, 0x18, 0xc8, 0x8e, 0x8c, 0x93, 0x4e, - 0xc2, 0x47, 0x77, 0x21, 0x67, 0x6b, 0xad, 0xc2, 0x18, 0xc2, 0x81, 0xae, 0xce, 0x32, 0x94, 0x13, - 0xcb, 0x74, 0x26, 0xfc, 0x73, 0x12, 0xa6, 0x95, 0x01, 0xbf, 0xfa, 0xa2, 0xc1, 0xb4, 0x3b, 0xf1, - 0xaf, 0xb8, 0xf2, 0x74, 0x81, 0xce, 0x4b, 0xca, 0x9e, 0x24, 0x90, 0x12, 0x4c, 0xb2, 0xae, 0xd0, - 0x51, 0x2f, 0x7f, 0x92, 0xef, 0xc1, 0x7a, 0x97, 0x5d, 0xb9, 0x2d, 0x26, 0xda, 0x67, 0x63, 0x7b, - 0x18, 0x15, 0xff, 0xab, 0x5d, 0x76, 0xb5, 0x2d, 0x65, 0xd2, 0x6d, 0x4c, 0x4a, 0xa3, 0xe9, 0xb4, - 0x46, 0xe4, 0x41, 0x32, 0xf4, 0xcb, 0xc3, 0xb4, 0x94, 0x32, 0x89, 0xc0, 0x5f, 0x82, 0xe9, 0x7e, - 0xe0, 0x8b, 0x18, 0x43, 0xbe, 0x40, 0xd5, 0x87, 0x4c, 0x34, 0xfc, 0xe1, 0xf6, 0x83, 0x93, 0x7e, - 0xe7, 0xc4, 0xef, 0x74, 0xb8, 0xb7, 0x36, 0xa7, 0x12, 0x0d, 0x19, 0xcf, 0x87, 0x74, 0xf2, 0x26, - 0x90, 0x88, 0xc7, 0x3c, 0xba, 0xe0, 0x9e, 0x3b, 0x6c, 0x57, 0xe6, 0x55, 0x0e, 0x1b, 0xce, 0x0b, - 0xd3, 0xb6, 0x3c, 0x82, 0xe5, 0x76, 0xc4, 0x55, 0x06, 0x0b, 0xbf, 0xcb, 0x63, 0xc1, 0xba, 0x3d, - 0x37, 0x88, 0xd7, 0x00, 0x17, 0x94, 0x0d, 0xf3, 0xd8, 0xf0, 0x1a, 0xf2, 0x38, 0x33, 0xfc, 0x82, - 0xcb, 0xee, 0x29, 0x87, 0xce, 0x4f, 0x29, 0x54, 0x93, 0x3c, 0xaa, 0x45, 0x74, 0x93, 0xe7, 0xaa, - 0xf3, 0x77, 0xa5, 0xfd, 0xd6, 0xf2, 0x78, 0x72, 0xd9, 0xe4, 0x3d, 0x97, 0xd4, 0x67, 0x92, 0xe8, - 0xfc, 0x3e, 0x03, 0x93, 0xdb, 0xbe, 0x47, 0xee, 0x0f, 0x42, 0x5d, 0xa7, 0x55, 0x31, 0xb9, 0x3b, - 0x35, 0x6c, 0x79, 0xf4, 0x0e, 0x67, 0x31, 0x77, 0xbd, 0xbe, 0xbe, 0x82, 0x5a, 0x9d, 0xb0, 0x7d, - 0x1e, 0x6b, 0x9f, 0x97, 0x91, 0xb9, 0xab, 0x79, 0xdb, 0xc8, 0xd2, 0x89, 0x12, 0xfb, 0x61, 0xa0, - 0x5a, 0x71, 0x6a, 0x3e, 0xc9, 0x63, 0x90, 0x07, 0x72, 0x83, 0xd0, 0xe3, 0xae, 0xf0, 0x79, 0x84, - 0x5e, 0x2f, 0x5a, 0x77, 0x68, 0x23, 0xf4, 0xf8, 0xb1, 0xcf, 0x23, 0x9a, 0xeb, 0xfa, 0x81, 0xf9, - 0x70, 0xbe, 0x80, 0xc9, 0x6a, 0x7c, 0xfe, 0x9f, 0x3a, 0xb5, 0xf3, 0xe7, 0x0c, 0xc0, 0xd0, 0xe8, - 0xb2, 0xa2, 0x25, 0x9c, 0x28, 0xcf, 0x32, 0x49, 0x73, 0xc2, 0x72, 0xde, 0x6d, 0x98, 0x47, 0xcf, - 0xb8, 0xb1, 0x88, 0x74, 0xa7, 0x3a, 0x87, 0x84, 0x23, 0x11, 0x91, 0xa7, 0x90, 0xc7, 0x38, 0x74, - 0xdb, 0x67, 0x2c, 0x38, 0xe5, 0xba, 0xd5, 0x1a, 0x5e, 0x6c, 0xcf, 0x7b, 0x1e, 0x13, 0xdc, 0x43, - 0xb0, 0xfd, 0x09, 0x9a, 0x43, 0xe1, 0x1d, 0x94, 0x25, 0x5b, 0x30, 0x8b, 0xee, 0xe5, 0x1e, 0x9a, - 0xce, 0x0e, 0x0b, 0xf4, 0xb0, 0x59, 0x64, 0xa4, 0xb6, 0x67, 0x61, 0x1a, 0x81, 0x9d, 0xdf, 0x65, - 0x20, 0x6f, 0xef, 0x4c, 0x9e, 0x42, 0xb1, 0x17, 0xf1, 0x0b, 0x3f, 0xec, 0xc7, 0xae, 0xca, 0x9c, - 0xcc, 0xcd, 0x99, 0x53, 0x30, 0xa2, 0xf8, 0x49, 0xde, 0x82, 0xf9, 0x80, 0x5f, 0xea, 0x65, 0xd9, - 0x9b, 0x97, 0xcd, 0x05, 0xfc, 0x52, 0xad, 0xb8, 0x07, 0x79, 0x15, 0x9d, 0x3a, 0xb1, 0x94, 0x89, - 0x73, 0x48, 0xdb, 0x43, 0x92, 0xf3, 0xd7, 0x0c, 0xc0, 0x50, 0x09, 0xf2, 0x0e, 0xe4, 0x50, 0x89, - 0x1b, 0x0e, 0x87, 0x92, 0x0a, 0x05, 0xba, 0x83, 0xdf, 0x23, 0x38, 0xd9, 0x11, 0x1c, 0xd9, 0x82, - 0x69, 0xeb, 0xe8, 0xca, 0x32, 0xa9, 0x5a, 0x30, 0x4d, 0x54, 0xf7, 0xdf, 0x7b, 0x50, 0x88, 0xf8, - 0xa7, 0xbc, 0x2d, 0xdc, 0x88, 0xb3, 0x38, 0x0c, 0x74, 0xa4, 0x56, 0x92, 0xf8, 0x14, 0x45, 0x28, - 0x4a, 0xd0, 0x7c, 0x64, 0x7d, 0xc9, 0x76, 0x83, 0xf2, 0x76, 0x78, 0xc1, 0xa3, 0xd4, 0x93, 0xca, - 0x39, 0x84, 0xd5, 0x11, 0x8e, 0xae, 0x08, 0xef, 0xc0, 0x4a, 0xd0, 0xef, 0xba, 0x91, 0x62, 0x73, - 0xcf, 0xb5, 0x9e, 0x50, 0x52, 0x8f, 0xa5, 0xa0, 0xdf, 0xa5, 0x86, 0x69, 0x56, 0x3b, 0x65, 0x58, - 0xac, 0xaa, 0xd7, 0xf7, 0xb0, 0x77, 0x72, 0x9a, 0x40, 0x6c, 0xa2, 0x06, 0x78, 0x0a, 0x05, 0x7e, - 0xc5, 0xdb, 0x7d, 0xcc, 0x09, 0xf9, 0x42, 0x48, 0x57, 0xd5, 0x9a, 0xe1, 0xca, 0x55, 0x79, 0x6e, - 0x7d, 0x39, 0x7f, 0x9f, 0x82, 0xe9, 0x03, 0x99, 0x38, 0xe4, 0x09, 0x14, 0x64, 0xec, 0x06, 0xbc, - 0xe3, 0xaa, 0x56, 0x28, 0x73, 0x53, 0x2b, 0x94, 0xd7, 0x72, 0xf8, 0x25, 0xaf, 0x29, 0xb3, 0x8e, - 0x75, 0xed, 0x1e, 0xd5, 0x6c, 0x57, 0xed, 0x62, 0x9f, 0xfa, 0x04, 0x56, 0x8d, 0x5c, 0x3a, 0x81, - 0x55, 0xdc, 0x2c, 0x6b, 0x76, 0x2a, 0x85, 0xdf, 0x82, 0x25, 0xb3, 0x4e, 0xa5, 0xbf, 0x7a, 0xc3, - 0xab, 0x97, 0x3e, 0x25, 0x9a, 0x87, 0x3a, 0xd4, 0x90, 0x23, 0xcb, 0x4a, 0x2f, 0xe2, 0x5d, 0xbf, - 0xdf, 0xc5, 0xd3, 0x4c, 0xe3, 0x69, 0x40, 0x93, 0xe4, 0x51, 0x36, 0x65, 0xfb, 0x65, 0x19, 0x0c, - 0xc5, 0x66, 0x54, 0x87, 0x69, 0x5b, 0x47, 0xca, 0x3a, 0x68, 0x16, 0x7f, 0x28, 0x37, 0x8b, 0x72, - 0x39, 0x24, 0x6a, 0x99, 0x87, 0x50, 0x6e, 0x77, 0x38, 0x8b, 0xfc, 0xe0, 0x54, 0x95, 0xc0, 0x5e, - 0xe4, 0xb7, 0x39, 0xd6, 0x99, 0x29, 0xba, 0x68, 0x58, 0xb2, 0xf4, 0x35, 0x25, 0x83, 0xdc, 0x87, - 0x92, 0xaa, 0x7b, 0x58, 0x69, 0x71, 0x89, 0x2e, 0x33, 0x45, 0xa4, 0x63, 0xbd, 0xa5, 0xba, 0x9d, - 0xb3, 0x2b, 0x24, 0x8c, 0x54, 0xc8, 0x3b, 0x30, 0xdf, 0xeb, 0x47, 0xed, 0x33, 0x16, 0x73, 0x6f, - 0x2d, 0x87, 0x3d, 0xca, 0x90, 0x40, 0x1e, 0x0f, 0x6d, 0x1e, 0xf1, 0x6e, 0x28, 0xb8, 0xba, 0xa5, - 0x65, 0xf5, 0xcf, 0xe3, 0x56, 0xc6, 0xb4, 0x14, 0xb9, 0xf2, 0x6e, 0x96, 0x8d, 0xc0, 0x77, 0x61, - 0xd1, 0x2c, 0x1b, 0xde, 0xea, 0x85, 0x9b, 0x6e, 0x75, 0xe3, 0xfe, 0xc1, 0xcd, 0xbe, 0x0f, 0x05, - 0x74, 0xc7, 0xa0, 0xc9, 0xba, 0x0d, 0xf3, 0xaa, 0x47, 0x90, 0x6d, 0x8f, 0x6c, 0x8c, 0xf2, 0x74, - 0x0e, 0x09, 0x75, 0x2f, 0x26, 0x15, 0x6b, 0xa6, 0x90, 0x55, 0xbc, 0xc1, 0x04, 0xe1, 0xb7, 0x19, - 0x28, 0x9a, 0xad, 0x74, 0xb0, 0xbf, 0x06, 0x33, 0x18, 0x06, 0xa6, 0xc3, 0x1a, 0x96, 0x0b, 0x14, - 0xa4, 0x9a, 0x4b, 0xb6, 0x60, 0x09, 0x07, 0x23, 0x18, 0x94, 0x9c, 0x45, 0x01, 0xf7, 0xac, 0xd8, - 0x5c, 0x44, 0x5e, 0xb5, 0x2b, 0x6a, 0xc8, 0x91, 0x4e, 0x7c, 0x03, 0xc8, 0x70, 0x41, 0x8f, 0xf9, - 0x4a, 0x5c, 0x3f, 0xa3, 0x8c, 0x78, 0x93, 0xf9, 0x52, 0xd8, 0x59, 0x80, 0xc2, 0x71, 0x78, 0xce, - 0x83, 0x41, 0xfe, 0xbf, 0x0b, 0x45, 0x43, 0x18, 0xbc, 0xa7, 0x66, 0x04, 0x52, 0xf4, 0x41, 0xc9, - 0xf0, 0xa0, 0x31, 0x13, 0x28, 0x4c, 0xb5, 0x84, 0xf3, 0xc7, 0x2c, 0xcc, 0x0f, 0xa8, 0xf2, 0x2e, - 0x6b, 0xc9, 0x40, 0xef, 0xb2, 0x36, 0x8b, 0xc2, 0x30, 0xd0, 0x9d, 0x5a, 0x5e, 0x12, 0x9f, 0x69, - 0x9a, 0xbc, 0x13, 0x7b, 0xec, 0xba, 0x2b, 0xeb, 0xd1, 0x19, 0x8b, 0xcf, 0xcc, 0x13, 0x4c, 0xd3, - 0xf6, 0x59, 0x7c, 0x46, 0x1e, 0x40, 0xc9, 0x88, 0xf4, 0x22, 0xee, 0x77, 0x99, 0xae, 0x4b, 0x79, - 0xba, 0xa0, 0xe9, 0x4d, 0x4d, 0x96, 0x11, 0xa9, 0xdf, 0x98, 0xa8, 0x79, 0x57, 0xaa, 0x3e, 0x85, - 0x25, 0xb0, 0xa8, 0xe8, 0x52, 0xf1, 0x67, 0x31, 0x13, 0xe4, 0x6d, 0x58, 0x8e, 0xc2, 0xbe, 0x90, - 0xa1, 0x2e, 0x33, 0x62, 0x28, 0x3e, 0x8d, 0xe2, 0x44, 0x33, 0xf7, 0x38, 0x1f, 0x2c, 0xd1, 0xb5, - 0xd5, 0xc5, 0x8e, 0x88, 0x7b, 0x98, 0x69, 0xba, 0xb6, 0xee, 0x28, 0x92, 0xac, 0xd3, 0x98, 0xd6, - 0x5c, 0x3d, 0x59, 0xe6, 0xa8, 0xf9, 0x94, 0x8b, 0x63, 0x11, 0x46, 0xec, 0x94, 0xbb, 0x01, 0xeb, - 0xaa, 0xa4, 0x9a, 0x97, 0xf5, 0x13, 0x69, 0x0d, 0xd6, 0xe5, 0xce, 0x0a, 0x2c, 0x1d, 0xd8, 0xb5, - 0xdf, 0xf8, 0xe4, 0x0f, 0x19, 0x58, 0x4e, 0x31, 0xb4, 0x6f, 0x3e, 0x81, 0x85, 0x64, 0x2b, 0x61, - 0x9c, 0xf4, 0x28, 0x19, 0x4d, 0xe9, 0x85, 0x49, 0x6a, 0x5c, 0x0b, 0x44, 0x74, 0x4d, 0x8b, 0x89, - 0xc6, 0x23, 0xae, 0x54, 0xa1, 0x3c, 0x46, 0x4c, 0xb6, 0xcf, 0xa6, 0xeb, 0x2e, 0x50, 0xf9, 0x73, - 0xf8, 0x90, 0x54, 0x6f, 0x0b, 0xf5, 0xf1, 0x34, 0xfb, 0xff, 0x19, 0xa9, 0x51, 0x83, 0x5f, 0x09, - 0x6c, 0x9a, 0xeb, 0xc1, 0x49, 0x68, 0x34, 0xfa, 0x65, 0x06, 0x96, 0x53, 0x0c, 0xad, 0xd1, 0xdd, - 0xe4, 0xf8, 0x4b, 0xbd, 0x25, 0xed, 0xe1, 0xd7, 0x0d, 0xef, 0xea, 0x99, 0xb1, 0xef, 0x6a, 0xf2, - 0x3a, 0x2c, 0xe0, 0xb5, 0x35, 0xec, 0x6c, 0xf5, 0xbd, 0x57, 0x44, 0xf2, 0xa0, 0xa7, 0x75, 0x9e, - 0xc0, 0xa2, 0xcc, 0x7b, 0xca, 0xa4, 0xd3, 0x4d, 0xbe, 0xdf, 0x83, 0x3c, 0xde, 0x1b, 0xbd, 0x7e, - 0xeb, 0x9c, 0x5f, 0x9b, 0x94, 0xcf, 0x49, 0x5a, 0x53, 0x91, 0x9c, 0x03, 0x20, 0xf6, 0x3a, 0xad, - 0xc5, 0x13, 0xbd, 0x30, 0x42, 0xb2, 0x71, 0x4a, 0x39, 0x71, 0xe7, 0xe8, 0x25, 0xb8, 0x9b, 0xfa, - 0x1d, 0x6f, 0x7e, 0x99, 0x81, 0xbc, 0xfd, 0x1a, 0x26, 0x25, 0xc8, 0x37, 0x6b, 0x8d, 0xdd, 0x7a, - 0xe3, 0x7d, 0xf7, 0xb0, 0x59, 0x6b, 0x94, 0x26, 0x08, 0x81, 0xa2, 0xa1, 0x3c, 0x6f, 0xee, 0x56, - 0x8f, 0x6b, 0xa5, 0x0c, 0x99, 0x83, 0x29, 0xe4, 0x66, 0x49, 0x0e, 0x66, 0x6b, 0x1f, 0x36, 0xeb, - 0xb4, 0xb6, 0x5b, 0x9a, 0xb4, 0x45, 0x77, 0x0e, 0x0e, 0x8f, 0x6a, 0xbb, 0xa5, 0x29, 0x02, 0x30, - 0xa3, 0x7f, 0x4f, 0x93, 0x32, 0x2c, 0xd0, 0xda, 0xce, 0xe1, 0x8b, 0x1a, 0xfd, 0xc8, 0xdd, 0xab, - 0xd6, 0x0f, 0x6a, 0xbb, 0xa5, 0x19, 0xb2, 0x08, 0x05, 0xb3, 0x68, 0xbb, 0x7a, 0xbc, 0xb3, 0x5f, - 0x9a, 0xdd, 0x6c, 0xea, 0xd6, 0x47, 0x1d, 0x29, 0x07, 0xb3, 0x4d, 0x5a, 0x6b, 0x56, 0x69, 0xad, - 0x34, 0x41, 0xf2, 0x30, 0x57, 0xdd, 0xd9, 0xa9, 0x35, 0x8f, 0x6b, 0xbb, 0xa5, 0x8c, 0xfc, 0xa2, - 0xb5, 0x1f, 0xd4, 0x76, 0xe4, 0x57, 0x56, 0x42, 0x1d, 0xd5, 0xdf, 0x6f, 0xe0, 0x51, 0x0a, 0x30, - 0xbf, 0x57, 0x6f, 0x54, 0x0f, 0xea, 0x1f, 0xcb, 0x53, 0x6c, 0xfe, 0x29, 0x03, 0x8b, 0x23, 0x3d, - 0x8a, 0x54, 0xa3, 0x71, 0xd8, 0x90, 0xdb, 0xae, 0x00, 0x39, 0xaa, 0xd1, 0x17, 0x35, 0xea, 0x3e, - 0xab, 0x1f, 0x6d, 0xd7, 0xf6, 0xab, 0x2f, 0xea, 0x87, 0xb4, 0x94, 0x21, 0x15, 0x58, 0xc1, 0x43, - 0xb9, 0x2f, 0x6a, 0xf4, 0xa8, 0x7e, 0xd8, 0x90, 0xec, 0x67, 0x78, 0xca, 0x2c, 0x59, 0x87, 0x5b, - 0xcd, 0x2a, 0x3d, 0xae, 0x57, 0x0f, 0x5c, 0x75, 0x08, 0x77, 0xe7, 0xf0, 0xe0, 0xa0, 0x7a, 0x5c, - 0xa3, 0xd5, 0x83, 0xd2, 0x24, 0xb9, 0x07, 0xeb, 0x29, 0xf6, 0xee, 0xf3, 0xe6, 0x41, 0x7d, 0xa7, - 0x7a, 0x5c, 0x73, 0x9b, 0xb5, 0x1a, 0x2d, 0x4d, 0x91, 0x07, 0xf0, 0x6a, 0x7a, 0x87, 0xfd, 0x6a, - 0xa3, 0x51, 0x3b, 0x70, 0xf7, 0x9e, 0x2b, 0x8b, 0x68, 0x2b, 0x4d, 0x3f, 0xfa, 0xc5, 0x02, 0xcc, - 0x1c, 0xe3, 0x83, 0x93, 0x84, 0x90, 0xb7, 0x87, 0xe2, 0xe4, 0xce, 0xc0, 0xcb, 0x63, 0x46, 0xf2, - 0x95, 0xf5, 0x1b, 0xb8, 0xfa, 0x8d, 0xeb, 0xfc, 0xf4, 0x1f, 0xff, 0xfa, 0x32, 0x7b, 0xc7, 0x59, - 0xdd, 0xba, 0x78, 0x7b, 0x4b, 0x4a, 0x6e, 0x99, 0x1a, 0xb2, 0xf5, 0x99, 0x94, 0x7f, 0x9a, 0xd9, - 0x24, 0x1f, 0x43, 0xce, 0xfa, 0xeb, 0x82, 0xdc, 0xb6, 0x86, 0x0e, 0xe9, 0x91, 0x5c, 0x65, 0x64, - 0xf6, 0xe5, 0xdc, 0x41, 0x84, 0x15, 0x67, 0x71, 0x04, 0x41, 0xee, 0x7d, 0x02, 0x79, 0x7b, 0x60, - 0x6e, 0x29, 0x33, 0x66, 0xfe, 0x6e, 0x29, 0x33, 0x6e, 0xca, 0xee, 0xdc, 0x42, 0xa8, 0x32, 0x19, - 0x85, 0x92, 0x38, 0xf6, 0xe8, 0xd5, 0xc2, 0x19, 0x33, 0x5b, 0xb6, 0x70, 0xc6, 0xcd, 0x6b, 0x0d, - 0xce, 0xe6, 0x18, 0x9c, 0xcf, 0x61, 0x21, 0x35, 0x18, 0x25, 0xc3, 0xb1, 0xf1, 0xf8, 0x21, 0x6e, - 0x65, 0xe3, 0x66, 0x01, 0x0d, 0xf8, 0x2a, 0x02, 0xde, 0x75, 0x2a, 0xa3, 0x5e, 0x32, 0xa3, 0x52, - 0x69, 0xcc, 0x4b, 0x28, 0x26, 0x67, 0x94, 0xe4, 0x95, 0xc1, 0xd6, 0x63, 0x27, 0xa8, 0x95, 0xbb, - 0x37, 0xf2, 0x35, 0xf2, 0x7f, 0x23, 0xf2, 0x2b, 0xce, 0xad, 0x51, 0x64, 0x3d, 0xb4, 0x94, 0xc0, - 0x02, 0x8a, 0xc9, 0x69, 0xa2, 0x05, 0x3c, 0x76, 0x98, 0x69, 0x01, 0xdf, 0x30, 0x86, 0xbc, 0x87, - 0xc0, 0xb7, 0x9d, 0x95, 0x51, 0xe0, 0x56, 0xbf, 0xdb, 0x93, 0xa8, 0x3f, 0x81, 0x85, 0xd4, 0xd3, - 0xc1, 0xb2, 0xf5, 0xf8, 0xe7, 0x86, 0x65, 0xeb, 0x1b, 0x5e, 0x1d, 0x2f, 0xd3, 0x58, 0xbf, 0x44, - 0x24, 0xb6, 0x07, 0x39, 0x6b, 0x4e, 0x67, 0xe5, 0xc4, 0xe8, 0x8c, 0xb0, 0x72, 0x67, 0x3c, 0x53, - 0xe3, 0x55, 0x10, 0x6f, 0xc9, 0x59, 0x18, 0xe0, 0x61, 0x97, 0x8a, 0xd9, 0xf1, 0x63, 0x80, 0xe1, - 0xa4, 0x8c, 0x54, 0x12, 0xd1, 0x9f, 0x18, 0xc7, 0x55, 0x6e, 0x8f, 0xe5, 0x69, 0x88, 0x55, 0x84, - 0x58, 0x24, 0x69, 0x08, 0x12, 0x42, 0xce, 0x1a, 0x7c, 0x59, 0x5a, 0x8c, 0x4e, 0xd1, 0x2c, 0x2d, - 0xc6, 0xcd, 0xca, 0x74, 0x84, 0x6e, 0xae, 0xa7, 0x20, 0xb6, 0x3e, 0xb7, 0xda, 0xf0, 0x2f, 0xc8, - 0x27, 0x00, 0xc3, 0x77, 0x98, 0xa5, 0xd0, 0xc8, 0x8b, 0xcd, 0x52, 0x68, 0xf4, 0xe1, 0xe6, 0x2c, - 0x21, 0x5a, 0x91, 0xe4, 0x07, 0x68, 0x27, 0x9c, 0x93, 0xcf, 0x74, 0xcf, 0x3b, 0xe8, 0x1f, 0xc8, - 0xfa, 0x4d, 0x5d, 0x89, 0xc2, 0x78, 0xe5, 0xe5, 0x4d, 0x8b, 0xb3, 0x81, 0x30, 0x15, 0xb2, 0x36, - 0x80, 0x49, 0x35, 0x3f, 0xe4, 0x1c, 0x0a, 0x89, 0xb6, 0xc2, 0x42, 0x1c, 0xd7, 0x87, 0x58, 0x88, - 0x63, 0xbb, 0x11, 0xe7, 0x36, 0x22, 0x2e, 0x93, 0xf2, 0x00, 0x11, 0xdb, 0xfd, 0xad, 0x80, 0x5f, - 0x09, 0x12, 0x42, 0x01, 0x57, 0x1c, 0x05, 0xac, 0x17, 0x9f, 0x85, 0xc2, 0x02, 0x4b, 0xd0, 0x47, - 0xc1, 0x52, 0x6c, 0x0d, 0x76, 0x17, 0xc1, 0x6e, 0x91, 0xd5, 0x14, 0x58, 0x6c, 0xf6, 0xff, 0x08, - 0x0a, 0xef, 0x73, 0x31, 0xe8, 0xaf, 0x63, 0x32, 0xfc, 0xef, 0x2c, 0xd1, 0xc4, 0x57, 0x56, 0x47, - 0xe8, 0xe3, 0x22, 0xaf, 0x13, 0x33, 0xb1, 0xa5, 0x1a, 0x77, 0x42, 0x61, 0x46, 0xbd, 0x4f, 0xac, - 0x3d, 0x13, 0x6f, 0x1f, 0x6b, 0xcf, 0xe4, 0x43, 0x66, 0x4c, 0x34, 0xeb, 0x97, 0x0b, 0x87, 0xdc, - 0xb0, 0xcf, 0xb1, 0xd3, 0x65, 0xa4, 0xd1, 0xb2, 0xa2, 0x6b, 0xb4, 0x99, 0x72, 0xd6, 0x11, 0x60, - 0x95, 0x2c, 0x0f, 0x00, 0xec, 0xde, 0x6a, 0xfb, 0xf5, 0x8f, 0x5f, 0x3d, 0xf5, 0xc5, 0x59, 0xbf, - 0xf5, 0xb0, 0x1d, 0x76, 0xb7, 0x3a, 0xfe, 0xe9, 0x99, 0x08, 0xfc, 0xe0, 0xb4, 0xc3, 0x5a, 0xb1, - 0x92, 0xd6, 0x5b, 0xb7, 0x66, 0xf0, 0xaf, 0xff, 0xff, 0xfd, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x92, 0x49, 0xff, 0x06, 0x43, 0x20, 0x00, 0x00, + // 3132 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x73, 0x1b, 0xc7, + 0x95, 0xe7, 0xf0, 0x9b, 0x0f, 0x1f, 0x04, 0x1b, 0xfc, 0x12, 0x24, 0x5a, 0xd4, 0xec, 0xda, 0x96, + 0x68, 0xaf, 0x68, 0x6b, 0x2d, 0xed, 0x96, 0xd6, 0x6b, 0x2f, 0x48, 0x82, 0x26, 0xd6, 0x14, 0x88, + 0x34, 0x29, 0xc5, 0x1f, 0x55, 0x99, 0x6a, 0x60, 0x9a, 0xe4, 0x98, 0x98, 0x19, 0x78, 0xa6, 0x41, + 0x52, 0x51, 0xe9, 0x92, 0xe4, 0x9e, 0x54, 0x5c, 0x49, 0x8e, 0xa9, 0xca, 0xdf, 0x90, 0xaa, 0x1c, + 0x52, 0x95, 0x43, 0x4e, 0xa9, 0x4a, 0x2e, 0xa9, 0x9c, 0x73, 0xcb, 0x1f, 0x92, 0xea, 0xd7, 0xdd, + 0xc0, 0xcc, 0x00, 0x90, 0x3f, 0x2e, 0xb9, 0x61, 0xde, 0x7b, 0xdd, 0xbf, 0x7e, 0x5f, 0xfd, 0x5e, + 0x3f, 0x12, 0xf2, 0x22, 0x62, 0x2e, 0x8f, 0xee, 0x77, 0xa3, 0x50, 0x84, 0x64, 0xae, 0x1b, 0x86, + 0x9d, 0xa8, 0xdb, 0xae, 0xdc, 0x3a, 0x0b, 0xc3, 0xb3, 0x0e, 0xdf, 0x66, 0x5d, 0x6f, 0x9b, 0x05, + 0x41, 0x28, 0x98, 0xf0, 0xc2, 0x20, 0x56, 0x62, 0x95, 0x12, 0xeb, 0xb5, 0xe5, 0x37, 0x37, 0x0b, + 0xed, 0xbf, 0x58, 0x40, 0xea, 0x81, 0x27, 0xaa, 0xed, 0x76, 0xd8, 0x0b, 0x04, 0xe5, 0x5f, 0xf6, + 0x78, 0x2c, 0xc8, 0xbf, 0x41, 0x81, 0x29, 0x8a, 0x73, 0xc9, 0x3a, 0x3d, 0xbe, 0x6e, 0x6d, 0x5a, + 0x77, 0xa7, 0x69, 0x5e, 0x13, 0x9f, 0x49, 0x1a, 0xb9, 0x07, 0x8b, 0xac, 0x15, 0x87, 0x9d, 0x9e, + 0xe0, 0xce, 0x39, 0xf7, 0xce, 0xce, 0xc5, 0xfa, 0xe4, 0xa6, 0x75, 0xb7, 0x70, 0x30, 0x41, 0x8b, + 0x86, 0x71, 0x80, 0x74, 0x29, 0x1a, 0xf1, 0x0e, 0x13, 0xde, 0x65, 0x5f, 0x74, 0xca, 0x88, 0x1a, + 0x86, 0x16, 0xbd, 0x03, 0xb9, 0x76, 0x18, 0x9c, 0x3a, 0x82, 0x45, 0x67, 0x5c, 0xac, 0x4f, 0xa3, + 0x98, 0x45, 0x41, 0x12, 0x4f, 0x90, 0xb6, 0x53, 0x82, 0xa2, 0x39, 0x1d, 0xbf, 0xee, 0x7a, 0xd1, + 0xf3, 0x9d, 0x59, 0x98, 0x3e, 0xe5, 0x3c, 0xb6, 0x39, 0x94, 0xbf, 0xd7, 0x0b, 0x05, 0xff, 0x2e, + 0xea, 0x64, 0x80, 0x8d, 0x2a, 0x49, 0x60, 0x03, 0x73, 0x05, 0xcb, 0x69, 0x98, 0xb8, 0x1b, 0x06, + 0x31, 0x27, 0xff, 0x05, 0x37, 0x7c, 0x2f, 0xe0, 0x91, 0x73, 0xca, 0xb9, 0x13, 0x31, 0xc1, 0x9d, + 0x98, 0x09, 0xa7, 0xcb, 0x23, 0xe7, 0xe2, 0x4a, 0x63, 0x2e, 0xa3, 0xc0, 0x3e, 0xe7, 0x94, 0x09, + 0x7e, 0xcc, 0x44, 0x93, 0x47, 0x1f, 0x5f, 0x91, 0x37, 0x60, 0x71, 0xb0, 0x50, 0x84, 0x82, 0x75, + 0x10, 0x7f, 0x9a, 0x16, 0x8c, 0xf8, 0x89, 0x24, 0xda, 0x8f, 0xa0, 0x7c, 0xe8, 0xc5, 0xc6, 0x5b, + 0xb1, 0xd1, 0xef, 0x36, 0xe4, 0x58, 0x1b, 0x8d, 0x1b, 0x06, 0x9d, 0xe7, 0x88, 0x34, 0x4f, 0x41, + 0x91, 0x8e, 0x82, 0xce, 0x73, 0x7b, 0x0f, 0x96, 0xd3, 0xeb, 0xf4, 0x81, 0xdf, 0x86, 0x79, 0x6d, + 0x83, 0x78, 0xdd, 0xda, 0x9c, 0xba, 0x9b, 0x7b, 0x50, 0xba, 0xaf, 0x43, 0xe9, 0xbe, 0x51, 0xae, + 0x2f, 0x61, 0x7f, 0x08, 0xb3, 0x47, 0x3d, 0xd1, 0xed, 0x09, 0x72, 0x13, 0x16, 0xd0, 0x90, 0x52, + 0x3f, 0xad, 0xd8, 0x3c, 0x12, 0x8e, 0x99, 0x20, 0xeb, 0x30, 0xc7, 0x5c, 0x37, 0xe2, 0x71, 0x8c, + 0x4a, 0x2c, 0x50, 0xf3, 0x69, 0xff, 0xc4, 0x82, 0x82, 0xda, 0xe1, 0xfb, 0x9e, 0x38, 0xdf, 0xe7, + 0x3c, 0x29, 0x6b, 0xa5, 0x64, 0xbf, 0x81, 0x3b, 0xc8, 0x7d, 0x28, 0x8f, 0x32, 0xb4, 0x8c, 0xac, + 0xe9, 0x83, 0x09, 0xba, 0x78, 0x9a, 0xb6, 0x72, 0xdf, 0x7d, 0xbb, 0xb0, 0xaa, 0x4e, 0x11, 0xcb, + 0x63, 0xd4, 0xfd, 0x6e, 0xc7, 0x6b, 0x7b, 0x42, 0x1e, 0xe7, 0x1e, 0xcc, 0x85, 0x8a, 0xa3, 0xcd, + 0xb1, 0xd8, 0x37, 0x87, 0x5a, 0x41, 0x0d, 0xdf, 0xfe, 0x93, 0x05, 0xe5, 0xdd, 0x4e, 0x18, 0x67, + 0x63, 0x6d, 0x03, 0x40, 0xa5, 0xa6, 0x73, 0xc1, 0x95, 0x2b, 0xf2, 0x74, 0x41, 0x51, 0x3e, 0xe6, + 0xcf, 0xc9, 0xff, 0xc1, 0xa2, 0xda, 0xc1, 0xb9, 0xf2, 0xc4, 0xb9, 0xf4, 0x37, 0xaa, 0x96, 0x7b, + 0xb0, 0x9a, 0x41, 0xd2, 0x16, 0x3a, 0x98, 0xa0, 0x85, 0x30, 0x65, 0xb2, 0xff, 0x19, 0x9c, 0x71, + 0x0a, 0x57, 0xde, 0xce, 0xac, 0xcc, 0x6a, 0x75, 0x30, 0xd1, 0x3f, 0xf5, 0x4e, 0x19, 0x96, 0x4e, + 0x7b, 0x81, 0x1b, 0x3b, 0x2e, 0x8f, 0x85, 0x17, 0xe0, 0xed, 0x60, 0x3f, 0x84, 0xe5, 0xb4, 0x26, + 0x3a, 0x3a, 0x36, 0x00, 0xda, 0x92, 0xee, 0x88, 0x6b, 0xcf, 0x35, 0xaa, 0x20, 0xe5, 0xe4, 0xda, + 0x73, 0xed, 0x9f, 0x59, 0xb0, 0x2a, 0xa1, 0xdc, 0x88, 0x5d, 0x7d, 0x3b, 0x23, 0x24, 0xcc, 0x3c, + 0xf9, 0x6a, 0x33, 0x93, 0xb7, 0x5f, 0xe1, 0xe3, 0x21, 0x0f, 0xdb, 0x5f, 0xc0, 0xda, 0xd0, 0x89, + 0xb4, 0x32, 0x5b, 0x30, 0xa7, 0x03, 0x19, 0xcf, 0x33, 0x2a, 0xd2, 0x8d, 0x80, 0xbc, 0x2f, 0xae, + 0xf4, 0x36, 0x4a, 0xf7, 0x49, 0xd4, 0x20, 0x6f, 0x88, 0xa8, 0xfe, 0x8f, 0x2d, 0x58, 0xd9, 0xe3, + 0xdd, 0x30, 0x1e, 0xba, 0x3d, 0xbf, 0x46, 0xfb, 0x0d, 0x00, 0xe6, 0xe3, 0x65, 0x24, 0xb3, 0x47, + 0xe5, 0xf9, 0x82, 0xa2, 0xc8, 0xf4, 0xf9, 0x76, 0x1a, 0x9f, 0xc1, 0x6a, 0xf6, 0x10, 0xdf, 0x41, + 0xe1, 0x3b, 0x90, 0x77, 0xd5, 0x2e, 0x49, 0x7d, 0x73, 0x9a, 0x86, 0xea, 0xba, 0xb0, 0xb2, 0xd3, + 0xf3, 0xbb, 0x7a, 0xa9, 0xbc, 0xc0, 0xbe, 0x99, 0xb6, 0x63, 0xd4, 0x99, 0x1c, 0xad, 0xce, 0x3a, + 0xac, 0x66, 0x51, 0x94, 0x3a, 0xf6, 0x2f, 0x26, 0x61, 0x4e, 0x93, 0xbf, 0x0e, 0xf2, 0x3f, 0x60, + 0x5e, 0x86, 0x4f, 0xe8, 0x05, 0x42, 0x27, 0xd7, 0x52, 0x32, 0xbe, 0x9a, 0x92, 0x41, 0xfb, 0x22, + 0x64, 0x19, 0x66, 0x54, 0x55, 0x50, 0x26, 0x56, 0x1f, 0xe4, 0x2d, 0x58, 0x62, 0x97, 0xcc, 0xeb, + 0xb0, 0x56, 0x87, 0x3b, 0x2d, 0xd6, 0x61, 0x41, 0x9b, 0x63, 0x35, 0x9a, 0xa6, 0xa5, 0x3e, 0x63, + 0x47, 0xd1, 0xa5, 0x30, 0x56, 0x22, 0xcc, 0x27, 0x53, 0xe1, 0x66, 0xe4, 0x95, 0x45, 0x4b, 0x03, + 0x86, 0xae, 0x70, 0x6f, 0xc1, 0x4c, 0x2c, 0x98, 0xe0, 0xeb, 0xb3, 0x9b, 0xd6, 0xdd, 0xe2, 0x83, + 0x95, 0xac, 0x5b, 0x8e, 0x25, 0x93, 0x2a, 0x19, 0x79, 0xb5, 0x77, 0x98, 0xe0, 0xb1, 0x76, 0xcc, + 0x1c, 0xea, 0x0a, 0x8a, 0x84, 0x7e, 0x69, 0x03, 0x39, 0xee, 0xb5, 0x7c, 0x4f, 0x1c, 0x45, 0x2e, + 0x8f, 0x8c, 0x53, 0x36, 0x61, 0x8a, 0xc5, 0x17, 0xda, 0xf1, 0xf9, 0x01, 0x42, 0x7c, 0x71, 0x30, + 0x41, 0x25, 0x4b, 0x4a, 0xb4, 0xb4, 0xa7, 0x93, 0x12, 0x3b, 0x9e, 0x2b, 0x25, 0x5a, 0x9e, 0xbb, + 0xb3, 0x00, 0x73, 0x2e, 0x17, 0xcc, 0xeb, 0xc4, 0xf6, 0xcf, 0x2d, 0x28, 0xa7, 0x50, 0x74, 0x8c, + 0xbd, 0x0f, 0x05, 0x2f, 0xb8, 0x64, 0x1d, 0xcf, 0x75, 0x42, 0xc9, 0xd0, 0x80, 0x03, 0x95, 0xea, + 0x8a, 0x8b, 0xab, 0x0e, 0x26, 0x68, 0xde, 0x4b, 0x7c, 0x93, 0x07, 0xb0, 0xcc, 0xda, 0x6d, 0xde, + 0x15, 0x5c, 0x2f, 0x77, 0x82, 0x50, 0x5a, 0x19, 0xa3, 0xef, 0x60, 0x82, 0x12, 0xc3, 0x45, 0xf1, + 0x86, 0xe4, 0x25, 0x0f, 0xd5, 0x80, 0x25, 0x59, 0xd4, 0x90, 0xd9, 0x2f, 0x85, 0xeb, 0x30, 0x77, + 0xc9, 0xa3, 0x56, 0x18, 0x73, 0x5d, 0x06, 0xcd, 0x67, 0xb6, 0x48, 0x4e, 0x0e, 0x15, 0xc9, 0x4f, + 0x80, 0x24, 0xf7, 0xd3, 0x2a, 0x6e, 0xc2, 0x34, 0x8b, 0x2f, 0x4c, 0x3d, 0x48, 0x99, 0x92, 0x22, + 0x47, 0x4a, 0xb4, 0x3c, 0xd7, 0x5c, 0x65, 0x29, 0x53, 0x52, 0xe4, 0xd8, 0x0f, 0x81, 0xec, 0xca, + 0x38, 0xe9, 0xa4, 0x7c, 0x74, 0x1b, 0x72, 0x49, 0xad, 0x55, 0x18, 0x43, 0xd8, 0xd7, 0xd5, 0x5e, + 0x81, 0x72, 0x6a, 0x99, 0xce, 0x84, 0xbf, 0x4f, 0xc1, 0x8c, 0x32, 0xe0, 0xd7, 0x5f, 0x34, 0x98, + 0x76, 0xa7, 0xde, 0x35, 0x57, 0x9e, 0x2e, 0xd0, 0x05, 0x49, 0xd9, 0x97, 0x04, 0x52, 0x82, 0x29, + 0xe6, 0x0b, 0x1d, 0xf5, 0xf2, 0x27, 0xf9, 0x00, 0x36, 0x7c, 0x76, 0xed, 0xb4, 0x98, 0x68, 0x9f, + 0x8f, 0xec, 0x61, 0x54, 0xfc, 0xaf, 0xf9, 0xec, 0x7a, 0x47, 0xca, 0x64, 0xdb, 0x98, 0x8c, 0x46, + 0x33, 0x59, 0x8d, 0xc8, 0xbd, 0x74, 0xe8, 0x97, 0x07, 0x69, 0x29, 0x65, 0x52, 0x81, 0xbf, 0x0c, + 0x33, 0xbd, 0xc0, 0x13, 0x31, 0x86, 0x7c, 0x81, 0xaa, 0x0f, 0x99, 0x68, 0xf8, 0xc3, 0xe9, 0x05, + 0xa7, 0xbd, 0xce, 0xa9, 0xd7, 0xe9, 0x70, 0x77, 0x7d, 0x5e, 0x25, 0x1a, 0x32, 0x9e, 0x0e, 0xe8, + 0xe4, 0x6d, 0x20, 0x11, 0x8f, 0x79, 0x74, 0xc9, 0x5d, 0x67, 0xd0, 0xae, 0x2c, 0xa8, 0x1c, 0x36, + 0x9c, 0x67, 0xa6, 0x6d, 0x79, 0x00, 0x2b, 0xed, 0x88, 0xab, 0x0c, 0x16, 0x9e, 0xcf, 0x63, 0xc1, + 0xfc, 0xae, 0x13, 0xc4, 0xeb, 0x80, 0x0b, 0xca, 0x86, 0x79, 0x62, 0x78, 0x0d, 0x79, 0x9c, 0x59, + 0x7e, 0xc9, 0x65, 0xf7, 0x94, 0x43, 0xe7, 0x67, 0x14, 0xaa, 0x49, 0x1e, 0xd5, 0x22, 0xba, 0xc9, + 0x73, 0xd4, 0xf9, 0x7d, 0x69, 0xbf, 0xf5, 0x3c, 0x9e, 0x5c, 0x36, 0x79, 0x4f, 0x25, 0xf5, 0x89, + 0x24, 0xda, 0xbf, 0xb5, 0x60, 0x6a, 0xc7, 0x73, 0xc9, 0xdd, 0x7e, 0xa8, 0xeb, 0xb4, 0x2a, 0xa6, + 0x77, 0xa7, 0x86, 0x2d, 0x8f, 0xde, 0xe1, 0x2c, 0xe6, 0x8e, 0xdb, 0xd3, 0x57, 0x50, 0xab, 0x13, + 0xb6, 0x2f, 0x62, 0xed, 0xf3, 0x32, 0x32, 0xf7, 0x34, 0x6f, 0x07, 0x59, 0x3a, 0x51, 0x62, 0x2f, + 0x0c, 0x54, 0x2b, 0x4e, 0xcd, 0x27, 0x79, 0x08, 0xf2, 0x40, 0x4e, 0x10, 0xba, 0xdc, 0x11, 0x1e, + 0x8f, 0xd0, 0xeb, 0xc5, 0xc4, 0x1d, 0xda, 0x08, 0x5d, 0x7e, 0xe2, 0xf1, 0x88, 0xe6, 0x7c, 0x2f, + 0x30, 0x1f, 0xf6, 0x4b, 0x98, 0xaa, 0xc6, 0x17, 0xff, 0xaa, 0x53, 0xdb, 0x7f, 0xb4, 0x00, 0x06, + 0x46, 0x97, 0x15, 0x2d, 0xe5, 0x44, 0x79, 0x96, 0x29, 0x9a, 0x13, 0x09, 0xe7, 0xdd, 0x84, 0x05, + 0xf4, 0x8c, 0x13, 0x8b, 0x48, 0x77, 0xaa, 0xf3, 0x48, 0x38, 0x16, 0x11, 0x79, 0x0c, 0x79, 0x8c, + 0x43, 0xa7, 0x7d, 0xce, 0x82, 0x33, 0xae, 0x5b, 0xad, 0xc1, 0xc5, 0xf6, 0xb4, 0xeb, 0x32, 0xc1, + 0x5d, 0x04, 0x3b, 0x98, 0xa0, 0x39, 0x14, 0xde, 0x45, 0x59, 0xb2, 0x0d, 0x73, 0xe8, 0x5e, 0xee, + 0xa2, 0xe9, 0x92, 0x61, 0x81, 0x1e, 0x36, 0x8b, 0x8c, 0xd4, 0xce, 0x1c, 0xcc, 0x20, 0xb0, 0xfd, + 0x6b, 0x0b, 0xf2, 0xc9, 0x9d, 0xc9, 0x63, 0x28, 0x76, 0x23, 0x7e, 0xe9, 0x85, 0xbd, 0xd8, 0x51, + 0x99, 0x63, 0x8d, 0xcf, 0x9c, 0x82, 0x11, 0xc5, 0x4f, 0xf2, 0x0e, 0x2c, 0x04, 0xfc, 0x4a, 0x2f, + 0x9b, 0x1c, 0xbf, 0x6c, 0x3e, 0xe0, 0x57, 0x6a, 0xc5, 0x1d, 0xc8, 0xab, 0xe8, 0xd4, 0x89, 0xa5, + 0x4c, 0x9c, 0x43, 0xda, 0x3e, 0x92, 0xec, 0x3f, 0x5b, 0x00, 0x03, 0x25, 0xc8, 0x7b, 0x90, 0x43, + 0x25, 0xc6, 0x1c, 0x0e, 0x25, 0x15, 0x0a, 0xf8, 0xfd, 0xdf, 0x43, 0x38, 0x93, 0x43, 0x38, 0xb2, + 0x05, 0xd3, 0xd6, 0xd1, 0x95, 0x65, 0x4a, 0xb5, 0x60, 0x9a, 0xa8, 0xee, 0xbf, 0x0f, 0xa1, 0x10, + 0xf1, 0x2f, 0x78, 0x5b, 0x38, 0x11, 0x67, 0x71, 0x18, 0xe8, 0x48, 0xad, 0xa4, 0xf1, 0x29, 0x8a, + 0x50, 0x94, 0xa0, 0xf9, 0x28, 0xf1, 0x25, 0xdb, 0x0d, 0xca, 0xdb, 0xe1, 0x25, 0x8f, 0x32, 0x4f, + 0x2a, 0xfb, 0x08, 0xd6, 0x86, 0x38, 0xba, 0x22, 0xbc, 0x07, 0xab, 0x41, 0xcf, 0x77, 0x22, 0xc5, + 0xe6, 0xae, 0x93, 0x78, 0x42, 0x49, 0x3d, 0x96, 0x83, 0x9e, 0x4f, 0x0d, 0xd3, 0xac, 0xb6, 0xcb, + 0xb0, 0x54, 0x55, 0xaf, 0xef, 0x41, 0xef, 0x64, 0x37, 0x81, 0x24, 0x89, 0x1a, 0xe0, 0x31, 0x14, + 0xf8, 0x35, 0x6f, 0xf7, 0x30, 0x27, 0xe4, 0x0b, 0x21, 0x5b, 0x55, 0x6b, 0x86, 0x2b, 0x57, 0xe5, + 0x79, 0xe2, 0xcb, 0xfe, 0xeb, 0x34, 0xcc, 0x1c, 0xca, 0xc4, 0x21, 0x8f, 0xa0, 0x20, 0x63, 0x37, + 0xe0, 0x1d, 0x47, 0xb5, 0x42, 0xd6, 0xb8, 0x56, 0x28, 0xaf, 0xe5, 0xf0, 0x4b, 0x5e, 0x53, 0x66, + 0x1d, 0xf3, 0x93, 0x3d, 0xaa, 0xd9, 0xae, 0xea, 0x63, 0x9f, 0xfa, 0x08, 0xd6, 0x8c, 0x5c, 0x36, + 0x81, 0x55, 0xdc, 0xac, 0x68, 0x76, 0x26, 0x85, 0xdf, 0x81, 0x65, 0xb3, 0x4e, 0xa5, 0xbf, 0x7a, + 0xc3, 0xab, 0x97, 0x3e, 0x25, 0x9a, 0x87, 0x3a, 0xd4, 0x90, 0x23, 0xcb, 0x4a, 0x37, 0xe2, 0xbe, + 0xd7, 0xf3, 0xf1, 0x34, 0x33, 0x78, 0x1a, 0xd0, 0x24, 0x79, 0x94, 0x2d, 0xd9, 0x7e, 0x25, 0x0c, + 0x86, 0x62, 0xb3, 0xaa, 0xc3, 0x4c, 0x5a, 0x47, 0xca, 0xda, 0x68, 0x16, 0x6f, 0x20, 0x37, 0x87, + 0x72, 0x39, 0x24, 0x6a, 0x99, 0xfb, 0x50, 0x6e, 0x77, 0x38, 0x8b, 0xbc, 0xe0, 0x4c, 0x95, 0xc0, + 0x6e, 0xe4, 0xb5, 0x39, 0xd6, 0x99, 0x69, 0xba, 0x64, 0x58, 0xb2, 0xf4, 0x35, 0x25, 0x83, 0xdc, + 0x85, 0x92, 0xaa, 0x7b, 0x58, 0x69, 0x71, 0x89, 0x2e, 0x33, 0x45, 0xa4, 0x63, 0xbd, 0xa5, 0xba, + 0x9d, 0x4b, 0x56, 0x48, 0x18, 0xaa, 0x90, 0xb7, 0x60, 0xa1, 0xdb, 0x8b, 0xda, 0xe7, 0x2c, 0xe6, + 0xee, 0x7a, 0x0e, 0x7b, 0x94, 0x01, 0x81, 0x3c, 0x1c, 0xd8, 0x3c, 0xe2, 0x7e, 0x28, 0xb8, 0xba, + 0xa5, 0x65, 0xf5, 0xcf, 0xe3, 0x56, 0xc6, 0xb4, 0x14, 0xb9, 0xf2, 0x6e, 0x96, 0x8d, 0xc0, 0xff, + 0xc2, 0x92, 0x59, 0x36, 0xb8, 0xd5, 0x0b, 0xe3, 0x6e, 0x75, 0xe3, 0xfe, 0xfe, 0xcd, 0x7e, 0x00, + 0x05, 0x74, 0x47, 0xbf, 0xc9, 0xba, 0x09, 0x0b, 0xaa, 0x47, 0x90, 0x6d, 0x8f, 0x6c, 0x8c, 0xf2, + 0x74, 0x1e, 0x09, 0x75, 0x37, 0x26, 0x95, 0xc4, 0x4c, 0x61, 0x52, 0xf1, 0xfa, 0x13, 0x84, 0x5f, + 0x5a, 0x50, 0x34, 0x5b, 0xe9, 0x60, 0x7f, 0x03, 0x66, 0x31, 0x0c, 0x4c, 0x87, 0x35, 0x28, 0x17, + 0x28, 0x48, 0x35, 0x97, 0x6c, 0xc3, 0x32, 0x0e, 0x46, 0x30, 0x28, 0x39, 0x8b, 0x02, 0xee, 0x26, + 0x62, 0x73, 0x09, 0x79, 0x55, 0x5f, 0xd4, 0x90, 0x23, 0x9d, 0xf8, 0x16, 0x90, 0xc1, 0x82, 0x2e, + 0xf3, 0x94, 0xb8, 0x7e, 0x46, 0x19, 0xf1, 0x26, 0xf3, 0xa4, 0xb0, 0xbd, 0x08, 0x85, 0x93, 0xf0, + 0x82, 0x07, 0xfd, 0xfc, 0x7f, 0x1f, 0x8a, 0x86, 0xd0, 0x7f, 0x4f, 0xcd, 0x0a, 0xa4, 0xe8, 0x83, + 0x92, 0xc1, 0x41, 0x63, 0x26, 0x50, 0x98, 0x6a, 0x09, 0xfb, 0xf7, 0x93, 0xb0, 0xd0, 0xa7, 0xca, + 0xbb, 0xac, 0x25, 0x03, 0xdd, 0x67, 0x6d, 0x16, 0x85, 0x61, 0xa0, 0x3b, 0xb5, 0xbc, 0x24, 0x3e, + 0xd1, 0x34, 0x79, 0x27, 0x76, 0xd9, 0x73, 0x5f, 0xd6, 0xa3, 0x73, 0x16, 0x9f, 0x9b, 0x27, 0x98, + 0xa6, 0x1d, 0xb0, 0xf8, 0x9c, 0xdc, 0x83, 0x92, 0x11, 0xe9, 0x46, 0xdc, 0xf3, 0x99, 0xae, 0x4b, + 0x79, 0xba, 0xa8, 0xe9, 0x4d, 0x4d, 0x96, 0x11, 0xa9, 0xdf, 0x98, 0xa8, 0xb9, 0x2f, 0x55, 0x9f, + 0xc6, 0x12, 0x58, 0x54, 0x74, 0xa9, 0xf8, 0x93, 0x98, 0x09, 0xf2, 0x2e, 0xac, 0x44, 0x61, 0x4f, + 0xc8, 0x50, 0x97, 0x19, 0x31, 0x10, 0x9f, 0x41, 0x71, 0xa2, 0x99, 0xfb, 0x9c, 0xf7, 0x97, 0xe8, + 0xda, 0xea, 0x60, 0x47, 0xc4, 0x5d, 0xcc, 0x34, 0x5d, 0x5b, 0x77, 0x15, 0x49, 0xd6, 0x69, 0x4c, + 0x6b, 0xae, 0x9e, 0x2c, 0xf3, 0xd4, 0x7c, 0xca, 0xc5, 0xb1, 0x08, 0x23, 0x76, 0xc6, 0x9d, 0x80, + 0xf9, 0x2a, 0xa9, 0x16, 0x64, 0xfd, 0x44, 0x5a, 0x83, 0xf9, 0xdc, 0x5e, 0x85, 0xe5, 0xc3, 0x64, + 0xed, 0x37, 0x3e, 0xf9, 0x9d, 0x05, 0x2b, 0x19, 0x86, 0xf6, 0xcd, 0xe7, 0xb0, 0x98, 0x6e, 0x25, + 0x8c, 0x93, 0x1e, 0xa4, 0xa3, 0x29, 0xbb, 0x30, 0x4d, 0x8d, 0x6b, 0x81, 0x88, 0x9e, 0xd3, 0x62, + 0xaa, 0xf1, 0x88, 0x2b, 0x55, 0x28, 0x8f, 0x10, 0x93, 0xed, 0xb3, 0xe9, 0xba, 0x0b, 0x54, 0xfe, + 0x1c, 0x3c, 0x24, 0xd5, 0xdb, 0x42, 0x7d, 0x3c, 0x9e, 0xfc, 0x6f, 0x4b, 0x6a, 0xd4, 0xe0, 0xd7, + 0x02, 0x9b, 0xe6, 0x7a, 0x70, 0x1a, 0x1a, 0x8d, 0x7e, 0x6a, 0xc1, 0x4a, 0x86, 0xa1, 0x35, 0xba, + 0x9d, 0x1e, 0x7f, 0xa9, 0xb7, 0x64, 0x72, 0xf8, 0x35, 0xe6, 0x5d, 0x3d, 0x3b, 0xf2, 0x5d, 0x4d, + 0xde, 0x84, 0x45, 0xbc, 0xb6, 0x06, 0x9d, 0xad, 0xbe, 0xf7, 0x8a, 0x48, 0xee, 0xf7, 0xb4, 0xf6, + 0x23, 0x58, 0x92, 0x79, 0x4f, 0x99, 0x74, 0xba, 0xc9, 0xf7, 0x3b, 0x90, 0xc7, 0x7b, 0xa3, 0xdb, + 0x6b, 0x5d, 0xf0, 0xe7, 0x26, 0xe5, 0x73, 0x92, 0xd6, 0x54, 0x24, 0xfb, 0x10, 0x48, 0x72, 0x9d, + 0xd6, 0xe2, 0x91, 0x5e, 0x18, 0x21, 0xd9, 0x38, 0xa5, 0x9c, 0xba, 0x73, 0xf4, 0x12, 0xdc, 0x4d, + 0xfd, 0x8e, 0xb7, 0xbe, 0xb2, 0x20, 0x9f, 0x7c, 0x0d, 0x93, 0x12, 0xe4, 0x9b, 0xb5, 0xc6, 0x5e, + 0xbd, 0xf1, 0x91, 0x73, 0xd4, 0xac, 0x35, 0x4a, 0x13, 0x84, 0x40, 0xd1, 0x50, 0x9e, 0x36, 0xf7, + 0xaa, 0x27, 0xb5, 0x92, 0x45, 0xe6, 0x61, 0x1a, 0xb9, 0x93, 0x24, 0x07, 0x73, 0xb5, 0x4f, 0x9a, + 0x75, 0x5a, 0xdb, 0x2b, 0x4d, 0x25, 0x45, 0x77, 0x0f, 0x8f, 0x8e, 0x6b, 0x7b, 0xa5, 0x69, 0x02, + 0x30, 0xab, 0x7f, 0xcf, 0x90, 0x32, 0x2c, 0xd2, 0xda, 0xee, 0xd1, 0xb3, 0x1a, 0xfd, 0xd4, 0xd9, + 0xaf, 0xd6, 0x0f, 0x6b, 0x7b, 0xa5, 0x59, 0xb2, 0x04, 0x05, 0xb3, 0x68, 0xa7, 0x7a, 0xb2, 0x7b, + 0x50, 0x9a, 0xdb, 0x6a, 0xea, 0xd6, 0x47, 0x1d, 0x29, 0x07, 0x73, 0x4d, 0x5a, 0x6b, 0x56, 0x69, + 0xad, 0x34, 0x41, 0xf2, 0x30, 0x5f, 0xdd, 0xdd, 0xad, 0x35, 0x4f, 0x6a, 0x7b, 0x25, 0x4b, 0x7e, + 0xd1, 0xda, 0xff, 0xd7, 0x76, 0xe5, 0xd7, 0xa4, 0x84, 0x3a, 0xae, 0x7f, 0xd4, 0xc0, 0xa3, 0x14, + 0x60, 0x61, 0xbf, 0xde, 0xa8, 0x1e, 0xd6, 0x3f, 0x93, 0xa7, 0xd8, 0xfa, 0x83, 0x05, 0x4b, 0x43, + 0x3d, 0x8a, 0x54, 0xa3, 0x71, 0xd4, 0x90, 0xdb, 0xae, 0x02, 0x39, 0xae, 0xd1, 0x67, 0x35, 0xea, + 0x3c, 0xa9, 0x1f, 0xef, 0xd4, 0x0e, 0xaa, 0xcf, 0xea, 0x47, 0xb4, 0x64, 0x91, 0x0a, 0xac, 0xe2, + 0xa1, 0x9c, 0x67, 0x35, 0x7a, 0x5c, 0x3f, 0x6a, 0x48, 0xf6, 0x13, 0x3c, 0xe5, 0x24, 0xd9, 0x80, + 0x1b, 0xcd, 0x2a, 0x3d, 0xa9, 0x57, 0x0f, 0x1d, 0x75, 0x08, 0x67, 0xf7, 0xe8, 0xf0, 0xb0, 0x7a, + 0x52, 0xa3, 0xd5, 0xc3, 0xd2, 0x14, 0xb9, 0x03, 0x1b, 0x19, 0xf6, 0xde, 0xd3, 0xe6, 0x61, 0x7d, + 0xb7, 0x7a, 0x52, 0x73, 0x9a, 0xb5, 0x1a, 0x2d, 0x4d, 0x93, 0x7b, 0xf0, 0x7a, 0x76, 0x87, 0x83, + 0x6a, 0xa3, 0x51, 0x3b, 0x74, 0xf6, 0x9f, 0x2a, 0x8b, 0x68, 0x2b, 0xcd, 0x3c, 0xf8, 0x4d, 0x09, + 0x66, 0x4f, 0xf0, 0xc1, 0x49, 0x42, 0xc8, 0x27, 0x87, 0xe2, 0xe4, 0x56, 0xdf, 0xcb, 0x23, 0x46, + 0xf2, 0x95, 0x8d, 0x31, 0x5c, 0xfd, 0xc6, 0xb5, 0x7f, 0xf4, 0xb7, 0x7f, 0x7c, 0x35, 0x79, 0xcb, + 0x5e, 0xdb, 0xbe, 0x7c, 0x77, 0x5b, 0x4a, 0x6e, 0x9b, 0x1a, 0xb2, 0xfd, 0xa5, 0x94, 0x7f, 0x6c, + 0x6d, 0x91, 0xcf, 0x20, 0x97, 0xf8, 0xd3, 0x05, 0xb9, 0x99, 0x18, 0x3a, 0x64, 0x47, 0x72, 0x95, + 0xa1, 0xd9, 0x97, 0x7d, 0x0b, 0x11, 0x56, 0xed, 0xa5, 0x21, 0x04, 0xb9, 0xf7, 0x29, 0xe4, 0x93, + 0x03, 0xf3, 0x84, 0x32, 0x23, 0xe6, 0xef, 0x09, 0x65, 0x46, 0x4d, 0xd9, 0xed, 0x1b, 0x08, 0x55, + 0x26, 0xc3, 0x50, 0x12, 0x27, 0x39, 0x7a, 0x4d, 0xe0, 0x8c, 0x98, 0x2d, 0x27, 0x70, 0x46, 0xcd, + 0x6b, 0x0d, 0xce, 0xd6, 0x08, 0x9c, 0x17, 0xb0, 0x98, 0x19, 0x8c, 0x92, 0xc1, 0xd8, 0x78, 0xf4, + 0x10, 0xb7, 0xb2, 0x39, 0x5e, 0x40, 0x03, 0xbe, 0x8e, 0x80, 0xb7, 0xed, 0xca, 0xb0, 0x97, 0xcc, + 0xa8, 0x54, 0x1a, 0xf3, 0x0a, 0x8a, 0xe9, 0x19, 0x25, 0x79, 0xad, 0xbf, 0xf5, 0xc8, 0x09, 0x6a, + 0xe5, 0xf6, 0x58, 0xbe, 0x46, 0xfe, 0x77, 0x44, 0x7e, 0xcd, 0xbe, 0x31, 0x8c, 0xac, 0x87, 0x96, + 0x12, 0x58, 0x40, 0x31, 0x3d, 0x4d, 0x4c, 0x00, 0x8f, 0x1c, 0x66, 0x26, 0x80, 0xc7, 0x8c, 0x21, + 0xef, 0x20, 0xf0, 0x4d, 0x7b, 0x75, 0x18, 0xb8, 0xd5, 0xf3, 0xbb, 0x12, 0xf5, 0x87, 0xb0, 0x98, + 0x79, 0x3a, 0x24, 0x6c, 0x3d, 0xfa, 0xb9, 0x91, 0xb0, 0xf5, 0x98, 0x57, 0xc7, 0xab, 0x34, 0xd6, + 0x2f, 0x11, 0x89, 0xed, 0x42, 0x2e, 0x31, 0xa7, 0x4b, 0xe4, 0xc4, 0xf0, 0x8c, 0xb0, 0x72, 0x6b, + 0x34, 0x53, 0xe3, 0x55, 0x10, 0x6f, 0xd9, 0x5e, 0xec, 0xe3, 0x61, 0x97, 0x8a, 0xd9, 0xf1, 0x03, + 0x80, 0xc1, 0xa4, 0x8c, 0x54, 0x52, 0xd1, 0x9f, 0x1a, 0xc7, 0x55, 0x6e, 0x8e, 0xe4, 0x69, 0x88, + 0x35, 0x84, 0x58, 0x22, 0x59, 0x08, 0x12, 0x42, 0x2e, 0x31, 0xf8, 0x4a, 0x68, 0x31, 0x3c, 0x45, + 0x4b, 0x68, 0x31, 0x6a, 0x56, 0xa6, 0x23, 0x74, 0x6b, 0x23, 0x03, 0xb1, 0xfd, 0x22, 0xd1, 0x86, + 0xbf, 0x24, 0x9f, 0x03, 0x0c, 0xde, 0x61, 0x09, 0x85, 0x86, 0x5e, 0x6c, 0x09, 0x85, 0x86, 0x1f, + 0x6e, 0xf6, 0x32, 0xa2, 0x15, 0x49, 0xbe, 0x8f, 0x76, 0xca, 0x39, 0xf9, 0x52, 0xf7, 0xbc, 0xfd, + 0xfe, 0x81, 0x6c, 0x8c, 0xeb, 0x4a, 0x14, 0xc6, 0x6b, 0xaf, 0x6e, 0x5a, 0xec, 0x4d, 0x84, 0xa9, + 0x90, 0xf5, 0x3e, 0x4c, 0xa6, 0xf9, 0x21, 0x17, 0x50, 0x48, 0xb5, 0x15, 0x09, 0xc4, 0x51, 0x7d, + 0x48, 0x02, 0x71, 0x64, 0x37, 0x62, 0xdf, 0x44, 0xc4, 0x15, 0x52, 0xee, 0x23, 0x62, 0xbb, 0xbf, + 0x1d, 0xf0, 0x6b, 0x41, 0x42, 0x28, 0xe0, 0x8a, 0xe3, 0x80, 0x75, 0xe3, 0xf3, 0x50, 0x24, 0xc0, + 0x52, 0xf4, 0x61, 0xb0, 0x0c, 0x5b, 0x83, 0xdd, 0x46, 0xb0, 0x1b, 0x64, 0x2d, 0x03, 0x16, 0x9b, + 0xfd, 0x3f, 0x85, 0xc2, 0x47, 0x5c, 0xf4, 0xfb, 0xeb, 0x98, 0x0c, 0xfe, 0x76, 0x96, 0x6a, 0xe2, + 0x2b, 0x6b, 0x43, 0xf4, 0x51, 0x91, 0xd7, 0x89, 0x99, 0xd8, 0x56, 0x8d, 0x3b, 0xa1, 0x30, 0xab, + 0xde, 0x27, 0x89, 0x3d, 0x53, 0x6f, 0x9f, 0xc4, 0x9e, 0xe9, 0x87, 0xcc, 0x88, 0x68, 0xd6, 0x2f, + 0x17, 0x0e, 0xb9, 0x41, 0x9f, 0x93, 0x4c, 0x97, 0xa1, 0x46, 0x2b, 0x11, 0x5d, 0xc3, 0xcd, 0x94, + 0xbd, 0x81, 0x00, 0x6b, 0x64, 0xa5, 0x0f, 0x90, 0xec, 0xad, 0xc8, 0xaf, 0x2c, 0x28, 0xa6, 0x0c, + 0x1a, 0x93, 0x31, 0x96, 0x8e, 0x47, 0xdc, 0x76, 0x19, 0xbe, 0x86, 0xdc, 0x43, 0xc8, 0x0f, 0xc8, + 0xfb, 0x63, 0x5c, 0x11, 0x6f, 0xbf, 0x88, 0x05, 0x8b, 0x84, 0x63, 0x9e, 0x83, 0x2f, 0xb7, 0x5f, + 0x04, 0x3d, 0x5f, 0x7d, 0xf2, 0xd8, 0x69, 0xb1, 0xf6, 0xc5, 0xcb, 0x9d, 0x37, 0x3f, 0x7b, 0xfd, + 0xcc, 0x13, 0xe7, 0xbd, 0xd6, 0xfd, 0x76, 0xe8, 0x6f, 0x77, 0xbc, 0xb3, 0x73, 0x11, 0x78, 0xc1, + 0x59, 0x87, 0xb5, 0x62, 0xb5, 0xa9, 0x3e, 0x45, 0x6b, 0x16, 0xff, 0x29, 0xe1, 0x3f, 0xff, 0x19, + 0x00, 0x00, 0xff, 0xff, 0x2f, 0x44, 0xde, 0x60, 0xdd, 0x20, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3239,6 +3242,8 @@ type TraderClient interface { NextBatchInfo(ctx context.Context, in *NextBatchInfoRequest, opts ...grpc.CallOption) (*NextBatchInfoResponse, error) // pool: `auction snapshot` //BatchSnapshot returns the snapshot of a past batch identified by its ID. + //If no ID is provided, the snapshot of the last finalized batch is returned. + //Deprecated, use BatchSnapshots instead. BatchSnapshot(ctx context.Context, in *BatchSnapshotRequest, opts ...grpc.CallOption) (*BatchSnapshotResponse, error) // pool: `listauth` //GetLsatTokens returns all LSAT tokens the daemon ever paid for. @@ -3251,6 +3256,13 @@ type TraderClient interface { //Returns the Node Tier information for this target Lightning node, and other //related ranking information. NodeRatings(ctx context.Context, in *NodeRatingRequest, opts ...grpc.CallOption) (*NodeRatingResponse, error) + // pool: `auction snapshot` + //BatchSnapshots returns a list of batch snapshots starting at the start batch + //ID and going back through the history of batches, returning at most the + //number of specified batches. A maximum of 100 snapshots can be queried in + //one call. If no start batch ID is provided, the most recent finalized batch + //is used as the starting point to go back from. + BatchSnapshots(ctx context.Context, in *BatchSnapshotsRequest, opts ...grpc.CallOption) (*BatchSnapshotsResponse, error) } type traderClient struct { @@ -3423,6 +3435,15 @@ func (c *traderClient) NodeRatings(ctx context.Context, in *NodeRatingRequest, o return out, nil } +func (c *traderClient) BatchSnapshots(ctx context.Context, in *BatchSnapshotsRequest, opts ...grpc.CallOption) (*BatchSnapshotsResponse, error) { + out := new(BatchSnapshotsResponse) + err := c.cc.Invoke(ctx, "/poolrpc.Trader/BatchSnapshots", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // TraderServer is the server API for Trader service. type TraderServer interface { // @@ -3488,6 +3509,8 @@ type TraderServer interface { NextBatchInfo(context.Context, *NextBatchInfoRequest) (*NextBatchInfoResponse, error) // pool: `auction snapshot` //BatchSnapshot returns the snapshot of a past batch identified by its ID. + //If no ID is provided, the snapshot of the last finalized batch is returned. + //Deprecated, use BatchSnapshots instead. BatchSnapshot(context.Context, *BatchSnapshotRequest) (*BatchSnapshotResponse, error) // pool: `listauth` //GetLsatTokens returns all LSAT tokens the daemon ever paid for. @@ -3500,6 +3523,13 @@ type TraderServer interface { //Returns the Node Tier information for this target Lightning node, and other //related ranking information. NodeRatings(context.Context, *NodeRatingRequest) (*NodeRatingResponse, error) + // pool: `auction snapshot` + //BatchSnapshots returns a list of batch snapshots starting at the start batch + //ID and going back through the history of batches, returning at most the + //number of specified batches. A maximum of 100 snapshots can be queried in + //one call. If no start batch ID is provided, the most recent finalized batch + //is used as the starting point to go back from. + BatchSnapshots(context.Context, *BatchSnapshotsRequest) (*BatchSnapshotsResponse, error) } // UnimplementedTraderServer can be embedded to have forward compatible implementations. @@ -3560,6 +3590,9 @@ func (*UnimplementedTraderServer) Leases(ctx context.Context, req *LeasesRequest func (*UnimplementedTraderServer) NodeRatings(ctx context.Context, req *NodeRatingRequest) (*NodeRatingResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NodeRatings not implemented") } +func (*UnimplementedTraderServer) BatchSnapshots(ctx context.Context, req *BatchSnapshotsRequest) (*BatchSnapshotsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BatchSnapshots not implemented") +} func RegisterTraderServer(s *grpc.Server, srv TraderServer) { s.RegisterService(&_Trader_serviceDesc, srv) @@ -3889,6 +3922,24 @@ func _Trader_NodeRatings_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Trader_BatchSnapshots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchSnapshotsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TraderServer).BatchSnapshots(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/poolrpc.Trader/BatchSnapshots", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TraderServer).BatchSnapshots(ctx, req.(*BatchSnapshotsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Trader_serviceDesc = grpc.ServiceDesc{ ServiceName: "poolrpc.Trader", HandlerType: (*TraderServer)(nil), @@ -3965,6 +4016,10 @@ var _Trader_serviceDesc = grpc.ServiceDesc{ MethodName: "NodeRatings", Handler: _Trader_NodeRatings_Handler, }, + { + MethodName: "BatchSnapshots", + Handler: _Trader_BatchSnapshots_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "trader.proto", diff --git a/poolrpc/trader.pb.gw.go b/poolrpc/trader.pb.gw.go index f3a1eb0..52256ae 100644 --- a/poolrpc/trader.pb.gw.go +++ b/poolrpc/trader.pb.gw.go @@ -593,6 +593,82 @@ func local_request_Trader_NodeRatings_0(ctx context.Context, marshaler runtime.M } +func request_Trader_BatchSnapshots_0(ctx context.Context, marshaler runtime.Marshaler, client TraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BatchSnapshotsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["start_batch_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "start_batch_id") + } + + protoReq.StartBatchId, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "start_batch_id", err) + } + + val, ok = pathParams["num_batches_back"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "num_batches_back") + } + + protoReq.NumBatchesBack, err = runtime.Uint32(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "num_batches_back", err) + } + + msg, err := client.BatchSnapshots(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Trader_BatchSnapshots_0(ctx context.Context, marshaler runtime.Marshaler, server TraderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BatchSnapshotsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["start_batch_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "start_batch_id") + } + + protoReq.StartBatchId, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "start_batch_id", err) + } + + val, ok = pathParams["num_batches_back"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "num_batches_back") + } + + protoReq.NumBatchesBack, err = runtime.Uint32(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "num_batches_back", err) + } + + msg, err := server.BatchSnapshots(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterTraderHandlerServer registers the http handlers for service Trader to "mux". // UnaryRPC :call TraderServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -958,6 +1034,26 @@ func RegisterTraderHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("GET", pattern_Trader_BatchSnapshots_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Trader_BatchSnapshots_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_BatchSnapshots_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1359,6 +1455,26 @@ func RegisterTraderHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("GET", pattern_Trader_BatchSnapshots_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Trader_BatchSnapshots_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Trader_BatchSnapshots_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1398,6 +1514,8 @@ var ( pattern_Trader_Leases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "pool", "leases"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Trader_NodeRatings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "pool", "node_ratings"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Trader_BatchSnapshots_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "pool", "batch", "snapshots", "start_batch_id", "num_batches_back"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1436,4 +1554,6 @@ var ( forward_Trader_Leases_0 = runtime.ForwardResponseMessage forward_Trader_NodeRatings_0 = runtime.ForwardResponseMessage + + forward_Trader_BatchSnapshots_0 = runtime.ForwardResponseMessage ) diff --git a/poolrpc/trader.proto b/poolrpc/trader.proto index 5e68f6c..21065df 100644 --- a/poolrpc/trader.proto +++ b/poolrpc/trader.proto @@ -166,6 +166,8 @@ service Trader { /* pool: `auction snapshot` BatchSnapshot returns the snapshot of a past batch identified by its ID. + If no ID is provided, the snapshot of the last finalized batch is returned. + Deprecated, use BatchSnapshots instead. */ rpc BatchSnapshot (BatchSnapshotRequest) returns (BatchSnapshotResponse) { option (google.api.http) = { @@ -201,6 +203,20 @@ service Trader { get: "/v1/pool/node_ratings" }; }; + + /* pool: `auction snapshot` + BatchSnapshots returns a list of batch snapshots starting at the start batch + ID and going back through the history of batches, returning at most the + number of specified batches. A maximum of 100 snapshots can be queried in + one call. If no start batch ID is provided, the most recent finalized batch + is used as the starting point to go back from. + */ + rpc BatchSnapshots (BatchSnapshotsRequest) + returns (BatchSnapshotsResponse) { + option (google.api.http) = { + get: "/v1/pool/batch/snapshots/{start_batch_id}/{num_batches_back}" + }; + }; } message InitAccountRequest { diff --git a/poolrpc/trader.swagger.json b/poolrpc/trader.swagger.json index a93226f..f6b8ee3 100644 --- a/poolrpc/trader.swagger.json +++ b/poolrpc/trader.swagger.json @@ -342,7 +342,7 @@ }, "/v1/pool/batch/snapshot": { "get": { - "summary": "pool: `auction snapshot`\nBatchSnapshot returns the snapshot of a past batch identified by its ID.", + "summary": "pool: `auction snapshot`\nBatchSnapshot returns the snapshot of a past batch identified by its ID.\nIf no ID is provided, the snapshot of the last finalized batch is returned.\nDeprecated, use BatchSnapshots instead.", "operationId": "BatchSnapshot", "responses": { "200": { @@ -373,6 +373,47 @@ ] } }, + "/v1/pool/batch/snapshots/{start_batch_id}/{num_batches_back}": { + "get": { + "summary": "pool: `auction snapshot`\nBatchSnapshots returns a list of batch snapshots starting at the start batch\nID and going back through the history of batches, returning at most the\nnumber of specified batches. A maximum of 100 snapshots can be queried in\none call. If no start batch ID is provided, the most recent finalized batch\nis used as the starting point to go back from.", + "operationId": "BatchSnapshots", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/poolrpcBatchSnapshotsResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/gatewayruntimeError" + } + } + }, + "parameters": [ + { + "name": "start_batch_id", + "description": "The unique identifier of the first batch to return, encoded as a compressed\npubkey. This represents the newest/most current batch to fetch. If this is\nempty or a zero batch ID, the most recent finalized batch is used as the\nstarting point to go back from.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "num_batches_back", + "description": "The number of batches to return at most, including the start batch.", + "in": "path", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "tags": [ + "Trader" + ] + } + }, "/v1/pool/fee": { "get": { "summary": "pool: `auction fee`\nAuctionFee returns the current auction order execution fee specified by the\nauction server.", @@ -791,6 +832,18 @@ } } }, + "poolrpcBatchSnapshotsResponse": { + "type": "object", + "properties": { + "batches": { + "type": "array", + "items": { + "$ref": "#/definitions/poolrpcBatchSnapshotResponse" + }, + "description": "The list of batches requested." + } + } + }, "poolrpcBid": { "type": "object", "properties": { diff --git a/rpcserver.go b/rpcserver.go index c10cfaf..e4787fb 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1907,6 +1907,18 @@ func (s *rpcServer) BatchSnapshot(ctx context.Context, return s.auctioneer.BatchSnapshot(ctx, batchID) } +// BatchSnapshots returns a list of batch snapshots starting at the start batch +// ID and going back through the history of batches, returning at most the +// number of specified batches. A maximum of 100 snapshots can be queried in +// one call. If no start batch ID is provided, the most recent finalized batch +// is used as the starting point to go back from. +func (s *rpcServer) BatchSnapshots(ctx context.Context, + req *poolrpc.BatchSnapshotsRequest) (*poolrpc.BatchSnapshotsResponse, + error) { + + return s.auctioneer.BatchSnapshots(ctx, req) +} + // LeaseDurations returns the current set of valid lease duration in the // market as is, and also information w.r.t if the market is currently active. func (s *rpcServer) LeaseDurations(ctx context.Context, From 380646704f48278a98d4923a63d09be3294384dc Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 19 Nov 2020 17:11:47 +0100 Subject: [PATCH 3/4] cmd/pool: add num_batches to snapshot command --- cmd/pool/auction.go | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/cmd/pool/auction.go b/cmd/pool/auction.go index 7fe06ec..eaecdae 100644 --- a/cmd/pool/auction.go +++ b/cmd/pool/auction.go @@ -7,6 +7,7 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/lightninglabs/pool/poolrpc" + "github.com/lightninglabs/protobuf-hex-display/proto" "github.com/urfave/cli" ) @@ -100,9 +101,10 @@ var batchSnapshotCommand = cli.Command{ Name: "snapshot", ShortName: "s", Usage: "return information about a prior cleared auction batch", + ArgsUsage: "batch_id", Description: ` - Returns information about a prior batch such as the clearing - price and the set of orders included in the batch. The + Returns information about a prior batch or batches such as the + clearing price and the set of orders included in the batch. The prev_batch_id field can be used to explore prior batches in the sequence, similar to a block chain. `, @@ -113,6 +115,13 @@ var batchSnapshotCommand = cli.Command{ "for, if left blank, information about the " + "latest batch is returned", }, + cli.Uint64Flag{ + Name: "num_batches", + Usage: "the number of batches to show, starting at " + + "the batch_id and going back through the " + + "history of finalized batches", + Value: 1, + }, }, Action: batchSnapshot, } @@ -124,7 +133,11 @@ func batchSnapshot(ctx *cli.Context) error { } defer cleanup() - var batchIDStr string + var ( + batchIDStr string + ctxb = context.Background() + resp proto.Message + ) switch { case ctx.Args().Present(): batchIDStr = ctx.Args().First() @@ -138,18 +151,17 @@ func batchSnapshot(ctx *cli.Context) error { return fmt.Errorf("unable to decode batch ID: %v", err) } - ctxb := context.Background() - batchSnapshot, err := client.BatchSnapshot( - ctxb, - &poolrpc.BatchSnapshotRequest{ - BatchId: batchID, + resp, err = client.BatchSnapshots( + ctxb, &poolrpc.BatchSnapshotsRequest{ + StartBatchId: batchID, + NumBatchesBack: uint32(ctx.Uint64("num_batches")), }, ) if err != nil { return err } - printRespJSON(batchSnapshot) + printRespJSON(resp) return nil } From 4dd9eb8c6c4fd3309ae2260c6ab5542f7187b167 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Thu, 19 Nov 2020 17:11:48 +0100 Subject: [PATCH 4/4] order: add DecrementingBatchIDs To make iterating over batch IDs easier, we add a new helper function that returns all batch IDs starting at the start key (inclusive) and ending at the end key (inclusive) by decrementing the public keys. If the end key cannot be reached by decrementing the start key by a maximum of 10k times, we abort and return the first 10k items (without the end key). --- order/batch.go | 49 +++++++++++++++++++++++++++++++++++++++++++++ order/batch_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 order/batch_test.go diff --git a/order/batch.go b/order/batch.go index 7395d50..ce73aad 100644 --- a/order/batch.go +++ b/order/batch.go @@ -12,12 +12,22 @@ import ( "github.com/lightninglabs/lndclient" "github.com/lightninglabs/pool/account" "github.com/lightninglabs/pool/poolrpc" + "github.com/lightninglabs/pool/poolscript" "github.com/lightninglabs/pool/terms" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwallet/chainfee" ) +const ( + // MaxBatchIDHistoryLookup is the maximum number of iterations we do + // when iterating batch IDs. It's unlikely to happen but in case we + // start from an invalid value we want to avoid an endless loop. If we + // ever have more than that many batches, we need to handle them in + // multiple steps anyway. + MaxBatchIDHistoryLookup = 10_000 +) + // BatchVersion is the type for the batch verification protocol. type BatchVersion uint32 @@ -393,3 +403,42 @@ type BatchStorer interface { // trader to participate in a new batch. MarkBatchComplete() error } + +// DecrementingBatchIDs lists all possible batch IDs that can exist between a +// start and end key. Start key must be the larger/higher key, decrementing it a +// given number of times should finally result in the end key. If the keys +// aren't related or are too far apart, we return a maximum number of IDs that +// corresponds to our safety net parameter and the end key won't be contained in +// the list. The returned list is in descending order, meaning the first entry +// is the start key, the last entry is the end key. +func DecrementingBatchIDs(startKey, endKey *btcec.PublicKey) []BatchID { + var ( + result = []BatchID{NewBatchID(startKey)} + tempBatchKey = startKey + numIDs = 0 + ) + + // No need to loop if start and end are the same. + if startKey.IsEqual(endKey) { + return result + } + + for !tempBatchKey.IsEqual(endKey) { + numIDs++ + + // Unlikely to happen but in case we start from an invalid value + // we want to avoid an endless loop. This will cause the list to + // be incomplete if we ever have more than the maximum number of + // batches. But there is no scenario where it makes sense to + // work with more than that number of batches in one step. So if + // we ever do have more than that maximum number of batches, we + // need to query them in multiple steps. + if numIDs >= MaxBatchIDHistoryLookup { + break + } + + tempBatchKey = poolscript.DecrementKey(tempBatchKey) + result = append(result, NewBatchID(tempBatchKey)) + } + return result +} diff --git a/order/batch_test.go b/order/batch_test.go new file mode 100644 index 0000000..9e8e3b8 --- /dev/null +++ b/order/batch_test.go @@ -0,0 +1,47 @@ +package order + +import ( + "encoding/hex" + "testing" + + "github.com/btcsuite/btcd/btcec" + "github.com/lightninglabs/pool/poolscript" + "github.com/stretchr/testify/require" +) + +var ( + initialKeyBytes, _ = hex.DecodeString( + "034ba8df633bc689472b1fecb9ca0a7d9462467477c975108029f87ca6fb7fc1c1", + ) + initialKey, _ = btcec.ParsePubKey(initialKeyBytes, btcec.S256()) + + unrelatedKeyBytes, _ = hex.DecodeString( + "02975a91ca82550b19355b4826e67c6d2b064f9ec62fb4fd44e044ffbeb8d35127", + ) + unrelatedKey, _ = btcec.ParsePubKey(unrelatedKeyBytes, btcec.S256()) +) + +func TestDecrementingBatchIDs(t *testing.T) { + // Test single and one step apart keys. + require.Len(t, DecrementingBatchIDs(initialKey, initialKey), 1) + require.Len(t, DecrementingBatchIDs( + poolscript.IncrementKey(initialKey), initialKey, + ), 2) + + // Try 10 keys now. + tenKey := initialKey + for i := 0; i < 10; i++ { + tenKey = poolscript.IncrementKey(tenKey) + } + ids := DecrementingBatchIDs(tenKey, initialKey) + require.Len(t, ids, 11) + require.Equal(t, NewBatchID(tenKey), ids[0]) + require.Equal(t, NewBatchID(initialKey), ids[10]) + + // Make sure we don't loop forever if unrelated keys are used. + ids = DecrementingBatchIDs(unrelatedKey, initialKey) + + // We don't use require.Len() here, otherwise if this ever fails, the + // library prints the whole result which is huuuuuge. + require.Equal(t, MaxBatchIDHistoryLookup, len(ids)) +}