Merge pull request #4000 from joostjager/payment-raw-failure
routing+channeldb: mpp bucket structure
This commit is contained in:
commit
f29169e7d6
@ -14,6 +14,7 @@ import (
|
||||
"github.com/coreos/bbolt"
|
||||
"github.com/go-errors/errors"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration12"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration13"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration_01_to_11"
|
||||
"github.com/lightningnetwork/lnd/clock"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
@ -124,6 +125,11 @@ var (
|
||||
number: 12,
|
||||
migration: migration12.MigrateInvoiceTLV,
|
||||
},
|
||||
{
|
||||
// Migrate to multi-path payments.
|
||||
number: 13,
|
||||
migration: migration13.MigrateMPP,
|
||||
},
|
||||
}
|
||||
|
||||
// Big endian is the preferred byte order, due to cursor scans over
|
||||
|
246
channeldb/duplicate_payments.go
Normal file
246
channeldb/duplicate_payments.go
Normal file
@ -0,0 +1,246 @@
|
||||
package channeldb
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"github.com/btcsuite/btcd/btcec"
|
||||
"github.com/coreos/bbolt"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
"github.com/lightningnetwork/lnd/routing/route"
|
||||
)
|
||||
|
||||
var (
|
||||
// duplicatePaymentsBucket is the name of a optional sub-bucket within
|
||||
// the payment hash bucket, that is used to hold duplicate payments to a
|
||||
// payment hash. This is needed to support information from earlier
|
||||
// versions of lnd, where it was possible to pay to a payment hash more
|
||||
// than once.
|
||||
duplicatePaymentsBucket = []byte("payment-duplicate-bucket")
|
||||
|
||||
// duplicatePaymentSettleInfoKey is a key used in the payment's
|
||||
// sub-bucket to store the settle info of the payment.
|
||||
duplicatePaymentSettleInfoKey = []byte("payment-settle-info")
|
||||
|
||||
// duplicatePaymentAttemptInfoKey is a key used in the payment's
|
||||
// sub-bucket to store the info about the latest attempt that was done
|
||||
// for the payment in question.
|
||||
duplicatePaymentAttemptInfoKey = []byte("payment-attempt-info")
|
||||
|
||||
// duplicatePaymentCreationInfoKey is a key used in the payment's
|
||||
// sub-bucket to store the creation info of the payment.
|
||||
duplicatePaymentCreationInfoKey = []byte("payment-creation-info")
|
||||
|
||||
// duplicatePaymentFailInfoKey is a key used in the payment's sub-bucket
|
||||
// to store information about the reason a payment failed.
|
||||
duplicatePaymentFailInfoKey = []byte("payment-fail-info")
|
||||
|
||||
// duplicatePaymentSequenceKey is a key used in the payment's sub-bucket
|
||||
// to store the sequence number of the payment.
|
||||
duplicatePaymentSequenceKey = []byte("payment-sequence-key")
|
||||
)
|
||||
|
||||
// duplicateHTLCAttemptInfo contains static information about a specific HTLC
|
||||
// attempt for a 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 the attempt.
|
||||
type duplicateHTLCAttemptInfo struct {
|
||||
// attemptID is the unique ID used for this attempt.
|
||||
attemptID uint64
|
||||
|
||||
// sessionKey is the ephemeral key used for this attempt.
|
||||
sessionKey *btcec.PrivateKey
|
||||
|
||||
// route is the route attempted to send the HTLC.
|
||||
route route.Route
|
||||
}
|
||||
|
||||
// fetchDuplicatePaymentStatus fetches the payment status of the payment. If the
|
||||
// payment isn't found, it will default to "StatusUnknown".
|
||||
func fetchDuplicatePaymentStatus(bucket *bbolt.Bucket) PaymentStatus {
|
||||
if bucket.Get(duplicatePaymentSettleInfoKey) != nil {
|
||||
return StatusSucceeded
|
||||
}
|
||||
|
||||
if bucket.Get(duplicatePaymentFailInfoKey) != nil {
|
||||
return StatusFailed
|
||||
}
|
||||
|
||||
if bucket.Get(duplicatePaymentCreationInfoKey) != nil {
|
||||
return StatusInFlight
|
||||
}
|
||||
|
||||
return StatusUnknown
|
||||
}
|
||||
|
||||
func deserializeDuplicateHTLCAttemptInfo(r io.Reader) (
|
||||
*duplicateHTLCAttemptInfo, error) {
|
||||
|
||||
a := &duplicateHTLCAttemptInfo{}
|
||||
err := ReadElements(r, &a.attemptID, &a.sessionKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
a.route, err = DeserializeRoute(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func deserializeDuplicatePaymentCreationInfo(r io.Reader) (
|
||||
*PaymentCreationInfo, error) {
|
||||
|
||||
var scratch [8]byte
|
||||
|
||||
c := &PaymentCreationInfo{}
|
||||
|
||||
if _, err := io.ReadFull(r, c.PaymentHash[:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if _, err := io.ReadFull(r, scratch[:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.Value = lnwire.MilliSatoshi(byteOrder.Uint64(scratch[:]))
|
||||
|
||||
if _, err := io.ReadFull(r, scratch[:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.CreationTime = time.Unix(int64(byteOrder.Uint64(scratch[:])), 0)
|
||||
|
||||
if _, err := io.ReadFull(r, scratch[:4]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
reqLen := byteOrder.Uint32(scratch[:4])
|
||||
payReq := make([]byte, reqLen)
|
||||
if reqLen > 0 {
|
||||
if _, err := io.ReadFull(r, payReq); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
c.PaymentRequest = payReq
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func fetchDuplicatePayment(bucket *bbolt.Bucket) (*MPPayment, error) {
|
||||
seqBytes := bucket.Get(duplicatePaymentSequenceKey)
|
||||
if seqBytes == nil {
|
||||
return nil, fmt.Errorf("sequence number not found")
|
||||
}
|
||||
|
||||
sequenceNum := binary.BigEndian.Uint64(seqBytes)
|
||||
|
||||
// Get the payment status.
|
||||
paymentStatus := fetchDuplicatePaymentStatus(bucket)
|
||||
|
||||
// Get the PaymentCreationInfo.
|
||||
b := bucket.Get(duplicatePaymentCreationInfoKey)
|
||||
if b == nil {
|
||||
return nil, fmt.Errorf("creation info not found")
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
creationInfo, err := deserializeDuplicatePaymentCreationInfo(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
}
|
||||
|
||||
// Get failure reason if available.
|
||||
var failureReason *FailureReason
|
||||
b = bucket.Get(duplicatePaymentFailInfoKey)
|
||||
if b != nil {
|
||||
reason := FailureReason(b[0])
|
||||
failureReason = &reason
|
||||
}
|
||||
|
||||
payment := &MPPayment{
|
||||
sequenceNum: sequenceNum,
|
||||
Info: creationInfo,
|
||||
FailureReason: failureReason,
|
||||
Status: paymentStatus,
|
||||
}
|
||||
|
||||
// Get the HTLCAttemptInfo. It can be absent.
|
||||
b = bucket.Get(duplicatePaymentAttemptInfoKey)
|
||||
if b != nil {
|
||||
r = bytes.NewReader(b)
|
||||
attempt, err := deserializeDuplicateHTLCAttemptInfo(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
htlc := HTLCAttempt{
|
||||
HTLCAttemptInfo: HTLCAttemptInfo{
|
||||
AttemptID: attempt.attemptID,
|
||||
Route: attempt.route,
|
||||
SessionKey: attempt.sessionKey,
|
||||
},
|
||||
}
|
||||
|
||||
// Get the payment preimage. This is only found for
|
||||
// successful payments.
|
||||
b = bucket.Get(duplicatePaymentSettleInfoKey)
|
||||
if b != nil {
|
||||
var preimg lntypes.Preimage
|
||||
copy(preimg[:], b)
|
||||
|
||||
htlc.Settle = &HTLCSettleInfo{
|
||||
Preimage: preimg,
|
||||
SettleTime: time.Time{},
|
||||
}
|
||||
} else {
|
||||
// Otherwise the payment must have failed.
|
||||
htlc.Failure = &HTLCFailInfo{
|
||||
FailTime: time.Time{},
|
||||
}
|
||||
}
|
||||
|
||||
payment.HTLCs = []HTLCAttempt{htlc}
|
||||
}
|
||||
|
||||
return payment, nil
|
||||
}
|
||||
|
||||
func fetchDuplicatePayments(paymentHashBucket *bbolt.Bucket) ([]*MPPayment,
|
||||
error) {
|
||||
|
||||
var payments []*MPPayment
|
||||
|
||||
// For older versions of lnd, duplicate payments to a payment has was
|
||||
// possible. These will be found in a sub-bucket indexed by their
|
||||
// sequence number if available.
|
||||
dup := paymentHashBucket.Bucket(duplicatePaymentsBucket)
|
||||
if dup == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
err := dup.ForEach(func(k, v []byte) error {
|
||||
subBucket := dup.Bucket(k)
|
||||
if subBucket == nil {
|
||||
// We one bucket for each duplicate to be found.
|
||||
return fmt.Errorf("non bucket element" +
|
||||
"in duplicate bucket")
|
||||
}
|
||||
|
||||
p, err := fetchDuplicatePayment(subBucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
payments = append(payments, p)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return payments, nil
|
||||
}
|
@ -4,6 +4,7 @@ import (
|
||||
"github.com/btcsuite/btclog"
|
||||
"github.com/lightningnetwork/lnd/build"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration12"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration13"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration_01_to_11"
|
||||
)
|
||||
|
||||
@ -29,4 +30,5 @@ func UseLogger(logger btclog.Logger) {
|
||||
log = logger
|
||||
migration_01_to_11.UseLogger(logger)
|
||||
migration12.UseLogger(logger)
|
||||
migration13.UseLogger(logger)
|
||||
}
|
||||
|
14
channeldb/migration13/log.go
Normal file
14
channeldb/migration13/log.go
Normal file
@ -0,0 +1,14 @@
|
||||
package migration13
|
||||
|
||||
import (
|
||||
"github.com/btcsuite/btclog"
|
||||
)
|
||||
|
||||
// log is a logger that is initialized as disabled. This means the package will
|
||||
// not perform any logging by default until a logger is set.
|
||||
var log = btclog.Disabled
|
||||
|
||||
// UseLogger uses a specified Logger to output package logging info.
|
||||
func UseLogger(logger btclog.Logger) {
|
||||
log = logger
|
||||
}
|
202
channeldb/migration13/migration.go
Normal file
202
channeldb/migration13/migration.go
Normal file
@ -0,0 +1,202 @@
|
||||
package migration13
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
|
||||
"github.com/coreos/bbolt"
|
||||
)
|
||||
|
||||
var (
|
||||
paymentsRootBucket = []byte("payments-root-bucket")
|
||||
|
||||
// paymentCreationInfoKey is a key used in the payment's sub-bucket to
|
||||
// store the creation info of the payment.
|
||||
paymentCreationInfoKey = []byte("payment-creation-info")
|
||||
|
||||
// paymentFailInfoKey is a key used in the payment's sub-bucket to
|
||||
// store information about the reason a payment failed.
|
||||
paymentFailInfoKey = []byte("payment-fail-info")
|
||||
|
||||
// paymentAttemptInfoKey is a key used in the payment's sub-bucket to
|
||||
// store the info about the latest attempt that was done for the
|
||||
// payment in question.
|
||||
paymentAttemptInfoKey = []byte("payment-attempt-info")
|
||||
|
||||
// paymentSettleInfoKey is a key used in the payment's sub-bucket to
|
||||
// store the settle info of the payment.
|
||||
paymentSettleInfoKey = []byte("payment-settle-info")
|
||||
|
||||
// paymentHtlcsBucket is a bucket where we'll store the information
|
||||
// about the HTLCs that were attempted for a payment.
|
||||
paymentHtlcsBucket = []byte("payment-htlcs-bucket")
|
||||
|
||||
// htlcAttemptInfoKey is a key used in a HTLC's sub-bucket to store the
|
||||
// info about the attempt that was done for the HTLC in question.
|
||||
htlcAttemptInfoKey = []byte("htlc-attempt-info")
|
||||
|
||||
// htlcSettleInfoKey is a key used in a HTLC's sub-bucket to store the
|
||||
// settle info, if any.
|
||||
htlcSettleInfoKey = []byte("htlc-settle-info")
|
||||
|
||||
// htlcFailInfoKey is a key used in a HTLC's sub-bucket to store
|
||||
// failure information, if any.
|
||||
htlcFailInfoKey = []byte("htlc-fail-info")
|
||||
|
||||
byteOrder = binary.BigEndian
|
||||
)
|
||||
|
||||
// MigrateMPP migrates the payments to a new structure that accommodates for mpp
|
||||
// payments.
|
||||
func MigrateMPP(tx *bbolt.Tx) error {
|
||||
log.Infof("Migrating payments to mpp structure")
|
||||
|
||||
// Iterate over all payments and store their indexing keys. This is
|
||||
// needed, because no modifications are allowed inside a Bucket.ForEach
|
||||
// loop.
|
||||
paymentsBucket := tx.Bucket(paymentsRootBucket)
|
||||
if paymentsBucket == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
var paymentKeys [][]byte
|
||||
err := paymentsBucket.ForEach(func(k, v []byte) error {
|
||||
paymentKeys = append(paymentKeys, k)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// With all keys retrieved, start the migration.
|
||||
for _, k := range paymentKeys {
|
||||
bucket := paymentsBucket.Bucket(k)
|
||||
|
||||
// We only expect sub-buckets to be found in
|
||||
// this top-level bucket.
|
||||
if bucket == nil {
|
||||
return fmt.Errorf("non bucket element in " +
|
||||
"payments bucket")
|
||||
}
|
||||
|
||||
// Fetch old format creation info.
|
||||
creationInfo := bucket.Get(paymentCreationInfoKey)
|
||||
if creationInfo == nil {
|
||||
return fmt.Errorf("creation info not found")
|
||||
}
|
||||
|
||||
// Make a copy because bbolt doesn't allow this value to be
|
||||
// changed in-place.
|
||||
newCreationInfo := make([]byte, len(creationInfo))
|
||||
copy(newCreationInfo, creationInfo)
|
||||
|
||||
// Convert to nano seconds.
|
||||
timeBytes := newCreationInfo[32+8 : 32+8+8]
|
||||
time := byteOrder.Uint64(timeBytes)
|
||||
timeNs := time * 1000000000
|
||||
byteOrder.PutUint64(timeBytes, timeNs)
|
||||
|
||||
// Write back new format creation info.
|
||||
err := bucket.Put(paymentCreationInfoKey, newCreationInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// No migration needed if there is no attempt stored.
|
||||
attemptInfo := bucket.Get(paymentAttemptInfoKey)
|
||||
if attemptInfo == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// Delete attempt info on the payment level.
|
||||
if err := bucket.Delete(paymentAttemptInfoKey); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Save attempt id for later use.
|
||||
attemptID := attemptInfo[:8]
|
||||
|
||||
// Discard attempt id. It will become a bucket key in the new
|
||||
// structure.
|
||||
attemptInfo = attemptInfo[8:]
|
||||
|
||||
// Append unknown (zero) attempt time.
|
||||
var zero [8]byte
|
||||
attemptInfo = append(attemptInfo, zero[:]...)
|
||||
|
||||
// Create bucket that contains all htlcs.
|
||||
htlcsBucket, err := bucket.CreateBucket(paymentHtlcsBucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create an htlc for this attempt.
|
||||
htlcBucket, err := htlcsBucket.CreateBucket(attemptID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Save migrated attempt info.
|
||||
err = htlcBucket.Put(htlcAttemptInfoKey, attemptInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Migrate settle info.
|
||||
settleInfo := bucket.Get(paymentSettleInfoKey)
|
||||
if settleInfo != nil {
|
||||
// Payment-level settle info can be deleted.
|
||||
err := bucket.Delete(paymentSettleInfoKey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Append unknown (zero) settle time.
|
||||
settleInfo = append(settleInfo, zero[:]...)
|
||||
|
||||
// Save settle info.
|
||||
err = htlcBucket.Put(htlcSettleInfoKey, settleInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Migration for settled htlc completed.
|
||||
continue
|
||||
}
|
||||
|
||||
// If there is no payment-level failure reason, the payment is
|
||||
// still in flight and nothing else needs to be migrated.
|
||||
// Otherwise the payment-level failure reason can remain
|
||||
// unchanged.
|
||||
inFlight := bucket.Get(paymentFailInfoKey) == nil
|
||||
if inFlight {
|
||||
continue
|
||||
}
|
||||
|
||||
// The htlc failed. Add htlc fail info with reason unknown. We
|
||||
// don't have access to the original failure reason anymore.
|
||||
failInfo := []byte{
|
||||
// Fail time unknown.
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
|
||||
// Zero length wire message.
|
||||
0,
|
||||
|
||||
// Failure reason unknown.
|
||||
0,
|
||||
|
||||
// Failure source index zero.
|
||||
0, 0, 0, 0,
|
||||
}
|
||||
|
||||
// Save fail info.
|
||||
err = htlcBucket.Put(htlcFailInfoKey, failInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
log.Infof("Migration of payments to mpp structure complete!")
|
||||
|
||||
return nil
|
||||
}
|
123
channeldb/migration13/migration_test.go
Normal file
123
channeldb/migration13/migration_test.go
Normal file
@ -0,0 +1,123 @@
|
||||
package migration13
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/coreos/bbolt"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migtest"
|
||||
)
|
||||
|
||||
var (
|
||||
hex = migtest.Hex
|
||||
|
||||
zeroTime = hex("0000000000000000")
|
||||
noFailureMessage = hex("00")
|
||||
failureReasonUnknown = hex("00")
|
||||
zeroFailureSourceIdx = hex("00000000")
|
||||
|
||||
hash1 = hex("02acee76ebd53d00824410cf6adecad4f50334dac702bd5a2d3ba01b91709f0e")
|
||||
creationInfoAmt1 = hex("00000000004c4b40")
|
||||
creationInfoTime1 = hex("000000005e4fb7ab") // 1582282667 (decimal)
|
||||
creationInfoTimeNano1 = hex("15f565b3cccaee00") // 1582282667000000000 (decimal)
|
||||
creationInfoPayReq1 = hex("00000000")
|
||||
attemptInfo1 = hex("2997a72e129fc9d638ef2fa4e233567d808d4f18a4f087637582427962eb3bf800005ce600000000004c4b402102ec12e83eafe27ce6d03bbe0c0de4b79fe2b9934615c8aa7693f73d2e41b089700000000121028c2dd128c7a6c1a0fceb3e3eb5ed55e0a0ae1a939eb786b097322d830d47db75005ca4000001000000005ce600000000004c4b400000000000")
|
||||
attemptID1 = hex("0000000000000001")
|
||||
paymentID1 = hex("0000000000000001")
|
||||
|
||||
hash2 = hex("62eb3f0a48f954e495d0c14ac63df04a67cefa59dafdbcd3d5046d1f5647840c")
|
||||
preimage2 = hex("479593b7d3cbb45beb22d448451a2f3619b2095adfb38f4d92e9886e96534368")
|
||||
attemptID2 = hex("00000000000003e8")
|
||||
paymentID2 = hex("0000000000000002")
|
||||
attemptInfo2 = hex("8de663f9bb4b8d1ebdb496d22dc1cb657a346215607308549f41b01e2adf2ce900005ce600000000005b8d802102ec12e83eafe27ce6d03bbe0c0de4b79fe2b9934615c8aa7693f73d2e41b089700000000121028c2dd128c7a6c1a0fceb3e3eb5ed55e0a0ae1a939eb786b097322d830d47db75005ca4000001000000005ce600000000005b8d8000000000010000000000000008233d281e2cbe01f0b82dd6750967c9233426b98ae6549c696365f57f86f942a3795b8d80")
|
||||
creationInfoAmt2 = hex("00000000005b8d80")
|
||||
creationInfoTime2 = hex("000000005e4fb97f") // 1582283135 (decimal)
|
||||
creationInfoTimeNano2 = hex("15F56620C3C43600") // 1582283135000000000 (decimal)
|
||||
creationInfoPayReq2 = hex("000000fc6c6e62637274363075317030796c7774367070357674346e377a6a676c39327766397773633939767630307366666e7561376a656d74376d6535373471336b3337346a387373787164717163717a70677370353835357075743937713863747374776b7735796b306a667278736e746e7a6878326a77786a636d3937346c636437327a3564757339717939717371653872336b3578733379367868667366366d6a6e706d717172306661797a677a63336a6b663571787a6c376866787a6666763578667a7679647564327275767974706571787072376868796830726a747574373033333274737774686661616e303773766b6667716b7174667275")
|
||||
|
||||
hash3 = hex("62eb3f0a48f954e495d0c14ac63df04a67cefa59dafdbcd3d5046d1f5647840d")
|
||||
attemptInfo3 = hex("53ce0a4c1507cc5ea00ec88b76bd43a3978ac13605497030b821af6ce9c110f300005ce600000000006acfc02102ec12e83eafe27ce6d03bbe0c0de4b79fe2b9934615c8aa7693f73d2e41b089700000000121028c2dd128c7a6c1a0fceb3e3eb5ed55e0a0ae1a939eb786b097322d830d47db75005ca4000001000000005ce600000000006acfc000000000010000000000000008233044f235354472318b381fad3e21eb5a58f5099918868b0610e7b7bcb7a4adc96acfc0")
|
||||
attemptID3 = hex("00000000000003e9")
|
||||
paymentID3 = hex("0000000000000003")
|
||||
creationInfoAmt3 = hex("00000000006acfc0")
|
||||
creationInfoTime3 = hex("000000005e4fb98d") // 1582283149
|
||||
creationInfoTimeNano3 = hex("15F56624063B4200") // 1582283149000000000 (decimal)
|
||||
creationInfoPayReq3 = hex("000000fc6c6e62637274373075317030796c7776327070357674346e377a6a676c39327766397773633939767630307366666e7561376a656d74376d6535373471336b3337346a387373787364717163717a706773703578707a307964663467336572727a656372376b6e7567307474667630327a7665727a72676b70737375376d6d6564617934687973397179397173717774656479336e666c323534787a36787a75763974746767757a647473356e617a7461616a6735667772686438396b336d70753971726d7a6c3779637a306e30666e6e763077753032726632706e64636c393761646c667636376a7a6e7063677477356434366771323571326e32")
|
||||
|
||||
// pre is the data in the payments root bucket in database version 12 format.
|
||||
pre = map[string]interface{}{
|
||||
// A failed payment.
|
||||
hash1: map[string]interface{}{
|
||||
"payment-attempt-info": attemptID1 + attemptInfo1,
|
||||
"payment-creation-info": hash1 + creationInfoAmt1 + creationInfoTime1 + creationInfoPayReq1,
|
||||
"payment-fail-info": hex("03"),
|
||||
"payment-sequence-key": paymentID1,
|
||||
},
|
||||
|
||||
// A settled payment.
|
||||
hash2: map[string]interface{}{
|
||||
"payment-attempt-info": attemptID2 + attemptInfo2,
|
||||
"payment-creation-info": hash2 + creationInfoAmt2 + creationInfoTime2 + creationInfoPayReq2,
|
||||
"payment-sequence-key": paymentID2,
|
||||
"payment-settle-info": preimage2,
|
||||
},
|
||||
|
||||
// An in-flight payment.
|
||||
hash3: map[string]interface{}{
|
||||
"payment-attempt-info": attemptID3 + attemptInfo3,
|
||||
"payment-creation-info": hash3 + creationInfoAmt3 + creationInfoTime3 + creationInfoPayReq3,
|
||||
"payment-sequence-key": paymentID3,
|
||||
},
|
||||
}
|
||||
|
||||
// post is the expected data after migration.
|
||||
post = map[string]interface{}{
|
||||
hash1: map[string]interface{}{
|
||||
"payment-creation-info": hash1 + creationInfoAmt1 + creationInfoTimeNano1 + creationInfoPayReq1,
|
||||
"payment-fail-info": hex("03"),
|
||||
"payment-htlcs-bucket": map[string]interface{}{
|
||||
attemptID1: map[string]interface{}{
|
||||
"htlc-attempt-info": attemptInfo1 + zeroTime,
|
||||
"htlc-fail-info": zeroTime + noFailureMessage + failureReasonUnknown + zeroFailureSourceIdx,
|
||||
},
|
||||
},
|
||||
"payment-sequence-key": paymentID1,
|
||||
},
|
||||
hash2: map[string]interface{}{
|
||||
"payment-creation-info": hash2 + creationInfoAmt2 + creationInfoTimeNano2 + creationInfoPayReq2,
|
||||
"payment-htlcs-bucket": map[string]interface{}{
|
||||
attemptID2: map[string]interface{}{
|
||||
"htlc-attempt-info": attemptInfo2 + zeroTime,
|
||||
"htlc-settle-info": preimage2 + zeroTime,
|
||||
},
|
||||
},
|
||||
"payment-sequence-key": paymentID2,
|
||||
},
|
||||
hash3: map[string]interface{}{
|
||||
"payment-creation-info": hash3 + creationInfoAmt3 + creationInfoTimeNano3 + creationInfoPayReq3,
|
||||
"payment-htlcs-bucket": map[string]interface{}{
|
||||
attemptID3: map[string]interface{}{
|
||||
"htlc-attempt-info": attemptInfo3 + zeroTime,
|
||||
},
|
||||
},
|
||||
"payment-sequence-key": paymentID3,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
// TestMigrateMpp asserts that the database is properly migrated to the mpp
|
||||
// payment structure.
|
||||
func TestMigrateMpp(t *testing.T) {
|
||||
var paymentsRootBucket = []byte("payments-root-bucket")
|
||||
|
||||
migtest.ApplyMigration(
|
||||
t,
|
||||
func(tx *bbolt.Tx) error {
|
||||
return migtest.RestoreDB(tx, paymentsRootBucket, pre)
|
||||
},
|
||||
func(tx *bbolt.Tx) error {
|
||||
return migtest.VerifyDB(tx, paymentsRootBucket, post)
|
||||
},
|
||||
MigrateMPP,
|
||||
false,
|
||||
)
|
||||
}
|
@ -7,32 +7,30 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/coreos/bbolt"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
)
|
||||
|
||||
// MakeDB creates a new instance of the ChannelDB for testing purposes. A
|
||||
// callback which cleans up the created temporary directories is also returned
|
||||
// and intended to be executed after the test completes.
|
||||
func MakeDB() (*channeldb.DB, func(), error) {
|
||||
// First, create a temporary directory to be used for the duration of
|
||||
// this test.
|
||||
tempDirName, err := ioutil.TempDir("", "channeldb")
|
||||
func MakeDB() (*bbolt.DB, func(), error) {
|
||||
// Create temporary database for mission control.
|
||||
file, err := ioutil.TempFile("", "*.db")
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
// Next, create channeldb for the first time.
|
||||
cdb, err := channeldb.Open(tempDirName)
|
||||
dbPath := file.Name()
|
||||
db, err := bbolt.Open(dbPath, 0600, nil)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
cleanUp := func() {
|
||||
cdb.Close()
|
||||
os.RemoveAll(tempDirName)
|
||||
db.Close()
|
||||
os.RemoveAll(dbPath)
|
||||
}
|
||||
|
||||
return cdb, cleanUp, nil
|
||||
return db, cleanUp, nil
|
||||
}
|
||||
|
||||
// ApplyMigration is a helper test function that encapsulates the general steps
|
||||
|
187
channeldb/migtest/raw_db.go
Normal file
187
channeldb/migtest/raw_db.go
Normal file
@ -0,0 +1,187 @@
|
||||
package migtest
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/coreos/bbolt"
|
||||
)
|
||||
|
||||
// DumpDB dumps go code describing the contents of the database to stdout. This
|
||||
// function is only intended for use during development.
|
||||
//
|
||||
// Example output:
|
||||
//
|
||||
// map[string]interface{}{
|
||||
// hex("1234"): map[string]interface{}{
|
||||
// "human-readable": hex("102030"),
|
||||
// hex("1111"): hex("5783492373"),
|
||||
// },
|
||||
// }
|
||||
func DumpDB(tx *bbolt.Tx, rootKey []byte) error {
|
||||
bucket := tx.Bucket(rootKey)
|
||||
if bucket == nil {
|
||||
return fmt.Errorf("bucket %v not found", string(rootKey))
|
||||
}
|
||||
|
||||
return dumpBucket(bucket)
|
||||
}
|
||||
|
||||
func dumpBucket(bucket *bbolt.Bucket) error {
|
||||
fmt.Printf("map[string]interface{} {\n")
|
||||
err := bucket.ForEach(func(k, v []byte) error {
|
||||
key := toString(k)
|
||||
fmt.Printf("%v: ", key)
|
||||
|
||||
subBucket := bucket.Bucket(k)
|
||||
if subBucket != nil {
|
||||
err := dumpBucket(subBucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
fmt.Print(toHex(v))
|
||||
}
|
||||
fmt.Printf(",\n")
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("}")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RestoreDB primes the database with the given data set.
|
||||
func RestoreDB(tx *bbolt.Tx, rootKey []byte, data map[string]interface{}) error {
|
||||
bucket, err := tx.CreateBucket(rootKey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return restoreDB(bucket, data)
|
||||
}
|
||||
|
||||
func restoreDB(bucket *bbolt.Bucket, data map[string]interface{}) error {
|
||||
for k, v := range data {
|
||||
key := []byte(k)
|
||||
|
||||
switch value := v.(type) {
|
||||
|
||||
// Key contains value.
|
||||
case string:
|
||||
err := bucket.Put(key, []byte(value))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Key contains a sub-bucket.
|
||||
case map[string]interface{}:
|
||||
subBucket, err := bucket.CreateBucket(key)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := restoreDB(subBucket, value); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
default:
|
||||
return errors.New("invalid type")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// VerifyDB verifies the database against the given data set.
|
||||
func VerifyDB(tx *bbolt.Tx, rootKey []byte, data map[string]interface{}) error {
|
||||
bucket := tx.Bucket(rootKey)
|
||||
if bucket == nil {
|
||||
return fmt.Errorf("bucket %v not found", string(rootKey))
|
||||
}
|
||||
|
||||
return verifyDB(bucket, data)
|
||||
}
|
||||
|
||||
func verifyDB(bucket *bbolt.Bucket, data map[string]interface{}) error {
|
||||
for k, v := range data {
|
||||
key := []byte(k)
|
||||
|
||||
switch value := v.(type) {
|
||||
|
||||
// Key contains value.
|
||||
case string:
|
||||
expectedValue := []byte(value)
|
||||
dbValue := bucket.Get(key)
|
||||
|
||||
if !bytes.Equal(dbValue, expectedValue) {
|
||||
return errors.New("value mismatch")
|
||||
}
|
||||
|
||||
// Key contains a sub-bucket.
|
||||
case map[string]interface{}:
|
||||
subBucket := bucket.Bucket(key)
|
||||
if subBucket == nil {
|
||||
return fmt.Errorf("bucket %v not found", k)
|
||||
}
|
||||
|
||||
err := verifyDB(subBucket, value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
default:
|
||||
return errors.New("invalid type")
|
||||
}
|
||||
}
|
||||
|
||||
keyCount := 0
|
||||
err := bucket.ForEach(func(k, v []byte) error {
|
||||
keyCount++
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if keyCount != len(data) {
|
||||
return errors.New("unexpected keys in database")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func toHex(v []byte) string {
|
||||
if len(v) == 0 {
|
||||
return "nil"
|
||||
}
|
||||
|
||||
return "hex(\"" + hex.EncodeToString(v) + "\")"
|
||||
}
|
||||
|
||||
func toString(v []byte) string {
|
||||
readableChars := "abcdefghijklmnopqrstuvwxyz0123456789-"
|
||||
|
||||
for _, c := range v {
|
||||
if !strings.Contains(readableChars, string(c)) {
|
||||
return toHex(v)
|
||||
}
|
||||
}
|
||||
|
||||
return "\"" + string(v) + "\""
|
||||
}
|
||||
|
||||
// Hex is a test helper function to convert readable hex arrays to raw byte
|
||||
// strings.
|
||||
func Hex(value string) string {
|
||||
b, err := hex.DecodeString(value)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return string(b)
|
||||
}
|
@ -1,40 +1,26 @@
|
||||
package channeldb
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"github.com/btcsuite/btcd/btcec"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"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
|
||||
// HTLCAttemptInfo contains static information about a specific HTLC attempt
|
||||
// for a 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 the attempt.
|
||||
type HTLCAttemptInfo struct {
|
||||
// AttemptID is the unique ID used for this attempt.
|
||||
AttemptID uint64
|
||||
|
||||
// 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 is the ephemeral key used for this attempt.
|
||||
SessionKey *btcec.PrivateKey
|
||||
|
||||
// Route is the route attempted to send the HTLC.
|
||||
@ -42,6 +28,13 @@ type HTLCAttempt struct {
|
||||
|
||||
// AttemptTime is the time at which this HTLC was attempted.
|
||||
AttemptTime time.Time
|
||||
}
|
||||
|
||||
// HTLCAttempt contains information about a specific HTLC attempt for a given
|
||||
// payment. It contains the HTLCAttemptInfo used to send the HTLC, as well
|
||||
// as a timestamp and any known outcome of the attempt.
|
||||
type HTLCAttempt struct {
|
||||
HTLCAttemptInfo
|
||||
|
||||
// Settle is the preimage of a successful payment. This serves as a
|
||||
// proof of payment. It will only be non-nil for settled payments.
|
||||
@ -67,15 +60,49 @@ type HTLCSettleInfo struct {
|
||||
SettleTime time.Time
|
||||
}
|
||||
|
||||
// HTLCFailReason is the reason an htlc failed.
|
||||
type HTLCFailReason byte
|
||||
|
||||
const (
|
||||
// HTLCFailUnknown is recorded for htlcs that failed with an unknown
|
||||
// reason.
|
||||
HTLCFailUnknown HTLCFailReason = 0
|
||||
|
||||
// HTLCFailUnknown is recorded for htlcs that had a failure message that
|
||||
// couldn't be decrypted.
|
||||
HTLCFailUnreadable HTLCFailReason = 1
|
||||
|
||||
// HTLCFailInternal is recorded for htlcs that failed because of an
|
||||
// internal error.
|
||||
HTLCFailInternal HTLCFailReason = 2
|
||||
|
||||
// HTLCFailMessage is recorded for htlcs that failed with a network
|
||||
// failure message.
|
||||
HTLCFailMessage HTLCFailReason = 3
|
||||
)
|
||||
|
||||
// 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
|
||||
|
||||
// Message is the wire message that failed this HTLC. This field will be
|
||||
// populated when the failure reason is HTLCFailMessage.
|
||||
Message lnwire.FailureMessage
|
||||
|
||||
// Reason is the failure reason for this HTLC.
|
||||
Reason HTLCFailReason
|
||||
|
||||
// The position in the path of the intermediate or final node that
|
||||
// generated the failure message. Position zero is the sender node. This
|
||||
// field will be populated when the failure reason is either
|
||||
// HTLCFailMessage or HTLCFailUnknown.
|
||||
FailureSourceIndex uint32
|
||||
}
|
||||
|
||||
// MPPayment is a wrapper around a payment's MPPaymentCreationInfo and
|
||||
// HTLCAttempts. All payments will have the MPPPaymentCreationInfo set, any
|
||||
// MPPayment is a wrapper around a payment's PaymentCreationInfo and
|
||||
// HTLCAttempts. All payments will have the PaymentCreationInfo 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
|
||||
@ -87,7 +114,7 @@ type MPPayment struct {
|
||||
|
||||
// Info holds all static information about this payment, and is
|
||||
// populated when the payment is initiated.
|
||||
Info *MPPaymentCreationInfo
|
||||
Info *PaymentCreationInfo
|
||||
|
||||
// HTLCs holds the information about individual HTLCs that we send in
|
||||
// order to make the payment.
|
||||
@ -103,3 +130,124 @@ type MPPayment struct {
|
||||
// Status is the current PaymentStatus of this payment.
|
||||
Status PaymentStatus
|
||||
}
|
||||
|
||||
// serializeHTLCSettleInfo serializes the details of a settled htlc.
|
||||
func serializeHTLCSettleInfo(w io.Writer, s *HTLCSettleInfo) error {
|
||||
if _, err := w.Write(s.Preimage[:]); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := serializeTime(w, s.SettleTime); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// deserializeHTLCSettleInfo deserializes the details of a settled htlc.
|
||||
func deserializeHTLCSettleInfo(r io.Reader) (*HTLCSettleInfo, error) {
|
||||
s := &HTLCSettleInfo{}
|
||||
if _, err := io.ReadFull(r, s.Preimage[:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var err error
|
||||
s.SettleTime, err = deserializeTime(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// serializeHTLCFailInfo serializes the details of a failed htlc including the
|
||||
// wire failure.
|
||||
func serializeHTLCFailInfo(w io.Writer, f *HTLCFailInfo) error {
|
||||
if err := serializeTime(w, f.FailTime); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Write failure. If there is no failure message, write an empty
|
||||
// byte slice.
|
||||
var messageBytes bytes.Buffer
|
||||
if f.Message != nil {
|
||||
err := lnwire.EncodeFailureMessage(&messageBytes, f.Message, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := wire.WriteVarBytes(w, 0, messageBytes.Bytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return WriteElements(w, byte(f.Reason), f.FailureSourceIndex)
|
||||
}
|
||||
|
||||
// deserializeHTLCFailInfo deserializes the details of a failed htlc including
|
||||
// the wire failure.
|
||||
func deserializeHTLCFailInfo(r io.Reader) (*HTLCFailInfo, error) {
|
||||
f := &HTLCFailInfo{}
|
||||
var err error
|
||||
f.FailTime, err = deserializeTime(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Read failure.
|
||||
failureBytes, err := wire.ReadVarBytes(
|
||||
r, 0, lnwire.FailureMessageLength, "failure",
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(failureBytes) > 0 {
|
||||
f.Message, err = lnwire.DecodeFailureMessage(
|
||||
bytes.NewReader(failureBytes), 0,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
var reason byte
|
||||
err = ReadElements(r, &reason, &f.FailureSourceIndex)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f.Reason = HTLCFailReason(reason)
|
||||
|
||||
return f, nil
|
||||
}
|
||||
|
||||
// deserializeTime deserializes time as unix nanoseconds.
|
||||
func deserializeTime(r io.Reader) (time.Time, error) {
|
||||
var scratch [8]byte
|
||||
if _, err := io.ReadFull(r, scratch[:]); err != nil {
|
||||
return time.Time{}, err
|
||||
}
|
||||
|
||||
// Convert to time.Time. Interpret unix nano time zero as a zero
|
||||
// time.Time value.
|
||||
unixNano := byteOrder.Uint64(scratch[:])
|
||||
if unixNano == 0 {
|
||||
return time.Time{}, nil
|
||||
}
|
||||
|
||||
return time.Unix(0, int64(unixNano)), nil
|
||||
}
|
||||
|
||||
// serializeTime serializes time as unix nanoseconds.
|
||||
func serializeTime(w io.Writer, t time.Time) error {
|
||||
var scratch [8]byte
|
||||
|
||||
// Convert to unix nano seconds, but only if time is non-zero. Calling
|
||||
// UnixNano() on a zero time yields an undefined result.
|
||||
var unixNano int64
|
||||
if !t.IsZero() {
|
||||
unixNano = t.UnixNano()
|
||||
}
|
||||
|
||||
byteOrder.PutUint64(scratch[:], uint64(unixNano))
|
||||
_, err := w.Write(scratch[:])
|
||||
return err
|
||||
}
|
||||
|
@ -76,7 +76,10 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash,
|
||||
}
|
||||
|
||||
// Get the existing status of this payment, if any.
|
||||
paymentStatus := fetchPaymentStatus(bucket)
|
||||
paymentStatus, err := fetchPaymentStatus(bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch paymentStatus {
|
||||
|
||||
@ -124,11 +127,11 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash,
|
||||
return err
|
||||
}
|
||||
|
||||
// We'll delete any lingering attempt info to start with, in
|
||||
// case we are initializing a payment that was attempted
|
||||
// earlier, but left in a state where we could retry.
|
||||
err = bucket.Delete(paymentAttemptInfoKey)
|
||||
if err != nil {
|
||||
// We'll delete any lingering HTLCs to start with, in case we
|
||||
// are initializing a payment that was attempted earlier, but
|
||||
// left in a state where we could retry.
|
||||
err = bucket.DeleteBucket(paymentHtlcsBucket)
|
||||
if err != nil && err != bbolt.ErrBucketNotFound {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -143,83 +146,120 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash,
|
||||
return updateErr
|
||||
}
|
||||
|
||||
// RegisterAttempt atomically records the provided PaymentAttemptInfo to the
|
||||
// RegisterAttempt atomically records the provided HTLCAttemptInfo to the
|
||||
// DB.
|
||||
func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash,
|
||||
attempt *PaymentAttemptInfo) error {
|
||||
attempt *HTLCAttemptInfo) error {
|
||||
|
||||
// Serialize the information before opening the db transaction.
|
||||
var a bytes.Buffer
|
||||
if err := serializePaymentAttemptInfo(&a, attempt); err != nil {
|
||||
err := serializeHTLCAttemptInfo(&a, attempt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
attemptBytes := a.Bytes()
|
||||
htlcInfoBytes := a.Bytes()
|
||||
|
||||
var updateErr error
|
||||
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
|
||||
htlcIDBytes := make([]byte, 8)
|
||||
binary.BigEndian.PutUint64(htlcIDBytes, attempt.AttemptID)
|
||||
|
||||
return p.db.Update(func(tx *bbolt.Tx) error {
|
||||
// Get the payment bucket to register this new attempt in.
|
||||
bucket, err := fetchPaymentBucket(tx, paymentHash)
|
||||
if err == ErrPaymentNotInitiated {
|
||||
updateErr = ErrPaymentNotInitiated
|
||||
return nil
|
||||
} else if err != nil {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// We can only register attempts for payments that are
|
||||
// in-flight.
|
||||
if err := ensureInFlight(bucket); err != nil {
|
||||
updateErr = err
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
|
||||
// Add the payment attempt to the payments bucket.
|
||||
return bucket.Put(paymentAttemptInfoKey, attemptBytes)
|
||||
})
|
||||
htlcsBucket, err := bucket.CreateBucketIfNotExists(
|
||||
paymentHtlcsBucket,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return updateErr
|
||||
}
|
||||
|
||||
// Success transitions a payment into the Succeeded state. After invoking this
|
||||
// method, InitPayment should always return an error to prevent us from making
|
||||
// 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) (*MPPayment, error) {
|
||||
|
||||
var (
|
||||
updateErr error
|
||||
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 {
|
||||
updateErr = ErrPaymentNotInitiated
|
||||
return nil
|
||||
} else if err != nil {
|
||||
// Create bucket for this attempt. Fail if the bucket already
|
||||
// exists.
|
||||
htlcBucket, err := htlcsBucket.CreateBucket(htlcIDBytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// We can only mark in-flight payments as succeeded.
|
||||
if err := ensureInFlight(bucket); err != nil {
|
||||
updateErr = err
|
||||
return nil
|
||||
return htlcBucket.Put(htlcAttemptInfoKey, htlcInfoBytes)
|
||||
})
|
||||
}
|
||||
|
||||
// SettleAttempt marks the given attempt settled with the preimage. If this is
|
||||
// a multi shard payment, this might implicitly mean that the full payment
|
||||
// succeeded.
|
||||
//
|
||||
// After invoking this method, InitPayment should always return an error to
|
||||
// prevent us from making duplicate payments to the same payment hash. The
|
||||
// provided preimage is atomically saved to the DB for record keeping.
|
||||
func (p *PaymentControl) SettleAttempt(hash lntypes.Hash,
|
||||
attemptID uint64, settleInfo *HTLCSettleInfo) (*MPPayment, error) {
|
||||
|
||||
var b bytes.Buffer
|
||||
if err := serializeHTLCSettleInfo(&b, settleInfo); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
settleBytes := b.Bytes()
|
||||
|
||||
return p.updateHtlcKey(hash, attemptID, htlcSettleInfoKey, settleBytes)
|
||||
}
|
||||
|
||||
// FailAttempt marks the given payment attempt failed.
|
||||
func (p *PaymentControl) FailAttempt(hash lntypes.Hash,
|
||||
attemptID uint64, failInfo *HTLCFailInfo) error {
|
||||
|
||||
var b bytes.Buffer
|
||||
if err := serializeHTLCFailInfo(&b, failInfo); err != nil {
|
||||
return err
|
||||
}
|
||||
failBytes := b.Bytes()
|
||||
|
||||
_, err := p.updateHtlcKey(hash, attemptID, htlcFailInfoKey, failBytes)
|
||||
return err
|
||||
}
|
||||
|
||||
// updateHtlcKey updates a database key for the specified htlc.
|
||||
func (p *PaymentControl) updateHtlcKey(paymentHash lntypes.Hash,
|
||||
attemptID uint64, key, value []byte) (*MPPayment, error) {
|
||||
|
||||
htlcIDBytes := make([]byte, 8)
|
||||
binary.BigEndian.PutUint64(htlcIDBytes, attemptID)
|
||||
|
||||
var payment *MPPayment
|
||||
err := p.db.Batch(func(tx *bbolt.Tx) error {
|
||||
// Fetch bucket that contains all information for the payment
|
||||
// with this hash.
|
||||
bucket, err := fetchPaymentBucket(tx, paymentHash)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Record the successful payment info atomically to the
|
||||
// payments record.
|
||||
err = bucket.Put(paymentSettleInfoKey, preimage[:])
|
||||
// We can only update keys of in-flight payments.
|
||||
if err := ensureInFlight(bucket); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
htlcsBucket := bucket.Bucket(paymentHtlcsBucket)
|
||||
if htlcsBucket == nil {
|
||||
return fmt.Errorf("htlcs bucket not found")
|
||||
}
|
||||
|
||||
htlcBucket := htlcsBucket.Bucket(htlcIDBytes)
|
||||
if htlcBucket == nil {
|
||||
return fmt.Errorf("HTLC with ID %v not registered",
|
||||
attemptID)
|
||||
}
|
||||
|
||||
// Add or update the key for this htlc.
|
||||
err = htlcBucket.Put(key, value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -232,7 +272,7 @@ func (p *PaymentControl) Success(paymentHash lntypes.Hash,
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return payment, updateErr
|
||||
return payment, err
|
||||
}
|
||||
|
||||
// Fail transitions a payment into the Failed state, and records the reason the
|
||||
@ -275,7 +315,19 @@ func (p *PaymentControl) Fail(paymentHash lntypes.Hash,
|
||||
|
||||
// Retrieve attempt info for the notification, if available.
|
||||
payment, err = fetchPayment(bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Final sanity check to see if there are no in-flight htlcs.
|
||||
for _, htlc := range payment.HTLCs {
|
||||
if htlc.Settle == nil && htlc.Failure == nil {
|
||||
return errors.New("payment failed with " +
|
||||
"in-flight htlc(s)")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -335,7 +387,6 @@ func fetchPaymentBucket(tx *bbolt.Tx, paymentHash lntypes.Hash) (
|
||||
}
|
||||
|
||||
return bucket, nil
|
||||
|
||||
}
|
||||
|
||||
// nextPaymentSequence returns the next sequence number to store for a new
|
||||
@ -358,27 +409,43 @@ func nextPaymentSequence(tx *bbolt.Tx) ([]byte, error) {
|
||||
|
||||
// fetchPaymentStatus fetches the payment status of the payment. If the payment
|
||||
// isn't found, it will default to "StatusUnknown".
|
||||
func fetchPaymentStatus(bucket *bbolt.Bucket) PaymentStatus {
|
||||
if bucket.Get(paymentSettleInfoKey) != nil {
|
||||
return StatusSucceeded
|
||||
func fetchPaymentStatus(bucket *bbolt.Bucket) (PaymentStatus, error) {
|
||||
htlcsBucket := bucket.Bucket(paymentHtlcsBucket)
|
||||
if htlcsBucket != nil {
|
||||
htlcs, err := fetchHtlcAttempts(htlcsBucket)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
// Go through all HTLCs, and return StatusSucceeded if any of
|
||||
// them did succeed.
|
||||
for _, h := range htlcs {
|
||||
if h.Settle != nil {
|
||||
return StatusSucceeded, nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if bucket.Get(paymentFailInfoKey) != nil {
|
||||
return StatusFailed
|
||||
return StatusFailed, nil
|
||||
}
|
||||
|
||||
if bucket.Get(paymentCreationInfoKey) != nil {
|
||||
return StatusInFlight
|
||||
return StatusInFlight, nil
|
||||
}
|
||||
|
||||
return StatusUnknown
|
||||
return StatusUnknown, nil
|
||||
}
|
||||
|
||||
// ensureInFlight checks whether the payment found in the given bucket has
|
||||
// status InFlight, and returns an error otherwise. This should be used to
|
||||
// ensure we only mark in-flight payments as succeeded or failed.
|
||||
func ensureInFlight(bucket *bbolt.Bucket) error {
|
||||
paymentStatus := fetchPaymentStatus(bucket)
|
||||
paymentStatus, err := fetchPaymentStatus(bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch {
|
||||
|
||||
@ -404,27 +471,16 @@ func ensureInFlight(bucket *bbolt.Bucket) error {
|
||||
}
|
||||
}
|
||||
|
||||
// fetchPaymentAttempt fetches the payment attempt from the bucket.
|
||||
func fetchPaymentAttempt(bucket *bbolt.Bucket) (*PaymentAttemptInfo, error) {
|
||||
attemptData := bucket.Get(paymentAttemptInfoKey)
|
||||
if attemptData == nil {
|
||||
return nil, errNoAttemptInfo
|
||||
}
|
||||
|
||||
r := bytes.NewReader(attemptData)
|
||||
return deserializePaymentAttemptInfo(r)
|
||||
}
|
||||
|
||||
// InFlightPayment is a wrapper around a payment that has status InFlight.
|
||||
type InFlightPayment struct {
|
||||
// Info is the PaymentCreationInfo of the in-flight payment.
|
||||
Info *PaymentCreationInfo
|
||||
|
||||
// Attempt contains information about the last payment attempt that was
|
||||
// made to this payment hash.
|
||||
// Attempts is the set of payment attempts that was made to this
|
||||
// payment hash.
|
||||
//
|
||||
// NOTE: Might be nil.
|
||||
Attempt *PaymentAttemptInfo
|
||||
// NOTE: Might be empty.
|
||||
Attempts []HTLCAttemptInfo
|
||||
}
|
||||
|
||||
// FetchInFlightPayments returns all payments with status InFlight.
|
||||
@ -443,15 +499,16 @@ func (p *PaymentControl) FetchInFlightPayments() ([]*InFlightPayment, error) {
|
||||
}
|
||||
|
||||
// If the status is not InFlight, we can return early.
|
||||
paymentStatus := fetchPaymentStatus(bucket)
|
||||
paymentStatus, err := fetchPaymentStatus(bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if paymentStatus != StatusInFlight {
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
inFlight = &InFlightPayment{}
|
||||
err error
|
||||
)
|
||||
inFlight := &InFlightPayment{}
|
||||
|
||||
// Get the CreationInfo.
|
||||
b := bucket.Get(paymentCreationInfoKey)
|
||||
@ -466,13 +523,31 @@ func (p *PaymentControl) FetchInFlightPayments() ([]*InFlightPayment, error) {
|
||||
return err
|
||||
}
|
||||
|
||||
// Now get the attempt info. It could be that there is
|
||||
// no attempt info yet.
|
||||
inFlight.Attempt, err = fetchPaymentAttempt(bucket)
|
||||
if err != nil && err != errNoAttemptInfo {
|
||||
htlcsBucket := bucket.Bucket(paymentHtlcsBucket)
|
||||
if htlcsBucket == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Fetch all HTLCs attempted for this payment.
|
||||
htlcs, err := fetchHtlcAttempts(htlcsBucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// We only care about the static info for the HTLCs
|
||||
// still in flight, so convert the result to a slice of
|
||||
// HTLCAttemptInfos.
|
||||
for _, h := range htlcs {
|
||||
// Skip HTLCs not in flight.
|
||||
if h.Settle != nil || h.Failure != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
inFlight.Attempts = append(
|
||||
inFlight.Attempts, h.HTLCAttemptInfo,
|
||||
)
|
||||
}
|
||||
|
||||
inFlights = append(inFlights, inFlight)
|
||||
return nil
|
||||
})
|
||||
|
@ -1,7 +1,6 @@
|
||||
package channeldb
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"io"
|
||||
@ -11,7 +10,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/btcsuite/fastsha256"
|
||||
"github.com/coreos/bbolt"
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
)
|
||||
@ -38,7 +36,7 @@ func genPreimage() ([32]byte, error) {
|
||||
return preimage, nil
|
||||
}
|
||||
|
||||
func genInfo() (*PaymentCreationInfo, *PaymentAttemptInfo,
|
||||
func genInfo() (*PaymentCreationInfo, *HTLCAttemptInfo,
|
||||
lntypes.Preimage, error) {
|
||||
|
||||
preimage, err := genPreimage()
|
||||
@ -51,11 +49,11 @@ func genInfo() (*PaymentCreationInfo, *PaymentAttemptInfo,
|
||||
return &PaymentCreationInfo{
|
||||
PaymentHash: rhash,
|
||||
Value: 1,
|
||||
CreationDate: time.Unix(time.Now().Unix(), 0),
|
||||
CreationTime: time.Unix(time.Now().Unix(), 0),
|
||||
PaymentRequest: []byte("hola"),
|
||||
},
|
||||
&PaymentAttemptInfo{
|
||||
PaymentID: 1,
|
||||
&HTLCAttemptInfo{
|
||||
AttemptID: 1,
|
||||
SessionKey: priv,
|
||||
Route: testRoute,
|
||||
}, preimage, nil
|
||||
@ -85,9 +83,9 @@ func TestPaymentControlSwitchFail(t *testing.T) {
|
||||
t.Fatalf("unable to send htlc message: %v", err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, nil, lntypes.Preimage{},
|
||||
t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{},
|
||||
nil,
|
||||
)
|
||||
|
||||
@ -99,9 +97,9 @@ func TestPaymentControlSwitchFail(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify the status is indeed Failed.
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusFailed)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusFailed)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, nil, lntypes.Preimage{},
|
||||
t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{},
|
||||
&failReason,
|
||||
)
|
||||
|
||||
@ -112,33 +110,56 @@ func TestPaymentControlSwitchFail(t *testing.T) {
|
||||
t.Fatalf("unable to send htlc message: %v", err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, nil, lntypes.Preimage{},
|
||||
t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{},
|
||||
nil,
|
||||
)
|
||||
|
||||
// Record a new attempt.
|
||||
attempt.PaymentID = 2
|
||||
// Record a new attempt. In this test scenario, the attempt fails.
|
||||
// However, this is not communicated to control tower in the current
|
||||
// implementation. It only registers the initiation of the attempt.
|
||||
attempt.AttemptID = 2
|
||||
err = pControl.RegisterAttempt(info.PaymentHash, attempt)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to register attempt: %v", err)
|
||||
}
|
||||
|
||||
err = pControl.FailAttempt(
|
||||
info.PaymentHash, 2, &HTLCFailInfo{
|
||||
Reason: HTLCFailUnreadable,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Record another attempt.
|
||||
attempt.AttemptID = 3
|
||||
err = pControl.RegisterAttempt(info.PaymentHash, attempt)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to send htlc message: %v", err)
|
||||
}
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, attempt, lntypes.Preimage{},
|
||||
t, pControl, info.PaymentHash, info, 0, attempt, lntypes.Preimage{},
|
||||
nil,
|
||||
)
|
||||
|
||||
// Verifies that status was changed to StatusSucceeded.
|
||||
// Settle the attempt and verify that status was changed to StatusSucceeded.
|
||||
var payment *MPPayment
|
||||
payment, err = pControl.Success(info.PaymentHash, preimg)
|
||||
payment, err = pControl.SettleAttempt(
|
||||
info.PaymentHash, 3,
|
||||
&HTLCSettleInfo{
|
||||
Preimage: preimg,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("error shouldn't have been received, got: %v", err)
|
||||
}
|
||||
|
||||
if len(payment.HTLCs) != 1 {
|
||||
t.Fatalf("payment should have one htlc, got: %d",
|
||||
if len(payment.HTLCs) != 2 {
|
||||
t.Fatalf("payment should have two htlcs, got: %d",
|
||||
len(payment.HTLCs))
|
||||
}
|
||||
|
||||
@ -149,8 +170,8 @@ func TestPaymentControlSwitchFail(t *testing.T) {
|
||||
spew.Sdump(payment.HTLCs[0].Route), err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded)
|
||||
assertPaymentInfo(t, db, info.PaymentHash, info, attempt, preimg, nil)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded)
|
||||
assertPaymentInfo(t, pControl, info.PaymentHash, info, 1, attempt, preimg, nil)
|
||||
|
||||
// Attempt a final payment, which should now fail since the prior
|
||||
// payment succeed.
|
||||
@ -184,9 +205,9 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) {
|
||||
t.Fatalf("unable to send htlc message: %v", err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, nil, lntypes.Preimage{},
|
||||
t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{},
|
||||
nil,
|
||||
)
|
||||
|
||||
@ -204,9 +225,9 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("unable to send htlc message: %v", err)
|
||||
}
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, attempt, lntypes.Preimage{},
|
||||
t, pControl, info.PaymentHash, info, 0, attempt, lntypes.Preimage{},
|
||||
nil,
|
||||
)
|
||||
|
||||
@ -218,11 +239,17 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) {
|
||||
}
|
||||
|
||||
// After settling, the error should be ErrAlreadyPaid.
|
||||
if _, err := pControl.Success(info.PaymentHash, preimg); err != nil {
|
||||
_, err = pControl.SettleAttempt(
|
||||
info.PaymentHash, 1,
|
||||
&HTLCSettleInfo{
|
||||
Preimage: preimg,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("error shouldn't have been received, got: %v", err)
|
||||
}
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded)
|
||||
assertPaymentInfo(t, db, info.PaymentHash, info, attempt, preimg, nil)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded)
|
||||
assertPaymentInfo(t, pControl, info.PaymentHash, info, 0, attempt, preimg, nil)
|
||||
|
||||
err = pControl.InitPayment(info.PaymentHash, info)
|
||||
if err != ErrAlreadyPaid {
|
||||
@ -248,16 +275,17 @@ func TestPaymentControlSuccessesWithoutInFlight(t *testing.T) {
|
||||
}
|
||||
|
||||
// Attempt to complete the payment should fail.
|
||||
_, err = pControl.Success(info.PaymentHash, preimg)
|
||||
_, err = pControl.SettleAttempt(
|
||||
info.PaymentHash, 0,
|
||||
&HTLCSettleInfo{
|
||||
Preimage: preimg,
|
||||
},
|
||||
)
|
||||
if err != ErrPaymentNotInitiated {
|
||||
t.Fatalf("expected ErrPaymentNotInitiated, got %v", err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusUnknown)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, nil, nil, lntypes.Preimage{},
|
||||
nil,
|
||||
)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusUnknown)
|
||||
}
|
||||
|
||||
// TestPaymentControlFailsWithoutInFlight checks that a strict payment
|
||||
@ -283,10 +311,7 @@ func TestPaymentControlFailsWithoutInFlight(t *testing.T) {
|
||||
t.Fatalf("expected ErrPaymentNotInitiated, got %v", err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusUnknown)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, nil, nil, lntypes.Preimage{}, nil,
|
||||
)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusUnknown)
|
||||
}
|
||||
|
||||
// TestPaymentControlDeleteNonInFlight checks that calling DeletaPayments only
|
||||
@ -336,6 +361,17 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) {
|
||||
}
|
||||
|
||||
if p.failed {
|
||||
// Fail the payment attempt.
|
||||
err := pControl.FailAttempt(
|
||||
info.PaymentHash, attempt.AttemptID,
|
||||
&HTLCFailInfo{
|
||||
Reason: HTLCFailUnreadable,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to fail htlc: %v", err)
|
||||
}
|
||||
|
||||
// Fail the payment, which should moved it to Failed.
|
||||
failReason := FailureReasonNoRoute
|
||||
_, err = pControl.Fail(info.PaymentHash, failReason)
|
||||
@ -344,26 +380,31 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify the status is indeed Failed.
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusFailed)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusFailed)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, attempt,
|
||||
t, pControl, info.PaymentHash, info, 0, attempt,
|
||||
lntypes.Preimage{}, &failReason,
|
||||
)
|
||||
} else if p.success {
|
||||
// Verifies that status was changed to StatusSucceeded.
|
||||
_, err := pControl.Success(info.PaymentHash, preimg)
|
||||
_, err := pControl.SettleAttempt(
|
||||
info.PaymentHash, 1,
|
||||
&HTLCSettleInfo{
|
||||
Preimage: preimg,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("error shouldn't have been received, got: %v", err)
|
||||
}
|
||||
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, attempt, preimg, nil,
|
||||
t, pControl, info.PaymentHash, info, 0, attempt, preimg, nil,
|
||||
)
|
||||
} else {
|
||||
assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight)
|
||||
assertPaymentInfo(
|
||||
t, db, info.PaymentHash, info, attempt,
|
||||
t, pControl, info.PaymentHash, info, 0, attempt,
|
||||
lntypes.Preimage{}, nil,
|
||||
)
|
||||
}
|
||||
@ -390,166 +431,76 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func assertPaymentStatus(t *testing.T, db *DB,
|
||||
hash [32]byte, expStatus PaymentStatus) {
|
||||
// assertPaymentStatus retrieves the status of the payment referred to by hash
|
||||
// and compares it with the expected state.
|
||||
func assertPaymentStatus(t *testing.T, p *PaymentControl,
|
||||
hash lntypes.Hash, expStatus PaymentStatus) {
|
||||
|
||||
t.Helper()
|
||||
|
||||
var paymentStatus = StatusUnknown
|
||||
err := db.View(func(tx *bbolt.Tx) error {
|
||||
payments := tx.Bucket(paymentsRootBucket)
|
||||
if payments == nil {
|
||||
return nil
|
||||
payment, err := p.FetchPayment(hash)
|
||||
if expStatus == StatusUnknown && err == ErrPaymentNotInitiated {
|
||||
return
|
||||
}
|
||||
|
||||
bucket := payments.Bucket(hash[:])
|
||||
if bucket == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get the existing status of this payment, if any.
|
||||
paymentStatus = fetchPaymentStatus(bucket)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("unable to fetch payment status: %v", err)
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if paymentStatus != expStatus {
|
||||
if payment.Status != expStatus {
|
||||
t.Fatalf("payment status mismatch: expected %v, got %v",
|
||||
expStatus, paymentStatus)
|
||||
expStatus, payment.Status)
|
||||
}
|
||||
}
|
||||
|
||||
func checkPaymentCreationInfo(bucket *bbolt.Bucket, c *PaymentCreationInfo) error {
|
||||
b := bucket.Get(paymentCreationInfoKey)
|
||||
switch {
|
||||
case b == nil && c == nil:
|
||||
return nil
|
||||
case b == nil:
|
||||
return fmt.Errorf("expected creation info not found")
|
||||
case c == nil:
|
||||
return fmt.Errorf("unexpected creation info found")
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
c2, err := deserializePaymentCreationInfo(r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !reflect.DeepEqual(c, c2) {
|
||||
return fmt.Errorf("PaymentCreationInfos don't match: %v vs %v",
|
||||
spew.Sdump(c), spew.Sdump(c2))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkPaymentAttemptInfo(bucket *bbolt.Bucket, a *PaymentAttemptInfo) error {
|
||||
b := bucket.Get(paymentAttemptInfoKey)
|
||||
switch {
|
||||
case b == nil && a == nil:
|
||||
return nil
|
||||
case b == nil:
|
||||
return fmt.Errorf("expected attempt info not found")
|
||||
case a == nil:
|
||||
return fmt.Errorf("unexpected attempt info found")
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
a2, err := deserializePaymentAttemptInfo(r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return assertRouteEqual(&a.Route, &a2.Route)
|
||||
}
|
||||
|
||||
func checkSettleInfo(bucket *bbolt.Bucket, preimg lntypes.Preimage) error {
|
||||
zero := lntypes.Preimage{}
|
||||
b := bucket.Get(paymentSettleInfoKey)
|
||||
switch {
|
||||
case b == nil && preimg == zero:
|
||||
return nil
|
||||
case b == nil:
|
||||
return fmt.Errorf("expected preimage not found")
|
||||
case preimg == zero:
|
||||
return fmt.Errorf("unexpected preimage found")
|
||||
}
|
||||
|
||||
var pre2 lntypes.Preimage
|
||||
copy(pre2[:], b[:])
|
||||
if preimg != pre2 {
|
||||
return fmt.Errorf("Preimages don't match: %x vs %x",
|
||||
preimg, pre2)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkFailInfo(bucket *bbolt.Bucket, failReason *FailureReason) error {
|
||||
b := bucket.Get(paymentFailInfoKey)
|
||||
switch {
|
||||
case b == nil && failReason == nil:
|
||||
return nil
|
||||
case b == nil:
|
||||
return fmt.Errorf("expected fail info not found")
|
||||
case failReason == nil:
|
||||
return fmt.Errorf("unexpected fail info found")
|
||||
}
|
||||
|
||||
failReason2 := FailureReason(b[0])
|
||||
if *failReason != failReason2 {
|
||||
return fmt.Errorf("Failure infos don't match: %v vs %v",
|
||||
*failReason, failReason2)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func assertPaymentInfo(t *testing.T, db *DB, hash lntypes.Hash,
|
||||
c *PaymentCreationInfo, a *PaymentAttemptInfo, s lntypes.Preimage,
|
||||
// assertPaymentInfo retrieves the payment referred to by hash and verifies the
|
||||
// expected values.
|
||||
func assertPaymentInfo(t *testing.T, p *PaymentControl, hash lntypes.Hash,
|
||||
c *PaymentCreationInfo, aIdx int, a *HTLCAttemptInfo, s lntypes.Preimage,
|
||||
f *FailureReason) {
|
||||
|
||||
t.Helper()
|
||||
|
||||
err := db.View(func(tx *bbolt.Tx) error {
|
||||
payments := tx.Bucket(paymentsRootBucket)
|
||||
if payments == nil && c == nil {
|
||||
return nil
|
||||
}
|
||||
if payments == nil {
|
||||
return fmt.Errorf("sent payments not found")
|
||||
}
|
||||
|
||||
bucket := payments.Bucket(hash[:])
|
||||
if bucket == nil && c == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if bucket == nil {
|
||||
return fmt.Errorf("payment not found")
|
||||
}
|
||||
|
||||
if err := checkPaymentCreationInfo(bucket, c); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := checkPaymentAttemptInfo(bucket, a); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := checkSettleInfo(bucket, s); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := checkFailInfo(bucket, f); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
payment, err := p.FetchPayment(hash)
|
||||
if err != nil {
|
||||
t.Fatalf("assert payment info failed: %v", err)
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(payment.Info, c) {
|
||||
t.Fatalf("PaymentCreationInfos don't match: %v vs %v",
|
||||
spew.Sdump(payment.Info), spew.Sdump(c))
|
||||
}
|
||||
|
||||
if f != nil {
|
||||
if *payment.FailureReason != *f {
|
||||
t.Fatal("unexpected failure reason")
|
||||
}
|
||||
} else {
|
||||
if payment.FailureReason != nil {
|
||||
t.Fatal("unexpected failure reason")
|
||||
}
|
||||
}
|
||||
|
||||
if a == nil {
|
||||
if len(payment.HTLCs) > 0 {
|
||||
t.Fatal("expected no htlcs")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
htlc := payment.HTLCs[aIdx]
|
||||
if err := assertRouteEqual(&htlc.Route, &a.Route); err != nil {
|
||||
t.Fatal("routes do not match")
|
||||
}
|
||||
|
||||
var zeroPreimage = lntypes.Preimage{}
|
||||
if s != zeroPreimage {
|
||||
if htlc.Settle.Preimage != s {
|
||||
t.Fatalf("Preimages don't match: %x vs %x",
|
||||
htlc.Settle.Preimage, s)
|
||||
}
|
||||
} else {
|
||||
if htlc.Settle != nil {
|
||||
t.Fatal("expected no settle info")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,6 @@ import (
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/btcsuite/btcd/btcec"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/coreos/bbolt"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
@ -31,9 +30,19 @@ var (
|
||||
// |-- <paymenthash>
|
||||
// | |--sequence-key: <sequence number>
|
||||
// | |--creation-info-key: <creation info>
|
||||
// | |--attempt-info-key: <attempt info>
|
||||
// | |--settle-info-key: <settle info>
|
||||
// | |--fail-info-key: <fail info>
|
||||
// | |--fail-info-key: <(optional) fail info>
|
||||
// | |
|
||||
// | |--payment-htlcs-bucket (shard-bucket)
|
||||
// | | |
|
||||
// | | |-- <htlc attempt ID>
|
||||
// | | | |--htlc-attempt-info-key: <htlc attempt info>
|
||||
// | | | |--htlc-settle-info-key: <(optional) settle info>
|
||||
// | | | |--htlc-fail-info-key: <(optional) fail info>
|
||||
// | | |
|
||||
// | | |-- <htlc attempt ID>
|
||||
// | | | |
|
||||
// | | ... ...
|
||||
// | |
|
||||
// | |
|
||||
// | |--duplicate-bucket (only for old, completed payments)
|
||||
// | |
|
||||
@ -55,13 +64,6 @@ var (
|
||||
//
|
||||
paymentsRootBucket = []byte("payments-root-bucket")
|
||||
|
||||
// paymentDublicateBucket is the name of a optional sub-bucket within
|
||||
// the payment hash bucket, that is used to hold duplicate payments to
|
||||
// a payment hash. This is needed to support information from earlier
|
||||
// versions of lnd, where it was possible to pay to a payment hash more
|
||||
// than once.
|
||||
paymentDuplicateBucket = []byte("payment-duplicate-bucket")
|
||||
|
||||
// paymentSequenceKey is a key used in the payment's sub-bucket to
|
||||
// store the sequence number of the payment.
|
||||
paymentSequenceKey = []byte("payment-sequence-key")
|
||||
@ -70,14 +72,21 @@ var (
|
||||
// store the creation info of the payment.
|
||||
paymentCreationInfoKey = []byte("payment-creation-info")
|
||||
|
||||
// paymentAttemptInfoKey is a key used in the payment's sub-bucket to
|
||||
// store the info about the latest attempt that was done for the
|
||||
// payment in question.
|
||||
paymentAttemptInfoKey = []byte("payment-attempt-info")
|
||||
// paymentHtlcsBucket is a bucket where we'll store the information
|
||||
// about the HTLCs that were attempted for a payment.
|
||||
paymentHtlcsBucket = []byte("payment-htlcs-bucket")
|
||||
|
||||
// paymentSettleInfoKey is a key used in the payment's sub-bucket to
|
||||
// store the settle info of the payment.
|
||||
paymentSettleInfoKey = []byte("payment-settle-info")
|
||||
// htlcAttemptInfoKey is a key used in a HTLC's sub-bucket to store the
|
||||
// info about the attempt that was done for the HTLC in question.
|
||||
htlcAttemptInfoKey = []byte("htlc-attempt-info")
|
||||
|
||||
// htlcSettleInfoKey is a key used in a HTLC's sub-bucket to store the
|
||||
// settle info, if any.
|
||||
htlcSettleInfoKey = []byte("htlc-settle-info")
|
||||
|
||||
// htlcFailInfoKey is a key used in a HTLC's sub-bucket to store
|
||||
// failure information, if any.
|
||||
htlcFailInfoKey = []byte("htlc-fail-info")
|
||||
|
||||
// paymentFailInfoKey is a key used in the payment's sub-bucket to
|
||||
// store information about the reason a payment failed.
|
||||
@ -178,123 +187,13 @@ type PaymentCreationInfo struct {
|
||||
// Value is the amount we are paying.
|
||||
Value lnwire.MilliSatoshi
|
||||
|
||||
// CreatingDate is the time when this payment was initiated.
|
||||
CreationDate time.Time
|
||||
// CreationTime is the time when this payment was initiated.
|
||||
CreationTime time.Time
|
||||
|
||||
// PaymentRequest is the full payment request, if any.
|
||||
PaymentRequest []byte
|
||||
}
|
||||
|
||||
// PaymentAttemptInfo contains information about a specific payment 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 PaymentAttemptInfo 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
|
||||
}
|
||||
|
||||
// Payment is a wrapper around a payment's PaymentCreationInfo,
|
||||
// PaymentAttemptInfo, and preimage. All payments will have the
|
||||
// PaymentCreationInfo set, the PaymentAttemptInfo will be set only if at least
|
||||
// one payment attempt has been made, while only completed payments will have a
|
||||
// non-zero payment preimage.
|
||||
type Payment struct {
|
||||
// sequenceNum is a unique identifier used to sort the payments in
|
||||
// order of creation.
|
||||
sequenceNum uint64
|
||||
|
||||
// Status is the current PaymentStatus of this payment.
|
||||
Status PaymentStatus
|
||||
|
||||
// Info holds all static information about this payment, and is
|
||||
// populated when the payment is initiated.
|
||||
Info *PaymentCreationInfo
|
||||
|
||||
// Attempt is the information about the last payment attempt made.
|
||||
//
|
||||
// NOTE: Can be nil if no attempt is yet made.
|
||||
Attempt *PaymentAttemptInfo
|
||||
|
||||
// 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.
|
||||
Preimage *lntypes.Preimage
|
||||
|
||||
// Failure 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 *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.
|
||||
//
|
||||
// nolint: dupl
|
||||
@ -327,30 +226,16 @@ func (db *DB) FetchPayments() ([]*MPPayment, error) {
|
||||
// payment has was possible. These will be found in a
|
||||
// sub-bucket indexed by their sequence number if
|
||||
// available.
|
||||
dup := bucket.Bucket(paymentDuplicateBucket)
|
||||
if dup == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return dup.ForEach(func(k, v []byte) error {
|
||||
subBucket := dup.Bucket(k)
|
||||
if subBucket == nil {
|
||||
// We one bucket for each duplicate to
|
||||
// be found.
|
||||
return fmt.Errorf("non bucket element" +
|
||||
"in duplicate bucket")
|
||||
}
|
||||
|
||||
p, err := fetchPayment(subBucket)
|
||||
duplicatePayments, err := fetchDuplicatePayments(bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
payments = append(payments, p)
|
||||
payments = append(payments, duplicatePayments...)
|
||||
|
||||
return nil
|
||||
})
|
||||
})
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -364,20 +249,18 @@ func (db *DB) FetchPayments() ([]*MPPayment, error) {
|
||||
}
|
||||
|
||||
func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) {
|
||||
var (
|
||||
err error
|
||||
p = &Payment{}
|
||||
)
|
||||
|
||||
seqBytes := bucket.Get(paymentSequenceKey)
|
||||
if seqBytes == nil {
|
||||
return nil, fmt.Errorf("sequence number not found")
|
||||
}
|
||||
|
||||
p.sequenceNum = binary.BigEndian.Uint64(seqBytes)
|
||||
sequenceNum := binary.BigEndian.Uint64(seqBytes)
|
||||
|
||||
// Get the payment status.
|
||||
p.Status = fetchPaymentStatus(bucket)
|
||||
paymentStatus, err := fetchPaymentStatus(bucket)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Get the PaymentCreationInfo.
|
||||
b := bucket.Get(paymentCreationInfoKey)
|
||||
@ -386,39 +269,118 @@ func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) {
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
p.Info, err = deserializePaymentCreationInfo(r)
|
||||
creationInfo, err := deserializePaymentCreationInfo(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
}
|
||||
|
||||
// Get the PaymentAttemptInfo. This can be unset.
|
||||
b = bucket.Get(paymentAttemptInfoKey)
|
||||
if b != nil {
|
||||
r = bytes.NewReader(b)
|
||||
p.Attempt, err = deserializePaymentAttemptInfo(r)
|
||||
var htlcs []HTLCAttempt
|
||||
htlcsBucket := bucket.Bucket(paymentHtlcsBucket)
|
||||
if htlcsBucket != nil {
|
||||
// Get the payment attempts. This can be empty.
|
||||
htlcs, err = fetchHtlcAttempts(htlcsBucket)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// Get the payment preimage. This is only found for
|
||||
// completed payments.
|
||||
b = bucket.Get(paymentSettleInfoKey)
|
||||
if b != nil {
|
||||
var preimg lntypes.Preimage
|
||||
copy(preimg[:], b[:])
|
||||
p.Preimage = &preimg
|
||||
}
|
||||
|
||||
// Get failure reason if available.
|
||||
var failureReason *FailureReason
|
||||
b = bucket.Get(paymentFailInfoKey)
|
||||
if b != nil {
|
||||
reason := FailureReason(b[0])
|
||||
p.Failure = &reason
|
||||
failureReason = &reason
|
||||
}
|
||||
|
||||
return p.ToMPPayment(), nil
|
||||
return &MPPayment{
|
||||
sequenceNum: sequenceNum,
|
||||
Info: creationInfo,
|
||||
HTLCs: htlcs,
|
||||
FailureReason: failureReason,
|
||||
Status: paymentStatus,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// fetchHtlcAttempts retrives all htlc attempts made for the payment found in
|
||||
// the given bucket.
|
||||
func fetchHtlcAttempts(bucket *bbolt.Bucket) ([]HTLCAttempt, error) {
|
||||
htlcs := make([]HTLCAttempt, 0)
|
||||
|
||||
err := bucket.ForEach(func(k, _ []byte) error {
|
||||
aid := byteOrder.Uint64(k)
|
||||
htlcBucket := bucket.Bucket(k)
|
||||
|
||||
attemptInfo, err := fetchHtlcAttemptInfo(
|
||||
htlcBucket,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
attemptInfo.AttemptID = aid
|
||||
|
||||
htlc := HTLCAttempt{
|
||||
HTLCAttemptInfo: *attemptInfo,
|
||||
}
|
||||
|
||||
// Settle info might be nil.
|
||||
htlc.Settle, err = fetchHtlcSettleInfo(htlcBucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Failure info might be nil.
|
||||
htlc.Failure, err = fetchHtlcFailInfo(htlcBucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
htlcs = append(htlcs, htlc)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return htlcs, nil
|
||||
}
|
||||
|
||||
// fetchHtlcAttemptInfo fetches the payment attempt info for this htlc from the
|
||||
// bucket.
|
||||
func fetchHtlcAttemptInfo(bucket *bbolt.Bucket) (*HTLCAttemptInfo, error) {
|
||||
b := bucket.Get(htlcAttemptInfoKey)
|
||||
if b == nil {
|
||||
return nil, errNoAttemptInfo
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
return deserializeHTLCAttemptInfo(r)
|
||||
}
|
||||
|
||||
// fetchHtlcSettleInfo retrieves the settle info for the htlc. If the htlc isn't
|
||||
// settled, nil is returned.
|
||||
func fetchHtlcSettleInfo(bucket *bbolt.Bucket) (*HTLCSettleInfo, error) {
|
||||
b := bucket.Get(htlcSettleInfoKey)
|
||||
if b == nil {
|
||||
// Settle info is optional.
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
return deserializeHTLCSettleInfo(r)
|
||||
}
|
||||
|
||||
// fetchHtlcFailInfo retrieves the failure info for the htlc. If the htlc hasn't
|
||||
// failed, nil is returned.
|
||||
func fetchHtlcFailInfo(bucket *bbolt.Bucket) (*HTLCFailInfo, error) {
|
||||
b := bucket.Get(htlcFailInfoKey)
|
||||
if b == nil {
|
||||
// Fail info is optional.
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
r := bytes.NewReader(b)
|
||||
return deserializeHTLCFailInfo(r)
|
||||
}
|
||||
|
||||
// DeletePayments deletes all completed and failed payments from the DB.
|
||||
@ -441,7 +403,11 @@ func (db *DB) DeletePayments() error {
|
||||
|
||||
// If the status is InFlight, we cannot safely delete
|
||||
// the payment information, so we return early.
|
||||
paymentStatus := fetchPaymentStatus(bucket)
|
||||
paymentStatus, err := fetchPaymentStatus(bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if paymentStatus == StatusInFlight {
|
||||
return nil
|
||||
}
|
||||
@ -463,6 +429,7 @@ func (db *DB) DeletePayments() error {
|
||||
})
|
||||
}
|
||||
|
||||
// nolint: dupl
|
||||
func serializePaymentCreationInfo(w io.Writer, c *PaymentCreationInfo) error {
|
||||
var scratch [8]byte
|
||||
|
||||
@ -475,8 +442,7 @@ func serializePaymentCreationInfo(w io.Writer, c *PaymentCreationInfo) error {
|
||||
return err
|
||||
}
|
||||
|
||||
byteOrder.PutUint64(scratch[:], uint64(c.CreationDate.Unix()))
|
||||
if _, err := w.Write(scratch[:]); err != nil {
|
||||
if err := serializeTime(w, c.CreationTime); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -506,10 +472,11 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) {
|
||||
}
|
||||
c.Value = lnwire.MilliSatoshi(byteOrder.Uint64(scratch[:]))
|
||||
|
||||
if _, err := io.ReadFull(r, scratch[:]); err != nil {
|
||||
creationTime, err := deserializeTime(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.CreationDate = time.Unix(int64(byteOrder.Uint64(scratch[:])), 0)
|
||||
c.CreationTime = creationTime
|
||||
|
||||
if _, err := io.ReadFull(r, scratch[:4]); err != nil {
|
||||
return nil, err
|
||||
@ -527,8 +494,8 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) {
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func serializePaymentAttemptInfo(w io.Writer, a *PaymentAttemptInfo) error {
|
||||
if err := WriteElements(w, a.PaymentID, a.SessionKey); err != nil {
|
||||
func serializeHTLCAttemptInfo(w io.Writer, a *HTLCAttemptInfo) error {
|
||||
if err := WriteElements(w, a.SessionKey); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -536,12 +503,12 @@ func serializePaymentAttemptInfo(w io.Writer, a *PaymentAttemptInfo) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
return serializeTime(w, a.AttemptTime)
|
||||
}
|
||||
|
||||
func deserializePaymentAttemptInfo(r io.Reader) (*PaymentAttemptInfo, error) {
|
||||
a := &PaymentAttemptInfo{}
|
||||
err := ReadElements(r, &a.PaymentID, &a.SessionKey)
|
||||
func deserializeHTLCAttemptInfo(r io.Reader) (*HTLCAttemptInfo, error) {
|
||||
a := &HTLCAttemptInfo{}
|
||||
err := ReadElements(r, &a.SessionKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -549,6 +516,12 @@ func deserializePaymentAttemptInfo(r io.Reader) (*PaymentAttemptInfo, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
a.AttemptTime, err = deserializeTime(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return a, nil
|
||||
}
|
||||
|
||||
|
@ -53,7 +53,7 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
func makeFakeInfo() (*PaymentCreationInfo, *PaymentAttemptInfo) {
|
||||
func makeFakeInfo() (*PaymentCreationInfo, *HTLCAttemptInfo) {
|
||||
var preimg lntypes.Preimage
|
||||
copy(preimg[:], rev[:])
|
||||
|
||||
@ -62,14 +62,15 @@ func makeFakeInfo() (*PaymentCreationInfo, *PaymentAttemptInfo) {
|
||||
Value: 1000,
|
||||
// Use single second precision to avoid false positive test
|
||||
// failures due to the monotonic time component.
|
||||
CreationDate: time.Unix(time.Now().Unix(), 0),
|
||||
CreationTime: time.Unix(time.Now().Unix(), 0),
|
||||
PaymentRequest: []byte(""),
|
||||
}
|
||||
|
||||
a := &PaymentAttemptInfo{
|
||||
PaymentID: 44,
|
||||
a := &HTLCAttemptInfo{
|
||||
AttemptID: 44,
|
||||
SessionKey: priv,
|
||||
Route: testRoute,
|
||||
AttemptTime: time.Unix(100, 0),
|
||||
}
|
||||
return c, a
|
||||
}
|
||||
@ -109,33 +110,34 @@ func TestSentPaymentSerialization(t *testing.T) {
|
||||
}
|
||||
|
||||
b.Reset()
|
||||
if err := serializePaymentAttemptInfo(&b, s); err != nil {
|
||||
if err := serializeHTLCAttemptInfo(&b, s); err != nil {
|
||||
t.Fatalf("unable to serialize info: %v", err)
|
||||
}
|
||||
|
||||
newAttemptInfo, err := deserializePaymentAttemptInfo(&b)
|
||||
newWireInfo, err := deserializeHTLCAttemptInfo(&b)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to deserialize info: %v", err)
|
||||
}
|
||||
newWireInfo.AttemptID = s.AttemptID
|
||||
|
||||
// First we verify all the records match up porperly, as they aren't
|
||||
// able to be properly compared using reflect.DeepEqual.
|
||||
err = assertRouteEqual(&s.Route, &newAttemptInfo.Route)
|
||||
err = assertRouteEqual(&s.Route, &newWireInfo.Route)
|
||||
if err != nil {
|
||||
t.Fatalf("Routes do not match after "+
|
||||
"serialization/deserialization: %v", err)
|
||||
}
|
||||
|
||||
// Clear routes to allow DeepEqual to compare the remaining fields.
|
||||
newAttemptInfo.Route = route.Route{}
|
||||
newWireInfo.Route = route.Route{}
|
||||
s.Route = route.Route{}
|
||||
|
||||
if !reflect.DeepEqual(s, newAttemptInfo) {
|
||||
if !reflect.DeepEqual(s, newWireInfo) {
|
||||
s.SessionKey.Curve = nil
|
||||
newAttemptInfo.SessionKey.Curve = nil
|
||||
newWireInfo.SessionKey.Curve = nil
|
||||
t.Fatalf("Payments do not match after "+
|
||||
"serialization/deserialization %v vs %v",
|
||||
spew.Sdump(s), spew.Sdump(newAttemptInfo),
|
||||
spew.Sdump(s), spew.Sdump(newWireInfo),
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -144,7 +146,7 @@ func TestSentPaymentSerialization(t *testing.T) {
|
||||
// they are not equal.
|
||||
func assertRouteEqual(a, b *route.Route) error {
|
||||
if !reflect.DeepEqual(a, b) {
|
||||
return fmt.Errorf("PaymentAttemptInfos don't match: %v vs %v",
|
||||
return fmt.Errorf("HTLCAttemptInfos don't match: %v vs %v",
|
||||
spew.Sdump(a), spew.Sdump(b))
|
||||
}
|
||||
|
||||
|
@ -79,112 +79,6 @@ func (PaymentState) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{0}
|
||||
}
|
||||
|
||||
type Failure_FailureCode int32
|
||||
|
||||
const (
|
||||
//*
|
||||
//The numbers assigned in this enumeration match the failure codes as
|
||||
//defined in BOLT #4. Because protobuf 3 requires enums to start with 0,
|
||||
//a RESERVED value is added.
|
||||
Failure_RESERVED Failure_FailureCode = 0
|
||||
Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS Failure_FailureCode = 1
|
||||
Failure_INCORRECT_PAYMENT_AMOUNT Failure_FailureCode = 2
|
||||
Failure_FINAL_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 3
|
||||
Failure_FINAL_INCORRECT_HTLC_AMOUNT Failure_FailureCode = 4
|
||||
Failure_FINAL_EXPIRY_TOO_SOON Failure_FailureCode = 5
|
||||
Failure_INVALID_REALM Failure_FailureCode = 6
|
||||
Failure_EXPIRY_TOO_SOON Failure_FailureCode = 7
|
||||
Failure_INVALID_ONION_VERSION Failure_FailureCode = 8
|
||||
Failure_INVALID_ONION_HMAC Failure_FailureCode = 9
|
||||
Failure_INVALID_ONION_KEY Failure_FailureCode = 10
|
||||
Failure_AMOUNT_BELOW_MINIMUM Failure_FailureCode = 11
|
||||
Failure_FEE_INSUFFICIENT Failure_FailureCode = 12
|
||||
Failure_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 13
|
||||
Failure_CHANNEL_DISABLED Failure_FailureCode = 14
|
||||
Failure_TEMPORARY_CHANNEL_FAILURE Failure_FailureCode = 15
|
||||
Failure_REQUIRED_NODE_FEATURE_MISSING Failure_FailureCode = 16
|
||||
Failure_REQUIRED_CHANNEL_FEATURE_MISSING Failure_FailureCode = 17
|
||||
Failure_UNKNOWN_NEXT_PEER Failure_FailureCode = 18
|
||||
Failure_TEMPORARY_NODE_FAILURE Failure_FailureCode = 19
|
||||
Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20
|
||||
Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21
|
||||
Failure_EXPIRY_TOO_FAR Failure_FailureCode = 22
|
||||
Failure_MPP_TIMEOUT Failure_FailureCode = 23
|
||||
//*
|
||||
//The error source is known, but the failure itself couldn't be decoded.
|
||||
Failure_UNKNOWN_FAILURE Failure_FailureCode = 998
|
||||
//*
|
||||
//An unreadable failure result is returned if the received failure message
|
||||
//cannot be decrypted. In that case the error source is unknown.
|
||||
Failure_UNREADABLE_FAILURE Failure_FailureCode = 999
|
||||
)
|
||||
|
||||
var Failure_FailureCode_name = map[int32]string{
|
||||
0: "RESERVED",
|
||||
1: "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS",
|
||||
2: "INCORRECT_PAYMENT_AMOUNT",
|
||||
3: "FINAL_INCORRECT_CLTV_EXPIRY",
|
||||
4: "FINAL_INCORRECT_HTLC_AMOUNT",
|
||||
5: "FINAL_EXPIRY_TOO_SOON",
|
||||
6: "INVALID_REALM",
|
||||
7: "EXPIRY_TOO_SOON",
|
||||
8: "INVALID_ONION_VERSION",
|
||||
9: "INVALID_ONION_HMAC",
|
||||
10: "INVALID_ONION_KEY",
|
||||
11: "AMOUNT_BELOW_MINIMUM",
|
||||
12: "FEE_INSUFFICIENT",
|
||||
13: "INCORRECT_CLTV_EXPIRY",
|
||||
14: "CHANNEL_DISABLED",
|
||||
15: "TEMPORARY_CHANNEL_FAILURE",
|
||||
16: "REQUIRED_NODE_FEATURE_MISSING",
|
||||
17: "REQUIRED_CHANNEL_FEATURE_MISSING",
|
||||
18: "UNKNOWN_NEXT_PEER",
|
||||
19: "TEMPORARY_NODE_FAILURE",
|
||||
20: "PERMANENT_NODE_FAILURE",
|
||||
21: "PERMANENT_CHANNEL_FAILURE",
|
||||
22: "EXPIRY_TOO_FAR",
|
||||
23: "MPP_TIMEOUT",
|
||||
998: "UNKNOWN_FAILURE",
|
||||
999: "UNREADABLE_FAILURE",
|
||||
}
|
||||
|
||||
var Failure_FailureCode_value = map[string]int32{
|
||||
"RESERVED": 0,
|
||||
"INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS": 1,
|
||||
"INCORRECT_PAYMENT_AMOUNT": 2,
|
||||
"FINAL_INCORRECT_CLTV_EXPIRY": 3,
|
||||
"FINAL_INCORRECT_HTLC_AMOUNT": 4,
|
||||
"FINAL_EXPIRY_TOO_SOON": 5,
|
||||
"INVALID_REALM": 6,
|
||||
"EXPIRY_TOO_SOON": 7,
|
||||
"INVALID_ONION_VERSION": 8,
|
||||
"INVALID_ONION_HMAC": 9,
|
||||
"INVALID_ONION_KEY": 10,
|
||||
"AMOUNT_BELOW_MINIMUM": 11,
|
||||
"FEE_INSUFFICIENT": 12,
|
||||
"INCORRECT_CLTV_EXPIRY": 13,
|
||||
"CHANNEL_DISABLED": 14,
|
||||
"TEMPORARY_CHANNEL_FAILURE": 15,
|
||||
"REQUIRED_NODE_FEATURE_MISSING": 16,
|
||||
"REQUIRED_CHANNEL_FEATURE_MISSING": 17,
|
||||
"UNKNOWN_NEXT_PEER": 18,
|
||||
"TEMPORARY_NODE_FAILURE": 19,
|
||||
"PERMANENT_NODE_FAILURE": 20,
|
||||
"PERMANENT_CHANNEL_FAILURE": 21,
|
||||
"EXPIRY_TOO_FAR": 22,
|
||||
"MPP_TIMEOUT": 23,
|
||||
"UNKNOWN_FAILURE": 998,
|
||||
"UNREADABLE_FAILURE": 999,
|
||||
}
|
||||
|
||||
func (x Failure_FailureCode) String() string {
|
||||
return proto.EnumName(Failure_FailureCode_name, int32(x))
|
||||
}
|
||||
|
||||
func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{7, 0}
|
||||
}
|
||||
|
||||
type SendPaymentRequest struct {
|
||||
/// The identity pubkey of the payment recipient
|
||||
Dest []byte `protobuf:"bytes,1,opt,name=dest,proto3" json:"dest,omitempty"`
|
||||
@ -675,7 +569,7 @@ type SendToRouteResponse struct {
|
||||
/// The preimage obtained by making the payment.
|
||||
Preimage []byte `protobuf:"bytes,1,opt,name=preimage,proto3" json:"preimage,omitempty"`
|
||||
/// The failure message in case the payment failed.
|
||||
Failure *Failure `protobuf:"bytes,2,opt,name=failure,proto3" json:"failure,omitempty"`
|
||||
Failure *lnrpc.Failure `protobuf:"bytes,2,opt,name=failure,proto3" json:"failure,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
@ -713,290 +607,13 @@ func (m *SendToRouteResponse) GetPreimage() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *SendToRouteResponse) GetFailure() *Failure {
|
||||
func (m *SendToRouteResponse) GetFailure() *lnrpc.Failure {
|
||||
if m != nil {
|
||||
return m.Failure
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Failure struct {
|
||||
/// Failure code as defined in the Lightning spec
|
||||
Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=routerrpc.Failure_FailureCode" json:"code,omitempty"`
|
||||
/// An optional channel update message.
|
||||
ChannelUpdate *ChannelUpdate `protobuf:"bytes,3,opt,name=channel_update,json=channelUpdate,proto3" json:"channel_update,omitempty"`
|
||||
/// A failure type-dependent htlc value.
|
||||
HtlcMsat uint64 `protobuf:"varint,4,opt,name=htlc_msat,json=htlcMsat,proto3" json:"htlc_msat,omitempty"`
|
||||
/// The sha256 sum of the onion payload.
|
||||
OnionSha_256 []byte `protobuf:"bytes,5,opt,name=onion_sha_256,json=onionSha256,proto3" json:"onion_sha_256,omitempty"`
|
||||
/// A failure type-dependent cltv expiry value.
|
||||
CltvExpiry uint32 `protobuf:"varint,6,opt,name=cltv_expiry,json=cltvExpiry,proto3" json:"cltv_expiry,omitempty"`
|
||||
/// A failure type-dependent flags value.
|
||||
Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"`
|
||||
//*
|
||||
//The position in the path of the intermediate or final node that generated
|
||||
//the failure message. Position zero is the sender node.
|
||||
FailureSourceIndex uint32 `protobuf:"varint,8,opt,name=failure_source_index,json=failureSourceIndex,proto3" json:"failure_source_index,omitempty"`
|
||||
/// A failure type-dependent block height.
|
||||
Height uint32 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Failure) Reset() { *m = Failure{} }
|
||||
func (m *Failure) String() string { return proto.CompactTextString(m) }
|
||||
func (*Failure) ProtoMessage() {}
|
||||
func (*Failure) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{7}
|
||||
}
|
||||
|
||||
func (m *Failure) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Failure.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Failure.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Failure) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Failure.Merge(m, src)
|
||||
}
|
||||
func (m *Failure) XXX_Size() int {
|
||||
return xxx_messageInfo_Failure.Size(m)
|
||||
}
|
||||
func (m *Failure) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Failure.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Failure proto.InternalMessageInfo
|
||||
|
||||
func (m *Failure) GetCode() Failure_FailureCode {
|
||||
if m != nil {
|
||||
return m.Code
|
||||
}
|
||||
return Failure_RESERVED
|
||||
}
|
||||
|
||||
func (m *Failure) GetChannelUpdate() *ChannelUpdate {
|
||||
if m != nil {
|
||||
return m.ChannelUpdate
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Failure) GetHtlcMsat() uint64 {
|
||||
if m != nil {
|
||||
return m.HtlcMsat
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetOnionSha_256() []byte {
|
||||
if m != nil {
|
||||
return m.OnionSha_256
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Failure) GetCltvExpiry() uint32 {
|
||||
if m != nil {
|
||||
return m.CltvExpiry
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetFlags() uint32 {
|
||||
if m != nil {
|
||||
return m.Flags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetFailureSourceIndex() uint32 {
|
||||
if m != nil {
|
||||
return m.FailureSourceIndex
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetHeight() uint32 {
|
||||
if m != nil {
|
||||
return m.Height
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type ChannelUpdate struct {
|
||||
//*
|
||||
//The signature that validates the announced data and proves the ownership
|
||||
//of node id.
|
||||
Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"`
|
||||
//*
|
||||
//The target chain that this channel was opened within. This value
|
||||
//should be the genesis hash of the target chain. Along with the short
|
||||
//channel ID, this uniquely identifies the channel globally in a
|
||||
//blockchain.
|
||||
ChainHash []byte `protobuf:"bytes,2,opt,name=chain_hash,json=chainHash,proto3" json:"chain_hash,omitempty"`
|
||||
//*
|
||||
//The unique description of the funding transaction.
|
||||
ChanId uint64 `protobuf:"varint,3,opt,name=chan_id,json=chanId,proto3" json:"chan_id,omitempty"`
|
||||
//*
|
||||
//A timestamp that allows ordering in the case of multiple announcements.
|
||||
//We should ignore the message if timestamp is not greater than the
|
||||
//last-received.
|
||||
Timestamp uint32 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
|
||||
//*
|
||||
//The bitfield that describes whether optional fields are present in this
|
||||
//update. Currently, the least-significant bit must be set to 1 if the
|
||||
//optional field MaxHtlc is present.
|
||||
MessageFlags uint32 `protobuf:"varint,10,opt,name=message_flags,json=messageFlags,proto3" json:"message_flags,omitempty"`
|
||||
//*
|
||||
//The bitfield that describes additional meta-data concerning how the
|
||||
//update is to be interpreted. Currently, the least-significant bit must be
|
||||
//set to 0 if the creating node corresponds to the first node in the
|
||||
//previously sent channel announcement and 1 otherwise. If the second bit
|
||||
//is set, then the channel is set to be disabled.
|
||||
ChannelFlags uint32 `protobuf:"varint,5,opt,name=channel_flags,json=channelFlags,proto3" json:"channel_flags,omitempty"`
|
||||
//*
|
||||
//The minimum number of blocks this node requires to be added to the expiry
|
||||
//of HTLCs. This is a security parameter determined by the node operator.
|
||||
//This value represents the required gap between the time locks of the
|
||||
//incoming and outgoing HTLC's set to this node.
|
||||
TimeLockDelta uint32 `protobuf:"varint,6,opt,name=time_lock_delta,json=timeLockDelta,proto3" json:"time_lock_delta,omitempty"`
|
||||
//*
|
||||
//The minimum HTLC value which will be accepted.
|
||||
HtlcMinimumMsat uint64 `protobuf:"varint,7,opt,name=htlc_minimum_msat,json=htlcMinimumMsat,proto3" json:"htlc_minimum_msat,omitempty"`
|
||||
//*
|
||||
//The base fee that must be used for incoming HTLC's to this particular
|
||||
//channel. This value will be tacked onto the required for a payment
|
||||
//independent of the size of the payment.
|
||||
BaseFee uint32 `protobuf:"varint,8,opt,name=base_fee,json=baseFee,proto3" json:"base_fee,omitempty"`
|
||||
//*
|
||||
//The fee rate that will be charged per millionth of a satoshi.
|
||||
FeeRate uint32 `protobuf:"varint,9,opt,name=fee_rate,json=feeRate,proto3" json:"fee_rate,omitempty"`
|
||||
//*
|
||||
//The maximum HTLC value which will be accepted.
|
||||
HtlcMaximumMsat uint64 `protobuf:"varint,11,opt,name=htlc_maximum_msat,json=htlcMaximumMsat,proto3" json:"htlc_maximum_msat,omitempty"`
|
||||
//*
|
||||
//The set of data that was appended to this message, some of which we may
|
||||
//not actually know how to iterate or parse. By holding onto this data, we
|
||||
//ensure that we're able to properly validate the set of signatures that
|
||||
//cover these new fields, and ensure we're able to make upgrades to the
|
||||
//network in a forwards compatible manner.
|
||||
ExtraOpaqueData []byte `protobuf:"bytes,12,opt,name=extra_opaque_data,json=extraOpaqueData,proto3" json:"extra_opaque_data,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} }
|
||||
func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) }
|
||||
func (*ChannelUpdate) ProtoMessage() {}
|
||||
func (*ChannelUpdate) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{8}
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_ChannelUpdate.Unmarshal(m, b)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_ChannelUpdate.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_ChannelUpdate.Merge(m, src)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_Size() int {
|
||||
return xxx_messageInfo_ChannelUpdate.Size(m)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_ChannelUpdate.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_ChannelUpdate proto.InternalMessageInfo
|
||||
|
||||
func (m *ChannelUpdate) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetChainHash() []byte {
|
||||
if m != nil {
|
||||
return m.ChainHash
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetChanId() uint64 {
|
||||
if m != nil {
|
||||
return m.ChanId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetTimestamp() uint32 {
|
||||
if m != nil {
|
||||
return m.Timestamp
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetMessageFlags() uint32 {
|
||||
if m != nil {
|
||||
return m.MessageFlags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetChannelFlags() uint32 {
|
||||
if m != nil {
|
||||
return m.ChannelFlags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetTimeLockDelta() uint32 {
|
||||
if m != nil {
|
||||
return m.TimeLockDelta
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetHtlcMinimumMsat() uint64 {
|
||||
if m != nil {
|
||||
return m.HtlcMinimumMsat
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetBaseFee() uint32 {
|
||||
if m != nil {
|
||||
return m.BaseFee
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetFeeRate() uint32 {
|
||||
if m != nil {
|
||||
return m.FeeRate
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetHtlcMaximumMsat() uint64 {
|
||||
if m != nil {
|
||||
return m.HtlcMaximumMsat
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetExtraOpaqueData() []byte {
|
||||
if m != nil {
|
||||
return m.ExtraOpaqueData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ResetMissionControlRequest struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
@ -1007,7 +624,7 @@ func (m *ResetMissionControlRequest) Reset() { *m = ResetMissionControlR
|
||||
func (m *ResetMissionControlRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResetMissionControlRequest) ProtoMessage() {}
|
||||
func (*ResetMissionControlRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{9}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{7}
|
||||
}
|
||||
|
||||
func (m *ResetMissionControlRequest) XXX_Unmarshal(b []byte) error {
|
||||
@ -1038,7 +655,7 @@ func (m *ResetMissionControlResponse) Reset() { *m = ResetMissionControl
|
||||
func (m *ResetMissionControlResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResetMissionControlResponse) ProtoMessage() {}
|
||||
func (*ResetMissionControlResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{10}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{8}
|
||||
}
|
||||
|
||||
func (m *ResetMissionControlResponse) XXX_Unmarshal(b []byte) error {
|
||||
@ -1069,7 +686,7 @@ func (m *QueryMissionControlRequest) Reset() { *m = QueryMissionControlR
|
||||
func (m *QueryMissionControlRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*QueryMissionControlRequest) ProtoMessage() {}
|
||||
func (*QueryMissionControlRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{11}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{9}
|
||||
}
|
||||
|
||||
func (m *QueryMissionControlRequest) XXX_Unmarshal(b []byte) error {
|
||||
@ -1103,7 +720,7 @@ func (m *QueryMissionControlResponse) Reset() { *m = QueryMissionControl
|
||||
func (m *QueryMissionControlResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*QueryMissionControlResponse) ProtoMessage() {}
|
||||
func (*QueryMissionControlResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{12}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{10}
|
||||
}
|
||||
|
||||
func (m *QueryMissionControlResponse) XXX_Unmarshal(b []byte) error {
|
||||
@ -1147,7 +764,7 @@ func (m *PairHistory) Reset() { *m = PairHistory{} }
|
||||
func (m *PairHistory) String() string { return proto.CompactTextString(m) }
|
||||
func (*PairHistory) ProtoMessage() {}
|
||||
func (*PairHistory) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{13}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{11}
|
||||
}
|
||||
|
||||
func (m *PairHistory) XXX_Unmarshal(b []byte) error {
|
||||
@ -1215,7 +832,7 @@ func (m *PairData) Reset() { *m = PairData{} }
|
||||
func (m *PairData) String() string { return proto.CompactTextString(m) }
|
||||
func (*PairData) ProtoMessage() {}
|
||||
func (*PairData) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{14}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{12}
|
||||
}
|
||||
|
||||
func (m *PairData) XXX_Unmarshal(b []byte) error {
|
||||
@ -1294,7 +911,7 @@ func (m *QueryProbabilityRequest) Reset() { *m = QueryProbabilityRequest
|
||||
func (m *QueryProbabilityRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*QueryProbabilityRequest) ProtoMessage() {}
|
||||
func (*QueryProbabilityRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{15}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{13}
|
||||
}
|
||||
|
||||
func (m *QueryProbabilityRequest) XXX_Unmarshal(b []byte) error {
|
||||
@ -1350,7 +967,7 @@ func (m *QueryProbabilityResponse) Reset() { *m = QueryProbabilityRespon
|
||||
func (m *QueryProbabilityResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*QueryProbabilityResponse) ProtoMessage() {}
|
||||
func (*QueryProbabilityResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{16}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{14}
|
||||
}
|
||||
|
||||
func (m *QueryProbabilityResponse) XXX_Unmarshal(b []byte) error {
|
||||
@ -1411,7 +1028,7 @@ func (m *BuildRouteRequest) Reset() { *m = BuildRouteRequest{} }
|
||||
func (m *BuildRouteRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*BuildRouteRequest) ProtoMessage() {}
|
||||
func (*BuildRouteRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{17}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{15}
|
||||
}
|
||||
|
||||
func (m *BuildRouteRequest) XXX_Unmarshal(b []byte) error {
|
||||
@ -1473,7 +1090,7 @@ func (m *BuildRouteResponse) Reset() { *m = BuildRouteResponse{} }
|
||||
func (m *BuildRouteResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*BuildRouteResponse) ProtoMessage() {}
|
||||
func (*BuildRouteResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{18}
|
||||
return fileDescriptor_7a0613f69d37b0a5, []int{16}
|
||||
}
|
||||
|
||||
func (m *BuildRouteResponse) XXX_Unmarshal(b []byte) error {
|
||||
@ -1503,7 +1120,6 @@ func (m *BuildRouteResponse) GetRoute() *lnrpc.Route {
|
||||
|
||||
func init() {
|
||||
proto.RegisterEnum("routerrpc.PaymentState", PaymentState_name, PaymentState_value)
|
||||
proto.RegisterEnum("routerrpc.Failure_FailureCode", Failure_FailureCode_name, Failure_FailureCode_value)
|
||||
proto.RegisterType((*SendPaymentRequest)(nil), "routerrpc.SendPaymentRequest")
|
||||
proto.RegisterMapType((map[uint64][]byte)(nil), "routerrpc.SendPaymentRequest.DestCustomRecordsEntry")
|
||||
proto.RegisterType((*TrackPaymentRequest)(nil), "routerrpc.TrackPaymentRequest")
|
||||
@ -1512,8 +1128,6 @@ func init() {
|
||||
proto.RegisterType((*RouteFeeResponse)(nil), "routerrpc.RouteFeeResponse")
|
||||
proto.RegisterType((*SendToRouteRequest)(nil), "routerrpc.SendToRouteRequest")
|
||||
proto.RegisterType((*SendToRouteResponse)(nil), "routerrpc.SendToRouteResponse")
|
||||
proto.RegisterType((*Failure)(nil), "routerrpc.Failure")
|
||||
proto.RegisterType((*ChannelUpdate)(nil), "routerrpc.ChannelUpdate")
|
||||
proto.RegisterType((*ResetMissionControlRequest)(nil), "routerrpc.ResetMissionControlRequest")
|
||||
proto.RegisterType((*ResetMissionControlResponse)(nil), "routerrpc.ResetMissionControlResponse")
|
||||
proto.RegisterType((*QueryMissionControlRequest)(nil), "routerrpc.QueryMissionControlRequest")
|
||||
@ -1529,140 +1143,95 @@ func init() {
|
||||
func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) }
|
||||
|
||||
var fileDescriptor_7a0613f69d37b0a5 = []byte{
|
||||
// 2126 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0xcd, 0x76, 0xdb, 0xc6,
|
||||
0x15, 0x0e, 0xc4, 0x5f, 0x5d, 0xfe, 0x41, 0x23, 0x45, 0xa2, 0x29, 0x2b, 0x61, 0x10, 0xd7, 0xe1,
|
||||
0xf1, 0x71, 0x24, 0x47, 0x6d, 0x7c, 0x7c, 0xba, 0x68, 0x0f, 0x45, 0x82, 0x11, 0x64, 0x12, 0x94,
|
||||
0x87, 0xa4, 0x13, 0x37, 0x8b, 0x39, 0x10, 0x39, 0x12, 0x51, 0xe1, 0x87, 0x01, 0x86, 0x8e, 0xf5,
|
||||
0x02, 0x5d, 0xf4, 0x45, 0xda, 0x4d, 0xbb, 0xe9, 0xba, 0xaf, 0xd3, 0xf6, 0x11, 0xba, 0xec, 0x99,
|
||||
0x19, 0x80, 0x04, 0x29, 0xca, 0xe9, 0x4a, 0xc4, 0x77, 0xbf, 0xb9, 0x77, 0x66, 0xee, 0xdc, 0x3f,
|
||||
0xc1, 0x7e, 0xe0, 0xcf, 0x19, 0x0d, 0x82, 0xd9, 0xf8, 0x44, 0xfe, 0x3a, 0x9e, 0x05, 0x3e, 0xf3,
|
||||
0xd1, 0xf6, 0x02, 0xaf, 0x6d, 0x07, 0xb3, 0xb1, 0x44, 0xb5, 0xff, 0x66, 0x00, 0x0d, 0xa8, 0x37,
|
||||
0xb9, 0xb4, 0xee, 0x5c, 0xea, 0x31, 0x4c, 0x7f, 0x9a, 0xd3, 0x90, 0x21, 0x04, 0xe9, 0x09, 0x0d,
|
||||
0x59, 0x55, 0xa9, 0x2b, 0x8d, 0x22, 0x16, 0xbf, 0x91, 0x0a, 0x29, 0xcb, 0x65, 0xd5, 0xad, 0xba,
|
||||
0xd2, 0x48, 0x61, 0xfe, 0x13, 0x3d, 0x82, 0xbc, 0xe5, 0x32, 0xe2, 0x86, 0x16, 0xab, 0x16, 0x05,
|
||||
0x9c, 0xb3, 0x5c, 0xd6, 0x0b, 0x2d, 0x86, 0xbe, 0x80, 0xe2, 0x4c, 0xaa, 0x24, 0x53, 0x2b, 0x9c,
|
||||
0x56, 0x53, 0x42, 0x51, 0x21, 0xc2, 0xce, 0xad, 0x70, 0x8a, 0x1a, 0xa0, 0x5e, 0xdb, 0x9e, 0xe5,
|
||||
0x90, 0xb1, 0xc3, 0xde, 0x93, 0x09, 0x75, 0x98, 0x55, 0x4d, 0xd7, 0x95, 0x46, 0x06, 0x97, 0x05,
|
||||
0xde, 0x72, 0xd8, 0xfb, 0x36, 0x47, 0xd1, 0x57, 0x50, 0x89, 0x95, 0x05, 0x72, 0x83, 0xd5, 0x4c,
|
||||
0x5d, 0x69, 0x6c, 0xe3, 0xf2, 0x6c, 0x75, 0xdb, 0x5f, 0x41, 0x85, 0xd9, 0x2e, 0xf5, 0xe7, 0x8c,
|
||||
0x84, 0x74, 0xec, 0x7b, 0x93, 0xb0, 0x9a, 0x95, 0x1a, 0x23, 0x78, 0x20, 0x51, 0xa4, 0x41, 0xe9,
|
||||
0x9a, 0x52, 0xe2, 0xd8, 0xae, 0xcd, 0x08, 0xdf, 0x7e, 0x4e, 0x6c, 0xbf, 0x70, 0x4d, 0x69, 0x97,
|
||||
0x63, 0x03, 0x8b, 0xa1, 0x27, 0x50, 0x5e, 0x72, 0xc4, 0x19, 0x4b, 0x82, 0x54, 0x8c, 0x49, 0xe2,
|
||||
0xa0, 0xcf, 0x41, 0xf5, 0xe7, 0xec, 0xc6, 0xb7, 0xbd, 0x1b, 0x32, 0x9e, 0x5a, 0x1e, 0xb1, 0x27,
|
||||
0xd5, 0x7c, 0x5d, 0x69, 0xa4, 0xcf, 0xb6, 0x5e, 0x28, 0xb8, 0x1c, 0xcb, 0x5a, 0x53, 0xcb, 0x33,
|
||||
0x26, 0xe8, 0x29, 0x54, 0x1c, 0x2b, 0x64, 0x64, 0xea, 0xcf, 0xc8, 0x6c, 0x7e, 0x75, 0x4b, 0xef,
|
||||
0xaa, 0x65, 0x71, 0x33, 0x25, 0x0e, 0x9f, 0xfb, 0xb3, 0x4b, 0x01, 0xa2, 0x23, 0x00, 0x71, 0x2b,
|
||||
0xc2, 0x78, 0x75, 0x5b, 0x9c, 0x61, 0x9b, 0x23, 0xc2, 0x30, 0xfa, 0x06, 0x0a, 0xc2, 0x9b, 0x64,
|
||||
0x6a, 0x7b, 0x2c, 0xac, 0x42, 0x3d, 0xd5, 0x28, 0x9c, 0xaa, 0xc7, 0x8e, 0xc7, 0x1d, 0x8b, 0xb9,
|
||||
0xe4, 0xdc, 0xf6, 0x18, 0x86, 0x20, 0xfe, 0x19, 0xa2, 0x09, 0xec, 0x72, 0x2f, 0x92, 0xf1, 0x3c,
|
||||
0x64, 0xbe, 0x4b, 0x02, 0x3a, 0xf6, 0x83, 0x49, 0x58, 0x2d, 0x88, 0xa5, 0xbf, 0x39, 0x5e, 0x3c,
|
||||
0x8e, 0xe3, 0xfb, 0xaf, 0xe1, 0xb8, 0x4d, 0x43, 0xd6, 0x12, 0xeb, 0xb0, 0x5c, 0xa6, 0x7b, 0x2c,
|
||||
0xb8, 0xc3, 0x3b, 0x93, 0x75, 0x1c, 0x3d, 0x07, 0x64, 0x39, 0x8e, 0xff, 0x33, 0x09, 0xa9, 0x73,
|
||||
0x4d, 0x22, 0xef, 0x54, 0x2b, 0x75, 0xa5, 0x91, 0xc7, 0xaa, 0x90, 0x0c, 0xa8, 0x73, 0x1d, 0xa9,
|
||||
0x47, 0x2f, 0xa1, 0x24, 0xf6, 0x74, 0x4d, 0x2d, 0x36, 0x0f, 0x68, 0x58, 0x55, 0xeb, 0xa9, 0x46,
|
||||
0xf9, 0x74, 0x27, 0x3a, 0x48, 0x47, 0xc2, 0x67, 0x36, 0xc3, 0x45, 0xce, 0x8b, 0xbe, 0xc3, 0x5a,
|
||||
0x1b, 0xf6, 0x37, 0x6f, 0x89, 0xbf, 0x51, 0x7e, 0xa7, 0xfc, 0xd9, 0xa6, 0x31, 0xff, 0x89, 0xf6,
|
||||
0x20, 0xf3, 0xde, 0x72, 0xe6, 0x54, 0xbc, 0xdb, 0x22, 0x96, 0x1f, 0xbf, 0xdd, 0x7a, 0xa5, 0x68,
|
||||
0xaf, 0x60, 0x77, 0x18, 0x58, 0xe3, 0xdb, 0xb5, 0xa7, 0xbf, 0xfe, 0x72, 0x95, 0x7b, 0x2f, 0x57,
|
||||
0xfb, 0xab, 0x02, 0xa5, 0x68, 0xd5, 0x80, 0x59, 0x6c, 0x1e, 0xa2, 0xaf, 0x21, 0x13, 0x32, 0x8b,
|
||||
0x51, 0xc1, 0x2e, 0x9f, 0x1e, 0x24, 0xee, 0x33, 0x41, 0xa4, 0x58, 0xb2, 0x50, 0x0d, 0xf2, 0xb3,
|
||||
0x80, 0xda, 0xae, 0x75, 0x13, 0xef, 0x6b, 0xf1, 0x8d, 0x34, 0xc8, 0x88, 0xc5, 0x22, 0x64, 0x0a,
|
||||
0xa7, 0xc5, 0xa4, 0x57, 0xb1, 0x14, 0xa1, 0x06, 0x64, 0xa6, 0xcc, 0x19, 0x87, 0xd5, 0xb4, 0x70,
|
||||
0x1f, 0x8a, 0x38, 0xe7, 0xc3, 0x6e, 0xab, 0xc9, 0x18, 0x75, 0x67, 0x0c, 0x4b, 0x82, 0xf6, 0x3b,
|
||||
0xa8, 0x88, 0x95, 0x1d, 0x4a, 0x3f, 0x16, 0xdb, 0x07, 0xc0, 0x23, 0x57, 0x44, 0x82, 0x8c, 0xef,
|
||||
0xac, 0xe5, 0xf2, 0x20, 0xd0, 0x26, 0xa0, 0x2e, 0xd7, 0x87, 0x33, 0xdf, 0x0b, 0xb9, 0x75, 0x95,
|
||||
0x6f, 0x83, 0xbf, 0x78, 0x1e, 0x20, 0x22, 0x34, 0x14, 0xb1, 0xaa, 0x1c, 0xe1, 0x1d, 0x4a, 0x45,
|
||||
0x70, 0x3c, 0x95, 0xf1, 0x48, 0x1c, 0x7f, 0x7c, 0xcb, 0x23, 0xdc, 0xba, 0x8b, 0xd4, 0x97, 0x38,
|
||||
0xdc, 0xf5, 0xc7, 0xb7, 0x6d, 0x0e, 0x6a, 0x3f, 0xca, 0x24, 0x34, 0xf4, 0xe5, 0x29, 0xff, 0x6f,
|
||||
0x4f, 0x2c, 0x2f, 0x6b, 0xeb, 0xc1, 0xcb, 0xd2, 0x08, 0xec, 0xae, 0x28, 0x8f, 0x4e, 0x91, 0xf4,
|
||||
0x81, 0xb2, 0xe6, 0x83, 0xe7, 0x90, 0xbb, 0xb6, 0x6c, 0x67, 0x1e, 0xc4, 0x8a, 0x51, 0xc2, 0xa1,
|
||||
0x1d, 0x29, 0xc1, 0x31, 0x45, 0xfb, 0x53, 0x1e, 0x72, 0x11, 0x88, 0x4e, 0x21, 0x3d, 0xf6, 0x27,
|
||||
0xf1, 0x3b, 0xf8, 0xec, 0xfe, 0xb2, 0xf8, 0x6f, 0xcb, 0x9f, 0x50, 0x2c, 0xb8, 0xe8, 0xf7, 0x50,
|
||||
0xe6, 0x99, 0xc3, 0xa3, 0x0e, 0x99, 0xcf, 0x26, 0xd6, 0xc2, 0xf5, 0xd5, 0xc4, 0xea, 0x96, 0x24,
|
||||
0x8c, 0x84, 0x1c, 0x97, 0xc6, 0xc9, 0x4f, 0x74, 0x08, 0xdb, 0xdc, 0xdb, 0xd2, 0x13, 0x69, 0xf1,
|
||||
0xf6, 0xf3, 0x1c, 0x10, 0x3e, 0xd0, 0xa0, 0xe4, 0x7b, 0xb6, 0xef, 0x91, 0x70, 0x6a, 0x91, 0xd3,
|
||||
0x6f, 0x5f, 0x8a, 0xd4, 0x59, 0xc4, 0x05, 0x01, 0x0e, 0xa6, 0xd6, 0xe9, 0xb7, 0x2f, 0xd1, 0xe7,
|
||||
0x50, 0x10, 0xe9, 0x86, 0x7e, 0x98, 0xd9, 0xc1, 0x9d, 0xc8, 0x99, 0x25, 0x2c, 0x32, 0x90, 0x2e,
|
||||
0x10, 0x1e, 0x45, 0xd7, 0x8e, 0x75, 0x13, 0x8a, 0x3c, 0x59, 0xc2, 0xf2, 0x03, 0xbd, 0x80, 0xbd,
|
||||
0xe8, 0x0e, 0x48, 0xe8, 0xcf, 0x83, 0x31, 0x25, 0xb6, 0x37, 0xa1, 0x1f, 0x44, 0xfe, 0x2b, 0x61,
|
||||
0x14, 0xc9, 0x06, 0x42, 0x64, 0x70, 0x09, 0xda, 0x87, 0xec, 0x94, 0xda, 0x37, 0x53, 0x99, 0xd3,
|
||||
0x4a, 0x38, 0xfa, 0xd2, 0xfe, 0x99, 0x81, 0x42, 0xe2, 0x62, 0x50, 0x11, 0xf2, 0x58, 0x1f, 0xe8,
|
||||
0xf8, 0xad, 0xde, 0x56, 0x3f, 0x41, 0x0d, 0x78, 0x62, 0x98, 0xad, 0x3e, 0xc6, 0x7a, 0x6b, 0x48,
|
||||
0xfa, 0x98, 0x8c, 0xcc, 0xd7, 0x66, 0xff, 0x7b, 0x93, 0x5c, 0x36, 0xdf, 0xf5, 0x74, 0x73, 0x48,
|
||||
0xda, 0xfa, 0xb0, 0x69, 0x74, 0x07, 0xaa, 0x82, 0x1e, 0x43, 0x75, 0xc9, 0x8c, 0xc5, 0xcd, 0x5e,
|
||||
0x7f, 0x64, 0x0e, 0xd5, 0x2d, 0xf4, 0x39, 0x1c, 0x76, 0x0c, 0xb3, 0xd9, 0x25, 0x4b, 0x4e, 0xab,
|
||||
0x3b, 0x7c, 0x4b, 0xf4, 0x1f, 0x2e, 0x0d, 0xfc, 0x4e, 0x4d, 0x6d, 0x22, 0xf0, 0x98, 0x8a, 0x35,
|
||||
0xa4, 0xd1, 0x23, 0xf8, 0x54, 0x12, 0xe4, 0x12, 0x32, 0xec, 0xf7, 0xc9, 0xa0, 0xdf, 0x37, 0xd5,
|
||||
0x0c, 0xda, 0x81, 0x92, 0x61, 0xbe, 0x6d, 0x76, 0x8d, 0x36, 0xc1, 0x7a, 0xb3, 0xdb, 0x53, 0xb3,
|
||||
0x68, 0x17, 0x2a, 0xeb, 0xbc, 0x1c, 0x57, 0x11, 0xf3, 0xfa, 0xa6, 0xd1, 0x37, 0xc9, 0x5b, 0x1d,
|
||||
0x0f, 0x8c, 0xbe, 0xa9, 0xe6, 0xd1, 0x3e, 0xa0, 0x55, 0xd1, 0x79, 0xaf, 0xd9, 0x52, 0xb7, 0xd1,
|
||||
0xa7, 0xb0, 0xb3, 0x8a, 0xbf, 0xd6, 0xdf, 0xa9, 0x80, 0xaa, 0xb0, 0x27, 0x37, 0x46, 0xce, 0xf4,
|
||||
0x6e, 0xff, 0x7b, 0xd2, 0x33, 0x4c, 0xa3, 0x37, 0xea, 0xa9, 0x05, 0xb4, 0x07, 0x6a, 0x47, 0xd7,
|
||||
0x89, 0x61, 0x0e, 0x46, 0x9d, 0x8e, 0xd1, 0x32, 0x74, 0x73, 0xa8, 0x16, 0xa5, 0xe5, 0x4d, 0x07,
|
||||
0x2f, 0xf1, 0x05, 0xad, 0xf3, 0xa6, 0x69, 0xea, 0x5d, 0xd2, 0x36, 0x06, 0xcd, 0xb3, 0xae, 0xde,
|
||||
0x56, 0xcb, 0xe8, 0x08, 0x1e, 0x0d, 0xf5, 0xde, 0x65, 0x1f, 0x37, 0xf1, 0x3b, 0x12, 0xcb, 0x3b,
|
||||
0x4d, 0xa3, 0x3b, 0xc2, 0xba, 0x5a, 0x41, 0x5f, 0xc0, 0x11, 0xd6, 0xdf, 0x8c, 0x0c, 0xac, 0xb7,
|
||||
0x89, 0xd9, 0x6f, 0xeb, 0xa4, 0xa3, 0x37, 0x87, 0x23, 0xac, 0x93, 0x9e, 0x31, 0x18, 0x18, 0xe6,
|
||||
0x77, 0xaa, 0x8a, 0x9e, 0x40, 0x7d, 0x41, 0x59, 0x28, 0x58, 0x63, 0xed, 0xf0, 0xf3, 0xc5, 0x2e,
|
||||
0x35, 0xf5, 0x1f, 0x86, 0xe4, 0x52, 0xd7, 0xb1, 0x8a, 0x50, 0x0d, 0xf6, 0x97, 0xe6, 0xa5, 0x81,
|
||||
0xc8, 0xf6, 0x2e, 0x97, 0x5d, 0xea, 0xb8, 0xd7, 0x34, 0xb9, 0x83, 0x57, 0x64, 0x7b, 0x7c, 0xdb,
|
||||
0x4b, 0xd9, 0xfa, 0xb6, 0x3f, 0x45, 0x08, 0xca, 0x09, 0xaf, 0x74, 0x9a, 0x58, 0xdd, 0x47, 0x15,
|
||||
0x28, 0xf4, 0x2e, 0x2f, 0xc9, 0xd0, 0xe8, 0xe9, 0xfd, 0xd1, 0x50, 0x3d, 0x40, 0x7b, 0x50, 0x89,
|
||||
0xb7, 0x14, 0xaf, 0xfc, 0x57, 0x0e, 0x1d, 0x00, 0x1a, 0x99, 0x58, 0x6f, 0xb6, 0xf9, 0x0d, 0x2d,
|
||||
0x04, 0xff, 0xce, 0x5d, 0xa4, 0xf3, 0x5b, 0x6a, 0x4a, 0xfb, 0x47, 0x0a, 0x4a, 0x2b, 0x81, 0x8a,
|
||||
0x1e, 0xc3, 0x76, 0x68, 0xdf, 0x78, 0xa2, 0x6e, 0x45, 0x59, 0x66, 0x09, 0x88, 0x2a, 0x3f, 0xb5,
|
||||
0x6c, 0x4f, 0xa6, 0x37, 0x59, 0x08, 0xb6, 0x05, 0x22, 0x92, 0xdb, 0x21, 0xe4, 0xe2, 0x8e, 0x22,
|
||||
0xb5, 0xe8, 0x28, 0xb2, 0x63, 0xd9, 0x49, 0x3c, 0x86, 0x6d, 0x9e, 0x43, 0x43, 0x66, 0xb9, 0x33,
|
||||
0x11, 0xf3, 0x25, 0xbc, 0x04, 0xd0, 0x97, 0x50, 0x72, 0x69, 0x18, 0x5a, 0x37, 0x94, 0xc8, 0xb8,
|
||||
0x05, 0xc1, 0x28, 0x46, 0x60, 0x47, 0x84, 0xef, 0x97, 0x10, 0xe7, 0x91, 0x88, 0x94, 0x91, 0xa4,
|
||||
0x08, 0x94, 0xa4, 0xf5, 0x14, 0xce, 0xac, 0x28, 0x3d, 0x24, 0x53, 0x38, 0xb3, 0xd0, 0x33, 0xd8,
|
||||
0x91, 0x39, 0xc8, 0xf6, 0x6c, 0x77, 0xee, 0xca, 0x5c, 0x94, 0x13, 0xb9, 0xa8, 0x22, 0x72, 0x91,
|
||||
0xc4, 0x45, 0x4a, 0x7a, 0x04, 0xf9, 0x2b, 0x2b, 0xa4, 0xbc, 0x7a, 0x44, 0xb9, 0x22, 0xc7, 0xbf,
|
||||
0x3b, 0x94, 0x72, 0x11, 0xaf, 0x29, 0x01, 0xcf, 0x82, 0x32, 0x45, 0xe4, 0xae, 0x29, 0xc5, 0xfc,
|
||||
0x2e, 0x17, 0x16, 0xac, 0x0f, 0x4b, 0x0b, 0x85, 0x84, 0x05, 0x89, 0x0b, 0x0b, 0xcf, 0x60, 0x87,
|
||||
0x7e, 0x60, 0x81, 0x45, 0xfc, 0x99, 0xf5, 0xd3, 0x9c, 0x92, 0x89, 0xc5, 0x2c, 0xd1, 0xa2, 0x16,
|
||||
0x71, 0x45, 0x08, 0xfa, 0x02, 0x6f, 0x5b, 0xcc, 0xd2, 0x1e, 0x43, 0x0d, 0xd3, 0x90, 0xb2, 0x9e,
|
||||
0x1d, 0x86, 0xb6, 0xef, 0xb5, 0x7c, 0x8f, 0x05, 0xbe, 0x13, 0x15, 0x21, 0xed, 0x08, 0x0e, 0x37,
|
||||
0x4a, 0x65, 0x15, 0xe1, 0x8b, 0xdf, 0xcc, 0x69, 0x70, 0xb7, 0x79, 0xf1, 0x1b, 0x38, 0xdc, 0x28,
|
||||
0x8d, 0x4a, 0xd0, 0x73, 0xc8, 0xcc, 0x2c, 0x3b, 0x08, 0xab, 0x5b, 0xa2, 0x8c, 0xef, 0xaf, 0x74,
|
||||
0x0d, 0x76, 0x70, 0x6e, 0x87, 0xcc, 0x0f, 0xee, 0xb0, 0x24, 0x5d, 0xa4, 0xf3, 0x8a, 0xba, 0xa5,
|
||||
0xfd, 0x59, 0x81, 0x42, 0x42, 0xc8, 0x73, 0xbf, 0xe7, 0x4f, 0x28, 0xb9, 0x0e, 0x7c, 0x37, 0xae,
|
||||
0x63, 0x1c, 0xe8, 0x04, 0xbe, 0xcb, 0xcb, 0xba, 0x10, 0x32, 0x3f, 0x7a, 0x5d, 0x59, 0xfe, 0x39,
|
||||
0xf4, 0xd1, 0xd7, 0x90, 0x9b, 0x4a, 0x05, 0xc2, 0x47, 0x85, 0xd3, 0xdd, 0x35, 0xdb, 0xfc, 0x66,
|
||||
0x70, 0xcc, 0xb9, 0x48, 0xe7, 0x53, 0x6a, 0xfa, 0x22, 0x9d, 0x4f, 0xab, 0x99, 0x8b, 0x74, 0x3e,
|
||||
0xa3, 0x66, 0x2f, 0xd2, 0xf9, 0xac, 0x9a, 0xd3, 0xfe, 0xa3, 0x40, 0x3e, 0x66, 0xf3, 0x9d, 0xf0,
|
||||
0x8c, 0x4f, 0xf8, 0xbb, 0x88, 0xfa, 0x81, 0x3c, 0x07, 0x86, 0xb6, 0x4b, 0x51, 0x1d, 0x8a, 0x42,
|
||||
0xb8, 0xda, 0x65, 0x00, 0xc7, 0x9a, 0xa2, 0xd3, 0x10, 0x2d, 0x79, 0xcc, 0x58, 0x14, 0x32, 0xde,
|
||||
0x92, 0x4b, 0x4a, 0x3c, 0x55, 0x84, 0xf3, 0xf1, 0x98, 0x86, 0xa1, 0xb4, 0x92, 0x91, 0x94, 0x08,
|
||||
0x13, 0x86, 0x9e, 0x42, 0x25, 0xa6, 0xc4, 0xb6, 0xb2, 0xb2, 0xe5, 0x88, 0xe0, 0xc8, 0x5c, 0x03,
|
||||
0xd4, 0x24, 0xcf, 0x5d, 0x0e, 0x01, 0xe5, 0x25, 0x91, 0x1b, 0x95, 0x87, 0xd7, 0xfe, 0x08, 0x07,
|
||||
0xc2, 0x95, 0x97, 0x81, 0x7f, 0x65, 0x5d, 0xd9, 0x8e, 0xcd, 0xee, 0xe2, 0x3e, 0x85, 0x1f, 0x3c,
|
||||
0xf0, 0x5d, 0xe2, 0xc5, 0x85, 0xbf, 0x88, 0xf3, 0x1c, 0x30, 0x79, 0x25, 0x3b, 0x80, 0x1c, 0xf3,
|
||||
0xa5, 0x28, 0x72, 0x01, 0xf3, 0x85, 0x20, 0x39, 0x3c, 0xa5, 0x56, 0x86, 0x27, 0xed, 0x16, 0xaa,
|
||||
0xf7, 0x6d, 0x45, 0x6f, 0xa6, 0x0e, 0x85, 0xd9, 0x12, 0x16, 0xe6, 0x14, 0x9c, 0x84, 0x92, 0xbe,
|
||||
0xdd, 0xfa, 0x65, 0xdf, 0x6a, 0x7f, 0x51, 0x60, 0xe7, 0x6c, 0x6e, 0x3b, 0x93, 0x95, 0xde, 0x2b,
|
||||
0xb9, 0x3b, 0x65, 0x75, 0xb4, 0xdb, 0x34, 0xb7, 0x6d, 0x6d, 0x9c, 0xdb, 0x36, 0xcd, 0x46, 0xa9,
|
||||
0x07, 0x67, 0xa3, 0xcf, 0xa1, 0xb0, 0x1c, 0x8b, 0x64, 0x6b, 0x5b, 0xc4, 0x30, 0x8d, 0x67, 0xa2,
|
||||
0x50, 0x7b, 0x05, 0x28, 0xb9, 0xd1, 0xe8, 0x42, 0x16, 0x2d, 0xa0, 0xf2, 0x60, 0x0b, 0xf8, 0xec,
|
||||
0xef, 0x0a, 0x14, 0x93, 0x7d, 0x38, 0x2a, 0xc1, 0xb6, 0x61, 0x92, 0x4e, 0xd7, 0xf8, 0xee, 0x7c,
|
||||
0xa8, 0x7e, 0xc2, 0x3f, 0x07, 0xa3, 0x56, 0x4b, 0xd7, 0xdb, 0x7a, 0x5b, 0x55, 0x78, 0x85, 0xe0,
|
||||
0xb9, 0x5d, 0x6f, 0x2f, 0x0a, 0xc2, 0x16, 0xaf, 0xe5, 0x11, 0x66, 0xf6, 0x09, 0xee, 0x8f, 0x86,
|
||||
0xba, 0x9a, 0x42, 0x2a, 0x14, 0x23, 0x50, 0xc7, 0xb8, 0x8f, 0xd5, 0x34, 0x2f, 0x78, 0x11, 0x72,
|
||||
0xbf, 0x0f, 0x89, 0xdb, 0x94, 0x8c, 0xe8, 0x33, 0x62, 0xd6, 0xb2, 0x44, 0x93, 0xb3, 0x66, 0xb7,
|
||||
0x69, 0xb6, 0x74, 0x35, 0x7b, 0xfa, 0xb7, 0x0c, 0x64, 0xc5, 0x09, 0x02, 0x74, 0x0e, 0x85, 0xc4,
|
||||
0x48, 0x86, 0x8e, 0x3e, 0x3a, 0xaa, 0xd5, 0xaa, 0x9b, 0x27, 0x8f, 0x79, 0xf8, 0x42, 0x41, 0x17,
|
||||
0x50, 0x4c, 0x0e, 0x3c, 0x28, 0xd9, 0x9d, 0x6e, 0x98, 0x84, 0x3e, 0xaa, 0xeb, 0x35, 0xa8, 0x7a,
|
||||
0xc8, 0x6c, 0x97, 0x77, 0xa3, 0xd1, 0x7c, 0x80, 0x6a, 0x09, 0xfe, 0xda, 0xd0, 0x51, 0x3b, 0xdc,
|
||||
0x28, 0x8b, 0x5c, 0xd8, 0x95, 0x47, 0x8c, 0x3a, 0xf4, 0x7b, 0x47, 0x5c, 0x1d, 0x0b, 0x6a, 0x9f,
|
||||
0x3d, 0x24, 0x8e, 0xb4, 0x4d, 0x60, 0x77, 0x43, 0xc6, 0x46, 0xbf, 0x4a, 0xee, 0xe0, 0xc1, 0x7c,
|
||||
0x5f, 0x7b, 0xfa, 0x4b, 0xb4, 0xa5, 0x95, 0x0d, 0xa9, 0x7d, 0xc5, 0xca, 0xc3, 0x85, 0x61, 0xc5,
|
||||
0xca, 0xc7, 0x2a, 0xc4, 0x8f, 0xa0, 0xae, 0x67, 0x02, 0xa4, 0xad, 0xaf, 0xbd, 0x9f, 0x92, 0x6a,
|
||||
0x5f, 0x7e, 0x94, 0x13, 0x29, 0x37, 0x00, 0x96, 0xf1, 0x84, 0x1e, 0x27, 0x96, 0xdc, 0xcb, 0x07,
|
||||
0xb5, 0xa3, 0x07, 0xa4, 0x52, 0xd5, 0xd9, 0x37, 0x7f, 0x38, 0xb9, 0xb1, 0xd9, 0x74, 0x7e, 0x75,
|
||||
0x3c, 0xf6, 0xdd, 0x13, 0x87, 0xf7, 0xf4, 0x9e, 0xed, 0xdd, 0x78, 0x94, 0xfd, 0xec, 0x07, 0xb7,
|
||||
0x27, 0x8e, 0x37, 0x39, 0x11, 0x61, 0x79, 0xb2, 0xd0, 0x72, 0x95, 0x15, 0xff, 0x80, 0xfa, 0xf5,
|
||||
0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x77, 0x3e, 0x21, 0x8e, 0xb0, 0x12, 0x00, 0x00,
|
||||
// 1404 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xdb, 0x52, 0xdb, 0xd6,
|
||||
0x1a, 0xde, 0xf2, 0x09, 0xf3, 0xdb, 0x18, 0x65, 0xb1, 0x27, 0xd1, 0x36, 0x21, 0xf1, 0xd6, 0xce,
|
||||
0x26, 0x9e, 0x4e, 0x02, 0x09, 0xed, 0x74, 0x32, 0xbd, 0xe8, 0x0c, 0xf8, 0x50, 0x4c, 0xcd, 0x21,
|
||||
0xcb, 0xe6, 0xa2, 0xcd, 0x85, 0x46, 0x58, 0xcb, 0x58, 0x45, 0xd2, 0x72, 0xb5, 0x96, 0x92, 0xe1,
|
||||
0x15, 0xfa, 0x22, 0xed, 0x4d, 0xfb, 0x5c, 0x7d, 0x84, 0x5e, 0x76, 0xd6, 0x41, 0x58, 0x36, 0x36,
|
||||
0xe9, 0x9d, 0xf5, 0xfd, 0xdf, 0x7f, 0x5a, 0xff, 0x09, 0xe0, 0x71, 0x4c, 0x13, 0x4e, 0xe2, 0x78,
|
||||
0x3a, 0xda, 0x57, 0xbf, 0xf6, 0xa6, 0x31, 0xe5, 0x14, 0xad, 0xdf, 0xe1, 0xf5, 0xf5, 0x78, 0x3a,
|
||||
0x52, 0xa8, 0xfd, 0x57, 0x11, 0xd0, 0x80, 0x44, 0xde, 0x85, 0x7b, 0x1b, 0x92, 0x88, 0x63, 0xf2,
|
||||
0x73, 0x42, 0x18, 0x47, 0x08, 0x0a, 0x1e, 0x61, 0xdc, 0x32, 0x1a, 0x46, 0xb3, 0x8a, 0xe5, 0x6f,
|
||||
0x64, 0x42, 0xde, 0x0d, 0xb9, 0x95, 0x6b, 0x18, 0xcd, 0x3c, 0x16, 0x3f, 0xd1, 0x7f, 0xa0, 0xec,
|
||||
0x86, 0xdc, 0x09, 0x99, 0xcb, 0xad, 0xaa, 0x84, 0xd7, 0xdc, 0x90, 0x9f, 0x32, 0x97, 0xa3, 0xff,
|
||||
0x42, 0x75, 0xaa, 0x4c, 0x3a, 0x13, 0x97, 0x4d, 0xac, 0xbc, 0x34, 0x54, 0xd1, 0xd8, 0xb1, 0xcb,
|
||||
0x26, 0xa8, 0x09, 0xe6, 0xd8, 0x8f, 0xdc, 0xc0, 0x19, 0x05, 0xfc, 0xa3, 0xe3, 0x91, 0x80, 0xbb,
|
||||
0x56, 0xa1, 0x61, 0x34, 0x8b, 0xb8, 0x26, 0xf1, 0x56, 0xc0, 0x3f, 0xb6, 0x05, 0x8a, 0x5e, 0xc2,
|
||||
0x66, 0x6a, 0x2c, 0x56, 0x01, 0x5a, 0xc5, 0x86, 0xd1, 0x5c, 0xc7, 0xb5, 0xe9, 0x7c, 0xd8, 0x2f,
|
||||
0x61, 0x93, 0xfb, 0x21, 0xa1, 0x09, 0x77, 0x18, 0x19, 0xd1, 0xc8, 0x63, 0x56, 0x49, 0x59, 0xd4,
|
||||
0xf0, 0x40, 0xa1, 0xc8, 0x86, 0x8d, 0x31, 0x21, 0x4e, 0xe0, 0x87, 0x3e, 0x77, 0x44, 0xf8, 0x6b,
|
||||
0x32, 0xfc, 0xca, 0x98, 0x90, 0xbe, 0xc0, 0x06, 0x2e, 0x47, 0x2f, 0xa0, 0x36, 0xe3, 0xc8, 0x1c,
|
||||
0x37, 0x24, 0xa9, 0x9a, 0x92, 0x64, 0xa2, 0xaf, 0xc0, 0xa4, 0x09, 0xbf, 0xa6, 0x7e, 0x74, 0xed,
|
||||
0x8c, 0x26, 0x6e, 0xe4, 0xf8, 0x9e, 0x55, 0x6e, 0x18, 0xcd, 0xc2, 0x51, 0xee, 0x8d, 0x81, 0x6b,
|
||||
0xa9, 0xac, 0x35, 0x71, 0xa3, 0x9e, 0x87, 0x76, 0x61, 0x33, 0x70, 0x19, 0x77, 0x26, 0x74, 0xea,
|
||||
0x4c, 0x93, 0xab, 0x1b, 0x72, 0x6b, 0xd5, 0xe4, 0xcb, 0x6c, 0x08, 0xf8, 0x98, 0x4e, 0x2f, 0x24,
|
||||
0x88, 0x76, 0x00, 0xe4, 0xab, 0x48, 0xe7, 0xd6, 0xba, 0xcc, 0x61, 0x5d, 0x20, 0xd2, 0x31, 0x7a,
|
||||
0x0b, 0x15, 0x59, 0x4d, 0x67, 0xe2, 0x47, 0x9c, 0x59, 0xd0, 0xc8, 0x37, 0x2b, 0x07, 0xe6, 0x5e,
|
||||
0x10, 0x89, 0xc2, 0x62, 0x21, 0x39, 0xf6, 0x23, 0x8e, 0x21, 0x4e, 0x7f, 0x32, 0xe4, 0xc1, 0x96,
|
||||
0xa8, 0xa2, 0x33, 0x4a, 0x18, 0xa7, 0xa1, 0x13, 0x93, 0x11, 0x8d, 0x3d, 0x66, 0x55, 0xa4, 0xea,
|
||||
0x57, 0x7b, 0x77, 0xcd, 0xb1, 0x77, 0xbf, 0x1b, 0xf6, 0xda, 0x84, 0xf1, 0x96, 0xd4, 0xc3, 0x4a,
|
||||
0xad, 0x13, 0xf1, 0xf8, 0x16, 0x3f, 0xf2, 0x16, 0x71, 0xf4, 0x0a, 0x90, 0x1b, 0x04, 0xf4, 0x93,
|
||||
0xc3, 0x48, 0x30, 0x76, 0x74, 0x75, 0xac, 0xcd, 0x86, 0xd1, 0x2c, 0x63, 0x53, 0x4a, 0x06, 0x24,
|
||||
0x18, 0x6b, 0xf3, 0xe8, 0x6b, 0xd8, 0x90, 0x31, 0x8d, 0x89, 0xcb, 0x93, 0x98, 0x30, 0xcb, 0x6c,
|
||||
0xe4, 0x9b, 0xb5, 0x83, 0x47, 0x3a, 0x91, 0xae, 0x82, 0x8f, 0x7c, 0x8e, 0xab, 0x82, 0xa7, 0xbf,
|
||||
0x59, 0xbd, 0x0d, 0x8f, 0x97, 0x87, 0x24, 0x7a, 0x54, 0xbc, 0xa9, 0x68, 0xdb, 0x02, 0x16, 0x3f,
|
||||
0xd1, 0xbf, 0xa1, 0xf8, 0xd1, 0x0d, 0x12, 0x22, 0xfb, 0xb6, 0x8a, 0xd5, 0xc7, 0x37, 0xb9, 0x77,
|
||||
0x86, 0xfd, 0x0e, 0xb6, 0x86, 0xb1, 0x3b, 0xba, 0x59, 0x68, 0xfd, 0xc5, 0xce, 0x35, 0xee, 0x75,
|
||||
0xae, 0xfd, 0x9b, 0x01, 0x1b, 0x5a, 0x6b, 0xc0, 0x5d, 0x9e, 0x30, 0xf4, 0x1a, 0x8a, 0x8c, 0xbb,
|
||||
0x9c, 0x48, 0x76, 0xed, 0xe0, 0x49, 0xe6, 0x3d, 0x33, 0x44, 0x82, 0x15, 0x0b, 0xd5, 0xa1, 0x3c,
|
||||
0x8d, 0x89, 0x1f, 0xba, 0xd7, 0x69, 0x5c, 0x77, 0xdf, 0xc8, 0x86, 0xa2, 0x54, 0x96, 0x23, 0x53,
|
||||
0x39, 0xa8, 0x66, 0xab, 0x8a, 0x95, 0x08, 0x35, 0xa1, 0x38, 0xe1, 0xc1, 0x88, 0x59, 0x05, 0x59,
|
||||
0x3e, 0xa4, 0x39, 0xc7, 0xc3, 0x7e, 0xeb, 0x90, 0x73, 0x12, 0x4e, 0x39, 0x56, 0x04, 0xfb, 0x5b,
|
||||
0xd8, 0x94, 0x9a, 0x5d, 0x42, 0x1e, 0x9a, 0xed, 0x27, 0x20, 0x26, 0x57, 0x4e, 0x82, 0x9a, 0xef,
|
||||
0x92, 0x1b, 0x8a, 0x21, 0xb0, 0x3d, 0x30, 0x67, 0xfa, 0x6c, 0x4a, 0x23, 0x26, 0xbc, 0x9b, 0x22,
|
||||
0x0c, 0xd1, 0xf1, 0x62, 0x40, 0xe4, 0x68, 0x18, 0x52, 0xab, 0xa6, 0xf1, 0x2e, 0x21, 0x72, 0x38,
|
||||
0x76, 0xd5, 0x3c, 0x3a, 0x01, 0x1d, 0xdd, 0x88, 0x09, 0x77, 0x6f, 0xb5, 0xf9, 0x0d, 0x01, 0xf7,
|
||||
0xe9, 0xe8, 0xa6, 0x2d, 0x40, 0xfb, 0x83, 0x5a, 0x42, 0x43, 0xaa, 0xb2, 0xfc, 0xc7, 0x95, 0x98,
|
||||
0x3d, 0x56, 0x6e, 0xe5, 0x63, 0xd9, 0x1f, 0x60, 0x6b, 0xce, 0xb8, 0xce, 0x22, 0x5b, 0x03, 0x63,
|
||||
0xa1, 0x06, 0x4d, 0x58, 0x1b, 0xbb, 0x7e, 0x90, 0xc4, 0xa9, 0xe1, 0x5a, 0xda, 0x92, 0x0a, 0xc5,
|
||||
0xa9, 0xd8, 0x7e, 0x0a, 0x75, 0x4c, 0x18, 0xe1, 0xa7, 0x3e, 0x63, 0x3e, 0x8d, 0x5a, 0x34, 0xe2,
|
||||
0x31, 0x0d, 0x74, 0x06, 0xf6, 0x0e, 0x6c, 0x2f, 0x95, 0xaa, 0x10, 0x84, 0xf2, 0xfb, 0x84, 0xc4,
|
||||
0xb7, 0xcb, 0x95, 0xdf, 0xc3, 0xf6, 0x52, 0xa9, 0x8e, 0xff, 0x15, 0x14, 0xa7, 0xae, 0x1f, 0x33,
|
||||
0x2b, 0x27, 0x7b, 0xe0, 0xf1, 0x5c, 0xcb, 0xf9, 0xf1, 0xb1, 0xcf, 0x38, 0x8d, 0x6f, 0xb1, 0x22,
|
||||
0x9d, 0x14, 0xca, 0x86, 0x99, 0xb3, 0x7f, 0x31, 0xa0, 0x92, 0x11, 0xa2, 0x6d, 0x58, 0x8f, 0xa8,
|
||||
0x47, 0x9c, 0x71, 0x4c, 0xc3, 0xf4, 0x11, 0x04, 0xd0, 0x8d, 0x69, 0x28, 0x7a, 0x42, 0x0a, 0x39,
|
||||
0xd5, 0x3d, 0x5a, 0x12, 0x9f, 0x43, 0x8a, 0x5e, 0xc3, 0xda, 0x44, 0x19, 0x90, 0x6b, 0xb3, 0x72,
|
||||
0xb0, 0xb5, 0xe0, 0xbb, 0xed, 0x72, 0x17, 0xa7, 0x9c, 0x93, 0x42, 0x39, 0x6f, 0x16, 0x4e, 0x0a,
|
||||
0xe5, 0x82, 0x59, 0x3c, 0x29, 0x94, 0x8b, 0x66, 0xe9, 0xa4, 0x50, 0x2e, 0x99, 0x6b, 0xf6, 0x9f,
|
||||
0x06, 0x94, 0x53, 0xb6, 0x88, 0x44, 0x3c, 0xa9, 0x23, 0xfa, 0x42, 0x37, 0x53, 0x59, 0x00, 0x43,
|
||||
0x3f, 0x24, 0xa8, 0x01, 0x55, 0x29, 0x9c, 0x6f, 0x51, 0x10, 0xd8, 0xa1, 0x6c, 0x53, 0xb9, 0xcf,
|
||||
0x53, 0x86, 0xec, 0xc7, 0x82, 0xde, 0xe7, 0x8a, 0x92, 0x9e, 0x24, 0x96, 0x8c, 0x46, 0x84, 0x31,
|
||||
0xe5, 0xa5, 0xa8, 0x28, 0x1a, 0x93, 0x8e, 0x76, 0x61, 0x33, 0xa5, 0xa4, 0xbe, 0x4a, 0xaa, 0x5f,
|
||||
0x35, 0xac, 0xdd, 0x35, 0xc1, 0xcc, 0xf2, 0xc2, 0xd9, 0x05, 0xa9, 0xcd, 0x88, 0xc2, 0xa9, 0x4a,
|
||||
0xde, 0xfe, 0x09, 0x9e, 0xc8, 0x52, 0x5e, 0xc4, 0xf4, 0xca, 0xbd, 0xf2, 0x03, 0x9f, 0xdf, 0xa6,
|
||||
0x4d, 0x2e, 0x12, 0x8f, 0x69, 0xe8, 0x88, 0xb7, 0x4d, 0x4b, 0x20, 0x80, 0x33, 0xea, 0x11, 0x51,
|
||||
0x02, 0x4e, 0x95, 0x48, 0x97, 0x80, 0x53, 0x29, 0xc8, 0x5e, 0xde, 0xfc, 0xdc, 0xe5, 0xb5, 0x6f,
|
||||
0xc0, 0xba, 0xef, 0x4b, 0xf7, 0x4c, 0x03, 0x2a, 0xd3, 0x19, 0x2c, 0xdd, 0x19, 0x38, 0x0b, 0x65,
|
||||
0x6b, 0x9b, 0xfb, 0x7c, 0x6d, 0xed, 0x5f, 0x0d, 0x78, 0x74, 0x94, 0xf8, 0x81, 0x37, 0x37, 0xb8,
|
||||
0xd9, 0xe8, 0x8c, 0xf9, 0xbf, 0x0b, 0x96, 0x1d, 0xfd, 0xdc, 0xd2, 0xa3, 0xbf, 0xec, 0xb0, 0xe6,
|
||||
0x57, 0x1e, 0xd6, 0xe7, 0x50, 0x99, 0xdd, 0x54, 0xb5, 0x17, 0xab, 0x18, 0x26, 0xe9, 0x41, 0x65,
|
||||
0xf6, 0x3b, 0x40, 0xd9, 0x40, 0xf5, 0x83, 0xdc, 0xed, 0x0f, 0x63, 0xe5, 0xfe, 0xf8, 0xe2, 0x0f,
|
||||
0x03, 0xaa, 0xd9, 0x25, 0x8e, 0x36, 0x60, 0xbd, 0x77, 0xe6, 0x74, 0xfb, 0xbd, 0xef, 0x8e, 0x87,
|
||||
0xe6, 0xbf, 0xc4, 0xe7, 0xe0, 0xb2, 0xd5, 0xea, 0x74, 0xda, 0x9d, 0xb6, 0x69, 0x20, 0x04, 0xb5,
|
||||
0xee, 0x61, 0xaf, 0xdf, 0x69, 0x3b, 0xc3, 0xde, 0x69, 0xe7, 0xfc, 0x72, 0x68, 0xe6, 0xd0, 0x16,
|
||||
0x6c, 0x6a, 0xec, 0xec, 0xdc, 0xc1, 0xe7, 0x97, 0xc3, 0x8e, 0x99, 0x47, 0x26, 0x54, 0x35, 0xd8,
|
||||
0xc1, 0xf8, 0x1c, 0x9b, 0x05, 0xf4, 0x02, 0x1a, 0x1a, 0xe9, 0x9d, 0xb5, 0xce, 0x31, 0xee, 0xb4,
|
||||
0x86, 0xce, 0xc5, 0xe1, 0x0f, 0xa7, 0x9d, 0xb3, 0xa1, 0xd3, 0xee, 0x0c, 0x0f, 0x7b, 0xfd, 0x81,
|
||||
0x59, 0x44, 0xcf, 0x61, 0xfb, 0x8e, 0x35, 0xb8, 0xec, 0x76, 0x7b, 0xad, 0x9e, 0x20, 0x1c, 0x1d,
|
||||
0xf6, 0x0f, 0xcf, 0x5a, 0x1d, 0xb3, 0x74, 0xf0, 0x7b, 0x11, 0x4a, 0x32, 0x83, 0x18, 0x1d, 0x43,
|
||||
0x25, 0x73, 0xcf, 0xd1, 0xce, 0x83, 0x77, 0xbe, 0x6e, 0x2d, 0x3f, 0x5b, 0x09, 0x7b, 0x63, 0xa0,
|
||||
0x13, 0xa8, 0x66, 0xaf, 0x25, 0x7a, 0x96, 0xe1, 0x2e, 0x39, 0xa3, 0x0f, 0xda, 0xfa, 0x1e, 0xcc,
|
||||
0x0e, 0xe3, 0x7e, 0x28, 0x2e, 0xa2, 0x3e, 0x2e, 0xa8, 0x9e, 0xe1, 0x2f, 0x5c, 0xac, 0xfa, 0xf6,
|
||||
0x52, 0x99, 0x2e, 0x61, 0x5f, 0xa5, 0xa8, 0xd7, 0xfb, 0xbd, 0x14, 0xe7, 0x6f, 0x4a, 0xfd, 0xd9,
|
||||
0x2a, 0xb1, 0xb6, 0xe6, 0xc1, 0xd6, 0x92, 0x8d, 0x8d, 0xfe, 0x9f, 0x8d, 0x60, 0xe5, 0xbe, 0xaf,
|
||||
0xef, 0x7e, 0x8e, 0x36, 0xf3, 0xb2, 0x64, 0xb5, 0xcf, 0x79, 0x59, 0x7d, 0x18, 0xe6, 0xbc, 0x3c,
|
||||
0x74, 0x21, 0x3e, 0x80, 0xb9, 0xb8, 0x09, 0x90, 0xbd, 0xa8, 0x7b, 0x7f, 0x25, 0xd5, 0xff, 0xf7,
|
||||
0x20, 0x47, 0x1b, 0xef, 0x01, 0xcc, 0xe6, 0x09, 0x3d, 0xcd, 0xa8, 0xdc, 0xdb, 0x07, 0xf5, 0x9d,
|
||||
0x15, 0x52, 0x65, 0xea, 0xe8, 0xed, 0x8f, 0xfb, 0xd7, 0x3e, 0x9f, 0x24, 0x57, 0x7b, 0x23, 0x1a,
|
||||
0xee, 0x07, 0xfe, 0xf5, 0x84, 0x47, 0x7e, 0x74, 0x1d, 0x11, 0xfe, 0x89, 0xc6, 0x37, 0xfb, 0x41,
|
||||
0xe4, 0xed, 0xcb, 0xb1, 0xdc, 0xbf, 0xb3, 0x72, 0x55, 0x92, 0xff, 0xbd, 0x7c, 0xf9, 0x77, 0x00,
|
||||
0x00, 0x00, 0xff, 0xff, 0x30, 0x2f, 0x8a, 0x5c, 0xed, 0x0c, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -222,167 +222,9 @@ message SendToRouteResponse {
|
||||
bytes preimage = 1;
|
||||
|
||||
/// The failure message in case the payment failed.
|
||||
Failure failure = 2;
|
||||
lnrpc.Failure failure = 2;
|
||||
}
|
||||
|
||||
message Failure {
|
||||
enum FailureCode {
|
||||
/**
|
||||
The numbers assigned in this enumeration match the failure codes as
|
||||
defined in BOLT #4. Because protobuf 3 requires enums to start with 0,
|
||||
a RESERVED value is added.
|
||||
*/
|
||||
RESERVED = 0;
|
||||
|
||||
INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS = 1;
|
||||
INCORRECT_PAYMENT_AMOUNT = 2;
|
||||
FINAL_INCORRECT_CLTV_EXPIRY = 3;
|
||||
FINAL_INCORRECT_HTLC_AMOUNT = 4;
|
||||
FINAL_EXPIRY_TOO_SOON = 5;
|
||||
INVALID_REALM = 6;
|
||||
EXPIRY_TOO_SOON = 7;
|
||||
INVALID_ONION_VERSION = 8;
|
||||
INVALID_ONION_HMAC = 9;
|
||||
INVALID_ONION_KEY = 10;
|
||||
AMOUNT_BELOW_MINIMUM = 11;
|
||||
FEE_INSUFFICIENT = 12;
|
||||
INCORRECT_CLTV_EXPIRY = 13;
|
||||
CHANNEL_DISABLED = 14;
|
||||
TEMPORARY_CHANNEL_FAILURE = 15;
|
||||
REQUIRED_NODE_FEATURE_MISSING = 16;
|
||||
REQUIRED_CHANNEL_FEATURE_MISSING = 17;
|
||||
UNKNOWN_NEXT_PEER = 18;
|
||||
TEMPORARY_NODE_FAILURE = 19;
|
||||
PERMANENT_NODE_FAILURE = 20;
|
||||
PERMANENT_CHANNEL_FAILURE = 21;
|
||||
EXPIRY_TOO_FAR = 22;
|
||||
MPP_TIMEOUT = 23;
|
||||
|
||||
/**
|
||||
The error source is known, but the failure itself couldn't be decoded.
|
||||
*/
|
||||
UNKNOWN_FAILURE = 998;
|
||||
|
||||
/**
|
||||
An unreadable failure result is returned if the received failure message
|
||||
cannot be decrypted. In that case the error source is unknown.
|
||||
*/
|
||||
UNREADABLE_FAILURE = 999;
|
||||
}
|
||||
|
||||
/// Failure code as defined in the Lightning spec
|
||||
FailureCode code = 1;
|
||||
|
||||
reserved 2;
|
||||
|
||||
/// An optional channel update message.
|
||||
ChannelUpdate channel_update = 3;
|
||||
|
||||
/// A failure type-dependent htlc value.
|
||||
uint64 htlc_msat = 4;
|
||||
|
||||
/// The sha256 sum of the onion payload.
|
||||
bytes onion_sha_256 = 5;
|
||||
|
||||
/// A failure type-dependent cltv expiry value.
|
||||
uint32 cltv_expiry = 6;
|
||||
|
||||
/// A failure type-dependent flags value.
|
||||
uint32 flags = 7;
|
||||
|
||||
/**
|
||||
The position in the path of the intermediate or final node that generated
|
||||
the failure message. Position zero is the sender node.
|
||||
**/
|
||||
uint32 failure_source_index = 8;
|
||||
|
||||
/// A failure type-dependent block height.
|
||||
uint32 height = 9;
|
||||
}
|
||||
|
||||
|
||||
message ChannelUpdate {
|
||||
/**
|
||||
The signature that validates the announced data and proves the ownership
|
||||
of node id.
|
||||
*/
|
||||
bytes signature = 1;
|
||||
|
||||
/**
|
||||
The target chain that this channel was opened within. This value
|
||||
should be the genesis hash of the target chain. Along with the short
|
||||
channel ID, this uniquely identifies the channel globally in a
|
||||
blockchain.
|
||||
*/
|
||||
bytes chain_hash = 2;
|
||||
|
||||
/**
|
||||
The unique description of the funding transaction.
|
||||
*/
|
||||
uint64 chan_id = 3 [jstype = JS_STRING];
|
||||
|
||||
/**
|
||||
A timestamp that allows ordering in the case of multiple announcements.
|
||||
We should ignore the message if timestamp is not greater than the
|
||||
last-received.
|
||||
*/
|
||||
uint32 timestamp = 4;
|
||||
|
||||
/**
|
||||
The bitfield that describes whether optional fields are present in this
|
||||
update. Currently, the least-significant bit must be set to 1 if the
|
||||
optional field MaxHtlc is present.
|
||||
*/
|
||||
uint32 message_flags = 10;
|
||||
|
||||
/**
|
||||
The bitfield that describes additional meta-data concerning how the
|
||||
update is to be interpreted. Currently, the least-significant bit must be
|
||||
set to 0 if the creating node corresponds to the first node in the
|
||||
previously sent channel announcement and 1 otherwise. If the second bit
|
||||
is set, then the channel is set to be disabled.
|
||||
*/
|
||||
uint32 channel_flags = 5;
|
||||
|
||||
/**
|
||||
The minimum number of blocks this node requires to be added to the expiry
|
||||
of HTLCs. This is a security parameter determined by the node operator.
|
||||
This value represents the required gap between the time locks of the
|
||||
incoming and outgoing HTLC's set to this node.
|
||||
*/
|
||||
uint32 time_lock_delta = 6;
|
||||
|
||||
/**
|
||||
The minimum HTLC value which will be accepted.
|
||||
*/
|
||||
uint64 htlc_minimum_msat = 7;
|
||||
|
||||
/**
|
||||
The base fee that must be used for incoming HTLC's to this particular
|
||||
channel. This value will be tacked onto the required for a payment
|
||||
independent of the size of the payment.
|
||||
*/
|
||||
uint32 base_fee = 8;
|
||||
|
||||
/**
|
||||
The fee rate that will be charged per millionth of a satoshi.
|
||||
*/
|
||||
uint32 fee_rate = 9;
|
||||
|
||||
/**
|
||||
The maximum HTLC value which will be accepted.
|
||||
*/
|
||||
uint64 htlc_maximum_msat = 11;
|
||||
|
||||
/**
|
||||
The set of data that was appended to this message, some of which we may
|
||||
not actually know how to iterate or parse. By holding onto this data, we
|
||||
ensure that we're able to properly validate the set of signatures that
|
||||
cover these new fields, and ensure we're able to make upgrades to the
|
||||
network in a forwards compatible manner.
|
||||
*/
|
||||
bytes extra_opaque_data = 12;
|
||||
}
|
||||
message ResetMissionControlRequest {
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ import (
|
||||
"github.com/btcsuite/btcd/chaincfg"
|
||||
"github.com/btcsuite/btcutil"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||
"github.com/lightningnetwork/lnd/lnrpc"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
@ -843,35 +844,72 @@ func UnmarshalMPP(reqMPP *lnrpc.MPPRecord) (*record.MPP, error) {
|
||||
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,
|
||||
rpcAttempt := &lnrpc.HTLCAttempt{
|
||||
AttemptTimeNs: MarshalTimeNano(htlc.AttemptTime),
|
||||
ResolveTimeNs: resolveTime,
|
||||
}, nil
|
||||
Route: route,
|
||||
}
|
||||
|
||||
switch {
|
||||
case htlc.Settle != nil:
|
||||
rpcAttempt.Status = lnrpc.HTLCAttempt_SUCCEEDED
|
||||
rpcAttempt.ResolveTimeNs = MarshalTimeNano(
|
||||
htlc.Settle.SettleTime,
|
||||
)
|
||||
|
||||
case htlc.Failure != nil:
|
||||
rpcAttempt.Status = lnrpc.HTLCAttempt_FAILED
|
||||
rpcAttempt.ResolveTimeNs = MarshalTimeNano(
|
||||
htlc.Failure.FailTime,
|
||||
)
|
||||
|
||||
var err error
|
||||
rpcAttempt.Failure, err = marshallHtlcFailure(htlc.Failure)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
default:
|
||||
rpcAttempt.Status = lnrpc.HTLCAttempt_IN_FLIGHT
|
||||
}
|
||||
|
||||
return rpcAttempt, nil
|
||||
}
|
||||
|
||||
// marshallHtlcFailure marshalls htlc fail info from the database to its rpc
|
||||
// representation.
|
||||
func marshallHtlcFailure(failure *channeldb.HTLCFailInfo) (*lnrpc.Failure,
|
||||
error) {
|
||||
|
||||
rpcFailure := &lnrpc.Failure{
|
||||
FailureSourceIndex: failure.FailureSourceIndex,
|
||||
}
|
||||
|
||||
switch failure.Reason {
|
||||
|
||||
case channeldb.HTLCFailUnknown:
|
||||
rpcFailure.Code = lnrpc.Failure_UNKNOWN_FAILURE
|
||||
|
||||
case channeldb.HTLCFailUnreadable:
|
||||
rpcFailure.Code = lnrpc.Failure_UNREADABLE_FAILURE
|
||||
|
||||
case channeldb.HTLCFailInternal:
|
||||
rpcFailure.Code = lnrpc.Failure_INTERNAL_FAILURE
|
||||
|
||||
case channeldb.HTLCFailMessage:
|
||||
err := marshallWireError(failure.Message, rpcFailure)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
default:
|
||||
return nil, errors.New("unknown htlc failure reason")
|
||||
}
|
||||
|
||||
return rpcFailure, nil
|
||||
}
|
||||
|
||||
// MarshalTimeNano converts a time.Time into its nanosecond representation. If
|
||||
@ -883,3 +921,170 @@ func MarshalTimeNano(t time.Time) int64 {
|
||||
}
|
||||
return t.UnixNano()
|
||||
}
|
||||
|
||||
// marshallError marshall an error as received from the switch to rpc structs
|
||||
// suitable for returning to the caller of an rpc method.
|
||||
//
|
||||
// Because of difficulties with using protobuf oneof constructs in some
|
||||
// languages, the decision was made here to use a single message format for all
|
||||
// failure messages with some fields left empty depending on the failure type.
|
||||
func marshallError(sendError error) (*lnrpc.Failure, error) {
|
||||
response := &lnrpc.Failure{}
|
||||
|
||||
if sendError == htlcswitch.ErrUnreadableFailureMessage {
|
||||
response.Code = lnrpc.Failure_UNREADABLE_FAILURE
|
||||
return response, nil
|
||||
}
|
||||
|
||||
rtErr, ok := sendError.(htlcswitch.ClearTextError)
|
||||
if !ok {
|
||||
return nil, sendError
|
||||
}
|
||||
|
||||
err := marshallWireError(rtErr.WireMessage(), response)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// If the ClearTextError received is a ForwardingError, the error
|
||||
// originated from a node along the route, not locally on our outgoing
|
||||
// link. We set failureSourceIdx to the index of the node where the
|
||||
// failure occurred. If the error is not a ForwardingError, the failure
|
||||
// occurred at our node, so we leave the index as 0 to indicate that
|
||||
// we failed locally.
|
||||
fErr, ok := rtErr.(*htlcswitch.ForwardingError)
|
||||
if ok {
|
||||
response.FailureSourceIndex = uint32(fErr.FailureSourceIdx)
|
||||
}
|
||||
|
||||
return response, nil
|
||||
}
|
||||
|
||||
// marshallError marshall an error as received from the switch to rpc structs
|
||||
// suitable for returning to the caller of an rpc method.
|
||||
//
|
||||
// Because of difficulties with using protobuf oneof constructs in some
|
||||
// languages, the decision was made here to use a single message format for all
|
||||
// failure messages with some fields left empty depending on the failure type.
|
||||
func marshallWireError(msg lnwire.FailureMessage,
|
||||
response *lnrpc.Failure) error {
|
||||
|
||||
switch onionErr := msg.(type) {
|
||||
|
||||
case *lnwire.FailIncorrectDetails:
|
||||
response.Code = lnrpc.Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS
|
||||
response.Height = onionErr.Height()
|
||||
|
||||
case *lnwire.FailIncorrectPaymentAmount:
|
||||
response.Code = lnrpc.Failure_INCORRECT_PAYMENT_AMOUNT
|
||||
|
||||
case *lnwire.FailFinalIncorrectCltvExpiry:
|
||||
response.Code = lnrpc.Failure_FINAL_INCORRECT_CLTV_EXPIRY
|
||||
response.CltvExpiry = onionErr.CltvExpiry
|
||||
|
||||
case *lnwire.FailFinalIncorrectHtlcAmount:
|
||||
response.Code = lnrpc.Failure_FINAL_INCORRECT_HTLC_AMOUNT
|
||||
response.HtlcMsat = uint64(onionErr.IncomingHTLCAmount)
|
||||
|
||||
case *lnwire.FailFinalExpiryTooSoon:
|
||||
response.Code = lnrpc.Failure_FINAL_EXPIRY_TOO_SOON
|
||||
|
||||
case *lnwire.FailInvalidRealm:
|
||||
response.Code = lnrpc.Failure_INVALID_REALM
|
||||
|
||||
case *lnwire.FailExpiryTooSoon:
|
||||
response.Code = lnrpc.Failure_EXPIRY_TOO_SOON
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
|
||||
case *lnwire.FailExpiryTooFar:
|
||||
response.Code = lnrpc.Failure_EXPIRY_TOO_FAR
|
||||
|
||||
case *lnwire.FailInvalidOnionVersion:
|
||||
response.Code = lnrpc.Failure_INVALID_ONION_VERSION
|
||||
response.OnionSha_256 = onionErr.OnionSHA256[:]
|
||||
|
||||
case *lnwire.FailInvalidOnionHmac:
|
||||
response.Code = lnrpc.Failure_INVALID_ONION_HMAC
|
||||
response.OnionSha_256 = onionErr.OnionSHA256[:]
|
||||
|
||||
case *lnwire.FailInvalidOnionKey:
|
||||
response.Code = lnrpc.Failure_INVALID_ONION_KEY
|
||||
response.OnionSha_256 = onionErr.OnionSHA256[:]
|
||||
|
||||
case *lnwire.FailAmountBelowMinimum:
|
||||
response.Code = lnrpc.Failure_AMOUNT_BELOW_MINIMUM
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.HtlcMsat = uint64(onionErr.HtlcMsat)
|
||||
|
||||
case *lnwire.FailFeeInsufficient:
|
||||
response.Code = lnrpc.Failure_FEE_INSUFFICIENT
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.HtlcMsat = uint64(onionErr.HtlcMsat)
|
||||
|
||||
case *lnwire.FailIncorrectCltvExpiry:
|
||||
response.Code = lnrpc.Failure_INCORRECT_CLTV_EXPIRY
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.CltvExpiry = onionErr.CltvExpiry
|
||||
|
||||
case *lnwire.FailChannelDisabled:
|
||||
response.Code = lnrpc.Failure_CHANNEL_DISABLED
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.Flags = uint32(onionErr.Flags)
|
||||
|
||||
case *lnwire.FailTemporaryChannelFailure:
|
||||
response.Code = lnrpc.Failure_TEMPORARY_CHANNEL_FAILURE
|
||||
response.ChannelUpdate = marshallChannelUpdate(onionErr.Update)
|
||||
|
||||
case *lnwire.FailRequiredNodeFeatureMissing:
|
||||
response.Code = lnrpc.Failure_REQUIRED_NODE_FEATURE_MISSING
|
||||
|
||||
case *lnwire.FailRequiredChannelFeatureMissing:
|
||||
response.Code = lnrpc.Failure_REQUIRED_CHANNEL_FEATURE_MISSING
|
||||
|
||||
case *lnwire.FailUnknownNextPeer:
|
||||
response.Code = lnrpc.Failure_UNKNOWN_NEXT_PEER
|
||||
|
||||
case *lnwire.FailTemporaryNodeFailure:
|
||||
response.Code = lnrpc.Failure_TEMPORARY_NODE_FAILURE
|
||||
|
||||
case *lnwire.FailPermanentNodeFailure:
|
||||
response.Code = lnrpc.Failure_PERMANENT_NODE_FAILURE
|
||||
|
||||
case *lnwire.FailPermanentChannelFailure:
|
||||
response.Code = lnrpc.Failure_PERMANENT_CHANNEL_FAILURE
|
||||
|
||||
case *lnwire.FailMPPTimeout:
|
||||
response.Code = lnrpc.Failure_MPP_TIMEOUT
|
||||
|
||||
case nil:
|
||||
response.Code = lnrpc.Failure_UNKNOWN_FAILURE
|
||||
|
||||
default:
|
||||
return fmt.Errorf("cannot marshall failure %T", onionErr)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// marshallChannelUpdate marshalls a channel update as received over the wire to
|
||||
// the router rpc format.
|
||||
func marshallChannelUpdate(update *lnwire.ChannelUpdate) *lnrpc.ChannelUpdate {
|
||||
if update == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &lnrpc.ChannelUpdate{
|
||||
Signature: update.Signature[:],
|
||||
ChainHash: update.ChainHash[:],
|
||||
ChanId: update.ShortChannelID.ToUint64(),
|
||||
Timestamp: update.Timestamp,
|
||||
MessageFlags: uint32(update.MessageFlags),
|
||||
ChannelFlags: uint32(update.ChannelFlags),
|
||||
TimeLockDelta: uint32(update.TimeLockDelta),
|
||||
HtlcMinimumMsat: uint64(update.HtlcMinimumMsat),
|
||||
BaseFee: update.BaseFee,
|
||||
FeeRate: update.FeeRate,
|
||||
HtlcMaximumMsat: uint64(update.HtlcMaximumMsat),
|
||||
ExtraOpaqueData: update.ExtraOpaqueData,
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,6 @@ import (
|
||||
|
||||
"github.com/btcsuite/btcutil"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||
"github.com/lightningnetwork/lnd/lnrpc"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
@ -312,156 +311,6 @@ func (s *Server) SendToRoute(ctx context.Context,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// marshallError marshall an error as received from the switch to rpc structs
|
||||
// suitable for returning to the caller of an rpc method.
|
||||
//
|
||||
// Because of difficulties with using protobuf oneof constructs in some
|
||||
// languages, the decision was made here to use a single message format for all
|
||||
// failure messages with some fields left empty depending on the failure type.
|
||||
func marshallError(sendError error) (*Failure, error) {
|
||||
response := &Failure{}
|
||||
|
||||
if sendError == htlcswitch.ErrUnreadableFailureMessage {
|
||||
response.Code = Failure_UNREADABLE_FAILURE
|
||||
return response, nil
|
||||
}
|
||||
|
||||
rtErr, ok := sendError.(htlcswitch.ClearTextError)
|
||||
if !ok {
|
||||
return nil, sendError
|
||||
}
|
||||
|
||||
switch onionErr := rtErr.WireMessage().(type) {
|
||||
|
||||
case *lnwire.FailIncorrectDetails:
|
||||
response.Code = Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS
|
||||
response.Height = onionErr.Height()
|
||||
|
||||
case *lnwire.FailIncorrectPaymentAmount:
|
||||
response.Code = Failure_INCORRECT_PAYMENT_AMOUNT
|
||||
|
||||
case *lnwire.FailFinalIncorrectCltvExpiry:
|
||||
response.Code = Failure_FINAL_INCORRECT_CLTV_EXPIRY
|
||||
response.CltvExpiry = onionErr.CltvExpiry
|
||||
|
||||
case *lnwire.FailFinalIncorrectHtlcAmount:
|
||||
response.Code = Failure_FINAL_INCORRECT_HTLC_AMOUNT
|
||||
response.HtlcMsat = uint64(onionErr.IncomingHTLCAmount)
|
||||
|
||||
case *lnwire.FailFinalExpiryTooSoon:
|
||||
response.Code = Failure_FINAL_EXPIRY_TOO_SOON
|
||||
|
||||
case *lnwire.FailInvalidRealm:
|
||||
response.Code = Failure_INVALID_REALM
|
||||
|
||||
case *lnwire.FailExpiryTooSoon:
|
||||
response.Code = Failure_EXPIRY_TOO_SOON
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
|
||||
case *lnwire.FailExpiryTooFar:
|
||||
response.Code = Failure_EXPIRY_TOO_FAR
|
||||
|
||||
case *lnwire.FailInvalidOnionVersion:
|
||||
response.Code = Failure_INVALID_ONION_VERSION
|
||||
response.OnionSha_256 = onionErr.OnionSHA256[:]
|
||||
|
||||
case *lnwire.FailInvalidOnionHmac:
|
||||
response.Code = Failure_INVALID_ONION_HMAC
|
||||
response.OnionSha_256 = onionErr.OnionSHA256[:]
|
||||
|
||||
case *lnwire.FailInvalidOnionKey:
|
||||
response.Code = Failure_INVALID_ONION_KEY
|
||||
response.OnionSha_256 = onionErr.OnionSHA256[:]
|
||||
|
||||
case *lnwire.FailAmountBelowMinimum:
|
||||
response.Code = Failure_AMOUNT_BELOW_MINIMUM
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.HtlcMsat = uint64(onionErr.HtlcMsat)
|
||||
|
||||
case *lnwire.FailFeeInsufficient:
|
||||
response.Code = Failure_FEE_INSUFFICIENT
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.HtlcMsat = uint64(onionErr.HtlcMsat)
|
||||
|
||||
case *lnwire.FailIncorrectCltvExpiry:
|
||||
response.Code = Failure_INCORRECT_CLTV_EXPIRY
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.CltvExpiry = onionErr.CltvExpiry
|
||||
|
||||
case *lnwire.FailChannelDisabled:
|
||||
response.Code = Failure_CHANNEL_DISABLED
|
||||
response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update)
|
||||
response.Flags = uint32(onionErr.Flags)
|
||||
|
||||
case *lnwire.FailTemporaryChannelFailure:
|
||||
response.Code = Failure_TEMPORARY_CHANNEL_FAILURE
|
||||
response.ChannelUpdate = marshallChannelUpdate(onionErr.Update)
|
||||
|
||||
case *lnwire.FailRequiredNodeFeatureMissing:
|
||||
response.Code = Failure_REQUIRED_NODE_FEATURE_MISSING
|
||||
|
||||
case *lnwire.FailRequiredChannelFeatureMissing:
|
||||
response.Code = Failure_REQUIRED_CHANNEL_FEATURE_MISSING
|
||||
|
||||
case *lnwire.FailUnknownNextPeer:
|
||||
response.Code = Failure_UNKNOWN_NEXT_PEER
|
||||
|
||||
case *lnwire.FailTemporaryNodeFailure:
|
||||
response.Code = Failure_TEMPORARY_NODE_FAILURE
|
||||
|
||||
case *lnwire.FailPermanentNodeFailure:
|
||||
response.Code = Failure_PERMANENT_NODE_FAILURE
|
||||
|
||||
case *lnwire.FailPermanentChannelFailure:
|
||||
response.Code = Failure_PERMANENT_CHANNEL_FAILURE
|
||||
|
||||
case *lnwire.FailMPPTimeout:
|
||||
response.Code = Failure_MPP_TIMEOUT
|
||||
|
||||
case nil:
|
||||
response.Code = Failure_UNKNOWN_FAILURE
|
||||
|
||||
default:
|
||||
return nil, fmt.Errorf("cannot marshall failure %T", onionErr)
|
||||
}
|
||||
|
||||
// If the ClearTextError received is a ForwardingError, the error
|
||||
// originated from a node along the route, not locally on our outgoing
|
||||
// link. We set failureSourceIdx to the index of the node where the
|
||||
// failure occurred. If the error is not a ForwardingError, the failure
|
||||
// occurred at our node, so we leave the index as 0 to indicate that
|
||||
// we failed locally.
|
||||
fErr, ok := rtErr.(*htlcswitch.ForwardingError)
|
||||
if ok {
|
||||
response.FailureSourceIndex = uint32(fErr.FailureSourceIdx)
|
||||
}
|
||||
|
||||
return response, nil
|
||||
}
|
||||
|
||||
// marshallChannelUpdate marshalls a channel update as received over the wire to
|
||||
// the router rpc format.
|
||||
func marshallChannelUpdate(update *lnwire.ChannelUpdate) *ChannelUpdate {
|
||||
if update == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &ChannelUpdate{
|
||||
Signature: update.Signature[:],
|
||||
ChainHash: update.ChainHash[:],
|
||||
ChanId: update.ShortChannelID.ToUint64(),
|
||||
Timestamp: update.Timestamp,
|
||||
MessageFlags: uint32(update.MessageFlags),
|
||||
ChannelFlags: uint32(update.ChannelFlags),
|
||||
TimeLockDelta: uint32(update.TimeLockDelta),
|
||||
HtlcMinimumMsat: uint64(update.HtlcMinimumMsat),
|
||||
BaseFee: update.BaseFee,
|
||||
FeeRate: update.FeeRate,
|
||||
HtlcMaximumMsat: uint64(update.HtlcMaximumMsat),
|
||||
ExtraOpaqueData: update.ExtraOpaqueData,
|
||||
}
|
||||
}
|
||||
|
||||
// ResetMissionControl clears all mission control state and starts with a clean
|
||||
// slate.
|
||||
func (s *Server) ResetMissionControl(ctx context.Context,
|
||||
|
1750
lnrpc/rpc.pb.go
1750
lnrpc/rpc.pb.go
@ -408,6 +408,117 @@ func (HTLCAttempt_HTLCStatus) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{113, 0}
|
||||
}
|
||||
|
||||
type Failure_FailureCode int32
|
||||
|
||||
const (
|
||||
//*
|
||||
//The numbers assigned in this enumeration match the failure codes as
|
||||
//defined in BOLT #4. Because protobuf 3 requires enums to start with 0,
|
||||
//a RESERVED value is added.
|
||||
Failure_RESERVED Failure_FailureCode = 0
|
||||
Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS Failure_FailureCode = 1
|
||||
Failure_INCORRECT_PAYMENT_AMOUNT Failure_FailureCode = 2
|
||||
Failure_FINAL_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 3
|
||||
Failure_FINAL_INCORRECT_HTLC_AMOUNT Failure_FailureCode = 4
|
||||
Failure_FINAL_EXPIRY_TOO_SOON Failure_FailureCode = 5
|
||||
Failure_INVALID_REALM Failure_FailureCode = 6
|
||||
Failure_EXPIRY_TOO_SOON Failure_FailureCode = 7
|
||||
Failure_INVALID_ONION_VERSION Failure_FailureCode = 8
|
||||
Failure_INVALID_ONION_HMAC Failure_FailureCode = 9
|
||||
Failure_INVALID_ONION_KEY Failure_FailureCode = 10
|
||||
Failure_AMOUNT_BELOW_MINIMUM Failure_FailureCode = 11
|
||||
Failure_FEE_INSUFFICIENT Failure_FailureCode = 12
|
||||
Failure_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 13
|
||||
Failure_CHANNEL_DISABLED Failure_FailureCode = 14
|
||||
Failure_TEMPORARY_CHANNEL_FAILURE Failure_FailureCode = 15
|
||||
Failure_REQUIRED_NODE_FEATURE_MISSING Failure_FailureCode = 16
|
||||
Failure_REQUIRED_CHANNEL_FEATURE_MISSING Failure_FailureCode = 17
|
||||
Failure_UNKNOWN_NEXT_PEER Failure_FailureCode = 18
|
||||
Failure_TEMPORARY_NODE_FAILURE Failure_FailureCode = 19
|
||||
Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20
|
||||
Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21
|
||||
Failure_EXPIRY_TOO_FAR Failure_FailureCode = 22
|
||||
Failure_MPP_TIMEOUT Failure_FailureCode = 23
|
||||
//*
|
||||
//An internal error occurred.
|
||||
Failure_INTERNAL_FAILURE Failure_FailureCode = 997
|
||||
//*
|
||||
//The error source is known, but the failure itself couldn't be decoded.
|
||||
Failure_UNKNOWN_FAILURE Failure_FailureCode = 998
|
||||
//*
|
||||
//An unreadable failure result is returned if the received failure message
|
||||
//cannot be decrypted. In that case the error source is unknown.
|
||||
Failure_UNREADABLE_FAILURE Failure_FailureCode = 999
|
||||
)
|
||||
|
||||
var Failure_FailureCode_name = map[int32]string{
|
||||
0: "RESERVED",
|
||||
1: "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS",
|
||||
2: "INCORRECT_PAYMENT_AMOUNT",
|
||||
3: "FINAL_INCORRECT_CLTV_EXPIRY",
|
||||
4: "FINAL_INCORRECT_HTLC_AMOUNT",
|
||||
5: "FINAL_EXPIRY_TOO_SOON",
|
||||
6: "INVALID_REALM",
|
||||
7: "EXPIRY_TOO_SOON",
|
||||
8: "INVALID_ONION_VERSION",
|
||||
9: "INVALID_ONION_HMAC",
|
||||
10: "INVALID_ONION_KEY",
|
||||
11: "AMOUNT_BELOW_MINIMUM",
|
||||
12: "FEE_INSUFFICIENT",
|
||||
13: "INCORRECT_CLTV_EXPIRY",
|
||||
14: "CHANNEL_DISABLED",
|
||||
15: "TEMPORARY_CHANNEL_FAILURE",
|
||||
16: "REQUIRED_NODE_FEATURE_MISSING",
|
||||
17: "REQUIRED_CHANNEL_FEATURE_MISSING",
|
||||
18: "UNKNOWN_NEXT_PEER",
|
||||
19: "TEMPORARY_NODE_FAILURE",
|
||||
20: "PERMANENT_NODE_FAILURE",
|
||||
21: "PERMANENT_CHANNEL_FAILURE",
|
||||
22: "EXPIRY_TOO_FAR",
|
||||
23: "MPP_TIMEOUT",
|
||||
997: "INTERNAL_FAILURE",
|
||||
998: "UNKNOWN_FAILURE",
|
||||
999: "UNREADABLE_FAILURE",
|
||||
}
|
||||
|
||||
var Failure_FailureCode_value = map[string]int32{
|
||||
"RESERVED": 0,
|
||||
"INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS": 1,
|
||||
"INCORRECT_PAYMENT_AMOUNT": 2,
|
||||
"FINAL_INCORRECT_CLTV_EXPIRY": 3,
|
||||
"FINAL_INCORRECT_HTLC_AMOUNT": 4,
|
||||
"FINAL_EXPIRY_TOO_SOON": 5,
|
||||
"INVALID_REALM": 6,
|
||||
"EXPIRY_TOO_SOON": 7,
|
||||
"INVALID_ONION_VERSION": 8,
|
||||
"INVALID_ONION_HMAC": 9,
|
||||
"INVALID_ONION_KEY": 10,
|
||||
"AMOUNT_BELOW_MINIMUM": 11,
|
||||
"FEE_INSUFFICIENT": 12,
|
||||
"INCORRECT_CLTV_EXPIRY": 13,
|
||||
"CHANNEL_DISABLED": 14,
|
||||
"TEMPORARY_CHANNEL_FAILURE": 15,
|
||||
"REQUIRED_NODE_FEATURE_MISSING": 16,
|
||||
"REQUIRED_CHANNEL_FEATURE_MISSING": 17,
|
||||
"UNKNOWN_NEXT_PEER": 18,
|
||||
"TEMPORARY_NODE_FAILURE": 19,
|
||||
"PERMANENT_NODE_FAILURE": 20,
|
||||
"PERMANENT_CHANNEL_FAILURE": 21,
|
||||
"EXPIRY_TOO_FAR": 22,
|
||||
"MPP_TIMEOUT": 23,
|
||||
"INTERNAL_FAILURE": 997,
|
||||
"UNKNOWN_FAILURE": 998,
|
||||
"UNREADABLE_FAILURE": 999,
|
||||
}
|
||||
|
||||
func (x Failure_FailureCode) String() string {
|
||||
return proto.EnumName(Failure_FailureCode_name, int32(x))
|
||||
}
|
||||
|
||||
func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{146, 0}
|
||||
}
|
||||
|
||||
type GenSeedRequest struct {
|
||||
//*
|
||||
//aezeed_passphrase is an optional user provided passphrase that will be used
|
||||
@ -8738,6 +8849,8 @@ type HTLCAttempt struct {
|
||||
//The time in UNIX nanoseconds 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,json=resolveTimeNs,proto3" json:"resolve_time_ns,omitempty"`
|
||||
// Detailed htlc failure info.
|
||||
Failure *Failure `protobuf:"bytes,5,opt,name=failure,proto3" json:"failure,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
@ -8796,6 +8909,13 @@ func (m *HTLCAttempt) GetResolveTimeNs() int64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *HTLCAttempt) GetFailure() *Failure {
|
||||
if m != nil {
|
||||
return m.Failure
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ListPaymentsRequest struct {
|
||||
//*
|
||||
//If true, then return payments that have not yet fully completed. This means
|
||||
@ -10469,6 +10589,283 @@ func (m *BakeMacaroonResponse) GetMacaroon() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
type Failure struct {
|
||||
/// Failure code as defined in the Lightning spec
|
||||
Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=lnrpc.Failure_FailureCode" json:"code,omitempty"`
|
||||
/// An optional channel update message.
|
||||
ChannelUpdate *ChannelUpdate `protobuf:"bytes,3,opt,name=channel_update,json=channelUpdate,proto3" json:"channel_update,omitempty"`
|
||||
/// A failure type-dependent htlc value.
|
||||
HtlcMsat uint64 `protobuf:"varint,4,opt,name=htlc_msat,json=htlcMsat,proto3" json:"htlc_msat,omitempty"`
|
||||
/// The sha256 sum of the onion payload.
|
||||
OnionSha_256 []byte `protobuf:"bytes,5,opt,name=onion_sha_256,json=onionSha256,proto3" json:"onion_sha_256,omitempty"`
|
||||
/// A failure type-dependent cltv expiry value.
|
||||
CltvExpiry uint32 `protobuf:"varint,6,opt,name=cltv_expiry,json=cltvExpiry,proto3" json:"cltv_expiry,omitempty"`
|
||||
/// A failure type-dependent flags value.
|
||||
Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"`
|
||||
//*
|
||||
//The position in the path of the intermediate or final node that generated
|
||||
//the failure message. Position zero is the sender node.
|
||||
FailureSourceIndex uint32 `protobuf:"varint,8,opt,name=failure_source_index,json=failureSourceIndex,proto3" json:"failure_source_index,omitempty"`
|
||||
/// A failure type-dependent block height.
|
||||
Height uint32 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Failure) Reset() { *m = Failure{} }
|
||||
func (m *Failure) String() string { return proto.CompactTextString(m) }
|
||||
func (*Failure) ProtoMessage() {}
|
||||
func (*Failure) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{146}
|
||||
}
|
||||
|
||||
func (m *Failure) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Failure.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Failure.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Failure) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Failure.Merge(m, src)
|
||||
}
|
||||
func (m *Failure) XXX_Size() int {
|
||||
return xxx_messageInfo_Failure.Size(m)
|
||||
}
|
||||
func (m *Failure) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Failure.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Failure proto.InternalMessageInfo
|
||||
|
||||
func (m *Failure) GetCode() Failure_FailureCode {
|
||||
if m != nil {
|
||||
return m.Code
|
||||
}
|
||||
return Failure_RESERVED
|
||||
}
|
||||
|
||||
func (m *Failure) GetChannelUpdate() *ChannelUpdate {
|
||||
if m != nil {
|
||||
return m.ChannelUpdate
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Failure) GetHtlcMsat() uint64 {
|
||||
if m != nil {
|
||||
return m.HtlcMsat
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetOnionSha_256() []byte {
|
||||
if m != nil {
|
||||
return m.OnionSha_256
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Failure) GetCltvExpiry() uint32 {
|
||||
if m != nil {
|
||||
return m.CltvExpiry
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetFlags() uint32 {
|
||||
if m != nil {
|
||||
return m.Flags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetFailureSourceIndex() uint32 {
|
||||
if m != nil {
|
||||
return m.FailureSourceIndex
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *Failure) GetHeight() uint32 {
|
||||
if m != nil {
|
||||
return m.Height
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type ChannelUpdate struct {
|
||||
//*
|
||||
//The signature that validates the announced data and proves the ownership
|
||||
//of node id.
|
||||
Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"`
|
||||
//*
|
||||
//The target chain that this channel was opened within. This value
|
||||
//should be the genesis hash of the target chain. Along with the short
|
||||
//channel ID, this uniquely identifies the channel globally in a
|
||||
//blockchain.
|
||||
ChainHash []byte `protobuf:"bytes,2,opt,name=chain_hash,json=chainHash,proto3" json:"chain_hash,omitempty"`
|
||||
//*
|
||||
//The unique description of the funding transaction.
|
||||
ChanId uint64 `protobuf:"varint,3,opt,name=chan_id,json=chanId,proto3" json:"chan_id,omitempty"`
|
||||
//*
|
||||
//A timestamp that allows ordering in the case of multiple announcements.
|
||||
//We should ignore the message if timestamp is not greater than the
|
||||
//last-received.
|
||||
Timestamp uint32 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
|
||||
//*
|
||||
//The bitfield that describes whether optional fields are present in this
|
||||
//update. Currently, the least-significant bit must be set to 1 if the
|
||||
//optional field MaxHtlc is present.
|
||||
MessageFlags uint32 `protobuf:"varint,10,opt,name=message_flags,json=messageFlags,proto3" json:"message_flags,omitempty"`
|
||||
//*
|
||||
//The bitfield that describes additional meta-data concerning how the
|
||||
//update is to be interpreted. Currently, the least-significant bit must be
|
||||
//set to 0 if the creating node corresponds to the first node in the
|
||||
//previously sent channel announcement and 1 otherwise. If the second bit
|
||||
//is set, then the channel is set to be disabled.
|
||||
ChannelFlags uint32 `protobuf:"varint,5,opt,name=channel_flags,json=channelFlags,proto3" json:"channel_flags,omitempty"`
|
||||
//*
|
||||
//The minimum number of blocks this node requires to be added to the expiry
|
||||
//of HTLCs. This is a security parameter determined by the node operator.
|
||||
//This value represents the required gap between the time locks of the
|
||||
//incoming and outgoing HTLC's set to this node.
|
||||
TimeLockDelta uint32 `protobuf:"varint,6,opt,name=time_lock_delta,json=timeLockDelta,proto3" json:"time_lock_delta,omitempty"`
|
||||
//*
|
||||
//The minimum HTLC value which will be accepted.
|
||||
HtlcMinimumMsat uint64 `protobuf:"varint,7,opt,name=htlc_minimum_msat,json=htlcMinimumMsat,proto3" json:"htlc_minimum_msat,omitempty"`
|
||||
//*
|
||||
//The base fee that must be used for incoming HTLC's to this particular
|
||||
//channel. This value will be tacked onto the required for a payment
|
||||
//independent of the size of the payment.
|
||||
BaseFee uint32 `protobuf:"varint,8,opt,name=base_fee,json=baseFee,proto3" json:"base_fee,omitempty"`
|
||||
//*
|
||||
//The fee rate that will be charged per millionth of a satoshi.
|
||||
FeeRate uint32 `protobuf:"varint,9,opt,name=fee_rate,json=feeRate,proto3" json:"fee_rate,omitempty"`
|
||||
//*
|
||||
//The maximum HTLC value which will be accepted.
|
||||
HtlcMaximumMsat uint64 `protobuf:"varint,11,opt,name=htlc_maximum_msat,json=htlcMaximumMsat,proto3" json:"htlc_maximum_msat,omitempty"`
|
||||
//*
|
||||
//The set of data that was appended to this message, some of which we may
|
||||
//not actually know how to iterate or parse. By holding onto this data, we
|
||||
//ensure that we're able to properly validate the set of signatures that
|
||||
//cover these new fields, and ensure we're able to make upgrades to the
|
||||
//network in a forwards compatible manner.
|
||||
ExtraOpaqueData []byte `protobuf:"bytes,12,opt,name=extra_opaque_data,json=extraOpaqueData,proto3" json:"extra_opaque_data,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} }
|
||||
func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) }
|
||||
func (*ChannelUpdate) ProtoMessage() {}
|
||||
func (*ChannelUpdate) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{147}
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_ChannelUpdate.Unmarshal(m, b)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_ChannelUpdate.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_ChannelUpdate.Merge(m, src)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_Size() int {
|
||||
return xxx_messageInfo_ChannelUpdate.Size(m)
|
||||
}
|
||||
func (m *ChannelUpdate) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_ChannelUpdate.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_ChannelUpdate proto.InternalMessageInfo
|
||||
|
||||
func (m *ChannelUpdate) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetChainHash() []byte {
|
||||
if m != nil {
|
||||
return m.ChainHash
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetChanId() uint64 {
|
||||
if m != nil {
|
||||
return m.ChanId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetTimestamp() uint32 {
|
||||
if m != nil {
|
||||
return m.Timestamp
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetMessageFlags() uint32 {
|
||||
if m != nil {
|
||||
return m.MessageFlags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetChannelFlags() uint32 {
|
||||
if m != nil {
|
||||
return m.ChannelFlags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetTimeLockDelta() uint32 {
|
||||
if m != nil {
|
||||
return m.TimeLockDelta
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetHtlcMinimumMsat() uint64 {
|
||||
if m != nil {
|
||||
return m.HtlcMinimumMsat
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetBaseFee() uint32 {
|
||||
if m != nil {
|
||||
return m.BaseFee
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetFeeRate() uint32 {
|
||||
if m != nil {
|
||||
return m.FeeRate
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetHtlcMaximumMsat() uint64 {
|
||||
if m != nil {
|
||||
return m.HtlcMaximumMsat
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ChannelUpdate) GetExtraOpaqueData() []byte {
|
||||
if m != nil {
|
||||
return m.ExtraOpaqueData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterEnum("lnrpc.AddressType", AddressType_name, AddressType_value)
|
||||
proto.RegisterEnum("lnrpc.InvoiceHTLCState", InvoiceHTLCState_name, InvoiceHTLCState_value)
|
||||
@ -10481,6 +10878,7 @@ func init() {
|
||||
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.RegisterEnum("lnrpc.Failure_FailureCode", Failure_FailureCode_name, Failure_FailureCode_value)
|
||||
proto.RegisterType((*GenSeedRequest)(nil), "lnrpc.GenSeedRequest")
|
||||
proto.RegisterType((*GenSeedResponse)(nil), "lnrpc.GenSeedResponse")
|
||||
proto.RegisterType((*InitWalletRequest)(nil), "lnrpc.InitWalletRequest")
|
||||
@ -10643,665 +11041,709 @@ func init() {
|
||||
proto.RegisterType((*MacaroonPermission)(nil), "lnrpc.MacaroonPermission")
|
||||
proto.RegisterType((*BakeMacaroonRequest)(nil), "lnrpc.BakeMacaroonRequest")
|
||||
proto.RegisterType((*BakeMacaroonResponse)(nil), "lnrpc.BakeMacaroonResponse")
|
||||
proto.RegisterType((*Failure)(nil), "lnrpc.Failure")
|
||||
proto.RegisterType((*ChannelUpdate)(nil), "lnrpc.ChannelUpdate")
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
|
||||
|
||||
var fileDescriptor_77a6da22d6a3feb1 = []byte{
|
||||
// 10447 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x8f, 0x24, 0x47,
|
||||
0x76, 0x18, 0x3c, 0x75, 0xeb, 0xaa, 0x3a, 0x75, 0xe9, 0xea, 0xe8, 0x9e, 0xee, 0x9a, 0x1a, 0x0e,
|
||||
0x67, 0x98, 0xe4, 0x72, 0x86, 0x43, 0x72, 0x66, 0x38, 0x4b, 0x2e, 0x29, 0xf2, 0xfb, 0x56, 0xea,
|
||||
0x2b, 0xbb, 0x77, 0xfa, 0xc6, 0xac, 0x9e, 0xa5, 0xb8, 0x6b, 0x39, 0x37, 0xbb, 0x2a, 0xba, 0x3b,
|
||||
0x35, 0x55, 0x99, 0xc5, 0xcc, 0xac, 0xbe, 0x2c, 0x41, 0x3f, 0xf8, 0x22, 0x18, 0xb6, 0x61, 0x40,
|
||||
0xb0, 0x65, 0xc0, 0xb2, 0x05, 0x1b, 0x36, 0x0c, 0xc3, 0xb0, 0x21, 0xc8, 0x58, 0x19, 0xf0, 0x83,
|
||||
0xdf, 0xf5, 0x62, 0x43, 0x0f, 0xb2, 0x5f, 0x8c, 0x85, 0x00, 0xc1, 0x82, 0x9e, 0xf5, 0x13, 0x8c,
|
||||
0x38, 0x27, 0x22, 0x32, 0xb2, 0x2a, 0x6b, 0x66, 0xc8, 0x5d, 0xef, 0xcb, 0x4c, 0xe7, 0x89, 0x13,
|
||||
0xf7, 0x13, 0x27, 0xce, 0x35, 0x0a, 0xaa, 0xe1, 0xa8, 0xf7, 0x60, 0x14, 0x06, 0x71, 0xc0, 0x4a,
|
||||
0x03, 0x3f, 0x1c, 0xf5, 0x3a, 0xaf, 0x9c, 0x06, 0xc1, 0xe9, 0x80, 0x3f, 0x74, 0x47, 0xde, 0x43,
|
||||
0xd7, 0xf7, 0x83, 0xd8, 0x8d, 0xbd, 0xc0, 0x8f, 0x08, 0xc9, 0xfa, 0x09, 0x34, 0x3f, 0xe5, 0x7e,
|
||||
0x97, 0xf3, 0xbe, 0xcd, 0xbf, 0x1c, 0xf3, 0x28, 0x66, 0x6f, 0xc3, 0x82, 0xcb, 0x7f, 0xca, 0x79,
|
||||
0xdf, 0x19, 0xb9, 0x51, 0x34, 0x3a, 0x0b, 0xdd, 0x88, 0xb7, 0x73, 0x77, 0x72, 0xf7, 0xea, 0x76,
|
||||
0x8b, 0x0a, 0x0e, 0x35, 0x9c, 0xbd, 0x06, 0xf5, 0x48, 0xa0, 0x72, 0x3f, 0x0e, 0x83, 0xd1, 0x55,
|
||||
0x3b, 0x8f, 0x78, 0x35, 0x01, 0xdb, 0x24, 0x90, 0x35, 0x80, 0x79, 0xdd, 0x43, 0x34, 0x0a, 0xfc,
|
||||
0x88, 0xb3, 0x47, 0xb0, 0xd4, 0xf3, 0x46, 0x67, 0x3c, 0x74, 0xb0, 0xf2, 0xd0, 0xe7, 0xc3, 0xc0,
|
||||
0xf7, 0x7a, 0xed, 0xdc, 0x9d, 0xc2, 0xbd, 0xaa, 0xcd, 0xa8, 0x4c, 0xd4, 0xd8, 0x93, 0x25, 0xec,
|
||||
0x2e, 0xcc, 0x73, 0x9f, 0xe0, 0xbc, 0x8f, 0xb5, 0x64, 0x57, 0xcd, 0x04, 0x2c, 0x2a, 0x58, 0x7f,
|
||||
0x3f, 0x0f, 0x0b, 0x3b, 0xbe, 0x17, 0x7f, 0xee, 0x0e, 0x06, 0x3c, 0x56, 0x73, 0xba, 0x0b, 0xf3,
|
||||
0x17, 0x08, 0xc0, 0x39, 0x5d, 0x04, 0x61, 0x5f, 0xce, 0xa8, 0x49, 0xe0, 0x43, 0x09, 0x9d, 0x39,
|
||||
0xb2, 0xfc, 0xcc, 0x91, 0x65, 0x2e, 0x57, 0x61, 0xc6, 0x72, 0xdd, 0x85, 0xf9, 0x90, 0xf7, 0x82,
|
||||
0x73, 0x1e, 0x5e, 0x39, 0x17, 0x9e, 0xdf, 0x0f, 0x2e, 0xda, 0xc5, 0x3b, 0xb9, 0x7b, 0x25, 0xbb,
|
||||
0xa9, 0xc0, 0x9f, 0x23, 0x94, 0xad, 0xc1, 0x7c, 0xef, 0xcc, 0xf5, 0x7d, 0x3e, 0x70, 0x8e, 0xdd,
|
||||
0xde, 0xb3, 0xf1, 0x28, 0x6a, 0x97, 0xee, 0xe4, 0xee, 0xd5, 0x1e, 0xdf, 0x78, 0x80, 0xbb, 0xfa,
|
||||
0x60, 0xfd, 0xcc, 0xf5, 0xd7, 0xb0, 0xa4, 0xeb, 0xbb, 0xa3, 0xe8, 0x2c, 0x88, 0xed, 0xa6, 0xac,
|
||||
0x41, 0xe0, 0xc8, 0x5a, 0x02, 0x66, 0xae, 0x04, 0xad, 0xbd, 0xf5, 0x1f, 0x73, 0xb0, 0xf8, 0xd4,
|
||||
0x1f, 0x04, 0xbd, 0x67, 0xdf, 0x72, 0x89, 0x32, 0xe6, 0x90, 0x7f, 0xd9, 0x39, 0x14, 0xbe, 0xe9,
|
||||
0x1c, 0x96, 0x61, 0x29, 0x3d, 0x58, 0x39, 0x0b, 0x0e, 0xd7, 0x45, 0xed, 0x53, 0xae, 0x86, 0xa5,
|
||||
0xa6, 0xf1, 0x16, 0xb4, 0x7a, 0xe3, 0x30, 0xe4, 0xfe, 0xd4, 0x3c, 0xe6, 0x25, 0x5c, 0x4f, 0xe4,
|
||||
0x35, 0xa8, 0xfb, 0xfc, 0x22, 0x41, 0x93, 0xb4, 0xeb, 0xf3, 0x0b, 0x85, 0x62, 0xb5, 0x61, 0x79,
|
||||
0xb2, 0x1b, 0x39, 0x80, 0xbf, 0xca, 0x41, 0xf1, 0x69, 0x7c, 0x19, 0xb0, 0x0f, 0xa0, 0xee, 0xf6,
|
||||
0xfb, 0x21, 0x8f, 0x22, 0x27, 0xbe, 0x1a, 0xd1, 0x49, 0x69, 0x3e, 0x66, 0x72, 0x8a, 0xab, 0x54,
|
||||
0x74, 0x74, 0x35, 0xe2, 0x76, 0xcd, 0x4d, 0x3e, 0x58, 0x1b, 0xca, 0xf2, 0x13, 0xfb, 0xad, 0xda,
|
||||
0xea, 0x93, 0xdd, 0x02, 0x70, 0x87, 0xc1, 0xd8, 0x8f, 0x9d, 0xc8, 0x8d, 0x71, 0xc5, 0x0a, 0x76,
|
||||
0x95, 0x20, 0x5d, 0x37, 0x66, 0x37, 0xa1, 0x3a, 0x7a, 0xe6, 0x44, 0xbd, 0xd0, 0x1b, 0xc5, 0x48,
|
||||
0x3c, 0x55, 0xbb, 0x32, 0x7a, 0xd6, 0xc5, 0x6f, 0xf6, 0x36, 0x54, 0x82, 0x71, 0x3c, 0x0a, 0x3c,
|
||||
0x3f, 0x96, 0xf4, 0x32, 0x2f, 0x07, 0x72, 0x30, 0x8e, 0x0f, 0x05, 0xd8, 0xd6, 0x08, 0xec, 0x0d,
|
||||
0x68, 0xf4, 0x02, 0xff, 0xc4, 0x0b, 0x87, 0xc4, 0x11, 0xda, 0x73, 0xd8, 0x57, 0x1a, 0x68, 0xfd,
|
||||
0x51, 0x1e, 0x6a, 0x47, 0xa1, 0xeb, 0x47, 0x6e, 0x4f, 0x00, 0xd8, 0x0a, 0x94, 0xe3, 0x4b, 0xe7,
|
||||
0xcc, 0x8d, 0xce, 0x70, 0xaa, 0x55, 0x7b, 0x2e, 0xbe, 0xdc, 0x76, 0xa3, 0x33, 0xb6, 0x0c, 0x73,
|
||||
0x34, 0x4a, 0x9c, 0x50, 0xc1, 0x96, 0x5f, 0xe2, 0x80, 0xf8, 0xe3, 0xa1, 0x93, 0xee, 0xaa, 0x80,
|
||||
0x14, 0xd3, 0xf2, 0xc7, 0xc3, 0x75, 0x13, 0x2e, 0x26, 0x7f, 0x2c, 0xb6, 0x9b, 0x3a, 0xa0, 0xe9,
|
||||
0x55, 0x11, 0x82, 0x7d, 0xbc, 0x06, 0x75, 0x59, 0xcc, 0xbd, 0xd3, 0x33, 0x9a, 0x63, 0xc9, 0xae,
|
||||
0x11, 0x02, 0x82, 0x44, 0x0b, 0xb1, 0x37, 0xe4, 0x4e, 0x14, 0xbb, 0xc3, 0x91, 0x9c, 0x52, 0x55,
|
||||
0x40, 0xba, 0x02, 0x80, 0xc5, 0x41, 0xec, 0x0e, 0x9c, 0x13, 0xce, 0xa3, 0x76, 0x59, 0x16, 0x0b,
|
||||
0xc8, 0x16, 0xe7, 0x11, 0xfb, 0x0e, 0x34, 0xfb, 0x3c, 0x8a, 0x1d, 0xb9, 0x19, 0x3c, 0x6a, 0x57,
|
||||
0xf0, 0xe4, 0x37, 0x04, 0x74, 0x55, 0x01, 0xd9, 0x2b, 0x00, 0xa1, 0x7b, 0xe1, 0x88, 0x85, 0xe0,
|
||||
0x97, 0xed, 0x2a, 0xed, 0x42, 0xe8, 0x5e, 0x1c, 0x5d, 0x6e, 0xf3, 0x4b, 0x41, 0x35, 0x9f, 0xf2,
|
||||
0xd8, 0x58, 0xb4, 0x48, 0x52, 0xa7, 0xb5, 0x0b, 0xcc, 0x00, 0x6f, 0xf0, 0xd8, 0xf5, 0x06, 0x11,
|
||||
0xfb, 0x1e, 0xd4, 0x63, 0x03, 0x19, 0xd9, 0x60, 0x4d, 0x93, 0x90, 0x51, 0xc1, 0x4e, 0xe1, 0x59,
|
||||
0x67, 0x50, 0xd9, 0xe2, 0x7c, 0xd7, 0x1b, 0x7a, 0x31, 0x5b, 0x86, 0xd2, 0x89, 0x77, 0xc9, 0x89,
|
||||
0xd8, 0x0b, 0xdb, 0xd7, 0x6c, 0xfa, 0x64, 0xb7, 0x01, 0xf0, 0x0f, 0x67, 0xa8, 0xa9, 0x69, 0xfb,
|
||||
0x9a, 0x5d, 0x45, 0xd8, 0x5e, 0xe4, 0xc6, 0xac, 0x03, 0xe5, 0x11, 0x0f, 0x7b, 0x5c, 0xed, 0xdb,
|
||||
0xf6, 0x35, 0x5b, 0x01, 0xd6, 0xca, 0x50, 0x1a, 0x88, 0xd6, 0xad, 0x3f, 0x29, 0x41, 0xad, 0xcb,
|
||||
0x7d, 0x7d, 0xca, 0x18, 0x14, 0xc5, 0x82, 0xc8, 0x93, 0x85, 0x7f, 0xb3, 0xd7, 0xa1, 0x86, 0x4b,
|
||||
0x17, 0xc5, 0xa1, 0xe7, 0x9f, 0x12, 0x55, 0xaf, 0xe5, 0xdb, 0x39, 0x1b, 0x04, 0xb8, 0x8b, 0x50,
|
||||
0xd6, 0x82, 0x82, 0x3b, 0x54, 0x54, 0x2d, 0xfe, 0x64, 0x37, 0xa0, 0xe2, 0x0e, 0x63, 0x1a, 0x5e,
|
||||
0x1d, 0xc1, 0x65, 0x77, 0x18, 0xe3, 0xd0, 0x5e, 0x83, 0xfa, 0xc8, 0xbd, 0x1a, 0x8a, 0xb3, 0xac,
|
||||
0xc9, 0xa1, 0x6e, 0xd7, 0x24, 0x0c, 0x09, 0xe2, 0x31, 0x2c, 0x9a, 0x28, 0xaa, 0xf3, 0x92, 0xee,
|
||||
0x7c, 0xc1, 0xc0, 0x96, 0x63, 0xb8, 0x0b, 0xf3, 0xaa, 0x4e, 0x48, 0xf3, 0x41, 0x32, 0xa9, 0xda,
|
||||
0x4d, 0x09, 0x56, 0xb3, 0xbc, 0x07, 0xad, 0x13, 0xcf, 0x77, 0x07, 0x4e, 0x6f, 0x10, 0x9f, 0x3b,
|
||||
0x7d, 0x3e, 0x88, 0x5d, 0xa4, 0x98, 0x92, 0xdd, 0x44, 0xf8, 0xfa, 0x20, 0x3e, 0xdf, 0x10, 0x50,
|
||||
0xf6, 0x0e, 0x54, 0x4f, 0x38, 0x77, 0x70, 0xb1, 0xda, 0x95, 0xd4, 0xc1, 0x53, 0x3b, 0x64, 0x57,
|
||||
0x4e, 0xd4, 0x5e, 0xbd, 0x03, 0xad, 0x60, 0x1c, 0x9f, 0x06, 0x9e, 0x7f, 0xea, 0x08, 0x7e, 0xe7,
|
||||
0x78, 0x7d, 0xa4, 0xa1, 0xe2, 0x5a, 0xfe, 0x51, 0xce, 0x6e, 0xaa, 0x32, 0xc1, 0x79, 0x76, 0xfa,
|
||||
0xec, 0x4d, 0x98, 0x1f, 0xb8, 0x51, 0xec, 0x9c, 0x05, 0x23, 0x67, 0x34, 0x3e, 0x7e, 0xc6, 0xaf,
|
||||
0xda, 0x0d, 0x5c, 0x88, 0x86, 0x00, 0x6f, 0x07, 0xa3, 0x43, 0x04, 0x0a, 0xca, 0xc6, 0x71, 0xd2,
|
||||
0x20, 0xe0, 0x4e, 0xee, 0x5e, 0xc3, 0xae, 0x0a, 0x08, 0x75, 0xfa, 0x05, 0x2c, 0xe2, 0xf6, 0xf4,
|
||||
0xc6, 0x51, 0x1c, 0x0c, 0x1d, 0xc1, 0xab, 0xc3, 0x7e, 0xd4, 0xae, 0x21, 0xad, 0xbd, 0x25, 0x07,
|
||||
0x6b, 0xec, 0xf1, 0x83, 0x0d, 0x1e, 0xc5, 0xeb, 0x88, 0x6c, 0x13, 0xae, 0xb8, 0xd0, 0xaf, 0xec,
|
||||
0x85, 0xfe, 0x24, 0x9c, 0xbd, 0x03, 0xcc, 0x1d, 0x0c, 0x82, 0x0b, 0x27, 0xe2, 0x83, 0x13, 0x47,
|
||||
0x2e, 0x62, 0xbb, 0x79, 0x27, 0x77, 0xaf, 0x62, 0xb7, 0xb0, 0xa4, 0xcb, 0x07, 0x27, 0x87, 0x04,
|
||||
0x67, 0xdf, 0x03, 0x3c, 0x4c, 0xce, 0x09, 0x77, 0xe3, 0x71, 0xc8, 0xa3, 0xf6, 0xfc, 0x9d, 0xc2,
|
||||
0xbd, 0xe6, 0xe3, 0x05, 0xbd, 0x5e, 0x08, 0x5e, 0xf3, 0x62, 0xbb, 0x2e, 0xf0, 0xe4, 0x77, 0xd4,
|
||||
0xd9, 0x80, 0xe5, 0xec, 0x21, 0x09, 0xa2, 0x12, 0xab, 0x22, 0x88, 0xb1, 0x68, 0x8b, 0x3f, 0xd9,
|
||||
0x12, 0x94, 0xce, 0xdd, 0xc1, 0x98, 0x4b, 0x9e, 0x4e, 0x1f, 0x1f, 0xe7, 0x3f, 0xca, 0x59, 0x7f,
|
||||
0x9c, 0x83, 0x3a, 0xcd, 0x52, 0xca, 0x22, 0xaf, 0x43, 0x43, 0x51, 0x03, 0x0f, 0xc3, 0x20, 0x94,
|
||||
0x5c, 0x4d, 0x51, 0xde, 0xa6, 0x80, 0x89, 0x5b, 0x45, 0x21, 0x8d, 0x42, 0xee, 0x0d, 0xdd, 0x53,
|
||||
0xd5, 0xb4, 0x22, 0xa5, 0x43, 0x09, 0x66, 0xef, 0x25, 0xed, 0x85, 0xc1, 0x38, 0xe6, 0xf2, 0xce,
|
||||
0xab, 0xcb, 0xe9, 0xd9, 0x02, 0xa6, 0x5b, 0xc7, 0xaf, 0x97, 0xa0, 0x73, 0xeb, 0xf7, 0x72, 0xc0,
|
||||
0xc4, 0xb0, 0x8f, 0x02, 0x6a, 0x40, 0x52, 0xe8, 0x64, 0xcd, 0xdc, 0x4b, 0x9f, 0x90, 0xfc, 0xf3,
|
||||
0x4e, 0x88, 0x05, 0x25, 0x1a, 0x7b, 0x31, 0x63, 0xec, 0x54, 0xf4, 0x83, 0x62, 0xa5, 0xd0, 0x2a,
|
||||
0x5a, 0xff, 0xbb, 0x00, 0x4b, 0xeb, 0x74, 0x65, 0xaf, 0xf6, 0x7a, 0x7c, 0xa4, 0xcf, 0xce, 0x6d,
|
||||
0xa8, 0xf9, 0x41, 0x9f, 0x2b, 0x8a, 0xa5, 0x81, 0x81, 0x00, 0x19, 0xe4, 0x7a, 0xe6, 0x7a, 0x3e,
|
||||
0x0d, 0x9c, 0x16, 0xb3, 0x8a, 0x10, 0x1c, 0xf6, 0x9b, 0x30, 0x3f, 0xe2, 0x7e, 0xdf, 0x3c, 0x22,
|
||||
0x24, 0x54, 0x35, 0x24, 0x58, 0x9e, 0x8e, 0xdb, 0x50, 0x3b, 0x19, 0x13, 0x9e, 0x60, 0x2c, 0x45,
|
||||
0xa4, 0x01, 0x90, 0xa0, 0x55, 0xe2, 0x2f, 0xa3, 0x71, 0x74, 0x86, 0xa5, 0x25, 0x2c, 0x2d, 0x8b,
|
||||
0x6f, 0x51, 0x74, 0x0b, 0xa0, 0x3f, 0x8e, 0x62, 0x79, 0x62, 0xe6, 0xb0, 0xb0, 0x2a, 0x20, 0x74,
|
||||
0x62, 0xde, 0x85, 0xc5, 0xa1, 0x7b, 0xe9, 0x20, 0xed, 0x38, 0x9e, 0xef, 0x9c, 0x0c, 0xf0, 0xce,
|
||||
0x29, 0x23, 0x5e, 0x6b, 0xe8, 0x5e, 0xfe, 0x50, 0x94, 0xec, 0xf8, 0x5b, 0x08, 0x17, 0x6c, 0x45,
|
||||
0x89, 0x3b, 0x21, 0x8f, 0x78, 0x78, 0xce, 0x91, 0x13, 0x14, 0xb5, 0x4c, 0x63, 0x13, 0x54, 0x8c,
|
||||
0x68, 0x28, 0xe6, 0x1d, 0x0f, 0x7a, 0x74, 0xec, 0xed, 0xf2, 0xd0, 0xf3, 0xb7, 0xe3, 0x41, 0x4f,
|
||||
0xdc, 0x2b, 0x82, 0x8f, 0x8c, 0x78, 0xe8, 0x3c, 0xbb, 0xc0, 0x33, 0x5c, 0x44, 0xbe, 0x71, 0xc8,
|
||||
0xc3, 0x27, 0x17, 0xe2, 0xea, 0xef, 0x45, 0xc8, 0x88, 0xdc, 0xab, 0x76, 0x0d, 0x0f, 0x78, 0xa5,
|
||||
0x17, 0x09, 0x16, 0xe4, 0x5e, 0x89, 0x43, 0x28, 0x46, 0xeb, 0xe2, 0x2e, 0xf0, 0x3e, 0x36, 0x1f,
|
||||
0x21, 0x47, 0x6d, 0xe0, 0x60, 0x57, 0x65, 0x81, 0xe8, 0x27, 0x12, 0x54, 0xaf, 0x06, 0x7b, 0x32,
|
||||
0x70, 0x4f, 0x23, 0x64, 0x29, 0x0d, 0xbb, 0x2e, 0x81, 0x5b, 0x02, 0x66, 0x7d, 0x4e, 0x42, 0x96,
|
||||
0xb1, 0xb7, 0xf2, 0xcc, 0x88, 0xab, 0x1e, 0x21, 0xb8, 0xaf, 0x15, 0x5b, 0x7e, 0x65, 0x6d, 0x5a,
|
||||
0x3e, 0x63, 0xd3, 0xac, 0x3f, 0xc8, 0x41, 0x5d, 0xb6, 0x8c, 0x42, 0x09, 0x7b, 0x00, 0x4c, 0xed,
|
||||
0x62, 0x7c, 0xe9, 0xf5, 0x9d, 0xe3, 0xab, 0x98, 0x47, 0x44, 0x34, 0xdb, 0xd7, 0xec, 0x96, 0x2c,
|
||||
0x3b, 0xba, 0xf4, 0xfa, 0x6b, 0xa2, 0x84, 0xdd, 0x87, 0x56, 0x0a, 0x3f, 0x8a, 0x43, 0xa2, 0xe8,
|
||||
0xed, 0x6b, 0x76, 0xd3, 0xc0, 0xee, 0xc6, 0xa1, 0x38, 0x23, 0x42, 0xe4, 0x19, 0xc7, 0x8e, 0xe7,
|
||||
0xf7, 0xf9, 0x25, 0x92, 0x51, 0xc3, 0xae, 0x11, 0x6c, 0x47, 0x80, 0xd6, 0x9a, 0x50, 0x37, 0x9b,
|
||||
0xb3, 0x4e, 0xa1, 0xa2, 0xe4, 0x25, 0x14, 0x18, 0x26, 0x86, 0x64, 0x57, 0x63, 0x3d, 0x92, 0x1b,
|
||||
0x50, 0x49, 0x8f, 0xc0, 0x2e, 0xc7, 0x2f, 0xdd, 0xb1, 0xf5, 0x7d, 0x68, 0xed, 0x0a, 0xe2, 0xf1,
|
||||
0x05, 0xb1, 0x4a, 0xf9, 0x6f, 0x19, 0xe6, 0x8c, 0x43, 0x53, 0xb5, 0xe5, 0x97, 0xb8, 0x73, 0xcf,
|
||||
0x82, 0x28, 0x96, 0xbd, 0xe0, 0xdf, 0xd6, 0x9f, 0xe4, 0x80, 0x6d, 0x46, 0xb1, 0x37, 0x74, 0x63,
|
||||
0xbe, 0xc5, 0x35, 0x5b, 0x38, 0x80, 0xba, 0x68, 0xed, 0x28, 0x58, 0x25, 0x81, 0x8c, 0x04, 0x8a,
|
||||
0xb7, 0xe5, 0x31, 0x9e, 0xae, 0xf0, 0xc0, 0xc4, 0x26, 0x36, 0x9f, 0x6a, 0x40, 0x9c, 0xb2, 0xd8,
|
||||
0x0d, 0x4f, 0x79, 0x8c, 0x62, 0x9c, 0x94, 0xf7, 0x81, 0x40, 0x42, 0x80, 0xeb, 0xfc, 0x3a, 0x2c,
|
||||
0x4c, 0xb5, 0x61, 0xf2, 0xe5, 0x6a, 0x06, 0x5f, 0x2e, 0x98, 0x7c, 0xd9, 0x81, 0xc5, 0xd4, 0xb8,
|
||||
0x24, 0xa5, 0xad, 0x40, 0x59, 0x1c, 0x08, 0x21, 0x1c, 0xe4, 0x48, 0xaa, 0x3c, 0xe1, 0x5c, 0x88,
|
||||
0xc1, 0x0f, 0x61, 0xe9, 0x84, 0xf3, 0xd0, 0x8d, 0xb1, 0x10, 0x4f, 0x8c, 0xd8, 0x21, 0xd9, 0xf0,
|
||||
0x82, 0x2c, 0xeb, 0xba, 0xf1, 0x21, 0x0f, 0xc5, 0x4e, 0x59, 0xff, 0x27, 0x07, 0xf3, 0x82, 0x83,
|
||||
0xee, 0xb9, 0xfe, 0x95, 0x5a, 0xa7, 0xdd, 0xcc, 0x75, 0xba, 0x67, 0x5c, 0x86, 0x06, 0xf6, 0x37,
|
||||
0x5d, 0xa4, 0xc2, 0xe4, 0x22, 0xb1, 0x3b, 0x50, 0x4f, 0x8d, 0xb5, 0x84, 0x63, 0x85, 0x48, 0x0f,
|
||||
0xf2, 0x17, 0x5f, 0xc6, 0x37, 0xa1, 0x95, 0x0c, 0x5b, 0xae, 0x21, 0x83, 0xa2, 0x20, 0x49, 0xd9,
|
||||
0x00, 0xfe, 0x6d, 0xfd, 0xcb, 0x1c, 0x21, 0xae, 0x07, 0x9e, 0x96, 0x4e, 0x05, 0xa2, 0x90, 0x7b,
|
||||
0x15, 0xa2, 0xf8, 0x7b, 0xa6, 0x54, 0xff, 0x8b, 0x4f, 0x56, 0x1c, 0x9d, 0x88, 0xfb, 0x7d, 0xc7,
|
||||
0x1d, 0x0c, 0x90, 0xf9, 0x56, 0xec, 0xb2, 0xf8, 0x5e, 0x1d, 0x0c, 0xac, 0xbb, 0xb0, 0x60, 0x8c,
|
||||
0xee, 0x39, 0xf3, 0xd8, 0x07, 0xb6, 0xeb, 0x45, 0xf1, 0x53, 0x3f, 0x1a, 0x19, 0x82, 0xdb, 0x4d,
|
||||
0xa8, 0x0a, 0x0e, 0x2b, 0x46, 0x46, 0x47, 0xb6, 0x64, 0x0b, 0x96, 0x2b, 0xc6, 0x15, 0x61, 0xa1,
|
||||
0x7b, 0x29, 0x0b, 0xf3, 0xb2, 0xd0, 0xbd, 0xc4, 0x42, 0xeb, 0x23, 0x58, 0x4c, 0xb5, 0x27, 0xbb,
|
||||
0x7e, 0x0d, 0x4a, 0xe3, 0xf8, 0x32, 0x50, 0xa2, 0x79, 0x4d, 0x52, 0x88, 0x50, 0x00, 0x6d, 0x2a,
|
||||
0xb1, 0x3e, 0x81, 0x85, 0x7d, 0x7e, 0x21, 0x0f, 0xb1, 0x1a, 0xc8, 0x9b, 0x50, 0x7c, 0x81, 0x52,
|
||||
0x88, 0xe5, 0xd6, 0x03, 0x60, 0x66, 0x65, 0xd9, 0xab, 0xa1, 0x23, 0xe6, 0x52, 0x3a, 0xa2, 0xf5,
|
||||
0x26, 0xb0, 0xae, 0x77, 0xea, 0xef, 0xf1, 0x28, 0x72, 0x4f, 0xf5, 0xb1, 0x6f, 0x41, 0x61, 0x18,
|
||||
0x9d, 0x4a, 0x1e, 0x25, 0xfe, 0xb4, 0xbe, 0x0b, 0x8b, 0x29, 0x3c, 0xd9, 0xf0, 0x2b, 0x50, 0x8d,
|
||||
0xbc, 0x53, 0x1f, 0x05, 0x2b, 0xd9, 0x74, 0x02, 0xb0, 0xb6, 0x60, 0xe9, 0x87, 0x3c, 0xf4, 0x4e,
|
||||
0xae, 0x5e, 0xd4, 0x7c, 0xba, 0x9d, 0xfc, 0x64, 0x3b, 0x9b, 0x70, 0x7d, 0xa2, 0x1d, 0xd9, 0x3d,
|
||||
0x91, 0xaf, 0xdc, 0xc9, 0x8a, 0x4d, 0x1f, 0x06, 0xdf, 0xcb, 0x9b, 0x7c, 0xcf, 0x7a, 0x0a, 0x6c,
|
||||
0x3d, 0xf0, 0x7d, 0xde, 0x8b, 0x0f, 0x39, 0x0f, 0x13, 0x2b, 0x55, 0x42, 0xab, 0xb5, 0xc7, 0x2b,
|
||||
0x72, 0x65, 0x27, 0x99, 0xa9, 0x24, 0x62, 0x06, 0xc5, 0x11, 0x0f, 0x87, 0xd8, 0x70, 0xc5, 0xc6,
|
||||
0xbf, 0xad, 0xeb, 0xb0, 0x98, 0x6a, 0x56, 0xea, 0xf5, 0x8f, 0xe0, 0xfa, 0x86, 0x17, 0xf5, 0xa6,
|
||||
0x3b, 0x5c, 0x81, 0xf2, 0x68, 0x7c, 0xec, 0xa4, 0xf9, 0xf2, 0x13, 0x7e, 0x25, 0xb4, 0xbd, 0xc9,
|
||||
0x1a, 0xb2, 0xad, 0xbf, 0x9b, 0x83, 0xe2, 0xf6, 0xd1, 0xee, 0x3a, 0xeb, 0x40, 0xc5, 0xf3, 0x7b,
|
||||
0xc1, 0x50, 0x08, 0x5e, 0x34, 0x67, 0xfd, 0x3d, 0xf3, 0x80, 0xdd, 0x84, 0x2a, 0xca, 0x6b, 0x42,
|
||||
0xb5, 0x95, 0xa2, 0x4f, 0x45, 0x00, 0x76, 0x83, 0xde, 0x33, 0xa1, 0x53, 0xf3, 0xcb, 0x91, 0x17,
|
||||
0xa2, 0xd6, 0xac, 0x94, 0xe1, 0x22, 0xdd, 0xf5, 0x49, 0x01, 0x69, 0xc4, 0xd6, 0x7f, 0x2a, 0x43,
|
||||
0x59, 0xde, 0xb6, 0x74, 0x73, 0xc7, 0xde, 0x39, 0x4f, 0x6e, 0x6e, 0xf1, 0x25, 0xe4, 0x81, 0x90,
|
||||
0x0f, 0x83, 0x58, 0x0b, 0x6c, 0xb4, 0x07, 0x75, 0x02, 0x4a, 0x91, 0xcd, 0x10, 0x1a, 0xc8, 0xc4,
|
||||
0x50, 0x20, 0xa4, 0x9e, 0x79, 0x95, 0xdf, 0x84, 0xb2, 0xba, 0xfb, 0x8b, 0x5a, 0xa7, 0x99, 0xeb,
|
||||
0x91, 0xb4, 0xd6, 0x81, 0x4a, 0xcf, 0x1d, 0xb9, 0x3d, 0x2f, 0xbe, 0x92, 0x0c, 0x41, 0x7f, 0x8b,
|
||||
0xd6, 0x07, 0x41, 0xcf, 0x1d, 0x38, 0xc7, 0xee, 0xc0, 0xf5, 0x7b, 0x5c, 0xea, 0xee, 0x75, 0x04,
|
||||
0xae, 0x11, 0x4c, 0xe8, 0xe7, 0x72, 0x9c, 0x0a, 0x8b, 0x54, 0x78, 0x39, 0x7a, 0x85, 0x26, 0x84,
|
||||
0xcb, 0x60, 0x38, 0xf4, 0x84, 0x96, 0x41, 0x62, 0x58, 0xc1, 0xae, 0x12, 0x64, 0x8b, 0xe3, 0x6c,
|
||||
0x65, 0xf1, 0x05, 0x2d, 0x5d, 0x95, 0xba, 0x22, 0xe0, 0xe7, 0x64, 0x48, 0x98, 0x96, 0xc5, 0x0a,
|
||||
0x86, 0x2c, 0xf6, 0x36, 0x2c, 0x8c, 0xfd, 0x88, 0xc7, 0xf1, 0x80, 0xf7, 0xf5, 0x58, 0x6a, 0x88,
|
||||
0xd4, 0xd2, 0x05, 0x6a, 0x38, 0x0f, 0x60, 0x91, 0x8c, 0x0e, 0x91, 0x1b, 0x07, 0xd1, 0x99, 0x17,
|
||||
0x39, 0x91, 0xd0, 0x90, 0x48, 0xdd, 0x5d, 0xc0, 0xa2, 0xae, 0x2c, 0xe9, 0x92, 0x8a, 0xb4, 0x32,
|
||||
0x81, 0x1f, 0xf2, 0x1e, 0xf7, 0xce, 0x79, 0x1f, 0xe5, 0xb4, 0x82, 0x7d, 0x3d, 0x55, 0xc7, 0x96,
|
||||
0x85, 0x28, 0x74, 0x8f, 0x87, 0xce, 0x78, 0xd4, 0x77, 0x85, 0xb0, 0xd2, 0x24, 0x61, 0xd8, 0x1f,
|
||||
0x0f, 0x9f, 0x12, 0x84, 0x3d, 0x02, 0x25, 0x89, 0x49, 0xf9, 0x70, 0x3e, 0xc5, 0xcf, 0x04, 0xb1,
|
||||
0xda, 0x75, 0x89, 0x41, 0x82, 0x62, 0x4a, 0xe6, 0x6c, 0x4d, 0xc8, 0x9c, 0x6d, 0x28, 0x8f, 0x42,
|
||||
0xef, 0xdc, 0x8d, 0x79, 0x7b, 0x81, 0x18, 0xb8, 0xfc, 0x14, 0x9c, 0xc1, 0xf3, 0xbd, 0xd8, 0x73,
|
||||
0xe3, 0x20, 0x6c, 0x33, 0x2c, 0x4b, 0x00, 0xec, 0x3e, 0x2c, 0x20, 0x8d, 0x44, 0xb1, 0x1b, 0x8f,
|
||||
0x23, 0x29, 0x81, 0x2e, 0x22, 0x31, 0xa1, 0x0c, 0xdd, 0x45, 0x38, 0x0a, 0xa1, 0xec, 0xbb, 0xb0,
|
||||
0x4c, 0x64, 0x81, 0x35, 0xa4, 0x64, 0x8d, 0x02, 0xc1, 0x12, 0x2e, 0xc5, 0x22, 0x96, 0x0a, 0xfa,
|
||||
0x96, 0xf2, 0xb5, 0x90, 0x0e, 0x3e, 0x80, 0x15, 0x49, 0x26, 0x53, 0xb5, 0xae, 0x63, 0xad, 0x25,
|
||||
0x2a, 0x9e, 0xa8, 0x76, 0x1f, 0x16, 0xc4, 0x90, 0xbc, 0x9e, 0x23, 0x6b, 0x8b, 0x93, 0xb0, 0x8c,
|
||||
0xa3, 0x9f, 0xa7, 0x02, 0x1b, 0xe1, 0x4f, 0xf8, 0x95, 0x20, 0xe5, 0x81, 0x77, 0xc2, 0x63, 0x6f,
|
||||
0xc8, 0xdb, 0x2b, 0x44, 0x1c, 0xea, 0x5b, 0x9c, 0xb2, 0xf1, 0x08, 0x4b, 0xda, 0x74, 0xa6, 0xe9,
|
||||
0x0b, 0xe9, 0x6e, 0x10, 0x44, 0x5c, 0x99, 0x97, 0xda, 0x37, 0xe4, 0x01, 0x12, 0x40, 0xc9, 0xb2,
|
||||
0xac, 0x9f, 0xe5, 0xe8, 0x0e, 0x92, 0x47, 0x36, 0x32, 0x34, 0x2a, 0x3a, 0xac, 0x4e, 0xe0, 0x0f,
|
||||
0xae, 0xe4, 0xf9, 0x05, 0x02, 0x1d, 0xf8, 0x03, 0x3c, 0x40, 0x9e, 0x6f, 0xa2, 0x10, 0xbb, 0xab,
|
||||
0x2b, 0x20, 0x22, 0xdd, 0x86, 0xda, 0x68, 0x7c, 0x3c, 0xf0, 0x7a, 0x84, 0x52, 0xa0, 0x56, 0x08,
|
||||
0x84, 0x08, 0x42, 0xa5, 0xa4, 0x4d, 0x24, 0x8c, 0x22, 0x62, 0xd4, 0x24, 0x0c, 0x51, 0x90, 0x9d,
|
||||
0xf2, 0x10, 0x4f, 0x70, 0xdd, 0xc6, 0xbf, 0xad, 0x35, 0x58, 0x4a, 0x0f, 0x5a, 0xf2, 0xfa, 0xfb,
|
||||
0x50, 0x91, 0xec, 0x41, 0xd9, 0x1a, 0x9a, 0x86, 0xf5, 0x57, 0x68, 0x45, 0xba, 0xdc, 0xfa, 0x9d,
|
||||
0x39, 0x58, 0x94, 0xd0, 0x75, 0xb1, 0x22, 0xdd, 0xf1, 0x70, 0xe8, 0x86, 0x19, 0x7c, 0x27, 0xf7,
|
||||
0x7c, 0xbe, 0x93, 0x9f, 0xe2, 0x3b, 0x69, 0x65, 0x93, 0xd8, 0x56, 0x5a, 0xd9, 0x14, 0x5b, 0x40,
|
||||
0xf2, 0xbf, 0x69, 0x7a, 0x6c, 0x48, 0xf0, 0x11, 0x99, 0x38, 0xa7, 0xb8, 0x64, 0x29, 0x83, 0x4b,
|
||||
0x9a, 0x3c, 0x6e, 0x6e, 0x82, 0xc7, 0xbd, 0x06, 0xb4, 0xd7, 0x8a, 0x65, 0x97, 0x49, 0x25, 0x40,
|
||||
0x98, 0xb4, 0x5f, 0xde, 0x85, 0xf9, 0x49, 0xb6, 0x42, 0xfc, 0xab, 0x99, 0xc1, 0x54, 0xbc, 0x21,
|
||||
0xc7, 0x0b, 0xc2, 0x40, 0xae, 0x4a, 0xa6, 0xe2, 0x0d, 0xf9, 0x2e, 0x96, 0x28, 0xfc, 0x4d, 0x00,
|
||||
0xea, 0x1b, 0x25, 0x12, 0x40, 0x89, 0xe4, 0xcd, 0xf4, 0x5e, 0x98, 0xab, 0xfe, 0x40, 0x7c, 0x8c,
|
||||
0x43, 0x8e, 0x52, 0x4a, 0x15, 0x6b, 0xa2, 0xe1, 0xfa, 0x09, 0x34, 0x83, 0x11, 0xf7, 0x9d, 0xe4,
|
||||
0x78, 0xd7, 0xb0, 0xa9, 0x37, 0x9e, 0xd3, 0xd4, 0x8e, 0xc2, 0xb5, 0x1b, 0xa2, 0xae, 0xfe, 0x64,
|
||||
0x7b, 0xb4, 0xf0, 0xdc, 0x68, 0xad, 0xfe, 0x0d, 0x5a, 0x6b, 0x62, 0x65, 0xfd, 0x6d, 0xfd, 0x83,
|
||||
0x1c, 0xd4, 0x8c, 0x61, 0xb3, 0xeb, 0xb0, 0xb0, 0x7e, 0x70, 0x70, 0xb8, 0x69, 0xaf, 0x1e, 0xed,
|
||||
0xfc, 0x70, 0xd3, 0x59, 0xdf, 0x3d, 0xe8, 0x6e, 0xb6, 0xae, 0x09, 0xf0, 0xee, 0xc1, 0xfa, 0xea,
|
||||
0xae, 0xb3, 0x75, 0x60, 0xaf, 0x2b, 0x70, 0x8e, 0x2d, 0x03, 0xb3, 0x37, 0xf7, 0x0e, 0x8e, 0x36,
|
||||
0x53, 0xf0, 0x3c, 0x6b, 0x41, 0x7d, 0xcd, 0xde, 0x5c, 0x5d, 0xdf, 0x96, 0x90, 0x02, 0x5b, 0x82,
|
||||
0xd6, 0xd6, 0xd3, 0xfd, 0x8d, 0x9d, 0xfd, 0x4f, 0x9d, 0xf5, 0xd5, 0xfd, 0xf5, 0xcd, 0xdd, 0xcd,
|
||||
0x8d, 0x56, 0x91, 0x35, 0xa0, 0xba, 0xba, 0xb6, 0xba, 0xbf, 0x71, 0xb0, 0xbf, 0xb9, 0xd1, 0x2a,
|
||||
0x59, 0xbf, 0x06, 0xd5, 0x64, 0xa2, 0x35, 0x28, 0x3f, 0xdd, 0x7f, 0xb2, 0x7f, 0xf0, 0xf9, 0x7e,
|
||||
0xeb, 0x1a, 0xab, 0x42, 0x09, 0xfb, 0x6f, 0xe5, 0x18, 0xc0, 0x1c, 0xf5, 0xd9, 0xca, 0xb3, 0x0a,
|
||||
0x14, 0xd7, 0x0e, 0x8e, 0xb6, 0x5b, 0x05, 0xeb, 0xcf, 0x73, 0x70, 0x1d, 0xa7, 0xdc, 0x9f, 0x64,
|
||||
0x02, 0x77, 0xa0, 0xd6, 0x0b, 0x82, 0x91, 0x50, 0x6e, 0x92, 0x4b, 0xdc, 0x04, 0x89, 0x03, 0x4e,
|
||||
0xfc, 0xf2, 0x24, 0x08, 0x7b, 0x5c, 0xf2, 0x00, 0x40, 0xd0, 0x96, 0x80, 0x08, 0x1a, 0x94, 0x44,
|
||||
0x4c, 0x18, 0xc4, 0x02, 0x6a, 0x04, 0x23, 0x94, 0x65, 0x98, 0x3b, 0x0e, 0xb9, 0xdb, 0x3b, 0x93,
|
||||
0xa7, 0x5f, 0x7e, 0xb1, 0xb7, 0x12, 0xb5, 0xbb, 0x27, 0x68, 0x6a, 0xc0, 0xfb, 0x78, 0x04, 0x2a,
|
||||
0xf6, 0xbc, 0x84, 0xaf, 0x4b, 0xb0, 0xb8, 0x00, 0xdc, 0x63, 0xd7, 0xef, 0x07, 0x3e, 0xef, 0x4b,
|
||||
0xe9, 0x3e, 0x01, 0x58, 0x87, 0xb0, 0x3c, 0x39, 0x3f, 0xc9, 0x2f, 0xbe, 0x67, 0xf0, 0x0b, 0x12,
|
||||
0xb6, 0x3b, 0xb3, 0x49, 0xc1, 0xe0, 0x1d, 0x3f, 0x2f, 0x40, 0x51, 0x08, 0x5f, 0x33, 0xe5, 0x34,
|
||||
0x53, 0x9a, 0x2e, 0x4c, 0x79, 0x5c, 0x50, 0xbb, 0xa7, 0x5b, 0x99, 0x4c, 0x48, 0x55, 0x84, 0xe0,
|
||||
0x6d, 0xac, 0x8b, 0x43, 0xde, 0x3b, 0x97, 0x36, 0x24, 0x2a, 0xb6, 0x79, 0xef, 0x1c, 0xd5, 0x18,
|
||||
0x37, 0xa6, 0xba, 0x74, 0xde, 0xcb, 0x91, 0x1b, 0x63, 0x4d, 0x59, 0x84, 0xf5, 0xca, 0xba, 0x08,
|
||||
0x6b, 0xb5, 0xa1, 0xec, 0xf9, 0xc7, 0xc1, 0xd8, 0xef, 0xe3, 0xf1, 0xae, 0xd8, 0xea, 0x13, 0x1d,
|
||||
0x3c, 0xc8, 0x89, 0xc4, 0xfd, 0x41, 0xa7, 0xb9, 0x22, 0x00, 0x47, 0xe2, 0x06, 0x79, 0x0f, 0xaa,
|
||||
0xd1, 0x95, 0xdf, 0x33, 0xcf, 0xf0, 0x92, 0x5c, 0x1f, 0x31, 0xfb, 0x07, 0xdd, 0x2b, 0xbf, 0x87,
|
||||
0x27, 0xb6, 0x12, 0xc9, 0xbf, 0xd8, 0x07, 0x50, 0xd1, 0xa6, 0x56, 0xe2, 0xc0, 0x37, 0xcc, 0x1a,
|
||||
0xca, 0xbe, 0x4a, 0x1a, 0xad, 0x46, 0xed, 0x3c, 0x81, 0x46, 0xaa, 0xc8, 0x54, 0x43, 0x1b, 0xa4,
|
||||
0x86, 0xbe, 0x61, 0xaa, 0xa1, 0x09, 0x63, 0x97, 0xd5, 0x4c, 0xb5, 0xf4, 0xd7, 0xa1, 0xa2, 0x46,
|
||||
0x26, 0x8e, 0x93, 0x3c, 0x0a, 0x4e, 0xf7, 0x8b, 0xfd, 0xf5, 0xd6, 0x35, 0x36, 0x0f, 0xb5, 0xd5,
|
||||
0x75, 0x3c, 0xa1, 0x08, 0xc8, 0x09, 0x94, 0xc3, 0xd5, 0x6e, 0x57, 0x43, 0xf2, 0x16, 0x83, 0x96,
|
||||
0xb8, 0x5e, 0xc4, 0x88, 0xb5, 0x33, 0xe5, 0x7b, 0xb0, 0x60, 0xc0, 0x12, 0x4d, 0x4d, 0xdc, 0x47,
|
||||
0x93, 0x9a, 0x1a, 0xca, 0xe5, 0x54, 0x62, 0xad, 0xc0, 0x75, 0xf1, 0xb9, 0x79, 0xce, 0xfd, 0xb8,
|
||||
0x3b, 0x3e, 0x26, 0x57, 0x9a, 0x17, 0xf8, 0x42, 0x5e, 0xaf, 0xea, 0x92, 0xd9, 0x84, 0xf4, 0x40,
|
||||
0x2a, 0x75, 0x79, 0x5c, 0xfe, 0x8e, 0xd1, 0x03, 0x56, 0x7c, 0x80, 0xff, 0xa6, 0x94, 0xbb, 0xaa,
|
||||
0x06, 0x89, 0xb9, 0x1e, 0x6e, 0x6e, 0xda, 0xce, 0xc1, 0xfe, 0xee, 0xce, 0xbe, 0x60, 0x46, 0x62,
|
||||
0xae, 0x08, 0xd8, 0xda, 0x42, 0x48, 0xce, 0x6a, 0x41, 0xf3, 0x53, 0x1e, 0xef, 0xf8, 0x27, 0x81,
|
||||
0x9a, 0xe9, 0x5f, 0x95, 0x60, 0x5e, 0x83, 0x12, 0xe5, 0xf0, 0x9c, 0x87, 0x91, 0x17, 0xf8, 0x28,
|
||||
0xe7, 0x55, 0x6d, 0xf5, 0x29, 0x6e, 0x10, 0xaf, 0xcf, 0xfd, 0xd8, 0x8b, 0xaf, 0x9c, 0x94, 0x25,
|
||||
0xa9, 0xa9, 0xc0, 0xf2, 0xa6, 0x5a, 0x82, 0x92, 0x3b, 0xf0, 0x5c, 0xe5, 0x81, 0xa4, 0x0f, 0x01,
|
||||
0xed, 0x05, 0x83, 0x20, 0x44, 0x91, 0xae, 0x6a, 0xd3, 0x07, 0x7b, 0x04, 0x4b, 0x42, 0xb4, 0x34,
|
||||
0xcd, 0x7b, 0x78, 0x46, 0xc9, 0xa8, 0xc5, 0xfc, 0xf1, 0xf0, 0x30, 0x31, 0xf1, 0x89, 0x12, 0x71,
|
||||
0x3f, 0x89, 0x1a, 0x52, 0x20, 0xd1, 0x15, 0x48, 0x4b, 0x59, 0xf0, 0xc7, 0xc3, 0x55, 0x2c, 0xd1,
|
||||
0xf8, 0x8f, 0xe1, 0xba, 0xc0, 0xd7, 0x22, 0x8c, 0xae, 0x31, 0x8f, 0x35, 0x44, 0x63, 0x3b, 0xb2,
|
||||
0x4c, 0xd7, 0xb9, 0x09, 0x55, 0x1a, 0x95, 0xd8, 0xf1, 0x12, 0x49, 0xa7, 0x38, 0x14, 0x1e, 0x46,
|
||||
0x53, 0xce, 0xc2, 0x39, 0xba, 0x6c, 0x27, 0x9c, 0x85, 0x86, 0xbb, 0xb1, 0x32, 0xe9, 0x6e, 0x7c,
|
||||
0x0c, 0xd7, 0x8f, 0x79, 0x14, 0x3b, 0x67, 0xdc, 0xed, 0xf3, 0x10, 0x4f, 0x24, 0xb9, 0x15, 0x49,
|
||||
0x0a, 0x5f, 0x14, 0x85, 0xdb, 0x58, 0x76, 0xa4, 0x8a, 0x84, 0x2c, 0x21, 0x8e, 0x1e, 0xef, 0x3b,
|
||||
0x71, 0xe0, 0xa0, 0x88, 0x81, 0x87, 0xb8, 0x62, 0x37, 0x08, 0x7c, 0x14, 0xac, 0x0b, 0x60, 0x1a,
|
||||
0xef, 0x34, 0x74, 0x47, 0x67, 0x52, 0x4e, 0xd6, 0x78, 0x9f, 0x0a, 0x20, 0x7b, 0x05, 0xca, 0x31,
|
||||
0x8f, 0x62, 0x9f, 0x93, 0x4f, 0xa7, 0x82, 0x36, 0x7b, 0x05, 0x62, 0x6f, 0xc0, 0x1c, 0xf6, 0x11,
|
||||
0xb5, 0x5b, 0x48, 0xef, 0xf5, 0x84, 0x59, 0x7a, 0xbe, 0x2d, 0xcb, 0x84, 0xc0, 0x36, 0x0e, 0xbd,
|
||||
0xa8, 0x5d, 0x47, 0x5f, 0x26, 0xfe, 0xcd, 0x7e, 0xc3, 0x60, 0x0b, 0x8b, 0x58, 0x57, 0xdd, 0xb9,
|
||||
0x13, 0x94, 0xf6, 0x2b, 0xe1, 0x10, 0x3f, 0x28, 0x56, 0x6a, 0xad, 0xba, 0xf5, 0x21, 0x94, 0x68,
|
||||
0x75, 0x04, 0x11, 0xe2, 0xda, 0xe5, 0x24, 0x11, 0x22, 0xb4, 0x0d, 0x65, 0x9f, 0xc7, 0x17, 0x41,
|
||||
0xf8, 0x4c, 0xd9, 0x5a, 0xe5, 0xa7, 0xf5, 0x53, 0x34, 0x12, 0x68, 0x47, 0x32, 0xe9, 0x3b, 0x82,
|
||||
0x3c, 0x68, 0x7b, 0xa3, 0x33, 0x57, 0xda, 0x2d, 0x2a, 0x08, 0xe8, 0x9e, 0xb9, 0x53, 0xe4, 0x91,
|
||||
0x9f, 0xf6, 0x25, 0xbf, 0x01, 0x4d, 0xe5, 0xba, 0x8e, 0x9c, 0x01, 0x3f, 0x89, 0x25, 0xb9, 0xd7,
|
||||
0xa5, 0xdf, 0x3a, 0xda, 0xe5, 0x27, 0xb1, 0xb5, 0x07, 0x0b, 0x92, 0x20, 0x0f, 0x46, 0x5c, 0x75,
|
||||
0xfd, 0x51, 0x96, 0xcc, 0x5a, 0x7b, 0xbc, 0x98, 0xbe, 0xcc, 0xc8, 0x25, 0x9f, 0x12, 0x64, 0xad,
|
||||
0xcf, 0x80, 0x99, 0x57, 0x9d, 0x6c, 0x4f, 0x4a, 0x8e, 0xca, 0x44, 0xad, 0x3c, 0x3d, 0x5a, 0x3e,
|
||||
0xf5, 0xfa, 0x62, 0x75, 0xa2, 0x71, 0xaf, 0xa7, 0x42, 0x0a, 0x2a, 0xb6, 0xfa, 0xb4, 0xfe, 0x2c,
|
||||
0x07, 0x8b, 0xd8, 0x98, 0x92, 0xb9, 0xa5, 0x34, 0xf1, 0xad, 0x07, 0x29, 0xf6, 0xc7, 0x94, 0x2f,
|
||||
0xe8, 0xe3, 0x9b, 0x1b, 0x05, 0x8b, 0x53, 0x46, 0xc1, 0xb7, 0xa0, 0xd5, 0xe7, 0x03, 0x0f, 0xa3,
|
||||
0x4b, 0xd4, 0x75, 0x4d, 0x52, 0xf6, 0xbc, 0x82, 0x2b, 0x45, 0xe9, 0x9f, 0xe5, 0x60, 0x81, 0xa4,
|
||||
0x01, 0x54, 0x17, 0xe5, 0x42, 0x7d, 0xa2, 0x74, 0x2c, 0xc9, 0xaa, 0xe4, 0x9c, 0x92, 0x5b, 0x12,
|
||||
0xa1, 0x84, 0xbc, 0x7d, 0x4d, 0xea, 0x5e, 0x12, 0xca, 0x3e, 0x46, 0x3d, 0xc1, 0x77, 0x10, 0x98,
|
||||
0x11, 0xad, 0x92, 0xde, 0x94, 0xed, 0x6b, 0xa8, 0x44, 0xf8, 0x08, 0x5a, 0xab, 0x08, 0xa5, 0x4f,
|
||||
0x80, 0xad, 0x2d, 0x68, 0xa4, 0xba, 0x49, 0x59, 0x2e, 0xeb, 0x64, 0xb9, 0x9c, 0xf2, 0x0e, 0xe4,
|
||||
0xa7, 0xbd, 0x03, 0x7f, 0xaf, 0x08, 0x4c, 0x90, 0xd4, 0xc4, 0xae, 0x4d, 0xb8, 0xd6, 0xf2, 0x53,
|
||||
0xae, 0xb5, 0x47, 0xc0, 0x0c, 0x04, 0xe5, 0xf1, 0x2b, 0x68, 0x8f, 0x5f, 0x2b, 0xc1, 0x95, 0x0e,
|
||||
0xbf, 0x47, 0xb0, 0x24, 0x85, 0x46, 0xed, 0x4b, 0x43, 0x93, 0x14, 0xed, 0x0f, 0x23, 0xe9, 0x51,
|
||||
0xf9, 0xd4, 0xd0, 0x3c, 0xa5, 0xdc, 0x6a, 0x42, 0xa5, 0x26, 0x4b, 0x0e, 0xba, 0xd5, 0x84, 0x16,
|
||||
0x3d, 0x41, 0x05, 0x73, 0x2f, 0xa4, 0x82, 0xf2, 0x14, 0x15, 0x18, 0x86, 0x85, 0x4a, 0xda, 0xb0,
|
||||
0x60, 0x41, 0x43, 0x39, 0xcf, 0x28, 0x66, 0x80, 0x24, 0xa4, 0x9a, 0xf4, 0xa0, 0x61, 0xdc, 0xc0,
|
||||
0x3d, 0x68, 0x29, 0xed, 0x5f, 0x9b, 0x2e, 0xc8, 0x1f, 0x2e, 0x8d, 0x47, 0xeb, 0xca, 0x80, 0x91,
|
||||
0x32, 0x14, 0xd7, 0x26, 0x0c, 0xc5, 0x6f, 0xc3, 0x42, 0x24, 0x88, 0xc8, 0x19, 0xfb, 0x32, 0x78,
|
||||
0x85, 0xf7, 0x51, 0x3d, 0xa9, 0xd8, 0x2d, 0x2c, 0x78, 0x9a, 0xc0, 0xa7, 0x55, 0xfb, 0xc6, 0xb4,
|
||||
0x6a, 0xcf, 0x3e, 0x48, 0xfc, 0x4c, 0xd1, 0x99, 0x37, 0xc4, 0x8b, 0x3b, 0x09, 0xf4, 0x90, 0x0b,
|
||||
0xdc, 0x3d, 0xf3, 0x86, 0xb6, 0x72, 0x6a, 0x8a, 0x0f, 0xeb, 0xbf, 0xe6, 0xa0, 0x25, 0xe8, 0x20,
|
||||
0x45, 0xe7, 0xbf, 0x06, 0x78, 0x22, 0x5f, 0x92, 0xcc, 0x6b, 0x02, 0x57, 0x51, 0xf9, 0x87, 0x80,
|
||||
0x64, 0xeb, 0x08, 0x5d, 0x4c, 0x12, 0x79, 0x3b, 0x4d, 0xe4, 0x09, 0x23, 0xdb, 0xbe, 0x46, 0x42,
|
||||
0xb6, 0x80, 0x64, 0xf9, 0xf7, 0x8a, 0x19, 0xfe, 0x3d, 0xe3, 0x28, 0x6c, 0x03, 0x3c, 0xe1, 0x57,
|
||||
0xbb, 0x41, 0x0f, 0xb5, 0xa0, 0x5b, 0x00, 0x82, 0x20, 0x4f, 0xdc, 0xa1, 0x27, 0x2d, 0x18, 0x25,
|
||||
0xbb, 0xfa, 0x8c, 0x5f, 0x6d, 0x21, 0x40, 0xec, 0x86, 0x28, 0x4e, 0xce, 0x43, 0xc9, 0xae, 0x3c,
|
||||
0xe3, 0x57, 0x74, 0x18, 0x1c, 0x68, 0x3c, 0xe1, 0x57, 0x1b, 0x9c, 0xc4, 0xb5, 0x20, 0x14, 0x94,
|
||||
0x10, 0xba, 0x17, 0x42, 0x3e, 0x4b, 0xf9, 0xe6, 0x6a, 0xa1, 0x7b, 0xf1, 0x84, 0x5f, 0x29, 0x3f,
|
||||
0x61, 0x59, 0x94, 0x0f, 0x82, 0x9e, 0xbc, 0x81, 0x54, 0x94, 0x41, 0x32, 0x28, 0x7b, 0xee, 0x19,
|
||||
0xfe, 0x6d, 0xfd, 0x69, 0x0e, 0x1a, 0x62, 0xfc, 0xc8, 0xe0, 0xc4, 0xba, 0xab, 0x60, 0x95, 0x5c,
|
||||
0x12, 0xac, 0xf2, 0x58, 0xf2, 0x07, 0xe2, 0x96, 0xf9, 0xd9, 0xdc, 0x12, 0x17, 0x98, 0x58, 0xe5,
|
||||
0x7b, 0x50, 0xa5, 0xb3, 0x25, 0x0e, 0x6b, 0x21, 0xb5, 0x4b, 0xa9, 0x09, 0xd9, 0x15, 0x44, 0x7b,
|
||||
0x42, 0xbe, 0x71, 0xc3, 0x00, 0x45, 0x4b, 0x5c, 0x0d, 0xb5, 0xe9, 0x29, 0x63, 0x1b, 0x4a, 0x59,
|
||||
0x6e, 0xd6, 0xa7, 0x50, 0x33, 0x68, 0x8a, 0x7d, 0x9f, 0x1c, 0xd4, 0x34, 0x78, 0x22, 0xc0, 0x34,
|
||||
0xd1, 0xa4, 0x66, 0xbf, 0x7d, 0xcd, 0x6e, 0xf4, 0x4c, 0xc0, 0xda, 0x1c, 0x14, 0x45, 0x25, 0xeb,
|
||||
0x13, 0x58, 0x30, 0x9a, 0x25, 0x8d, 0x2f, 0x6b, 0x4c, 0xb9, 0xac, 0x31, 0xfd, 0xf3, 0x1c, 0x2c,
|
||||
0xc9, 0xda, 0x18, 0xd8, 0xe4, 0x89, 0xeb, 0x7a, 0x2f, 0x3a, 0x65, 0xbf, 0x06, 0x0d, 0xd1, 0xba,
|
||||
0x13, 0xf2, 0x53, 0x2f, 0x8a, 0xb9, 0xb2, 0xec, 0x67, 0x1c, 0x0e, 0xc1, 0xb5, 0x05, 0xaa, 0x2d,
|
||||
0x31, 0xd9, 0x27, 0x50, 0xc3, 0xaa, 0xa4, 0x93, 0xca, 0x6d, 0x69, 0x4f, 0x57, 0xa4, 0xa1, 0x6e,
|
||||
0x5f, 0xb3, 0x21, 0xd2, 0x5f, 0x6b, 0x55, 0x28, 0xc7, 0xa1, 0x77, 0x7a, 0xca, 0x43, 0x6b, 0x59,
|
||||
0x0f, 0x4d, 0x9c, 0x34, 0xde, 0x8d, 0xf9, 0x48, 0x08, 0x41, 0xd6, 0x7f, 0xcf, 0x41, 0x4d, 0x9e,
|
||||
0x9d, 0x6f, 0x6d, 0xce, 0xef, 0x18, 0x91, 0x79, 0xa4, 0x7e, 0x26, 0x81, 0x78, 0x77, 0x61, 0x7e,
|
||||
0x28, 0x04, 0x22, 0x21, 0xb0, 0xa7, 0x6c, 0xf9, 0x4d, 0x05, 0x96, 0xf2, 0xc8, 0x03, 0x58, 0x44,
|
||||
0xf1, 0x24, 0x72, 0x62, 0x6f, 0xe0, 0xa8, 0x42, 0x19, 0x05, 0xb7, 0x40, 0x45, 0x47, 0xde, 0x60,
|
||||
0x4f, 0x16, 0x88, 0x5b, 0x3a, 0x8a, 0xdd, 0x53, 0x2e, 0x45, 0x5f, 0xfa, 0xb0, 0xda, 0xb0, 0x3c,
|
||||
0x21, 0xab, 0x2b, 0x3d, 0xe3, 0x1f, 0x36, 0x60, 0x65, 0xaa, 0x48, 0xea, 0x1b, 0xda, 0x86, 0x3d,
|
||||
0xf0, 0x86, 0xc7, 0x81, 0x36, 0x37, 0xe5, 0x0c, 0x1b, 0xf6, 0xae, 0x28, 0x51, 0xe6, 0x26, 0x0e,
|
||||
0xd7, 0x15, 0x41, 0xa0, 0xbd, 0x48, 0x8b, 0xf3, 0x79, 0x14, 0x36, 0xdf, 0x4b, 0x33, 0xaa, 0xc9,
|
||||
0xee, 0x14, 0xdc, 0xbc, 0xfe, 0x16, 0x47, 0x53, 0xb0, 0x88, 0x9d, 0x40, 0x5b, 0xd3, 0x9d, 0x94,
|
||||
0x8f, 0x0c, 0xdd, 0x44, 0xf4, 0xf4, 0xce, 0x0b, 0x7a, 0x4a, 0x19, 0x22, 0xec, 0x65, 0x45, 0xae,
|
||||
0xd4, 0x98, 0xee, 0xe7, 0x1c, 0x5e, 0x55, 0xfd, 0xa0, 0xac, 0x33, 0xdd, 0x5b, 0xf1, 0xa5, 0xe6,
|
||||
0x85, 0x06, 0x96, 0x74, 0x97, 0x37, 0x65, 0xc3, 0xba, 0xc8, 0xec, 0xf7, 0x0c, 0x96, 0x2f, 0x5c,
|
||||
0x2f, 0x56, 0xf3, 0x33, 0xd4, 0xa2, 0x12, 0xf6, 0xf7, 0xf8, 0x05, 0xfd, 0x7d, 0x4e, 0x95, 0x53,
|
||||
0xd2, 0xdf, 0xd2, 0xc5, 0x34, 0x30, 0xea, 0xfc, 0xe7, 0x3c, 0x34, 0xd3, 0xad, 0x88, 0x43, 0x2d,
|
||||
0xf9, 0x90, 0x92, 0x27, 0xa4, 0x3c, 0x2e, 0xcd, 0xa0, 0xfb, 0x24, 0x47, 0x4c, 0x1b, 0x68, 0xf3,
|
||||
0x19, 0x06, 0x5a, 0xd3, 0x2e, 0x5a, 0x78, 0x91, 0xef, 0xa7, 0xf8, 0x52, 0xbe, 0x9f, 0x52, 0x96,
|
||||
0xef, 0x67, 0xb6, 0xc3, 0x60, 0xee, 0x5b, 0x39, 0x0c, 0xca, 0xb3, 0x1d, 0x06, 0x9d, 0xbf, 0xce,
|
||||
0x01, 0x9b, 0xa6, 0x54, 0xf6, 0x29, 0xd9, 0xa2, 0x7d, 0x3e, 0x90, 0x5c, 0xec, 0xdd, 0x97, 0xa3,
|
||||
0x76, 0xb5, 0x41, 0xaa, 0x36, 0x7b, 0x08, 0x8b, 0x66, 0xdc, 0xac, 0xa9, 0xaa, 0x34, 0x6c, 0x66,
|
||||
0x16, 0x25, 0x0a, 0xad, 0xe1, 0xf8, 0x2a, 0xbe, 0xd0, 0xf1, 0x55, 0x7a, 0xa1, 0xe3, 0x6b, 0x2e,
|
||||
0xed, 0xf8, 0xea, 0xfc, 0x9d, 0x1c, 0x2c, 0x66, 0x10, 0xd5, 0x2f, 0x6f, 0xce, 0x82, 0x16, 0x52,
|
||||
0x2c, 0x26, 0x2f, 0x69, 0xc1, 0xe0, 0x2e, 0x9d, 0xaf, 0xa0, 0x91, 0x3a, 0x44, 0xbf, 0xbc, 0xee,
|
||||
0x27, 0x15, 0x2d, 0x22, 0x65, 0x53, 0xd1, 0xea, 0xfc, 0x65, 0x1e, 0xd8, 0xf4, 0x39, 0xfe, 0x55,
|
||||
0x0e, 0x61, 0x7a, 0x91, 0x0a, 0xd3, 0x8b, 0xf4, 0xff, 0xee, 0x5e, 0x79, 0x1b, 0x16, 0x64, 0xac,
|
||||
0xbf, 0xe1, 0x78, 0x20, 0x42, 0x69, 0xe9, 0x02, 0x35, 0x8a, 0x0f, 0x27, 0x7d, 0x8e, 0x95, 0x54,
|
||||
0x78, 0xb3, 0x71, 0xb1, 0xa6, 0x5d, 0x8f, 0x56, 0x07, 0xda, 0x72, 0x69, 0xa6, 0x4d, 0x75, 0xbf,
|
||||
0x57, 0xd4, 0x5a, 0x32, 0x16, 0x4a, 0xa1, 0xf8, 0xbb, 0x50, 0x37, 0x2f, 0x1b, 0xb9, 0x0f, 0x13,
|
||||
0x1e, 0x27, 0x21, 0x0e, 0x07, 0xc6, 0x69, 0x5d, 0x07, 0xf2, 0x23, 0xf4, 0x75, 0x35, 0x92, 0x20,
|
||||
0x9e, 0x63, 0x78, 0x46, 0xe1, 0x28, 0xb5, 0xf9, 0xff, 0x1f, 0x34, 0xd3, 0x76, 0x2b, 0x29, 0xea,
|
||||
0x65, 0x49, 0x87, 0xa2, 0x76, 0xca, 0x90, 0xc5, 0x7e, 0x03, 0x5a, 0x93, 0x76, 0x2f, 0x19, 0x7b,
|
||||
0x39, 0xa3, 0xfe, 0xbc, 0x97, 0x36, 0x85, 0xb1, 0x6d, 0x58, 0xca, 0xba, 0x6e, 0x71, 0x57, 0x66,
|
||||
0xab, 0x05, 0x6c, 0xfa, 0x4a, 0x65, 0x1f, 0x49, 0xf3, 0x66, 0x29, 0xcb, 0x11, 0x63, 0x2c, 0xf6,
|
||||
0x03, 0xfa, 0xcf, 0x30, 0x74, 0x9e, 0x03, 0x24, 0x30, 0xd6, 0x82, 0xfa, 0xc1, 0xe1, 0xe6, 0xbe,
|
||||
0xb3, 0xbe, 0xbd, 0xba, 0xbf, 0xbf, 0xb9, 0xdb, 0xba, 0xc6, 0x18, 0x34, 0xd1, 0x83, 0xb2, 0xa1,
|
||||
0x61, 0x39, 0x01, 0x93, 0xb6, 0x5f, 0x05, 0xcb, 0xb3, 0x25, 0x68, 0xed, 0xec, 0x4f, 0x40, 0x0b,
|
||||
0xac, 0x0d, 0x4b, 0x87, 0x9b, 0xe4, 0x74, 0x49, 0xb5, 0x5b, 0x14, 0x22, 0x9c, 0x9c, 0xae, 0x10,
|
||||
0xe1, 0x28, 0x53, 0x44, 0x52, 0x9f, 0x92, 0x6c, 0x7e, 0x3f, 0x07, 0xd7, 0x27, 0x0a, 0x92, 0xf8,
|
||||
0x5f, 0x92, 0x6b, 0xd2, 0x12, 0x4d, 0x1d, 0x81, 0x8a, 0x86, 0xdf, 0x86, 0x05, 0xad, 0xea, 0x4d,
|
||||
0xf0, 0xa5, 0x96, 0x2e, 0x50, 0xc8, 0x0f, 0x61, 0xd1, 0xd0, 0x18, 0x27, 0x4e, 0x28, 0x33, 0x8a,
|
||||
0x64, 0x05, 0x6b, 0x45, 0xc7, 0x59, 0x4e, 0x8c, 0xba, 0x4f, 0xe9, 0x27, 0x66, 0x41, 0x62, 0xfd,
|
||||
0x4d, 0x8f, 0x57, 0x7d, 0x0a, 0x55, 0x3e, 0x45, 0x08, 0xe9, 0xd1, 0x9a, 0x1b, 0xae, 0xba, 0xff,
|
||||
0xc3, 0x39, 0x60, 0x9f, 0x8d, 0x79, 0x78, 0x85, 0xf1, 0xbd, 0xd1, 0x8b, 0x02, 0x5e, 0x94, 0x5a,
|
||||
0x94, 0x7f, 0xa9, 0x18, 0xfe, 0xac, 0x18, 0xfa, 0xe2, 0x8b, 0x63, 0xe8, 0x4b, 0x2f, 0x8a, 0xa1,
|
||||
0x7f, 0x1d, 0x1a, 0xde, 0xa9, 0x1f, 0x08, 0x06, 0x24, 0x64, 0x93, 0xa8, 0x3d, 0x77, 0xa7, 0x70,
|
||||
0xaf, 0x6e, 0xd7, 0x25, 0x50, 0x48, 0x26, 0x11, 0xfb, 0x24, 0x41, 0xe2, 0xfd, 0x53, 0xcc, 0xf7,
|
||||
0x30, 0x59, 0xcf, 0x66, 0xff, 0x94, 0x4b, 0x2d, 0x10, 0xed, 0x22, 0xaa, 0xb2, 0x80, 0x47, 0xec,
|
||||
0x0d, 0x68, 0x46, 0xc1, 0x58, 0x88, 0x7a, 0x6a, 0x19, 0xc8, 0x3e, 0x5c, 0x27, 0xe8, 0xa1, 0x72,
|
||||
0x06, 0x2c, 0x8e, 0x23, 0xee, 0x0c, 0xbd, 0x28, 0x12, 0x17, 0x74, 0x2f, 0xf0, 0xe3, 0x30, 0x18,
|
||||
0x48, 0x93, 0xef, 0xc2, 0x38, 0xe2, 0x7b, 0x54, 0xb2, 0x4e, 0x05, 0xec, 0xfd, 0x64, 0x48, 0x23,
|
||||
0xd7, 0x0b, 0xa3, 0x36, 0xe0, 0x90, 0xd4, 0x4c, 0x51, 0xa2, 0x72, 0xbd, 0x50, 0x8f, 0x45, 0x7c,
|
||||
0x44, 0x13, 0xb1, 0xfd, 0xb5, 0xc9, 0xd8, 0xfe, 0x9f, 0x64, 0xc7, 0xf6, 0x37, 0xb0, 0xe9, 0x47,
|
||||
0xb2, 0xe9, 0xe9, 0x2d, 0xfe, 0x46, 0x21, 0xfe, 0xd3, 0x29, 0x0b, 0xcd, 0x6f, 0x92, 0xb2, 0x30,
|
||||
0x9f, 0x95, 0xb2, 0xf0, 0x1e, 0xd4, 0x30, 0x98, 0xdc, 0x39, 0xf3, 0xfc, 0x58, 0x99, 0xb0, 0x5b,
|
||||
0x66, 0xb4, 0xf9, 0xb6, 0x50, 0xa6, 0x21, 0x54, 0x7f, 0x46, 0xd3, 0xd9, 0x03, 0x0b, 0xbf, 0xc2,
|
||||
0xec, 0x01, 0x19, 0xf4, 0xfe, 0x00, 0x2a, 0x6a, 0x9f, 0x18, 0x83, 0xe2, 0x49, 0x18, 0x0c, 0x95,
|
||||
0x69, 0x4f, 0xfc, 0xcd, 0x9a, 0x90, 0x8f, 0x03, 0x59, 0x39, 0x1f, 0x07, 0xd6, 0x6f, 0x41, 0xcd,
|
||||
0x20, 0x35, 0xf6, 0x1a, 0x19, 0x11, 0x84, 0xb4, 0x2c, 0xb5, 0x64, 0x5a, 0xc5, 0xaa, 0x84, 0xee,
|
||||
0xf4, 0x05, 0xbf, 0xe9, 0x7b, 0x21, 0xc7, 0x3c, 0x1f, 0x27, 0xe4, 0xe7, 0x3c, 0x8c, 0x94, 0xa9,
|
||||
0xb5, 0xa5, 0x0b, 0x6c, 0x82, 0x5b, 0x7f, 0x13, 0x16, 0x53, 0x7b, 0x2b, 0x59, 0xc4, 0x1b, 0x30,
|
||||
0x87, 0xeb, 0xa6, 0x5c, 0x61, 0xe9, 0x28, 0x7e, 0x59, 0x86, 0x09, 0x9c, 0x64, 0x25, 0x76, 0x46,
|
||||
0x61, 0x70, 0x8c, 0x9d, 0xe4, 0xec, 0x9a, 0x84, 0x1d, 0x86, 0xc1, 0xb1, 0xf5, 0xf3, 0x02, 0x14,
|
||||
0xb6, 0x83, 0x91, 0x19, 0x61, 0x91, 0x9b, 0x8a, 0xb0, 0x90, 0x2a, 0x80, 0xa3, 0x45, 0x7c, 0x29,
|
||||
0xb5, 0xa1, 0x7d, 0x54, 0x89, 0xf9, 0xf7, 0xa0, 0x29, 0xf8, 0x44, 0x1c, 0x08, 0x1d, 0xea, 0xc2,
|
||||
0x0d, 0x29, 0xa6, 0xbf, 0x40, 0x87, 0xcf, 0x1d, 0xc6, 0x47, 0xc1, 0x16, 0xc1, 0xd9, 0x12, 0x14,
|
||||
0xb4, 0x00, 0x8b, 0xc5, 0xe2, 0x53, 0x28, 0xd7, 0x18, 0xdd, 0x76, 0x25, 0x7d, 0x3d, 0xf2, 0x8b,
|
||||
0xbd, 0x0b, 0x8b, 0xe9, 0x76, 0x89, 0x15, 0x49, 0x89, 0xc4, 0x6c, 0x18, 0x79, 0xd2, 0x0d, 0x10,
|
||||
0x7c, 0x84, 0x70, 0xa4, 0x5b, 0xf6, 0x84, 0x73, 0x2c, 0x32, 0x98, 0x5e, 0x25, 0xc5, 0xf4, 0x6e,
|
||||
0x43, 0x2d, 0x1e, 0x9c, 0x3b, 0x23, 0xf7, 0x6a, 0x10, 0xb8, 0x7d, 0x79, 0xbe, 0x21, 0x1e, 0x9c,
|
||||
0x1f, 0x12, 0x84, 0x3d, 0x04, 0x18, 0x8e, 0x46, 0xf2, 0xec, 0xa1, 0xb9, 0x31, 0x21, 0xe5, 0xbd,
|
||||
0xc3, 0x43, 0x22, 0x39, 0xbb, 0x3a, 0x1c, 0x8d, 0xe8, 0x4f, 0xb6, 0x01, 0xcd, 0xcc, 0x5c, 0x9c,
|
||||
0x5b, 0x2a, 0x18, 0x2b, 0x18, 0x3d, 0xc8, 0x38, 0x9c, 0x8d, 0x9e, 0x09, 0xeb, 0xfc, 0x06, 0xb0,
|
||||
0x5f, 0x30, 0x23, 0xe6, 0x08, 0xaa, 0x7a, 0x7c, 0x66, 0x42, 0x09, 0x86, 0x57, 0xd6, 0x52, 0x09,
|
||||
0x25, 0xab, 0xfd, 0x7e, 0x28, 0xf8, 0x22, 0x5d, 0x98, 0x9a, 0xe5, 0x83, 0x71, 0x63, 0xae, 0x12,
|
||||
0xdf, 0xb7, 0xfe, 0x22, 0x07, 0x25, 0xca, 0x6e, 0x79, 0x13, 0xe6, 0x09, 0x5f, 0x47, 0xab, 0x48,
|
||||
0x0f, 0x11, 0xdd, 0xbb, 0x47, 0x32, 0x50, 0x45, 0x1c, 0x0b, 0x23, 0x33, 0x2f, 0xaf, 0x77, 0xde,
|
||||
0xc8, 0xce, 0xbb, 0x0d, 0x55, 0xdd, 0xb5, 0x41, 0x3a, 0x15, 0xd5, 0x33, 0x7b, 0x15, 0x8a, 0x67,
|
||||
0xc1, 0x48, 0xe9, 0xe2, 0x90, 0xac, 0xa4, 0x8d, 0xf0, 0x64, 0x2c, 0xa2, 0x0f, 0x1a, 0xbc, 0xd4,
|
||||
0x21, 0x75, 0x27, 0x48, 0x06, 0xd3, 0x73, 0x9c, 0xcb, 0x98, 0xe3, 0x53, 0x98, 0x17, 0x7c, 0xc0,
|
||||
0xf0, 0xd4, 0xce, 0xbe, 0x34, 0xdf, 0x12, 0x12, 0x5e, 0x6f, 0x30, 0xee, 0x73, 0xd3, 0x12, 0x82,
|
||||
0xa1, 0x13, 0x12, 0xae, 0xd4, 0x03, 0xeb, 0x0f, 0x73, 0xc4, 0x5f, 0x44, 0xbb, 0xec, 0x1e, 0x14,
|
||||
0xc5, 0xfd, 0x36, 0x61, 0xa9, 0xd3, 0x71, 0xae, 0x02, 0xcf, 0x46, 0x0c, 0x4c, 0x67, 0x1d, 0x0f,
|
||||
0xd3, 0xad, 0x37, 0xec, 0x9a, 0x3f, 0x1e, 0x6a, 0x63, 0xc2, 0x77, 0xd4, 0xb4, 0x26, 0x14, 0x71,
|
||||
0x9a, 0xbd, 0x3e, 0xa6, 0x0f, 0x8c, 0x18, 0x8c, 0x62, 0xea, 0xc6, 0x54, 0x52, 0x60, 0xff, 0x94,
|
||||
0x1b, 0xb1, 0x17, 0x7f, 0x9c, 0x87, 0x46, 0x6a, 0x44, 0x18, 0x84, 0x22, 0x2e, 0x00, 0xb2, 0x02,
|
||||
0xcb, 0xfd, 0x06, 0x01, 0x92, 0x82, 0xba, 0xb1, 0x4e, 0xf9, 0xd4, 0x3a, 0x69, 0x9f, 0x74, 0xc1,
|
||||
0xf4, 0x49, 0x3f, 0x82, 0x6a, 0x92, 0x91, 0x99, 0x1e, 0x92, 0xe8, 0x4f, 0x45, 0xfb, 0x26, 0x48,
|
||||
0x89, 0x17, 0xbb, 0x64, 0x7a, 0xb1, 0xbf, 0x6f, 0x38, 0x3d, 0xe7, 0xb0, 0x19, 0x2b, 0x6b, 0x45,
|
||||
0x7f, 0x35, 0x41, 0x11, 0x9f, 0x40, 0xcd, 0x18, 0xbc, 0xe9, 0xdc, 0xcc, 0xa5, 0x9c, 0x9b, 0x3a,
|
||||
0x2e, 0x3f, 0x9f, 0xc4, 0xe5, 0x5b, 0xbf, 0x93, 0x87, 0x86, 0x38, 0x5f, 0x9e, 0x7f, 0x7a, 0x18,
|
||||
0x0c, 0xbc, 0x1e, 0x5a, 0x85, 0xf5, 0x09, 0x93, 0x82, 0x96, 0x3a, 0x67, 0xf2, 0x88, 0x91, 0x9c,
|
||||
0x65, 0xa6, 0x1f, 0x11, 0x93, 0xd6, 0xe9, 0x47, 0x16, 0x34, 0x04, 0x63, 0x3c, 0x76, 0x23, 0x6e,
|
||||
0xe4, 0x8b, 0xda, 0xb5, 0x13, 0xce, 0xd7, 0xdc, 0x88, 0x38, 0xe4, 0xbb, 0xb0, 0x28, 0x70, 0x30,
|
||||
0xf3, 0x62, 0xe8, 0x0d, 0x06, 0x1e, 0x61, 0x92, 0xa9, 0xa1, 0x75, 0xc2, 0xb9, 0xed, 0xc6, 0x7c,
|
||||
0x4f, 0x14, 0xc8, 0xf4, 0xd2, 0x4a, 0xdf, 0x8b, 0xdc, 0xe3, 0x24, 0x54, 0x48, 0x7f, 0xa3, 0x2f,
|
||||
0xc7, 0xbd, 0x34, 0x7c, 0x39, 0x94, 0x82, 0x55, 0x1b, 0xba, 0x97, 0xda, 0x97, 0x33, 0x41, 0x49,
|
||||
0xe5, 0x49, 0x4a, 0xb2, 0xfe, 0x5b, 0x1e, 0x6a, 0x06, 0x59, 0xbe, 0xcc, 0xed, 0x7a, 0x6b, 0xca,
|
||||
0x8a, 0x5f, 0x35, 0x0d, 0xf6, 0xaf, 0xa7, 0xbb, 0x44, 0x97, 0x2f, 0x25, 0xb2, 0x1a, 0x04, 0x7c,
|
||||
0x13, 0xaa, 0xe2, 0xd4, 0xbd, 0x87, 0x46, 0x31, 0x99, 0x86, 0x8d, 0x80, 0xc3, 0xf1, 0xb1, 0x2a,
|
||||
0x7c, 0x8c, 0x85, 0xa5, 0xa4, 0xf0, 0xb1, 0x28, 0x7c, 0x5e, 0x7c, 0xe0, 0x87, 0x50, 0x97, 0xad,
|
||||
0xe2, 0x9e, 0xe2, 0x74, 0x93, 0x53, 0x9f, 0xda, 0x6f, 0xbb, 0x46, 0xdd, 0xd1, 0xe6, 0xcb, 0x8a,
|
||||
0x8f, 0x55, 0xc5, 0xca, 0x8b, 0x2a, 0x3e, 0xa6, 0x0f, 0x6b, 0x4b, 0x87, 0x5c, 0x62, 0xb8, 0x81,
|
||||
0xe2, 0x63, 0x0f, 0x61, 0x51, 0xb1, 0xab, 0xb1, 0xef, 0xfa, 0x7e, 0x30, 0xf6, 0x7b, 0x5c, 0x05,
|
||||
0xec, 0x33, 0x59, 0xf4, 0x34, 0x29, 0xb1, 0xfa, 0x3a, 0xa3, 0x8b, 0xc2, 0x16, 0xee, 0x43, 0x89,
|
||||
0xe4, 0x72, 0x12, 0x3e, 0xb2, 0x19, 0x17, 0xa1, 0xb0, 0x7b, 0x50, 0x22, 0xf1, 0x3c, 0x3f, 0x93,
|
||||
0xd9, 0x10, 0x82, 0xf5, 0x00, 0xe6, 0x51, 0xc4, 0x34, 0x38, 0xee, 0xf3, 0xa4, 0x12, 0x6b, 0x09,
|
||||
0xd8, 0x3e, 0x1d, 0x22, 0x33, 0x9c, 0xe6, 0x7f, 0x15, 0xa0, 0x66, 0x80, 0x05, 0x5b, 0xc4, 0x00,
|
||||
0x0c, 0xa7, 0xef, 0xb9, 0x43, 0xae, 0x7c, 0x0f, 0x0d, 0xbb, 0x81, 0xd0, 0x0d, 0x09, 0x14, 0x97,
|
||||
0x82, 0x7b, 0x7e, 0xea, 0x04, 0xe3, 0xd8, 0xe9, 0xf3, 0xd3, 0x90, 0x73, 0x29, 0x2c, 0xd5, 0xdd,
|
||||
0xf3, 0xd3, 0x83, 0x71, 0xbc, 0x81, 0x30, 0x81, 0x25, 0x88, 0xda, 0xc0, 0x92, 0x31, 0x03, 0x43,
|
||||
0xf7, 0x32, 0xc1, 0x92, 0x81, 0x2b, 0xb4, 0x44, 0x45, 0x1d, 0xb8, 0x42, 0x6a, 0xcb, 0x24, 0x27,
|
||||
0x2f, 0x4d, 0x73, 0xf2, 0xf7, 0x61, 0x99, 0x38, 0xb9, 0xe4, 0x11, 0xce, 0x04, 0x49, 0x2d, 0x61,
|
||||
0xa9, 0x9c, 0xa4, 0x21, 0x7f, 0xb5, 0xc4, 0x0c, 0xd4, 0xf9, 0x88, 0xbc, 0x9f, 0xd2, 0x89, 0xca,
|
||||
0xd9, 0x62, 0x66, 0xb2, 0xf1, 0xae, 0xf7, 0x53, 0x2e, 0x30, 0xd1, 0x31, 0x6a, 0x62, 0xca, 0x30,
|
||||
0xd4, 0xa1, 0xe7, 0x4f, 0x62, 0xba, 0x97, 0x69, 0xcc, 0xaa, 0xc4, 0x74, 0x2f, 0x4d, 0xcc, 0x0f,
|
||||
0x60, 0x65, 0xc8, 0xfb, 0x9e, 0x9b, 0x6e, 0xd6, 0x49, 0x24, 0x88, 0x25, 0x2a, 0x36, 0xea, 0x74,
|
||||
0x49, 0x83, 0x14, 0xab, 0xf1, 0xd3, 0x60, 0x78, 0xec, 0xd1, 0xe5, 0x49, 0xae, 0xda, 0xa2, 0xdd,
|
||||
0xf4, 0xc7, 0xc3, 0x1f, 0x21, 0x58, 0x54, 0x89, 0xac, 0x06, 0xd4, 0xba, 0x71, 0x30, 0x52, 0xdb,
|
||||
0xdc, 0x84, 0x3a, 0x7d, 0xca, 0x74, 0x8c, 0x9b, 0x70, 0x03, 0x69, 0xf3, 0x28, 0x18, 0x05, 0x83,
|
||||
0xe0, 0xf4, 0x2a, 0x65, 0x50, 0xfa, 0x1f, 0x39, 0x58, 0x4c, 0x95, 0xca, 0x73, 0xfe, 0x3e, 0x1d,
|
||||
0x2c, 0x1d, 0x53, 0x4f, 0xe4, 0xbc, 0x60, 0x5c, 0x3e, 0x84, 0x48, 0xa7, 0x4a, 0xc5, 0xd9, 0xaf,
|
||||
0x26, 0xb9, 0xa0, 0xaa, 0x22, 0xd1, 0x76, 0x7b, 0x9a, 0xb6, 0x65, 0x7d, 0x95, 0x25, 0xaa, 0x9a,
|
||||
0xf8, 0xff, 0x65, 0xa8, 0x70, 0x5f, 0x4e, 0xb9, 0x90, 0x0e, 0x86, 0x34, 0x8d, 0x4f, 0x6a, 0x04,
|
||||
0x89, 0x45, 0x2a, 0xb2, 0xfe, 0x4d, 0x0e, 0x20, 0x19, 0x1d, 0x86, 0x63, 0xea, 0x0b, 0x94, 0x9e,
|
||||
0x59, 0x31, 0x2e, 0xcb, 0xd7, 0xa0, 0xae, 0x23, 0xc6, 0x92, 0x2b, 0xb9, 0xa6, 0x60, 0xe2, 0x5e,
|
||||
0xbe, 0x0b, 0xf3, 0xa7, 0x83, 0xe0, 0x18, 0x45, 0x27, 0x79, 0x81, 0x52, 0x52, 0x4a, 0x93, 0xc0,
|
||||
0xea, 0x5a, 0x4c, 0x2e, 0xf0, 0x62, 0x66, 0x50, 0x99, 0x79, 0x1d, 0x5b, 0xbf, 0x9b, 0xd7, 0xa1,
|
||||
0x33, 0xc9, 0x4a, 0x3c, 0x5f, 0xcf, 0xf8, 0x36, 0x1e, 0xd8, 0xe7, 0x79, 0x1e, 0x3e, 0x81, 0x66,
|
||||
0x48, 0xdc, 0x51, 0xb1, 0xce, 0xe2, 0x73, 0x58, 0x67, 0x23, 0x4c, 0x5d, 0xb9, 0x6f, 0x41, 0xcb,
|
||||
0xed, 0x9f, 0xf3, 0x30, 0xf6, 0xd0, 0x58, 0x8b, 0x82, 0x9a, 0x0c, 0x56, 0x31, 0xe0, 0x28, 0x11,
|
||||
0xdd, 0x85, 0x79, 0x99, 0x22, 0xa4, 0x31, 0xe5, 0xa3, 0x03, 0x09, 0x58, 0x20, 0x5a, 0xff, 0x5e,
|
||||
0xc5, 0xea, 0xa4, 0x77, 0xf7, 0xf9, 0xab, 0x62, 0xce, 0x30, 0x3f, 0xed, 0x5b, 0x91, 0x84, 0x24,
|
||||
0x6d, 0xc0, 0x92, 0x1f, 0x11, 0x50, 0x5a, 0x80, 0xd3, 0xcb, 0x5a, 0x7c, 0x99, 0x65, 0xb5, 0xfe,
|
||||
0x34, 0x07, 0xe5, 0xed, 0x60, 0x24, 0xf4, 0x72, 0x21, 0xcf, 0xe1, 0x31, 0xd1, 0xe9, 0x79, 0x73,
|
||||
0xe2, 0x73, 0xa7, 0xff, 0xfc, 0xb0, 0xfc, 0x4c, 0x79, 0xa3, 0x91, 0x96, 0x37, 0xbe, 0x0f, 0x37,
|
||||
0xd1, 0x1b, 0x11, 0x06, 0xa3, 0x20, 0x14, 0x47, 0xd5, 0x1d, 0x90, 0xdc, 0x11, 0xf8, 0xf1, 0x99,
|
||||
0xe2, 0x9d, 0x37, 0x4e, 0x38, 0x3f, 0x34, 0x30, 0xf6, 0x34, 0x02, 0xe6, 0x9a, 0x0c, 0xe2, 0x73,
|
||||
0x87, 0x54, 0x45, 0x29, 0x18, 0x11, 0x47, 0x9d, 0x17, 0x05, 0x9b, 0x08, 0x47, 0xd1, 0xc8, 0xfa,
|
||||
0x08, 0xaa, 0xda, 0xea, 0xc0, 0xde, 0x86, 0xea, 0x59, 0x30, 0x92, 0xa6, 0x89, 0x5c, 0x2a, 0x75,
|
||||
0x41, 0xce, 0xda, 0xae, 0x9c, 0xd1, 0x1f, 0x91, 0xf5, 0xf3, 0x32, 0x94, 0x77, 0xfc, 0xf3, 0xc0,
|
||||
0xeb, 0x61, 0xb4, 0xcf, 0x90, 0x0f, 0x03, 0x95, 0xa7, 0x28, 0xfe, 0x46, 0x8f, 0x7e, 0xf2, 0x74,
|
||||
0x40, 0x41, 0x7a, 0xf4, 0xf5, 0xa3, 0x01, 0xd7, 0x61, 0x2e, 0x34, 0x73, 0xff, 0x4b, 0x21, 0xc6,
|
||||
0x1f, 0x6a, 0xa5, 0xad, 0x64, 0xe4, 0x79, 0x8a, 0xb6, 0x28, 0x27, 0x1d, 0x97, 0x8c, 0x72, 0x4f,
|
||||
0xaa, 0x08, 0xc1, 0x05, 0x7b, 0x05, 0xca, 0x32, 0x53, 0x80, 0xe2, 0xae, 0x29, 0x60, 0x50, 0x82,
|
||||
0x90, 0x1a, 0x42, 0x4e, 0xde, 0x24, 0x2d, 0x51, 0x09, 0x3d, 0x5d, 0x02, 0x37, 0x04, 0xad, 0xdd,
|
||||
0x86, 0x1a, 0xe1, 0x13, 0x4a, 0x45, 0xc6, 0xe7, 0x20, 0x08, 0x11, 0x32, 0x9e, 0xd0, 0xa8, 0x66,
|
||||
0x3e, 0xa1, 0x81, 0xe1, 0x5c, 0x9a, 0xcb, 0xd2, 0x14, 0x81, 0x1e, 0x4e, 0x30, 0xe0, 0xea, 0xfd,
|
||||
0x18, 0xa9, 0xdc, 0x53, 0x1a, 0x95, 0x52, 0xee, 0x5f, 0x87, 0xc6, 0x89, 0x3b, 0x18, 0x1c, 0xbb,
|
||||
0xbd, 0x67, 0xa4, 0x93, 0xd6, 0xc9, 0x0c, 0xa7, 0x80, 0xa8, 0x94, 0xde, 0x86, 0x9a, 0xb1, 0xcb,
|
||||
0x18, 0x7c, 0x53, 0xb4, 0x21, 0xd9, 0xdf, 0x49, 0x53, 0x53, 0xf3, 0x25, 0x4c, 0x4d, 0x46, 0x10,
|
||||
0xd2, 0x7c, 0x3a, 0x08, 0xe9, 0x26, 0x72, 0x53, 0x19, 0xa8, 0xd2, 0xa2, 0x2c, 0x7d, 0xb7, 0xdf,
|
||||
0xc7, 0x40, 0x15, 0x7a, 0x12, 0x0b, 0x17, 0x8f, 0xca, 0x17, 0x48, 0xa8, 0x25, 0x18, 0xa1, 0xdc,
|
||||
0x22, 0x7b, 0xe9, 0xc8, 0xf5, 0xfa, 0x18, 0xf4, 0x49, 0x6a, 0x6c, 0xd9, 0x1d, 0xc6, 0x87, 0xae,
|
||||
0xd7, 0x67, 0x77, 0xa0, 0xae, 0x8a, 0xf1, 0x76, 0x5c, 0xa4, 0xf5, 0x97, 0xc5, 0xe2, 0x4e, 0xb4,
|
||||
0xa0, 0xa1, 0x31, 0x86, 0x49, 0x2e, 0x54, 0x4d, 0xa2, 0x20, 0x1d, 0xbc, 0x87, 0xce, 0xff, 0x98,
|
||||
0x63, 0xc6, 0x53, 0xf3, 0xf1, 0x4d, 0x39, 0x57, 0x49, 0xa5, 0xea, 0x7f, 0x8c, 0x74, 0xb0, 0x09,
|
||||
0x53, 0x08, 0x62, 0xe4, 0xa2, 0x59, 0x4e, 0x09, 0x62, 0x12, 0x15, 0x5d, 0x34, 0x84, 0xc0, 0x3e,
|
||||
0x32, 0x14, 0xa9, 0x36, 0x22, 0xbf, 0x32, 0xd1, 0xfe, 0x0c, 0x15, 0x4a, 0x50, 0xaf, 0x17, 0x89,
|
||||
0x5b, 0x26, 0xe2, 0x7e, 0x1f, 0x13, 0xa0, 0x2a, 0x76, 0xd5, 0x8b, 0x9e, 0x10, 0xe0, 0x97, 0xab,
|
||||
0x61, 0xad, 0x42, 0xdd, 0x9c, 0x26, 0xab, 0x40, 0xf1, 0xe0, 0x70, 0x73, 0xbf, 0x75, 0x8d, 0xd5,
|
||||
0xa0, 0xdc, 0xdd, 0x3c, 0x3a, 0xda, 0xdd, 0xdc, 0x68, 0xe5, 0x58, 0x1d, 0x2a, 0x3a, 0x8d, 0x23,
|
||||
0x2f, 0xbe, 0x56, 0xd7, 0xd7, 0x37, 0x0f, 0x8f, 0x36, 0x37, 0x5a, 0x85, 0x1f, 0x14, 0x2b, 0xf9,
|
||||
0x56, 0xc1, 0xfa, 0xf3, 0x02, 0xd4, 0x8c, 0x55, 0x78, 0x3e, 0x33, 0xbe, 0x05, 0x80, 0x2a, 0x4d,
|
||||
0x12, 0xc7, 0x54, 0xb4, 0xab, 0x02, 0x42, 0x9b, 0x6f, 0x1a, 0xcb, 0x0b, 0xf4, 0xfc, 0x83, 0x32,
|
||||
0x96, 0xbf, 0x0e, 0x0d, 0x7a, 0x49, 0xc1, 0x74, 0xd7, 0x95, 0xec, 0x3a, 0x01, 0x25, 0xab, 0xc6,
|
||||
0x3c, 0x30, 0x44, 0xc2, 0x0c, 0x01, 0x99, 0x57, 0x4d, 0x20, 0xcc, 0x11, 0xc0, 0x04, 0x8f, 0x28,
|
||||
0x18, 0x9c, 0x73, 0xc2, 0x20, 0x89, 0xb0, 0x26, 0x61, 0x47, 0x32, 0x11, 0x4d, 0xf2, 0x43, 0x23,
|
||||
0x11, 0xa9, 0x64, 0xd7, 0x09, 0x28, 0x3b, 0x7a, 0x57, 0x11, 0x50, 0x05, 0x09, 0x68, 0x65, 0x9a,
|
||||
0x1a, 0x52, 0xc4, 0xb3, 0x3b, 0x65, 0xcf, 0xaa, 0x22, 0x61, 0x7c, 0x67, 0xba, 0xde, 0x8b, 0xed,
|
||||
0x5a, 0xec, 0x6d, 0x60, 0xc3, 0xd1, 0xc8, 0xc9, 0xb0, 0x34, 0x15, 0xed, 0xf9, 0xe1, 0x68, 0x74,
|
||||
0x64, 0x18, 0x62, 0x7e, 0x09, 0x46, 0xb0, 0x2f, 0x81, 0xad, 0x8a, 0x03, 0x8c, 0x43, 0xd4, 0x26,
|
||||
0xd4, 0x84, 0x2d, 0xe7, 0x4c, 0xb6, 0x9c, 0xc1, 0xfd, 0xf2, 0x99, 0xdc, 0xef, 0x79, 0x7c, 0xc2,
|
||||
0xda, 0x82, 0xda, 0xa1, 0xf1, 0x4e, 0xcb, 0x1d, 0x71, 0x43, 0xa8, 0x17, 0x5a, 0xe8, 0xee, 0x20,
|
||||
0xe3, 0x56, 0x28, 0x1f, 0x66, 0x31, 0x46, 0x93, 0x37, 0x46, 0x63, 0xfd, 0xeb, 0x1c, 0xe5, 0xc0,
|
||||
0xeb, 0xc1, 0x27, 0x4f, 0xc3, 0x28, 0x3f, 0x50, 0x92, 0x2f, 0x58, 0x53, 0xfe, 0x1f, 0x99, 0xea,
|
||||
0x87, 0x43, 0x73, 0x82, 0x93, 0x93, 0x88, 0xab, 0xcc, 0x97, 0x1a, 0xc2, 0x0e, 0x10, 0xa4, 0x84,
|
||||
0x6f, 0x21, 0xe1, 0x7b, 0xd4, 0x7e, 0x24, 0x33, 0x60, 0x84, 0xf0, 0xbd, 0xe7, 0x5e, 0xca, 0x5e,
|
||||
0x23, 0x21, 0x82, 0x48, 0x43, 0xb5, 0xca, 0xf7, 0xd1, 0xdf, 0xd6, 0xbf, 0x90, 0x29, 0x8d, 0x93,
|
||||
0xeb, 0x7b, 0x1f, 0x2a, 0xba, 0xd5, 0xf4, 0x0d, 0xab, 0x30, 0x75, 0xb9, 0xb8, 0xc7, 0x51, 0x2b,
|
||||
0x4f, 0x8d, 0x98, 0x0e, 0x17, 0x3a, 0x1b, 0x76, 0x8c, 0x51, 0xbf, 0x03, 0xec, 0xc4, 0x0b, 0x27,
|
||||
0x91, 0xe9, 0xb0, 0xb5, 0xb0, 0xc4, 0xc0, 0xb6, 0x9e, 0xc2, 0xa2, 0xe2, 0x12, 0x86, 0x46, 0x90,
|
||||
0xde, 0xbc, 0xdc, 0x0b, 0x98, 0x7c, 0x7e, 0x8a, 0xc9, 0x5b, 0x3f, 0x2b, 0x42, 0x59, 0xbd, 0x79,
|
||||
0x94, 0xf5, 0x4e, 0x4f, 0x35, 0xfd, 0x4e, 0x4f, 0x3b, 0xf5, 0xa6, 0x03, 0x6e, 0xbd, 0xbc, 0xef,
|
||||
0xef, 0x4e, 0x5e, 0xd9, 0x86, 0xd1, 0x3c, 0x75, 0x6d, 0x2f, 0x43, 0x71, 0xe4, 0xc6, 0x67, 0x68,
|
||||
0x20, 0x23, 0xe2, 0xc1, 0x6f, 0x65, 0x4c, 0x2f, 0xa5, 0x8d, 0xe9, 0x59, 0x6f, 0x1a, 0x91, 0x48,
|
||||
0x3a, 0xf5, 0xa6, 0xd1, 0x4d, 0x20, 0xf9, 0xc2, 0x88, 0x87, 0xa9, 0x20, 0x40, 0xdc, 0x45, 0x69,
|
||||
0x71, 0xa4, 0x32, 0x29, 0x8e, 0xbc, 0xb4, 0xa8, 0xf0, 0x3e, 0xcc, 0x51, 0x3e, 0xb0, 0xcc, 0x6b,
|
||||
0x52, 0x17, 0x8a, 0x5c, 0x43, 0xf5, 0x3f, 0x05, 0xc1, 0xda, 0x12, 0xd7, 0x7c, 0x20, 0xa4, 0x96,
|
||||
0x7a, 0x20, 0xc4, 0x34, 0xf2, 0xd7, 0xd3, 0x46, 0xfe, 0x7b, 0xd0, 0xd2, 0x0b, 0x8a, 0x26, 0x33,
|
||||
0x3f, 0x92, 0x19, 0x1d, 0x4d, 0x05, 0x17, 0x5c, 0x72, 0x3f, 0x4a, 0x2e, 0xc4, 0x66, 0xea, 0x42,
|
||||
0x14, 0x3c, 0x6c, 0x35, 0x8e, 0xf9, 0x70, 0x14, 0xcb, 0x0b, 0x11, 0x63, 0xbe, 0xcd, 0x01, 0xa6,
|
||||
0x33, 0xfe, 0x1a, 0x50, 0xdd, 0xd9, 0x77, 0xb6, 0x76, 0x77, 0x3e, 0xdd, 0x3e, 0x6a, 0xe5, 0xc4,
|
||||
0x67, 0xf7, 0xe9, 0xfa, 0xfa, 0xe6, 0xe6, 0x06, 0xde, 0x38, 0x00, 0x73, 0x5b, 0xab, 0x3b, 0xe2,
|
||||
0xf6, 0x29, 0x58, 0x7f, 0x9d, 0x83, 0x9a, 0xd1, 0x3c, 0xfb, 0x40, 0xaf, 0x0a, 0xbd, 0x21, 0x71,
|
||||
0x6b, 0x7a, 0x08, 0x0f, 0x14, 0x2b, 0x36, 0x96, 0x45, 0xbf, 0xe0, 0x94, 0x9f, 0xf9, 0x82, 0x13,
|
||||
0x7b, 0x13, 0xe6, 0x5d, 0x6a, 0x41, 0xaf, 0x82, 0x34, 0x07, 0x4b, 0xb0, 0x5c, 0x04, 0x8c, 0x02,
|
||||
0x4b, 0xee, 0x13, 0x81, 0x57, 0x54, 0x81, 0x57, 0xfa, 0x4a, 0xd9, 0x8f, 0xac, 0xef, 0x01, 0x24,
|
||||
0x23, 0x49, 0x4f, 0xf9, 0x5a, 0x7a, 0xca, 0x39, 0x63, 0xca, 0x79, 0x6b, 0x83, 0x98, 0x83, 0x5c,
|
||||
0x3e, 0xed, 0x7f, 0x7e, 0x17, 0x94, 0x9d, 0xc9, 0xc1, 0xe8, 0xca, 0xd1, 0x80, 0xc7, 0x2a, 0xe3,
|
||||
0x71, 0x41, 0x96, 0xec, 0xe8, 0x02, 0x95, 0x80, 0x9c, 0xb4, 0x92, 0xf0, 0x18, 0x49, 0x68, 0x93,
|
||||
0x3c, 0x46, 0xa2, 0xda, 0xba, 0xdc, 0xea, 0x40, 0x7b, 0x83, 0x8b, 0xd6, 0x56, 0x07, 0x83, 0x89,
|
||||
0xe1, 0x58, 0x37, 0xe1, 0x46, 0x46, 0x99, 0x34, 0x2d, 0x7c, 0x06, 0xd7, 0x57, 0x29, 0xb9, 0xf1,
|
||||
0x97, 0x95, 0x61, 0x61, 0xb5, 0x61, 0x79, 0xb2, 0x49, 0xd9, 0xd9, 0x16, 0x2c, 0x6c, 0xf0, 0xe3,
|
||||
0xf1, 0xe9, 0x2e, 0x3f, 0x4f, 0x3a, 0x62, 0x50, 0x8c, 0xce, 0x82, 0x0b, 0xb9, 0x3e, 0xf8, 0xb7,
|
||||
0x38, 0x99, 0x03, 0x81, 0xe3, 0x44, 0x23, 0xde, 0x53, 0x76, 0x4e, 0x84, 0x74, 0x47, 0xbc, 0x67,
|
||||
0x7d, 0x00, 0xcc, 0x6c, 0x47, 0xae, 0x97, 0x90, 0xfd, 0xc7, 0xc7, 0x4e, 0x74, 0x15, 0xc5, 0x7c,
|
||||
0xa8, 0x1e, 0x1e, 0x81, 0x68, 0x7c, 0xdc, 0x25, 0x88, 0x75, 0x17, 0xea, 0x87, 0xee, 0x95, 0xcd,
|
||||
0xbf, 0x94, 0xb9, 0x03, 0x2b, 0x50, 0x1e, 0xb9, 0x57, 0xe2, 0x70, 0x6b, 0x97, 0x07, 0x16, 0x5b,
|
||||
0x7f, 0x54, 0x84, 0x39, 0xc2, 0x64, 0x77, 0xe8, 0x6d, 0x40, 0xcf, 0xc7, 0xc3, 0xa5, 0xd8, 0x9f,
|
||||
0x01, 0x9a, 0xe2, 0x90, 0xf9, 0x69, 0x0e, 0x29, 0xcd, 0x62, 0xea, 0x4d, 0x04, 0x65, 0x9c, 0xf6,
|
||||
0xc7, 0x43, 0xf5, 0x10, 0x02, 0x7b, 0x05, 0xaa, 0x49, 0x92, 0x56, 0x31, 0x79, 0xfb, 0x91, 0x52,
|
||||
0xb3, 0xd2, 0xee, 0xc3, 0x44, 0xc3, 0xa0, 0xd1, 0x29, 0xc6, 0x2f, 0x99, 0xa0, 0x09, 0xca, 0x54,
|
||||
0x63, 0xca, 0x2a, 0x2b, 0x25, 0xad, 0xc6, 0x4c, 0xa9, 0x2b, 0x95, 0x17, 0xab, 0x2b, 0x64, 0x2f,
|
||||
0x7b, 0x8e, 0xba, 0x02, 0x2f, 0xa1, 0xae, 0xbc, 0x84, 0xeb, 0xee, 0x06, 0x54, 0xf0, 0x36, 0x37,
|
||||
0x78, 0xa2, 0xb8, 0xc5, 0x05, 0x4f, 0xfc, 0xd0, 0x10, 0xe8, 0x29, 0x6e, 0xe0, 0x66, 0x72, 0x4c,
|
||||
0x6c, 0xfe, 0xe5, 0xaf, 0xc6, 0x25, 0xf2, 0x05, 0x94, 0x25, 0x54, 0x10, 0xb4, 0xef, 0x0e, 0xd5,
|
||||
0xb3, 0x32, 0xf8, 0xb7, 0x58, 0x36, 0x7c, 0x0b, 0xe3, 0xcb, 0xb1, 0x17, 0xf2, 0xbe, 0x7a, 0xbc,
|
||||
0xc0, 0xc3, 0x33, 0x2a, 0x20, 0x62, 0x82, 0x42, 0xb9, 0xf0, 0x83, 0x0b, 0x5f, 0xa6, 0x2e, 0x97,
|
||||
0xbd, 0xe8, 0x89, 0xf8, 0xb4, 0x18, 0xb4, 0xf0, 0x61, 0xa9, 0x51, 0x10, 0xaa, 0x2b, 0xc7, 0xfa,
|
||||
0x59, 0x0e, 0x5a, 0xf2, 0x74, 0xe9, 0x32, 0x53, 0xb6, 0x2f, 0xcd, 0x72, 0x73, 0x3f, 0xff, 0x29,
|
||||
0x02, 0x0b, 0x1a, 0x68, 0xd2, 0xd0, 0xf7, 0x0f, 0x99, 0x64, 0x6a, 0x02, 0xb8, 0x25, 0xef, 0xa0,
|
||||
0x57, 0xa1, 0xa6, 0x82, 0x2c, 0x87, 0xde, 0x40, 0x3d, 0xf3, 0x4a, 0x51, 0x96, 0x7b, 0xde, 0x40,
|
||||
0x5d, 0x5f, 0xa1, 0x2b, 0xb3, 0xa4, 0x72, 0x78, 0x7d, 0xd9, 0x6e, 0xcc, 0xad, 0xff, 0x92, 0x83,
|
||||
0x05, 0x63, 0x2a, 0xf2, 0xdc, 0x7e, 0x0c, 0x75, 0xfd, 0xa2, 0x1b, 0xd7, 0xf2, 0xd4, 0x4a, 0x9a,
|
||||
0xd1, 0x24, 0xd5, 0x6a, 0x3d, 0x0d, 0x89, 0xc4, 0x60, 0xfa, 0xee, 0x15, 0x8e, 0x37, 0x1a, 0x0f,
|
||||
0x95, 0xca, 0xd2, 0x77, 0xaf, 0xb6, 0x38, 0xef, 0x8e, 0x87, 0x42, 0x21, 0xbd, 0xe0, 0xfc, 0x99,
|
||||
0x46, 0x20, 0x49, 0x0a, 0x04, 0x4c, 0x62, 0x58, 0xd0, 0x18, 0x06, 0x7e, 0x7c, 0xa6, 0x51, 0xa4,
|
||||
0x2c, 0x89, 0x40, 0xc2, 0xb1, 0xfe, 0x67, 0x1e, 0x16, 0xc9, 0x70, 0x26, 0x0d, 0x96, 0x92, 0x75,
|
||||
0xb5, 0x61, 0x8e, 0x6c, 0x88, 0xc4, 0xbc, 0xb6, 0xaf, 0xd9, 0xf2, 0x9b, 0xbd, 0xff, 0x92, 0xc6,
|
||||
0x3e, 0x95, 0x88, 0x35, 0x63, 0xf9, 0x0b, 0xd3, 0xcb, 0x3f, 0x7b, 0x79, 0xb3, 0xfc, 0x68, 0xa5,
|
||||
0x2c, 0x3f, 0xda, 0xcb, 0x78, 0xaf, 0xa6, 0xb2, 0x95, 0xca, 0x12, 0xc7, 0xc8, 0x56, 0xfa, 0x00,
|
||||
0x56, 0x52, 0x38, 0xc8, 0xad, 0xbd, 0x13, 0x8f, 0xab, 0xcc, 0xf0, 0x25, 0x03, 0xbb, 0xab, 0xca,
|
||||
0xd6, 0xca, 0x50, 0x8a, 0x7a, 0xc1, 0x88, 0x5b, 0xcb, 0xb0, 0x94, 0x5e, 0x55, 0x79, 0x4d, 0xfc,
|
||||
0x41, 0x0e, 0xda, 0x32, 0xea, 0xc1, 0xf3, 0x4f, 0xb7, 0xbd, 0x28, 0x0e, 0x42, 0xfd, 0xf2, 0xd9,
|
||||
0x2d, 0x80, 0x28, 0x76, 0x43, 0xa9, 0x43, 0x92, 0x74, 0x5b, 0x45, 0x08, 0xea, 0x87, 0x37, 0xa0,
|
||||
0xc2, 0xfd, 0x3e, 0x15, 0x12, 0x35, 0x94, 0xb9, 0xdf, 0x57, 0xda, 0xe5, 0x94, 0x54, 0xdd, 0x48,
|
||||
0x2b, 0x0d, 0x32, 0x6d, 0x52, 0xac, 0x0e, 0x3f, 0xc7, 0x8b, 0xb7, 0xa8, 0xd3, 0x26, 0xf7, 0xdc,
|
||||
0x4b, 0x8c, 0x21, 0x8c, 0xac, 0x7f, 0x9a, 0x87, 0xf9, 0x64, 0x7c, 0x94, 0x73, 0x9d, 0xe2, 0xdf,
|
||||
0x72, 0x54, 0x09, 0xff, 0xbe, 0x23, 0xc9, 0xc1, 0x13, 0x52, 0xb9, 0x61, 0x4e, 0xac, 0xd0, 0xe1,
|
||||
0xdc, 0xf1, 0x99, 0x05, 0x35, 0x85, 0x11, 0x8c, 0x63, 0xe3, 0x01, 0xa2, 0x2a, 0xa1, 0x1c, 0x8c,
|
||||
0x63, 0xa1, 0x46, 0x09, 0x7d, 0xd2, 0xf3, 0xa5, 0x22, 0x53, 0x72, 0x87, 0xf1, 0x0e, 0xbe, 0x6b,
|
||||
0x2c, 0xc0, 0xa2, 0x1a, 0x6d, 0xa4, 0xc0, 0x12, 0xf8, 0x2d, 0x92, 0x9e, 0x69, 0xe7, 0x50, 0x72,
|
||||
0x36, 0x45, 0x4b, 0x7a, 0xe2, 0x51, 0x8b, 0x96, 0xaf, 0x42, 0x8d, 0x1a, 0x4f, 0x92, 0xd3, 0x8a,
|
||||
0x76, 0x15, 0x7b, 0xc0, 0x72, 0x69, 0xda, 0x09, 0xc6, 0x29, 0x85, 0x16, 0xa8, 0x2b, 0x0c, 0x2a,
|
||||
0xf8, 0x47, 0x39, 0xb8, 0x91, 0xb1, 0x6d, 0xf2, 0x94, 0xaf, 0xc3, 0xc2, 0x89, 0x2e, 0x54, 0xab,
|
||||
0x4b, 0x47, 0x7d, 0x59, 0xb1, 0xd5, 0xf4, 0x9a, 0xda, 0xad, 0x93, 0x34, 0x20, 0x51, 0xa5, 0x68,
|
||||
0x07, 0x53, 0xf9, 0x87, 0xa8, 0x4a, 0xd1, 0x36, 0x92, 0x16, 0x73, 0x08, 0x9d, 0xcd, 0x4b, 0xc1,
|
||||
0x31, 0xd6, 0xcd, 0x87, 0xb9, 0x15, 0x19, 0xa5, 0xcd, 0xc6, 0xb9, 0x97, 0x32, 0x1b, 0xf7, 0x29,
|
||||
0xcd, 0x4a, 0xb7, 0xf5, 0x6d, 0x1a, 0xc1, 0x0b, 0x54, 0xd4, 0xa1, 0x87, 0xc5, 0x55, 0x0e, 0x64,
|
||||
0x4f, 0x3f, 0x28, 0x6e, 0x45, 0x30, 0xbf, 0x37, 0x1e, 0xc4, 0x5e, 0xf2, 0xc6, 0x38, 0x7b, 0x5f,
|
||||
0xd6, 0xc1, 0x7e, 0xd4, 0xaa, 0x65, 0x76, 0x04, 0xba, 0x23, 0x5c, 0xac, 0xa1, 0x68, 0xc8, 0x99,
|
||||
0xee, 0x6f, 0x7e, 0x98, 0xee, 0xc1, 0xba, 0x01, 0x2b, 0xc9, 0x17, 0x2d, 0x9b, 0xba, 0x6a, 0xfe,
|
||||
0x55, 0x8e, 0x02, 0x96, 0xd3, 0xef, 0x9d, 0xb3, 0x4d, 0x58, 0x8c, 0x3c, 0xff, 0x74, 0xc0, 0xcd,
|
||||
0xe6, 0x23, 0xb9, 0x08, 0xd7, 0xd3, 0x63, 0x93, 0x6f, 0xa2, 0xdb, 0x0b, 0x54, 0x23, 0x69, 0x2d,
|
||||
0x62, 0x6b, 0xb3, 0x06, 0x99, 0x90, 0xc5, 0xc4, 0x6a, 0x4c, 0x0f, 0x7e, 0x07, 0x9a, 0xe9, 0x8e,
|
||||
0xd8, 0x87, 0x32, 0xc5, 0x30, 0x19, 0x55, 0x61, 0x22, 0x5b, 0x2c, 0x21, 0x88, 0x5a, 0xb2, 0xf6,
|
||||
0x91, 0xf5, 0x8f, 0x73, 0xd0, 0xb6, 0xb9, 0xa0, 0x5c, 0x63, 0x94, 0x8a, 0x66, 0x3e, 0x9e, 0x6a,
|
||||
0x75, 0xf6, 0x5c, 0x55, 0xe6, 0xa2, 0x1a, 0xd1, 0x3b, 0x33, 0x37, 0x63, 0xfb, 0xda, 0xd4, 0x8c,
|
||||
0xd6, 0x2a, 0x30, 0x47, 0x28, 0xd6, 0x0a, 0x5c, 0x97, 0xe3, 0x51, 0x63, 0x49, 0x7c, 0x82, 0xa9,
|
||||
0x1e, 0x53, 0x3e, 0xc1, 0x0e, 0xb4, 0xe9, 0x01, 0x3b, 0x73, 0x12, 0xb2, 0xe2, 0x06, 0xb0, 0x3d,
|
||||
0xb7, 0xe7, 0x86, 0x41, 0xe0, 0x1f, 0xf2, 0x50, 0x86, 0x7f, 0xa2, 0x84, 0x89, 0x2e, 0x33, 0x25,
|
||||
0x0a, 0xd3, 0x97, 0x7a, 0x76, 0x2d, 0xf0, 0x55, 0xb4, 0x0b, 0x7d, 0x59, 0x36, 0x2c, 0xae, 0xb9,
|
||||
0xcf, 0xb8, 0x6a, 0x49, 0x2d, 0xd1, 0x27, 0x50, 0x1b, 0xe9, 0x46, 0xd5, 0xba, 0xab, 0x3c, 0xe4,
|
||||
0xe9, 0x6e, 0x6d, 0x13, 0xdb, 0x7a, 0x0c, 0x4b, 0xe9, 0x36, 0x25, 0xeb, 0xe8, 0x40, 0x65, 0x28,
|
||||
0x61, 0x72, 0x74, 0xfa, 0xfb, 0xfe, 0xd7, 0x50, 0x33, 0x1e, 0x25, 0x64, 0x2b, 0xb0, 0xf8, 0xf9,
|
||||
0xce, 0xd1, 0xfe, 0x66, 0xb7, 0xeb, 0x1c, 0x3e, 0x5d, 0x7b, 0xb2, 0xf9, 0x85, 0xb3, 0xbd, 0xda,
|
||||
0xdd, 0x6e, 0x5d, 0x63, 0xcb, 0xc0, 0xf6, 0x37, 0xbb, 0x47, 0x9b, 0x1b, 0x29, 0x78, 0x8e, 0xbd,
|
||||
0x0a, 0x9d, 0xa7, 0xfb, 0x4f, 0xbb, 0x9b, 0x1b, 0x4e, 0x56, 0xbd, 0x3c, 0xbb, 0x05, 0x37, 0x64,
|
||||
0x79, 0x46, 0xf5, 0xc2, 0xfd, 0x4f, 0xa0, 0x35, 0x69, 0x55, 0x4c, 0x99, 0x61, 0x9f, 0x67, 0xaf,
|
||||
0xbd, 0xff, 0xef, 0x0a, 0x00, 0x49, 0xd8, 0x27, 0x6b, 0xc3, 0xd2, 0xc6, 0xea, 0xd1, 0xea, 0xee,
|
||||
0x81, 0x18, 0x84, 0x7d, 0x70, 0xb4, 0xb9, 0x7e, 0xe4, 0xd8, 0x9b, 0x9f, 0xb5, 0xae, 0x65, 0x96,
|
||||
0x1c, 0x1c, 0x0a, 0x7d, 0x7c, 0x05, 0x16, 0x77, 0xf6, 0x77, 0x8e, 0x76, 0x56, 0x77, 0x1d, 0xfb,
|
||||
0xe0, 0xe9, 0xce, 0xfe, 0xa7, 0xf4, 0xec, 0x48, 0x81, 0xdd, 0x86, 0x9b, 0x4f, 0x0f, 0xb7, 0xec,
|
||||
0x83, 0xfd, 0x23, 0xa7, 0xbb, 0xfd, 0xf4, 0x68, 0x03, 0x1f, 0x2d, 0x59, 0xb7, 0x77, 0x0e, 0xa9,
|
||||
0xcd, 0xe2, 0xf3, 0x10, 0x44, 0xd3, 0x25, 0xb1, 0x62, 0x9f, 0x1e, 0x74, 0xbb, 0x3b, 0x87, 0xce,
|
||||
0x67, 0x4f, 0x37, 0xed, 0x9d, 0xcd, 0x2e, 0x56, 0x9c, 0xcb, 0x80, 0x0b, 0xfc, 0x32, 0x5b, 0x80,
|
||||
0xc6, 0xd1, 0xee, 0x0f, 0x9d, 0x83, 0xfd, 0x9d, 0x83, 0x7d, 0x44, 0xad, 0xa4, 0x41, 0x02, 0xab,
|
||||
0xca, 0x3a, 0xb0, 0xbc, 0xf9, 0x9b, 0x47, 0x4e, 0x46, 0xcb, 0x30, 0xa3, 0x4c, 0xd4, 0xab, 0xb1,
|
||||
0x1b, 0x70, 0xbd, 0x7b, 0xb4, 0x7a, 0xb4, 0xb3, 0xee, 0xc8, 0x97, 0x8e, 0xc4, 0x26, 0x88, 0x6a,
|
||||
0xf5, 0xec, 0x22, 0x51, 0xab, 0xc1, 0x96, 0xa0, 0x75, 0xb8, 0xfa, 0xc5, 0xde, 0xe6, 0xfe, 0x91,
|
||||
0xb3, 0xba, 0xb1, 0x61, 0x63, 0x85, 0xe6, 0x14, 0x54, 0xe0, 0xce, 0x8b, 0x8d, 0xda, 0x3b, 0x3c,
|
||||
0x44, 0x94, 0x96, 0xfa, 0x10, 0x25, 0x0b, 0x8f, 0x7f, 0xb7, 0x00, 0x4d, 0x0a, 0xc1, 0xa7, 0x5f,
|
||||
0x74, 0xe0, 0x21, 0xdb, 0x83, 0xb2, 0xfc, 0x69, 0x10, 0x76, 0x5d, 0x3f, 0x3e, 0x61, 0xfe, 0x18,
|
||||
0x49, 0x67, 0x79, 0x12, 0x2c, 0x8f, 0xdf, 0xe2, 0xdf, 0xfe, 0xb3, 0xbf, 0xfc, 0x27, 0xf9, 0x06,
|
||||
0xab, 0x3d, 0x3c, 0x7f, 0xef, 0xe1, 0x29, 0xf7, 0x23, 0xd1, 0xc6, 0xdf, 0x00, 0x48, 0x7e, 0xf0,
|
||||
0x82, 0xb5, 0xb5, 0x29, 0x71, 0xe2, 0xd7, 0x40, 0x3a, 0x37, 0x32, 0x4a, 0x64, 0xbb, 0x37, 0xb0,
|
||||
0xdd, 0x45, 0xab, 0x29, 0xda, 0xf5, 0x7c, 0x2f, 0xa6, 0x1f, 0xbf, 0xf8, 0x38, 0x77, 0x9f, 0xf5,
|
||||
0xa1, 0x6e, 0xfe, 0x14, 0x05, 0x53, 0xae, 0xf8, 0x8c, 0x1f, 0xd3, 0xe8, 0xdc, 0xcc, 0x2c, 0x53,
|
||||
0x3c, 0x07, 0xfb, 0xb8, 0x6e, 0xb5, 0x44, 0x1f, 0x63, 0xc4, 0x48, 0x7a, 0x19, 0x10, 0x17, 0x4e,
|
||||
0x7e, 0x71, 0x82, 0xbd, 0x62, 0x70, 0xc6, 0xa9, 0xdf, 0xbb, 0xe8, 0xdc, 0x9a, 0x51, 0x2a, 0xfb,
|
||||
0xba, 0x85, 0x7d, 0xad, 0x58, 0x4c, 0xf4, 0xd5, 0x43, 0x1c, 0xf5, 0x7b, 0x17, 0x1f, 0xe7, 0xee,
|
||||
0x3f, 0xfe, 0x8b, 0x7b, 0x50, 0xd5, 0x21, 0x39, 0xec, 0xb7, 0xa1, 0x91, 0xca, 0x91, 0x60, 0x6a,
|
||||
0x1a, 0x59, 0x29, 0x15, 0x9d, 0x57, 0xb2, 0x0b, 0x65, 0xc7, 0xaf, 0x62, 0xc7, 0x6d, 0xb6, 0x2c,
|
||||
0x3a, 0x96, 0x39, 0x08, 0x0f, 0x31, 0x93, 0x88, 0x9e, 0xf2, 0x78, 0x66, 0xdc, 0x36, 0xd4, 0xd9,
|
||||
0x2b, 0x93, 0x37, 0x40, 0xaa, 0xb7, 0x5b, 0x33, 0x4a, 0x65, 0x77, 0xaf, 0x60, 0x77, 0xcb, 0x6c,
|
||||
0xc9, 0xec, 0x4e, 0x05, 0xd0, 0x30, 0x8e, 0xcf, 0xe7, 0x98, 0x3f, 0xc8, 0xc0, 0x6e, 0x25, 0x8f,
|
||||
0x9d, 0x64, 0xfc, 0x50, 0x83, 0x26, 0x91, 0xe9, 0x5f, 0x6b, 0xb0, 0xda, 0xd8, 0x15, 0x63, 0xb8,
|
||||
0x7d, 0xe6, 0xef, 0x31, 0xb0, 0x63, 0xa8, 0x19, 0x6f, 0x18, 0xb3, 0x1b, 0x33, 0xdf, 0x5b, 0xee,
|
||||
0x74, 0xb2, 0x8a, 0xb2, 0xa6, 0x62, 0xb6, 0xff, 0x50, 0xc8, 0x9e, 0x3f, 0x86, 0xaa, 0x7e, 0x19,
|
||||
0x97, 0xad, 0x18, 0x2f, 0x15, 0x9b, 0x2f, 0xf9, 0x76, 0xda, 0xd3, 0x05, 0x59, 0xc4, 0x67, 0xb6,
|
||||
0x2e, 0x88, 0xef, 0x73, 0xa8, 0x19, 0xaf, 0xdf, 0xea, 0x09, 0x4c, 0xbf, 0xb0, 0xab, 0x27, 0x90,
|
||||
0xf1, 0x58, 0xae, 0xb5, 0x80, 0x5d, 0xd4, 0x58, 0x15, 0xe9, 0x3b, 0xbe, 0x0c, 0x22, 0xb6, 0x0b,
|
||||
0xd7, 0xe5, 0xcd, 0x7a, 0xcc, 0xbf, 0xc9, 0x36, 0x64, 0xfc, 0x06, 0xc6, 0xa3, 0x1c, 0xfb, 0x04,
|
||||
0x2a, 0xea, 0x91, 0x63, 0xb6, 0x9c, 0xfd, 0x58, 0x73, 0x67, 0x65, 0x0a, 0x2e, 0xaf, 0xc1, 0x2f,
|
||||
0x00, 0x92, 0xa7, 0x76, 0x35, 0x93, 0x98, 0x7a, 0xba, 0x57, 0x53, 0xc0, 0xf4, 0xbb, 0xbc, 0xd6,
|
||||
0x32, 0x4e, 0xb0, 0xc5, 0x90, 0x49, 0xf8, 0xfc, 0x42, 0xbd, 0x23, 0xf6, 0x13, 0xa8, 0x19, 0xaf,
|
||||
0xed, 0xea, 0xe5, 0x9b, 0x7e, 0xa9, 0x57, 0x2f, 0x5f, 0xc6, 0xe3, 0xbc, 0x56, 0x07, 0x5b, 0x5f,
|
||||
0xb2, 0xe6, 0x45, 0xeb, 0x91, 0x77, 0xea, 0x0f, 0x09, 0x41, 0x6c, 0xd0, 0x19, 0x34, 0x52, 0x4f,
|
||||
0xea, 0xea, 0x13, 0x9a, 0xf5, 0x60, 0xaf, 0x3e, 0xa1, 0x99, 0xaf, 0xf0, 0x2a, 0x3a, 0xb3, 0x16,
|
||||
0x44, 0x3f, 0xe7, 0x88, 0x62, 0xf4, 0xf4, 0x23, 0xa8, 0x19, 0xcf, 0xe3, 0xea, 0xb9, 0x4c, 0xbf,
|
||||
0xc4, 0xab, 0xe7, 0x92, 0xf5, 0x9a, 0xee, 0x12, 0xf6, 0xd1, 0xb4, 0x90, 0x14, 0xf0, 0x95, 0x26,
|
||||
0xd1, 0xf6, 0x6f, 0x43, 0x33, 0xfd, 0x62, 0xae, 0x3e, 0xfb, 0x99, 0x4f, 0xef, 0xea, 0xb3, 0x3f,
|
||||
0xe3, 0x99, 0x5d, 0x49, 0xd2, 0xf7, 0x17, 0x75, 0x27, 0x0f, 0xbf, 0x92, 0xc1, 0xc5, 0x5f, 0xb3,
|
||||
0xcf, 0x04, 0x83, 0x93, 0x8f, 0x84, 0xb1, 0x15, 0x83, 0x6a, 0xcd, 0xa7, 0xc4, 0xf4, 0x79, 0x99,
|
||||
0x7a, 0x4f, 0x2c, 0x4d, 0xcc, 0xd8, 0x38, 0xfb, 0x14, 0x16, 0x35, 0x31, 0xeb, 0x57, 0xbf, 0x22,
|
||||
0x3d, 0x87, 0xcc, 0xb7, 0xc5, 0x3a, 0xad, 0xc9, 0xd2, 0x47, 0x39, 0xba, 0xfe, 0xf0, 0xad, 0x25,
|
||||
0xe3, 0xfa, 0x33, 0x1f, 0xfe, 0x32, 0xae, 0xbf, 0xd4, 0x93, 0x4c, 0x93, 0xd7, 0x5f, 0xec, 0x89,
|
||||
0x36, 0x7c, 0x98, 0x9f, 0x7c, 0x83, 0xeb, 0xd6, 0xac, 0x0c, 0x54, 0x6a, 0xfe, 0xd5, 0xe7, 0x27,
|
||||
0xa8, 0xa6, 0x59, 0x91, 0xe2, 0xa6, 0x0f, 0xa5, 0x0b, 0x91, 0xfd, 0x16, 0xd4, 0xcd, 0x27, 0x3f,
|
||||
0x99, 0xc9, 0x13, 0x26, 0x7b, 0xba, 0x99, 0x59, 0x96, 0xa6, 0x12, 0x56, 0x37, 0xbb, 0x61, 0x3f,
|
||||
0x84, 0x65, 0xbd, 0xcc, 0x66, 0xf6, 0x61, 0xc4, 0x6e, 0x67, 0xe4, 0x24, 0xa6, 0x16, 0xfb, 0xc6,
|
||||
0xcc, 0xa4, 0xc5, 0x47, 0x39, 0x41, 0x7d, 0xe9, 0xb7, 0x07, 0x93, 0x9b, 0x27, 0xeb, 0xc9, 0xc5,
|
||||
0xe4, 0xe6, 0xc9, 0x7c, 0xb0, 0x50, 0x51, 0x1f, 0x5b, 0x4c, 0xad, 0x11, 0x05, 0x57, 0xb1, 0x1f,
|
||||
0xc1, 0xbc, 0x91, 0x5a, 0xd9, 0xbd, 0xf2, 0x7b, 0xfa, 0x24, 0x4d, 0x3f, 0xec, 0xd3, 0xc9, 0xd2,
|
||||
0x45, 0xad, 0x15, 0x6c, 0x7f, 0xc1, 0x4a, 0x2d, 0x8e, 0x38, 0x45, 0xeb, 0x50, 0x33, 0xd3, 0x36,
|
||||
0x9f, 0xd3, 0xee, 0x8a, 0x51, 0x64, 0xbe, 0x21, 0xf3, 0x28, 0xc7, 0x76, 0xa1, 0x35, 0xf9, 0xe4,
|
||||
0x85, 0xe6, 0x29, 0x59, 0xcf, 0x74, 0x74, 0x26, 0x0a, 0x53, 0x0f, 0x65, 0xb0, 0x43, 0x0a, 0xcf,
|
||||
0xd5, 0x3f, 0x18, 0x11, 0x84, 0x93, 0xb7, 0x7a, 0xfa, 0x87, 0x24, 0x74, 0x6b, 0x59, 0x3f, 0x21,
|
||||
0x72, 0x2f, 0xf7, 0x28, 0xc7, 0x7e, 0x3f, 0x07, 0xf5, 0x54, 0x9a, 0x79, 0x2a, 0x00, 0x72, 0x62,
|
||||
0x9e, 0x6d, 0xb3, 0xcc, 0x9c, 0xa8, 0x65, 0xe3, 0x22, 0xee, 0xde, 0xff, 0x41, 0x6a, 0x93, 0xbe,
|
||||
0x4a, 0x99, 0x72, 0x1f, 0x4c, 0xfe, 0xa2, 0xc4, 0xd7, 0x93, 0x08, 0xe6, 0x7b, 0x4d, 0x5f, 0x3f,
|
||||
0xca, 0xb1, 0xff, 0x90, 0x83, 0x66, 0xda, 0x47, 0xa3, 0xa7, 0x9b, 0xe9, 0x0d, 0xd2, 0xa4, 0x34,
|
||||
0xc3, 0xb1, 0xf3, 0x23, 0x1c, 0xe5, 0xd1, 0x7d, 0x3b, 0x35, 0x4a, 0xf9, 0x6a, 0xe6, 0x2f, 0x36,
|
||||
0x5a, 0xf6, 0x31, 0xfd, 0x80, 0x93, 0x72, 0x48, 0xb3, 0xe9, 0x1f, 0xfc, 0xd1, 0xe4, 0x67, 0xfe,
|
||||
0x3c, 0x0e, 0x6e, 0xc2, 0x4f, 0xe8, 0x97, 0x13, 0x94, 0x7f, 0x53, 0x50, 0xf1, 0xcb, 0xd6, 0xb7,
|
||||
0xde, 0xc0, 0x39, 0xbd, 0x6a, 0xdd, 0x48, 0xcd, 0x69, 0x52, 0xf0, 0x58, 0xa5, 0xd1, 0xc9, 0x5f,
|
||||
0xb7, 0x49, 0x6e, 0xce, 0xa9, 0x5f, 0xbc, 0x99, 0x3d, 0xc8, 0x21, 0x0d, 0x52, 0xa2, 0xa7, 0x8e,
|
||||
0xda, 0x4b, 0x36, 0x63, 0xdd, 0xc7, 0xb1, 0xbe, 0x61, 0xdd, 0x9e, 0x39, 0xd6, 0x87, 0xe8, 0x6f,
|
||||
0x11, 0x23, 0x3e, 0x04, 0x48, 0x02, 0x46, 0xd8, 0x44, 0xd8, 0x82, 0x66, 0x40, 0xd3, 0x31, 0x25,
|
||||
0xe9, 0xf3, 0xac, 0xa2, 0x1b, 0x44, 0x8b, 0x3f, 0x26, 0x76, 0xaa, 0x03, 0x2a, 0x4c, 0xe9, 0x2b,
|
||||
0x1d, 0xdb, 0x91, 0x92, 0xbe, 0x26, 0xdb, 0x4f, 0x31, 0x53, 0x1d, 0x3d, 0xf1, 0x14, 0x1a, 0xbb,
|
||||
0x41, 0xf0, 0x6c, 0x3c, 0xd2, 0x41, 0x8a, 0x69, 0x27, 0xe8, 0xb6, 0x1b, 0x9d, 0x75, 0x26, 0x66,
|
||||
0x61, 0xdd, 0xc1, 0xa6, 0x3a, 0xac, 0x6d, 0x34, 0xf5, 0xf0, 0xab, 0x24, 0x4a, 0xe5, 0x6b, 0xe6,
|
||||
0xc2, 0x82, 0xe6, 0xd1, 0x49, 0x24, 0x48, 0xba, 0x99, 0x14, 0x67, 0x9e, 0xec, 0x22, 0xa5, 0x26,
|
||||
0xa8, 0xd1, 0x3e, 0x8c, 0x54, 0x9b, 0x8f, 0x72, 0xec, 0x10, 0xea, 0x1b, 0xbc, 0x87, 0xe9, 0x96,
|
||||
0xe8, 0x4a, 0x5c, 0x4c, 0xb9, 0xa5, 0xc8, 0x07, 0xd9, 0x69, 0xa4, 0x80, 0xe9, 0x7b, 0x6b, 0xe4,
|
||||
0x5e, 0x85, 0xfc, 0xcb, 0x87, 0x5f, 0x49, 0x27, 0xe5, 0xd7, 0xea, 0xde, 0x52, 0x4e, 0xdc, 0xd4,
|
||||
0xbd, 0x35, 0xe1, 0xf5, 0x4d, 0xdd, 0x5b, 0x53, 0x5e, 0xdf, 0xd4, 0x52, 0x2b, 0x27, 0x32, 0x1b,
|
||||
0xc0, 0xc2, 0x94, 0xa3, 0x58, 0x5f, 0x59, 0xb3, 0xdc, 0xcb, 0x9d, 0x3b, 0xb3, 0x11, 0xd2, 0xbd,
|
||||
0xdd, 0x4f, 0xf7, 0xd6, 0x85, 0x06, 0x3d, 0x21, 0x75, 0xcc, 0x29, 0xf1, 0x62, 0xe2, 0xd5, 0x02,
|
||||
0x33, 0xab, 0x63, 0xf2, 0x82, 0xc1, 0xb2, 0xb4, 0x84, 0x83, 0x19, 0x0f, 0xec, 0xc7, 0x50, 0xfb,
|
||||
0x94, 0xc7, 0x2a, 0xd3, 0x42, 0xcb, 0xd8, 0x13, 0xa9, 0x17, 0x9d, 0x8c, 0x44, 0x8d, 0x34, 0xcd,
|
||||
0x60, 0x6b, 0x0f, 0x79, 0xff, 0x94, 0x13, 0x73, 0x72, 0xbc, 0xfe, 0xd7, 0xec, 0x37, 0xb1, 0x71,
|
||||
0x9d, 0xe0, 0xb6, 0x6c, 0x84, 0xd2, 0x9b, 0x8d, 0xcf, 0x4f, 0xc0, 0xb3, 0x5a, 0xf6, 0x83, 0x3e,
|
||||
0x37, 0x64, 0x3d, 0x1f, 0x6a, 0x46, 0x22, 0xac, 0x3e, 0x40, 0xd3, 0x89, 0xcf, 0xfa, 0x00, 0x65,
|
||||
0xe4, 0xcd, 0x5a, 0xf7, 0xb0, 0x1f, 0x8b, 0xdd, 0x49, 0xfa, 0xa1, 0x5c, 0xd9, 0xa4, 0xa7, 0x87,
|
||||
0x5f, 0xb9, 0xc3, 0xf8, 0x6b, 0xf6, 0x39, 0x3e, 0xd4, 0x6a, 0x66, 0x92, 0x24, 0x4a, 0xc3, 0x64,
|
||||
0xd2, 0x89, 0x5e, 0x2c, 0xa3, 0x28, 0xad, 0x48, 0x50, 0x57, 0x28, 0xc9, 0x7d, 0x00, 0xd0, 0x8d,
|
||||
0x83, 0xd1, 0x86, 0xcb, 0x87, 0x81, 0x9f, 0xf0, 0xda, 0x24, 0xb7, 0x21, 0xe1, 0x5f, 0x46, 0x82,
|
||||
0x03, 0xfb, 0xdc, 0xd0, 0xb2, 0x52, 0xc9, 0x38, 0x8a, 0xb8, 0x66, 0xa6, 0x3f, 0xe8, 0x05, 0xc9,
|
||||
0x48, 0x81, 0x78, 0x94, 0x63, 0xab, 0x00, 0x49, 0xa4, 0x80, 0xd6, 0x99, 0xa6, 0x82, 0x10, 0x34,
|
||||
0xdb, 0xcb, 0x08, 0x2b, 0x38, 0x84, 0x6a, 0xe2, 0x62, 0x5d, 0x49, 0xf2, 0xfa, 0x53, 0x0e, 0x59,
|
||||
0x7d, 0x83, 0x4f, 0xb9, 0x37, 0xad, 0x16, 0x2e, 0x15, 0xb0, 0x8a, 0x58, 0xaa, 0x13, 0xce, 0x23,
|
||||
0xe6, 0xc1, 0x22, 0x0d, 0x50, 0x8b, 0x4b, 0x18, 0x93, 0xaf, 0xdf, 0xe3, 0x9d, 0xf6, 0x34, 0xea,
|
||||
0xd3, 0x9c, 0xe9, 0x2f, 0x4b, 0x99, 0x7e, 0x04, 0xb5, 0x52, 0x3e, 0x80, 0x60, 0xcd, 0x43, 0x58,
|
||||
0x98, 0x72, 0xc9, 0xe8, 0x23, 0x3d, 0xcb, 0xc7, 0xa6, 0x8f, 0xf4, 0x4c, 0x6f, 0x8e, 0x75, 0x1d,
|
||||
0xbb, 0x9c, 0xb7, 0x00, 0x55, 0xbd, 0x0b, 0x2f, 0xee, 0x9d, 0x89, 0xee, 0xfe, 0x6d, 0x0e, 0x16,
|
||||
0x33, 0x9c, 0x2e, 0xec, 0x35, 0x65, 0x35, 0x98, 0xe9, 0x90, 0xe9, 0x64, 0x1a, 0xe7, 0xad, 0x2e,
|
||||
0xf6, 0xb3, 0xc7, 0x9e, 0xa4, 0x2e, 0x36, 0xb2, 0x8d, 0xcb, 0x93, 0xf9, 0x5c, 0xa1, 0x22, 0x53,
|
||||
0xa2, 0xf8, 0x12, 0x56, 0x68, 0x20, 0xab, 0x83, 0xc1, 0x84, 0xe3, 0xe0, 0xd5, 0xa9, 0x1f, 0x78,
|
||||
0x4d, 0x39, 0x43, 0x3a, 0xb3, 0x7f, 0x00, 0x76, 0x86, 0x38, 0x4d, 0x43, 0x65, 0x63, 0x68, 0x4d,
|
||||
0x1a, 0xe4, 0xd9, 0xec, 0xb6, 0x3a, 0xb7, 0x53, 0xfa, 0x6f, 0x86, 0x11, 0xff, 0x3b, 0xd8, 0xd9,
|
||||
0x6d, 0xab, 0x93, 0xb5, 0x2e, 0xa4, 0x12, 0x8b, 0xfd, 0xf8, 0x5b, 0xda, 0x7b, 0x30, 0x31, 0x4f,
|
||||
0xd5, 0xc1, 0x2c, 0x5f, 0x87, 0xd6, 0xc0, 0xb3, 0x9d, 0x0f, 0x6f, 0x62, 0xf7, 0x77, 0xac, 0x9b,
|
||||
0x59, 0xdd, 0x87, 0x54, 0x85, 0x74, 0xf1, 0x95, 0xc9, 0x73, 0xad, 0x46, 0x70, 0x27, 0x6b, 0xbf,
|
||||
0x67, 0xea, 0x42, 0x13, 0x6b, 0x7d, 0x0d, 0x65, 0xbb, 0xba, 0xe9, 0x2d, 0xd0, 0xc7, 0x27, 0xc3,
|
||||
0x2d, 0xa1, 0x8f, 0x4f, 0x96, 0x7b, 0x21, 0x2d, 0xd7, 0x28, 0xc7, 0xc2, 0xc7, 0xb9, 0xfb, 0x6b,
|
||||
0x77, 0x7f, 0xf4, 0x9d, 0x53, 0x2f, 0x3e, 0x1b, 0x1f, 0x3f, 0xe8, 0x05, 0xc3, 0x87, 0x03, 0x65,
|
||||
0x6d, 0x94, 0x89, 0x6b, 0x0f, 0x07, 0x7e, 0xff, 0x21, 0x36, 0x7b, 0x3c, 0x87, 0xbf, 0x48, 0xfd,
|
||||
0xdd, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xa1, 0xab, 0x8e, 0xc3, 0x7a, 0x00, 0x00,
|
||||
// 11110 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x8f, 0x1c, 0x47,
|
||||
0x96, 0x18, 0xcc, 0xba, 0x75, 0x55, 0x9d, 0xba, 0x74, 0x75, 0xf4, 0xad, 0xd8, 0x24, 0x45, 0x2a,
|
||||
0xa5, 0x11, 0x29, 0x4a, 0x22, 0x29, 0x8e, 0x6e, 0x2b, 0x7d, 0xdf, 0xec, 0x56, 0x77, 0x57, 0xb3,
|
||||
0x6b, 0xd8, 0x37, 0x65, 0x55, 0x4b, 0xab, 0x19, 0xaf, 0x73, 0xb2, 0xab, 0xa2, 0xbb, 0x73, 0x59,
|
||||
0x95, 0x59, 0xca, 0xcc, 0xea, 0xcb, 0x08, 0xf2, 0x83, 0x2f, 0x0b, 0xc3, 0x36, 0x0c, 0x2c, 0xec,
|
||||
0x31, 0xe0, 0xb1, 0x17, 0x36, 0x6c, 0x18, 0x86, 0x61, 0x63, 0xb1, 0xc6, 0xac, 0x01, 0x3f, 0xf8,
|
||||
0x7d, 0x5f, 0x6c, 0xec, 0xc3, 0xae, 0x5f, 0x8c, 0xc1, 0x02, 0x0b, 0xaf, 0xc7, 0xaf, 0xfe, 0x09,
|
||||
0x46, 0x9c, 0x13, 0x91, 0x19, 0x59, 0x95, 0x4d, 0x52, 0x9a, 0xf1, 0xbc, 0x90, 0x9d, 0xe7, 0x9c,
|
||||
0xb8, 0x9f, 0x38, 0x71, 0x6e, 0x11, 0x05, 0x65, 0x7f, 0xdc, 0x7f, 0x30, 0xf6, 0xbd, 0xd0, 0x63,
|
||||
0x85, 0xa1, 0xeb, 0x8f, 0xfb, 0x6b, 0x37, 0x4f, 0x3c, 0xef, 0x64, 0xc8, 0x1f, 0xda, 0x63, 0xe7,
|
||||
0xa1, 0xed, 0xba, 0x5e, 0x68, 0x87, 0x8e, 0xe7, 0x06, 0x44, 0x64, 0xfc, 0x08, 0xea, 0x4f, 0xb8,
|
||||
0xdb, 0xe5, 0x7c, 0x60, 0xf2, 0x2f, 0x27, 0x3c, 0x08, 0xd9, 0x5b, 0xb0, 0x60, 0xf3, 0x1f, 0x73,
|
||||
0x3e, 0xb0, 0xc6, 0x76, 0x10, 0x8c, 0x4f, 0x7d, 0x3b, 0xe0, 0xcd, 0xcc, 0x9d, 0xcc, 0xbd, 0xaa,
|
||||
0xd9, 0x20, 0xc4, 0x41, 0x04, 0x67, 0xaf, 0x42, 0x35, 0x10, 0xa4, 0xdc, 0x0d, 0x7d, 0x6f, 0x7c,
|
||||
0xd9, 0xcc, 0x22, 0x5d, 0x45, 0xc0, 0xda, 0x04, 0x32, 0x86, 0x30, 0x1f, 0xb5, 0x10, 0x8c, 0x3d,
|
||||
0x37, 0xe0, 0xec, 0x11, 0x2c, 0xf5, 0x9d, 0xf1, 0x29, 0xf7, 0x2d, 0x2c, 0x3c, 0x72, 0xf9, 0xc8,
|
||||
0x73, 0x9d, 0x7e, 0x33, 0x73, 0x27, 0x77, 0xaf, 0x6c, 0x32, 0xc2, 0x89, 0x12, 0xbb, 0x12, 0xc3,
|
||||
0xee, 0xc2, 0x3c, 0x77, 0x09, 0xce, 0x07, 0x58, 0x4a, 0x36, 0x55, 0x8f, 0xc1, 0xa2, 0x80, 0xf1,
|
||||
0x77, 0xb3, 0xb0, 0xd0, 0x71, 0x9d, 0xf0, 0x73, 0x7b, 0x38, 0xe4, 0xa1, 0x1a, 0xd3, 0x5d, 0x98,
|
||||
0x3f, 0x47, 0x00, 0x8e, 0xe9, 0xdc, 0xf3, 0x07, 0x72, 0x44, 0x75, 0x02, 0x1f, 0x48, 0xe8, 0x95,
|
||||
0x3d, 0xcb, 0x5e, 0xd9, 0xb3, 0xd4, 0xe9, 0xca, 0x5d, 0x31, 0x5d, 0x77, 0x61, 0xde, 0xe7, 0x7d,
|
||||
0xef, 0x8c, 0xfb, 0x97, 0xd6, 0xb9, 0xe3, 0x0e, 0xbc, 0xf3, 0x66, 0xfe, 0x4e, 0xe6, 0x5e, 0xc1,
|
||||
0xac, 0x2b, 0xf0, 0xe7, 0x08, 0x65, 0xeb, 0x30, 0xdf, 0x3f, 0xb5, 0x5d, 0x97, 0x0f, 0xad, 0x23,
|
||||
0xbb, 0xff, 0x6c, 0x32, 0x0e, 0x9a, 0x85, 0x3b, 0x99, 0x7b, 0x95, 0xc7, 0xd7, 0x1f, 0xe0, 0xaa,
|
||||
0x3e, 0xd8, 0x38, 0xb5, 0xdd, 0x75, 0xc4, 0x74, 0x5d, 0x7b, 0x1c, 0x9c, 0x7a, 0xa1, 0x59, 0x97,
|
||||
0x25, 0x08, 0x1c, 0x18, 0x4b, 0xc0, 0xf4, 0x99, 0xa0, 0xb9, 0x37, 0xfe, 0x7d, 0x06, 0x16, 0x0f,
|
||||
0xdd, 0xa1, 0xd7, 0x7f, 0xf6, 0x2d, 0xa7, 0x28, 0x65, 0x0c, 0xd9, 0x97, 0x1d, 0x43, 0xee, 0x9b,
|
||||
0x8e, 0x61, 0x05, 0x96, 0x92, 0x9d, 0x95, 0xa3, 0xe0, 0xb0, 0x2c, 0x4a, 0x9f, 0x70, 0xd5, 0x2d,
|
||||
0x35, 0x8c, 0x37, 0xa1, 0xd1, 0x9f, 0xf8, 0x3e, 0x77, 0x67, 0xc6, 0x31, 0x2f, 0xe1, 0xd1, 0x40,
|
||||
0x5e, 0x85, 0xaa, 0xcb, 0xcf, 0x63, 0x32, 0xc9, 0xbb, 0x2e, 0x3f, 0x57, 0x24, 0x46, 0x13, 0x56,
|
||||
0xa6, 0x9b, 0x91, 0x1d, 0xf8, 0x45, 0x06, 0xf2, 0x87, 0xe1, 0x85, 0xc7, 0xde, 0x87, 0xaa, 0x3d,
|
||||
0x18, 0xf8, 0x3c, 0x08, 0xac, 0xf0, 0x72, 0x4c, 0x3b, 0xa5, 0xfe, 0x98, 0xc9, 0x21, 0xb6, 0x08,
|
||||
0xd5, 0xbb, 0x1c, 0x73, 0xb3, 0x62, 0xc7, 0x1f, 0xac, 0x09, 0x45, 0xf9, 0x89, 0xed, 0x96, 0x4d,
|
||||
0xf5, 0xc9, 0x6e, 0x01, 0xd8, 0x23, 0x6f, 0xe2, 0x86, 0x56, 0x60, 0x87, 0x38, 0x63, 0x39, 0xb3,
|
||||
0x4c, 0x90, 0xae, 0x1d, 0xb2, 0x1b, 0x50, 0x1e, 0x3f, 0xb3, 0x82, 0xbe, 0xef, 0x8c, 0x43, 0x64,
|
||||
0x9e, 0xb2, 0x59, 0x1a, 0x3f, 0xeb, 0xe2, 0x37, 0x7b, 0x0b, 0x4a, 0xde, 0x24, 0x1c, 0x7b, 0x8e,
|
||||
0x1b, 0x4a, 0x7e, 0x99, 0x97, 0x1d, 0xd9, 0x9f, 0x84, 0x07, 0x02, 0x6c, 0x46, 0x04, 0xec, 0x75,
|
||||
0xa8, 0xf5, 0x3d, 0xf7, 0xd8, 0xf1, 0x47, 0x24, 0x11, 0x9a, 0x73, 0xd8, 0x56, 0x12, 0x68, 0xfc,
|
||||
0x51, 0x16, 0x2a, 0x3d, 0xdf, 0x76, 0x03, 0xbb, 0x2f, 0x00, 0x6c, 0x15, 0x8a, 0xe1, 0x85, 0x75,
|
||||
0x6a, 0x07, 0xa7, 0x38, 0xd4, 0xb2, 0x39, 0x17, 0x5e, 0x6c, 0xdb, 0xc1, 0x29, 0x5b, 0x81, 0x39,
|
||||
0xea, 0x25, 0x0e, 0x28, 0x67, 0xca, 0x2f, 0xb1, 0x41, 0xdc, 0xc9, 0xc8, 0x4a, 0x36, 0x95, 0x43,
|
||||
0x8e, 0x69, 0xb8, 0x93, 0xd1, 0x86, 0x0e, 0x17, 0x83, 0x3f, 0x12, 0xcb, 0x4d, 0x0d, 0xd0, 0xf0,
|
||||
0xca, 0x08, 0xc1, 0x36, 0x5e, 0x85, 0xaa, 0x44, 0x73, 0xe7, 0xe4, 0x94, 0xc6, 0x58, 0x30, 0x2b,
|
||||
0x44, 0x80, 0x20, 0x51, 0x43, 0xe8, 0x8c, 0xb8, 0x15, 0x84, 0xf6, 0x68, 0x2c, 0x87, 0x54, 0x16,
|
||||
0x90, 0xae, 0x00, 0x20, 0xda, 0x0b, 0xed, 0xa1, 0x75, 0xcc, 0x79, 0xd0, 0x2c, 0x4a, 0xb4, 0x80,
|
||||
0x6c, 0x71, 0x1e, 0xb0, 0xef, 0x40, 0x7d, 0xc0, 0x83, 0xd0, 0x92, 0x8b, 0xc1, 0x83, 0x66, 0x09,
|
||||
0x77, 0x7e, 0x4d, 0x40, 0x5b, 0x0a, 0xc8, 0x6e, 0x02, 0xf8, 0xf6, 0xb9, 0x25, 0x26, 0x82, 0x5f,
|
||||
0x34, 0xcb, 0xb4, 0x0a, 0xbe, 0x7d, 0xde, 0xbb, 0xd8, 0xe6, 0x17, 0x82, 0x6b, 0x9e, 0xf0, 0x50,
|
||||
0x9b, 0xb4, 0x40, 0x72, 0xa7, 0xb1, 0x03, 0x4c, 0x03, 0x6f, 0xf2, 0xd0, 0x76, 0x86, 0x01, 0xfb,
|
||||
0x00, 0xaa, 0xa1, 0x46, 0x8c, 0x62, 0xb0, 0x12, 0xb1, 0x90, 0x56, 0xc0, 0x4c, 0xd0, 0x19, 0xa7,
|
||||
0x50, 0xda, 0xe2, 0x7c, 0xc7, 0x19, 0x39, 0x21, 0x5b, 0x81, 0xc2, 0xb1, 0x73, 0xc1, 0x89, 0xd9,
|
||||
0x73, 0xdb, 0xd7, 0x4c, 0xfa, 0x64, 0xb7, 0x01, 0xf0, 0x0f, 0x6b, 0x14, 0x71, 0xd3, 0xf6, 0x35,
|
||||
0xb3, 0x8c, 0xb0, 0xdd, 0xc0, 0x0e, 0xd9, 0x1a, 0x14, 0xc7, 0xdc, 0xef, 0x73, 0xb5, 0x6e, 0xdb,
|
||||
0xd7, 0x4c, 0x05, 0x58, 0x2f, 0x42, 0x61, 0x28, 0x6a, 0x37, 0xfe, 0xa4, 0x00, 0x95, 0x2e, 0x77,
|
||||
0xa3, 0x5d, 0xc6, 0x20, 0x2f, 0x26, 0x44, 0xee, 0x2c, 0xfc, 0x9b, 0xbd, 0x06, 0x15, 0x9c, 0xba,
|
||||
0x20, 0xf4, 0x1d, 0xf7, 0x84, 0xb8, 0x7a, 0x3d, 0xdb, 0xcc, 0x98, 0x20, 0xc0, 0x5d, 0x84, 0xb2,
|
||||
0x06, 0xe4, 0xec, 0x91, 0xe2, 0x6a, 0xf1, 0x27, 0xbb, 0x0e, 0x25, 0x7b, 0x14, 0x52, 0xf7, 0xaa,
|
||||
0x08, 0x2e, 0xda, 0xa3, 0x10, 0xbb, 0xf6, 0x2a, 0x54, 0xc7, 0xf6, 0xe5, 0x48, 0xec, 0xe5, 0x88,
|
||||
0x1d, 0xaa, 0x66, 0x45, 0xc2, 0x90, 0x21, 0x1e, 0xc3, 0xa2, 0x4e, 0xa2, 0x1a, 0x2f, 0x44, 0x8d,
|
||||
0x2f, 0x68, 0xd4, 0xb2, 0x0f, 0x77, 0x61, 0x5e, 0x95, 0xf1, 0x69, 0x3c, 0xc8, 0x26, 0x65, 0xb3,
|
||||
0x2e, 0xc1, 0x6a, 0x94, 0xf7, 0xa0, 0x71, 0xec, 0xb8, 0xf6, 0xd0, 0xea, 0x0f, 0xc3, 0x33, 0x6b,
|
||||
0xc0, 0x87, 0xa1, 0x8d, 0x1c, 0x53, 0x30, 0xeb, 0x08, 0xdf, 0x18, 0x86, 0x67, 0x9b, 0x02, 0xca,
|
||||
0xde, 0x86, 0xf2, 0x31, 0xe7, 0x16, 0x4e, 0x56, 0xb3, 0x94, 0xd8, 0x78, 0x6a, 0x85, 0xcc, 0xd2,
|
||||
0xb1, 0x5a, 0xab, 0xb7, 0xa1, 0xe1, 0x4d, 0xc2, 0x13, 0xcf, 0x71, 0x4f, 0x2c, 0x21, 0xef, 0x2c,
|
||||
0x67, 0x80, 0x3c, 0x94, 0x5f, 0xcf, 0x3e, 0xca, 0x98, 0x75, 0x85, 0x13, 0x92, 0xa7, 0x33, 0x60,
|
||||
0x6f, 0xc0, 0xfc, 0xd0, 0x0e, 0x42, 0xeb, 0xd4, 0x1b, 0x5b, 0xe3, 0xc9, 0xd1, 0x33, 0x7e, 0xd9,
|
||||
0xac, 0xe1, 0x44, 0xd4, 0x04, 0x78, 0xdb, 0x1b, 0x1f, 0x20, 0x50, 0x70, 0x36, 0xf6, 0x93, 0x3a,
|
||||
0x01, 0x77, 0x32, 0xf7, 0x6a, 0x66, 0x59, 0x40, 0xa8, 0xd1, 0x2f, 0x60, 0x11, 0x97, 0xa7, 0x3f,
|
||||
0x09, 0x42, 0x6f, 0x64, 0x09, 0x59, 0xed, 0x0f, 0x82, 0x66, 0x05, 0x79, 0xed, 0x4d, 0xd9, 0x59,
|
||||
0x6d, 0x8d, 0x1f, 0x6c, 0xf2, 0x20, 0xdc, 0x40, 0x62, 0x93, 0x68, 0xc5, 0x81, 0x7e, 0x69, 0x2e,
|
||||
0x0c, 0xa6, 0xe1, 0xec, 0x6d, 0x60, 0xf6, 0x70, 0xe8, 0x9d, 0x5b, 0x01, 0x1f, 0x1e, 0x5b, 0x72,
|
||||
0x12, 0x9b, 0xf5, 0x3b, 0x99, 0x7b, 0x25, 0xb3, 0x81, 0x98, 0x2e, 0x1f, 0x1e, 0x1f, 0x10, 0x9c,
|
||||
0x7d, 0x00, 0xb8, 0x99, 0xac, 0x63, 0x6e, 0x87, 0x13, 0x9f, 0x07, 0xcd, 0xf9, 0x3b, 0xb9, 0x7b,
|
||||
0xf5, 0xc7, 0x0b, 0xd1, 0x7c, 0x21, 0x78, 0xdd, 0x09, 0xcd, 0xaa, 0xa0, 0x93, 0xdf, 0xc1, 0xda,
|
||||
0x26, 0xac, 0xa4, 0x77, 0x49, 0x30, 0x95, 0x98, 0x15, 0xc1, 0x8c, 0x79, 0x53, 0xfc, 0xc9, 0x96,
|
||||
0xa0, 0x70, 0x66, 0x0f, 0x27, 0x5c, 0xca, 0x74, 0xfa, 0xf8, 0x38, 0xfb, 0x51, 0xc6, 0xf8, 0xe3,
|
||||
0x0c, 0x54, 0x69, 0x94, 0x52, 0x17, 0x79, 0x0d, 0x6a, 0x8a, 0x1b, 0xb8, 0xef, 0x7b, 0xbe, 0x94,
|
||||
0x6a, 0x8a, 0xf3, 0xda, 0x02, 0x26, 0x4e, 0x15, 0x45, 0x34, 0xf6, 0xb9, 0x33, 0xb2, 0x4f, 0x54,
|
||||
0xd5, 0x8a, 0x95, 0x0e, 0x24, 0x98, 0xbd, 0x1b, 0xd7, 0xe7, 0x7b, 0x93, 0x90, 0xcb, 0x33, 0xaf,
|
||||
0x2a, 0x87, 0x67, 0x0a, 0x58, 0x54, 0x3b, 0x7e, 0xbd, 0x04, 0x9f, 0x1b, 0x3f, 0xc9, 0x00, 0x13,
|
||||
0xdd, 0xee, 0x79, 0x54, 0x81, 0xe4, 0xd0, 0xe9, 0x92, 0x99, 0x97, 0xde, 0x21, 0xd9, 0xe7, 0xed,
|
||||
0x10, 0x03, 0x0a, 0xd4, 0xf7, 0x7c, 0x4a, 0xdf, 0x09, 0xf5, 0xfd, 0x7c, 0x29, 0xd7, 0xc8, 0x1b,
|
||||
0xff, 0x23, 0x07, 0x4b, 0x1b, 0x74, 0x64, 0xb7, 0xfa, 0x7d, 0x3e, 0x8e, 0xf6, 0xce, 0x6d, 0xa8,
|
||||
0xb8, 0xde, 0x80, 0x2b, 0x8e, 0xa5, 0x8e, 0x81, 0x00, 0x69, 0xec, 0x7a, 0x6a, 0x3b, 0x2e, 0x75,
|
||||
0x9c, 0x26, 0xb3, 0x8c, 0x10, 0xec, 0xf6, 0x1b, 0x30, 0x3f, 0xe6, 0xee, 0x40, 0xdf, 0x22, 0xa4,
|
||||
0x54, 0xd5, 0x24, 0x58, 0xee, 0x8e, 0xdb, 0x50, 0x39, 0x9e, 0x10, 0x9d, 0x10, 0x2c, 0x79, 0xe4,
|
||||
0x01, 0x90, 0xa0, 0x16, 0xc9, 0x97, 0xf1, 0x24, 0x38, 0x45, 0x6c, 0x01, 0xb1, 0x45, 0xf1, 0x2d,
|
||||
0x50, 0xb7, 0x00, 0x06, 0x93, 0x20, 0x94, 0x3b, 0x66, 0x0e, 0x91, 0x65, 0x01, 0xa1, 0x1d, 0xf3,
|
||||
0x0e, 0x2c, 0x8e, 0xec, 0x0b, 0x0b, 0x79, 0xc7, 0x72, 0x5c, 0xeb, 0x78, 0x88, 0x67, 0x4e, 0x11,
|
||||
0xe9, 0x1a, 0x23, 0xfb, 0xe2, 0x33, 0x81, 0xe9, 0xb8, 0x5b, 0x08, 0x17, 0x62, 0x45, 0xa9, 0x3b,
|
||||
0x3e, 0x0f, 0xb8, 0x7f, 0xc6, 0x51, 0x12, 0xe4, 0x23, 0x9d, 0xc6, 0x24, 0xa8, 0xe8, 0xd1, 0x48,
|
||||
0x8c, 0x3b, 0x1c, 0xf6, 0x69, 0xdb, 0x9b, 0xc5, 0x91, 0xe3, 0x6e, 0x87, 0xc3, 0xbe, 0x38, 0x57,
|
||||
0x84, 0x1c, 0x19, 0x73, 0xdf, 0x7a, 0x76, 0x8e, 0x7b, 0x38, 0x8f, 0x72, 0xe3, 0x80, 0xfb, 0x4f,
|
||||
0xcf, 0xc5, 0xd1, 0xdf, 0x0f, 0x50, 0x10, 0xd9, 0x97, 0xcd, 0x0a, 0x6e, 0xf0, 0x52, 0x3f, 0x10,
|
||||
0x22, 0xc8, 0xbe, 0x14, 0x9b, 0x50, 0xf4, 0xd6, 0xc6, 0x55, 0xe0, 0x03, 0xac, 0x3e, 0x40, 0x89,
|
||||
0x5a, 0xc3, 0xce, 0xb6, 0x24, 0x42, 0xb4, 0x13, 0x08, 0xae, 0x57, 0x9d, 0x3d, 0x1e, 0xda, 0x27,
|
||||
0x01, 0x8a, 0x94, 0x9a, 0x59, 0x95, 0xc0, 0x2d, 0x01, 0x33, 0x3e, 0x27, 0x25, 0x4b, 0x5b, 0x5b,
|
||||
0xb9, 0x67, 0xc4, 0x51, 0x8f, 0x10, 0x5c, 0xd7, 0x92, 0x29, 0xbf, 0xd2, 0x16, 0x2d, 0x9b, 0xb2,
|
||||
0x68, 0xc6, 0x1f, 0x64, 0xa0, 0x2a, 0x6b, 0x46, 0xa5, 0x84, 0x3d, 0x00, 0xa6, 0x56, 0x31, 0xbc,
|
||||
0x70, 0x06, 0xd6, 0xd1, 0x65, 0xc8, 0x03, 0x62, 0x9a, 0xed, 0x6b, 0x66, 0x43, 0xe2, 0x7a, 0x17,
|
||||
0xce, 0x60, 0x5d, 0x60, 0xd8, 0x7d, 0x68, 0x24, 0xe8, 0x83, 0xd0, 0x27, 0x8e, 0xde, 0xbe, 0x66,
|
||||
0xd6, 0x35, 0xea, 0x6e, 0xe8, 0x8b, 0x3d, 0x22, 0x54, 0x9e, 0x49, 0x68, 0x39, 0xee, 0x80, 0x5f,
|
||||
0x20, 0x1b, 0xd5, 0xcc, 0x0a, 0xc1, 0x3a, 0x02, 0xb4, 0x5e, 0x87, 0xaa, 0x5e, 0x9d, 0x71, 0x02,
|
||||
0x25, 0xa5, 0x2f, 0xa1, 0xc2, 0x30, 0xd5, 0x25, 0xb3, 0x1c, 0x46, 0x3d, 0xb9, 0x0e, 0xa5, 0x64,
|
||||
0x0f, 0xcc, 0x62, 0xf8, 0xd2, 0x0d, 0x1b, 0xdf, 0x83, 0xc6, 0x8e, 0x60, 0x1e, 0x57, 0x30, 0xab,
|
||||
0xd4, 0xff, 0x56, 0x60, 0x4e, 0xdb, 0x34, 0x65, 0x53, 0x7e, 0x89, 0x33, 0xf7, 0xd4, 0x0b, 0x42,
|
||||
0xd9, 0x0a, 0xfe, 0x6d, 0xfc, 0x49, 0x06, 0x58, 0x3b, 0x08, 0x9d, 0x91, 0x1d, 0xf2, 0x2d, 0x1e,
|
||||
0x89, 0x85, 0x7d, 0xa8, 0x8a, 0xda, 0x7a, 0x5e, 0x8b, 0x14, 0x32, 0x52, 0x28, 0xde, 0x92, 0xdb,
|
||||
0x78, 0xb6, 0xc0, 0x03, 0x9d, 0x9a, 0xc4, 0x7c, 0xa2, 0x02, 0xb1, 0xcb, 0x42, 0xdb, 0x3f, 0xe1,
|
||||
0x21, 0xaa, 0x71, 0x52, 0xdf, 0x07, 0x02, 0x09, 0x05, 0x6e, 0xed, 0x37, 0x61, 0x61, 0xa6, 0x0e,
|
||||
0x5d, 0x2e, 0x97, 0x53, 0xe4, 0x72, 0x4e, 0x97, 0xcb, 0x16, 0x2c, 0x26, 0xfa, 0x25, 0x39, 0x6d,
|
||||
0x15, 0x8a, 0x62, 0x43, 0x08, 0xe5, 0x20, 0x43, 0x5a, 0xe5, 0x31, 0xe7, 0x42, 0x0d, 0x7e, 0x08,
|
||||
0x4b, 0xc7, 0x9c, 0xfb, 0x76, 0x88, 0x48, 0xdc, 0x31, 0x62, 0x85, 0x64, 0xc5, 0x0b, 0x12, 0xd7,
|
||||
0xb5, 0xc3, 0x03, 0xee, 0x8b, 0x95, 0x32, 0xfe, 0x67, 0x06, 0xe6, 0x85, 0x04, 0xdd, 0xb5, 0xdd,
|
||||
0x4b, 0x35, 0x4f, 0x3b, 0xa9, 0xf3, 0x74, 0x4f, 0x3b, 0x0c, 0x35, 0xea, 0x6f, 0x3a, 0x49, 0xb9,
|
||||
0xe9, 0x49, 0x62, 0x77, 0xa0, 0x9a, 0xe8, 0x6b, 0x01, 0xfb, 0x0a, 0x41, 0xd4, 0xc9, 0x5f, 0x7e,
|
||||
0x1a, 0xdf, 0x80, 0x46, 0xdc, 0x6d, 0x39, 0x87, 0x0c, 0xf2, 0x82, 0x25, 0x65, 0x05, 0xf8, 0xb7,
|
||||
0xf1, 0xcf, 0x33, 0x44, 0xb8, 0xe1, 0x39, 0x91, 0x76, 0x2a, 0x08, 0x85, 0xde, 0xab, 0x08, 0xc5,
|
||||
0xdf, 0x57, 0x6a, 0xf5, 0xbf, 0xfc, 0x60, 0xc5, 0xd6, 0x09, 0xb8, 0x3b, 0xb0, 0xec, 0xe1, 0x10,
|
||||
0x85, 0x6f, 0xc9, 0x2c, 0x8a, 0xef, 0xd6, 0x70, 0x68, 0xdc, 0x85, 0x05, 0xad, 0x77, 0xcf, 0x19,
|
||||
0xc7, 0x1e, 0xb0, 0x1d, 0x27, 0x08, 0x0f, 0xdd, 0x60, 0xac, 0x29, 0x6e, 0x37, 0xa0, 0x2c, 0x24,
|
||||
0xac, 0xe8, 0x19, 0x6d, 0xd9, 0x82, 0x29, 0x44, 0xae, 0xe8, 0x57, 0x80, 0x48, 0xfb, 0x42, 0x22,
|
||||
0xb3, 0x12, 0x69, 0x5f, 0x20, 0xd2, 0xf8, 0x08, 0x16, 0x13, 0xf5, 0xc9, 0xa6, 0x5f, 0x85, 0xc2,
|
||||
0x24, 0xbc, 0xf0, 0x94, 0x6a, 0x5e, 0x91, 0x1c, 0x22, 0x0c, 0x40, 0x93, 0x30, 0xc6, 0x27, 0xb0,
|
||||
0xb0, 0xc7, 0xcf, 0xe5, 0x26, 0x56, 0x1d, 0x79, 0x03, 0xf2, 0x2f, 0x30, 0x0a, 0x11, 0x6f, 0x3c,
|
||||
0x00, 0xa6, 0x17, 0x96, 0xad, 0x6a, 0x36, 0x62, 0x26, 0x61, 0x23, 0x1a, 0x6f, 0x00, 0xeb, 0x3a,
|
||||
0x27, 0xee, 0x2e, 0x0f, 0x02, 0xfb, 0x24, 0xda, 0xf6, 0x0d, 0xc8, 0x8d, 0x82, 0x13, 0x29, 0xa3,
|
||||
0xc4, 0x9f, 0xc6, 0x77, 0x61, 0x31, 0x41, 0x27, 0x2b, 0xbe, 0x09, 0xe5, 0xc0, 0x39, 0x71, 0x51,
|
||||
0xb1, 0x92, 0x55, 0xc7, 0x00, 0x63, 0x0b, 0x96, 0x3e, 0xe3, 0xbe, 0x73, 0x7c, 0xf9, 0xa2, 0xea,
|
||||
0x93, 0xf5, 0x64, 0xa7, 0xeb, 0x69, 0xc3, 0xf2, 0x54, 0x3d, 0xb2, 0x79, 0x62, 0x5f, 0xb9, 0x92,
|
||||
0x25, 0x93, 0x3e, 0x34, 0xb9, 0x97, 0xd5, 0xe5, 0x9e, 0x71, 0x08, 0x6c, 0xc3, 0x73, 0x5d, 0xde,
|
||||
0x0f, 0x0f, 0x38, 0xf7, 0x63, 0x2f, 0x55, 0xcc, 0xab, 0x95, 0xc7, 0xab, 0x72, 0x66, 0xa7, 0x85,
|
||||
0xa9, 0x64, 0x62, 0x06, 0xf9, 0x31, 0xf7, 0x47, 0x58, 0x71, 0xc9, 0xc4, 0xbf, 0x8d, 0x65, 0x58,
|
||||
0x4c, 0x54, 0x2b, 0xed, 0xfa, 0x47, 0xb0, 0xbc, 0xe9, 0x04, 0xfd, 0xd9, 0x06, 0x57, 0xa1, 0x38,
|
||||
0x9e, 0x1c, 0x59, 0x49, 0xb9, 0xfc, 0x94, 0x5f, 0x0a, 0x6b, 0x6f, 0xba, 0x84, 0xac, 0xeb, 0x6f,
|
||||
0x67, 0x20, 0xbf, 0xdd, 0xdb, 0xd9, 0x60, 0x6b, 0x50, 0x72, 0xdc, 0xbe, 0x37, 0x12, 0x8a, 0x17,
|
||||
0x8d, 0x39, 0xfa, 0xbe, 0x72, 0x83, 0xdd, 0x80, 0x32, 0xea, 0x6b, 0xc2, 0xb4, 0x95, 0xaa, 0x4f,
|
||||
0x49, 0x00, 0x76, 0xbc, 0xfe, 0x33, 0x61, 0x53, 0xf3, 0x8b, 0xb1, 0xe3, 0xa3, 0xd5, 0xac, 0x8c,
|
||||
0xe1, 0x3c, 0x9d, 0xf5, 0x31, 0x82, 0x2c, 0x62, 0xe3, 0x3f, 0x14, 0xa1, 0x28, 0x4f, 0x5b, 0x3a,
|
||||
0xb9, 0x43, 0xe7, 0x8c, 0xc7, 0x27, 0xb7, 0xf8, 0x12, 0xfa, 0x80, 0xcf, 0x47, 0x5e, 0x18, 0x29,
|
||||
0x6c, 0xb4, 0x06, 0x55, 0x02, 0x4a, 0x95, 0x4d, 0x53, 0x1a, 0xc8, 0xc5, 0x90, 0x23, 0xa2, 0xbe,
|
||||
0x7e, 0x94, 0xdf, 0x80, 0xa2, 0x3a, 0xfb, 0xf3, 0x91, 0x4d, 0x33, 0xd7, 0x27, 0x6d, 0x6d, 0x0d,
|
||||
0x4a, 0x7d, 0x7b, 0x6c, 0xf7, 0x9d, 0xf0, 0x52, 0x0a, 0x84, 0xe8, 0x5b, 0xd4, 0x3e, 0xf4, 0xfa,
|
||||
0xf6, 0xd0, 0x3a, 0xb2, 0x87, 0xb6, 0xdb, 0xe7, 0xd2, 0x76, 0xaf, 0x22, 0x70, 0x9d, 0x60, 0xc2,
|
||||
0x3e, 0x97, 0xfd, 0x54, 0x54, 0x64, 0xc2, 0xcb, 0xde, 0x2b, 0x32, 0xa1, 0x5c, 0x7a, 0xa3, 0x91,
|
||||
0x23, 0xac, 0x0c, 0x52, 0xc3, 0x72, 0x66, 0x99, 0x20, 0x5b, 0x1c, 0x47, 0x2b, 0xd1, 0xe7, 0x34,
|
||||
0x75, 0x65, 0x6a, 0x8a, 0x80, 0x9f, 0x93, 0x23, 0x61, 0x56, 0x17, 0xcb, 0x69, 0xba, 0xd8, 0x5b,
|
||||
0xb0, 0x30, 0x71, 0x03, 0x1e, 0x86, 0x43, 0x3e, 0x88, 0xfa, 0x52, 0x41, 0xa2, 0x46, 0x84, 0x50,
|
||||
0xdd, 0x79, 0x00, 0x8b, 0xe4, 0x74, 0x08, 0xec, 0xd0, 0x0b, 0x4e, 0x9d, 0xc0, 0x0a, 0x84, 0x85,
|
||||
0x44, 0xe6, 0xee, 0x02, 0xa2, 0xba, 0x12, 0xd3, 0x25, 0x13, 0x69, 0x75, 0x8a, 0xde, 0xe7, 0x7d,
|
||||
0xee, 0x9c, 0xf1, 0x01, 0xea, 0x69, 0x39, 0x73, 0x39, 0x51, 0xc6, 0x94, 0x48, 0x54, 0xba, 0x27,
|
||||
0x23, 0x6b, 0x32, 0x1e, 0xd8, 0x42, 0x59, 0xa9, 0x93, 0x32, 0xec, 0x4e, 0x46, 0x87, 0x04, 0x61,
|
||||
0x8f, 0x40, 0x69, 0x62, 0x52, 0x3f, 0x9c, 0x4f, 0xc8, 0x33, 0xc1, 0xac, 0x66, 0x55, 0x52, 0x90,
|
||||
0xa2, 0x98, 0xd0, 0x39, 0x1b, 0x53, 0x3a, 0x67, 0x13, 0x8a, 0x63, 0xdf, 0x39, 0xb3, 0x43, 0xde,
|
||||
0x5c, 0x20, 0x01, 0x2e, 0x3f, 0x85, 0x64, 0x70, 0x5c, 0x27, 0x74, 0xec, 0xd0, 0xf3, 0x9b, 0x0c,
|
||||
0x71, 0x31, 0x80, 0xdd, 0x87, 0x05, 0xe4, 0x91, 0x20, 0xb4, 0xc3, 0x49, 0x20, 0x35, 0xd0, 0x45,
|
||||
0x64, 0x26, 0xd4, 0xa1, 0xbb, 0x08, 0x47, 0x25, 0x94, 0x7d, 0x17, 0x56, 0x88, 0x2d, 0xb0, 0x84,
|
||||
0xd4, 0xac, 0x51, 0x21, 0x58, 0xc2, 0xa9, 0x58, 0x44, 0xac, 0xe0, 0x6f, 0xa9, 0x5f, 0x0b, 0xed,
|
||||
0xe0, 0x7d, 0x58, 0x95, 0x6c, 0x32, 0x53, 0x6a, 0x19, 0x4b, 0x2d, 0x11, 0x7a, 0xaa, 0xd8, 0x7d,
|
||||
0x58, 0x10, 0x5d, 0x72, 0xfa, 0x96, 0x2c, 0x2d, 0x76, 0xc2, 0x0a, 0xf6, 0x7e, 0x9e, 0x10, 0x26,
|
||||
0xc2, 0x9f, 0xf2, 0x4b, 0xc1, 0xca, 0x43, 0xe7, 0x98, 0x87, 0xce, 0x88, 0x37, 0x57, 0x89, 0x39,
|
||||
0xd4, 0xb7, 0xd8, 0x65, 0x93, 0x31, 0x62, 0x9a, 0xb4, 0xa7, 0xe9, 0x0b, 0xf9, 0x6e, 0xe8, 0x05,
|
||||
0x5c, 0xb9, 0x97, 0x9a, 0xd7, 0xe5, 0x06, 0x12, 0x40, 0x29, 0xb2, 0x8c, 0x9f, 0x65, 0xe8, 0x0c,
|
||||
0x92, 0x5b, 0x36, 0xd0, 0x2c, 0x2a, 0xda, 0xac, 0x96, 0xe7, 0x0e, 0x2f, 0xe5, 0xfe, 0x05, 0x02,
|
||||
0xed, 0xbb, 0x43, 0xdc, 0x40, 0x8e, 0xab, 0x93, 0x90, 0xb8, 0xab, 0x2a, 0x20, 0x12, 0xdd, 0x86,
|
||||
0xca, 0x78, 0x72, 0x34, 0x74, 0xfa, 0x44, 0x92, 0xa3, 0x5a, 0x08, 0x84, 0x04, 0xc2, 0xa4, 0xa4,
|
||||
0x45, 0x24, 0x8a, 0x3c, 0x52, 0x54, 0x24, 0x0c, 0x49, 0x50, 0x9c, 0x72, 0x1f, 0x77, 0x70, 0xd5,
|
||||
0xc4, 0xbf, 0x8d, 0x75, 0x58, 0x4a, 0x76, 0x5a, 0xca, 0xfa, 0xfb, 0x50, 0x92, 0xe2, 0x41, 0xf9,
|
||||
0x1a, 0xea, 0x9a, 0xf7, 0x57, 0x58, 0x45, 0x11, 0xde, 0xf8, 0xbd, 0x39, 0x58, 0x94, 0xd0, 0x0d,
|
||||
0x31, 0x23, 0xdd, 0xc9, 0x68, 0x64, 0xfb, 0x29, 0x72, 0x27, 0xf3, 0x7c, 0xb9, 0x93, 0x9d, 0x91,
|
||||
0x3b, 0x49, 0x63, 0x93, 0xc4, 0x56, 0xd2, 0xd8, 0x14, 0x4b, 0x40, 0xfa, 0xbf, 0xee, 0x7a, 0xac,
|
||||
0x49, 0x70, 0x8f, 0x5c, 0x9c, 0x33, 0x52, 0xb2, 0x90, 0x22, 0x25, 0x75, 0x19, 0x37, 0x37, 0x25,
|
||||
0xe3, 0x5e, 0x05, 0x5a, 0x6b, 0x25, 0xb2, 0x8b, 0x64, 0x12, 0x20, 0x4c, 0xfa, 0x2f, 0xef, 0xc2,
|
||||
0xfc, 0xb4, 0x58, 0x21, 0xf9, 0x55, 0x4f, 0x11, 0x2a, 0xce, 0x88, 0xe3, 0x01, 0xa1, 0x11, 0x97,
|
||||
0xa5, 0x50, 0x71, 0x46, 0x7c, 0x07, 0x31, 0x8a, 0xbe, 0x0d, 0x40, 0x6d, 0xa3, 0x46, 0x02, 0xa8,
|
||||
0x91, 0xbc, 0x91, 0x5c, 0x0b, 0x7d, 0xd6, 0x1f, 0x88, 0x8f, 0x89, 0xcf, 0x51, 0x4b, 0x29, 0x63,
|
||||
0x49, 0x74, 0x5c, 0x3f, 0x85, 0xba, 0x37, 0xe6, 0xae, 0x15, 0x6f, 0xef, 0x0a, 0x56, 0xf5, 0xfa,
|
||||
0x73, 0xaa, 0xea, 0x28, 0x5a, 0xb3, 0x26, 0xca, 0x46, 0x9f, 0x6c, 0x97, 0x26, 0x9e, 0x6b, 0xb5,
|
||||
0x55, 0xbf, 0x41, 0x6d, 0x75, 0x2c, 0x1c, 0x7d, 0x1b, 0x7f, 0x2f, 0x03, 0x15, 0xad, 0xdb, 0x6c,
|
||||
0x19, 0x16, 0x36, 0xf6, 0xf7, 0x0f, 0xda, 0x66, 0xab, 0xd7, 0xf9, 0xac, 0x6d, 0x6d, 0xec, 0xec,
|
||||
0x77, 0xdb, 0x8d, 0x6b, 0x02, 0xbc, 0xb3, 0xbf, 0xd1, 0xda, 0xb1, 0xb6, 0xf6, 0xcd, 0x0d, 0x05,
|
||||
0xce, 0xb0, 0x15, 0x60, 0x66, 0x7b, 0x77, 0xbf, 0xd7, 0x4e, 0xc0, 0xb3, 0xac, 0x01, 0xd5, 0x75,
|
||||
0xb3, 0xdd, 0xda, 0xd8, 0x96, 0x90, 0x1c, 0x5b, 0x82, 0xc6, 0xd6, 0xe1, 0xde, 0x66, 0x67, 0xef,
|
||||
0x89, 0xb5, 0xd1, 0xda, 0xdb, 0x68, 0xef, 0xb4, 0x37, 0x1b, 0x79, 0x56, 0x83, 0x72, 0x6b, 0xbd,
|
||||
0xb5, 0xb7, 0xb9, 0xbf, 0xd7, 0xde, 0x6c, 0x14, 0x8c, 0xdf, 0x80, 0x72, 0x3c, 0xd0, 0x0a, 0x14,
|
||||
0x0f, 0xf7, 0x9e, 0xee, 0xed, 0x7f, 0xbe, 0xd7, 0xb8, 0xc6, 0xca, 0x50, 0xc0, 0xf6, 0x1b, 0x19,
|
||||
0x06, 0x30, 0x47, 0x6d, 0x36, 0xb2, 0xac, 0x04, 0xf9, 0xf5, 0xfd, 0xde, 0x76, 0x23, 0x67, 0xfc,
|
||||
0x45, 0x06, 0x96, 0x71, 0xc8, 0x83, 0x69, 0x21, 0x70, 0x07, 0x2a, 0x7d, 0xcf, 0x1b, 0x0b, 0xe3,
|
||||
0x26, 0x3e, 0xc4, 0x75, 0x90, 0xd8, 0xe0, 0x24, 0x2f, 0x8f, 0x3d, 0xbf, 0xcf, 0xa5, 0x0c, 0x00,
|
||||
0x04, 0x6d, 0x09, 0x88, 0xe0, 0x41, 0xc9, 0xc4, 0x44, 0x41, 0x22, 0xa0, 0x42, 0x30, 0x22, 0x59,
|
||||
0x81, 0xb9, 0x23, 0x9f, 0xdb, 0xfd, 0x53, 0xb9, 0xfb, 0xe5, 0x17, 0x7b, 0x33, 0x36, 0xbb, 0xfb,
|
||||
0x82, 0xa7, 0x86, 0x7c, 0x80, 0x5b, 0xa0, 0x64, 0xce, 0x4b, 0xf8, 0x86, 0x04, 0x8b, 0x03, 0xc0,
|
||||
0x3e, 0xb2, 0xdd, 0x81, 0xe7, 0xf2, 0x81, 0xd4, 0xee, 0x63, 0x80, 0x71, 0x00, 0x2b, 0xd3, 0xe3,
|
||||
0x93, 0xf2, 0xe2, 0x03, 0x4d, 0x5e, 0x90, 0xb2, 0xbd, 0x76, 0x35, 0x2b, 0x68, 0xb2, 0xe3, 0xe7,
|
||||
0x39, 0xc8, 0x0b, 0xe5, 0xeb, 0x4a, 0x3d, 0x4d, 0xd7, 0xa6, 0x73, 0x33, 0x11, 0x17, 0xb4, 0xee,
|
||||
0xe9, 0x54, 0x26, 0x17, 0x52, 0x19, 0x21, 0x78, 0x1a, 0x47, 0x68, 0x9f, 0xf7, 0xcf, 0xa4, 0x0f,
|
||||
0x89, 0xd0, 0x26, 0xef, 0x9f, 0xa1, 0x19, 0x63, 0x87, 0x54, 0x96, 0xf6, 0x7b, 0x31, 0xb0, 0x43,
|
||||
0x2c, 0x29, 0x51, 0x58, 0xae, 0x18, 0xa1, 0xb0, 0x54, 0x13, 0x8a, 0x8e, 0x7b, 0xe4, 0x4d, 0xdc,
|
||||
0x01, 0x6e, 0xef, 0x92, 0xa9, 0x3e, 0x31, 0xc0, 0x83, 0x92, 0x48, 0x9c, 0x1f, 0xb4, 0x9b, 0x4b,
|
||||
0x02, 0xd0, 0x13, 0x27, 0xc8, 0xbb, 0x50, 0x0e, 0x2e, 0xdd, 0xbe, 0xbe, 0x87, 0x97, 0xe4, 0xfc,
|
||||
0x88, 0xd1, 0x3f, 0xe8, 0x5e, 0xba, 0x7d, 0xdc, 0xb1, 0xa5, 0x40, 0xfe, 0xc5, 0xde, 0x87, 0x52,
|
||||
0xe4, 0x6a, 0x25, 0x09, 0x7c, 0x5d, 0x2f, 0xa1, 0xfc, 0xab, 0x64, 0xd1, 0x46, 0xa4, 0x6b, 0x4f,
|
||||
0xa1, 0x96, 0x40, 0xe9, 0x66, 0x68, 0x8d, 0xcc, 0xd0, 0xd7, 0x75, 0x33, 0x34, 0x16, 0xec, 0xb2,
|
||||
0x98, 0x6e, 0x96, 0xfe, 0x26, 0x94, 0x54, 0xcf, 0xc4, 0x76, 0x92, 0x5b, 0xc1, 0xea, 0x7e, 0xb1,
|
||||
0xb7, 0xd1, 0xb8, 0xc6, 0xe6, 0xa1, 0xd2, 0xda, 0xc0, 0x1d, 0x8a, 0x80, 0x8c, 0x20, 0x39, 0x68,
|
||||
0x75, 0xbb, 0x11, 0x24, 0x6b, 0x30, 0x68, 0x88, 0xe3, 0x45, 0xf4, 0x38, 0x0a, 0xa6, 0x7c, 0x00,
|
||||
0x0b, 0x1a, 0x2c, 0xb6, 0xd4, 0xc4, 0x79, 0x34, 0x6d, 0xa9, 0xa1, 0x5e, 0x4e, 0x18, 0x63, 0x15,
|
||||
0x96, 0xc5, 0x67, 0xfb, 0x8c, 0xbb, 0x61, 0x77, 0x72, 0x44, 0xa1, 0x34, 0xc7, 0x73, 0x85, 0xbe,
|
||||
0x5e, 0x8e, 0x30, 0x57, 0x33, 0xd2, 0x03, 0x69, 0xd4, 0x65, 0x71, 0xfa, 0xd7, 0xb4, 0x16, 0xb0,
|
||||
0xe0, 0x03, 0xfc, 0x37, 0x61, 0xdc, 0x95, 0x23, 0x90, 0x18, 0xeb, 0x41, 0xbb, 0x6d, 0x5a, 0xfb,
|
||||
0x7b, 0x3b, 0x9d, 0x3d, 0x21, 0x8c, 0xc4, 0x58, 0x11, 0xb0, 0xb5, 0x85, 0x90, 0x8c, 0xd1, 0x80,
|
||||
0xfa, 0x13, 0x1e, 0x76, 0xdc, 0x63, 0x4f, 0x8d, 0xf4, 0x17, 0x05, 0x98, 0x8f, 0x40, 0xb1, 0x71,
|
||||
0x78, 0xc6, 0xfd, 0xc0, 0xf1, 0x5c, 0xd4, 0xf3, 0xca, 0xa6, 0xfa, 0x14, 0x27, 0x88, 0x33, 0xe0,
|
||||
0x6e, 0xe8, 0x84, 0x97, 0x56, 0xc2, 0x93, 0x54, 0x57, 0x60, 0x79, 0x52, 0x2d, 0x41, 0xc1, 0x1e,
|
||||
0x3a, 0xb6, 0x8a, 0x40, 0xd2, 0x87, 0x80, 0xf6, 0xbd, 0xa1, 0xe7, 0xa3, 0x4a, 0x57, 0x36, 0xe9,
|
||||
0x83, 0x3d, 0x82, 0x25, 0xa1, 0x5a, 0xea, 0xee, 0x3d, 0xdc, 0xa3, 0xe4, 0xd4, 0x62, 0xee, 0x64,
|
||||
0x74, 0x10, 0xbb, 0xf8, 0x04, 0x46, 0x9c, 0x4f, 0xa2, 0x84, 0x54, 0x48, 0xa2, 0x02, 0x64, 0xa5,
|
||||
0x2c, 0xb8, 0x93, 0x51, 0x0b, 0x31, 0x11, 0xfd, 0x63, 0x58, 0x16, 0xf4, 0x91, 0x0a, 0x13, 0x95,
|
||||
0x98, 0xc7, 0x12, 0xa2, 0xb2, 0x8e, 0xc4, 0x45, 0x65, 0x6e, 0x40, 0x99, 0x7a, 0x25, 0x56, 0xbc,
|
||||
0x40, 0xda, 0x29, 0x76, 0x85, 0xfb, 0xc1, 0x4c, 0xb0, 0x70, 0x8e, 0x0e, 0xdb, 0xa9, 0x60, 0xa1,
|
||||
0x16, 0x6e, 0x2c, 0x4d, 0x87, 0x1b, 0x1f, 0xc3, 0xf2, 0x11, 0x0f, 0x42, 0xeb, 0x94, 0xdb, 0x03,
|
||||
0xee, 0xe3, 0x8e, 0xa4, 0xb0, 0x22, 0x69, 0xe1, 0x8b, 0x02, 0xb9, 0x8d, 0xb8, 0x9e, 0x42, 0x09,
|
||||
0x5d, 0x42, 0x6c, 0x3d, 0x3e, 0xb0, 0x42, 0xcf, 0x42, 0x15, 0x03, 0x37, 0x71, 0xc9, 0xac, 0x11,
|
||||
0xb8, 0xe7, 0x6d, 0x08, 0x60, 0x92, 0xee, 0xc4, 0xb7, 0xc7, 0xa7, 0x52, 0x4f, 0x8e, 0xe8, 0x9e,
|
||||
0x08, 0x20, 0xbb, 0x09, 0xc5, 0x90, 0x07, 0xa1, 0xcb, 0x29, 0xa6, 0x53, 0x42, 0x9f, 0xbd, 0x02,
|
||||
0xb1, 0xd7, 0x61, 0x0e, 0xdb, 0x08, 0x9a, 0x0d, 0xe4, 0xf7, 0x6a, 0x2c, 0x2c, 0x1d, 0xd7, 0x94,
|
||||
0x38, 0xa1, 0xb0, 0x4d, 0x7c, 0x27, 0x68, 0x56, 0x31, 0x96, 0x89, 0x7f, 0xb3, 0xdf, 0xd2, 0xc4,
|
||||
0xc2, 0x22, 0x96, 0x55, 0x67, 0xee, 0x14, 0xa7, 0xfd, 0x5a, 0x24, 0xc4, 0xf7, 0xf3, 0xa5, 0x4a,
|
||||
0xa3, 0x6a, 0x7c, 0x08, 0x05, 0x9a, 0x1d, 0xc1, 0x84, 0x38, 0x77, 0x19, 0xc9, 0x84, 0x08, 0x6d,
|
||||
0x42, 0xd1, 0xe5, 0xe1, 0xb9, 0xe7, 0x3f, 0x53, 0xbe, 0x56, 0xf9, 0x69, 0xfc, 0x18, 0x9d, 0x04,
|
||||
0x51, 0x20, 0x99, 0xec, 0x1d, 0xc1, 0x1e, 0xb4, 0xbc, 0xc1, 0xa9, 0x2d, 0xfd, 0x16, 0x25, 0x04,
|
||||
0x74, 0x4f, 0xed, 0x19, 0xf6, 0xc8, 0xce, 0xc6, 0x92, 0x5f, 0x87, 0xba, 0x0a, 0x5d, 0x07, 0xd6,
|
||||
0x90, 0x1f, 0x87, 0x92, 0xdd, 0xab, 0x32, 0x6e, 0x1d, 0xec, 0xf0, 0xe3, 0xd0, 0xd8, 0x85, 0x05,
|
||||
0xc9, 0x90, 0xfb, 0x63, 0xae, 0x9a, 0xfe, 0x28, 0x4d, 0x67, 0xad, 0x3c, 0x5e, 0x4c, 0x1e, 0x66,
|
||||
0x14, 0x92, 0x4f, 0x28, 0xb2, 0xc6, 0xa7, 0xc0, 0xf4, 0xa3, 0x4e, 0xd6, 0x27, 0x35, 0x47, 0xe5,
|
||||
0xa2, 0x56, 0x91, 0x9e, 0x48, 0x3f, 0x75, 0x06, 0x62, 0x76, 0x82, 0x49, 0xbf, 0xaf, 0x52, 0x0a,
|
||||
0x4a, 0xa6, 0xfa, 0x34, 0xfe, 0x2c, 0x03, 0x8b, 0x58, 0x99, 0xd2, 0xb9, 0xa5, 0x36, 0xf1, 0xad,
|
||||
0x3b, 0x29, 0xd6, 0x47, 0xd7, 0x2f, 0xe8, 0xe3, 0x9b, 0x3b, 0x05, 0xf3, 0x33, 0x4e, 0xc1, 0x37,
|
||||
0xa1, 0x31, 0xe0, 0x43, 0x07, 0xb3, 0x4b, 0xd4, 0x71, 0x4d, 0x5a, 0xf6, 0xbc, 0x82, 0x2b, 0x43,
|
||||
0xe9, 0x9f, 0x64, 0x60, 0x81, 0xb4, 0x01, 0x34, 0x17, 0xe5, 0x44, 0x7d, 0xa2, 0x6c, 0x2c, 0x29,
|
||||
0xaa, 0xe4, 0x98, 0xe2, 0x53, 0x12, 0xa1, 0x44, 0xbc, 0x7d, 0x4d, 0xda, 0x5e, 0x12, 0xca, 0x3e,
|
||||
0x46, 0x3b, 0xc1, 0xb5, 0x10, 0x98, 0x92, 0xad, 0x92, 0x5c, 0x94, 0xed, 0x6b, 0x68, 0x44, 0xb8,
|
||||
0x08, 0x5a, 0x2f, 0x09, 0xa3, 0x4f, 0x80, 0x8d, 0x2d, 0xa8, 0x25, 0x9a, 0x49, 0x78, 0x2e, 0xab,
|
||||
0xe4, 0xb9, 0x9c, 0x89, 0x0e, 0x64, 0x67, 0xa3, 0x03, 0x7f, 0x27, 0x0f, 0x4c, 0xb0, 0xd4, 0xd4,
|
||||
0xaa, 0x4d, 0x85, 0xd6, 0xb2, 0x33, 0xa1, 0xb5, 0x47, 0xc0, 0x34, 0x02, 0x15, 0xf1, 0xcb, 0x45,
|
||||
0x11, 0xbf, 0x46, 0x4c, 0x2b, 0x03, 0x7e, 0x8f, 0x60, 0x49, 0x2a, 0x8d, 0x51, 0x2c, 0x0d, 0x5d,
|
||||
0x52, 0xb4, 0x3e, 0x8c, 0xb4, 0x47, 0x15, 0x53, 0x43, 0xf7, 0x94, 0x0a, 0xab, 0x09, 0x93, 0x9a,
|
||||
0x3c, 0x39, 0x18, 0x56, 0x13, 0x56, 0xf4, 0x14, 0x17, 0xcc, 0xbd, 0x90, 0x0b, 0x8a, 0x33, 0x5c,
|
||||
0xa0, 0x39, 0x16, 0x4a, 0x49, 0xc7, 0x82, 0x01, 0x35, 0x15, 0x3c, 0xa3, 0x9c, 0x01, 0xd2, 0x90,
|
||||
0x2a, 0x32, 0x82, 0x86, 0x79, 0x03, 0xf7, 0xa0, 0xa1, 0xac, 0xff, 0xc8, 0x75, 0x41, 0xf1, 0x70,
|
||||
0xe9, 0x3c, 0xda, 0x50, 0x0e, 0x8c, 0x84, 0xa3, 0xb8, 0x32, 0xe5, 0x28, 0x7e, 0x0b, 0x16, 0x02,
|
||||
0xc1, 0x44, 0xd6, 0xc4, 0x95, 0xc9, 0x2b, 0x7c, 0x80, 0xe6, 0x49, 0xc9, 0x6c, 0x20, 0xe2, 0x30,
|
||||
0x86, 0xcf, 0x9a, 0xf6, 0xb5, 0x59, 0xd3, 0x9e, 0xbd, 0x1f, 0xc7, 0x99, 0x82, 0x53, 0x67, 0x84,
|
||||
0x07, 0x77, 0x9c, 0xe8, 0x21, 0x27, 0xb8, 0x7b, 0xea, 0x8c, 0x4c, 0x15, 0xd4, 0x14, 0x1f, 0xc6,
|
||||
0x7f, 0xce, 0x40, 0x43, 0xf0, 0x41, 0x82, 0xcf, 0x7f, 0x03, 0x70, 0x47, 0xbe, 0x24, 0x9b, 0x57,
|
||||
0x04, 0xad, 0xe2, 0xf2, 0x0f, 0x01, 0xd9, 0xd6, 0x12, 0xb6, 0x98, 0x64, 0xf2, 0x66, 0x92, 0xc9,
|
||||
0x63, 0x41, 0xb6, 0x7d, 0x8d, 0x94, 0x6c, 0x01, 0x49, 0x8b, 0xef, 0xe5, 0x53, 0xe2, 0x7b, 0xda,
|
||||
0x56, 0xd8, 0x06, 0x78, 0xca, 0x2f, 0x77, 0xbc, 0x3e, 0x5a, 0x41, 0xb7, 0x00, 0x04, 0x43, 0x1e,
|
||||
0xdb, 0x23, 0x47, 0x7a, 0x30, 0x0a, 0x66, 0xf9, 0x19, 0xbf, 0xdc, 0x42, 0x80, 0x58, 0x0d, 0x81,
|
||||
0x8e, 0xf7, 0x43, 0xc1, 0x2c, 0x3d, 0xe3, 0x97, 0xb4, 0x19, 0x2c, 0xa8, 0x3d, 0xe5, 0x97, 0x9b,
|
||||
0x9c, 0xd4, 0x35, 0xcf, 0x17, 0x9c, 0xe0, 0xdb, 0xe7, 0x42, 0x3f, 0x4b, 0xc4, 0xe6, 0x2a, 0xbe,
|
||||
0x7d, 0xfe, 0x94, 0x5f, 0xaa, 0x38, 0x61, 0x51, 0xe0, 0x87, 0x5e, 0x5f, 0x9e, 0x40, 0x2a, 0xcb,
|
||||
0x20, 0xee, 0x94, 0x39, 0xf7, 0x0c, 0xff, 0x36, 0xfe, 0x34, 0x03, 0x35, 0xd1, 0x7f, 0x14, 0x70,
|
||||
0x62, 0xde, 0x55, 0xb2, 0x4a, 0x26, 0x4e, 0x56, 0x79, 0x2c, 0xe5, 0x03, 0x49, 0xcb, 0xec, 0xd5,
|
||||
0xd2, 0x12, 0x27, 0x98, 0x44, 0xe5, 0xbb, 0x50, 0xa6, 0xbd, 0x25, 0x36, 0x6b, 0x2e, 0xb1, 0x4a,
|
||||
0x89, 0x01, 0x99, 0x25, 0x24, 0x7b, 0x4a, 0xb1, 0x71, 0xcd, 0x01, 0x45, 0x53, 0x5c, 0xf6, 0x23,
|
||||
0xd7, 0x53, 0xca, 0x32, 0x14, 0xd2, 0xc2, 0xac, 0x87, 0x50, 0xd1, 0x78, 0x8a, 0x7d, 0x8f, 0x02,
|
||||
0xd4, 0xd4, 0x79, 0x62, 0xc0, 0x24, 0xd3, 0x24, 0x46, 0xbf, 0x7d, 0xcd, 0xac, 0xf5, 0x75, 0xc0,
|
||||
0xfa, 0x1c, 0xe4, 0x45, 0x21, 0xe3, 0x13, 0x58, 0xd0, 0xaa, 0x25, 0x8b, 0x2f, 0xad, 0x4f, 0x99,
|
||||
0xb4, 0x3e, 0xfd, 0xd3, 0x0c, 0x2c, 0xc9, 0xd2, 0x98, 0xd8, 0xe4, 0x88, 0xe3, 0x7a, 0x37, 0x38,
|
||||
0x61, 0xbf, 0x01, 0x35, 0x51, 0xbb, 0xe5, 0xf3, 0x13, 0x27, 0x08, 0xb9, 0xf2, 0xec, 0xa7, 0x6c,
|
||||
0x0e, 0x21, 0xb5, 0x05, 0xa9, 0x29, 0x29, 0xd9, 0x27, 0x50, 0xc1, 0xa2, 0x64, 0x93, 0xca, 0x65,
|
||||
0x69, 0xce, 0x16, 0xa4, 0xae, 0x6e, 0x5f, 0x33, 0x21, 0x88, 0xbe, 0xd6, 0xcb, 0x50, 0x0c, 0x7d,
|
||||
0xe7, 0xe4, 0x84, 0xfb, 0xc6, 0x4a, 0xd4, 0x35, 0xb1, 0xd3, 0x78, 0x37, 0xe4, 0x63, 0xa1, 0x04,
|
||||
0x19, 0xff, 0x35, 0x03, 0x15, 0xb9, 0x77, 0xbe, 0xb5, 0x3b, 0x7f, 0x4d, 0xcb, 0xcc, 0x23, 0xf3,
|
||||
0x33, 0x4e, 0xc4, 0xbb, 0x0b, 0xf3, 0x23, 0xa1, 0x10, 0x09, 0x85, 0x3d, 0xe1, 0xcb, 0xaf, 0x2b,
|
||||
0xb0, 0xd4, 0x47, 0x1e, 0xc0, 0x22, 0xaa, 0x27, 0x81, 0x15, 0x3a, 0x43, 0x4b, 0x21, 0x65, 0x16,
|
||||
0xdc, 0x02, 0xa1, 0x7a, 0xce, 0x70, 0x57, 0x22, 0xc4, 0x29, 0x1d, 0x84, 0xf6, 0x09, 0x97, 0xaa,
|
||||
0x2f, 0x7d, 0x18, 0x4d, 0x58, 0x99, 0xd2, 0xd5, 0x95, 0x9d, 0xf1, 0xf7, 0x6b, 0xb0, 0x3a, 0x83,
|
||||
0x92, 0xf6, 0x46, 0xe4, 0xc3, 0x1e, 0x3a, 0xa3, 0x23, 0x2f, 0x72, 0x37, 0x65, 0x34, 0x1f, 0xf6,
|
||||
0x8e, 0xc0, 0x28, 0x77, 0x13, 0x87, 0x65, 0xc5, 0x10, 0xe8, 0x2f, 0x8a, 0xd4, 0xf9, 0x2c, 0x2a,
|
||||
0x9b, 0xef, 0x26, 0x05, 0xd5, 0x74, 0x73, 0x0a, 0xae, 0x1f, 0x7f, 0x8b, 0xe3, 0x19, 0x58, 0xc0,
|
||||
0x8e, 0xa1, 0x19, 0xf1, 0x9d, 0xd4, 0x8f, 0x34, 0xdb, 0x44, 0xb4, 0xf4, 0xf6, 0x0b, 0x5a, 0x4a,
|
||||
0x38, 0x22, 0xcc, 0x15, 0xc5, 0xae, 0x54, 0x59, 0xd4, 0xce, 0x19, 0xbc, 0xa2, 0xda, 0x41, 0x5d,
|
||||
0x67, 0xb6, 0xb5, 0xfc, 0x4b, 0x8d, 0x0b, 0x1d, 0x2c, 0xc9, 0x26, 0x6f, 0xc8, 0x8a, 0x23, 0x94,
|
||||
0xde, 0xee, 0x29, 0xac, 0x9c, 0xdb, 0x4e, 0xa8, 0xc6, 0xa7, 0x99, 0x45, 0x05, 0x6c, 0xef, 0xf1,
|
||||
0x0b, 0xda, 0xfb, 0x9c, 0x0a, 0x27, 0xb4, 0xbf, 0xa5, 0xf3, 0x59, 0x60, 0xb0, 0xf6, 0x1f, 0xb3,
|
||||
0x50, 0x4f, 0xd6, 0x22, 0x36, 0xb5, 0x94, 0x43, 0x4a, 0x9f, 0x90, 0xfa, 0xb8, 0x74, 0x83, 0xee,
|
||||
0x91, 0x1e, 0x31, 0xeb, 0xa0, 0xcd, 0xa6, 0x38, 0x68, 0x75, 0xbf, 0x68, 0xee, 0x45, 0xb1, 0x9f,
|
||||
0xfc, 0x4b, 0xc5, 0x7e, 0x0a, 0x69, 0xb1, 0x9f, 0xab, 0x03, 0x06, 0x73, 0xdf, 0x2a, 0x60, 0x50,
|
||||
0xbc, 0x3a, 0x60, 0xb0, 0xf6, 0x7f, 0x32, 0xc0, 0x66, 0x39, 0x95, 0x3d, 0x21, 0x5f, 0xb4, 0xcb,
|
||||
0x87, 0x52, 0x8a, 0xbd, 0xf3, 0x72, 0xdc, 0xae, 0x16, 0x48, 0x95, 0x66, 0x0f, 0x61, 0x51, 0xcf,
|
||||
0x9b, 0xd5, 0x4d, 0x95, 0x9a, 0xc9, 0x74, 0x54, 0x6c, 0xd0, 0x6a, 0x81, 0xaf, 0xfc, 0x0b, 0x03,
|
||||
0x5f, 0x85, 0x17, 0x06, 0xbe, 0xe6, 0x92, 0x81, 0xaf, 0xb5, 0xbf, 0x95, 0x81, 0xc5, 0x14, 0xa6,
|
||||
0xfa, 0xd5, 0x8d, 0x59, 0xf0, 0x42, 0x42, 0xc4, 0x64, 0x25, 0x2f, 0x68, 0xd2, 0x65, 0xed, 0x2b,
|
||||
0xa8, 0x25, 0x36, 0xd1, 0xaf, 0xae, 0xf9, 0x69, 0x43, 0x8b, 0x58, 0x59, 0x37, 0xb4, 0xd6, 0xfe,
|
||||
0x2a, 0x0b, 0x6c, 0x76, 0x1f, 0xff, 0x3a, 0xbb, 0x30, 0x3b, 0x49, 0xb9, 0xd9, 0x49, 0xfa, 0x7f,
|
||||
0x77, 0xae, 0xbc, 0x05, 0x0b, 0x32, 0xd7, 0x5f, 0x0b, 0x3c, 0x10, 0xa3, 0x34, 0x22, 0x84, 0xea,
|
||||
0xc5, 0x87, 0xd3, 0x31, 0xc7, 0x52, 0x22, 0xbd, 0x59, 0x3b, 0x58, 0x93, 0xa1, 0x47, 0x63, 0x0d,
|
||||
0x9a, 0x72, 0x6a, 0x66, 0x5d, 0x75, 0x3f, 0xc9, 0x47, 0x56, 0x32, 0x22, 0xa5, 0x52, 0xfc, 0x5d,
|
||||
0xa8, 0xea, 0x87, 0x8d, 0x5c, 0x87, 0xa9, 0x88, 0x93, 0x50, 0x87, 0x3d, 0x6d, 0xb7, 0x6e, 0x00,
|
||||
0xc5, 0x11, 0x06, 0x51, 0x31, 0xd2, 0x20, 0x9e, 0xe3, 0x78, 0x46, 0xe5, 0x28, 0xb1, 0xf8, 0xff,
|
||||
0x1f, 0xd4, 0x93, 0x7e, 0x2b, 0xa9, 0xea, 0xa5, 0x69, 0x87, 0xa2, 0x74, 0xc2, 0x91, 0xc5, 0x7e,
|
||||
0x0b, 0x1a, 0xd3, 0x7e, 0x2f, 0x99, 0x7b, 0x79, 0x45, 0xf9, 0x79, 0x27, 0xe9, 0x0a, 0x63, 0xdb,
|
||||
0xb0, 0x94, 0x76, 0xdc, 0xe2, 0xaa, 0x5c, 0x6d, 0x16, 0xb0, 0xd9, 0x23, 0x95, 0x7d, 0x24, 0xdd,
|
||||
0x9b, 0x85, 0xb4, 0x40, 0x8c, 0x36, 0xd9, 0x0f, 0xe8, 0x3f, 0xcd, 0xd1, 0x79, 0x06, 0x10, 0xc3,
|
||||
0x58, 0x03, 0xaa, 0xfb, 0x07, 0xed, 0x3d, 0x6b, 0x63, 0xbb, 0xb5, 0xb7, 0xd7, 0xde, 0x69, 0x5c,
|
||||
0x63, 0x0c, 0xea, 0x18, 0x41, 0xd9, 0x8c, 0x60, 0x19, 0x01, 0x93, 0xbe, 0x5f, 0x05, 0xcb, 0xb2,
|
||||
0x25, 0x68, 0x74, 0xf6, 0xa6, 0xa0, 0x39, 0xd6, 0x84, 0xa5, 0x83, 0x36, 0x05, 0x5d, 0x12, 0xf5,
|
||||
0xe6, 0x85, 0x0a, 0x27, 0x87, 0x2b, 0x54, 0x38, 0xba, 0x29, 0x22, 0xb9, 0x4f, 0x69, 0x36, 0x3f,
|
||||
0xcd, 0xc0, 0xf2, 0x14, 0x22, 0xce, 0xff, 0x25, 0xbd, 0x26, 0xa9, 0xd1, 0x54, 0x11, 0xa8, 0x78,
|
||||
0xf8, 0x2d, 0x58, 0x88, 0x4c, 0xbd, 0x29, 0xb9, 0xd4, 0x88, 0x10, 0x8a, 0xf8, 0x21, 0x2c, 0x6a,
|
||||
0x16, 0xe3, 0xd4, 0x0e, 0x65, 0x1a, 0x4a, 0x16, 0x30, 0x56, 0xa3, 0x3c, 0xcb, 0xa9, 0x5e, 0x0f,
|
||||
0xe8, 0xfa, 0x89, 0x8e, 0x88, 0xbd, 0xbf, 0xc9, 0xfe, 0xaa, 0x4f, 0x61, 0xca, 0x27, 0x18, 0x21,
|
||||
0xd9, 0x5b, 0x7d, 0xc1, 0x55, 0xf3, 0x7f, 0x38, 0x07, 0xec, 0xd3, 0x09, 0xf7, 0x2f, 0x31, 0xbf,
|
||||
0x37, 0x78, 0x51, 0xc2, 0x8b, 0x32, 0x8b, 0xb2, 0x2f, 0x95, 0xc3, 0x9f, 0x96, 0x43, 0x9f, 0x7f,
|
||||
0x71, 0x0e, 0x7d, 0xe1, 0x45, 0x39, 0xf4, 0xaf, 0x41, 0xcd, 0x39, 0x71, 0x3d, 0x21, 0x80, 0x84,
|
||||
0x6e, 0x12, 0x34, 0xe7, 0xee, 0xe4, 0xee, 0x55, 0xcd, 0xaa, 0x04, 0x0a, 0xcd, 0x24, 0x60, 0x9f,
|
||||
0xc4, 0x44, 0x7c, 0x70, 0x82, 0xf7, 0x3d, 0x74, 0xd1, 0xd3, 0x1e, 0x9c, 0x70, 0x69, 0x05, 0xa2,
|
||||
0x5f, 0x44, 0x15, 0x16, 0xf0, 0x80, 0xbd, 0x0e, 0xf5, 0xc0, 0x9b, 0x08, 0x55, 0x4f, 0x4d, 0x03,
|
||||
0xf9, 0x87, 0xab, 0x04, 0x3d, 0x50, 0xc1, 0x80, 0xc5, 0x49, 0xc0, 0xad, 0x91, 0x13, 0x04, 0xe2,
|
||||
0x80, 0xee, 0x7b, 0x6e, 0xe8, 0x7b, 0x43, 0xe9, 0xf2, 0x5d, 0x98, 0x04, 0x7c, 0x97, 0x30, 0x1b,
|
||||
0x84, 0x60, 0xef, 0xc5, 0x5d, 0x1a, 0xdb, 0x8e, 0x1f, 0x34, 0x01, 0xbb, 0xa4, 0x46, 0x8a, 0x1a,
|
||||
0x95, 0xed, 0xf8, 0x51, 0x5f, 0xc4, 0x47, 0x30, 0x95, 0xdb, 0x5f, 0x99, 0xce, 0xed, 0xff, 0x51,
|
||||
0x7a, 0x6e, 0x7f, 0x0d, 0xab, 0x7e, 0x24, 0xab, 0x9e, 0x5d, 0xe2, 0x6f, 0x94, 0xe2, 0x3f, 0x7b,
|
||||
0x65, 0xa1, 0xfe, 0x4d, 0xae, 0x2c, 0xcc, 0xa7, 0x5d, 0x59, 0x78, 0x17, 0x2a, 0x98, 0x4c, 0x6e,
|
||||
0x9d, 0x3a, 0x6e, 0xa8, 0x5c, 0xd8, 0x0d, 0x3d, 0xdb, 0x7c, 0x5b, 0x18, 0xd3, 0xe0, 0xab, 0x3f,
|
||||
0x83, 0xd9, 0xdb, 0x03, 0x0b, 0xbf, 0xc6, 0xdb, 0x03, 0x32, 0xe9, 0xfd, 0x01, 0x94, 0xd4, 0x3a,
|
||||
0x31, 0x06, 0xf9, 0x63, 0xdf, 0x1b, 0x29, 0xd7, 0x9e, 0xf8, 0x9b, 0xd5, 0x21, 0x1b, 0x7a, 0xb2,
|
||||
0x70, 0x36, 0xf4, 0x8c, 0xdf, 0x81, 0x8a, 0xc6, 0x6a, 0xec, 0x55, 0x72, 0x22, 0x08, 0x6d, 0x59,
|
||||
0x5a, 0xc9, 0x34, 0x8b, 0x65, 0x09, 0xed, 0x0c, 0x84, 0xbc, 0x19, 0x38, 0x3e, 0xc7, 0x7b, 0x3e,
|
||||
0x96, 0xcf, 0xcf, 0xb8, 0x1f, 0x28, 0x57, 0x6b, 0x23, 0x42, 0x98, 0x04, 0x37, 0xfe, 0x3a, 0x2c,
|
||||
0x26, 0xd6, 0x56, 0x8a, 0x88, 0xd7, 0x61, 0x0e, 0xe7, 0x4d, 0x85, 0xc2, 0x92, 0x59, 0xfc, 0x12,
|
||||
0x87, 0x17, 0x38, 0xc9, 0x4b, 0x6c, 0x8d, 0x7d, 0xef, 0x08, 0x1b, 0xc9, 0x98, 0x15, 0x09, 0x3b,
|
||||
0xf0, 0xbd, 0x23, 0xe3, 0xe7, 0x39, 0xc8, 0x6d, 0x7b, 0x63, 0x3d, 0xc3, 0x22, 0x33, 0x93, 0x61,
|
||||
0x21, 0x4d, 0x00, 0x2b, 0x52, 0xf1, 0xa5, 0xd6, 0x86, 0xfe, 0x51, 0xa5, 0xe6, 0xdf, 0x83, 0xba,
|
||||
0x90, 0x13, 0xa1, 0x27, 0x6c, 0xa8, 0x73, 0xdb, 0xa7, 0x9c, 0xfe, 0x1c, 0x6d, 0x3e, 0x7b, 0x14,
|
||||
0xf6, 0xbc, 0x2d, 0x82, 0xb3, 0x25, 0xc8, 0x45, 0x0a, 0x2c, 0xa2, 0xc5, 0xa7, 0x30, 0xae, 0x31,
|
||||
0xbb, 0xed, 0x52, 0xc6, 0x7a, 0xe4, 0x17, 0x7b, 0x07, 0x16, 0x93, 0xf5, 0x92, 0x28, 0x92, 0x1a,
|
||||
0x89, 0x5e, 0x31, 0xca, 0xa4, 0xeb, 0x20, 0xe4, 0x08, 0xd1, 0xc8, 0xb0, 0xec, 0x31, 0xe7, 0x88,
|
||||
0xd2, 0x84, 0x5e, 0x29, 0x21, 0xf4, 0x6e, 0x43, 0x25, 0x1c, 0x9e, 0x59, 0x63, 0xfb, 0x72, 0xe8,
|
||||
0xd9, 0x03, 0xb9, 0xbf, 0x21, 0x1c, 0x9e, 0x1d, 0x10, 0x84, 0x3d, 0x04, 0x18, 0x8d, 0xc7, 0x72,
|
||||
0xef, 0xa1, 0xbb, 0x31, 0x66, 0xe5, 0xdd, 0x83, 0x03, 0x62, 0x39, 0xb3, 0x3c, 0x1a, 0x8f, 0xe9,
|
||||
0x4f, 0xb6, 0x09, 0xf5, 0xd4, 0xbb, 0x38, 0xb7, 0x54, 0x32, 0x96, 0x37, 0x7e, 0x90, 0xb2, 0x39,
|
||||
0x6b, 0x7d, 0x1d, 0xb6, 0xf6, 0x5b, 0xc0, 0x7e, 0xc9, 0x1b, 0x31, 0x3d, 0x28, 0x47, 0xfd, 0xd3,
|
||||
0x2f, 0x94, 0x60, 0x7a, 0x65, 0x25, 0x71, 0xa1, 0xa4, 0x35, 0x18, 0xf8, 0x42, 0x2e, 0xd2, 0x81,
|
||||
0x19, 0x89, 0x7c, 0xd0, 0x4e, 0xcc, 0x16, 0xc9, 0x7d, 0xe3, 0x2f, 0x33, 0x50, 0xa0, 0xdb, 0x2d,
|
||||
0x6f, 0xc0, 0x3c, 0xd1, 0x47, 0xd9, 0x2a, 0x32, 0x42, 0x44, 0xe7, 0x6e, 0x4f, 0x26, 0xaa, 0x88,
|
||||
0x6d, 0xa1, 0xdd, 0xcc, 0xcb, 0x46, 0x2b, 0xaf, 0xdd, 0xce, 0xbb, 0x0d, 0xe5, 0xa8, 0x69, 0x8d,
|
||||
0x75, 0x4a, 0xaa, 0x65, 0xf6, 0x0a, 0xe4, 0x4f, 0xbd, 0xb1, 0xb2, 0xc5, 0x21, 0x9e, 0x49, 0x13,
|
||||
0xe1, 0x71, 0x5f, 0x44, 0x1b, 0xd4, 0x79, 0x69, 0x43, 0x46, 0x8d, 0x20, 0x1b, 0xcc, 0x8e, 0x71,
|
||||
0x2e, 0x65, 0x8c, 0x87, 0x30, 0x2f, 0xe4, 0x80, 0x16, 0xa9, 0xbd, 0xfa, 0xd0, 0x7c, 0x53, 0x68,
|
||||
0x78, 0xfd, 0xe1, 0x64, 0xc0, 0x75, 0x4f, 0x08, 0xa6, 0x4e, 0x48, 0xb8, 0x32, 0x0f, 0x8c, 0x3f,
|
||||
0xcc, 0x90, 0x7c, 0x11, 0xf5, 0xb2, 0x7b, 0x90, 0x17, 0xe7, 0xdb, 0x94, 0xa7, 0x2e, 0xca, 0x73,
|
||||
0x15, 0x74, 0x26, 0x52, 0xe0, 0x75, 0xd6, 0xc9, 0x28, 0x59, 0x7b, 0xcd, 0xac, 0xb8, 0x93, 0x51,
|
||||
0xe4, 0x4c, 0xf8, 0x8e, 0x1a, 0xd6, 0x94, 0x21, 0x4e, 0xa3, 0x8f, 0xb6, 0xe9, 0x03, 0x2d, 0x07,
|
||||
0x23, 0x9f, 0x38, 0x31, 0x95, 0x16, 0x38, 0x38, 0xe1, 0x5a, 0xee, 0xc5, 0x1f, 0x67, 0xa1, 0x96,
|
||||
0xe8, 0x11, 0x26, 0xa1, 0x88, 0x03, 0x80, 0xbc, 0xc0, 0x72, 0xbd, 0x41, 0x80, 0xa4, 0xa2, 0xae,
|
||||
0xcd, 0x53, 0x36, 0x31, 0x4f, 0x51, 0x4c, 0x3a, 0xa7, 0xc7, 0xa4, 0x1f, 0x41, 0x39, 0xbe, 0x91,
|
||||
0x99, 0xec, 0x92, 0x68, 0x4f, 0x65, 0xfb, 0xc6, 0x44, 0x71, 0x14, 0xbb, 0xa0, 0x47, 0xb1, 0xbf,
|
||||
0xa7, 0x05, 0x3d, 0xe7, 0xb0, 0x1a, 0x23, 0x6d, 0x46, 0x7f, 0x3d, 0x49, 0x11, 0x9f, 0x40, 0x45,
|
||||
0xeb, 0xbc, 0x1e, 0xdc, 0xcc, 0x24, 0x82, 0x9b, 0x51, 0x5e, 0x7e, 0x36, 0xce, 0xcb, 0x37, 0x7e,
|
||||
0x2f, 0x0b, 0x35, 0xb1, 0xbf, 0x1c, 0xf7, 0xe4, 0xc0, 0x1b, 0x3a, 0x7d, 0xf4, 0x0a, 0x47, 0x3b,
|
||||
0x4c, 0x2a, 0x5a, 0x6a, 0x9f, 0xc9, 0x2d, 0x46, 0x7a, 0x96, 0x7e, 0xfd, 0x88, 0x84, 0x74, 0x74,
|
||||
0xfd, 0xc8, 0x80, 0x9a, 0x10, 0x8c, 0x47, 0x76, 0xc0, 0xb5, 0xfb, 0xa2, 0x66, 0xe5, 0x98, 0xf3,
|
||||
0x75, 0x3b, 0x20, 0x09, 0xf9, 0x0e, 0x2c, 0x0a, 0x1a, 0xbc, 0x79, 0x31, 0x72, 0x86, 0x43, 0x87,
|
||||
0x28, 0xc9, 0xd5, 0xd0, 0x38, 0xe6, 0xdc, 0xb4, 0x43, 0xbe, 0x2b, 0x10, 0xf2, 0x7a, 0x69, 0x69,
|
||||
0xe0, 0x04, 0xf6, 0x51, 0x9c, 0x2a, 0x14, 0x7d, 0x63, 0x2c, 0xc7, 0xbe, 0xd0, 0x62, 0x39, 0x74,
|
||||
0x05, 0xab, 0x32, 0xb2, 0x2f, 0xa2, 0x58, 0xce, 0x14, 0x27, 0x15, 0xa7, 0x39, 0xc9, 0xf8, 0x2f,
|
||||
0x59, 0xa8, 0x68, 0x6c, 0xf9, 0x32, 0xa7, 0xeb, 0xad, 0x19, 0x2f, 0x7e, 0x59, 0x77, 0xd8, 0xbf,
|
||||
0x96, 0x6c, 0x12, 0x43, 0xbe, 0x74, 0x91, 0x55, 0x63, 0xe0, 0x1b, 0x50, 0x16, 0xbb, 0xee, 0x5d,
|
||||
0x74, 0x8a, 0xc9, 0x6b, 0xd8, 0x08, 0x38, 0x98, 0x1c, 0x29, 0xe4, 0x63, 0x44, 0x16, 0x62, 0xe4,
|
||||
0x63, 0x81, 0x7c, 0x5e, 0x7e, 0xe0, 0x87, 0x50, 0x95, 0xb5, 0xe2, 0x9a, 0xe2, 0x70, 0xe3, 0x5d,
|
||||
0x9f, 0x58, 0x6f, 0xb3, 0x42, 0xcd, 0xd1, 0xe2, 0xcb, 0x82, 0x8f, 0x55, 0xc1, 0xd2, 0x8b, 0x0a,
|
||||
0x3e, 0xa6, 0x0f, 0x63, 0x2b, 0x4a, 0xb9, 0xc4, 0x74, 0x03, 0x25, 0xc7, 0x1e, 0xc2, 0xa2, 0x12,
|
||||
0x57, 0x13, 0xd7, 0x76, 0x5d, 0x6f, 0xe2, 0xf6, 0xb9, 0x4a, 0xd8, 0x67, 0x12, 0x75, 0x18, 0x63,
|
||||
0x8c, 0x41, 0x74, 0xa3, 0x8b, 0xd2, 0x16, 0xee, 0x43, 0x81, 0xf4, 0x72, 0x52, 0x3e, 0xd2, 0x05,
|
||||
0x17, 0x91, 0xb0, 0x7b, 0x50, 0x20, 0xf5, 0x3c, 0x7b, 0xa5, 0xb0, 0x21, 0x02, 0xe3, 0x01, 0xcc,
|
||||
0xa3, 0x8a, 0xa9, 0x49, 0xdc, 0xe7, 0x69, 0x25, 0xc6, 0x12, 0xb0, 0x3d, 0xda, 0x44, 0x7a, 0x3a,
|
||||
0xcd, 0x7f, 0xcf, 0x41, 0x45, 0x03, 0x0b, 0xb1, 0x88, 0x09, 0x18, 0xd6, 0xc0, 0xb1, 0x47, 0x5c,
|
||||
0xc5, 0x1e, 0x6a, 0x66, 0x0d, 0xa1, 0x9b, 0x12, 0x28, 0x0e, 0x05, 0xfb, 0xec, 0xc4, 0xf2, 0x26,
|
||||
0xa1, 0x35, 0xe0, 0x27, 0x3e, 0xe7, 0x52, 0x59, 0xaa, 0xda, 0x67, 0x27, 0xfb, 0x93, 0x70, 0x13,
|
||||
0x61, 0x82, 0x4a, 0x30, 0xb5, 0x46, 0x25, 0x73, 0x06, 0x46, 0xf6, 0x45, 0x4c, 0x25, 0x13, 0x57,
|
||||
0x68, 0x8a, 0xf2, 0x51, 0xe2, 0x0a, 0x99, 0x2d, 0xd3, 0x92, 0xbc, 0x30, 0x2b, 0xc9, 0xdf, 0x83,
|
||||
0x15, 0x92, 0xe4, 0x52, 0x46, 0x58, 0x53, 0x2c, 0xb5, 0x84, 0x58, 0x39, 0x48, 0x4d, 0xff, 0x6a,
|
||||
0x88, 0x11, 0xa8, 0xfd, 0x11, 0x38, 0x3f, 0xa6, 0x1d, 0x95, 0x31, 0xc5, 0xc8, 0x64, 0xe5, 0x5d,
|
||||
0xe7, 0xc7, 0x5c, 0x50, 0x62, 0x60, 0x54, 0xa7, 0x94, 0x69, 0xa8, 0x23, 0xc7, 0x9d, 0xa6, 0xb4,
|
||||
0x2f, 0x92, 0x94, 0x65, 0x49, 0x69, 0x5f, 0xe8, 0x94, 0xef, 0xc3, 0xea, 0x88, 0x0f, 0x1c, 0x3b,
|
||||
0x59, 0xad, 0x15, 0x6b, 0x10, 0x4b, 0x84, 0xd6, 0xca, 0x74, 0xc9, 0x82, 0x14, 0xb3, 0xf1, 0x63,
|
||||
0x6f, 0x74, 0xe4, 0xd0, 0xe1, 0x49, 0xa1, 0xda, 0xbc, 0x59, 0x77, 0x27, 0xa3, 0x1f, 0x20, 0x58,
|
||||
0x14, 0x09, 0x8c, 0x1a, 0x54, 0xba, 0xa1, 0x37, 0x56, 0xcb, 0x5c, 0x87, 0x2a, 0x7d, 0xca, 0xeb,
|
||||
0x18, 0x37, 0xe0, 0x3a, 0xf2, 0x66, 0xcf, 0x1b, 0x7b, 0x43, 0xef, 0xe4, 0x32, 0xe1, 0x50, 0xfa,
|
||||
0x6f, 0x19, 0x58, 0x4c, 0x60, 0xe5, 0x3e, 0x7f, 0x8f, 0x36, 0x56, 0x94, 0x53, 0x4f, 0xec, 0xbc,
|
||||
0xa0, 0x1d, 0x3e, 0x44, 0x48, 0xbb, 0x4a, 0xe5, 0xd9, 0xb7, 0xe2, 0xbb, 0xa0, 0xaa, 0x20, 0xf1,
|
||||
0x76, 0x73, 0x96, 0xb7, 0x65, 0x79, 0x75, 0x4b, 0x54, 0x55, 0xf1, 0xff, 0xcb, 0x54, 0xe1, 0x81,
|
||||
0x1c, 0x72, 0x2e, 0x99, 0x0c, 0xa9, 0x3b, 0x9f, 0x54, 0x0f, 0x62, 0x8f, 0x54, 0x60, 0xfc, 0xab,
|
||||
0x0c, 0x40, 0xdc, 0x3b, 0x4c, 0xc7, 0x8c, 0x0e, 0x50, 0x7a, 0x66, 0x45, 0x3b, 0x2c, 0x5f, 0x85,
|
||||
0x6a, 0x94, 0x31, 0x16, 0x1f, 0xc9, 0x15, 0x05, 0x13, 0xe7, 0xf2, 0x5d, 0x98, 0x3f, 0x19, 0x7a,
|
||||
0x47, 0xa8, 0x3a, 0xc9, 0x03, 0x94, 0x2e, 0xa5, 0xd4, 0x09, 0xac, 0x8e, 0xc5, 0xf8, 0x00, 0xcf,
|
||||
0xa7, 0x26, 0x95, 0xe9, 0xc7, 0xb1, 0xf1, 0xfb, 0xd9, 0x28, 0x75, 0x26, 0x9e, 0x89, 0xe7, 0xdb,
|
||||
0x19, 0xdf, 0x26, 0x02, 0xfb, 0xbc, 0xc8, 0xc3, 0x27, 0x50, 0xf7, 0x49, 0x3a, 0x2a, 0xd1, 0x99,
|
||||
0x7f, 0x8e, 0xe8, 0xac, 0xf9, 0x89, 0x23, 0xf7, 0x4d, 0x68, 0xd8, 0x83, 0x33, 0xee, 0x87, 0x0e,
|
||||
0x3a, 0x6b, 0x51, 0x51, 0x93, 0xc9, 0x2a, 0x1a, 0x1c, 0x35, 0xa2, 0xbb, 0x30, 0x2f, 0xaf, 0x08,
|
||||
0x45, 0x94, 0xf2, 0xd1, 0x81, 0x18, 0x2c, 0x08, 0x8d, 0x7f, 0xab, 0x72, 0x75, 0x92, 0xab, 0xfb,
|
||||
0xfc, 0x59, 0xd1, 0x47, 0x98, 0x9d, 0x8d, 0xad, 0x48, 0x46, 0x92, 0x3e, 0x60, 0x29, 0x8f, 0x08,
|
||||
0x28, 0x3d, 0xc0, 0xc9, 0x69, 0xcd, 0xbf, 0xcc, 0xb4, 0x1a, 0x7f, 0x9a, 0x81, 0xe2, 0xb6, 0x37,
|
||||
0x16, 0x76, 0xb9, 0xd0, 0xe7, 0x70, 0x9b, 0x44, 0xd7, 0xf3, 0xe6, 0xc4, 0x67, 0x67, 0xf0, 0xfc,
|
||||
0xb4, 0xfc, 0x54, 0x7d, 0xa3, 0x96, 0xd4, 0x37, 0xbe, 0x07, 0x37, 0x30, 0x1a, 0xe1, 0x7b, 0x63,
|
||||
0xcf, 0x17, 0x5b, 0xd5, 0x1e, 0x92, 0xde, 0xe1, 0xb9, 0xe1, 0xa9, 0x92, 0x9d, 0xd7, 0x8f, 0x39,
|
||||
0x3f, 0xd0, 0x28, 0x76, 0x23, 0x02, 0xbc, 0x6b, 0x32, 0x0c, 0xcf, 0x2c, 0x32, 0x15, 0xa5, 0x62,
|
||||
0x44, 0x12, 0x75, 0x5e, 0x20, 0xda, 0x08, 0x47, 0xd5, 0xc8, 0xf8, 0x08, 0xca, 0x91, 0xd7, 0x81,
|
||||
0xbd, 0x05, 0xe5, 0x53, 0x6f, 0x2c, 0x5d, 0x13, 0x99, 0xc4, 0xd5, 0x05, 0x39, 0x6a, 0xb3, 0x74,
|
||||
0x4a, 0x7f, 0x04, 0xc6, 0xcf, 0x8b, 0x50, 0xec, 0xb8, 0x67, 0x9e, 0xd3, 0xc7, 0x6c, 0x9f, 0x11,
|
||||
0x1f, 0x79, 0xea, 0x9e, 0xa2, 0xf8, 0x1b, 0x23, 0xfa, 0xf1, 0xd3, 0x01, 0x39, 0x19, 0xd1, 0x8f,
|
||||
0x1e, 0x0d, 0x58, 0x86, 0x39, 0x5f, 0xbf, 0xfb, 0x5f, 0xf0, 0x31, 0xff, 0x30, 0x32, 0xda, 0x0a,
|
||||
0xda, 0x3d, 0x4f, 0x51, 0x17, 0xdd, 0x49, 0xc7, 0x29, 0xa3, 0xbb, 0x27, 0x65, 0x84, 0xe0, 0x84,
|
||||
0xdd, 0x84, 0xa2, 0xbc, 0x29, 0x40, 0x79, 0xd7, 0x94, 0x30, 0x28, 0x41, 0xc8, 0x0d, 0x3e, 0xa7,
|
||||
0x68, 0x52, 0xa4, 0x51, 0x09, 0x3b, 0x5d, 0x02, 0x37, 0x05, 0xaf, 0xdd, 0x86, 0x0a, 0xd1, 0x13,
|
||||
0x49, 0x49, 0xe6, 0xe7, 0x20, 0x08, 0x09, 0x52, 0x9e, 0xd0, 0x28, 0xa7, 0x3e, 0xa1, 0x81, 0xe9,
|
||||
0x5c, 0x91, 0x94, 0xa5, 0x21, 0x02, 0x3d, 0x9c, 0xa0, 0xc1, 0xd5, 0xfb, 0x31, 0xd2, 0xb8, 0xa7,
|
||||
0x6b, 0x54, 0xca, 0xb8, 0x7f, 0x0d, 0x6a, 0xc7, 0xf6, 0x70, 0x78, 0x64, 0xf7, 0x9f, 0x91, 0x4d,
|
||||
0x5a, 0x25, 0x37, 0x9c, 0x02, 0xa2, 0x51, 0x7a, 0x1b, 0x2a, 0xda, 0x2a, 0x63, 0xf2, 0x4d, 0xde,
|
||||
0x84, 0x78, 0x7d, 0xa7, 0x5d, 0x4d, 0xf5, 0x97, 0x70, 0x35, 0x69, 0x49, 0x48, 0xf3, 0xc9, 0x24,
|
||||
0xa4, 0x1b, 0x28, 0x4d, 0x65, 0xa2, 0x4a, 0x83, 0x6e, 0xe9, 0xdb, 0x83, 0x01, 0x26, 0xaa, 0xd0,
|
||||
0x93, 0x58, 0x38, 0x79, 0x84, 0x5f, 0x20, 0xa5, 0x96, 0x60, 0x44, 0x72, 0x8b, 0xfc, 0xa5, 0x63,
|
||||
0xdb, 0x19, 0x60, 0xd2, 0x27, 0x99, 0xb1, 0x45, 0x7b, 0x14, 0x1e, 0xd8, 0xce, 0x80, 0xdd, 0x81,
|
||||
0xaa, 0x42, 0xe3, 0xe9, 0xb8, 0x48, 0xf3, 0x2f, 0xd1, 0xe2, 0x4c, 0x34, 0xa0, 0x16, 0x51, 0x8c,
|
||||
0xe2, 0xbb, 0x50, 0x15, 0x49, 0x82, 0x7c, 0xf0, 0x2e, 0x06, 0xff, 0x43, 0x8e, 0x37, 0x9e, 0xea,
|
||||
0x8f, 0x6f, 0xc8, 0xb1, 0x4a, 0x2e, 0x55, 0xff, 0x63, 0xa6, 0x83, 0x49, 0x94, 0x42, 0x11, 0xa3,
|
||||
0x10, 0xcd, 0x4a, 0x42, 0x11, 0x93, 0xa4, 0x18, 0xa2, 0x21, 0x02, 0xf6, 0x91, 0x66, 0x48, 0x35,
|
||||
0x91, 0xf8, 0xe6, 0x54, 0xfd, 0x57, 0x98, 0x50, 0x82, 0x7b, 0x9d, 0x40, 0x9c, 0x32, 0x01, 0x77,
|
||||
0x07, 0x78, 0x01, 0xaa, 0x64, 0x96, 0x9d, 0xe0, 0x29, 0x01, 0x7e, 0xb5, 0x16, 0x56, 0x0b, 0xaa,
|
||||
0xfa, 0x30, 0x59, 0x09, 0xf2, 0xfb, 0x07, 0xed, 0xbd, 0xc6, 0x35, 0x56, 0x81, 0x62, 0xb7, 0xdd,
|
||||
0xeb, 0xed, 0xb4, 0x37, 0x1b, 0x19, 0x56, 0x85, 0x52, 0x74, 0x8d, 0x23, 0x2b, 0xbe, 0x5a, 0x1b,
|
||||
0x1b, 0xed, 0x83, 0x5e, 0x7b, 0xb3, 0x91, 0xfb, 0x7e, 0xbe, 0x94, 0x6d, 0xe4, 0x8c, 0xbf, 0xc8,
|
||||
0x41, 0x45, 0x9b, 0x85, 0xe7, 0x0b, 0xe3, 0x5b, 0x00, 0x68, 0xd2, 0xc4, 0x79, 0x4c, 0x79, 0xb3,
|
||||
0x2c, 0x20, 0xb4, 0xf8, 0xba, 0xb3, 0x3c, 0x47, 0xcf, 0x3f, 0x28, 0x67, 0xf9, 0x6b, 0x50, 0xa3,
|
||||
0x97, 0x14, 0xf4, 0x70, 0x5d, 0xc1, 0xac, 0x12, 0x50, 0x8a, 0x6a, 0xbc, 0x07, 0x86, 0x44, 0x78,
|
||||
0x43, 0x40, 0xde, 0xab, 0x26, 0x10, 0xde, 0x11, 0xc0, 0x0b, 0x1e, 0x81, 0x37, 0x3c, 0xe3, 0x44,
|
||||
0x41, 0x1a, 0x61, 0x45, 0xc2, 0x7a, 0xf2, 0x22, 0x9a, 0x94, 0x87, 0xda, 0x45, 0xa4, 0x82, 0x59,
|
||||
0x25, 0xa0, 0x6c, 0xe8, 0x1d, 0xc5, 0x40, 0x25, 0x64, 0xa0, 0xd5, 0x59, 0x6e, 0x48, 0x30, 0xcf,
|
||||
0xce, 0x8c, 0x3f, 0xab, 0x8c, 0x8c, 0xf1, 0x9d, 0xd9, 0x72, 0x2f, 0xf6, 0x6b, 0xb1, 0xb7, 0x80,
|
||||
0x8d, 0xc6, 0x63, 0x2b, 0xc5, 0xd3, 0x94, 0x37, 0xe7, 0x47, 0xe3, 0x71, 0x4f, 0x73, 0xc4, 0xfc,
|
||||
0x0a, 0x9c, 0x60, 0x5f, 0x02, 0x6b, 0x89, 0x0d, 0x8c, 0x5d, 0x8c, 0x5c, 0xa8, 0xb1, 0x58, 0xce,
|
||||
0xe8, 0x62, 0x39, 0x45, 0xfa, 0x65, 0x53, 0xa5, 0xdf, 0xf3, 0xe4, 0x84, 0xb1, 0x05, 0x95, 0x03,
|
||||
0xed, 0x9d, 0x96, 0x3b, 0xe2, 0x84, 0x50, 0x2f, 0xb4, 0xd0, 0xd9, 0x41, 0xce, 0x2d, 0x5f, 0x3e,
|
||||
0xcc, 0xa2, 0xf5, 0x26, 0xab, 0xf5, 0xc6, 0xf8, 0x97, 0x19, 0xba, 0x03, 0x1f, 0x75, 0x3e, 0x7e,
|
||||
0x1a, 0x46, 0xc5, 0x81, 0xe2, 0xfb, 0x82, 0x15, 0x15, 0xff, 0x91, 0x57, 0xfd, 0xb0, 0x6b, 0x96,
|
||||
0x77, 0x7c, 0x1c, 0x70, 0x75, 0xf3, 0xa5, 0x82, 0xb0, 0x7d, 0x04, 0x29, 0xe5, 0x5b, 0x68, 0xf8,
|
||||
0x0e, 0xd5, 0x1f, 0xc8, 0x1b, 0x30, 0x42, 0xf9, 0xde, 0xb5, 0x2f, 0x64, 0xab, 0x81, 0x50, 0x41,
|
||||
0xa4, 0xa3, 0x5a, 0xdd, 0xf7, 0x89, 0xbe, 0x8d, 0x7f, 0x26, 0xaf, 0x34, 0x4e, 0xcf, 0xef, 0x7d,
|
||||
0x28, 0x45, 0xb5, 0x26, 0x4f, 0x58, 0x45, 0x19, 0xe1, 0xc5, 0x39, 0x8e, 0x56, 0x79, 0xa2, 0xc7,
|
||||
0xb4, 0xb9, 0x30, 0xd8, 0xd0, 0xd1, 0x7a, 0xfd, 0x36, 0xb0, 0x63, 0xc7, 0x9f, 0x26, 0xa6, 0xcd,
|
||||
0xd6, 0x40, 0x8c, 0x46, 0x6d, 0x1c, 0xc2, 0xa2, 0x92, 0x12, 0x9a, 0x45, 0x90, 0x5c, 0xbc, 0xcc,
|
||||
0x0b, 0x84, 0x7c, 0x76, 0x46, 0xc8, 0x1b, 0x3f, 0xcb, 0x43, 0x51, 0xbd, 0x79, 0x94, 0xf6, 0x4e,
|
||||
0x4f, 0x39, 0xf9, 0x4e, 0x4f, 0x33, 0xf1, 0xa6, 0x03, 0x2e, 0xbd, 0x3c, 0xef, 0xef, 0x4e, 0x1f,
|
||||
0xd9, 0x9a, 0xd3, 0x3c, 0x71, 0x6c, 0xaf, 0x40, 0x7e, 0x6c, 0x87, 0xa7, 0xe8, 0x20, 0x23, 0xe6,
|
||||
0xc1, 0x6f, 0xe5, 0x4c, 0x2f, 0x24, 0x9d, 0xe9, 0x69, 0x6f, 0x1a, 0x91, 0x4a, 0x3a, 0xf3, 0xa6,
|
||||
0xd1, 0x0d, 0x20, 0xfd, 0x42, 0xcb, 0x87, 0x29, 0x21, 0x40, 0x9c, 0x45, 0x49, 0x75, 0xa4, 0x34,
|
||||
0xad, 0x8e, 0xbc, 0xb4, 0xaa, 0xf0, 0x1e, 0xcc, 0xd1, 0x7d, 0x60, 0x79, 0xaf, 0x49, 0x1d, 0x28,
|
||||
0x72, 0x0e, 0xd5, 0xff, 0x94, 0x04, 0x6b, 0x4a, 0x5a, 0xfd, 0x81, 0x90, 0x4a, 0xe2, 0x81, 0x10,
|
||||
0xdd, 0xc9, 0x5f, 0x4d, 0x3a, 0xf9, 0xef, 0x41, 0x23, 0x9a, 0x50, 0x74, 0x99, 0xb9, 0x81, 0xbc,
|
||||
0xd1, 0x51, 0x57, 0x70, 0x21, 0x25, 0xf7, 0x82, 0xf8, 0x40, 0xac, 0x27, 0x0e, 0x44, 0x21, 0xc3,
|
||||
0x5a, 0x61, 0xc8, 0x47, 0xe3, 0x50, 0x1e, 0x88, 0x98, 0xf3, 0xad, 0x77, 0x30, 0x79, 0xe3, 0xaf,
|
||||
0x06, 0xe5, 0xce, 0x9e, 0xb5, 0xb5, 0xd3, 0x79, 0xb2, 0xdd, 0x6b, 0x64, 0xc4, 0x67, 0xf7, 0x70,
|
||||
0x63, 0xa3, 0xdd, 0xde, 0xc4, 0x13, 0x07, 0x60, 0x6e, 0xab, 0xd5, 0x11, 0xa7, 0x4f, 0xce, 0xf8,
|
||||
0x69, 0x16, 0x2a, 0x5a, 0xf5, 0xec, 0xfd, 0x68, 0x56, 0xe8, 0x0d, 0x89, 0x5b, 0xb3, 0x5d, 0x78,
|
||||
0xa0, 0x44, 0xb1, 0x36, 0x2d, 0xd1, 0x0b, 0x4e, 0xd9, 0x2b, 0x5f, 0x70, 0x62, 0x6f, 0xc0, 0xbc,
|
||||
0x4d, 0x35, 0x44, 0xb3, 0x20, 0xdd, 0xc1, 0x12, 0x2c, 0x27, 0x01, 0xb3, 0xc0, 0xe2, 0xf3, 0x44,
|
||||
0xd0, 0xe5, 0x55, 0xe2, 0x55, 0x74, 0xa4, 0xe0, 0x64, 0x15, 0x8f, 0x6d, 0x67, 0x38, 0xf1, 0xb9,
|
||||
0x0c, 0xdf, 0x46, 0x27, 0x33, 0x41, 0x4d, 0x85, 0x36, 0x3e, 0x00, 0x88, 0xfb, 0x9c, 0x9c, 0x9c,
|
||||
0x6b, 0xc9, 0xc9, 0xc9, 0x68, 0x93, 0x93, 0x35, 0x36, 0x49, 0x8c, 0xc8, 0x89, 0x8e, 0x22, 0xd5,
|
||||
0xef, 0x80, 0xf2, 0x48, 0x59, 0x98, 0x87, 0x39, 0x1e, 0xf2, 0x50, 0xdd, 0x8d, 0x5c, 0x90, 0x98,
|
||||
0x4e, 0x84, 0x50, 0x57, 0x95, 0xe3, 0x5a, 0x62, 0x69, 0x24, 0x59, 0x72, 0x5a, 0x1a, 0x49, 0x52,
|
||||
0x33, 0xc2, 0x1b, 0x6b, 0xd0, 0xdc, 0xe4, 0xa2, 0xb6, 0xd6, 0x70, 0x38, 0xd5, 0x1d, 0xe3, 0x06,
|
||||
0x5c, 0x4f, 0xc1, 0x49, 0x27, 0xc4, 0xa7, 0xb0, 0xdc, 0xa2, 0x6b, 0x90, 0xbf, 0xaa, 0xbb, 0x18,
|
||||
0x46, 0x13, 0x56, 0xa6, 0xab, 0x94, 0x8d, 0x6d, 0xc1, 0xc2, 0x26, 0x3f, 0x9a, 0x9c, 0xec, 0xf0,
|
||||
0xb3, 0xb8, 0x21, 0x06, 0xf9, 0xe0, 0xd4, 0x3b, 0x97, 0xf3, 0x83, 0x7f, 0x8b, 0x3d, 0x3c, 0x14,
|
||||
0x34, 0x56, 0x30, 0xe6, 0x7d, 0xe5, 0x11, 0x45, 0x48, 0x77, 0xcc, 0xfb, 0xc6, 0xfb, 0xc0, 0xf4,
|
||||
0x7a, 0xe4, 0x7c, 0x09, 0x2b, 0x61, 0x72, 0x64, 0x05, 0x97, 0x41, 0xc8, 0x47, 0xea, 0x89, 0x12,
|
||||
0x08, 0x26, 0x47, 0x5d, 0x82, 0x18, 0x77, 0xa1, 0x7a, 0x60, 0x5f, 0x9a, 0xfc, 0x4b, 0x79, 0xcb,
|
||||
0x60, 0x15, 0x8a, 0x63, 0xfb, 0x52, 0x88, 0x81, 0x28, 0x38, 0x82, 0x68, 0xe3, 0x8f, 0xf2, 0x30,
|
||||
0x47, 0x94, 0xec, 0x0e, 0xbd, 0x22, 0xe8, 0xb8, 0xb8, 0x0d, 0x95, 0xa0, 0xd4, 0x40, 0x33, 0xb2,
|
||||
0x34, 0x3b, 0x2b, 0x4b, 0xa5, 0x03, 0x4d, 0xbd, 0x9e, 0xa0, 0xdc, 0xd8, 0xee, 0x64, 0xa4, 0x9e,
|
||||
0x4c, 0x60, 0x37, 0xa1, 0x1c, 0x5f, 0xe7, 0xca, 0xc7, 0xaf, 0x44, 0xd2, 0x25, 0xae, 0x64, 0xa0,
|
||||
0x31, 0xb6, 0x45, 0xa8, 0x77, 0xea, 0x88, 0x90, 0xe2, 0x52, 0x07, 0xa5, 0x1a, 0x3c, 0x45, 0x75,
|
||||
0x7f, 0x25, 0x69, 0xf0, 0xcc, 0x18, 0x36, 0xa5, 0x17, 0x1b, 0x36, 0xe4, 0x59, 0x7b, 0x8e, 0x61,
|
||||
0x03, 0x2f, 0x61, 0xd8, 0xbc, 0x44, 0x90, 0xef, 0x3a, 0x94, 0xf0, 0xdc, 0xd7, 0xa4, 0xa7, 0x38,
|
||||
0xef, 0x85, 0xf4, 0xfc, 0x50, 0x53, 0xfd, 0x29, 0xc3, 0xe0, 0x46, 0xbc, 0x4d, 0x4c, 0xfe, 0xe5,
|
||||
0xaf, 0x27, 0x78, 0xf2, 0x05, 0x14, 0x25, 0x54, 0x30, 0xb4, 0x6b, 0x8f, 0xd4, 0x03, 0x34, 0xf8,
|
||||
0xb7, 0x98, 0x36, 0x7c, 0x35, 0xe3, 0xcb, 0x89, 0xe3, 0xf3, 0x81, 0x7a, 0xe6, 0xc0, 0xc1, 0x3d,
|
||||
0x2a, 0x20, 0x62, 0x80, 0xc2, 0x0c, 0x71, 0xbd, 0x73, 0x57, 0x5e, 0x72, 0x2e, 0x3a, 0xc1, 0x53,
|
||||
0xf1, 0x69, 0x30, 0x68, 0xe0, 0x13, 0x54, 0x63, 0xcf, 0x57, 0x87, 0x93, 0xf1, 0xb3, 0x0c, 0x34,
|
||||
0xe4, 0xee, 0x8a, 0x70, 0xba, 0x15, 0x50, 0xb8, 0x2a, 0x20, 0xfe, 0xfc, 0x47, 0x0b, 0x0c, 0xa8,
|
||||
0xa1, 0xf3, 0x23, 0x3a, 0xa9, 0xc8, 0x79, 0x53, 0x11, 0xc0, 0x2d, 0x79, 0x5a, 0xbd, 0x02, 0x15,
|
||||
0x95, 0x8e, 0x39, 0x72, 0x86, 0xea, 0x41, 0x58, 0xca, 0xc7, 0xdc, 0x75, 0x86, 0xea, 0xa0, 0xf3,
|
||||
0x6d, 0x79, 0x9f, 0x2a, 0x83, 0x07, 0x9d, 0x69, 0x87, 0xdc, 0xf8, 0x4f, 0x19, 0x58, 0xd0, 0x86,
|
||||
0x22, 0xf7, 0xed, 0xc7, 0x50, 0x8d, 0xde, 0x7e, 0xe3, 0x91, 0xe6, 0xb5, 0x9a, 0x14, 0x34, 0x71,
|
||||
0xb1, 0x4a, 0x3f, 0x82, 0x04, 0xa2, 0x33, 0x03, 0xfb, 0x12, 0xfb, 0x1b, 0x4c, 0x46, 0xca, 0xb8,
|
||||
0x19, 0xd8, 0x97, 0x5b, 0x9c, 0x77, 0x27, 0x23, 0x61, 0xba, 0x9e, 0x73, 0xfe, 0x2c, 0x22, 0x20,
|
||||
0x9d, 0x0b, 0x04, 0x4c, 0x52, 0x18, 0x50, 0x1b, 0x79, 0x6e, 0x78, 0x1a, 0x91, 0x48, 0xad, 0x13,
|
||||
0x81, 0x44, 0x63, 0xfc, 0x79, 0x16, 0x16, 0xc9, 0xc5, 0x26, 0x5d, 0x9b, 0x52, 0x74, 0x35, 0x61,
|
||||
0x8e, 0xbc, 0x8d, 0x24, 0xbc, 0xb6, 0xaf, 0x99, 0xf2, 0x9b, 0xbd, 0xf7, 0x92, 0x6e, 0x41, 0x75,
|
||||
0x65, 0xeb, 0x8a, 0xe9, 0xcf, 0xcd, 0x4e, 0xff, 0xd5, 0xd3, 0x9b, 0x16, 0x71, 0x2b, 0xa4, 0x45,
|
||||
0xdc, 0x5e, 0x26, 0xce, 0x35, 0x73, 0xaf, 0xa9, 0x28, 0x69, 0xb4, 0x7b, 0x4d, 0xef, 0xc3, 0x6a,
|
||||
0x82, 0x06, 0xa5, 0xb5, 0x73, 0xec, 0x70, 0x75, 0x87, 0x7c, 0x49, 0xa3, 0xee, 0x2a, 0xdc, 0x7a,
|
||||
0x11, 0x0a, 0x41, 0xdf, 0x1b, 0x73, 0x63, 0x05, 0x96, 0x92, 0xb3, 0x2a, 0x8f, 0x89, 0x3f, 0xc8,
|
||||
0x40, 0x53, 0xe6, 0x47, 0x38, 0xee, 0xc9, 0xb6, 0x13, 0x84, 0x9e, 0x1f, 0xbd, 0x91, 0x76, 0x0b,
|
||||
0x20, 0x08, 0x6d, 0x5f, 0x5a, 0x9b, 0xa4, 0x07, 0x97, 0x11, 0x82, 0x96, 0xe4, 0x75, 0x28, 0x71,
|
||||
0x77, 0x40, 0x48, 0xe2, 0x86, 0x22, 0x77, 0x07, 0xca, 0x0e, 0x9d, 0xd1, 0xbf, 0x6b, 0x49, 0xf3,
|
||||
0x42, 0x5e, 0xb0, 0x14, 0xb3, 0xc3, 0xcf, 0xf0, 0xe0, 0xcd, 0x47, 0x17, 0x2c, 0x77, 0xed, 0x0b,
|
||||
0xcc, 0x36, 0x0c, 0x8c, 0x7f, 0x9c, 0x85, 0xf9, 0xb8, 0x7f, 0x74, 0x3b, 0x3b, 0x21, 0xbf, 0x65,
|
||||
0xaf, 0x62, 0xf9, 0x7d, 0x47, 0xb2, 0x83, 0x23, 0xf4, 0x77, 0xcd, 0xf1, 0x58, 0xa2, 0xcd, 0xd9,
|
||||
0x71, 0x99, 0x01, 0x15, 0x45, 0xe1, 0x4d, 0x42, 0xed, 0xa9, 0xa2, 0x32, 0x91, 0xec, 0x4f, 0x42,
|
||||
0x61, 0x70, 0x09, 0xcb, 0xd3, 0x71, 0xa5, 0xc9, 0x53, 0xb0, 0x47, 0x61, 0x07, 0x5f, 0x40, 0x16,
|
||||
0x60, 0x51, 0x8c, 0x16, 0x52, 0x50, 0x09, 0xfa, 0x06, 0xe9, 0xd9, 0xb4, 0x72, 0xa8, 0x63, 0xeb,
|
||||
0x4a, 0x28, 0x3d, 0x06, 0x19, 0x29, 0xa1, 0xaf, 0x40, 0x85, 0x2a, 0x8f, 0xaf, 0xb1, 0xe5, 0xcd,
|
||||
0x32, 0xb6, 0x80, 0x78, 0xe9, 0x04, 0xf2, 0x26, 0x09, 0xd3, 0x17, 0xa8, 0x29, 0x4c, 0x3f, 0xf8,
|
||||
0x07, 0x19, 0xb8, 0x9e, 0xb2, 0x6c, 0x72, 0x97, 0x6f, 0xc0, 0xc2, 0x71, 0x84, 0x54, 0xb3, 0x4b,
|
||||
0x5b, 0x7d, 0x45, 0x89, 0xd5, 0xe4, 0x9c, 0x9a, 0x8d, 0xe3, 0x24, 0x20, 0x36, 0xba, 0x68, 0x05,
|
||||
0x13, 0x37, 0x15, 0xd1, 0xe8, 0xa2, 0x65, 0x24, 0x7b, 0xe7, 0x00, 0xd6, 0xda, 0x17, 0x42, 0x62,
|
||||
0x6c, 0xe8, 0x4f, 0x78, 0x2b, 0x36, 0x4a, 0x3a, 0x98, 0x33, 0x2f, 0xe5, 0x60, 0x1e, 0xd0, 0x85,
|
||||
0xac, 0xa8, 0xae, 0x6f, 0x53, 0x09, 0x1e, 0xa0, 0xa2, 0x0c, 0x3d, 0x41, 0xae, 0x6e, 0x4b, 0xf6,
|
||||
0xa3, 0xa7, 0xc7, 0x8d, 0x00, 0xe6, 0x77, 0x27, 0xc3, 0xd0, 0x89, 0x5f, 0x23, 0x67, 0xef, 0xc9,
|
||||
0x32, 0xd8, 0x8e, 0x9a, 0xb5, 0xd4, 0x86, 0x20, 0x6a, 0x08, 0x27, 0x6b, 0x24, 0x2a, 0xb2, 0x66,
|
||||
0xdb, 0x9b, 0x1f, 0x25, 0x5b, 0x30, 0xae, 0xc3, 0x6a, 0xfc, 0x45, 0xd3, 0xa6, 0x8e, 0x9a, 0x7f,
|
||||
0x91, 0xa1, 0xd4, 0xe6, 0xe4, 0xcb, 0xe8, 0xac, 0x0d, 0x8b, 0x81, 0xe3, 0x9e, 0x0c, 0xb9, 0x5e,
|
||||
0x7d, 0x20, 0x27, 0x61, 0x39, 0xd9, 0x37, 0xf9, 0x7a, 0xba, 0xb9, 0x40, 0x25, 0xe2, 0xda, 0x02,
|
||||
0xb6, 0x7e, 0x55, 0x27, 0x63, 0xb6, 0x98, 0x9a, 0x8d, 0xd9, 0xce, 0x77, 0xa0, 0x9e, 0x6c, 0x88,
|
||||
0x7d, 0x28, 0x2f, 0x23, 0xc6, 0xbd, 0xca, 0x4d, 0xdd, 0x2b, 0x8b, 0x19, 0xa2, 0x12, 0xcf, 0x7d,
|
||||
0x60, 0xfc, 0xc3, 0x0c, 0x34, 0x4d, 0x2e, 0x38, 0x57, 0xeb, 0xa5, 0xe2, 0x99, 0x8f, 0x67, 0x6a,
|
||||
0xbd, 0x7a, 0xac, 0xea, 0x8e, 0xa3, 0xea, 0xd1, 0xdb, 0x57, 0x2e, 0xc6, 0xf6, 0xb5, 0x99, 0x11,
|
||||
0xad, 0x97, 0x60, 0x8e, 0x48, 0x8c, 0x55, 0x58, 0x96, 0xfd, 0x51, 0x7d, 0x89, 0xa3, 0x87, 0x89,
|
||||
0x16, 0x13, 0xd1, 0xc3, 0x35, 0x68, 0xd2, 0x53, 0x77, 0xfa, 0x20, 0x64, 0xc1, 0x4d, 0x60, 0xbb,
|
||||
0x76, 0xdf, 0xf6, 0x3d, 0xcf, 0x3d, 0xe0, 0xbe, 0x4c, 0x14, 0x45, 0x0d, 0x13, 0x83, 0x6b, 0x4a,
|
||||
0x15, 0xa6, 0x2f, 0xf5, 0x40, 0x9b, 0xe7, 0xaa, 0xbc, 0x18, 0xfa, 0x32, 0x4c, 0x58, 0x5c, 0xb7,
|
||||
0x9f, 0x71, 0x55, 0x93, 0x9a, 0xa2, 0x4f, 0xa0, 0x32, 0x8e, 0x2a, 0x55, 0xf3, 0xae, 0x6e, 0x2c,
|
||||
0xcf, 0x36, 0x6b, 0xea, 0xd4, 0xc6, 0x63, 0x58, 0x4a, 0xd6, 0x29, 0x45, 0xc7, 0x1a, 0x94, 0x46,
|
||||
0x12, 0x26, 0x7b, 0x17, 0x7d, 0x1b, 0x3f, 0x29, 0x41, 0x51, 0xda, 0x73, 0xec, 0x01, 0xe4, 0xfb,
|
||||
0x2a, 0x37, 0x29, 0x7e, 0x08, 0x43, 0x62, 0xd5, 0xff, 0x1b, 0x98, 0xa1, 0x24, 0xe8, 0xd8, 0x27,
|
||||
0x50, 0x4f, 0x46, 0x45, 0xa7, 0xae, 0x43, 0x26, 0xc3, 0x99, 0xb5, 0xfe, 0x54, 0xfc, 0xab, 0x1c,
|
||||
0x1f, 0x8e, 0xa4, 0x33, 0x94, 0x4e, 0xb5, 0xd3, 0xd3, 0x73, 0x85, 0xbe, 0x1d, 0x9c, 0xda, 0xd6,
|
||||
0xe3, 0xf7, 0x3f, 0x90, 0xf7, 0x21, 0x2b, 0x08, 0xec, 0x9e, 0xda, 0x8f, 0xdf, 0xff, 0x60, 0x5a,
|
||||
0x93, 0xa6, 0x2b, 0x71, 0xba, 0x26, 0xbd, 0x04, 0x05, 0x7a, 0x89, 0x8c, 0x92, 0x4c, 0xe8, 0x83,
|
||||
0x3d, 0x82, 0x25, 0x69, 0xb6, 0x5a, 0x32, 0x1d, 0x98, 0xa4, 0x60, 0x89, 0xee, 0xe0, 0x48, 0x5c,
|
||||
0x17, 0x51, 0xe4, 0x1b, 0x5a, 0x81, 0xb9, 0xd3, 0xf8, 0x59, 0xb9, 0x9a, 0x29, 0xbf, 0x8c, 0x3f,
|
||||
0x2f, 0x40, 0x45, 0x9b, 0x14, 0x56, 0x85, 0x92, 0xd9, 0xee, 0xb6, 0xcd, 0xcf, 0xda, 0x9b, 0x8d,
|
||||
0x6b, 0xec, 0x1e, 0xbc, 0xde, 0xd9, 0xdb, 0xd8, 0x37, 0xcd, 0xf6, 0x46, 0xcf, 0xda, 0x37, 0x2d,
|
||||
0xf5, 0x46, 0xca, 0x41, 0xeb, 0x8b, 0xdd, 0xf6, 0x5e, 0xcf, 0xda, 0x6c, 0xf7, 0x5a, 0x9d, 0x9d,
|
||||
0x6e, 0x23, 0xc3, 0x6e, 0x42, 0x33, 0xa6, 0x54, 0xe8, 0xd6, 0xee, 0xfe, 0xe1, 0x5e, 0xaf, 0x91,
|
||||
0x65, 0xb7, 0xe1, 0xc6, 0x56, 0x67, 0xaf, 0xb5, 0x63, 0xc5, 0x34, 0x1b, 0x3b, 0xbd, 0xcf, 0xac,
|
||||
0xf6, 0x6f, 0x1f, 0x74, 0xcc, 0x2f, 0x1a, 0xb9, 0x34, 0x02, 0x61, 0x8c, 0xab, 0x1a, 0xf2, 0xec,
|
||||
0x3a, 0x2c, 0x13, 0x01, 0x15, 0xb1, 0x7a, 0xfb, 0xfb, 0x56, 0x77, 0x7f, 0x7f, 0xaf, 0x51, 0x60,
|
||||
0x0b, 0x50, 0xeb, 0xec, 0x7d, 0xd6, 0xda, 0xe9, 0x6c, 0x5a, 0x66, 0xbb, 0xb5, 0xb3, 0xdb, 0x98,
|
||||
0x63, 0x8b, 0x30, 0x3f, 0x4d, 0x57, 0x14, 0x55, 0x28, 0xba, 0xfd, 0xbd, 0xce, 0xfe, 0x9e, 0xf5,
|
||||
0x59, 0xdb, 0xec, 0x76, 0xf6, 0xf7, 0x1a, 0x25, 0xb6, 0x02, 0x2c, 0x89, 0xda, 0xde, 0x6d, 0x6d,
|
||||
0x34, 0xca, 0x6c, 0x19, 0x16, 0x92, 0xf0, 0xa7, 0xed, 0x2f, 0x1a, 0xc0, 0x9a, 0xb0, 0x44, 0x1d,
|
||||
0xb3, 0xd6, 0xdb, 0x3b, 0xfb, 0x9f, 0x5b, 0xbb, 0x9d, 0xbd, 0xce, 0xee, 0xe1, 0x6e, 0xa3, 0x82,
|
||||
0x8f, 0x30, 0xb5, 0xdb, 0x56, 0x67, 0xaf, 0x7b, 0xb8, 0xb5, 0xd5, 0xd9, 0xe8, 0xb4, 0xf7, 0x7a,
|
||||
0x8d, 0x2a, 0xb5, 0x9c, 0x36, 0xf0, 0x9a, 0x28, 0x20, 0xef, 0x0c, 0x58, 0x9b, 0x9d, 0x6e, 0x6b,
|
||||
0x7d, 0xa7, 0xbd, 0xd9, 0xa8, 0xb3, 0x5b, 0x70, 0xbd, 0xd7, 0xde, 0x3d, 0xd8, 0x37, 0x5b, 0xe6,
|
||||
0x17, 0xea, 0x4e, 0x81, 0xb5, 0xd5, 0xea, 0xec, 0x1c, 0x9a, 0xed, 0xc6, 0x3c, 0x7b, 0x15, 0x6e,
|
||||
0x99, 0xed, 0x4f, 0x0f, 0x3b, 0x66, 0x7b, 0xd3, 0xda, 0xdb, 0xdf, 0x6c, 0x5b, 0x5b, 0xed, 0x56,
|
||||
0xef, 0xd0, 0x6c, 0x5b, 0xbb, 0x9d, 0x6e, 0xb7, 0xb3, 0xf7, 0xa4, 0xd1, 0x60, 0xaf, 0xc3, 0x9d,
|
||||
0x88, 0x24, 0xaa, 0x60, 0x8a, 0x6a, 0x41, 0x8c, 0x4f, 0x2d, 0xe9, 0x5e, 0xfb, 0xb7, 0x7b, 0xd6,
|
||||
0x41, 0xbb, 0x6d, 0x36, 0x18, 0x5b, 0x83, 0x95, 0xb8, 0x79, 0x6a, 0x40, 0xb6, 0xbd, 0x28, 0x70,
|
||||
0x07, 0x6d, 0x73, 0xb7, 0xb5, 0x27, 0x16, 0x38, 0x81, 0x5b, 0x12, 0xdd, 0x8e, 0x71, 0xd3, 0xdd,
|
||||
0x5e, 0x66, 0x0c, 0xea, 0xda, 0xaa, 0x6c, 0xb5, 0xcc, 0xc6, 0x0a, 0x9b, 0x87, 0xca, 0xee, 0xc1,
|
||||
0x81, 0xd5, 0xeb, 0xec, 0xb6, 0xf7, 0x0f, 0x7b, 0x8d, 0x55, 0xb6, 0x0c, 0x8d, 0xce, 0x5e, 0xaf,
|
||||
0x6d, 0x8a, 0xb5, 0x56, 0x45, 0xff, 0x57, 0x91, 0x2d, 0xc1, 0xbc, 0xea, 0xa9, 0x82, 0xfe, 0xa2,
|
||||
0xc8, 0x56, 0x81, 0x1d, 0xee, 0x99, 0xed, 0xd6, 0xa6, 0x98, 0xb8, 0x08, 0xf1, 0xbf, 0x8b, 0x32,
|
||||
0x42, 0xf2, 0xb3, 0x5c, 0x74, 0x58, 0xc7, 0x29, 0x07, 0xc9, 0x47, 0x46, 0xab, 0xda, 0xe3, 0xa0,
|
||||
0x2f, 0x7a, 0xfe, 0x5b, 0x33, 0xad, 0x72, 0x33, 0xa6, 0xd5, 0x8c, 0xed, 0x5e, 0xd3, 0x75, 0xbf,
|
||||
0xd7, 0xa0, 0x36, 0xa2, 0x07, 0x47, 0xe5, 0xc3, 0x82, 0x20, 0xf3, 0x6f, 0x08, 0x48, 0xaf, 0x0a,
|
||||
0xce, 0xbc, 0x7f, 0x5d, 0x98, 0x7d, 0xff, 0x3a, 0x4d, 0xbf, 0x9f, 0x4b, 0xd3, 0xef, 0xef, 0xc3,
|
||||
0x02, 0x89, 0x26, 0xc7, 0x75, 0x46, 0xca, 0x6a, 0x26, 0x2d, 0x70, 0x1e, 0x45, 0x14, 0xc1, 0x95,
|
||||
0x39, 0xa1, 0x4c, 0x0e, 0x29, 0x42, 0x8a, 0xd2, 0xda, 0x48, 0x58, 0x1a, 0x24, 0x39, 0x22, 0x4b,
|
||||
0x23, 0x6a, 0xc1, 0xbe, 0x88, 0x5b, 0xa8, 0x68, 0x2d, 0x10, 0x1c, 0x5b, 0xb8, 0x0f, 0x0b, 0xfc,
|
||||
0x22, 0xf4, 0x6d, 0xcb, 0x1b, 0xdb, 0x5f, 0x4e, 0x30, 0x84, 0x6b, 0xa3, 0x0d, 0x5f, 0x35, 0xe7,
|
||||
0x11, 0xb1, 0x8f, 0xf0, 0x4d, 0x3b, 0xb4, 0xef, 0x7f, 0x0d, 0x15, 0xed, 0x31, 0x5a, 0xb6, 0x0a,
|
||||
0x8b, 0x9f, 0x77, 0x7a, 0x7b, 0xed, 0x6e, 0xd7, 0x3a, 0x38, 0x5c, 0x7f, 0xda, 0xfe, 0xc2, 0xda,
|
||||
0x6e, 0x75, 0xb7, 0x1b, 0xd7, 0xc4, 0xa6, 0xdd, 0x6b, 0x77, 0x7b, 0xed, 0xcd, 0x04, 0x3c, 0xc3,
|
||||
0x5e, 0x81, 0xb5, 0xc3, 0xbd, 0xc3, 0x6e, 0x7b, 0xd3, 0x4a, 0x2b, 0x97, 0x15, 0x5c, 0x2a, 0xf1,
|
||||
0x29, 0xc5, 0x73, 0xf7, 0x3f, 0x81, 0xc6, 0x74, 0x34, 0x29, 0x11, 0x7e, 0x7b, 0x5e, 0x9c, 0xee,
|
||||
0xfe, 0xbf, 0xc9, 0x01, 0xc4, 0xe9, 0xfe, 0x42, 0x50, 0x6c, 0xb6, 0x7a, 0xad, 0x9d, 0x7d, 0xd1,
|
||||
0x09, 0x73, 0xbf, 0x27, 0xf6, 0xbf, 0xd9, 0xfe, 0xb4, 0x71, 0x2d, 0x15, 0xb3, 0x7f, 0xd0, 0x6b,
|
||||
0x64, 0xc4, 0x78, 0x3b, 0x7b, 0x9d, 0x5e, 0xa7, 0xb5, 0x63, 0x99, 0xfb, 0x87, 0x9d, 0xbd, 0x27,
|
||||
0xf4, 0xdc, 0x14, 0xca, 0xc8, 0xc3, 0x83, 0x2d, 0x73, 0x7f, 0xaf, 0x67, 0x75, 0xb7, 0x0f, 0x7b,
|
||||
0x9b, 0xf8, 0x58, 0xd5, 0x86, 0xd9, 0x39, 0xa0, 0x3a, 0xf3, 0xcf, 0x23, 0x10, 0x55, 0x17, 0xc4,
|
||||
0x8c, 0x3d, 0xd9, 0xef, 0x76, 0x3b, 0x07, 0xd6, 0xa7, 0x87, 0x6d, 0xb3, 0xd3, 0xee, 0x62, 0xc1,
|
||||
0xb9, 0x14, 0xb8, 0xa0, 0x2f, 0x0a, 0xc9, 0xda, 0xdb, 0xf9, 0x4c, 0x8a, 0x3e, 0x41, 0x5a, 0x4a,
|
||||
0x82, 0x04, 0x55, 0x59, 0x48, 0x04, 0x21, 0x3b, 0x52, 0x6a, 0x86, 0x2b, 0x70, 0xa2, 0x5c, 0x45,
|
||||
0x48, 0xc5, 0x6e, 0xaf, 0xd5, 0xeb, 0x6c, 0x58, 0xf2, 0x85, 0x3b, 0xb1, 0x08, 0xa2, 0x58, 0x35,
|
||||
0x1d, 0x25, 0x4a, 0xa1, 0xc0, 0x8c, 0x8e, 0x97, 0xcd, 0x4d, 0x13, 0x0b, 0xd4, 0x67, 0xa0, 0x82,
|
||||
0x76, 0x5e, 0x2c, 0x94, 0x10, 0x2e, 0x82, 0xa4, 0xa1, 0x3e, 0x04, 0x66, 0xe1, 0xf1, 0xef, 0xe7,
|
||||
0xa0, 0x4e, 0x57, 0xaf, 0xe8, 0x97, 0x7c, 0xb8, 0xcf, 0x76, 0xa1, 0x28, 0x7f, 0x12, 0x8a, 0x2d,
|
||||
0x47, 0x8f, 0x0e, 0xe9, 0x3f, 0x42, 0xb5, 0xb6, 0x32, 0x0d, 0x96, 0xca, 0xd4, 0xe2, 0xdf, 0xfc,
|
||||
0xb3, 0xbf, 0xfa, 0x47, 0xd9, 0x1a, 0xab, 0x3c, 0x3c, 0x7b, 0xf7, 0xe1, 0x09, 0x77, 0x03, 0x51,
|
||||
0xc7, 0x5f, 0x03, 0x88, 0x7f, 0xe8, 0x88, 0x35, 0xa3, 0x10, 0xd2, 0xd4, 0xaf, 0x40, 0xad, 0x5d,
|
||||
0x4f, 0xc1, 0xc8, 0x7a, 0xaf, 0x63, 0xbd, 0x8b, 0x46, 0x5d, 0xd4, 0xeb, 0xb8, 0x4e, 0x48, 0x3f,
|
||||
0x7a, 0xf4, 0x71, 0xe6, 0x3e, 0x1b, 0x40, 0x55, 0xff, 0x09, 0x22, 0xa6, 0xf4, 0x9c, 0x94, 0x1f,
|
||||
0x51, 0x5a, 0xbb, 0x91, 0x8a, 0x53, 0x1a, 0x24, 0xb6, 0xb1, 0x6c, 0x34, 0x44, 0x1b, 0x13, 0xa4,
|
||||
0x88, 0x5b, 0x19, 0x92, 0x4e, 0x1d, 0xff, 0xd2, 0x10, 0xbb, 0xa9, 0x69, 0x45, 0x33, 0xbf, 0x73,
|
||||
0xb4, 0x76, 0xeb, 0x0a, 0xac, 0x6c, 0xeb, 0x16, 0xb6, 0xb5, 0x6a, 0x30, 0xd1, 0x56, 0x1f, 0x69,
|
||||
0xd4, 0xef, 0x1c, 0x7d, 0x9c, 0xb9, 0xff, 0xf8, 0x2f, 0xef, 0x41, 0x39, 0x4a, 0xc5, 0x64, 0xbf,
|
||||
0x0b, 0xb5, 0xc4, 0xdd, 0x38, 0xa6, 0x86, 0x91, 0x76, 0x95, 0x6e, 0xed, 0x66, 0x3a, 0x52, 0x36,
|
||||
0xfc, 0x0a, 0x36, 0xdc, 0x64, 0x2b, 0xa2, 0x61, 0x79, 0xf7, 0xec, 0x21, 0xde, 0x20, 0xa5, 0x27,
|
||||
0x9c, 0x9e, 0x69, 0xb6, 0x03, 0x35, 0x76, 0x73, 0x5a, 0x9f, 0x4f, 0xb4, 0x76, 0xeb, 0x0a, 0xac,
|
||||
0x6c, 0xee, 0x26, 0x36, 0xb7, 0xc2, 0x96, 0xf4, 0xe6, 0x54, 0xe2, 0x24, 0xe3, 0xf8, 0x6c, 0x9a,
|
||||
0xfe, 0x43, 0x3c, 0xec, 0x56, 0xfc, 0xc8, 0x55, 0xca, 0x0f, 0xf4, 0x44, 0x2c, 0x32, 0xfb, 0x2b,
|
||||
0x3d, 0x46, 0x13, 0x9b, 0x62, 0x0c, 0x97, 0x4f, 0xff, 0x1d, 0x1e, 0x76, 0x04, 0x15, 0xed, 0xed,
|
||||
0x7a, 0x76, 0xfd, 0xca, 0x77, 0xf6, 0xd7, 0xd6, 0xd2, 0x50, 0x69, 0x43, 0xd1, 0xeb, 0x7f, 0x78,
|
||||
0xcc, 0x39, 0xfb, 0x21, 0x94, 0xa3, 0x17, 0xd1, 0xd9, 0xaa, 0xf6, 0x42, 0xbd, 0xfe, 0x82, 0xfb,
|
||||
0x5a, 0x73, 0x16, 0x91, 0xc6, 0x7c, 0x7a, 0xed, 0x82, 0xf9, 0x3e, 0x87, 0x8a, 0xf6, 0xea, 0x79,
|
||||
0x34, 0x80, 0xd9, 0x97, 0xd5, 0xa3, 0x01, 0xa4, 0x3c, 0x92, 0x6e, 0x2c, 0x60, 0x13, 0x15, 0x56,
|
||||
0x46, 0xfe, 0x0e, 0x2f, 0xbc, 0x80, 0xed, 0xc0, 0xb2, 0xb4, 0x93, 0x8e, 0xf8, 0x37, 0x59, 0x86,
|
||||
0x94, 0xdf, 0x3e, 0x7a, 0x94, 0x61, 0x9f, 0x40, 0x49, 0x3d, 0x6e, 0xcf, 0x56, 0xd2, 0x1f, 0xe9,
|
||||
0x5f, 0x5b, 0x9d, 0x81, 0x4b, 0xa3, 0xe6, 0x0b, 0x80, 0xf8, 0x89, 0xf5, 0x48, 0x48, 0xcc, 0x3c,
|
||||
0xd9, 0x1e, 0x71, 0xc0, 0xec, 0x7b, 0xec, 0xc6, 0x0a, 0x0e, 0xb0, 0xc1, 0x50, 0x48, 0xb8, 0xfc,
|
||||
0x5c, 0xbd, 0x1f, 0xf9, 0x23, 0xa8, 0x68, 0xaf, 0xac, 0x47, 0xd3, 0x37, 0xfb, 0x42, 0x7b, 0x34,
|
||||
0x7d, 0x29, 0x8f, 0xb2, 0x1b, 0x6b, 0x58, 0xfb, 0x92, 0x31, 0x2f, 0x6a, 0x17, 0x8a, 0x92, 0x54,
|
||||
0x58, 0xc4, 0x02, 0x9d, 0x42, 0x2d, 0xf1, 0x94, 0x7a, 0xb4, 0x43, 0xd3, 0x1e, 0x6a, 0x8f, 0x76,
|
||||
0x68, 0xea, 0xeb, 0xeb, 0x8a, 0xcf, 0x8c, 0x05, 0xd1, 0xce, 0x19, 0x92, 0x68, 0x2d, 0xfd, 0x00,
|
||||
0x2a, 0xda, 0xb3, 0xe8, 0xd1, 0x58, 0x66, 0x5f, 0x60, 0x8f, 0xc6, 0x92, 0xf6, 0x8a, 0xfa, 0x12,
|
||||
0xb6, 0x51, 0x37, 0x90, 0x15, 0xf0, 0x75, 0x3e, 0x51, 0xf7, 0xef, 0x42, 0x3d, 0xf9, 0x52, 0x7a,
|
||||
0xb4, 0xf7, 0x53, 0x9f, 0x5c, 0x8f, 0xf6, 0xfe, 0x15, 0xcf, 0xab, 0x4b, 0x96, 0xbe, 0xbf, 0x18,
|
||||
0x35, 0xf2, 0xf0, 0x2b, 0x79, 0xa9, 0xe4, 0x6b, 0xf6, 0xa9, 0x10, 0x70, 0xf2, 0x71, 0x48, 0xb6,
|
||||
0xaa, 0x71, 0xad, 0xfe, 0x84, 0x64, 0xb4, 0x5f, 0x66, 0xde, 0x91, 0x4c, 0x32, 0x33, 0x56, 0xce,
|
||||
0x9e, 0xc0, 0x62, 0xc4, 0xcc, 0xd1, 0x6b, 0x8f, 0x41, 0x34, 0x86, 0xd4, 0x37, 0x25, 0xd7, 0x1a,
|
||||
0xd3, 0xd8, 0x47, 0x19, 0x3a, 0xfe, 0xf0, 0x8d, 0x3d, 0xed, 0xf8, 0xd3, 0x1f, 0x7c, 0xd4, 0x8e,
|
||||
0xbf, 0xc4, 0x53, 0x7c, 0xd3, 0xc7, 0x5f, 0xe8, 0x88, 0x3a, 0x5c, 0x98, 0x9f, 0x7e, 0x7b, 0xf1,
|
||||
0xd6, 0x55, 0x2f, 0x0f, 0x50, 0xf5, 0xaf, 0x3c, 0xff, 0x61, 0x82, 0xa4, 0x28, 0x52, 0xd2, 0xf4,
|
||||
0xa1, 0x4c, 0x1d, 0x61, 0xbf, 0x03, 0x55, 0xfd, 0xa9, 0x67, 0xa6, 0xcb, 0x84, 0xe9, 0x96, 0x6e,
|
||||
0xa4, 0xe2, 0x92, 0x5c, 0xc2, 0xaa, 0x7a, 0x33, 0xec, 0x33, 0x58, 0x89, 0xa6, 0x59, 0xbf, 0x75,
|
||||
0x1e, 0xb0, 0xdb, 0x29, 0x77, 0xd1, 0x13, 0x93, 0x7d, 0xfd, 0xca, 0xcb, 0xea, 0x8f, 0x32, 0x82,
|
||||
0xfb, 0x92, 0x6f, 0xce, 0xc6, 0x27, 0x4f, 0xda, 0x53, 0xbb, 0xf1, 0xc9, 0x93, 0xfa, 0x50, 0xad,
|
||||
0xe2, 0x3e, 0xb6, 0x98, 0x98, 0x23, 0x4a, 0xaa, 0x65, 0x3f, 0x80, 0x79, 0xed, 0x4a, 0x7d, 0xf7,
|
||||
0xd2, 0xed, 0x47, 0x3b, 0x69, 0xf6, 0x41, 0xb7, 0xb5, 0x34, 0xcf, 0xa2, 0xb1, 0x8a, 0xf5, 0x2f,
|
||||
0x18, 0x89, 0xc9, 0x11, 0xbb, 0x68, 0x03, 0x2a, 0xfa, 0x75, 0xfd, 0xe7, 0xd4, 0xbb, 0xaa, 0xa1,
|
||||
0xf4, 0xb7, 0xc3, 0x1e, 0x65, 0xd8, 0x0e, 0x34, 0xa6, 0x9f, 0x3a, 0x8a, 0x64, 0x4a, 0xda, 0xf3,
|
||||
0x4c, 0x6b, 0x53, 0xc8, 0xc4, 0x03, 0x49, 0xec, 0x80, 0xae, 0x65, 0x44, 0x3f, 0x14, 0xe4, 0xf9,
|
||||
0xd3, 0xa7, 0x7a, 0xf2, 0x07, 0x84, 0xa2, 0xda, 0xd2, 0x7e, 0x3a, 0xea, 0x5e, 0xe6, 0x51, 0x86,
|
||||
0xfd, 0x34, 0x03, 0xd5, 0xc4, 0xf3, 0x22, 0x89, 0xc4, 0xf7, 0xa9, 0x71, 0x36, 0x75, 0x9c, 0x3e,
|
||||
0x50, 0xc3, 0xc4, 0x49, 0xdc, 0xb9, 0xff, 0xfd, 0xc4, 0x22, 0x7d, 0x95, 0x08, 0xcc, 0x3d, 0x98,
|
||||
0xfe, 0x25, 0xa1, 0xaf, 0xa7, 0x09, 0xf4, 0x77, 0xfa, 0xbe, 0x7e, 0x94, 0x61, 0xff, 0x2e, 0x03,
|
||||
0xf5, 0x64, 0xc4, 0x3d, 0x1a, 0x6e, 0x6a, 0x6c, 0x3f, 0x62, 0xa5, 0x2b, 0xc2, 0xf4, 0x3f, 0xc0,
|
||||
0x5e, 0xf6, 0xee, 0x9b, 0x89, 0x5e, 0xca, 0xd7, 0x92, 0x7f, 0xb9, 0xde, 0xb2, 0x8f, 0xe9, 0x87,
|
||||
0xfb, 0x54, 0x22, 0x12, 0x9b, 0xfd, 0xa1, 0xb7, 0x88, 0xfd, 0xf4, 0x9f, 0x45, 0xc3, 0x45, 0xf8,
|
||||
0x11, 0xfd, 0x62, 0x8e, 0xca, 0x6b, 0x11, 0x5c, 0xfc, 0xb2, 0xe5, 0x8d, 0xd7, 0x71, 0x4c, 0xaf,
|
||||
0x18, 0xd7, 0x13, 0x63, 0x9a, 0x56, 0x3c, 0x5a, 0xd4, 0x3b, 0xf9, 0xab, 0x66, 0xf1, 0xc9, 0x39,
|
||||
0xf3, 0x4b, 0x67, 0x57, 0x77, 0x72, 0x44, 0x9d, 0x94, 0xe4, 0x89, 0xad, 0xf6, 0x92, 0xd5, 0x18,
|
||||
0xf7, 0xb1, 0xaf, 0xaf, 0x1b, 0xb7, 0xaf, 0xec, 0xeb, 0x43, 0x8c, 0x9e, 0x8b, 0x1e, 0x1f, 0x00,
|
||||
0xc4, 0x89, 0x82, 0x6c, 0x2a, 0x5d, 0x2d, 0x12, 0x40, 0xb3, 0xb9, 0x84, 0xc9, 0xfd, 0xac, 0xb2,
|
||||
0xda, 0x44, 0x8d, 0x3f, 0x24, 0x71, 0x1a, 0x25, 0xd2, 0xe9, 0xda, 0x57, 0x32, 0xa7, 0x2f, 0xa1,
|
||||
0x7d, 0x4d, 0xd7, 0x9f, 0x10, 0xa6, 0x51, 0xd6, 0xdc, 0x21, 0xd4, 0x76, 0x3c, 0xef, 0xd9, 0x64,
|
||||
0x1c, 0x25, 0xa7, 0x27, 0x53, 0x5a, 0xb6, 0xed, 0xe0, 0x74, 0x6d, 0x6a, 0x14, 0xc6, 0x1d, 0xac,
|
||||
0x6a, 0x8d, 0x35, 0xb5, 0xaa, 0x1e, 0x7e, 0x15, 0x67, 0x27, 0x7e, 0xcd, 0x6c, 0x58, 0x88, 0x64,
|
||||
0x74, 0x9c, 0x01, 0x98, 0xac, 0x26, 0x21, 0x99, 0xa7, 0x9b, 0x48, 0x98, 0x09, 0xaa, 0xb7, 0x0f,
|
||||
0x03, 0x55, 0xe7, 0xa3, 0x0c, 0x3b, 0x80, 0xea, 0x26, 0xef, 0xe3, 0x35, 0x7b, 0x4c, 0x0c, 0x59,
|
||||
0x4c, 0x24, 0x19, 0x50, 0x46, 0xc9, 0x5a, 0x2d, 0x01, 0x4c, 0x9e, 0x5b, 0x63, 0xfb, 0xd2, 0xe7,
|
||||
0x5f, 0x3e, 0xfc, 0x4a, 0xa6, 0x9c, 0x7c, 0xad, 0xce, 0x2d, 0x95, 0x92, 0x93, 0x38, 0xb7, 0xa6,
|
||||
0x72, 0x78, 0x12, 0xe7, 0xd6, 0x4c, 0x0e, 0x4f, 0x62, 0xaa, 0x55, 0x4a, 0x10, 0x1b, 0xc2, 0xc2,
|
||||
0x4c, 0xda, 0x4f, 0x74, 0x64, 0x5d, 0x95, 0x2c, 0xb4, 0x76, 0xe7, 0x6a, 0x82, 0x64, 0x6b, 0xf7,
|
||||
0x93, 0xad, 0x75, 0xa1, 0x46, 0x4f, 0x07, 0x1e, 0x71, 0xba, 0x70, 0x37, 0xf5, 0x5a, 0x8d, 0x7e,
|
||||
0x9b, 0x6f, 0xfa, 0x80, 0x41, 0x5c, 0x52, 0xc3, 0xc1, 0x9b, 0x6e, 0xec, 0x87, 0x50, 0x79, 0xc2,
|
||||
0x43, 0x75, 0xc3, 0x2e, 0xd2, 0xb1, 0xa7, 0xae, 0xdc, 0xad, 0xa5, 0x5c, 0xd0, 0x4b, 0xf2, 0x0c,
|
||||
0xd6, 0xf6, 0x90, 0x0f, 0x4e, 0x38, 0x09, 0x27, 0xcb, 0x19, 0x7c, 0xcd, 0x7e, 0x1b, 0x2b, 0x8f,
|
||||
0x2e, 0x36, 0xaf, 0x68, 0x57, 0xa8, 0xf4, 0xca, 0xe7, 0xa7, 0xe0, 0x69, 0x35, 0xbb, 0xde, 0x80,
|
||||
0x6b, 0xba, 0x9e, 0x0b, 0x15, 0xed, 0x01, 0x84, 0x68, 0x03, 0xcd, 0x3e, 0x78, 0x11, 0x6d, 0xa0,
|
||||
0x94, 0xf7, 0x12, 0x8c, 0x7b, 0xd8, 0x8e, 0xc1, 0xee, 0xc4, 0xed, 0xd0, 0x1b, 0x09, 0x71, 0x4b,
|
||||
0x0f, 0xbf, 0xb2, 0x47, 0xe1, 0xd7, 0xec, 0x73, 0x7c, 0xa0, 0x5b, 0xbf, 0x41, 0x18, 0x1b, 0x0d,
|
||||
0xd3, 0x97, 0x0d, 0xa3, 0xc9, 0xd2, 0x50, 0x49, 0x43, 0x82, 0x9a, 0x42, 0x4d, 0xee, 0x7d, 0x80,
|
||||
0x6e, 0xe8, 0x8d, 0x37, 0x6d, 0x3e, 0xf2, 0xdc, 0x58, 0xd6, 0xc6, 0x77, 0xda, 0x62, 0xf9, 0xa5,
|
||||
0x5d, 0x6c, 0x63, 0x9f, 0x6b, 0x56, 0x56, 0xe2, 0x12, 0xa6, 0x62, 0xae, 0x2b, 0xaf, 0xbd, 0x45,
|
||||
0x13, 0x92, 0x72, 0xf5, 0xed, 0x51, 0x86, 0xb5, 0x00, 0xe2, 0xbc, 0xaf, 0xc8, 0x66, 0x9a, 0x49,
|
||||
0x29, 0x8b, 0xc4, 0x5e, 0x4a, 0x92, 0xd8, 0x01, 0x94, 0xe3, 0x84, 0x99, 0xd5, 0xf8, 0x3d, 0x97,
|
||||
0x44, 0x7a, 0x4d, 0x74, 0x82, 0xcf, 0x24, 0xab, 0x18, 0x0d, 0x9c, 0x2a, 0x60, 0x25, 0x31, 0x55,
|
||||
0xc7, 0x9c, 0x07, 0xcc, 0x81, 0x45, 0xea, 0x60, 0xa4, 0x2e, 0xe1, 0x5d, 0xac, 0xe8, 0x1d, 0xf6,
|
||||
0xd9, 0xbc, 0x91, 0x68, 0x37, 0xa7, 0x66, 0x3f, 0x24, 0x5c, 0x3f, 0x82, 0x5b, 0xe9, 0x1e, 0x98,
|
||||
0x10, 0xcd, 0x23, 0x58, 0x98, 0x09, 0xb0, 0x47, 0x5b, 0xfa, 0xaa, 0x8c, 0x89, 0x68, 0x4b, 0x5f,
|
||||
0x19, 0x9b, 0x37, 0x96, 0xb1, 0xc9, 0x79, 0x03, 0xd0, 0xd4, 0x3b, 0x77, 0xc2, 0xfe, 0xa9, 0x68,
|
||||
0xee, 0x5f, 0x67, 0x60, 0x31, 0x25, 0x84, 0xce, 0x5e, 0x55, 0x5e, 0x83, 0x2b, 0xc3, 0xeb, 0x6b,
|
||||
0xa9, 0xa1, 0x56, 0xa3, 0x8b, 0xed, 0xec, 0xb2, 0xa7, 0x89, 0x83, 0x8d, 0x22, 0x9d, 0x72, 0x67,
|
||||
0x3e, 0x57, 0xa9, 0x48, 0xd5, 0x28, 0xbe, 0x84, 0x55, 0xea, 0x48, 0x6b, 0x38, 0x9c, 0x0a, 0x03,
|
||||
0xbf, 0x32, 0xf3, 0xc3, 0xde, 0x89, 0xd0, 0xf6, 0xda, 0xd5, 0x3f, 0xfc, 0x7d, 0x85, 0x3a, 0x4d,
|
||||
0x5d, 0x65, 0x13, 0x68, 0x4c, 0x87, 0x57, 0xd9, 0xd5, 0x75, 0xad, 0xdd, 0x4e, 0xd8, 0xbf, 0x29,
|
||||
0x21, 0xd9, 0xef, 0x60, 0x63, 0xb7, 0x8d, 0xb5, 0xb4, 0x79, 0x21, 0x93, 0x58, 0xac, 0xc7, 0xdf,
|
||||
0x88, 0x62, 0xc1, 0x53, 0xe3, 0x54, 0x0d, 0x5c, 0x15, 0xb9, 0x8e, 0x2c, 0xf0, 0xf4, 0x50, 0xf2,
|
||||
0x1b, 0xd8, 0xfc, 0x1d, 0xe3, 0x46, 0x5a, 0xf3, 0x3e, 0x15, 0x21, 0x5b, 0x7c, 0x75, 0x7a, 0x5f,
|
||||
0xab, 0x1e, 0xdc, 0x49, 0x5b, 0xef, 0x2b, 0x6d, 0xa1, 0xa9, 0xb9, 0xbe, 0x86, 0xba, 0x5d, 0x55,
|
||||
0x8f, 0xfd, 0x46, 0xdb, 0x27, 0x25, 0xc8, 0x1c, 0x6d, 0x9f, 0xb4, 0x60, 0x71, 0x52, 0xaf, 0x51,
|
||||
0x61, 0xe2, 0x8f, 0x33, 0xf7, 0xd7, 0xef, 0xfe, 0xe0, 0x3b, 0x27, 0x4e, 0x78, 0x3a, 0x39, 0x7a,
|
||||
0xd0, 0xf7, 0x46, 0x0f, 0x87, 0xca, 0xdb, 0x28, 0x2f, 0x2c, 0x3f, 0x1c, 0xba, 0x83, 0x87, 0x58,
|
||||
0xed, 0xd1, 0xdc, 0xd8, 0xf7, 0x42, 0xef, 0xbb, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x26, 0x2b,
|
||||
0x1e, 0xcb, 0xbb, 0x80, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
168
lnrpc/rpc.proto
168
lnrpc/rpc.proto
@ -2819,6 +2819,9 @@ message HTLCAttempt {
|
||||
This value will not be set if the HTLC is still IN_FLIGHT.
|
||||
*/
|
||||
int64 resolve_time_ns = 4;
|
||||
|
||||
// Detailed htlc failure info.
|
||||
Failure failure = 5;
|
||||
}
|
||||
|
||||
message ListPaymentsRequest {
|
||||
@ -3114,3 +3117,168 @@ message BakeMacaroonResponse {
|
||||
/// The hex encoded macaroon, serialized in binary format.
|
||||
string macaroon = 1;
|
||||
}
|
||||
|
||||
|
||||
message Failure {
|
||||
enum FailureCode {
|
||||
/**
|
||||
The numbers assigned in this enumeration match the failure codes as
|
||||
defined in BOLT #4. Because protobuf 3 requires enums to start with 0,
|
||||
a RESERVED value is added.
|
||||
*/
|
||||
RESERVED = 0;
|
||||
|
||||
INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS = 1;
|
||||
INCORRECT_PAYMENT_AMOUNT = 2;
|
||||
FINAL_INCORRECT_CLTV_EXPIRY = 3;
|
||||
FINAL_INCORRECT_HTLC_AMOUNT = 4;
|
||||
FINAL_EXPIRY_TOO_SOON = 5;
|
||||
INVALID_REALM = 6;
|
||||
EXPIRY_TOO_SOON = 7;
|
||||
INVALID_ONION_VERSION = 8;
|
||||
INVALID_ONION_HMAC = 9;
|
||||
INVALID_ONION_KEY = 10;
|
||||
AMOUNT_BELOW_MINIMUM = 11;
|
||||
FEE_INSUFFICIENT = 12;
|
||||
INCORRECT_CLTV_EXPIRY = 13;
|
||||
CHANNEL_DISABLED = 14;
|
||||
TEMPORARY_CHANNEL_FAILURE = 15;
|
||||
REQUIRED_NODE_FEATURE_MISSING = 16;
|
||||
REQUIRED_CHANNEL_FEATURE_MISSING = 17;
|
||||
UNKNOWN_NEXT_PEER = 18;
|
||||
TEMPORARY_NODE_FAILURE = 19;
|
||||
PERMANENT_NODE_FAILURE = 20;
|
||||
PERMANENT_CHANNEL_FAILURE = 21;
|
||||
EXPIRY_TOO_FAR = 22;
|
||||
MPP_TIMEOUT = 23;
|
||||
|
||||
/**
|
||||
An internal error occurred.
|
||||
*/
|
||||
INTERNAL_FAILURE = 997;
|
||||
|
||||
/**
|
||||
The error source is known, but the failure itself couldn't be decoded.
|
||||
*/
|
||||
UNKNOWN_FAILURE = 998;
|
||||
|
||||
/**
|
||||
An unreadable failure result is returned if the received failure message
|
||||
cannot be decrypted. In that case the error source is unknown.
|
||||
*/
|
||||
UNREADABLE_FAILURE = 999;
|
||||
}
|
||||
|
||||
/// Failure code as defined in the Lightning spec
|
||||
FailureCode code = 1;
|
||||
|
||||
reserved 2;
|
||||
|
||||
/// An optional channel update message.
|
||||
ChannelUpdate channel_update = 3;
|
||||
|
||||
/// A failure type-dependent htlc value.
|
||||
uint64 htlc_msat = 4;
|
||||
|
||||
/// The sha256 sum of the onion payload.
|
||||
bytes onion_sha_256 = 5;
|
||||
|
||||
/// A failure type-dependent cltv expiry value.
|
||||
uint32 cltv_expiry = 6;
|
||||
|
||||
/// A failure type-dependent flags value.
|
||||
uint32 flags = 7;
|
||||
|
||||
/**
|
||||
The position in the path of the intermediate or final node that generated
|
||||
the failure message. Position zero is the sender node.
|
||||
**/
|
||||
uint32 failure_source_index = 8;
|
||||
|
||||
/// A failure type-dependent block height.
|
||||
uint32 height = 9;
|
||||
}
|
||||
|
||||
|
||||
message ChannelUpdate {
|
||||
/**
|
||||
The signature that validates the announced data and proves the ownership
|
||||
of node id.
|
||||
*/
|
||||
bytes signature = 1;
|
||||
|
||||
/**
|
||||
The target chain that this channel was opened within. This value
|
||||
should be the genesis hash of the target chain. Along with the short
|
||||
channel ID, this uniquely identifies the channel globally in a
|
||||
blockchain.
|
||||
*/
|
||||
bytes chain_hash = 2;
|
||||
|
||||
/**
|
||||
The unique description of the funding transaction.
|
||||
*/
|
||||
uint64 chan_id = 3 [jstype = JS_STRING];
|
||||
|
||||
/**
|
||||
A timestamp that allows ordering in the case of multiple announcements.
|
||||
We should ignore the message if timestamp is not greater than the
|
||||
last-received.
|
||||
*/
|
||||
uint32 timestamp = 4;
|
||||
|
||||
/**
|
||||
The bitfield that describes whether optional fields are present in this
|
||||
update. Currently, the least-significant bit must be set to 1 if the
|
||||
optional field MaxHtlc is present.
|
||||
*/
|
||||
uint32 message_flags = 10;
|
||||
|
||||
/**
|
||||
The bitfield that describes additional meta-data concerning how the
|
||||
update is to be interpreted. Currently, the least-significant bit must be
|
||||
set to 0 if the creating node corresponds to the first node in the
|
||||
previously sent channel announcement and 1 otherwise. If the second bit
|
||||
is set, then the channel is set to be disabled.
|
||||
*/
|
||||
uint32 channel_flags = 5;
|
||||
|
||||
/**
|
||||
The minimum number of blocks this node requires to be added to the expiry
|
||||
of HTLCs. This is a security parameter determined by the node operator.
|
||||
This value represents the required gap between the time locks of the
|
||||
incoming and outgoing HTLC's set to this node.
|
||||
*/
|
||||
uint32 time_lock_delta = 6;
|
||||
|
||||
/**
|
||||
The minimum HTLC value which will be accepted.
|
||||
*/
|
||||
uint64 htlc_minimum_msat = 7;
|
||||
|
||||
/**
|
||||
The base fee that must be used for incoming HTLC's to this particular
|
||||
channel. This value will be tacked onto the required for a payment
|
||||
independent of the size of the payment.
|
||||
*/
|
||||
uint32 base_fee = 8;
|
||||
|
||||
/**
|
||||
The fee rate that will be charged per millionth of a satoshi.
|
||||
*/
|
||||
uint32 fee_rate = 9;
|
||||
|
||||
/**
|
||||
The maximum HTLC value which will be accepted.
|
||||
*/
|
||||
uint64 htlc_maximum_msat = 11;
|
||||
|
||||
/**
|
||||
The set of data that was appended to this message, some of which we may
|
||||
not actually know how to iterate or parse. By holding onto this data, we
|
||||
ensure that we're able to properly validate the set of signatures that
|
||||
cover these new fields, and ensure we're able to make upgrades to the
|
||||
network in a forwards compatible manner.
|
||||
*/
|
||||
bytes extra_opaque_data = 12;
|
||||
}
|
@ -1490,6 +1490,40 @@
|
||||
],
|
||||
"default": "OPEN_CHANNEL"
|
||||
},
|
||||
"FailureFailureCode": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"RESERVED",
|
||||
"INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS",
|
||||
"INCORRECT_PAYMENT_AMOUNT",
|
||||
"FINAL_INCORRECT_CLTV_EXPIRY",
|
||||
"FINAL_INCORRECT_HTLC_AMOUNT",
|
||||
"FINAL_EXPIRY_TOO_SOON",
|
||||
"INVALID_REALM",
|
||||
"EXPIRY_TOO_SOON",
|
||||
"INVALID_ONION_VERSION",
|
||||
"INVALID_ONION_HMAC",
|
||||
"INVALID_ONION_KEY",
|
||||
"AMOUNT_BELOW_MINIMUM",
|
||||
"FEE_INSUFFICIENT",
|
||||
"INCORRECT_CLTV_EXPIRY",
|
||||
"CHANNEL_DISABLED",
|
||||
"TEMPORARY_CHANNEL_FAILURE",
|
||||
"REQUIRED_NODE_FEATURE_MISSING",
|
||||
"REQUIRED_CHANNEL_FEATURE_MISSING",
|
||||
"UNKNOWN_NEXT_PEER",
|
||||
"TEMPORARY_NODE_FAILURE",
|
||||
"PERMANENT_NODE_FAILURE",
|
||||
"PERMANENT_CHANNEL_FAILURE",
|
||||
"EXPIRY_TOO_FAR",
|
||||
"MPP_TIMEOUT",
|
||||
"INTERNAL_FAILURE",
|
||||
"UNKNOWN_FAILURE",
|
||||
"UNREADABLE_FAILURE"
|
||||
],
|
||||
"default": "RESERVED",
|
||||
"description": " - RESERVED: *\nThe numbers assigned in this enumeration match the failure codes as\ndefined in BOLT #4. Because protobuf 3 requires enums to start with 0,\na RESERVED value is added.\n - INTERNAL_FAILURE: *\nAn internal error occurred.\n - UNKNOWN_FAILURE: *\nThe error source is known, but the failure itself couldn't be decoded.\n - UNREADABLE_FAILURE: *\nAn unreadable failure result is returned if the received failure message\ncannot be decrypted. In that case the error source is unknown."
|
||||
},
|
||||
"HTLCAttemptHTLCStatus": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
@ -2260,6 +2294,71 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"lnrpcChannelUpdate": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"signature": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "*\nThe signature that validates the announced data and proves the ownership\nof node id."
|
||||
},
|
||||
"chain_hash": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "*\nThe target chain that this channel was opened within. This value\nshould be the genesis hash of the target chain. Along with the short\nchannel ID, this uniquely identifies the channel globally in a\nblockchain."
|
||||
},
|
||||
"chan_id": {
|
||||
"type": "string",
|
||||
"format": "uint64",
|
||||
"description": "*\nThe unique description of the funding transaction."
|
||||
},
|
||||
"timestamp": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nA timestamp that allows ordering in the case of multiple announcements.\nWe should ignore the message if timestamp is not greater than the\nlast-received."
|
||||
},
|
||||
"message_flags": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nThe bitfield that describes whether optional fields are present in this\nupdate. Currently, the least-significant bit must be set to 1 if the\noptional field MaxHtlc is present."
|
||||
},
|
||||
"channel_flags": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nThe bitfield that describes additional meta-data concerning how the\nupdate is to be interpreted. Currently, the least-significant bit must be\nset to 0 if the creating node corresponds to the first node in the\npreviously sent channel announcement and 1 otherwise. If the second bit\nis set, then the channel is set to be disabled."
|
||||
},
|
||||
"time_lock_delta": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nThe minimum number of blocks this node requires to be added to the expiry\nof HTLCs. This is a security parameter determined by the node operator.\nThis value represents the required gap between the time locks of the\nincoming and outgoing HTLC's set to this node."
|
||||
},
|
||||
"htlc_minimum_msat": {
|
||||
"type": "string",
|
||||
"format": "uint64",
|
||||
"description": "*\nThe minimum HTLC value which will be accepted."
|
||||
},
|
||||
"base_fee": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nThe base fee that must be used for incoming HTLC's to this particular\nchannel. This value will be tacked onto the required for a payment\nindependent of the size of the payment."
|
||||
},
|
||||
"fee_rate": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nThe fee rate that will be charged per millionth of a satoshi."
|
||||
},
|
||||
"htlc_maximum_msat": {
|
||||
"type": "string",
|
||||
"format": "uint64",
|
||||
"description": "*\nThe maximum HTLC value which will be accepted."
|
||||
},
|
||||
"extra_opaque_data": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "*\nThe set of data that was appended to this message, some of which we may\nnot actually know how to iterate or parse. By holding onto this data, we\nensure that we're able to properly validate the set of signatures that\ncover these new fields, and ensure we're able to make upgrades to the\nnetwork in a forwards compatible manner."
|
||||
}
|
||||
}
|
||||
},
|
||||
"lnrpcCloseStatusUpdate": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@ -2364,6 +2463,49 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"lnrpcFailure": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"code": {
|
||||
"$ref": "#/definitions/FailureFailureCode",
|
||||
"title": "/ Failure code as defined in the Lightning spec"
|
||||
},
|
||||
"channel_update": {
|
||||
"$ref": "#/definitions/lnrpcChannelUpdate",
|
||||
"description": "/ An optional channel update message."
|
||||
},
|
||||
"htlc_msat": {
|
||||
"type": "string",
|
||||
"format": "uint64",
|
||||
"description": "/ A failure type-dependent htlc value."
|
||||
},
|
||||
"onion_sha_256": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "/ The sha256 sum of the onion payload."
|
||||
},
|
||||
"cltv_expiry": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "/ A failure type-dependent cltv expiry value."
|
||||
},
|
||||
"flags": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "/ A failure type-dependent flags value."
|
||||
},
|
||||
"failure_source_index": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "*\nThe position in the path of the intermediate or final node that generated\nthe failure message. Position zero is the sender node."
|
||||
},
|
||||
"height": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "/ A failure type-dependent block height."
|
||||
}
|
||||
}
|
||||
},
|
||||
"lnrpcFeature": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@ -2735,6 +2877,10 @@
|
||||
"type": "string",
|
||||
"format": "int64",
|
||||
"description": "*\nThe time in UNIX nanoseconds at which this HTLC was settled or failed.\nThis value will not be set if the HTLC is still IN_FLIGHT."
|
||||
},
|
||||
"failure": {
|
||||
"$ref": "#/definitions/lnrpcFailure",
|
||||
"description": "Detailed htlc failure info."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -14,25 +14,32 @@ import (
|
||||
// restarts. Payments are transitioned through various payment states, and the
|
||||
// ControlTower interface provides access to driving the state transitions.
|
||||
type ControlTower interface {
|
||||
// InitPayment atomically moves the payment into the InFlight state.
|
||||
// This method checks that no suceeded payment exist for this payment
|
||||
// hash.
|
||||
InitPayment(lntypes.Hash, *channeldb.PaymentCreationInfo) error
|
||||
|
||||
// RegisterAttempt atomically records the provided PaymentAttemptInfo.
|
||||
RegisterAttempt(lntypes.Hash, *channeldb.PaymentAttemptInfo) error
|
||||
// RegisterAttempt atomically records the provided HTLCAttemptInfo.
|
||||
RegisterAttempt(lntypes.Hash, *channeldb.HTLCAttemptInfo) error
|
||||
|
||||
// Success transitions a payment into the Succeeded state. After
|
||||
// invoking this method, InitPayment should always return an error to
|
||||
// prevent us from making duplicate payments to the same payment hash.
|
||||
// The provided preimage is atomically saved to the DB for record
|
||||
// keeping.
|
||||
Success(lntypes.Hash, lntypes.Preimage) error
|
||||
// SettleAttempt marks the given attempt settled with the preimage. If
|
||||
// this is a multi shard payment, this might implicitly mean the the
|
||||
// full payment succeeded.
|
||||
//
|
||||
// After invoking this method, InitPayment should always return an
|
||||
// error to prevent us from making duplicate payments to the same
|
||||
// payment hash. The provided preimage is atomically saved to the DB
|
||||
// for record keeping.
|
||||
SettleAttempt(lntypes.Hash, uint64, *channeldb.HTLCSettleInfo) error
|
||||
|
||||
// FailAttempt marks the given payment attempt failed.
|
||||
FailAttempt(lntypes.Hash, uint64, *channeldb.HTLCFailInfo) error
|
||||
|
||||
// Fail transitions a payment into the Failed state, and records the
|
||||
// reason the payment failed. After invoking this method, InitPayment
|
||||
// should return nil on its next call for this payment hash, allowing
|
||||
// the switch to make a subsequent payment.
|
||||
// ultimate reason the payment failed. Note that this should only be
|
||||
// called when all active active attempts are already failed. After
|
||||
// invoking this method, InitPayment should return nil on its next call
|
||||
// for this payment hash, allowing the user to make a subsequent
|
||||
// payment.
|
||||
Fail(lntypes.Hash, channeldb.FailureReason) error
|
||||
|
||||
// FetchInFlightPayments returns all payments with status InFlight.
|
||||
@ -91,22 +98,21 @@ func (p *controlTower) InitPayment(paymentHash lntypes.Hash,
|
||||
return p.db.InitPayment(paymentHash, info)
|
||||
}
|
||||
|
||||
// RegisterAttempt atomically records the provided PaymentAttemptInfo to the
|
||||
// RegisterAttempt atomically records the provided HTLCAttemptInfo to the
|
||||
// DB.
|
||||
func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash,
|
||||
attempt *channeldb.PaymentAttemptInfo) error {
|
||||
attempt *channeldb.HTLCAttemptInfo) error {
|
||||
|
||||
return p.db.RegisterAttempt(paymentHash, attempt)
|
||||
}
|
||||
|
||||
// Success transitions a payment into the Succeeded state. After invoking this
|
||||
// method, InitPayment should always return an error to prevent us from making
|
||||
// duplicate payments to the same payment hash. The provided preimage is
|
||||
// atomically saved to the DB for record keeping.
|
||||
func (p *controlTower) Success(paymentHash lntypes.Hash,
|
||||
preimage lntypes.Preimage) error {
|
||||
// SettleAttempt marks the given attempt settled with the preimage. If
|
||||
// this is a multi shard payment, this might implicitly mean the the
|
||||
// full payment succeeded.
|
||||
func (p *controlTower) SettleAttempt(paymentHash lntypes.Hash,
|
||||
attemptID uint64, settleInfo *channeldb.HTLCSettleInfo) error {
|
||||
|
||||
payment, err := p.db.Success(paymentHash, preimage)
|
||||
payment, err := p.db.SettleAttempt(paymentHash, attemptID, settleInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -119,6 +125,13 @@ func (p *controlTower) Success(paymentHash lntypes.Hash,
|
||||
return nil
|
||||
}
|
||||
|
||||
// FailAttempt marks the given payment attempt failed.
|
||||
func (p *controlTower) FailAttempt(paymentHash lntypes.Hash,
|
||||
attemptID uint64, failInfo *channeldb.HTLCFailInfo) error {
|
||||
|
||||
return p.db.FailAttempt(paymentHash, attemptID, failInfo)
|
||||
}
|
||||
|
||||
// createSuccessResult creates a success result to send to subscribers.
|
||||
func createSuccessResult(htlcs []channeldb.HTLCAttempt) *PaymentResult {
|
||||
// Extract any preimage from the list of HTLCs.
|
||||
|
@ -13,9 +13,8 @@ import (
|
||||
"github.com/btcsuite/btcd/btcec"
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/routing/route"
|
||||
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/routing/route"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -111,7 +110,13 @@ func TestControlTowerSubscribeSuccess(t *testing.T) {
|
||||
}
|
||||
|
||||
// Mark the payment as successful.
|
||||
if err := pControl.Success(info.PaymentHash, preimg); err != nil {
|
||||
err = pControl.SettleAttempt(
|
||||
info.PaymentHash, attempt.AttemptID,
|
||||
&channeldb.HTLCSettleInfo{
|
||||
Preimage: preimg,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@ -213,6 +218,15 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt bool) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Fail the payment attempt.
|
||||
err := pControl.FailAttempt(
|
||||
info.PaymentHash, attempt.AttemptID,
|
||||
&channeldb.HTLCFailInfo{},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to fail htlc: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Mark the payment as failed.
|
||||
@ -298,7 +312,7 @@ func initDB() (*channeldb.DB, error) {
|
||||
return db, err
|
||||
}
|
||||
|
||||
func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.PaymentAttemptInfo,
|
||||
func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.HTLCAttemptInfo,
|
||||
lntypes.Preimage, error) {
|
||||
|
||||
preimage, err := genPreimage()
|
||||
@ -311,11 +325,11 @@ func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.PaymentAttemptInfo,
|
||||
return &channeldb.PaymentCreationInfo{
|
||||
PaymentHash: rhash,
|
||||
Value: 1,
|
||||
CreationDate: time.Unix(time.Now().Unix(), 0),
|
||||
CreationTime: time.Unix(time.Now().Unix(), 0),
|
||||
PaymentRequest: []byte("hola"),
|
||||
},
|
||||
&channeldb.PaymentAttemptInfo{
|
||||
PaymentID: 1,
|
||||
&channeldb.HTLCAttemptInfo{
|
||||
AttemptID: 1,
|
||||
SessionKey: priv,
|
||||
Route: testRoute,
|
||||
}, preimage, nil
|
||||
|
@ -178,7 +178,7 @@ type initArgs struct {
|
||||
}
|
||||
|
||||
type registerArgs struct {
|
||||
a *channeldb.PaymentAttemptInfo
|
||||
a *channeldb.HTLCAttemptInfo
|
||||
}
|
||||
|
||||
type successArgs struct {
|
||||
@ -232,13 +232,14 @@ func (m *mockControlTower) InitPayment(phash lntypes.Hash,
|
||||
|
||||
m.inflights[phash] = channeldb.InFlightPayment{
|
||||
Info: c,
|
||||
Attempts: make([]channeldb.HTLCAttemptInfo, 0),
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *mockControlTower) RegisterAttempt(phash lntypes.Hash,
|
||||
a *channeldb.PaymentAttemptInfo) error {
|
||||
a *channeldb.HTLCAttemptInfo) error {
|
||||
|
||||
m.Lock()
|
||||
defer m.Unlock()
|
||||
@ -252,20 +253,20 @@ func (m *mockControlTower) RegisterAttempt(phash lntypes.Hash,
|
||||
return fmt.Errorf("not in flight")
|
||||
}
|
||||
|
||||
p.Attempt = a
|
||||
p.Attempts = append(p.Attempts, *a)
|
||||
m.inflights[phash] = p
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *mockControlTower) Success(phash lntypes.Hash,
|
||||
preimg lntypes.Preimage) error {
|
||||
func (m *mockControlTower) SettleAttempt(phash lntypes.Hash,
|
||||
pid uint64, settleInfo *channeldb.HTLCSettleInfo) error {
|
||||
|
||||
m.Lock()
|
||||
defer m.Unlock()
|
||||
|
||||
if m.success != nil {
|
||||
m.success <- successArgs{preimg}
|
||||
m.success <- successArgs{settleInfo.Preimage}
|
||||
}
|
||||
|
||||
delete(m.inflights, phash)
|
||||
@ -310,3 +311,9 @@ func (m *mockControlTower) SubscribePayment(paymentHash lntypes.Hash) (
|
||||
|
||||
return false, nil, errors.New("not implemented")
|
||||
}
|
||||
|
||||
func (m *mockControlTower) FailAttempt(hash lntypes.Hash, pid uint64,
|
||||
failInfo *channeldb.HTLCFailInfo) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ type paymentLifecycle struct {
|
||||
timeoutChan <-chan time.Time
|
||||
currentHeight int32
|
||||
finalCLTVDelta uint16
|
||||
attempt *channeldb.PaymentAttemptInfo
|
||||
attempt *channeldb.HTLCAttemptInfo
|
||||
circuit *sphinx.Circuit
|
||||
lastError error
|
||||
}
|
||||
@ -58,6 +58,13 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
|
||||
// the DB, we send it.
|
||||
sendErr := p.sendPaymentAttempt(firstHop, htlcAdd)
|
||||
if sendErr != nil {
|
||||
// TODO(joostjager): Distinguish unexpected
|
||||
// internal errors from real send errors.
|
||||
err = p.failAttempt(sendErr)
|
||||
if err != nil {
|
||||
return [32]byte{}, nil, err
|
||||
}
|
||||
|
||||
// We must inspect the error to know whether it
|
||||
// was critical or not, to decide whether we
|
||||
// should continue trying.
|
||||
@ -97,19 +104,24 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
|
||||
// Now ask the switch to return the result of the payment when
|
||||
// available.
|
||||
resultChan, err := p.router.cfg.Payer.GetPaymentResult(
|
||||
p.attempt.PaymentID, p.payment.PaymentHash, errorDecryptor,
|
||||
p.attempt.AttemptID, p.payment.PaymentHash, errorDecryptor,
|
||||
)
|
||||
switch {
|
||||
|
||||
// If this payment ID is unknown to the Switch, it means it was
|
||||
// If this attempt ID is unknown to the Switch, it means it was
|
||||
// never checkpointed and forwarded by the switch before a
|
||||
// restart. In this case we can safely send a new payment
|
||||
// attempt, and wait for its result to be available.
|
||||
case err == htlcswitch.ErrPaymentIDNotFound:
|
||||
log.Debugf("Payment ID %v for hash %x not found in "+
|
||||
"the Switch, retrying.", p.attempt.PaymentID,
|
||||
"the Switch, retrying.", p.attempt.AttemptID,
|
||||
p.payment.PaymentHash)
|
||||
|
||||
err = p.failAttempt(err)
|
||||
if err != nil {
|
||||
return [32]byte{}, nil, err
|
||||
}
|
||||
|
||||
// Reset the attempt to indicate we want to make a new
|
||||
// attempt.
|
||||
p.attempt = nil
|
||||
@ -117,8 +129,8 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
|
||||
|
||||
// A critical, unexpected error was encountered.
|
||||
case err != nil:
|
||||
log.Errorf("Failed getting result for paymentID %d "+
|
||||
"from switch: %v", p.attempt.PaymentID, err)
|
||||
log.Errorf("Failed getting result for attemptID %d "+
|
||||
"from switch: %v", p.attempt.AttemptID, err)
|
||||
|
||||
return [32]byte{}, nil, err
|
||||
}
|
||||
@ -146,6 +158,11 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
|
||||
log.Errorf("Attempt to send payment %x failed: %v",
|
||||
p.payment.PaymentHash, result.Error)
|
||||
|
||||
err = p.failAttempt(result.Error)
|
||||
if err != nil {
|
||||
return [32]byte{}, nil, err
|
||||
}
|
||||
|
||||
// We must inspect the error to know whether it was
|
||||
// critical or not, to decide whether we should
|
||||
// continue trying.
|
||||
@ -161,11 +178,11 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
|
||||
|
||||
// We successfully got a payment result back from the switch.
|
||||
log.Debugf("Payment %x succeeded with pid=%v",
|
||||
p.payment.PaymentHash, p.attempt.PaymentID)
|
||||
p.payment.PaymentHash, p.attempt.AttemptID)
|
||||
|
||||
// Report success to mission control.
|
||||
err = p.router.cfg.MissionControl.ReportPaymentSuccess(
|
||||
p.attempt.PaymentID, &p.attempt.Route,
|
||||
p.attempt.AttemptID, &p.attempt.Route,
|
||||
)
|
||||
if err != nil {
|
||||
log.Errorf("Error reporting payment success to mc: %v",
|
||||
@ -174,7 +191,13 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) {
|
||||
|
||||
// In case of success we atomically store the db payment and
|
||||
// move the payment to the success state.
|
||||
err = p.router.cfg.Control.Success(p.payment.PaymentHash, result.Preimage)
|
||||
err = p.router.cfg.Control.SettleAttempt(
|
||||
p.payment.PaymentHash, p.attempt.AttemptID,
|
||||
&channeldb.HTLCSettleInfo{
|
||||
Preimage: result.Preimage,
|
||||
SettleTime: p.router.cfg.Clock.Now(),
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
log.Errorf("Unable to succeed payment "+
|
||||
"attempt: %v", err)
|
||||
@ -331,21 +354,22 @@ func (p *paymentLifecycle) createNewPaymentAttempt() (lnwire.ShortChannelID,
|
||||
|
||||
// We generate a new, unique payment ID that we will use for
|
||||
// this HTLC.
|
||||
paymentID, err := p.router.cfg.NextPaymentID()
|
||||
attemptID, err := p.router.cfg.NextPaymentID()
|
||||
if err != nil {
|
||||
return lnwire.ShortChannelID{}, nil, err
|
||||
}
|
||||
|
||||
// We now have all the information needed to populate
|
||||
// the current attempt information.
|
||||
p.attempt = &channeldb.PaymentAttemptInfo{
|
||||
PaymentID: paymentID,
|
||||
p.attempt = &channeldb.HTLCAttemptInfo{
|
||||
AttemptID: attemptID,
|
||||
AttemptTime: p.router.cfg.Clock.Now(),
|
||||
SessionKey: sessionKey,
|
||||
Route: *rt,
|
||||
}
|
||||
|
||||
// Before sending this HTLC to the switch, we checkpoint the
|
||||
// fresh paymentID and route to the DB. This lets us know on
|
||||
// fresh attemptID and route to the DB. This lets us know on
|
||||
// startup the ID of the payment that we attempted to send,
|
||||
// such that we can query the Switch for its whereabouts. The
|
||||
// route is needed to handle the result when it eventually
|
||||
@ -363,7 +387,7 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID,
|
||||
htlcAdd *lnwire.UpdateAddHTLC) error {
|
||||
|
||||
log.Tracef("Attempting to send payment %x (pid=%v), "+
|
||||
"using route: %v", p.payment.PaymentHash, p.attempt.PaymentID,
|
||||
"using route: %v", p.payment.PaymentHash, p.attempt.AttemptID,
|
||||
newLogClosure(func() string {
|
||||
return spew.Sdump(p.attempt.Route)
|
||||
}),
|
||||
@ -374,17 +398,17 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID,
|
||||
// such that we can resume waiting for the result after a
|
||||
// restart.
|
||||
err := p.router.cfg.Payer.SendHTLC(
|
||||
firstHop, p.attempt.PaymentID, htlcAdd,
|
||||
firstHop, p.attempt.AttemptID, htlcAdd,
|
||||
)
|
||||
if err != nil {
|
||||
log.Errorf("Failed sending attempt %d for payment "+
|
||||
"%x to switch: %v", p.attempt.PaymentID,
|
||||
"%x to switch: %v", p.attempt.AttemptID,
|
||||
p.payment.PaymentHash, err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Debugf("Payment %x (pid=%v) successfully sent to switch, route: %v",
|
||||
p.payment.PaymentHash, p.attempt.PaymentID, &p.attempt.Route)
|
||||
p.payment.PaymentHash, p.attempt.AttemptID, &p.attempt.Route)
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -394,7 +418,7 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID,
|
||||
func (p *paymentLifecycle) handleSendError(sendErr error) error {
|
||||
|
||||
reason := p.router.processSendError(
|
||||
p.attempt.PaymentID, &p.attempt.Route, sendErr,
|
||||
p.attempt.AttemptID, &p.attempt.Route, sendErr,
|
||||
)
|
||||
if reason == nil {
|
||||
// Save the forwarding error so it can be returned if
|
||||
@ -421,3 +445,62 @@ func (p *paymentLifecycle) handleSendError(sendErr error) error {
|
||||
// Terminal state, return the error we encountered.
|
||||
return sendErr
|
||||
}
|
||||
|
||||
// failAttempt calls control tower to fail the current payment attempt.
|
||||
func (p *paymentLifecycle) failAttempt(sendError error) error {
|
||||
failInfo := marshallError(
|
||||
sendError,
|
||||
p.router.cfg.Clock.Now(),
|
||||
)
|
||||
|
||||
return p.router.cfg.Control.FailAttempt(
|
||||
p.payment.PaymentHash, p.attempt.AttemptID,
|
||||
failInfo,
|
||||
)
|
||||
}
|
||||
|
||||
// marshallError marshall an error as received from the switch to a structure
|
||||
// that is suitable for database storage.
|
||||
func marshallError(sendError error, time time.Time) *channeldb.HTLCFailInfo {
|
||||
response := &channeldb.HTLCFailInfo{
|
||||
FailTime: time,
|
||||
}
|
||||
|
||||
switch sendError {
|
||||
|
||||
case htlcswitch.ErrPaymentIDNotFound:
|
||||
response.Reason = channeldb.HTLCFailInternal
|
||||
return response
|
||||
|
||||
case htlcswitch.ErrUnreadableFailureMessage:
|
||||
response.Reason = channeldb.HTLCFailUnreadable
|
||||
return response
|
||||
}
|
||||
|
||||
rtErr, ok := sendError.(htlcswitch.ClearTextError)
|
||||
if !ok {
|
||||
response.Reason = channeldb.HTLCFailInternal
|
||||
return response
|
||||
}
|
||||
|
||||
message := rtErr.WireMessage()
|
||||
if message != nil {
|
||||
response.Reason = channeldb.HTLCFailMessage
|
||||
response.Message = message
|
||||
} else {
|
||||
response.Reason = channeldb.HTLCFailUnknown
|
||||
}
|
||||
|
||||
// If the ClearTextError received is a ForwardingError, the error
|
||||
// originated from a node along the route, not locally on our outgoing
|
||||
// link. We set failureSourceIdx to the index of the node where the
|
||||
// failure occurred. If the error is not a ForwardingError, the failure
|
||||
// occurred at our node, so we leave the index as 0 to indicate that
|
||||
// we failed locally.
|
||||
fErr, ok := rtErr.(*htlcswitch.ForwardingError)
|
||||
if ok {
|
||||
response.FailureSourceIndex = uint32(fErr.FailureSourceIdx)
|
||||
}
|
||||
|
||||
return response
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ import (
|
||||
|
||||
sphinx "github.com/lightningnetwork/lightning-onion"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/clock"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||
"github.com/lightningnetwork/lnd/input"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
@ -302,6 +303,9 @@ type Config struct {
|
||||
|
||||
// PathFindingConfig defines global path finding parameters.
|
||||
PathFindingConfig PathFindingConfig
|
||||
|
||||
// Clock is mockable time provider.
|
||||
Clock clock.Clock
|
||||
}
|
||||
|
||||
// EdgeLocator is a struct used to identify a specific edge.
|
||||
@ -537,7 +541,14 @@ func (r *ChannelRouter) Start() error {
|
||||
PaymentHash: payment.Info.PaymentHash,
|
||||
}
|
||||
|
||||
_, _, err := r.sendPayment(payment.Attempt, lPayment, paySession)
|
||||
// TODO(joostjager): For mpp, possibly relaunch multiple
|
||||
// in-flight htlcs here.
|
||||
var attempt *channeldb.HTLCAttemptInfo
|
||||
if len(payment.Attempts) > 0 {
|
||||
attempt = &payment.Attempts[0]
|
||||
}
|
||||
|
||||
_, _, err := r.sendPayment(attempt, lPayment, paySession)
|
||||
if err != nil {
|
||||
log.Errorf("Resuming payment with hash %v "+
|
||||
"failed: %v.", payment.Info.PaymentHash, err)
|
||||
@ -1680,7 +1691,7 @@ func (r *ChannelRouter) preparePayment(payment *LightningPayment) (
|
||||
info := &channeldb.PaymentCreationInfo{
|
||||
PaymentHash: payment.PaymentHash,
|
||||
Value: payment.Amount,
|
||||
CreationDate: time.Now(),
|
||||
CreationTime: r.cfg.Clock.Now(),
|
||||
PaymentRequest: payment.PaymentRequest,
|
||||
}
|
||||
|
||||
@ -1709,7 +1720,7 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) (
|
||||
info := &channeldb.PaymentCreationInfo{
|
||||
PaymentHash: hash,
|
||||
Value: amt,
|
||||
CreationDate: time.Now(),
|
||||
CreationTime: r.cfg.Clock.Now(),
|
||||
PaymentRequest: nil,
|
||||
}
|
||||
|
||||
@ -1768,7 +1779,7 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) (
|
||||
// router will call this method for every payment still in-flight according to
|
||||
// the ControlTower.
|
||||
func (r *ChannelRouter) sendPayment(
|
||||
existingAttempt *channeldb.PaymentAttemptInfo,
|
||||
existingAttempt *channeldb.HTLCAttemptInfo,
|
||||
payment *LightningPayment, paySession PaymentSession) (
|
||||
[32]byte, *route.Route, error) {
|
||||
|
||||
|
@ -19,6 +19,7 @@ import (
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/clock"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
@ -131,6 +132,7 @@ func createTestCtxFromGraphInstance(startingHeight uint32, graphInstance *testGr
|
||||
return next, nil
|
||||
},
|
||||
PathFindingConfig: pathFindingConfig,
|
||||
Clock: clock.NewTestClock(time.Unix(1, 0)),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("unable to create router %v", err)
|
||||
@ -2967,6 +2969,7 @@ func TestRouterPaymentStateMachine(t *testing.T) {
|
||||
next := atomic.AddUint64(&uniquePaymentID, 1)
|
||||
return next, nil
|
||||
},
|
||||
Clock: clock.NewTestClock(time.Unix(1, 0)),
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("unable to create router %v", err)
|
||||
|
@ -740,6 +740,7 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB,
|
||||
AssumeChannelValid: cfg.Routing.UseAssumeChannelValid(),
|
||||
NextPaymentID: sequencer.NextID,
|
||||
PathFindingConfig: pathFindingConfig,
|
||||
Clock: clock.NewDefaultClock(),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("can't create router: %v", err)
|
||||
|
Loading…
Reference in New Issue
Block a user