diff --git a/channeldb/mp_payment.go b/channeldb/mp_payment.go new file mode 100644 index 00000000..9a26cdbd --- /dev/null +++ b/channeldb/mp_payment.go @@ -0,0 +1,105 @@ +package channeldb + +import ( + "time" + + "github.com/btcsuite/btcd/btcec" + "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/routing/route" +) + +// MPPaymentCreationInfo is the information necessary to have ready when +// initiating a payment, moving it into state InFlight. +type MPPaymentCreationInfo struct { + // PaymentHash is the hash this payment is paying to. + PaymentHash lntypes.Hash + + // Value is the amount we are paying. + Value lnwire.MilliSatoshi + + // CreatingTime is the time at which this payment was started. + CreationTime time.Time + + // PaymentRequest is the full payment request, if any. + PaymentRequest []byte +} + +// HTLCAttempt contains information about a specific HTLC attempt for a given +// payment. This information is used by the router to handle any errors coming +// back after an attempt is made, and to query the switch about the status of a +// payment. For settled payment this will be the information for the succeeding +// payment attempt. +type HTLCAttempt struct { + // PaymentID is the unique ID used for this attempt. + PaymentID uint64 + + // SessionKey is the ephemeral key used for this payment attempt. + SessionKey *btcec.PrivateKey + + // Route is the route attempted to send the HTLC. + Route route.Route + + // AttemptTime is the time at which this HTLC was attempted. + AttemptTime time.Time + + // Settle is the preimage of a successful payment. This serves as a + // proof of payment. It will only be non-nil for settled payments. + // + // NOTE: Can be nil if payment is not settled. + Settle *HTLCSettleInfo + + // Fail is a failure reason code indicating the reason the payment + // failed. It is only non-nil for failed payments. + // + // NOTE: Can be nil if payment is not failed. + Failure *HTLCFailInfo +} + +// HTLCSettleInfo encapsulates the information that augments an HTLCAttempt in +// the event that the HTLC is successful. +type HTLCSettleInfo struct { + // Preimage is the preimage of a successful HTLC. This serves as a proof + // of payment. + Preimage lntypes.Preimage + + // SettleTime is the time at which this HTLC was settled. + SettleTime time.Time +} + +// HTLCFailInfo encapsulates the information that augments an HTLCAttempt in the +// event that the HTLC fails. +type HTLCFailInfo struct { + // FailTime is the time at which this HTLC was failed. + FailTime time.Time +} + +// MPPayment is a wrapper around a payment's MPPaymentCreationInfo and +// HTLCAttempts. All payments will have the MPPPaymentCreationInfo set, any +// HTLCs made in attempts to be completed will populated in the HTLCs slice. +// Each populated HTLCAttempt represents an attempted HTLC, each of which may +// have the associated Settle or Fail struct populated if the HTLC is no longer +// in-flight. +type MPPayment struct { + // sequenceNum is a unique identifier used to sort the payments in + // order of creation. + sequenceNum uint64 + + // Info holds all static information about this payment, and is + // populated when the payment is initiated. + Info *MPPaymentCreationInfo + + // HTLCs holds the information about individual HTLCs that we send in + // order to make the payment. + HTLCs []HTLCAttempt + + // FailureReason is the failure reason code indicating the reason the + // payment failed. + // + // NOTE: Will only be set once the daemon has given up on the payment + // altogether. + FailureReason *FailureReason + + // Status is the current PaymentStatus of this payment. + Status PaymentStatus +} diff --git a/channeldb/payment_control.go b/channeldb/payment_control.go index 13c09369..63be23a2 100644 --- a/channeldb/payment_control.go +++ b/channeldb/payment_control.go @@ -8,7 +8,6 @@ import ( "github.com/coreos/bbolt" "github.com/lightningnetwork/lnd/lntypes" - "github.com/lightningnetwork/lnd/routing/route" ) var ( @@ -192,16 +191,17 @@ func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash, // duplicate payments to the same payment hash. The provided preimage is // atomically saved to the DB for record keeping. func (p *PaymentControl) Success(paymentHash lntypes.Hash, - preimage lntypes.Preimage) (*route.Route, error) { + preimage lntypes.Preimage) (*MPPayment, error) { var ( updateErr error - route *route.Route + payment *MPPayment ) err := p.db.Batch(func(tx *bbolt.Tx) error { // Reset the update error, to avoid carrying over an error // from a previous execution of the batched db transaction. updateErr = nil + payment = nil bucket, err := fetchPaymentBucket(tx, paymentHash) if err == ErrPaymentNotInitiated { @@ -225,20 +225,14 @@ func (p *PaymentControl) Success(paymentHash lntypes.Hash, } // Retrieve attempt info for the notification. - attempt, err := fetchPaymentAttempt(bucket) - if err != nil { - return err - } - - route = &attempt.Route - - return nil + payment, err = fetchPayment(bucket) + return err }) if err != nil { return nil, err } - return route, updateErr + return payment, updateErr } // Fail transitions a payment into the Failed state, and records the reason the @@ -246,16 +240,17 @@ func (p *PaymentControl) Success(paymentHash lntypes.Hash, // its next call for this payment hash, allowing the switch to make a // subsequent payment. func (p *PaymentControl) Fail(paymentHash lntypes.Hash, - reason FailureReason) (*route.Route, error) { + reason FailureReason) (*MPPayment, error) { var ( updateErr error - route *route.Route + payment *MPPayment ) err := p.db.Batch(func(tx *bbolt.Tx) error { // Reset the update error, to avoid carrying over an error // from a previous execution of the batched db transaction. updateErr = nil + payment = nil bucket, err := fetchPaymentBucket(tx, paymentHash) if err == ErrPaymentNotInitiated { @@ -279,28 +274,21 @@ func (p *PaymentControl) Fail(paymentHash lntypes.Hash, } // Retrieve attempt info for the notification, if available. - attempt, err := fetchPaymentAttempt(bucket) - if err != nil && err != errNoAttemptInfo { - return err - } - if err != errNoAttemptInfo { - route = &attempt.Route - } - - return nil + payment, err = fetchPayment(bucket) + return err }) if err != nil { return nil, err } - return route, updateErr + return payment, updateErr } // FetchPayment returns information about a payment from the database. func (p *PaymentControl) FetchPayment(paymentHash lntypes.Hash) ( - *Payment, error) { + *MPPayment, error) { - var payment *Payment + var payment *MPPayment err := p.db.View(func(tx *bbolt.Tx) error { bucket, err := fetchPaymentBucket(tx, paymentHash) if err != nil { diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index 479e6898..7be04c6b 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -14,7 +14,6 @@ import ( "github.com/coreos/bbolt" "github.com/davecgh/go-spew/spew" "github.com/lightningnetwork/lnd/lntypes" - "github.com/lightningnetwork/lnd/routing/route" ) func initDB() (*DB, error) { @@ -132,16 +131,22 @@ func TestPaymentControlSwitchFail(t *testing.T) { ) // Verifies that status was changed to StatusSucceeded. - var route *route.Route - route, err = pControl.Success(info.PaymentHash, preimg) + var payment *MPPayment + payment, err = pControl.Success(info.PaymentHash, preimg) if err != nil { t.Fatalf("error shouldn't have been received, got: %v", err) } - err = assertRouteEqual(route, &attempt.Route) + if len(payment.HTLCs) != 1 { + t.Fatalf("payment should have one htlc, got: %d", + len(payment.HTLCs)) + } + + err = assertRouteEqual(&payment.HTLCs[0].Route, &attempt.Route) if err != nil { t.Fatalf("unexpected route returned: %v vs %v: %v", - spew.Sdump(attempt.Route), spew.Sdump(*route), err) + spew.Sdump(attempt.Route), + spew.Sdump(payment.HTLCs[0].Route), err) } assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded) diff --git a/channeldb/payments.go b/channeldb/payments.go index d576c65c..7a541543 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -101,9 +101,9 @@ const ( // payment. FailureReasonError FailureReason = 2 - // FailureReasonIncorrectPaymentDetails indicates that either the hash - // is unknown or the final cltv delta or amount is incorrect. - FailureReasonIncorrectPaymentDetails FailureReason = 3 + // FailureReasonPaymentDetails indicates that either the hash is unknown + // or the final cltv delta or amount is incorrect. + FailureReasonPaymentDetails FailureReason = 3 // TODO(halseth): cancel state. @@ -120,7 +120,7 @@ func (r FailureReason) String() string { return "no_route" case FailureReasonError: return "error" - case FailureReasonIncorrectPaymentDetails: + case FailureReasonPaymentDetails: return "incorrect_payment_details" } @@ -239,11 +239,11 @@ type Payment struct { // NOTE: Can be nil if no attempt is yet made. Attempt *PaymentAttemptInfo - // PaymentPreimage is the preimage of a successful payment. This serves - // as a proof of payment. It will only be non-nil for settled payments. + // Preimage is the preimage of a successful payment. This serves as a + // proof of payment. It will only be non-nil for settled payments. // // NOTE: Can be nil if payment is not settled. - PaymentPreimage *lntypes.Preimage + Preimage *lntypes.Preimage // Failure is a failure reason code indicating the reason the payment // failed. It is only non-nil for failed payments. @@ -252,9 +252,70 @@ type Payment struct { Failure *FailureReason } +// ToMPPayment converts a legacy payment into an MPPayment. +func (p *Payment) ToMPPayment() *MPPayment { + var ( + htlcs []HTLCAttempt + reason *FailureReason + settle *HTLCSettleInfo + failure *HTLCFailInfo + ) + + // Promote the payment failure to a proper fail struct, if it exists. + if p.Failure != nil { + // NOTE: FailTime is not set for legacy payments. + failure = &HTLCFailInfo{} + reason = p.Failure + } + + // Promote the payment preimage to proper settle struct, if it exists. + if p.Preimage != nil { + // NOTE: SettleTime is not set for legacy payments. + settle = &HTLCSettleInfo{ + Preimage: *p.Preimage, + } + } + + // Either a settle or a failure may be set, but not both. + if settle != nil && failure != nil { + panic("htlc attempt has both settle and failure info") + } + + // Populate a single HTLC on the MPPayment if an attempt exists on the + // legacy payment. If none exists we will leave the attempt info blank + // since we cannot recover it. + if p.Attempt != nil { + // NOTE: AttemptTime is not set for legacy payments. + htlcs = []HTLCAttempt{ + { + PaymentID: p.Attempt.PaymentID, + SessionKey: p.Attempt.SessionKey, + Route: p.Attempt.Route, + Settle: settle, + Failure: failure, + }, + } + } + + return &MPPayment{ + sequenceNum: p.sequenceNum, + Info: &MPPaymentCreationInfo{ + PaymentHash: p.Info.PaymentHash, + Value: p.Info.Value, + CreationTime: p.Info.CreationDate, + PaymentRequest: p.Info.PaymentRequest, + }, + HTLCs: htlcs, + FailureReason: reason, + Status: p.Status, + } +} + // FetchPayments returns all sent payments found in the DB. -func (db *DB) FetchPayments() ([]*Payment, error) { - var payments []*Payment +// +// nolint: dupl +func (db *DB) FetchPayments() ([]*MPPayment, error) { + var payments []*MPPayment err := db.View(func(tx *bbolt.Tx) error { paymentsBucket := tx.Bucket(paymentsRootBucket) @@ -318,7 +379,7 @@ func (db *DB) FetchPayments() ([]*Payment, error) { return payments, nil } -func fetchPayment(bucket *bbolt.Bucket) (*Payment, error) { +func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) { var ( err error p = &Payment{} @@ -363,7 +424,7 @@ func fetchPayment(bucket *bbolt.Bucket) (*Payment, error) { if b != nil { var preimg lntypes.Preimage copy(preimg[:], b[:]) - p.PaymentPreimage = &preimg + p.Preimage = &preimg } // Get failure reason if available. @@ -373,7 +434,7 @@ func fetchPayment(bucket *bbolt.Bucket) (*Payment, error) { p.Failure = &reason } - return p, nil + return p.ToMPPayment(), nil } // DeletePayments deletes all completed and failed payments from the DB. @@ -473,7 +534,7 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) { reqLen := uint32(byteOrder.Uint32(scratch[:4])) payReq := make([]byte, reqLen) if reqLen > 0 { - if _, err := io.ReadFull(r, payReq[:]); err != nil { + if _, err := io.ReadFull(r, payReq); err != nil { return nil, err } } diff --git a/lnrpc/routerrpc/router.pb.go b/lnrpc/routerrpc/router.pb.go index 82825712..e8216f17 100644 --- a/lnrpc/routerrpc/router.pb.go +++ b/lnrpc/routerrpc/router.pb.go @@ -422,10 +422,13 @@ type PaymentStatus struct { Preimage []byte `protobuf:"bytes,2,opt,name=preimage,proto3" json:"preimage,omitempty"` //* //The taken route when state is SUCCEEDED. - Route *lnrpc.Route `protobuf:"bytes,3,opt,name=route,proto3" json:"route,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Route *lnrpc.Route `protobuf:"bytes,3,opt,name=route,proto3" json:"route,omitempty"` + //* + //The HTLCs made in attempt to settle the payment [EXPERIMENTAL]. + Htlcs []*lnrpc.HTLCAttempt `protobuf:"bytes,4,rep,name=htlcs,proto3" json:"htlcs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *PaymentStatus) Reset() { *m = PaymentStatus{} } @@ -474,6 +477,13 @@ func (m *PaymentStatus) GetRoute() *lnrpc.Route { return nil } +func (m *PaymentStatus) GetHtlcs() []*lnrpc.HTLCAttempt { + if m != nil { + return m.Htlcs + } + return nil +} + type RouteFeeRequest struct { //* //The destination once wishes to obtain a routing fee quote to. @@ -1455,131 +1465,132 @@ func init() { func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) } var fileDescriptor_7a0613f69d37b0a5 = []byte{ - // 1975 bytes of a gzipped FileDescriptorProto + // 1993 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0x4f, 0x73, 0x1a, 0xc9, 0x15, 0xdf, 0x11, 0x20, 0xe0, 0x01, 0xd2, 0xa8, 0xa5, 0x95, 0xc7, 0x48, 0x5a, 0x6b, 0xc7, 0x8e, 0x57, 0xe5, 0xf2, 0x4a, 0x8e, 0x52, 0xbb, 0xe5, 0xda, 0x43, 0x52, 0x18, 0x86, 0xd5, 0xc8, 0x30, 0xc8, 0x0d, 0x78, 0xd7, 0xd9, 0x43, 0x57, 0x0b, 0x5a, 0x62, 0x4a, 0xc3, 0x0c, 0x3b, 0xd3, 0x38, - 0x56, 0x0e, 0xf9, 0x04, 0xc9, 0x35, 0x5f, 0x21, 0x97, 0xe4, 0x94, 0xef, 0x94, 0x54, 0xe5, 0x9e, - 0x7b, 0xaa, 0xbb, 0x67, 0x60, 0x40, 0x48, 0x9b, 0x93, 0xe8, 0xdf, 0x7b, 0xfd, 0x5e, 0xcf, 0xfb, - 0xf3, 0xeb, 0xd7, 0x82, 0xdd, 0x30, 0x98, 0x72, 0x16, 0x86, 0x93, 0xc1, 0x89, 0xfa, 0x75, 0x3c, - 0x09, 0x03, 0x1e, 0xa0, 0xe2, 0x0c, 0xaf, 0x16, 0xc3, 0xc9, 0x40, 0xa1, 0xe6, 0x7f, 0xb2, 0x80, - 0xba, 0xcc, 0x1f, 0x5e, 0xd0, 0xdb, 0x31, 0xf3, 0x39, 0x66, 0x3f, 0x4f, 0x59, 0xc4, 0x11, 0x82, - 0xec, 0x90, 0x45, 0xdc, 0xd0, 0x0e, 0xb5, 0xa3, 0x32, 0x96, 0xbf, 0x91, 0x0e, 0x19, 0x3a, 0xe6, - 0xc6, 0xda, 0xa1, 0x76, 0x94, 0xc1, 0xe2, 0x27, 0x7a, 0x0c, 0x05, 0x3a, 0xe6, 0x64, 0x1c, 0x51, - 0x6e, 0x94, 0x25, 0x9c, 0xa7, 0x63, 0xde, 0x8e, 0x28, 0x47, 0x5f, 0x42, 0x79, 0xa2, 0x4c, 0x92, - 0x11, 0x8d, 0x46, 0x46, 0x46, 0x1a, 0x2a, 0xc5, 0xd8, 0x19, 0x8d, 0x46, 0xe8, 0x08, 0xf4, 0x2b, - 0xd7, 0xa7, 0x1e, 0x19, 0x78, 0xfc, 0x23, 0x19, 0x32, 0x8f, 0x53, 0x23, 0x7b, 0xa8, 0x1d, 0xe5, - 0xf0, 0x86, 0xc4, 0xeb, 0x1e, 0xff, 0xd8, 0x10, 0x28, 0xfa, 0x0a, 0x36, 0x13, 0x63, 0xa1, 0x3a, - 0xa0, 0x91, 0x3b, 0xd4, 0x8e, 0x8a, 0x78, 0x63, 0xb2, 0x78, 0xec, 0xaf, 0x60, 0x93, 0xbb, 0x63, - 0x16, 0x4c, 0x39, 0x89, 0xd8, 0x20, 0xf0, 0x87, 0x91, 0xb1, 0xae, 0x2c, 0xc6, 0x70, 0x57, 0xa1, - 0xc8, 0x84, 0xca, 0x15, 0x63, 0xc4, 0x73, 0xc7, 0x2e, 0x27, 0xe2, 0xf8, 0x79, 0x79, 0xfc, 0xd2, - 0x15, 0x63, 0x2d, 0x81, 0x75, 0x29, 0x47, 0xcf, 0x60, 0x63, 0xae, 0x23, 0xbf, 0xb1, 0x22, 0x95, - 0xca, 0x89, 0x92, 0xfc, 0xd0, 0x97, 0xa0, 0x07, 0x53, 0x7e, 0x1d, 0xb8, 0xfe, 0x35, 0x19, 0x8c, - 0xa8, 0x4f, 0xdc, 0xa1, 0x51, 0x38, 0xd4, 0x8e, 0xb2, 0x6f, 0xd6, 0x5e, 0x69, 0x78, 0x23, 0x91, - 0xd5, 0x47, 0xd4, 0xb7, 0x87, 0xe8, 0x39, 0x6c, 0x7a, 0x34, 0xe2, 0x64, 0x14, 0x4c, 0xc8, 0x64, - 0x7a, 0x79, 0xc3, 0x6e, 0x8d, 0x0d, 0x19, 0x99, 0x8a, 0x80, 0xcf, 0x82, 0xc9, 0x85, 0x04, 0xd1, - 0x01, 0x80, 0x8c, 0x8a, 0x74, 0x6e, 0x14, 0xe5, 0x37, 0x14, 0x05, 0x22, 0x1d, 0xa3, 0x53, 0x28, - 0xc9, 0x6c, 0x92, 0x91, 0xeb, 0xf3, 0xc8, 0x80, 0xc3, 0xcc, 0x51, 0xe9, 0x54, 0x3f, 0xf6, 0x7c, - 0x91, 0x58, 0x2c, 0x24, 0x67, 0xae, 0xcf, 0x71, 0x5a, 0x09, 0x59, 0x50, 0x10, 0x69, 0x24, 0xdc, - 0xfb, 0x68, 0x94, 0xe4, 0x86, 0x17, 0xc7, 0xb3, 0x92, 0x38, 0xbe, 0x5b, 0x03, 0xc7, 0x0d, 0x16, - 0xf1, 0x9e, 0xf7, 0xd1, 0xf2, 0x79, 0x78, 0x8b, 0xf3, 0x43, 0xb5, 0xaa, 0x7e, 0x07, 0xe5, 0xb4, - 0x40, 0x54, 0x85, 0xf8, 0x0a, 0x51, 0x28, 0x59, 0x2c, 0x7e, 0xa2, 0x1d, 0xc8, 0x7d, 0xa4, 0xde, - 0x94, 0xc9, 0x4a, 0x29, 0x63, 0xb5, 0xf8, 0x6e, 0xed, 0xb5, 0x66, 0xbe, 0x86, 0xed, 0x5e, 0x48, - 0x07, 0x37, 0x4b, 0xc5, 0xb6, 0x5c, 0x2b, 0xda, 0x9d, 0x5a, 0x31, 0xff, 0x04, 0x95, 0x78, 0x53, - 0x97, 0x53, 0x3e, 0x8d, 0xd0, 0xd7, 0x90, 0x8b, 0x38, 0xe5, 0x4c, 0x2a, 0x6f, 0x9c, 0x3e, 0x4a, - 0x7d, 0x4a, 0x4a, 0x91, 0x61, 0xa5, 0x85, 0xaa, 0x50, 0x98, 0x84, 0xcc, 0x1d, 0xd3, 0xeb, 0xe4, - 0x58, 0xb3, 0x35, 0x32, 0x21, 0x27, 0x37, 0xcb, 0x1a, 0x2d, 0x9d, 0x96, 0xd3, 0x61, 0xc4, 0x4a, - 0x64, 0xfe, 0x16, 0x36, 0xe5, 0xba, 0xc9, 0xd8, 0x43, 0x2d, 0xf2, 0x08, 0x44, 0x03, 0xc8, 0x82, - 0x52, 0x6d, 0xb2, 0x4e, 0xc7, 0xa2, 0x96, 0xcc, 0x21, 0xe8, 0xf3, 0xfd, 0xd1, 0x24, 0xf0, 0x23, - 0x26, 0xea, 0x5f, 0x18, 0x17, 0x85, 0x23, 0xea, 0x4c, 0x56, 0x98, 0x26, 0x77, 0x6d, 0xc4, 0x78, - 0x93, 0x31, 0x59, 0x63, 0xcf, 0x55, 0x59, 0x13, 0x2f, 0x18, 0xdc, 0x88, 0x46, 0xa1, 0xb7, 0xb1, - 0xf9, 0x8a, 0x80, 0x5b, 0xc1, 0xe0, 0xa6, 0x21, 0x40, 0xf3, 0x27, 0xd5, 0xcb, 0xbd, 0x40, 0x9d, - 0xfd, 0xff, 0x0e, 0xef, 0x3c, 0x04, 0x6b, 0xf7, 0x87, 0x80, 0xc0, 0xf6, 0x82, 0xf1, 0xf8, 0x2b, - 0xd2, 0x91, 0xd5, 0x96, 0x22, 0xfb, 0x12, 0xf2, 0x57, 0xd4, 0xf5, 0xa6, 0x61, 0x62, 0x18, 0xa5, - 0xd2, 0xd4, 0x54, 0x12, 0x9c, 0xa8, 0x98, 0xff, 0xcd, 0x43, 0x3e, 0x06, 0xd1, 0x29, 0x64, 0x07, - 0xc1, 0x30, 0xc9, 0xee, 0x17, 0x77, 0xb7, 0x25, 0x7f, 0xeb, 0xc1, 0x90, 0x61, 0xa9, 0x8b, 0x7e, - 0x07, 0x1b, 0xa2, 0x01, 0x7d, 0xe6, 0x91, 0xe9, 0x64, 0x48, 0x67, 0x09, 0x35, 0x52, 0xbb, 0xeb, - 0x4a, 0xa1, 0x2f, 0xe5, 0xb8, 0x32, 0x48, 0x2f, 0xd1, 0x1e, 0x14, 0x47, 0xdc, 0x1b, 0xa8, 0x4c, - 0x64, 0x65, 0x41, 0x17, 0x04, 0x20, 0x73, 0x60, 0x42, 0x25, 0xf0, 0xdd, 0xc0, 0x27, 0xd1, 0x88, - 0x92, 0xd3, 0x6f, 0xbe, 0x95, 0x0c, 0x54, 0xc6, 0x25, 0x09, 0x76, 0x47, 0xf4, 0xf4, 0x9b, 0x6f, - 0xd1, 0x13, 0x28, 0xc9, 0xae, 0x65, 0x9f, 0x26, 0x6e, 0x78, 0x2b, 0xa9, 0xa7, 0x82, 0x65, 0x23, - 0x5b, 0x12, 0x11, 0xad, 0x71, 0xe5, 0xd1, 0xeb, 0x48, 0xd2, 0x4d, 0x05, 0xab, 0x05, 0x7a, 0x05, - 0x3b, 0x71, 0x0c, 0x48, 0x14, 0x4c, 0xc3, 0x01, 0x23, 0xae, 0x3f, 0x64, 0x9f, 0x24, 0x8d, 0x54, - 0x30, 0x8a, 0x65, 0x5d, 0x29, 0xb2, 0x85, 0x04, 0xed, 0xc2, 0xfa, 0x88, 0xb9, 0xd7, 0x23, 0x45, - 0x0d, 0x15, 0x1c, 0xaf, 0xcc, 0xbf, 0xe7, 0xa0, 0x94, 0x0a, 0x0c, 0x2a, 0x43, 0x01, 0x5b, 0x5d, - 0x0b, 0xbf, 0xb7, 0x1a, 0xfa, 0x67, 0xe8, 0x08, 0x9e, 0xd9, 0x4e, 0xbd, 0x83, 0xb1, 0x55, 0xef, - 0x91, 0x0e, 0x26, 0x7d, 0xe7, 0xad, 0xd3, 0xf9, 0xc1, 0x21, 0x17, 0xb5, 0x0f, 0x6d, 0xcb, 0xe9, - 0x91, 0x86, 0xd5, 0xab, 0xd9, 0xad, 0xae, 0xae, 0xa1, 0x7d, 0x30, 0xe6, 0x9a, 0x89, 0xb8, 0xd6, - 0xee, 0xf4, 0x9d, 0x9e, 0xbe, 0x86, 0x9e, 0xc0, 0x5e, 0xd3, 0x76, 0x6a, 0x2d, 0x32, 0xd7, 0xa9, - 0xb7, 0x7a, 0xef, 0x89, 0xf5, 0xe3, 0x85, 0x8d, 0x3f, 0xe8, 0x99, 0x55, 0x0a, 0x67, 0xbd, 0x56, - 0x3d, 0xb1, 0x90, 0x45, 0x8f, 0xe1, 0x73, 0xa5, 0xa0, 0xb6, 0x90, 0x5e, 0xa7, 0x43, 0xba, 0x9d, - 0x8e, 0xa3, 0xe7, 0xd0, 0x16, 0x54, 0x6c, 0xe7, 0x7d, 0xad, 0x65, 0x37, 0x08, 0xb6, 0x6a, 0xad, - 0xb6, 0xbe, 0x8e, 0xb6, 0x61, 0x73, 0x59, 0x2f, 0x2f, 0x4c, 0x24, 0x7a, 0x1d, 0xc7, 0xee, 0x38, - 0xe4, 0xbd, 0x85, 0xbb, 0x76, 0xc7, 0xd1, 0x0b, 0x68, 0x17, 0xd0, 0xa2, 0xe8, 0xac, 0x5d, 0xab, - 0xeb, 0x45, 0xf4, 0x39, 0x6c, 0x2d, 0xe2, 0x6f, 0xad, 0x0f, 0x3a, 0x20, 0x03, 0x76, 0xd4, 0xc1, - 0xc8, 0x1b, 0xab, 0xd5, 0xf9, 0x81, 0xb4, 0x6d, 0xc7, 0x6e, 0xf7, 0xdb, 0x7a, 0x09, 0xed, 0x80, - 0xde, 0xb4, 0x2c, 0x62, 0x3b, 0xdd, 0x7e, 0xb3, 0x69, 0xd7, 0x6d, 0xcb, 0xe9, 0xe9, 0x65, 0xe5, - 0x79, 0xd5, 0x87, 0x57, 0xc4, 0x86, 0xfa, 0x59, 0xcd, 0x71, 0xac, 0x16, 0x69, 0xd8, 0xdd, 0xda, - 0x9b, 0x96, 0xd5, 0xd0, 0x37, 0xd0, 0x01, 0x3c, 0xee, 0x59, 0xed, 0x8b, 0x0e, 0xae, 0xe1, 0x0f, - 0x24, 0x91, 0x37, 0x6b, 0x76, 0xab, 0x8f, 0x2d, 0x7d, 0x13, 0x7d, 0x09, 0x07, 0xd8, 0x7a, 0xd7, - 0xb7, 0xb1, 0xd5, 0x20, 0x4e, 0xa7, 0x61, 0x91, 0xa6, 0x55, 0xeb, 0xf5, 0xb1, 0x45, 0xda, 0x76, - 0xb7, 0x6b, 0x3b, 0xdf, 0xeb, 0x3a, 0x7a, 0x06, 0x87, 0x33, 0x95, 0x99, 0x81, 0x25, 0xad, 0x2d, - 0xf1, 0x7d, 0x49, 0x4a, 0x1d, 0xeb, 0xc7, 0x1e, 0xb9, 0xb0, 0x2c, 0xac, 0x23, 0x54, 0x85, 0xdd, - 0xb9, 0x7b, 0xe5, 0x20, 0xf6, 0xbd, 0x2d, 0x64, 0x17, 0x16, 0x6e, 0xd7, 0x1c, 0x91, 0xe0, 0x05, - 0xd9, 0x8e, 0x38, 0xf6, 0x5c, 0xb6, 0x7c, 0xec, 0xcf, 0x11, 0x82, 0x8d, 0x54, 0x56, 0x9a, 0x35, - 0xac, 0xef, 0xa2, 0x1d, 0xd8, 0x4c, 0x4e, 0x90, 0x28, 0xfe, 0x2b, 0x8f, 0x1e, 0x01, 0xea, 0x3b, - 0xd8, 0xaa, 0x35, 0x44, 0x40, 0x66, 0x82, 0x7f, 0xe7, 0xcf, 0xb3, 0x85, 0x35, 0x3d, 0x63, 0xfe, - 0x33, 0x03, 0x95, 0x85, 0xbe, 0x44, 0xfb, 0x50, 0x8c, 0xdc, 0x6b, 0x9f, 0x72, 0xc1, 0x1c, 0x8a, - 0x54, 0xe6, 0x80, 0xbc, 0x1b, 0x47, 0xd4, 0xf5, 0x15, 0x9b, 0x29, 0x36, 0x2f, 0x4a, 0x44, 0x72, - 0xd9, 0x1e, 0xe4, 0x93, 0x7b, 0x38, 0x33, 0xbb, 0x87, 0xd7, 0x07, 0xea, 0xfe, 0xdd, 0x87, 0xa2, - 0xa0, 0xcc, 0x88, 0xd3, 0xf1, 0x44, 0xb6, 0x78, 0x05, 0xcf, 0x01, 0xf4, 0x14, 0x2a, 0x63, 0x16, - 0x45, 0xf4, 0x9a, 0x11, 0xd5, 0xa6, 0x20, 0x35, 0xca, 0x31, 0xd8, 0x94, 0xdd, 0xfa, 0x14, 0x12, - 0xda, 0x88, 0x95, 0x72, 0x4a, 0x29, 0x06, 0x95, 0xd2, 0x32, 0x63, 0x73, 0x1a, 0xb3, 0x41, 0x9a, - 0xb1, 0x39, 0x45, 0x2f, 0x60, 0x4b, 0x51, 0x8e, 0xeb, 0xbb, 0xe3, 0xe9, 0x58, 0x51, 0x4f, 0x5e, - 0x52, 0xcf, 0xa6, 0xa4, 0x1e, 0x85, 0x4b, 0x06, 0x7a, 0x0c, 0x85, 0x4b, 0x1a, 0x31, 0x71, 0x59, - 0xc4, 0xd4, 0x90, 0x17, 0xeb, 0x26, 0x63, 0x42, 0x24, 0xae, 0x90, 0x50, 0x90, 0x9e, 0x62, 0x84, - 0xfc, 0x15, 0x63, 0x58, 0xc4, 0x72, 0xe6, 0x81, 0x7e, 0x9a, 0x7b, 0x28, 0xa5, 0x3c, 0x28, 0x5c, - 0x7a, 0x78, 0x01, 0x5b, 0xec, 0x13, 0x0f, 0x29, 0x09, 0x26, 0xf4, 0xe7, 0x29, 0x23, 0x43, 0xca, - 0xa9, 0x1c, 0xec, 0xca, 0x78, 0x53, 0x0a, 0x3a, 0x12, 0x6f, 0x50, 0x4e, 0xcd, 0x7d, 0xa8, 0x62, - 0x16, 0x31, 0xde, 0x76, 0xa3, 0xc8, 0x0d, 0xfc, 0x7a, 0xe0, 0xf3, 0x30, 0xf0, 0xe2, 0x3b, 0xc7, - 0x3c, 0x80, 0xbd, 0x95, 0x52, 0x75, 0x69, 0x88, 0xcd, 0xef, 0xa6, 0x2c, 0xbc, 0x5d, 0xbd, 0xf9, - 0x1d, 0xec, 0xad, 0x94, 0xc6, 0x37, 0xce, 0x4b, 0xc8, 0x4d, 0xa8, 0x1b, 0x46, 0xc6, 0x9a, 0x9c, - 0x62, 0x76, 0x17, 0xae, 0x7e, 0x37, 0x3c, 0x73, 0x23, 0x1e, 0x84, 0xb7, 0x58, 0x29, 0x9d, 0x67, - 0x0b, 0x9a, 0xbe, 0x66, 0xfe, 0x59, 0x83, 0x52, 0x4a, 0x28, 0xea, 0xc0, 0x0f, 0x86, 0x8c, 0x5c, - 0x85, 0xc1, 0x38, 0xa9, 0xb0, 0x19, 0x80, 0x0c, 0xc8, 0xcb, 0x05, 0x0f, 0xe2, 0xf2, 0x4a, 0x96, - 0xe8, 0x6b, 0xc8, 0x8f, 0x94, 0x09, 0x99, 0xa5, 0xd2, 0xe9, 0xf6, 0x92, 0x77, 0x11, 0x1b, 0x9c, - 0xe8, 0x9c, 0x67, 0x0b, 0x19, 0x3d, 0x7b, 0x9e, 0x2d, 0x64, 0xf5, 0xdc, 0x79, 0xb6, 0x90, 0xd3, - 0xd7, 0xcf, 0xb3, 0x85, 0x75, 0x3d, 0x6f, 0xfe, 0x55, 0x83, 0x42, 0xa2, 0xbd, 0x58, 0x93, 0x6a, - 0x00, 0x48, 0xd5, 0xe4, 0x29, 0xec, 0x8c, 0x5d, 0x9f, 0x4c, 0x98, 0x4f, 0x3d, 0xf7, 0x8f, 0x8c, - 0x2c, 0xce, 0x17, 0x2b, 0x65, 0xe8, 0x35, 0x3c, 0x92, 0x53, 0x26, 0xe5, 0x9c, 0x8d, 0x27, 0x9c, - 0x44, 0xd3, 0xc1, 0x80, 0x45, 0xd1, 0xd5, 0xd4, 0x93, 0x2d, 0x51, 0xc0, 0xf7, 0x89, 0xcd, 0x31, - 0x3c, 0x92, 0xa1, 0xbf, 0x08, 0x83, 0x4b, 0x7a, 0xe9, 0x7a, 0x2e, 0xbf, 0x4d, 0xc6, 0x88, 0x7d, - 0x28, 0x8a, 0xe0, 0x10, 0x3f, 0xb9, 0x97, 0xcb, 0x78, 0x0e, 0x88, 0x90, 0xf1, 0x40, 0xc9, 0xe2, - 0x90, 0xc5, 0x4b, 0x31, 0x20, 0xcc, 0x1e, 0x09, 0x19, 0x79, 0xe8, 0xd9, 0xda, 0xbc, 0x01, 0xe3, - 0xae, 0xbb, 0x38, 0xcd, 0x87, 0x50, 0x9a, 0xcc, 0x61, 0xe9, 0x51, 0xc3, 0x69, 0x28, 0x9d, 0x8c, - 0xb5, 0x5f, 0x4e, 0x86, 0xf9, 0x37, 0x0d, 0xb6, 0xde, 0x4c, 0x5d, 0x6f, 0xb8, 0x30, 0x1d, 0xa5, - 0xdf, 0x30, 0xda, 0xe2, 0x1b, 0x66, 0xd5, 0x03, 0x65, 0x6d, 0xe5, 0x03, 0x65, 0xd5, 0x23, 0x20, - 0x73, 0xef, 0x23, 0xe0, 0x09, 0x94, 0xe6, 0xf3, 0x7f, 0x64, 0x64, 0x0f, 0x33, 0x47, 0x65, 0x0c, - 0xa3, 0x64, 0xf8, 0x8f, 0xcc, 0xd7, 0x80, 0xd2, 0x07, 0x8d, 0x03, 0x32, 0x1b, 0xd2, 0xb4, 0x7b, - 0x87, 0xb4, 0x17, 0x7f, 0xd1, 0xa0, 0x9c, 0x9e, 0x7f, 0x51, 0x05, 0x8a, 0xb6, 0x43, 0x9a, 0x2d, - 0xfb, 0xfb, 0xb3, 0x9e, 0xfe, 0x99, 0x58, 0x76, 0xfb, 0xf5, 0xba, 0x65, 0x35, 0xac, 0x86, 0xae, - 0x09, 0x0e, 0x17, 0x74, 0x6c, 0x35, 0x48, 0xcf, 0x6e, 0x5b, 0x9d, 0xbe, 0xb8, 0xdd, 0xb7, 0x61, - 0x33, 0xc6, 0x9c, 0x0e, 0xc1, 0x9d, 0x7e, 0xcf, 0xd2, 0x33, 0x48, 0x87, 0x72, 0x0c, 0x5a, 0x18, - 0x77, 0xb0, 0x9e, 0x15, 0x57, 0x52, 0x8c, 0xdc, 0x9d, 0x14, 0x92, 0x41, 0x22, 0x77, 0xfa, 0x8f, - 0x1c, 0xac, 0xcb, 0x03, 0x86, 0xe8, 0x0c, 0x4a, 0xa9, 0x47, 0x06, 0x3a, 0x78, 0xf0, 0xf1, 0x51, - 0x35, 0x56, 0x0f, 0xf4, 0xd3, 0xe8, 0x95, 0x86, 0xce, 0xa1, 0x9c, 0x7e, 0x46, 0xa0, 0xf4, 0x78, - 0xb8, 0xe2, 0x7d, 0xf1, 0xa0, 0xad, 0xb7, 0xa0, 0x5b, 0x11, 0x77, 0xc7, 0x62, 0x1c, 0x8c, 0x07, - 0x74, 0x54, 0x4d, 0xe9, 0x2f, 0x4d, 0xfd, 0xd5, 0xbd, 0x95, 0xb2, 0x38, 0x43, 0x2d, 0xf5, 0x89, - 0xf1, 0x88, 0x7c, 0xe7, 0x13, 0x17, 0xe7, 0xf2, 0xea, 0x17, 0xf7, 0x89, 0x63, 0x6b, 0x43, 0xd8, - 0x5e, 0xc1, 0xa1, 0xe8, 0x57, 0xe9, 0x13, 0xdc, 0xcb, 0xc0, 0xd5, 0xe7, 0xbf, 0xa4, 0x36, 0xf7, - 0xb2, 0x82, 0x6c, 0x17, 0xbc, 0xdc, 0x4f, 0xd5, 0x0b, 0x5e, 0x1e, 0xe2, 0xec, 0x9f, 0x40, 0x5f, - 0x6e, 0x74, 0x64, 0x2e, 0xef, 0xbd, 0x4b, 0x3a, 0xd5, 0xa7, 0x0f, 0xea, 0xc4, 0xc6, 0x6d, 0x80, - 0x79, 0xbb, 0xa0, 0xfd, 0xd4, 0x96, 0x3b, 0xed, 0x5e, 0x3d, 0xb8, 0x47, 0xaa, 0x4c, 0xbd, 0xf9, - 0xf5, 0xef, 0x4f, 0xae, 0x5d, 0x3e, 0x9a, 0x5e, 0x1e, 0x0f, 0x82, 0xf1, 0x89, 0x27, 0x86, 0x6a, - 0xdf, 0xf5, 0xaf, 0x7d, 0xc6, 0xff, 0x10, 0x84, 0x37, 0x27, 0x9e, 0x3f, 0x3c, 0x91, 0x5d, 0x77, - 0x32, 0xb3, 0x72, 0xb9, 0x2e, 0xff, 0x91, 0xf2, 0x9b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x1f, - 0xb3, 0x05, 0x24, 0x78, 0x11, 0x00, 0x00, + 0x56, 0x3e, 0x43, 0x72, 0xcd, 0x57, 0x48, 0x0e, 0xc9, 0x29, 0xdf, 0x29, 0xa9, 0xca, 0x3d, 0xf7, + 0x54, 0x77, 0xcf, 0xc0, 0x80, 0x90, 0x36, 0x27, 0xa6, 0x7f, 0xef, 0x75, 0xbf, 0xee, 0xf7, 0xe7, + 0xd7, 0xaf, 0x81, 0xdd, 0x30, 0x98, 0x72, 0x16, 0x86, 0x93, 0xc1, 0x89, 0xfa, 0x3a, 0x9e, 0x84, + 0x01, 0x0f, 0x50, 0x71, 0x86, 0x57, 0x8b, 0xe1, 0x64, 0xa0, 0x50, 0xf3, 0x3f, 0x59, 0x40, 0x5d, + 0xe6, 0x0f, 0x2f, 0xe8, 0xed, 0x98, 0xf9, 0x1c, 0xb3, 0x9f, 0xa7, 0x2c, 0xe2, 0x08, 0x41, 0x76, + 0xc8, 0x22, 0x6e, 0x68, 0x87, 0xda, 0x51, 0x19, 0xcb, 0x6f, 0xa4, 0x43, 0x86, 0x8e, 0xb9, 0xb1, + 0x76, 0xa8, 0x1d, 0x65, 0xb0, 0xf8, 0x44, 0x8f, 0xa1, 0x40, 0xc7, 0x9c, 0x8c, 0x23, 0xca, 0x8d, + 0xb2, 0x84, 0xf3, 0x74, 0xcc, 0xdb, 0x11, 0xe5, 0xe8, 0x4b, 0x28, 0x4f, 0xd4, 0x92, 0x64, 0x44, + 0xa3, 0x91, 0x91, 0x91, 0x0b, 0x95, 0x62, 0xec, 0x8c, 0x46, 0x23, 0x74, 0x04, 0xfa, 0x95, 0xeb, + 0x53, 0x8f, 0x0c, 0x3c, 0xfe, 0x91, 0x0c, 0x99, 0xc7, 0xa9, 0x91, 0x3d, 0xd4, 0x8e, 0x72, 0x78, + 0x43, 0xe2, 0x75, 0x8f, 0x7f, 0x6c, 0x08, 0x14, 0x7d, 0x05, 0x9b, 0xc9, 0x62, 0xa1, 0xda, 0xa0, + 0x91, 0x3b, 0xd4, 0x8e, 0x8a, 0x78, 0x63, 0xb2, 0xb8, 0xed, 0xaf, 0x60, 0x93, 0xbb, 0x63, 0x16, + 0x4c, 0x39, 0x89, 0xd8, 0x20, 0xf0, 0x87, 0x91, 0xb1, 0xae, 0x56, 0x8c, 0xe1, 0xae, 0x42, 0x91, + 0x09, 0x95, 0x2b, 0xc6, 0x88, 0xe7, 0x8e, 0x5d, 0x4e, 0xc4, 0xf6, 0xf3, 0x72, 0xfb, 0xa5, 0x2b, + 0xc6, 0x5a, 0x02, 0xeb, 0x52, 0x8e, 0x9e, 0xc1, 0xc6, 0x5c, 0x47, 0x9e, 0xb1, 0x22, 0x95, 0xca, + 0x89, 0x92, 0x3c, 0xe8, 0x4b, 0xd0, 0x83, 0x29, 0xbf, 0x0e, 0x5c, 0xff, 0x9a, 0x0c, 0x46, 0xd4, + 0x27, 0xee, 0xd0, 0x28, 0x1c, 0x6a, 0x47, 0xd9, 0x37, 0x6b, 0xaf, 0x34, 0xbc, 0x91, 0xc8, 0xea, + 0x23, 0xea, 0xdb, 0x43, 0xf4, 0x1c, 0x36, 0x3d, 0x1a, 0x71, 0x32, 0x0a, 0x26, 0x64, 0x32, 0xbd, + 0xbc, 0x61, 0xb7, 0xc6, 0x86, 0xf4, 0x4c, 0x45, 0xc0, 0x67, 0xc1, 0xe4, 0x42, 0x82, 0xe8, 0x00, + 0x40, 0x7a, 0x45, 0x1a, 0x37, 0x8a, 0xf2, 0x0c, 0x45, 0x81, 0x48, 0xc3, 0xe8, 0x14, 0x4a, 0x32, + 0x9a, 0x64, 0xe4, 0xfa, 0x3c, 0x32, 0xe0, 0x30, 0x73, 0x54, 0x3a, 0xd5, 0x8f, 0x3d, 0x5f, 0x04, + 0x16, 0x0b, 0xc9, 0x99, 0xeb, 0x73, 0x9c, 0x56, 0x42, 0x16, 0x14, 0x44, 0x18, 0x09, 0xf7, 0x3e, + 0x1a, 0x25, 0x39, 0xe1, 0xc5, 0xf1, 0x2c, 0x25, 0x8e, 0xef, 0xe6, 0xc0, 0x71, 0x83, 0x45, 0xbc, + 0xe7, 0x7d, 0xb4, 0x7c, 0x1e, 0xde, 0xe2, 0xfc, 0x50, 0x8d, 0xaa, 0xdf, 0x41, 0x39, 0x2d, 0x10, + 0x59, 0x21, 0x4e, 0x21, 0x12, 0x25, 0x8b, 0xc5, 0x27, 0xda, 0x81, 0xdc, 0x47, 0xea, 0x4d, 0x99, + 0xcc, 0x94, 0x32, 0x56, 0x83, 0xef, 0xd6, 0x5e, 0x6b, 0xe6, 0x6b, 0xd8, 0xee, 0x85, 0x74, 0x70, + 0xb3, 0x94, 0x6c, 0xcb, 0xb9, 0xa2, 0xdd, 0xc9, 0x15, 0xf3, 0x6f, 0x1a, 0x54, 0xe2, 0x59, 0x5d, + 0x4e, 0xf9, 0x34, 0x42, 0x5f, 0x43, 0x2e, 0xe2, 0x94, 0x33, 0xa9, 0xbd, 0x71, 0xfa, 0x28, 0x75, + 0x96, 0x94, 0x22, 0xc3, 0x4a, 0x0b, 0x55, 0xa1, 0x30, 0x09, 0x99, 0x3b, 0xa6, 0xd7, 0xc9, 0xbe, + 0x66, 0x63, 0x64, 0x42, 0x4e, 0x4e, 0x96, 0x49, 0x5a, 0x3a, 0x2d, 0xa7, 0xfd, 0x88, 0x95, 0x08, + 0x1d, 0x41, 0x6e, 0xc4, 0xbd, 0x41, 0x64, 0x64, 0xa5, 0xeb, 0x50, 0xac, 0x73, 0xd6, 0x6b, 0xd5, + 0x6b, 0x9c, 0xb3, 0xf1, 0x84, 0x63, 0xa5, 0x60, 0xfe, 0x16, 0x36, 0xe5, 0xcc, 0x26, 0x63, 0x0f, + 0x55, 0xd3, 0x23, 0x10, 0xb5, 0x22, 0x73, 0x4f, 0x55, 0xd4, 0x3a, 0x1d, 0x8b, 0xb4, 0x33, 0x87, + 0xa0, 0xcf, 0xe7, 0x47, 0x93, 0xc0, 0x8f, 0x84, 0x75, 0x5d, 0x6c, 0x43, 0xe4, 0x98, 0x48, 0x49, + 0x99, 0x8c, 0x9a, 0x9c, 0xb5, 0x11, 0xe3, 0x4d, 0xc6, 0x64, 0x3a, 0x3e, 0x57, 0x15, 0x40, 0xbc, + 0x60, 0x70, 0x23, 0x6a, 0x8a, 0xde, 0xc6, 0xcb, 0x57, 0x04, 0xdc, 0x0a, 0x06, 0x37, 0x0d, 0x01, + 0x9a, 0x3f, 0xa9, 0xb2, 0xef, 0x05, 0xea, 0x94, 0xff, 0x77, 0x24, 0xe6, 0xce, 0x5a, 0xbb, 0xd7, + 0x59, 0x26, 0x81, 0xed, 0x85, 0xc5, 0xe3, 0x53, 0xa4, 0x63, 0xa0, 0x2d, 0xc5, 0xe0, 0x25, 0xe4, + 0xaf, 0xa8, 0xeb, 0x4d, 0xc3, 0x64, 0x61, 0x94, 0x0a, 0x68, 0x53, 0x49, 0x70, 0xa2, 0x62, 0xfe, + 0x37, 0x0f, 0xf9, 0x18, 0x44, 0xa7, 0x90, 0x1d, 0x04, 0xc3, 0x24, 0x0f, 0xbe, 0xb8, 0x3b, 0x2d, + 0xf9, 0xad, 0x07, 0x43, 0x86, 0xa5, 0x2e, 0xfa, 0x1d, 0x6c, 0x88, 0x5a, 0xf5, 0x99, 0x47, 0xa6, + 0x93, 0x21, 0x9d, 0x85, 0xde, 0x48, 0xcd, 0xae, 0x2b, 0x85, 0xbe, 0x94, 0xe3, 0xca, 0x20, 0x3d, + 0x44, 0x7b, 0x50, 0x14, 0xd1, 0x56, 0x91, 0xc8, 0xca, 0xdc, 0x2f, 0x08, 0x40, 0xc6, 0xc0, 0x84, + 0x4a, 0xe0, 0xbb, 0x81, 0x4f, 0xa2, 0x11, 0x25, 0xa7, 0xdf, 0x7c, 0x2b, 0xc9, 0xaa, 0x8c, 0x4b, + 0x12, 0xec, 0x8e, 0xe8, 0xe9, 0x37, 0xdf, 0xa2, 0x27, 0x50, 0x92, 0x05, 0xce, 0x3e, 0x4d, 0xdc, + 0xf0, 0x56, 0xb2, 0x54, 0x05, 0xcb, 0x9a, 0xb7, 0x24, 0x22, 0xaa, 0xe8, 0xca, 0xa3, 0xd7, 0x91, + 0x64, 0xa6, 0x0a, 0x56, 0x03, 0xf4, 0x0a, 0x76, 0x62, 0x1f, 0x90, 0x28, 0x98, 0x86, 0x03, 0x46, + 0x5c, 0x7f, 0xc8, 0x3e, 0x49, 0xc6, 0xa9, 0x60, 0x14, 0xcb, 0xba, 0x52, 0x64, 0x0b, 0x09, 0xda, + 0x85, 0xf5, 0x11, 0x73, 0xaf, 0x47, 0x8a, 0x45, 0x2a, 0x38, 0x1e, 0x99, 0x7f, 0xcf, 0x41, 0x29, + 0xe5, 0x18, 0x54, 0x86, 0x02, 0xb6, 0xba, 0x16, 0x7e, 0x6f, 0x35, 0xf4, 0xcf, 0xd0, 0x11, 0x3c, + 0xb3, 0x9d, 0x7a, 0x07, 0x63, 0xab, 0xde, 0x23, 0x1d, 0x4c, 0xfa, 0xce, 0x5b, 0xa7, 0xf3, 0x83, + 0x43, 0x2e, 0x6a, 0x1f, 0xda, 0x96, 0xd3, 0x23, 0x0d, 0xab, 0x57, 0xb3, 0x5b, 0x5d, 0x5d, 0x43, + 0xfb, 0x60, 0xcc, 0x35, 0x13, 0x71, 0xad, 0xdd, 0xe9, 0x3b, 0x3d, 0x7d, 0x0d, 0x3d, 0x81, 0xbd, + 0xa6, 0xed, 0xd4, 0x5a, 0x64, 0xae, 0x53, 0x6f, 0xf5, 0xde, 0x13, 0xeb, 0xc7, 0x0b, 0x1b, 0x7f, + 0xd0, 0x33, 0xab, 0x14, 0x44, 0x4d, 0x25, 0x2b, 0x64, 0xd1, 0x63, 0xf8, 0x5c, 0x29, 0xa8, 0x29, + 0xa4, 0xd7, 0xe9, 0x90, 0x6e, 0xa7, 0xe3, 0xe8, 0x39, 0xb4, 0x05, 0x15, 0xdb, 0x79, 0x5f, 0x6b, + 0xd9, 0x0d, 0x82, 0xad, 0x5a, 0xab, 0xad, 0xaf, 0xa3, 0x6d, 0xd8, 0x5c, 0xd6, 0xcb, 0x8b, 0x25, + 0x12, 0xbd, 0x8e, 0x63, 0x77, 0x1c, 0xf2, 0xde, 0xc2, 0x5d, 0xbb, 0xe3, 0xe8, 0x05, 0xb4, 0x0b, + 0x68, 0x51, 0x74, 0xd6, 0xae, 0xd5, 0xf5, 0x22, 0xfa, 0x1c, 0xb6, 0x16, 0xf1, 0xb7, 0xd6, 0x07, + 0x1d, 0x90, 0x01, 0x3b, 0x6a, 0x63, 0xe4, 0x8d, 0xd5, 0xea, 0xfc, 0x40, 0xda, 0xb6, 0x63, 0xb7, + 0xfb, 0x6d, 0xbd, 0x84, 0x76, 0x40, 0x6f, 0x5a, 0x16, 0xb1, 0x9d, 0x6e, 0xbf, 0xd9, 0xb4, 0xeb, + 0xb6, 0xe5, 0xf4, 0xf4, 0xb2, 0xb2, 0xbc, 0xea, 0xe0, 0x15, 0x31, 0xa1, 0x7e, 0x56, 0x73, 0x1c, + 0xab, 0x45, 0x1a, 0x76, 0xb7, 0xf6, 0xa6, 0x65, 0x35, 0xf4, 0x0d, 0x74, 0x00, 0x8f, 0x7b, 0x56, + 0xfb, 0xa2, 0x83, 0x6b, 0xf8, 0x03, 0x49, 0xe4, 0xcd, 0x9a, 0xdd, 0xea, 0x63, 0x4b, 0xdf, 0x44, + 0x5f, 0xc2, 0x01, 0xb6, 0xde, 0xf5, 0x6d, 0x6c, 0x35, 0x88, 0xd3, 0x69, 0x58, 0xa4, 0x69, 0xd5, + 0x7a, 0x7d, 0x6c, 0x91, 0xb6, 0xdd, 0xed, 0xda, 0xce, 0xf7, 0xba, 0x8e, 0x9e, 0xc1, 0xe1, 0x4c, + 0x65, 0xb6, 0xc0, 0x92, 0xd6, 0x96, 0x38, 0x5f, 0x12, 0x52, 0xc7, 0xfa, 0xb1, 0x47, 0x2e, 0x2c, + 0x0b, 0xeb, 0x08, 0x55, 0x61, 0x77, 0x6e, 0x5e, 0x19, 0x88, 0x6d, 0x6f, 0x0b, 0xd9, 0x85, 0x85, + 0xdb, 0x35, 0x47, 0x04, 0x78, 0x41, 0xb6, 0x23, 0xb6, 0x3d, 0x97, 0x2d, 0x6f, 0xfb, 0x73, 0x84, + 0x60, 0x23, 0x15, 0x95, 0x66, 0x0d, 0xeb, 0xbb, 0x68, 0x07, 0x36, 0x93, 0x1d, 0x24, 0x8a, 0xff, + 0xca, 0xa3, 0x47, 0x80, 0xfa, 0x0e, 0xb6, 0x6a, 0x0d, 0xe1, 0x90, 0x99, 0xe0, 0xdf, 0xf9, 0xf3, + 0x6c, 0x61, 0x4d, 0xcf, 0x98, 0xff, 0xcc, 0x40, 0x65, 0xa1, 0x2e, 0xd1, 0x3e, 0x14, 0x23, 0xf7, + 0xda, 0xa7, 0x5c, 0x30, 0x87, 0x22, 0x95, 0x39, 0x20, 0xaf, 0xd1, 0x11, 0x75, 0x7d, 0xc5, 0x66, + 0x8a, 0xf7, 0x8b, 0x12, 0x91, 0x5c, 0xb6, 0x07, 0xf9, 0xe4, 0xca, 0xce, 0xcc, 0xae, 0xec, 0xf5, + 0x81, 0xba, 0xaa, 0xf7, 0xa1, 0x28, 0x28, 0x33, 0xe2, 0x74, 0x3c, 0x91, 0x25, 0x5e, 0xc1, 0x73, + 0x00, 0x3d, 0x85, 0xca, 0x98, 0x45, 0x11, 0xbd, 0x66, 0x44, 0x95, 0x29, 0x48, 0x8d, 0x72, 0x0c, + 0x36, 0x65, 0xb5, 0x3e, 0x85, 0x84, 0x36, 0x62, 0xa5, 0x9c, 0x52, 0x8a, 0x41, 0xa5, 0xb4, 0xcc, + 0xd8, 0x9c, 0xc6, 0x6c, 0x90, 0x66, 0x6c, 0x4e, 0xd1, 0x0b, 0xd8, 0x52, 0x94, 0xe3, 0xfa, 0xee, + 0x78, 0x3a, 0x56, 0xd4, 0x93, 0x97, 0xd4, 0xb3, 0x29, 0xa9, 0x47, 0xe1, 0x92, 0x81, 0x1e, 0x43, + 0xe1, 0x92, 0x46, 0x4c, 0x5c, 0x16, 0x31, 0x35, 0xe4, 0xc5, 0xb8, 0xc9, 0x98, 0x10, 0x89, 0x2b, + 0x24, 0x14, 0xa4, 0xa7, 0x18, 0x21, 0x7f, 0xc5, 0x18, 0x16, 0xbe, 0x9c, 0x59, 0xa0, 0x9f, 0xe6, + 0x16, 0x4a, 0x29, 0x0b, 0x0a, 0x97, 0x16, 0x5e, 0xc0, 0x16, 0xfb, 0xc4, 0x43, 0x4a, 0x82, 0x09, + 0xfd, 0x79, 0xca, 0xc8, 0x90, 0x72, 0x2a, 0x7b, 0xc0, 0x32, 0xde, 0x94, 0x82, 0x8e, 0xc4, 0x1b, + 0x94, 0x53, 0x73, 0x1f, 0xaa, 0x98, 0x45, 0x8c, 0xb7, 0xdd, 0x28, 0x72, 0x03, 0xbf, 0x1e, 0xf8, + 0x3c, 0x0c, 0xbc, 0xf8, 0xce, 0x31, 0x0f, 0x60, 0x6f, 0xa5, 0x54, 0x5d, 0x1a, 0x62, 0xf2, 0xbb, + 0x29, 0x0b, 0x6f, 0x57, 0x4f, 0x7e, 0x07, 0x7b, 0x2b, 0xa5, 0xf1, 0x8d, 0xf3, 0x12, 0x72, 0x13, + 0xea, 0x86, 0x91, 0xb1, 0x26, 0x6f, 0xed, 0xdd, 0x85, 0x26, 0xc1, 0x0d, 0xcf, 0xdc, 0x88, 0x07, + 0xe1, 0x2d, 0x56, 0x4a, 0xe7, 0xd9, 0x82, 0xa6, 0xaf, 0x99, 0x7f, 0xd2, 0xa0, 0x94, 0x12, 0x8a, + 0x3c, 0xf0, 0x83, 0x21, 0x23, 0x57, 0x61, 0x30, 0x4e, 0x32, 0x6c, 0x06, 0x20, 0x03, 0xf2, 0x72, + 0xc0, 0x83, 0x38, 0xbd, 0x92, 0x21, 0xfa, 0x1a, 0xf2, 0x23, 0xb5, 0x84, 0x8c, 0x52, 0xe9, 0x74, + 0x7b, 0xc9, 0xba, 0xf0, 0x0d, 0x4e, 0x74, 0xce, 0xb3, 0x85, 0x8c, 0x9e, 0x3d, 0xcf, 0x16, 0xb2, + 0x7a, 0xee, 0x3c, 0x5b, 0xc8, 0xe9, 0xeb, 0xe7, 0xd9, 0xc2, 0xba, 0x9e, 0x37, 0xff, 0xa2, 0x41, + 0x21, 0xd1, 0x5e, 0xcc, 0x49, 0xd5, 0x00, 0xa4, 0x72, 0xf2, 0x14, 0x76, 0xc6, 0xae, 0x4f, 0x26, + 0xcc, 0xa7, 0x9e, 0xfb, 0x47, 0x46, 0x16, 0xfb, 0x8b, 0x95, 0x32, 0xf4, 0x1a, 0x1e, 0xc9, 0x86, + 0x94, 0xaa, 0x26, 0x86, 0x44, 0xd3, 0xc1, 0x80, 0x45, 0xd1, 0xd5, 0xd4, 0x93, 0x25, 0x51, 0xc0, + 0xf7, 0x89, 0xcd, 0x31, 0x3c, 0x92, 0xae, 0xbf, 0x08, 0x83, 0x4b, 0x7a, 0xe9, 0x7a, 0x2e, 0xbf, + 0x4d, 0xda, 0x88, 0x7d, 0x28, 0x0a, 0xe7, 0x10, 0x3f, 0xb9, 0x97, 0xcb, 0x78, 0x0e, 0x08, 0x97, + 0xf1, 0x40, 0xc9, 0x62, 0x97, 0xc5, 0x43, 0xd1, 0x20, 0xcc, 0xde, 0x13, 0x19, 0xb9, 0xe9, 0xd9, + 0xd8, 0xbc, 0x01, 0xe3, 0xae, 0xb9, 0x38, 0xcc, 0x87, 0x50, 0x9a, 0xcc, 0x61, 0x69, 0x51, 0xc3, + 0x69, 0x28, 0x1d, 0x8c, 0xb5, 0x5f, 0x0e, 0x86, 0xf9, 0x57, 0x0d, 0xb6, 0xde, 0x4c, 0x5d, 0x6f, + 0xb8, 0xd0, 0x1d, 0xa5, 0x9f, 0x3b, 0xda, 0xe2, 0x73, 0x67, 0xd5, 0x5b, 0x66, 0x6d, 0xe5, 0x5b, + 0x66, 0xd5, 0x7b, 0x21, 0x73, 0xef, 0x7b, 0xe1, 0x09, 0x94, 0xe6, 0x4f, 0x05, 0xd5, 0x7c, 0x96, + 0x31, 0x8c, 0x92, 0x77, 0x42, 0x64, 0xbe, 0x06, 0x94, 0xde, 0x68, 0xec, 0x90, 0x59, 0x93, 0xa6, + 0xdd, 0xdb, 0xa4, 0xbd, 0xf8, 0xb3, 0x06, 0xe5, 0x74, 0xa7, 0x8c, 0x2a, 0x50, 0xb4, 0x1d, 0xd2, + 0x6c, 0xd9, 0xdf, 0x9f, 0xf5, 0xf4, 0xcf, 0xc4, 0xb0, 0xdb, 0xaf, 0xd7, 0x2d, 0xab, 0x61, 0x35, + 0x74, 0x4d, 0x70, 0xb8, 0xa0, 0x63, 0xab, 0x41, 0x7a, 0x76, 0xdb, 0xea, 0xf4, 0xc5, 0xed, 0xbe, + 0x0d, 0x9b, 0x31, 0xe6, 0x74, 0x08, 0xee, 0xf4, 0x7b, 0x96, 0x9e, 0x41, 0x3a, 0x94, 0x63, 0xd0, + 0xc2, 0xb8, 0x83, 0xf5, 0xac, 0xb8, 0x92, 0x62, 0xe4, 0x6e, 0xa7, 0x90, 0x34, 0x12, 0xb9, 0xd3, + 0x7f, 0xe4, 0x60, 0x5d, 0x6e, 0x30, 0x44, 0x67, 0x50, 0x4a, 0xbd, 0x47, 0xd0, 0xc1, 0x83, 0xef, + 0x94, 0xaa, 0xb1, 0xba, 0xf5, 0x9f, 0x46, 0xaf, 0x34, 0x74, 0x0e, 0xe5, 0xf4, 0x8b, 0x03, 0xa5, + 0xdb, 0xc3, 0x15, 0x4f, 0x91, 0x07, 0xd7, 0x7a, 0x0b, 0xba, 0x15, 0x71, 0x77, 0x2c, 0xda, 0xc1, + 0xb8, 0x41, 0x47, 0xd5, 0x94, 0xfe, 0x52, 0xd7, 0x5f, 0xdd, 0x5b, 0x29, 0x8b, 0x23, 0xd4, 0x52, + 0x47, 0x8c, 0x5b, 0xe4, 0x3b, 0x47, 0x5c, 0xec, 0xcb, 0xab, 0x5f, 0xdc, 0x27, 0x8e, 0x57, 0x1b, + 0xc2, 0xf6, 0x0a, 0x0e, 0x45, 0xbf, 0x4a, 0xef, 0xe0, 0x5e, 0x06, 0xae, 0x3e, 0xff, 0x25, 0xb5, + 0xb9, 0x95, 0x15, 0x64, 0xbb, 0x60, 0xe5, 0x7e, 0xaa, 0x5e, 0xb0, 0xf2, 0x10, 0x67, 0xff, 0x04, + 0xfa, 0x72, 0xa1, 0x23, 0x73, 0x79, 0xee, 0x5d, 0xd2, 0xa9, 0x3e, 0x7d, 0x50, 0x27, 0x5e, 0xdc, + 0x06, 0x98, 0x97, 0x0b, 0xda, 0x4f, 0x4d, 0xb9, 0x53, 0xee, 0xd5, 0x83, 0x7b, 0xa4, 0x6a, 0xa9, + 0x37, 0xbf, 0xfe, 0xfd, 0xc9, 0xb5, 0xcb, 0x47, 0xd3, 0xcb, 0xe3, 0x41, 0x30, 0x3e, 0xf1, 0x44, + 0x53, 0xed, 0xbb, 0xfe, 0xb5, 0xcf, 0xf8, 0x1f, 0x82, 0xf0, 0xe6, 0xc4, 0xf3, 0x87, 0x27, 0xb2, + 0xea, 0x4e, 0x66, 0xab, 0x5c, 0xae, 0xcb, 0xff, 0x5c, 0x7e, 0xf3, 0xbf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x78, 0xac, 0xbb, 0x04, 0xa3, 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/routerrpc/router.proto b/lnrpc/routerrpc/router.proto index e7daa94b..167b8d7a 100644 --- a/lnrpc/routerrpc/router.proto +++ b/lnrpc/routerrpc/router.proto @@ -155,6 +155,11 @@ message PaymentStatus { The taken route when state is SUCCEEDED. */ lnrpc.Route route = 3; + + /** + The HTLCs made in attempt to settle the payment [EXPERIMENTAL]. + */ + repeated lnrpc.HTLCAttempt htlcs = 4; } diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 9c55881f..7951391f 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -12,6 +12,7 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcutil" + "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" @@ -779,3 +780,48 @@ func UnmarshalMPP(reqMPP *lnrpc.MPPRecord) (*record.MPP, error) { return record.NewMPP(total, addr), nil } + +// MarshalHTLCAttempt constructs an RPC HTLCAttempt from the db representation. +func (r *RouterBackend) MarshalHTLCAttempt( + htlc channeldb.HTLCAttempt) (*lnrpc.HTLCAttempt, error) { + + var ( + status lnrpc.HTLCAttempt_HTLCStatus + resolveTime int64 + ) + + switch { + case htlc.Settle != nil: + status = lnrpc.HTLCAttempt_SUCCEEDED + resolveTime = MarshalTimeNano(htlc.Settle.SettleTime) + + case htlc.Failure != nil: + status = lnrpc.HTLCAttempt_FAILED + resolveTime = MarshalTimeNano(htlc.Failure.FailTime) + + default: + status = lnrpc.HTLCAttempt_IN_FLIGHT + } + + route, err := r.MarshallRoute(&htlc.Route) + if err != nil { + return nil, err + } + + return &lnrpc.HTLCAttempt{ + Status: status, + Route: route, + AttemptTimeNs: MarshalTimeNano(htlc.AttemptTime), + ResolveTimeNs: resolveTime, + }, nil +} + +// MarshalTimeNano converts a time.Time into its nanosecond representation. If +// the time is zero, this method simply returns 0, since calling UnixNano() on a +// zero-valued time is undefined. +func MarshalTimeNano(t time.Time) int64 { + if t.IsZero() { + return 0 + } + return t.UnixNano() +} diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index ac11dcf3..3432ecd8 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -584,19 +584,12 @@ func (s *Server) trackPayment(paymentHash lntypes.Hash, case result := <-resultChan: // Marshall result to rpc type. var status PaymentStatus - if result.Success { log.Debugf("Payment %v successfully completed", paymentHash) status.State = PaymentState_SUCCEEDED status.Preimage = result.Preimage[:] - status.Route, err = router.MarshallRoute( - result.Route, - ) - if err != nil { - return err - } } else { state, err := marshallFailureReason( result.FailureReason, @@ -605,15 +598,49 @@ func (s *Server) trackPayment(paymentHash lntypes.Hash, return err } status.State = state - if result.Route != nil { - status.Route, err = router.MarshallRoute( - result.Route, - ) - if err != nil { - return err - } + } + + // Extract the last route from the given list of HTLCs. This + // will populate the legacy route field for backwards + // compatibility. + // + // NOTE: For now there will be at most one HTLC, this code + // should be revisted or the field removed when multiple HTLCs + // are permitted. + var legacyRoute *route.Route + for _, htlc := range result.HTLCs { + switch { + case htlc.Settle != nil: + legacyRoute = &htlc.Route + + // Only display the route for failed payments if we got + // an incorrect payment details error, so that it can be + // used for probing or fee estimation. + case htlc.Failure != nil && result.FailureReason == + channeldb.FailureReasonPaymentDetails: + + legacyRoute = &htlc.Route } } + if legacyRoute != nil { + status.Route, err = router.MarshallRoute(legacyRoute) + if err != nil { + return err + } + } + + // Marshal our list of HTLCs that have been tried for this + // payment. + htlcs := make([]*lnrpc.HTLCAttempt, 0, len(result.HTLCs)) + for _, dbHtlc := range result.HTLCs { + htlc, err := router.MarshalHTLCAttempt(dbHtlc) + if err != nil { + return err + } + + htlcs = append(htlcs, htlc) + } + status.Htlcs = htlcs // Send event to the client. err = stream.Send(&status) @@ -645,7 +672,7 @@ func marshallFailureReason(reason channeldb.FailureReason) ( case channeldb.FailureReasonError: return PaymentState_FAILED_ERROR, nil - case channeldb.FailureReasonIncorrectPaymentDetails: + case channeldb.FailureReasonPaymentDetails: return PaymentState_FAILED_INCORRECT_PAYMENT_DETAILS, nil } diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 9582a274..99a6294a 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -251,6 +251,34 @@ func (Payment_PaymentStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_77a6da22d6a3feb1, []int{103, 0} } +type HTLCAttempt_HTLCStatus int32 + +const ( + HTLCAttempt_IN_FLIGHT HTLCAttempt_HTLCStatus = 0 + HTLCAttempt_SUCCEEDED HTLCAttempt_HTLCStatus = 1 + HTLCAttempt_FAILED HTLCAttempt_HTLCStatus = 2 +) + +var HTLCAttempt_HTLCStatus_name = map[int32]string{ + 0: "IN_FLIGHT", + 1: "SUCCEEDED", + 2: "FAILED", +} + +var HTLCAttempt_HTLCStatus_value = map[string]int32{ + "IN_FLIGHT": 0, + "SUCCEEDED": 1, + "FAILED": 2, +} + +func (x HTLCAttempt_HTLCStatus) String() string { + return proto.EnumName(HTLCAttempt_HTLCStatus_name, int32(x)) +} + +func (HTLCAttempt_HTLCStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{104, 0} +} + type GenSeedRequest struct { //* //aezeed_passphrase is an optional user provided passphrase that will be used @@ -7657,10 +7685,10 @@ type Payment struct { PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash,proto3" json:"payment_hash,omitempty"` /// Deprecated, use value_sat or value_msat. Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` // Deprecated: Do not use. - /// The date of this payment - CreationDate int64 `protobuf:"varint,3,opt,name=creation_date,proto3" json:"creation_date,omitempty"` - /// The path this payment took - Path []string `protobuf:"bytes,4,rep,name=path,proto3" json:"path,omitempty"` + /// Deprecated, use creation_time_ns + CreationDate int64 `protobuf:"varint,3,opt,name=creation_date,proto3" json:"creation_date,omitempty"` // Deprecated: Do not use. + /// The path this payment took. + Path []string `protobuf:"bytes,4,rep,name=path,proto3" json:"path,omitempty"` // Deprecated: Do not use. /// Deprecated, use fee_sat or fee_msat. Fee int64 `protobuf:"varint,5,opt,name=fee,proto3" json:"fee,omitempty"` // Deprecated: Do not use. /// The payment preimage @@ -7676,10 +7704,14 @@ type Payment struct { /// The fee paid for this payment in satoshis FeeSat int64 `protobuf:"varint,11,opt,name=fee_sat,proto3" json:"fee_sat,omitempty"` /// The fee paid for this payment in milli-satoshis - FeeMsat int64 `protobuf:"varint,12,opt,name=fee_msat,proto3" json:"fee_msat,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + FeeMsat int64 `protobuf:"varint,12,opt,name=fee_msat,proto3" json:"fee_msat,omitempty"` + /// The time in UNIX nanoseconds at which the payment was created. + CreationTimeNs int64 `protobuf:"varint,13,opt,name=creation_time_ns,proto3" json:"creation_time_ns,omitempty"` + /// The HTLCs made in attempt to settle the payment [EXPERIMENTAL]. + Htlcs []*HTLCAttempt `protobuf:"bytes,14,rep,name=htlcs,proto3" json:"htlcs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Payment) Reset() { *m = Payment{} } @@ -7722,6 +7754,7 @@ func (m *Payment) GetValue() int64 { return 0 } +// Deprecated: Do not use. func (m *Payment) GetCreationDate() int64 { if m != nil { return m.CreationDate @@ -7729,6 +7762,7 @@ func (m *Payment) GetCreationDate() int64 { return 0 } +// Deprecated: Do not use. func (m *Payment) GetPath() []string { if m != nil { return m.Path @@ -7793,6 +7827,89 @@ func (m *Payment) GetFeeMsat() int64 { return 0 } +func (m *Payment) GetCreationTimeNs() int64 { + if m != nil { + return m.CreationTimeNs + } + return 0 +} + +func (m *Payment) GetHtlcs() []*HTLCAttempt { + if m != nil { + return m.Htlcs + } + return nil +} + +type HTLCAttempt struct { + /// The status of the HTLC. + Status HTLCAttempt_HTLCStatus `protobuf:"varint,1,opt,name=status,proto3,enum=lnrpc.HTLCAttempt_HTLCStatus" json:"status,omitempty"` + /// The route taken by this HTLC. + Route *Route `protobuf:"bytes,2,opt,name=route,proto3" json:"route,omitempty"` + /// The time in UNIX nanonseconds at which this HTLC was sent. + AttemptTimeNs int64 `protobuf:"varint,3,opt,name=attempt_time_ns,proto3" json:"attempt_time_ns,omitempty"` + //* + //The time in UNIX nanonseconds at which this HTLC was settled or failed. + //This value will not be set if the HTLC is still IN_FLIGHT. + ResolveTimeNs int64 `protobuf:"varint,4,opt,name=resolve_time_ns,proto3" json:"resolve_time_ns,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HTLCAttempt) Reset() { *m = HTLCAttempt{} } +func (m *HTLCAttempt) String() string { return proto.CompactTextString(m) } +func (*HTLCAttempt) ProtoMessage() {} +func (*HTLCAttempt) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{104} +} + +func (m *HTLCAttempt) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HTLCAttempt.Unmarshal(m, b) +} +func (m *HTLCAttempt) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HTLCAttempt.Marshal(b, m, deterministic) +} +func (m *HTLCAttempt) XXX_Merge(src proto.Message) { + xxx_messageInfo_HTLCAttempt.Merge(m, src) +} +func (m *HTLCAttempt) XXX_Size() int { + return xxx_messageInfo_HTLCAttempt.Size(m) +} +func (m *HTLCAttempt) XXX_DiscardUnknown() { + xxx_messageInfo_HTLCAttempt.DiscardUnknown(m) +} + +var xxx_messageInfo_HTLCAttempt proto.InternalMessageInfo + +func (m *HTLCAttempt) GetStatus() HTLCAttempt_HTLCStatus { + if m != nil { + return m.Status + } + return HTLCAttempt_IN_FLIGHT +} + +func (m *HTLCAttempt) GetRoute() *Route { + if m != nil { + return m.Route + } + return nil +} + +func (m *HTLCAttempt) GetAttemptTimeNs() int64 { + if m != nil { + return m.AttemptTimeNs + } + return 0 +} + +func (m *HTLCAttempt) GetResolveTimeNs() int64 { + if m != nil { + return m.ResolveTimeNs + } + return 0 +} + type ListPaymentsRequest struct { //* //If true, then return payments that have not yet fully completed. This means @@ -7808,7 +7925,7 @@ func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} } func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) } func (*ListPaymentsRequest) ProtoMessage() {} func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{104} + return fileDescriptor_77a6da22d6a3feb1, []int{105} } func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error { @@ -7848,7 +7965,7 @@ func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} } func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) } func (*ListPaymentsResponse) ProtoMessage() {} func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{105} + return fileDescriptor_77a6da22d6a3feb1, []int{106} } func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error { @@ -7886,7 +8003,7 @@ func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsReque func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllPaymentsRequest) ProtoMessage() {} func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{106} + return fileDescriptor_77a6da22d6a3feb1, []int{107} } func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error { @@ -7917,7 +8034,7 @@ func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResp func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) } func (*DeleteAllPaymentsResponse) ProtoMessage() {} func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{107} + return fileDescriptor_77a6da22d6a3feb1, []int{108} } func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error { @@ -7949,7 +8066,7 @@ func (m *AbandonChannelRequest) Reset() { *m = AbandonChannelRequest{} } func (m *AbandonChannelRequest) String() string { return proto.CompactTextString(m) } func (*AbandonChannelRequest) ProtoMessage() {} func (*AbandonChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{108} + return fileDescriptor_77a6da22d6a3feb1, []int{109} } func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error { @@ -7987,7 +8104,7 @@ func (m *AbandonChannelResponse) Reset() { *m = AbandonChannelResponse{} func (m *AbandonChannelResponse) String() string { return proto.CompactTextString(m) } func (*AbandonChannelResponse) ProtoMessage() {} func (*AbandonChannelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{109} + return fileDescriptor_77a6da22d6a3feb1, []int{110} } func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error { @@ -8020,7 +8137,7 @@ func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} } func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) } func (*DebugLevelRequest) ProtoMessage() {} func (*DebugLevelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{110} + return fileDescriptor_77a6da22d6a3feb1, []int{111} } func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error { @@ -8066,7 +8183,7 @@ func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} } func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) } func (*DebugLevelResponse) ProtoMessage() {} func (*DebugLevelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{111} + return fileDescriptor_77a6da22d6a3feb1, []int{112} } func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error { @@ -8106,7 +8223,7 @@ func (m *PayReqString) Reset() { *m = PayReqString{} } func (m *PayReqString) String() string { return proto.CompactTextString(m) } func (*PayReqString) ProtoMessage() {} func (*PayReqString) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{112} + return fileDescriptor_77a6da22d6a3feb1, []int{113} } func (m *PayReqString) XXX_Unmarshal(b []byte) error { @@ -8154,7 +8271,7 @@ func (m *PayReq) Reset() { *m = PayReq{} } func (m *PayReq) String() string { return proto.CompactTextString(m) } func (*PayReq) ProtoMessage() {} func (*PayReq) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{113} + return fileDescriptor_77a6da22d6a3feb1, []int{114} } func (m *PayReq) XXX_Unmarshal(b []byte) error { @@ -8255,7 +8372,7 @@ func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} } func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) } func (*FeeReportRequest) ProtoMessage() {} func (*FeeReportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{114} + return fileDescriptor_77a6da22d6a3feb1, []int{115} } func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error { @@ -8294,7 +8411,7 @@ func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} } func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) } func (*ChannelFeeReport) ProtoMessage() {} func (*ChannelFeeReport) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{115} + return fileDescriptor_77a6da22d6a3feb1, []int{116} } func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error { @@ -8361,7 +8478,7 @@ func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} } func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) } func (*FeeReportResponse) ProtoMessage() {} func (*FeeReportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{116} + return fileDescriptor_77a6da22d6a3feb1, []int{117} } func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error { @@ -8432,7 +8549,7 @@ func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} } func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateRequest) ProtoMessage() {} func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{117} + return fileDescriptor_77a6da22d6a3feb1, []int{118} } func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error { @@ -8536,7 +8653,7 @@ func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} } func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateResponse) ProtoMessage() {} func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{118} + return fileDescriptor_77a6da22d6a3feb1, []int{119} } func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error { @@ -8575,7 +8692,7 @@ func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryReque func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryRequest) ProtoMessage() {} func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{119} + return fileDescriptor_77a6da22d6a3feb1, []int{120} } func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error { @@ -8652,7 +8769,7 @@ func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} } func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) } func (*ForwardingEvent) ProtoMessage() {} func (*ForwardingEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{120} + return fileDescriptor_77a6da22d6a3feb1, []int{121} } func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error { @@ -8750,7 +8867,7 @@ func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResp func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryResponse) ProtoMessage() {} func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{121} + return fileDescriptor_77a6da22d6a3feb1, []int{122} } func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error { @@ -8797,7 +8914,7 @@ func (m *ExportChannelBackupRequest) Reset() { *m = ExportChannelBackupR func (m *ExportChannelBackupRequest) String() string { return proto.CompactTextString(m) } func (*ExportChannelBackupRequest) ProtoMessage() {} func (*ExportChannelBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{122} + return fileDescriptor_77a6da22d6a3feb1, []int{123} } func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error { @@ -8844,7 +8961,7 @@ func (m *ChannelBackup) Reset() { *m = ChannelBackup{} } func (m *ChannelBackup) String() string { return proto.CompactTextString(m) } func (*ChannelBackup) ProtoMessage() {} func (*ChannelBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{123} + return fileDescriptor_77a6da22d6a3feb1, []int{124} } func (m *ChannelBackup) XXX_Unmarshal(b []byte) error { @@ -8898,7 +9015,7 @@ func (m *MultiChanBackup) Reset() { *m = MultiChanBackup{} } func (m *MultiChanBackup) String() string { return proto.CompactTextString(m) } func (*MultiChanBackup) ProtoMessage() {} func (*MultiChanBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{124} + return fileDescriptor_77a6da22d6a3feb1, []int{125} } func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error { @@ -8943,7 +9060,7 @@ func (m *ChanBackupExportRequest) Reset() { *m = ChanBackupExportRequest func (m *ChanBackupExportRequest) String() string { return proto.CompactTextString(m) } func (*ChanBackupExportRequest) ProtoMessage() {} func (*ChanBackupExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{125} + return fileDescriptor_77a6da22d6a3feb1, []int{126} } func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error { @@ -8982,7 +9099,7 @@ func (m *ChanBackupSnapshot) Reset() { *m = ChanBackupSnapshot{} } func (m *ChanBackupSnapshot) String() string { return proto.CompactTextString(m) } func (*ChanBackupSnapshot) ProtoMessage() {} func (*ChanBackupSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{126} + return fileDescriptor_77a6da22d6a3feb1, []int{127} } func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error { @@ -9030,7 +9147,7 @@ func (m *ChannelBackups) Reset() { *m = ChannelBackups{} } func (m *ChannelBackups) String() string { return proto.CompactTextString(m) } func (*ChannelBackups) ProtoMessage() {} func (*ChannelBackups) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{127} + return fileDescriptor_77a6da22d6a3feb1, []int{128} } func (m *ChannelBackups) XXX_Unmarshal(b []byte) error { @@ -9072,7 +9189,7 @@ func (m *RestoreChanBackupRequest) Reset() { *m = RestoreChanBackupReque func (m *RestoreChanBackupRequest) String() string { return proto.CompactTextString(m) } func (*RestoreChanBackupRequest) ProtoMessage() {} func (*RestoreChanBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{128} + return fileDescriptor_77a6da22d6a3feb1, []int{129} } func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error { @@ -9148,7 +9265,7 @@ func (m *RestoreBackupResponse) Reset() { *m = RestoreBackupResponse{} } func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) } func (*RestoreBackupResponse) ProtoMessage() {} func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{129} + return fileDescriptor_77a6da22d6a3feb1, []int{130} } func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error { @@ -9179,7 +9296,7 @@ func (m *ChannelBackupSubscription) Reset() { *m = ChannelBackupSubscrip func (m *ChannelBackupSubscription) String() string { return proto.CompactTextString(m) } func (*ChannelBackupSubscription) ProtoMessage() {} func (*ChannelBackupSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{130} + return fileDescriptor_77a6da22d6a3feb1, []int{131} } func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error { @@ -9210,7 +9327,7 @@ func (m *VerifyChanBackupResponse) Reset() { *m = VerifyChanBackupRespon func (m *VerifyChanBackupResponse) String() string { return proto.CompactTextString(m) } func (*VerifyChanBackupResponse) ProtoMessage() {} func (*VerifyChanBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{131} + return fileDescriptor_77a6da22d6a3feb1, []int{132} } func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error { @@ -9245,7 +9362,7 @@ func (m *MacaroonPermission) Reset() { *m = MacaroonPermission{} } func (m *MacaroonPermission) String() string { return proto.CompactTextString(m) } func (*MacaroonPermission) ProtoMessage() {} func (*MacaroonPermission) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{132} + return fileDescriptor_77a6da22d6a3feb1, []int{133} } func (m *MacaroonPermission) XXX_Unmarshal(b []byte) error { @@ -9292,7 +9409,7 @@ func (m *BakeMacaroonRequest) Reset() { *m = BakeMacaroonRequest{} } func (m *BakeMacaroonRequest) String() string { return proto.CompactTextString(m) } func (*BakeMacaroonRequest) ProtoMessage() {} func (*BakeMacaroonRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{133} + return fileDescriptor_77a6da22d6a3feb1, []int{134} } func (m *BakeMacaroonRequest) XXX_Unmarshal(b []byte) error { @@ -9332,7 +9449,7 @@ func (m *BakeMacaroonResponse) Reset() { *m = BakeMacaroonResponse{} } func (m *BakeMacaroonResponse) String() string { return proto.CompactTextString(m) } func (*BakeMacaroonResponse) ProtoMessage() {} func (*BakeMacaroonResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{134} + return fileDescriptor_77a6da22d6a3feb1, []int{135} } func (m *BakeMacaroonResponse) XXX_Unmarshal(b []byte) error { @@ -9368,6 +9485,7 @@ func init() { proto.RegisterEnum("lnrpc.ChannelEventUpdate_UpdateType", ChannelEventUpdate_UpdateType_name, ChannelEventUpdate_UpdateType_value) proto.RegisterEnum("lnrpc.Invoice_InvoiceState", Invoice_InvoiceState_name, Invoice_InvoiceState_value) proto.RegisterEnum("lnrpc.Payment_PaymentStatus", Payment_PaymentStatus_name, Payment_PaymentStatus_value) + proto.RegisterEnum("lnrpc.HTLCAttempt_HTLCStatus", HTLCAttempt_HTLCStatus_name, HTLCAttempt_HTLCStatus_value) proto.RegisterType((*GenSeedRequest)(nil), "lnrpc.GenSeedRequest") proto.RegisterType((*GenSeedResponse)(nil), "lnrpc.GenSeedResponse") proto.RegisterType((*InitWalletRequest)(nil), "lnrpc.InitWalletRequest") @@ -9480,6 +9598,7 @@ func init() { proto.RegisterType((*ListInvoiceResponse)(nil), "lnrpc.ListInvoiceResponse") proto.RegisterType((*InvoiceSubscription)(nil), "lnrpc.InvoiceSubscription") proto.RegisterType((*Payment)(nil), "lnrpc.Payment") + proto.RegisterType((*HTLCAttempt)(nil), "lnrpc.HTLCAttempt") proto.RegisterType((*ListPaymentsRequest)(nil), "lnrpc.ListPaymentsRequest") proto.RegisterType((*ListPaymentsResponse)(nil), "lnrpc.ListPaymentsResponse") proto.RegisterType((*DeleteAllPaymentsRequest)(nil), "lnrpc.DeleteAllPaymentsRequest") @@ -9516,553 +9635,560 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 8735 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0x5b, - 0xb6, 0x56, 0xaa, 0x7f, 0xec, 0xee, 0xd5, 0x6d, 0xbb, 0xbd, 0xed, 0xd8, 0x9d, 0x3e, 0x39, 0x39, - 0x39, 0x35, 0xb9, 0x49, 0x26, 0x73, 0x26, 0xc9, 0xf1, 0xcc, 0x1c, 0xce, 0x3d, 0xe1, 0x72, 0x71, - 0x6c, 0x27, 0xce, 0x1c, 0xc7, 0xf1, 0x94, 0x93, 0x09, 0x33, 0x73, 0xaf, 0x7a, 0xca, 0xdd, 0xdb, - 0x76, 0x4d, 0xba, 0xab, 0x7a, 0xaa, 0xaa, 0x9d, 0x78, 0x0e, 0x07, 0x09, 0x84, 0x10, 0xe2, 0x05, - 0x0d, 0x08, 0x09, 0x10, 0xe8, 0x4a, 0x73, 0x91, 0xb8, 0x57, 0x3c, 0xc0, 0x0b, 0xd2, 0x05, 0xdd, - 0x37, 0x84, 0x90, 0x90, 0x10, 0x0f, 0x3c, 0x20, 0xf1, 0xc0, 0x08, 0x81, 0x84, 0xae, 0x78, 0x43, - 0xe2, 0x1d, 0xad, 0xb5, 0x7f, 0x6a, 0xef, 0xaa, 0xea, 0x38, 0x67, 0x66, 0xe0, 0xc9, 0xbd, 0xbf, - 0xb5, 0x6b, 0xff, 0xae, 0xb5, 0xf6, 0xda, 0x6b, 0xaf, 0xbd, 0x0d, 0xcd, 0x78, 0x32, 0xb8, 0x3b, - 0x89, 0xa3, 0x34, 0x62, 0xf5, 0x51, 0x18, 0x4f, 0x06, 0xbd, 0xab, 0x27, 0x51, 0x74, 0x32, 0xe2, - 0xf7, 0xfc, 0x49, 0x70, 0xcf, 0x0f, 0xc3, 0x28, 0xf5, 0xd3, 0x20, 0x0a, 0x13, 0x91, 0xc9, 0xfd, - 0x31, 0x2c, 0x3e, 0xe6, 0xe1, 0x21, 0xe7, 0x43, 0x8f, 0xff, 0x74, 0xca, 0x93, 0x94, 0x7d, 0x03, - 0x96, 0x7d, 0xfe, 0x33, 0xce, 0x87, 0xfd, 0x89, 0x9f, 0x24, 0x93, 0xd3, 0xd8, 0x4f, 0x78, 0xd7, - 0xb9, 0xee, 0xdc, 0x6e, 0x7b, 0x1d, 0x41, 0x38, 0xd0, 0x38, 0xfb, 0x10, 0xda, 0x09, 0x66, 0xe5, - 0x61, 0x1a, 0x47, 0x93, 0xf3, 0x6e, 0x85, 0xf2, 0xb5, 0x10, 0xdb, 0x11, 0x90, 0x3b, 0x82, 0x25, - 0x5d, 0x43, 0x32, 0x89, 0xc2, 0x84, 0xb3, 0xfb, 0xb0, 0x3a, 0x08, 0x26, 0xa7, 0x3c, 0xee, 0xd3, - 0xc7, 0xe3, 0x90, 0x8f, 0xa3, 0x30, 0x18, 0x74, 0x9d, 0xeb, 0xd5, 0xdb, 0x4d, 0x8f, 0x09, 0x1a, - 0x7e, 0xf1, 0x54, 0x52, 0xd8, 0x2d, 0x58, 0xe2, 0xa1, 0xc0, 0xf9, 0x90, 0xbe, 0x92, 0x55, 0x2d, - 0x66, 0x30, 0x7e, 0xe0, 0xfe, 0xcd, 0x0a, 0x2c, 0x3f, 0x09, 0x83, 0xf4, 0xa5, 0x3f, 0x1a, 0xf1, - 0x54, 0xf5, 0xe9, 0x16, 0x2c, 0xbd, 0x26, 0x80, 0xfa, 0xf4, 0x3a, 0x8a, 0x87, 0xb2, 0x47, 0x8b, - 0x02, 0x3e, 0x90, 0xe8, 0xcc, 0x96, 0x55, 0x66, 0xb6, 0xac, 0x74, 0xb8, 0xaa, 0x33, 0x86, 0xeb, - 0x16, 0x2c, 0xc5, 0x7c, 0x10, 0x9d, 0xf1, 0xf8, 0xbc, 0xff, 0x3a, 0x08, 0x87, 0xd1, 0xeb, 0x6e, - 0xed, 0xba, 0x73, 0xbb, 0xee, 0x2d, 0x2a, 0xf8, 0x25, 0xa1, 0xec, 0x21, 0x2c, 0x0d, 0x4e, 0xfd, - 0x30, 0xe4, 0xa3, 0xfe, 0x91, 0x3f, 0x78, 0x35, 0x9d, 0x24, 0xdd, 0xfa, 0x75, 0xe7, 0x76, 0x6b, - 0xe3, 0xca, 0x5d, 0x9a, 0xd5, 0xbb, 0x5b, 0xa7, 0x7e, 0xf8, 0x90, 0x28, 0x87, 0xa1, 0x3f, 0x49, - 0x4e, 0xa3, 0xd4, 0x5b, 0x94, 0x5f, 0x08, 0x38, 0x71, 0x57, 0x81, 0x99, 0x23, 0x21, 0xc6, 0xde, - 0xfd, 0x67, 0x0e, 0xac, 0xbc, 0x08, 0x47, 0xd1, 0xe0, 0xd5, 0xaf, 0x38, 0x44, 0x25, 0x7d, 0xa8, - 0xbc, 0x6b, 0x1f, 0xaa, 0x5f, 0xb5, 0x0f, 0x6b, 0xb0, 0x6a, 0x37, 0x56, 0xf6, 0x82, 0xc3, 0x65, - 0xfc, 0xfa, 0x84, 0xab, 0x66, 0xa9, 0x6e, 0x7c, 0x1d, 0x3a, 0x83, 0x69, 0x1c, 0xf3, 0xb0, 0xd0, - 0x8f, 0x25, 0x89, 0xeb, 0x8e, 0x7c, 0x08, 0xed, 0x90, 0xbf, 0xce, 0xb2, 0x49, 0xde, 0x0d, 0xf9, - 0x6b, 0x95, 0xc5, 0xed, 0xc2, 0x5a, 0xbe, 0x1a, 0xd9, 0x80, 0xff, 0xe6, 0x40, 0xed, 0x45, 0xfa, - 0x26, 0x62, 0x77, 0xa1, 0x96, 0x9e, 0x4f, 0x84, 0x84, 0x2c, 0x6e, 0x30, 0xd9, 0xb5, 0xcd, 0xe1, - 0x30, 0xe6, 0x49, 0xf2, 0xfc, 0x7c, 0xc2, 0xbd, 0xb6, 0x2f, 0x12, 0x7d, 0xcc, 0xc7, 0xba, 0x30, - 0x2f, 0xd3, 0x54, 0x61, 0xd3, 0x53, 0x49, 0x76, 0x0d, 0xc0, 0x1f, 0x47, 0xd3, 0x30, 0xed, 0x27, - 0x7e, 0x4a, 0x43, 0x55, 0xf5, 0x0c, 0x84, 0x5d, 0x85, 0xe6, 0xe4, 0x55, 0x3f, 0x19, 0xc4, 0xc1, - 0x24, 0x25, 0xb6, 0x69, 0x7a, 0x19, 0xc0, 0xbe, 0x01, 0x8d, 0x68, 0x9a, 0x4e, 0xa2, 0x20, 0x4c, - 0x25, 0xab, 0x2c, 0xc9, 0xb6, 0x3c, 0x9b, 0xa6, 0x07, 0x08, 0x7b, 0x3a, 0x03, 0xbb, 0x01, 0x0b, - 0x83, 0x28, 0x3c, 0x0e, 0xe2, 0xb1, 0x50, 0x06, 0xdd, 0x39, 0xaa, 0xcd, 0x06, 0xdd, 0x7f, 0x55, - 0x81, 0xd6, 0xf3, 0xd8, 0x0f, 0x13, 0x7f, 0x80, 0x00, 0x36, 0x3d, 0x7d, 0xd3, 0x3f, 0xf5, 0x93, - 0x53, 0xea, 0x6d, 0xd3, 0x53, 0x49, 0xb6, 0x06, 0x73, 0xa2, 0xa1, 0xd4, 0xa7, 0xaa, 0x27, 0x53, - 0xec, 0x23, 0x58, 0x0e, 0xa7, 0xe3, 0xbe, 0x5d, 0x57, 0x95, 0xb8, 0xa5, 0x48, 0xc0, 0x01, 0x38, - 0xc2, 0xb9, 0x16, 0x55, 0x88, 0x1e, 0x1a, 0x08, 0x73, 0xa1, 0x2d, 0x53, 0x3c, 0x38, 0x39, 0x15, - 0xdd, 0xac, 0x7b, 0x16, 0x86, 0x65, 0xa4, 0xc1, 0x98, 0xf7, 0x93, 0xd4, 0x1f, 0x4f, 0x64, 0xb7, - 0x0c, 0x84, 0xe8, 0x51, 0xea, 0x8f, 0xfa, 0xc7, 0x9c, 0x27, 0xdd, 0x79, 0x49, 0xd7, 0x08, 0xbb, - 0x09, 0x8b, 0x43, 0x9e, 0xa4, 0x7d, 0x39, 0x29, 0x3c, 0xe9, 0x36, 0x48, 0xf4, 0x73, 0x28, 0x96, - 0x13, 0xfb, 0xaf, 0xfb, 0x38, 0x00, 0xfc, 0x4d, 0xb7, 0x29, 0xda, 0x9a, 0x21, 0xc8, 0x39, 0x8f, - 0x79, 0x6a, 0x8c, 0x5e, 0x22, 0x39, 0xd4, 0xdd, 0x03, 0x66, 0xc0, 0xdb, 0x3c, 0xf5, 0x83, 0x51, - 0xc2, 0x3e, 0x81, 0x76, 0x6a, 0x64, 0x26, 0x55, 0xd8, 0xd2, 0xec, 0x64, 0x7c, 0xe0, 0x59, 0xf9, - 0xdc, 0x53, 0x68, 0x3c, 0xe2, 0x7c, 0x2f, 0x18, 0x07, 0x29, 0x5b, 0x83, 0xfa, 0x71, 0xf0, 0x86, - 0x0b, 0x86, 0xaf, 0xee, 0x5e, 0xf2, 0x44, 0x92, 0x7d, 0x00, 0x40, 0x3f, 0xfa, 0x63, 0xcd, 0x58, - 0xbb, 0x97, 0xbc, 0x26, 0x61, 0x4f, 0x91, 0xb3, 0x7a, 0x30, 0x3f, 0xe1, 0xf1, 0x80, 0xab, 0xf9, - 0xdb, 0xbd, 0xe4, 0x29, 0xe0, 0xe1, 0x3c, 0xd4, 0x47, 0x58, 0xba, 0xfb, 0x27, 0x35, 0x68, 0x1d, - 0xf2, 0x50, 0x4b, 0x1a, 0x83, 0x1a, 0x8e, 0x89, 0x94, 0x2e, 0xfa, 0xcd, 0xbe, 0x06, 0x2d, 0x1a, - 0xa7, 0x24, 0x8d, 0x83, 0xf0, 0x44, 0x30, 0xf8, 0xc3, 0x4a, 0xd7, 0xf1, 0x00, 0xe1, 0x43, 0x42, - 0x59, 0x07, 0xaa, 0xfe, 0x58, 0x31, 0x38, 0xfe, 0x64, 0x57, 0xa0, 0xe1, 0x8f, 0x53, 0xd1, 0xbc, - 0x36, 0xc1, 0xf3, 0xfe, 0x38, 0xa5, 0xa6, 0x7d, 0x08, 0xed, 0x89, 0x7f, 0x3e, 0x46, 0x79, 0xd6, - 0x5c, 0xd1, 0xf6, 0x5a, 0x12, 0xdb, 0x45, 0xb6, 0xd8, 0x80, 0x15, 0x33, 0x8b, 0xaa, 0xbc, 0xae, - 0x2b, 0x5f, 0x36, 0x72, 0xcb, 0x36, 0xdc, 0x82, 0x25, 0xf5, 0x4d, 0x2c, 0xfa, 0x43, 0xbc, 0xd2, - 0xf4, 0x16, 0x25, 0xac, 0x7a, 0x79, 0x1b, 0x3a, 0xc7, 0x41, 0xe8, 0x8f, 0xfa, 0x83, 0x51, 0x7a, - 0xd6, 0x1f, 0xf2, 0x51, 0xea, 0x13, 0xd7, 0xd4, 0xbd, 0x45, 0xc2, 0xb7, 0x46, 0xe9, 0xd9, 0x36, - 0xa2, 0xec, 0x23, 0x68, 0x1e, 0x73, 0xde, 0xa7, 0xc1, 0xea, 0x36, 0x2c, 0x09, 0x54, 0x33, 0xe4, - 0x35, 0x8e, 0xd5, 0x5c, 0x7d, 0x04, 0x9d, 0x68, 0x9a, 0x9e, 0x44, 0x41, 0x78, 0xd2, 0x47, 0x9d, - 0xd7, 0x0f, 0x86, 0xc4, 0x45, 0xb5, 0x87, 0x95, 0xfb, 0x8e, 0xb7, 0xa8, 0x68, 0xa8, 0x7d, 0x9e, - 0x0c, 0xd9, 0x4d, 0x58, 0x1a, 0xf9, 0x49, 0xda, 0x3f, 0x8d, 0x26, 0xfd, 0xc9, 0xf4, 0xe8, 0x15, - 0x3f, 0xef, 0x2e, 0xd0, 0x40, 0x2c, 0x20, 0xbc, 0x1b, 0x4d, 0x0e, 0x08, 0x64, 0xef, 0x03, 0x50, - 0x3b, 0x45, 0x23, 0xe0, 0xba, 0x73, 0x7b, 0xc1, 0x6b, 0x22, 0x22, 0x2a, 0xfd, 0x0c, 0x1a, 0x34, - 0x3d, 0xe9, 0xe8, 0xac, 0xdb, 0x22, 0x06, 0xfb, 0x40, 0xb6, 0xd0, 0x98, 0xd8, 0xbb, 0xdb, 0x3c, - 0x49, 0x9f, 0x8f, 0xce, 0x70, 0xfd, 0x3e, 0xf7, 0xe6, 0x87, 0x22, 0xd5, 0xfb, 0x0c, 0xda, 0x26, - 0x01, 0x67, 0x11, 0x9b, 0x81, 0xb3, 0x5f, 0xf3, 0xf0, 0x27, 0x5b, 0x85, 0xfa, 0x99, 0x3f, 0x9a, - 0x72, 0xa9, 0x48, 0x45, 0xe2, 0xb3, 0xca, 0xa7, 0x8e, 0xfb, 0x27, 0x0e, 0xb4, 0x45, 0x0d, 0xd2, - 0x00, 0xb8, 0x01, 0x0b, 0x6a, 0xf8, 0x79, 0x1c, 0x47, 0xb1, 0xd4, 0x27, 0x36, 0xc8, 0xee, 0x40, - 0x47, 0x01, 0x93, 0x98, 0x07, 0x63, 0xff, 0x44, 0x95, 0x5d, 0xc0, 0xd9, 0x46, 0x56, 0x62, 0x1c, - 0x4d, 0x53, 0x2e, 0x97, 0x9a, 0xb6, 0xec, 0x9f, 0x87, 0x98, 0x67, 0x67, 0x41, 0x7d, 0x52, 0xc2, - 0x5b, 0x16, 0xe6, 0xfe, 0x3d, 0x07, 0x18, 0x36, 0xfd, 0x79, 0x24, 0x8a, 0x90, 0x6c, 0x91, 0x67, - 0x4b, 0xe7, 0x9d, 0xd9, 0xb2, 0xf2, 0x36, 0xb6, 0x74, 0xa1, 0x2e, 0x5a, 0x5f, 0x2b, 0x69, 0xbd, - 0x20, 0x7d, 0xb7, 0xd6, 0xa8, 0x76, 0x6a, 0xee, 0x7f, 0xa9, 0xc2, 0xea, 0x96, 0x58, 0x2b, 0x37, - 0x07, 0x03, 0x3e, 0xd1, 0x0c, 0xfb, 0x01, 0xb4, 0xc2, 0x68, 0xc8, 0x15, 0x9b, 0x88, 0x86, 0x01, - 0x42, 0x06, 0x8f, 0x9c, 0xfa, 0x41, 0x28, 0x1a, 0x2e, 0xc6, 0xb3, 0x49, 0x08, 0x35, 0xfb, 0x26, - 0x2c, 0x4d, 0x78, 0x38, 0x34, 0xf9, 0x52, 0x58, 0x33, 0x0b, 0x12, 0x96, 0x2c, 0xf9, 0x01, 0xb4, - 0x8e, 0xa7, 0x22, 0x1f, 0x4a, 0x73, 0x8d, 0xf8, 0x00, 0x24, 0xb4, 0x29, 0x84, 0x7a, 0x32, 0x4d, - 0x4e, 0x89, 0x5a, 0x27, 0xea, 0x3c, 0xa6, 0x91, 0xf4, 0x3e, 0xc0, 0x70, 0x9a, 0xa4, 0x92, 0x4d, - 0xe7, 0x88, 0xd8, 0x44, 0x44, 0xb0, 0xe9, 0x37, 0x61, 0x65, 0xec, 0xbf, 0xe9, 0x13, 0xff, 0xf4, - 0x83, 0xb0, 0x7f, 0x3c, 0x22, 0x75, 0x3f, 0x4f, 0xf9, 0x3a, 0x63, 0xff, 0xcd, 0xf7, 0x91, 0xf2, - 0x24, 0x7c, 0x44, 0x38, 0xca, 0xb2, 0xb2, 0x33, 0x62, 0x9e, 0xf0, 0xf8, 0x8c, 0x93, 0xf8, 0xd5, - 0xb4, 0x31, 0xe1, 0x09, 0x14, 0x5b, 0x34, 0xc6, 0x7e, 0xa7, 0xa3, 0x81, 0x90, 0x35, 0x6f, 0x7e, - 0x1c, 0x84, 0xbb, 0xe9, 0x68, 0xc0, 0xae, 0x02, 0xa0, 0xf0, 0x4e, 0x78, 0xdc, 0x7f, 0xf5, 0x9a, - 0x04, 0xa7, 0x46, 0xc2, 0x7a, 0xc0, 0xe3, 0xcf, 0x5f, 0xb3, 0xf7, 0xa0, 0x39, 0x48, 0x48, 0xfa, - 0xfd, 0xf3, 0x6e, 0x8b, 0xa4, 0xaa, 0x31, 0x48, 0x50, 0xee, 0xfd, 0x73, 0xf6, 0x11, 0x30, 0x6c, - 0xad, 0x4f, 0xb3, 0xc0, 0x87, 0x54, 0x7c, 0x42, 0x6a, 0x6c, 0x81, 0x1a, 0xbb, 0x29, 0x09, 0x58, - 0x4f, 0xc2, 0xbe, 0x06, 0x0b, 0xaa, 0xb1, 0xc7, 0x23, 0xff, 0x24, 0x21, 0x39, 0x5e, 0xf0, 0xda, - 0x12, 0x7c, 0x84, 0x98, 0xfb, 0x52, 0x58, 0x37, 0xc6, 0xdc, 0x4a, 0xb9, 0xc1, 0x75, 0x96, 0x10, - 0x9a, 0xd7, 0x86, 0x27, 0x53, 0x65, 0x93, 0x56, 0x29, 0x99, 0x34, 0xf7, 0x17, 0x0e, 0xb4, 0x65, - 0xc9, 0x64, 0x12, 0xb0, 0xfb, 0xc0, 0xd4, 0x2c, 0xa6, 0x6f, 0x82, 0x61, 0xff, 0xe8, 0x3c, 0xe5, - 0x89, 0x60, 0x9a, 0xdd, 0x4b, 0x5e, 0x09, 0x0d, 0x15, 0x97, 0x85, 0x26, 0x69, 0x2c, 0x78, 0x7a, - 0xf7, 0x92, 0x57, 0xa0, 0xa0, 0x88, 0xa1, 0xd1, 0x31, 0x4d, 0xfb, 0x41, 0x38, 0xe4, 0x6f, 0x88, - 0x95, 0x16, 0x3c, 0x0b, 0x7b, 0xb8, 0x08, 0x6d, 0xf3, 0x3b, 0xf7, 0x27, 0xd0, 0x50, 0x26, 0x0b, - 0x2d, 0xd7, 0xb9, 0x76, 0x79, 0x06, 0xc2, 0x7a, 0xd0, 0xb0, 0x5b, 0xe1, 0x35, 0xbe, 0x4a, 0xdd, - 0xee, 0x5f, 0x80, 0xce, 0x1e, 0x32, 0x51, 0x88, 0x4c, 0x2b, 0xed, 0xb0, 0x35, 0x98, 0x33, 0x84, - 0xa7, 0xe9, 0xc9, 0x14, 0x2e, 0x78, 0xa7, 0x51, 0x92, 0xca, 0x7a, 0xe8, 0xb7, 0xfb, 0xef, 0x1c, - 0x60, 0x3b, 0x49, 0x1a, 0x8c, 0xfd, 0x94, 0x3f, 0xe2, 0x5a, 0x3d, 0x3c, 0x83, 0x36, 0x96, 0xf6, - 0x3c, 0xda, 0x14, 0x56, 0x91, 0x58, 0xcd, 0xbf, 0x21, 0xc5, 0xb9, 0xf8, 0xc1, 0x5d, 0x33, 0xb7, - 0x50, 0xbc, 0x56, 0x01, 0x28, 0x6d, 0xa9, 0x1f, 0x9f, 0xf0, 0x94, 0x4c, 0x26, 0x69, 0x70, 0x83, - 0x80, 0xb6, 0xa2, 0xf0, 0xb8, 0xf7, 0xbb, 0xb0, 0x5c, 0x28, 0xc3, 0xd4, 0xd1, 0xcd, 0x12, 0x1d, - 0x5d, 0x35, 0x75, 0xf4, 0x00, 0x56, 0xac, 0x76, 0x49, 0x8e, 0xeb, 0xc2, 0x3c, 0x0a, 0x06, 0xae, - 0xcc, 0x8e, 0x58, 0x99, 0x65, 0x92, 0x6d, 0xc0, 0xea, 0x31, 0xe7, 0xb1, 0x9f, 0x52, 0x92, 0x44, - 0x07, 0xe7, 0x44, 0x96, 0x5c, 0x4a, 0x73, 0xff, 0xbb, 0x03, 0x4b, 0xa8, 0x4d, 0x9f, 0xfa, 0xe1, - 0xb9, 0x1a, 0xab, 0xbd, 0xd2, 0xb1, 0xba, 0x6d, 0x2c, 0x4c, 0x46, 0xee, 0xaf, 0x3a, 0x50, 0xd5, - 0xfc, 0x40, 0xb1, 0xeb, 0xd0, 0xb6, 0x9a, 0x5b, 0x17, 0x26, 0x60, 0xe2, 0xa7, 0x07, 0x3c, 0x7e, - 0x78, 0x9e, 0xf2, 0x5f, 0x7f, 0x28, 0x6f, 0x42, 0x27, 0x6b, 0xb6, 0x1c, 0x47, 0x06, 0x35, 0x64, - 0x4c, 0x59, 0x00, 0xfd, 0x76, 0xff, 0x91, 0x23, 0x32, 0x6e, 0x45, 0x81, 0x36, 0x0f, 0x31, 0x23, - 0x5a, 0x99, 0x2a, 0x23, 0xfe, 0x9e, 0x69, 0x5e, 0xff, 0xfa, 0x9d, 0x45, 0x9d, 0x98, 0xf0, 0x70, - 0xd8, 0xf7, 0x47, 0x23, 0x52, 0xc4, 0x0d, 0x6f, 0x1e, 0xd3, 0x9b, 0xa3, 0x91, 0x7b, 0x0b, 0x96, - 0x8d, 0xd6, 0xbd, 0xa5, 0x1f, 0xfb, 0xc0, 0xf6, 0x82, 0x24, 0x7d, 0x11, 0x26, 0x13, 0xc3, 0x72, - 0x7a, 0x0f, 0x9a, 0xa8, 0x6d, 0xb1, 0x65, 0x42, 0x72, 0xeb, 0x1e, 0xaa, 0x5f, 0x6c, 0x57, 0x42, - 0x44, 0xff, 0x8d, 0x24, 0x56, 0x24, 0xd1, 0x7f, 0x43, 0x44, 0xf7, 0x53, 0x58, 0xb1, 0xca, 0x93, - 0x55, 0x7f, 0x08, 0xf5, 0x69, 0xfa, 0x26, 0x52, 0xb6, 0x71, 0x4b, 0x72, 0x08, 0xee, 0xc2, 0x3c, - 0x41, 0x71, 0x1f, 0xc0, 0xf2, 0x3e, 0x7f, 0x2d, 0x05, 0x59, 0x35, 0xe4, 0xe6, 0x85, 0x3b, 0x34, - 0xa2, 0xbb, 0x77, 0x81, 0x99, 0x1f, 0x67, 0x02, 0xa0, 0xf6, 0x6b, 0x8e, 0xb5, 0x5f, 0x73, 0x6f, - 0x02, 0x3b, 0x0c, 0x4e, 0xc2, 0xa7, 0x3c, 0x49, 0xfc, 0x13, 0x2d, 0xfa, 0x1d, 0xa8, 0x8e, 0x93, - 0x13, 0xa9, 0xaa, 0xf0, 0xa7, 0xfb, 0x2d, 0x58, 0xb1, 0xf2, 0xc9, 0x82, 0xaf, 0x42, 0x33, 0x09, - 0x4e, 0x42, 0x3f, 0x9d, 0xc6, 0x5c, 0x16, 0x9d, 0x01, 0xee, 0x23, 0x58, 0xfd, 0x3e, 0x8f, 0x83, - 0xe3, 0xf3, 0x8b, 0x8a, 0xb7, 0xcb, 0xa9, 0xe4, 0xcb, 0xd9, 0x81, 0xcb, 0xb9, 0x72, 0x64, 0xf5, - 0x82, 0x7d, 0xe5, 0x4c, 0x36, 0x3c, 0x91, 0x30, 0x74, 0x5f, 0xc5, 0xd4, 0x7d, 0xee, 0x0b, 0x60, - 0x5b, 0x51, 0x18, 0xf2, 0x41, 0x7a, 0xc0, 0x79, 0x9c, 0xb9, 0x8a, 0x32, 0x5e, 0x6d, 0x6d, 0xac, - 0xcb, 0x91, 0xcd, 0x2b, 0x54, 0xc9, 0xc4, 0x0c, 0x6a, 0x13, 0x1e, 0x8f, 0xa9, 0xe0, 0x86, 0x47, - 0xbf, 0xdd, 0xcb, 0xb0, 0x62, 0x15, 0x2b, 0x37, 0xd7, 0x1f, 0xc3, 0xe5, 0xed, 0x20, 0x19, 0x14, - 0x2b, 0xec, 0xc2, 0xfc, 0x64, 0x7a, 0xd4, 0xcf, 0x24, 0x51, 0x25, 0x71, 0xbf, 0x95, 0xff, 0x44, - 0x16, 0xf6, 0x37, 0x1c, 0xa8, 0xed, 0x3e, 0xdf, 0xdb, 0xc2, 0xb5, 0x22, 0x08, 0x07, 0xd1, 0x18, - 0xad, 0x30, 0xd1, 0x69, 0x9d, 0x9e, 0x29, 0x61, 0x57, 0xa1, 0x49, 0xc6, 0x1b, 0x6e, 0x31, 0xa5, - 0x1d, 0x94, 0x01, 0xb8, 0xbd, 0xe5, 0x6f, 0x26, 0x41, 0x4c, 0xfb, 0x57, 0xb5, 0x2b, 0xad, 0xd1, - 0x32, 0x53, 0x24, 0xb8, 0xbf, 0x98, 0x87, 0x79, 0xb9, 0xf8, 0x8a, 0x85, 0x3c, 0x0d, 0xce, 0x78, - 0xb6, 0x90, 0x63, 0x0a, 0x0d, 0xe3, 0x98, 0x8f, 0xa3, 0x54, 0xdb, 0x6f, 0x62, 0x1a, 0x6c, 0x90, - 0xb6, 0xef, 0xd2, 0x88, 0x10, 0x1b, 0xfe, 0xaa, 0xc8, 0x65, 0x81, 0xec, 0x2a, 0xcc, 0x2b, 0x63, - 0xa0, 0xa6, 0x77, 0x16, 0x0a, 0xc2, 0xd1, 0x18, 0xf8, 0x13, 0x7f, 0x10, 0xa4, 0xe7, 0x52, 0x2d, - 0xe8, 0x34, 0x96, 0x3f, 0x8a, 0x06, 0xfe, 0xa8, 0x7f, 0xe4, 0x8f, 0xfc, 0x70, 0xc0, 0x95, 0x7b, - 0xc0, 0x02, 0x71, 0xab, 0x2c, 0x9b, 0xa5, 0xb2, 0x89, 0xed, 0x74, 0x0e, 0xc5, 0x35, 0x7c, 0x10, - 0x8d, 0xc7, 0x41, 0x8a, 0x3b, 0x6c, 0x32, 0xcd, 0xaa, 0x9e, 0x81, 0x08, 0x67, 0x04, 0xa5, 0x5e, - 0x8b, 0x11, 0x6c, 0x2a, 0x67, 0x84, 0x01, 0x62, 0x29, 0x39, 0x0b, 0xad, 0xea, 0x19, 0x08, 0xce, - 0xc5, 0x34, 0x4c, 0x78, 0x9a, 0x8e, 0xf8, 0x50, 0x37, 0xa8, 0x45, 0xd9, 0x8a, 0x04, 0x76, 0x1f, - 0x56, 0xc4, 0xa6, 0x3f, 0xf1, 0xd3, 0x28, 0x39, 0x0d, 0x92, 0x7e, 0x82, 0xbb, 0x5f, 0xb1, 0xf9, - 0x2c, 0x23, 0xb1, 0x4f, 0x61, 0x3d, 0x07, 0xc7, 0x7c, 0xc0, 0x83, 0x33, 0x3e, 0x24, 0x13, 0xae, - 0xea, 0xcd, 0x22, 0xb3, 0xeb, 0xd0, 0x0a, 0xa7, 0xe3, 0xfe, 0x74, 0x32, 0xf4, 0xd1, 0x88, 0x59, - 0x24, 0xe3, 0xd2, 0x84, 0xd8, 0xc7, 0xa0, 0xec, 0x34, 0x69, 0x3d, 0x2e, 0x59, 0x1a, 0x0e, 0xb9, - 0xd7, 0xb3, 0x73, 0x20, 0x63, 0x66, 0x26, 0x69, 0x47, 0x6e, 0xf4, 0x14, 0x40, 0x72, 0x12, 0x07, - 0x67, 0x7e, 0xca, 0xbb, 0xcb, 0x42, 0xa9, 0xcb, 0x24, 0x7e, 0x17, 0x84, 0x41, 0x1a, 0xf8, 0x69, - 0x14, 0x77, 0x19, 0xd1, 0x32, 0x00, 0x07, 0x91, 0xf8, 0x23, 0x49, 0xfd, 0x74, 0x9a, 0x48, 0x0b, - 0x75, 0x85, 0x98, 0xab, 0x48, 0x60, 0x9f, 0xc0, 0x9a, 0xe0, 0x08, 0x22, 0x49, 0xdb, 0x9b, 0x4c, - 0x85, 0x55, 0x1a, 0x91, 0x19, 0x54, 0x1c, 0x4a, 0xc9, 0x22, 0x85, 0x0f, 0x2f, 0x8b, 0xa1, 0x9c, - 0x41, 0xc6, 0xf6, 0x61, 0x0b, 0x82, 0x41, 0x5f, 0xe6, 0x40, 0x11, 0x59, 0xa3, 0x5e, 0x14, 0x09, - 0xc8, 0xe2, 0xa3, 0xe0, 0x98, 0xa7, 0xc1, 0x98, 0x77, 0xd7, 0x05, 0x8b, 0xab, 0x34, 0x0a, 0xe0, - 0x74, 0x42, 0x94, 0xae, 0x10, 0x78, 0x91, 0x72, 0xff, 0xc0, 0x11, 0x8b, 0x8f, 0x14, 0xd4, 0xc4, - 0xd8, 0x56, 0x09, 0x11, 0xed, 0x47, 0xe1, 0xe8, 0x5c, 0x4a, 0x2d, 0x08, 0xe8, 0x59, 0x38, 0x3a, - 0x47, 0xc3, 0x3e, 0x08, 0xcd, 0x2c, 0x42, 0xcf, 0xb5, 0x15, 0x48, 0x99, 0x3e, 0x80, 0xd6, 0x64, - 0x7a, 0x34, 0x0a, 0x06, 0x22, 0x4b, 0x55, 0x94, 0x22, 0x20, 0xca, 0x80, 0xfb, 0x4a, 0x31, 0x53, - 0x22, 0x47, 0x8d, 0x72, 0xb4, 0x24, 0x86, 0x59, 0xdc, 0x87, 0xb0, 0x6a, 0x37, 0x50, 0x2a, 0xf4, - 0x3b, 0xd0, 0x90, 0xf2, 0x9f, 0xc8, 0xcd, 0xfd, 0xa2, 0xe1, 0x67, 0xc5, 0x6d, 0x90, 0xa6, 0xbb, - 0xff, 0xba, 0x06, 0x2b, 0x12, 0xdd, 0x1a, 0x45, 0x09, 0x3f, 0x9c, 0x8e, 0xc7, 0x7e, 0x5c, 0xa2, - 0x58, 0x9c, 0x0b, 0x14, 0x4b, 0xa5, 0xa8, 0x58, 0xae, 0x59, 0xfb, 0x4b, 0xa1, 0x99, 0x0c, 0x84, - 0xdd, 0x86, 0xa5, 0xc1, 0x28, 0x4a, 0x84, 0xb9, 0x6f, 0xba, 0xfa, 0xf2, 0x70, 0x51, 0x19, 0xd6, - 0xcb, 0x94, 0xa1, 0xa9, 0xc8, 0xe6, 0x72, 0x8a, 0xcc, 0x85, 0x36, 0x16, 0xca, 0x95, 0x6e, 0x9e, - 0x97, 0x9b, 0x2d, 0x03, 0xc3, 0xf6, 0xe4, 0xd5, 0x86, 0xd0, 0x51, 0x4b, 0x65, 0x4a, 0x23, 0x18, - 0x73, 0xd2, 0xfd, 0x46, 0xee, 0xa6, 0x54, 0x1a, 0x45, 0x12, 0x7b, 0x04, 0x20, 0xea, 0x22, 0x03, - 0x04, 0xc8, 0x00, 0xb9, 0x69, 0xcf, 0x8a, 0x39, 0xfe, 0x77, 0x31, 0x31, 0x8d, 0x39, 0x19, 0x25, - 0xc6, 0x97, 0xee, 0xdf, 0x72, 0xa0, 0x65, 0xd0, 0xd8, 0x65, 0x58, 0xde, 0x7a, 0xf6, 0xec, 0x60, - 0xc7, 0xdb, 0x7c, 0xfe, 0xe4, 0xfb, 0x3b, 0xfd, 0xad, 0xbd, 0x67, 0x87, 0x3b, 0x9d, 0x4b, 0x08, - 0xef, 0x3d, 0xdb, 0xda, 0xdc, 0xeb, 0x3f, 0x7a, 0xe6, 0x6d, 0x29, 0xd8, 0x61, 0x6b, 0xc0, 0xbc, - 0x9d, 0xa7, 0xcf, 0x9e, 0xef, 0x58, 0x78, 0x85, 0x75, 0xa0, 0xfd, 0xd0, 0xdb, 0xd9, 0xdc, 0xda, - 0x95, 0x48, 0x95, 0xad, 0x42, 0xe7, 0xd1, 0x8b, 0xfd, 0xed, 0x27, 0xfb, 0x8f, 0xfb, 0x5b, 0x9b, - 0xfb, 0x5b, 0x3b, 0x7b, 0x3b, 0xdb, 0x9d, 0x1a, 0x5b, 0x80, 0xe6, 0xe6, 0xc3, 0xcd, 0xfd, 0xed, - 0x67, 0xfb, 0x3b, 0xdb, 0x9d, 0xba, 0xfb, 0x5f, 0x1d, 0xb8, 0x4c, 0xad, 0x1e, 0xe6, 0x85, 0xe4, - 0x3a, 0xb4, 0x06, 0x51, 0x34, 0x41, 0xc3, 0x3f, 0x5b, 0xda, 0x4c, 0x08, 0x05, 0x40, 0x28, 0x85, - 0xe3, 0x28, 0x1e, 0x70, 0x29, 0x23, 0x40, 0xd0, 0x23, 0x44, 0x50, 0x00, 0xe4, 0xf4, 0x8a, 0x1c, - 0x42, 0x44, 0x5a, 0x02, 0x13, 0x59, 0xd6, 0x60, 0xee, 0x28, 0xe6, 0xfe, 0xe0, 0x54, 0x4a, 0x87, - 0x4c, 0xb1, 0xaf, 0x67, 0x3b, 0xd3, 0x01, 0x8e, 0xfe, 0x88, 0x0f, 0x89, 0x63, 0x1a, 0xde, 0x92, - 0xc4, 0xb7, 0x24, 0x8c, 0x5a, 0xd0, 0x3f, 0xf2, 0xc3, 0x61, 0x14, 0xf2, 0xa1, 0x34, 0x7b, 0x33, - 0xc0, 0x3d, 0x80, 0xb5, 0x7c, 0xff, 0xa4, 0x8c, 0x7d, 0x62, 0xc8, 0x98, 0xb0, 0x42, 0x7b, 0xb3, - 0x67, 0xd3, 0x90, 0xb7, 0x5f, 0x56, 0xa0, 0x86, 0x46, 0xc9, 0x6c, 0x03, 0xc6, 0xb4, 0x33, 0xab, - 0x85, 0x73, 0x01, 0xda, 0xec, 0x8a, 0x25, 0x4a, 0x3a, 0x5a, 0x32, 0x24, 0xa3, 0xc7, 0x7c, 0x70, - 0x26, 0x5d, 0x2d, 0x06, 0x82, 0x02, 0x82, 0x9b, 0x00, 0xfa, 0x5a, 0x0a, 0x88, 0x4a, 0x2b, 0x1a, - 0x7d, 0x39, 0x9f, 0xd1, 0xe8, 0xbb, 0x2e, 0xcc, 0x07, 0xe1, 0x51, 0x34, 0x0d, 0x87, 0x24, 0x10, - 0x0d, 0x4f, 0x25, 0xe9, 0x24, 0x82, 0x04, 0x15, 0xf5, 0xa7, 0x60, 0xff, 0x0c, 0x60, 0x1b, 0xd0, - 0x4c, 0xce, 0xc3, 0x81, 0xc9, 0xf3, 0xab, 0x72, 0x94, 0x70, 0x0c, 0xee, 0x1e, 0x9e, 0x87, 0x03, - 0xe2, 0xf0, 0x2c, 0x9b, 0xfb, 0xbb, 0xd0, 0x50, 0x30, 0xb2, 0xe5, 0x8b, 0xfd, 0xcf, 0xf7, 0x9f, - 0xbd, 0xdc, 0xef, 0x1f, 0xfe, 0x60, 0x7f, 0xab, 0x73, 0x89, 0x2d, 0x41, 0x6b, 0x73, 0x8b, 0x38, - 0x9d, 0x00, 0x07, 0xb3, 0x1c, 0x6c, 0x1e, 0x1e, 0x6a, 0xa4, 0xe2, 0x32, 0xdc, 0xc8, 0x27, 0x64, - 0xf9, 0x69, 0x4f, 0xfb, 0x27, 0xb0, 0x6c, 0x60, 0xd9, 0x2e, 0x62, 0x82, 0x40, 0x6e, 0x17, 0x41, - 0x26, 0xa3, 0xa0, 0xb8, 0x1d, 0x58, 0x7c, 0xcc, 0xd3, 0x27, 0xe1, 0x71, 0xa4, 0x4a, 0xfa, 0x9f, - 0x35, 0x58, 0xd2, 0x90, 0x2c, 0xe8, 0x36, 0x2c, 0x05, 0x43, 0x1e, 0xa6, 0x41, 0x7a, 0xde, 0xb7, - 0xfc, 0x05, 0x79, 0x18, 0x4d, 0x6d, 0x7f, 0x14, 0xf8, 0xea, 0xc0, 0x47, 0x24, 0x70, 0xff, 0x8c, - 0x36, 0x80, 0xe9, 0xb7, 0x21, 0xbe, 0x12, 0x6e, 0x8a, 0x52, 0x1a, 0x6a, 0x20, 0xc4, 0xe5, 0x32, - 0xa3, 0x3f, 0x11, 0x26, 0x67, 0x19, 0x09, 0xa7, 0x4a, 0x94, 0x84, 0x5d, 0xae, 0x0b, 0x3b, 0x41, - 0x03, 0x85, 0x13, 0x95, 0x39, 0xa1, 0x1f, 0xf3, 0x27, 0x2a, 0xc6, 0xa9, 0x4c, 0xa3, 0x70, 0x2a, - 0x83, 0xfa, 0xf3, 0x3c, 0x1c, 0xf0, 0x61, 0x3f, 0x8d, 0xfa, 0xa4, 0xe7, 0x89, 0x25, 0x1a, 0x5e, - 0x1e, 0xc6, 0x75, 0x23, 0xe5, 0x49, 0x1a, 0x72, 0xe1, 0x9a, 0x6e, 0x90, 0x17, 0x54, 0x41, 0xb8, - 0x3f, 0x98, 0xc6, 0x41, 0xd2, 0x6d, 0xd3, 0x79, 0x0b, 0xfd, 0x66, 0xdf, 0x86, 0xcb, 0x47, 0x3c, - 0x49, 0xfb, 0xa7, 0xdc, 0x1f, 0xf2, 0x98, 0xd8, 0x4b, 0x1c, 0xec, 0x08, 0x93, 0xab, 0x9c, 0x88, - 0x8c, 0x7b, 0xc6, 0xe3, 0x24, 0x88, 0x42, 0x32, 0xb6, 0x9a, 0x9e, 0x4a, 0x62, 0x79, 0xd8, 0x79, - 0xbd, 0x50, 0xeb, 0x11, 0x5c, 0xa2, 0x8e, 0x97, 0x13, 0xd9, 0x0d, 0x98, 0xa3, 0x0e, 0x24, 0xdd, - 0x0e, 0xf1, 0x4c, 0x3b, 0x93, 0xf9, 0x20, 0xf4, 0x24, 0x0d, 0x67, 0x79, 0x10, 0x8d, 0xa2, 0x98, - 0x2c, 0xae, 0xa6, 0x27, 0x12, 0xf6, 0xe8, 0x9c, 0xc4, 0xfe, 0xe4, 0x54, 0x5a, 0x5d, 0x79, 0xf8, - 0xbb, 0xb5, 0x46, 0xab, 0xd3, 0x76, 0xff, 0x1c, 0xd4, 0xa9, 0x58, 0x2a, 0x8e, 0x06, 0xd3, 0x91, - 0xc5, 0x11, 0xda, 0x85, 0xf9, 0x90, 0xa7, 0xaf, 0xa3, 0xf8, 0x95, 0x3a, 0x3d, 0x94, 0x49, 0xf7, - 0x67, 0xb4, 0x43, 0xd3, 0xa7, 0x69, 0x2f, 0xc8, 0xb4, 0xc4, 0x7d, 0xb6, 0x98, 0xaa, 0xe4, 0xd4, - 0x97, 0x9b, 0xc6, 0x06, 0x01, 0x87, 0xa7, 0x3e, 0xea, 0x5a, 0x6b, 0xf6, 0xc5, 0x3e, 0xbc, 0x45, - 0xd8, 0xae, 0x98, 0xfc, 0x1b, 0xb0, 0xa8, 0xce, 0xe9, 0x92, 0xfe, 0x88, 0x1f, 0xa7, 0xca, 0x8b, - 0x16, 0x4e, 0xc7, 0xb4, 0x59, 0xdf, 0xe3, 0xc7, 0xa9, 0xbb, 0x0f, 0xcb, 0x52, 0xff, 0x3d, 0x9b, - 0x70, 0x55, 0xf5, 0x6f, 0x97, 0xd9, 0x12, 0xad, 0x8d, 0x15, 0x5b, 0x61, 0x8a, 0x93, 0x49, 0x3b, - 0xa7, 0xeb, 0x01, 0x33, 0xf5, 0xa9, 0x2c, 0x50, 0x2e, 0xe6, 0xca, 0x4f, 0x28, 0xbb, 0x63, 0x61, - 0x38, 0x3e, 0xc9, 0x74, 0x30, 0x50, 0xa7, 0xab, 0x0d, 0x4f, 0x25, 0xdd, 0x3f, 0x72, 0x60, 0x85, - 0x4a, 0x53, 0xd6, 0x90, 0x5c, 0xb3, 0x3e, 0xfd, 0x0a, 0xcd, 0x54, 0x5e, 0x5a, 0xe1, 0x9b, 0x5c, - 0x85, 0xba, 0xb9, 0x8a, 0x89, 0xc4, 0x57, 0xf7, 0xc9, 0xd4, 0xf2, 0x3e, 0x19, 0xf7, 0xef, 0x3b, - 0xb0, 0x2c, 0x16, 0x12, 0xb2, 0xb6, 0x65, 0xf7, 0xff, 0x3c, 0x2c, 0x08, 0x8b, 0x40, 0x6a, 0x05, - 0xd9, 0xd0, 0x4c, 0xb5, 0x12, 0x2a, 0x32, 0xef, 0x5e, 0xf2, 0xec, 0xcc, 0xec, 0x01, 0x59, 0x65, - 0x61, 0x9f, 0xd0, 0x92, 0x73, 0x78, 0x7b, 0xac, 0x77, 0x2f, 0x79, 0x46, 0xf6, 0x87, 0x0d, 0x34, - 0x96, 0x11, 0x77, 0x1f, 0xc3, 0x82, 0x55, 0x91, 0xe5, 0x0f, 0x6a, 0x0b, 0x7f, 0x50, 0xc1, 0xf1, - 0x5a, 0x29, 0x71, 0xbc, 0xfe, 0xcb, 0x2a, 0x30, 0x64, 0x96, 0xdc, 0x6c, 0x5c, 0xb7, 0x4f, 0x2f, - 0xd4, 0x91, 0x7c, 0x06, 0xb1, 0x0d, 0x60, 0x46, 0x52, 0x9d, 0xaa, 0x54, 0xf5, 0xa9, 0x4a, 0x09, - 0x15, 0x55, 0xad, 0xb4, 0x3a, 0xf4, 0x89, 0x05, 0xed, 0xf5, 0xc5, 0xd0, 0x97, 0xd2, 0x70, 0x65, - 0xa4, 0xe3, 0x0b, 0xdc, 0x95, 0xc8, 0xfd, 0xb1, 0x4a, 0xe7, 0xe7, 0x78, 0xee, 0xc2, 0x39, 0x9e, - 0x2f, 0xf8, 0xdd, 0x8c, 0x1d, 0x5a, 0xc3, 0xde, 0xa1, 0xdd, 0x80, 0x05, 0x75, 0x4a, 0x21, 0x4e, - 0x44, 0xe5, 0x76, 0xd8, 0x02, 0xd9, 0x1d, 0xe8, 0xa8, 0x4d, 0x92, 0xde, 0x06, 0x8a, 0xf3, 0xbe, - 0x02, 0x8e, 0x6b, 0x40, 0xe6, 0x89, 0x6b, 0x51, 0x63, 0x33, 0x80, 0xf6, 0x54, 0xc8, 0x25, 0xfd, - 0x69, 0x28, 0x8f, 0xe3, 0xf9, 0x90, 0x36, 0xc2, 0xb8, 0xa7, 0xca, 0x13, 0xdc, 0xbf, 0xe3, 0x40, - 0x07, 0xe7, 0xcd, 0x62, 0xcd, 0xcf, 0x80, 0x24, 0xe3, 0x1d, 0x39, 0xd3, 0xca, 0xcb, 0x3e, 0x85, - 0x26, 0xa5, 0xa3, 0x09, 0x0f, 0x25, 0x5f, 0x76, 0x6d, 0xbe, 0xcc, 0x74, 0xca, 0xee, 0x25, 0x2f, - 0xcb, 0x6c, 0x70, 0xe5, 0x7f, 0x74, 0xa0, 0x25, 0x6b, 0xf9, 0x95, 0x3d, 0x3d, 0x3d, 0x23, 0x7e, - 0x42, 0x18, 0x60, 0x59, 0xb8, 0xc4, 0x6d, 0x58, 0x1a, 0xfb, 0xe9, 0x34, 0xc6, 0x35, 0xdd, 0xf2, - 0xf2, 0xe4, 0x61, 0x5c, 0xa0, 0x49, 0x7d, 0x26, 0xfd, 0x34, 0x18, 0xf5, 0x15, 0x55, 0x46, 0x2a, - 0x94, 0x91, 0x50, 0x8b, 0x24, 0xa9, 0x7f, 0xc2, 0xe5, 0xda, 0x2b, 0x12, 0x6e, 0x17, 0xd6, 0x0e, - 0xb2, 0x93, 0x1b, 0xc3, 0xc6, 0x76, 0xff, 0xf9, 0x02, 0xac, 0x17, 0x48, 0x3a, 0xae, 0x4a, 0xba, - 0x2e, 0x46, 0xc1, 0xf8, 0x28, 0xd2, 0x1b, 0x14, 0xc7, 0xf4, 0x6a, 0x58, 0x24, 0x76, 0x02, 0x97, - 0x95, 0x91, 0x81, 0x63, 0x9a, 0x2d, 0x88, 0x15, 0x5a, 0xe9, 0x3e, 0xb6, 0xa7, 0x30, 0x5f, 0xa1, - 0xc2, 0x4d, 0x41, 0x2e, 0x2f, 0x8f, 0x9d, 0x42, 0x57, 0x5b, 0x33, 0x52, 0x61, 0x1b, 0x16, 0x0f, - 0xd6, 0xf5, 0xd1, 0x05, 0x75, 0x59, 0x26, 0xb9, 0x37, 0xb3, 0x34, 0x76, 0x0e, 0xd7, 0x14, 0x8d, - 0x34, 0x72, 0xb1, 0xbe, 0xda, 0x3b, 0xf5, 0x8d, 0x36, 0x1b, 0x76, 0xa5, 0x17, 0x14, 0xcc, 0x7e, - 0x02, 0x6b, 0xaf, 0xfd, 0x20, 0x55, 0xcd, 0x32, 0xec, 0x8b, 0x3a, 0x55, 0xb9, 0x71, 0x41, 0x95, - 0x2f, 0xc5, 0xc7, 0xd6, 0x32, 0x35, 0xa3, 0xc4, 0xde, 0x9f, 0x56, 0x60, 0xd1, 0x2e, 0x07, 0xd9, - 0x54, 0xca, 0xbe, 0xd2, 0x81, 0xca, 0x22, 0xcd, 0xc1, 0xc5, 0x7d, 0x7e, 0xa5, 0x6c, 0x9f, 0x6f, - 0xee, 0xac, 0xab, 0x17, 0xb9, 0x08, 0x6b, 0xef, 0xe6, 0x22, 0xac, 0x97, 0xba, 0x08, 0x67, 0x7b, - 0x92, 0xe6, 0x7e, 0x55, 0x4f, 0xd2, 0xfc, 0x5b, 0x3d, 0x49, 0xbd, 0xff, 0xe3, 0x00, 0x2b, 0x72, - 0x2f, 0x7b, 0x2c, 0x5c, 0x1b, 0x21, 0x1f, 0x49, 0x25, 0xf6, 0xcd, 0x77, 0x93, 0x00, 0x35, 0x5b, - 0xea, 0x6b, 0x14, 0x45, 0x33, 0xb8, 0xc9, 0x34, 0xb1, 0x16, 0xbc, 0x32, 0x52, 0xce, 0x4d, 0x5a, - 0xbb, 0xd8, 0x4d, 0x5a, 0xbf, 0xd8, 0x4d, 0x3a, 0x97, 0x77, 0x93, 0xf6, 0xfe, 0xba, 0x03, 0x2b, - 0x25, 0x6c, 0xf6, 0x9b, 0xeb, 0x38, 0x32, 0x86, 0xa5, 0x7d, 0x2a, 0x92, 0x31, 0x4c, 0xb0, 0xf7, - 0x97, 0x61, 0xc1, 0x12, 0xad, 0xdf, 0x5c, 0xfd, 0x79, 0x2b, 0x51, 0x70, 0xb6, 0x85, 0xf5, 0xfe, - 0x57, 0x05, 0x58, 0x51, 0xbc, 0xff, 0xbf, 0xb6, 0xa1, 0x38, 0x4e, 0xd5, 0x92, 0x71, 0xfa, 0x7f, - 0xba, 0xf2, 0x7c, 0x04, 0xcb, 0x32, 0x62, 0xd3, 0x70, 0x66, 0x09, 0x8e, 0x29, 0x12, 0xd0, 0x4e, - 0xb6, 0x7d, 0xd4, 0x0d, 0x2b, 0x42, 0xcd, 0x58, 0x7e, 0x73, 0xae, 0x6a, 0xb7, 0x07, 0x5d, 0x39, - 0x42, 0x3b, 0x67, 0x3c, 0x4c, 0x0f, 0xa7, 0x47, 0x22, 0x64, 0x31, 0x88, 0x42, 0x32, 0x03, 0x4d, - 0xa2, 0x34, 0x28, 0xbe, 0x0d, 0x6d, 0x73, 0xf9, 0x90, 0xd3, 0x91, 0xf3, 0x67, 0xa2, 0x29, 0x61, - 0xe6, 0x62, 0xdb, 0xb0, 0x48, 0x4a, 0x72, 0xa8, 0xbf, 0xab, 0xd0, 0x77, 0x6f, 0xf1, 0xd1, 0xec, - 0x5e, 0xf2, 0x72, 0xdf, 0xb0, 0xdf, 0x81, 0x45, 0x7b, 0x03, 0x28, 0xad, 0x92, 0xb2, 0x1d, 0x01, - 0x7e, 0x6e, 0x67, 0x66, 0x9b, 0xd0, 0xc9, 0xef, 0x20, 0x65, 0x34, 0xcf, 0x8c, 0x02, 0x0a, 0xd9, - 0xd9, 0xa7, 0xf2, 0xc0, 0xb2, 0x4e, 0xbe, 0x93, 0x1b, 0xf6, 0x67, 0xc6, 0x30, 0xdd, 0x15, 0x7f, - 0x8c, 0x23, 0xcc, 0xdf, 0x03, 0xc8, 0x30, 0xd6, 0x81, 0xf6, 0xb3, 0x83, 0x9d, 0xfd, 0xfe, 0xd6, - 0xee, 0xe6, 0xfe, 0xfe, 0xce, 0x5e, 0xe7, 0x12, 0x63, 0xb0, 0x48, 0xae, 0xbe, 0x6d, 0x8d, 0x39, - 0x88, 0x49, 0xe7, 0x8a, 0xc2, 0x2a, 0x6c, 0x15, 0x3a, 0x4f, 0xf6, 0x73, 0x68, 0xf5, 0x61, 0x53, - 0xcb, 0x87, 0xbb, 0x06, 0xab, 0x22, 0x22, 0xf7, 0xa1, 0x60, 0x0f, 0x65, 0x9d, 0xfc, 0x63, 0x07, - 0x2e, 0xe7, 0x08, 0x59, 0xc8, 0x97, 0x30, 0x40, 0x6c, 0xab, 0xc4, 0x06, 0xe9, 0x00, 0x42, 0xd9, - 0x9a, 0x39, 0x0d, 0x52, 0x24, 0x20, 0xcf, 0x1b, 0xb6, 0x69, 0x4e, 0x92, 0xca, 0x48, 0xee, 0xba, - 0x8e, 0xac, 0xc9, 0x35, 0xfc, 0x58, 0x44, 0xfa, 0x9a, 0x84, 0xec, 0x00, 0xd8, 0x6e, 0xb2, 0x4a, - 0xe2, 0xb6, 0xc2, 0x32, 0x76, 0xec, 0xf6, 0x96, 0xd2, 0xdc, 0x7f, 0x5b, 0x05, 0xf6, 0xbd, 0x29, - 0x8f, 0xcf, 0x29, 0xa6, 0x4b, 0x7b, 0x4e, 0xd7, 0xf3, 0x7e, 0xc1, 0xb9, 0xc9, 0xf4, 0xe8, 0x73, - 0x7e, 0xae, 0x82, 0x25, 0x2b, 0xef, 0x14, 0x2c, 0x59, 0x16, 0xac, 0x58, 0xbb, 0x38, 0x58, 0xb1, - 0x7e, 0x51, 0xb0, 0xe2, 0xd7, 0x60, 0x21, 0x38, 0x09, 0x23, 0x54, 0x07, 0x68, 0x42, 0x24, 0xdd, - 0xb9, 0xeb, 0x55, 0xdc, 0x7a, 0x4b, 0x70, 0x1f, 0x31, 0xf6, 0x20, 0xcb, 0xc4, 0x87, 0x27, 0x14, - 0x5c, 0x6b, 0x2a, 0x88, 0x9d, 0xe1, 0x09, 0xdf, 0x8b, 0x06, 0x7e, 0x1a, 0xc5, 0xb4, 0x4f, 0x53, - 0x1f, 0x23, 0x9e, 0xb0, 0x1b, 0xb0, 0x98, 0x44, 0x53, 0x34, 0xaa, 0xd4, 0x30, 0x08, 0x47, 0x53, - 0x5b, 0xa0, 0x07, 0x62, 0x30, 0xee, 0xc2, 0xca, 0x34, 0xe1, 0xfd, 0x71, 0x90, 0x24, 0xb8, 0x70, - 0x0e, 0xa2, 0x30, 0x8d, 0xa3, 0x91, 0x74, 0x37, 0x2d, 0x4f, 0x13, 0xfe, 0x54, 0x50, 0xb6, 0x04, - 0x81, 0x7d, 0x3b, 0x6b, 0xd2, 0xc4, 0x0f, 0xe2, 0xa4, 0x0b, 0xd4, 0x24, 0xd5, 0x53, 0x6c, 0xf7, - 0x81, 0x1f, 0xc4, 0xba, 0x2d, 0x98, 0x48, 0x72, 0x41, 0x94, 0xad, 0x5c, 0x10, 0xa5, 0x8c, 0xbf, - 0xbb, 0x0b, 0x0d, 0xf5, 0x39, 0xee, 0x81, 0x8f, 0xe3, 0x68, 0xac, 0xf6, 0xc0, 0xf8, 0x9b, 0x2d, - 0x42, 0x25, 0x8d, 0xe4, 0xfe, 0xb5, 0x92, 0x46, 0xee, 0xef, 0x43, 0xcb, 0x18, 0x01, 0xf6, 0xa1, - 0xd8, 0x8e, 0xa3, 0xad, 0x25, 0x37, 0xcf, 0xe2, 0x14, 0xa5, 0x29, 0xd1, 0x27, 0x43, 0xf6, 0x0d, - 0x58, 0x1e, 0x06, 0x31, 0xa7, 0x38, 0xdf, 0x7e, 0xcc, 0xcf, 0x78, 0x9c, 0x28, 0x57, 0x43, 0x47, - 0x13, 0x3c, 0x81, 0xbb, 0x7d, 0x58, 0xb1, 0xb8, 0x4a, 0x0b, 0xdd, 0x1c, 0x05, 0x0d, 0x2a, 0x6f, - 0xa7, 0x1d, 0x50, 0x28, 0x69, 0xb8, 0x5c, 0x49, 0x2f, 0x49, 0x7f, 0x12, 0x47, 0x47, 0x54, 0x89, - 0xe3, 0x59, 0x98, 0xfb, 0xcb, 0x0a, 0x54, 0x77, 0xa3, 0x89, 0x79, 0xf6, 0xe3, 0x14, 0xcf, 0x7e, - 0xa4, 0x5d, 0xd9, 0xd7, 0x66, 0xa3, 0x5c, 0xfc, 0x2d, 0x90, 0xdd, 0x81, 0x45, 0xe4, 0xe0, 0x34, - 0x42, 0x3b, 0xfa, 0xb5, 0x1f, 0x8b, 0x08, 0xc3, 0x2a, 0xb1, 0x45, 0x8e, 0xc2, 0x56, 0xa1, 0xaa, - 0xcd, 0x21, 0xca, 0x80, 0x49, 0xdc, 0xc4, 0xd1, 0xf9, 0xfa, 0xb9, 0x74, 0x69, 0xca, 0x14, 0x2a, - 0x04, 0xfb, 0x7b, 0x21, 0x26, 0x62, 0x51, 0x2b, 0x23, 0xa1, 0x8d, 0x8b, 0x82, 0x30, 0xce, 0x4c, - 0x46, 0x9d, 0x36, 0x9d, 0xf5, 0x0d, 0xdb, 0x59, 0x7f, 0x1d, 0x5a, 0xe9, 0xe8, 0xac, 0x3f, 0xf1, - 0xcf, 0x47, 0x91, 0x3f, 0x94, 0x0c, 0x68, 0x42, 0xec, 0x3e, 0xc0, 0x78, 0x32, 0xe9, 0xe3, 0x3a, - 0x1a, 0x0f, 0x69, 0x67, 0xde, 0xda, 0xe8, 0xc8, 0xd1, 0x7f, 0x7a, 0x70, 0xe0, 0x11, 0xee, 0x19, - 0x79, 0xdc, 0x97, 0xd0, 0xd4, 0x04, 0x33, 0x34, 0x95, 0x22, 0x2c, 0x5a, 0x76, 0x68, 0x2a, 0x05, - 0x54, 0xdc, 0x84, 0x45, 0xa1, 0x3c, 0xb5, 0x3a, 0x10, 0xa7, 0xe2, 0x39, 0xd4, 0xfd, 0x33, 0x07, - 0xea, 0x34, 0xe1, 0x68, 0x4d, 0x08, 0x9a, 0x3e, 0xab, 0xa2, 0x49, 0x5c, 0xf0, 0xf2, 0x30, 0x73, - 0xad, 0x30, 0xf9, 0x8a, 0x1e, 0x7d, 0x33, 0x54, 0xfe, 0x3a, 0x34, 0x75, 0x4d, 0xc6, 0x0c, 0x66, - 0x20, 0xbb, 0x06, 0xb5, 0xd3, 0x68, 0xa2, 0x36, 0x5c, 0xa0, 0x8e, 0xb3, 0xa3, 0x89, 0x47, 0x78, - 0xd6, 0x1e, 0x2c, 0x4f, 0x74, 0x41, 0x18, 0xb5, 0x79, 0xb8, 0xa4, 0xaf, 0x73, 0xa5, 0x7d, 0x7d, - 0x01, 0x4b, 0x28, 0x96, 0x86, 0xef, 0x7e, 0xb6, 0x6a, 0xfd, 0x3a, 0xae, 0xd4, 0x83, 0xd1, 0x74, - 0xc8, 0xcd, 0x6d, 0x2f, 0xf9, 0x66, 0x25, 0xae, 0x0c, 0x3e, 0xf7, 0x5f, 0x38, 0x42, 0xdc, 0xb1, - 0x5c, 0x76, 0x1b, 0x6a, 0xa8, 0x05, 0x73, 0x5e, 0x0e, 0x1d, 0xf5, 0x82, 0xf9, 0x3c, 0xca, 0x81, - 0xb3, 0x48, 0xde, 0x53, 0xb3, 0x74, 0xe1, 0x3b, 0xcd, 0xf6, 0x8c, 0xba, 0x67, 0xb9, 0xad, 0x56, - 0x0e, 0x65, 0x77, 0x8d, 0xa3, 0xa7, 0x9a, 0xa5, 0x59, 0x95, 0x61, 0x30, 0x3c, 0xe1, 0xc6, 0x91, - 0xd3, 0x1f, 0x3b, 0xb0, 0x60, 0xb5, 0x09, 0x99, 0x96, 0x82, 0xc8, 0x85, 0xd3, 0x44, 0xce, 0xbc, - 0x09, 0x99, 0x0c, 0x5f, 0xb1, 0x19, 0x5e, 0x1f, 0x61, 0x54, 0xcd, 0x23, 0x8c, 0xfb, 0xd0, 0xcc, - 0xee, 0x49, 0xd8, 0x8d, 0xc2, 0x1a, 0x55, 0xfc, 0x4f, 0x96, 0x29, 0x73, 0x92, 0xd7, 0x0d, 0x27, - 0xb9, 0xfb, 0x00, 0x5a, 0x46, 0x7e, 0xd3, 0xc9, 0xed, 0x58, 0x4e, 0x6e, 0x1d, 0x1c, 0x57, 0xc9, - 0x82, 0xe3, 0xdc, 0x9f, 0x57, 0x60, 0x01, 0xd9, 0x3b, 0x08, 0x4f, 0x0e, 0xa2, 0x51, 0x30, 0x38, - 0x27, 0xb6, 0x52, 0x9c, 0x2c, 0x57, 0x41, 0xc5, 0xe6, 0x36, 0x8c, 0xd2, 0xaf, 0x23, 0x82, 0x85, - 0xaa, 0xd2, 0x69, 0xd4, 0x65, 0xa8, 0x09, 0x8e, 0xfc, 0x84, 0x1b, 0x17, 0x27, 0x3c, 0x1b, 0x44, - 0x8d, 0x83, 0x00, 0x85, 0x3a, 0x8e, 0x83, 0xd1, 0x28, 0x10, 0x79, 0xc5, 0xf6, 0xad, 0x8c, 0x84, - 0x75, 0x0e, 0x83, 0xc4, 0x3f, 0xca, 0x8e, 0x27, 0x75, 0x9a, 0x7c, 0x7f, 0xfe, 0x1b, 0xc3, 0xf7, - 0x27, 0x62, 0xa3, 0x6d, 0x30, 0x3f, 0x91, 0xf3, 0x85, 0x89, 0x74, 0xff, 0x4d, 0x05, 0x5a, 0x06, - 0x5b, 0xa0, 0x38, 0x97, 0x2e, 0x37, 0x06, 0x2a, 0xcf, 0xed, 0x43, 0xcb, 0x21, 0x60, 0x20, 0xec, - 0x86, 0x5d, 0x2b, 0x9d, 0x03, 0x90, 0xc0, 0x5b, 0x2c, 0x74, 0x15, 0x9a, 0xc8, 0xfa, 0x1f, 0x93, - 0xf7, 0x41, 0x5e, 0x52, 0xd2, 0x80, 0xa2, 0x6e, 0x10, 0xb5, 0x9e, 0x51, 0x09, 0x78, 0xeb, 0x49, - 0xfe, 0xa7, 0xd0, 0x96, 0xc5, 0xd0, 0x1c, 0x53, 0xa7, 0x33, 0xe1, 0xb3, 0xe6, 0xdf, 0xb3, 0x72, - 0xaa, 0x2f, 0x37, 0xd4, 0x97, 0x8d, 0x8b, 0xbe, 0x54, 0x39, 0xdd, 0xc7, 0x3a, 0x48, 0xe2, 0x71, - 0xec, 0x4f, 0x4e, 0x95, 0x42, 0xb9, 0x0f, 0x2b, 0x4a, 0x6f, 0x4c, 0x43, 0x3f, 0x0c, 0xa3, 0x69, - 0x38, 0xe0, 0x2a, 0x8e, 0xae, 0x8c, 0xe4, 0x0e, 0x75, 0xd4, 0x35, 0x15, 0xc4, 0xee, 0x40, 0x5d, - 0xd8, 0x51, 0x62, 0x55, 0x2e, 0x57, 0x21, 0x22, 0x0b, 0xbb, 0x0d, 0x75, 0x61, 0x4e, 0x55, 0x66, - 0x0a, 0xbd, 0xc8, 0xe0, 0xde, 0x85, 0x25, 0x0a, 0xf3, 0x36, 0x74, 0xdf, 0x7b, 0x65, 0xab, 0xf5, - 0xdc, 0x40, 0x04, 0x83, 0xaf, 0x02, 0xdb, 0x17, 0x72, 0x65, 0x1e, 0x75, 0xfe, 0x59, 0x15, 0x5a, - 0x06, 0x8c, 0xfa, 0x89, 0xce, 0xa7, 0xfa, 0xc3, 0xc0, 0x1f, 0xf3, 0x94, 0xc7, 0x52, 0x96, 0x72, - 0x28, 0xe6, 0xf3, 0xcf, 0x4e, 0xfa, 0xd1, 0x34, 0xed, 0x0f, 0xf9, 0x49, 0xcc, 0xb9, 0x34, 0x23, - 0x72, 0x28, 0xe6, 0x43, 0x6e, 0x36, 0xf2, 0x89, 0x13, 0xa5, 0x1c, 0xaa, 0x0e, 0x2e, 0xc5, 0x38, - 0xd5, 0xb2, 0x83, 0x4b, 0x31, 0x2a, 0x79, 0xcd, 0x5a, 0x2f, 0xd1, 0xac, 0x9f, 0xc0, 0x9a, 0xd0, - 0xa1, 0x52, 0x7b, 0xf4, 0x73, 0xcc, 0x35, 0x83, 0xca, 0xee, 0x40, 0x07, 0xdb, 0xac, 0x44, 0x23, - 0x09, 0x7e, 0x26, 0x64, 0xcc, 0xf1, 0x0a, 0x38, 0xe6, 0x25, 0x4f, 0xba, 0x99, 0x57, 0x44, 0x8f, - 0x14, 0x70, 0xca, 0xeb, 0xbf, 0xb1, 0xf3, 0x36, 0x65, 0xde, 0x1c, 0xce, 0x3e, 0x85, 0xf5, 0x31, - 0x1f, 0x06, 0xbe, 0x5d, 0x44, 0x3f, 0x5b, 0xe4, 0x67, 0x91, 0xb1, 0x16, 0x1c, 0x85, 0x9f, 0x45, - 0xe3, 0xa3, 0x40, 0x2c, 0x6c, 0xc2, 0xe7, 0x5f, 0xf3, 0x0a, 0xb8, 0xbb, 0x00, 0xad, 0xc3, 0x34, - 0x9a, 0xa8, 0xa9, 0x5f, 0x84, 0xb6, 0x48, 0xca, 0xc8, 0xc9, 0xf7, 0xe0, 0x0a, 0xf1, 0xeb, 0xf3, - 0x68, 0x12, 0x8d, 0xa2, 0x93, 0x73, 0x6b, 0xe7, 0xfe, 0x1f, 0x1c, 0x58, 0xb1, 0xa8, 0xd9, 0xd6, - 0x9d, 0xdc, 0x8c, 0x2a, 0xdc, 0x4d, 0xb0, 0xf8, 0xb2, 0xb1, 0x2c, 0x88, 0x8c, 0xe2, 0x54, 0xe7, - 0x85, 0x8c, 0x80, 0xdb, 0xcc, 0xee, 0x70, 0xa8, 0x0f, 0x05, 0xbf, 0x77, 0x8b, 0xfc, 0x2e, 0xbf, - 0x57, 0xb7, 0x3b, 0x54, 0x11, 0xbf, 0x23, 0x63, 0x7d, 0x86, 0xb2, 0xd3, 0x55, 0x3b, 0x3e, 0xc3, - 0xf4, 0xf4, 0xa8, 0x16, 0x0c, 0x34, 0x98, 0xb8, 0xbf, 0x70, 0x00, 0xb2, 0xd6, 0x51, 0x84, 0x88, - 0x5e, 0xda, 0xc4, 0xbd, 0x64, 0x63, 0x19, 0xfb, 0x10, 0xda, 0xfa, 0x90, 0x3f, 0x5b, 0x2d, 0x5b, - 0x0a, 0x43, 0xeb, 0xe2, 0x16, 0x2c, 0x9d, 0x8c, 0xa2, 0x23, 0xb2, 0x62, 0x28, 0x14, 0x37, 0x91, - 0xf1, 0xa3, 0x8b, 0x02, 0x7e, 0x24, 0xd1, 0x6c, 0x69, 0xad, 0x99, 0x4b, 0x6b, 0xf9, 0x42, 0xf9, - 0xf3, 0x8a, 0x3e, 0x69, 0xcd, 0x46, 0xe2, 0xad, 0x52, 0xce, 0x36, 0x0a, 0x6a, 0x7d, 0xc6, 0xe1, - 0x26, 0x6d, 0x3d, 0x0e, 0x2e, 0x74, 0xfc, 0x3e, 0x80, 0xc5, 0x58, 0xe8, 0x4c, 0xa5, 0x50, 0x6b, - 0x6f, 0x51, 0xa8, 0x0b, 0xb1, 0xb5, 0x32, 0x7f, 0x1d, 0x3a, 0xfe, 0xf0, 0x8c, 0xc7, 0x69, 0x40, - 0x8e, 0x30, 0x32, 0xa3, 0x44, 0x07, 0x97, 0x0c, 0x9c, 0xac, 0x95, 0x5b, 0xb0, 0x24, 0xa3, 0x79, - 0x75, 0x4e, 0x79, 0x43, 0x2f, 0x83, 0x31, 0xa3, 0xfb, 0x4f, 0xd5, 0xc1, 0xae, 0x3d, 0xbb, 0x6f, - 0x1f, 0x15, 0xb3, 0x87, 0x95, 0x5c, 0x0f, 0xbf, 0x26, 0x0f, 0x5a, 0x87, 0xca, 0xe3, 0x56, 0x35, - 0xa2, 0xc6, 0x86, 0xf2, 0x60, 0xdc, 0x1e, 0xd6, 0xda, 0xbb, 0x0c, 0xab, 0xfb, 0x9f, 0x1d, 0x98, - 0xdf, 0x8d, 0x26, 0xbb, 0x38, 0xc4, 0x68, 0xe3, 0xa0, 0x98, 0xe8, 0x50, 0x7a, 0x95, 0xbc, 0x20, - 0xba, 0xae, 0xd4, 0x2a, 0x59, 0xc8, 0x5b, 0x25, 0x7f, 0x11, 0xde, 0x23, 0x9f, 0x6f, 0x1c, 0x4d, - 0xa2, 0x18, 0xc5, 0xd5, 0x1f, 0x09, 0x13, 0x24, 0x0a, 0xd3, 0x53, 0xa5, 0x4e, 0xdf, 0x96, 0x85, - 0x1c, 0x31, 0xb8, 0x09, 0x16, 0x1b, 0x2b, 0x69, 0x45, 0x09, 0x2d, 0x5b, 0x24, 0xb8, 0xbf, 0x0d, - 0x4d, 0xda, 0x61, 0x50, 0xd7, 0x3e, 0x82, 0xe6, 0x69, 0x34, 0xe9, 0x9f, 0x06, 0x61, 0xaa, 0xc4, - 0x7f, 0x31, 0x33, 0xfd, 0x77, 0x69, 0x50, 0x74, 0x06, 0xf7, 0x97, 0x73, 0x30, 0xff, 0x24, 0x3c, - 0x8b, 0x82, 0x01, 0x1d, 0x26, 0x8f, 0xf9, 0x38, 0x52, 0x97, 0x0b, 0xf0, 0x37, 0x0e, 0x07, 0x45, - 0xd2, 0x4e, 0x04, 0xf3, 0xb6, 0x45, 0xd0, 0x88, 0x84, 0xe8, 0x1a, 0x6e, 0x76, 0x39, 0x50, 0x08, - 0x98, 0x81, 0xe0, 0x46, 0x31, 0x36, 0x2f, 0xf7, 0xc9, 0x54, 0x76, 0x79, 0xa3, 0x6e, 0x5c, 0xde, - 0xc0, 0xd2, 0xc4, 0xa5, 0x33, 0x1a, 0x59, 0x11, 0x32, 0x6a, 0x20, 0xd8, 0x16, 0x19, 0x13, 0x28, - 0x82, 0xc6, 0x44, 0x5b, 0x24, 0x44, 0x9b, 0xdf, 0x98, 0x0b, 0x9f, 0xbe, 0x36, 0xcc, 0x70, 0xf3, - 0x6b, 0x82, 0x68, 0xbc, 0x89, 0x0f, 0x44, 0x1e, 0xb1, 0x58, 0x98, 0x10, 0x9a, 0xaf, 0xf9, 0xbb, - 0xa9, 0xe2, 0x7e, 0x71, 0x1e, 0x46, 0x5d, 0x3f, 0xe4, 0x5a, 0x25, 0x8b, 0x7e, 0x82, 0xb8, 0x20, - 0x99, 0xc7, 0x8d, 0x2d, 0xb3, 0x08, 0x8a, 0x56, 0x5b, 0x66, 0x64, 0x28, 0x7f, 0x34, 0x3a, 0xf2, - 0x07, 0xaf, 0xc4, 0x56, 0xb3, 0x2d, 0x8e, 0x82, 0x2c, 0x90, 0x22, 0xfb, 0xb2, 0x59, 0xa7, 0xf0, - 0x9b, 0x9a, 0x67, 0x42, 0x6c, 0x03, 0x5a, 0xe4, 0x4e, 0x90, 0xf3, 0xbe, 0x48, 0xf3, 0xde, 0x31, - 0xfd, 0x0d, 0x34, 0xf3, 0x66, 0x26, 0xf3, 0x10, 0x7c, 0xa9, 0x10, 0xa6, 0xec, 0x0f, 0x87, 0x32, - 0x7e, 0xa0, 0x23, 0x2e, 0x08, 0x6a, 0x80, 0x1c, 0x16, 0x62, 0xc0, 0x44, 0x86, 0x65, 0xca, 0x60, - 0x61, 0xec, 0x9a, 0x70, 0x93, 0x4d, 0xfc, 0x60, 0x48, 0x11, 0x37, 0x62, 0x73, 0xaa, 0x31, 0x2c, - 0x43, 0xfd, 0xa6, 0x65, 0x75, 0x85, 0x46, 0xc5, 0xc2, 0x70, 0x6c, 0x74, 0x7a, 0x9c, 0xc5, 0x35, - 0xdb, 0x20, 0xfb, 0x98, 0x4e, 0x70, 0x53, 0x4e, 0xc1, 0xcb, 0x8b, 0x1b, 0xef, 0xc9, 0x3e, 0x4b, - 0xa6, 0x56, 0x7f, 0x0f, 0x31, 0x8b, 0x27, 0x72, 0xa2, 0x51, 0x27, 0x9c, 0xe8, 0x6b, 0x96, 0x51, - 0x27, 0xb3, 0x92, 0x13, 0x5d, 0x64, 0x70, 0x37, 0xa1, 0x6d, 0x16, 0xc0, 0x1a, 0x50, 0x7b, 0x76, - 0xb0, 0xb3, 0xdf, 0xb9, 0xc4, 0x5a, 0x30, 0x7f, 0xb8, 0xf3, 0xfc, 0xf9, 0xde, 0xce, 0x76, 0xc7, - 0x61, 0x6d, 0x68, 0xe8, 0x80, 0xcd, 0x0a, 0xa6, 0x36, 0xb7, 0xb6, 0x76, 0x0e, 0x9e, 0xef, 0x6c, - 0x77, 0xaa, 0xee, 0x1f, 0x55, 0xa0, 0x65, 0x94, 0x7c, 0x81, 0x0b, 0xe7, 0x1a, 0x00, 0xed, 0x34, - 0xb2, 0xd0, 0x8d, 0x9a, 0x67, 0x20, 0xa8, 0x39, 0xf5, 0x1e, 0xbc, 0x2a, 0xee, 0x49, 0xaa, 0x34, - 0x8d, 0x17, 0x5d, 0x48, 0x34, 0xcf, 0x2a, 0xea, 0x9e, 0x0d, 0x22, 0x2f, 0x49, 0x80, 0xe2, 0x07, - 0x85, 0x04, 0x9a, 0x10, 0xce, 0x4d, 0xcc, 0x93, 0x68, 0x74, 0xc6, 0x45, 0x16, 0x61, 0xaf, 0x59, - 0x18, 0xd6, 0x25, 0x55, 0x90, 0x11, 0xdb, 0x5b, 0xf7, 0x6c, 0x90, 0x7d, 0x53, 0xcd, 0x4d, 0x83, - 0xe6, 0x66, 0xbd, 0x38, 0xd0, 0xe6, 0xbc, 0xb8, 0x29, 0xb0, 0xcd, 0xe1, 0x50, 0x52, 0xcd, 0x5b, - 0x97, 0xb1, 0x79, 0xcd, 0x57, 0x29, 0x91, 0x12, 0x41, 0xad, 0x94, 0x0b, 0xea, 0x5b, 0xd9, 0xd9, - 0x7d, 0x02, 0xad, 0x03, 0xe3, 0xe2, 0xb0, 0x8b, 0x3a, 0x4d, 0x5d, 0x19, 0x16, 0xba, 0x50, 0xf8, - 0x5e, 0x32, 0xd4, 0x68, 0x52, 0xc5, 0x6c, 0x92, 0xfb, 0x4f, 0x1c, 0x71, 0x17, 0x4b, 0x77, 0x41, - 0xd4, 0xef, 0x42, 0x5b, 0x7b, 0xa3, 0xb3, 0xf0, 0x75, 0x0b, 0xc3, 0x3c, 0xd4, 0x9c, 0x7e, 0x74, - 0x7c, 0x9c, 0x70, 0x15, 0x68, 0x6a, 0x61, 0xca, 0xb8, 0x44, 0x73, 0x35, 0x10, 0x35, 0x24, 0x32, - 0xe0, 0xb4, 0x80, 0x23, 0xa3, 0x48, 0xaf, 0xa5, 0x0a, 0xb1, 0xd5, 0x69, 0x1d, 0x65, 0x9f, 0x1f, - 0xe9, 0x3b, 0xd0, 0xd0, 0xe5, 0xda, 0x2b, 0x87, 0xca, 0xa9, 0xe9, 0xb8, 0x42, 0xd1, 0xc6, 0xd3, - 0x6a, 0xb4, 0xe0, 0xd7, 0x22, 0x81, 0xdd, 0x05, 0x76, 0x1c, 0xc4, 0xf9, 0xec, 0x82, 0x81, 0x4b, - 0x28, 0xee, 0x4b, 0x58, 0x51, 0x72, 0x67, 0x58, 0xbd, 0xf6, 0x44, 0x3a, 0x17, 0xe9, 0xa5, 0x4a, - 0x51, 0x2f, 0xb9, 0xbf, 0xac, 0xc2, 0xbc, 0x9c, 0xed, 0xc2, 0x05, 0x74, 0xb1, 0xee, 0x59, 0x18, - 0xeb, 0x5a, 0xd7, 0x0c, 0x89, 0x11, 0xe4, 0x6a, 0x55, 0x58, 0x6f, 0xaa, 0x65, 0xeb, 0x0d, 0x83, - 0xda, 0xc4, 0x4f, 0x4f, 0xc9, 0x3d, 0xd3, 0xf4, 0xe8, 0xb7, 0x72, 0xaa, 0xd6, 0x6d, 0xa7, 0x6a, - 0xd9, 0x75, 0x7b, 0x61, 0x72, 0x15, 0xaf, 0xdb, 0x5f, 0x85, 0xa6, 0x58, 0x17, 0x33, 0xbf, 0x69, - 0x06, 0xe4, 0xd6, 0xd1, 0x46, 0x61, 0x1d, 0x7d, 0xf7, 0x15, 0xee, 0xdb, 0x30, 0x27, 0xae, 0x9c, - 0xc8, 0x40, 0xe2, 0xab, 0xea, 0xb8, 0x51, 0xe4, 0x53, 0x7f, 0x45, 0x34, 0x92, 0x27, 0xf3, 0x9a, - 0x97, 0x56, 0x5b, 0xf6, 0xa5, 0x55, 0xd3, 0xdd, 0xdb, 0xb6, 0xdd, 0xbd, 0xee, 0x23, 0x58, 0xb0, - 0x8a, 0x43, 0x0d, 0x2b, 0x03, 0x91, 0x3b, 0x97, 0xd8, 0x02, 0x34, 0x9f, 0xec, 0xf7, 0x1f, 0xed, - 0x3d, 0x79, 0xbc, 0xfb, 0xbc, 0xe3, 0x60, 0xf2, 0xf0, 0xc5, 0xd6, 0xd6, 0xce, 0xce, 0x36, 0x69, - 0x5c, 0x80, 0xb9, 0x47, 0x9b, 0x4f, 0xf6, 0x48, 0xdf, 0x6e, 0x0b, 0xde, 0x96, 0x65, 0xe9, 0x23, - 0x9e, 0x6f, 0x02, 0x53, 0xbe, 0x01, 0x0a, 0x46, 0x9a, 0x8c, 0x78, 0xaa, 0x62, 0xe4, 0x97, 0x25, - 0xe5, 0x89, 0x26, 0xa8, 0x6b, 0x1e, 0x59, 0x29, 0x99, 0x88, 0xc8, 0x41, 0xca, 0x8b, 0x88, 0xcc, - 0xea, 0x69, 0xba, 0xdb, 0x83, 0xee, 0x36, 0xc7, 0xd2, 0x36, 0x47, 0xa3, 0x5c, 0x73, 0x70, 0x73, - 0x57, 0x42, 0x93, 0x3b, 0xbf, 0xef, 0xc1, 0xe5, 0x4d, 0x11, 0x0e, 0xff, 0x9b, 0x8a, 0x96, 0x74, - 0xbb, 0xb0, 0x96, 0x2f, 0x52, 0x56, 0xf6, 0x08, 0x96, 0xb7, 0xf9, 0xd1, 0xf4, 0x64, 0x8f, 0x9f, - 0x65, 0x15, 0x31, 0xa8, 0x25, 0xa7, 0xd1, 0x6b, 0x39, 0x3e, 0xf4, 0x9b, 0xbd, 0x0f, 0x30, 0xc2, - 0x3c, 0xfd, 0x64, 0xc2, 0x07, 0xea, 0xaa, 0x23, 0x21, 0x87, 0x13, 0x3e, 0x70, 0x3f, 0x01, 0x66, - 0x96, 0x23, 0xc7, 0x0b, 0xed, 0xad, 0xe9, 0x51, 0x3f, 0x39, 0x4f, 0x52, 0x3e, 0x56, 0x77, 0x38, - 0x4d, 0xc8, 0xbd, 0x05, 0xed, 0x03, 0xff, 0xdc, 0xe3, 0x3f, 0x95, 0x8f, 0x30, 0xac, 0xc3, 0xfc, - 0xc4, 0x3f, 0x47, 0x16, 0xd4, 0x0e, 0x63, 0x22, 0xbb, 0xff, 0xbb, 0x02, 0x73, 0x22, 0x27, 0x96, - 0x3a, 0xe4, 0x49, 0x1a, 0x84, 0x24, 0x69, 0xaa, 0x54, 0x03, 0x2a, 0xc8, 0x76, 0xa5, 0x44, 0xb6, - 0xa5, 0x17, 0x43, 0x5d, 0x19, 0x93, 0x02, 0x6c, 0x61, 0x28, 0x69, 0x59, 0xd8, 0xb3, 0x70, 0x2b, - 0x66, 0x40, 0xee, 0x20, 0x24, 0xb3, 0xea, 0x44, 0xfb, 0x94, 0xda, 0x92, 0x62, 0x6c, 0x42, 0xa5, - 0xb6, 0xe3, 0xbc, 0x90, 0xf6, 0x82, 0xed, 0x58, 0xb0, 0x11, 0x1b, 0xef, 0x60, 0x23, 0x0a, 0xd7, - 0xc6, 0xdb, 0x6c, 0x44, 0x78, 0x07, 0x1b, 0xd1, 0x65, 0xd0, 0xa1, 0xfb, 0xe8, 0xb8, 0x4b, 0x51, - 0xbc, 0xfb, 0x0f, 0x1c, 0xe8, 0x48, 0x2e, 0xd2, 0x34, 0x75, 0xa4, 0xf6, 0xb6, 0x8b, 0x4b, 0x37, - 0x60, 0x81, 0xf6, 0x48, 0x5a, 0x05, 0xc8, 0xe3, 0x29, 0x0b, 0xc4, 0x7e, 0xa8, 0x80, 0x99, 0x71, - 0x30, 0x92, 0x93, 0x62, 0x42, 0x4a, 0x8b, 0xc4, 0xbe, 0x0c, 0xdf, 0x75, 0x3c, 0x9d, 0x76, 0xff, - 0xd4, 0x81, 0x65, 0xa3, 0xc1, 0x92, 0x0b, 0x1f, 0x40, 0x5b, 0x3f, 0xfb, 0xc0, 0xf5, 0xe2, 0xb6, - 0x6e, 0x8b, 0x4d, 0xf6, 0x99, 0x95, 0x99, 0x26, 0xd3, 0x3f, 0xa7, 0x06, 0x26, 0xd3, 0xb1, 0x5c, - 0x55, 0x4c, 0x08, 0x19, 0xe9, 0x35, 0xe7, 0xaf, 0x74, 0x16, 0xb1, 0xae, 0x59, 0x18, 0xf9, 0x96, - 0x71, 0x6f, 0xa7, 0x33, 0xd5, 0xa4, 0x6f, 0xd9, 0x04, 0xdd, 0xbf, 0x5a, 0x81, 0x15, 0xb1, 0x59, - 0x97, 0x4e, 0x12, 0x7d, 0xf3, 0x76, 0x4e, 0xf8, 0x2d, 0x84, 0x44, 0xee, 0x5e, 0xf2, 0x64, 0x9a, - 0x7d, 0xe7, 0x1d, 0x1d, 0x0c, 0x3a, 0xa6, 0x78, 0xc6, 0x5c, 0x54, 0xcb, 0xe6, 0xe2, 0x2d, 0x23, - 0x5d, 0xe6, 0xe6, 0xaf, 0x97, 0xbb, 0xf9, 0xdf, 0xc9, 0xad, 0xfe, 0x70, 0x1e, 0xea, 0xc9, 0x20, - 0x9a, 0x70, 0x77, 0x0d, 0x56, 0xed, 0x21, 0x90, 0x8a, 0xea, 0x17, 0x0e, 0x74, 0x1f, 0x89, 0xc3, - 0xc3, 0x20, 0x3c, 0xd9, 0x0d, 0x92, 0x34, 0x8a, 0xf5, 0x33, 0x06, 0xd7, 0x00, 0x92, 0xd4, 0x8f, - 0xa5, 0x51, 0x2b, 0x4c, 0x03, 0x03, 0xc1, 0x9e, 0xf0, 0x70, 0x28, 0xa8, 0x62, 0x06, 0x75, 0xba, - 0x60, 0x7a, 0x49, 0x87, 0x83, 0x65, 0xc0, 0xdc, 0x14, 0x91, 0xf8, 0xd8, 0x64, 0x7e, 0x46, 0xda, - 0x5f, 0xec, 0xe2, 0x73, 0xa8, 0xfb, 0x07, 0x15, 0x58, 0xca, 0x1a, 0x49, 0xd1, 0x22, 0xb6, 0x0e, - 0x91, 0x56, 0x4b, 0xa6, 0x43, 0xe4, 0xe1, 0x40, 0x3f, 0x40, 0x33, 0xc6, 0xf0, 0x39, 0x18, 0x28, - 0xbb, 0x01, 0x2d, 0x95, 0x8a, 0xa6, 0xa9, 0x71, 0x9f, 0xd8, 0x84, 0x45, 0x6c, 0x2d, 0x1a, 0x52, - 0xd2, 0x28, 0x94, 0x29, 0xba, 0xdb, 0x34, 0x4e, 0xe9, 0x4b, 0x31, 0xf2, 0x2a, 0xc9, 0x3a, 0xc2, - 0x12, 0x11, 0x4f, 0xbb, 0x90, 0x15, 0x62, 0xae, 0xd0, 0x0d, 0xfd, 0x0e, 0x8b, 0x96, 0x4c, 0x51, - 0x62, 0x16, 0x18, 0x5d, 0xf3, 0x4c, 0x48, 0xed, 0xea, 0xa2, 0xa9, 0x71, 0x22, 0x5a, 0xf3, 0x2c, - 0xcc, 0xfd, 0xdb, 0x0e, 0x5c, 0x29, 0x99, 0x46, 0x29, 0xa9, 0xdb, 0xb0, 0x7c, 0xac, 0x89, 0x6a, - 0xa8, 0x85, 0xb8, 0xae, 0xa9, 0x08, 0x09, 0x7b, 0x78, 0xbd, 0xe2, 0x07, 0xda, 0x38, 0x15, 0x93, - 0x67, 0xc5, 0xc1, 0x17, 0x09, 0xee, 0x01, 0xf4, 0x76, 0xde, 0xa0, 0xe0, 0x6f, 0x99, 0xaf, 0xdf, - 0x29, 0xce, 0xda, 0x28, 0x28, 0xb6, 0x8b, 0x5d, 0x4d, 0xc7, 0xb0, 0x60, 0x95, 0xc5, 0xbe, 0xf5, - 0xae, 0x85, 0x98, 0x32, 0x7a, 0x5d, 0xce, 0xba, 0x78, 0xbe, 0x4f, 0x45, 0xe3, 0x1b, 0x90, 0x7b, - 0x06, 0x4b, 0x4f, 0xa7, 0xa3, 0x34, 0xc8, 0x9e, 0xf2, 0x63, 0xdf, 0x91, 0x1f, 0x51, 0x11, 0x6a, - 0xe8, 0x4a, 0xab, 0x32, 0xf3, 0xe1, 0x88, 0x8d, 0xb1, 0xa4, 0x7e, 0xb1, 0xc6, 0x22, 0xc1, 0xbd, - 0x02, 0xeb, 0x59, 0x95, 0x62, 0xec, 0xd4, 0xe2, 0xf0, 0x87, 0x8e, 0x08, 0x29, 0xb3, 0x5f, 0x16, - 0x64, 0x8f, 0x61, 0x25, 0x09, 0xc2, 0x93, 0x11, 0x37, 0xcb, 0x49, 0xe4, 0x48, 0x5c, 0xb6, 0x9b, - 0x27, 0x5f, 0x1f, 0xf4, 0xca, 0xbe, 0x40, 0x06, 0x29, 0x6f, 0x68, 0xc6, 0x20, 0xb9, 0x21, 0x29, - 0xeb, 0xc0, 0x77, 0x61, 0xd1, 0xae, 0x8c, 0x7d, 0x2a, 0x83, 0xe8, 0xb3, 0x96, 0x99, 0x67, 0x43, - 0x36, 0x67, 0x58, 0x39, 0xdd, 0x9f, 0x3b, 0xd0, 0xf5, 0x38, 0xb2, 0x31, 0x37, 0x2a, 0x95, 0xdc, - 0xf3, 0xa0, 0x50, 0xec, 0xec, 0x0e, 0xeb, 0xe0, 0x7c, 0xd5, 0xd7, 0xbb, 0x33, 0x27, 0x65, 0xf7, - 0x52, 0x49, 0xaf, 0x1e, 0x36, 0x60, 0x4e, 0xf6, 0x6f, 0x1d, 0x2e, 0xcb, 0x26, 0xa9, 0xe6, 0x64, - 0x87, 0x0a, 0x56, 0xa5, 0xd6, 0xa1, 0x42, 0x0f, 0xba, 0xe2, 0xb5, 0x0a, 0xb3, 0x1f, 0xf2, 0xc3, - 0x6d, 0x60, 0x4f, 0xfd, 0x81, 0x1f, 0x47, 0x51, 0x78, 0xc0, 0x63, 0x19, 0x03, 0x44, 0x06, 0x10, - 0xf9, 0xdc, 0x95, 0xad, 0x26, 0x52, 0xea, 0x81, 0x85, 0x28, 0x54, 0x0f, 0x59, 0x88, 0x94, 0xeb, - 0xc1, 0xca, 0x43, 0xff, 0x15, 0x57, 0x25, 0x65, 0xa3, 0xd4, 0x9a, 0xe8, 0x42, 0xd5, 0xd8, 0xab, - 0xfb, 0x31, 0xc5, 0x6a, 0x3d, 0x33, 0xb7, 0xbb, 0x01, 0xab, 0x76, 0x99, 0x52, 0x95, 0xf4, 0xa0, - 0x31, 0x96, 0x98, 0x6c, 0x9d, 0x4e, 0xdf, 0xf9, 0x12, 0x5a, 0xc6, 0x0b, 0x24, 0x6c, 0x1d, 0x56, - 0x5e, 0x3e, 0x79, 0xbe, 0xbf, 0x73, 0x78, 0xd8, 0x3f, 0x78, 0xf1, 0xf0, 0xf3, 0x9d, 0x1f, 0xf4, - 0x77, 0x37, 0x0f, 0x77, 0x3b, 0x97, 0xd8, 0x1a, 0xb0, 0xfd, 0x9d, 0xc3, 0xe7, 0x3b, 0xdb, 0x16, - 0xee, 0xb0, 0x6b, 0xd0, 0x7b, 0xb1, 0xff, 0xe2, 0x70, 0x67, 0xbb, 0x5f, 0xf6, 0x5d, 0x85, 0xbd, - 0x0f, 0x57, 0x24, 0xbd, 0xe4, 0xf3, 0xea, 0x9d, 0x07, 0xd0, 0xc9, 0xfb, 0x40, 0x2c, 0xaf, 0xd1, - 0xdb, 0xdc, 0x4b, 0x1b, 0x3f, 0xaf, 0xc2, 0xa2, 0x08, 0xf2, 0x13, 0x6f, 0x73, 0xf2, 0x98, 0x3d, - 0x85, 0x79, 0xf9, 0xc8, 0x2b, 0x53, 0xac, 0x65, 0x3f, 0x2b, 0xdb, 0x5b, 0xcb, 0xc3, 0x72, 0x5a, - 0x57, 0xfe, 0xda, 0x7f, 0xfa, 0x1f, 0x7f, 0xb7, 0xb2, 0xc0, 0x5a, 0xf7, 0xce, 0x3e, 0xbe, 0x77, - 0xc2, 0xc3, 0x04, 0xcb, 0xf8, 0x3d, 0x80, 0xec, 0xe9, 0x52, 0xd6, 0xd5, 0x3e, 0x80, 0xdc, 0xbb, - 0xae, 0xbd, 0x2b, 0x25, 0x14, 0x59, 0xee, 0x15, 0x2a, 0x77, 0xc5, 0x5d, 0xc4, 0x72, 0x83, 0x30, - 0x48, 0xc5, 0x33, 0xa6, 0x9f, 0x39, 0x77, 0xd8, 0x10, 0xda, 0xe6, 0xa3, 0xa2, 0x4c, 0x9d, 0x11, - 0x95, 0x3c, 0x8b, 0xda, 0x7b, 0xaf, 0x94, 0xa6, 0x78, 0x99, 0xea, 0xb8, 0xec, 0x76, 0xb0, 0x8e, - 0x29, 0xe5, 0xc8, 0x6a, 0x19, 0x09, 0x09, 0xcf, 0xde, 0x0e, 0x65, 0x57, 0x0d, 0xa1, 0x2b, 0xbc, - 0x5c, 0xda, 0x7b, 0x7f, 0x06, 0x55, 0xd6, 0xf5, 0x3e, 0xd5, 0xb5, 0xee, 0x32, 0xac, 0x6b, 0x40, - 0x79, 0xd4, 0xcb, 0xa5, 0x9f, 0x39, 0x77, 0x36, 0xfe, 0xfd, 0x2d, 0x68, 0xea, 0xf3, 0x63, 0xf6, - 0x13, 0x58, 0xb0, 0xa2, 0x30, 0x99, 0xea, 0x46, 0x59, 0xd0, 0x66, 0xef, 0x6a, 0x39, 0x51, 0x56, - 0x7c, 0x8d, 0x2a, 0xee, 0xb2, 0x35, 0xac, 0x58, 0x86, 0x31, 0xde, 0xa3, 0x78, 0x62, 0x71, 0x25, - 0xf1, 0x95, 0xa1, 0xc9, 0x44, 0x65, 0x57, 0xf3, 0xca, 0xc5, 0xaa, 0xed, 0xfd, 0x19, 0x54, 0x59, - 0xdd, 0x55, 0xaa, 0x6e, 0x8d, 0xad, 0x9a, 0xd5, 0xe9, 0x33, 0x5d, 0x4e, 0xf7, 0x70, 0xcd, 0x67, - 0x35, 0xd9, 0xfb, 0x9a, 0xb1, 0xca, 0x9e, 0xdb, 0xd4, 0x2c, 0x52, 0x7c, 0x73, 0xd3, 0xed, 0x52, - 0x55, 0x8c, 0xd1, 0xf4, 0x99, 0xaf, 0x6a, 0xb2, 0x23, 0x68, 0x19, 0x8f, 0x61, 0xb1, 0x2b, 0x33, - 0x1f, 0xee, 0xea, 0xf5, 0xca, 0x48, 0x65, 0x5d, 0x31, 0xcb, 0xbf, 0x87, 0x86, 0xce, 0x8f, 0xa0, - 0xa9, 0x9f, 0x57, 0x62, 0xeb, 0xc6, 0x73, 0x57, 0xe6, 0x73, 0x50, 0xbd, 0x6e, 0x91, 0x50, 0xc6, - 0x7c, 0x66, 0xe9, 0xc8, 0x7c, 0x2f, 0xa1, 0x65, 0x3c, 0xa1, 0xa4, 0x3b, 0x50, 0x7c, 0xa6, 0x49, - 0x77, 0xa0, 0xe4, 0xc5, 0x25, 0x77, 0x99, 0xaa, 0x68, 0xb1, 0x26, 0xf1, 0x77, 0xfa, 0x26, 0x4a, - 0xd8, 0x1e, 0x5c, 0x96, 0x1a, 0xfb, 0x88, 0x7f, 0x95, 0x69, 0x28, 0x79, 0xc9, 0xf4, 0xbe, 0xc3, - 0x1e, 0x40, 0x43, 0xbd, 0x94, 0xc5, 0xd6, 0xca, 0x5f, 0xfc, 0xea, 0xad, 0x17, 0x70, 0xa9, 0x5e, - 0x7f, 0x00, 0x90, 0xbd, 0xd7, 0xa4, 0x95, 0x44, 0xe1, 0xfd, 0x27, 0xcd, 0x01, 0xc5, 0xc7, 0x9d, - 0xdc, 0x35, 0xea, 0x60, 0x87, 0x91, 0x92, 0x08, 0xf9, 0x6b, 0x75, 0xe5, 0xfe, 0xc7, 0xd0, 0x32, - 0x9e, 0x6c, 0xd2, 0xc3, 0x57, 0x7c, 0xee, 0x49, 0x0f, 0x5f, 0xc9, 0x0b, 0x4f, 0x6e, 0x8f, 0x4a, - 0x5f, 0x75, 0x97, 0xb0, 0xf4, 0x24, 0x38, 0x09, 0xc7, 0x22, 0x03, 0x4e, 0xd0, 0x29, 0x2c, 0x58, - 0xef, 0x32, 0x69, 0x09, 0x2d, 0x7b, 0xf5, 0x49, 0x4b, 0x68, 0xe9, 0x53, 0x4e, 0x8a, 0xcf, 0xdc, - 0x65, 0xac, 0xe7, 0x8c, 0xb2, 0x18, 0x35, 0xfd, 0x10, 0x5a, 0xc6, 0x1b, 0x4b, 0xba, 0x2f, 0xc5, - 0xe7, 0x9c, 0x74, 0x5f, 0xca, 0x9e, 0x64, 0x5a, 0xa5, 0x3a, 0x16, 0x5d, 0x62, 0x05, 0xba, 0x3c, - 0x8e, 0x65, 0xff, 0x04, 0x16, 0xed, 0x57, 0x97, 0xb4, 0xec, 0x97, 0xbe, 0xdf, 0xa4, 0x65, 0x7f, - 0xc6, 0x53, 0x4d, 0x92, 0xa5, 0xef, 0xac, 0xe8, 0x4a, 0xee, 0x7d, 0x21, 0x23, 0xd0, 0xbe, 0x64, - 0xdf, 0x43, 0x05, 0x27, 0x6f, 0xf3, 0xb3, 0x75, 0x83, 0x6b, 0xcd, 0x3b, 0xff, 0x5a, 0x5e, 0x0a, - 0x17, 0xff, 0x6d, 0x66, 0x16, 0xd7, 0xdf, 0x69, 0xd5, 0xa2, 0x5b, 0xfd, 0xc6, 0xaa, 0x65, 0x5e, - 0xfc, 0x37, 0x56, 0x2d, 0xeb, 0xf2, 0x7f, 0x7e, 0xd5, 0x4a, 0x03, 0x2c, 0x23, 0x84, 0xa5, 0xdc, - 0x4d, 0x11, 0x2d, 0x15, 0xe5, 0x97, 0xf9, 0x7a, 0xd7, 0xde, 0x7e, 0xc1, 0xc4, 0xd6, 0x20, 0x4a, - 0x09, 0xde, 0x53, 0x57, 0x27, 0x7f, 0x1f, 0xda, 0xe6, 0x4b, 0x30, 0xcc, 0x14, 0xe5, 0x7c, 0x4d, - 0xef, 0x95, 0xd2, 0xec, 0xc9, 0x65, 0x6d, 0xb3, 0x1a, 0xf6, 0x7d, 0x58, 0xd3, 0xa2, 0x6e, 0x5e, - 0x3e, 0x48, 0xd8, 0x07, 0x25, 0x57, 0x12, 0x4c, 0x3b, 0xae, 0x77, 0x65, 0xe6, 0x9d, 0x85, 0xfb, - 0x0e, 0x32, 0x8d, 0xfd, 0xbc, 0x46, 0xb6, 0x60, 0x94, 0xbd, 0x2a, 0x92, 0x2d, 0x18, 0xa5, 0x6f, - 0x72, 0x28, 0xa6, 0x61, 0x2b, 0xd6, 0x18, 0x89, 0xc3, 0x7a, 0xf6, 0x43, 0x58, 0x32, 0xae, 0x77, - 0x1d, 0x9e, 0x87, 0x03, 0x2d, 0x00, 0xc5, 0xdb, 0xc7, 0xbd, 0xb2, 0x5d, 0x8a, 0xbb, 0x4e, 0xe5, - 0x2f, 0xbb, 0xd6, 0xe0, 0x20, 0xf3, 0x6f, 0x41, 0xcb, 0xbc, 0x3a, 0xf6, 0x96, 0x72, 0xd7, 0x0d, - 0x92, 0x79, 0x71, 0xf6, 0xbe, 0xc3, 0x0e, 0x44, 0xd0, 0x96, 0x7e, 0xea, 0x33, 0x8a, 0xf3, 0xcb, - 0xa7, 0xfd, 0x04, 0xa8, 0x9e, 0xc8, 0xb2, 0xc7, 0x5f, 0x6f, 0x3b, 0xf7, 0x1d, 0xf6, 0x0f, 0x1d, - 0x68, 0x5b, 0x57, 0xbb, 0xac, 0x10, 0x98, 0x5c, 0xcb, 0xba, 0x26, 0xcd, 0x6c, 0x9a, 0xeb, 0x51, - 0xb7, 0xf7, 0xee, 0x7c, 0xd7, 0x1a, 0xd6, 0x2f, 0x2c, 0x87, 0xda, 0xdd, 0xfc, 0x7b, 0x9f, 0x5f, - 0xe6, 0x33, 0x98, 0x77, 0xbe, 0xbf, 0xbc, 0xef, 0xb0, 0x3f, 0x76, 0x60, 0xd1, 0x76, 0x03, 0xeb, - 0xee, 0x96, 0x3a, 0x9c, 0xf5, 0xe4, 0xcf, 0xf0, 0x1d, 0xff, 0x90, 0x5a, 0xf9, 0xfc, 0x8e, 0x67, - 0xb5, 0x52, 0x3e, 0xe5, 0xf2, 0xeb, 0xb5, 0x96, 0x7d, 0x26, 0xde, 0xbb, 0x56, 0x87, 0x35, 0xac, - 0xf8, 0x54, 0xb2, 0x66, 0x18, 0xf3, 0x71, 0x63, 0x9a, 0x84, 0x1f, 0x8b, 0x77, 0x2e, 0xd5, 0x79, - 0x02, 0xf2, 0xdd, 0xbb, 0x7e, 0xef, 0xde, 0xa0, 0x3e, 0x5d, 0x73, 0xaf, 0x58, 0x7d, 0xca, 0xaf, - 0xf0, 0x9b, 0xa2, 0x75, 0xf2, 0x5d, 0xe2, 0x6c, 0x89, 0x2a, 0xbc, 0x55, 0x3c, 0xbb, 0x91, 0x63, - 0xd1, 0x48, 0x99, 0xdd, 0x12, 0x8e, 0x77, 0x2c, 0xc6, 0xbd, 0x43, 0x6d, 0xbd, 0xe1, 0x7e, 0x30, - 0xb3, 0xad, 0xf7, 0xc8, 0x99, 0x8b, 0x2d, 0x3e, 0x00, 0xc8, 0x0e, 0x57, 0x59, 0xee, 0x60, 0x4f, - 0xab, 0x8c, 0xe2, 0xf9, 0xab, 0x2d, 0x81, 0xea, 0xfc, 0x0f, 0x4b, 0xfc, 0x91, 0x50, 0x80, 0x4f, - 0xd4, 0x91, 0xa0, 0x69, 0xe6, 0xd8, 0x27, 0xa0, 0x96, 0x99, 0x93, 0x2f, 0xdf, 0x52, 0x7f, 0xfa, - 0x7c, 0xf1, 0x05, 0x2c, 0xec, 0x45, 0xd1, 0xab, 0xe9, 0x44, 0x47, 0xa7, 0xd8, 0xe7, 0x2c, 0xbb, - 0x7e, 0x72, 0xda, 0xcb, 0xf5, 0xc2, 0xbd, 0x4e, 0x45, 0xf5, 0x58, 0xd7, 0x28, 0xea, 0xde, 0x17, - 0xd9, 0xc1, 0xed, 0x97, 0xcc, 0x87, 0x65, 0xad, 0x55, 0x75, 0xc3, 0x7b, 0x76, 0x31, 0x96, 0x2e, - 0xcd, 0x57, 0x61, 0xd9, 0xe3, 0xaa, 0xb5, 0xf7, 0x12, 0x55, 0x26, 0xe9, 0x94, 0xf6, 0x36, 0x1f, - 0xd0, 0xed, 0x14, 0x3a, 0xac, 0x58, 0xc9, 0x1a, 0xae, 0x4f, 0x39, 0x7a, 0x0b, 0x16, 0x68, 0xaf, - 0x34, 0x13, 0xff, 0x3c, 0xe6, 0x3f, 0xbd, 0xf7, 0x85, 0x3c, 0x06, 0xf9, 0x52, 0xad, 0x34, 0xea, - 0x9c, 0xc8, 0x5a, 0x69, 0x72, 0x07, 0x4b, 0xd6, 0x4a, 0x53, 0x38, 0x58, 0xb2, 0x86, 0x5a, 0x9d, - 0x53, 0xb1, 0x11, 0x2c, 0x17, 0xce, 0xa2, 0xf4, 0x22, 0x33, 0xeb, 0x04, 0xab, 0x77, 0x7d, 0x76, - 0x06, 0xbb, 0xb6, 0x3b, 0x76, 0x6d, 0x87, 0xb0, 0xb0, 0xcd, 0xc5, 0x60, 0x89, 0x70, 0xdc, 0xdc, - 0xfd, 0x40, 0x33, 0xd8, 0x37, 0xbf, 0x24, 0x10, 0xcd, 0x36, 0x25, 0x28, 0x0e, 0x96, 0xfd, 0x08, - 0x5a, 0x8f, 0x79, 0xaa, 0xe2, 0x6f, 0xb5, 0x31, 0x9b, 0x0b, 0xc8, 0xed, 0x95, 0x84, 0xef, 0xda, - 0x3c, 0x43, 0xa5, 0xdd, 0xe3, 0xc3, 0x13, 0x2e, 0x94, 0x53, 0x3f, 0x18, 0x7e, 0xc9, 0xfe, 0x12, - 0x15, 0xae, 0x2f, 0x20, 0xac, 0x19, 0xc1, 0x94, 0x66, 0xe1, 0x4b, 0x39, 0xbc, 0xac, 0xe4, 0x30, - 0x1a, 0x72, 0xc3, 0xa8, 0x0a, 0xa1, 0x65, 0xdc, 0x1b, 0xd2, 0x02, 0x54, 0xbc, 0xa1, 0xa6, 0x05, - 0xa8, 0xe4, 0x9a, 0x91, 0x7b, 0x9b, 0xea, 0x71, 0xd9, 0xf5, 0xac, 0x1e, 0x71, 0xb5, 0x28, 0xab, - 0xe9, 0xde, 0x17, 0xfe, 0x38, 0xfd, 0x92, 0xbd, 0xa4, 0xa7, 0x95, 0xcc, 0xf8, 0xe2, 0xcc, 0x3a, - 0xcf, 0x87, 0x22, 0xeb, 0xc1, 0x32, 0x48, 0xb6, 0xc5, 0x2e, 0xaa, 0x22, 0xdb, 0xeb, 0x3b, 0x00, - 0x87, 0x69, 0x34, 0xd9, 0xf6, 0xf9, 0x38, 0x0a, 0x33, 0x5d, 0x9b, 0x45, 0xb7, 0x66, 0xfa, 0xcb, - 0x08, 0x71, 0x65, 0x2f, 0x8d, 0xed, 0x8c, 0x15, 0xa2, 0xad, 0x98, 0x6b, 0x66, 0x00, 0xac, 0x1e, - 0x90, 0x92, 0x20, 0xd8, 0xfb, 0x0e, 0xdb, 0x04, 0xc8, 0x0e, 0x23, 0xf5, 0xe6, 0xa4, 0x70, 0xce, - 0xa9, 0xd5, 0x5e, 0xc9, 0xc9, 0xe5, 0x01, 0x34, 0xb3, 0xd3, 0xad, 0xf5, 0xec, 0x76, 0x9e, 0x75, - 0x16, 0xa6, 0x57, 0xf0, 0xc2, 0x99, 0x93, 0xdb, 0xa1, 0xa1, 0x02, 0xd6, 0xc0, 0xa1, 0xa2, 0x83, - 0xa4, 0x00, 0x56, 0x44, 0x03, 0xb5, 0x81, 0x43, 0x51, 0x99, 0xaa, 0x27, 0x25, 0xe7, 0x3e, 0x5a, - 0x9a, 0x4b, 0x0f, 0x44, 0x2c, 0x1f, 0x0b, 0x72, 0xab, 0x88, 0x08, 0x45, 0xd5, 0x3c, 0x86, 0xe5, - 0x82, 0x8f, 0x5d, 0x8b, 0xf4, 0xac, 0x43, 0x14, 0x2d, 0xd2, 0x33, 0xdd, 0xf3, 0xee, 0x65, 0xaa, - 0x72, 0xc9, 0x05, 0xda, 0x53, 0xbd, 0x0e, 0xd2, 0xc1, 0x29, 0x56, 0xf7, 0x87, 0x0e, 0xac, 0x94, - 0xb8, 0xd0, 0xd9, 0x87, 0x6a, 0x7b, 0x3e, 0xd3, 0xbd, 0xde, 0x2b, 0xf5, 0xb0, 0xba, 0x87, 0x54, - 0xcf, 0x53, 0xf6, 0xb9, 0xb5, 0xb0, 0x09, 0xe7, 0xa6, 0x94, 0xcc, 0xb7, 0x1a, 0x15, 0xa5, 0x16, - 0xc5, 0x4f, 0x61, 0x5d, 0x34, 0x64, 0x73, 0x34, 0xca, 0x79, 0x7f, 0xaf, 0x15, 0xfe, 0x27, 0x8e, - 0xe5, 0xd5, 0xee, 0xcd, 0xfe, 0x9f, 0x39, 0x33, 0x0c, 0x60, 0xd1, 0x54, 0x36, 0x85, 0x4e, 0xde, - 0xa3, 0xca, 0x66, 0x97, 0xd5, 0xfb, 0xc0, 0xda, 0x68, 0x96, 0x78, 0x61, 0x7f, 0x8b, 0x2a, 0xfb, - 0xc0, 0xed, 0x95, 0x8d, 0x8b, 0xd8, 0x7b, 0xe2, 0x7c, 0xfc, 0x15, 0xed, 0xfe, 0xcd, 0xf5, 0x53, - 0x55, 0x30, 0xcb, 0x5f, 0xad, 0xb7, 0xba, 0xe5, 0xde, 0xe3, 0x9b, 0x54, 0xfd, 0x75, 0xf7, 0xbd, - 0xb2, 0xea, 0x63, 0xf1, 0x89, 0xd8, 0xf4, 0xae, 0xe7, 0xe5, 0x5a, 0xb5, 0xe0, 0x7a, 0xd9, 0x7c, - 0xcf, 0xdc, 0xbd, 0xe4, 0xc6, 0xfa, 0x12, 0xd9, 0x76, 0x6d, 0xd3, 0xdd, 0xab, 0xc5, 0xa7, 0xc4, - 0xaf, 0xac, 0xc5, 0xa7, 0xcc, 0x3f, 0x6c, 0xdb, 0x35, 0xca, 0x33, 0xfc, 0x99, 0x73, 0xe7, 0xe1, - 0xad, 0x1f, 0xfe, 0xd6, 0x49, 0x90, 0x9e, 0x4e, 0x8f, 0xee, 0x0e, 0xa2, 0xf1, 0xbd, 0x91, 0x72, - 0xeb, 0xc9, 0x9b, 0x0a, 0xf7, 0x46, 0xe1, 0xf0, 0x1e, 0x15, 0x7b, 0x34, 0x47, 0xff, 0xc4, 0xeb, - 0x5b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x73, 0xd9, 0x4f, 0x40, 0xf6, 0x6b, 0x00, 0x00, + // 8836 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5f, 0x6c, 0x1c, 0x5b, + 0x9a, 0x97, 0xab, 0xbb, 0x6d, 0x77, 0x7f, 0xdd, 0xb6, 0xdb, 0xc7, 0x8e, 0xdd, 0xe9, 0x9b, 0x9b, + 0x9b, 0x5b, 0x93, 0x4d, 0x32, 0x99, 0x3b, 0x4e, 0xae, 0x77, 0xe6, 0x72, 0xf7, 0x86, 0x65, 0x71, + 0x6c, 0x27, 0xce, 0x5c, 0xc7, 0xf1, 0x94, 0x93, 0x09, 0x33, 0xb3, 0xab, 0x9e, 0x72, 0xf7, 0xb1, + 0x5d, 0x93, 0xee, 0xaa, 0x9e, 0xaa, 0x6a, 0x27, 0x9e, 0xcb, 0x45, 0x02, 0x21, 0x84, 0x78, 0x41, + 0x03, 0x42, 0x02, 0x04, 0x5a, 0x69, 0x16, 0x89, 0x5d, 0xf1, 0x00, 0x2f, 0x48, 0x0b, 0x5a, 0x9e, + 0x10, 0x42, 0x42, 0x42, 0x3c, 0xf0, 0x80, 0xc4, 0x03, 0x23, 0x04, 0x12, 0x5a, 0xf1, 0x86, 0xe0, + 0x1d, 0x7d, 0xdf, 0xf9, 0x53, 0xe7, 0x54, 0x55, 0xc7, 0xb9, 0x33, 0x03, 0x4f, 0xee, 0xf3, 0x3b, + 0xa7, 0xce, 0xdf, 0xef, 0xfb, 0xce, 0x77, 0xbe, 0xef, 0x3b, 0xc7, 0xd0, 0x88, 0xc7, 0xfd, 0x8d, + 0x71, 0x1c, 0xa5, 0x11, 0x9b, 0x1d, 0x86, 0xf1, 0xb8, 0xdf, 0xbd, 0x76, 0x1a, 0x45, 0xa7, 0x43, + 0x7e, 0xcf, 0x1f, 0x07, 0xf7, 0xfc, 0x30, 0x8c, 0x52, 0x3f, 0x0d, 0xa2, 0x30, 0x11, 0x85, 0xdc, + 0x1f, 0xc1, 0xe2, 0x63, 0x1e, 0x1e, 0x71, 0x3e, 0xf0, 0xf8, 0x4f, 0x26, 0x3c, 0x49, 0xd9, 0x37, + 0x60, 0xd9, 0xe7, 0x3f, 0xe5, 0x7c, 0xd0, 0x1b, 0xfb, 0x49, 0x32, 0x3e, 0x8b, 0xfd, 0x84, 0x77, + 0x9c, 0x1b, 0xce, 0x9d, 0x96, 0xd7, 0x16, 0x19, 0x87, 0x1a, 0x67, 0x1f, 0x42, 0x2b, 0xc1, 0xa2, + 0x3c, 0x4c, 0xe3, 0x68, 0x7c, 0xd1, 0xa9, 0x50, 0xb9, 0x26, 0x62, 0xbb, 0x02, 0x72, 0x87, 0xb0, + 0xa4, 0x5b, 0x48, 0xc6, 0x51, 0x98, 0x70, 0x76, 0x1f, 0x56, 0xfb, 0xc1, 0xf8, 0x8c, 0xc7, 0x3d, + 0xfa, 0x78, 0x14, 0xf2, 0x51, 0x14, 0x06, 0xfd, 0x8e, 0x73, 0xa3, 0x7a, 0xa7, 0xe1, 0x31, 0x91, + 0x87, 0x5f, 0x3c, 0x95, 0x39, 0xec, 0x36, 0x2c, 0xf1, 0x50, 0xe0, 0x7c, 0x40, 0x5f, 0xc9, 0xa6, + 0x16, 0x33, 0x18, 0x3f, 0x70, 0xff, 0x7a, 0x05, 0x96, 0x9f, 0x84, 0x41, 0xfa, 0xd2, 0x1f, 0x0e, + 0x79, 0xaa, 0xc6, 0x74, 0x1b, 0x96, 0x5e, 0x13, 0x40, 0x63, 0x7a, 0x1d, 0xc5, 0x03, 0x39, 0xa2, + 0x45, 0x01, 0x1f, 0x4a, 0x74, 0x6a, 0xcf, 0x2a, 0x53, 0x7b, 0x56, 0x3a, 0x5d, 0xd5, 0x29, 0xd3, + 0x75, 0x1b, 0x96, 0x62, 0xde, 0x8f, 0xce, 0x79, 0x7c, 0xd1, 0x7b, 0x1d, 0x84, 0x83, 0xe8, 0x75, + 0xa7, 0x76, 0xc3, 0xb9, 0x33, 0xeb, 0x2d, 0x2a, 0xf8, 0x25, 0xa1, 0xec, 0x21, 0x2c, 0xf5, 0xcf, + 0xfc, 0x30, 0xe4, 0xc3, 0xde, 0xb1, 0xdf, 0x7f, 0x35, 0x19, 0x27, 0x9d, 0xd9, 0x1b, 0xce, 0x9d, + 0xe6, 0xe6, 0xd5, 0x0d, 0x5a, 0xd5, 0x8d, 0xed, 0x33, 0x3f, 0x7c, 0x48, 0x39, 0x47, 0xa1, 0x3f, + 0x4e, 0xce, 0xa2, 0xd4, 0x5b, 0x94, 0x5f, 0x08, 0x38, 0x71, 0x57, 0x81, 0x99, 0x33, 0x21, 0xe6, + 0xde, 0xfd, 0x27, 0x0e, 0xac, 0xbc, 0x08, 0x87, 0x51, 0xff, 0xd5, 0x2f, 0x39, 0x45, 0x25, 0x63, + 0xa8, 0xbc, 0xeb, 0x18, 0xaa, 0x5f, 0x75, 0x0c, 0x6b, 0xb0, 0x6a, 0x77, 0x56, 0x8e, 0x82, 0xc3, + 0x15, 0xfc, 0xfa, 0x94, 0xab, 0x6e, 0xa9, 0x61, 0x7c, 0x1d, 0xda, 0xfd, 0x49, 0x1c, 0xf3, 0xb0, + 0x30, 0x8e, 0x25, 0x89, 0xeb, 0x81, 0x7c, 0x08, 0xad, 0x90, 0xbf, 0xce, 0x8a, 0x49, 0xda, 0x0d, + 0xf9, 0x6b, 0x55, 0xc4, 0xed, 0xc0, 0x5a, 0xbe, 0x19, 0xd9, 0x81, 0xff, 0xea, 0x40, 0xed, 0x45, + 0xfa, 0x26, 0x62, 0x1b, 0x50, 0x4b, 0x2f, 0xc6, 0x82, 0x43, 0x16, 0x37, 0x99, 0x1c, 0xda, 0xd6, + 0x60, 0x10, 0xf3, 0x24, 0x79, 0x7e, 0x31, 0xe6, 0x5e, 0xcb, 0x17, 0x89, 0x1e, 0x96, 0x63, 0x1d, + 0x98, 0x97, 0x69, 0x6a, 0xb0, 0xe1, 0xa9, 0x24, 0xbb, 0x0e, 0xe0, 0x8f, 0xa2, 0x49, 0x98, 0xf6, + 0x12, 0x3f, 0xa5, 0xa9, 0xaa, 0x7a, 0x06, 0xc2, 0xae, 0x41, 0x63, 0xfc, 0xaa, 0x97, 0xf4, 0xe3, + 0x60, 0x9c, 0x12, 0xd9, 0x34, 0xbc, 0x0c, 0x60, 0xdf, 0x80, 0x7a, 0x34, 0x49, 0xc7, 0x51, 0x10, + 0xa6, 0x92, 0x54, 0x96, 0x64, 0x5f, 0x9e, 0x4d, 0xd2, 0x43, 0x84, 0x3d, 0x5d, 0x80, 0xdd, 0x84, + 0x85, 0x7e, 0x14, 0x9e, 0x04, 0xf1, 0x48, 0x08, 0x83, 0xce, 0x1c, 0xb5, 0x66, 0x83, 0xee, 0xbf, + 0xa8, 0x40, 0xf3, 0x79, 0xec, 0x87, 0x89, 0xdf, 0x47, 0x00, 0xbb, 0x9e, 0xbe, 0xe9, 0x9d, 0xf9, + 0xc9, 0x19, 0x8d, 0xb6, 0xe1, 0xa9, 0x24, 0x5b, 0x83, 0x39, 0xd1, 0x51, 0x1a, 0x53, 0xd5, 0x93, + 0x29, 0xf6, 0x11, 0x2c, 0x87, 0x93, 0x51, 0xcf, 0x6e, 0xab, 0x4a, 0xd4, 0x52, 0xcc, 0xc0, 0x09, + 0x38, 0xc6, 0xb5, 0x16, 0x4d, 0x88, 0x11, 0x1a, 0x08, 0x73, 0xa1, 0x25, 0x53, 0x3c, 0x38, 0x3d, + 0x13, 0xc3, 0x9c, 0xf5, 0x2c, 0x0c, 0xeb, 0x48, 0x83, 0x11, 0xef, 0x25, 0xa9, 0x3f, 0x1a, 0xcb, + 0x61, 0x19, 0x08, 0xe5, 0x47, 0xa9, 0x3f, 0xec, 0x9d, 0x70, 0x9e, 0x74, 0xe6, 0x65, 0xbe, 0x46, + 0xd8, 0x2d, 0x58, 0x1c, 0xf0, 0x24, 0xed, 0xc9, 0x45, 0xe1, 0x49, 0xa7, 0x4e, 0xac, 0x9f, 0x43, + 0xb1, 0x9e, 0xd8, 0x7f, 0xdd, 0xc3, 0x09, 0xe0, 0x6f, 0x3a, 0x0d, 0xd1, 0xd7, 0x0c, 0x41, 0xca, + 0x79, 0xcc, 0x53, 0x63, 0xf6, 0x12, 0x49, 0xa1, 0xee, 0x3e, 0x30, 0x03, 0xde, 0xe1, 0xa9, 0x1f, + 0x0c, 0x13, 0xf6, 0x09, 0xb4, 0x52, 0xa3, 0x30, 0x89, 0xc2, 0xa6, 0x26, 0x27, 0xe3, 0x03, 0xcf, + 0x2a, 0xe7, 0x9e, 0x41, 0xfd, 0x11, 0xe7, 0xfb, 0xc1, 0x28, 0x48, 0xd9, 0x1a, 0xcc, 0x9e, 0x04, + 0x6f, 0xb8, 0x20, 0xf8, 0xea, 0xde, 0x8c, 0x27, 0x92, 0xec, 0x03, 0x00, 0xfa, 0xd1, 0x1b, 0x69, + 0xc2, 0xda, 0x9b, 0xf1, 0x1a, 0x84, 0x3d, 0x45, 0xca, 0xea, 0xc2, 0xfc, 0x98, 0xc7, 0x7d, 0xae, + 0xd6, 0x6f, 0x6f, 0xc6, 0x53, 0xc0, 0xc3, 0x79, 0x98, 0x1d, 0x62, 0xed, 0xee, 0x1f, 0xd7, 0xa0, + 0x79, 0xc4, 0x43, 0xcd, 0x69, 0x0c, 0x6a, 0x38, 0x27, 0x92, 0xbb, 0xe8, 0x37, 0xfb, 0x1a, 0x34, + 0x69, 0x9e, 0x92, 0x34, 0x0e, 0xc2, 0x53, 0x41, 0xe0, 0x0f, 0x2b, 0x1d, 0xc7, 0x03, 0x84, 0x8f, + 0x08, 0x65, 0x6d, 0xa8, 0xfa, 0x23, 0x45, 0xe0, 0xf8, 0x93, 0x5d, 0x85, 0xba, 0x3f, 0x4a, 0x45, + 0xf7, 0x5a, 0x04, 0xcf, 0xfb, 0xa3, 0x94, 0xba, 0xf6, 0x21, 0xb4, 0xc6, 0xfe, 0xc5, 0x08, 0xf9, + 0x59, 0x53, 0x45, 0xcb, 0x6b, 0x4a, 0x6c, 0x0f, 0xc9, 0x62, 0x13, 0x56, 0xcc, 0x22, 0xaa, 0xf1, + 0x59, 0xdd, 0xf8, 0xb2, 0x51, 0x5a, 0xf6, 0xe1, 0x36, 0x2c, 0xa9, 0x6f, 0x62, 0x31, 0x1e, 0xa2, + 0x95, 0x86, 0xb7, 0x28, 0x61, 0x35, 0xca, 0x3b, 0xd0, 0x3e, 0x09, 0x42, 0x7f, 0xd8, 0xeb, 0x0f, + 0xd3, 0xf3, 0xde, 0x80, 0x0f, 0x53, 0x9f, 0xa8, 0x66, 0xd6, 0x5b, 0x24, 0x7c, 0x7b, 0x98, 0x9e, + 0xef, 0x20, 0xca, 0x3e, 0x82, 0xc6, 0x09, 0xe7, 0x3d, 0x9a, 0xac, 0x4e, 0xdd, 0xe2, 0x40, 0xb5, + 0x42, 0x5e, 0xfd, 0x44, 0xad, 0xd5, 0x47, 0xd0, 0x8e, 0x26, 0xe9, 0x69, 0x14, 0x84, 0xa7, 0x3d, + 0x94, 0x79, 0xbd, 0x60, 0x40, 0x54, 0x54, 0x7b, 0x58, 0xb9, 0xef, 0x78, 0x8b, 0x2a, 0x0f, 0xa5, + 0xcf, 0x93, 0x01, 0xbb, 0x05, 0x4b, 0x43, 0x3f, 0x49, 0x7b, 0x67, 0xd1, 0xb8, 0x37, 0x9e, 0x1c, + 0xbf, 0xe2, 0x17, 0x9d, 0x05, 0x9a, 0x88, 0x05, 0x84, 0xf7, 0xa2, 0xf1, 0x21, 0x81, 0xec, 0x7d, + 0x00, 0xea, 0xa7, 0xe8, 0x04, 0xdc, 0x70, 0xee, 0x2c, 0x78, 0x0d, 0x44, 0x44, 0xa3, 0x9f, 0x41, + 0x9d, 0x96, 0x27, 0x1d, 0x9e, 0x77, 0x9a, 0x44, 0x60, 0x1f, 0xc8, 0x1e, 0x1a, 0x0b, 0xbb, 0xb1, + 0xc3, 0x93, 0xf4, 0xf9, 0xf0, 0x1c, 0xf7, 0xef, 0x0b, 0x6f, 0x7e, 0x20, 0x52, 0xdd, 0xcf, 0xa0, + 0x65, 0x66, 0xe0, 0x2a, 0x62, 0x37, 0x70, 0xf5, 0x6b, 0x1e, 0xfe, 0x64, 0xab, 0x30, 0x7b, 0xee, + 0x0f, 0x27, 0x5c, 0x0a, 0x52, 0x91, 0xf8, 0xac, 0xf2, 0xa9, 0xe3, 0xfe, 0xb1, 0x03, 0x2d, 0xd1, + 0x82, 0x54, 0x00, 0x6e, 0xc2, 0x82, 0x9a, 0x7e, 0x1e, 0xc7, 0x51, 0x2c, 0xe5, 0x89, 0x0d, 0xb2, + 0xbb, 0xd0, 0x56, 0xc0, 0x38, 0xe6, 0xc1, 0xc8, 0x3f, 0x55, 0x75, 0x17, 0x70, 0xb6, 0x99, 0xd5, + 0x18, 0x47, 0x93, 0x94, 0xcb, 0xad, 0xa6, 0x25, 0xc7, 0xe7, 0x21, 0xe6, 0xd9, 0x45, 0x50, 0x9e, + 0x94, 0xd0, 0x96, 0x85, 0xb9, 0x7f, 0xc7, 0x01, 0x86, 0x5d, 0x7f, 0x1e, 0x89, 0x2a, 0x24, 0x59, + 0xe4, 0xc9, 0xd2, 0x79, 0x67, 0xb2, 0xac, 0xbc, 0x8d, 0x2c, 0x5d, 0x98, 0x15, 0xbd, 0xaf, 0x95, + 0xf4, 0x5e, 0x64, 0x7d, 0xa7, 0x56, 0xaf, 0xb6, 0x6b, 0xee, 0x7f, 0xae, 0xc2, 0xea, 0xb6, 0xd8, + 0x2b, 0xb7, 0xfa, 0x7d, 0x3e, 0xd6, 0x04, 0xfb, 0x01, 0x34, 0xc3, 0x68, 0xc0, 0x15, 0x99, 0x88, + 0x8e, 0x01, 0x42, 0x06, 0x8d, 0x9c, 0xf9, 0x41, 0x28, 0x3a, 0x2e, 0xe6, 0xb3, 0x41, 0x08, 0x75, + 0xfb, 0x16, 0x2c, 0x8d, 0x79, 0x38, 0x30, 0xe9, 0x52, 0x68, 0x33, 0x0b, 0x12, 0x96, 0x24, 0xf9, + 0x01, 0x34, 0x4f, 0x26, 0xa2, 0x1c, 0x72, 0x73, 0x8d, 0xe8, 0x00, 0x24, 0xb4, 0x25, 0x98, 0x7a, + 0x3c, 0x49, 0xce, 0x28, 0x77, 0x96, 0x72, 0xe7, 0x31, 0x8d, 0x59, 0xef, 0x03, 0x0c, 0x26, 0x49, + 0x2a, 0xc9, 0x74, 0x8e, 0x32, 0x1b, 0x88, 0x08, 0x32, 0xfd, 0x26, 0xac, 0x8c, 0xfc, 0x37, 0x3d, + 0xa2, 0x9f, 0x5e, 0x10, 0xf6, 0x4e, 0x86, 0x24, 0xee, 0xe7, 0xa9, 0x5c, 0x7b, 0xe4, 0xbf, 0xf9, + 0x1e, 0xe6, 0x3c, 0x09, 0x1f, 0x11, 0x8e, 0xbc, 0xac, 0xf4, 0x8c, 0x98, 0x27, 0x3c, 0x3e, 0xe7, + 0xc4, 0x7e, 0x35, 0xad, 0x4c, 0x78, 0x02, 0xc5, 0x1e, 0x8d, 0x70, 0xdc, 0xe9, 0xb0, 0x2f, 0x78, + 0xcd, 0x9b, 0x1f, 0x05, 0xe1, 0x5e, 0x3a, 0xec, 0xb3, 0x6b, 0x00, 0xc8, 0xbc, 0x63, 0x1e, 0xf7, + 0x5e, 0xbd, 0x26, 0xc6, 0xa9, 0x11, 0xb3, 0x1e, 0xf2, 0xf8, 0xf3, 0xd7, 0xec, 0x3d, 0x68, 0xf4, + 0x13, 0xe2, 0x7e, 0xff, 0xa2, 0xd3, 0x24, 0xae, 0xaa, 0xf7, 0x13, 0xe4, 0x7b, 0xff, 0x82, 0x7d, + 0x04, 0x0c, 0x7b, 0xeb, 0xd3, 0x2a, 0xf0, 0x01, 0x55, 0x9f, 0x90, 0x18, 0x5b, 0xa0, 0xce, 0x6e, + 0xc9, 0x0c, 0x6c, 0x27, 0x61, 0x5f, 0x83, 0x05, 0xd5, 0xd9, 0x93, 0xa1, 0x7f, 0x9a, 0x10, 0x1f, + 0x2f, 0x78, 0x2d, 0x09, 0x3e, 0x42, 0xcc, 0x7d, 0x29, 0xb4, 0x1b, 0x63, 0x6d, 0x25, 0xdf, 0xe0, + 0x3e, 0x4b, 0x08, 0xad, 0x6b, 0xdd, 0x93, 0xa9, 0xb2, 0x45, 0xab, 0x94, 0x2c, 0x9a, 0xfb, 0x73, + 0x07, 0x5a, 0xb2, 0x66, 0x52, 0x09, 0xd8, 0x7d, 0x60, 0x6a, 0x15, 0xd3, 0x37, 0xc1, 0xa0, 0x77, + 0x7c, 0x91, 0xf2, 0x44, 0x10, 0xcd, 0xde, 0x8c, 0x57, 0x92, 0x87, 0x82, 0xcb, 0x42, 0x93, 0x34, + 0x16, 0x34, 0xbd, 0x37, 0xe3, 0x15, 0x72, 0x90, 0xc5, 0x50, 0xe9, 0x98, 0xa4, 0xbd, 0x20, 0x1c, + 0xf0, 0x37, 0x44, 0x4a, 0x0b, 0x9e, 0x85, 0x3d, 0x5c, 0x84, 0x96, 0xf9, 0x9d, 0xfb, 0x63, 0xa8, + 0x2b, 0x95, 0x85, 0xb6, 0xeb, 0x5c, 0xbf, 0x3c, 0x03, 0x61, 0x5d, 0xa8, 0xdb, 0xbd, 0xf0, 0xea, + 0x5f, 0xa5, 0x6d, 0xf7, 0xcf, 0x41, 0x7b, 0x1f, 0x89, 0x28, 0x44, 0xa2, 0x95, 0x7a, 0xd8, 0x1a, + 0xcc, 0x19, 0xcc, 0xd3, 0xf0, 0x64, 0x0a, 0x37, 0xbc, 0xb3, 0x28, 0x49, 0x65, 0x3b, 0xf4, 0xdb, + 0xfd, 0xb7, 0x0e, 0xb0, 0xdd, 0x24, 0x0d, 0x46, 0x7e, 0xca, 0x1f, 0x71, 0x2d, 0x1e, 0x9e, 0x41, + 0x0b, 0x6b, 0x7b, 0x1e, 0x6d, 0x09, 0xad, 0x48, 0xec, 0xe6, 0xdf, 0x90, 0xec, 0x5c, 0xfc, 0x60, + 0xc3, 0x2c, 0x2d, 0x04, 0xaf, 0x55, 0x01, 0x72, 0x5b, 0xea, 0xc7, 0xa7, 0x3c, 0x25, 0x95, 0x49, + 0x2a, 0xdc, 0x20, 0xa0, 0xed, 0x28, 0x3c, 0xe9, 0xfe, 0x0e, 0x2c, 0x17, 0xea, 0x30, 0x65, 0x74, + 0xa3, 0x44, 0x46, 0x57, 0x4d, 0x19, 0xdd, 0x87, 0x15, 0xab, 0x5f, 0x92, 0xe2, 0x3a, 0x30, 0x8f, + 0x8c, 0x81, 0x3b, 0xb3, 0x23, 0x76, 0x66, 0x99, 0x64, 0x9b, 0xb0, 0x7a, 0xc2, 0x79, 0xec, 0xa7, + 0x94, 0x24, 0xd6, 0xc1, 0x35, 0x91, 0x35, 0x97, 0xe6, 0xb9, 0xff, 0xcd, 0x81, 0x25, 0x94, 0xa6, + 0x4f, 0xfd, 0xf0, 0x42, 0xcd, 0xd5, 0x7e, 0xe9, 0x5c, 0xdd, 0x31, 0x36, 0x26, 0xa3, 0xf4, 0x57, + 0x9d, 0xa8, 0x6a, 0x7e, 0xa2, 0xd8, 0x0d, 0x68, 0x59, 0xdd, 0x9d, 0x15, 0x2a, 0x60, 0xe2, 0xa7, + 0x87, 0x3c, 0x7e, 0x78, 0x91, 0xf2, 0x5f, 0x7d, 0x2a, 0x6f, 0x41, 0x3b, 0xeb, 0xb6, 0x9c, 0x47, + 0x06, 0x35, 0x24, 0x4c, 0x59, 0x01, 0xfd, 0x76, 0xff, 0x81, 0x23, 0x0a, 0x6e, 0x47, 0x81, 0x56, + 0x0f, 0xb1, 0x20, 0x6a, 0x99, 0xaa, 0x20, 0xfe, 0x9e, 0xaa, 0x5e, 0xff, 0xea, 0x83, 0x45, 0x99, + 0x98, 0xf0, 0x70, 0xd0, 0xf3, 0x87, 0x43, 0x12, 0xc4, 0x75, 0x6f, 0x1e, 0xd3, 0x5b, 0xc3, 0xa1, + 0x7b, 0x1b, 0x96, 0x8d, 0xde, 0xbd, 0x65, 0x1c, 0x07, 0xc0, 0xf6, 0x83, 0x24, 0x7d, 0x11, 0x26, + 0x63, 0x43, 0x73, 0x7a, 0x0f, 0x1a, 0x28, 0x6d, 0xb1, 0x67, 0x82, 0x73, 0x67, 0x3d, 0x14, 0xbf, + 0xd8, 0xaf, 0x84, 0x32, 0xfd, 0x37, 0x32, 0xb3, 0x22, 0x33, 0xfd, 0x37, 0x94, 0xe9, 0x7e, 0x0a, + 0x2b, 0x56, 0x7d, 0xb2, 0xe9, 0x0f, 0x61, 0x76, 0x92, 0xbe, 0x89, 0x94, 0x6e, 0xdc, 0x94, 0x14, + 0x82, 0xa7, 0x30, 0x4f, 0xe4, 0xb8, 0x0f, 0x60, 0xf9, 0x80, 0xbf, 0x96, 0x8c, 0xac, 0x3a, 0x72, + 0xeb, 0xd2, 0x13, 0x1a, 0xe5, 0xbb, 0x1b, 0xc0, 0xcc, 0x8f, 0x33, 0x06, 0x50, 0xe7, 0x35, 0xc7, + 0x3a, 0xaf, 0xb9, 0xb7, 0x80, 0x1d, 0x05, 0xa7, 0xe1, 0x53, 0x9e, 0x24, 0xfe, 0xa9, 0x66, 0xfd, + 0x36, 0x54, 0x47, 0xc9, 0xa9, 0x14, 0x55, 0xf8, 0xd3, 0xfd, 0x4d, 0x58, 0xb1, 0xca, 0xc9, 0x8a, + 0xaf, 0x41, 0x23, 0x09, 0x4e, 0x43, 0x3f, 0x9d, 0xc4, 0x5c, 0x56, 0x9d, 0x01, 0xee, 0x23, 0x58, + 0xfd, 0x1e, 0x8f, 0x83, 0x93, 0x8b, 0xcb, 0xaa, 0xb7, 0xeb, 0xa9, 0xe4, 0xeb, 0xd9, 0x85, 0x2b, + 0xb9, 0x7a, 0x64, 0xf3, 0x82, 0x7c, 0xe5, 0x4a, 0xd6, 0x3d, 0x91, 0x30, 0x64, 0x5f, 0xc5, 0x94, + 0x7d, 0xee, 0x0b, 0x60, 0xdb, 0x51, 0x18, 0xf2, 0x7e, 0x7a, 0xc8, 0x79, 0x9c, 0x99, 0x8a, 0x32, + 0x5a, 0x6d, 0x6e, 0xae, 0xcb, 0x99, 0xcd, 0x0b, 0x54, 0x49, 0xc4, 0x0c, 0x6a, 0x63, 0x1e, 0x8f, + 0xa8, 0xe2, 0xba, 0x47, 0xbf, 0xdd, 0x2b, 0xb0, 0x62, 0x55, 0x2b, 0x0f, 0xd7, 0x1f, 0xc3, 0x95, + 0x9d, 0x20, 0xe9, 0x17, 0x1b, 0xec, 0xc0, 0xfc, 0x78, 0x72, 0xdc, 0xcb, 0x38, 0x51, 0x25, 0xf1, + 0xbc, 0x95, 0xff, 0x44, 0x56, 0xf6, 0xd7, 0x1c, 0xa8, 0xed, 0x3d, 0xdf, 0xdf, 0xc6, 0xbd, 0x22, + 0x08, 0xfb, 0xd1, 0x08, 0xb5, 0x30, 0x31, 0x68, 0x9d, 0x9e, 0xca, 0x61, 0xd7, 0xa0, 0x41, 0xca, + 0x1b, 0x1e, 0x31, 0xa5, 0x1e, 0x94, 0x01, 0x78, 0xbc, 0xe5, 0x6f, 0xc6, 0x41, 0x4c, 0xe7, 0x57, + 0x75, 0x2a, 0xad, 0xd1, 0x36, 0x53, 0xcc, 0x70, 0x7f, 0x3e, 0x0f, 0xf3, 0x72, 0xf3, 0x15, 0x1b, + 0x79, 0x1a, 0x9c, 0xf3, 0x6c, 0x23, 0xc7, 0x14, 0x2a, 0xc6, 0x31, 0x1f, 0x45, 0xa9, 0xd6, 0xdf, + 0xc4, 0x32, 0xd8, 0x20, 0x1d, 0xdf, 0xa5, 0x12, 0x21, 0x0e, 0xfc, 0x55, 0x51, 0xca, 0x02, 0xd9, + 0x35, 0x98, 0x57, 0xca, 0x40, 0x4d, 0x9f, 0x2c, 0x14, 0x84, 0xb3, 0xd1, 0xf7, 0xc7, 0x7e, 0x3f, + 0x48, 0x2f, 0xa4, 0x58, 0xd0, 0x69, 0xac, 0x7f, 0x18, 0xf5, 0xfd, 0x61, 0xef, 0xd8, 0x1f, 0xfa, + 0x61, 0x9f, 0x2b, 0xf3, 0x80, 0x05, 0xe2, 0x51, 0x59, 0x76, 0x4b, 0x15, 0x13, 0xc7, 0xe9, 0x1c, + 0x8a, 0x7b, 0x78, 0x3f, 0x1a, 0x8d, 0x82, 0x14, 0x4f, 0xd8, 0xa4, 0x9a, 0x55, 0x3d, 0x03, 0x11, + 0xc6, 0x08, 0x4a, 0xbd, 0x16, 0x33, 0xd8, 0x50, 0xc6, 0x08, 0x03, 0xc4, 0x5a, 0x72, 0x1a, 0x5a, + 0xd5, 0x33, 0x10, 0x5c, 0x8b, 0x49, 0x98, 0xf0, 0x34, 0x1d, 0xf2, 0x81, 0xee, 0x50, 0x93, 0x8a, + 0x15, 0x33, 0xd8, 0x7d, 0x58, 0x11, 0x87, 0xfe, 0xc4, 0x4f, 0xa3, 0xe4, 0x2c, 0x48, 0x7a, 0x09, + 0x9e, 0x7e, 0xc5, 0xe1, 0xb3, 0x2c, 0x8b, 0x7d, 0x0a, 0xeb, 0x39, 0x38, 0xe6, 0x7d, 0x1e, 0x9c, + 0xf3, 0x01, 0xa9, 0x70, 0x55, 0x6f, 0x5a, 0x36, 0xbb, 0x01, 0xcd, 0x70, 0x32, 0xea, 0x4d, 0xc6, + 0x03, 0x1f, 0x95, 0x98, 0x45, 0x52, 0x2e, 0x4d, 0x88, 0x7d, 0x0c, 0x4a, 0x4f, 0x93, 0xda, 0xe3, + 0x92, 0x25, 0xe1, 0x90, 0x7a, 0x3d, 0xbb, 0x04, 0x12, 0x66, 0xa6, 0x92, 0xb6, 0xe5, 0x41, 0x4f, + 0x01, 0xc4, 0x27, 0x71, 0x70, 0xee, 0xa7, 0xbc, 0xb3, 0x2c, 0x84, 0xba, 0x4c, 0xe2, 0x77, 0x41, + 0x18, 0xa4, 0x81, 0x9f, 0x46, 0x71, 0x87, 0x51, 0x5e, 0x06, 0xe0, 0x24, 0x12, 0x7d, 0x24, 0xa9, + 0x9f, 0x4e, 0x12, 0xa9, 0xa1, 0xae, 0x10, 0x71, 0x15, 0x33, 0xd8, 0x27, 0xb0, 0x26, 0x28, 0x82, + 0xb2, 0xa4, 0xee, 0x4d, 0xaa, 0xc2, 0x2a, 0xcd, 0xc8, 0x94, 0x5c, 0x9c, 0x4a, 0x49, 0x22, 0x85, + 0x0f, 0xaf, 0x88, 0xa9, 0x9c, 0x92, 0x8d, 0xfd, 0xc3, 0x1e, 0x04, 0xfd, 0x9e, 0x2c, 0x81, 0x2c, + 0xb2, 0x46, 0xa3, 0x28, 0x66, 0x20, 0x89, 0x0f, 0x83, 0x13, 0x9e, 0x06, 0x23, 0xde, 0x59, 0x17, + 0x24, 0xae, 0xd2, 0xc8, 0x80, 0x93, 0x31, 0xe5, 0x74, 0x04, 0xc3, 0x8b, 0x94, 0xfb, 0xfb, 0x8e, + 0xd8, 0x7c, 0x24, 0xa3, 0x26, 0xc6, 0xb1, 0x4a, 0xb0, 0x68, 0x2f, 0x0a, 0x87, 0x17, 0x92, 0x6b, + 0x41, 0x40, 0xcf, 0xc2, 0xe1, 0x05, 0x2a, 0xf6, 0x41, 0x68, 0x16, 0x11, 0x72, 0xae, 0xa5, 0x40, + 0x2a, 0xf4, 0x01, 0x34, 0xc7, 0x93, 0xe3, 0x61, 0xd0, 0x17, 0x45, 0xaa, 0xa2, 0x16, 0x01, 0x51, + 0x01, 0x3c, 0x57, 0x8a, 0x95, 0x12, 0x25, 0x6a, 0x54, 0xa2, 0x29, 0x31, 0x2c, 0xe2, 0x3e, 0x84, + 0x55, 0xbb, 0x83, 0x52, 0xa0, 0xdf, 0x85, 0xba, 0xe4, 0xff, 0x44, 0x1e, 0xee, 0x17, 0x0d, 0x3b, + 0x2b, 0x1e, 0x83, 0x74, 0xbe, 0xfb, 0x2f, 0x6b, 0xb0, 0x22, 0xd1, 0xed, 0x61, 0x94, 0xf0, 0xa3, + 0xc9, 0x68, 0xe4, 0xc7, 0x25, 0x82, 0xc5, 0xb9, 0x44, 0xb0, 0x54, 0x8a, 0x82, 0xe5, 0xba, 0x75, + 0xbe, 0x14, 0x92, 0xc9, 0x40, 0xd8, 0x1d, 0x58, 0xea, 0x0f, 0xa3, 0x44, 0xa8, 0xfb, 0xa6, 0xa9, + 0x2f, 0x0f, 0x17, 0x85, 0xe1, 0x6c, 0x99, 0x30, 0x34, 0x05, 0xd9, 0x5c, 0x4e, 0x90, 0xb9, 0xd0, + 0xc2, 0x4a, 0xb9, 0x92, 0xcd, 0xf3, 0xf2, 0xb0, 0x65, 0x60, 0xd8, 0x9f, 0xbc, 0xd8, 0x10, 0x32, + 0x6a, 0xa9, 0x4c, 0x68, 0x04, 0x23, 0x4e, 0xb2, 0xdf, 0x28, 0xdd, 0x90, 0x42, 0xa3, 0x98, 0xc5, + 0x1e, 0x01, 0x88, 0xb6, 0x48, 0x01, 0x01, 0x52, 0x40, 0x6e, 0xd9, 0xab, 0x62, 0xce, 0xff, 0x06, + 0x26, 0x26, 0x31, 0x27, 0xa5, 0xc4, 0xf8, 0xd2, 0xfd, 0x1b, 0x0e, 0x34, 0x8d, 0x3c, 0x76, 0x05, + 0x96, 0xb7, 0x9f, 0x3d, 0x3b, 0xdc, 0xf5, 0xb6, 0x9e, 0x3f, 0xf9, 0xde, 0x6e, 0x6f, 0x7b, 0xff, + 0xd9, 0xd1, 0x6e, 0x7b, 0x06, 0xe1, 0xfd, 0x67, 0xdb, 0x5b, 0xfb, 0xbd, 0x47, 0xcf, 0xbc, 0x6d, + 0x05, 0x3b, 0x6c, 0x0d, 0x98, 0xb7, 0xfb, 0xf4, 0xd9, 0xf3, 0x5d, 0x0b, 0xaf, 0xb0, 0x36, 0xb4, + 0x1e, 0x7a, 0xbb, 0x5b, 0xdb, 0x7b, 0x12, 0xa9, 0xb2, 0x55, 0x68, 0x3f, 0x7a, 0x71, 0xb0, 0xf3, + 0xe4, 0xe0, 0x71, 0x6f, 0x7b, 0xeb, 0x60, 0x7b, 0x77, 0x7f, 0x77, 0xa7, 0x5d, 0x63, 0x0b, 0xd0, + 0xd8, 0x7a, 0xb8, 0x75, 0xb0, 0xf3, 0xec, 0x60, 0x77, 0xa7, 0x3d, 0xeb, 0xfe, 0x17, 0x07, 0xae, + 0x50, 0xaf, 0x07, 0x79, 0x26, 0xb9, 0x01, 0xcd, 0x7e, 0x14, 0x8d, 0x51, 0xf1, 0xcf, 0xb6, 0x36, + 0x13, 0x42, 0x06, 0x10, 0x42, 0xe1, 0x24, 0x8a, 0xfb, 0x5c, 0xf2, 0x08, 0x10, 0xf4, 0x08, 0x11, + 0x64, 0x00, 0xb9, 0xbc, 0xa2, 0x84, 0x60, 0x91, 0xa6, 0xc0, 0x44, 0x91, 0x35, 0x98, 0x3b, 0x8e, + 0xb9, 0xdf, 0x3f, 0x93, 0xdc, 0x21, 0x53, 0xec, 0xeb, 0xd9, 0xc9, 0xb4, 0x8f, 0xb3, 0x3f, 0xe4, + 0x03, 0xa2, 0x98, 0xba, 0xb7, 0x24, 0xf1, 0x6d, 0x09, 0xa3, 0x14, 0xf4, 0x8f, 0xfd, 0x70, 0x10, + 0x85, 0x7c, 0x20, 0xd5, 0xde, 0x0c, 0x70, 0x0f, 0x61, 0x2d, 0x3f, 0x3e, 0xc9, 0x63, 0x9f, 0x18, + 0x3c, 0x26, 0xb4, 0xd0, 0xee, 0xf4, 0xd5, 0x34, 0xf8, 0xed, 0x17, 0x15, 0xa8, 0xa1, 0x52, 0x32, + 0x5d, 0x81, 0x31, 0xf5, 0xcc, 0x6a, 0xc1, 0x2f, 0x40, 0x87, 0x5d, 0xb1, 0x45, 0x49, 0x43, 0x4b, + 0x86, 0x64, 0xf9, 0x31, 0xef, 0x9f, 0x4b, 0x53, 0x8b, 0x81, 0x20, 0x83, 0xe0, 0x21, 0x80, 0xbe, + 0x96, 0x0c, 0xa2, 0xd2, 0x2a, 0x8f, 0xbe, 0x9c, 0xcf, 0xf2, 0xe8, 0xbb, 0x0e, 0xcc, 0x07, 0xe1, + 0x71, 0x34, 0x09, 0x07, 0xc4, 0x10, 0x75, 0x4f, 0x25, 0xc9, 0x13, 0x41, 0x8c, 0x8a, 0xf2, 0x53, + 0x90, 0x7f, 0x06, 0xb0, 0x4d, 0x68, 0x24, 0x17, 0x61, 0xdf, 0xa4, 0xf9, 0x55, 0x39, 0x4b, 0x38, + 0x07, 0x1b, 0x47, 0x17, 0x61, 0x9f, 0x28, 0x3c, 0x2b, 0xe6, 0xfe, 0x0e, 0xd4, 0x15, 0x8c, 0x64, + 0xf9, 0xe2, 0xe0, 0xf3, 0x83, 0x67, 0x2f, 0x0f, 0x7a, 0x47, 0xdf, 0x3f, 0xd8, 0x6e, 0xcf, 0xb0, + 0x25, 0x68, 0x6e, 0x6d, 0x13, 0xa5, 0x13, 0xe0, 0x60, 0x91, 0xc3, 0xad, 0xa3, 0x23, 0x8d, 0x54, + 0x5c, 0x86, 0x07, 0xf9, 0x84, 0x34, 0x3f, 0x6d, 0x69, 0xff, 0x04, 0x96, 0x0d, 0x2c, 0x3b, 0x45, + 0x8c, 0x11, 0xc8, 0x9d, 0x22, 0x48, 0x65, 0x14, 0x39, 0x6e, 0x1b, 0x16, 0x1f, 0xf3, 0xf4, 0x49, + 0x78, 0x12, 0xa9, 0x9a, 0xfe, 0x47, 0x0d, 0x96, 0x34, 0x24, 0x2b, 0xba, 0x03, 0x4b, 0xc1, 0x80, + 0x87, 0x69, 0x90, 0x5e, 0xf4, 0x2c, 0x7b, 0x41, 0x1e, 0x46, 0x55, 0xdb, 0x1f, 0x06, 0xbe, 0x72, + 0xf8, 0x88, 0x04, 0x9e, 0x9f, 0x51, 0x07, 0x30, 0xed, 0x36, 0x44, 0x57, 0xc2, 0x4c, 0x51, 0x9a, + 0x87, 0x12, 0x08, 0x71, 0xb9, 0xcd, 0xe8, 0x4f, 0x84, 0xca, 0x59, 0x96, 0x85, 0x4b, 0x25, 0x6a, + 0xc2, 0x21, 0xcf, 0x0a, 0x3d, 0x41, 0x03, 0x05, 0x8f, 0xca, 0x9c, 0x90, 0x8f, 0x79, 0x8f, 0x8a, + 0xe1, 0x95, 0xa9, 0x17, 0xbc, 0x32, 0x28, 0x3f, 0x2f, 0xc2, 0x3e, 0x1f, 0xf4, 0xd2, 0xa8, 0x47, + 0x72, 0x9e, 0x48, 0xa2, 0xee, 0xe5, 0x61, 0xdc, 0x37, 0x52, 0x9e, 0xa4, 0x21, 0x17, 0xa6, 0xe9, + 0x3a, 0x59, 0x41, 0x15, 0x84, 0xe7, 0x83, 0x49, 0x1c, 0x24, 0x9d, 0x16, 0xf9, 0x5b, 0xe8, 0x37, + 0xfb, 0x16, 0x5c, 0x39, 0xe6, 0x49, 0xda, 0x3b, 0xe3, 0xfe, 0x80, 0xc7, 0x44, 0x5e, 0xc2, 0xb1, + 0x23, 0x54, 0xae, 0xf2, 0x4c, 0x24, 0xdc, 0x73, 0x1e, 0x27, 0x41, 0x14, 0x92, 0xb2, 0xd5, 0xf0, + 0x54, 0x12, 0xeb, 0xc3, 0xc1, 0xeb, 0x8d, 0x5a, 0xcf, 0xe0, 0x12, 0x0d, 0xbc, 0x3c, 0x93, 0xdd, + 0x84, 0x39, 0x1a, 0x40, 0xd2, 0x69, 0x13, 0xcd, 0xb4, 0x32, 0x9e, 0x0f, 0x42, 0x4f, 0xe6, 0xe1, + 0x2a, 0xf7, 0xa3, 0x61, 0x14, 0x93, 0xc6, 0xd5, 0xf0, 0x44, 0xc2, 0x9e, 0x9d, 0xd3, 0xd8, 0x1f, + 0x9f, 0x49, 0xad, 0x2b, 0x0f, 0x7f, 0xa7, 0x56, 0x6f, 0xb6, 0x5b, 0xee, 0x9f, 0x81, 0x59, 0xaa, + 0x96, 0xaa, 0xa3, 0xc9, 0x74, 0x64, 0x75, 0x84, 0x76, 0x60, 0x3e, 0xe4, 0xe9, 0xeb, 0x28, 0x7e, + 0xa5, 0xbc, 0x87, 0x32, 0xe9, 0xfe, 0x94, 0x4e, 0x68, 0xda, 0x9b, 0xf6, 0x82, 0x54, 0x4b, 0x3c, + 0x67, 0x8b, 0xa5, 0x4a, 0xce, 0x7c, 0x79, 0x68, 0xac, 0x13, 0x70, 0x74, 0xe6, 0xa3, 0xac, 0xb5, + 0x56, 0x5f, 0x9c, 0xc3, 0x9b, 0x84, 0xed, 0x89, 0xc5, 0xbf, 0x09, 0x8b, 0xca, 0x4f, 0x97, 0xf4, + 0x86, 0xfc, 0x24, 0x55, 0x56, 0xb4, 0x70, 0x32, 0xa2, 0xc3, 0xfa, 0x3e, 0x3f, 0x49, 0xdd, 0x03, + 0x58, 0x96, 0xf2, 0xef, 0xd9, 0x98, 0xab, 0xa6, 0x7f, 0xab, 0x4c, 0x97, 0x68, 0x6e, 0xae, 0xd8, + 0x02, 0x53, 0x78, 0x26, 0xed, 0x92, 0xae, 0x07, 0xcc, 0x94, 0xa7, 0xb2, 0x42, 0xb9, 0x99, 0x2b, + 0x3b, 0xa1, 0x1c, 0x8e, 0x85, 0xe1, 0xfc, 0x24, 0x93, 0x7e, 0x5f, 0x79, 0x57, 0xeb, 0x9e, 0x4a, + 0xba, 0x7f, 0xe8, 0xc0, 0x0a, 0xd5, 0xa6, 0xb4, 0x21, 0xb9, 0x67, 0x7d, 0xfa, 0x15, 0xba, 0xa9, + 0xac, 0xb4, 0xc2, 0x36, 0xb9, 0x0a, 0xb3, 0xe6, 0x2e, 0x26, 0x12, 0x5f, 0xdd, 0x26, 0x53, 0xcb, + 0xdb, 0x64, 0xdc, 0xbf, 0xeb, 0xc0, 0xb2, 0xd8, 0x48, 0x48, 0xdb, 0x96, 0xc3, 0xff, 0xb3, 0xb0, + 0x20, 0x34, 0x02, 0x29, 0x15, 0x64, 0x47, 0x33, 0xd1, 0x4a, 0xa8, 0x28, 0xbc, 0x37, 0xe3, 0xd9, + 0x85, 0xd9, 0x03, 0xd2, 0xca, 0xc2, 0x1e, 0xa1, 0x25, 0x7e, 0x78, 0x7b, 0xae, 0xf7, 0x66, 0x3c, + 0xa3, 0xf8, 0xc3, 0x3a, 0x2a, 0xcb, 0x88, 0xbb, 0x8f, 0x61, 0xc1, 0x6a, 0xc8, 0xb2, 0x07, 0xb5, + 0x84, 0x3d, 0xa8, 0x60, 0x78, 0xad, 0x94, 0x18, 0x5e, 0xff, 0x79, 0x15, 0x18, 0x12, 0x4b, 0x6e, + 0x35, 0x6e, 0xd8, 0xde, 0x0b, 0xe5, 0x92, 0xcf, 0x20, 0xb6, 0x09, 0xcc, 0x48, 0x2a, 0xaf, 0x4a, + 0x55, 0x7b, 0x55, 0x4a, 0x72, 0x51, 0xd4, 0x4a, 0xad, 0x43, 0x7b, 0x2c, 0xe8, 0xac, 0x2f, 0xa6, + 0xbe, 0x34, 0x0f, 0x77, 0x46, 0x72, 0x5f, 0xe0, 0xa9, 0x44, 0x9e, 0x8f, 0x55, 0x3a, 0xbf, 0xc6, + 0x73, 0x97, 0xae, 0xf1, 0x7c, 0xc1, 0xee, 0x66, 0x9c, 0xd0, 0xea, 0xf6, 0x09, 0xed, 0x26, 0x2c, + 0x28, 0x2f, 0x85, 0xf0, 0x88, 0xca, 0xe3, 0xb0, 0x05, 0xb2, 0xbb, 0xd0, 0x56, 0x87, 0x24, 0x7d, + 0x0c, 0x14, 0xfe, 0xbe, 0x02, 0x8e, 0x7b, 0x40, 0x66, 0x89, 0x6b, 0x52, 0x67, 0x33, 0x80, 0xce, + 0x54, 0x48, 0x25, 0xbd, 0x49, 0x28, 0xdd, 0xf1, 0x7c, 0x40, 0x07, 0x61, 0x3c, 0x53, 0xe5, 0x33, + 0xdc, 0xbf, 0xe5, 0x40, 0x1b, 0xd7, 0xcd, 0x22, 0xcd, 0xcf, 0x80, 0x38, 0xe3, 0x1d, 0x29, 0xd3, + 0x2a, 0xcb, 0x3e, 0x85, 0x06, 0xa5, 0xa3, 0x31, 0x0f, 0x25, 0x5d, 0x76, 0x6c, 0xba, 0xcc, 0x64, + 0xca, 0xde, 0x8c, 0x97, 0x15, 0x36, 0xa8, 0xf2, 0x3f, 0x38, 0xd0, 0x94, 0xad, 0xfc, 0xd2, 0x96, + 0x9e, 0xae, 0x11, 0x3f, 0x21, 0x14, 0xb0, 0x2c, 0x5c, 0xe2, 0x0e, 0x2c, 0x8d, 0xfc, 0x74, 0x12, + 0xe3, 0x9e, 0x6e, 0x59, 0x79, 0xf2, 0x30, 0x6e, 0xd0, 0x24, 0x3e, 0x93, 0x5e, 0x1a, 0x0c, 0x7b, + 0x2a, 0x57, 0x46, 0x2a, 0x94, 0x65, 0xa1, 0x14, 0x49, 0x52, 0xff, 0x94, 0xcb, 0xbd, 0x57, 0x24, + 0xdc, 0x0e, 0xac, 0x1d, 0x66, 0x9e, 0x1b, 0x43, 0xc7, 0x76, 0xff, 0xe9, 0x02, 0xac, 0x17, 0xb2, + 0x74, 0x5c, 0x95, 0x34, 0x5d, 0x0c, 0x83, 0xd1, 0x71, 0xa4, 0x0f, 0x28, 0x8e, 0x69, 0xd5, 0xb0, + 0xb2, 0xd8, 0x29, 0x5c, 0x51, 0x4a, 0x06, 0xce, 0x69, 0xb6, 0x21, 0x56, 0x68, 0xa7, 0xfb, 0xd8, + 0x5e, 0xc2, 0x7c, 0x83, 0x0a, 0x37, 0x19, 0xb9, 0xbc, 0x3e, 0x76, 0x06, 0x1d, 0xad, 0xcd, 0x48, + 0x81, 0x6d, 0x68, 0x3c, 0xd8, 0xd6, 0x47, 0x97, 0xb4, 0x65, 0xa9, 0xe4, 0xde, 0xd4, 0xda, 0xd8, + 0x05, 0x5c, 0x57, 0x79, 0x24, 0x91, 0x8b, 0xed, 0xd5, 0xde, 0x69, 0x6c, 0x74, 0xd8, 0xb0, 0x1b, + 0xbd, 0xa4, 0x62, 0xf6, 0x63, 0x58, 0x7b, 0xed, 0x07, 0xa9, 0xea, 0x96, 0xa1, 0x5f, 0xcc, 0x52, + 0x93, 0x9b, 0x97, 0x34, 0xf9, 0x52, 0x7c, 0x6c, 0x6d, 0x53, 0x53, 0x6a, 0xec, 0xfe, 0x49, 0x05, + 0x16, 0xed, 0x7a, 0x90, 0x4c, 0x25, 0xef, 0x2b, 0x19, 0xa8, 0x34, 0xd2, 0x1c, 0x5c, 0x3c, 0xe7, + 0x57, 0xca, 0xce, 0xf9, 0xe6, 0xc9, 0xba, 0x7a, 0x99, 0x89, 0xb0, 0xf6, 0x6e, 0x26, 0xc2, 0xd9, + 0x52, 0x13, 0xe1, 0x74, 0x4b, 0xd2, 0xdc, 0x2f, 0x6b, 0x49, 0x9a, 0x7f, 0xab, 0x25, 0xa9, 0xfb, + 0x7f, 0x1c, 0x60, 0x45, 0xea, 0x65, 0x8f, 0x85, 0x69, 0x23, 0xe4, 0x43, 0x29, 0xc4, 0xbe, 0xf9, + 0x6e, 0x1c, 0xa0, 0x56, 0x4b, 0x7d, 0x8d, 0xac, 0x68, 0x06, 0x37, 0x99, 0x2a, 0xd6, 0x82, 0x57, + 0x96, 0x95, 0x33, 0x93, 0xd6, 0x2e, 0x37, 0x93, 0xce, 0x5e, 0x6e, 0x26, 0x9d, 0xcb, 0x9b, 0x49, + 0xbb, 0x7f, 0xd5, 0x81, 0x95, 0x12, 0x32, 0xfb, 0xf5, 0x0d, 0x1c, 0x09, 0xc3, 0x92, 0x3e, 0x15, + 0x49, 0x18, 0x26, 0xd8, 0xfd, 0x8b, 0xb0, 0x60, 0xb1, 0xd6, 0xaf, 0xaf, 0xfd, 0xbc, 0x96, 0x28, + 0x28, 0xdb, 0xc2, 0xba, 0xff, 0xb3, 0x02, 0xac, 0xc8, 0xde, 0xff, 0x5f, 0xfb, 0x50, 0x9c, 0xa7, + 0x6a, 0xc9, 0x3c, 0xfd, 0x3f, 0xdd, 0x79, 0x3e, 0x82, 0x65, 0x19, 0xb1, 0x69, 0x18, 0xb3, 0x04, + 0xc5, 0x14, 0x33, 0x50, 0x4f, 0xb6, 0x6d, 0xd4, 0x75, 0x2b, 0x42, 0xcd, 0xd8, 0x7e, 0x73, 0xa6, + 0x6a, 0xb7, 0x0b, 0x1d, 0x39, 0x43, 0xbb, 0xe7, 0x3c, 0x4c, 0x8f, 0x26, 0xc7, 0x22, 0x64, 0x31, + 0x88, 0x42, 0x52, 0x03, 0xcd, 0x4c, 0xa9, 0x50, 0x7c, 0x0b, 0x5a, 0xe6, 0xf6, 0x21, 0x97, 0x23, + 0x67, 0xcf, 0x44, 0x55, 0xc2, 0x2c, 0xc5, 0x76, 0x60, 0x91, 0x84, 0xe4, 0x40, 0x7f, 0x57, 0xa1, + 0xef, 0xde, 0x62, 0xa3, 0xd9, 0x9b, 0xf1, 0x72, 0xdf, 0xb0, 0xdf, 0x86, 0x45, 0xfb, 0x00, 0x28, + 0xb5, 0x92, 0xb2, 0x13, 0x01, 0x7e, 0x6e, 0x17, 0x66, 0x5b, 0xd0, 0xce, 0x9f, 0x20, 0x65, 0x34, + 0xcf, 0x94, 0x0a, 0x0a, 0xc5, 0xd9, 0xa7, 0xd2, 0x61, 0x39, 0x4b, 0xb6, 0x93, 0x9b, 0xf6, 0x67, + 0xc6, 0x34, 0x6d, 0x88, 0x3f, 0x86, 0x0b, 0xf3, 0x77, 0x01, 0x32, 0x8c, 0xb5, 0xa1, 0xf5, 0xec, + 0x70, 0xf7, 0xa0, 0xb7, 0xbd, 0xb7, 0x75, 0x70, 0xb0, 0xbb, 0xdf, 0x9e, 0x61, 0x0c, 0x16, 0xc9, + 0xd4, 0xb7, 0xa3, 0x31, 0x07, 0x31, 0x69, 0x5c, 0x51, 0x58, 0x85, 0xad, 0x42, 0xfb, 0xc9, 0x41, + 0x0e, 0xad, 0x3e, 0x6c, 0x68, 0xfe, 0x70, 0xd7, 0x60, 0x55, 0x44, 0xe4, 0x3e, 0x14, 0xe4, 0xa1, + 0xb4, 0x93, 0x7f, 0xe8, 0xc0, 0x95, 0x5c, 0x46, 0x16, 0xf2, 0x25, 0x14, 0x10, 0x5b, 0x2b, 0xb1, + 0x41, 0x72, 0x40, 0x28, 0x5d, 0x33, 0x27, 0x41, 0x8a, 0x19, 0x48, 0xf3, 0x86, 0x6e, 0x9a, 0xe3, + 0xa4, 0xb2, 0x2c, 0x77, 0x5d, 0x47, 0xd6, 0xe4, 0x3a, 0x7e, 0x22, 0x22, 0x7d, 0xcd, 0x8c, 0xcc, + 0x01, 0x6c, 0x77, 0x59, 0x25, 0xf1, 0x58, 0x61, 0x29, 0x3b, 0x76, 0x7f, 0x4b, 0xf3, 0xdc, 0x7f, + 0x53, 0x05, 0xf6, 0xdd, 0x09, 0x8f, 0x2f, 0x28, 0xa6, 0x4b, 0x5b, 0x4e, 0xd7, 0xf3, 0x76, 0xc1, + 0xb9, 0xf1, 0xe4, 0xf8, 0x73, 0x7e, 0xa1, 0x82, 0x25, 0x2b, 0xef, 0x14, 0x2c, 0x59, 0x16, 0xac, + 0x58, 0xbb, 0x3c, 0x58, 0x71, 0xf6, 0xb2, 0x60, 0xc5, 0xaf, 0xc1, 0x42, 0x70, 0x1a, 0x46, 0x28, + 0x0e, 0x50, 0x85, 0x48, 0x3a, 0x73, 0x37, 0xaa, 0x78, 0xf4, 0x96, 0xe0, 0x01, 0x62, 0xec, 0x41, + 0x56, 0x88, 0x0f, 0x4e, 0x29, 0xb8, 0xd6, 0x14, 0x10, 0xbb, 0x83, 0x53, 0xbe, 0x1f, 0xf5, 0xfd, + 0x34, 0x8a, 0xe9, 0x9c, 0xa6, 0x3e, 0x46, 0x3c, 0x61, 0x37, 0x61, 0x31, 0x89, 0x26, 0xa8, 0x54, + 0xa9, 0x69, 0x10, 0x86, 0xa6, 0x96, 0x40, 0x0f, 0xc5, 0x64, 0x6c, 0xc0, 0xca, 0x24, 0xe1, 0xbd, + 0x51, 0x90, 0x24, 0xb8, 0x71, 0xf6, 0xa3, 0x30, 0x8d, 0xa3, 0xa1, 0x34, 0x37, 0x2d, 0x4f, 0x12, + 0xfe, 0x54, 0xe4, 0x6c, 0x8b, 0x0c, 0xf6, 0xad, 0xac, 0x4b, 0x63, 0x3f, 0x88, 0x93, 0x0e, 0x50, + 0x97, 0xd4, 0x48, 0xb1, 0xdf, 0x87, 0x7e, 0x10, 0xeb, 0xbe, 0x60, 0x22, 0xc9, 0x05, 0x51, 0x36, + 0x73, 0x41, 0x94, 0x32, 0xfe, 0x6e, 0x03, 0xea, 0xea, 0x73, 0x3c, 0x03, 0x9f, 0xc4, 0xd1, 0x48, + 0x9d, 0x81, 0xf1, 0x37, 0x5b, 0x84, 0x4a, 0x1a, 0xc9, 0xf3, 0x6b, 0x25, 0x8d, 0xdc, 0xdf, 0x83, + 0xa6, 0x31, 0x03, 0xec, 0x43, 0x71, 0x1c, 0x47, 0x5d, 0x4b, 0x1e, 0x9e, 0x85, 0x17, 0xa5, 0x21, + 0xd1, 0x27, 0x03, 0xf6, 0x0d, 0x58, 0x1e, 0x04, 0x31, 0xa7, 0x38, 0xdf, 0x5e, 0xcc, 0xcf, 0x79, + 0x9c, 0x28, 0x53, 0x43, 0x5b, 0x67, 0x78, 0x02, 0x77, 0x7b, 0xb0, 0x62, 0x51, 0x95, 0x66, 0xba, + 0x39, 0x0a, 0x1a, 0x54, 0xd6, 0x4e, 0x3b, 0xa0, 0x50, 0xe6, 0xe1, 0x76, 0x25, 0xad, 0x24, 0xbd, + 0x71, 0x1c, 0x1d, 0x53, 0x23, 0x8e, 0x67, 0x61, 0xee, 0x2f, 0x2a, 0x50, 0xdd, 0x8b, 0xc6, 0xa6, + 0xef, 0xc7, 0x29, 0xfa, 0x7e, 0xa4, 0x5e, 0xd9, 0xd3, 0x6a, 0xa3, 0xdc, 0xfc, 0x2d, 0x90, 0xdd, + 0x85, 0x45, 0xa4, 0xe0, 0x34, 0x42, 0x3d, 0xfa, 0xb5, 0x1f, 0x8b, 0x08, 0xc3, 0x2a, 0x91, 0x45, + 0x2e, 0x87, 0xad, 0x42, 0x55, 0xab, 0x43, 0x54, 0x00, 0x93, 0x78, 0x88, 0x23, 0xff, 0xfa, 0x85, + 0x34, 0x69, 0xca, 0x14, 0x0a, 0x04, 0xfb, 0x7b, 0xc1, 0x26, 0x62, 0x53, 0x2b, 0xcb, 0x42, 0x1d, + 0x17, 0x19, 0x61, 0x94, 0xa9, 0x8c, 0x3a, 0x6d, 0x1a, 0xeb, 0xeb, 0xb6, 0xb1, 0xfe, 0x06, 0x34, + 0xd3, 0xe1, 0x79, 0x6f, 0xec, 0x5f, 0x0c, 0x23, 0x7f, 0x20, 0x09, 0xd0, 0x84, 0xd8, 0x7d, 0x80, + 0xd1, 0x78, 0xdc, 0xc3, 0x7d, 0x34, 0x1e, 0xd0, 0xc9, 0xbc, 0xb9, 0xd9, 0x96, 0xb3, 0xff, 0xf4, + 0xf0, 0xd0, 0x23, 0xdc, 0x33, 0xca, 0xb8, 0x2f, 0xa1, 0xa1, 0x33, 0xcc, 0xd0, 0x54, 0x8a, 0xb0, + 0x68, 0xda, 0xa1, 0xa9, 0x14, 0x50, 0x71, 0x0b, 0x16, 0x85, 0xf0, 0xd4, 0xe2, 0x40, 0x78, 0xc5, + 0x73, 0xa8, 0xfb, 0xa7, 0x0e, 0xcc, 0xd2, 0x82, 0xa3, 0x36, 0x21, 0xf2, 0xb4, 0xaf, 0x8a, 0x16, + 0x71, 0xc1, 0xcb, 0xc3, 0xcc, 0xb5, 0xc2, 0xe4, 0x2b, 0x7a, 0xf6, 0xcd, 0x50, 0xf9, 0x1b, 0xd0, + 0xd0, 0x2d, 0x19, 0x2b, 0x98, 0x81, 0xec, 0x3a, 0xd4, 0xce, 0xa2, 0xb1, 0x3a, 0x70, 0x81, 0x72, + 0x67, 0x47, 0x63, 0x8f, 0xf0, 0xac, 0x3f, 0x58, 0x9f, 0x18, 0x82, 0x50, 0x6a, 0xf3, 0x70, 0xc9, + 0x58, 0xe7, 0x4a, 0xc7, 0xfa, 0x02, 0x96, 0x90, 0x2d, 0x0d, 0xdb, 0xfd, 0x74, 0xd1, 0xfa, 0x75, + 0xdc, 0xa9, 0xfb, 0xc3, 0xc9, 0x80, 0x9b, 0xc7, 0x5e, 0xb2, 0xcd, 0x4a, 0x5c, 0x29, 0x7c, 0xee, + 0x3f, 0x73, 0x04, 0xbb, 0x63, 0xbd, 0xec, 0x0e, 0xd4, 0x50, 0x0a, 0xe6, 0xac, 0x1c, 0x3a, 0xea, + 0x05, 0xcb, 0x79, 0x54, 0x02, 0x57, 0x91, 0xac, 0xa7, 0x66, 0xed, 0xc2, 0x76, 0x9a, 0x9d, 0x19, + 0xf5, 0xc8, 0x72, 0x47, 0xad, 0x1c, 0xca, 0x36, 0x0c, 0xd7, 0x53, 0xcd, 0x92, 0xac, 0x4a, 0x31, + 0x18, 0x9c, 0x72, 0xc3, 0xe5, 0xf4, 0x47, 0x0e, 0x2c, 0x58, 0x7d, 0x42, 0xa2, 0xa5, 0x20, 0x72, + 0x61, 0x34, 0x91, 0x2b, 0x6f, 0x42, 0x26, 0xc1, 0x57, 0x6c, 0x82, 0xd7, 0x2e, 0x8c, 0xaa, 0xe9, + 0xc2, 0xb8, 0x0f, 0x8d, 0xec, 0x9e, 0x84, 0xdd, 0x29, 0x6c, 0x51, 0xc5, 0xff, 0x64, 0x85, 0x32, + 0x23, 0xf9, 0xac, 0x61, 0x24, 0x77, 0x1f, 0x40, 0xd3, 0x28, 0x6f, 0x1a, 0xb9, 0x1d, 0xcb, 0xc8, + 0xad, 0x83, 0xe3, 0x2a, 0x59, 0x70, 0x9c, 0xfb, 0xb3, 0x0a, 0x2c, 0x20, 0x79, 0x07, 0xe1, 0xe9, + 0x61, 0x34, 0x0c, 0xfa, 0x17, 0x44, 0x56, 0x8a, 0x92, 0xe5, 0x2e, 0xa8, 0xc8, 0xdc, 0x86, 0x91, + 0xfb, 0x75, 0x44, 0xb0, 0x10, 0x55, 0x3a, 0x8d, 0xb2, 0x0c, 0x25, 0xc1, 0xb1, 0x9f, 0x70, 0xe3, + 0xe2, 0x84, 0x67, 0x83, 0x28, 0x71, 0x10, 0xa0, 0x50, 0xc7, 0x51, 0x30, 0x1c, 0x06, 0xa2, 0xac, + 0x38, 0xbe, 0x95, 0x65, 0x61, 0x9b, 0x83, 0x20, 0xf1, 0x8f, 0x33, 0xf7, 0xa4, 0x4e, 0x93, 0xed, + 0xcf, 0x7f, 0x63, 0xd8, 0xfe, 0x44, 0x6c, 0xb4, 0x0d, 0xe6, 0x17, 0x72, 0xbe, 0xb0, 0x90, 0xee, + 0xbf, 0xae, 0x40, 0xd3, 0x20, 0x0b, 0x64, 0xe7, 0xd2, 0xed, 0xc6, 0x40, 0xa5, 0xdf, 0x3e, 0xb4, + 0x0c, 0x02, 0x06, 0xc2, 0x6e, 0xda, 0xad, 0x92, 0x1f, 0x80, 0x18, 0xde, 0x22, 0xa1, 0x6b, 0xd0, + 0x40, 0xd2, 0xff, 0x98, 0xac, 0x0f, 0xf2, 0x92, 0x92, 0x06, 0x54, 0xee, 0x26, 0xe5, 0xce, 0x66, + 0xb9, 0x04, 0xbc, 0xd5, 0x93, 0xff, 0x29, 0xb4, 0x64, 0x35, 0xb4, 0xc6, 0x34, 0xe8, 0x8c, 0xf9, + 0xac, 0xf5, 0xf7, 0xac, 0x92, 0xea, 0xcb, 0x4d, 0xf5, 0x65, 0xfd, 0xb2, 0x2f, 0x55, 0x49, 0xf7, + 0xb1, 0x0e, 0x92, 0x78, 0x1c, 0xfb, 0xe3, 0x33, 0x25, 0x50, 0xee, 0xc3, 0x8a, 0x92, 0x1b, 0x93, + 0xd0, 0x0f, 0xc3, 0x68, 0x12, 0xf6, 0xb9, 0x8a, 0xa3, 0x2b, 0xcb, 0x72, 0x07, 0x3a, 0xea, 0x9a, + 0x2a, 0x62, 0x77, 0x61, 0x56, 0xe8, 0x51, 0x62, 0x57, 0x2e, 0x17, 0x21, 0xa2, 0x08, 0xbb, 0x03, + 0xb3, 0x42, 0x9d, 0xaa, 0x4c, 0x65, 0x7a, 0x51, 0xc0, 0xdd, 0x80, 0x25, 0x0a, 0xf3, 0x36, 0x64, + 0xdf, 0x7b, 0x65, 0xbb, 0xf5, 0x5c, 0x5f, 0x04, 0x83, 0xaf, 0x02, 0x3b, 0x10, 0x7c, 0x65, 0xba, + 0x3a, 0xff, 0xb4, 0x0a, 0x4d, 0x03, 0x46, 0xf9, 0x44, 0xfe, 0xa9, 0xde, 0x20, 0xf0, 0x47, 0x3c, + 0xe5, 0xb1, 0xe4, 0xa5, 0x1c, 0x8a, 0xe5, 0xfc, 0xf3, 0xd3, 0x5e, 0x34, 0x49, 0x7b, 0x03, 0x7e, + 0x1a, 0x73, 0x2e, 0xd5, 0x88, 0x1c, 0x8a, 0xe5, 0x90, 0x9a, 0x8d, 0x72, 0xc2, 0xa3, 0x94, 0x43, + 0x95, 0xe3, 0x52, 0xcc, 0x53, 0x2d, 0x73, 0x5c, 0x8a, 0x59, 0xc9, 0x4b, 0xd6, 0xd9, 0x12, 0xc9, + 0xfa, 0x09, 0xac, 0x09, 0x19, 0x2a, 0xa5, 0x47, 0x2f, 0x47, 0x5c, 0x53, 0x72, 0xd9, 0x5d, 0x68, + 0x63, 0x9f, 0x15, 0x6b, 0x24, 0xc1, 0x4f, 0x05, 0x8f, 0x39, 0x5e, 0x01, 0xc7, 0xb2, 0x64, 0x49, + 0x37, 0xcb, 0x8a, 0xe8, 0x91, 0x02, 0x4e, 0x65, 0xfd, 0x37, 0x76, 0xd9, 0x86, 0x2c, 0x9b, 0xc3, + 0xd9, 0xa7, 0xb0, 0x3e, 0xe2, 0x83, 0xc0, 0xb7, 0xab, 0xe8, 0x65, 0x9b, 0xfc, 0xb4, 0x6c, 0x6c, + 0x05, 0x67, 0xe1, 0xa7, 0xd1, 0xe8, 0x38, 0x10, 0x1b, 0x9b, 0xb0, 0xf9, 0xd7, 0xbc, 0x02, 0xee, + 0x2e, 0x40, 0xf3, 0x28, 0x8d, 0xc6, 0x6a, 0xe9, 0x17, 0xa1, 0x25, 0x92, 0x32, 0x72, 0xf2, 0x3d, + 0xb8, 0x4a, 0xf4, 0xfa, 0x3c, 0x1a, 0x47, 0xc3, 0xe8, 0xf4, 0xc2, 0x3a, 0xb9, 0xff, 0x7b, 0x07, + 0x56, 0xac, 0xdc, 0xec, 0xe8, 0x4e, 0x66, 0x46, 0x15, 0xee, 0x26, 0x48, 0x7c, 0xd9, 0xd8, 0x16, + 0x44, 0x41, 0xe1, 0xd5, 0x79, 0x21, 0x23, 0xe0, 0xb6, 0xb2, 0x3b, 0x1c, 0xea, 0x43, 0x41, 0xef, + 0x9d, 0x22, 0xbd, 0xcb, 0xef, 0xd5, 0xed, 0x0e, 0x55, 0xc5, 0x6f, 0xcb, 0x58, 0x9f, 0x81, 0x1c, + 0x74, 0xd5, 0x8e, 0xcf, 0x30, 0x2d, 0x3d, 0xaa, 0x07, 0x7d, 0x0d, 0x26, 0xee, 0xcf, 0x1d, 0x80, + 0xac, 0x77, 0x14, 0x21, 0xa2, 0xb7, 0x36, 0x71, 0x2f, 0xd9, 0xd8, 0xc6, 0x3e, 0x84, 0x96, 0x76, + 0xf2, 0x67, 0xbb, 0x65, 0x53, 0x61, 0xa8, 0x5d, 0xdc, 0x86, 0xa5, 0xd3, 0x61, 0x74, 0x4c, 0x5a, + 0x0c, 0x85, 0xe2, 0x26, 0x32, 0x7e, 0x74, 0x51, 0xc0, 0x8f, 0x24, 0x9a, 0x6d, 0xad, 0x35, 0x73, + 0x6b, 0x2d, 0xdf, 0x28, 0x7f, 0x56, 0xd1, 0x9e, 0xd6, 0x6c, 0x26, 0xde, 0xca, 0xe5, 0x6c, 0xb3, + 0x20, 0xd6, 0xa7, 0x38, 0x37, 0xe9, 0xe8, 0x71, 0x78, 0xa9, 0xe1, 0xf7, 0x01, 0x2c, 0xc6, 0x42, + 0x66, 0x2a, 0x81, 0x5a, 0x7b, 0x8b, 0x40, 0x5d, 0x88, 0xad, 0x9d, 0xf9, 0xeb, 0xd0, 0xf6, 0x07, + 0xe7, 0x3c, 0x4e, 0x03, 0x32, 0x84, 0x91, 0x1a, 0x25, 0x06, 0xb8, 0x64, 0xe0, 0xa4, 0xad, 0xdc, + 0x86, 0x25, 0x19, 0xcd, 0xab, 0x4b, 0xca, 0x1b, 0x7a, 0x19, 0x8c, 0x05, 0xdd, 0x7f, 0xac, 0x1c, + 0xbb, 0xf6, 0xea, 0xbe, 0x7d, 0x56, 0xcc, 0x11, 0x56, 0x72, 0x23, 0xfc, 0x9a, 0x74, 0xb4, 0x0e, + 0x94, 0xc5, 0xad, 0x6a, 0x44, 0x8d, 0x0d, 0xa4, 0x63, 0xdc, 0x9e, 0xd6, 0xda, 0xbb, 0x4c, 0xab, + 0xfb, 0x9f, 0x1c, 0x98, 0xdf, 0x8b, 0xc6, 0x7b, 0x38, 0xc5, 0xa8, 0xe3, 0x20, 0x9b, 0xe8, 0x50, + 0x7a, 0x95, 0xbc, 0x24, 0xba, 0xae, 0x54, 0x2b, 0x59, 0xc8, 0x6b, 0x25, 0x7f, 0x1e, 0xde, 0x23, + 0x9b, 0x6f, 0x1c, 0x8d, 0xa3, 0x18, 0xd9, 0xd5, 0x1f, 0x0a, 0x15, 0x24, 0x0a, 0xd3, 0x33, 0x25, + 0x4e, 0xdf, 0x56, 0x84, 0x0c, 0x31, 0x78, 0x08, 0x16, 0x07, 0x2b, 0xa9, 0x45, 0x09, 0x29, 0x5b, + 0xcc, 0x70, 0x7f, 0x0b, 0x1a, 0x74, 0xc2, 0xa0, 0xa1, 0x7d, 0x04, 0x8d, 0xb3, 0x68, 0xdc, 0x3b, + 0x0b, 0xc2, 0x54, 0xb1, 0xff, 0x62, 0xa6, 0xfa, 0xef, 0xd1, 0xa4, 0xe8, 0x02, 0xee, 0x2f, 0xe6, + 0x60, 0xfe, 0x49, 0x78, 0x1e, 0x05, 0x7d, 0x72, 0x26, 0x8f, 0xf8, 0x28, 0x52, 0x97, 0x0b, 0xf0, + 0x37, 0x4e, 0x07, 0x45, 0xd2, 0x8e, 0x05, 0xf1, 0xb6, 0x44, 0xd0, 0x88, 0x84, 0xe8, 0x1a, 0x6e, + 0x76, 0x39, 0x50, 0x30, 0x98, 0x81, 0xe0, 0x41, 0x31, 0x36, 0x2f, 0xf7, 0xc9, 0x54, 0x76, 0x79, + 0x63, 0xd6, 0xb8, 0xbc, 0x81, 0xb5, 0x89, 0x4b, 0x67, 0x34, 0xb3, 0x22, 0x64, 0xd4, 0x40, 0xb0, + 0x2f, 0x32, 0x26, 0x50, 0x04, 0x8d, 0x89, 0xbe, 0x48, 0x88, 0x0e, 0xbf, 0x31, 0x17, 0x36, 0x7d, + 0xad, 0x98, 0xe1, 0xe1, 0xd7, 0x04, 0x51, 0x79, 0x13, 0x1f, 0x88, 0x32, 0x62, 0xb3, 0x30, 0x21, + 0x54, 0x5f, 0xf3, 0x77, 0x53, 0xc5, 0xfd, 0xe2, 0x3c, 0x8c, 0xb2, 0x7e, 0xc0, 0xb5, 0x48, 0x16, + 0xe3, 0x04, 0x71, 0x41, 0x32, 0x8f, 0x1b, 0x47, 0x66, 0x11, 0x14, 0xad, 0x8e, 0xcc, 0x48, 0x50, + 0xfe, 0x70, 0x78, 0xec, 0xf7, 0x5f, 0x89, 0xa3, 0x66, 0x4b, 0xb8, 0x82, 0x2c, 0x90, 0x22, 0xfb, + 0xb2, 0x55, 0xa7, 0xf0, 0x9b, 0x9a, 0x67, 0x42, 0x6c, 0x13, 0x9a, 0x64, 0x4e, 0x90, 0xeb, 0xbe, + 0x48, 0xeb, 0xde, 0x36, 0xed, 0x0d, 0xb4, 0xf2, 0x66, 0x21, 0xd3, 0x09, 0xbe, 0x54, 0x08, 0x53, + 0xf6, 0x07, 0x03, 0x19, 0x3f, 0xd0, 0x16, 0x17, 0x04, 0x35, 0x40, 0x06, 0x0b, 0x31, 0x61, 0xa2, + 0xc0, 0x32, 0x15, 0xb0, 0x30, 0x76, 0x5d, 0x98, 0xc9, 0xc6, 0x7e, 0x30, 0xa0, 0x88, 0x1b, 0x71, + 0x38, 0xd5, 0x18, 0xd6, 0xa1, 0x7e, 0xd3, 0xb6, 0xba, 0x42, 0xb3, 0x62, 0x61, 0x38, 0x37, 0x3a, + 0x3d, 0xca, 0xe2, 0x9a, 0x6d, 0x90, 0x7d, 0x4c, 0x1e, 0xdc, 0x94, 0x53, 0xf0, 0xf2, 0xe2, 0xe6, + 0x7b, 0x72, 0xcc, 0x92, 0xa8, 0xd5, 0xdf, 0x23, 0x2c, 0xe2, 0x89, 0x92, 0xa8, 0xd4, 0x09, 0x23, + 0xfa, 0x9a, 0xa5, 0xd4, 0xc9, 0xa2, 0x64, 0x44, 0x17, 0x05, 0xdc, 0x2d, 0x68, 0x99, 0x15, 0xb0, + 0x3a, 0xd4, 0x9e, 0x1d, 0xee, 0x1e, 0xb4, 0x67, 0x58, 0x13, 0xe6, 0x8f, 0x76, 0x9f, 0x3f, 0xdf, + 0xdf, 0xdd, 0x69, 0x3b, 0xac, 0x05, 0x75, 0x1d, 0xb0, 0x59, 0xc1, 0xd4, 0xd6, 0xf6, 0xf6, 0xee, + 0xe1, 0xf3, 0xdd, 0x9d, 0x76, 0xd5, 0xfd, 0xc3, 0x0a, 0x34, 0x8d, 0x9a, 0x2f, 0x31, 0xe1, 0x5c, + 0x07, 0xa0, 0x93, 0x46, 0x16, 0xba, 0x51, 0xf3, 0x0c, 0x04, 0x25, 0xa7, 0x3e, 0x83, 0x57, 0xc5, + 0x3d, 0x49, 0x95, 0xa6, 0xf9, 0xa2, 0x0b, 0x89, 0xa6, 0xaf, 0x62, 0xd6, 0xb3, 0x41, 0xa4, 0x25, + 0x09, 0x50, 0xfc, 0xa0, 0xe0, 0x40, 0x13, 0xc2, 0xb5, 0x89, 0x79, 0x12, 0x0d, 0xcf, 0xb9, 0x28, + 0x22, 0xf4, 0x35, 0x0b, 0xc3, 0xb6, 0xa4, 0x08, 0x32, 0x62, 0x7b, 0x67, 0x3d, 0x1b, 0x64, 0xdf, + 0x54, 0x6b, 0x53, 0xa7, 0xb5, 0x59, 0x2f, 0x4e, 0xb4, 0xb9, 0x2e, 0x6e, 0x0a, 0x6c, 0x6b, 0x30, + 0x90, 0xb9, 0xe6, 0xad, 0xcb, 0xd8, 0xbc, 0xe6, 0xab, 0x84, 0x48, 0x09, 0xa3, 0x56, 0xca, 0x19, + 0xf5, 0xad, 0xe4, 0xec, 0x3e, 0x81, 0xe6, 0xa1, 0x71, 0x71, 0xd8, 0x45, 0x99, 0xa6, 0xae, 0x0c, + 0x0b, 0x59, 0x28, 0x6c, 0x2f, 0x19, 0x6a, 0x74, 0xa9, 0x62, 0x76, 0xc9, 0xfd, 0x47, 0x8e, 0xb8, + 0x8b, 0xa5, 0x87, 0x20, 0xda, 0x77, 0xa1, 0xa5, 0xad, 0xd1, 0x59, 0xf8, 0xba, 0x85, 0x61, 0x19, + 0xea, 0x4e, 0x2f, 0x3a, 0x39, 0x49, 0xb8, 0x0a, 0x34, 0xb5, 0x30, 0xa5, 0x5c, 0xa2, 0xba, 0x1a, + 0x88, 0x16, 0x12, 0x19, 0x70, 0x5a, 0xc0, 0x91, 0x50, 0xa4, 0xd5, 0x52, 0x85, 0xd8, 0xea, 0xb4, + 0x8e, 0xb2, 0xcf, 0xcf, 0xf4, 0x5d, 0xa8, 0xeb, 0x7a, 0xed, 0x9d, 0x43, 0x95, 0xd4, 0xf9, 0xb8, + 0x43, 0xd1, 0xc1, 0xd3, 0xea, 0xb4, 0xa0, 0xd7, 0x62, 0x06, 0xdb, 0x00, 0x76, 0x12, 0xc4, 0xf9, + 0xe2, 0x82, 0x80, 0x4b, 0x72, 0xdc, 0x97, 0xb0, 0xa2, 0xf8, 0xce, 0xd0, 0x7a, 0xed, 0x85, 0x74, + 0x2e, 0x93, 0x4b, 0x95, 0xa2, 0x5c, 0x72, 0xff, 0x55, 0x0d, 0xe6, 0xe5, 0x6a, 0x17, 0x2e, 0xa0, + 0x8b, 0x7d, 0xcf, 0xc2, 0x58, 0xc7, 0xba, 0x66, 0x48, 0x84, 0x20, 0x77, 0xab, 0x3b, 0xf9, 0xfd, + 0x26, 0xb3, 0xc1, 0xe5, 0xf6, 0x9c, 0x35, 0xa8, 0x8d, 0xfd, 0xf4, 0x8c, 0x4c, 0x34, 0x82, 0x96, + 0x28, 0xad, 0x8c, 0xab, 0xb3, 0xb6, 0x71, 0xb5, 0xec, 0xda, 0xbd, 0x50, 0xbd, 0x8a, 0xd7, 0xee, + 0xaf, 0x41, 0x43, 0xec, 0x8f, 0x99, 0xfd, 0x34, 0x03, 0x72, 0xfb, 0x69, 0xbd, 0xb0, 0x9f, 0xbe, + 0xfb, 0x4e, 0xf7, 0x2d, 0x98, 0x13, 0x57, 0x4f, 0x64, 0x40, 0xf1, 0x35, 0xe5, 0x76, 0x14, 0xe5, + 0xd4, 0x5f, 0x11, 0x95, 0xe4, 0xc9, 0xb2, 0xe6, 0xe5, 0xd5, 0xa6, 0x7d, 0x79, 0xd5, 0x34, 0xfb, + 0xb6, 0x72, 0x66, 0xdf, 0xbb, 0xd0, 0xd6, 0xd3, 0x47, 0x06, 0xa3, 0x30, 0x91, 0xf1, 0xa6, 0x05, + 0x3c, 0x13, 0xe4, 0x8b, 0x96, 0x20, 0x47, 0xc1, 0xb2, 0x95, 0xa6, 0x7c, 0x34, 0x4e, 0x95, 0x20, + 0x7f, 0x04, 0x0b, 0x56, 0x27, 0x51, 0x7e, 0xcb, 0x30, 0xe7, 0xf6, 0x0c, 0x5b, 0x80, 0xc6, 0x93, + 0x83, 0xde, 0xa3, 0xfd, 0x27, 0x8f, 0xf7, 0x9e, 0xb7, 0x1d, 0x4c, 0x1e, 0xbd, 0xd8, 0xde, 0xde, + 0xdd, 0xdd, 0x21, 0x79, 0x0e, 0x30, 0xf7, 0x68, 0xeb, 0xc9, 0x3e, 0x49, 0xf3, 0xff, 0xed, 0x40, + 0xd3, 0xa8, 0x9e, 0x7d, 0x5b, 0xcf, 0x8c, 0xb8, 0xdf, 0xf8, 0x7e, 0xb1, 0x0b, 0x1b, 0x4a, 0xce, + 0x19, 0x53, 0xa3, 0x5f, 0x1a, 0xa8, 0x4c, 0x7d, 0x69, 0x00, 0x97, 0xc7, 0x17, 0x35, 0xe8, 0x79, + 0x10, 0xa7, 0x81, 0x3c, 0x2c, 0x22, 0x4f, 0x32, 0xe1, 0x8c, 0x25, 0x85, 0x05, 0x2c, 0x0f, 0xbb, + 0x9f, 0x00, 0x64, 0xbd, 0xb1, 0x87, 0x3d, 0x63, 0x0f, 0xdb, 0x31, 0x86, 0x5d, 0x71, 0x77, 0x84, + 0xc0, 0x90, 0x53, 0xa8, 0xfd, 0x66, 0xdf, 0x04, 0xa6, 0x0c, 0x2e, 0x14, 0xe1, 0x35, 0x1e, 0xf2, + 0x54, 0x5d, 0x3c, 0x58, 0x96, 0x39, 0x4f, 0x74, 0x86, 0xba, 0x3b, 0x93, 0xd5, 0x92, 0xc9, 0x1d, + 0x49, 0x71, 0x79, 0xb9, 0x23, 0x8b, 0x7a, 0x3a, 0xdf, 0xed, 0x42, 0x67, 0x87, 0x63, 0x6d, 0x5b, + 0xc3, 0x61, 0xae, 0x3b, 0x78, 0x62, 0x2e, 0xc9, 0x93, 0xc7, 0xe9, 0xef, 0xc2, 0x95, 0x2d, 0x71, + 0xc7, 0xe0, 0xd7, 0x15, 0x82, 0xea, 0x76, 0x60, 0x2d, 0x5f, 0xa5, 0x6c, 0xec, 0x11, 0x2c, 0xef, + 0xf0, 0xe3, 0xc9, 0xe9, 0x3e, 0x3f, 0xcf, 0x1a, 0x62, 0x50, 0x4b, 0xce, 0xa2, 0xd7, 0x72, 0x7e, + 0xe8, 0x37, 0x7b, 0x1f, 0x60, 0x88, 0x65, 0x7a, 0xc9, 0x98, 0xf7, 0xd5, 0xfd, 0x51, 0x42, 0x8e, + 0xc6, 0xbc, 0xef, 0x7e, 0x02, 0xcc, 0xac, 0x47, 0xce, 0x17, 0x2a, 0xb1, 0x93, 0xe3, 0x5e, 0x72, + 0x91, 0xa4, 0x7c, 0xa4, 0x2e, 0xc6, 0x9a, 0x90, 0x7b, 0x1b, 0x5a, 0x87, 0xfe, 0x85, 0xc7, 0x7f, + 0x22, 0x5f, 0xb6, 0x58, 0x87, 0xf9, 0xb1, 0x7f, 0x81, 0xfc, 0xac, 0xad, 0xf0, 0x94, 0xed, 0xfe, + 0xaf, 0x0a, 0xcc, 0x89, 0x92, 0x58, 0xeb, 0x80, 0x27, 0x69, 0x10, 0x12, 0x8f, 0xa9, 0x5a, 0x0d, + 0xa8, 0x20, 0x30, 0x2b, 0x25, 0x02, 0x53, 0x9a, 0x86, 0xd4, 0x3d, 0x3c, 0x49, 0xb2, 0x16, 0x86, + 0x62, 0x2b, 0x8b, 0x25, 0x17, 0x94, 0x9a, 0x01, 0x39, 0xef, 0x52, 0xa6, 0x2a, 0x8b, 0xfe, 0xa9, + 0xbd, 0x40, 0xca, 0x44, 0x13, 0x2a, 0x55, 0xc8, 0xe7, 0x85, 0xe8, 0x2c, 0x28, 0xe4, 0x05, 0xc5, + 0xbb, 0xfe, 0x0e, 0x8a, 0xb7, 0xb0, 0x17, 0xbd, 0x4d, 0xf1, 0x86, 0x77, 0x50, 0xbc, 0x5d, 0x06, + 0x6d, 0xba, 0xe4, 0x8f, 0x47, 0x3f, 0x45, 0xbb, 0x7f, 0xcf, 0x81, 0xb6, 0xa4, 0x22, 0x9d, 0xa7, + 0xfc, 0x94, 0x6f, 0xbb, 0x0d, 0x76, 0x13, 0x16, 0xe8, 0xe0, 0xa9, 0xe5, 0xa9, 0xf4, 0xf9, 0x59, + 0x20, 0x8e, 0x43, 0x45, 0x21, 0x8d, 0x82, 0xa1, 0x5c, 0x14, 0x13, 0x52, 0x22, 0x39, 0xf6, 0x65, + 0x4c, 0xb4, 0xe3, 0xe9, 0xb4, 0xfb, 0x27, 0x0e, 0x2c, 0x1b, 0x1d, 0x96, 0x54, 0xf8, 0x00, 0x5a, + 0xfa, 0x2d, 0x0d, 0xae, 0x35, 0x86, 0x75, 0x9b, 0x6d, 0xb2, 0xcf, 0xac, 0xc2, 0xb4, 0x98, 0xfe, + 0x05, 0x75, 0x30, 0x99, 0x8c, 0xe4, 0x56, 0x6d, 0x42, 0x48, 0x48, 0xaf, 0x39, 0x7f, 0xa5, 0x8b, + 0x08, 0x65, 0xc1, 0xc2, 0xc8, 0x60, 0x8f, 0x07, 0x66, 0x5d, 0xa8, 0x26, 0x0d, 0xf6, 0x26, 0xe8, + 0xfe, 0xe5, 0x0a, 0xac, 0x08, 0x0b, 0x88, 0xb4, 0x3c, 0xe9, 0xeb, 0xcc, 0x73, 0xc2, 0x18, 0x24, + 0x38, 0x72, 0x6f, 0xc6, 0x93, 0x69, 0xf6, 0xed, 0x77, 0xb4, 0xda, 0xe8, 0x40, 0xed, 0x29, 0x6b, + 0x51, 0x2d, 0x5b, 0x8b, 0xb7, 0xcc, 0x74, 0x99, 0xef, 0x64, 0xb6, 0xdc, 0x77, 0xf2, 0x4e, 0xbe, + 0x8a, 0x87, 0xf3, 0x30, 0x9b, 0xf4, 0xa3, 0x31, 0x77, 0xd7, 0x60, 0xd5, 0x9e, 0x02, 0x29, 0xa8, + 0x7e, 0xee, 0x40, 0xe7, 0x91, 0xf0, 0xc8, 0x06, 0xe1, 0xe9, 0x5e, 0x90, 0xa4, 0x51, 0xac, 0xdf, + 0x86, 0xb8, 0x0e, 0x90, 0xa4, 0x7e, 0x2c, 0x4f, 0x0a, 0x42, 0xdf, 0x32, 0x10, 0x1c, 0x09, 0x0f, + 0x07, 0x22, 0x57, 0xac, 0xa0, 0x4e, 0x17, 0xf4, 0x59, 0x69, 0xc5, 0xb1, 0xb4, 0xc2, 0x5b, 0xe2, + 0x7a, 0x03, 0x76, 0x99, 0x9f, 0x93, 0xf4, 0x17, 0xa6, 0x91, 0x1c, 0xea, 0xfe, 0x7e, 0x05, 0x96, + 0xb2, 0x4e, 0x52, 0x08, 0x8e, 0x2d, 0x43, 0xa4, 0x2a, 0x98, 0xc9, 0x10, 0xe9, 0x71, 0xe9, 0x05, + 0xa8, 0x1b, 0x1a, 0x86, 0x1c, 0x03, 0x65, 0x37, 0xa1, 0xa9, 0x52, 0xd1, 0x24, 0x35, 0x2e, 0x69, + 0x9b, 0xb0, 0x08, 0x58, 0x46, 0xed, 0x54, 0x6a, 0xda, 0x32, 0x45, 0x17, 0xc6, 0x46, 0x29, 0x7d, + 0x29, 0x66, 0x5e, 0x25, 0x59, 0x5b, 0xa8, 0x75, 0xe2, 0xbd, 0x1c, 0x52, 0xe9, 0x4c, 0x75, 0xa7, + 0xae, 0x1f, 0xb7, 0xd1, 0x9c, 0x29, 0x6a, 0xcc, 0xa2, 0xcd, 0x6b, 0x9e, 0x09, 0xa9, 0xa3, 0x72, + 0x34, 0x31, 0xdc, 0xcc, 0x35, 0xcf, 0xc2, 0xdc, 0xbf, 0xe9, 0xc0, 0xd5, 0x92, 0x65, 0x94, 0x9c, + 0xba, 0x03, 0xcb, 0x27, 0x3a, 0x53, 0x4d, 0xb5, 0x60, 0xd7, 0x35, 0x15, 0x76, 0x62, 0x4f, 0xaf, + 0x57, 0xfc, 0x40, 0x6b, 0xfc, 0x62, 0xf1, 0xac, 0xcb, 0x05, 0xc5, 0x0c, 0xf7, 0x10, 0xba, 0xbb, + 0x6f, 0x90, 0xf1, 0xb7, 0xcd, 0x27, 0x05, 0x15, 0x65, 0x6d, 0x16, 0x04, 0xdb, 0xe5, 0xf6, 0xbb, + 0x13, 0x58, 0xb0, 0xea, 0x62, 0xbf, 0xf9, 0xae, 0x95, 0x98, 0x3c, 0x7a, 0x43, 0xae, 0xba, 0x78, + 0x13, 0x51, 0x5d, 0x71, 0x30, 0x20, 0xf7, 0x1c, 0x96, 0x9e, 0x4e, 0x86, 0x69, 0x90, 0xbd, 0x8f, + 0xc8, 0xbe, 0x2d, 0x3f, 0xa2, 0x2a, 0xd4, 0xd4, 0x95, 0x36, 0x65, 0x96, 0xc3, 0x19, 0x1b, 0x61, + 0x4d, 0xbd, 0x62, 0x8b, 0xc5, 0x0c, 0xf7, 0x2a, 0xac, 0x67, 0x4d, 0x8a, 0xb9, 0x53, 0x9b, 0xc3, + 0x1f, 0x38, 0x22, 0x4e, 0xcf, 0x7e, 0xae, 0x91, 0x3d, 0x86, 0x95, 0x24, 0x08, 0x4f, 0x87, 0xdc, + 0xac, 0x27, 0x91, 0x33, 0x71, 0xc5, 0xee, 0x9e, 0x7c, 0xd2, 0xd1, 0x2b, 0xfb, 0x02, 0x09, 0xa4, + 0xbc, 0xa3, 0x19, 0x81, 0xe4, 0xa6, 0xa4, 0x6c, 0x00, 0xdf, 0x81, 0x45, 0xbb, 0x31, 0xf6, 0xa9, + 0xbc, 0x99, 0x90, 0xf5, 0xcc, 0x74, 0xb8, 0xd9, 0x94, 0x61, 0x95, 0x74, 0x7f, 0xe6, 0x40, 0xc7, + 0xe3, 0x48, 0xc6, 0xdc, 0x68, 0x54, 0x52, 0xcf, 0x83, 0x42, 0xb5, 0xd3, 0x07, 0xac, 0x6f, 0x3c, + 0xa8, 0xb1, 0x6e, 0x4c, 0x5d, 0x94, 0xbd, 0x99, 0x92, 0x51, 0x3d, 0xac, 0xc3, 0x9c, 0x1c, 0xdf, + 0x3a, 0x5c, 0x91, 0x5d, 0x52, 0xdd, 0xc9, 0x3c, 0x35, 0x56, 0xa3, 0x96, 0xa7, 0xa6, 0x0b, 0x1d, + 0xf1, 0x04, 0x88, 0x39, 0x0e, 0xf9, 0xe1, 0x0e, 0xb0, 0xa7, 0x7e, 0xdf, 0x8f, 0xa3, 0x28, 0x3c, + 0xe4, 0xb1, 0x0c, 0xac, 0x22, 0x05, 0x88, 0x1c, 0x19, 0x4a, 0x57, 0x13, 0x29, 0xf5, 0x6a, 0x45, + 0x14, 0xaa, 0xd7, 0x41, 0x44, 0xca, 0xf5, 0x60, 0xe5, 0xa1, 0xff, 0x8a, 0xab, 0x9a, 0xb2, 0x59, + 0x6a, 0x8e, 0x75, 0xa5, 0x6a, 0xee, 0xd5, 0xa5, 0xa3, 0x62, 0xb3, 0x9e, 0x59, 0xda, 0xdd, 0x84, + 0x55, 0xbb, 0x4e, 0x29, 0x4a, 0xba, 0x50, 0x1f, 0x49, 0x4c, 0xf6, 0x4e, 0xa7, 0xef, 0x7e, 0x09, + 0x4d, 0xe3, 0x59, 0x17, 0xb6, 0x0e, 0x2b, 0x2f, 0x9f, 0x3c, 0x3f, 0xd8, 0x3d, 0x3a, 0xea, 0x1d, + 0xbe, 0x78, 0xf8, 0xf9, 0xee, 0xf7, 0x7b, 0x7b, 0x5b, 0x47, 0x7b, 0xed, 0x19, 0xb6, 0x06, 0xec, + 0x60, 0xf7, 0xe8, 0xf9, 0xee, 0x8e, 0x85, 0x3b, 0xec, 0x3a, 0x74, 0x5f, 0x1c, 0xbc, 0x38, 0xda, + 0xdd, 0xe9, 0x95, 0x7d, 0x57, 0x61, 0xef, 0xc3, 0x55, 0x99, 0x5f, 0xf2, 0x79, 0xf5, 0xee, 0x03, + 0x68, 0xe7, 0x0d, 0x4b, 0x96, 0x29, 0xee, 0x6d, 0x36, 0xbb, 0xcd, 0x9f, 0x55, 0x61, 0x51, 0x44, + 0x4e, 0x8a, 0x07, 0x4f, 0x79, 0xcc, 0x9e, 0xc2, 0xbc, 0x7c, 0x39, 0x97, 0x29, 0xd2, 0xb2, 0xdf, + 0xea, 0xed, 0xae, 0xe5, 0x61, 0xb9, 0xac, 0x2b, 0x7f, 0xe5, 0x3f, 0xfe, 0xf7, 0xbf, 0x5d, 0x59, + 0x60, 0xcd, 0x7b, 0xe7, 0x1f, 0xdf, 0x3b, 0xe5, 0x61, 0x82, 0x75, 0xfc, 0x2e, 0x40, 0xf6, 0x1e, + 0x2c, 0xeb, 0x68, 0xc3, 0x4a, 0xee, 0xb1, 0xdc, 0xee, 0xd5, 0x92, 0x1c, 0x59, 0xef, 0x55, 0xaa, + 0x77, 0xc5, 0x5d, 0xc4, 0x7a, 0x83, 0x30, 0x48, 0xc5, 0xdb, 0xb0, 0x9f, 0x39, 0x77, 0xd9, 0x00, + 0x5a, 0xe6, 0x4b, 0xad, 0x4c, 0x39, 0xde, 0x4a, 0xde, 0x9a, 0xed, 0xbe, 0x57, 0x9a, 0xa7, 0x68, + 0x99, 0xda, 0xb8, 0xe2, 0xb6, 0xb1, 0x8d, 0x09, 0x95, 0xc8, 0x5a, 0x19, 0x0a, 0x0e, 0xcf, 0x1e, + 0x64, 0x65, 0xd7, 0x0c, 0xa6, 0x2b, 0x3c, 0x07, 0xdb, 0x7d, 0x7f, 0x4a, 0xae, 0x6c, 0xeb, 0x7d, + 0x6a, 0x6b, 0xdd, 0x65, 0xd8, 0x56, 0x9f, 0xca, 0xa8, 0xe7, 0x60, 0x3f, 0x73, 0xee, 0x6e, 0xfe, + 0xbb, 0xdb, 0xd0, 0xd0, 0x4e, 0x79, 0xf6, 0x63, 0x58, 0xb0, 0x42, 0x5b, 0x99, 0x1a, 0x46, 0x59, + 0x24, 0x6c, 0xf7, 0x5a, 0x79, 0xa6, 0x6c, 0xf8, 0x3a, 0x35, 0xdc, 0x61, 0x6b, 0xd8, 0xb0, 0x8c, + 0x0d, 0xbd, 0x47, 0x41, 0xda, 0xe2, 0x9e, 0xe7, 0x2b, 0x43, 0x92, 0x89, 0xc6, 0xae, 0xe5, 0x85, + 0x8b, 0xd5, 0xda, 0xfb, 0x53, 0x72, 0x65, 0x73, 0xd7, 0xa8, 0xb9, 0x35, 0xb6, 0x6a, 0x36, 0xa7, + 0x1d, 0xe5, 0x9c, 0x2e, 0x37, 0x9b, 0x6f, 0x95, 0xb2, 0xf7, 0x35, 0x61, 0x95, 0xbd, 0x61, 0xaa, + 0x49, 0xa4, 0xf8, 0x90, 0xa9, 0xdb, 0xa1, 0xa6, 0x18, 0xa3, 0xe5, 0x33, 0x9f, 0x2a, 0x65, 0xc7, + 0xd0, 0x34, 0x5e, 0x18, 0x63, 0x57, 0xa7, 0xbe, 0x86, 0xd6, 0xed, 0x96, 0x65, 0x95, 0x0d, 0xc5, + 0xac, 0xff, 0x1e, 0x2a, 0x3a, 0x3f, 0x84, 0x86, 0x7e, 0xb3, 0x8a, 0xad, 0x1b, 0x6f, 0x88, 0x99, + 0x6f, 0x6c, 0x75, 0x3b, 0xc5, 0x8c, 0x32, 0xe2, 0x33, 0x6b, 0x47, 0xe2, 0x7b, 0x09, 0x4d, 0xe3, + 0x5d, 0x2a, 0x3d, 0x80, 0xe2, 0xdb, 0x57, 0x7a, 0x00, 0x25, 0xcf, 0x58, 0xb9, 0xcb, 0xd4, 0x44, + 0x93, 0x35, 0x88, 0xbe, 0xd3, 0x37, 0x51, 0xc2, 0xf6, 0xe1, 0x8a, 0x94, 0xd8, 0xc7, 0xfc, 0xab, + 0x2c, 0x43, 0xc9, 0xf3, 0xb0, 0xf7, 0x1d, 0xf6, 0x00, 0xea, 0xea, 0xf9, 0x31, 0xb6, 0x56, 0xfe, + 0x8c, 0x5a, 0x77, 0xbd, 0x80, 0x4b, 0xf1, 0xfa, 0x7d, 0x80, 0xec, 0x11, 0x2c, 0x2d, 0x24, 0x0a, + 0x8f, 0x6a, 0x69, 0x0a, 0x28, 0xbe, 0x98, 0xe5, 0xae, 0xd1, 0x00, 0xdb, 0x8c, 0x84, 0x44, 0xc8, + 0x5f, 0xab, 0x77, 0x0c, 0x7e, 0x04, 0x4d, 0xe3, 0x1d, 0x2c, 0x3d, 0x7d, 0xc5, 0x37, 0xb4, 0xf4, + 0xf4, 0x95, 0x3c, 0x9b, 0xe5, 0x76, 0xa9, 0xf6, 0x55, 0x77, 0x09, 0x6b, 0x4f, 0x82, 0xd3, 0x70, + 0x24, 0x0a, 0xe0, 0x02, 0x9d, 0xc1, 0x82, 0xf5, 0xd8, 0x95, 0xe6, 0xd0, 0xb2, 0xa7, 0xb4, 0x34, + 0x87, 0x96, 0xbe, 0x8f, 0xa5, 0xe8, 0xcc, 0x5d, 0xc6, 0x76, 0xce, 0xa9, 0x88, 0xd1, 0xd2, 0x0f, + 0xa0, 0x69, 0x3c, 0x5c, 0xa5, 0xc7, 0x52, 0x7c, 0x23, 0x4b, 0x8f, 0xa5, 0xec, 0x9d, 0xab, 0x55, + 0x6a, 0x63, 0xd1, 0x25, 0x52, 0xa0, 0x1b, 0xf9, 0x58, 0xf7, 0x8f, 0x61, 0xd1, 0x7e, 0xca, 0x4a, + 0xf3, 0x7e, 0xe9, 0xa3, 0x58, 0x9a, 0xf7, 0xa7, 0xbc, 0x7f, 0x25, 0x49, 0xfa, 0xee, 0x8a, 0x6e, + 0xe4, 0xde, 0x17, 0x32, 0xac, 0xef, 0x4b, 0xf6, 0x5d, 0x14, 0x70, 0xf2, 0x89, 0x04, 0xb6, 0x6e, + 0x50, 0xad, 0xf9, 0x90, 0x82, 0xe6, 0x97, 0xc2, 0x6b, 0x0a, 0x36, 0x31, 0x8b, 0x37, 0x05, 0x68, + 0xd7, 0xa2, 0xa7, 0x12, 0x8c, 0x5d, 0xcb, 0x7c, 0x4d, 0xc1, 0xd8, 0xb5, 0xac, 0x17, 0x15, 0xf2, + 0xbb, 0x56, 0x1a, 0x60, 0x1d, 0x21, 0x2c, 0xe5, 0xae, 0xdf, 0x68, 0xae, 0x28, 0xbf, 0x21, 0xd9, + 0xbd, 0xfe, 0xf6, 0x5b, 0x3b, 0xb6, 0x04, 0x51, 0x42, 0xf0, 0x9e, 0xba, 0x8f, 0xfa, 0x7b, 0xd0, + 0x32, 0x9f, 0xd7, 0x61, 0x26, 0x2b, 0xe7, 0x5b, 0x7a, 0xaf, 0x34, 0xcf, 0x5e, 0x5c, 0xd6, 0x32, + 0x9b, 0x61, 0xdf, 0x83, 0x35, 0xcd, 0xea, 0xe6, 0x8d, 0x8e, 0x84, 0x7d, 0x50, 0x72, 0xcf, 0xc3, + 0xd4, 0xe3, 0xba, 0x57, 0xa7, 0x5e, 0x04, 0xb9, 0xef, 0x20, 0xd1, 0xd8, 0x6f, 0x96, 0x64, 0x1b, + 0x46, 0xd9, 0x53, 0x2d, 0xd9, 0x86, 0x51, 0xfa, 0xd0, 0x89, 0x22, 0x1a, 0xb6, 0x62, 0xcd, 0x91, + 0x88, 0x80, 0x60, 0x3f, 0x80, 0x25, 0xe3, 0xce, 0xdc, 0xd1, 0x45, 0xd8, 0xd7, 0x0c, 0x50, 0xbc, + 0xd2, 0xdd, 0x2d, 0x3b, 0xa5, 0xb8, 0xeb, 0x54, 0xff, 0xb2, 0x6b, 0x4d, 0x0e, 0x12, 0xff, 0x36, + 0x34, 0xcd, 0xfb, 0x78, 0x6f, 0xa9, 0x77, 0xdd, 0xc8, 0x32, 0x6f, 0x23, 0xdf, 0x77, 0xd8, 0xa1, + 0x88, 0x84, 0xd3, 0xef, 0xa7, 0x46, 0x71, 0x7e, 0xfb, 0xb4, 0xdf, 0x55, 0xd5, 0x0b, 0x59, 0xf6, + 0xa2, 0xee, 0x1d, 0xe7, 0xbe, 0xc3, 0xfe, 0xbe, 0x03, 0x2d, 0xeb, 0xbe, 0x9c, 0x15, 0x57, 0x94, + 0xeb, 0x59, 0xc7, 0xcc, 0x33, 0xbb, 0xe6, 0x7a, 0x34, 0xec, 0xfd, 0xbb, 0xdf, 0xb1, 0xa6, 0xf5, + 0x0b, 0xcb, 0xa0, 0xb6, 0x91, 0x7f, 0x44, 0xf5, 0xcb, 0x7c, 0x01, 0xf3, 0x22, 0xfd, 0x97, 0xf7, + 0x1d, 0xf6, 0x47, 0x0e, 0x2c, 0xda, 0x66, 0x60, 0x3d, 0xdc, 0x52, 0x83, 0xb3, 0x5e, 0xfc, 0x29, + 0xb6, 0xe3, 0x1f, 0x50, 0x2f, 0x9f, 0xdf, 0xf5, 0xac, 0x5e, 0xca, 0xf7, 0x71, 0x7e, 0xb5, 0xde, + 0xb2, 0xcf, 0xc4, 0x23, 0xe2, 0xca, 0x03, 0xc6, 0x8a, 0xef, 0x4f, 0x6b, 0x82, 0x31, 0x5f, 0x8c, + 0xa6, 0x45, 0xf8, 0x91, 0x78, 0x3c, 0x54, 0xb9, 0x51, 0x90, 0xee, 0xde, 0xf5, 0x7b, 0xf7, 0x26, + 0x8d, 0xe9, 0xba, 0x7b, 0xd5, 0x1a, 0x53, 0x7e, 0x87, 0xdf, 0x12, 0xbd, 0x93, 0x8f, 0x3d, 0x67, + 0x5b, 0x54, 0xe1, 0x01, 0xe8, 0xe9, 0x9d, 0x1c, 0x89, 0x4e, 0xca, 0xe2, 0x16, 0x73, 0xbc, 0x63, + 0x35, 0xee, 0x5d, 0xea, 0xeb, 0x4d, 0xf7, 0x83, 0xa9, 0x7d, 0xbd, 0x47, 0xc6, 0x5c, 0xec, 0xf1, + 0x21, 0x40, 0xe6, 0xb1, 0x66, 0x39, 0x6f, 0xa9, 0x16, 0x19, 0x45, 0xa7, 0xb6, 0xcd, 0x81, 0xca, + 0xa9, 0x8a, 0x35, 0xfe, 0x50, 0x08, 0xc0, 0x27, 0xca, 0xcf, 0x6a, 0xaa, 0x39, 0xb6, 0x5b, 0xd9, + 0x52, 0x73, 0xf2, 0xf5, 0x5b, 0xe2, 0x4f, 0x3b, 0x6d, 0x5f, 0xc0, 0xc2, 0x7e, 0x14, 0xbd, 0x9a, + 0x8c, 0x75, 0xc8, 0x8f, 0xed, 0x67, 0xd9, 0xf3, 0x93, 0xb3, 0x6e, 0x6e, 0x14, 0xee, 0x0d, 0xaa, + 0xaa, 0xcb, 0x3a, 0x46, 0x55, 0xf7, 0xbe, 0xc8, 0xbc, 0xe1, 0x5f, 0x32, 0x1f, 0x96, 0xb5, 0x54, + 0xd5, 0x1d, 0xef, 0xda, 0xd5, 0x58, 0xb2, 0x34, 0xdf, 0x84, 0xa5, 0x8f, 0xab, 0xde, 0xde, 0x4b, + 0x54, 0x9d, 0x24, 0x53, 0x5a, 0x3b, 0xbc, 0x4f, 0x57, 0x7e, 0xc8, 0x59, 0xb1, 0x92, 0x75, 0x5c, + 0x7b, 0x39, 0xba, 0x0b, 0x16, 0x68, 0xef, 0x34, 0x63, 0xff, 0x22, 0xe6, 0x3f, 0xb9, 0xf7, 0x85, + 0x74, 0x83, 0x7c, 0xa9, 0x76, 0x1a, 0xe5, 0x27, 0xb2, 0x76, 0x9a, 0x9c, 0x63, 0xc9, 0xda, 0x69, + 0x0a, 0x8e, 0x25, 0x6b, 0xaa, 0x95, 0x9f, 0x8a, 0x0d, 0x61, 0xb9, 0xe0, 0x8b, 0xd2, 0x9b, 0xcc, + 0x34, 0x0f, 0x56, 0xf7, 0xc6, 0xf4, 0x02, 0x76, 0x6b, 0x77, 0xed, 0xd6, 0x8e, 0x60, 0x61, 0x87, + 0x8b, 0xc9, 0x12, 0x31, 0xce, 0xb9, 0x4b, 0x97, 0x66, 0x04, 0x75, 0x7e, 0x4b, 0xa0, 0x3c, 0x5b, + 0x95, 0xa0, 0xe0, 0x62, 0xf6, 0x43, 0x68, 0x3e, 0xe6, 0xa9, 0x0a, 0x6a, 0xd6, 0xca, 0x6c, 0x2e, + 0xca, 0xb9, 0x5b, 0x12, 0x13, 0x6d, 0xd3, 0x0c, 0xd5, 0x76, 0x8f, 0x0f, 0x4e, 0xb9, 0x10, 0x4e, + 0xbd, 0x60, 0xf0, 0x25, 0xfb, 0x0b, 0x54, 0xb9, 0xbe, 0xd5, 0xb1, 0x66, 0x44, 0xa8, 0x9a, 0x95, + 0x2f, 0xe5, 0xf0, 0xb2, 0x9a, 0xc3, 0x68, 0xc0, 0x0d, 0xa5, 0x2a, 0x84, 0xa6, 0x71, 0x19, 0x4b, + 0x33, 0x50, 0xf1, 0xda, 0x9f, 0x66, 0xa0, 0x92, 0xbb, 0x5b, 0xee, 0x1d, 0x6a, 0xc7, 0x65, 0x37, + 0xb2, 0x76, 0xc4, 0x7d, 0xad, 0xac, 0xa5, 0x7b, 0x5f, 0xf8, 0xa3, 0xf4, 0x4b, 0xf6, 0x92, 0xde, + 0xab, 0x32, 0x83, 0xb6, 0x33, 0xed, 0x3c, 0x1f, 0xdf, 0xad, 0x27, 0xcb, 0xc8, 0xb2, 0x35, 0x76, + 0xd1, 0x14, 0xe9, 0x5e, 0xdf, 0x06, 0x38, 0x4a, 0xa3, 0xf1, 0x8e, 0xcf, 0x47, 0x51, 0x98, 0xc9, + 0xda, 0x2c, 0x64, 0x38, 0x93, 0x5f, 0x46, 0xdc, 0x30, 0x7b, 0x69, 0x1c, 0x67, 0xac, 0xb8, 0x77, + 0x45, 0x5c, 0x53, 0xa3, 0x8a, 0xf5, 0x84, 0x94, 0x44, 0x16, 0xdf, 0x77, 0xd8, 0x16, 0x40, 0xe6, + 0x8c, 0xd4, 0x87, 0x93, 0x82, 0x9f, 0x53, 0x8b, 0xbd, 0x12, 0xcf, 0xe5, 0x21, 0x34, 0x32, 0xef, + 0xd6, 0x7a, 0x76, 0xe5, 0xd1, 0xf2, 0x85, 0xe9, 0x1d, 0xbc, 0xe0, 0x73, 0x72, 0xdb, 0x34, 0x55, + 0xc0, 0xea, 0x38, 0x55, 0xe4, 0x48, 0x0a, 0x60, 0x45, 0x74, 0x50, 0x2b, 0x38, 0x14, 0xea, 0xaa, + 0x46, 0x52, 0xe2, 0xf7, 0xd1, 0xdc, 0x5c, 0xea, 0x10, 0xb1, 0x6c, 0x2c, 0x48, 0xad, 0x22, 0xcc, + 0x16, 0x45, 0xf3, 0x08, 0x96, 0x0b, 0x36, 0x76, 0xcd, 0xd2, 0xd3, 0x9c, 0x28, 0x9a, 0xa5, 0xa7, + 0x9a, 0xe7, 0xdd, 0x2b, 0xd4, 0xe4, 0x92, 0x0b, 0x74, 0xa6, 0x7a, 0x1d, 0xa4, 0xfd, 0x33, 0x6c, + 0xee, 0x0f, 0x1c, 0x58, 0x29, 0x31, 0xa1, 0xb3, 0x0f, 0xd5, 0xf1, 0x7c, 0xaa, 0x79, 0xbd, 0x5b, + 0x6a, 0x61, 0x75, 0x8f, 0xa8, 0x9d, 0xa7, 0xec, 0x73, 0x6b, 0x63, 0x13, 0xc6, 0x4d, 0xc9, 0x99, + 0x6f, 0x55, 0x2a, 0x4a, 0x35, 0x8a, 0x9f, 0xc0, 0xba, 0xe8, 0xc8, 0xd6, 0x70, 0x98, 0xb3, 0xfe, + 0x5e, 0x2f, 0xfc, 0xa3, 0x21, 0xcb, 0xaa, 0xdd, 0x9d, 0xfe, 0x8f, 0x88, 0xa6, 0x28, 0xc0, 0xa2, + 0xab, 0x6c, 0x02, 0xed, 0xbc, 0x45, 0x95, 0x4d, 0xaf, 0xab, 0xfb, 0x81, 0x75, 0xd0, 0x2c, 0xb1, + 0xc2, 0xfe, 0x06, 0x35, 0xf6, 0x81, 0xdb, 0x2d, 0x9b, 0x17, 0x71, 0xf6, 0xc4, 0xf5, 0xf8, 0x4b, + 0xda, 0xfc, 0x9b, 0x1b, 0xa7, 0x6a, 0x60, 0x9a, 0xbd, 0x5a, 0x1f, 0x75, 0xcb, 0xad, 0xc7, 0xb7, + 0xa8, 0xf9, 0x1b, 0xee, 0x7b, 0x65, 0xcd, 0xc7, 0xe2, 0x13, 0x71, 0xe8, 0x5d, 0xcf, 0xf3, 0xb5, + 0xea, 0xc1, 0x8d, 0xb2, 0xf5, 0x9e, 0x7a, 0x7a, 0xc9, 0xcd, 0xf5, 0x0c, 0xe9, 0x76, 0x2d, 0xd3, + 0xdc, 0xab, 0xd9, 0xa7, 0xc4, 0xae, 0xac, 0xd9, 0xa7, 0xcc, 0x3e, 0x6c, 0xeb, 0x35, 0xca, 0x32, + 0xfc, 0x99, 0x73, 0xf7, 0xe1, 0xed, 0x1f, 0xfc, 0xc6, 0x69, 0x90, 0x9e, 0x4d, 0x8e, 0x37, 0xfa, + 0xd1, 0xe8, 0xde, 0x50, 0x99, 0xf5, 0xe4, 0xf5, 0x8f, 0x7b, 0xc3, 0x70, 0x70, 0x8f, 0xaa, 0x3d, + 0x9e, 0xa3, 0xff, 0x8c, 0xf6, 0x9b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x2a, 0xd4, 0x19, + 0x4b, 0x6d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 116bef58..1d4db503 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -2478,11 +2478,11 @@ message Payment { /// Deprecated, use value_sat or value_msat. int64 value = 2 [json_name = "value", deprecated = true]; - /// The date of this payment - int64 creation_date = 3 [json_name = "creation_date"]; + /// Deprecated, use creation_time_ns + int64 creation_date = 3 [json_name = "creation_date", deprecated = true]; - /// The path this payment took - repeated string path = 4 [ json_name = "path" ]; + /// The path this payment took. + repeated string path = 4 [json_name = "path", deprecated = true]; /// Deprecated, use fee_sat or fee_msat. int64 fee = 5 [json_name = "fee", deprecated = true]; @@ -2514,6 +2514,35 @@ message Payment { /// The fee paid for this payment in milli-satoshis int64 fee_msat = 12 [json_name = "fee_msat"]; + + /// The time in UNIX nanoseconds at which the payment was created. + int64 creation_time_ns = 13 [json_name = "creation_time_ns"]; + + /// The HTLCs made in attempt to settle the payment [EXPERIMENTAL]. + repeated HTLCAttempt htlcs = 14 [json_name = "htlcs"]; +} + +message HTLCAttempt { + enum HTLCStatus { + IN_FLIGHT = 0; + SUCCEEDED = 1; + FAILED = 2; + } + + /// The status of the HTLC. + HTLCStatus status = 1 [json_name = "status"]; + + /// The route taken by this HTLC. + Route route = 2 [json_name = "route"]; + + /// The time in UNIX nanonseconds at which this HTLC was sent. + int64 attempt_time_ns = 3 [json_name = "attempt_time_ns"]; + + /** + The time in UNIX nanonseconds at which this HTLC was settled or failed. + This value will not be set if the HTLC is still IN_FLIGHT. + */ + int64 resolve_time_ns = 4 [json_name = "resolve_time_ns"]; } message ListPaymentsRequest { diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 95b04dfc..7788d2d0 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -1418,6 +1418,15 @@ ], "default": "OPEN_CHANNEL" }, + "HTLCAttemptHTLCStatus": { + "type": "string", + "enum": [ + "IN_FLIGHT", + "SUCCEEDED", + "FAILED" + ], + "default": "IN_FLIGHT" + }, "InvoiceInvoiceState": { "type": "string", "enum": [ @@ -2511,6 +2520,29 @@ } } }, + "lnrpcHTLCAttempt": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/HTLCAttemptHTLCStatus", + "description": "/ The status of the HTLC." + }, + "route": { + "$ref": "#/definitions/lnrpcRoute", + "description": "/ The route taken by this HTLC." + }, + "attempt_time_ns": { + "type": "string", + "format": "int64", + "description": "/ The time in UNIX nanonseconds at which this HTLC was sent." + }, + "resolve_time_ns": { + "type": "string", + "format": "int64", + "description": "*\nThe time in UNIX nanonseconds at which this HTLC was settled or failed.\nThis value will not be set if the HTLC is still IN_FLIGHT." + } + } + }, "lnrpcHop": { "type": "object", "properties": { @@ -3231,14 +3263,14 @@ "creation_date": { "type": "string", "format": "int64", - "title": "/ The date of this payment" + "title": "/ Deprecated, use creation_time_ns" }, "path": { "type": "array", "items": { "type": "string" }, - "title": "/ The path this payment took" + "description": "/ The path this payment took." }, "fee": { "type": "string", @@ -3276,6 +3308,18 @@ "type": "string", "format": "int64", "title": "/ The fee paid for this payment in milli-satoshis" + }, + "creation_time_ns": { + "type": "string", + "format": "int64", + "description": "/ The time in UNIX nanoseconds at which the payment was created." + }, + "htlcs": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcHTLCAttempt" + }, + "description": "/ The HTLCs made in attempt to settle the payment [EXPERIMENTAL]." } } }, diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index 76fcc116..c62a63cc 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -4737,6 +4737,50 @@ func testSingleHopSendToRouteCase(net *lntest.NetworkHarness, t *harnessTest, "want: %d, got: %d", i, paymentAmtSat, p.ValueSat) } + + // Assert exactly one htlc was made. + if len(p.Htlcs) != 1 { + t.Fatalf("expected 1 htlc for payment %d, got: %d", + i, len(p.Htlcs)) + } + + // Assert the htlc's route is populated. + htlc := p.Htlcs[0] + if htlc.Route == nil { + t.Fatalf("expected route for payment %d", i) + } + + // Assert the hop has exactly one hop. + if len(htlc.Route.Hops) != 1 { + t.Fatalf("expected 1 hop for payment %d, got: %d", + i, len(htlc.Route.Hops)) + } + + // If this is an MPP test, assert the MPP record's fields are + // properly populated. Otherwise the hop should not have an MPP + // record. + hop := htlc.Route.Hops[0] + if test.mpp { + if hop.MppRecord == nil { + t.Fatalf("expected mpp record for mpp payment") + } + + if hop.MppRecord.TotalAmtMsat != paymentAmtSat*1000 { + t.Fatalf("incorrect mpp total msat for payment %d "+ + "want: %d, got: %d", + i, paymentAmtSat*1000, + hop.MppRecord.TotalAmtMsat) + } + + expAddr := [32]byte{byte(i)} + if !bytes.Equal(hop.MppRecord.PaymentAddr, expAddr[:]) { + t.Fatalf("incorrect mpp payment addr for payment %d "+ + "want: %x, got: %x", + i, expAddr, hop.MppRecord.PaymentAddr) + } + } else if hop.MppRecord != nil { + t.Fatalf("unexpected mpp record for non-mpp payment") + } } // Verify that the invoices's from Dave's PoV have the correct payment diff --git a/routing/control_tower.go b/routing/control_tower.go index 0bf08476..4cf6839f 100644 --- a/routing/control_tower.go +++ b/routing/control_tower.go @@ -6,7 +6,6 @@ import ( "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lntypes" - "github.com/lightningnetwork/lnd/routing/route" ) // ControlTower tracks all outgoing payments made, whose primary purpose is to @@ -52,17 +51,17 @@ type PaymentResult struct { // Success indicates whether the payment was successful. Success bool - // Route is the (last) route attempted to send the HTLC. It is only set - // for successful payments. - Route *route.Route - - // PaymentPreimage is the preimage of a successful payment. This serves - // as a proof of payment. It is only set for successful payments. + // Preimage is the preimage of a successful payment. This serves as a + // proof of payment. It is only set for successful payments. Preimage lntypes.Preimage - // Failure is a failure reason code indicating the reason the payment - // failed. It is only set for failed payments. + // FailureReason is a failure reason code indicating the reason the + // payment failed. It is only set for failed payments. FailureReason channeldb.FailureReason + + // HTLCs is a list of HTLCs that have been attempted in order to settle + // the payment. + HTLCs []channeldb.HTLCAttempt } // controlTower is persistent implementation of ControlTower to restrict @@ -107,46 +106,46 @@ func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash, func (p *controlTower) Success(paymentHash lntypes.Hash, preimage lntypes.Preimage) error { - route, err := p.db.Success(paymentHash, preimage) + payment, err := p.db.Success(paymentHash, preimage) if err != nil { return err } // Notify subscribers of success event. p.notifyFinalEvent( - paymentHash, createSuccessResult(route, preimage), + paymentHash, createSuccessResult(payment.HTLCs), ) return nil } // createSuccessResult creates a success result to send to subscribers. -func createSuccessResult(rt *route.Route, - preimage lntypes.Preimage) *PaymentResult { +func createSuccessResult(htlcs []channeldb.HTLCAttempt) *PaymentResult { + // Extract any preimage from the list of HTLCs. + var preimage lntypes.Preimage + for _, htlc := range htlcs { + if htlc.Settle != nil { + preimage = htlc.Settle.Preimage + break + } + } return &PaymentResult{ Success: true, Preimage: preimage, - Route: rt, + HTLCs: htlcs, } } // createFailResult creates a failed result to send to subscribers. -func createFailedResult(rt *route.Route, +func createFailedResult(htlcs []channeldb.HTLCAttempt, reason channeldb.FailureReason) *PaymentResult { - result := &PaymentResult{ + return &PaymentResult{ Success: false, FailureReason: reason, + HTLCs: htlcs, } - - // In case of incorrect payment details, set the route. This can be used - // for probing and to extract a fee estimate from the route. - if reason == channeldb.FailureReasonIncorrectPaymentDetails { - result.Route = rt - } - - return result } // Fail transitions a payment into the Failed state, and records the reason the @@ -156,14 +155,16 @@ func createFailedResult(rt *route.Route, func (p *controlTower) Fail(paymentHash lntypes.Hash, reason channeldb.FailureReason) error { - route, err := p.db.Fail(paymentHash, reason) + payment, err := p.db.Fail(paymentHash, reason) if err != nil { return err } // Notify subscribers of fail event. p.notifyFinalEvent( - paymentHash, createFailedResult(route, reason), + paymentHash, createFailedResult( + payment.HTLCs, reason, + ), ) return nil @@ -213,20 +214,14 @@ func (p *controlTower) SubscribePayment(paymentHash lntypes.Hash) ( // a subscriber, because we can send the result on the channel // immediately. case channeldb.StatusSucceeded: - event = *createSuccessResult( - &payment.Attempt.Route, *payment.PaymentPreimage, - ) + event = *createSuccessResult(payment.HTLCs) // Payment already failed. It is not necessary to register as a // subscriber, because we can send the result on the channel // immediately. case channeldb.StatusFailed: - var route *route.Route - if payment.Attempt != nil { - route = &payment.Attempt.Route - } event = *createFailedResult( - route, *payment.Failure, + payment.HTLCs, *payment.FailureReason, ) default: diff --git a/routing/control_tower_test.go b/routing/control_tower_test.go index 49cc6d43..e326e98c 100644 --- a/routing/control_tower_test.go +++ b/routing/control_tower_test.go @@ -144,10 +144,13 @@ func TestControlTowerSubscribeSuccess(t *testing.T) { if result.Preimage != preimg { t.Fatal("unexpected preimage") } - - if !reflect.DeepEqual(result.Route, &attempt.Route) { - t.Fatalf("unexpected route: %v vs %v", - spew.Sdump(result.Route), + if len(result.HTLCs) != 1 { + t.Fatalf("expected one htlc, got %d", len(result.HTLCs)) + } + htlc := result.HTLCs[0] + if !reflect.DeepEqual(htlc.Route, attempt.Route) { + t.Fatalf("unexpected htlc route: %v vs %v", + spew.Sdump(htlc.Route), spew.Sdump(attempt.Route)) } @@ -168,6 +171,15 @@ func TestControlTowerSubscribeSuccess(t *testing.T) { func TestPaymentControlSubscribeFail(t *testing.T) { t.Parallel() + t.Run("register attempt", func(t *testing.T) { + testPaymentControlSubscribeFail(t, true) + }) + t.Run("no register attempt", func(t *testing.T) { + testPaymentControlSubscribeFail(t, false) + }) +} + +func testPaymentControlSubscribeFail(t *testing.T, registerAttempt bool) { db, err := initDB() if err != nil { t.Fatalf("unable to init db: %v", err) @@ -176,7 +188,7 @@ func TestPaymentControlSubscribeFail(t *testing.T) { pControl := NewControlTower(channeldb.NewPaymentControl(db)) // Initiate a payment. - info, _, _, err := genInfo() + info, attempt, _, err := genInfo() if err != nil { t.Fatal(err) } @@ -192,6 +204,17 @@ func TestPaymentControlSubscribeFail(t *testing.T) { t.Fatalf("expected subscribe to succeed, but got: %v", err) } + // Conditionally register the attempt based on the test type. This + // allows us to simulate failing after attempting with an htlc or before + // making any attempts at all. + if registerAttempt { + // Register an attempt. + err = pControl.RegisterAttempt(info.PaymentHash, attempt) + if err != nil { + t.Fatal(err) + } + } + // Mark the payment as failed. if err := pControl.Fail(info.PaymentHash, channeldb.FailureReasonTimeout); err != nil { t.Fatal(err) @@ -223,9 +246,28 @@ func TestPaymentControlSubscribeFail(t *testing.T) { if result.Success { t.Fatal("unexpected payment state") } - if result.Route != nil { - t.Fatal("expected no route") + + // There will either be one or zero htlcs depending on whether + // or not the attempt was registered. Assert the correct number + // is present, and the route taken if the attempt was + // registered. + if registerAttempt { + if len(result.HTLCs) != 1 { + t.Fatalf("expected 1 htlc, got: %d", + len(result.HTLCs)) + } + + htlc := result.HTLCs[0] + if !reflect.DeepEqual(htlc.Route, testRoute) { + t.Fatalf("unexpected htlc route: %v vs %v", + spew.Sdump(htlc.Route), + spew.Sdump(testRoute)) + } + } else if len(result.HTLCs) != 0 { + t.Fatalf("expected 0 htlcs, got: %d", + len(result.HTLCs)) } + if result.FailureReason != channeldb.FailureReasonTimeout { t.Fatal("unexpected failure reason") } diff --git a/routing/result_interpretation.go b/routing/result_interpretation.go index 8f193048..03457619 100644 --- a/routing/result_interpretation.go +++ b/routing/result_interpretation.go @@ -11,7 +11,7 @@ import ( // Instantiate variables to allow taking a reference from the failure reason. var ( reasonError = channeldb.FailureReasonError - reasonIncorrectDetails = channeldb.FailureReasonIncorrectPaymentDetails + reasonIncorrectDetails = channeldb.FailureReasonPaymentDetails ) // pairResult contains the result of the interpretation of a payment attempt for diff --git a/rpcserver.go b/rpcserver.go index 837c2cae..8a7750b9 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4398,24 +4398,29 @@ func (r *rpcServer) ListPayments(ctx context.Context, continue } - // If a payment attempt has been made we can fetch the route. - // Otherwise we'll just populate the RPC response with an empty - // one. - var route route.Route - if payment.Attempt != nil { - route = payment.Attempt.Route + // Fetch the payment's route and preimage. If no HTLC was + // successful, an empty route and preimage will be used. + var ( + route route.Route + preimage lntypes.Preimage + ) + for _, htlc := range payment.HTLCs { + // Display the last route attempted. + route = htlc.Route + + // If any of the htlcs have settled, extract a valid + // preimage. + if htlc.Settle != nil { + preimage = htlc.Settle.Preimage + } } + + // Encode the hops from the successful route, if any. path := make([]string, len(route.Hops)) for i, hop := range route.Hops { path[i] = hex.EncodeToString(hop.PubKeyBytes[:]) } - // If this payment is settled, the preimage will be available. - var preimage lntypes.Preimage - if payment.PaymentPreimage != nil { - preimage = *payment.PaymentPreimage - } - msatValue := int64(payment.Info.Value) satValue := int64(payment.Info.Value.ToSatoshis()) @@ -4424,13 +4429,25 @@ func (r *rpcServer) ListPayments(ctx context.Context, return nil, err } + htlcs := make([]*lnrpc.HTLCAttempt, 0, len(payment.HTLCs)) + for _, dbHTLC := range payment.HTLCs { + htlc, err := r.routerBackend.MarshalHTLCAttempt(dbHTLC) + if err != nil { + return nil, err + } + + htlcs = append(htlcs, htlc) + } + paymentHash := payment.Info.PaymentHash + creationTimeNS := routerrpc.MarshalTimeNano(payment.Info.CreationTime) paymentsResp.Payments = append(paymentsResp.Payments, &lnrpc.Payment{ PaymentHash: hex.EncodeToString(paymentHash[:]), Value: satValue, ValueMsat: msatValue, ValueSat: satValue, - CreationDate: payment.Info.CreationDate.Unix(), + CreationDate: payment.Info.CreationTime.Unix(), + CreationTimeNs: creationTimeNS, Path: path, Fee: int64(route.TotalFees().ToSatoshis()), FeeSat: int64(route.TotalFees().ToSatoshis()), @@ -4438,6 +4455,7 @@ func (r *rpcServer) ListPayments(ctx context.Context, PaymentPreimage: hex.EncodeToString(preimage[:]), PaymentRequest: string(payment.Info.PaymentRequest), Status: status, + Htlcs: htlcs, }) }