chore(savedaddresses)!: favourite property removed and primary key updated

- favourite column removed from the saved_addresses table
- favourite property removed from the SavedAddress struct
- ens name removed from the primary key, the primary key now is composed of address and is_test columns
- ens parameter removed from wakuext_deleteSavedAddress
- wallet_getSavedAddresses moved to wakuext_getSavedAddresses (to keep them all in a single place)
- saved addresses related endpoints removed from the wallet service, even they logically belong there, a reason for that
is avoiding emitting sync message if one uses calls from the wallet service, while that's not the case in ext service. Once
we refactor this and introduce devices syncing mechanism in the wallet service, we should not only these but other wallet
related endpoints move there (removed: wallet_getSavedAddresses, wallet_addSavedAddress and wallet_deleteSavedAddress).

Affected area:
Saved addresses
This commit is contained in:
Sale Djenic 2024-01-09 15:59:54 +01:00 committed by saledjenic
parent 2a5dc6dec0
commit 280f48877d
11 changed files with 366 additions and 343 deletions

View File

@ -1 +1 @@
0.172.2
0.172.3

View File

@ -22,13 +22,17 @@ func (m *Messenger) UpsertSavedAddress(ctx context.Context, sa wallet.SavedAddre
return m.syncNewSavedAddress(ctx, &sa, updatedClock, m.dispatchMessage)
}
func (m *Messenger) DeleteSavedAddress(ctx context.Context, address gethcommon.Address, ens string, isTest bool) error {
func (m *Messenger) DeleteSavedAddress(ctx context.Context, address gethcommon.Address, isTest bool) error {
updateClock := uint64(time.Now().Unix())
_, err := m.savedAddressesManager.DeleteSavedAddress(address, ens, isTest, updateClock)
_, err := m.savedAddressesManager.DeleteSavedAddress(address, isTest, updateClock)
if err != nil {
return err
}
return m.syncDeletedSavedAddress(ctx, address, ens, isTest, updateClock, m.dispatchMessage)
return m.syncDeletedSavedAddress(ctx, address, isTest, updateClock, m.dispatchMessage)
}
func (m *Messenger) GetSavedAddresses(ctx context.Context) ([]wallet.SavedAddress, error) {
return m.savedAddressesManager.GetSavedAddresses()
}
func (m *Messenger) garbageCollectRemovedSavedAddresses() error {
@ -67,7 +71,6 @@ func (m *Messenger) syncNewSavedAddress(ctx context.Context, savedAddress *walle
return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{
Address: savedAddress.Address.Bytes(),
Name: savedAddress.Name,
Favourite: savedAddress.Favourite,
Removed: savedAddress.Removed,
UpdateClock: savedAddress.UpdateClock,
ChainShortNames: savedAddress.ChainShortNames,
@ -77,19 +80,18 @@ func (m *Messenger) syncNewSavedAddress(ctx context.Context, savedAddress *walle
}, rawMessageHandler)
}
func (m *Messenger) syncDeletedSavedAddress(ctx context.Context, address gethcommon.Address, ens string, isTest bool, updateClock uint64, rawMessageHandler RawMessageHandler) error {
func (m *Messenger) syncDeletedSavedAddress(ctx context.Context, address gethcommon.Address, isTest bool, updateClock uint64, rawMessageHandler RawMessageHandler) error {
return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{
Address: address.Bytes(),
UpdateClock: updateClock,
Removed: true,
IsTest: isTest,
Ens: ens,
}, rawMessageHandler)
}
func (m *Messenger) syncSavedAddress(ctx context.Context, savedAddress wallet.SavedAddress, rawMessageHandler RawMessageHandler) (err error) {
if savedAddress.Removed {
if err = m.syncDeletedSavedAddress(ctx, savedAddress.Address, savedAddress.ENSName, savedAddress.IsTest, savedAddress.UpdateClock, rawMessageHandler); err != nil {
if err = m.syncDeletedSavedAddress(ctx, savedAddress.Address, savedAddress.IsTest, savedAddress.UpdateClock, rawMessageHandler); err != nil {
return err
}
} else {
@ -104,7 +106,7 @@ func (m *Messenger) HandleSyncSavedAddress(state *ReceivedMessageState, syncMess
address := gethcommon.BytesToAddress(syncMessage.Address)
if syncMessage.Removed {
_, err = m.savedAddressesManager.DeleteSavedAddress(
address, syncMessage.Ens, syncMessage.IsTest, syncMessage.UpdateClock)
address, syncMessage.IsTest, syncMessage.UpdateClock)
if err != nil {
return err
}
@ -113,7 +115,6 @@ func (m *Messenger) HandleSyncSavedAddress(state *ReceivedMessageState, syncMess
sa := wallet.SavedAddress{
Address: address,
Name: syncMessage.Name,
Favourite: syncMessage.Favourite,
ChainShortNames: syncMessage.ChainShortNames,
ENSName: syncMessage.Ens,
IsTest: syncMessage.IsTest,

View File

@ -114,7 +114,7 @@ func haveSameElements[T comparable](a []T, b []T, isEqual func(T, T) bool) bool
func savedAddressDataIsEqual(a, b wallet.SavedAddress) bool {
return a.Address == b.Address && a.IsTest == b.IsTest && a.Name == b.Name &&
a.Favourite == b.Favourite && a.ENSName == b.ENSName && a.ChainShortNames == b.ChainShortNames && a.ColorID == b.ColorID
a.ENSName == b.ENSName && a.ChainShortNames == b.ChainShortNames && a.ColorID == b.ColorID
}
func (s *MessengerSyncSavedAddressesSuite) TestSyncExistingSavedAddresses() {
@ -124,16 +124,14 @@ func (s *MessengerSyncSavedAddressesSuite) TestSyncExistingSavedAddresses() {
// Add saved addresses to main device
sa1 := wallet.SavedAddress{
Address: testAddress1,
Name: "TestC1A1",
Favourite: false,
IsTest: isTestChain1,
Address: testAddress1,
Name: "TestC1A1",
IsTest: isTestChain1,
}
sa2 := wallet.SavedAddress{
ENSName: "test.ens.eth",
Name: "TestC2A1",
Favourite: true,
IsTest: isTestChain2,
ENSName: "test.ens.eth",
Name: "TestC2A1",
IsTest: isTestChain2,
}
savedAddressesManager := s.main.savedAddressesManager
@ -174,16 +172,14 @@ func (s *MessengerSyncSavedAddressesSuite) TestSyncSavedAddresses() {
// Add saved addresses to main device
sa1 := wallet.SavedAddress{
Address: testAddress1,
Name: "TestC1A1",
Favourite: false,
IsTest: isTestChain1,
Address: testAddress1,
Name: "TestC1A1",
IsTest: isTestChain1,
}
sa2 := wallet.SavedAddress{
ENSName: "test.ens.eth",
Name: "TestC1A2",
Favourite: true,
IsTest: isTestChain1,
ENSName: "test.ens.eth",
Name: "TestC1A2",
IsTest: isTestChain1,
}
err := s.main.UpsertSavedAddress(context.Background(), sa1)
@ -216,19 +212,18 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
var isTestChain1 bool = true
var isTestChain2 bool = false
var testAddress1 = common.Address{1}
var testAddress2 = common.Address{2}
// Add saved addresses to main device
sa1 := wallet.SavedAddress{
Address: testAddress1,
Name: "TestC1A1",
Favourite: false,
IsTest: isTestChain1,
Address: testAddress1,
Name: "TestC1A1",
IsTest: isTestChain1,
}
sa2 := wallet.SavedAddress{
ENSName: "test.ens.eth",
Name: "TestC1A2",
Favourite: true,
IsTest: isTestChain2,
Address: testAddress2,
Name: "TestC1A2",
IsTest: isTestChain2,
}
err := s.main.settings.SaveSettingField(settings.TestNetworksEnabled, testModeMain)
@ -262,7 +257,7 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
s.Require().Equal(2, len(savedAddresses))
// Delete saved addresses with test mode = true and sync with the other device
err = s.main.DeleteSavedAddress(context.Background(), sa1.Address, sa1.ENSName, sa1.IsTest)
err = s.main.DeleteSavedAddress(context.Background(), sa1.Address, sa1.IsTest)
s.Require().NoError(err)
// Wait and check that saved addresses are synced
@ -273,10 +268,8 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
sa := r.SavedAddresses()[0]
// We expect the deleted event to report address, ens, isTest
s.Require().Equal(sa1.Address, sa.Address)
s.Require().Equal(sa1.ENSName, sa.ENSName)
s.Require().Equal(sa1.IsTest, sa.IsTest)
s.Require().Equal("", sa.Name)
s.Require().Equal(false, sa.Favourite)
return true
}
return false
@ -291,7 +284,7 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
s.Require().True(haveSameElements([]wallet.SavedAddress{sa2}, savedAddresses, savedAddressDataIsEqual))
// Delete saved addresses with test mode = false and sync with the other device
err = s.main.DeleteSavedAddress(context.Background(), sa2.Address, sa2.ENSName, sa2.IsTest)
err = s.main.DeleteSavedAddress(context.Background(), sa2.Address, sa2.IsTest)
s.Require().NoError(err)
// Wait and check that saved addresses are synced
@ -302,10 +295,8 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
sa := r.SavedAddresses()[0]
// We expect the deleted event to report address, ens, isTest
s.Require().Equal(sa2.Address, sa.Address)
s.Require().Equal(sa2.ENSName, sa.ENSName)
s.Require().Equal(sa2.IsTest, sa.IsTest)
s.Require().Equal("", sa.Name)
s.Require().Equal(false, sa.Favourite)
return true
}
return false

View File

@ -2622,7 +2622,6 @@ func (m *SyncAccountsPositions) GetAccounts() []*SyncAccount {
type SyncSavedAddress struct {
Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Favourite bool `protobuf:"varint,3,opt,name=favourite,proto3" json:"favourite,omitempty"`
Removed bool `protobuf:"varint,5,opt,name=removed,proto3" json:"removed,omitempty"`
UpdateClock uint64 `protobuf:"varint,7,opt,name=update_clock,json=updateClock,proto3" json:"update_clock,omitempty"`
ChainShortNames string `protobuf:"bytes,8,opt,name=chain_short_names,json=chainShortNames,proto3" json:"chain_short_names,omitempty"`
@ -2673,13 +2672,6 @@ func (m *SyncSavedAddress) GetName() string {
return ""
}
func (m *SyncSavedAddress) GetFavourite() bool {
if m != nil {
return m.Favourite
}
return false
}
func (m *SyncSavedAddress) GetRemoved() bool {
if m != nil {
return m.Removed
@ -3537,216 +3529,216 @@ func init() {
}
var fileDescriptor_d61ab7221f0b5518 = []byte{
// 3368 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x5a, 0x4f, 0x6f, 0x1c, 0xc7,
0x72, 0xf7, 0xfe, 0xe1, 0x72, 0xb7, 0x76, 0x49, 0xae, 0x5a, 0x94, 0xb4, 0xa2, 0x24, 0x98, 0x1a,
0xdb, 0xb0, 0xec, 0x38, 0x74, 0x42, 0x3b, 0xb1, 0x61, 0xcb, 0x70, 0x28, 0x92, 0x8e, 0xa8, 0x3f,
0x14, 0xd3, 0x24, 0x65, 0x3b, 0x08, 0x30, 0x6e, 0xce, 0xb4, 0xb8, 0x63, 0xce, 0xce, 0x4c, 0xa6,
0x7b, 0xc9, 0xac, 0x0f, 0x01, 0x02, 0xe4, 0xe0, 0x53, 0x90, 0x9b, 0x6f, 0x81, 0x11, 0x04, 0x41,
0x92, 0x63, 0x6e, 0xf9, 0x02, 0xc1, 0x3b, 0xbe, 0xfb, 0x7b, 0x5f, 0xe0, 0x7d, 0x88, 0x07, 0x3c,
0x74, 0x75, 0xcf, 0x4c, 0xcf, 0xee, 0x0e, 0x2d, 0xe2, 0x9d, 0x76, 0xaa, 0xba, 0xba, 0xa7, 0xba,
0xbb, 0xfe, 0xfc, 0xaa, 0x66, 0x61, 0x29, 0x61, 0x41, 0x1a, 0x44, 0xa7, 0x1b, 0x49, 0x1a, 0xcb,
0x98, 0xb4, 0xf1, 0xe7, 0x64, 0xfc, 0x6a, 0xed, 0xba, 0x37, 0x64, 0xd2, 0x0d, 0x7c, 0x1e, 0xc9,
0x40, 0x4e, 0xf4, 0xf0, 0xda, 0x75, 0x31, 0x89, 0x3c, 0x57, 0x70, 0x29, 0x83, 0xe8, 0x54, 0x18,
0xa6, 0xc3, 0x92, 0x24, 0x0c, 0x3c, 0x26, 0x83, 0x38, 0x72, 0x47, 0x5c, 0x32, 0x9f, 0x49, 0xe6,
0x8e, 0xb8, 0x10, 0xec, 0x94, 0x1b, 0x99, 0x6b, 0x5e, 0x3c, 0x1a, 0x8d, 0xa3, 0x40, 0x06, 0xdc,
0x4c, 0x73, 0x18, 0xdc, 0xf9, 0x8a, 0x4b, 0x6f, 0x18, 0x44, 0xa7, 0x8f, 0x98, 0x77, 0xc6, 0xfd,
0xe3, 0x64, 0x87, 0x49, 0xb6, 0xc3, 0x25, 0x0b, 0x42, 0x41, 0xde, 0x84, 0x2e, 0xae, 0x13, 0x8d,
0x47, 0x27, 0x3c, 0x1d, 0xd4, 0xd6, 0x6b, 0x0f, 0x96, 0x28, 0x28, 0xd6, 0x3e, 0x72, 0xc8, 0x7d,
0xe8, 0xc9, 0x58, 0xb2, 0x30, 0x93, 0xa8, 0xa3, 0x44, 0x17, 0x79, 0x5a, 0xc4, 0xf9, 0xfd, 0x22,
0xb4, 0xd4, 0xda, 0xe3, 0x84, 0xac, 0xc2, 0x82, 0x17, 0xc6, 0xde, 0x19, 0x2e, 0xd4, 0xa4, 0x9a,
0x20, 0xcb, 0x50, 0x0f, 0x7c, 0x9c, 0xd9, 0xa1, 0xf5, 0xc0, 0x27, 0x5f, 0x42, 0xdb, 0x8b, 0x23,
0xc9, 0x3c, 0x29, 0x06, 0x8d, 0xf5, 0xc6, 0x83, 0xee, 0xe6, 0x5b, 0x1b, 0xd9, 0x89, 0x6c, 0x1c,
0x4e, 0x22, 0x6f, 0x2f, 0x12, 0x92, 0x85, 0x21, 0xee, 0x75, 0x5b, 0x4b, 0xbe, 0xdc, 0xa4, 0xf9,
0x24, 0xb2, 0x0b, 0x5d, 0x6b, 0xa7, 0x83, 0xe6, 0x2f, 0xaf, 0xa1, 0x85, 0x27, 0xd4, 0x9e, 0x47,
0x5e, 0xc0, 0x4a, 0xb6, 0xa4, 0x39, 0x8f, 0xc1, 0xc2, 0x7a, 0xed, 0x41, 0x77, 0xf3, 0x9d, 0x62,
0xa9, 0x4b, 0x0e, 0x8f, 0x4e, 0xcf, 0x26, 0xc7, 0x40, 0xac, 0xf5, 0xb3, 0x35, 0x5b, 0x57, 0x59,
0x73, 0xce, 0x02, 0xe4, 0x23, 0x58, 0x4c, 0xd2, 0xf8, 0x55, 0x10, 0xf2, 0xc1, 0x22, 0xae, 0x75,
0xbb, 0x58, 0x2b, 0x5b, 0xe3, 0x40, 0x0b, 0xd0, 0x4c, 0x92, 0x3c, 0x87, 0x65, 0xf3, 0x98, 0xe9,
0xd1, 0xbe, 0x8a, 0x1e, 0x53, 0x93, 0xc9, 0x87, 0xb0, 0x68, 0x0c, 0x72, 0xd0, 0xc1, 0x75, 0x6e,
0x94, 0x8f, 0xfb, 0x50, 0x0f, 0xd2, 0x4c, 0x4a, 0x1d, 0x6e, 0x66, 0xc1, 0x99, 0x02, 0x70, 0xa5,
0xc3, 0x9d, 0x9a, 0xad, 0x34, 0x38, 0xe3, 0x13, 0xe5, 0x48, 0x83, 0xee, 0x3c, 0x0d, 0x9e, 0xea,
0x41, 0x9a, 0x49, 0xa9, 0x13, 0x30, 0x8f, 0x99, 0x02, 0xbd, 0x2b, 0x9d, 0x40, 0x79, 0x32, 0xd9,
0x82, 0xfe, 0x05, 0x93, 0xde, 0xf0, 0x45, 0x14, 0x4e, 0xb6, 0x3c, 0x2f, 0x1e, 0x47, 0x72, 0xb0,
0x34, 0x4f, 0x11, 0x33, 0x48, 0x67, 0xc4, 0x89, 0x0b, 0xb7, 0xa6, 0x79, 0x99, 0x6a, 0xcb, 0x57,
0x51, 0xad, 0x6a, 0x15, 0xf2, 0x00, 0x16, 0x54, 0x40, 0x11, 0x83, 0x15, 0x74, 0x09, 0x52, 0x56,
0x6c, 0x7b, 0xc8, 0x24, 0xd5, 0x02, 0x64, 0x0f, 0x7a, 0xf8, 0x90, 0xbd, 0xbf, 0x7f, 0x95, 0xf7,
0x97, 0xa6, 0x3a, 0xff, 0xb5, 0x00, 0xbd, 0xe7, 0xe3, 0x50, 0x06, 0xd9, 0x36, 0x09, 0x34, 0x23,
0x36, 0xe2, 0x18, 0x04, 0x3a, 0x14, 0x9f, 0xc9, 0x5d, 0xe8, 0xc8, 0x60, 0xc4, 0x85, 0x64, 0xa3,
0x04, 0x43, 0x41, 0x83, 0x16, 0x0c, 0x35, 0xaa, 0x63, 0xa0, 0x17, 0x47, 0x83, 0x06, 0x4e, 0x2b,
0x18, 0xe4, 0x4b, 0x00, 0x2f, 0x0e, 0xe3, 0xd4, 0x1d, 0x32, 0x31, 0x34, 0xde, 0xbe, 0x5e, 0x68,
0x6a, 0xbf, 0x7b, 0x63, 0x5b, 0x09, 0x3e, 0x66, 0x62, 0x48, 0x3b, 0x5e, 0xf6, 0x48, 0x6e, 0xab,
0x80, 0xa3, 0x16, 0x08, 0x7c, 0xf4, 0xf0, 0x06, 0x5d, 0x44, 0x7a, 0xcf, 0x27, 0xef, 0xc2, 0xca,
0x19, 0x9f, 0x78, 0x2c, 0xf5, 0x5d, 0x13, 0xa3, 0xd1, 0x5f, 0x3b, 0x78, 0xfd, 0x8a, 0x7d, 0xa0,
0xb9, 0xe4, 0x16, 0x9a, 0x9f, 0x3b, 0x0e, 0x7c, 0x74, 0xc2, 0x0e, 0x6d, 0x9d, 0xf1, 0xc9, 0x71,
0xe0, 0x93, 0x87, 0xd0, 0x0a, 0x46, 0xec, 0x94, 0x2b, 0x07, 0x53, 0x9a, 0xbd, 0x5d, 0xa1, 0xd9,
0x9e, 0x09, 0xf2, 0x7b, 0x4a, 0x98, 0x9a, 0x39, 0xe4, 0x43, 0xb8, 0xee, 0x8d, 0x85, 0x8c, 0x47,
0xc1, 0x0f, 0x3a, 0xb4, 0xa3, 0x62, 0xe8, 0x63, 0x1d, 0x4a, 0x4a, 0x43, 0xb8, 0x35, 0xf2, 0x19,
0xdc, 0x9e, 0x33, 0xc1, 0xd5, 0x61, 0x17, 0x30, 0xec, 0xde, 0x9a, 0x9d, 0xb6, 0xad, 0x86, 0xd7,
0xee, 0x43, 0x27, 0x3f, 0x1f, 0x15, 0xab, 0x83, 0xc8, 0xe7, 0xff, 0x30, 0xa8, 0xad, 0x37, 0x1e,
0x34, 0xa8, 0x26, 0xd6, 0x7e, 0x53, 0x83, 0xa5, 0x92, 0xa6, 0xf6, 0xc6, 0x6b, 0xa5, 0x8d, 0x67,
0xd7, 0x5c, 0xb7, 0xae, 0x79, 0x00, 0x8b, 0x09, 0x9b, 0x84, 0x31, 0xf3, 0xf1, 0x1a, 0x7b, 0x34,
0x23, 0xd5, 0xeb, 0x2e, 0x02, 0x5f, 0xaa, 0xfb, 0x53, 0x17, 0xa0, 0x09, 0x72, 0x13, 0x5a, 0x43,
0x1e, 0x9c, 0x0e, 0xa5, 0xb9, 0x17, 0x43, 0x91, 0x35, 0x68, 0xab, 0xe8, 0x23, 0x82, 0x1f, 0x38,
0xde, 0x47, 0x83, 0xe6, 0x34, 0x79, 0x0b, 0x96, 0x52, 0x7c, 0x72, 0x25, 0x4b, 0x4f, 0xb9, 0xc4,
0xfb, 0x68, 0xd0, 0x9e, 0x66, 0x1e, 0x21, 0xaf, 0xc8, 0x44, 0x6d, 0x2b, 0x13, 0x39, 0x3f, 0xd5,
0xe1, 0xfa, 0xb3, 0xd8, 0x63, 0xa1, 0xb9, 0xd5, 0x03, 0xa3, 0xdc, 0x5f, 0x40, 0xf3, 0x8c, 0x4f,
0x04, 0x1e, 0x45, 0x77, 0xf3, 0x7e, 0x71, 0x83, 0x73, 0x84, 0x37, 0x9e, 0xf2, 0x09, 0x45, 0x71,
0xf2, 0x19, 0xf4, 0x46, 0xea, 0x8a, 0x99, 0x09, 0x07, 0x75, 0x74, 0xa2, 0x9b, 0xf3, 0x0d, 0x80,
0x96, 0x64, 0xd5, 0x0e, 0x13, 0x26, 0xc4, 0x45, 0x9c, 0xfa, 0xc6, 0xe2, 0x73, 0x5a, 0x9d, 0xa2,
0xf2, 0xb0, 0xa7, 0x7c, 0x82, 0xa7, 0xd5, 0xa1, 0x19, 0x49, 0x1e, 0xe4, 0xe6, 0x6a, 0x94, 0xd2,
0x29, 0xab, 0x43, 0xa7, 0xd9, 0x6b, 0x7f, 0x0a, 0x0d, 0x35, 0x61, 0x9e, 0x2f, 0x12, 0x68, 0xaa,
0x0c, 0x8f, 0xea, 0xf6, 0x28, 0x3e, 0x3b, 0xff, 0x57, 0x83, 0x1b, 0xa5, 0xcd, 0x72, 0x9e, 0x3e,
0xe6, 0x61, 0x18, 0x2b, 0x0f, 0x31, 0x9e, 0xe1, 0x9e, 0xf3, 0x54, 0x04, 0x71, 0x84, 0x8b, 0x2d,
0xd0, 0x65, 0xc3, 0x7e, 0xa9, 0xb9, 0xca, 0x50, 0x12, 0xce, 0xd1, 0xc9, 0xf4, 0xca, 0x2d, 0x45,
0xee, 0xf9, 0x08, 0x32, 0xf8, 0x79, 0xe0, 0x71, 0x17, 0x55, 0xd1, 0xbb, 0x05, 0xcd, 0xda, 0x57,
0x0a, 0x15, 0x02, 0x72, 0x92, 0x70, 0xb3, 0x67, 0x23, 0x70, 0x34, 0x49, 0x30, 0x7a, 0x88, 0xe0,
0x34, 0x62, 0x72, 0x9c, 0x72, 0xdc, 0x70, 0x8f, 0x16, 0x0c, 0xe7, 0x3f, 0x6a, 0xb0, 0xaa, 0xe2,
0x9b, 0x52, 0xdd, 0x4e, 0xfb, 0x15, 0x70, 0xe4, 0x5d, 0x58, 0x09, 0x2c, 0x29, 0x37, 0xc7, 0x26,
0xcb, 0x36, 0xbb, 0xa4, 0x37, 0xaa, 0xd5, 0x98, 0x51, 0x2b, 0x3b, 0xdc, 0x66, 0xd9, 0x03, 0xb2,
0x63, 0x5a, 0x40, 0xac, 0x94, 0x91, 0xce, 0x3f, 0xb5, 0xe0, 0x76, 0x25, 0xba, 0x21, 0x7f, 0x06,
0xab, 0x21, 0x13, 0xd2, 0x1d, 0x27, 0x3e, 0x93, 0xdc, 0x77, 0x43, 0x75, 0x19, 0xe1, 0xc4, 0xa8,
0x4e, 0xd4, 0xd8, 0xb1, 0x1e, 0x7a, 0xa6, 0x47, 0x66, 0x60, 0xd5, 0x5b, 0xb0, 0x64, 0x92, 0xb6,
0x8b, 0xc1, 0xc5, 0x28, 0xdc, 0x33, 0x4c, 0xed, 0xcd, 0xb7, 0xa1, 0xcd, 0x23, 0xe1, 0x5a, 0x6a,
0x2f, 0xf2, 0x48, 0xe0, 0x2d, 0xdc, 0x87, 0x9e, 0xad, 0x01, 0xaa, 0xdf, 0xa4, 0x5d, 0xeb, 0xcd,
0xea, 0x44, 0xc4, 0x44, 0x48, 0x3e, 0x72, 0x25, 0x3b, 0x55, 0xc8, 0xa6, 0xa1, 0x4e, 0x44, 0xb3,
0x8e, 0xd8, 0xa9, 0x20, 0xef, 0xc0, 0x32, 0x2a, 0xee, 0x46, 0x81, 0x77, 0x86, 0x2f, 0xd1, 0xc1,
0x72, 0x09, 0xb9, 0xfb, 0x86, 0xa9, 0x2e, 0x86, 0xf9, 0x3e, 0xf7, 0x31, 0xce, 0xb5, 0xa9, 0x26,
0xd4, 0xd1, 0x9d, 0xa8, 0x1b, 0xe2, 0x3e, 0x06, 0xb2, 0x36, 0xcd, 0x48, 0x25, 0x3f, 0x1a, 0x2b,
0x9d, 0xba, 0x5a, 0x1e, 0x09, 0x25, 0x9f, 0xf2, 0x51, 0x7c, 0xce, 0x7d, 0xcc, 0xec, 0x6d, 0x9a,
0x91, 0x64, 0x1d, 0x7a, 0x43, 0x26, 0x5c, 0x5c, 0xd6, 0x1d, 0x0b, 0xcc, 0xd3, 0x6d, 0x0a, 0x43,
0x26, 0xb6, 0x14, 0xeb, 0x18, 0xe3, 0xee, 0x39, 0x4f, 0x83, 0x57, 0x19, 0xa2, 0x16, 0x92, 0xc9,
0xb1, 0x4e, 0xc3, 0x0d, 0x4a, 0xec, 0xa1, 0x43, 0x1c, 0x41, 0x20, 0x9c, 0x8e, 0x85, 0xcc, 0x24,
0x57, 0x50, 0xb2, 0x8b, 0x3c, 0x23, 0xf2, 0x05, 0xdc, 0x31, 0x88, 0xd0, 0x4d, 0xf9, 0xdf, 0x8f,
0xb9, 0x90, 0xfa, 0x16, 0x71, 0x0a, 0xc7, 0x14, 0xdb, 0xa0, 0x03, 0x23, 0x42, 0xb5, 0x04, 0x5e,
0xa6, 0x9a, 0xcf, 0xab, 0xa7, 0x6b, 0x1b, 0xbe, 0x56, 0x39, 0x1d, 0x83, 0x3b, 0xf9, 0x12, 0xee,
0x4e, 0x4f, 0x57, 0xc7, 0x21, 0xb9, 0x79, 0x3d, 0xc1, 0xf9, 0xb7, 0xcb, 0xf3, 0x29, 0x4a, 0xe8,
0xf7, 0x57, 0x2f, 0xa0, 0x15, 0xb8, 0x5e, 0xbd, 0x80, 0xd6, 0xe0, 0x3e, 0xf4, 0xfc, 0x40, 0x24,
0x21, 0x9b, 0x68, 0xfb, 0x5a, 0xc5, 0xab, 0xef, 0x1a, 0x9e, 0xb2, 0x31, 0xe7, 0x02, 0x6e, 0x4d,
0xbb, 0x40, 0x86, 0x1a, 0xe6, 0x3b, 0xeb, 0x8c, 0x51, 0xd7, 0xe7, 0x18, 0xf5, 0xb4, 0xe5, 0x36,
0x66, 0x2c, 0xd7, 0xf9, 0xef, 0xe6, 0x3c, 0xe7, 0x33, 0x65, 0xc1, 0x2f, 0xd6, 0x2d, 0x3d, 0xe3,
0x60, 0xdd, 0x24, 0x0d, 0xce, 0x99, 0xe4, 0xee, 0x19, 0x9f, 0xe8, 0x04, 0xf7, 0xa8, 0x3e, 0xa8,
0x51, 0x30, 0x6c, 0x15, 0x70, 0xd7, 0x55, 0xd0, 0x10, 0x5e, 0x1a, 0x24, 0xea, 0x15, 0xe8, 0x63,
0x3d, 0x6a, 0xb3, 0x54, 0xce, 0xfb, 0x3e, 0x0e, 0x22, 0xe3, 0x61, 0x6d, 0x6a, 0x28, 0x95, 0x11,
0xb4, 0xdd, 0x71, 0x1f, 0x73, 0x5e, 0x9b, 0xe6, 0x74, 0xe1, 0x00, 0x8b, 0xb6, 0x03, 0xbc, 0x80,
0xbe, 0xb9, 0x29, 0xe1, 0xca, 0xd8, 0x55, 0xeb, 0x18, 0x10, 0xf2, 0xce, 0x14, 0xf2, 0xcb, 0x0b,
0x20, 0x23, 0x7e, 0x14, 0x3f, 0x89, 0x83, 0x88, 0x2e, 0xa7, 0x25, 0x9a, 0x7c, 0x0e, 0xed, 0x0c,
0x76, 0x1b, 0x98, 0xff, 0x66, 0xc5, 0x42, 0x06, 0xef, 0x0b, 0x9a, 0x4f, 0x50, 0x41, 0x9a, 0x47,
0x5e, 0x3a, 0x49, 0x64, 0xee, 0xc0, 0x05, 0x03, 0x43, 0x78, 0xc2, 0x3d, 0xc9, 0x0a, 0x37, 0x2e,
0x18, 0x2a, 0x26, 0x1b, 0x51, 0xe5, 0x8c, 0x98, 0x8b, 0x7b, 0x78, 0x72, 0xcb, 0x05, 0xfb, 0xa9,
0x4a, 0xb9, 0xbb, 0xd0, 0x53, 0x06, 0x98, 0xc6, 0xa1, 0x1b, 0xc5, 0x3e, 0x37, 0x08, 0xdc, 0xa9,
0xd0, 0x72, 0x5b, 0x8b, 0xee, 0xc7, 0x3e, 0x57, 0xa5, 0x5f, 0x4e, 0x90, 0x3b, 0xd0, 0xd1, 0xa7,
0xee, 0x32, 0x69, 0x9c, 0xbe, 0xad, 0x19, 0x5b, 0x52, 0xa1, 0x84, 0x3b, 0x97, 0x9c, 0x9a, 0xb1,
0x8b, 0x5a, 0x6e, 0x17, 0xf7, 0x00, 0x92, 0xf1, 0x49, 0x18, 0x78, 0x68, 0x16, 0xda, 0x40, 0x3b,
0x9a, 0xa3, 0x2c, 0x22, 0x37, 0xae, 0x86, 0x6d, 0x5c, 0x97, 0x04, 0xe2, 0x5b, 0x3a, 0xfd, 0x67,
0x68, 0xb5, 0x43, 0x5b, 0x8a, 0xdc, 0xf3, 0x95, 0x9d, 0x67, 0xe5, 0xe1, 0x44, 0x8d, 0xb6, 0xb4,
0x71, 0xe5, 0xbc, 0x3d, 0x34, 0x14, 0xed, 0xee, 0x8b, 0xfa, 0x65, 0x48, 0x90, 0xaf, 0xe0, 0x5a,
0xca, 0xcf, 0x39, 0x0b, 0xd5, 0x86, 0xb5, 0xbf, 0x65, 0x70, 0xd5, 0xaa, 0x25, 0xa9, 0x11, 0xc9,
0x0b, 0x98, 0xb4, 0xcc, 0x10, 0xce, 0xb7, 0x30, 0xa8, 0x3a, 0xdf, 0x3f, 0x32, 0xd9, 0x3a, 0xbf,
0xab, 0x41, 0x3b, 0x2b, 0x52, 0xac, 0x13, 0xd6, 0xa9, 0xed, 0x0e, 0x74, 0xf0, 0x44, 0x30, 0x0f,
0xeb, 0x16, 0x44, 0x5b, 0x31, 0x4a, 0x59, 0xb8, 0x61, 0x65, 0xe1, 0x6f, 0xe0, 0xe6, 0x88, 0x8f,
0x4e, 0x78, 0x2a, 0x86, 0x41, 0xa2, 0x63, 0xc0, 0xee, 0x39, 0x57, 0xbb, 0x9e, 0x2d, 0x1f, 0xe6,
0xca, 0xd1, 0x8a, 0xf9, 0xca, 0x7b, 0x99, 0x27, 0x83, 0x73, 0x9e, 0x79, 0xaf, 0xa6, 0x8a, 0xed,
0xb7, 0xec, 0xed, 0xcf, 0xf5, 0x5b, 0xe7, 0xc7, 0x3a, 0xdc, 0x9c, 0xff, 0xda, 0x8a, 0x53, 0x24,
0xd0, 0xb4, 0xb6, 0x8e, 0xcf, 0x2a, 0xfb, 0x19, 0x15, 0xb1, 0x89, 0xd2, 0xa1, 0x19, 0x39, 0x17,
0x96, 0x5c, 0x8a, 0xa0, 0x6c, 0x8b, 0x6b, 0x95, 0x2c, 0x8e, 0x40, 0xf3, 0x55, 0x1a, 0x8f, 0x4c,
0x16, 0xc7, 0x67, 0x05, 0x02, 0x52, 0x76, 0xe1, 0x66, 0x38, 0xbf, 0x8d, 0x8b, 0x41, 0xca, 0x2e,
0x0e, 0x0a, 0xa8, 0x6f, 0x57, 0x31, 0x9a, 0xc0, 0x7a, 0x03, 0x23, 0x38, 0xe0, 0x04, 0x4d, 0x38,
0x9f, 0xc0, 0x4a, 0x5e, 0x9a, 0x9a, 0xe4, 0xfd, 0x5a, 0x4d, 0x24, 0xe7, 0xa1, 0xc6, 0x7c, 0x6a,
0xe2, 0x73, 0xdd, 0x04, 0x13, 0x94, 0xb3, 0xd7, 0x9d, 0xfd, 0x57, 0x70, 0x53, 0x97, 0xea, 0x32,
0x38, 0x57, 0x76, 0xcc, 0x23, 0xc9, 0xd3, 0x4b, 0xe6, 0xf7, 0xa1, 0x11, 0xf8, 0x62, 0x50, 0x5f,
0x6f, 0x3c, 0xe8, 0x51, 0xf5, 0xe8, 0xec, 0xc0, 0xda, 0xec, 0x0a, 0x5b, 0x9e, 0xc7, 0x31, 0xda,
0xbd, 0xee, 0x2a, 0xbb, 0x3a, 0xd2, 0x94, 0x57, 0xd9, 0x09, 0xc4, 0x28, 0x10, 0xe2, 0x0a, 0xcb,
0x6c, 0xeb, 0xe4, 0x36, 0xb5, 0x0c, 0x0f, 0xf9, 0x55, 0x74, 0x79, 0xa4, 0x9d, 0xbb, 0xbc, 0xc8,
0x71, 0x94, 0x5e, 0xe5, 0x54, 0xfe, 0xb3, 0x0e, 0xef, 0xcf, 0x2e, 0x32, 0x1d, 0x48, 0x77, 0xb8,
0x17, 0x88, 0x6a, 0x80, 0x3e, 0x9d, 0x77, 0xff, 0x04, 0xae, 0x15, 0xce, 0x98, 0xe1, 0xaf, 0x06,
0xba, 0x42, 0xbf, 0x18, 0x30, 0x20, 0xec, 0x0c, 0xda, 0xbe, 0x59, 0x1e, 0x1d, 0x60, 0x79, 0xf3,
0xc5, 0x74, 0x7b, 0xe6, 0x75, 0x54, 0xdb, 0x28, 0x02, 0x6d, 0x06, 0x86, 0xb2, 0x65, 0x69, 0xfe,
0x02, 0xe7, 0x53, 0x58, 0xab, 0x96, 0x23, 0x3d, 0x68, 0x6f, 0x6d, 0x6f, 0xef, 0x1e, 0x1c, 0xed,
0xee, 0xf4, 0xdf, 0x50, 0xd4, 0xce, 0xee, 0xf6, 0xb3, 0xbd, 0xfd, 0xdd, 0x9d, 0x7e, 0xcd, 0xf9,
0xb9, 0x06, 0x3d, 0xa5, 0xcd, 0xa3, 0x38, 0x3e, 0x1b, 0xb1, 0xf4, 0xac, 0xfa, 0x84, 0xc7, 0x69,
0x68, 0x0c, 0x57, 0x3d, 0xce, 0x8d, 0x76, 0x77, 0xa0, 0x83, 0xde, 0xe4, 0x2a, 0x59, 0xed, 0xf5,
0x6d, 0x64, 0x1c, 0xa7, 0xa1, 0x8d, 0x92, 0x17, 0xca, 0x28, 0xf9, 0x1e, 0x80, 0xaf, 0x6d, 0x44,
0x65, 0x41, 0x1d, 0xb7, 0x3a, 0x86, 0xb3, 0x25, 0x9d, 0x7f, 0x84, 0x1b, 0x4a, 0xc3, 0xdd, 0x48,
0x1c, 0x0b, 0x9e, 0xaa, 0x17, 0xe9, 0x8e, 0x4f, 0x85, 0xaa, 0x6b, 0xd0, 0x1e, 0x1b, 0x39, 0xa3,
0x6f, 0x4e, 0x63, 0x03, 0x66, 0xc8, 0x02, 0x0c, 0xff, 0x3a, 0x0b, 0x2e, 0x22, 0xbd, 0x57, 0x02,
0xf1, 0xcd, 0x92, 0x7a, 0xce, 0x13, 0xe8, 0xa3, 0x87, 0x87, 0x9c, 0xa5, 0x8f, 0x03, 0x21, 0xe3,
0x74, 0x62, 0x07, 0xaa, 0x5a, 0x29, 0x50, 0xdd, 0x03, 0xf0, 0x94, 0xa0, 0xde, 0x4b, 0x5d, 0xef,
0xc5, 0x70, 0xb6, 0xa4, 0xf3, 0xab, 0x1a, 0x10, 0x2c, 0x11, 0x35, 0x6c, 0x3c, 0x08, 0x3c, 0x8c,
0x7b, 0xf3, 0xaa, 0x63, 0xab, 0x85, 0x51, 0xaf, 0x68, 0x61, 0x68, 0xdb, 0x9b, 0x69, 0x61, 0x34,
0x91, 0x9d, 0xb5, 0x30, 0xee, 0x40, 0x07, 0x61, 0x2b, 0xf6, 0x30, 0x74, 0x29, 0x88, 0x3d, 0x8c,
0xc3, 0xb9, 0x3d, 0x8c, 0x16, 0x0a, 0x54, 0xf4, 0x30, 0x16, 0xed, 0x1e, 0xc6, 0x10, 0xae, 0xcf,
0xee, 0x44, 0x54, 0xb7, 0x69, 0x3e, 0x85, 0x76, 0x62, 0x84, 0xd0, 0x53, 0xbb, 0x9b, 0x77, 0xcb,
0x0e, 0x51, 0x5e, 0x89, 0xe6, 0xd2, 0xce, 0xaf, 0x1b, 0xd0, 0xb5, 0x1a, 0x9a, 0x15, 0xf7, 0x3e,
0x80, 0x45, 0xe6, 0xfb, 0x29, 0x17, 0x22, 0x3b, 0x2f, 0x43, 0xda, 0x2a, 0x35, 0x4a, 0x2a, 0x95,
0x01, 0x93, 0x86, 0xc8, 0x16, 0x60, 0x22, 0xd0, 0x4c, 0x98, 0x1c, 0x1a, 0xf0, 0x83, 0xcf, 0xf9,
0x4d, 0xb5, 0xac, 0x9b, 0xb2, 0xdb, 0x7a, 0x8b, 0xa6, 0x4f, 0x62, 0xda, 0x7a, 0xab, 0xb0, 0xc0,
0x47, 0xf1, 0xf7, 0x01, 0x66, 0xa7, 0x0e, 0xd5, 0x84, 0xba, 0xaa, 0x0b, 0x16, 0x86, 0x5c, 0x9a,
0xba, 0xd3, 0x50, 0x6a, 0x71, 0x65, 0x46, 0x06, 0xb4, 0xe2, 0x33, 0x5e, 0x6b, 0xe0, 0xfb, 0x3c,
0x32, 0x60, 0xd5, 0x50, 0x97, 0x14, 0x9d, 0x6b, 0xd0, 0x4e, 0x62, 0x11, 0x20, 0xec, 0x5f, 0xd2,
0x90, 0x32, 0xa3, 0xc9, 0xc7, 0x70, 0x23, 0x49, 0x63, 0xff, 0x20, 0xe5, 0xaf, 0x78, 0x9a, 0x72,
0x7f, 0x1b, 0xad, 0x7f, 0x47, 0x17, 0x9c, 0x1d, 0x3a, 0x7f, 0x50, 0xcd, 0x92, 0x5c, 0xc8, 0xd9,
0x59, 0x2b, 0x7a, 0xd6, 0xdc, 0x41, 0xa5, 0x47, 0x9c, 0xf0, 0x94, 0x9d, 0x84, 0xba, 0xe6, 0xec,
0xd0, 0x9c, 0x76, 0xfe, 0xd5, 0x5c, 0xa9, 0x69, 0x96, 0x57, 0x5c, 0xa9, 0x75, 0x71, 0xf5, 0xb9,
0x2d, 0xbf, 0x46, 0xb9, 0x9b, 0x64, 0x75, 0x6d, 0x34, 0x36, 0x51, 0x95, 0x20, 0x4f, 0x83, 0x73,
0xee, 0xbb, 0x08, 0x1f, 0x16, 0x4c, 0x25, 0xa8, 0x79, 0x5f, 0x29, 0x14, 0xf1, 0x39, 0xac, 0xe9,
0x9a, 0x4d, 0x70, 0xdf, 0xc5, 0x01, 0x03, 0x10, 0xb1, 0x27, 0xa9, 0x83, 0xd1, 0x2d, 0xac, 0xe0,
0x04, 0xf7, 0x77, 0xf2, 0xf1, 0x3d, 0x35, 0xac, 0xfb, 0x10, 0x91, 0x97, 0x2d, 0xaf, 0x2f, 0x1f,
0x34, 0x0b, 0x57, 0xff, 0x73, 0x68, 0x4f, 0xe1, 0xdc, 0x8a, 0x26, 0x7d, 0x2e, 0xa6, 0xa6, 0x98,
0x1e, 0x9a, 0xaa, 0x7d, 0x1a, 0x73, 0x3f, 0x30, 0xa8, 0x51, 0x9a, 0x8b, 0xd9, 0xb6, 0x00, 0x65,
0x5b, 0x78, 0x0f, 0xfa, 0x53, 0x6d, 0x65, 0x81, 0x76, 0xd4, 0x9b, 0x69, 0xd4, 0x39, 0xdf, 0xe9,
0x30, 0x9b, 0x61, 0xec, 0x03, 0x63, 0x32, 0x55, 0x50, 0xd0, 0xde, 0x59, 0xfd, 0xb5, 0x76, 0xe6,
0xfc, 0x4b, 0x5d, 0x47, 0xd2, 0x43, 0x76, 0xce, 0xfd, 0x2d, 0xe3, 0x9c, 0x96, 0xdb, 0xd6, 0xca,
0x6e, 0x3b, 0xaf, 0xaf, 0x7b, 0x17, 0x3a, 0xaf, 0xd8, 0x79, 0x3c, 0x4e, 0x03, 0xa9, 0x6f, 0xbf,
0x4d, 0x0b, 0xc6, 0x25, 0x29, 0xe6, 0x3e, 0xf4, 0x74, 0x51, 0xee, 0xda, 0x91, 0xac, 0xab, 0x79,
0xba, 0x6b, 0xf0, 0x3e, 0x5c, 0xd3, 0xb9, 0x41, 0x0c, 0xe3, 0x54, 0x62, 0x41, 0x24, 0x8c, 0xdb,
0xae, 0xe0, 0xc0, 0xa1, 0xe2, 0xab, 0xc2, 0x48, 0xa8, 0x74, 0xc8, 0x23, 0x61, 0x70, 0xa5, 0x7a,
0x54, 0xa6, 0x1a, 0x08, 0x57, 0x39, 0x82, 0xb9, 0x82, 0x56, 0x20, 0x8e, 0xb8, 0x90, 0x05, 0x08,
0xed, 0x5a, 0x20, 0xf4, 0x49, 0xb3, 0xdd, 0xec, 0x2f, 0x38, 0x3f, 0xd5, 0xf4, 0x99, 0xcf, 0x54,
0xb3, 0x15, 0x67, 0x3e, 0x5d, 0x77, 0xe9, 0x93, 0x29, 0xd5, 0x5d, 0xbb, 0xf0, 0xe6, 0x50, 0xe7,
0x28, 0x97, 0xa5, 0xde, 0x30, 0x38, 0xe7, 0xae, 0x18, 0x27, 0x89, 0xda, 0x11, 0x8f, 0x94, 0xeb,
0xf9, 0xe6, 0xd8, 0xee, 0x1a, 0xb1, 0x2d, 0x2d, 0x75, 0xa8, 0x85, 0x76, 0xb5, 0x8c, 0xf3, 0xbf,
0x35, 0x8d, 0x87, 0x8f, 0xd2, 0xb1, 0x90, 0xdc, 0x57, 0x89, 0xf7, 0x35, 0x3f, 0xaa, 0x7e, 0x01,
0x2d, 0x0b, 0x19, 0x2d, 0x4f, 0x77, 0x00, 0xac, 0x05, 0x37, 0x8e, 0x8a, 0x9e, 0x15, 0x35, 0x93,
0x9c, 0xcf, 0xa0, 0x6b, 0xb1, 0x49, 0x17, 0x16, 0x8f, 0xf7, 0x9f, 0xee, 0xbf, 0xf8, 0x7a, 0xbf,
0xff, 0x86, 0x22, 0x8e, 0xe8, 0xf1, 0xa1, 0x82, 0x31, 0x35, 0x72, 0x0d, 0x96, 0x8e, 0xf7, 0x91,
0xfc, 0xfa, 0x05, 0x3d, 0x7a, 0xfc, 0x6d, 0xbf, 0xee, 0xfc, 0xdc, 0xd0, 0x5d, 0x9d, 0x97, 0x56,
0xd7, 0xcc, 0xc0, 0xa9, 0xea, 0x7a, 0x06, 0x1d, 0xb7, 0x6e, 0x95, 0x15, 0xcb, 0x50, 0x97, 0xb1,
0x89, 0x2c, 0x75, 0x19, 0x2b, 0x93, 0xf3, 0x86, 0x2a, 0x3e, 0x47, 0xa7, 0x59, 0x70, 0x29, 0x18,
0xea, 0x4a, 0x0c, 0xde, 0xd2, 0x19, 0xdf, 0x34, 0x2b, 0x73, 0xde, 0x16, 0x76, 0xd8, 0x53, 0x2e,
0x92, 0x38, 0x12, 0x59, 0xda, 0xc8, 0x69, 0x95, 0x81, 0x52, 0x9e, 0x84, 0x81, 0x9e, 0xac, 0xad,
0xb2, 0x63, 0x38, 0x5b, 0x92, 0xf0, 0xf9, 0xdd, 0xc1, 0x36, 0x9e, 0xec, 0xc7, 0xe5, 0x93, 0x9d,
0xb3, 0xeb, 0x8d, 0x97, 0x33, 0xfd, 0xc3, 0xb9, 0x3d, 0x45, 0x7d, 0x87, 0x9d, 0xbc, 0x2a, 0xf9,
0x06, 0xc8, 0xec, 0xcc, 0x99, 0xbb, 0x38, 0xd8, 0xdd, 0xdf, 0xd9, 0xdb, 0xff, 0xeb, 0x7e, 0xad,
0x04, 0x30, 0xeb, 0x25, 0x80, 0xd9, 0x50, 0xd4, 0xf6, 0xd6, 0xfe, 0xf6, 0xee, 0xb3, 0xdd, 0x9d,
0x7e, 0xd3, 0xf9, 0x6d, 0x4d, 0x97, 0x2b, 0xdb, 0xa5, 0xe6, 0xdd, 0x2f, 0xe0, 0xf0, 0xbb, 0xd0,
0x31, 0xe7, 0xb9, 0x97, 0x59, 0x5a, 0xc1, 0x20, 0x7f, 0x07, 0x2b, 0x19, 0xd2, 0x75, 0x4b, 0x96,
0xf7, 0xd1, 0x74, 0x33, 0x66, 0xde, 0x2b, 0x37, 0xb2, 0x07, 0x73, 0x3c, 0xcb, 0x7e, 0x89, 0x76,
0x3e, 0x80, 0xe5, 0xb2, 0xc4, 0xa5, 0x68, 0xfa, 0xff, 0xeb, 0xb0, 0x32, 0xf5, 0x25, 0xbc, 0x1a,
0x10, 0x4d, 0xb7, 0x29, 0xeb, 0x33, 0x6d, 0x4a, 0xf2, 0x01, 0x10, 0x5b, 0xc4, 0xb5, 0xfb, 0x37,
0x7d, 0x4b, 0x50, 0x47, 0x30, 0x1b, 0x61, 0x35, 0xaf, 0x82, 0xb0, 0xc8, 0x43, 0xe8, 0x89, 0xd8,
0x0b, 0x58, 0xe8, 0x86, 0x41, 0x74, 0x96, 0xfd, 0xfd, 0xe0, 0xf6, 0xd4, 0xa7, 0x75, 0x94, 0x78,
0xa6, 0x04, 0x68, 0x57, 0x14, 0x04, 0xf9, 0x1b, 0x58, 0xe5, 0x91, 0x70, 0x33, 0x94, 0xed, 0xfa,
0xf9, 0x1f, 0x0e, 0x1a, 0xb3, 0x9d, 0xbb, 0x19, 0x18, 0x4f, 0x09, 0x9f, 0x66, 0x09, 0x47, 0x00,
0x50, 0x76, 0x61, 0x0a, 0x6a, 0x1b, 0x0a, 0xd7, 0xca, 0x50, 0xf8, 0x29, 0x74, 0xcd, 0x5f, 0x4f,
0x8e, 0xb2, 0xbe, 0xc4, 0xf2, 0xe6, 0x7b, 0xc5, 0x1b, 0xb7, 0x8a, 0x3f, 0xab, 0x3c, 0x37, 0xff,
0x55, 0x31, 0x8b, 0x6e, 0xa8, 0x09, 0xd4, 0x9e, 0xed, 0xfc, 0x4f, 0x0d, 0x96, 0x95, 0x8a, 0xd6,
0x9b, 0xff, 0x12, 0x7b, 0x0c, 0x59, 0x61, 0x6f, 0xbe, 0xcb, 0xad, 0x5a, 0xad, 0xaa, 0x7c, 0x90,
0xda, 0x82, 0x64, 0x13, 0x56, 0xc5, 0xf8, 0x24, 0xcb, 0xa5, 0x4f, 0x44, 0x1c, 0x3d, 0x9a, 0x48,
0x9e, 0x21, 0xd3, 0xb9, 0x63, 0xe4, 0x03, 0xb8, 0x96, 0xf5, 0x30, 0x8b, 0x09, 0xfa, 0xeb, 0xe5,
0xec, 0x80, 0xf3, 0x6f, 0xb5, 0x1c, 0x41, 0xa9, 0x34, 0x8e, 0x15, 0x5a, 0x6e, 0x62, 0xea, 0x71,
0x6e, 0xfe, 0xbc, 0x09, 0x2d, 0xf3, 0x65, 0x43, 0x67, 0x01, 0x43, 0xd9, 0x46, 0xda, 0x2c, 0x19,
0xe9, 0x5d, 0xe8, 0x98, 0x7c, 0xcc, 0x95, 0x59, 0xa8, 0x02, 0xbb, 0x60, 0x94, 0xa0, 0xa6, 0x86,
0x4a, 0x39, 0xed, 0x7c, 0xa7, 0x33, 0x88, 0x65, 0x35, 0xe4, 0x93, 0x29, 0x33, 0x9b, 0x39, 0xce,
0x42, 0xb8, 0x6c, 0x61, 0x79, 0x5c, 0xa8, 0xdb, 0x15, 0xc8, 0x8f, 0x35, 0xb8, 0x67, 0x21, 0x8d,
0xed, 0xd9, 0x8f, 0xd4, 0xf7, 0x00, 0xb2, 0xef, 0x58, 0x4c, 0x9a, 0xa0, 0xd2, 0x31, 0x9c, 0x2d,
0x59, 0xf5, 0xd1, 0xbb, 0x5e, 0xf9, 0xd1, 0xbb, 0xaa, 0x92, 0x70, 0xfe, 0xbd, 0x06, 0xfd, 0xa3,
0xf8, 0x8c, 0x47, 0x1a, 0x06, 0xf3, 0xc8, 0xd3, 0x28, 0x41, 0xd5, 0x15, 0xe6, 0x4a, 0xce, 0xf8,
0xa4, 0x74, 0x5e, 0xf5, 0x29, 0x68, 0xfe, 0x36, 0x2c, 0x9d, 0xa6, 0xf1, 0x38, 0xc9, 0x80, 0x17,
0xbe, 0xa1, 0x41, 0xcb, 0x4c, 0xfc, 0xac, 0x17, 0x88, 0x40, 0x61, 0x6a, 0x53, 0xa6, 0x1a, 0x92,
0xac, 0x83, 0x0d, 0x04, 0x32, 0xa8, 0x6b, 0xb1, 0x9c, 0x7f, 0x36, 0xdf, 0x27, 0x67, 0x14, 0xad,
0x2c, 0xa8, 0x14, 0x9e, 0x89, 0xb8, 0xae, 0x63, 0xdb, 0x34, 0x23, 0xc9, 0x43, 0xe8, 0x26, 0xc5,
0x74, 0xf3, 0xdf, 0xa9, 0xb5, 0xe2, 0x1a, 0xa7, 0x5f, 0x40, 0x6d, 0xf1, 0x47, 0x4b, 0x7f, 0xdb,
0xdd, 0xf8, 0xf0, 0xf3, 0x4c, 0xf8, 0xa4, 0x85, 0x4f, 0x1f, 0xfd, 0x21, 0x00, 0x00, 0xff, 0xff,
0x0e, 0x8f, 0x84, 0xbe, 0x9c, 0x26, 0x00, 0x00,
// 3362 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x5a, 0x4f, 0x6f, 0x1c, 0x47,
0x76, 0xf7, 0xfc, 0xe1, 0x70, 0xe6, 0xcd, 0x90, 0x1c, 0x95, 0x28, 0x69, 0x44, 0x49, 0x30, 0xd5,
0xb6, 0x61, 0xd9, 0x71, 0xe8, 0x84, 0x76, 0x62, 0xc3, 0x96, 0xe1, 0x50, 0x24, 0x1d, 0x51, 0x7f,
0x28, 0xa6, 0x48, 0xca, 0x76, 0x10, 0xa0, 0xdd, 0xec, 0x2e, 0x71, 0xda, 0xec, 0xe9, 0xee, 0x74,
0xd5, 0x90, 0x19, 0x1f, 0x02, 0x04, 0xc8, 0xc1, 0xc7, 0xdc, 0x7c, 0x0b, 0x8c, 0x20, 0x58, 0xec,
0xee, 0x71, 0x6f, 0xfb, 0x05, 0x16, 0x7b, 0xdc, 0xfb, 0xee, 0x17, 0xd8, 0x2f, 0xb0, 0xb7, 0x05,
0x16, 0xf5, 0xaa, 0xaa, 0xbb, 0x7a, 0x66, 0x5a, 0x16, 0xb1, 0xa7, 0xe9, 0xf7, 0xea, 0x55, 0xf5,
0xab, 0xaa, 0xf7, 0xe7, 0xf7, 0x5e, 0x0f, 0x2c, 0xa5, 0x5e, 0x98, 0x85, 0xf1, 0xe9, 0x46, 0x9a,
0x25, 0x22, 0x21, 0x6d, 0xfc, 0x39, 0x19, 0xbf, 0x58, 0xbb, 0xea, 0x0f, 0x3d, 0xe1, 0x86, 0x01,
0x8b, 0x45, 0x28, 0x26, 0x6a, 0x78, 0xed, 0x2a, 0x9f, 0xc4, 0xbe, 0xcb, 0x99, 0x10, 0x61, 0x7c,
0xca, 0x35, 0xd3, 0xf1, 0xd2, 0x34, 0x0a, 0x7d, 0x4f, 0x84, 0x49, 0xec, 0x8e, 0x98, 0xf0, 0x02,
0x4f, 0x78, 0xee, 0x88, 0x71, 0xee, 0x9d, 0x32, 0x2d, 0x73, 0xc5, 0x4f, 0x46, 0xa3, 0x71, 0x1c,
0x8a, 0x90, 0xe9, 0x69, 0x8e, 0x07, 0xb7, 0xbe, 0x60, 0xc2, 0x1f, 0x86, 0xf1, 0xe9, 0x03, 0xcf,
0x3f, 0x63, 0xc1, 0x71, 0xba, 0xe3, 0x09, 0x6f, 0x87, 0x09, 0x2f, 0x8c, 0x38, 0x79, 0x1d, 0xba,
0xb8, 0x4e, 0x3c, 0x1e, 0x9d, 0xb0, 0x6c, 0x50, 0x5b, 0xaf, 0xdd, 0x5b, 0xa2, 0x20, 0x59, 0xfb,
0xc8, 0x21, 0x77, 0xa1, 0x27, 0x12, 0xe1, 0x45, 0x46, 0xa2, 0x8e, 0x12, 0x5d, 0xe4, 0x29, 0x11,
0xe7, 0xcf, 0x8b, 0xd0, 0x92, 0x6b, 0x8f, 0x53, 0xb2, 0x0a, 0x0b, 0x7e, 0x94, 0xf8, 0x67, 0xb8,
0x50, 0x93, 0x2a, 0x82, 0x2c, 0x43, 0x3d, 0x0c, 0x70, 0x66, 0x87, 0xd6, 0xc3, 0x80, 0x7c, 0x0e,
0x6d, 0x3f, 0x89, 0x85, 0xe7, 0x0b, 0x3e, 0x68, 0xac, 0x37, 0xee, 0x75, 0x37, 0xdf, 0xd8, 0x30,
0x27, 0xb2, 0x71, 0x38, 0x89, 0xfd, 0xbd, 0x98, 0x0b, 0x2f, 0x8a, 0x70, 0xaf, 0xdb, 0x4a, 0xf2,
0xf9, 0x26, 0xcd, 0x27, 0x91, 0x5d, 0xe8, 0x5a, 0x3b, 0x1d, 0x34, 0x7f, 0x7a, 0x0d, 0x25, 0x3c,
0xa1, 0xf6, 0x3c, 0xf2, 0x0c, 0x56, 0xcc, 0x92, 0xfa, 0x3c, 0x06, 0x0b, 0xeb, 0xb5, 0x7b, 0xdd,
0xcd, 0xb7, 0x8a, 0xa5, 0x5e, 0x72, 0x78, 0x74, 0x7a, 0x36, 0x39, 0x06, 0x62, 0xad, 0x6f, 0xd6,
0x6c, 0x5d, 0x66, 0xcd, 0x39, 0x0b, 0x90, 0x0f, 0x60, 0x31, 0xcd, 0x92, 0x17, 0x61, 0xc4, 0x06,
0x8b, 0xb8, 0xd6, 0xcd, 0x62, 0x2d, 0xb3, 0xc6, 0x81, 0x12, 0xa0, 0x46, 0x92, 0x3c, 0x85, 0x65,
0xfd, 0x68, 0xf4, 0x68, 0x5f, 0x46, 0x8f, 0xa9, 0xc9, 0xe4, 0x7d, 0x58, 0xd4, 0x06, 0x39, 0xe8,
0xe0, 0x3a, 0xd7, 0xca, 0xc7, 0x7d, 0xa8, 0x06, 0xa9, 0x91, 0x92, 0x87, 0x6b, 0x2c, 0xd8, 0x28,
0x00, 0x97, 0x3a, 0xdc, 0xa9, 0xd9, 0x52, 0x83, 0x33, 0x36, 0x91, 0x8e, 0x34, 0xe8, 0xce, 0xd3,
0xe0, 0xb1, 0x1a, 0xa4, 0x46, 0x4a, 0x9e, 0x80, 0x7e, 0x34, 0x0a, 0xf4, 0x2e, 0x75, 0x02, 0xe5,
0xc9, 0x64, 0x0b, 0xfa, 0x17, 0x9e, 0xf0, 0x87, 0xcf, 0xe2, 0x68, 0xb2, 0xe5, 0xfb, 0xc9, 0x38,
0x16, 0x83, 0xa5, 0x79, 0x8a, 0xe8, 0x41, 0x3a, 0x23, 0x4e, 0x5c, 0xb8, 0x31, 0xcd, 0x33, 0xaa,
0x2d, 0x5f, 0x46, 0xb5, 0xaa, 0x55, 0xc8, 0x3d, 0x58, 0x90, 0x01, 0x85, 0x0f, 0x56, 0xd0, 0x25,
0x48, 0x59, 0xb1, 0xed, 0xa1, 0x27, 0xa8, 0x12, 0x20, 0x7b, 0xd0, 0xc3, 0x07, 0xf3, 0xfe, 0xfe,
0x65, 0xde, 0x5f, 0x9a, 0xea, 0xfc, 0x7c, 0x01, 0x7a, 0x4f, 0xc7, 0x91, 0x08, 0xcd, 0x36, 0x09,
0x34, 0x63, 0x6f, 0xc4, 0x30, 0x08, 0x74, 0x28, 0x3e, 0x93, 0xdb, 0xd0, 0x11, 0xe1, 0x88, 0x71,
0xe1, 0x8d, 0x52, 0x0c, 0x05, 0x0d, 0x5a, 0x30, 0xe4, 0xa8, 0x8a, 0x81, 0x7e, 0x12, 0x0f, 0x1a,
0x38, 0xad, 0x60, 0x90, 0xcf, 0x01, 0xfc, 0x24, 0x4a, 0x32, 0x77, 0xe8, 0xf1, 0xa1, 0xf6, 0xf6,
0xf5, 0x42, 0x53, 0xfb, 0xdd, 0x1b, 0xdb, 0x52, 0xf0, 0xa1, 0xc7, 0x87, 0xb4, 0xe3, 0x9b, 0x47,
0x72, 0x53, 0x06, 0x1c, 0xb9, 0x40, 0x18, 0xa0, 0x87, 0x37, 0xe8, 0x22, 0xd2, 0x7b, 0x01, 0x79,
0x1b, 0x56, 0xce, 0xd8, 0xc4, 0xf7, 0xb2, 0xc0, 0xd5, 0x31, 0x1a, 0xfd, 0xb5, 0x83, 0xd7, 0x2f,
0xd9, 0x07, 0x8a, 0x4b, 0x6e, 0xa0, 0xf9, 0xb9, 0xe3, 0x30, 0x40, 0x27, 0xec, 0xd0, 0xd6, 0x19,
0x9b, 0x1c, 0x87, 0x01, 0xb9, 0x0f, 0xad, 0x70, 0xe4, 0x9d, 0x32, 0xe9, 0x60, 0x52, 0xb3, 0x37,
0x2b, 0x34, 0xdb, 0xd3, 0x41, 0x7e, 0x4f, 0x0a, 0x53, 0x3d, 0x87, 0xbc, 0x0f, 0x57, 0xfd, 0x31,
0x17, 0xc9, 0x28, 0xfc, 0x4e, 0x85, 0x76, 0x54, 0x0c, 0x7d, 0xac, 0x43, 0x49, 0x69, 0x08, 0xb7,
0x46, 0x3e, 0x81, 0x9b, 0x73, 0x26, 0xb8, 0x2a, 0xec, 0x02, 0x86, 0xdd, 0x1b, 0xb3, 0xd3, 0xb6,
0xe5, 0xf0, 0xda, 0x5d, 0xe8, 0xe4, 0xe7, 0x23, 0x63, 0x75, 0x18, 0x07, 0xec, 0x3f, 0x06, 0xb5,
0xf5, 0xc6, 0xbd, 0x06, 0x55, 0xc4, 0xda, 0xef, 0x6b, 0xb0, 0x54, 0xd2, 0xd4, 0xde, 0x78, 0xad,
0xb4, 0x71, 0x73, 0xcd, 0x75, 0xeb, 0x9a, 0x07, 0xb0, 0x98, 0x7a, 0x93, 0x28, 0xf1, 0x02, 0xbc,
0xc6, 0x1e, 0x35, 0xa4, 0x7c, 0xdd, 0x45, 0x18, 0x08, 0x79, 0x7f, 0xf2, 0x02, 0x14, 0x41, 0xae,
0x43, 0x6b, 0xc8, 0xc2, 0xd3, 0xa1, 0xd0, 0xf7, 0xa2, 0x29, 0xb2, 0x06, 0x6d, 0x19, 0x7d, 0x78,
0xf8, 0x1d, 0xc3, 0xfb, 0x68, 0xd0, 0x9c, 0x26, 0x6f, 0xc0, 0x52, 0x86, 0x4f, 0xae, 0xf0, 0xb2,
0x53, 0x26, 0xf0, 0x3e, 0x1a, 0xb4, 0xa7, 0x98, 0x47, 0xc8, 0x2b, 0x32, 0x51, 0xdb, 0xca, 0x44,
0xce, 0x0f, 0x75, 0xb8, 0xfa, 0x24, 0xf1, 0xbd, 0x48, 0xdf, 0xea, 0x81, 0x56, 0xee, 0x1f, 0xa0,
0x79, 0xc6, 0x26, 0x1c, 0x8f, 0xa2, 0xbb, 0x79, 0xb7, 0xb8, 0xc1, 0x39, 0xc2, 0x1b, 0x8f, 0xd9,
0x84, 0xa2, 0x38, 0xf9, 0x04, 0x7a, 0x23, 0x79, 0xc5, 0x9e, 0x0e, 0x07, 0x75, 0x74, 0xa2, 0xeb,
0xf3, 0x0d, 0x80, 0x96, 0x64, 0xe5, 0x0e, 0x53, 0x8f, 0xf3, 0x8b, 0x24, 0x0b, 0xb4, 0xc5, 0xe7,
0xb4, 0x3c, 0x45, 0xe9, 0x61, 0x8f, 0xd9, 0x04, 0x4f, 0xab, 0x43, 0x0d, 0x49, 0xee, 0xe5, 0xe6,
0xaa, 0x95, 0x52, 0x29, 0xab, 0x43, 0xa7, 0xd9, 0x6b, 0x7f, 0x0b, 0x0d, 0x39, 0x61, 0x9e, 0x2f,
0x12, 0x68, 0xca, 0x0c, 0x8f, 0xea, 0xf6, 0x28, 0x3e, 0x3b, 0xbf, 0xae, 0xc1, 0xb5, 0xd2, 0x66,
0x19, 0xcb, 0x1e, 0xb2, 0x28, 0x4a, 0xa4, 0x87, 0x68, 0xcf, 0x70, 0xcf, 0x59, 0xc6, 0xc3, 0x24,
0xc6, 0xc5, 0x16, 0xe8, 0xb2, 0x66, 0x3f, 0x57, 0x5c, 0x69, 0x28, 0x29, 0x63, 0xe8, 0x64, 0x6a,
0xe5, 0x96, 0x24, 0xf7, 0x02, 0x04, 0x19, 0xec, 0x3c, 0xf4, 0x99, 0x8b, 0xaa, 0xa8, 0xdd, 0x82,
0x62, 0xed, 0x4b, 0x85, 0x0a, 0x01, 0x31, 0x49, 0x99, 0xde, 0xb3, 0x16, 0x38, 0x9a, 0xa4, 0x18,
0x3d, 0x78, 0x78, 0x1a, 0x7b, 0x62, 0x9c, 0x31, 0xdc, 0x70, 0x8f, 0x16, 0x0c, 0xe7, 0xff, 0x6b,
0xb0, 0x2a, 0xe3, 0x9b, 0x54, 0xdd, 0x4e, 0xfb, 0x15, 0x70, 0xe4, 0x6d, 0x58, 0x09, 0x2d, 0x29,
0x37, 0xc7, 0x26, 0xcb, 0x36, 0xbb, 0xa4, 0x37, 0xaa, 0xd5, 0x98, 0x51, 0xcb, 0x1c, 0x6e, 0xb3,
0xec, 0x01, 0xe6, 0x98, 0x16, 0x10, 0x2b, 0x19, 0xd2, 0xf9, 0xaf, 0x16, 0xdc, 0xac, 0x44, 0x37,
0xe4, 0xef, 0x60, 0x35, 0xf2, 0xb8, 0x70, 0xc7, 0x69, 0xe0, 0x09, 0x16, 0xb8, 0x91, 0xbc, 0x8c,
0x68, 0xa2, 0x55, 0x27, 0x72, 0xec, 0x58, 0x0d, 0x3d, 0x51, 0x23, 0x33, 0xb0, 0xea, 0x0d, 0x58,
0xd2, 0x49, 0xdb, 0xc5, 0xe0, 0xa2, 0x15, 0xee, 0x69, 0xa6, 0xf2, 0xe6, 0x9b, 0xd0, 0x66, 0x31,
0x77, 0x2d, 0xb5, 0x17, 0x59, 0xcc, 0xf1, 0x16, 0xee, 0x42, 0xcf, 0xd6, 0x00, 0xd5, 0x6f, 0xd2,
0xae, 0xf5, 0x66, 0x79, 0x22, 0x7c, 0xc2, 0x05, 0x1b, 0xb9, 0xc2, 0x3b, 0x95, 0xc8, 0xa6, 0x21,
0x4f, 0x44, 0xb1, 0x8e, 0xbc, 0x53, 0x4e, 0xde, 0x82, 0x65, 0x54, 0xdc, 0x8d, 0x43, 0xff, 0x0c,
0x5f, 0xa2, 0x82, 0xe5, 0x12, 0x72, 0xf7, 0x35, 0x53, 0x5e, 0x8c, 0x17, 0x04, 0x2c, 0xc0, 0x38,
0xd7, 0xa6, 0x8a, 0x90, 0x47, 0x77, 0x22, 0x6f, 0x88, 0x05, 0x18, 0xc8, 0xda, 0xd4, 0x90, 0x52,
0x7e, 0x34, 0x96, 0x3a, 0x75, 0x95, 0x3c, 0x12, 0x52, 0x3e, 0x63, 0xa3, 0xe4, 0x9c, 0x05, 0x98,
0xd9, 0xdb, 0xd4, 0x90, 0x64, 0x1d, 0x7a, 0x43, 0x8f, 0xbb, 0xb8, 0xac, 0x3b, 0xe6, 0x98, 0xa7,
0xdb, 0x14, 0x86, 0x1e, 0xdf, 0x92, 0xac, 0x63, 0x8c, 0xbb, 0xe7, 0x2c, 0x0b, 0x5f, 0x18, 0x44,
0xcd, 0x85, 0x27, 0xc6, 0x2a, 0x0d, 0x37, 0x28, 0xb1, 0x87, 0x0e, 0x71, 0x04, 0x81, 0x70, 0x36,
0xe6, 0xc2, 0x48, 0xae, 0xa0, 0x64, 0x17, 0x79, 0x5a, 0xe4, 0x33, 0xb8, 0xa5, 0x11, 0xa1, 0x9b,
0xb1, 0x7f, 0x1f, 0x33, 0x2e, 0xd4, 0x2d, 0xe2, 0x14, 0x86, 0x29, 0xb6, 0x41, 0x07, 0x5a, 0x84,
0x2a, 0x09, 0xbc, 0x4c, 0x39, 0x9f, 0x55, 0x4f, 0x57, 0x36, 0x7c, 0xa5, 0x72, 0x3a, 0x06, 0x77,
0xf2, 0x39, 0xdc, 0x9e, 0x9e, 0x2e, 0x8f, 0x43, 0x30, 0xfd, 0x7a, 0x82, 0xf3, 0x6f, 0x96, 0xe7,
0x53, 0x94, 0x50, 0xef, 0xaf, 0x5e, 0x40, 0x29, 0x70, 0xb5, 0x7a, 0x01, 0xa5, 0xc1, 0x5d, 0xe8,
0x05, 0x21, 0x4f, 0x23, 0x6f, 0xa2, 0xec, 0x6b, 0x15, 0xaf, 0xbe, 0xab, 0x79, 0xd2, 0xc6, 0x9c,
0x0b, 0xb8, 0x31, 0xed, 0x02, 0x06, 0x35, 0xcc, 0x77, 0xd6, 0x19, 0xa3, 0xae, 0xcf, 0x31, 0xea,
0x69, 0xcb, 0x6d, 0xcc, 0x58, 0xae, 0xf3, 0x8b, 0xe6, 0x3c, 0xe7, 0xd3, 0x65, 0xc1, 0x4f, 0xd6,
0x2d, 0x3d, 0xed, 0x60, 0xdd, 0x34, 0x0b, 0xcf, 0x3d, 0xc1, 0xdc, 0x33, 0x36, 0x51, 0x09, 0xee,
0x41, 0x7d, 0x50, 0xa3, 0xa0, 0xd9, 0x32, 0xe0, 0xae, 0xcb, 0xa0, 0xc1, 0xfd, 0x2c, 0x4c, 0xe5,
0x2b, 0xd0, 0xc7, 0x7a, 0xd4, 0x66, 0xc9, 0x9c, 0xf7, 0x6d, 0x12, 0xc6, 0xda, 0xc3, 0xda, 0x54,
0x53, 0x32, 0x23, 0x28, 0xbb, 0x63, 0x01, 0xe6, 0xbc, 0x36, 0xcd, 0xe9, 0xc2, 0x01, 0x16, 0x6d,
0x07, 0x78, 0x06, 0x7d, 0x7d, 0x53, 0xdc, 0x15, 0x89, 0x2b, 0xd7, 0xd1, 0x20, 0xe4, 0xad, 0x29,
0xe4, 0x97, 0x17, 0x40, 0x5a, 0xfc, 0x28, 0x79, 0x94, 0x84, 0x31, 0x5d, 0xce, 0x4a, 0x34, 0xf9,
0x14, 0xda, 0x06, 0x76, 0x6b, 0x98, 0xff, 0x7a, 0xc5, 0x42, 0x1a, 0xef, 0x73, 0x9a, 0x4f, 0x90,
0x41, 0x9a, 0xc5, 0x7e, 0x36, 0x49, 0x45, 0xee, 0xc0, 0x05, 0x03, 0x43, 0x78, 0xca, 0x7c, 0xe1,
0x15, 0x6e, 0x5c, 0x30, 0x64, 0x4c, 0xd6, 0xa2, 0xd2, 0x19, 0x31, 0x17, 0xf7, 0xf0, 0xe4, 0x96,
0x0b, 0xf6, 0x63, 0x99, 0x72, 0x77, 0xa1, 0x27, 0x0d, 0x30, 0x4b, 0x22, 0x37, 0x4e, 0x02, 0xa6,
0x11, 0xb8, 0x53, 0xa1, 0xe5, 0xb6, 0x12, 0xdd, 0x4f, 0x02, 0x26, 0x4b, 0xbf, 0x9c, 0x20, 0xb7,
0xa0, 0xa3, 0x4e, 0xdd, 0xf5, 0x84, 0x76, 0xfa, 0xb6, 0x62, 0x6c, 0x09, 0x89, 0x12, 0x6e, 0xbd,
0xe4, 0xd4, 0xb4, 0x5d, 0xd4, 0x72, 0xbb, 0xb8, 0x03, 0x90, 0x8e, 0x4f, 0xa2, 0xd0, 0x47, 0xb3,
0x50, 0x06, 0xda, 0x51, 0x1c, 0x69, 0x11, 0xb9, 0x71, 0x35, 0x6c, 0xe3, 0x7a, 0x49, 0x20, 0xbe,
0xa1, 0xd2, 0xbf, 0x41, 0xab, 0x1d, 0xda, 0x92, 0xe4, 0x5e, 0x20, 0xed, 0xdc, 0x94, 0x87, 0x13,
0x39, 0xda, 0x52, 0xc6, 0x95, 0xf3, 0xf6, 0xd0, 0x50, 0x94, 0xbb, 0x2f, 0xaa, 0x97, 0x21, 0x41,
0xbe, 0x80, 0x2b, 0x19, 0x3b, 0x67, 0x5e, 0x24, 0x37, 0xac, 0xfc, 0xcd, 0xc0, 0x55, 0xab, 0x96,
0xa4, 0x5a, 0x24, 0x2f, 0x60, 0xb2, 0x32, 0x83, 0x3b, 0x5f, 0xc3, 0xa0, 0xea, 0x7c, 0xff, 0xca,
0x64, 0xeb, 0xfc, 0xb1, 0x06, 0x6d, 0x53, 0xa4, 0x58, 0x27, 0xac, 0x52, 0xdb, 0x2d, 0xe8, 0xe0,
0x89, 0x60, 0x1e, 0x56, 0x2d, 0x88, 0xb6, 0x64, 0x94, 0xb2, 0x70, 0xc3, 0xca, 0xc2, 0x5f, 0xc1,
0xf5, 0x11, 0x1b, 0x9d, 0xb0, 0x8c, 0x0f, 0xc3, 0x54, 0xc5, 0x80, 0xdd, 0x73, 0x26, 0x77, 0x3d,
0x5b, 0x3e, 0xcc, 0x95, 0xa3, 0x15, 0xf3, 0xa5, 0xf7, 0x7a, 0xbe, 0x08, 0xcf, 0x99, 0xf1, 0x5e,
0x45, 0x15, 0xdb, 0x6f, 0xd9, 0xdb, 0x9f, 0xeb, 0xb7, 0xce, 0xf7, 0x75, 0xb8, 0x3e, 0xff, 0xb5,
0x15, 0xa7, 0x48, 0xa0, 0x69, 0x6d, 0x1d, 0x9f, 0x65, 0xf6, 0xd3, 0x2a, 0x62, 0x13, 0xa5, 0x43,
0x0d, 0x39, 0x17, 0x96, 0xbc, 0x14, 0x41, 0xd9, 0x16, 0xd7, 0x2a, 0x59, 0x1c, 0x81, 0xe6, 0x8b,
0x2c, 0x19, 0xe9, 0x2c, 0x8e, 0xcf, 0x12, 0x04, 0x64, 0xde, 0x85, 0x6b, 0x70, 0x7e, 0x1b, 0x17,
0x83, 0xcc, 0xbb, 0x38, 0x28, 0xa0, 0xbe, 0x5d, 0xc5, 0x28, 0x02, 0xeb, 0x0d, 0x8c, 0xe0, 0x80,
0x13, 0x14, 0xe1, 0x7c, 0x04, 0x2b, 0x79, 0x69, 0xaa, 0x93, 0xf7, 0x2b, 0x35, 0x91, 0x9c, 0xfb,
0x0a, 0xf3, 0xc9, 0x89, 0x4f, 0x55, 0x13, 0x8c, 0x53, 0xe6, 0xbd, 0xea, 0xec, 0x7f, 0x82, 0xeb,
0xaa, 0x54, 0x17, 0xe1, 0xb9, 0xb4, 0x63, 0x16, 0x0b, 0x96, 0xbd, 0x64, 0x7e, 0x1f, 0x1a, 0x61,
0xc0, 0x07, 0xf5, 0xf5, 0xc6, 0xbd, 0x1e, 0x95, 0x8f, 0xce, 0x0e, 0xac, 0xcd, 0xae, 0xb0, 0xe5,
0xfb, 0x0c, 0xa3, 0xdd, 0xab, 0xae, 0xb2, 0xab, 0x22, 0x4d, 0x79, 0x95, 0x9d, 0x90, 0x8f, 0x42,
0xce, 0x2f, 0xb1, 0xcc, 0xb6, 0x4a, 0x6e, 0x53, 0xcb, 0xb0, 0x88, 0x5d, 0x46, 0x97, 0x07, 0xca,
0xb9, 0xcb, 0x8b, 0x1c, 0xc7, 0xd9, 0x65, 0x4e, 0xe5, 0x67, 0x75, 0x78, 0x77, 0x76, 0x91, 0xe9,
0x40, 0xba, 0xc3, 0xfc, 0x90, 0x57, 0x03, 0xf4, 0xe9, 0xbc, 0xfb, 0x37, 0x70, 0xa5, 0x70, 0x46,
0x83, 0xbf, 0x1a, 0xe8, 0x0a, 0xfd, 0x62, 0x40, 0x83, 0xb0, 0x33, 0x68, 0x07, 0x7a, 0x79, 0x74,
0x80, 0xe5, 0xcd, 0x67, 0xd3, 0xed, 0x99, 0x57, 0x51, 0x6d, 0xa3, 0x08, 0xb4, 0x06, 0x0c, 0x99,
0x65, 0x69, 0xfe, 0x02, 0xe7, 0x63, 0x58, 0xab, 0x96, 0x23, 0x3d, 0x68, 0x6f, 0x6d, 0x6f, 0xef,
0x1e, 0x1c, 0xed, 0xee, 0xf4, 0x5f, 0x93, 0xd4, 0xce, 0xee, 0xf6, 0x93, 0xbd, 0xfd, 0xdd, 0x9d,
0x7e, 0xcd, 0xf9, 0xb1, 0x06, 0x3d, 0xa9, 0xcd, 0x83, 0x24, 0x39, 0x1b, 0x79, 0xd9, 0x59, 0xf5,
0x09, 0x8f, 0xb3, 0x48, 0x1b, 0xae, 0x7c, 0x9c, 0x1b, 0xed, 0x6e, 0x41, 0x07, 0xbd, 0xc9, 0x95,
0xb2, 0xca, 0xeb, 0xdb, 0xc8, 0x38, 0xce, 0x22, 0x1b, 0x25, 0x2f, 0x94, 0x51, 0xf2, 0x1d, 0x80,
0x40, 0xd9, 0x88, 0xcc, 0x82, 0x2a, 0x6e, 0x75, 0x34, 0x67, 0x4b, 0x38, 0xff, 0x09, 0xd7, 0xa4,
0x86, 0xbb, 0x31, 0x3f, 0xe6, 0x2c, 0x93, 0x2f, 0x52, 0x1d, 0x9f, 0x0a, 0x55, 0xd7, 0xa0, 0x3d,
0xd6, 0x72, 0x5a, 0xdf, 0x9c, 0xc6, 0x06, 0xcc, 0xd0, 0x0b, 0x31, 0xfc, 0xab, 0x2c, 0xb8, 0x88,
0xf4, 0x5e, 0x09, 0xc4, 0x37, 0x4b, 0xea, 0x39, 0x8f, 0xa0, 0x8f, 0x1e, 0x1e, 0x31, 0x2f, 0x7b,
0x18, 0x72, 0x91, 0x64, 0x13, 0x3b, 0x50, 0xd5, 0x4a, 0x81, 0xea, 0x0e, 0x80, 0x2f, 0x05, 0xd5,
0x5e, 0xea, 0x6a, 0x2f, 0x9a, 0xb3, 0x25, 0x9c, 0xdf, 0xd6, 0x80, 0x60, 0x89, 0xa8, 0x60, 0xe3,
0x41, 0xe8, 0x63, 0xdc, 0x9b, 0x57, 0x1d, 0x5b, 0x2d, 0x8c, 0x7a, 0x45, 0x0b, 0x43, 0xd9, 0xde,
0x4c, 0x0b, 0xa3, 0x89, 0x6c, 0xd3, 0xc2, 0xb8, 0x05, 0x1d, 0x84, 0xad, 0xd8, 0xc3, 0x50, 0xa5,
0x20, 0xf6, 0x30, 0x0e, 0xe7, 0xf6, 0x30, 0x5a, 0x28, 0x50, 0xd1, 0xc3, 0x58, 0xb4, 0x7b, 0x18,
0x43, 0xb8, 0x3a, 0xbb, 0x13, 0x5e, 0xdd, 0xa6, 0xf9, 0x18, 0xda, 0xa9, 0x16, 0x42, 0x4f, 0xed,
0x6e, 0xde, 0x2e, 0x3b, 0x44, 0x79, 0x25, 0x9a, 0x4b, 0x3b, 0xbf, 0x6b, 0x40, 0xd7, 0x6a, 0x68,
0x56, 0xdc, 0xfb, 0x00, 0x16, 0xbd, 0x20, 0xc8, 0x18, 0xe7, 0xe6, 0xbc, 0x34, 0x69, 0xab, 0xd4,
0x28, 0xa9, 0x54, 0x06, 0x4c, 0x0a, 0x22, 0x5b, 0x80, 0x89, 0x40, 0x33, 0xf5, 0xc4, 0x50, 0x83,
0x1f, 0x7c, 0xce, 0x6f, 0xaa, 0x65, 0xdd, 0x94, 0xdd, 0xd6, 0x5b, 0xd4, 0x7d, 0x12, 0xdd, 0xd6,
0x5b, 0x85, 0x05, 0x36, 0x4a, 0xbe, 0x0d, 0x31, 0x3b, 0x75, 0xa8, 0x22, 0xe4, 0x55, 0x5d, 0x78,
0x51, 0xc4, 0x84, 0xae, 0x3b, 0x35, 0x25, 0x17, 0x97, 0x66, 0xa4, 0x41, 0x2b, 0x3e, 0xe3, 0xb5,
0x86, 0x41, 0xc0, 0x62, 0x0d, 0x56, 0x35, 0xf5, 0x92, 0xa2, 0x73, 0x0d, 0xda, 0x69, 0xc2, 0x43,
0x84, 0xfd, 0x4b, 0x0a, 0x52, 0x1a, 0x9a, 0x7c, 0x08, 0xd7, 0xd2, 0x2c, 0x09, 0x0e, 0x32, 0xf6,
0x82, 0x65, 0x19, 0x0b, 0xb6, 0xd1, 0xfa, 0x77, 0x54, 0xc1, 0xd9, 0xa1, 0xf3, 0x07, 0xe5, 0x2c,
0xc1, 0xb8, 0x98, 0x9d, 0xb5, 0xa2, 0x66, 0xcd, 0x1d, 0x94, 0x7a, 0x24, 0x29, 0xcb, 0xbc, 0x93,
0x48, 0xd5, 0x9c, 0x1d, 0x9a, 0xd3, 0xce, 0xff, 0xe8, 0x2b, 0xd5, 0xcd, 0xf2, 0x8a, 0x2b, 0xb5,
0x2e, 0xae, 0x3e, 0xb7, 0xe5, 0xd7, 0x28, 0x77, 0x93, 0xac, 0xae, 0x8d, 0xc2, 0x26, 0xb2, 0x12,
0x64, 0x59, 0x78, 0xce, 0x02, 0x17, 0xe1, 0xc3, 0x82, 0xae, 0x04, 0x15, 0xef, 0x0b, 0x89, 0x22,
0x3e, 0x85, 0x35, 0x55, 0xb3, 0x71, 0x16, 0xb8, 0x38, 0xa0, 0x01, 0x22, 0xf6, 0x24, 0x55, 0x30,
0xba, 0x81, 0x15, 0x1c, 0x67, 0xc1, 0x4e, 0x3e, 0xbe, 0x27, 0x87, 0x55, 0x1f, 0x22, 0xf6, 0xcd,
0xf2, 0xea, 0xf2, 0x41, 0xb1, 0x70, 0xf5, 0xbf, 0x87, 0xf6, 0x14, 0xce, 0xad, 0x68, 0xd2, 0xe7,
0x62, 0x72, 0x8a, 0xee, 0xa1, 0xc9, 0xda, 0xa7, 0x31, 0xf7, 0x03, 0x83, 0x1c, 0xa5, 0xb9, 0x98,
0x6d, 0x0b, 0x50, 0xb6, 0x85, 0x77, 0xa0, 0x3f, 0xd5, 0x56, 0xe6, 0x68, 0x47, 0xbd, 0x99, 0x46,
0x9d, 0xf3, 0x8d, 0x0a, 0xb3, 0x06, 0x63, 0x1f, 0x68, 0x93, 0xa9, 0x82, 0x82, 0xf6, 0xce, 0xea,
0xaf, 0xb4, 0x33, 0xe7, 0x4f, 0x35, 0x15, 0x49, 0x0f, 0xbd, 0x73, 0x16, 0x6c, 0x69, 0xe7, 0xb4,
0xdc, 0xb6, 0x56, 0x76, 0xdb, 0x8a, 0xbe, 0x6e, 0x45, 0x12, 0xb9, 0x0b, 0x3d, 0x55, 0x76, 0xbb,
0x76, 0xac, 0xea, 0x2a, 0x9e, 0xea, 0x0b, 0xbc, 0x0b, 0x57, 0x54, 0xf4, 0xe7, 0xc3, 0x24, 0x13,
0x58, 0xf2, 0x70, 0xed, 0x98, 0x2b, 0x38, 0x70, 0x28, 0xf9, 0xb2, 0xf4, 0xe1, 0x32, 0xe1, 0xb1,
0x98, 0x6b, 0xe4, 0x28, 0x1f, 0xa5, 0x31, 0x86, 0xdc, 0x95, 0xa6, 0xae, 0x0f, 0xb9, 0x15, 0xf2,
0x23, 0xc6, 0x45, 0x01, 0x33, 0xbb, 0x16, 0xcc, 0x7c, 0xd4, 0x6c, 0x37, 0xfa, 0xcd, 0x47, 0xcd,
0x76, 0xb3, 0xbf, 0xe0, 0xfc, 0x50, 0x53, 0x67, 0x3b, 0x53, 0xb5, 0x56, 0x9c, 0xed, 0x74, 0x7d,
0xa5, 0x4e, 0xa0, 0x54, 0x5f, 0xed, 0xc2, 0xeb, 0x43, 0x95, 0x8b, 0x5c, 0x2f, 0xf3, 0x87, 0xe1,
0x39, 0x73, 0xf9, 0x38, 0x4d, 0xe5, 0xbe, 0x58, 0x2c, 0x5d, 0x4c, 0xc5, 0xba, 0x36, 0xbd, 0xad,
0xc5, 0xb6, 0x94, 0xd4, 0xa1, 0x12, 0xda, 0x55, 0x32, 0xce, 0xaf, 0x6a, 0x0a, 0xf7, 0x1e, 0x65,
0x63, 0x2e, 0x58, 0x20, 0x13, 0xec, 0x2b, 0x7e, 0x3c, 0xfd, 0x0c, 0x5a, 0x16, 0x02, 0x5a, 0x9e,
0xae, 0xf4, 0xad, 0x05, 0x37, 0x8e, 0x8a, 0xde, 0x14, 0xd5, 0x93, 0x9c, 0x4f, 0xa0, 0x6b, 0xb1,
0x49, 0x17, 0x16, 0x8f, 0xf7, 0x1f, 0xef, 0x3f, 0xfb, 0x72, 0xbf, 0xff, 0x9a, 0x24, 0x8e, 0xe8,
0xf1, 0xa1, 0x84, 0x2b, 0x35, 0x72, 0x05, 0x96, 0x8e, 0xf7, 0x91, 0xfc, 0xf2, 0x19, 0x3d, 0x7a,
0xf8, 0x75, 0xbf, 0xee, 0xfc, 0xd8, 0x50, 0xdd, 0x9b, 0xe7, 0x56, 0x77, 0x4c, 0xc3, 0xa6, 0xea,
0xba, 0x05, 0x1d, 0xb4, 0x6e, 0x95, 0x0f, 0xcb, 0x50, 0x17, 0x89, 0x8e, 0x20, 0x75, 0x91, 0xc8,
0xca, 0xc4, 0x1f, 0xca, 0x38, 0x1c, 0x9f, 0x9a, 0x20, 0x52, 0x30, 0xe4, 0x95, 0x68, 0x5c, 0xa5,
0x32, 0xbb, 0x6e, 0x4a, 0xe6, 0xbc, 0x2d, 0xec, 0xa4, 0x67, 0x8c, 0xa7, 0x49, 0xcc, 0x4d, 0x7a,
0xc8, 0x69, 0x99, 0x69, 0x32, 0x96, 0x46, 0xa1, 0x9a, 0xac, 0x6c, 0xb3, 0xa3, 0x39, 0x5b, 0x82,
0xb0, 0xf9, 0x5d, 0xc0, 0x36, 0x9e, 0xec, 0x87, 0xe5, 0x93, 0x9d, 0xb3, 0xeb, 0x8d, 0xe7, 0x33,
0x7d, 0xc2, 0xb9, 0xbd, 0x43, 0x75, 0x87, 0x9d, 0xbc, 0xfa, 0xf8, 0x0a, 0xc8, 0xec, 0xcc, 0x99,
0xbb, 0x38, 0xd8, 0xdd, 0xdf, 0xd9, 0xdb, 0xff, 0xe7, 0x7e, 0xad, 0x04, 0x24, 0xeb, 0x25, 0x20,
0xd9, 0x90, 0xd4, 0xf6, 0xd6, 0xfe, 0xf6, 0xee, 0x93, 0xdd, 0x9d, 0x7e, 0xd3, 0xf9, 0x43, 0x4d,
0x95, 0x25, 0xdb, 0xa5, 0x26, 0xdd, 0x4f, 0xe0, 0xed, 0xdb, 0xd0, 0xd1, 0xe7, 0xb9, 0x67, 0x2c,
0xad, 0x60, 0x90, 0x7f, 0x83, 0x15, 0x83, 0x68, 0xdd, 0x92, 0xe5, 0x7d, 0x30, 0xdd, 0x74, 0x99,
0xf7, 0xca, 0x0d, 0xf3, 0xa0, 0x8f, 0x67, 0x39, 0x28, 0xd1, 0xce, 0x7b, 0xb0, 0x5c, 0x96, 0x78,
0x29, 0x6a, 0xfe, 0x4d, 0x1d, 0x56, 0xa6, 0xbe, 0x78, 0x57, 0x03, 0x9f, 0xe9, 0x76, 0x64, 0x7d,
0xa6, 0x1d, 0x49, 0xde, 0x03, 0x62, 0x8b, 0xb8, 0x76, 0x9f, 0xa6, 0x6f, 0x09, 0xaa, 0x38, 0x66,
0x23, 0xa9, 0xe6, 0x65, 0x90, 0x14, 0xb9, 0x0f, 0x3d, 0x9e, 0xf8, 0xa1, 0x17, 0xb9, 0x51, 0x18,
0x9f, 0x99, 0xbf, 0x19, 0xdc, 0x9c, 0xfa, 0x84, 0x8e, 0x12, 0x4f, 0xa4, 0x00, 0xed, 0xf2, 0x82,
0x20, 0xff, 0x02, 0xab, 0x2c, 0xe6, 0xae, 0x41, 0xd3, 0x6e, 0x90, 0xff, 0xb1, 0xa0, 0x31, 0xdb,
0xa1, 0x9b, 0x81, 0xeb, 0x94, 0xb0, 0x69, 0x16, 0x77, 0x38, 0x00, 0xf5, 0x2e, 0x74, 0xe1, 0x6c,
0x43, 0xde, 0x5a, 0x19, 0xf2, 0x3e, 0x86, 0xae, 0xfe, 0x8b, 0xc9, 0x91, 0xe9, 0x3f, 0x2c, 0x6f,
0xbe, 0x53, 0xbc, 0x71, 0xab, 0xf8, 0x53, 0xca, 0x53, 0xfd, 0x9f, 0x14, 0xbd, 0xe8, 0x86, 0x9c,
0x40, 0xed, 0xd9, 0xce, 0x2f, 0x6b, 0xb0, 0x2c, 0x55, 0xb4, 0xde, 0xfc, 0x8f, 0xd8, 0x4b, 0x30,
0x05, 0xbc, 0xfe, 0xfe, 0xb6, 0x6a, 0xb5, 0xa4, 0xf2, 0x41, 0x6a, 0x0b, 0x92, 0x4d, 0x58, 0xe5,
0xe3, 0x13, 0x93, 0x33, 0x1f, 0xf1, 0x24, 0x7e, 0x30, 0x11, 0xcc, 0x20, 0xd0, 0xb9, 0x63, 0xe4,
0x3d, 0xb8, 0x62, 0x7a, 0x95, 0xc5, 0x04, 0xf5, 0x95, 0x72, 0x76, 0xc0, 0xf9, 0xdf, 0x5a, 0x8e,
0x94, 0x64, 0xba, 0xc6, 0x4a, 0x2c, 0x37, 0x31, 0xf9, 0x38, 0x37, 0x4f, 0x5e, 0x87, 0x96, 0xfe,
0x82, 0xa1, 0xb2, 0x80, 0xa6, 0x6c, 0x23, 0x6d, 0x96, 0x8c, 0xf4, 0x36, 0x74, 0x74, 0xde, 0x65,
0xd2, 0x2c, 0x64, 0x21, 0x5d, 0x30, 0x4a, 0x90, 0x52, 0x41, 0xa2, 0x9c, 0x76, 0xbe, 0x51, 0x19,
0xc4, 0xb2, 0x1a, 0xf2, 0xd1, 0x94, 0x99, 0xcd, 0x1c, 0x67, 0x21, 0x5c, 0xb6, 0xb0, 0x3c, 0x2e,
0xd4, 0xed, 0x4a, 0xe3, 0xfb, 0x1a, 0xdc, 0xb1, 0x10, 0xc5, 0xf6, 0xec, 0xc7, 0xe8, 0x3b, 0x00,
0xe6, 0x7b, 0x95, 0x27, 0x74, 0x50, 0xe9, 0x68, 0xce, 0x96, 0xa8, 0xfa, 0xb8, 0x5d, 0xaf, 0xfc,
0xb8, 0x5d, 0x55, 0x31, 0x38, 0xff, 0x57, 0x83, 0xfe, 0x51, 0x72, 0xc6, 0x62, 0x05, 0x77, 0x59,
0xec, 0x2b, 0xac, 0x20, 0xeb, 0x07, 0x7d, 0x25, 0x67, 0x6c, 0x52, 0x3a, 0xaf, 0xfa, 0x14, 0x04,
0x7f, 0x13, 0x96, 0x4e, 0xb3, 0x64, 0x9c, 0x1a, 0x80, 0x85, 0x6f, 0x68, 0xd0, 0x32, 0x13, 0x3f,
0xdf, 0x85, 0x3c, 0x94, 0xd8, 0x59, 0x97, 0xa3, 0x9a, 0x24, 0xeb, 0x60, 0x03, 0x01, 0x03, 0x69,
0x2d, 0x96, 0xf3, 0xdf, 0xfa, 0x3b, 0xe4, 0x8c, 0xa2, 0x95, 0x85, 0x93, 0x44, 0x35, 0x31, 0x53,
0xf5, 0x6a, 0x9b, 0x1a, 0x92, 0xdc, 0x87, 0x6e, 0x5a, 0x4c, 0xd7, 0xff, 0x91, 0x5a, 0x2b, 0xae,
0x71, 0xfa, 0x05, 0xd4, 0x16, 0x7f, 0xb0, 0xf4, 0xaf, 0xdd, 0x8d, 0xf7, 0x3f, 0x35, 0xc2, 0x27,
0x2d, 0x7c, 0xfa, 0xe0, 0x2f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x43, 0xce, 0x49, 0xcc, 0x84, 0x26,
0x00, 0x00,
}

View File

@ -306,10 +306,10 @@ message SyncAccountsPositions {
}
message SyncSavedAddress {
reserved 3;
reserved 4;
bytes address = 1;
string name = 2;
bool favourite = 3;
bool removed = 5;
uint64 update_clock = 7;
string chain_short_names = 8;

View File

@ -1066,8 +1066,12 @@ func (api *PublicAPI) UpsertSavedAddress(ctx context.Context, sa wallet.SavedAdd
return api.service.messenger.UpsertSavedAddress(ctx, sa)
}
func (api *PublicAPI) DeleteSavedAddress(ctx context.Context, address ethcommon.Address, ens string, isTest bool) error {
return api.service.messenger.DeleteSavedAddress(ctx, address, ens, isTest)
func (api *PublicAPI) DeleteSavedAddress(ctx context.Context, address ethcommon.Address, isTest bool) error {
return api.service.messenger.DeleteSavedAddress(ctx, address, isTest)
}
func (api *PublicAPI) GetSavedAddresses(ctx context.Context) ([]wallet.SavedAddress, error) {
return api.service.messenger.GetSavedAddresses(ctx)
}
// PushNotifications server endpoints

View File

@ -233,27 +233,6 @@ func (api *API) DeleteCustomTokenByChainID(ctx context.Context, chainID uint64,
return err
}
func (api *API) GetSavedAddresses(ctx context.Context) ([]SavedAddress, error) {
log.Debug("call to get saved addresses")
rst, err := api.s.savedAddressesManager.GetSavedAddresses()
log.Debug("result from database for saved addresses", "len", len(rst))
return rst, err
}
func (api *API) AddSavedAddress(ctx context.Context, sa SavedAddress) error {
log.Debug("call to create or edit saved address")
_, err := api.s.savedAddressesManager.UpdateMetadataAndUpsertSavedAddress(sa)
log.Debug("result from database for create or edit saved address", "err", err)
return err
}
func (api *API) DeleteSavedAddress(ctx context.Context, address common.Address, ens string, isTest bool) error {
log.Debug("call to remove saved address")
_, err := api.s.savedAddressesManager.DeleteSavedAddress(address, ens, isTest, uint64(time.Now().Unix()))
log.Debug("result from database for remove saved address", "err", err)
return err
}
// @deprecated
func (api *API) GetPendingTransactions(ctx context.Context) ([]*transactions.PendingTransaction, error) {
log.Debug("wallet.api.GetPendingTransactions")

View File

@ -19,7 +19,6 @@ type SavedAddress struct {
// TODO: Add Emoji
// Emoji string `json:"emoji"`
Name string `json:"name"`
Favourite bool `json:"favourite"`
ChainShortNames string `json:"chainShortNames"` // used with address only, not with ENSName
ENSName string `json:"ens"`
ColorID multiAccCommon.CustomizationColor `json:"colorId"`
@ -29,7 +28,7 @@ type SavedAddress struct {
}
func (s *SavedAddress) ID() string {
return fmt.Sprintf("%s-%s-%t", s.Address.Hex(), s.ENSName, s.IsTest)
return fmt.Sprintf("%s-%t", s.Address.Hex(), s.IsTest)
}
type SavedAddressesManager struct {
@ -40,7 +39,7 @@ func NewSavedAddressesManager(db *sql.DB) *SavedAddressesManager {
return &SavedAddressesManager{db: db}
}
const rawQueryColumnsOrder = "address, name, favourite, removed, update_clock, chain_short_names, ens_name, is_test, created_at, color"
const rawQueryColumnsOrder = "address, name, removed, update_clock, chain_short_names, ens_name, is_test, created_at, color"
// getSavedAddressesFromDBRows retrieves all data based on SELECT Query using rawQueryColumnsOrder
func getSavedAddressesFromDBRows(rows *sql.Rows) ([]SavedAddress, error) {
@ -51,7 +50,6 @@ func getSavedAddressesFromDBRows(rows *sql.Rows) ([]SavedAddress, error) {
err := rows.Scan(
&sa.Address,
&sa.Name,
&sa.Favourite,
&sa.Removed,
&sa.UpdateClock,
&sa.ChainShortNames,
@ -110,8 +108,8 @@ func (sam *SavedAddressesManager) upsertSavedAddress(sa SavedAddress, tx *sql.Tx
}()
}
rows, err := tx.Query(
fmt.Sprintf("SELECT %s FROM saved_addresses WHERE address = ? AND is_test = ? AND ens_name = ?", rawQueryColumnsOrder),
sa.Address, sa.IsTest, sa.ENSName,
fmt.Sprintf("SELECT %s FROM saved_addresses WHERE address = ? AND is_test = ?", rawQueryColumnsOrder),
sa.Address, sa.IsTest,
)
if err != nil {
return err
@ -123,7 +121,7 @@ func (sam *SavedAddressesManager) upsertSavedAddress(sa SavedAddress, tx *sql.Tx
}
sa.CreatedAt = time.Now().Unix()
for _, savedAddress := range savedAddresses {
if savedAddress.Address == sa.Address && savedAddress.IsTest == sa.IsTest && savedAddress.ENSName == sa.ENSName {
if savedAddress.Address == sa.Address && savedAddress.IsTest == sa.IsTest {
sa.CreatedAt = savedAddress.CreatedAt
break
}
@ -134,23 +132,23 @@ func (sam *SavedAddressesManager) upsertSavedAddress(sa SavedAddress, tx *sql.Tx
saved_addresses (
address,
name,
favourite,
removed,
update_clock,
chain_short_names,
ens_name, is_test,
ens_name,
is_test,
created_at,
color
)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
(?, ?, ?, ?, ?, ?, ?, ?, ?)
`
insert, err := tx.Prepare(sqlStatement)
if err != nil {
return err
}
defer insert.Close()
_, err = insert.Exec(sa.Address, sa.Name, sa.Favourite, sa.Removed, sa.UpdateClock, sa.ChainShortNames, sa.ENSName,
_, err = insert.Exec(sa.Address, sa.Name, sa.Removed, sa.UpdateClock, sa.ChainShortNames, sa.ENSName,
sa.IsTest, sa.CreatedAt, sa.ColorID)
return err
}
@ -164,12 +162,12 @@ func (sam *SavedAddressesManager) UpdateMetadataAndUpsertSavedAddress(sa SavedAd
return sa.UpdateClock, nil
}
func (sam *SavedAddressesManager) startTransactionAndCheckIfNewerChange(address common.Address, ens string, isTest bool, updateClock uint64) (newer bool, tx *sql.Tx, err error) {
func (sam *SavedAddressesManager) startTransactionAndCheckIfNewerChange(address common.Address, isTest bool, updateClock uint64) (newer bool, tx *sql.Tx, err error) {
tx, err = sam.db.Begin()
if err != nil {
return false, nil, err
}
row := tx.QueryRow("SELECT update_clock FROM saved_addresses WHERE address = ? AND is_test = ? AND ens_name = ?", address, isTest, ens)
row := tx.QueryRow("SELECT update_clock FROM saved_addresses WHERE address = ? AND is_test = ?", address, isTest)
if err != nil {
return false, tx, err
}
@ -183,7 +181,7 @@ func (sam *SavedAddressesManager) startTransactionAndCheckIfNewerChange(address
}
func (sam *SavedAddressesManager) AddSavedAddressIfNewerUpdate(sa SavedAddress, updateClock uint64) (insertedOrUpdated bool, err error) {
newer, tx, err := sam.startTransactionAndCheckIfNewerChange(sa.Address, sa.ENSName, sa.IsTest, updateClock)
newer, tx, err := sam.startTransactionAndCheckIfNewerChange(sa.Address, sa.IsTest, updateClock)
defer func() {
if err == nil {
err = tx.Commit()
@ -204,11 +202,11 @@ func (sam *SavedAddressesManager) AddSavedAddressIfNewerUpdate(sa SavedAddress,
return true, err
}
func (sam *SavedAddressesManager) DeleteSavedAddress(address common.Address, ens string, isTest bool, updateClock uint64) (deleted bool, err error) {
func (sam *SavedAddressesManager) DeleteSavedAddress(address common.Address, isTest bool, updateClock uint64) (deleted bool, err error) {
if err != nil {
return false, err
}
newer, tx, err := sam.startTransactionAndCheckIfNewerChange(address, ens, isTest, updateClock)
newer, tx, err := sam.startTransactionAndCheckIfNewerChange(address, isTest, updateClock)
defer func() {
if err == nil {
err = tx.Commit()
@ -220,12 +218,12 @@ func (sam *SavedAddressesManager) DeleteSavedAddress(address common.Address, ens
return false, err
}
update, err := tx.Prepare(`UPDATE saved_addresses SET removed = 1, update_clock = ? WHERE address = ? AND is_test = ? AND ens_name = ?`)
update, err := tx.Prepare(`UPDATE saved_addresses SET removed = 1, update_clock = ? WHERE address = ? AND is_test = ?`)
if err != nil {
return false, err
}
defer update.Close()
res, err := update.Exec(updateClock, address, isTest, ens)
res, err := update.Exec(updateClock, address, isTest)
if err != nil {
return false, err
}

View File

@ -39,7 +39,6 @@ func TestSavedAddressesAdd(t *testing.T) {
sa := SavedAddress{
Address: common.Address{1},
Name: "Zilliqa",
Favourite: true,
ChainShortNames: "eth:arb:",
ENSName: "test.stateofus.eth",
ColorID: multiAccCommon.CustomizationColorGreen,
@ -54,7 +53,6 @@ func TestSavedAddressesAdd(t *testing.T) {
require.Equal(t, 1, len(rst))
require.Equal(t, sa.Address, rst[0].Address)
require.Equal(t, sa.Name, rst[0].Name)
require.Equal(t, sa.Favourite, rst[0].Favourite)
require.Equal(t, sa.ChainShortNames, rst[0].ChainShortNames)
require.Equal(t, sa.ENSName, rst[0].ENSName)
require.Equal(t, sa.ColorID, rst[0].ColorID)
@ -80,8 +78,8 @@ func haveSameElements[T comparable](a []T, b []T, isEqual func(T, T) bool) bool
}
func savedAddressDataIsEqual(a, b SavedAddress) bool {
return a.Address == b.Address && a.Name == b.Name && a.Favourite == b.Favourite &&
a.ChainShortNames == b.ChainShortNames && a.ENSName == b.ENSName && a.IsTest == b.IsTest && a.ColorID == b.ColorID
return a.Address == b.Address && a.Name == b.Name && a.ChainShortNames == b.ChainShortNames &&
a.ENSName == b.ENSName && a.IsTest == b.IsTest && a.ColorID == b.ColorID
}
func TestSavedAddressesMetadata(t *testing.T) {
@ -94,9 +92,8 @@ func TestSavedAddressesMetadata(t *testing.T) {
// Add raw saved addresses
sa1 := SavedAddress{
Address: common.Address{1},
Name: "Raw",
Favourite: true,
Address: common.Address{1},
Name: "Raw",
savedAddressMeta: savedAddressMeta{
Removed: false,
UpdateClock: 234,
@ -117,11 +114,10 @@ func TestSavedAddressesMetadata(t *testing.T) {
// Add simple saved address without sync metadata
sa2 := SavedAddress{
Address: common.Address{2},
Name: "Simple",
ColorID: multiAccCommon.CustomizationColorBlue,
Favourite: false,
IsTest: false,
Address: common.Address{2},
Name: "Simple",
ColorID: multiAccCommon.CustomizationColorBlue,
IsTest: false,
}
var sa2UpdatedClock uint64
@ -142,7 +138,6 @@ func TestSavedAddressesMetadata(t *testing.T) {
require.Equal(t, sa2.Address, dbSavedAddresses[rawIndex].Address)
require.Equal(t, sa2.Name, dbSavedAddresses[rawIndex].Name)
require.Equal(t, sa2.ColorID, dbSavedAddresses[rawIndex].ColorID)
require.Equal(t, sa2.Favourite, dbSavedAddresses[rawIndex].Favourite)
require.Equal(t, sa2.IsTest, dbSavedAddresses[rawIndex].IsTest)
// Check the default values
@ -151,11 +146,9 @@ func TestSavedAddressesMetadata(t *testing.T) {
require.Greater(t, dbSavedAddresses[rawIndex].UpdateClock, uint64(0))
sa2Older := sa2
sa2Older.Favourite = true
sa2Older.IsTest = false
sa2Newer := sa2
sa2Newer.Favourite = false
sa2Newer.IsTest = false
// Try to add an older entry
@ -193,7 +186,7 @@ func TestSavedAddressesMetadata(t *testing.T) {
// Try to delete the sa2 newer entry
updatedDeleteClock := updatedClock + 1
updated, err = manager.DeleteSavedAddress(sa2Newer.Address, sa2Newer.ENSName, sa2Newer.IsTest, updatedDeleteClock)
updated, err = manager.DeleteSavedAddress(sa2Newer.Address, sa2Newer.IsTest, updatedDeleteClock)
require.NoError(t, err)
require.True(t, updated)
@ -216,10 +209,9 @@ func TestSavedAddressesCleanSoftDeletes(t *testing.T) {
firstTimestamp := 10
for i := 0; i < 5; i++ {
sa := SavedAddress{
Address: common.Address{byte(i)},
Name: "Test" + strconv.Itoa(i),
ColorID: multiAccCommon.CustomizationColorGreen,
Favourite: false,
Address: common.Address{byte(i)},
Name: "Test" + strconv.Itoa(i),
ColorID: multiAccCommon.CustomizationColorGreen,
savedAddressMeta: savedAddressMeta{
Removed: true,
UpdateClock: uint64(firstTimestamp + i),
@ -299,7 +291,7 @@ func TestSavedAddressesDelete(t *testing.T) {
// Delete s0, test that only s1 is left
updateClock := uint64(time.Now().Unix())
_, err = manager.DeleteSavedAddress(sa0.Address, sa0.ENSName, sa0.IsTest, updateClock)
_, err = manager.DeleteSavedAddress(sa0.Address, sa0.IsTest, updateClock)
require.NoError(t, err)
rst, err = manager.GetSavedAddresses()
@ -313,7 +305,7 @@ func TestSavedAddressesDelete(t *testing.T) {
require.Equal(t, 2, len(rst))
// Delete s0 one more time with the same timestamp
deleted, err := manager.DeleteSavedAddress(sa0.Address, sa0.ENSName, sa0.IsTest, updateClock)
deleted, err := manager.DeleteSavedAddress(sa0.Address, sa0.IsTest, updateClock)
require.NoError(t, err)
require.False(t, deleted)
}

View File

@ -17,6 +17,7 @@
// 1702577524_add_community_collections_and_collectibles_images_cache.up.sql (210B)
// 1702867707_add_balance_to_collectibles_ownership_cache.up.sql (289B)
// 1703686612_add_color_to_saved_addresses.up.sql (114B)
// 1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql (894B)
// doc.go (74B)
package migrations
@ -101,7 +102,7 @@ func _1691753758_initialUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1691753758_initial.up.sql", size: 5738, mode: os.FileMode(0644), modTime: time.Unix(1692726720, 0)}
info := bindataFileInfo{name: "1691753758_initial.up.sql", size: 5738, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0x25, 0x31, 0xc8, 0x27, 0x3, 0x6b, 0x9f, 0x15, 0x42, 0x2f, 0x85, 0xfb, 0xe3, 0x6, 0xea, 0xf7, 0x97, 0x12, 0x56, 0x3c, 0x9a, 0x5b, 0x1a, 0xca, 0xb1, 0x23, 0xfa, 0xcd, 0x57, 0x25, 0x5c}}
return a, nil
}
@ -121,7 +122,7 @@ func _1692701329_add_collectibles_and_collections_data_cacheUpSql() (*asset, err
return nil, err
}
info := bindataFileInfo{name: "1692701329_add_collectibles_and_collections_data_cache.up.sql", size: 1808, mode: os.FileMode(0644), modTime: time.Unix(1692726720, 0)}
info := bindataFileInfo{name: "1692701329_add_collectibles_and_collections_data_cache.up.sql", size: 1808, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1, 0x51, 0xf4, 0x2b, 0x92, 0xde, 0x59, 0x65, 0xd8, 0x9b, 0x57, 0xe0, 0xfd, 0x7b, 0x12, 0xb, 0x29, 0x6e, 0x9d, 0xb5, 0x90, 0xe, 0xfa, 0x12, 0x97, 0xd, 0x61, 0x60, 0x7f, 0x32, 0x1d, 0xc3}}
return a, nil
}
@ -141,7 +142,7 @@ func _1692701339_add_scope_to_pendingUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1692701339_add_scope_to_pending.up.sql", size: 576, mode: os.FileMode(0644), modTime: time.Unix(1695127783, 0)}
info := bindataFileInfo{name: "1692701339_add_scope_to_pending.up.sql", size: 576, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x8a, 0x5e, 0xe2, 0x63, 0x15, 0x37, 0xba, 0x55, 0x18, 0xf3, 0xcc, 0xe0, 0x5, 0x84, 0xe1, 0x5b, 0xe8, 0x1, 0x32, 0x6b, 0x9f, 0x7d, 0x9f, 0xd9, 0x23, 0x6c, 0xa9, 0xb5, 0xdc, 0xf4, 0x93}}
return a, nil
}
@ -161,7 +162,7 @@ func _1694540071_add_collectibles_ownership_update_timestampUpSql() (*asset, err
return nil, err
}
info := bindataFileInfo{name: "1694540071_add_collectibles_ownership_update_timestamp.up.sql", size: 349, mode: os.FileMode(0644), modTime: time.Unix(1695127783, 0)}
info := bindataFileInfo{name: "1694540071_add_collectibles_ownership_update_timestamp.up.sql", size: 349, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x45, 0xc7, 0xce, 0x79, 0x63, 0xbc, 0x6f, 0x83, 0x5f, 0xe2, 0x3, 0x56, 0xcc, 0x5, 0x2f, 0x85, 0xda, 0x7e, 0xea, 0xf5, 0xd2, 0xac, 0x19, 0xd4, 0xd8, 0x5e, 0xdd, 0xed, 0xe2, 0xa9, 0x97}}
return a, nil
}
@ -181,7 +182,7 @@ func _1694692748_add_raw_balance_to_token_balancesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1694692748_add_raw_balance_to_token_balances.up.sql", size: 165, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1694692748_add_raw_balance_to_token_balances.up.sql", size: 165, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd4, 0xe0, 0x5b, 0x42, 0xf0, 0x96, 0xa5, 0xf5, 0xed, 0xc0, 0x97, 0x88, 0xb0, 0x6d, 0xfe, 0x7d, 0x97, 0x2e, 0x17, 0xd2, 0x16, 0xbc, 0x2a, 0xf2, 0xcc, 0x67, 0x9e, 0xc5, 0x47, 0xf6, 0x69, 0x1}}
return a, nil
}
@ -201,7 +202,7 @@ func _1695133989_add_community_id_to_collectibles_and_collections_data_cacheUpSq
return nil, err
}
info := bindataFileInfo{name: "1695133989_add_community_id_to_collectibles_and_collections_data_cache.up.sql", size: 275, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1695133989_add_community_id_to_collectibles_and_collections_data_cache.up.sql", size: 275, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x2, 0xa, 0x7f, 0x4b, 0xd1, 0x3, 0xd0, 0x3, 0x29, 0x84, 0x31, 0xed, 0x49, 0x4f, 0xb1, 0x2d, 0xd7, 0x80, 0x41, 0x5b, 0xfa, 0x6, 0xae, 0xb4, 0xf6, 0x6b, 0x49, 0xee, 0x57, 0x33, 0x76}}
return a, nil
}
@ -221,7 +222,7 @@ func _1695932536_balance_history_v2UpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1695932536_balance_history_v2.up.sql", size: 653, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1695932536_balance_history_v2.up.sql", size: 653, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x37, 0xf4, 0x14, 0x91, 0xf6, 0x5f, 0xc4, 0x9b, 0xb7, 0x83, 0x32, 0x72, 0xbe, 0x82, 0x42, 0x39, 0xa4, 0x3b, 0xc9, 0x78, 0x3d, 0xca, 0xd4, 0xbf, 0xfc, 0x7a, 0x33, 0x1e, 0xcd, 0x9e, 0xe4, 0x85}}
return a, nil
}
@ -241,7 +242,7 @@ func _1696853635_input_dataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1696853635_input_data.up.sql", size: 23140, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1696853635_input_data.up.sql", size: 23140, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x89, 0x30, 0x33, 0x33, 0x55, 0xc5, 0x57, 0x2b, 0xaf, 0xef, 0x3d, 0x8d, 0x2a, 0xaa, 0x5c, 0x32, 0xd1, 0xf4, 0xd, 0x4a, 0xd0, 0x33, 0x4a, 0xe8, 0xf6, 0x8, 0x6b, 0x65, 0xcc, 0xba, 0xed, 0x42}}
return a, nil
}
@ -261,7 +262,7 @@ func _1698117918_add_community_id_to_tokensUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1698117918_add_community_id_to_tokens.up.sql", size: 61, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1698117918_add_community_id_to_tokens.up.sql", size: 61, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x82, 0xdb, 0xde, 0x3, 0x3, 0xc, 0x67, 0xf3, 0x54, 0xc4, 0xad, 0xd6, 0xce, 0x56, 0xfb, 0xc1, 0x87, 0xd7, 0xda, 0xab, 0xec, 0x1, 0xe1, 0x7d, 0xb3, 0x63, 0xd6, 0xe5, 0x5d, 0x1c, 0x15}}
return a, nil
}
@ -281,7 +282,7 @@ func _1698257443_add_community_metadata_to_wallet_dbUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1698257443_add_community_metadata_to_wallet_db.up.sql", size: 323, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1698257443_add_community_metadata_to_wallet_db.up.sql", size: 323, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x22, 0xd3, 0x4, 0x25, 0xfa, 0x23, 0x1, 0x48, 0x83, 0x26, 0x20, 0xf2, 0x3d, 0xbc, 0xc1, 0xa7, 0x7c, 0x27, 0x7c, 0x1d, 0x63, 0x3, 0xa, 0xd0, 0xce, 0x47, 0x86, 0xdc, 0xa1, 0x3c, 0x2, 0x1c}}
return a, nil
}
@ -301,7 +302,7 @@ func _1699987075_add_timestamp_and_state_to_community_data_cacheUpSql() (*asset,
return nil, err
}
info := bindataFileInfo{name: "1699987075_add_timestamp_and_state_to_community_data_cache.up.sql", size: 865, mode: os.FileMode(0644), modTime: time.Unix(1701091264, 0)}
info := bindataFileInfo{name: "1699987075_add_timestamp_and_state_to_community_data_cache.up.sql", size: 865, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc3, 0xee, 0x37, 0xf9, 0x7f, 0x9e, 0xfe, 0x93, 0x66, 0x2b, 0xd, 0x57, 0xf4, 0x89, 0x6c, 0x51, 0xfd, 0x14, 0xe9, 0xcd, 0xab, 0x65, 0xe7, 0xa7, 0x83, 0x7e, 0xe0, 0x5c, 0x14, 0x49, 0xf3, 0xe5}}
return a, nil
}
@ -321,7 +322,7 @@ func _1700414564_add_wallet_connect_pairings_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1700414564_add_wallet_connect_pairings_table.up.sql", size: 439, mode: os.FileMode(0644), modTime: time.Unix(1701146184, 0)}
info := bindataFileInfo{name: "1700414564_add_wallet_connect_pairings_table.up.sql", size: 439, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x77, 0x5e, 0x19, 0x62, 0x3c, 0x3a, 0x81, 0x16, 0xa0, 0x95, 0x35, 0x62, 0xab, 0x5e, 0x2b, 0xea, 0x11, 0x71, 0x11, 0xd0, 0x9, 0xab, 0x9c, 0xab, 0xf2, 0xdd, 0x5f, 0x88, 0x83, 0x9a, 0x93}}
return a, nil
}
@ -341,7 +342,7 @@ func _1701101493_add_token_blocks_rangeUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1701101493_add_token_blocks_range.up.sql", size: 469, mode: os.FileMode(0644), modTime: time.Unix(1702036318, 0)}
info := bindataFileInfo{name: "1701101493_add_token_blocks_range.up.sql", size: 469, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe0, 0x37, 0xfb, 0x1a, 0x6c, 0x8c, 0xa8, 0x1e, 0xa2, 0xa5, 0x1f, 0x90, 0x73, 0x3e, 0x31, 0x5f, 0x48, 0x1e, 0x9a, 0x37, 0x27, 0x1c, 0xc, 0x67, 0x1, 0xcd, 0xec, 0x85, 0x4c, 0x1c, 0x26, 0x52}}
return a, nil
}
@ -361,7 +362,7 @@ func _1702467441_wallet_connect_sessions_instead_of_pairingsUpSql() (*asset, err
return nil, err
}
info := bindataFileInfo{name: "1702467441_wallet_connect_sessions_instead_of_pairings.up.sql", size: 356, mode: os.FileMode(0644), modTime: time.Unix(1702635502, 0)}
info := bindataFileInfo{name: "1702467441_wallet_connect_sessions_instead_of_pairings.up.sql", size: 356, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x5f, 0x0, 0x60, 0x6, 0x28, 0x76, 0x61, 0x39, 0xdc, 0xa1, 0x84, 0x80, 0x46, 0x8a, 0xe4, 0x42, 0xb5, 0x1f, 0x18, 0x14, 0x23, 0x46, 0xb9, 0x51, 0xf, 0x62, 0xac, 0xc, 0x7, 0x98, 0xe}}
return a, nil
}
@ -381,7 +382,7 @@ func _1702577524_add_community_collections_and_collectibles_images_cacheUpSql()
return nil, err
}
info := bindataFileInfo{name: "1702577524_add_community_collections_and_collectibles_images_cache.up.sql", size: 210, mode: os.FileMode(0644), modTime: time.Unix(1702810113, 0)}
info := bindataFileInfo{name: "1702577524_add_community_collections_and_collectibles_images_cache.up.sql", size: 210, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8e, 0x1b, 0x32, 0x2c, 0xfa, 0x11, 0x5e, 0x5e, 0x5d, 0xef, 0x92, 0xa0, 0x29, 0x52, 0xbf, 0x6e, 0xe3, 0x30, 0xe4, 0xdf, 0xdc, 0x5, 0xbe, 0xd1, 0xf8, 0x3e, 0xd9, 0x9b, 0xd6, 0x9b, 0x95, 0x96}}
return a, nil
}
@ -401,7 +402,7 @@ func _1702867707_add_balance_to_collectibles_ownership_cacheUpSql() (*asset, err
return nil, err
}
info := bindataFileInfo{name: "1702867707_add_balance_to_collectibles_ownership_cache.up.sql", size: 289, mode: os.FileMode(0644), modTime: time.Unix(1702936307, 0)}
info := bindataFileInfo{name: "1702867707_add_balance_to_collectibles_ownership_cache.up.sql", size: 289, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6f, 0x63, 0x30, 0x11, 0x22, 0xb9, 0xee, 0xae, 0xb8, 0xc4, 0xe6, 0xd3, 0x7, 0xc, 0xe6, 0xa3, 0x72, 0x8c, 0x6, 0x9d, 0x6c, 0x97, 0x8f, 0xb2, 0xd0, 0x37, 0x69, 0x69, 0x6, 0x7f, 0x67, 0x94}}
return a, nil
}
@ -421,11 +422,31 @@ func _1703686612_add_color_to_saved_addressesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1703686612_add_color_to_saved_addresses.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1703919916, 0)}
info := bindataFileInfo{name: "1703686612_add_color_to_saved_addresses.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1704402566, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb7, 0x6e, 0x8d, 0xc0, 0x49, 0xc, 0xb, 0x66, 0xa0, 0x77, 0x32, 0x76, 0xa8, 0xd0, 0x40, 0xce, 0x67, 0xa, 0x9e, 0x23, 0x36, 0xe, 0xc3, 0xd3, 0x9d, 0xe2, 0xde, 0x60, 0x19, 0xba, 0x44, 0xf1}}
return a, nil
}
var __1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\x31\x6f\xc2\x30\x10\x85\x77\xff\x8a\x13\x13\x48\x0c\xdd\x99\x0c\x5c\x8a\x55\x63\x53\xc7\x29\x65\x8a\xa2\xc4\x12\xa8\x90\xa0\x38\xa5\xea\xbf\xaf\x9c\x18\x1a\x30\x42\x6c\xb9\xbb\x67\xdf\x97\xf7\xe4\x99\x42\xaa\x11\x34\x9d\x72\x04\x16\x81\x90\x1a\xf0\x93\xc5\x3a\x06\x9b\x9d\x4c\x91\x66\x45\x51\x1b\x6b\x8d\x4d\x4b\xf3\x03\x43\x02\xe0\x3b\xf0\x41\xd5\x6c\x41\x55\x7b\x44\x24\x9c\x8f\x09\x40\x99\x1d\x4c\x30\x80\x39\x46\x34\xe1\x1a\x06\x03\xa7\xa9\xcd\xa1\x3a\x99\x02\xa6\x52\x72\xa4\x22\x94\x45\x94\xc7\xe8\x94\xdf\xc7\x22\x6b\x4c\x9a\xef\xab\xfc\x0b\x98\xd0\xa1\xf4\xc5\xc9\xf2\x6d\xb6\x2b\x53\xbb\xad\xea\x26\x75\x00\x21\xda\x0d\x81\x29\x6d\xfa\x0c\xe9\xce\xa6\x8d\xb1\xcd\x13\xa4\x79\x6d\xb2\xc6\xb9\xd5\x3c\xe2\xac\xf6\x55\xfd\x60\xe7\xb1\xde\x1d\xb2\xfa\xb7\x5d\xbd\x52\x6c\x49\xd5\x06\xde\x70\x03\x43\xef\xf8\xf8\x0c\x34\x72\x8a\x44\xb0\xf7\x04\x61\xe8\x7e\xe4\x7f\x42\x46\xb0\x66\x7a\x21\x13\x0d\x4a\xae\xd9\x7c\x42\x08\x13\x31\x2a\x0d\x52\x01\x7b\x15\x52\xa1\x23\x94\xf7\xd2\x25\xd0\xe6\x7b\x49\x78\xdc\x16\xed\xfd\xed\x97\x0f\xae\x2b\xfa\xd9\x74\x9d\x20\x86\xae\x7d\x36\xbb\xab\x3c\xa7\x3f\x71\x71\xcd\xd7\xce\x20\x02\x30\x22\x31\x72\x9c\x69\x72\x85\x72\xbe\xa4\x87\x71\x0b\x71\x17\xa1\x0f\xd0\x5b\x7f\xbd\xbc\x5b\x1d\x29\xb9\x24\x70\xeb\xcd\x84\x90\xb9\x92\x2b\xff\x48\xc2\x21\xe5\x1a\xd5\xfd\x69\xfb\x68\x14\x0a\xba\x44\x08\x4d\x9f\xfc\x05\x00\x00\xff\xff\xf2\xa5\xf4\x92\x7e\x03\x00\x00")
func _1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSqlBytes() ([]byte, error) {
return bindataRead(
__1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql,
"1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql",
)
}
func _1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql() (*asset, error) {
bytes, err := _1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql", size: 894, mode: os.FileMode(0644), modTime: time.Unix(1704871375, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0xd3, 0xcf, 0x90, 0xb2, 0xa, 0x23, 0x41, 0x8a, 0xa5, 0x90, 0x7b, 0x34, 0xec, 0x3b, 0x3f, 0xa9, 0xb1, 0x95, 0xf3, 0x2a, 0xdf, 0xbb, 0x53, 0x57, 0x27, 0x2b, 0x12, 0x84, 0xf4, 0x83, 0xda}}
return a, nil
}
var _docGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2c\xc9\xb1\x0d\xc4\x20\x0c\x05\xd0\x9e\x29\xfe\x02\xd8\xfd\x6d\xe3\x4b\xac\x2f\x44\x82\x09\x78\x7f\xa5\x49\xfd\xa6\x1d\xdd\xe8\xd8\xcf\x55\x8a\x2a\xe3\x47\x1f\xbe\x2c\x1d\x8c\xfa\x6f\xe3\xb4\x34\xd4\xd9\x89\xbb\x71\x59\xb6\x18\x1b\x35\x20\xa2\x9f\x0a\x03\xa2\xe5\x0d\x00\x00\xff\xff\x60\xcd\x06\xbe\x4a\x00\x00\x00")
func docGoBytes() ([]byte, error) {
@ -441,7 +462,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1692726720, 0)}
info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1703598405, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x7c, 0x28, 0xcd, 0x47, 0xf2, 0xfa, 0x7c, 0x51, 0x2d, 0xd8, 0x38, 0xb, 0xb0, 0x34, 0x9d, 0x4c, 0x62, 0xa, 0x9e, 0x28, 0xc3, 0x31, 0x23, 0xd9, 0xbb, 0x89, 0x9f, 0xa0, 0x89, 0x1f, 0xe8}}
return a, nil
}
@ -571,6 +592,8 @@ var _bindata = map[string]func() (*asset, error){
"1703686612_add_color_to_saved_addresses.up.sql": _1703686612_add_color_to_saved_addressesUpSql,
"1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql": _1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql,
"doc.go": docGo,
}
@ -632,6 +655,7 @@ var _bintree = &bintree{nil, map[string]*bintree{
"1702577524_add_community_collections_and_collectibles_images_cache.up.sql": &bintree{_1702577524_add_community_collections_and_collectibles_images_cacheUpSql, map[string]*bintree{}},
"1702867707_add_balance_to_collectibles_ownership_cache.up.sql": &bintree{_1702867707_add_balance_to_collectibles_ownership_cacheUpSql, map[string]*bintree{}},
"1703686612_add_color_to_saved_addresses.up.sql": &bintree{_1703686612_add_color_to_saved_addressesUpSql, map[string]*bintree{}},
"1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql": &bintree{_1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
}}

View File

@ -0,0 +1,42 @@
CREATE TABLE IF NOT EXISTS saved_addresses_new (
address VARCHAR NOT NULL,
name VARCHAR NOT NULL DEFAULT "",
removed BOOLEAN NOT NULL DEFAULT FALSE,
update_clock INT NOT NULL DEFAULT 0,
chain_short_names VARCHAR NOT NULL DEFAULT "",
ens_name VARCHAR NOT NULL DEFAULT "",
is_test BOOLEAN NOT NULL DEFAULT FALSE,
created_at INT NOT NULL DEFAULT 0,
color VARCHAR NOT NULL DEFAULT "primary",
PRIMARY KEY (address, is_test),
UNIQUE (name, is_test)
) WITHOUT ROWID;
INSERT OR IGNORE INTO saved_addresses_new
(
address,
name,
removed,
update_clock,
chain_short_names,
ens_name,
is_test,
created_at,
color
)
SELECT
address,
name,
removed,
update_clock,
chain_short_names,
ens_name,
is_test,
created_at,
color
FROM
saved_addresses;
DROP TABLE saved_addresses;
ALTER TABLE saved_addresses_new RENAME TO saved_addresses;