Add constant and percentage-based fee limits to payments

- Extend SendRequest and QueryRoutesRequest protos
- newRoute function takes fee limit and cuts off routes that exceed it
- queryRoutes, payInvoice and sendPayment commands take the feeLimit inputs and pass them down to newRoute
- When no feeLimit is included, don't enforce any feeLimits at all (by setting feeLimit to maxValue)
This commit is contained in:
Sebastian Delgado 2018-01-31 17:36:10 -05:00 committed by Wilmer Paulino
parent 80b531db62
commit 6746609ec6
No known key found for this signature in database
GPG Key ID: 6DF57B9F9514972F
10 changed files with 537 additions and 402 deletions

@ -103,6 +103,37 @@ func actionDecorator(f func(*cli.Context) error) func(*cli.Context) error {
} }
} }
// calculateFeeLimit takes ctx and the amount for the payment in satoshis.
// It checks the fee_limit and fee_limit_percent flags and determines the
// the feeLimit based on those values. If both flags are set, calculateFeeLimit
// sets feeLimit to the Minumum value between them. If neither flag is set,
// feeLimit is set to the maximum int64 value as to avoid enforcing a limit.
func calculateFeeLimit(ctx *cli.Context, amount int64) int64 {
var (
feeLimit int64
feeLimitPercent int64
)
const MaxInt64Value int64 = 1<<63 - 1 // 9223372036854775807
feeLimit = MaxInt64Value
if ctx.IsSet("fee_limit_percent") {
feeRatio := float64(ctx.Int64("fee_limit_percent")) / 100
feeLimitPercent = int64(float64(amount) * feeRatio)
feeLimit = feeLimitPercent
}
if ctx.IsSet("fee_limit") {
feeLimit = ctx.Int64("fee_limit")
}
// If both fee_limit and fee_limit_percent are set, pick the minimum
if ctx.IsSet("fee_limit") && ctx.IsSet("fee_limit_percent") {
feeLimit = int64(math.Min(float64(feeLimit), float64(feeLimitPercent)))
}
return feeLimit
}
var newAddressCommand = cli.Command{ var newAddressCommand = cli.Command{
Name: "newaddress", Name: "newaddress",
Category: "Wallet", Category: "Wallet",
@ -1633,6 +1664,14 @@ var sendPaymentCommand = cli.Command{
Name: "final_cltv_delta", Name: "final_cltv_delta",
Usage: "the number of blocks the last hop has to reveal the preimage", Usage: "the number of blocks the last hop has to reveal the preimage",
}, },
cli.Int64Flag{
Name: "fee_limit",
Usage: "maximum total fees for the payment in satoshis",
},
cli.Int64Flag{
Name: "fee_limit_percent",
Usage: "maximum total fees as a percentage of amt",
},
}, },
Action: sendPayment, Action: sendPayment,
} }
@ -1657,6 +1696,7 @@ func sendPayment(ctx *cli.Context) error {
destNode []byte destNode []byte
err error err error
amount int64 amount int64
feeLimit int64
) )
switch { switch {
@ -1687,9 +1727,12 @@ func sendPayment(ctx *cli.Context) error {
} }
} }
feeLimit = calculateFeeLimit(ctx, amount)
req = &lnrpc.SendRequest{ req = &lnrpc.SendRequest{
Dest: destNode, Dest: destNode,
Amt: amount, Amt: amount,
FeeLimit: feeLimit,
} }
if ctx.Bool("debug_send") && (ctx.IsSet("payment_hash") || args.Present()) { if ctx.Bool("debug_send") && (ctx.IsSet("payment_hash") || args.Present()) {
@ -1779,6 +1822,14 @@ var payInvoiceCommand = cli.Command{
Usage: "(optional) number of satoshis to fulfill the " + Usage: "(optional) number of satoshis to fulfill the " +
"invoice", "invoice",
}, },
cli.Int64Flag{
Name: "fee_limit",
Usage: "maximum total fees for the payment in satoshis",
},
cli.Int64Flag{
Name: "fee_limit_percent",
Usage: "maximum total fees as a percentage of amt",
},
}, },
Action: actionDecorator(payInvoice), Action: actionDecorator(payInvoice),
} }
@ -1787,6 +1838,8 @@ func payInvoice(ctx *cli.Context) error {
args := ctx.Args() args := ctx.Args()
var payReq string var payReq string
var feeLimit int64
var amt int64
switch { switch {
case ctx.IsSet("pay_req"): case ctx.IsSet("pay_req"):
@ -1797,9 +1850,14 @@ func payInvoice(ctx *cli.Context) error {
return fmt.Errorf("pay_req argument missing") return fmt.Errorf("pay_req argument missing")
} }
amt = ctx.Int64("amt")
feeLimit = calculateFeeLimit(ctx, amt)
req := &lnrpc.SendRequest{ req := &lnrpc.SendRequest{
PaymentRequest: payReq, PaymentRequest: payReq,
Amt: ctx.Int64("amt"), Amt: amt,
FeeLimit: feeLimit,
} }
return sendPaymentRequest(ctx, req) return sendPaymentRequest(ctx, req)
@ -2499,6 +2557,14 @@ var queryRoutesCommand = cli.Command{
Name: "amt", Name: "amt",
Usage: "the amount to send expressed in satoshis", Usage: "the amount to send expressed in satoshis",
}, },
cli.Int64Flag{
Name: "fee_limit",
Usage: "maximum total fees for the payment in satoshis",
},
cli.Int64Flag{
Name: "fee_limit_percent",
Usage: "maximum total fees as a percentage of amt",
},
cli.Int64Flag{ cli.Int64Flag{
Name: "num_max_routes", Name: "num_max_routes",
Usage: "the max number of routes to be returned (default: 10)", Usage: "the max number of routes to be returned (default: 10)",
@ -2519,9 +2585,10 @@ func queryRoutes(ctx *cli.Context) error {
defer cleanUp() defer cleanUp()
var ( var (
dest string dest string
amt int64 amt int64
err error err error
feeLimit int64
) )
args := ctx.Args() args := ctx.Args()
@ -2548,6 +2615,8 @@ func queryRoutes(ctx *cli.Context) error {
return fmt.Errorf("amt argument missing") return fmt.Errorf("amt argument missing")
} }
feeLimit = calculateFeeLimit(ctx, amt)
req := &lnrpc.QueryRoutesRequest{ req := &lnrpc.QueryRoutesRequest{
PubKey: dest, PubKey: dest,
Amt: amt, Amt: amt,

@ -488,6 +488,8 @@ type SendRequest struct {
PaymentRequest string `protobuf:"bytes,6,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"` PaymentRequest string `protobuf:"bytes,6,opt,name=payment_request,json=paymentRequest" json:"payment_request,omitempty"`
// / The CLTV delta from the current height that should be used to set the timelock for the final hop. // / The CLTV delta from the current height that should be used to set the timelock for the final hop.
FinalCltvDelta int32 `protobuf:"varint,7,opt,name=final_cltv_delta,json=finalCltvDelta" json:"final_cltv_delta,omitempty"` FinalCltvDelta int32 `protobuf:"varint,7,opt,name=final_cltv_delta,json=finalCltvDelta" json:"final_cltv_delta,omitempty"`
// / The maximum total fees for the payment in satoshis.
FeeLimit int64 `protobuf:"varint,8,opt,name=fee_limit" json:"fee_limit,omitempty"`
} }
func (m *SendRequest) Reset() { *m = SendRequest{} } func (m *SendRequest) Reset() { *m = SendRequest{} }
@ -544,6 +546,13 @@ func (m *SendRequest) GetFinalCltvDelta() int32 {
return 0 return 0
} }
func (m *SendRequest) GetFeeLimit() int64 {
if m != nil {
return m.FeeLimit
}
return 0
}
type SendResponse struct { type SendResponse struct {
PaymentError string `protobuf:"bytes,1,opt,name=payment_error" json:"payment_error,omitempty"` PaymentError string `protobuf:"bytes,1,opt,name=payment_error" json:"payment_error,omitempty"`
PaymentPreimage []byte `protobuf:"bytes,2,opt,name=payment_preimage,proto3" json:"payment_preimage,omitempty"` PaymentPreimage []byte `protobuf:"bytes,2,opt,name=payment_preimage,proto3" json:"payment_preimage,omitempty"`
@ -625,9 +634,7 @@ func (m *ChannelPoint) String() string { return proto.CompactTextStri
func (*ChannelPoint) ProtoMessage() {} func (*ChannelPoint) ProtoMessage() {}
func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
type isChannelPoint_FundingTxid interface { type isChannelPoint_FundingTxid interface{ isChannelPoint_FundingTxid() }
isChannelPoint_FundingTxid()
}
type ChannelPoint_FundingTxidBytes struct { type ChannelPoint_FundingTxidBytes struct {
FundingTxidBytes []byte `protobuf:"bytes,1,opt,name=funding_txid_bytes,proto3,oneof"` FundingTxidBytes []byte `protobuf:"bytes,1,opt,name=funding_txid_bytes,proto3,oneof"`
@ -1714,9 +1721,7 @@ func (m *CloseStatusUpdate) String() string { return proto.CompactTex
func (*CloseStatusUpdate) ProtoMessage() {} func (*CloseStatusUpdate) ProtoMessage() {}
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
type isCloseStatusUpdate_Update interface { type isCloseStatusUpdate_Update interface{ isCloseStatusUpdate_Update() }
isCloseStatusUpdate_Update()
}
type CloseStatusUpdate_ClosePending struct { type CloseStatusUpdate_ClosePending struct {
ClosePending *PendingUpdate `protobuf:"bytes,1,opt,name=close_pending,oneof"` ClosePending *PendingUpdate `protobuf:"bytes,1,opt,name=close_pending,oneof"`
@ -1979,9 +1984,7 @@ func (m *OpenStatusUpdate) String() string { return proto.CompactText
func (*OpenStatusUpdate) ProtoMessage() {} func (*OpenStatusUpdate) ProtoMessage() {}
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
type isOpenStatusUpdate_Update interface { type isOpenStatusUpdate_Update interface{ isOpenStatusUpdate_Update() }
isOpenStatusUpdate_Update()
}
type OpenStatusUpdate_ChanPending struct { type OpenStatusUpdate_ChanPending struct {
ChanPending *PendingUpdate `protobuf:"bytes,1,opt,name=chan_pending,oneof"` ChanPending *PendingUpdate `protobuf:"bytes,1,opt,name=chan_pending,oneof"`
@ -2588,6 +2591,8 @@ type QueryRoutesRequest struct {
NumRoutes int32 `protobuf:"varint,3,opt,name=num_routes,json=numRoutes" json:"num_routes,omitempty"` NumRoutes int32 `protobuf:"varint,3,opt,name=num_routes,json=numRoutes" json:"num_routes,omitempty"`
// / An optional CLTV delta from the current height that should be used for the timelock of the final hop // / An optional CLTV delta from the current height that should be used for the timelock of the final hop
FinalCltvDelta int32 `protobuf:"varint,4,opt,name=final_cltv_delta,json=finalCltvDelta" json:"final_cltv_delta,omitempty"` FinalCltvDelta int32 `protobuf:"varint,4,opt,name=final_cltv_delta,json=finalCltvDelta" json:"final_cltv_delta,omitempty"`
// / The maximum total fees for the route in satoshis.
FeeLimit int64 `protobuf:"varint,5,opt,name=fee_limit,json=feeLimit" json:"fee_limit,omitempty"`
} }
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} } func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
@ -2623,6 +2628,13 @@ func (m *QueryRoutesRequest) GetFinalCltvDelta() int32 {
return 0 return 0
} }
func (m *QueryRoutesRequest) GetFeeLimit() int64 {
if m != nil {
return m.FeeLimit
}
return 0
}
type QueryRoutesResponse struct { type QueryRoutesResponse struct {
Routes []*Route `protobuf:"bytes,1,rep,name=routes" json:"routes,omitempty"` Routes []*Route `protobuf:"bytes,1,rep,name=routes" json:"routes,omitempty"`
} }
@ -4076,9 +4088,7 @@ func (m *PolicyUpdateRequest) String() string { return proto.CompactT
func (*PolicyUpdateRequest) ProtoMessage() {} func (*PolicyUpdateRequest) ProtoMessage() {}
func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{97} } func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{97} }
type isPolicyUpdateRequest_Scope interface { type isPolicyUpdateRequest_Scope interface{ isPolicyUpdateRequest_Scope() }
isPolicyUpdateRequest_Scope()
}
type PolicyUpdateRequest_Global struct { type PolicyUpdateRequest_Global struct {
Global bool `protobuf:"varint,1,opt,name=global,oneof"` Global bool `protobuf:"varint,1,opt,name=global,oneof"`
@ -6620,367 +6630,369 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 5786 bytes of a gzipped FileDescriptorProto // 5813 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3c, 0x4b, 0x90, 0x1c, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3c, 0x4b, 0x8c, 0x24, 0xc9,
0x55, 0xaa, 0x9e, 0x9e, 0x4f, 0xbf, 0xee, 0xe9, 0x99, 0xc9, 0x19, 0xcd, 0xb4, 0x7a, 0xb5, 0x5a, 0x55, 0x93, 0xd5, 0xd5, 0x9f, 0x7a, 0x55, 0x5d, 0xdd, 0x1d, 0xdd, 0xd3, 0x53, 0x53, 0x3b, 0x3b,
0x6d, 0x59, 0x61, 0xc9, 0xc3, 0xa2, 0xd1, 0x8e, 0xed, 0x65, 0x2d, 0x81, 0x8d, 0xfe, 0xb3, 0xb6, 0x3b, 0x9b, 0x1e, 0x79, 0xc6, 0xcd, 0x32, 0x3d, 0xdb, 0xb6, 0x97, 0xf5, 0x2e, 0xd8, 0xcc, 0x6f,
0x56, 0x1e, 0xd7, 0x48, 0x16, 0xd8, 0x10, 0xed, 0x9a, 0xee, 0x9c, 0x9e, 0xb2, 0xba, 0xab, 0xca, 0xa7, 0xd7, 0x9e, 0x1d, 0xb7, 0xb3, 0x67, 0x3d, 0x60, 0x83, 0xca, 0xd9, 0x55, 0xd1, 0xd5, 0xe9,
0x55, 0xd5, 0x33, 0x6a, 0x2f, 0x8a, 0xe0, 0x17, 0x04, 0x07, 0x1c, 0x04, 0x81, 0x2f, 0x26, 0x82, 0xc9, 0xca, 0x4c, 0x67, 0x66, 0x75, 0x4f, 0x79, 0x19, 0x89, 0x9f, 0x38, 0x61, 0x21, 0x84, 0x0f,
0x20, 0xc2, 0x5c, 0xe0, 0xc0, 0x91, 0x93, 0xe1, 0xc6, 0x89, 0x08, 0x82, 0xc3, 0x9e, 0x1c, 0x1c, 0x18, 0x09, 0x21, 0x19, 0x21, 0xc1, 0x81, 0x23, 0x27, 0xc3, 0x8d, 0x13, 0x12, 0xe2, 0xb0, 0x27,
0x81, 0x03, 0x38, 0xb8, 0x10, 0xc1, 0x85, 0x03, 0x41, 0xbc, 0x97, 0x9f, 0xca, 0xac, 0xaa, 0x96, 0x8b, 0x23, 0x70, 0x00, 0x8b, 0x0b, 0x12, 0x57, 0x84, 0xde, 0x8b, 0x4f, 0x46, 0x64, 0x66, 0xcd,
0xc6, 0x1f, 0xb8, 0x75, 0xbe, 0x7c, 0x95, 0xf9, 0x32, 0xf3, 0xbd, 0x97, 0xef, 0x97, 0x0d, 0x8d, 0x8c, 0x3f, 0x70, 0xab, 0x78, 0xf1, 0x32, 0xe2, 0x45, 0xc4, 0x7b, 0x2f, 0xde, 0x2f, 0x0a, 0x5a,
0x24, 0xee, 0x5f, 0x8f, 0x93, 0x28, 0x8b, 0xd8, 0xfc, 0x28, 0x4c, 0xe2, 0x7e, 0xf7, 0xe2, 0x30, 0x69, 0x32, 0xbc, 0x91, 0xa4, 0x71, 0x1e, 0xb3, 0xc5, 0x30, 0x4a, 0x93, 0x61, 0xff, 0xd2, 0x38,
0x8a, 0x86, 0x23, 0xbe, 0xe3, 0xc7, 0xc1, 0x8e, 0x1f, 0x86, 0x51, 0xe6, 0x67, 0x41, 0x14, 0xa6, 0x8e, 0xc7, 0x21, 0xdf, 0xf5, 0x93, 0x60, 0xd7, 0x8f, 0xa2, 0x38, 0xf7, 0xf3, 0x20, 0x8e, 0x32,
0x02, 0xc9, 0xfd, 0x06, 0xb4, 0x1f, 0xf2, 0xf0, 0x80, 0xf3, 0x81, 0xc7, 0xbf, 0x35, 0xe1, 0x69, 0x81, 0xe4, 0x7e, 0x03, 0xba, 0xf7, 0x79, 0x74, 0xc8, 0xf9, 0xc8, 0xe3, 0xdf, 0x9a, 0xf2, 0x2c,
0xc6, 0x7e, 0x0e, 0xd6, 0x7c, 0xfe, 0x6d, 0xce, 0x07, 0xbd, 0xd8, 0x4f, 0xd3, 0xf8, 0x38, 0xf1, 0x67, 0x3f, 0x07, 0x1b, 0x3e, 0xff, 0x36, 0xe7, 0xa3, 0x41, 0xe2, 0x67, 0x59, 0x72, 0x92, 0xfa,
0x53, 0xde, 0x71, 0x2e, 0x3b, 0xd7, 0x5a, 0xde, 0xaa, 0xe8, 0xd8, 0xd7, 0x70, 0xf6, 0x36, 0xb4, 0x19, 0xef, 0x39, 0x57, 0x9c, 0xeb, 0x1d, 0x6f, 0x5d, 0x74, 0x1c, 0x68, 0x38, 0x7b, 0x1d, 0x3a,
0x52, 0x44, 0xe5, 0x61, 0x96, 0x44, 0xf1, 0xb4, 0x53, 0x23, 0xbc, 0x26, 0xc2, 0xee, 0x0b, 0x90, 0x19, 0xa2, 0xf2, 0x28, 0x4f, 0xe3, 0x64, 0xd6, 0x6b, 0x10, 0x5e, 0x1b, 0x61, 0xf7, 0x04, 0xc8,
0x3b, 0x82, 0x15, 0x3d, 0x43, 0x1a, 0x47, 0x61, 0xca, 0xd9, 0x0d, 0xd8, 0xe8, 0x07, 0xf1, 0x31, 0x0d, 0x61, 0x4d, 0xcf, 0x90, 0x25, 0x71, 0x94, 0x71, 0x76, 0x13, 0xb6, 0x86, 0x41, 0x72, 0xc2,
0x4f, 0x7a, 0xf4, 0xf1, 0x38, 0xe4, 0xe3, 0x28, 0x0c, 0xfa, 0x1d, 0xe7, 0xf2, 0xdc, 0xb5, 0x86, 0xd3, 0x01, 0x7d, 0x3c, 0x89, 0xf8, 0x24, 0x8e, 0x82, 0x61, 0xcf, 0xb9, 0xb2, 0x70, 0xbd, 0xe5,
0xc7, 0x44, 0x1f, 0x7e, 0xf1, 0xa1, 0xec, 0x61, 0x57, 0x61, 0x85, 0x87, 0x02, 0xce, 0x07, 0xf4, 0x31, 0xd1, 0x87, 0x5f, 0x7c, 0x20, 0x7b, 0xd8, 0x35, 0x58, 0xe3, 0x91, 0x80, 0xf3, 0x11, 0x7d,
0x95, 0x9c, 0xaa, 0x9d, 0x83, 0xf1, 0x03, 0xf7, 0xef, 0x1c, 0x58, 0xfb, 0x20, 0x0c, 0xb2, 0x67, 0x25, 0xa7, 0xea, 0x16, 0x60, 0xfc, 0xc0, 0xfd, 0x7b, 0x07, 0x36, 0xde, 0x8f, 0x82, 0xfc, 0xb1,
0xfe, 0x68, 0xc4, 0x33, 0xb5, 0xa6, 0xab, 0xb0, 0x72, 0x4a, 0x00, 0x5a, 0xd3, 0x69, 0x94, 0x0c, 0x1f, 0x86, 0x3c, 0x57, 0x6b, 0xba, 0x06, 0x6b, 0x67, 0x04, 0xa0, 0x35, 0x9d, 0xc5, 0xe9, 0x48,
0xe4, 0x8a, 0xda, 0x02, 0xbc, 0x2f, 0xa1, 0x33, 0x29, 0xab, 0xcd, 0xa4, 0xac, 0x72, 0xbb, 0xe6, 0xae, 0xa8, 0x2b, 0xc0, 0x07, 0x12, 0x3a, 0x97, 0xb2, 0xc6, 0x5c, 0xca, 0x6a, 0xb7, 0x6b, 0x61,
0x66, 0x6c, 0xd7, 0x55, 0x58, 0x49, 0x78, 0x3f, 0x3a, 0xe1, 0xc9, 0xb4, 0x77, 0x1a, 0x84, 0x83, 0xce, 0x76, 0x5d, 0x83, 0xb5, 0x94, 0x0f, 0xe3, 0x53, 0x9e, 0xce, 0x06, 0x67, 0x41, 0x34, 0x8a,
0xe8, 0xb4, 0x53, 0xbf, 0xec, 0x5c, 0x9b, 0xf7, 0xda, 0x0a, 0xfc, 0x8c, 0xa0, 0xee, 0x06, 0x30, 0xcf, 0x7a, 0xcd, 0x2b, 0xce, 0xf5, 0x45, 0xaf, 0xab, 0xc0, 0x8f, 0x09, 0xea, 0x6e, 0x01, 0x33,
0x73, 0x15, 0x62, 0xdf, 0xdc, 0x21, 0xac, 0x3f, 0x0d, 0x47, 0x51, 0xff, 0xf9, 0x4f, 0xb8, 0xba, 0x57, 0x21, 0xf6, 0xcd, 0x1d, 0xc3, 0xe6, 0x87, 0x51, 0x18, 0x0f, 0x9f, 0xfc, 0x84, 0xab, 0xab,
0x8a, 0xe9, 0x6b, 0x95, 0xd3, 0x6f, 0xc2, 0x86, 0x3d, 0x91, 0x24, 0x80, 0xc3, 0xf9, 0xbb, 0xc7, 0x99, 0xbe, 0x51, 0x3b, 0xfd, 0x36, 0x6c, 0xd9, 0x13, 0x49, 0x02, 0x38, 0x9c, 0xbf, 0x73, 0xe2,
0x7e, 0x38, 0xe4, 0x6a, 0x48, 0x45, 0xc2, 0xa7, 0x60, 0xb5, 0x3f, 0x49, 0x12, 0x1e, 0x96, 0x68, 0x47, 0x63, 0xae, 0x86, 0x54, 0x24, 0x7c, 0x0a, 0xd6, 0x87, 0xd3, 0x34, 0xe5, 0x51, 0x85, 0x86,
0x58, 0x91, 0x70, 0x4d, 0xc4, 0xdb, 0xd0, 0x0a, 0xf9, 0x69, 0x8e, 0x26, 0x59, 0x26, 0xe4, 0xa7, 0x35, 0x09, 0xd7, 0x44, 0xbc, 0x0e, 0x9d, 0x88, 0x9f, 0x15, 0x68, 0x92, 0x65, 0x22, 0x7e, 0xa6,
0x0a, 0xc5, 0xed, 0xc0, 0x66, 0x71, 0x1a, 0x49, 0xc0, 0xf7, 0x6a, 0xd0, 0x7c, 0x92, 0xf8, 0x61, 0x50, 0xdc, 0x1e, 0x6c, 0x97, 0xa7, 0x91, 0x04, 0x7c, 0xaf, 0x01, 0xed, 0x47, 0xa9, 0x1f, 0x65,
0xea, 0xf7, 0x91, 0x8b, 0x59, 0x07, 0x16, 0xb3, 0x17, 0xbd, 0x63, 0x3f, 0x3d, 0xa6, 0xe9, 0x1a, 0xfe, 0x10, 0xb9, 0x98, 0xf5, 0x60, 0x39, 0x7f, 0x3a, 0x38, 0xf1, 0xb3, 0x13, 0x9a, 0xae, 0xe5,
0x9e, 0x6a, 0xb2, 0x4d, 0x58, 0xf0, 0xc7, 0xd1, 0x24, 0xcc, 0x68, 0x82, 0x39, 0x4f, 0xb6, 0xd8, 0xa9, 0x26, 0xdb, 0x86, 0x25, 0x7f, 0x12, 0x4f, 0xa3, 0x9c, 0x26, 0x58, 0xf0, 0x64, 0x8b, 0xbd,
0x3b, 0xb0, 0x16, 0x4e, 0xc6, 0xbd, 0x7e, 0x14, 0x1e, 0x05, 0xc9, 0x58, 0xc8, 0x02, 0x9d, 0xd7, 0x01, 0x1b, 0xd1, 0x74, 0x32, 0x18, 0xc6, 0xd1, 0x71, 0x90, 0x4e, 0x84, 0x2c, 0xd0, 0x79, 0x2d,
0xbc, 0x57, 0xee, 0x60, 0x97, 0x00, 0x0e, 0x71, 0x1f, 0xc4, 0x14, 0x75, 0x9a, 0xc2, 0x80, 0x30, 0x7a, 0xd5, 0x0e, 0x76, 0x19, 0xe0, 0x08, 0xf7, 0x41, 0x4c, 0xd1, 0xa4, 0x29, 0x0c, 0x08, 0x73,
0x17, 0x5a, 0xb2, 0xc5, 0x83, 0xe1, 0x71, 0xd6, 0x99, 0xa7, 0x81, 0x2c, 0x18, 0x8e, 0x91, 0x05, 0xa1, 0x23, 0x5b, 0x3c, 0x18, 0x9f, 0xe4, 0xbd, 0x45, 0x1a, 0xc8, 0x82, 0xe1, 0x18, 0x79, 0x30,
0x63, 0xde, 0x4b, 0x33, 0x7f, 0x1c, 0x77, 0x16, 0x88, 0x1a, 0x03, 0x42, 0xfd, 0x51, 0xe6, 0x8f, 0xe1, 0x83, 0x2c, 0xf7, 0x27, 0x49, 0x6f, 0x89, 0xa8, 0x31, 0x20, 0xd4, 0x1f, 0xe7, 0x7e, 0x38,
0x7a, 0x47, 0x9c, 0xa7, 0x9d, 0x45, 0xd9, 0xaf, 0x21, 0xec, 0x93, 0xd0, 0x1e, 0xf0, 0x34, 0xeb, 0x38, 0xe6, 0x3c, 0xeb, 0x2d, 0xcb, 0x7e, 0x0d, 0x61, 0x9f, 0x84, 0xee, 0x88, 0x67, 0xf9, 0xc0,
0xf9, 0x83, 0x41, 0xc2, 0xd3, 0x94, 0xa7, 0x9d, 0x25, 0xe2, 0xc6, 0x02, 0x14, 0x77, 0xed, 0x21, 0x1f, 0x8d, 0x52, 0x9e, 0x65, 0x3c, 0xeb, 0xad, 0x10, 0x37, 0x96, 0xa0, 0xb8, 0x6b, 0xf7, 0x79,
0xcf, 0x8c, 0xdd, 0x49, 0xe5, 0xe9, 0xb8, 0x8f, 0x80, 0x19, 0xe0, 0x7b, 0x3c, 0xf3, 0x83, 0x51, 0x6e, 0xec, 0x4e, 0x26, 0x4f, 0xc7, 0x7d, 0x00, 0xcc, 0x00, 0xdf, 0xe5, 0xb9, 0x1f, 0x84, 0x19,
0xca, 0xde, 0x83, 0x56, 0x66, 0x20, 0x93, 0xf4, 0x35, 0x77, 0xd9, 0x75, 0x52, 0x1b, 0xd7, 0x8d, 0x7b, 0x0b, 0x3a, 0xb9, 0x81, 0x4c, 0xd2, 0xd7, 0xde, 0x63, 0x37, 0x48, 0x6d, 0xdc, 0x30, 0x3e,
0x0f, 0x3c, 0x0b, 0xcf, 0xfd, 0x6f, 0x07, 0x9a, 0x07, 0x3c, 0xd4, 0x67, 0xcf, 0xa0, 0x8e, 0x94, 0xf0, 0x2c, 0x3c, 0xf7, 0x8f, 0x1b, 0xd0, 0x3e, 0xe4, 0x91, 0x3e, 0x7b, 0x06, 0x4d, 0xa4, 0x44,
0xc8, 0xf3, 0xa6, 0xdf, 0xec, 0x2d, 0x68, 0x12, 0x75, 0x69, 0x96, 0x04, 0xe1, 0x90, 0x8e, 0xa0, 0x9e, 0x37, 0xfd, 0x66, 0xaf, 0x41, 0x9b, 0xa8, 0xcb, 0xf2, 0x34, 0x88, 0xc6, 0x74, 0x04, 0x2d,
0xe1, 0x01, 0x82, 0x0e, 0x08, 0xc2, 0x56, 0x61, 0xce, 0x1f, 0x67, 0xb4, 0xf1, 0x73, 0x1e, 0xfe, 0x0f, 0x10, 0x74, 0x48, 0x10, 0xb6, 0x0e, 0x0b, 0xfe, 0x24, 0xa7, 0x8d, 0x5f, 0xf0, 0xf0, 0x27,
0x44, 0xbe, 0x88, 0xfd, 0xe9, 0x18, 0x59, 0x48, 0x6f, 0x76, 0xcb, 0x6b, 0x4a, 0xd8, 0x1e, 0xee, 0xf2, 0x45, 0xe2, 0xcf, 0x26, 0xc8, 0x42, 0x7a, 0xb3, 0x3b, 0x5e, 0x5b, 0xc2, 0xf6, 0x71, 0xb7,
0xf6, 0x75, 0x58, 0x37, 0x51, 0xd4, 0xe8, 0xf3, 0x34, 0xfa, 0x9a, 0x81, 0x29, 0x27, 0xb9, 0x0a, 0x6f, 0xc0, 0xa6, 0x89, 0xa2, 0x46, 0x5f, 0xa4, 0xd1, 0x37, 0x0c, 0x4c, 0x39, 0xc9, 0x35, 0x58,
0x2b, 0x0a, 0x3f, 0x11, 0xc4, 0xd2, 0xf6, 0x37, 0xbc, 0xb6, 0x04, 0xab, 0x25, 0x5c, 0x83, 0xd5, 0x53, 0xf8, 0xa9, 0x20, 0x96, 0xb6, 0xbf, 0xe5, 0x75, 0x25, 0x58, 0x2d, 0xe1, 0x3a, 0xac, 0x1f,
0xa3, 0x20, 0xf4, 0x47, 0xbd, 0xfe, 0x28, 0x3b, 0xe9, 0x0d, 0xf8, 0x28, 0xf3, 0xe9, 0x20, 0xe6, 0x07, 0x91, 0x1f, 0x0e, 0x86, 0x61, 0x7e, 0x3a, 0x18, 0xf1, 0x30, 0xf7, 0xe9, 0x20, 0x16, 0xbd,
0xbd, 0x36, 0xc1, 0xef, 0x8e, 0xb2, 0x93, 0x7b, 0x08, 0x75, 0xbf, 0xeb, 0x40, 0x4b, 0x2c, 0x5e, 0x2e, 0xc1, 0xef, 0x84, 0xf9, 0xe9, 0x5d, 0x84, 0xb2, 0x4b, 0xd0, 0x3a, 0xe6, 0x7c, 0x10, 0x06,
0xea, 0xb2, 0x2b, 0xb0, 0xac, 0xe6, 0xe0, 0x49, 0x12, 0x25, 0x92, 0x0f, 0x6d, 0x20, 0xdb, 0x86, 0x93, 0x20, 0xef, 0xad, 0x10, 0xf5, 0x05, 0xc0, 0xfd, 0xae, 0x03, 0x1d, 0xb1, 0x35, 0x52, 0xd3,
0x55, 0x05, 0x88, 0x13, 0x1e, 0x8c, 0xfd, 0x21, 0x97, 0x8c, 0x5f, 0x82, 0xb3, 0xdd, 0x7c, 0xc4, 0x5d, 0x85, 0x55, 0x45, 0x01, 0x4f, 0xd3, 0x38, 0x95, 0x5c, 0x6a, 0x03, 0xd9, 0x0e, 0xac, 0x2b,
0x24, 0x9a, 0x64, 0x42, 0x9b, 0x34, 0x77, 0x5b, 0xf2, 0x60, 0x3c, 0x84, 0x79, 0x36, 0x8a, 0xfb, 0x40, 0x92, 0xf2, 0x60, 0xe2, 0x8f, 0xb9, 0x14, 0x8b, 0x0a, 0x9c, 0xed, 0x15, 0x23, 0xa6, 0xf1,
0x1d, 0x07, 0x18, 0x92, 0xf5, 0x24, 0x12, 0xdd, 0x72, 0x5d, 0xc5, 0x3d, 0x75, 0xce, 0xbc, 0xa7, 0x34, 0x17, 0xba, 0xa6, 0xbd, 0xd7, 0x91, 0xc7, 0xe6, 0x21, 0xcc, 0xb3, 0x51, 0xdc, 0xef, 0x38,
0xb5, 0x59, 0x7b, 0x7a, 0x05, 0x16, 0x68, 0x4a, 0x14, 0x9a, 0xb9, 0x12, 0x59, 0xb2, 0xcf, 0xfd, 0xc0, 0x90, 0xac, 0x47, 0xb1, 0xe8, 0x96, 0xab, 0x2e, 0xef, 0xb8, 0xf3, 0xd2, 0x3b, 0xde, 0x98,
0xbe, 0x03, 0x2d, 0x14, 0xe1, 0x90, 0x8f, 0xf6, 0xa3, 0x20, 0xcc, 0xd8, 0x0d, 0x60, 0x47, 0x93, 0xb7, 0xe3, 0x57, 0x61, 0x89, 0xa6, 0x44, 0x91, 0x5a, 0xa8, 0x90, 0x25, 0xfb, 0xdc, 0xef, 0x3b,
0x70, 0x10, 0x84, 0xc3, 0x5e, 0xf6, 0x22, 0x18, 0xf4, 0x0e, 0xa7, 0x38, 0x04, 0xd1, 0xb3, 0x77, 0xd0, 0x41, 0x01, 0x8f, 0x78, 0x78, 0x10, 0x07, 0x51, 0xce, 0x6e, 0x02, 0x3b, 0x9e, 0x46, 0xa3,
0xce, 0xab, 0xe8, 0x63, 0xef, 0xc0, 0xaa, 0x05, 0x4d, 0xb3, 0x44, 0x50, 0xb5, 0x77, 0xce, 0x2b, 0x20, 0x1a, 0x0f, 0xf2, 0xa7, 0xc1, 0x68, 0x70, 0x34, 0xc3, 0x21, 0x88, 0x9e, 0xfd, 0x73, 0x5e,
0xf5, 0xa0, 0x20, 0x46, 0x93, 0x2c, 0x9e, 0x64, 0xbd, 0x20, 0x1c, 0xf0, 0x17, 0xb4, 0x67, 0xcb, 0x4d, 0x1f, 0x7b, 0x03, 0xd6, 0x2d, 0x68, 0x96, 0xa7, 0x82, 0xaa, 0xfd, 0x73, 0x5e, 0xa5, 0x07,
0x9e, 0x05, 0xbb, 0xd3, 0x86, 0x96, 0xf9, 0x9d, 0xfb, 0x79, 0x58, 0x7d, 0x84, 0x12, 0x1a, 0x06, 0xc5, 0x34, 0x9e, 0xe6, 0xc9, 0x34, 0x1f, 0x04, 0xd1, 0x88, 0x3f, 0xa5, 0x3d, 0x5b, 0xf5, 0x2c,
0xe1, 0xf0, 0xb6, 0x10, 0x23, 0x54, 0x1b, 0xf1, 0xe4, 0xf0, 0x39, 0x9f, 0xca, 0x73, 0x94, 0x2d, 0xd8, 0xed, 0x2e, 0x74, 0xcc, 0xef, 0xdc, 0xcf, 0xc3, 0xfa, 0x03, 0x94, 0xdf, 0x28, 0x88, 0xc6,
0x64, 0xf2, 0xe3, 0x28, 0xcd, 0xe4, 0xbe, 0xd0, 0x6f, 0xf7, 0x9f, 0x1d, 0x58, 0xc1, 0x4d, 0xff, 0xb7, 0x84, 0x90, 0xa1, 0x52, 0x49, 0xa6, 0x47, 0x4f, 0xf8, 0x4c, 0x9e, 0xa3, 0x6c, 0xa1, 0x08,
0xd0, 0x0f, 0xa7, 0x6a, 0xc7, 0x1f, 0x41, 0x0b, 0x87, 0x7a, 0x12, 0xdd, 0x16, 0xca, 0x47, 0x08, 0x9c, 0xc4, 0x59, 0x2e, 0xf7, 0x85, 0x7e, 0xbb, 0xff, 0xe2, 0xc0, 0x1a, 0x6e, 0xfa, 0x07, 0x7e,
0xd5, 0x35, 0xb9, 0x49, 0x05, 0xec, 0xeb, 0x26, 0x2a, 0xde, 0x97, 0x53, 0xcf, 0xfa, 0x1a, 0xc5, 0x34, 0x53, 0x3b, 0xfe, 0x00, 0x3a, 0x38, 0xd4, 0xa3, 0xf8, 0x96, 0x50, 0x4d, 0x42, 0xe4, 0xae,
0x28, 0xf3, 0x93, 0x21, 0xcf, 0x48, 0x2d, 0x49, 0x35, 0x05, 0x02, 0x74, 0x37, 0x0a, 0x8f, 0xd8, 0xcb, 0x4d, 0x2a, 0x61, 0xdf, 0x30, 0x51, 0xf1, 0x36, 0x9d, 0x79, 0xd6, 0xd7, 0x28, 0x64, 0xb9,
0x65, 0x68, 0xa5, 0x7e, 0xd6, 0x8b, 0x79, 0x42, 0xbb, 0x46, 0xa2, 0x30, 0xe7, 0x41, 0xea, 0x67, 0x9f, 0x8e, 0x79, 0x4e, 0x4a, 0x4b, 0x2a, 0x31, 0x10, 0xa0, 0x3b, 0x71, 0x74, 0xcc, 0xae, 0x40,
0xfb, 0x3c, 0xb9, 0x33, 0xcd, 0x78, 0xf7, 0x0b, 0xb0, 0x56, 0x9a, 0x05, 0xa5, 0x2f, 0x5f, 0x22, 0x27, 0xf3, 0xf3, 0x41, 0xc2, 0x53, 0xda, 0x35, 0x12, 0x94, 0x05, 0x0f, 0x32, 0x3f, 0x3f, 0xe0,
0xfe, 0x64, 0x1b, 0x30, 0x7f, 0xe2, 0x8f, 0x26, 0x5c, 0x6a, 0x4b, 0xd1, 0xb8, 0x59, 0x7b, 0xdf, 0xe9, 0xed, 0x59, 0xce, 0xfb, 0x5f, 0x80, 0x8d, 0xca, 0x2c, 0x28, 0x9b, 0xc5, 0x12, 0xf1, 0x27,
0x71, 0x3f, 0x09, 0xab, 0x39, 0xd9, 0x92, 0xe9, 0x19, 0xd4, 0x71, 0x07, 0xe5, 0x00, 0xf4, 0xdb, 0xdb, 0x82, 0xc5, 0x53, 0x3f, 0x9c, 0x72, 0xa9, 0x4b, 0x45, 0xe3, 0x9d, 0xc6, 0xdb, 0x8e, 0xfb,
0xfd, 0x2d, 0x47, 0x20, 0xde, 0x8d, 0x02, 0xad, 0x79, 0x10, 0x11, 0x15, 0x94, 0x42, 0xc4, 0xdf, 0x49, 0x58, 0x2f, 0xc8, 0x96, 0x4c, 0xcf, 0xa0, 0x89, 0x3b, 0x28, 0x07, 0xa0, 0xdf, 0xee, 0x6f,
0x33, 0x35, 0xf3, 0x4f, 0xbf, 0x58, 0xf7, 0x2a, 0xac, 0x19, 0x24, 0xbc, 0x82, 0xd8, 0xef, 0x38, 0x39, 0x02, 0xf1, 0x4e, 0x1c, 0x68, 0xbd, 0x84, 0x88, 0xa8, 0xbe, 0x14, 0x22, 0xfe, 0x9e, 0xab,
0xb0, 0xf6, 0x98, 0x9f, 0xca, 0x53, 0x57, 0xd4, 0xbe, 0x0f, 0xf5, 0x6c, 0x1a, 0x0b, 0x6b, 0xa7, 0xb7, 0x7f, 0xfa, 0xc5, 0xba, 0xd7, 0x60, 0xc3, 0x20, 0xe1, 0x39, 0xc4, 0x7e, 0xc7, 0x81, 0x8d,
0xbd, 0x7b, 0x45, 0x1e, 0x5a, 0x09, 0xef, 0xba, 0x6c, 0x3e, 0x99, 0xc6, 0xdc, 0xa3, 0x2f, 0xdc, 0x87, 0xfc, 0x4c, 0x9e, 0xba, 0xa2, 0xf6, 0x6d, 0x68, 0xe6, 0xb3, 0x44, 0xd8, 0x42, 0xdd, 0xbd,
0xcf, 0x43, 0xd3, 0x00, 0xb2, 0x2d, 0x58, 0x7f, 0xf6, 0xc1, 0x93, 0xc7, 0xf7, 0x0f, 0x0e, 0x7a, 0xab, 0xf2, 0xd0, 0x2a, 0x78, 0x37, 0x64, 0xf3, 0xd1, 0x2c, 0xe1, 0x1e, 0x7d, 0xe1, 0x7e, 0x1e,
0xfb, 0x4f, 0xef, 0x7c, 0xe9, 0xfe, 0xaf, 0xf6, 0xf6, 0x6e, 0x1f, 0xec, 0xad, 0x9e, 0x63, 0x9b, 0xda, 0x06, 0x90, 0x5d, 0x80, 0xcd, 0xc7, 0xef, 0x3f, 0x7a, 0x78, 0xef, 0xf0, 0x70, 0x70, 0xf0,
0xc0, 0x1e, 0xdf, 0x3f, 0x78, 0x72, 0xff, 0x9e, 0x05, 0x77, 0xdc, 0x2e, 0x74, 0x1e, 0xf3, 0xd3, 0xe1, 0xed, 0x2f, 0xdd, 0xfb, 0xd5, 0xc1, 0xfe, 0xad, 0xc3, 0xfd, 0xf5, 0x73, 0x6c, 0x1b, 0xd8,
0x67, 0x41, 0x16, 0xf2, 0x34, 0xb5, 0x67, 0x73, 0xaf, 0x03, 0x33, 0x49, 0x90, 0xab, 0xea, 0xc0, 0xc3, 0x7b, 0x87, 0x8f, 0xee, 0xdd, 0xb5, 0xe0, 0x8e, 0xdb, 0x87, 0xde, 0x43, 0x7e, 0xf6, 0x38,
0xa2, 0x54, 0xfd, 0xea, 0xe6, 0x93, 0x4d, 0xf7, 0x93, 0xc0, 0x0e, 0x82, 0x61, 0xf8, 0x21, 0x4f, 0xc8, 0x23, 0x9e, 0x65, 0xf6, 0x6c, 0xee, 0x0d, 0x60, 0x26, 0x09, 0x72, 0x55, 0x3d, 0x58, 0x96,
0x53, 0x7f, 0xa8, 0x55, 0xc1, 0x2a, 0xcc, 0x8d, 0xd3, 0xa1, 0xd4, 0x00, 0xf8, 0xd3, 0xfd, 0x34, 0x17, 0x83, 0xba, 0x17, 0x65, 0xd3, 0xfd, 0x24, 0xb0, 0xc3, 0x60, 0x1c, 0x7d, 0xc0, 0xb3, 0xcc,
0xac, 0x5b, 0x78, 0x72, 0xe0, 0x8b, 0xd0, 0x48, 0x83, 0x61, 0xe8, 0x67, 0x93, 0x84, 0xcb, 0xa1, 0x1f, 0x6b, 0x55, 0xb0, 0x0e, 0x0b, 0x93, 0x6c, 0x2c, 0x35, 0x00, 0xfe, 0x74, 0x3f, 0x0d, 0x9b,
0x73, 0x80, 0xfb, 0x00, 0x36, 0xbe, 0xca, 0x93, 0xe0, 0x68, 0xfa, 0xba, 0xe1, 0xed, 0x71, 0x6a, 0x16, 0x9e, 0x1c, 0xf8, 0x12, 0xb4, 0xb2, 0x60, 0x1c, 0xf9, 0xf9, 0x34, 0xe5, 0x72, 0xe8, 0x02,
0xc5, 0x71, 0xee, 0xc3, 0xf9, 0xc2, 0x38, 0x72, 0x7a, 0xc1, 0x88, 0xf2, 0xb8, 0x96, 0x3c, 0xd1, 0xe0, 0xbe, 0x07, 0x5b, 0x5f, 0xe5, 0x69, 0x70, 0x3c, 0x7b, 0xd1, 0xf0, 0xf6, 0x38, 0x8d, 0xf2,
0x30, 0xc4, 0xb2, 0x66, 0x8a, 0xa5, 0xfb, 0x14, 0xd8, 0xdd, 0x28, 0x0c, 0x79, 0x3f, 0xdb, 0xe7, 0x38, 0xf7, 0xe0, 0x7c, 0x69, 0x1c, 0x39, 0xbd, 0x60, 0x44, 0x79, 0x5c, 0x2b, 0x9e, 0x68, 0x18,
0x3c, 0xc9, 0x4d, 0xd8, 0x9c, 0xeb, 0x9a, 0xbb, 0x5b, 0xf2, 0x1c, 0x8b, 0xb2, 0x2e, 0xd9, 0x91, 0x62, 0xd9, 0x30, 0xc5, 0xd2, 0xfd, 0x10, 0xd8, 0x9d, 0x38, 0x8a, 0xf8, 0x30, 0x3f, 0xe0, 0x3c,
0x41, 0x3d, 0xe6, 0xc9, 0x98, 0x06, 0x5e, 0xf2, 0xe8, 0xb7, 0x7b, 0x1e, 0xd6, 0xad, 0x61, 0xa5, 0x2d, 0x0c, 0xdc, 0x82, 0xeb, 0xda, 0x7b, 0x17, 0xe4, 0x39, 0x96, 0x65, 0x5d, 0xb2, 0x23, 0x83,
0xf5, 0xf1, 0x2e, 0x9c, 0xbf, 0x17, 0xa4, 0xfd, 0xf2, 0x84, 0x1d, 0x58, 0x8c, 0x27, 0x87, 0xbd, 0x66, 0xc2, 0xd3, 0x09, 0x0d, 0xbc, 0xe2, 0xd1, 0x6f, 0xf7, 0x3c, 0x6c, 0x5a, 0xc3, 0x4a, 0xdb,
0x5c, 0xa6, 0x54, 0x13, 0x2f, 0xe5, 0xe2, 0x27, 0x72, 0xb0, 0xdf, 0x73, 0xa0, 0xbe, 0xf7, 0xe4, 0xe4, 0x4d, 0x38, 0x7f, 0x37, 0xc8, 0x86, 0xd5, 0x09, 0x7b, 0xb0, 0x9c, 0x4c, 0x8f, 0x06, 0x85,
0xd1, 0x5d, 0xd6, 0x85, 0xa5, 0x20, 0xec, 0x47, 0x63, 0x54, 0xbb, 0x62, 0xd1, 0xba, 0x3d, 0x53, 0x4c, 0xa9, 0x26, 0x5e, 0xd9, 0xe5, 0x4f, 0xe4, 0x60, 0xbf, 0xe7, 0x40, 0x73, 0xff, 0xd1, 0x83,
0x56, 0x2e, 0x42, 0x83, 0xb4, 0x35, 0xda, 0x19, 0xd2, 0xda, 0xcc, 0x01, 0x68, 0xe3, 0xf0, 0x17, 0x3b, 0xac, 0x0f, 0x2b, 0x41, 0x34, 0x8c, 0x27, 0xa8, 0x76, 0xc5, 0xa2, 0x75, 0x7b, 0xae, 0xac,
0x71, 0x90, 0x90, 0x11, 0xa3, 0x4c, 0x93, 0x3a, 0x69, 0xc4, 0x72, 0x87, 0xfb, 0x3f, 0x75, 0x58, 0x5c, 0x82, 0x16, 0x69, 0x6b, 0xb4, 0x42, 0xa4, 0x2d, 0x5a, 0x00, 0xd0, 0x02, 0xe2, 0x4f, 0x93,
0x94, 0xba, 0x9a, 0xe6, 0xeb, 0x67, 0xc1, 0x09, 0x97, 0x94, 0xc8, 0x16, 0xde, 0x72, 0x09, 0x1f, 0x20, 0x25, 0x13, 0x47, 0x19, 0x2e, 0x4d, 0xd2, 0x88, 0xd5, 0x0e, 0xf7, 0x7f, 0x9a, 0xb0, 0x2c,
0x47, 0x19, 0xef, 0x59, 0xc7, 0x60, 0x03, 0x11, 0xab, 0x2f, 0x06, 0xea, 0xc5, 0xa8, 0xf5, 0x89, 0x75, 0x35, 0xcd, 0x37, 0xcc, 0x83, 0x53, 0x2e, 0x29, 0x91, 0x2d, 0xbc, 0xe5, 0x52, 0x3e, 0x89,
0xb2, 0x86, 0x67, 0x03, 0x71, 0xb3, 0x10, 0xd0, 0x0b, 0x06, 0x44, 0x53, 0xdd, 0x53, 0x4d, 0xdc, 0x73, 0x3e, 0xb0, 0x8e, 0xc1, 0x06, 0x22, 0xd6, 0x50, 0x0c, 0x34, 0x48, 0x50, 0xeb, 0x13, 0x65,
0x89, 0xbe, 0x1f, 0xfb, 0xfd, 0x20, 0x9b, 0x4a, 0xe1, 0xd6, 0x6d, 0x1c, 0x7b, 0x14, 0xf5, 0xfd, 0x2d, 0xcf, 0x06, 0xe2, 0x66, 0x21, 0x60, 0x10, 0x8c, 0x88, 0xa6, 0xa6, 0xa7, 0x9a, 0xb8, 0x13,
0x51, 0xef, 0xd0, 0x1f, 0xf9, 0x61, 0x9f, 0x4b, 0x43, 0xca, 0x06, 0xa2, 0xad, 0x24, 0x49, 0x52, 0x43, 0x3f, 0xf1, 0x87, 0x41, 0x3e, 0x93, 0xc2, 0xad, 0xdb, 0x38, 0x76, 0x18, 0x0f, 0xfd, 0x70,
0x68, 0xc2, 0x9e, 0x2a, 0x40, 0xd1, 0xe6, 0xea, 0x47, 0xe3, 0x71, 0x90, 0xa1, 0x89, 0xd5, 0x59, 0x70, 0xe4, 0x87, 0x7e, 0x34, 0xe4, 0xd2, 0xcc, 0xb2, 0x81, 0x68, 0x49, 0x49, 0x92, 0x14, 0x9a,
0x12, 0x8a, 0x24, 0x87, 0xd0, 0x4a, 0x44, 0xeb, 0x54, 0xec, 0x5e, 0x43, 0xcc, 0x66, 0x01, 0x71, 0xb0, 0xb6, 0x4a, 0x50, 0xb4, 0xc8, 0x86, 0xf1, 0x64, 0x12, 0xe4, 0x68, 0x80, 0xc9, 0x5b, 0xde,
0x94, 0x23, 0xce, 0x49, 0x21, 0x3d, 0x3f, 0xed, 0x80, 0x18, 0x25, 0x87, 0xe0, 0x39, 0x4c, 0xc2, 0x80, 0xd0, 0x4a, 0x44, 0xeb, 0x4c, 0xec, 0x5e, 0x4b, 0xcc, 0x66, 0x01, 0x71, 0x14, 0xb4, 0x0c,
0x94, 0x67, 0xd9, 0x88, 0x0f, 0x34, 0x41, 0x4d, 0x42, 0x2b, 0x77, 0xb0, 0x1b, 0xb0, 0x2e, 0xac, 0x50, 0x21, 0x3d, 0x39, 0xeb, 0x81, 0x18, 0xa5, 0x80, 0xe0, 0x39, 0x4c, 0xa3, 0x8c, 0xe7, 0x79,
0xbe, 0xd4, 0xcf, 0xa2, 0xf4, 0x38, 0x48, 0x7b, 0x29, 0x0f, 0xb3, 0x4e, 0x8b, 0xf0, 0xab, 0xba, 0xc8, 0x47, 0x9a, 0xa0, 0x36, 0xa1, 0x55, 0x3b, 0xd8, 0x4d, 0xd8, 0x14, 0x36, 0x61, 0xe6, 0xe7,
0xd8, 0xfb, 0xb0, 0x55, 0x00, 0x27, 0xbc, 0xcf, 0x83, 0x13, 0x3e, 0xe8, 0x2c, 0xd3, 0x57, 0xb3, 0x71, 0x76, 0x12, 0x64, 0x83, 0x8c, 0x47, 0x79, 0xaf, 0x43, 0xf8, 0x75, 0x5d, 0xec, 0x6d, 0xb8,
0xba, 0xd9, 0x65, 0x68, 0xa2, 0xb1, 0x3b, 0x89, 0x07, 0x3e, 0xde, 0xc3, 0x6d, 0x3a, 0x07, 0x13, 0x50, 0x02, 0xa7, 0x7c, 0xc8, 0x83, 0x53, 0x3e, 0xea, 0xad, 0xd2, 0x57, 0xf3, 0xba, 0xd9, 0x15,
0xc4, 0xde, 0x85, 0xe5, 0x98, 0x8b, 0xcb, 0xf2, 0x38, 0x1b, 0xf5, 0xd3, 0xce, 0x0a, 0xdd, 0x64, 0x68, 0xa3, 0x29, 0x3c, 0x4d, 0x46, 0x3e, 0xde, 0xc3, 0x5d, 0x3a, 0x07, 0x13, 0xc4, 0xde, 0x84,
0x4d, 0x29, 0x4c, 0xc8, 0xb9, 0x9e, 0x8d, 0x81, 0x4c, 0xd9, 0x4f, 0xc9, 0x7c, 0xf2, 0xa7, 0x9d, 0xd5, 0x84, 0x8b, 0xcb, 0xf2, 0x24, 0x0f, 0x87, 0x59, 0x6f, 0x8d, 0x6e, 0xb2, 0xb6, 0x14, 0x26,
0x55, 0x62, 0xb7, 0x1c, 0x40, 0x32, 0x92, 0x04, 0x27, 0x7e, 0xc6, 0x3b, 0x6b, 0xc4, 0x5b, 0xaa, 0xe4, 0x5c, 0xcf, 0xc6, 0x40, 0xa6, 0x1c, 0x66, 0x64, 0x5c, 0xf9, 0xb3, 0xde, 0x3a, 0xb1, 0x5b,
0xe9, 0xfe, 0x99, 0x03, 0xeb, 0x8f, 0x82, 0x34, 0x93, 0x4c, 0xa8, 0xd5, 0xf1, 0x5b, 0xd0, 0x14, 0x01, 0x20, 0x19, 0x49, 0x83, 0x53, 0x3f, 0xe7, 0xbd, 0x0d, 0xe2, 0x2d, 0xd5, 0x74, 0xff, 0xcc,
0xec, 0xd7, 0x8b, 0xc2, 0xd1, 0x54, 0x72, 0x24, 0x08, 0xd0, 0x97, 0xc3, 0xd1, 0x94, 0x7d, 0x02, 0x81, 0xcd, 0x07, 0x41, 0x96, 0x4b, 0x26, 0xd4, 0xea, 0xf8, 0x35, 0x68, 0x0b, 0xf6, 0x1b, 0xc4,
0x96, 0x83, 0xd0, 0x44, 0x11, 0x32, 0xdc, 0x52, 0x40, 0x42, 0x7a, 0x0b, 0x9a, 0xf1, 0xe4, 0x70, 0x51, 0x38, 0x93, 0x1c, 0x09, 0x02, 0xf4, 0xe5, 0x28, 0x9c, 0xb1, 0x4f, 0xc0, 0x6a, 0x10, 0x99,
0x14, 0xf4, 0x05, 0xca, 0x9c, 0x18, 0x45, 0x80, 0x08, 0x01, 0x8d, 0x24, 0x41, 0x89, 0xc0, 0xa8, 0x28, 0x42, 0x86, 0x3b, 0x0a, 0x48, 0x48, 0xaf, 0x41, 0x3b, 0x99, 0x1e, 0x85, 0xc1, 0x50, 0xa0,
0x13, 0x46, 0x53, 0xc2, 0x10, 0xc5, 0xbd, 0x03, 0x1b, 0x36, 0x81, 0x52, 0x59, 0x6d, 0xc3, 0x92, 0x2c, 0x88, 0x51, 0x04, 0x88, 0x10, 0xd0, 0x48, 0x12, 0x94, 0x08, 0x8c, 0x26, 0x61, 0xb4, 0x25,
0xe4, 0xed, 0xb4, 0xd3, 0xa4, 0xfd, 0x69, 0xcb, 0xfd, 0x91, 0xa8, 0x9e, 0xee, 0x77, 0xff, 0xdd, 0x0c, 0x51, 0xdc, 0xdb, 0xb0, 0x65, 0x13, 0x28, 0x95, 0xd5, 0x0e, 0xac, 0x48, 0xde, 0xce, 0x7a,
0x81, 0x3a, 0x2a, 0x80, 0xd9, 0xca, 0xc2, 0xd4, 0xe9, 0x73, 0x96, 0x4e, 0x27, 0x3f, 0x04, 0xad, 0x6d, 0xda, 0x9f, 0xae, 0xdc, 0x1f, 0x89, 0xea, 0xe9, 0x7e, 0xf7, 0x3f, 0x1c, 0x68, 0xa2, 0x02,
0x22, 0xc1, 0x12, 0x42, 0x6c, 0x0c, 0x48, 0xde, 0x9f, 0xf0, 0xfe, 0x09, 0xc9, 0x8e, 0xee, 0x47, 0x98, 0xaf, 0x2c, 0x4c, 0x9d, 0xbe, 0x60, 0xe9, 0x74, 0xf2, 0x52, 0xd0, 0x2a, 0x12, 0x2c, 0x21,
0x08, 0x4a, 0x16, 0x5e, 0x9d, 0xf4, 0xb5, 0x10, 0x1c, 0xdd, 0x56, 0x7d, 0xf4, 0xe5, 0x62, 0xde, 0xc4, 0xc6, 0x80, 0x14, 0xfd, 0x29, 0x1f, 0x9e, 0x92, 0xec, 0xe8, 0x7e, 0x84, 0xa0, 0x64, 0xe1,
0x47, 0xdf, 0x75, 0x60, 0x31, 0x08, 0x0f, 0xa3, 0x49, 0x38, 0x20, 0x21, 0x59, 0xf2, 0x54, 0x13, 0xd5, 0x49, 0x5f, 0x0b, 0xc1, 0xd1, 0x6d, 0xd5, 0x47, 0x5f, 0x2e, 0x17, 0x7d, 0xf4, 0x5d, 0x0f,
0x0f, 0x3b, 0x26, 0x4b, 0x2a, 0x18, 0x73, 0x29, 0x1d, 0x39, 0xc0, 0x65, 0x68, 0x5a, 0xa5, 0xa4, 0x96, 0x83, 0xe8, 0x28, 0x9e, 0x46, 0x23, 0x12, 0x92, 0x15, 0x4f, 0x35, 0xf1, 0xb0, 0x13, 0xb2,
0xf0, 0xf4, 0x3d, 0xf6, 0x1e, 0xac, 0x19, 0x30, 0xb9, 0x83, 0x6f, 0xc3, 0x7c, 0x8c, 0x00, 0x69, 0xa4, 0x82, 0x09, 0x97, 0xd2, 0x51, 0x00, 0x5c, 0x86, 0xa6, 0x55, 0x46, 0x0a, 0x4f, 0xdf, 0x63,
0x28, 0x29, 0xf6, 0x22, 0x4d, 0x29, 0x7a, 0xdc, 0x55, 0x68, 0x3f, 0xe4, 0xd9, 0x07, 0xe1, 0x51, 0x6f, 0xc1, 0x86, 0x01, 0x93, 0x3b, 0xf8, 0x3a, 0x2c, 0x26, 0x08, 0x90, 0x86, 0x92, 0x62, 0x2f,
0xa4, 0x46, 0xfa, 0xe1, 0x1c, 0xac, 0x68, 0x90, 0x1c, 0xe8, 0x1a, 0xac, 0x04, 0x03, 0x1e, 0x66, 0xd2, 0x94, 0xa2, 0xc7, 0x5d, 0x87, 0xee, 0x7d, 0x9e, 0xbf, 0x1f, 0x1d, 0xc7, 0x6a, 0xa4, 0x1f,
0x41, 0x36, 0xed, 0x59, 0x16, 0x5c, 0x11, 0x8c, 0x37, 0x8c, 0x3f, 0x0a, 0xfc, 0x54, 0xea, 0x30, 0x2e, 0xc0, 0x9a, 0x06, 0xc9, 0x81, 0xae, 0xc3, 0x5a, 0x30, 0xe2, 0x51, 0x1e, 0xe4, 0xb3, 0x81,
0xd1, 0x60, 0xbb, 0xb0, 0x81, 0xec, 0xaf, 0x38, 0x5a, 0x1f, 0xab, 0x30, 0x24, 0x2b, 0xfb, 0x50, 0x65, 0xc1, 0x95, 0xc1, 0x78, 0xc3, 0xf8, 0x61, 0xe0, 0x67, 0x52, 0x87, 0x89, 0x06, 0xdb, 0x83,
0x62, 0x11, 0x2e, 0x39, 0x50, 0x7f, 0x22, 0x34, 0x6d, 0x55, 0x17, 0xee, 0x9a, 0x18, 0x09, 0x97, 0x2d, 0x64, 0x7f, 0xc5, 0xd1, 0xfa, 0x58, 0x85, 0x21, 0x59, 0xdb, 0x87, 0x12, 0x8b, 0x70, 0xc9,
0x3c, 0x2f, 0x44, 0x44, 0x03, 0x4a, 0xde, 0xe4, 0x82, 0x30, 0x62, 0x8b, 0xde, 0xa4, 0xe1, 0x91, 0x81, 0xfa, 0x13, 0xa1, 0x69, 0xeb, 0xba, 0x70, 0xd7, 0xc4, 0x48, 0xb8, 0xe4, 0x45, 0x21, 0x22,
0x2e, 0x95, 0x3c, 0xd2, 0x6b, 0xb0, 0x92, 0x4e, 0xc3, 0x3e, 0x1f, 0xf4, 0xb2, 0x08, 0xe7, 0x0d, 0x1a, 0x50, 0xf1, 0x35, 0x97, 0x84, 0x11, 0x5b, 0xf6, 0x35, 0x0d, 0x7f, 0x75, 0xa5, 0xe2, 0xaf,
0x42, 0x3a, 0x9d, 0x25, 0xaf, 0x08, 0x26, 0xdf, 0x99, 0xa7, 0x59, 0xc8, 0x33, 0x52, 0x5d, 0x4b, 0x5e, 0x87, 0xb5, 0x6c, 0x16, 0x0d, 0xf9, 0x68, 0x90, 0xc7, 0x38, 0x6f, 0x10, 0xd1, 0xe9, 0xac,
0x9e, 0x6a, 0xe2, 0x2d, 0x40, 0x28, 0x82, 0xa9, 0x1b, 0x9e, 0x6c, 0xe1, 0x55, 0x39, 0x49, 0x82, 0x78, 0x65, 0x30, 0x79, 0xd6, 0x3c, 0xcb, 0x23, 0x9e, 0x93, 0xea, 0x5a, 0xf1, 0x54, 0x13, 0x6f,
0xb4, 0xd3, 0x22, 0x28, 0xfd, 0x66, 0x9f, 0x81, 0xf3, 0x87, 0xe8, 0xe9, 0x1d, 0x73, 0x7f, 0xc0, 0x01, 0x42, 0x11, 0x4c, 0xdd, 0xf2, 0x64, 0x0b, 0xaf, 0xca, 0x69, 0x1a, 0x64, 0xbd, 0x0e, 0x41,
0x13, 0x3a, 0x7d, 0xe1, 0xe8, 0x0a, 0x0d, 0x54, 0xdd, 0x89, 0x73, 0x9f, 0xf0, 0x24, 0x0d, 0xa2, 0xe9, 0x37, 0xfb, 0x0c, 0x9c, 0x3f, 0x42, 0x3f, 0xf0, 0x84, 0xfb, 0x23, 0x9e, 0xd2, 0xe9, 0x0b,
0x90, 0x74, 0x4f, 0xc3, 0x53, 0x4d, 0xf7, 0xdb, 0x74, 0xa3, 0x6b, 0x17, 0xfc, 0x29, 0xa9, 0x23, 0x37, 0x58, 0x68, 0xa0, 0xfa, 0x4e, 0x9c, 0xfb, 0x94, 0xa7, 0x59, 0x10, 0x47, 0xa4, 0x7b, 0x5a,
0xf6, 0x06, 0x34, 0xc4, 0x1a, 0xd3, 0x63, 0x5f, 0x1a, 0x19, 0x4b, 0x04, 0x38, 0x38, 0xf6, 0x51, 0x9e, 0x6a, 0xba, 0xdf, 0xa6, 0x1b, 0x5d, 0x3b, 0xe8, 0x1f, 0x92, 0x3a, 0x62, 0xaf, 0x40, 0x4b,
0x80, 0xad, 0x6d, 0x13, 0x31, 0x8d, 0x26, 0xc1, 0xf6, 0xc4, 0xae, 0x5d, 0x81, 0xb6, 0x72, 0xee, 0xac, 0x31, 0x3b, 0xf1, 0xa5, 0x91, 0xb1, 0x42, 0x80, 0xc3, 0x13, 0x1f, 0x05, 0xd8, 0xda, 0x36,
0xd3, 0xde, 0x88, 0x1f, 0x65, 0xca, 0x41, 0x08, 0x27, 0x63, 0x9c, 0x2e, 0x7d, 0xc4, 0x8f, 0x32, 0x11, 0xf1, 0x68, 0x13, 0x6c, 0x5f, 0xec, 0xda, 0x55, 0xe8, 0x2a, 0xd7, 0x3f, 0x1b, 0x84, 0xfc,
0xf7, 0x31, 0xac, 0x49, 0xb9, 0xfd, 0x72, 0xcc, 0xd5, 0xd4, 0x9f, 0x2b, 0x5e, 0x6a, 0xc2, 0xaa, 0x38, 0x57, 0x0e, 0x42, 0x34, 0x9d, 0xe0, 0x74, 0xd9, 0x03, 0x7e, 0x9c, 0xbb, 0x0f, 0x61, 0x43,
0x58, 0xb7, 0x05, 0x9d, 0xbc, 0x9c, 0xc2, 0x4d, 0xe7, 0x7a, 0xc0, 0x64, 0xf7, 0xdd, 0x51, 0x94, 0xca, 0xed, 0x97, 0x13, 0xae, 0xa6, 0xfe, 0x5c, 0xf9, 0x52, 0x13, 0x56, 0xc5, 0xa6, 0x2d, 0xe8,
0x72, 0x39, 0xa0, 0x0b, 0xad, 0xfe, 0x28, 0x4a, 0x95, 0x1b, 0x22, 0x97, 0x63, 0xc1, 0x70, 0x7f, 0xe4, 0xe5, 0x94, 0x6e, 0x3a, 0xd7, 0x03, 0x26, 0xbb, 0xef, 0x84, 0x71, 0xc6, 0xe5, 0x80, 0x2e,
0xd2, 0x49, 0xbf, 0x8f, 0x9a, 0x40, 0xe8, 0x34, 0xd5, 0x74, 0xff, 0xc2, 0x81, 0x75, 0x1a, 0x4d, 0x74, 0x86, 0x61, 0x9c, 0x29, 0x37, 0x44, 0x2e, 0xc7, 0x82, 0xe1, 0xfe, 0x64, 0xd3, 0xe1, 0x10,
0x69, 0x18, 0x6d, 0xbb, 0x9e, 0x9d, 0xcc, 0x56, 0xdf, 0x74, 0xcd, 0x36, 0x60, 0xfe, 0x28, 0x4a, 0x35, 0x81, 0xd0, 0x69, 0xaa, 0xe9, 0xfe, 0xa5, 0x03, 0x9b, 0x34, 0x9a, 0xd2, 0x30, 0xda, 0x76,
0xfa, 0x5c, 0xce, 0x24, 0x1a, 0x3f, 0xbe, 0x35, 0x5e, 0x2f, 0x59, 0xe3, 0x3f, 0x74, 0x60, 0x8d, 0x7d, 0x79, 0x32, 0x3b, 0x43, 0xd3, 0x35, 0xdb, 0x82, 0xc5, 0xe3, 0x38, 0x1d, 0x72, 0x39, 0x93,
0x48, 0x3d, 0xc8, 0xfc, 0x6c, 0x92, 0xca, 0xe5, 0xff, 0x22, 0x2c, 0xe3, 0x52, 0xb9, 0x12, 0x27, 0x68, 0xfc, 0xf8, 0xd6, 0x78, 0xb3, 0x62, 0x8d, 0xff, 0xd0, 0x81, 0x0d, 0x22, 0xf5, 0x30, 0xf7,
0x49, 0xe8, 0x86, 0x96, 0x7c, 0x82, 0x0a, 0xe4, 0xbd, 0x73, 0x9e, 0x8d, 0xcc, 0xbe, 0x00, 0x2d, 0xf3, 0x69, 0x26, 0x97, 0xff, 0x8b, 0xb0, 0x8a, 0x4b, 0xe5, 0x4a, 0x9c, 0x24, 0xa1, 0x5b, 0x5a,
0x33, 0x42, 0x43, 0x34, 0x37, 0x77, 0x2f, 0xa8, 0x55, 0x96, 0x38, 0x67, 0xef, 0x9c, 0x67, 0x7d, 0xf2, 0x09, 0x2a, 0x90, 0xf7, 0xcf, 0x79, 0x36, 0x32, 0xfb, 0x02, 0x74, 0xcc, 0xf8, 0x0d, 0xd1,
0xc0, 0x6e, 0x01, 0x90, 0xb9, 0x41, 0xc3, 0x4a, 0xd7, 0xfa, 0x82, 0xbd, 0x49, 0xc6, 0x61, 0xed, 0xdc, 0xde, 0xbb, 0xa8, 0x56, 0x59, 0xe1, 0x9c, 0xfd, 0x73, 0x9e, 0xf5, 0x01, 0x7b, 0x17, 0x80,
0x9d, 0xf3, 0x0c, 0xf4, 0x3b, 0x4b, 0xb0, 0x20, 0xee, 0x47, 0xf7, 0x21, 0x2c, 0x5b, 0x94, 0x5a, 0xcc, 0x0d, 0x1a, 0x56, 0xba, 0xd6, 0x17, 0xed, 0x4d, 0x32, 0x0e, 0x6b, 0xff, 0x9c, 0x67, 0xa0,
0x5e, 0x46, 0x4b, 0x78, 0x19, 0x25, 0xa7, 0xb4, 0x56, 0x76, 0x4a, 0xdd, 0x7f, 0xad, 0x01, 0x43, 0xdf, 0x5e, 0x81, 0x25, 0x71, 0x3f, 0xba, 0xf7, 0x61, 0xd5, 0xa2, 0xd4, 0xf2, 0x32, 0x3a, 0xc2,
0x6e, 0x2b, 0x1c, 0x27, 0x5e, 0xd0, 0xd1, 0xc0, 0x32, 0xb7, 0x5a, 0x9e, 0x09, 0x62, 0xd7, 0x81, 0xcb, 0xa8, 0x38, 0xa5, 0x8d, 0xaa, 0x53, 0xea, 0xfe, 0x5b, 0x03, 0x18, 0x72, 0x5b, 0xe9, 0x38,
0x19, 0x4d, 0xe5, 0xb7, 0x8b, 0x7b, 0xa3, 0xa2, 0x07, 0x15, 0x9c, 0xb0, 0x95, 0x94, 0x0f, 0x2c, 0xf1, 0x82, 0x8e, 0x47, 0x96, 0xb9, 0xd5, 0xf1, 0x4c, 0x10, 0xbb, 0x01, 0xcc, 0x68, 0x2a, 0xbf,
0x0d, 0x4b, 0x71, 0x6e, 0x95, 0x7d, 0x78, 0x35, 0xc4, 0x93, 0xf4, 0x18, 0x0d, 0x08, 0x65, 0x90, 0x5d, 0xdc, 0x1b, 0x35, 0x3d, 0xa8, 0xe0, 0x84, 0xad, 0xa4, 0x7c, 0x60, 0x69, 0x58, 0x8a, 0x73,
0xa9, 0x76, 0x91, 0x41, 0x16, 0x5e, 0xcb, 0x20, 0x8b, 0x45, 0x06, 0x31, 0x4d, 0x82, 0x25, 0xcb, 0xab, 0xed, 0xc3, 0xab, 0x21, 0x99, 0x66, 0x27, 0x68, 0x40, 0x28, 0x83, 0x4c, 0xb5, 0xcb, 0x0c,
0x24, 0x40, 0xfb, 0x6b, 0x1c, 0x84, 0x64, 0x57, 0xf4, 0xc6, 0x38, 0xbb, 0xb4, 0xbf, 0x2c, 0x20, 0xb2, 0xf4, 0x42, 0x06, 0x59, 0x2e, 0x33, 0x88, 0x69, 0x12, 0xac, 0x58, 0x26, 0x01, 0xda, 0x5f,
0xdb, 0x86, 0x55, 0x69, 0xd7, 0xe5, 0x76, 0x07, 0xd0, 0x1e, 0x97, 0xe0, 0xee, 0xc7, 0x0e, 0xac, 0x93, 0x20, 0x22, 0xbb, 0x62, 0x30, 0xc1, 0xd9, 0xa5, 0xfd, 0x65, 0x01, 0xd9, 0x0e, 0xac, 0x4b,
0xe2, 0x3e, 0x5b, 0xbc, 0x78, 0x13, 0x48, 0x14, 0xce, 0xc8, 0x8a, 0x16, 0xee, 0x4f, 0xcf, 0x89, 0xbb, 0xae, 0xb0, 0x3b, 0x80, 0xf6, 0xb8, 0x02, 0x77, 0x3f, 0x76, 0x60, 0x1d, 0xf7, 0xd9, 0xe2,
0xef, 0x43, 0x83, 0x06, 0x8c, 0x62, 0x1e, 0x4a, 0x46, 0xec, 0xd8, 0x8c, 0x98, 0x6b, 0xa1, 0xbd, 0xc5, 0x77, 0x80, 0x44, 0xe1, 0x25, 0x59, 0xd1, 0xc2, 0xfd, 0xe9, 0x39, 0xf1, 0x6d, 0x68, 0xd1,
0x73, 0x5e, 0x8e, 0x6c, 0xb0, 0xe1, 0x3f, 0x3a, 0xd0, 0x94, 0x64, 0xfe, 0xc4, 0xbe, 0x44, 0x17, 0x80, 0x71, 0xc2, 0x23, 0xc9, 0x88, 0x3d, 0x9b, 0x11, 0x0b, 0x2d, 0xb4, 0x7f, 0xce, 0x2b, 0x90,
0x96, 0x90, 0x23, 0x0d, 0x83, 0x5d, 0xb7, 0xf1, 0x36, 0x19, 0xa3, 0xc3, 0x86, 0xd7, 0xa7, 0xe5, 0x0d, 0x36, 0xfc, 0x27, 0x07, 0xda, 0x92, 0xcc, 0x9f, 0xd8, 0x97, 0xe8, 0xc3, 0x0a, 0x72, 0xa4,
0x47, 0x14, 0xc1, 0x78, 0x17, 0x92, 0xc2, 0x4d, 0x7b, 0x59, 0x30, 0xea, 0xa9, 0x5e, 0x19, 0x10, 0x61, 0xb0, 0xeb, 0x36, 0xde, 0x26, 0x13, 0x74, 0xd8, 0xf0, 0xfa, 0xb4, 0xfc, 0x88, 0x32, 0x18,
0xad, 0xea, 0x42, 0xbd, 0x93, 0x66, 0xfe, 0x90, 0xcb, 0x6b, 0x4e, 0x34, 0xd0, 0x61, 0x92, 0x0b, 0xef, 0x42, 0x52, 0xb8, 0xd9, 0x20, 0x0f, 0xc2, 0x81, 0xea, 0x95, 0xe1, 0xd2, 0xba, 0x2e, 0xd4,
0x2a, 0x98, 0x83, 0xee, 0xdf, 0xb6, 0x60, 0xab, 0xd4, 0xa5, 0x33, 0x0a, 0xd2, 0x40, 0x1e, 0x05, 0x3b, 0x59, 0xee, 0x8f, 0xb9, 0xbc, 0xe6, 0x44, 0x03, 0x1d, 0x26, 0xb9, 0xa0, 0x92, 0x39, 0xe8,
0xe3, 0xc3, 0x48, 0xdb, 0xda, 0x8e, 0x69, 0x3b, 0x5b, 0x5d, 0x6c, 0x08, 0xe7, 0xd5, 0x7d, 0x8e, 0xfe, 0x5d, 0x07, 0x2e, 0x54, 0xba, 0x74, 0xbe, 0x41, 0x1a, 0xc8, 0x61, 0x30, 0x39, 0x8a, 0xb5,
0x7b, 0x9a, 0xdf, 0xde, 0x35, 0x32, 0x44, 0xde, 0xb5, 0x79, 0xa0, 0x38, 0xa1, 0x82, 0x9b, 0x92, 0xad, 0xed, 0x98, 0xb6, 0xb3, 0xd5, 0xc5, 0xc6, 0x70, 0x5e, 0xdd, 0xe7, 0xb8, 0xa7, 0xc5, 0xed,
0x5b, 0x3d, 0x1e, 0x3b, 0x86, 0x8e, 0x36, 0x1c, 0xa4, 0x8a, 0x37, 0x8c, 0x0b, 0x9c, 0xeb, 0x9d, 0xdd, 0x20, 0x43, 0xe4, 0x4d, 0x9b, 0x07, 0xca, 0x13, 0x2a, 0xb8, 0x29, 0xb9, 0xf5, 0xe3, 0xb1,
0xd7, 0xcc, 0x45, 0xfa, 0x68, 0xa0, 0xa6, 0x99, 0x39, 0x1a, 0x9b, 0xc2, 0x25, 0xd5, 0x47, 0x3a, 0x13, 0xe8, 0x69, 0xc3, 0x41, 0xaa, 0x78, 0xc3, 0xb8, 0xc0, 0xb9, 0xde, 0x78, 0xc1, 0x5c, 0xa4,
0xbc, 0x3c, 0x5f, 0xfd, 0x4c, 0x6b, 0x7b, 0x80, 0x1f, 0xdb, 0x93, 0xbe, 0x66, 0x60, 0xf6, 0x4d, 0x8f, 0x46, 0x6a, 0x9a, 0xb9, 0xa3, 0xb1, 0x19, 0x5c, 0x56, 0x7d, 0xa4, 0xc3, 0xab, 0xf3, 0x35,
0xd8, 0x3c, 0xf5, 0x83, 0x4c, 0x91, 0x65, 0x18, 0x43, 0xf3, 0x34, 0xe5, 0xee, 0x6b, 0xa6, 0x7c, 0x5f, 0x6a, 0x6d, 0xef, 0xe1, 0xc7, 0xf6, 0xa4, 0x2f, 0x18, 0x98, 0x7d, 0x13, 0xb6, 0xcf, 0xfc,
0x26, 0x3e, 0xb6, 0x2e, 0xb6, 0x19, 0x23, 0x76, 0xff, 0xde, 0x81, 0xb6, 0x3d, 0x0e, 0xb2, 0xa9, 0x20, 0x57, 0x64, 0x19, 0xc6, 0xd0, 0x22, 0x4d, 0xb9, 0xf7, 0x82, 0x29, 0x1f, 0x8b, 0x8f, 0xad,
0x14, 0x78, 0xa5, 0xf8, 0x94, 0xf1, 0x57, 0x00, 0x97, 0x5d, 0xd4, 0x5a, 0x95, 0x8b, 0x6a, 0x3a, 0x8b, 0x6d, 0xce, 0x88, 0xfd, 0x7f, 0x70, 0xa0, 0x6b, 0x8f, 0x83, 0x6c, 0x2a, 0x05, 0x5e, 0x29,
0xa2, 0x73, 0xaf, 0x73, 0x44, 0xeb, 0x67, 0x73, 0x44, 0xe7, 0xab, 0x1c, 0xd1, 0xee, 0x7f, 0x39, 0x3e, 0x65, 0xfc, 0x95, 0xc0, 0x55, 0x17, 0xb5, 0x51, 0xe7, 0xa2, 0x9a, 0x8e, 0xe8, 0xc2, 0x8b,
0xc0, 0xca, 0xbc, 0xc4, 0x1e, 0x0a, 0x1f, 0x39, 0xe4, 0x23, 0xa9, 0x93, 0x7e, 0xfe, 0x6c, 0xfc, 0x1c, 0xd1, 0xe6, 0xcb, 0x39, 0xa2, 0x8b, 0x75, 0x8e, 0x68, 0xff, 0xbf, 0x1d, 0x60, 0x55, 0x5e,
0xa8, 0xf6, 0x4e, 0x7d, 0x8d, 0x82, 0x61, 0x2a, 0x1d, 0xd3, 0x44, 0x5a, 0xf6, 0xaa, 0xba, 0x0a, 0x62, 0xf7, 0x85, 0x8f, 0x1c, 0xf1, 0x50, 0xea, 0xa4, 0x9f, 0x7f, 0x39, 0x7e, 0x54, 0x7b, 0xa7,
0xae, 0x71, 0xfd, 0xf5, 0xae, 0xf1, 0xfc, 0xeb, 0x5d, 0xe3, 0x85, 0xa2, 0x6b, 0xdc, 0xfd, 0x5d, 0xbe, 0x46, 0xc1, 0x30, 0x95, 0x8e, 0x69, 0x22, 0xad, 0x7a, 0x75, 0x5d, 0x25, 0xd7, 0xb8, 0xf9,
0x07, 0xd6, 0x2b, 0x0e, 0xfd, 0x67, 0xb7, 0x70, 0x3c, 0x26, 0x4b, 0x17, 0xd4, 0xe4, 0x31, 0x99, 0x62, 0xd7, 0x78, 0xf1, 0xc5, 0xae, 0xf1, 0x52, 0xd9, 0x35, 0xee, 0xff, 0xae, 0x03, 0x9b, 0x35,
0xc0, 0xee, 0x6f, 0xc0, 0xb2, 0xc5, 0xe8, 0x3f, 0xbb, 0xf9, 0x8b, 0x56, 0x9e, 0xe0, 0x33, 0x0b, 0x87, 0xfe, 0xb3, 0x5b, 0x38, 0x1e, 0x93, 0xa5, 0x0b, 0x1a, 0xf2, 0x98, 0x4c, 0x60, 0xff, 0x37,
0xd6, 0xfd, 0x51, 0x0d, 0x58, 0x59, 0xd8, 0xfe, 0x5f, 0x69, 0x28, 0xef, 0xd3, 0x5c, 0xc5, 0x3e, 0x60, 0xd5, 0x62, 0xf4, 0x9f, 0xdd, 0xfc, 0x65, 0x2b, 0x4f, 0xf0, 0x99, 0x05, 0xeb, 0xff, 0xa8,
0xfd, 0x9f, 0xde, 0x03, 0xef, 0xc0, 0x9a, 0x4c, 0x3f, 0x1a, 0x51, 0x12, 0xc1, 0x31, 0xe5, 0x0e, 0x01, 0xac, 0x2a, 0x6c, 0xff, 0xaf, 0x34, 0x54, 0xf7, 0x69, 0xa1, 0x66, 0x9f, 0xfe, 0x4f, 0xef,
0xb4, 0x73, 0xed, 0xb8, 0xc4, 0x92, 0x95, 0xb6, 0x32, 0x2e, 0xc3, 0x42, 0x78, 0xc2, 0xdd, 0x84, 0x81, 0x37, 0x60, 0x43, 0x26, 0x27, 0x8d, 0x28, 0x89, 0xe0, 0x98, 0x6a, 0x07, 0xda, 0xb9, 0x76,
0x0d, 0x91, 0xce, 0xbc, 0x23, 0x86, 0x52, 0xf7, 0xca, 0x9f, 0x3a, 0x70, 0xbe, 0xd0, 0x91, 0xe7, 0x5c, 0x62, 0xc5, 0x4a, 0x6a, 0x19, 0x97, 0x61, 0x29, 0x3c, 0xe1, 0x6e, 0xc3, 0x96, 0x48, 0x76,
0x76, 0xc4, 0xd5, 0x61, 0xdf, 0x27, 0x36, 0x10, 0xe9, 0x97, 0x72, 0x64, 0xd0, 0x2f, 0xb8, 0xad, 0xde, 0x16, 0x43, 0xa9, 0x7b, 0xe5, 0x4f, 0x1d, 0x38, 0x5f, 0xea, 0x28, 0x72, 0x3b, 0xe2, 0xea,
0xdc, 0x81, 0xfb, 0x33, 0x09, 0xcb, 0xf8, 0x62, 0xd7, 0xab, 0xba, 0xdc, 0x2d, 0x91, 0x74, 0x0d, 0xb0, 0xef, 0x13, 0x1b, 0x88, 0xf4, 0x4b, 0x39, 0x32, 0xe8, 0x17, 0xdc, 0x56, 0xed, 0xc0, 0xfd,
0xf9, 0xa8, 0x40, 0xf8, 0x91, 0x48, 0x93, 0x9a, 0x1d, 0x79, 0x70, 0xd8, 0x26, 0x59, 0x35, 0xd1, 0x99, 0x46, 0x55, 0x7c, 0xb1, 0xeb, 0x75, 0x5d, 0xee, 0x05, 0x91, 0x92, 0x8d, 0x78, 0x58, 0x22,
0x0a, 0xb4, 0xae, 0x29, 0x9b, 0xde, 0xca, 0x3e, 0xf7, 0xf7, 0x1d, 0x60, 0x5f, 0x99, 0xf0, 0x64, 0xfc, 0x58, 0x24, 0x51, 0xcd, 0x8e, 0x22, 0x38, 0x6c, 0x93, 0xac, 0x9a, 0x68, 0x05, 0x5a, 0xd7,
0x4a, 0x39, 0x1e, 0x1d, 0x9e, 0xd9, 0x2a, 0xc6, 0x31, 0x16, 0xe2, 0xc9, 0xe1, 0x97, 0xf8, 0x54, 0x94, 0x4d, 0x6f, 0x6d, 0x9f, 0xfb, 0x17, 0x0e, 0xb0, 0xaf, 0x4c, 0x79, 0x3a, 0xa3, 0x1c, 0x8f,
0xe5, 0xf6, 0x6a, 0x79, 0x6e, 0xef, 0x4d, 0x00, 0x74, 0xbf, 0x74, 0xe2, 0x08, 0x79, 0x01, 0xfd, 0x0e, 0xcf, 0x5c, 0x28, 0xc7, 0x31, 0x96, 0x92, 0xe9, 0xd1, 0x97, 0xf8, 0x4c, 0x65, 0xfe, 0x1a,
0x5e, 0x31, 0x60, 0x65, 0xfa, 0xad, 0x5e, 0x99, 0x7e, 0xbb, 0x05, 0xeb, 0x16, 0x25, 0xfa, 0xa0, 0x45, 0xe6, 0xef, 0x55, 0x00, 0x74, 0xbf, 0x74, 0xe2, 0x08, 0x79, 0x01, 0xfd, 0x5e, 0x31, 0x60,
0x54, 0x52, 0xca, 0x79, 0x45, 0x52, 0xea, 0x3f, 0x1c, 0x98, 0xdb, 0x8b, 0x62, 0x33, 0x00, 0xe9, 0x6d, 0x72, 0xae, 0x59, 0x9b, 0x9c, 0x7b, 0xc5, 0x4c, 0xce, 0x49, 0x8b, 0xf4, 0x98, 0xf3, 0x07,
0xd8, 0x01, 0x48, 0x79, 0x3b, 0xf4, 0xb4, 0xf2, 0x97, 0x4a, 0xc3, 0x02, 0xb2, 0x6d, 0x68, 0xfb, 0x94, 0x9b, 0x7b, 0x17, 0x36, 0x2d, 0x32, 0xf5, 0x29, 0xaa, 0x8c, 0x95, 0xf3, 0x9c, 0x8c, 0xd5,
0xe3, 0x0c, 0x1d, 0xe9, 0xa3, 0x28, 0x39, 0xf5, 0x93, 0x81, 0x38, 0xbd, 0x3b, 0xb5, 0x8e, 0xe3, 0x7f, 0x3a, 0xb0, 0xb0, 0x1f, 0x27, 0x66, 0x74, 0xd2, 0xb1, 0xa3, 0x93, 0xf2, 0xea, 0x18, 0xe8,
0x15, 0x7a, 0xd8, 0x06, 0xcc, 0x69, 0x35, 0x4a, 0x08, 0xd8, 0x44, 0x53, 0x8c, 0xe2, 0xb0, 0x53, 0x9b, 0x41, 0x6a, 0x14, 0x0b, 0xc8, 0x76, 0xa0, 0xeb, 0x4f, 0x72, 0xf4, 0xb2, 0x8f, 0xe3, 0xf4,
0x19, 0x03, 0x90, 0x2d, 0x64, 0x0e, 0xfb, 0x7b, 0x61, 0xfc, 0x0a, 0x61, 0xa8, 0xea, 0xc2, 0x9b, 0xcc, 0x4f, 0x47, 0xe2, 0x68, 0x6f, 0x37, 0x7a, 0x8e, 0x57, 0xea, 0x61, 0x5b, 0xb0, 0xa0, 0x75,
0x0a, 0xb5, 0x2a, 0xa1, 0xc9, 0xe0, 0x8d, 0x6a, 0xbb, 0xff, 0xe6, 0xc0, 0x3c, 0xed, 0x00, 0x8a, 0x2c, 0x21, 0x60, 0x13, 0xed, 0x34, 0x0a, 0xd2, 0xce, 0x64, 0x80, 0x40, 0xb6, 0x90, 0x73, 0xec,
0xaf, 0xe0, 0x59, 0x4a, 0x3b, 0x53, 0xd0, 0xd8, 0x11, 0xe2, 0x5b, 0x00, 0x33, 0xd7, 0x4a, 0x46, 0xef, 0x85, 0x65, 0x2c, 0x24, 0xa5, 0xae, 0x0b, 0xaf, 0x31, 0xdc, 0x2d, 0x42, 0x5b, 0xd6, 0x9b,
0xd7, 0x34, 0xd9, 0x66, 0x42, 0xfa, 0x32, 0x34, 0x44, 0x4b, 0x67, 0x70, 0x09, 0x25, 0x07, 0xb2, 0x45, 0x6d, 0xf7, 0xdf, 0x1d, 0x58, 0xa4, 0x1d, 0x40, 0xd9, 0x16, 0x0c, 0x4d, 0x19, 0x6b, 0x8a,
0x4b, 0x50, 0x3f, 0x8e, 0x62, 0x65, 0x6f, 0x80, 0x8a, 0x19, 0x46, 0xb1, 0x47, 0xf0, 0x9c, 0x1e, 0x28, 0x3b, 0x42, 0xb6, 0x4b, 0x60, 0xe6, 0x5a, 0x79, 0xec, 0x86, 0x26, 0xdb, 0xcc, 0x65, 0x5f,
0x1c, 0x4f, 0x10, 0x2f, 0x6e, 0x91, 0x22, 0x18, 0xef, 0x51, 0x3d, 0xac, 0xb9, 0x19, 0x05, 0xa8, 0x81, 0x96, 0x68, 0xe9, 0xe4, 0x2f, 0xa1, 0x14, 0x40, 0x76, 0x19, 0x9a, 0x27, 0x71, 0xa2, 0x8c,
0xbb, 0x0d, 0x2b, 0x8f, 0xa3, 0x01, 0x37, 0xa2, 0x44, 0x33, 0xf9, 0xd3, 0xfd, 0x4d, 0x07, 0x96, 0x11, 0x50, 0x01, 0xc5, 0x38, 0xf1, 0x08, 0x5e, 0xd0, 0x83, 0xe3, 0x09, 0xe2, 0xc5, 0x49, 0x97,
0x14, 0x32, 0xbb, 0x06, 0x75, 0x34, 0x0e, 0x0a, 0xa6, 0xbf, 0xce, 0x15, 0x20, 0x9e, 0x47, 0x18, 0xc1, 0x78, 0xc9, 0xea, 0x61, 0xcd, 0xcd, 0x28, 0x41, 0xdd, 0x1d, 0x58, 0x7b, 0x18, 0x8f, 0xb8,
0xa8, 0x4d, 0x29, 0x86, 0x90, 0x1b, 0x8a, 0x2a, 0x82, 0x90, 0xdb, 0x41, 0x9a, 0xdc, 0x82, 0xf9, 0x11, 0x42, 0x9a, 0xcb, 0xbc, 0xee, 0x6f, 0x3a, 0xb0, 0xa2, 0x90, 0xd9, 0x75, 0x68, 0xa2, 0xe5,
0x50, 0x80, 0xba, 0x7f, 0xe9, 0xc0, 0xb2, 0x35, 0x07, 0x3a, 0x7c, 0x23, 0x3f, 0xcd, 0x64, 0xfc, 0x50, 0xf2, 0x0b, 0x74, 0x22, 0x01, 0xf1, 0x3c, 0xc2, 0x40, 0x55, 0x4b, 0x01, 0x86, 0xc2, 0x8a,
0x55, 0x1e, 0x8f, 0x09, 0x32, 0xe3, 0x86, 0x35, 0x3b, 0x6e, 0xa8, 0x23, 0x5a, 0x73, 0x66, 0x44, 0x54, 0xe1, 0x85, 0xc2, 0x48, 0xd2, 0xe4, 0x96, 0x6c, 0x8b, 0x12, 0xd4, 0xfd, 0x2b, 0x07, 0x56,
0xeb, 0x06, 0x34, 0xf2, 0x92, 0x81, 0xba, 0xa5, 0x25, 0x71, 0x46, 0x95, 0x05, 0xc9, 0x91, 0x70, 0xad, 0x39, 0xd0, 0x1b, 0x0c, 0xfd, 0x2c, 0x97, 0xc1, 0x59, 0x79, 0x3c, 0x26, 0xc8, 0x0c, 0x2a,
0x9c, 0x7e, 0x34, 0x8a, 0x12, 0x99, 0x51, 0x17, 0x0d, 0xf7, 0x16, 0x34, 0x0d, 0x7c, 0x24, 0x23, 0x36, 0xec, 0xa0, 0xa2, 0x0e, 0x77, 0x2d, 0x98, 0xe1, 0xae, 0x9b, 0xd0, 0x2a, 0xaa, 0x0d, 0x9a,
0xe4, 0xd9, 0x69, 0x94, 0x3c, 0x57, 0xe1, 0x4b, 0xd9, 0xd4, 0xc9, 0xbe, 0x5a, 0x9e, 0xec, 0x73, 0x96, 0x0a, 0xc5, 0x19, 0x55, 0x8a, 0xa4, 0x40, 0xc2, 0x71, 0x86, 0x71, 0x18, 0xa7, 0x32, 0x19,
0xff, 0xca, 0x81, 0x65, 0xe4, 0xc1, 0x20, 0x1c, 0xee, 0x47, 0xa3, 0xa0, 0x3f, 0xa5, 0xb3, 0x57, 0x2f, 0x1a, 0xee, 0xbb, 0xd0, 0x36, 0xf0, 0x91, 0x8c, 0x88, 0xe7, 0x67, 0x71, 0xfa, 0x44, 0xc5,
0xec, 0x26, 0x65, 0x5d, 0xf1, 0xa2, 0x0d, 0x46, 0xde, 0x56, 0xfe, 0x9e, 0x14, 0x44, 0xdd, 0x46, 0x36, 0x65, 0x53, 0x67, 0x02, 0x1b, 0x45, 0x26, 0xd0, 0xfd, 0x6b, 0x07, 0x56, 0x91, 0x07, 0x83,
0x49, 0x45, 0x3e, 0x3f, 0xf4, 0x53, 0xc9, 0xfc, 0xf2, 0xda, 0xb2, 0x80, 0x28, 0x4f, 0x08, 0x48, 0x68, 0x7c, 0x10, 0x87, 0xc1, 0x70, 0x46, 0x67, 0xaf, 0xd8, 0x4d, 0x2a, 0x02, 0xc5, 0x8b, 0x36,
0xfc, 0x8c, 0xf7, 0xc6, 0xc1, 0x68, 0x14, 0x08, 0x5c, 0x61, 0xd4, 0x54, 0x75, 0xb9, 0x3f, 0xa8, 0x18, 0x79, 0x5b, 0x39, 0x83, 0x52, 0x10, 0x75, 0x1b, 0x25, 0x15, 0xf9, 0xfc, 0xc8, 0xcf, 0x24,
0x41, 0x53, 0x2a, 0xd5, 0xfb, 0x83, 0xa1, 0x48, 0x14, 0x48, 0xd3, 0x50, 0xab, 0x0b, 0x03, 0xa2, 0xf3, 0xcb, 0x3b, 0xcd, 0x02, 0xa2, 0x3c, 0x21, 0x20, 0xf5, 0x73, 0x3e, 0x98, 0x04, 0x61, 0x18,
0xfa, 0x2d, 0x63, 0xd2, 0x80, 0x14, 0x8f, 0x75, 0xae, 0x7c, 0xac, 0x17, 0xa1, 0x81, 0xec, 0xf5, 0x08, 0x5c, 0x61, 0xf1, 0xd4, 0x75, 0xb9, 0x3f, 0x68, 0x40, 0x5b, 0x6a, 0xdc, 0x7b, 0xa3, 0xb1,
0x2e, 0x59, 0xad, 0xa2, 0xc2, 0x24, 0x07, 0xa8, 0xde, 0x5d, 0xea, 0x9d, 0xcf, 0x7b, 0x09, 0x60, 0xc8, 0x22, 0x48, 0xbb, 0x51, 0xab, 0x0b, 0x03, 0xa2, 0xfa, 0x2d, 0x4b, 0xd3, 0x80, 0x94, 0x8f,
0xd9, 0xa9, 0x0b, 0x05, 0x3b, 0xf5, 0x7d, 0x68, 0xc9, 0x61, 0x68, 0xdf, 0x49, 0x3b, 0xe4, 0x0c, 0x75, 0xa1, 0x7a, 0xac, 0x97, 0xa0, 0x85, 0xec, 0xf5, 0x26, 0x99, 0xb4, 0xa2, 0x38, 0xa5, 0x00,
0x6e, 0x9d, 0x89, 0x67, 0x61, 0xaa, 0x2f, 0x77, 0xd5, 0x97, 0x4b, 0xaf, 0xfb, 0x52, 0x61, 0x52, 0xa8, 0xde, 0x3d, 0xea, 0x5d, 0x2c, 0x7a, 0x09, 0x60, 0x19, 0xb1, 0x4b, 0x25, 0x23, 0xf6, 0x6d,
0xde, 0x4c, 0xec, 0xcd, 0xc3, 0xc4, 0x8f, 0x8f, 0xd5, 0x45, 0x35, 0xd0, 0xc5, 0x00, 0x04, 0x66, 0xe8, 0xc8, 0x61, 0x68, 0xdf, 0x49, 0x3b, 0x14, 0x0c, 0x6e, 0x9d, 0x89, 0x67, 0x61, 0xaa, 0x2f,
0xdb, 0x30, 0x8f, 0x9f, 0x29, 0x6d, 0x5d, 0x2d, 0x74, 0x02, 0x85, 0x5d, 0x83, 0x79, 0x3e, 0x18, 0xf7, 0xd4, 0x97, 0x2b, 0x2f, 0xfa, 0x52, 0x61, 0x52, 0x52, 0x4d, 0xec, 0xcd, 0xfd, 0xd4, 0x4f,
0x72, 0xe5, 0x97, 0x31, 0xdb, 0x43, 0xc6, 0x33, 0xf2, 0x04, 0x02, 0xaa, 0x00, 0x84, 0x16, 0x54, 0x4e, 0xd4, 0x2d, 0x36, 0xd2, 0x95, 0x02, 0x04, 0x66, 0x3b, 0xb0, 0x88, 0x9f, 0x29, 0x6d, 0x5d,
0x80, 0xad, 0xe9, 0x17, 0xb0, 0xf9, 0xc1, 0xc0, 0xdd, 0x00, 0xf6, 0x58, 0x70, 0xad, 0x19, 0x57, 0x2f, 0x74, 0x02, 0x85, 0x5d, 0x87, 0x45, 0x3e, 0x1a, 0x73, 0xe5, 0xb4, 0x31, 0xdb, 0x7d, 0xc6,
0xfe, 0x9d, 0x39, 0x68, 0x1a, 0x60, 0x94, 0xe6, 0x21, 0x12, 0xdc, 0x1b, 0x04, 0xfe, 0x98, 0x67, 0x33, 0xf2, 0x04, 0x02, 0xaa, 0x00, 0x84, 0x96, 0x54, 0x80, 0xad, 0xe9, 0x97, 0xb0, 0xf9, 0xfe,
0x3c, 0x91, 0x9c, 0x5a, 0x80, 0x22, 0x9e, 0x7f, 0x32, 0xec, 0x45, 0x93, 0xac, 0x37, 0xe0, 0xc3, 0xc8, 0xdd, 0x02, 0xf6, 0x50, 0x70, 0xad, 0x19, 0x74, 0xfe, 0x9d, 0x05, 0x68, 0x1b, 0x60, 0x94,
0x84, 0x8b, 0xeb, 0x14, 0x2f, 0x03, 0x0b, 0x8a, 0x78, 0x63, 0xff, 0x85, 0x89, 0x27, 0xf8, 0xa1, 0xe6, 0x31, 0x12, 0x3c, 0x18, 0x05, 0xfe, 0x84, 0xe7, 0x3c, 0x95, 0x9c, 0x5a, 0x82, 0x22, 0x9e,
0x00, 0x55, 0x51, 0x62, 0xb1, 0x47, 0xf5, 0x3c, 0x4a, 0x2c, 0x76, 0xa4, 0xa8, 0x87, 0xe6, 0x2b, 0x7f, 0x3a, 0x1e, 0xc4, 0xd3, 0x7c, 0x30, 0xe2, 0xe3, 0x94, 0x8b, 0xbb, 0x16, 0x2f, 0x03, 0x0b,
0xf4, 0xd0, 0x7b, 0xb0, 0x29, 0x34, 0x8e, 0x94, 0xcd, 0x5e, 0x81, 0x4d, 0x66, 0xf4, 0xb2, 0x6d, 0x8a, 0x78, 0x13, 0xff, 0xa9, 0x89, 0x27, 0xf8, 0xa1, 0x04, 0x55, 0x21, 0x64, 0xb1, 0x47, 0xcd,
0x58, 0x45, 0x9a, 0x15, 0x83, 0xa7, 0xc1, 0xb7, 0x45, 0xdc, 0xc6, 0xf1, 0x4a, 0x70, 0xc4, 0x45, 0x22, 0x84, 0x2c, 0x76, 0xa4, 0xac, 0x87, 0x16, 0x6b, 0xf4, 0xd0, 0x5b, 0xb0, 0x2d, 0x34, 0x8e,
0x71, 0xb4, 0x70, 0x45, 0x26, 0xad, 0x04, 0x27, 0x5c, 0xff, 0x85, 0x8d, 0xdb, 0x90, 0xb8, 0x05, 0x94, 0xcd, 0x41, 0x89, 0x4d, 0xe6, 0xf4, 0xb2, 0x1d, 0x58, 0x47, 0x9a, 0x15, 0x83, 0x67, 0xc1,
0xb8, 0xbb, 0x0c, 0xcd, 0x83, 0x2c, 0x8a, 0xd5, 0xa1, 0xb4, 0xa1, 0x25, 0x9a, 0x32, 0x6f, 0xfa, 0xb7, 0x45, 0x50, 0xc7, 0xf1, 0x2a, 0x70, 0xc4, 0x45, 0x71, 0xb4, 0x70, 0x45, 0x9a, 0xad, 0x02,
0x06, 0x5c, 0x20, 0x2e, 0x7a, 0x12, 0xc5, 0xd1, 0x28, 0x1a, 0x4e, 0x0f, 0x26, 0x87, 0x69, 0x3f, 0x27, 0x5c, 0xff, 0xa9, 0x8d, 0xdb, 0x92, 0xb8, 0x25, 0xb8, 0xbb, 0x0a, 0xed, 0xc3, 0x3c, 0x4e,
0x09, 0x62, 0xf4, 0x61, 0xdc, 0x7f, 0x70, 0x60, 0xdd, 0xea, 0x95, 0x81, 0x9e, 0xcf, 0x08, 0x96, 0xd4, 0xa1, 0x74, 0xa1, 0x23, 0x9a, 0x32, 0xa9, 0xfa, 0x0a, 0x5c, 0x24, 0x2e, 0x7a, 0x14, 0x27,
0xd6, 0x09, 0x2f, 0xc1, 0x78, 0x6b, 0x86, 0x3a, 0x14, 0x88, 0x22, 0xc4, 0xf6, 0x54, 0xe6, 0xc0, 0x71, 0x18, 0x8f, 0x67, 0x87, 0xd3, 0xa3, 0x6c, 0x98, 0x06, 0x09, 0x3a, 0x38, 0xee, 0x3f, 0x3a,
0x6e, 0xc3, 0x8a, 0xa2, 0x4c, 0x7d, 0x28, 0xb8, 0xb0, 0x53, 0xe6, 0x42, 0xf9, 0x7d, 0x5b, 0x7e, 0xb0, 0x69, 0xf5, 0xca, 0x28, 0xd0, 0x67, 0x04, 0x4b, 0xeb, 0x6c, 0x98, 0x60, 0xbc, 0x0d, 0x43,
0xa0, 0x86, 0xf8, 0x25, 0x61, 0x82, 0xf3, 0x01, 0xad, 0x51, 0x79, 0xfc, 0x5d, 0xf5, 0xbd, 0x69, 0x1d, 0x0a, 0x44, 0x11, 0x7f, 0xfb, 0x50, 0x26, 0xc8, 0x6e, 0xc1, 0x9a, 0xa2, 0x4c, 0x7d, 0x28,
0xf7, 0x2b, 0x0a, 0xfa, 0x1a, 0x98, 0xba, 0x7f, 0xe0, 0x00, 0xe4, 0xd4, 0x21, 0x63, 0xe4, 0x2a, 0xb8, 0xb0, 0x57, 0xe5, 0x42, 0xf9, 0x7d, 0x57, 0x7e, 0xa0, 0x86, 0xf8, 0x25, 0x61, 0x9f, 0xf3,
0x5d, 0x54, 0x4b, 0x1a, 0xea, 0xfb, 0x6d, 0x68, 0xe9, 0x5c, 0x47, 0x7e, 0x4b, 0x34, 0x15, 0x0c, 0x11, 0xad, 0x51, 0x85, 0x03, 0xfa, 0xea, 0x7b, 0xd3, 0x29, 0x50, 0x14, 0x0c, 0x35, 0x30, 0x73,
0x4d, 0xb3, 0xab, 0xb0, 0x32, 0x1c, 0x45, 0x87, 0x74, 0xc5, 0x52, 0x22, 0x3e, 0x95, 0xd9, 0xe3, 0x7f, 0xdf, 0x01, 0x28, 0xa8, 0x43, 0xc6, 0x28, 0x54, 0xba, 0x28, 0xb4, 0x34, 0xd4, 0xf7, 0xeb,
0xb6, 0x00, 0x3f, 0x90, 0xd0, 0xfc, 0x4a, 0xa9, 0x1b, 0x57, 0x8a, 0xfb, 0x9d, 0x9a, 0x8e, 0x90, 0xd0, 0xd1, 0x89, 0x90, 0xe2, 0x96, 0x68, 0x2b, 0x18, 0xda, 0x6d, 0xd7, 0x60, 0x6d, 0x1c, 0xc6,
0xe7, 0x6b, 0x9e, 0x29, 0x65, 0x6c, 0xb7, 0xa4, 0x1c, 0x67, 0x04, 0xa4, 0x29, 0xb6, 0xb5, 0xff, 0x47, 0x74, 0xc5, 0x52, 0x96, 0x3e, 0x93, 0xa9, 0xe5, 0xae, 0x00, 0xbf, 0x27, 0xa1, 0xc5, 0x95,
0x5a, 0xd7, 0xfb, 0x16, 0xb4, 0x13, 0xa1, 0x7d, 0x94, 0x6a, 0xaa, 0xbf, 0x42, 0x35, 0x2d, 0x27, 0xd2, 0x34, 0xae, 0x14, 0xf7, 0x3b, 0x0d, 0x1d, 0x3e, 0x2f, 0xd6, 0x3c, 0x57, 0xca, 0xd8, 0x5e,
0xd6, 0xbd, 0xf3, 0x29, 0x58, 0xf5, 0x07, 0x27, 0x3c, 0xc9, 0x02, 0x72, 0x7e, 0xe8, 0xd2, 0x17, 0x45, 0x39, 0xce, 0x89, 0x56, 0x53, 0xe0, 0xeb, 0xe0, 0x85, 0x7e, 0xf9, 0xbb, 0xd0, 0x4d, 0x85,
0x0a, 0x75, 0xc5, 0x80, 0xd3, 0x5d, 0x7c, 0x15, 0x56, 0x64, 0xc6, 0x5e, 0x63, 0xca, 0xba, 0xb1, 0xf6, 0x51, 0xaa, 0xa9, 0xf9, 0x1c, 0xd5, 0xb4, 0x9a, 0x5a, 0xf7, 0xce, 0xa7, 0x60, 0xdd, 0x1f,
0x1c, 0x8c, 0x88, 0xee, 0x9f, 0xab, 0x60, 0xbc, 0x7d, 0x86, 0xb3, 0x77, 0xc4, 0x5c, 0x5d, 0xad, 0x9d, 0xf2, 0x34, 0x0f, 0xc8, 0x33, 0xa2, 0x4b, 0x5f, 0x28, 0xd4, 0x35, 0x03, 0x4e, 0x77, 0xf1,
0xb0, 0xba, 0x4f, 0xc8, 0xc0, 0xf8, 0x40, 0x79, 0x58, 0x32, 0x45, 0x21, 0x80, 0x32, 0x91, 0x61, 0x35, 0x58, 0x93, 0xe9, 0x7c, 0x8d, 0x29, 0x4b, 0xce, 0x0a, 0x30, 0x22, 0xba, 0x7f, 0xae, 0x22,
0x6f, 0x69, 0xfd, 0x2c, 0x5b, 0xea, 0x7e, 0xec, 0xc0, 0xe2, 0x5e, 0x14, 0xef, 0xc9, 0xe4, 0x3b, 0xf5, 0xf6, 0x19, 0xce, 0xdf, 0x11, 0x73, 0x75, 0x8d, 0xd2, 0xea, 0x3e, 0x21, 0xa3, 0xe6, 0x23,
0x09, 0x82, 0xae, 0x87, 0x51, 0x4d, 0xd3, 0x2a, 0xae, 0x95, 0xac, 0xe2, 0xf2, 0x5d, 0xbb, 0x5c, 0xe5, 0x7e, 0xc9, 0xfc, 0x85, 0x00, 0xca, 0x2c, 0x87, 0xbd, 0xa5, 0xcd, 0x97, 0xd9, 0x52, 0xf7,
0xbc, 0x6b, 0x7f, 0x19, 0xde, 0x20, 0xff, 0x3e, 0x89, 0xe2, 0x28, 0x41, 0x61, 0xf4, 0x47, 0xe2, 0x63, 0x07, 0x96, 0xf7, 0xe3, 0x64, 0x5f, 0x66, 0xe6, 0x49, 0x10, 0x74, 0xb1, 0x8c, 0x6a, 0x9a,
0x62, 0x8d, 0xc2, 0xec, 0x58, 0xa9, 0xb1, 0x57, 0xa1, 0x90, 0x23, 0x85, 0x0e, 0x80, 0x30, 0x86, 0x56, 0x71, 0xa3, 0x62, 0x15, 0x57, 0xef, 0xda, 0xd5, 0xf2, 0x5d, 0xfb, 0xcb, 0xf0, 0x0a, 0x39,
0xa5, 0x6d, 0x20, 0xb4, 0x5b, 0xb9, 0xc3, 0xfd, 0x1c, 0x34, 0xc8, 0xb8, 0xa5, 0x65, 0xbd, 0x03, 0xff, 0x69, 0x9c, 0xc4, 0x29, 0x0a, 0xa3, 0x1f, 0x8a, 0x8b, 0x35, 0x8e, 0xf2, 0x13, 0xa5, 0xc6,
0x8d, 0xe3, 0x28, 0xee, 0x1d, 0x07, 0x61, 0xa6, 0x84, 0xbb, 0x9d, 0x5b, 0x9d, 0x7b, 0xb4, 0x21, 0x9e, 0x87, 0x42, 0x5e, 0x16, 0x7a, 0x07, 0xc2, 0x18, 0x96, 0xb6, 0x81, 0xd0, 0x6e, 0xd5, 0x0e,
0x1a, 0xc1, 0xfd, 0xd1, 0x1c, 0x2c, 0x7e, 0x10, 0x9e, 0x44, 0x41, 0x9f, 0xe2, 0xf6, 0x63, 0x3e, 0xf7, 0x73, 0xd0, 0x22, 0xe3, 0x96, 0x96, 0xf5, 0x06, 0xb4, 0x4e, 0xe2, 0x64, 0x70, 0x12, 0x44,
0x8e, 0x54, 0x75, 0x10, 0xfe, 0xc6, 0xad, 0xa0, 0x4c, 0x79, 0x9c, 0xc9, 0xc0, 0xbb, 0x6a, 0xe2, 0xb9, 0x12, 0xee, 0x6e, 0x61, 0x75, 0xee, 0xd3, 0x86, 0x68, 0x04, 0xf7, 0x47, 0x0b, 0xb0, 0xfc,
0x75, 0x9f, 0xe4, 0x15, 0x7c, 0x42, 0x74, 0x0c, 0x08, 0x1a, 0xf6, 0x89, 0x59, 0xbe, 0x28, 0x5b, 0x7e, 0x74, 0x1a, 0x07, 0x43, 0x0a, 0xea, 0x4f, 0xf8, 0x24, 0x56, 0xa5, 0x43, 0xf8, 0x1b, 0xb7,
0x79, 0x79, 0xd5, 0xbc, 0x51, 0x5e, 0x45, 0x59, 0x1e, 0x51, 0x04, 0x40, 0xfc, 0xb5, 0xe4, 0xa9, 0x82, 0xd2, 0xe8, 0x49, 0x2e, 0xa3, 0xf2, 0xaa, 0x89, 0xd7, 0x7d, 0x5a, 0x94, 0xf7, 0x09, 0xd1,
0x26, 0x39, 0x22, 0x09, 0x17, 0x71, 0x19, 0x32, 0x1c, 0x16, 0xa5, 0x23, 0x62, 0x02, 0xd1, 0xb8, 0x31, 0x20, 0x68, 0xd8, 0xa7, 0x66, 0xe5, 0xa3, 0x6c, 0x15, 0xb5, 0x57, 0x8b, 0x46, 0xed, 0x15,
0x10, 0x1f, 0x08, 0x1c, 0xa1, 0x7c, 0x4d, 0x10, 0x1a, 0x5b, 0xc5, 0x0a, 0xc8, 0x86, 0xe0, 0xf9, 0xa5, 0x80, 0x44, 0x85, 0x00, 0xf1, 0xd7, 0x8a, 0xa7, 0x9a, 0xe4, 0x88, 0xa4, 0x5c, 0x04, 0x6d,
0x02, 0x18, 0x35, 0xf4, 0x80, 0x6b, 0x45, 0x2a, 0xd6, 0x00, 0xa2, 0x42, 0xb1, 0x08, 0x37, 0xdc, 0xc8, 0x70, 0x58, 0x96, 0x8e, 0x88, 0x09, 0x44, 0xe3, 0x42, 0x7c, 0x20, 0x70, 0x84, 0xf2, 0x35,
0x17, 0x51, 0xcc, 0xa0, 0xdc, 0x17, 0x64, 0x14, 0x7f, 0x34, 0x3a, 0xf4, 0xfb, 0xcf, 0xa9, 0x2e, 0x41, 0x68, 0x6c, 0x95, 0x8b, 0x27, 0x5b, 0x82, 0xe7, 0x4b, 0x60, 0xd4, 0xd0, 0x23, 0xae, 0x15,
0x95, 0x6a, 0x17, 0x1a, 0x9e, 0x0d, 0x44, 0xaa, 0x8d, 0xd3, 0xa4, 0x3c, 0x61, 0xdd, 0x33, 0x41, 0xa9, 0x58, 0x03, 0x88, 0xf2, 0xc5, 0x32, 0xdc, 0x70, 0x5f, 0x44, 0xa5, 0x83, 0x72, 0x5f, 0x90,
0x6c, 0x17, 0x9a, 0xe4, 0xb2, 0xc9, 0xf3, 0x6c, 0xd3, 0x79, 0xae, 0x9a, 0x3e, 0x1d, 0x9d, 0xa8, 0x51, 0xfc, 0x30, 0x3c, 0xf2, 0x87, 0x4f, 0xa8, 0xa4, 0x95, 0x0a, 0x1b, 0x5a, 0x9e, 0x0d, 0x44,
0x89, 0x64, 0xe6, 0x12, 0x56, 0xec, 0xf2, 0x82, 0xaf, 0x02, 0xbb, 0x3d, 0x18, 0xc8, 0xf3, 0xd6, 0xaa, 0x8d, 0xd3, 0xa4, 0x24, 0x62, 0xd3, 0x33, 0x41, 0x6c, 0x0f, 0xda, 0xe4, 0xb2, 0xc9, 0xf3,
0x2e, 0x63, 0x7e, 0x52, 0x8e, 0x75, 0x52, 0x15, 0x3b, 0x56, 0xab, 0xdc, 0x31, 0xf7, 0x3e, 0x34, 0xec, 0xd2, 0x79, 0xae, 0x9b, 0x3e, 0x1d, 0x9d, 0xa8, 0x89, 0x64, 0x26, 0x1a, 0xd6, 0xec, 0xda,
0xf7, 0x8d, 0x42, 0x4a, 0x62, 0x0d, 0x55, 0x42, 0x29, 0xd9, 0xc9, 0x80, 0x18, 0x13, 0xd6, 0xcc, 0x83, 0xaf, 0x02, 0xbb, 0x35, 0x1a, 0xc9, 0xf3, 0xd6, 0x2e, 0x63, 0x71, 0x52, 0x8e, 0x75, 0x52,
0x09, 0xdd, 0x5f, 0x00, 0xf6, 0x28, 0x48, 0x33, 0x4d, 0x5f, 0x5e, 0xb9, 0xa9, 0x7c, 0xf1, 0xbc, 0x35, 0x3b, 0xd6, 0xa8, 0xdd, 0x31, 0xf7, 0x1e, 0xb4, 0x0f, 0x8c, 0x2a, 0x4b, 0x62, 0x0d, 0x55,
0xf8, 0xa1, 0x29, 0x61, 0x54, 0x94, 0x70, 0x5b, 0x54, 0x4d, 0x14, 0x17, 0xb6, 0x0d, 0x4b, 0x81, 0x5f, 0x29, 0xd9, 0xc9, 0x80, 0x18, 0x13, 0x36, 0xcc, 0x09, 0xdd, 0x5f, 0x00, 0xf6, 0x20, 0xc8,
0x00, 0x15, 0x25, 0x41, 0x61, 0xea, 0x7e, 0xb4, 0xd7, 0x24, 0xd0, 0xba, 0x45, 0x7f, 0xe0, 0xc0, 0x72, 0x4d, 0x5f, 0x51, 0xd6, 0xa9, 0x1c, 0xf5, 0xa2, 0x32, 0xa2, 0x2d, 0x61, 0x54, 0xb1, 0x70,
0xa2, 0x5c, 0x1a, 0x5a, 0x1b, 0xa5, 0x12, 0xd2, 0x86, 0x67, 0xc1, 0xaa, 0x8b, 0x07, 0xcb, 0x3c, 0x4b, 0x94, 0x54, 0x94, 0x17, 0xb6, 0x03, 0x2b, 0x81, 0x00, 0x95, 0x25, 0x41, 0x61, 0xea, 0x7e,
0x3c, 0x57, 0xc5, 0xc3, 0x0c, 0xea, 0xb1, 0x9f, 0x1d, 0x93, 0x83, 0xd2, 0xf0, 0xe8, 0x37, 0x5b, 0xb4, 0xd7, 0x24, 0xd0, 0xba, 0x45, 0x7f, 0xe0, 0xc0, 0xb2, 0x5c, 0x1a, 0x5a, 0x1b, 0x95, 0xfa,
0x15, 0x4e, 0xb3, 0x90, 0x15, 0x72, 0x98, 0xab, 0xea, 0x67, 0x85, 0x4a, 0x2e, 0xc1, 0x71, 0x51, 0xd2, 0x96, 0x67, 0xc1, 0xea, 0x2b, 0x0b, 0xab, 0x3c, 0xbc, 0x50, 0xc7, 0xc3, 0x0c, 0x9a, 0x89,
0x54, 0x67, 0x20, 0xe0, 0x3a, 0x7d, 0x20, 0x6b, 0x38, 0x72, 0x70, 0xbe, 0x5f, 0x72, 0x88, 0xe2, 0x9f, 0x9f, 0x90, 0x83, 0xd2, 0xf2, 0xe8, 0x37, 0x5b, 0x17, 0x4e, 0xb3, 0x90, 0x15, 0x72, 0x98,
0x7e, 0x49, 0x54, 0x4f, 0xf7, 0xbb, 0x5d, 0xe8, 0xdc, 0xe3, 0x23, 0x9e, 0xf1, 0xdb, 0xa3, 0x51, 0xeb, 0x8a, 0x6b, 0x85, 0x4a, 0xae, 0xc0, 0x71, 0x51, 0x54, 0x84, 0x20, 0xe0, 0x3a, 0xb7, 0x20,
0x71, 0xfc, 0x37, 0xe0, 0x42, 0x45, 0x9f, 0x34, 0x5a, 0x1e, 0xc0, 0xda, 0x3d, 0x7e, 0x38, 0x19, 0x0b, 0x3c, 0x0a, 0x70, 0xb1, 0x5f, 0x72, 0x88, 0xf2, 0x7e, 0x49, 0x54, 0x4f, 0xf7, 0xbb, 0x7d,
0x3e, 0xe2, 0x27, 0x79, 0x8e, 0x8f, 0x41, 0x3d, 0x3d, 0x8e, 0x4e, 0xe5, 0xd9, 0xd2, 0x6f, 0xf6, 0xe8, 0xdd, 0xe5, 0x21, 0xcf, 0xf9, 0xad, 0x30, 0x2c, 0x8f, 0xff, 0x0a, 0x5c, 0xac, 0xe9, 0x93,
0x26, 0xc0, 0x08, 0x71, 0x7a, 0x69, 0xcc, 0xfb, 0xaa, 0x6c, 0x8e, 0x20, 0x07, 0x31, 0xef, 0xbb, 0x46, 0xcb, 0x7b, 0xb0, 0x71, 0x97, 0x1f, 0x4d, 0xc7, 0x0f, 0xf8, 0x69, 0x91, 0x00, 0x64, 0xd0,
0xef, 0x01, 0x33, 0xc7, 0x91, 0x4b, 0x40, 0x3d, 0x30, 0x39, 0xec, 0xa5, 0xd3, 0x34, 0xe3, 0x63, 0xcc, 0x4e, 0xe2, 0x33, 0x79, 0xb6, 0xf4, 0x9b, 0xbd, 0x0a, 0x10, 0x22, 0xce, 0x20, 0x4b, 0xf8,
0x55, 0x0f, 0x68, 0x82, 0xdc, 0xab, 0xd0, 0xda, 0xf7, 0xa7, 0x1e, 0xff, 0x96, 0xac, 0xe2, 0x45, 0x50, 0xd5, 0xd4, 0x11, 0xe4, 0x30, 0xe1, 0x43, 0xf7, 0x2d, 0x60, 0xe6, 0x38, 0x72, 0x09, 0xa8,
0xdf, 0xd8, 0x9f, 0x22, 0x2b, 0x6b, 0xdf, 0x98, 0xba, 0xdd, 0xff, 0xac, 0xc1, 0x82, 0xc0, 0xc4, 0x07, 0xa6, 0x47, 0x83, 0x6c, 0x96, 0xe5, 0x7c, 0xa2, 0x8a, 0x05, 0x4d, 0x90, 0x7b, 0x0d, 0x3a,
0x51, 0x07, 0x3c, 0xcd, 0x82, 0x50, 0xe4, 0xb7, 0xe4, 0xa8, 0x06, 0xa8, 0xc4, 0x1b, 0xb5, 0x0a, 0x07, 0xfe, 0xcc, 0xe3, 0xdf, 0x92, 0x25, 0xbe, 0xe8, 0x1b, 0xfb, 0x33, 0x64, 0x65, 0xed, 0x1b,
0xde, 0x90, 0xd6, 0xaa, 0x2a, 0x41, 0x92, 0x4c, 0x60, 0xc1, 0xd0, 0xac, 0xc9, 0xeb, 0x06, 0x84, 0x53, 0xb7, 0xfb, 0x5f, 0x0d, 0x58, 0x12, 0x98, 0x38, 0xea, 0x88, 0x67, 0x79, 0x10, 0x89, 0xe4,
0x73, 0x96, 0x03, 0x0a, 0xc1, 0x92, 0x5c, 0xdb, 0x08, 0xfa, 0x14, 0xd3, 0x4a, 0x76, 0x30, 0x41, 0x97, 0x1c, 0xd5, 0x00, 0x55, 0x78, 0xa3, 0x51, 0xc3, 0x1b, 0xd2, 0x5a, 0x55, 0xf5, 0x49, 0x92,
0x95, 0x3a, 0x6d, 0x51, 0x70, 0x4d, 0x49, 0xa7, 0x95, 0x74, 0xd7, 0xd2, 0x19, 0x74, 0x97, 0x30, 0x09, 0x2c, 0x18, 0x9a, 0x35, 0x45, 0x51, 0x81, 0x70, 0xce, 0x0a, 0x40, 0x29, 0x58, 0x52, 0x68,
0x61, 0x5f, 0xa5, 0xbb, 0xe0, 0x0c, 0xba, 0xcb, 0x65, 0xb0, 0xfa, 0x80, 0x73, 0x8f, 0xe3, 0xad, 0x1b, 0x41, 0x9f, 0x62, 0x5a, 0xc9, 0x0e, 0x26, 0xa8, 0x56, 0xa7, 0x2d, 0x0b, 0xae, 0xa9, 0xe8,
0xa8, 0xd8, 0xe9, 0x7b, 0x0e, 0xac, 0xca, 0x0b, 0x5d, 0xf7, 0xb1, 0xb7, 0xad, 0xdb, 0xdf, 0xa9, 0xb4, 0x8a, 0xee, 0x5a, 0x79, 0x09, 0xdd, 0x25, 0x4c, 0xd8, 0xe7, 0xe9, 0x2e, 0x78, 0x09, 0xdd,
0x4a, 0x5d, 0x5c, 0x81, 0x65, 0xba, 0x93, 0x75, 0x54, 0x48, 0x86, 0xb0, 0x2c, 0x20, 0xae, 0x43, 0xe5, 0x32, 0x58, 0x7f, 0x8f, 0x73, 0x8f, 0xe3, 0xad, 0xa8, 0xd8, 0xe9, 0x7b, 0x0e, 0xac, 0xcb,
0x05, 0xe3, 0xc7, 0xc1, 0x48, 0x1e, 0x8a, 0x09, 0x52, 0x81, 0x25, 0xf4, 0x8f, 0xe9, 0x48, 0x1c, 0x0b, 0x5d, 0xf7, 0xb1, 0xd7, 0xad, 0xdb, 0xdf, 0xa9, 0xcb, 0x6b, 0x5c, 0x85, 0x55, 0xba, 0x93,
0x4f, 0xb7, 0xdd, 0xbf, 0x71, 0x60, 0xcd, 0x20, 0x58, 0x72, 0xe1, 0x2d, 0x50, 0x75, 0x05, 0x22, 0x75, 0x54, 0x48, 0x86, 0xb0, 0x2c, 0x20, 0xae, 0x43, 0x45, 0xea, 0x27, 0x41, 0x28, 0x0f, 0xc5,
0x78, 0x24, 0x84, 0x69, 0xcb, 0x36, 0x4e, 0xf2, 0xcf, 0x2c, 0x64, 0x3a, 0x4c, 0x7f, 0x4a, 0x04, 0x04, 0xa9, 0xc0, 0x12, 0xfa, 0xc7, 0x74, 0x24, 0x8e, 0xa7, 0xdb, 0xee, 0xdf, 0x3a, 0xb0, 0x61,
0xa6, 0x93, 0xb1, 0xb4, 0x40, 0x4c, 0x10, 0x32, 0xd2, 0x29, 0xe7, 0xcf, 0x35, 0xca, 0x1c, 0xa1, 0x10, 0x2c, 0xb9, 0xf0, 0x5d, 0x50, 0x45, 0x07, 0x22, 0x78, 0x24, 0x84, 0xe9, 0x82, 0x6d, 0x9c,
0x58, 0x30, 0x4a, 0x1b, 0xa3, 0x2d, 0xa1, 0x91, 0x44, 0xa5, 0x94, 0x0d, 0x74, 0xff, 0xc9, 0x81, 0x14, 0x9f, 0x59, 0xc8, 0x74, 0x98, 0xfe, 0x8c, 0x08, 0xcc, 0xa6, 0x13, 0x69, 0x81, 0x98, 0x20,
0x75, 0x61, 0x14, 0x4a, 0x93, 0x5b, 0x57, 0x71, 0x2e, 0x08, 0x2b, 0x58, 0x48, 0xe4, 0xde, 0x39, 0x64, 0xa4, 0x33, 0xce, 0x9f, 0x68, 0x94, 0x05, 0x42, 0xb1, 0x60, 0x94, 0x53, 0x46, 0x5b, 0x42,
0x4f, 0xb6, 0xd9, 0x67, 0xcf, 0x68, 0xc8, 0xea, 0x72, 0x81, 0x19, 0x67, 0x31, 0x57, 0x75, 0x16, 0x23, 0x89, 0x32, 0x2a, 0x1b, 0xe8, 0xfe, 0xb3, 0x03, 0x9b, 0xc2, 0x28, 0x94, 0x26, 0xb7, 0x2e,
0xaf, 0xd8, 0xe9, 0xaa, 0x60, 0xc9, 0x7c, 0x65, 0xb0, 0xe4, 0xce, 0x22, 0xcc, 0xa7, 0xfd, 0x28, 0xf1, 0x5c, 0x12, 0x56, 0xb0, 0x90, 0xc8, 0xfd, 0x73, 0x9e, 0x6c, 0xb3, 0xcf, 0xbe, 0xa4, 0x21,
0xe6, 0xee, 0x26, 0x6c, 0xd8, 0x8b, 0x93, 0x2a, 0xe8, 0xfb, 0x0e, 0x74, 0x1e, 0x88, 0xd0, 0x61, 0xab, 0x6b, 0x09, 0xe6, 0x9c, 0xc5, 0x42, 0xdd, 0x59, 0x3c, 0x67, 0xa7, 0xeb, 0x82, 0x25, 0x8b,
0x10, 0x0e, 0xf7, 0x82, 0x34, 0x8b, 0x12, 0x5d, 0xb6, 0x7e, 0x09, 0x20, 0xcd, 0xfc, 0x24, 0x13, 0xb5, 0xc1, 0x92, 0xdb, 0xcb, 0xb0, 0x98, 0x0d, 0xe3, 0x84, 0xbb, 0xdb, 0xb0, 0x65, 0x2f, 0x4e,
0xe5, 0x5c, 0x32, 0xcc, 0x91, 0x43, 0x90, 0x46, 0x1e, 0x0e, 0x44, 0xaf, 0x38, 0x1b, 0xdd, 0xc6, 0xaa, 0xa0, 0xef, 0x3b, 0xd0, 0x7b, 0x4f, 0x84, 0x0e, 0x83, 0x68, 0xbc, 0x1f, 0x64, 0x79, 0x9c,
0x83, 0xa1, 0x52, 0x86, 0x5e, 0x74, 0x74, 0x94, 0x72, 0x6d, 0xb6, 0x9a, 0x30, 0xf4, 0x7c, 0x51, 0xea, 0x9a, 0xf6, 0xcb, 0x00, 0x59, 0xee, 0xa7, 0xb9, 0xa8, 0xf5, 0x92, 0x61, 0x8e, 0x02, 0x82,
0xe2, 0xd1, 0xd7, 0xe3, 0x27, 0xa4, 0x6a, 0x85, 0x3d, 0x58, 0x80, 0xba, 0x7f, 0xed, 0xc0, 0x4a, 0x34, 0xf2, 0x68, 0x24, 0x7a, 0xc5, 0xd9, 0xe8, 0x36, 0x1e, 0x0c, 0xd5, 0x39, 0x0c, 0xe2, 0xe3,
0x4e, 0xe4, 0x7d, 0x04, 0xda, 0xda, 0x41, 0x90, 0x66, 0x68, 0x07, 0x15, 0x80, 0x09, 0x06, 0xbd, 0xe3, 0x8c, 0x6b, 0xb3, 0xd5, 0x84, 0xa1, 0xe7, 0x8b, 0x12, 0x8f, 0xbe, 0x1e, 0x3f, 0x25, 0x55,
0x20, 0x94, 0xb4, 0x19, 0x10, 0x92, 0x58, 0xd9, 0x8a, 0x26, 0xaa, 0x74, 0xce, 0x04, 0x89, 0xbc, 0x2b, 0xec, 0xc1, 0x12, 0xd4, 0xfd, 0x1b, 0x07, 0xd6, 0x0a, 0x22, 0xef, 0x21, 0xd0, 0xd6, 0x0e,
0x78, 0x86, 0x5f, 0x8b, 0xba, 0x39, 0xd9, 0xa2, 0x6a, 0xbc, 0x71, 0x46, 0x5f, 0x2d, 0x08, 0x83, 0x82, 0x34, 0x43, 0x3b, 0xa8, 0x00, 0x4c, 0x30, 0x1a, 0x04, 0x91, 0xa4, 0xcd, 0x80, 0x90, 0xc4,
0x58, 0x36, 0xd5, 0xfd, 0xb4, 0x48, 0x50, 0xfc, 0xe9, 0xfe, 0xa1, 0x03, 0x17, 0x2a, 0x36, 0x57, 0xca, 0x56, 0x3c, 0x55, 0x75, 0x75, 0x26, 0x48, 0x24, 0xcd, 0x73, 0xfc, 0x5a, 0x14, 0xd5, 0xc9,
0x4a, 0xc6, 0x3d, 0x58, 0x3b, 0xd2, 0x9d, 0x6a, 0x03, 0x84, 0x78, 0x6c, 0x4a, 0x2e, 0x2a, 0x2c, 0x16, 0x95, 0xea, 0x4d, 0x72, 0xfa, 0x6a, 0x49, 0x18, 0xc4, 0xb2, 0xa9, 0xee, 0xa7, 0x65, 0x82,
0xda, 0x2b, 0x7f, 0x80, 0xe6, 0x31, 0xc5, 0x8d, 0xc4, 0x96, 0x5a, 0x25, 0x25, 0xe5, 0x8e, 0xdd, 0xe2, 0x4f, 0xf7, 0x0f, 0x1c, 0xb8, 0x58, 0xb3, 0xb9, 0x52, 0x32, 0xee, 0xc2, 0xc6, 0xb1, 0xee,
0x3f, 0x9a, 0x83, 0xb6, 0xc8, 0x6a, 0x88, 0x97, 0x5c, 0x3c, 0x61, 0x1f, 0xc2, 0xa2, 0x7c, 0x89, 0x54, 0x1b, 0x20, 0xc4, 0x63, 0x5b, 0x72, 0x51, 0x69, 0xd1, 0x5e, 0xf5, 0x03, 0x34, 0x8f, 0x29,
0xc7, 0xce, 0xcb, 0x69, 0xed, 0xb7, 0x7f, 0xdd, 0xcd, 0x22, 0x58, 0xf2, 0xce, 0xfa, 0x6f, 0x7f, 0x6e, 0x24, 0xb6, 0xd4, 0xaa, 0x37, 0xa9, 0x76, 0xec, 0xfd, 0xe1, 0x02, 0x74, 0x45, 0xca, 0x43,
0xfc, 0x2f, 0x7f, 0x5c, 0x5b, 0x66, 0xcd, 0x9d, 0x93, 0x77, 0x77, 0x86, 0x3c, 0x4c, 0x71, 0x8c, 0x3c, 0x02, 0xe3, 0x29, 0xfb, 0x00, 0x96, 0xe5, 0x23, 0x3e, 0x76, 0x5e, 0x4e, 0x6b, 0x3f, 0x1b,
0x5f, 0x03, 0xc8, 0xdf, 0xa8, 0xb1, 0x8e, 0x36, 0x32, 0x0a, 0x8f, 0xef, 0xba, 0x17, 0x2a, 0x7a, 0xec, 0x6f, 0x97, 0xc1, 0x92, 0x77, 0x36, 0x7f, 0xfb, 0xe3, 0x7f, 0xfd, 0xa3, 0xc6, 0x2a, 0x6b,
0xe4, 0xb8, 0x17, 0x68, 0xdc, 0x75, 0xb7, 0x8d, 0xe3, 0x06, 0x61, 0x90, 0x89, 0x07, 0x6b, 0x37, 0xef, 0x9e, 0xbe, 0xb9, 0x3b, 0xe6, 0x51, 0x86, 0x63, 0xfc, 0x1a, 0x40, 0xf1, 0xbc, 0x8d, 0xf5,
0x9d, 0x6d, 0x36, 0x80, 0x96, 0xf9, 0x04, 0x8d, 0x29, 0x97, 0xb9, 0xe2, 0x01, 0x5c, 0xf7, 0x8d, 0xb4, 0x91, 0x51, 0x7a, 0xb7, 0xd7, 0xbf, 0x58, 0xd3, 0x23, 0xc7, 0xbd, 0x48, 0xe3, 0x6e, 0xba,
0xca, 0x3e, 0x15, 0x2f, 0xa0, 0x39, 0xce, 0xbb, 0xab, 0x38, 0xc7, 0x84, 0x30, 0xf2, 0x59, 0x46, 0x5d, 0x1c, 0x37, 0x88, 0x82, 0x5c, 0xbc, 0x75, 0x7b, 0xc7, 0xd9, 0x61, 0x23, 0xe8, 0x98, 0xaf,
0xd0, 0xb6, 0x5f, 0x9a, 0xb1, 0x8b, 0x86, 0x58, 0x97, 0xde, 0xb9, 0x75, 0xdf, 0x9c, 0xd1, 0x2b, 0xd7, 0x98, 0x72, 0x99, 0x6b, 0xde, 0xce, 0xf5, 0x5f, 0xa9, 0xed, 0x53, 0xf1, 0x02, 0x9a, 0xe3,
0xe7, 0x7a, 0x93, 0xe6, 0xda, 0x72, 0x19, 0xce, 0xd5, 0x27, 0x1c, 0xf5, 0xce, 0xed, 0xa6, 0xb3, 0xbc, 0xbb, 0x8e, 0x73, 0x4c, 0x09, 0xa3, 0x98, 0x25, 0x84, 0xae, 0xfd, 0x48, 0x8d, 0x5d, 0x32,
0xbd, 0xfb, 0xdd, 0x37, 0xa1, 0xa1, 0x83, 0x5c, 0xec, 0x9b, 0xb0, 0x6c, 0xa5, 0x9d, 0x98, 0x5a, 0xc4, 0xba, 0xf2, 0x44, 0xae, 0xff, 0xea, 0x9c, 0x5e, 0x39, 0xd7, 0xab, 0x34, 0xd7, 0x05, 0x97,
0x46, 0x55, 0x96, 0xaa, 0x7b, 0xb1, 0xba, 0x53, 0x4e, 0x7c, 0x89, 0x26, 0xee, 0xb0, 0x4d, 0x9c, 0xe1, 0x5c, 0x43, 0xc2, 0x51, 0x4f, 0xe4, 0xde, 0x71, 0x76, 0xf6, 0xbe, 0xfb, 0x2a, 0xb4, 0x74,
0x58, 0xe6, 0x6d, 0x76, 0x28, 0xd9, 0x26, 0x6a, 0xfd, 0x9e, 0x8b, 0x75, 0xe6, 0xa9, 0x22, 0x6b, 0x90, 0x8b, 0x7d, 0x13, 0x56, 0xad, 0x9c, 0x14, 0x53, 0xcb, 0xa8, 0x4b, 0x61, 0xf5, 0x2f, 0xd5,
0x9d, 0xa5, 0xd4, 0x92, 0xb5, 0xce, 0x72, 0x7e, 0xc9, 0xbd, 0x48, 0xd3, 0x6d, 0xb2, 0x0d, 0x73, 0x77, 0xca, 0x89, 0x2f, 0xd3, 0xc4, 0x3d, 0xb6, 0x8d, 0x13, 0xcb, 0xa4, 0xce, 0x2e, 0x65, 0xe2,
0x3a, 0x1d, 0x7c, 0xe2, 0x54, 0x9d, 0x69, 0x3e, 0x44, 0x63, 0x6f, 0x6a, 0xc6, 0xaa, 0x7a, 0xa0, 0x44, 0x21, 0xe0, 0x13, 0xb1, 0xce, 0x22, 0x8f, 0x64, 0xad, 0xb3, 0x92, 0x77, 0xb2, 0xd6, 0x59,
0xa6, 0x59, 0xa4, 0xfc, 0x4a, 0xcd, 0xed, 0xd0, 0x54, 0x8c, 0xd1, 0xf1, 0x99, 0xef, 0xd0, 0xd8, 0x4d, 0x3e, 0xb9, 0x97, 0x68, 0xba, 0x6d, 0xb6, 0x65, 0x4e, 0xa7, 0x83, 0x4f, 0x9c, 0x4a, 0x37,
0xd7, 0xa1, 0xa1, 0x1f, 0x7b, 0xb0, 0x2d, 0xe3, 0x85, 0x8d, 0xf9, 0x02, 0xa5, 0xdb, 0x29, 0x77, 0xcd, 0x37, 0x6c, 0xec, 0x55, 0xcd, 0x58, 0x75, 0x6f, 0xdb, 0x34, 0x8b, 0x54, 0x1f, 0xb8, 0xb9,
0x54, 0x31, 0x86, 0x39, 0x32, 0x32, 0xc6, 0x23, 0x38, 0x2f, 0x4d, 0xe2, 0x43, 0xfe, 0xe3, 0xac, 0x3d, 0x9a, 0x8a, 0x31, 0x3a, 0x3e, 0xf3, 0x09, 0x1b, 0xfb, 0x3a, 0xb4, 0xf4, 0x4b, 0x10, 0x76,
0xa4, 0xe2, 0xf9, 0xdc, 0x0d, 0x87, 0xdd, 0x82, 0x25, 0xf5, 0x86, 0x86, 0x6d, 0x56, 0xbf, 0x05, 0xc1, 0x78, 0x7e, 0x63, 0x3e, 0x4f, 0xe9, 0xf7, 0xaa, 0x1d, 0x75, 0x8c, 0x61, 0x8e, 0x8c, 0x8c,
0xea, 0x6e, 0x95, 0xe0, 0x52, 0x7b, 0xdc, 0x06, 0xc8, 0xdf, 0x7f, 0x68, 0x39, 0x2b, 0xbd, 0x4a, 0xf1, 0x00, 0xce, 0x4b, 0x93, 0xf8, 0x88, 0xff, 0x38, 0x2b, 0xa9, 0x79, 0x79, 0x77, 0xd3, 0x61,
0xd1, 0x9b, 0x58, 0xf1, 0x58, 0x64, 0x48, 0xaf, 0x5d, 0xec, 0xe7, 0x25, 0xec, 0xad, 0x1c, 0xbf, 0xef, 0xc2, 0x8a, 0x7a, 0x60, 0xc3, 0xb6, 0xeb, 0x1f, 0x0a, 0xf5, 0x2f, 0x54, 0xe0, 0x52, 0x7b,
0xf2, 0xe1, 0xc9, 0x2b, 0x06, 0x74, 0x37, 0x69, 0xef, 0x56, 0x19, 0x09, 0x6e, 0xc8, 0x4f, 0x55, 0xdc, 0x02, 0x28, 0x1e, 0x87, 0x68, 0x39, 0xab, 0x3c, 0x59, 0xd1, 0x9b, 0x58, 0xf3, 0x92, 0x64,
0x9d, 0xf2, 0x3d, 0x68, 0x1a, 0x6f, 0x4a, 0x98, 0x1a, 0xa1, 0xfc, 0x1e, 0xa5, 0xdb, 0xad, 0xea, 0x4c, 0x4f, 0x61, 0xec, 0xb7, 0x27, 0xec, 0xb5, 0x02, 0xbf, 0xf6, 0x55, 0xca, 0x73, 0x06, 0x74,
0x92, 0xe4, 0x7e, 0x11, 0x96, 0xad, 0xc7, 0x21, 0x5a, 0x32, 0xaa, 0x9e, 0x9e, 0x68, 0xc9, 0xa8, 0xb7, 0x69, 0xef, 0xd6, 0x19, 0x09, 0x6e, 0xc4, 0xcf, 0x54, 0x11, 0xf3, 0x5d, 0x68, 0x1b, 0x0f,
0x7e, 0x4f, 0xf2, 0x35, 0x68, 0x1a, 0x4f, 0x39, 0x98, 0x51, 0x9f, 0x55, 0x78, 0xc4, 0xa1, 0x29, 0x4e, 0x98, 0x1a, 0xa1, 0xfa, 0x58, 0xa5, 0xdf, 0xaf, 0xeb, 0x92, 0xe4, 0x7e, 0x11, 0x56, 0xad,
0xaa, 0x7a, 0xf9, 0xb1, 0x41, 0xeb, 0x6d, 0xbb, 0x0d, 0x5c, 0x2f, 0x15, 0xeb, 0x22, 0x93, 0x7c, 0x97, 0x23, 0x5a, 0x32, 0xea, 0xde, 0xa5, 0x68, 0xc9, 0xa8, 0x7f, 0x6c, 0xf2, 0x35, 0x68, 0x1b,
0x13, 0xda, 0xf6, 0xe3, 0x0e, 0x2d, 0x55, 0x95, 0xcf, 0x44, 0xb4, 0x54, 0xcd, 0x78, 0x11, 0x22, 0xef, 0x3c, 0x98, 0x51, 0xbc, 0x55, 0x7a, 0xe1, 0xa1, 0x29, 0xaa, 0x7b, 0x16, 0xb2, 0x45, 0xeb,
0x19, 0x72, 0x7b, 0x5d, 0x4f, 0xb2, 0xf3, 0x91, 0x4c, 0xf1, 0xbc, 0x64, 0x5f, 0x41, 0xd5, 0x21, 0xed, 0xba, 0x2d, 0x5c, 0x2f, 0x55, 0xf2, 0x22, 0x93, 0x7c, 0x13, 0xba, 0xf6, 0xcb, 0x0f, 0x2d,
0xab, 0xa7, 0x59, 0xfe, 0xa4, 0xc5, 0xae, 0xb1, 0xd6, 0xdc, 0x5e, 0x2a, 0xb4, 0x76, 0xd7, 0x68, 0x55, 0xb5, 0x6f, 0x48, 0xb4, 0x54, 0xcd, 0x79, 0x2e, 0x22, 0x19, 0x72, 0x67, 0x53, 0x4f, 0xb2,
0xf0, 0x26, 0xcb, 0x57, 0x20, 0xee, 0x03, 0xaa, 0xa2, 0x36, 0xee, 0x03, 0xb3, 0xd0, 0xda, 0xb8, 0xfb, 0x91, 0x4c, 0xf1, 0x3c, 0x63, 0x5f, 0x41, 0xd5, 0x21, 0x4b, 0xab, 0x59, 0xf1, 0xde, 0xc5,
0x0f, 0xac, 0x62, 0xeb, 0xe2, 0x7d, 0x90, 0x05, 0x38, 0x46, 0x08, 0x2b, 0x85, 0x02, 0x05, 0x2d, 0x2e, 0xc0, 0xd6, 0xdc, 0x5e, 0xa9, 0xc2, 0x76, 0x37, 0x68, 0xf0, 0x36, 0x2b, 0x56, 0x20, 0xee,
0x2c, 0xd5, 0x15, 0x5d, 0xdd, 0x4b, 0xaf, 0xae, 0x6b, 0xb0, 0xd5, 0x8c, 0x52, 0x2f, 0x3b, 0xaa, 0x03, 0x2a, 0xb1, 0x36, 0xee, 0x03, 0xb3, 0x0a, 0xdb, 0xb8, 0x0f, 0xac, 0x4a, 0xec, 0xf2, 0x7d,
0x00, 0xef, 0xd7, 0xa1, 0x65, 0x16, 0xe5, 0xeb, 0x1b, 0xa2, 0xe2, 0x29, 0x81, 0xbe, 0x21, 0xaa, 0x90, 0x07, 0x38, 0x46, 0x04, 0x6b, 0xa5, 0xea, 0x05, 0x2d, 0x2c, 0xf5, 0xe5, 0x5e, 0xfd, 0xcb,
0xaa, 0xf8, 0xd5, 0xe1, 0xb2, 0x96, 0x39, 0x0d, 0xfb, 0x1a, 0xac, 0x18, 0x15, 0x39, 0x07, 0xd3, 0xcf, 0x2f, 0x7a, 0xb0, 0xd5, 0x8c, 0x52, 0x2f, 0xbb, 0xaa, 0x3a, 0xef, 0xd7, 0xa1, 0x63, 0x56,
0xb0, 0xaf, 0x99, 0xa7, 0x5c, 0xaf, 0xd9, 0xad, 0xb2, 0x06, 0xdd, 0x2d, 0x1a, 0x78, 0xcd, 0xb5, 0xec, 0xeb, 0x1b, 0xa2, 0xe6, 0x9d, 0x81, 0xbe, 0x21, 0xea, 0x4a, 0xfc, 0xd5, 0xe1, 0xb2, 0x8e,
0x06, 0x46, 0xc6, 0xb9, 0x0b, 0x4d, 0xb3, 0xda, 0xe7, 0x15, 0xe3, 0x6e, 0x19, 0x5d, 0x66, 0xe9, 0x39, 0x0d, 0xfb, 0x1a, 0xac, 0x19, 0xe5, 0x3a, 0x87, 0xb3, 0x68, 0xa8, 0x99, 0xa7, 0x5a, 0xcc,
0xe2, 0x0d, 0x87, 0xfd, 0x89, 0x03, 0x2d, 0xab, 0x76, 0xc6, 0x8a, 0x2a, 0x17, 0xc6, 0xe9, 0x98, 0xd9, 0xaf, 0xb3, 0x06, 0xdd, 0x0b, 0x34, 0xf0, 0x86, 0x6b, 0x0d, 0x8c, 0x8c, 0x73, 0x07, 0xda,
0x7d, 0xe6, 0x40, 0xae, 0x47, 0x44, 0x3e, 0xda, 0xfe, 0xa2, 0xb5, 0xc9, 0x1f, 0x59, 0x5e, 0xc5, 0x66, 0x29, 0xd0, 0x73, 0xc6, 0xbd, 0x60, 0x74, 0x99, 0x75, 0x8d, 0x37, 0x1d, 0xf6, 0x27, 0x0e,
0xf5, 0xe2, 0x7b, 0xcb, 0x97, 0x45, 0x04, 0xb3, 0xa6, 0xf5, 0xe5, 0x0d, 0x87, 0xdd, 0x14, 0x6f, 0x74, 0xac, 0xc2, 0x1a, 0x2b, 0xaa, 0x5c, 0x1a, 0xa7, 0x67, 0xf6, 0x99, 0x03, 0xb9, 0x1e, 0x11,
0x84, 0x55, 0x14, 0x81, 0x19, 0xca, 0xad, 0xb8, 0x65, 0xe6, 0x73, 0xda, 0x6b, 0xce, 0x0d, 0x87, 0xf9, 0x60, 0xe7, 0x8b, 0xd6, 0x26, 0x7f, 0x64, 0x79, 0x15, 0x37, 0xca, 0x8f, 0x31, 0x9f, 0x95,
0x7d, 0x43, 0x3c, 0xab, 0x94, 0xdf, 0xd2, 0xce, 0x9f, 0xf5, 0x7b, 0xf7, 0x0a, 0xad, 0xe6, 0x92, 0x11, 0xcc, 0x82, 0xd7, 0x67, 0x37, 0x1d, 0xf6, 0x8e, 0x78, 0x5e, 0xac, 0xa2, 0x08, 0xcc, 0x50,
0x7b, 0xc1, 0x5a, 0x4d, 0x51, 0xbb, 0xdf, 0x16, 0xd4, 0xc9, 0xd7, 0xb2, 0xb9, 0x9a, 0x2a, 0xbd, 0x6e, 0xe5, 0x2d, 0x33, 0xdf, 0xda, 0x5e, 0x77, 0x6e, 0x3a, 0xec, 0x1b, 0xe2, 0xcd, 0xa5, 0xfc,
0xa0, 0x9d, 0x4d, 0xe4, 0x58, 0x10, 0x29, 0xd1, 0x2d, 0xf6, 0x38, 0xe3, 0x30, 0xee, 0x36, 0xd1, 0x96, 0x76, 0xfe, 0x65, 0xbf, 0x77, 0xaf, 0xd2, 0x6a, 0x2e, 0xbb, 0x17, 0xad, 0xd5, 0x94, 0xb5,
0x7a, 0xc5, 0x7d, 0x6b, 0x26, 0xad, 0x3b, 0xe4, 0x25, 0x22, 0xc5, 0xfb, 0x00, 0x79, 0x10, 0x8b, 0xfb, 0x2d, 0x41, 0x9d, 0x7c, 0x4a, 0x5b, 0xa8, 0xa9, 0xca, 0xf3, 0xda, 0xf9, 0x44, 0x4e, 0x04,
0x15, 0x22, 0x3a, 0x5a, 0x53, 0x97, 0xe3, 0x5c, 0x36, 0x0f, 0xaa, 0xc0, 0x0f, 0x8e, 0xf8, 0x75, 0x91, 0x12, 0xdd, 0x62, 0x8f, 0x97, 0x1c, 0xc6, 0xdd, 0x21, 0x5a, 0xaf, 0xba, 0xaf, 0xcd, 0xa5,
0x21, 0x3e, 0x12, 0x3f, 0xd5, 0xd4, 0x97, 0x83, 0x51, 0xdd, 0x6e, 0x55, 0x57, 0x95, 0xf0, 0xa8, 0x75, 0x97, 0xbc, 0x44, 0xa4, 0xf8, 0x00, 0xa0, 0x08, 0x62, 0xb1, 0x52, 0x44, 0x47, 0x6b, 0xea,
0xf1, 0xd9, 0x53, 0x58, 0x7e, 0x14, 0x45, 0xcf, 0x27, 0xb1, 0x0e, 0xb3, 0xda, 0x31, 0x95, 0x3d, 0x6a, 0x9c, 0xcb, 0xe6, 0x41, 0x15, 0xf8, 0xc1, 0x11, 0xbf, 0x2e, 0xc4, 0x47, 0xe2, 0x67, 0x9a,
0x3f, 0x3d, 0xee, 0x16, 0x56, 0xe1, 0x5e, 0xa6, 0xa1, 0xba, 0xac, 0x63, 0x0c, 0xb5, 0xf3, 0x51, 0xfa, 0x6a, 0x30, 0xaa, 0xdf, 0xaf, 0xeb, 0xaa, 0x13, 0x1e, 0x35, 0x3e, 0xfb, 0x10, 0x56, 0x1f,
0x1e, 0x42, 0x7b, 0xc9, 0x7c, 0x58, 0xd3, 0xb7, 0xb2, 0x26, 0xbc, 0x6b, 0x0f, 0x63, 0x46, 0xb2, 0xc4, 0xf1, 0x93, 0x69, 0xa2, 0xc3, 0xac, 0x76, 0x4c, 0x65, 0xdf, 0xcf, 0x4e, 0xfa, 0xa5, 0x55,
0x4a, 0x53, 0x58, 0x76, 0x92, 0xa2, 0x76, 0x27, 0x55, 0x63, 0xde, 0x70, 0xd8, 0x3e, 0xb4, 0xee, 0xb8, 0x57, 0x68, 0xa8, 0x3e, 0xeb, 0x19, 0x43, 0xed, 0x7e, 0x54, 0x84, 0xd0, 0x9e, 0x31, 0x1f,
0xf1, 0x7e, 0x34, 0xe0, 0x32, 0x0a, 0xb2, 0x9e, 0x13, 0xae, 0xc3, 0x27, 0xdd, 0x65, 0x0b, 0x68, 0x36, 0xf4, 0xad, 0xac, 0x09, 0xef, 0xdb, 0xc3, 0x98, 0x91, 0xac, 0xca, 0x14, 0x96, 0x9d, 0xa4,
0xeb, 0xa9, 0xd8, 0x9f, 0x26, 0xfc, 0x5b, 0x3b, 0x1f, 0xc9, 0xf8, 0xca, 0x4b, 0xa5, 0xa7, 0x54, 0xa8, 0xdd, 0xcd, 0xd4, 0x98, 0x37, 0x1d, 0x76, 0x00, 0x9d, 0xbb, 0x7c, 0x18, 0x8f, 0xb8, 0x8c,
0x4c, 0xc8, 0xd2, 0x53, 0x85, 0x20, 0x92, 0xa5, 0xa7, 0x4a, 0x41, 0x24, 0x6b, 0xab, 0x55, 0x4c, 0x82, 0x6c, 0x16, 0x84, 0xeb, 0xf0, 0x49, 0x7f, 0xd5, 0x02, 0xda, 0x7a, 0x2a, 0xf1, 0x67, 0x29,
0x8a, 0x8d, 0x60, 0xad, 0x14, 0x77, 0xd2, 0x77, 0xfb, 0xac, 0x68, 0x55, 0xf7, 0xf2, 0x6c, 0x04, 0xff, 0xd6, 0xee, 0x47, 0x32, 0xbe, 0xf2, 0x4c, 0xe9, 0x29, 0x15, 0x13, 0xb2, 0xf4, 0x54, 0x29,
0x7b, 0xb6, 0x6d, 0x7b, 0xb6, 0x03, 0x58, 0xbe, 0xc7, 0xc5, 0x66, 0x89, 0x5c, 0x6e, 0xd7, 0x56, 0x88, 0x64, 0xe9, 0xa9, 0x4a, 0x10, 0xc9, 0xda, 0x6a, 0x15, 0x93, 0x62, 0x21, 0x6c, 0x54, 0xe2,
0x7c, 0x66, 0xde, 0xb7, 0xa8, 0x14, 0xa9, 0xcf, 0xbe, 0x88, 0x28, 0x91, 0xca, 0xbe, 0x0e, 0xcd, 0x4e, 0xfa, 0x6e, 0x9f, 0x17, 0xad, 0xea, 0x5f, 0x99, 0x8f, 0x60, 0xcf, 0xb6, 0x63, 0xcf, 0x76,
0x87, 0x3c, 0x53, 0xc9, 0x5b, 0x6d, 0x21, 0x15, 0xb2, 0xb9, 0xdd, 0x8a, 0xdc, 0xaf, 0xcd, 0x33, 0x08, 0xab, 0x77, 0xb9, 0xd8, 0x2c, 0x91, 0xcb, 0xed, 0xdb, 0x8a, 0xcf, 0xcc, 0xfb, 0x96, 0x95,
0x34, 0xda, 0x0e, 0x1f, 0x0c, 0xb9, 0x50, 0x4f, 0xbd, 0x60, 0xf0, 0x92, 0xfd, 0x0a, 0x0d, 0xae, 0x22, 0xf5, 0xd9, 0x17, 0x11, 0x25, 0x52, 0xd9, 0xd7, 0xa1, 0x7d, 0x9f, 0xe7, 0x2a, 0x79, 0xab,
0xeb, 0x3d, 0x36, 0x8d, 0x9c, 0x9f, 0x39, 0xf8, 0x4a, 0x01, 0x5e, 0x35, 0x72, 0x18, 0x0d, 0xb8, 0x2d, 0xa4, 0x52, 0x36, 0xb7, 0x5f, 0x93, 0xfb, 0xb5, 0x79, 0x86, 0x46, 0xdb, 0xe5, 0xa3, 0x31,
0x71, 0x25, 0x87, 0xd0, 0x34, 0x8a, 0x91, 0xb4, 0x00, 0x95, 0x4b, 0xa5, 0xb4, 0x00, 0x55, 0xd4, 0x17, 0xea, 0x69, 0x10, 0x8c, 0x9e, 0xb1, 0x5f, 0xa1, 0xc1, 0x75, 0xbd, 0xc7, 0xb6, 0x91, 0xf3,
0x2e, 0xb9, 0xd7, 0x68, 0x1e, 0x97, 0x5d, 0xce, 0xe7, 0x11, 0xf5, 0x4a, 0xf9, 0x4c, 0x3b, 0x1f, 0x33, 0x07, 0x5f, 0x2b, 0xc1, 0xeb, 0x46, 0x8e, 0xe2, 0x11, 0x37, 0xae, 0xe4, 0x08, 0xda, 0x46,
0xf9, 0xe3, 0xec, 0x25, 0x7b, 0x46, 0x0f, 0xa1, 0xcc, 0x04, 0x75, 0x6e, 0xa1, 0x15, 0x73, 0xd9, 0x31, 0x92, 0x16, 0xa0, 0x6a, 0x1d, 0x95, 0x16, 0xa0, 0x9a, 0xda, 0x25, 0xf7, 0x3a, 0xcd, 0xe3,
0x7a, 0xb3, 0x8c, 0x2e, 0xdb, 0x6a, 0x13, 0x53, 0xd1, 0xcd, 0xfd, 0x59, 0x80, 0x83, 0x2c, 0x8a, 0xb2, 0x2b, 0xc5, 0x3c, 0xa2, 0x5e, 0xa9, 0x98, 0x69, 0xf7, 0x23, 0x7f, 0x92, 0x3f, 0x63, 0x8f,
0xef, 0xf9, 0x7c, 0x1c, 0x85, 0xb9, 0xae, 0xcd, 0x93, 0xb0, 0xb9, 0xfe, 0x32, 0x32, 0xb1, 0xec, 0xe9, 0x95, 0x94, 0x99, 0xa0, 0x2e, 0x2c, 0xb4, 0x72, 0x2e, 0x5b, 0x6f, 0x96, 0xd1, 0x65, 0x5b,
0x99, 0x61, 0x23, 0x5b, 0xf9, 0x7d, 0xc5, 0x5c, 0x33, 0xf3, 0xb4, 0x7a, 0x43, 0x2a, 0x72, 0xb5, 0x6d, 0x62, 0x2a, 0xba, 0xb9, 0x3f, 0x0b, 0x70, 0x98, 0xc7, 0xc9, 0x5d, 0x9f, 0x4f, 0xe2, 0xa8,
0x37, 0x1c, 0xb4, 0x78, 0xf3, 0x28, 0xa7, 0xb6, 0x78, 0x4b, 0x01, 0x54, 0xad, 0xf6, 0x2a, 0x42, 0xd0, 0xb5, 0x45, 0x12, 0xb6, 0xd0, 0x5f, 0x46, 0x26, 0x96, 0x3d, 0x36, 0x6c, 0x64, 0x2b, 0xbf,
0xa2, 0xfb, 0xd0, 0xc8, 0xc3, 0x66, 0xea, 0x12, 0x2d, 0x06, 0xd9, 0xf4, 0xad, 0x58, 0x0a, 0x66, 0xaf, 0x98, 0x6b, 0x6e, 0x9e, 0x56, 0x6f, 0x48, 0x4d, 0xae, 0xf6, 0xa6, 0x83, 0x16, 0x6f, 0x11,
0xb9, 0xab, 0xb4, 0x55, 0xc0, 0x96, 0x70, 0xab, 0x28, 0x42, 0x15, 0xc0, 0xba, 0x20, 0x50, 0x5f, 0xe5, 0xd4, 0x16, 0x6f, 0x25, 0x80, 0xaa, 0xd5, 0x5e, 0x4d, 0x48, 0xf4, 0x00, 0x5a, 0x45, 0xd8,
0xf1, 0x94, 0x56, 0x54, 0x2b, 0xa9, 0x08, 0x28, 0x69, 0x69, 0xae, 0x8c, 0xc7, 0x58, 0xbe, 0x2f, 0x4c, 0x5d, 0xa2, 0xe5, 0x20, 0x9b, 0xbe, 0x15, 0x2b, 0xc1, 0x2c, 0x77, 0x9d, 0xb6, 0x0a, 0xd8,
0x72, 0xab, 0x48, 0x69, 0xa2, 0x6a, 0x1e, 0xc3, 0x5a, 0x29, 0x98, 0xa0, 0x45, 0x7a, 0x56, 0x0c, 0x0a, 0x6e, 0x15, 0x45, 0xa8, 0x02, 0xd8, 0x14, 0x04, 0xea, 0x2b, 0x9e, 0xd2, 0x8a, 0x6a, 0x25,
0x47, 0x8b, 0xf4, 0xcc, 0x38, 0x84, 0x7b, 0x9e, 0xa6, 0x5c, 0x71, 0x01, 0xa7, 0x4c, 0x4f, 0x83, 0x35, 0x01, 0x25, 0x2d, 0xcd, 0xb5, 0xf1, 0x18, 0xcb, 0xf7, 0x45, 0x6e, 0x15, 0x29, 0x4d, 0x54,
0xac, 0x7f, 0x7c, 0xd3, 0xd9, 0x3e, 0x5c, 0xa0, 0xbf, 0x02, 0xfa, 0xf4, 0xff, 0x06, 0x00, 0x00, 0xcd, 0x13, 0xd8, 0xa8, 0x04, 0x13, 0xb4, 0x48, 0xcf, 0x8b, 0xe1, 0x68, 0x91, 0x9e, 0x1b, 0x87,
0xff, 0xff, 0x15, 0xdc, 0x6d, 0x7b, 0x3c, 0x48, 0x00, 0x00, 0x70, 0xcf, 0xd3, 0x94, 0x6b, 0x2e, 0xe0, 0x94, 0xd9, 0x59, 0x90, 0x0f, 0x4f, 0xde, 0x71, 0x76,
0x8e, 0x96, 0xe8, 0x5f, 0x84, 0x3e, 0xfd, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xaf, 0xef,
0x4c, 0x77, 0x48, 0x00, 0x00,
} }

@ -671,6 +671,10 @@ message SendRequest {
/// The CLTV delta from the current height that should be used to set the timelock for the final hop. /// The CLTV delta from the current height that should be used to set the timelock for the final hop.
int32 final_cltv_delta = 7; int32 final_cltv_delta = 7;
/// The maximum total fees for the payment in satoshis.
int64 fee_limit = 8 [json_name = "fee_limit"];
} }
message SendResponse { message SendResponse {
string payment_error = 1 [json_name = "payment_error"]; string payment_error = 1 [json_name = "payment_error"];
@ -1230,6 +1234,9 @@ message QueryRoutesRequest {
/// An optional CLTV delta from the current height that should be used for the timelock of the final hop /// An optional CLTV delta from the current height that should be used for the timelock of the final hop
int32 final_cltv_delta = 4; int32 final_cltv_delta = 4;
/// The maximum total fees for the route in satoshis.
int64 fee_limit = 5;
} }
message QueryRoutesResponse { message QueryRoutesResponse {
repeated Route routes = 1 [ json_name = "routes"]; repeated Route routes = 1 [ json_name = "routes"];

@ -474,6 +474,14 @@
"required": false, "required": false,
"type": "integer", "type": "integer",
"format": "int32" "format": "int32"
},
{
"name": "fee_limit",
"description": "/ The maximum total fees for the route in satoshis.",
"in": "query",
"required": false,
"type": "string",
"format": "int64"
} }
], ],
"tags": [ "tags": [
@ -2381,6 +2389,11 @@
"type": "integer", "type": "integer",
"format": "int32", "format": "int32",
"description": "/ The CLTV delta from the current height that should be used to set the timelock for the final hop." "description": "/ The CLTV delta from the current height that should be used to set the timelock for the final hop."
},
"fee_limit": {
"type": "string",
"format": "int64",
"description": "/ The maximum total fees for the payment in satoshis."
} }
} }
}, },

@ -42,6 +42,10 @@ const (
// ErrPaymentAttemptTimeout is an error that indicates that a payment // ErrPaymentAttemptTimeout is an error that indicates that a payment
// attempt timed out before we were able to successfully route an HTLC. // attempt timed out before we were able to successfully route an HTLC.
ErrPaymentAttemptTimeout ErrPaymentAttemptTimeout
// ErrFeeCutoffExceeded is returned when the total fees of a route
// exceed the user-specified maximum payment for the fee.
ErrFeeCutoffExceeded
) )
// routerError is a structure that represent the error inside the routing package, // routerError is a structure that represent the error inside the routing package,

@ -250,7 +250,7 @@ func (r *Route) ToHopPayloads() []sphinx.HopData {
// the source to the target node of the path finding attempt. // the source to the target node of the path finding attempt.
func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex Vertex, func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex Vertex,
pathEdges []*ChannelHop, currentHeight uint32, pathEdges []*ChannelHop, currentHeight uint32,
finalCLTVDelta uint16) (*Route, error) { finalCLTVDelta uint16, feeLimit btcutil.Amount) (*Route, error) {
// First, we'll create a new empty route with enough hops to match the // First, we'll create a new empty route with enough hops to match the
// amount of path edges. We set the TotalTimeLock to the current block // amount of path edges. We set the TotalTimeLock to the current block
@ -265,9 +265,6 @@ func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex Vertex,
prevHopMap: make(map[Vertex]*ChannelHop), prevHopMap: make(map[Vertex]*ChannelHop),
} }
// TODO(roasbeef): need to do sanity check to ensure we don't make a
// "dust" payment: over x% of money sending to fees
// We'll populate the next hop map for the _source_ node with the // We'll populate the next hop map for the _source_ node with the
// information for the first hop so the mapping is sound. // information for the first hop so the mapping is sound.
route.nextHopMap[sourceVertex] = pathEdges[0] route.nextHopMap[sourceVertex] = pathEdges[0]
@ -342,6 +339,14 @@ func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex Vertex,
route.TotalFees += nextHop.Fee route.TotalFees += nextHop.Fee
// If the total fees exceed the fee limit established for this
// payment, stop hopping the route and return
if route.TotalFees.ToSatoshis() > feeLimit {
err := fmt.Sprintf("Route fee exceeded fee limit of %v",
feeLimit)
return nil, newErrf(ErrFeeCutoffExceeded, err)
}
// As a sanity check, we ensure that the selected channel has // As a sanity check, we ensure that the selected channel has
// enough capacity to forward the required amount which // enough capacity to forward the required amount which
// includes the fee dictated at each hop. // includes the fee dictated at each hop.

@ -310,6 +310,7 @@ func TestBasicGraphPathFinding(t *testing.T) {
) )
paymentAmt := lnwire.NewMSatFromSatoshis(100) paymentAmt := lnwire.NewMSatFromSatoshis(100)
feeLimit := paymentAmt.ToSatoshis()
target := aliases["sophon"] target := aliases["sophon"]
path, err := findPath( path, err := findPath(
nil, graph, nil, sourceNode, target, ignoredVertexes, nil, graph, nil, sourceNode, target, ignoredVertexes,
@ -318,8 +319,9 @@ func TestBasicGraphPathFinding(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unable to find path: %v", err) t.Fatalf("unable to find path: %v", err)
} }
route, err := newRoute(paymentAmt, sourceVertex, path, startingHeight, route, err := newRoute(paymentAmt, sourceVertex, path, startingHeight,
finalHopCLTV) finalHopCLTV, feeLimit)
if err != nil { if err != nil {
t.Fatalf("unable to create path: %v", err) t.Fatalf("unable to create path: %v", err)
} }
@ -460,8 +462,9 @@ func TestBasicGraphPathFinding(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unable to find route: %v", err) t.Fatalf("unable to find route: %v", err)
} }
route, err = newRoute(paymentAmt, sourceVertex, path, startingHeight, route, err = newRoute(paymentAmt, sourceVertex, path, startingHeight,
finalHopCLTV) finalHopCLTV, feeLimit)
if err != nil { if err != nil {
t.Fatalf("unable to create path: %v", err) t.Fatalf("unable to create path: %v", err)
} }
@ -852,7 +855,8 @@ func TestPathFindSpecExample(t *testing.T) {
// Query for a route of 4,999,999 mSAT to carol. // Query for a route of 4,999,999 mSAT to carol.
carol := ctx.aliases["C"] carol := ctx.aliases["C"]
const amt lnwire.MilliSatoshi = 4999999 const amt lnwire.MilliSatoshi = 4999999
routes, err := ctx.router.FindRoutes(carol, amt, 100) feeLimit := amt.ToSatoshis()
routes, err := ctx.router.FindRoutes(carol, amt, feeLimit, 100)
if err != nil { if err != nil {
t.Fatalf("unable to find route: %v", err) t.Fatalf("unable to find route: %v", err)
} }
@ -912,7 +916,7 @@ func TestPathFindSpecExample(t *testing.T) {
// We'll now request a route from A -> B -> C. // We'll now request a route from A -> B -> C.
ctx.router.routeCache = make(map[routeTuple][]*Route) ctx.router.routeCache = make(map[routeTuple][]*Route)
routes, err = ctx.router.FindRoutes(carol, amt, 100) routes, err = ctx.router.FindRoutes(carol, amt, feeLimit, 100)
if err != nil { if err != nil {
t.Fatalf("unable to find routes: %v", err) t.Fatalf("unable to find routes: %v", err)
} }

@ -1259,7 +1259,8 @@ func pruneChannelFromRoutes(routes []*Route, skipChan uint64) []*Route {
// initial set of paths as it's possible we drop a route if it can't handle the // initial set of paths as it's possible we drop a route if it can't handle the
// total payment flow after fees are calculated. // total payment flow after fees are calculated.
func pathsToFeeSortedRoutes(source Vertex, paths [][]*ChannelHop, finalCLTVDelta uint16, func pathsToFeeSortedRoutes(source Vertex, paths [][]*ChannelHop, finalCLTVDelta uint16,
amt lnwire.MilliSatoshi, currentHeight uint32) ([]*Route, error) { amt lnwire.MilliSatoshi, feeLimit btcutil.Amount,
currentHeight uint32) ([]*Route, error) {
validRoutes := make([]*Route, 0, len(paths)) validRoutes := make([]*Route, 0, len(paths))
for _, path := range paths { for _, path := range paths {
@ -1268,6 +1269,7 @@ func pathsToFeeSortedRoutes(source Vertex, paths [][]*ChannelHop, finalCLTVDelta
// by our KSP algorithm. // by our KSP algorithm.
route, err := newRoute( route, err := newRoute(
amt, source, path[1:], currentHeight, finalCLTVDelta, amt, source, path[1:], currentHeight, finalCLTVDelta,
feeLimit,
) )
if err != nil { if err != nil {
// TODO(roasbeef): report straw breaking edge? // TODO(roasbeef): report straw breaking edge?
@ -1316,7 +1318,8 @@ func pathsToFeeSortedRoutes(source Vertex, paths [][]*ChannelHop, finalCLTVDelta
// route that will be ranked the highest is the one with the lowest cumulative // route that will be ranked the highest is the one with the lowest cumulative
// fee along the route. // fee along the route.
func (r *ChannelRouter) FindRoutes(target *btcec.PublicKey, func (r *ChannelRouter) FindRoutes(target *btcec.PublicKey,
amt lnwire.MilliSatoshi, numPaths uint32, finalExpiry ...uint16) ([]*Route, error) { amt lnwire.MilliSatoshi, feeLimit btcutil.Amount, numPaths uint32,
finalExpiry ...uint16) ([]*Route, error) {
var finalCLTVDelta uint16 var finalCLTVDelta uint16
if len(finalExpiry) == 0 { if len(finalExpiry) == 0 {
@ -1402,7 +1405,7 @@ func (r *ChannelRouter) FindRoutes(target *btcec.PublicKey,
// factored in. // factored in.
sourceVertex := Vertex(r.selfNode.PubKeyBytes) sourceVertex := Vertex(r.selfNode.PubKeyBytes)
validRoutes, err := pathsToFeeSortedRoutes( validRoutes, err := pathsToFeeSortedRoutes(
sourceVertex, shortestPaths, finalCLTVDelta, amt, sourceVertex, shortestPaths, finalCLTVDelta, amt, feeLimit,
uint32(currentHeight), uint32(currentHeight),
) )
if err != nil { if err != nil {
@ -1502,6 +1505,9 @@ type LightningPayment struct {
// milli-satoshis. // milli-satoshis.
Amount lnwire.MilliSatoshi Amount lnwire.MilliSatoshi
// FeeLimit is a user-specified maximum fee for this payment in satoshis.
FeeLimit btcutil.Amount
// PaymentHash is the r-hash value to use within the HTLC extended to // PaymentHash is the r-hash value to use within the HTLC extended to
// the first hop. // the first hop.
PaymentHash [32]byte PaymentHash [32]byte

@ -174,9 +174,12 @@ func TestFindRoutesFeeSorting(t *testing.T) {
// Execute a query for all possible routes between roasbeef and luo ji. // Execute a query for all possible routes between roasbeef and luo ji.
paymentAmt := lnwire.NewMSatFromSatoshis(100) paymentAmt := lnwire.NewMSatFromSatoshis(100)
feeLimit := paymentAmt.ToSatoshis()
target := ctx.aliases["luoji"] target := ctx.aliases["luoji"]
routes, err := ctx.router.FindRoutes(target, paymentAmt, routes, err := ctx.router.FindRoutes(
defaultNumRoutes, DefaultFinalCLTVDelta) target, paymentAmt, feeLimit, defaultNumRoutes,
DefaultFinalCLTVDelta,
)
if err != nil { if err != nil {
t.Fatalf("unable to find any routes: %v", err) t.Fatalf("unable to find any routes: %v", err)
} }
@ -221,12 +224,15 @@ func TestSendPaymentRouteFailureFallback(t *testing.T) {
} }
// Craft a LightningPayment struct that'll send a payment from roasbeef // Craft a LightningPayment struct that'll send a payment from roasbeef
// to luo ji for 100 satoshis. // to luo ji for 1000 satoshis, with a maximum of 1000 satoshis in fees.
var payHash [32]byte var payHash [32]byte
paymentAmt := lnwire.NewMSatFromSatoshis(1000)
feeLimit := paymentAmt.ToSatoshis()
payment := LightningPayment{ payment := LightningPayment{
Target: ctx.aliases["luoji"], Target: ctx.aliases["luoji"],
Amount: lnwire.NewMSatFromSatoshis(1000), Amount: paymentAmt,
PaymentHash: payHash, PaymentHash: payHash,
FeeLimit: feeLimit,
} }
var preImage [32]byte var preImage [32]byte
@ -524,12 +530,15 @@ func TestSendPaymentErrorPathPruning(t *testing.T) {
} }
// Craft a LightningPayment struct that'll send a payment from roasbeef // Craft a LightningPayment struct that'll send a payment from roasbeef
// to luo ji for 100 satoshis. // to luo ji for 1000 satoshis, with a maximum of 1000 satoshis in fees.
var payHash [32]byte var payHash [32]byte
paymentAmt := lnwire.NewMSatFromSatoshis(1000)
feeLimit := paymentAmt.ToSatoshis()
payment := LightningPayment{ payment := LightningPayment{
Target: ctx.aliases["luoji"], Target: ctx.aliases["luoji"],
Amount: lnwire.NewMSatFromSatoshis(1000), Amount: paymentAmt,
PaymentHash: payHash, PaymentHash: payHash,
FeeLimit: feeLimit,
} }
var preImage [32]byte var preImage [32]byte
@ -965,9 +974,12 @@ func TestAddEdgeUnknownVertexes(t *testing.T) {
// We should now be able to find two routes to node 2. // We should now be able to find two routes to node 2.
paymentAmt := lnwire.NewMSatFromSatoshis(100) paymentAmt := lnwire.NewMSatFromSatoshis(100)
feeLimit := paymentAmt.ToSatoshis()
targetNode := priv2.PubKey() targetNode := priv2.PubKey()
routes, err := ctx.router.FindRoutes(targetNode, paymentAmt, routes, err := ctx.router.FindRoutes(
defaultNumRoutes, DefaultFinalCLTVDelta) targetNode, paymentAmt, feeLimit, defaultNumRoutes,
DefaultFinalCLTVDelta,
)
if err != nil { if err != nil {
t.Fatalf("unable to find any routes: %v", err) t.Fatalf("unable to find any routes: %v", err)
} }
@ -1009,8 +1021,10 @@ func TestAddEdgeUnknownVertexes(t *testing.T) {
// Should still be able to find the routes, and the info should be // Should still be able to find the routes, and the info should be
// updated. // updated.
routes, err = ctx.router.FindRoutes(targetNode, paymentAmt, routes, err = ctx.router.FindRoutes(
defaultNumRoutes, DefaultFinalCLTVDelta) targetNode, paymentAmt, feeLimit, defaultNumRoutes,
DefaultFinalCLTVDelta,
)
if err != nil { if err != nil {
t.Fatalf("unable to find any routes: %v", err) t.Fatalf("unable to find any routes: %v", err)
} }

@ -3047,6 +3047,7 @@ func (r *rpcServer) QueryRoutes(ctx context.Context,
// largest payment size allotted to (2^32) - 1 mSAT or 4.29 million // largest payment size allotted to (2^32) - 1 mSAT or 4.29 million
// satoshis. // satoshis.
amt := btcutil.Amount(in.Amt) amt := btcutil.Amount(in.Amt)
feeLimit := btcutil.Amount(in.FeeLimit)
amtMSat := lnwire.NewMSatFromSatoshis(amt) amtMSat := lnwire.NewMSatFromSatoshis(amt)
if amtMSat > maxPaymentMSat { if amtMSat > maxPaymentMSat {
return nil, fmt.Errorf("payment of %v is too large, max payment "+ return nil, fmt.Errorf("payment of %v is too large, max payment "+