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) 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()) updateClock := uint64(time.Now().Unix())
_, err := m.savedAddressesManager.DeleteSavedAddress(address, ens, isTest, updateClock) _, err := m.savedAddressesManager.DeleteSavedAddress(address, isTest, updateClock)
if err != nil { if err != nil {
return err 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 { func (m *Messenger) garbageCollectRemovedSavedAddresses() error {
@ -67,7 +71,6 @@ func (m *Messenger) syncNewSavedAddress(ctx context.Context, savedAddress *walle
return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{ return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{
Address: savedAddress.Address.Bytes(), Address: savedAddress.Address.Bytes(),
Name: savedAddress.Name, Name: savedAddress.Name,
Favourite: savedAddress.Favourite,
Removed: savedAddress.Removed, Removed: savedAddress.Removed,
UpdateClock: savedAddress.UpdateClock, UpdateClock: savedAddress.UpdateClock,
ChainShortNames: savedAddress.ChainShortNames, ChainShortNames: savedAddress.ChainShortNames,
@ -77,19 +80,18 @@ func (m *Messenger) syncNewSavedAddress(ctx context.Context, savedAddress *walle
}, rawMessageHandler) }, 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{ return m.dispatchSyncSavedAddress(ctx, &protobuf.SyncSavedAddress{
Address: address.Bytes(), Address: address.Bytes(),
UpdateClock: updateClock, UpdateClock: updateClock,
Removed: true, Removed: true,
IsTest: isTest, IsTest: isTest,
Ens: ens,
}, rawMessageHandler) }, rawMessageHandler)
} }
func (m *Messenger) syncSavedAddress(ctx context.Context, savedAddress wallet.SavedAddress, rawMessageHandler RawMessageHandler) (err error) { func (m *Messenger) syncSavedAddress(ctx context.Context, savedAddress wallet.SavedAddress, rawMessageHandler RawMessageHandler) (err error) {
if savedAddress.Removed { 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 return err
} }
} else { } else {
@ -104,7 +106,7 @@ func (m *Messenger) HandleSyncSavedAddress(state *ReceivedMessageState, syncMess
address := gethcommon.BytesToAddress(syncMessage.Address) address := gethcommon.BytesToAddress(syncMessage.Address)
if syncMessage.Removed { if syncMessage.Removed {
_, err = m.savedAddressesManager.DeleteSavedAddress( _, err = m.savedAddressesManager.DeleteSavedAddress(
address, syncMessage.Ens, syncMessage.IsTest, syncMessage.UpdateClock) address, syncMessage.IsTest, syncMessage.UpdateClock)
if err != nil { if err != nil {
return err return err
} }
@ -113,7 +115,6 @@ func (m *Messenger) HandleSyncSavedAddress(state *ReceivedMessageState, syncMess
sa := wallet.SavedAddress{ sa := wallet.SavedAddress{
Address: address, Address: address,
Name: syncMessage.Name, Name: syncMessage.Name,
Favourite: syncMessage.Favourite,
ChainShortNames: syncMessage.ChainShortNames, ChainShortNames: syncMessage.ChainShortNames,
ENSName: syncMessage.Ens, ENSName: syncMessage.Ens,
IsTest: syncMessage.IsTest, 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 { func savedAddressDataIsEqual(a, b wallet.SavedAddress) bool {
return a.Address == b.Address && a.IsTest == b.IsTest && a.Name == b.Name && 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() { func (s *MessengerSyncSavedAddressesSuite) TestSyncExistingSavedAddresses() {
@ -124,16 +124,14 @@ func (s *MessengerSyncSavedAddressesSuite) TestSyncExistingSavedAddresses() {
// Add saved addresses to main device // Add saved addresses to main device
sa1 := wallet.SavedAddress{ sa1 := wallet.SavedAddress{
Address: testAddress1, Address: testAddress1,
Name: "TestC1A1", Name: "TestC1A1",
Favourite: false, IsTest: isTestChain1,
IsTest: isTestChain1,
} }
sa2 := wallet.SavedAddress{ sa2 := wallet.SavedAddress{
ENSName: "test.ens.eth", ENSName: "test.ens.eth",
Name: "TestC2A1", Name: "TestC2A1",
Favourite: true, IsTest: isTestChain2,
IsTest: isTestChain2,
} }
savedAddressesManager := s.main.savedAddressesManager savedAddressesManager := s.main.savedAddressesManager
@ -174,16 +172,14 @@ func (s *MessengerSyncSavedAddressesSuite) TestSyncSavedAddresses() {
// Add saved addresses to main device // Add saved addresses to main device
sa1 := wallet.SavedAddress{ sa1 := wallet.SavedAddress{
Address: testAddress1, Address: testAddress1,
Name: "TestC1A1", Name: "TestC1A1",
Favourite: false, IsTest: isTestChain1,
IsTest: isTestChain1,
} }
sa2 := wallet.SavedAddress{ sa2 := wallet.SavedAddress{
ENSName: "test.ens.eth", ENSName: "test.ens.eth",
Name: "TestC1A2", Name: "TestC1A2",
Favourite: true, IsTest: isTestChain1,
IsTest: isTestChain1,
} }
err := s.main.UpsertSavedAddress(context.Background(), sa1) err := s.main.UpsertSavedAddress(context.Background(), sa1)
@ -216,19 +212,18 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
var isTestChain1 bool = true var isTestChain1 bool = true
var isTestChain2 bool = false var isTestChain2 bool = false
var testAddress1 = common.Address{1} var testAddress1 = common.Address{1}
var testAddress2 = common.Address{2}
// Add saved addresses to main device // Add saved addresses to main device
sa1 := wallet.SavedAddress{ sa1 := wallet.SavedAddress{
Address: testAddress1, Address: testAddress1,
Name: "TestC1A1", Name: "TestC1A1",
Favourite: false, IsTest: isTestChain1,
IsTest: isTestChain1,
} }
sa2 := wallet.SavedAddress{ sa2 := wallet.SavedAddress{
ENSName: "test.ens.eth", Address: testAddress2,
Name: "TestC1A2", Name: "TestC1A2",
Favourite: true, IsTest: isTestChain2,
IsTest: isTestChain2,
} }
err := s.main.settings.SaveSettingField(settings.TestNetworksEnabled, testModeMain) err := s.main.settings.SaveSettingField(settings.TestNetworksEnabled, testModeMain)
@ -262,7 +257,7 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
s.Require().Equal(2, len(savedAddresses)) s.Require().Equal(2, len(savedAddresses))
// Delete saved addresses with test mode = true and sync with the other device // 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) s.Require().NoError(err)
// Wait and check that saved addresses are synced // Wait and check that saved addresses are synced
@ -273,10 +268,8 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
sa := r.SavedAddresses()[0] sa := r.SavedAddresses()[0]
// We expect the deleted event to report address, ens, isTest // We expect the deleted event to report address, ens, isTest
s.Require().Equal(sa1.Address, sa.Address) s.Require().Equal(sa1.Address, sa.Address)
s.Require().Equal(sa1.ENSName, sa.ENSName)
s.Require().Equal(sa1.IsTest, sa.IsTest) s.Require().Equal(sa1.IsTest, sa.IsTest)
s.Require().Equal("", sa.Name) s.Require().Equal("", sa.Name)
s.Require().Equal(false, sa.Favourite)
return true return true
} }
return false return false
@ -291,7 +284,7 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
s.Require().True(haveSameElements([]wallet.SavedAddress{sa2}, savedAddresses, savedAddressDataIsEqual)) s.Require().True(haveSameElements([]wallet.SavedAddress{sa2}, savedAddresses, savedAddressDataIsEqual))
// Delete saved addresses with test mode = false and sync with the other device // 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) s.Require().NoError(err)
// Wait and check that saved addresses are synced // Wait and check that saved addresses are synced
@ -302,10 +295,8 @@ func (s *MessengerSyncSavedAddressesSuite) testSyncDeletesOfSavedAddressesWithTe
sa := r.SavedAddresses()[0] sa := r.SavedAddresses()[0]
// We expect the deleted event to report address, ens, isTest // We expect the deleted event to report address, ens, isTest
s.Require().Equal(sa2.Address, sa.Address) s.Require().Equal(sa2.Address, sa.Address)
s.Require().Equal(sa2.ENSName, sa.ENSName)
s.Require().Equal(sa2.IsTest, sa.IsTest) s.Require().Equal(sa2.IsTest, sa.IsTest)
s.Require().Equal("", sa.Name) s.Require().Equal("", sa.Name)
s.Require().Equal(false, sa.Favourite)
return true return true
} }
return false return false

View File

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

View File

@ -306,10 +306,10 @@ message SyncAccountsPositions {
} }
message SyncSavedAddress { message SyncSavedAddress {
reserved 3;
reserved 4; reserved 4;
bytes address = 1; bytes address = 1;
string name = 2; string name = 2;
bool favourite = 3;
bool removed = 5; bool removed = 5;
uint64 update_clock = 7; uint64 update_clock = 7;
string chain_short_names = 8; 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) return api.service.messenger.UpsertSavedAddress(ctx, sa)
} }
func (api *PublicAPI) DeleteSavedAddress(ctx context.Context, address ethcommon.Address, ens string, isTest bool) error { func (api *PublicAPI) DeleteSavedAddress(ctx context.Context, address ethcommon.Address, isTest bool) error {
return api.service.messenger.DeleteSavedAddress(ctx, address, ens, isTest) 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 // PushNotifications server endpoints

View File

@ -233,27 +233,6 @@ func (api *API) DeleteCustomTokenByChainID(ctx context.Context, chainID uint64,
return err 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 // @deprecated
func (api *API) GetPendingTransactions(ctx context.Context) ([]*transactions.PendingTransaction, error) { func (api *API) GetPendingTransactions(ctx context.Context) ([]*transactions.PendingTransaction, error) {
log.Debug("wallet.api.GetPendingTransactions") log.Debug("wallet.api.GetPendingTransactions")

View File

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

View File

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

View File

@ -17,6 +17,7 @@
// 1702577524_add_community_collections_and_collectibles_images_cache.up.sql (210B) // 1702577524_add_community_collections_and_collectibles_images_cache.up.sql (210B)
// 1702867707_add_balance_to_collectibles_ownership_cache.up.sql (289B) // 1702867707_add_balance_to_collectibles_ownership_cache.up.sql (289B)
// 1703686612_add_color_to_saved_addresses.up.sql (114B) // 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) // doc.go (74B)
package migrations package migrations
@ -101,7 +102,7 @@ func _1691753758_initialUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -121,7 +122,7 @@ func _1692701329_add_collectibles_and_collections_data_cacheUpSql() (*asset, err
return nil, 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}} 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 return a, nil
} }
@ -141,7 +142,7 @@ func _1692701339_add_scope_to_pendingUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -161,7 +162,7 @@ func _1694540071_add_collectibles_ownership_update_timestampUpSql() (*asset, err
return nil, 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}} 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 return a, nil
} }
@ -181,7 +182,7 @@ func _1694692748_add_raw_balance_to_token_balancesUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -201,7 +202,7 @@ func _1695133989_add_community_id_to_collectibles_and_collections_data_cacheUpSq
return nil, err 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}} 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 return a, nil
} }
@ -221,7 +222,7 @@ func _1695932536_balance_history_v2UpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -241,7 +242,7 @@ func _1696853635_input_dataUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -261,7 +262,7 @@ func _1698117918_add_community_id_to_tokensUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -281,7 +282,7 @@ func _1698257443_add_community_metadata_to_wallet_dbUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -301,7 +302,7 @@ func _1699987075_add_timestamp_and_state_to_community_data_cacheUpSql() (*asset,
return nil, err 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}} 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 return a, nil
} }
@ -321,7 +322,7 @@ func _1700414564_add_wallet_connect_pairings_tableUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -341,7 +342,7 @@ func _1701101493_add_token_blocks_rangeUpSql() (*asset, error) {
return nil, err 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}} 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 return a, nil
} }
@ -361,7 +362,7 @@ func _1702467441_wallet_connect_sessions_instead_of_pairingsUpSql() (*asset, err
return nil, 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}} 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 return a, nil
} }
@ -381,7 +382,7 @@ func _1702577524_add_community_collections_and_collectibles_images_cacheUpSql()
return nil, err 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}} 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 return a, nil
} }
@ -401,7 +402,7 @@ func _1702867707_add_balance_to_collectibles_ownership_cacheUpSql() (*asset, err
return nil, 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}} 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 return a, nil
} }
@ -421,11 +422,31 @@ func _1703686612_add_color_to_saved_addressesUpSql() (*asset, error) {
return nil, err 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}} 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 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") 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) { func docGoBytes() ([]byte, error) {
@ -441,7 +462,7 @@ func docGo() (*asset, error) {
return nil, err 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}} 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 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, "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, "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{}}, "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{}}, "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{}}, "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{}}, "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;