waku2: static shards (#3944)

- use protected topics for communities
- associate chats to pubsub topics and populate these depending if the chat belongs to a community or not
- mailserver functions should be aware of pubsub topics
- generate private key for pubsub topic protection when creating a community
- add shard cluster and index to communities
- setup shards for existing communities
- distribute pubsubtopic password
- fix: do not send the requests to join and cancel in the protected topic
- fix: undefined shard values for backward compatibility
- refactor: use shard message in protobuffers
This commit is contained in:
richΛrd 2023-10-12 15:21:49 -04:00 committed by GitHub
parent 2a5327d8d2
commit ba5ed725ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
47 changed files with 1527 additions and 574 deletions

View File

@ -30,7 +30,7 @@ linters-settings:
gofmt: gofmt:
simplify: true simplify: true
goimports: goimports:
local-prefixes: github.com/ethereum/go-ethereum,github.com/status-im/status-go local-prefixes: github.com/ethereum/go-ethereum,github.com/status-im/status-go,github.com/waku-org/go-waku
maligned: maligned:
suggest-new: true suggest-new: true
dupl: dupl:

View File

@ -1 +1 @@
0.168.1 0.169.0

View File

@ -47,6 +47,8 @@ var (
seedPhrase = flag.String("seed-phrase", "", "Seed phrase") seedPhrase = flag.String("seed-phrase", "", "Seed phrase")
version = flag.Bool("version", false, "Print version and dump configuration") version = flag.Bool("version", false, "Print version and dump configuration")
communityID = flag.String("community-id", "", "The id of the community") communityID = flag.String("community-id", "", "The id of the community")
shardCluster = flag.Int("shard-cluster", common.UndefinedShardValue, "The shard cluster in which the of the community is published")
shardIndex = flag.Int("shard-index", common.UndefinedShardValue, "The shard index in which the community is published")
chatID = flag.String("chat-id", "", "The id of the chat") chatID = flag.String("chat-id", "", "The id of the chat")
dataDir = flag.String("dir", getDefaultDataDir(), "Directory used by node to store data") dataDir = flag.String("dir", getDefaultDataDir(), "Directory used by node to store data")
@ -145,7 +147,15 @@ func main() {
messenger := wakuextservice.Messenger() messenger := wakuextservice.Messenger()
community, err := messenger.RequestCommunityInfoFromMailserver(*communityID, true) var shard *common.Shard = nil
if shardCluster != nil && shardIndex != nil && *shardCluster != common.UndefinedShardValue && *shardIndex != common.UndefinedShardValue {
shard = &common.Shard{
Cluster: uint16(*shardCluster),
Index: uint16(*shardIndex),
}
}
community, err := messenger.RequestCommunityInfoFromMailserver(*communityID, shard, true)
if err != nil { if err != nil {
logger.Error("community error", "error", err) logger.Error("community error", "error", err)

View File

@ -69,7 +69,13 @@ func (w *gethWakuWrapper) SubscribeToPubsubTopic(topic string, optPublicKey *ecd
return errors.New("not available in WakuV1") return errors.New("not available in WakuV1")
} }
func (w *gethWakuWrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
// not available in WakuV1
return nil, errors.New("not available in WakuV1")
}
func (w *gethWakuWrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error { func (w *gethWakuWrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
// not available in WakuV1
return errors.New("not available in WakuV1") return errors.New("not available in WakuV1")
} }

View File

@ -7,6 +7,7 @@ import (
"time" "time"
"github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peer"
"github.com/waku-org/go-waku/waku/v2/protocol/store" "github.com/waku-org/go-waku/waku/v2/protocol/store"
storepb "github.com/waku-org/go-waku/waku/v2/protocol/store/pb" storepb "github.com/waku-org/go-waku/waku/v2/protocol/store/pb"
@ -235,6 +236,10 @@ func (w *gethWakuV2Wrapper) SubscribeToPubsubTopic(topic string, optPublicKey *e
return w.waku.SubscribeToPubsubTopic(topic, optPublicKey) return w.waku.SubscribeToPubsubTopic(topic, optPublicKey)
} }
func (w *gethWakuV2Wrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
return w.waku.RetrievePubsubTopicKey(topic)
}
func (w *gethWakuV2Wrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error { func (w *gethWakuV2Wrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
return w.waku.StorePubsubTopicKey(topic, privKey) return w.waku.StorePubsubTopicKey(topic, privKey)
} }

View File

@ -92,6 +92,8 @@ type Waku interface {
StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error
RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error)
AddStorePeer(address string) (peer.ID, error) AddStorePeer(address string) (peer.ID, error)
AddRelayPeer(address string) (peer.ID, error) AddRelayPeer(address string) (peer.ID, error)

View File

@ -13,6 +13,8 @@ import (
datasyncproto "github.com/vacp2p/mvds/protobuf" datasyncproto "github.com/vacp2p/mvds/protobuf"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/datasync" "github.com/status-im/status-go/protocol/datasync"
@ -187,6 +189,39 @@ func (s *MessageSender) SendCommunityMessage(
return s.sendCommunity(ctx, &rawMessage) return s.sendCommunity(ctx, &rawMessage)
} }
// SendPubsubTopicKey sends the protected topic key for a community to a list of recipients
func (s *MessageSender) SendPubsubTopicKey(
ctx context.Context,
rawMessage *RawMessage,
) ([]byte, error) {
s.logger.Debug(
"sending the protected topic key for a community",
zap.String("communityId", types.EncodeHex(rawMessage.CommunityID)),
zap.String("site", "SendPubsubTopicKey"),
)
rawMessage.Sender = s.identity
messageID, err := s.getMessageID(rawMessage)
if err != nil {
return nil, err
}
rawMessage.ID = types.EncodeHex(messageID)
// Notify before dispatching, otherwise the dispatch subscription might happen
// earlier than the scheduled
s.notifyOnScheduledMessage(nil, rawMessage)
// Send to each recipients
for _, recipient := range rawMessage.Recipients {
_, err = s.sendPrivate(ctx, recipient, rawMessage)
if err != nil {
return nil, errors.Wrap(err, "failed to send message")
}
}
return messageID, nil
}
// SendGroup takes encoded data, encrypts it and sends through the wire, // SendGroup takes encoded data, encrypts it and sends through the wire,
// always return the messageID // always return the messageID
func (s *MessageSender) SendGroup( func (s *MessageSender) SendGroup(
@ -364,6 +399,7 @@ func (s *MessageSender) sendPrivate(
messageID := v1protocol.MessageID(&rawMessage.Sender.PublicKey, wrappedMessage) messageID := v1protocol.MessageID(&rawMessage.Sender.PublicKey, wrappedMessage)
rawMessage.ID = types.EncodeHex(messageID) rawMessage.ID = types.EncodeHex(messageID)
rawMessage.PubsubTopic = relay.DefaultWakuTopic // TODO: determine which pubsub topic should be used for 1:1 messages
if rawMessage.BeforeDispatch != nil { if rawMessage.BeforeDispatch != nil {
if err := rawMessage.BeforeDispatch(rawMessage); err != nil { if err := rawMessage.BeforeDispatch(rawMessage); err != nil {

47
protocol/common/shard.go Normal file
View File

@ -0,0 +1,47 @@
package common
import (
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/transport"
)
type Shard struct {
Cluster uint16 `json:"cluster"`
Index uint16 `json:"index"`
}
func ShardFromProtobuff(p *protobuf.Shard) *Shard {
if p == nil {
return nil
}
return &Shard{
Cluster: uint16(p.Cluster),
Index: uint16(p.Index),
}
}
func (s *Shard) TransportShard() *transport.Shard {
if s == nil {
return nil
}
return &transport.Shard{
Cluster: s.Cluster,
Index: s.Index,
}
}
func (s *Shard) Protobuffer() *protobuf.Shard {
if s == nil {
return nil
}
return &protobuf.Shard{
Cluster: int32(s.Cluster),
Index: int32(s.Index),
}
}
const MainStatusShard = 16
const UndefinedShardValue = 0

View File

@ -10,9 +10,10 @@ import (
"time" "time"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/images" "github.com/status-im/status-go/images"
@ -43,6 +44,7 @@ type Config struct {
MemberIdentity *ecdsa.PublicKey MemberIdentity *ecdsa.PublicKey
SyncedAt uint64 SyncedAt uint64
EventsData *EventsData EventsData *EventsData
Shard *common.Shard
} }
type EventsData struct { type EventsData struct {
@ -139,13 +141,18 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) {
TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"` TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"`
CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"` CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"`
ActiveMembersCount uint64 `json:"activeMembersCount"` ActiveMembersCount uint64 `json:"activeMembersCount"`
PubsubTopic string `json:"pubsubTopic"`
Shard *common.Shard `json:"shard"`
}{ }{
ID: o.ID(), ID: o.ID(),
Verified: o.config.Verified, Verified: o.config.Verified,
Chats: make(map[string]CommunityChat), Chats: make(map[string]CommunityChat),
Categories: make(map[string]CommunityCategory), Categories: make(map[string]CommunityCategory),
Tags: o.Tags(), Tags: o.Tags(),
PubsubTopic: o.PubsubTopic(),
Shard: o.Shard(),
} }
if o.config.CommunityDescription != nil { if o.config.CommunityDescription != nil {
for id, c := range o.config.CommunityDescription.Categories { for id, c := range o.config.CommunityDescription.Categories {
category := CommunityCategory{ category := CommunityCategory{
@ -178,7 +185,12 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) {
communityItem.TokenPermissions = o.tokenPermissions() communityItem.TokenPermissions = o.tokenPermissions()
communityItem.MembersCount = len(o.config.CommunityDescription.Members) communityItem.MembersCount = len(o.config.CommunityDescription.Members)
communityItem.Link = fmt.Sprintf("https://join.status.im/c/0x%x", o.ID()) communityItem.Link = fmt.Sprintf("https://join.status.im/c/0x%x", o.ID())
if o.Shard() != nil {
communityItem.Link = fmt.Sprintf("%s/%d/%d", communityItem.Link, o.Shard().Cluster, o.Shard().Index)
}
communityItem.IntroMessage = o.config.CommunityDescription.IntroMessage communityItem.IntroMessage = o.config.CommunityDescription.IntroMessage
communityItem.OutroMessage = o.config.CommunityDescription.OutroMessage communityItem.OutroMessage = o.config.CommunityDescription.OutroMessage
communityItem.CommunityTokensMetadata = o.config.CommunityDescription.CommunityTokensMetadata communityItem.CommunityTokensMetadata = o.config.CommunityDescription.CommunityTokensMetadata
@ -245,6 +257,8 @@ func (o *Community) MarshalJSON() ([]byte, error) {
TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"` TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"`
CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"` CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"`
ActiveMembersCount uint64 `json:"activeMembersCount"` ActiveMembersCount uint64 `json:"activeMembersCount"`
PubsubTopic string `json:"pubsubTopic"`
Shard *common.Shard `json:"shard"`
}{ }{
ID: o.ID(), ID: o.ID(),
MemberRole: o.MemberRole(o.MemberIdentity()), MemberRole: o.MemberRole(o.MemberIdentity()),
@ -264,6 +278,8 @@ func (o *Community) MarshalJSON() ([]byte, error) {
MuteTill: o.config.MuteTill, MuteTill: o.config.MuteTill,
Tags: o.Tags(), Tags: o.Tags(),
Encrypted: o.Encrypted(), Encrypted: o.Encrypted(),
PubsubTopic: o.PubsubTopic(),
Shard: o.Shard(),
} }
if o.config.CommunityDescription != nil { if o.config.CommunityDescription != nil {
for id, c := range o.config.CommunityDescription.Categories { for id, c := range o.config.CommunityDescription.Categories {
@ -358,6 +374,14 @@ func (o *Community) DescriptionText() string {
return "" return ""
} }
func (o *Community) Shard() *common.Shard {
if o != nil && o.config != nil {
return o.config.Shard
}
return nil
}
func (o *Community) IntroMessage() string { func (o *Community) IntroMessage() string {
if o != nil && if o != nil &&
o.config != nil && o.config != nil &&
@ -1230,7 +1254,7 @@ func (o *Community) MemberUpdateChannelID() string {
} }
func (o *Community) PubsubTopic() string { func (o *Community) PubsubTopic() string {
return transport.GetPubsubTopic(o.ID()) return transport.GetPubsubTopic(o.Shard().TransportShard())
} }
func (o *Community) DefaultFilters() []transport.FiltersToInitialize { func (o *Community) DefaultFilters() []transport.FiltersToInitialize {
@ -1243,7 +1267,8 @@ func (o *Community) DefaultFilters() []transport.FiltersToInitialize {
communityPubsubTopic := o.PubsubTopic() communityPubsubTopic := o.PubsubTopic()
return []transport.FiltersToInitialize{ return []transport.FiltersToInitialize{
{ChatID: cID, PubsubTopic: relay.DefaultWakuTopic}, // TODO: verify if this goes into default topic {ChatID: cID, PubsubTopic: communityPubsubTopic},
{ChatID: uncompressedPubKey, PubsubTopic: relay.DefaultWakuTopic}, // TODO: messages that are not protected are sent in default pubsub topic for now
{ChatID: uncompressedPubKey, PubsubTopic: communityPubsubTopic}, {ChatID: uncompressedPubKey, PubsubTopic: communityPubsubTopic},
{ChatID: updatesChannelID, PubsubTopic: communityPubsubTopic}, {ChatID: updatesChannelID, PubsubTopic: communityPubsubTopic},
{ChatID: mlChannelID, PubsubTopic: communityPubsubTopic}, {ChatID: mlChannelID, PubsubTopic: communityPubsubTopic},

View File

@ -21,6 +21,8 @@ import (
"github.com/anacrolix/torrent/metainfo" "github.com/anacrolix/torrent/metainfo"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/pkg/errors" "github.com/pkg/errors"
"go.uber.org/zap" "go.uber.org/zap"
@ -511,11 +513,17 @@ func (m *Manager) All() ([]*Community, error) {
return communities, nil return communities, nil
} }
type CommunityShard struct {
CommunityID string `json:"communityID"`
Shard *common.Shard `json:"shard"`
}
type KnownCommunitiesResponse struct { type KnownCommunitiesResponse struct {
ContractCommunities []string `json:"contractCommunities"` ContractCommunities []string `json:"contractCommunities"` // TODO: use CommunityShard
ContractFeaturedCommunities []string `json:"contractFeaturedCommunities"` ContractFeaturedCommunities []string `json:"contractFeaturedCommunities"` // TODO: use CommunityShard
Descriptions map[string]*Community `json:"communities"` Descriptions map[string]*Community `json:"communities"`
UnknownCommunities []string `json:"unknownCommunities"` UnknownCommunities []string `json:"unknownCommunities"` // TODO: use CommunityShard
} }
func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexBytes) (response *KnownCommunitiesResponse, err error) { func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexBytes) (response *KnownCommunitiesResponse, err error) {
@ -531,12 +539,20 @@ func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexByt
return return
} }
response.ContractCommunities = append(response.ContractCommunities, communityID) // TODO: use CommunityShard instead of appending the communityID
response.ContractCommunities = append(response.ContractCommunities, communityID) // , CommunityShard{
// CommunityID: communityID,
// Shard: community.Shard(),
// }
if community != nil { if community != nil {
response.Descriptions[community.IDString()] = community response.Descriptions[community.IDString()] = community
} else { } else {
response.UnknownCommunities = append(response.UnknownCommunities, communityID) response.UnknownCommunities = append(response.UnknownCommunities, communityID) // CommunityShard{
// CommunityID: communityID,
// Shard: community.Shard(),
// })
} }
} }
@ -653,6 +669,7 @@ func (m *Manager) CreateCommunity(request *requests.CreateCommunity, publish boo
Joined: true, Joined: true,
MemberIdentity: &m.identity.PublicKey, MemberIdentity: &m.identity.PublicKey,
CommunityDescription: description, CommunityDescription: description,
Shard: nil,
} }
community, err := New(config, m.timesource) community, err := New(config, m.timesource)
if err != nil { if err != nil {
@ -931,6 +948,34 @@ func (m *Manager) DeleteCommunity(id types.HexBytes) error {
return m.persistence.DeleteCommunitySettings(id) return m.persistence.DeleteCommunitySettings(id)
} }
func (m *Manager) UpdateShard(community *Community, shard *common.Shard) error {
community.config.Shard = shard
return m.persistence.SaveCommunity(community)
}
// SetShard assigns a shard to a community
func (m *Manager) SetShard(communityID types.HexBytes, shard *common.Shard) (*Community, error) {
community, err := m.GetByID(communityID)
if err != nil {
return nil, err
}
if community == nil {
return nil, ErrOrgNotFound
}
if !community.IsControlNode() {
return nil, errors.New("not admin or owner")
}
err = m.UpdateShard(community, shard)
if err != nil {
return nil, err
}
m.publish(&Subscription{Community: community})
return community, nil
}
// EditCommunity takes a description, updates the community with the description, // EditCommunity takes a description, updates the community with the description,
// saves it and returns it // saves it and returns it
func (m *Manager) EditCommunity(request *requests.EditCommunity) (*Community, error) { func (m *Manager) EditCommunity(request *requests.EditCommunity) (*Community, error) {
@ -1310,7 +1355,7 @@ func (m *Manager) DeleteCategory(request *requests.DeleteCommunityCategory) (*Co
return changes.Community, changes, nil return changes.Community, changes, nil
} }
func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, payload []byte) (*CommunityResponse, error) { func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, payload []byte, shard *common.Shard) (*CommunityResponse, error) {
if signer == nil { if signer == nil {
return nil, errors.New("signer can't be nil") return nil, errors.New("signer can't be nil")
} }
@ -1332,6 +1377,7 @@ func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, des
CommunityDescriptionProtocolMessage: payload, CommunityDescriptionProtocolMessage: payload,
MemberIdentity: &m.identity.PublicKey, MemberIdentity: &m.identity.PublicKey,
ID: signer, ID: signer,
Shard: shard,
} }
community, err = New(config, m.timesource) community, err = New(config, m.timesource)
if err != nil { if err != nil {
@ -2880,7 +2926,7 @@ func (m *Manager) HandleCommunityRequestToLeave(signer *ecdsa.PublicKey, proto *
return nil return nil
} }
func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte) (*CommunityResponse, error) { func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte, shard *common.Shard) (*CommunityResponse, error) {
m.logger.Debug("Handling wrapped community description message") m.logger.Debug("Handling wrapped community description message")
applicationMetadataMessage := &protobuf.ApplicationMetadataMessage{} applicationMetadataMessage := &protobuf.ApplicationMetadataMessage{}
@ -2903,7 +2949,7 @@ func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte) (*Com
return nil, err return nil, err
} }
return m.HandleCommunityDescriptionMessage(signer, description, payload) return m.HandleCommunityDescriptionMessage(signer, description, payload, shard)
} }
func (m *Manager) JoinCommunity(id types.HexBytes, forceJoin bool) (*Community, error) { func (m *Manager) JoinCommunity(id types.HexBytes, forceJoin bool) (*Community, error) {
@ -3294,6 +3340,20 @@ func (m *Manager) AcceptedPendingRequestsToJoinForCommunity(id types.HexBytes) (
func (m *Manager) DeclinedPendingRequestsToJoinForCommunity(id types.HexBytes) ([]*RequestToJoin, error) { func (m *Manager) DeclinedPendingRequestsToJoinForCommunity(id types.HexBytes) ([]*RequestToJoin, error) {
return m.persistence.DeclinedPendingRequestsToJoinForCommunity(id) return m.persistence.DeclinedPendingRequestsToJoinForCommunity(id)
}
func (m *Manager) GetPubsubTopic(communityID string) (string, error) {
community, err := m.GetByIDString(communityID)
if err != nil {
return "", err
}
if community == nil {
return relay.DefaultWakuTopic, nil
}
return transport.GetPubsubTopic(community.Shard().TransportShard()), nil
} }
func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) { func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) {

View File

@ -33,7 +33,7 @@ var ErrOldRequestToLeave = errors.New("old request to leave")
const OR = " OR " const OR = " OR "
const communitiesBaseQuery = ` const communitiesBaseQuery = `
SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, r.clock, ae.raw_events, ae.raw_description SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, r.clock, ae.raw_events, ae.raw_description, c.shard_cluster, c.shard_index
FROM communities_communities c FROM communities_communities c
LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ? LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ?
LEFT JOIN communities_events ae ON c.id = ae.id` LEFT JOIN communities_events ae ON c.id = ae.id`
@ -46,9 +46,17 @@ func (p *Persistence) SaveCommunity(community *Community) error {
return err return err
} }
var shardIndex, shardCluster *uint
if community.Shard() != nil {
index := uint(community.Shard().Index)
shardIndex = &index
cluster := uint(community.Shard().Cluster)
shardCluster = &cluster
}
_, err = p.db.Exec(` _, err = p.db.Exec(`
INSERT INTO communities_communities (id, private_key, description, joined, spectated, verified, muted, muted_till) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, INSERT INTO communities_communities (id, private_key, description, joined, spectated, verified, muted, muted_till, shard_cluster, shard_index) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
id, crypto.FromECDSA(privateKey), wrappedCommunity, community.config.Joined, community.config.Spectated, community.config.Verified, community.config.Muted, community.config.MuteTill) id, crypto.FromECDSA(privateKey), wrappedCommunity, community.config.Joined, community.config.Spectated, community.config.Verified, community.config.Muted, community.config.MuteTill, shardCluster, shardIndex)
return err return err
} }
@ -101,9 +109,8 @@ func (p *Persistence) ShouldHandleSyncCommunitySettings(settings *protobuf.SyncC
func (p *Persistence) ShouldHandleSyncCommunity(community *protobuf.SyncInstallationCommunity) (bool, error) { func (p *Persistence) ShouldHandleSyncCommunity(community *protobuf.SyncInstallationCommunity) (bool, error) {
// TODO see if there is a way to make this more elegant // TODO see if there is a way to make this more elegant
// Keep the "*".
// When the test for this function fails because the table has changed we should update sync functionality // When the test for this function fails because the table has changed we should update sync functionality
qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ? AND synced_at > ?`, community.Id, community.Clock) qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ? AND synced_at > ?`, community.Id, community.Clock)
_, err := p.scanRowToStruct(qr.Scan) _, err := p.scanRowToStruct(qr.Scan)
switch err { switch err {
@ -140,16 +147,28 @@ func (p *Persistence) queryCommunities(memberIdentity *ecdsa.PublicKey, query st
var publicKeyBytes, privateKeyBytes, descriptionBytes []byte var publicKeyBytes, privateKeyBytes, descriptionBytes []byte
var joined, spectated, verified, muted bool var joined, spectated, verified, muted bool
var muteTill sql.NullTime var muteTill sql.NullTime
var requestedToJoinAt sql.NullInt64 var cluster, index, requestedToJoinAt sql.NullInt64
// Community events specific fields // Community events specific fields
var eventsBytes, eventsDescriptionBytes []byte var eventsBytes, eventsDescriptionBytes []byte
err := rows.Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes) err := rows.Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes, &cluster, &index)
if err != nil { if err != nil {
return nil, err return nil, err
} }
org, err := p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, p.logger) var clusterValue *uint
if cluster.Valid {
v := uint(cluster.Int64)
clusterValue = &v
}
var indexValue *uint
if index.Valid {
v := uint(index.Int64)
indexValue = &v
}
org, err := p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -192,6 +211,7 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s
var publicKeyBytes, privateKeyBytes, descriptionBytes []byte var publicKeyBytes, privateKeyBytes, descriptionBytes []byte
var joined, spectated, verified, muted bool var joined, spectated, verified, muted bool
var muteTill sql.NullTime var muteTill sql.NullTime
var cluster, index sql.NullInt64
// Request to join specific fields // Request to join specific fields
var rtjID, rtjCommunityID []byte var rtjID, rtjCommunityID []byte
@ -203,12 +223,25 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s
err = rows.Scan( err = rows.Scan(
&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill,
&rtjID, &rtjPublicKey, &rtjClock, &rtjENSName, &rtjChatID, &rtjCommunityID, &rtjState, &eventsBytes, &eventsDescriptionBytes) &rtjID, &rtjPublicKey, &rtjClock, &rtjENSName, &rtjChatID, &rtjCommunityID, &rtjState, &eventsBytes,
&eventsDescriptionBytes, &cluster, &index)
if err != nil { if err != nil {
return nil, err return nil, err
} }
comm, err = p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(rtjClock.Int64), eventsBytes, eventsDescriptionBytes, p.logger) var clusterValue *uint
if cluster.Valid {
v := uint(cluster.Int64)
clusterValue = &v
}
var indexValue *uint
if index.Valid {
v := uint(index.Int64)
indexValue = &v
}
comm, err = p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(rtjClock.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -226,7 +259,8 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s
func (p *Persistence) JoinedAndPendingCommunitiesWithRequests(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) { func (p *Persistence) JoinedAndPendingCommunitiesWithRequests(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) {
query := `SELECT query := `SELECT
c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till,
r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description,
c.shard_cluster, c.shard_index
FROM communities_communities c FROM communities_communities c
LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ? LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ?
LEFT JOIN communities_events ae ON c.id = ae.id LEFT JOIN communities_events ae ON c.id = ae.id
@ -243,7 +277,8 @@ WHERE c.Joined OR r.state = ?`
func (p *Persistence) DeletedCommunities(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) { func (p *Persistence) DeletedCommunities(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) {
query := `SELECT query := `SELECT
c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till,
r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description,
c.shard_cluster, c.shard_index
FROM communities_communities c FROM communities_communities c
LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ? LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ?
LEFT JOIN communities_events ae ON c.id = ae.id LEFT JOIN communities_events ae ON c.id = ae.id
@ -269,24 +304,36 @@ func (p *Persistence) GetByID(memberIdentity *ecdsa.PublicKey, id []byte) (*Comm
var verified bool var verified bool
var muted bool var muted bool
var muteTill sql.NullTime var muteTill sql.NullTime
var requestedToJoinAt sql.NullInt64 var requestedToJoinAt, cluster, index sql.NullInt64
// Community events specific fields // Community events specific fields
var eventsBytes, eventsDescriptionBytes []byte var eventsBytes, eventsDescriptionBytes []byte
err := p.db.QueryRow(communitiesBaseQuery+` WHERE c.id = ?`, common.PubkeyToHex(memberIdentity), id).Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes) err := p.db.QueryRow(communitiesBaseQuery+` WHERE c.id = ?`, common.PubkeyToHex(memberIdentity), id).Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes, &cluster, &index)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, nil return nil, nil
} else if err != nil { } else if err != nil {
return nil, err return nil, err
} }
return p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, p.logger) var clusterValue *uint
if cluster.Valid {
v := uint(cluster.Int64)
clusterValue = &v
}
var indexValue *uint
if index.Valid {
v := uint(index.Int64)
indexValue = &v
}
return p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger)
} }
func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey, publicKeyBytes, privateKeyBytes, wrappedCommunity []byte, joined, func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey, publicKeyBytes, privateKeyBytes, wrappedCommunity []byte, joined,
spectated, verified, muted bool, muteTill time.Time, requestedToJoinAt uint64, eventsBytes []byte, spectated, verified, muted bool, muteTill time.Time, requestedToJoinAt uint64, eventsBytes []byte,
eventsDescriptionBytes []byte, logger *zap.Logger) (*Community, error) { eventsDescriptionBytes []byte, cluster *uint, index *uint, logger *zap.Logger) (*Community, error) {
var privateKey *ecdsa.PrivateKey var privateKey *ecdsa.PrivateKey
var err error var err error
@ -313,6 +360,14 @@ func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey,
return nil, err return nil, err
} }
var shard *common.Shard = nil
if cluster != nil && index != nil {
shard = &common.Shard{
Cluster: uint16(*cluster),
Index: uint16(*index),
}
}
config := Config{ config := Config{
PrivateKey: privateKey, PrivateKey: privateKey,
CommunityDescription: description, CommunityDescription: description,
@ -327,6 +382,7 @@ func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey,
Joined: joined, Joined: joined,
Spectated: spectated, Spectated: spectated,
EventsData: eventsData, EventsData: eventsData,
Shard: shard,
} }
community, err := New(config, p.timesource) community, err := New(config, p.timesource)
if err != nil { if err != nil {

View File

@ -58,7 +58,7 @@ func (p *Persistence) scanRowToStruct(rowScan func(dest ...interface{}) error) (
func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error) { func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error) {
var rows *sql.Rows var rows *sql.Rows
// Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing. // Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing.
rows, err = p.db.Query(`SELECT * FROM communities_communities`) rows, err = p.db.Query(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities`)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -85,14 +85,12 @@ func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error
} }
func (p *Persistence) getRawCommunityRow(id []byte) (*RawCommunityRow, error) { func (p *Persistence) getRawCommunityRow(id []byte) (*RawCommunityRow, error) {
// Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing. qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ?`, id)
qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ?`, id)
return p.scanRowToStruct(qr.Scan) return p.scanRowToStruct(qr.Scan)
} }
func (p *Persistence) getSyncedRawCommunity(id []byte) (*RawCommunityRow, error) { func (p *Persistence) getSyncedRawCommunity(id []byte) (*RawCommunityRow, error) {
// Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing. qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ? AND synced_at > 0`, id)
qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ? AND synced_at > 0`, id)
return p.scanRowToStruct(qr.Scan) return p.scanRowToStruct(qr.Scan)
} }

View File

@ -19,10 +19,11 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"golang.org/x/time/rate" "golang.org/x/time/rate"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
gethcommon "github.com/ethereum/go-ethereum/common" gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/event"
@ -1687,8 +1688,8 @@ func (m *Messenger) Init() error {
for _, c := range controlledCommunities { for _, c := range controlledCommunities {
communityFiltersToInitialize = append(communityFiltersToInitialize, transport.CommunityFilterToInitialize{ communityFiltersToInitialize = append(communityFiltersToInitialize, transport.CommunityFilterToInitialize{
CommunityID: c.ID(), Shard: c.Shard().TransportShard(),
PrivKey: c.PrivateKey(), PrivKey: c.PrivateKey(),
}) })
} }
@ -1720,6 +1721,8 @@ func (m *Messenger) Init() error {
continue continue
} }
communityInfo := make(map[string]*communities.Community)
switch chat.ChatType { switch chat.ChatType {
case ChatTypePublic, ChatTypeProfile: case ChatTypePublic, ChatTypeProfile:
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: relay.DefaultWakuTopic}) filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: relay.DefaultWakuTopic})
@ -1728,7 +1731,17 @@ func (m *Messenger) Init() error {
if err != nil { if err != nil {
return err return err
} }
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: transport.GetPubsubTopic(communityID)})
community, ok := communityInfo[chat.CommunityID]
if !ok {
community, err = m.communitiesManager.GetByID(communityID)
if err != nil {
return err
}
communityInfo[chat.CommunityID] = community
}
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: transport.GetPubsubTopic(community.Shard().TransportShard())})
case ChatTypeOneToOne: case ChatTypeOneToOne:
pk, err := chat.PublicKey() pk, err := chat.PublicKey()
if err != nil { if err != nil {
@ -2085,13 +2098,11 @@ func (m *Messenger) dispatchMessage(ctx context.Context, rawMessage common.RawMe
return rawMessage, err return rawMessage, err
} }
case ChatTypeCommunityChat: case ChatTypeCommunityChat:
communityID, err := hexutil.Decode(chat.CommunityID) rawMessage.PubsubTopic, err = m.communitiesManager.GetPubsubTopic(chat.CommunityID)
if err != nil { if err != nil {
return rawMessage, err return rawMessage, err
} }
rawMessage.PubsubTopic = transport.GetPubsubTopic(communityID)
// TODO: add grant // TODO: add grant
canPost, err := m.communitiesManager.CanPost(&m.identity.PublicKey, chat.CommunityID, chat.CommunityChatID(), nil) canPost, err := m.communitiesManager.CanPost(&m.identity.PublicKey, chat.CommunityID, chat.CommunityChatID(), nil)
if err != nil { if err != nil {
@ -2261,7 +2272,9 @@ func (m *Messenger) sendChatMessage(ctx context.Context, message *common.Message
if err != nil { if err != nil {
return nil, err return nil, err
} }
message.Payload = &protobuf.ChatMessage_Community{Community: wrappedCommunity} message.Payload = &protobuf.ChatMessage_Community{Community: wrappedCommunity}
message.Shard = community.Shard().Protobuffer()
message.ContentType = protobuf.ChatMessage_COMMUNITY message.ContentType = protobuf.ChatMessage_COMMUNITY
} else if len(message.AudioPath) != 0 { } else if len(message.AudioPath) != 0 {

View File

@ -17,6 +17,8 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
gethcommon "github.com/ethereum/go-ethereum/common" gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
@ -81,12 +83,13 @@ func (m *Messenger) publishOrg(org *communities.Community) error {
// we don't want to wrap in an encryption layer message // we don't want to wrap in an encryption layer message
SkipProtocolLayer: true, SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_DESCRIPTION, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_DESCRIPTION,
PubsubTopic: org.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
} }
_, err = m.sender.SendPublic(context.Background(), org.IDString(), rawMessage) _, err = m.sender.SendPublic(context.Background(), org.IDString(), rawMessage)
return err return err
} }
func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessage) error { func (m *Messenger) publishCommunityEvents(community *communities.Community, msg *communities.CommunityEventsMessage) error {
m.logger.Debug("publishing community events", zap.String("admin-id", common.PubkeyToHex(&m.identity.PublicKey)), zap.Any("event", msg)) m.logger.Debug("publishing community events", zap.String("admin-id", common.PubkeyToHex(&m.identity.PublicKey)), zap.Any("event", msg))
payload, err := msg.Marshal() payload, err := msg.Marshal()
@ -100,7 +103,7 @@ func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessa
// we don't want to wrap in an encryption layer message // we don't want to wrap in an encryption layer message
SkipProtocolLayer: true, SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE,
PubsubTopic: transport.GetPubsubTopic(msg.CommunityID), // TODO: confirm if it should be sent in community pubsub topic PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
} }
// TODO: resend in case of failure? // TODO: resend in case of failure?
@ -301,7 +304,7 @@ func (m *Messenger) handleCommunitiesSubscription(c chan *communities.Subscripti
} }
if sub.CommunityEventsMessage != nil { if sub.CommunityEventsMessage != nil {
err := m.publishCommunityEvents(sub.CommunityEventsMessage) err := m.publishCommunityEvents(sub.Community, sub.CommunityEventsMessage)
if err != nil { if err != nil {
m.logger.Warn("failed to publish community events", zap.Error(err)) m.logger.Warn("failed to publish community events", zap.Error(err))
} }
@ -576,12 +579,12 @@ func (m *Messenger) CuratedCommunities() (*communities.KnownCommunitiesResponse,
callOpts := &bind.CallOpts{Context: context.Background(), Pending: false} callOpts := &bind.CallOpts{Context: context.Background(), Pending: false}
communities, err := directory.GetCommunities(callOpts) curatedCommunities, err := directory.GetCommunities(callOpts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var communityIDs []types.HexBytes var communityIDs []types.HexBytes
for _, c := range communities { for _, c := range curatedCommunities {
communityIDs = append(communityIDs, c) communityIDs = append(communityIDs, c)
} }
@ -594,11 +597,30 @@ func (m *Messenger) CuratedCommunities() (*communities.KnownCommunitiesResponse,
if err != nil { if err != nil {
return nil, err return nil, err
} }
// TODO: The curated communities smart contract should also store the community shard cluster and index
for _, c := range featuredCommunities { for _, c := range featuredCommunities {
response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, types.HexBytes(c).String()) response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, types.HexBytes(c).String())
// TODO: use CommunityShard instead of communityID
/*response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, communities.CommunityShard{
CommunityID: types.HexBytes(c).String(),
// Shard: c.Shard, // TODO: obtain this value
})*/
} }
go m.requestCommunitiesFromMailserver(response.UnknownCommunities) // TODO: this loop is added just to not revert the change from requestCommunitiesFromMailserver
// Once support for shards is added in the contract, just pass the `response.UnknownCommunities` directly to
// the function
var unknownCommunities []communities.CommunityShard
for _, u := range response.UnknownCommunities {
unknownCommunities = append(unknownCommunities, communities.CommunityShard{
CommunityID: u,
})
}
go m.requestCommunitiesFromMailserver(unknownCommunities)
return response, nil return response, nil
} }
@ -625,8 +647,8 @@ func (m *Messenger) initCommunityChats(community *communities.Community) ([]*Cha
if community.IsControlNode() { if community.IsControlNode() {
// Init the community filter so we can receive messages on the community // Init the community filter so we can receive messages on the community
communityFilters, err := m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ communityFilters, err := m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
CommunityID: community.ID(), Shard: community.Shard().TransportShard(),
PrivKey: community.PrivateKey(), PrivKey: community.PrivateKey(),
}}) }})
if err != nil { if err != nil {
@ -700,14 +722,25 @@ func (m *Messenger) JoinCommunity(ctx context.Context, communityID types.HexByte
return mr, nil return mr, nil
} }
func (m *Messenger) subscribeToCommunityShard(communityID []byte) error { func (m *Messenger) subscribeToCommunityShard(communityID []byte, shard *common.Shard) error {
// TODO: store private key and topic if m.transport.WakuVersion() != 2 {
// TODO: determine pubsub topic and public key for community return nil
// TODO: this should probably be moved completely to transport once pubsub topic logic is implemented }
pubsubTopic := transport.GetPubsubTopic(communityID) // TODO: this should probably be moved completely to transport once pubsub topic logic is implemented
// var communityPubKey *ecdsa.PublicKey pubsubTopic := transport.GetPubsubTopic(shard.TransportShard())
return m.transport.SubscribeToPubsubTopic(pubsubTopic, nil)
privK, err := m.transport.RetrievePubsubTopicKey(pubsubTopic)
if err != nil {
return err
}
var pubK *ecdsa.PublicKey
if privK != nil {
pubK = &privK.PublicKey
}
return m.transport.SubscribeToPubsubTopic(pubsubTopic, pubK)
} }
func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexBytes, forceJoin bool) (*MessengerResponse, error) { func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexBytes, forceJoin bool) (*MessengerResponse, error) {
@ -733,7 +766,7 @@ func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexByte
return nil, err return nil, err
} }
if err = m.subscribeToCommunityShard(communityID); err != nil { if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return nil, err return nil, err
} }
} }
@ -787,7 +820,7 @@ func (m *Messenger) SpectateCommunity(communityID types.HexBytes) (*MessengerRes
response.AddCommunity(community) response.AddCommunity(community)
if err = m.subscribeToCommunityShard(community.ID()); err != nil { if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return nil, err return nil, err
} }
@ -1064,7 +1097,7 @@ func (m *Messenger) RequestToJoinCommunity(request *requests.RequestToJoinCommun
CommunityID: community.ID(), CommunityID: community.ID(),
SkipProtocolLayer: true, SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_JOIN, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_JOIN,
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic PubsubTopic: relay.DefaultWakuTopic, // TODO: this should be sent on a non protected pubsub topic.
} }
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
@ -1218,7 +1251,7 @@ func (m *Messenger) EditSharedAddressesForCommunity(request *requests.EditShared
CommunityID: community.ID(), CommunityID: community.ID(),
SkipProtocolLayer: true, SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EDIT_SHARED_ADDRESSES, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EDIT_SHARED_ADDRESSES,
PubsubTopic: community.PubsubTopic(), PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic
} }
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
@ -1382,7 +1415,7 @@ func (m *Messenger) CancelRequestToJoinCommunity(request *requests.CancelRequest
CommunityID: community.ID(), CommunityID: community.ID(),
SkipProtocolLayer: true, SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_CANCEL_REQUEST_TO_JOIN, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_CANCEL_REQUEST_TO_JOIN,
PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be send in community pubsub topic PubsubTopic: relay.DefaultWakuTopic, // TODO: this should be sent on a non protected pubsub topic.
} }
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
@ -1461,12 +1494,22 @@ func (m *Messenger) AcceptRequestToJoinCommunity(request *requests.AcceptRequest
return nil, err return nil, err
} }
var key *ecdsa.PrivateKey
if m.transport.WakuVersion() == 2 {
key, err = m.transport.RetrievePubsubTopicKey(community.PubsubTopic())
if err != nil {
return nil, err
}
}
requestToJoinResponseProto := &protobuf.CommunityRequestToJoinResponse{ requestToJoinResponseProto := &protobuf.CommunityRequestToJoinResponse{
Clock: community.Clock(), Clock: community.Clock(),
Accepted: true, Accepted: true,
CommunityId: community.ID(), CommunityId: community.ID(),
Community: community.Description(), Community: community.Description(),
Grant: grant, Grant: grant,
ProtectedTopicPrivateKey: crypto.FromECDSA(key),
Shard: community.Shard().Protobuffer(),
} }
if m.torrentClientReady() && m.communitiesManager.TorrentFileExists(community.IDString()) { if m.torrentClientReady() && m.communitiesManager.TorrentFileExists(community.IDString()) {
@ -1654,12 +1697,17 @@ func (m *Messenger) LeaveCommunity(communityID types.HexBytes) (*MessengerRespon
return nil, err return nil, err
} }
community, err := m.communitiesManager.GetByID(communityID)
if err != nil {
return nil, err
}
rawMessage := common.RawMessage{ rawMessage := common.RawMessage{
Payload: payload, Payload: payload,
CommunityID: communityID, CommunityID: communityID,
SkipProtocolLayer: true, SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_LEAVE, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_LEAVE,
PubsubTopic: transport.GetPubsubTopic(communityID), // TODO: confirm if it should be sent in the community pubsub topic PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in the community pubsub topic
} }
_, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage)
if err != nil { if err != nil {
@ -1912,14 +1960,14 @@ func (m *Messenger) CreateCommunity(request *requests.CreateCommunity, createDef
return nil, err return nil, err
} }
if err = m.subscribeToCommunityShard(community.ID()); err != nil { if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return nil, err return nil, err
} }
// Init the community filter so we can receive messages on the community // Init the community filter so we can receive messages on the community
_, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ _, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
CommunityID: community.ID(), Shard: community.Shard().TransportShard(),
PrivKey: community.PrivateKey(), PrivKey: community.PrivateKey(),
}}) }})
if err != nil { if err != nil {
return nil, err return nil, err
@ -1966,6 +2014,95 @@ func (m *Messenger) CreateCommunity(request *requests.CreateCommunity, createDef
return response, nil return response, nil
} }
func (m *Messenger) SetCommunityShard(request *requests.SetCommunityShard) (*MessengerResponse, error) {
if err := request.Validate(); err != nil {
return nil, err
}
community, err := m.communitiesManager.SetShard(request.CommunityID, request.Shard)
if err != nil {
return nil, err
}
var topicPrivKey *ecdsa.PrivateKey
if request.PrivateKey != nil {
topicPrivKey, err = crypto.ToECDSA(*request.PrivateKey)
} else {
topicPrivKey, err = crypto.GenerateKey()
}
if err != nil {
return nil, err
}
err = m.UpdateCommunityFilters(community, topicPrivKey)
if err != nil {
return nil, err
}
err = m.SendCommunityShardKey(community, community.GetMemberPubkeys())
if err != nil {
return nil, err
}
response := &MessengerResponse{}
response.AddProtectedTopic(community.PubsubTopic(), topicPrivKey)
return response, nil
}
func (m *Messenger) UpdateCommunityFilters(community *communities.Community, privKey *ecdsa.PrivateKey) error {
if m.transport.WakuVersion() == 2 && privKey != nil {
if err := m.transport.StorePubsubTopicKey(community.PubsubTopic(), privKey); err != nil {
return err
}
}
publicFiltersToInit := make([]transport.FiltersToInitialize, 0, len(community.DefaultFilters())+len(community.Chats()))
for _, df := range community.DefaultFilters() {
_, err := m.transport.RemoveFilterByChatID(df.ChatID)
if err != nil {
return err
}
publicFiltersToInit = append(publicFiltersToInit, df)
}
for chatID := range community.Chats() {
communityChatID := community.IDString() + chatID
_, err := m.transport.RemoveFilterByChatID(communityChatID)
if err != nil {
return err
}
publicFiltersToInit = append(publicFiltersToInit, transport.FiltersToInitialize{ChatID: communityChatID, PubsubTopic: community.PubsubTopic()})
}
_, err := m.transport.InitPublicFilters(publicFiltersToInit)
if err != nil {
return err
}
// Init the community filter so we can receive messages on the community
_, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
Shard: community.Shard().TransportShard(),
PrivKey: community.PrivateKey(),
}})
if err != nil {
return err
}
// Init the default community filters
_, err = m.transport.InitPublicFilters(publicFiltersToInit)
if err != nil {
return err
}
if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil {
return err
}
return nil
}
func (m *Messenger) CreateCommunityTokenPermission(request *requests.CreateCommunityTokenPermission) (*MessengerResponse, error) { func (m *Messenger) CreateCommunityTokenPermission(request *requests.CreateCommunityTokenPermission) (*MessengerResponse, error) {
if err := request.Validate(); err != nil { if err := request.Validate(); err != nil {
return nil, err return nil, err
@ -2147,7 +2284,7 @@ func (m *Messenger) ImportCommunity(ctx context.Context, key *ecdsa.PrivateKey)
return nil, err return nil, err
} }
_, err = m.RequestCommunityInfoFromMailserver(community.IDString(), false) _, err = m.RequestCommunityInfoFromMailserver(community.IDString(), community.Shard(), false)
if err != nil { if err != nil {
// TODO In the future we should add a mechanism to re-apply next steps (adding owner, joining) // TODO In the future we should add a mechanism to re-apply next steps (adding owner, joining)
// if there is no connection with mailserver. Otherwise changes will be overwritten. // if there is no connection with mailserver. Otherwise changes will be overwritten.
@ -2289,6 +2426,48 @@ func (m *Messenger) RemoveUserFromCommunity(id types.HexBytes, pkString string)
return response, nil return response, nil
} }
func (m *Messenger) SendCommunityShardKey(community *communities.Community, pubkeys []*ecdsa.PublicKey) error {
if m.transport.WakuVersion() != 2 {
return nil
}
if !community.IsControlNode() {
return nil
}
key, err := m.transport.RetrievePubsubTopicKey(community.PubsubTopic())
if err != nil {
return err
}
if key == nil {
return nil // No community shard key available
}
communityShardKey := &protobuf.CommunityShardKey{
Clock: m.getTimesource().GetCurrentTime(),
CommunityId: community.ID(),
PrivateKey: crypto.FromECDSA(key),
Shard: community.Shard().Protobuffer(),
}
encodedMessage, err := proto.Marshal(communityShardKey)
if err != nil {
return err
}
rawMessage := common.RawMessage{
Recipients: pubkeys,
ResendAutomatically: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_SHARD_KEY,
Payload: encodedMessage,
}
_, err = m.sender.SendPubsubTopicKey(context.Background(), &rawMessage)
return err
}
func (m *Messenger) UnbanUserFromCommunity(request *requests.UnbanUserFromCommunity) (*MessengerResponse, error) { func (m *Messenger) UnbanUserFromCommunity(request *requests.UnbanUserFromCommunity) (*MessengerResponse, error) {
community, err := m.communitiesManager.UnbanUserFromCommunity(request) community, err := m.communitiesManager.UnbanUserFromCommunity(request)
if err != nil { if err != nil {
@ -2375,7 +2554,7 @@ func (m *Messenger) GetCommunityIDFromKey(communityKey string) string {
// RequestCommunityInfoFromMailserver installs filter for community and requests its details // RequestCommunityInfoFromMailserver installs filter for community and requests its details
// from mailserver. It waits until it has the community before returning it. // from mailserver. It waits until it has the community before returning it.
// If useDatabase is true, it searches for community in database and does not request mailserver. // If useDatabase is true, it searches for community in database and does not request mailserver.
func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string, useDatabase bool) (*communities.Community, error) { func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string, shard *common.Shard, useDatabase bool) (*communities.Community, error) {
communityID := m.GetCommunityIDFromKey(privateOrPublicKey) communityID := m.GetCommunityIDFromKey(privateOrPublicKey)
if useDatabase { if useDatabase {
community, err := m.findCommunityInfoFromDB(communityID) community, err := m.findCommunityInfoFromDB(communityID)
@ -2387,12 +2566,12 @@ func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string
} }
} }
return m.requestCommunityInfoFromMailserver(communityID, true) return m.requestCommunityInfoFromMailserver(communityID, shard, true)
} }
// RequestCommunityInfoFromMailserverAsync installs filter for community and requests its details // RequestCommunityInfoFromMailserverAsync installs filter for community and requests its details
// from mailserver. When response received it will be passed through signals handler // from mailserver. When response received it will be passed through signals handler
func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey string) error { func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey string, shard *common.Shard) error {
communityID := m.GetCommunityIDFromKey(privateOrPublicKey) communityID := m.GetCommunityIDFromKey(privateOrPublicKey)
community, err := m.findCommunityInfoFromDB(communityID) community, err := m.findCommunityInfoFromDB(communityID)
@ -2403,13 +2582,13 @@ func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey s
m.config.messengerSignalsHandler.CommunityInfoFound(community) m.config.messengerSignalsHandler.CommunityInfoFound(community)
return nil return nil
} }
_, err = m.requestCommunityInfoFromMailserver(communityID, false) _, err = m.requestCommunityInfoFromMailserver(communityID, shard, false)
return err return err
} }
// RequestCommunityInfoFromMailserver installs filter for community and requests its details // RequestCommunityInfoFromMailserver installs filter for community and requests its details
// from mailserver. When response received it will be passed through signals handler // from mailserver. When response received it will be passed through signals handler
func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitForResponse bool) (*communities.Community, error) { func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, shard *common.Shard, waitForResponse bool) (*communities.Community, error) {
m.requestedCommunitiesLock.Lock() m.requestedCommunitiesLock.Lock()
defer m.requestedCommunitiesLock.Unlock() defer m.requestedCommunitiesLock.Unlock()
@ -2417,18 +2596,13 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF
return nil, nil return nil, nil
} }
id, err := hexutil.Decode(communityID)
if err != nil {
return nil, err
}
//If filter wasn't installed we create it and remember for deinstalling after //If filter wasn't installed we create it and remember for deinstalling after
//response received //response received
filter := m.transport.FilterByChatID(communityID) filter := m.transport.FilterByChatID(communityID)
if filter == nil { if filter == nil {
filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{ filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{
ChatID: communityID, ChatID: communityID,
PubsubTopic: transport.GetPubsubTopic(id), PubsubTopic: transport.GetPubsubTopic(shard.TransportShard()),
}}) }})
if err != nil { if err != nil {
return nil, fmt.Errorf("Can't install filter for community: %v", err) return nil, fmt.Errorf("Can't install filter for community: %v", err)
@ -2448,7 +2622,7 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF
to := uint32(m.transport.GetCurrentTime() / 1000) to := uint32(m.transport.GetCurrentTime() / 1000)
from := to - oneMonthInSeconds from := to - oneMonthInSeconds
_, err = m.performMailserverRequest(func() (*MessengerResponse, error) { _, err := m.performMailserverRequest(func() (*MessengerResponse, error) {
batch := MailserverBatch{From: from, To: to, Topics: []types.TopicType{filter.ContentTopic}} batch := MailserverBatch{From: from, To: to, Topics: []types.TopicType{filter.ContentTopic}}
m.logger.Info("Requesting historic") m.logger.Info("Requesting historic")
err := m.processMailserverBatch(batch) err := m.processMailserverBatch(batch)
@ -2485,28 +2659,23 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF
// RequestCommunityInfoFromMailserver installs filter for community and requests its details // RequestCommunityInfoFromMailserver installs filter for community and requests its details
// from mailserver. When response received it will be passed through signals handler // from mailserver. When response received it will be passed through signals handler
func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) { func (m *Messenger) requestCommunitiesFromMailserver(communities []communities.CommunityShard) {
m.requestedCommunitiesLock.Lock() m.requestedCommunitiesLock.Lock()
defer m.requestedCommunitiesLock.Unlock() defer m.requestedCommunitiesLock.Unlock()
var topics []types.TopicType var topics []types.TopicType
for _, communityID := range communityIDs { for _, c := range communities {
if _, ok := m.requestedCommunities[communityID]; ok { if _, ok := m.requestedCommunities[c.CommunityID]; ok {
continue
}
id, err := hexutil.Decode(communityID)
if err != nil {
continue continue
} }
//If filter wasn't installed we create it and remember for deinstalling after //If filter wasn't installed we create it and remember for deinstalling after
//response received //response received
filter := m.transport.FilterByChatID(communityID) filter := m.transport.FilterByChatID(c.CommunityID)
if filter == nil { if filter == nil {
filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{ filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{
ChatID: communityID, ChatID: c.CommunityID,
PubsubTopic: transport.GetPubsubTopic(id), PubsubTopic: transport.GetPubsubTopic(c.Shard.TransportShard()),
}}) }})
if err != nil { if err != nil {
m.logger.Error("Can't install filter for community", zap.Error(err)) m.logger.Error("Can't install filter for community", zap.Error(err))
@ -2517,10 +2686,10 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
continue continue
} }
filter = filters[0] filter = filters[0]
m.requestedCommunities[communityID] = filter m.requestedCommunities[c.CommunityID] = filter
} else { } else {
//we don't remember filter id associated with community because it was already installed //we don't remember filter id associated with community because it was already installed
m.requestedCommunities[communityID] = nil m.requestedCommunities[c.CommunityID] = nil
} }
topics = append(topics, filter.ContentTopic) topics = append(topics, filter.ContentTopic)
} }
@ -2549,8 +2718,8 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
select { select {
case <-time.After(200 * time.Millisecond): case <-time.After(200 * time.Millisecond):
allLoaded := true allLoaded := true
for _, c := range communityIDs { for _, c := range communities {
community, err := m.communitiesManager.GetByIDString(c) community, err := m.communitiesManager.GetByIDString(c.CommunityID)
if err != nil { if err != nil {
m.logger.Error("Error loading community", zap.Error(err)) m.logger.Error("Error loading community", zap.Error(err))
break break
@ -2571,8 +2740,8 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) {
} }
} }
for _, c := range communityIDs { for _, c := range communities {
m.forgetCommunityRequest(c) m.forgetCommunityRequest(c.CommunityID)
} }
} }
@ -2622,7 +2791,7 @@ func (m *Messenger) passStoredCommunityInfoToSignalHandler(communityID string) {
// handleCommunityDescription handles an community description // handleCommunityDescription handles an community description
func (m *Messenger) handleCommunityDescription(state *ReceivedMessageState, signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, rawPayload []byte) error { func (m *Messenger) handleCommunityDescription(state *ReceivedMessageState, signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, rawPayload []byte) error {
communityResponse, err := m.communitiesManager.HandleCommunityDescriptionMessage(signer, description, rawPayload) communityResponse, err := m.communitiesManager.HandleCommunityDescriptionMessage(signer, description, rawPayload, nil)
if err != nil { if err != nil {
return err return err
} }
@ -2764,7 +2933,63 @@ func (m *Messenger) HandleCommunityEventsMessageRejected(state *ReceivedMessageS
return nil return nil
} }
err = m.publishCommunityEvents(reapplyEventsMessage) community, err := m.communitiesManager.GetByID(reapplyEventsMessage.CommunityID)
if err != nil {
return err
}
err = m.publishCommunityEvents(community, reapplyEventsMessage)
if err != nil {
return err
}
return nil
}
// HandleCommunityShardKey handles the private keys for the community shards
func (m *Messenger) HandleCommunityShardKey(state *ReceivedMessageState, message *protobuf.CommunityShardKey, statusMessage *v1protocol.StatusMessage) error {
// TODO: @cammellos: This is risky, it does not seem to support out of order messages
// (say that the community changes shards twice, last one wins, but we don't check clock
// etc)
// TODO: @cammellos: getbyid returns nil if the community is not in the db, so we need to handle it
community, err := m.communitiesManager.GetByID(message.CommunityId)
if err != nil {
return err
}
// If we haven't joined the community, nothing to do
if !community.Joined() {
return nil
}
signer := state.CurrentMessageState.PublicKey
if signer == nil {
return errors.New("signer can't be nil")
}
if !community.IsMemberOwner(signer) {
return communities.ErrNotAuthorized
}
return m.handleCommunityShardAndFiltersFromProto(community, common.ShardFromProtobuff(message.Shard), message.PrivateKey)
}
func (m *Messenger) handleCommunityShardAndFiltersFromProto(community *communities.Community, shard *common.Shard, privateKeyBytes []byte) error {
err := m.communitiesManager.UpdateShard(community, shard)
if err != nil {
return err
}
var privKey *ecdsa.PrivateKey = nil
if privateKeyBytes != nil {
privKey, err = crypto.ToECDSA(privateKeyBytes)
if err != nil {
return err
}
}
err = m.UpdateCommunityFilters(community, privKey)
if err != nil { if err != nil {
return err return err
} }
@ -4265,8 +4490,8 @@ func (m *Messenger) RequestImportDiscordCommunity(request *requests.ImportDiscor
// Init the community filter so we can receive messages on the community // Init the community filter so we can receive messages on the community
_, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ _, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{
CommunityID: discordCommunity.ID(), Shard: discordCommunity.Shard().TransportShard(),
PrivKey: discordCommunity.PrivateKey(), PrivKey: discordCommunity.PrivateKey(),
}}) }})
if err != nil { if err != nil {
m.cleanUpImport(communityID) m.cleanUpImport(communityID)

View File

@ -8,9 +8,10 @@ import (
"time" "time"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/deprecation"
"github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"

View File

@ -1570,6 +1570,16 @@ func (m *Messenger) HandleCommunityRequestToJoinResponse(state *ReceivedMessageS
} }
if requestToJoinResponseProto.Accepted { if requestToJoinResponseProto.Accepted {
community, err := m.communitiesManager.GetByID(requestToJoinResponseProto.CommunityId)
if err != nil {
return err
}
err = m.handleCommunityShardAndFiltersFromProto(community, common.ShardFromProtobuff(requestToJoinResponseProto.Shard), requestToJoinResponseProto.ProtectedTopicPrivateKey)
if err != nil {
return err
}
response, err := m.JoinCommunity(context.Background(), requestToJoinResponseProto.CommunityId, false) response, err := m.JoinCommunity(context.Background(), requestToJoinResponseProto.CommunityId, false)
if err != nil { if err != nil {
return err return err
@ -1664,8 +1674,8 @@ func (m *Messenger) HandleCommunityRequestToLeave(state *ReceivedMessageState, r
} }
// handleWrappedCommunityDescriptionMessage handles a wrapped community description // handleWrappedCommunityDescriptionMessage handles a wrapped community description
func (m *Messenger) handleWrappedCommunityDescriptionMessage(payload []byte) (*communities.CommunityResponse, error) { func (m *Messenger) handleWrappedCommunityDescriptionMessage(payload []byte, shard *common.Shard) (*communities.CommunityResponse, error) {
return m.communitiesManager.HandleWrappedCommunityDescriptionMessage(payload) return m.communitiesManager.HandleWrappedCommunityDescriptionMessage(payload, shard)
} }
func (m *Messenger) handleEditMessage(state *ReceivedMessageState, editMessage EditMessage) error { func (m *Messenger) handleEditMessage(state *ReceivedMessageState, editMessage EditMessage) error {
@ -2265,7 +2275,7 @@ func (m *Messenger) handleChatMessage(state *ReceivedMessageState, forceSeen boo
if receivedMessage.ContentType == protobuf.ChatMessage_COMMUNITY { if receivedMessage.ContentType == protobuf.ChatMessage_COMMUNITY {
m.logger.Debug("Handling community content type") m.logger.Debug("Handling community content type")
communityResponse, err := m.handleWrappedCommunityDescriptionMessage(receivedMessage.GetCommunity()) communityResponse, err := m.handleWrappedCommunityDescriptionMessage(receivedMessage.GetCommunity(), common.ShardFromProtobuff(receivedMessage.Shard))
if err != nil { if err != nil {
return err return err
} }

View File

@ -226,6 +226,9 @@ func (m *Messenger) dispatchToHandler(messageState *ReceivedMessageState, protoB
case protobuf.ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE: case protobuf.ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE:
return m.handleCommunityPrivilegedUserSyncMessageProtobuf(messageState, protoBytes, msg, filter) return m.handleCommunityPrivilegedUserSyncMessageProtobuf(messageState, protoBytes, msg, filter)
case protobuf.ApplicationMetadataMessage_COMMUNITY_SHARD_KEY:
return m.handleCommunityShardKeyProtobuf(messageState, protoBytes, msg, filter)
default: default:
m.logger.Info("protobuf type not found", zap.String("type", string(msg.Type))) m.logger.Info("protobuf type not found", zap.String("type", string(msg.Type)))
return errors.New("protobuf type not found") return errors.New("protobuf type not found")
@ -1608,3 +1611,21 @@ func (m *Messenger) handleCommunityPrivilegedUserSyncMessageProtobuf(messageStat
} }
func (m *Messenger) handleCommunityShardKeyProtobuf(messageState *ReceivedMessageState, protoBytes []byte, msg *v1protocol.StatusMessage, filter transport.Filter) error {
m.logger.Info("handling CommunityShardKey")
p := &protobuf.CommunityShardKey{}
err := proto.Unmarshal(protoBytes, p)
if err != nil {
return err
}
m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, messageState.CurrentMessageState.Contact.ID, filter.ContentTopic, filter.ChatID, msg.Type, p)
return m.HandleCommunityShardKey(messageState, p, msg)
}

View File

@ -9,9 +9,10 @@ import (
"time" "time"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/connection" "github.com/status-im/status-go/connection"
"github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"

View File

@ -1,8 +1,11 @@
package protocol package protocol
import ( import (
"crypto/ecdsa"
"encoding/json" "encoding/json"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/status-im/status-go/eth-node/crypto"
ensservice "github.com/status-im/status-go/services/ens" ensservice "github.com/status-im/status-go/services/ens"
"github.com/status-im/status-go/services/browsers" "github.com/status-im/status-go/services/browsers"
@ -34,6 +37,11 @@ type ClearedHistory struct {
ClearedAt uint64 `json:"clearedAt"` ClearedAt uint64 `json:"clearedAt"`
} }
type ProtectedTopic struct {
PubsubTopic string `json:"pubsubTopic"`
PublicKey string `json:"publicKey"`
}
type MessengerResponse struct { type MessengerResponse struct {
Contacts []*Contact Contacts []*Contact
Installations []*multidevice.Installation Installations []*multidevice.Installation
@ -62,6 +70,7 @@ type MessengerResponse struct {
removedMessages map[string]*RemovedMessage removedMessages map[string]*RemovedMessage
communities map[string]*communities.Community communities map[string]*communities.Community
communitiesSettings map[string]*communities.CommunitySettings communitiesSettings map[string]*communities.CommunitySettings
protectedTopics map[string]*ecdsa.PrivateKey
activityCenterNotifications map[string]*ActivityCenterNotification activityCenterNotifications map[string]*ActivityCenterNotification
activityCenterState *ActivityCenterState activityCenterState *ActivityCenterState
messages map[string]*common.Message messages map[string]*common.Message
@ -103,6 +112,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) {
Notifications []*localnotifications.Notification `json:"notifications"` Notifications []*localnotifications.Notification `json:"notifications"`
Communities []*communities.Community `json:"communities,omitempty"` Communities []*communities.Community `json:"communities,omitempty"`
CommunitiesSettings []*communities.CommunitySettings `json:"communitiesSettings,omitempty"` CommunitiesSettings []*communities.CommunitySettings `json:"communitiesSettings,omitempty"`
ProtectedTopics []ProtectedTopic `json:"protectedTopics,omitempty"`
ActivityCenterNotifications []*ActivityCenterNotification `json:"activityCenterNotifications,omitempty"` ActivityCenterNotifications []*ActivityCenterNotification `json:"activityCenterNotifications,omitempty"`
ActivityCenterState *ActivityCenterState `json:"activityCenterState,omitempty"` ActivityCenterState *ActivityCenterState `json:"activityCenterState,omitempty"`
CurrentStatus *UserStatus `json:"currentStatus,omitempty"` CurrentStatus *UserStatus `json:"currentStatus,omitempty"`
@ -144,6 +154,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) {
Chats: r.Chats(), Chats: r.Chats(),
Communities: r.Communities(), Communities: r.Communities(),
CommunitiesSettings: r.CommunitiesSettings(), CommunitiesSettings: r.CommunitiesSettings(),
ProtectedTopics: r.ProtectedTopics(),
RemovedChats: r.RemovedChats(), RemovedChats: r.RemovedChats(),
RemovedMessages: r.RemovedMessages(), RemovedMessages: r.RemovedMessages(),
ClearedHistories: r.ClearedHistories(), ClearedHistories: r.ClearedHistories(),
@ -211,6 +222,17 @@ func (r *MessengerResponse) CommunitiesSettings() []*communities.CommunitySettin
return settings return settings
} }
func (r *MessengerResponse) ProtectedTopics() []ProtectedTopic {
protectedTopics := make([]ProtectedTopic, 0, len(r.protectedTopics))
for pubsubTopic, privKey := range r.protectedTopics {
protectedTopics = append(protectedTopics, ProtectedTopic{
PubsubTopic: pubsubTopic,
PublicKey: hexutil.Encode(crypto.FromECDSAPub(&privKey.PublicKey)),
})
}
return protectedTopics
}
func (r *MessengerResponse) Notifications() []*localnotifications.Notification { func (r *MessengerResponse) Notifications() []*localnotifications.Notification {
var notifications []*localnotifications.Notification var notifications []*localnotifications.Notification
for _, n := range r.notifications { for _, n := range r.notifications {
@ -355,6 +377,14 @@ func (r *MessengerResponse) AddRequestsToJoinCommunity(requestsToJoin []*communi
r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestsToJoin...) r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestsToJoin...)
} }
func (r *MessengerResponse) AddProtectedTopic(pubsubTopic string, privKey *ecdsa.PrivateKey) {
if r.protectedTopics == nil {
r.protectedTopics = make(map[string]*ecdsa.PrivateKey)
}
r.protectedTopics[pubsubTopic] = privKey
}
func (r *MessengerResponse) AddRequestToJoinCommunity(requestToJoin *communities.RequestToJoin) { func (r *MessengerResponse) AddRequestToJoinCommunity(requestToJoin *communities.RequestToJoin) {
r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestToJoin) r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestToJoin)
} }

View File

@ -44,6 +44,7 @@ type URLDataResponse struct {
Community CommunityURLData `json:"community"` Community CommunityURLData `json:"community"`
Channel CommunityChannelURLData `json:"channel"` Channel CommunityChannelURLData `json:"channel"`
Contact ContactURLData `json:"contact"` Contact ContactURLData `json:"contact"`
Shard *common.Shard `json:"shard,omitempty"`
} }
const baseShareURL = "https://status.app" const baseShareURL = "https://status.app"
@ -119,6 +120,7 @@ func (m *Messenger) parseCommunityURLWithChatKey(urlData string) (*URLDataRespon
return &URLDataResponse{ return &URLDataResponse{
Community: m.prepareCommunityData(community), Community: m.prepareCommunityData(community),
Shard: community.Shard(),
}, nil }, nil
} }
@ -138,6 +140,7 @@ func (m *Messenger) prepareEncodedCommunityData(community *communities.Community
urlDataProto := &protobuf.URLData{ urlDataProto := &protobuf.URLData{
Content: communityData, Content: communityData,
Shard: community.Shard().Protobuffer(),
} }
urlData, err := proto.Marshal(urlDataProto) urlData, err := proto.Marshal(urlDataProto)
@ -208,6 +211,7 @@ func (m *Messenger) parseCommunityURLWithData(data string, chatKey string) (*URL
TagIndices: communityProto.TagIndices, TagIndices: communityProto.TagIndices,
CommunityID: types.EncodeHex(communityID), CommunityID: types.EncodeHex(communityID),
}, },
Shard: common.ShardFromProtobuff(urlDataProto.Shard),
}, nil }, nil
} }
@ -274,6 +278,7 @@ func (m *Messenger) parseCommunityChannelURLWithChatKey(channelID string, public
return &URLDataResponse{ return &URLDataResponse{
Community: m.prepareCommunityData(community), Community: m.prepareCommunityData(community),
Channel: m.prepareCommunityChannelData(channel), Channel: m.prepareCommunityChannelData(channel),
Shard: community.Shard(),
}, nil }, nil
} }
@ -302,6 +307,7 @@ func (m *Messenger) prepareEncodedCommunityChannelData(community *communities.Co
urlDataProto := &protobuf.URLData{ urlDataProto := &protobuf.URLData{
Content: channelData, Content: channelData,
Shard: community.Shard().Protobuffer(),
} }
urlData, err := proto.Marshal(urlDataProto) urlData, err := proto.Marshal(urlDataProto)
@ -392,6 +398,7 @@ func (m *Messenger) parseCommunityChannelURLWithData(data string, chatKey string
Color: channelProto.Color, Color: channelProto.Color,
ChannelUUID: channelProto.Uuid, ChannelUUID: channelProto.Uuid,
}, },
Shard: common.ShardFromProtobuff(urlDataProto.Shard),
}, nil }, nil
} }

View File

@ -101,6 +101,7 @@
// 1689266326_create_communities_events_table.up.sql (164B) // 1689266326_create_communities_events_table.up.sql (164B)
// 1689931300_add_community_tokens_deployer_and_priv_level.up.sql (156B) // 1689931300_add_community_tokens_deployer_and_priv_level.up.sql (156B)
// 1693311881_add_unfurled_links_to_message_edits.up.sql (64B) // 1693311881_add_unfurled_links_to_message_edits.up.sql (64B)
// 1693311981_community_shard.up.sql (156B)
// README.md (554B) // README.md (554B)
// doc.go (850B) // doc.go (850B)
@ -186,7 +187,7 @@ func _000001_initDownDbSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xbb, 0x3f, 0x1, 0x75, 0x19, 0x70, 0x86, 0xa7, 0x34, 0x40, 0x17, 0x34, 0x3e, 0x18, 0x51, 0x79, 0xd4, 0x22, 0xad, 0x8f, 0x80, 0xcc, 0xa6, 0xcc, 0x6, 0x2b, 0x62, 0x2, 0x47, 0xba, 0xf9}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xbb, 0x3f, 0x1, 0x75, 0x19, 0x70, 0x86, 0xa7, 0x34, 0x40, 0x17, 0x34, 0x3e, 0x18, 0x51, 0x79, 0xd4, 0x22, 0xad, 0x8f, 0x80, 0xcc, 0xa6, 0xcc, 0x6, 0x2b, 0x62, 0x2, 0x47, 0xba, 0xf9}}
return a, nil return a, nil
} }
@ -206,7 +207,7 @@ func _000001_initUpDbSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x60, 0xdc, 0xeb, 0xe, 0xc2, 0x4f, 0x75, 0xa, 0xf6, 0x3e, 0xc7, 0xc4, 0x4, 0xe2, 0xe1, 0xa4, 0x73, 0x2f, 0x4a, 0xad, 0x1a, 0x0, 0xc3, 0x93, 0x9d, 0x77, 0x3e, 0x31, 0x91, 0x77, 0x2e, 0xc8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x60, 0xdc, 0xeb, 0xe, 0xc2, 0x4f, 0x75, 0xa, 0xf6, 0x3e, 0xc7, 0xc4, 0x4, 0xe2, 0xe1, 0xa4, 0x73, 0x2f, 0x4a, 0xad, 0x1a, 0x0, 0xc3, 0x93, 0x9d, 0x77, 0x3e, 0x31, 0x91, 0x77, 0x2e, 0xc8}}
return a, nil return a, nil
} }
@ -226,7 +227,7 @@ func _000002_add_last_ens_clock_valueUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x3, 0x8f, 0xd5, 0x85, 0x83, 0x47, 0xbe, 0xf9, 0x82, 0x7e, 0x81, 0xa4, 0xbd, 0xaa, 0xd5, 0x98, 0x18, 0x5, 0x2d, 0x82, 0x42, 0x3b, 0x3, 0x50, 0xc3, 0x1e, 0x84, 0x35, 0xf, 0xb6, 0x2b}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x3, 0x8f, 0xd5, 0x85, 0x83, 0x47, 0xbe, 0xf9, 0x82, 0x7e, 0x81, 0xa4, 0xbd, 0xaa, 0xd5, 0x98, 0x18, 0x5, 0x2d, 0x82, 0x42, 0x3b, 0x3, 0x50, 0xc3, 0x1e, 0x84, 0x35, 0xf, 0xb6, 0x2b}}
return a, nil return a, nil
} }
@ -246,7 +247,7 @@ func _1586358095_add_replaceUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xb3, 0xa9, 0xc7, 0x7f, 0x9d, 0x8f, 0x43, 0x8c, 0x9e, 0x58, 0x8d, 0x44, 0xbc, 0xfa, 0x6b, 0x5f, 0x3f, 0x5a, 0xbe, 0xe8, 0xb1, 0x16, 0xf, 0x91, 0x2a, 0xa0, 0x71, 0xbb, 0x8d, 0x6b, 0xcb}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xb3, 0xa9, 0xc7, 0x7f, 0x9d, 0x8f, 0x43, 0x8c, 0x9e, 0x58, 0x8d, 0x44, 0xbc, 0xfa, 0x6b, 0x5f, 0x3f, 0x5a, 0xbe, 0xe8, 0xb1, 0x16, 0xf, 0x91, 0x2a, 0xa0, 0x71, 0xbb, 0x8d, 0x6b, 0xcb}}
return a, nil return a, nil
} }
@ -266,7 +267,7 @@ func _1588665364_add_image_dataUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd6, 0xc6, 0x35, 0xb4, 0x4c, 0x39, 0x96, 0x29, 0x30, 0xda, 0xf4, 0x8f, 0xcb, 0xf1, 0x9f, 0x84, 0xdc, 0x88, 0xd4, 0xd5, 0xbc, 0xb6, 0x5b, 0x46, 0x78, 0x67, 0x76, 0x1a, 0x5, 0x36, 0xdc, 0xe5}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd6, 0xc6, 0x35, 0xb4, 0x4c, 0x39, 0x96, 0x29, 0x30, 0xda, 0xf4, 0x8f, 0xcb, 0xf1, 0x9f, 0x84, 0xdc, 0x88, 0xd4, 0xd5, 0xbc, 0xb6, 0x5b, 0x46, 0x78, 0x67, 0x76, 0x1a, 0x5, 0x36, 0xdc, 0xe5}}
return a, nil return a, nil
} }
@ -286,7 +287,7 @@ func _1589365189_add_pow_targetUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x3a, 0xe2, 0x2e, 0x7d, 0xaf, 0xbb, 0xcc, 0x21, 0xa1, 0x7a, 0x41, 0x9a, 0xd0, 0xbb, 0xa9, 0xc8, 0x35, 0xf9, 0x32, 0x34, 0x46, 0x44, 0x9a, 0x86, 0x40, 0x7c, 0xb9, 0x23, 0xc7, 0x3, 0x3f}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x3a, 0xe2, 0x2e, 0x7d, 0xaf, 0xbb, 0xcc, 0x21, 0xa1, 0x7a, 0x41, 0x9a, 0xd0, 0xbb, 0xa9, 0xc8, 0x35, 0xf9, 0x32, 0x34, 0x46, 0x44, 0x9a, 0x86, 0x40, 0x7c, 0xb9, 0x23, 0xc7, 0x3, 0x3f}}
return a, nil return a, nil
} }
@ -306,7 +307,7 @@ func _1591277220_add_index_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xfe, 0xbe, 0xd5, 0xb8, 0x8f, 0xdd, 0xef, 0xbb, 0xa8, 0xad, 0x7f, 0xed, 0x5b, 0x5b, 0x2f, 0xe6, 0x82, 0x27, 0x78, 0x1f, 0xb9, 0x57, 0xdc, 0x8, 0xc2, 0xb2, 0xa9, 0x9a, 0x4, 0xe1, 0x7a}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xfe, 0xbe, 0xd5, 0xb8, 0x8f, 0xdd, 0xef, 0xbb, 0xa8, 0xad, 0x7f, 0xed, 0x5b, 0x5b, 0x2f, 0xe6, 0x82, 0x27, 0x78, 0x1f, 0xb9, 0x57, 0xdc, 0x8, 0xc2, 0xb2, 0xa9, 0x9a, 0x4, 0xe1, 0x7a}}
return a, nil return a, nil
} }
@ -326,7 +327,7 @@ func _1593087212_add_mute_chat_and_raw_message_fieldsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x99, 0x61, 0xd1, 0xaa, 0xb4, 0xbf, 0xaf, 0xd7, 0x20, 0x17, 0x40, 0xf9, 0x2, 0xfb, 0xcc, 0x40, 0x2a, 0xd, 0x86, 0x36, 0x30, 0x88, 0x89, 0x25, 0x80, 0x42, 0xb0, 0x5b, 0xe9, 0x73, 0x78}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x99, 0x61, 0xd1, 0xaa, 0xb4, 0xbf, 0xaf, 0xd7, 0x20, 0x17, 0x40, 0xf9, 0x2, 0xfb, 0xcc, 0x40, 0x2a, 0xd, 0x86, 0x36, 0x30, 0x88, 0x89, 0x25, 0x80, 0x42, 0xb0, 0x5b, 0xe9, 0x73, 0x78}}
return a, nil return a, nil
} }
@ -346,7 +347,7 @@ func _1595862781_add_audio_dataUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}}
return a, nil return a, nil
} }
@ -366,7 +367,7 @@ func _1595865249_create_emoji_reactions_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xc5, 0x43, 0x5c, 0x3d, 0x53, 0x43, 0x2c, 0x1a, 0xa5, 0xb6, 0xbf, 0x7, 0x4, 0x5a, 0x3e, 0x40, 0x8b, 0xa4, 0x57, 0x12, 0x58, 0xbc, 0x42, 0xe2, 0xc3, 0xde, 0x76, 0x98, 0x80, 0xe2, 0xbe}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xc5, 0x43, 0x5c, 0x3d, 0x53, 0x43, 0x2c, 0x1a, 0xa5, 0xb6, 0xbf, 0x7, 0x4, 0x5a, 0x3e, 0x40, 0x8b, 0xa4, 0x57, 0x12, 0x58, 0xbc, 0x42, 0xe2, 0xc3, 0xde, 0x76, 0x98, 0x80, 0xe2, 0xbe}}
return a, nil return a, nil
} }
@ -386,7 +387,7 @@ func _1596805115_create_group_chat_invitations_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0xb1, 0x14, 0x6d, 0x54, 0x28, 0x67, 0xc3, 0x23, 0x6a, 0xfc, 0x80, 0xdf, 0x9e, 0x4c, 0x35, 0x36, 0xf, 0xf8, 0xf3, 0x5f, 0xae, 0xad, 0xb, 0xc1, 0x51, 0x8e, 0x17, 0x7, 0xe5, 0x7f, 0x91}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0xb1, 0x14, 0x6d, 0x54, 0x28, 0x67, 0xc3, 0x23, 0x6a, 0xfc, 0x80, 0xdf, 0x9e, 0x4c, 0x35, 0x36, 0xf, 0xf8, 0xf3, 0x5f, 0xae, 0xad, 0xb, 0xc1, 0x51, 0x8e, 0x17, 0x7, 0xe5, 0x7f, 0x91}}
return a, nil return a, nil
} }
@ -406,7 +407,7 @@ func _1597322655_add_invitation_admin_chat_fieldUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x7a, 0xa0, 0xf2, 0xdb, 0x13, 0x91, 0x91, 0xa8, 0x34, 0x1a, 0xa1, 0x49, 0x68, 0xd5, 0xae, 0x2c, 0xd8, 0xd5, 0xea, 0x8f, 0x8c, 0xc7, 0x2, 0x4e, 0x58, 0x2c, 0x3a, 0x14, 0xd4, 0x4f, 0x2c}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x7a, 0xa0, 0xf2, 0xdb, 0x13, 0x91, 0x91, 0xa8, 0x34, 0x1a, 0xa1, 0x49, 0x68, 0xd5, 0xae, 0x2c, 0xd8, 0xd5, 0xea, 0x8f, 0x8c, 0xc7, 0x2, 0x4e, 0x58, 0x2c, 0x3a, 0x14, 0xd4, 0x4f, 0x2c}}
return a, nil return a, nil
} }
@ -426,7 +427,7 @@ func _1597757544_add_nicknameUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa2, 0x64, 0x50, 0xc5, 0x4, 0xb9, 0x8b, 0xd1, 0x18, 0x9b, 0xc3, 0x91, 0x36, 0x2a, 0x1f, 0xc3, 0x6c, 0x2d, 0x92, 0xf8, 0x5e, 0xff, 0xb1, 0x59, 0x61, 0x2, 0x1c, 0xe1, 0x85, 0x90, 0xa4}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa2, 0x64, 0x50, 0xc5, 0x4, 0xb9, 0x8b, 0xd1, 0x18, 0x9b, 0xc3, 0x91, 0x36, 0x2a, 0x1f, 0xc3, 0x6c, 0x2d, 0x92, 0xf8, 0x5e, 0xff, 0xb1, 0x59, 0x61, 0x2, 0x1c, 0xe1, 0x85, 0x90, 0xa4}}
return a, nil return a, nil
} }
@ -446,7 +447,7 @@ func _1598955122_add_mentionsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0x22, 0x17, 0x92, 0xd2, 0x11, 0x4e, 0x7, 0x93, 0x9a, 0x55, 0xfd, 0xb, 0x97, 0xc4, 0x63, 0x6a, 0x81, 0x97, 0xcd, 0xb2, 0xf8, 0x4b, 0x5f, 0x3c, 0xfa, 0x3a, 0x38, 0x53, 0x10, 0xed, 0x9d}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0x22, 0x17, 0x92, 0xd2, 0x11, 0x4e, 0x7, 0x93, 0x9a, 0x55, 0xfd, 0xb, 0x97, 0xc4, 0x63, 0x6a, 0x81, 0x97, 0xcd, 0xb2, 0xf8, 0x4b, 0x5f, 0x3c, 0xfa, 0x3a, 0x38, 0x53, 0x10, 0xed, 0x9d}}
return a, nil return a, nil
} }
@ -466,7 +467,7 @@ func _1599641390_add_emoji_reactions_indexUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xd8, 0xdc, 0xa7, 0xb, 0x92, 0x7a, 0x61, 0x37, 0x24, 0x1c, 0x77, 0x5e, 0xe, 0x7e, 0xfc, 0x9f, 0x98, 0x7b, 0x65, 0xe7, 0xf9, 0x71, 0x57, 0x89, 0x2d, 0x90, 0x1b, 0xf6, 0x5e, 0x37, 0xe8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xd8, 0xdc, 0xa7, 0xb, 0x92, 0x7a, 0x61, 0x37, 0x24, 0x1c, 0x77, 0x5e, 0xe, 0x7e, 0xfc, 0x9f, 0x98, 0x7b, 0x65, 0xe7, 0xf9, 0x71, 0x57, 0x89, 0x2d, 0x90, 0x1b, 0xf6, 0x5e, 0x37, 0xe8}}
return a, nil return a, nil
} }
@ -486,7 +487,7 @@ func _1599720851_add_seen_index_remove_long_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0x1c, 0xc4, 0x78, 0x91, 0xc7, 0xeb, 0xfe, 0xc8, 0xa0, 0xd8, 0x13, 0x27, 0x97, 0xc8, 0x96, 0x56, 0x97, 0x33, 0x2c, 0x1e, 0x16, 0x8a, 0xd3, 0x49, 0x99, 0x3, 0xe9, 0xbb, 0xc4, 0x5, 0x3c}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0x1c, 0xc4, 0x78, 0x91, 0xc7, 0xeb, 0xfe, 0xc8, 0xa0, 0xd8, 0x13, 0x27, 0x97, 0xc8, 0x96, 0x56, 0x97, 0x33, 0x2c, 0x1e, 0x16, 0x8a, 0xd3, 0x49, 0x99, 0x3, 0xe9, 0xbb, 0xc4, 0x5, 0x3c}}
return a, nil return a, nil
} }
@ -506,7 +507,7 @@ func _1603198582_add_profile_chat_fieldUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0xca, 0xe, 0x46, 0xa0, 0x9, 0x9d, 0x47, 0x57, 0xe9, 0xfb, 0x17, 0xeb, 0x9c, 0xf6, 0xb8, 0x1d, 0xe9, 0xd, 0x0, 0xd5, 0xe5, 0xd8, 0x9e, 0x60, 0xa, 0xbf, 0x32, 0x2c, 0x52, 0x7f, 0x6a}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0xca, 0xe, 0x46, 0xa0, 0x9, 0x9d, 0x47, 0x57, 0xe9, 0xfb, 0x17, 0xeb, 0x9c, 0xf6, 0xb8, 0x1d, 0xe9, 0xd, 0x0, 0xd5, 0xe5, 0xd8, 0x9e, 0x60, 0xa, 0xbf, 0x32, 0x2c, 0x52, 0x7f, 0x6a}}
return a, nil return a, nil
} }
@ -526,7 +527,7 @@ func _1603816533_add_linksUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x24, 0xd6, 0x1d, 0xa, 0x83, 0x1e, 0x4d, 0xf, 0xae, 0x4d, 0x8c, 0x51, 0x32, 0xa8, 0x37, 0xb0, 0x14, 0xfb, 0x32, 0x34, 0xc8, 0xc, 0x4e, 0x5b, 0xc5, 0x15, 0x65, 0x73, 0x0, 0x0, 0x1d}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x24, 0xd6, 0x1d, 0xa, 0x83, 0x1e, 0x4d, 0xf, 0xae, 0x4d, 0x8c, 0x51, 0x32, 0xa8, 0x37, 0xb0, 0x14, 0xfb, 0x32, 0x34, 0xc8, 0xc, 0x4e, 0x5b, 0xc5, 0x15, 0x65, 0x73, 0x0, 0x0, 0x1d}}
return a, nil return a, nil
} }
@ -546,7 +547,7 @@ func _1603888149_create_chat_identity_last_published_tableUpSql() (*asset, error
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9, 0xf, 0xfb, 0xdb, 0x3c, 0x86, 0x70, 0x82, 0xda, 0x10, 0x25, 0xe2, 0x4e, 0x40, 0x45, 0xab, 0x8b, 0x1c, 0x91, 0x7c, 0xf1, 0x70, 0x2e, 0x81, 0xf3, 0x71, 0x45, 0xda, 0xe2, 0xa4, 0x57}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9, 0xf, 0xfb, 0xdb, 0x3c, 0x86, 0x70, 0x82, 0xda, 0x10, 0x25, 0xe2, 0x4e, 0x40, 0x45, 0xab, 0x8b, 0x1c, 0x91, 0x7c, 0xf1, 0x70, 0x2e, 0x81, 0xf3, 0x71, 0x45, 0xda, 0xe2, 0xa4, 0x57}}
return a, nil return a, nil
} }
@ -566,7 +567,7 @@ func _1605075346_add_communitiesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x64, 0xea, 0xb4, 0xae, 0x9e, 0xdb, 0x9, 0x58, 0xb6, 0x5c, 0x7a, 0x50, 0xc5, 0xfe, 0x93, 0x5d, 0x36, 0x85, 0x5d, 0x6a, 0xba, 0xc9, 0x7e, 0x84, 0xd7, 0xbf, 0x2a, 0x53, 0xf3, 0x97, 0xf1}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x64, 0xea, 0xb4, 0xae, 0x9e, 0xdb, 0x9, 0x58, 0xb6, 0x5c, 0x7a, 0x50, 0xc5, 0xfe, 0x93, 0x5d, 0x36, 0x85, 0x5d, 0x6a, 0xba, 0xc9, 0x7e, 0x84, 0xd7, 0xbf, 0x2a, 0x53, 0xf3, 0x97, 0xf1}}
return a, nil return a, nil
} }
@ -586,7 +587,7 @@ func _1610117927_add_message_cacheUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xf1, 0xf0, 0x82, 0x79, 0x28, 0x19, 0xc2, 0x39, 0x6a, 0xa5, 0x96, 0x59, 0x23, 0xa0, 0xed, 0x60, 0x58, 0x86, 0x9, 0xb9, 0xad, 0xfb, 0xa, 0xe3, 0x47, 0x6e, 0xa1, 0x18, 0xe8, 0x39, 0x2c}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xf1, 0xf0, 0x82, 0x79, 0x28, 0x19, 0xc2, 0x39, 0x6a, 0xa5, 0x96, 0x59, 0x23, 0xa0, 0xed, 0x60, 0x58, 0x86, 0x9, 0xb9, 0xad, 0xfb, 0xa, 0xe3, 0x47, 0x6e, 0xa1, 0x18, 0xe8, 0x39, 0x2c}}
return a, nil return a, nil
} }
@ -606,7 +607,7 @@ func _1610959908_add_dont_wrap_to_raw_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0x2, 0x9a, 0xca, 0xd4, 0x38, 0x44, 0x30, 0x2b, 0xa8, 0x27, 0x32, 0x63, 0x53, 0x22, 0x60, 0x59, 0x84, 0x23, 0x96, 0x77, 0xf0, 0x56, 0xd7, 0x94, 0xe0, 0x95, 0x28, 0x6, 0x1d, 0x4e, 0xb1}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0x2, 0x9a, 0xca, 0xd4, 0x38, 0x44, 0x30, 0x2b, 0xa8, 0x27, 0x32, 0x63, 0x53, 0x22, 0x60, 0x59, 0x84, 0x23, 0x96, 0x77, 0xf0, 0x56, 0xd7, 0x94, 0xe0, 0x95, 0x28, 0x6, 0x1d, 0x4e, 0xb1}}
return a, nil return a, nil
} }
@ -626,7 +627,7 @@ func _1610960912_add_send_on_personal_topicUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0x2f, 0xc4, 0xd, 0xa7, 0x1b, 0x37, 0x30, 0xc2, 0x68, 0xee, 0xde, 0x54, 0x5e, 0xbf, 0x3f, 0xa0, 0xd6, 0xc6, 0x9f, 0xd4, 0x34, 0x12, 0x76, 0x1e, 0x66, 0x4a, 0xfc, 0xf, 0xee, 0xc9}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0x2f, 0xc4, 0xd, 0xa7, 0x1b, 0x37, 0x30, 0xc2, 0x68, 0xee, 0xde, 0x54, 0x5e, 0xbf, 0x3f, 0xa0, 0xd6, 0xc6, 0x9f, 0xd4, 0x34, 0x12, 0x76, 0x1e, 0x66, 0x4a, 0xfc, 0xf, 0xee, 0xc9}}
return a, nil return a, nil
} }
@ -646,7 +647,7 @@ func _1612870480_add_datasync_idUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x9a, 0xbc, 0xfa, 0xaa, 0x8c, 0x9c, 0x37, 0x67, 0x15, 0x9c, 0x7e, 0x78, 0x75, 0x66, 0x82, 0x18, 0x72, 0x10, 0xbc, 0xd4, 0xab, 0x44, 0xfe, 0x57, 0x85, 0x6d, 0x19, 0xf5, 0x96, 0x8a, 0xbe}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x9a, 0xbc, 0xfa, 0xaa, 0x8c, 0x9c, 0x37, 0x67, 0x15, 0x9c, 0x7e, 0x78, 0x75, 0x66, 0x82, 0x18, 0x72, 0x10, 0xbc, 0xd4, 0xab, 0x44, 0xfe, 0x57, 0x85, 0x6d, 0x19, 0xf5, 0x96, 0x8a, 0xbe}}
return a, nil return a, nil
} }
@ -666,7 +667,7 @@ func _1614152139_add_communities_request_to_joinUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0x3, 0x26, 0xf9, 0x29, 0x50, 0x4f, 0xcd, 0x46, 0xe5, 0xb1, 0x6b, 0xb9, 0x2, 0x40, 0xb1, 0xdf, 0x4a, 0x4c, 0x7a, 0xda, 0x3, 0x35, 0xcd, 0x2d, 0xcc, 0x80, 0x7d, 0x57, 0x5f, 0x3, 0x5c}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0x3, 0x26, 0xf9, 0x29, 0x50, 0x4f, 0xcd, 0x46, 0xe5, 0xb1, 0x6b, 0xb9, 0x2, 0x40, 0xb1, 0xdf, 0x4a, 0x4c, 0x7a, 0xda, 0x3, 0x35, 0xcd, 0x2d, 0xcc, 0x80, 0x7d, 0x57, 0x5f, 0x3, 0x5c}}
return a, nil return a, nil
} }
@ -686,7 +687,7 @@ func _1615374373_add_confirmationsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdd, 0xa6, 0x65, 0xc5, 0x1d, 0xb2, 0x77, 0x36, 0xe3, 0x79, 0xda, 0xe8, 0x7a, 0xa4, 0xdf, 0x45, 0xae, 0xd8, 0xb4, 0xba, 0x90, 0xfd, 0x74, 0x71, 0x14, 0x75, 0x73, 0x72, 0xb9, 0x9e, 0x1, 0x81}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdd, 0xa6, 0x65, 0xc5, 0x1d, 0xb2, 0x77, 0x36, 0xe3, 0x79, 0xda, 0xe8, 0x7a, 0xa4, 0xdf, 0x45, 0xae, 0xd8, 0xb4, 0xba, 0x90, 0xfd, 0x74, 0x71, 0x14, 0x75, 0x73, 0x72, 0xb9, 0x9e, 0x1, 0x81}}
return a, nil return a, nil
} }
@ -706,7 +707,7 @@ func _1617694931_add_notification_centerUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x45, 0xc6, 0xc9, 0x73, 0xbb, 0x1f, 0xda, 0xa3, 0x4d, 0x19, 0x98, 0x85, 0x2d, 0xca, 0xda, 0xcc, 0x3b, 0x32, 0xff, 0xc7, 0x7b, 0xe3, 0x9f, 0x9b, 0x2a, 0x93, 0xf5, 0xdf, 0x65, 0x38, 0x91}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x45, 0xc6, 0xc9, 0x73, 0xbb, 0x1f, 0xda, 0xa3, 0x4d, 0x19, 0x98, 0x85, 0x2d, 0xca, 0xda, 0xcc, 0x3b, 0x32, 0xff, 0xc7, 0x7b, 0xe3, 0x9f, 0x9b, 0x2a, 0x93, 0xf5, 0xdf, 0x65, 0x38, 0x91}}
return a, nil return a, nil
} }
@ -726,7 +727,7 @@ func _1618923660_create_pin_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x44, 0x3a, 0xbe, 0x30, 0xd2, 0x7e, 0xc0, 0xe2, 0x8e, 0x65, 0x53, 0x54, 0xbb, 0x7a, 0x1c, 0xb3, 0x5d, 0xd2, 0xa6, 0xa9, 0x28, 0xb7, 0xa4, 0x5f, 0x8b, 0x9, 0x5f, 0x17, 0xc1, 0x85, 0x21}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x44, 0x3a, 0xbe, 0x30, 0xd2, 0x7e, 0xc0, 0xe2, 0x8e, 0x65, 0x53, 0x54, 0xbb, 0x7a, 0x1c, 0xb3, 0x5d, 0xd2, 0xa6, 0xa9, 0x28, 0xb7, 0xa4, 0x5f, 0x8b, 0x9, 0x5f, 0x17, 0xc1, 0x85, 0x21}}
return a, nil return a, nil
} }
@ -746,7 +747,7 @@ func _1619094007_add_joined_chat_fieldUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x30, 0x81, 0x3a, 0x2f, 0x9f, 0xb3, 0x0, 0x55, 0x8e, 0x1d, 0xa8, 0xb0, 0x68, 0xf0, 0x40, 0x1a, 0x6c, 0xaa, 0xfc, 0x33, 0xd1, 0xd1, 0x55, 0x3f, 0xf2, 0xbd, 0x54, 0xa1, 0x2b, 0x40, 0x95}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x30, 0x81, 0x3a, 0x2f, 0x9f, 0xb3, 0x0, 0x55, 0x8e, 0x1d, 0xa8, 0xb0, 0x68, 0xf0, 0x40, 0x1a, 0x6c, 0xaa, 0xfc, 0x33, 0xd1, 0xd1, 0x55, 0x3f, 0xf2, 0xbd, 0x54, 0xa1, 0x2b, 0x40, 0x95}}
return a, nil return a, nil
} }
@ -766,7 +767,7 @@ func _1619099821_add_last_synced_fieldUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x52, 0x22, 0xe, 0x2f, 0xd7, 0x93, 0x5f, 0x42, 0xc2, 0x93, 0x4, 0x35, 0x6f, 0xc9, 0x19, 0xed, 0x6b, 0x52, 0x6f, 0xae, 0x99, 0xe2, 0x68, 0x3d, 0x4f, 0x40, 0xe, 0xe1, 0xa, 0x47, 0x21}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x52, 0x22, 0xe, 0x2f, 0xd7, 0x93, 0x5f, 0x42, 0xc2, 0x93, 0x4, 0x35, 0x6f, 0xc9, 0x19, 0xed, 0x6b, 0x52, 0x6f, 0xae, 0x99, 0xe2, 0x68, 0x3d, 0x4f, 0x40, 0xe, 0xe1, 0xa, 0x47, 0x21}}
return a, nil return a, nil
} }
@ -786,7 +787,7 @@ func _1621933219_add_mentionedUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x76, 0x8a, 0xc9, 0x7, 0x8f, 0xa5, 0xcb, 0x12, 0x21, 0x4e, 0xfe, 0x96, 0x77, 0xcf, 0x7f, 0x76, 0x75, 0x36, 0x2c, 0xf8, 0x1d, 0x13, 0xcb, 0xcd, 0x6e, 0x70, 0xbf, 0xf5, 0x93, 0x67, 0xd1}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x76, 0x8a, 0xc9, 0x7, 0x8f, 0xa5, 0xcb, 0x12, 0x21, 0x4e, 0xfe, 0x96, 0x77, 0xcf, 0x7f, 0x76, 0x75, 0x36, 0x2c, 0xf8, 0x1d, 0x13, 0xcb, 0xcd, 0x6e, 0x70, 0xbf, 0xf5, 0x93, 0x67, 0xd1}}
return a, nil return a, nil
} }
@ -806,7 +807,7 @@ func _1622010048_add_unviewed_mentions_countUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7c, 0x16, 0x85, 0xa6, 0x5b, 0xe1, 0x66, 0xb9, 0x84, 0xbe, 0x7f, 0xa, 0x77, 0x23, 0xb9, 0xef, 0x8e, 0x2, 0x8, 0xfc, 0x61, 0xb2, 0x43, 0xa9, 0x63, 0xae, 0xb4, 0xdf, 0x30, 0xb1, 0x61, 0x4b}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7c, 0x16, 0x85, 0xa6, 0x5b, 0xe1, 0x66, 0xb9, 0x84, 0xbe, 0x7f, 0xa, 0x77, 0x23, 0xb9, 0xef, 0x8e, 0x2, 0x8, 0xfc, 0x61, 0xb2, 0x43, 0xa9, 0x63, 0xae, 0xb4, 0xdf, 0x30, 0xb1, 0x61, 0x4b}}
return a, nil return a, nil
} }
@ -826,7 +827,7 @@ func _1622061278_add_message_activity_center_notification_fieldUpSql() (*asset,
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0xc, 0xa6, 0x1f, 0xa5, 0xc6, 0x7c, 0x6f, 0xab, 0x2c, 0x2d, 0xb5, 0xa4, 0xdd, 0xc1, 0xd6, 0x44, 0x83, 0xf9, 0xb1, 0xa5, 0xce, 0x34, 0x3d, 0x2, 0xa9, 0x35, 0xcf, 0xc6, 0xb2, 0x43, 0x37}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0xc, 0xa6, 0x1f, 0xa5, 0xc6, 0x7c, 0x6f, 0xab, 0x2c, 0x2d, 0xb5, 0xa4, 0xdd, 0xc1, 0xd6, 0x44, 0x83, 0xf9, 0xb1, 0xa5, 0xce, 0x34, 0x3d, 0x2, 0xa9, 0x35, 0xcf, 0xc6, 0xb2, 0x43, 0x37}}
return a, nil return a, nil
} }
@ -846,7 +847,7 @@ func _1622464518_set_synced_to_fromUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x33, 0x3e, 0x2b, 0xa, 0x1e, 0xc7, 0x6d, 0x6f, 0xd1, 0x1d, 0xe8, 0x4b, 0xdd, 0x92, 0x76, 0xea, 0xf2, 0x3e, 0x15, 0x85, 0xc4, 0xc3, 0x31, 0xf1, 0xc0, 0xa2, 0xd7, 0x47, 0xde, 0x4e, 0xfd, 0xc6}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x33, 0x3e, 0x2b, 0xa, 0x1e, 0xc7, 0x6d, 0x6f, 0xd1, 0x1d, 0xe8, 0x4b, 0xdd, 0x92, 0x76, 0xea, 0xf2, 0x3e, 0x15, 0x85, 0xc4, 0xc3, 0x31, 0xf1, 0xc0, 0xa2, 0xd7, 0x47, 0xde, 0x4e, 0xfd, 0xc6}}
return a, nil return a, nil
} }
@ -866,7 +867,7 @@ func _1622464519_add_chat_descriptionUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x2e, 0x89, 0x31, 0xec, 0xef, 0xeb, 0x43, 0xf5, 0x96, 0x6d, 0xce, 0x91, 0x8a, 0x37, 0x2a, 0x11, 0x7a, 0x3f, 0xd9, 0x10, 0xbb, 0xa1, 0xbc, 0x7, 0xe0, 0x3b, 0xa5, 0xf4, 0xa6, 0xf4, 0xa1}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x2e, 0x89, 0x31, 0xec, 0xef, 0xeb, 0x43, 0xf5, 0x96, 0x6d, 0xce, 0x91, 0x8a, 0x37, 0x2a, 0x11, 0x7a, 0x3f, 0xd9, 0x10, 0xbb, 0xa1, 0xbc, 0x7, 0xe0, 0x3b, 0xa5, 0xf4, 0xa6, 0xf4, 0xa1}}
return a, nil return a, nil
} }
@ -886,7 +887,7 @@ func _1622622253_add_pinned_by_to_pin_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9b, 0x94, 0xa3, 0x45, 0x91, 0x1e, 0x66, 0xd1, 0x96, 0x5a, 0xaf, 0xfa, 0x29, 0x39, 0xa8, 0x3a, 0x97, 0x4c, 0x65, 0x6, 0x96, 0x90, 0x4c, 0xfe, 0xce, 0x7d, 0x5d, 0xd4, 0xb3, 0x8, 0x6d, 0x5f}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9b, 0x94, 0xa3, 0x45, 0x91, 0x1e, 0x66, 0xd1, 0x96, 0x5a, 0xaf, 0xfa, 0x29, 0x39, 0xa8, 0x3a, 0x97, 0x4c, 0x65, 0x6, 0x96, 0x90, 0x4c, 0xfe, 0xce, 0x7d, 0x5d, 0xd4, 0xb3, 0x8, 0x6d, 0x5f}}
return a, nil return a, nil
} }
@ -906,7 +907,7 @@ func _1623938329_add_author_activity_center_notification_fieldUpSql() (*asset, e
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0xe6, 0xa7, 0xd5, 0x26, 0xff, 0xab, 0x92, 0x88, 0xf0, 0xd3, 0x34, 0xd9, 0x2f, 0xe7, 0x18, 0x1a, 0x40, 0xf9, 0xbe, 0x8e, 0xfc, 0xd0, 0x4f, 0x1f, 0x4a, 0xb9, 0x83, 0x3f, 0xa9, 0xde, 0xb}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0xe6, 0xa7, 0xd5, 0x26, 0xff, 0xab, 0x92, 0x88, 0xf0, 0xd3, 0x34, 0xd9, 0x2f, 0xe7, 0x18, 0x1a, 0x40, 0xf9, 0xbe, 0x8e, 0xfc, 0xd0, 0x4f, 0x1f, 0x4a, 0xb9, 0x83, 0x3f, 0xa9, 0xde, 0xb}}
return a, nil return a, nil
} }
@ -926,7 +927,7 @@ func _1623938330_add_edit_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xd2, 0xce, 0xe, 0x5c, 0x19, 0xbe, 0x5e, 0x29, 0xbe, 0x9b, 0x31, 0x53, 0x76, 0xb2, 0xc8, 0x56, 0xf0, 0x82, 0xfe, 0x7d, 0x6c, 0xe8, 0x5c, 0xe9, 0x7a, 0x5d, 0x5, 0xc4, 0x92, 0x38, 0xe3}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xd2, 0xce, 0xe, 0x5c, 0x19, 0xbe, 0x5e, 0x29, 0xbe, 0x9b, 0x31, 0x53, 0x76, 0xb2, 0xc8, 0x56, 0xf0, 0x82, 0xfe, 0x7d, 0x6c, 0xe8, 0x5c, 0xe9, 0x7a, 0x5d, 0x5, 0xc4, 0x92, 0x38, 0xe3}}
return a, nil return a, nil
} }
@ -946,7 +947,7 @@ func _1624978434_add_muted_communityUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0xdc, 0x6e, 0x6f, 0x97, 0xc7, 0x3d, 0x50, 0xab, 0x80, 0x87, 0x44, 0x43, 0x38, 0xe6, 0xc5, 0xc1, 0x91, 0x26, 0xf, 0x16, 0xe, 0xd9, 0x32, 0x37, 0x25, 0x96, 0x25, 0x6, 0xc8, 0xb5, 0x4a}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0xdc, 0x6e, 0x6f, 0x97, 0xc7, 0x3d, 0x50, 0xab, 0x80, 0x87, 0x44, 0x43, 0x38, 0xe6, 0xc5, 0xc1, 0x91, 0x26, 0xf, 0x16, 0xe, 0xd9, 0x32, 0x37, 0x25, 0x96, 0x25, 0x6, 0xc8, 0xb5, 0x4a}}
return a, nil return a, nil
} }
@ -966,7 +967,7 @@ func _1625018910_add_repply_message_activity_center_notification_fieldUpSql() (*
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x52, 0x12, 0x40, 0xd8, 0x6f, 0x71, 0x97, 0x46, 0x39, 0xaa, 0x74, 0x41, 0xcd, 0x45, 0x4c, 0xe8, 0xd9, 0xe2, 0x56, 0x8e, 0x78, 0x18, 0x62, 0xf6, 0xa8, 0x36, 0xe9, 0x9a, 0x1f, 0xc, 0xb1}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x52, 0x12, 0x40, 0xd8, 0x6f, 0x71, 0x97, 0x46, 0x39, 0xaa, 0x74, 0x41, 0xcd, 0x45, 0x4c, 0xe8, 0xd9, 0xe2, 0x56, 0x8e, 0x78, 0x18, 0x62, 0xf6, 0xa8, 0x36, 0xe9, 0x9a, 0x1f, 0xc, 0xb1}}
return a, nil return a, nil
} }
@ -986,7 +987,7 @@ func _1625762506_add_deleted_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x61, 0x42, 0xb6, 0x8c, 0x7f, 0x2d, 0xec, 0xa9, 0x6d, 0x3d, 0x0, 0xa3, 0x32, 0xd8, 0x4a, 0x38, 0x5c, 0x97, 0xfc, 0x68, 0xde, 0xa9, 0xb7, 0xd8, 0xde, 0xb, 0x29, 0x93, 0xdc, 0x81, 0xf8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x61, 0x42, 0xb6, 0x8c, 0x7f, 0x2d, 0xec, 0xa9, 0x6d, 0x3d, 0x0, 0xa3, 0x32, 0xd8, 0x4a, 0x38, 0x5c, 0x97, 0xfc, 0x68, 0xde, 0xa9, 0xb7, 0xd8, 0xde, 0xb, 0x29, 0x93, 0xdc, 0x81, 0xf8}}
return a, nil return a, nil
} }
@ -1006,7 +1007,7 @@ func _1627388946_add_communities_synced_atUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xbd, 0x9b, 0x6a, 0xc9, 0x1a, 0x7a, 0x34, 0xcf, 0x5f, 0x80, 0x9e, 0x8c, 0x1c, 0xc0, 0xec, 0x4e, 0x78, 0xb0, 0x2d, 0x15, 0x77, 0x38, 0x4a, 0x6a, 0x5, 0x84, 0xf5, 0x8d, 0x8b, 0xbe, 0x9}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xbd, 0x9b, 0x6a, 0xc9, 0x1a, 0x7a, 0x34, 0xcf, 0x5f, 0x80, 0x9e, 0x8c, 0x1c, 0xc0, 0xec, 0x4e, 0x78, 0xb0, 0x2d, 0x15, 0x77, 0x38, 0x4a, 0x6a, 0x5, 0x84, 0xf5, 0x8d, 0x8b, 0xbe, 0x9}}
return a, nil return a, nil
} }
@ -1026,7 +1027,7 @@ func _1628280060_createUsermessagesIndexSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x6f, 0x70, 0x47, 0x40, 0xab, 0xa8, 0x60, 0xe0, 0xf9, 0x8, 0x7e, 0x19, 0x9d, 0xba, 0x33, 0x16, 0xfc, 0x3c, 0xdc, 0xa8, 0xa6, 0x53, 0x61, 0x39, 0x82, 0x91, 0xcf, 0x69, 0xd8, 0xf2, 0xcf}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x6f, 0x70, 0x47, 0x40, 0xab, 0xa8, 0x60, 0xe0, 0xf9, 0x8, 0x7e, 0x19, 0x9d, 0xba, 0x33, 0x16, 0xfc, 0x3c, 0xdc, 0xa8, 0xa6, 0x53, 0x61, 0x39, 0x82, 0x91, 0xcf, 0x69, 0xd8, 0xf2, 0xcf}}
return a, nil return a, nil
} }
@ -1046,7 +1047,7 @@ func _1632303896_modify_contacts_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0x6c, 0x3c, 0xd, 0xd7, 0x7d, 0xbb, 0x19, 0xbc, 0xe4, 0x7, 0xfd, 0xf8, 0x66, 0x6d, 0x78, 0xf6, 0x4, 0xe6, 0x51, 0xe4, 0xe6, 0xdc, 0xe, 0x5a, 0x2e, 0xac, 0xe6, 0xe7, 0x24, 0x69}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0x6c, 0x3c, 0xd, 0xd7, 0x7d, 0xbb, 0x19, 0xbc, 0xe4, 0x7, 0xfd, 0xf8, 0x66, 0x6d, 0x78, 0xf6, 0x4, 0xe6, 0x51, 0xe4, 0xe6, 0xdc, 0xe, 0x5a, 0x2e, 0xac, 0xe6, 0xe7, 0x24, 0x69}}
return a, nil return a, nil
} }
@ -1066,7 +1067,7 @@ func _1633349838_add_emoji_column_in_chatsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x33, 0xcb, 0x3b, 0xa9, 0x99, 0x77, 0x6a, 0xea, 0xc4, 0x39, 0xd7, 0xa1, 0x49, 0xa7, 0xdf, 0xff, 0x72, 0xda, 0x34, 0x21, 0x67, 0x66, 0xca, 0x65, 0x46, 0x1, 0xa6, 0x4e, 0xf9, 0x38, 0x86}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x33, 0xcb, 0x3b, 0xa9, 0x99, 0x77, 0x6a, 0xea, 0xc4, 0x39, 0xd7, 0xa1, 0x49, 0xa7, 0xdf, 0xff, 0x72, 0xda, 0x34, 0x21, 0x67, 0x66, 0xca, 0x65, 0x46, 0x1, 0xa6, 0x4e, 0xf9, 0x38, 0x86}}
return a, nil return a, nil
} }
@ -1086,7 +1087,7 @@ func _1634831235_add_highlight_column_in_chatsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0x63, 0x5c, 0x73, 0x19, 0x83, 0xbd, 0x35, 0x80, 0x9f, 0x66, 0xec, 0x4c, 0xbc, 0x9d, 0x2d, 0x52, 0x91, 0x6d, 0xb3, 0x2b, 0x87, 0xde, 0x24, 0x46, 0x5c, 0xd, 0xfd, 0x78, 0xf5, 0xe3, 0xe9}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0x63, 0x5c, 0x73, 0x19, 0x83, 0xbd, 0x35, 0x80, 0x9f, 0x66, 0xec, 0x4c, 0xbc, 0x9d, 0x2d, 0x52, 0x91, 0x6d, 0xb3, 0x2b, 0x87, 0xde, 0x24, 0x46, 0x5c, 0xd, 0xfd, 0x78, 0xf5, 0xe3, 0xe9}}
return a, nil return a, nil
} }
@ -1106,7 +1107,7 @@ func _1634896007_add_last_updated_locally_and_removedUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0xa8, 0x34, 0xe2, 0xc0, 0x62, 0xc8, 0xd6, 0x5a, 0x87, 0xe3, 0x70, 0xe1, 0xc4, 0x16, 0x9c, 0x60, 0x2e, 0x98, 0xf0, 0x91, 0x84, 0xbe, 0xe0, 0xdf, 0x3e, 0x4d, 0x24, 0xc4, 0x6c, 0x40, 0x17}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0xa8, 0x34, 0xe2, 0xc0, 0x62, 0xc8, 0xd6, 0x5a, 0x87, 0xe3, 0x70, 0xe1, 0xc4, 0x16, 0x9c, 0x60, 0x2e, 0x98, 0xf0, 0x91, 0x84, 0xbe, 0xe0, 0xdf, 0x3e, 0x4d, 0x24, 0xc4, 0x6c, 0x40, 0x17}}
return a, nil return a, nil
} }
@ -1126,7 +1127,7 @@ func _1635840039_add_clock_read_at_column_in_chatsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6c, 0xba, 0x3f, 0xba, 0x1a, 0x71, 0xa8, 0x9, 0x19, 0xbe, 0x1e, 0x38, 0x50, 0x30, 0x3a, 0x52, 0x15, 0x29, 0xee, 0x49, 0x19, 0x6f, 0x53, 0xc2, 0xc6, 0x6c, 0xd9, 0x80, 0x7e, 0xb9, 0x58, 0x7a}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6c, 0xba, 0x3f, 0xba, 0x1a, 0x71, 0xa8, 0x9, 0x19, 0xbe, 0x1e, 0x38, 0x50, 0x30, 0x3a, 0x52, 0x15, 0x29, 0xee, 0x49, 0x19, 0x6f, 0x53, 0xc2, 0xc6, 0x6c, 0xd9, 0x80, 0x7e, 0xb9, 0x58, 0x7a}}
return a, nil return a, nil
} }
@ -1146,7 +1147,7 @@ func _1637852321_add_received_invitation_admin_column_in_chatsUpSql() (*asset, e
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0x8b, 0x92, 0x56, 0x83, 0x70, 0x7f, 0x6, 0xb2, 0xd, 0x1c, 0x2f, 0xcc, 0x93, 0xc3, 0x85, 0x8c, 0xc2, 0x38, 0x94, 0x7e, 0x88, 0x3f, 0x39, 0x34, 0xf8, 0x90, 0xcf, 0x83, 0x68, 0x3d, 0xe5}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0x8b, 0x92, 0x56, 0x83, 0x70, 0x7f, 0x6, 0xb2, 0xd, 0x1c, 0x2f, 0xcc, 0x93, 0xc3, 0x85, 0x8c, 0xc2, 0x38, 0x94, 0x7e, 0x88, 0x3f, 0x39, 0x34, 0xf8, 0x90, 0xcf, 0x83, 0x68, 0x3d, 0xe5}}
return a, nil return a, nil
} }
@ -1166,7 +1167,7 @@ func _1645034601_display_nameUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0xfc, 0xda, 0x70, 0x53, 0x19, 0x90, 0x20, 0x4, 0x1c, 0x99, 0x42, 0x53, 0x1a, 0xd6, 0xb8, 0xbb, 0x8a, 0xe8, 0xbe, 0xcc, 0xb7, 0xc, 0x7f, 0x73, 0x50, 0x18, 0xf1, 0x8b, 0x18, 0x54, 0x64}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0xfc, 0xda, 0x70, 0x53, 0x19, 0x90, 0x20, 0x4, 0x1c, 0x99, 0x42, 0x53, 0x1a, 0xd6, 0xb8, 0xbb, 0x8a, 0xe8, 0xbe, 0xcc, 0xb7, 0xc, 0x7f, 0x73, 0x50, 0x18, 0xf1, 0x8b, 0x18, 0x54, 0x64}}
return a, nil return a, nil
} }
@ -1186,7 +1187,7 @@ func _1645034602_add_mutual_contact_requestUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xe0, 0x5d, 0x68, 0xb8, 0x50, 0xa4, 0xbb, 0x3e, 0x4f, 0x2, 0x87, 0xad, 0x87, 0x6e, 0x38, 0xdf, 0xc8, 0x4c, 0xe2, 0x5f, 0xd1, 0x6, 0xdc, 0xe7, 0xbd, 0x4a, 0x9c, 0xf3, 0x91, 0xa1, 0x51}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xe0, 0x5d, 0x68, 0xb8, 0x50, 0xa4, 0xbb, 0x3e, 0x4f, 0x2, 0x87, 0xad, 0x87, 0x6e, 0x38, 0xdf, 0xc8, 0x4c, 0xe2, 0x5f, 0xd1, 0x6, 0xdc, 0xe7, 0xbd, 0x4a, 0x9c, 0xf3, 0x91, 0xa1, 0x51}}
return a, nil return a, nil
} }
@ -1206,7 +1207,7 @@ func _1650373957_add_contact_request_stateUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xc1, 0x3f, 0x29, 0xe, 0x19, 0x86, 0x1a, 0x4c, 0x6c, 0x2a, 0x90, 0x9d, 0xdf, 0xb1, 0xb, 0x72, 0x25, 0xcd, 0x6c, 0x5f, 0xd, 0x51, 0x9e, 0x85, 0xc0, 0x9, 0xb7, 0xbc, 0x87, 0x23, 0xec}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xc1, 0x3f, 0x29, 0xe, 0x19, 0x86, 0x1a, 0x4c, 0x6c, 0x2a, 0x90, 0x9d, 0xdf, 0xb1, 0xb, 0x72, 0x25, 0xcd, 0x6c, 0x5f, 0xd, 0x51, 0x9e, 0x85, 0xc0, 0x9, 0xb7, 0xbc, 0x87, 0x23, 0xec}}
return a, nil return a, nil
} }
@ -1226,7 +1227,7 @@ func _1656958989_contact_verificationUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x3f, 0x28, 0x38, 0x33, 0xdb, 0xe9, 0x4d, 0xc0, 0x54, 0x8c, 0x2a, 0x73, 0xc4, 0xdd, 0x5c, 0xc5, 0x1a, 0x93, 0x4b, 0x6, 0x13, 0xbe, 0x42, 0xd2, 0x7f, 0xd4, 0xc, 0xc5, 0x4e, 0x6d, 0xce}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x3f, 0x28, 0x38, 0x33, 0xdb, 0xe9, 0x4d, 0xc0, 0x54, 0x8c, 0x2a, 0x73, 0xc4, 0xdd, 0x5c, 0xc5, 0x1a, 0x93, 0x4b, 0x6, 0x13, 0xbe, 0x42, 0xd2, 0x7f, 0xd4, 0xc, 0xc5, 0x4e, 0x6d, 0xce}}
return a, nil return a, nil
} }
@ -1246,7 +1247,7 @@ func _1658236268_add_discord_message_authors_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0xb7, 0xdb, 0x79, 0x1, 0x15, 0xe7, 0x76, 0x5d, 0x22, 0x54, 0x82, 0x9a, 0xbe, 0x24, 0xc1, 0x82, 0xcf, 0x67, 0x91, 0x53, 0xcc, 0xac, 0x74, 0x18, 0x61, 0x69, 0x68, 0x19, 0xca, 0x2b, 0xa8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0xb7, 0xdb, 0x79, 0x1, 0x15, 0xe7, 0x76, 0x5d, 0x22, 0x54, 0x82, 0x9a, 0xbe, 0x24, 0xc1, 0x82, 0xcf, 0x67, 0x91, 0x53, 0xcc, 0xac, 0x74, 0x18, 0x61, 0x69, 0x68, 0x19, 0xca, 0x2b, 0xa8}}
return a, nil return a, nil
} }
@ -1266,7 +1267,7 @@ func _1659619997_add_discord_messages_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x12, 0x9c, 0x96, 0xe2, 0x42, 0x3f, 0x94, 0x62, 0xc2, 0x76, 0xab, 0x3b, 0x4c, 0x85, 0x36, 0x48, 0xcc, 0x73, 0x60, 0x93, 0x5a, 0xd6, 0x7, 0xd6, 0x0, 0xee, 0x1b, 0x1e, 0x34, 0x58, 0x99}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x12, 0x9c, 0x96, 0xe2, 0x42, 0x3f, 0x94, 0x62, 0xc2, 0x76, 0xab, 0x3b, 0x4c, 0x85, 0x36, 0x48, 0xcc, 0x73, 0x60, 0x93, 0x5a, 0xd6, 0x7, 0xd6, 0x0, 0xee, 0x1b, 0x1e, 0x34, 0x58, 0x99}}
return a, nil return a, nil
} }
@ -1286,7 +1287,7 @@ func _1660226788_create_chat_identity_social_linksUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0x76, 0x40, 0xe9, 0x85, 0xc4, 0x38, 0xf8, 0xe5, 0x5d, 0xe8, 0x13, 0x46, 0x1b, 0xc, 0x1, 0xe9, 0x2f, 0x74, 0xd1, 0x79, 0x59, 0xa4, 0xdb, 0x4a, 0x4a, 0xf4, 0x98, 0x58, 0x3c, 0x57, 0xd3}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0x76, 0x40, 0xe9, 0x85, 0xc4, 0x38, 0xf8, 0xe5, 0x5d, 0xe8, 0x13, 0x46, 0x1b, 0xc, 0x1, 0xe9, 0x2f, 0x74, 0xd1, 0x79, 0x59, 0xa4, 0xdb, 0x4a, 0x4a, 0xf4, 0x98, 0x58, 0x3c, 0x57, 0xd3}}
return a, nil return a, nil
} }
@ -1306,7 +1307,7 @@ func _1660226789_add_walletconnectsessions_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x5c, 0x72, 0x2, 0xed, 0x36, 0x19, 0x91, 0x4d, 0x1a, 0xc1, 0xab, 0x84, 0xfa, 0x41, 0xb1, 0x46, 0xa5, 0xdb, 0x3f, 0x76, 0x47, 0xd3, 0x75, 0x3c, 0x6a, 0x8e, 0x78, 0xe6, 0x41, 0xdc, 0x7f}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x5c, 0x72, 0x2, 0xed, 0x36, 0x19, 0x91, 0x4d, 0x1a, 0xc1, 0xab, 0x84, 0xfa, 0x41, 0xb1, 0x46, 0xa5, 0xdb, 0x3f, 0x76, 0x47, 0xd3, 0x75, 0x3c, 0x6a, 0x8e, 0x78, 0xe6, 0x41, 0xdc, 0x7f}}
return a, nil return a, nil
} }
@ -1326,7 +1327,7 @@ func _1661242854_add_communities_requests_to_leaveUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x2e, 0x7d, 0x14, 0xef, 0x6e, 0x95, 0x4b, 0x6, 0x70, 0x2e, 0xd1, 0xf6, 0x59, 0xf9, 0xe, 0x56, 0xa, 0x9c, 0x80, 0x18, 0xca, 0xb9, 0x49, 0x19, 0xf, 0x89, 0x94, 0x36, 0x6d, 0x93, 0x9a}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x2e, 0x7d, 0x14, 0xef, 0x6e, 0x95, 0x4b, 0x6, 0x70, 0x2e, 0xd1, 0xf6, 0x59, 0xf9, 0xe, 0x56, 0xa, 0x9c, 0x80, 0x18, 0xca, 0xb9, 0x49, 0x19, 0xf, 0x89, 0x94, 0x36, 0x6d, 0x93, 0x9a}}
return a, nil return a, nil
} }
@ -1346,7 +1347,7 @@ func _1662044232_add_chat_imageUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x74, 0xdf, 0x50, 0x79, 0x73, 0x9e, 0xd0, 0xff, 0xa4, 0xd3, 0x87, 0xc3, 0x48, 0x31, 0x6c, 0xdf, 0xa6, 0x20, 0x85, 0xe6, 0x4e, 0x19, 0x9d, 0xef, 0xcc, 0x84, 0x2b, 0x5d, 0x44, 0x34, 0x6}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x74, 0xdf, 0x50, 0x79, 0x73, 0x9e, 0xd0, 0xff, 0xa4, 0xd3, 0x87, 0xc3, 0x48, 0x31, 0x6c, 0xdf, 0xa6, 0x20, 0x85, 0xe6, 0x4e, 0x19, 0x9d, 0xef, 0xcc, 0x84, 0x2b, 0x5d, 0x44, 0x34, 0x6}}
return a, nil return a, nil
} }
@ -1366,7 +1367,7 @@ func _1662106895_add_chat_first_message_timestampUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0x55, 0x74, 0xfa, 0xf5, 0x51, 0x85, 0x19, 0xfd, 0xfb, 0x6, 0x79, 0x4d, 0x1d, 0xd, 0x3, 0x46, 0x66, 0x34, 0x1e, 0xce, 0x91, 0x21, 0x29, 0xf6, 0x71, 0xe7, 0x31, 0x39, 0x8f, 0x9d, 0x5}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0x55, 0x74, 0xfa, 0xf5, 0x51, 0x85, 0x19, 0xfd, 0xfb, 0x6, 0x79, 0x4d, 0x1d, 0xd, 0x3, 0x46, 0x66, 0x34, 0x1e, 0xce, 0x91, 0x21, 0x29, 0xf6, 0x71, 0xe7, 0x31, 0x39, 0x8f, 0x9d, 0x5}}
return a, nil return a, nil
} }
@ -1386,7 +1387,7 @@ func _1662723928_add_discord_author_image_fieldsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0x5b, 0x48, 0x57, 0x98, 0x55, 0x9a, 0xf1, 0x75, 0xf7, 0xb5, 0x41, 0x5e, 0x96, 0xc5, 0xce, 0xfc, 0x30, 0x5c, 0x15, 0x35, 0x9e, 0x4e, 0x4a, 0x3b, 0x38, 0x42, 0xc4, 0x27, 0x3c, 0x87, 0xbf}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0x5b, 0x48, 0x57, 0x98, 0x55, 0x9a, 0xf1, 0x75, 0xf7, 0xb5, 0x41, 0x5e, 0x96, 0xc5, 0xce, 0xfc, 0x30, 0x5c, 0x15, 0x35, 0x9e, 0x4e, 0x4a, 0x3b, 0x38, 0x42, 0xc4, 0x27, 0x3c, 0x87, 0xbf}}
return a, nil return a, nil
} }
@ -1406,7 +1407,7 @@ func _1664195977_add_deleted_for_mesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x9d, 0x13, 0x9, 0xaa, 0x44, 0x14, 0x93, 0xe2, 0xf5, 0x53, 0xb7, 0x79, 0xa8, 0x18, 0xf0, 0x6c, 0xa4, 0x9c, 0x73, 0xc1, 0xaa, 0xc5, 0x2e, 0xc5, 0x41, 0xd7, 0x24, 0xb0, 0xd7, 0xb8, 0xdf}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x9d, 0x13, 0x9, 0xaa, 0x44, 0x14, 0x93, 0xe2, 0xf5, 0x53, 0xb7, 0x79, 0xa8, 0x18, 0xf0, 0x6c, 0xa4, 0x9c, 0x73, 0xc1, 0xaa, 0xc5, 0x2e, 0xc5, 0x41, 0xd7, 0x24, 0xb0, 0xd7, 0xb8, 0xdf}}
return a, nil return a, nil
} }
@ -1426,7 +1427,7 @@ func _1664367420_add_discord_attachments_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0xe1, 0xb6, 0x4f, 0x6f, 0x92, 0x0, 0xb4, 0xf, 0x55, 0x12, 0x1c, 0x98, 0x6d, 0xbc, 0x1e, 0xfd, 0xae, 0x1c, 0xce, 0xd1, 0x3d, 0x2, 0x21, 0x2e, 0xc0, 0x13, 0xa, 0xb2, 0xec, 0x81, 0x13}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0xe1, 0xb6, 0x4f, 0x6f, 0x92, 0x0, 0xb4, 0xf, 0x55, 0x12, 0x1c, 0x98, 0x6d, 0xbc, 0x1e, 0xfd, 0xae, 0x1c, 0xce, 0xd1, 0x3d, 0x2, 0x21, 0x2e, 0xc0, 0x13, 0xa, 0xb2, 0xec, 0x81, 0x13}}
return a, nil return a, nil
} }
@ -1446,7 +1447,7 @@ func _1665079662_add_spectated_column_in_communitiesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x5d, 0xfe, 0xe2, 0xbe, 0xdf, 0xba, 0x45, 0xe9, 0xfc, 0xa7, 0x5f, 0xda, 0x19, 0xdb, 0x40, 0x96, 0x59, 0x78, 0xa, 0xd7, 0x4a, 0xca, 0x1a, 0x93, 0xfb, 0xae, 0x6d, 0x74, 0x7, 0x36, 0xdd}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x5d, 0xfe, 0xe2, 0xbe, 0xdf, 0xba, 0x45, 0xe9, 0xfc, 0xa7, 0x5f, 0xda, 0x19, 0xdb, 0x40, 0x96, 0x59, 0x78, 0xa, 0xd7, 0x4a, 0xca, 0x1a, 0x93, 0xfb, 0xae, 0x6d, 0x74, 0x7, 0x36, 0xdd}}
return a, nil return a, nil
} }
@ -1466,7 +1467,7 @@ func _1665479047_add_community_id_in_notificationsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0x8f, 0x8b, 0x1c, 0xaa, 0x6a, 0x56, 0xd6, 0xa5, 0x88, 0x57, 0x13, 0x8f, 0xea, 0xb9, 0x23, 0x82, 0x50, 0xb7, 0x65, 0x1f, 0xab, 0xfa, 0x23, 0x6f, 0x0, 0x7, 0xb6, 0x6e, 0xb5, 0x85, 0x44}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0x8f, 0x8b, 0x1c, 0xaa, 0x6a, 0x56, 0xd6, 0xa5, 0x88, 0x57, 0x13, 0x8f, 0xea, 0xb9, 0x23, 0x82, 0x50, 0xb7, 0x65, 0x1f, 0xab, 0xfa, 0x23, 0x6f, 0x0, 0x7, 0xb6, 0x6e, 0xb5, 0x85, 0x44}}
return a, nil return a, nil
} }
@ -1486,7 +1487,7 @@ func _1665484435_add_encrypted_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x5c, 0x1e, 0x1c, 0x7f, 0xae, 0x5f, 0xeb, 0x3c, 0x6c, 0xcd, 0xc2, 0x99, 0x48, 0x5c, 0x83, 0xa0, 0xa2, 0x97, 0x5, 0x39, 0x82, 0x71, 0x90, 0x47, 0x21, 0x84, 0x29, 0x19, 0xa4, 0x7a, 0x90}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x5c, 0x1e, 0x1c, 0x7f, 0xae, 0x5f, 0xeb, 0x3c, 0x6c, 0xcd, 0xc2, 0x99, 0x48, 0x5c, 0x83, 0xa0, 0xa2, 0x97, 0x5, 0x39, 0x82, 0x71, 0x90, 0x47, 0x21, 0x84, 0x29, 0x19, 0xa4, 0x7a, 0x90}}
return a, nil return a, nil
} }
@ -1506,7 +1507,7 @@ func _1665560200_add_contact_verification_individualUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0xbb, 0x61, 0xfd, 0xbf, 0x33, 0x1d, 0x4e, 0x5f, 0xbd, 0x86, 0x42, 0xb0, 0x6c, 0xf7, 0x39, 0x19, 0x6e, 0x72, 0x35, 0xfd, 0x1b, 0xd6, 0xbd, 0xf6, 0x81, 0x21, 0xc4, 0xaa, 0x6, 0x62, 0x40}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0xbb, 0x61, 0xfd, 0xbf, 0x33, 0x1d, 0x4e, 0x5f, 0xbd, 0x86, 0x42, 0xb0, 0x6c, 0xf7, 0x39, 0x19, 0x6e, 0x72, 0x35, 0xfd, 0x1b, 0xd6, 0xbd, 0xf6, 0x81, 0x21, 0xc4, 0xaa, 0x6, 0x62, 0x40}}
return a, nil return a, nil
} }
@ -1526,7 +1527,7 @@ func _1670921937_add_album_idUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0664), modTime: time.Unix(1671559305, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xae, 0x83, 0x58, 0xb7, 0x77, 0x5, 0xca, 0xe3, 0xda, 0x32, 0x8f, 0x7b, 0xa4, 0x2f, 0x4c, 0xaf, 0x5f, 0xfa, 0x94, 0x36, 0xe4, 0xf9, 0x7, 0xc6, 0xd6, 0xb7, 0x90, 0xf3, 0xe5, 0xb5, 0x3}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xae, 0x83, 0x58, 0xb7, 0x77, 0x5, 0xca, 0xe3, 0xda, 0x32, 0x8f, 0x7b, 0xa4, 0x2f, 0x4c, 0xaf, 0x5f, 0xfa, 0x94, 0x36, 0xe4, 0xf9, 0x7, 0xc6, 0xd6, 0xb7, 0x90, 0xf3, 0xe5, 0xb5, 0x3}}
return a, nil return a, nil
} }
@ -1546,7 +1547,7 @@ func _1673373000_add_repliedUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0664), modTime: time.Unix(1673398499, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x1c, 0xae, 0xf2, 0xf, 0xb4, 0xc2, 0xba, 0x3c, 0xfe, 0x7b, 0xb0, 0xf, 0xf, 0xd5, 0xbc, 0xe2, 0xa7, 0xad, 0x50, 0xd9, 0x5a, 0xe8, 0x96, 0x22, 0x65, 0x89, 0xcf, 0x4a, 0x9a, 0x1b, 0x94}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x1c, 0xae, 0xf2, 0xf, 0xb4, 0xc2, 0xba, 0x3c, 0xfe, 0x7b, 0xb0, 0xf, 0xf, 0xd5, 0xbc, 0xe2, 0xa7, 0xad, 0x50, 0xd9, 0x5a, 0xe8, 0x96, 0x22, 0x65, 0x89, 0xcf, 0x4a, 0x9a, 0x1b, 0x94}}
return a, nil return a, nil
} }
@ -1566,7 +1567,7 @@ func _1673428910_add_image_width_heightUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0664), modTime: time.Unix(1673527384, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xda, 0x93, 0x2a, 0x9b, 0x6b, 0xb7, 0x96, 0xcd, 0xac, 0xf, 0xaf, 0x54, 0x89, 0x9e, 0x91, 0x5b, 0xd0, 0x4a, 0xa, 0x8d, 0x9e, 0x80, 0x66, 0x26, 0x9e, 0xb5, 0xa9, 0x8, 0xec, 0x2d, 0x6c}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xda, 0x93, 0x2a, 0x9b, 0x6b, 0xb7, 0x96, 0xcd, 0xac, 0xf, 0xaf, 0x54, 0x89, 0x9e, 0x91, 0x5b, 0xd0, 0x4a, 0xa, 0x8d, 0x9e, 0x80, 0x66, 0x26, 0x9e, 0xb5, 0xa9, 0x8, 0xec, 0x2d, 0x6c}}
return a, nil return a, nil
} }
@ -1586,7 +1587,7 @@ func _1674210659_add_contact_request_local_clockUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x72, 0x39, 0xfe, 0x72, 0x98, 0xfc, 0x91, 0x20, 0x10, 0xe8, 0xf5, 0xac, 0x79, 0xa8, 0x1c, 0xca, 0x7b, 0x35, 0xa, 0xc1, 0x56, 0x49, 0x9a, 0xfc, 0xbd, 0x64, 0x9d, 0xdf, 0xd2, 0x60, 0x70}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x72, 0x39, 0xfe, 0x72, 0x98, 0xfc, 0x91, 0x20, 0x10, 0xe8, 0xf5, 0xac, 0x79, 0xa8, 0x1c, 0xca, 0x7b, 0x35, 0xa, 0xc1, 0x56, 0x49, 0x9a, 0xfc, 0xbd, 0x64, 0x9d, 0xdf, 0xd2, 0x60, 0x70}}
return a, nil return a, nil
} }
@ -1606,7 +1607,7 @@ func _1675212323_add_deleted_byUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x85, 0x37, 0x29, 0x2f, 0xd, 0x5a, 0xb6, 0xdb, 0xa7, 0x8, 0x86, 0xfc, 0x7a, 0x70, 0xd8, 0x4d, 0xe6, 0xf0, 0x57, 0xe7, 0xd1, 0x95, 0xd5, 0x4, 0x40, 0x2f, 0x7a, 0x5, 0x4f, 0xc2, 0x97, 0xbc}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x85, 0x37, 0x29, 0x2f, 0xd, 0x5a, 0xb6, 0xdb, 0xa7, 0x8, 0x86, 0xfc, 0x7a, 0x70, 0xd8, 0x4d, 0xe6, 0xf0, 0x57, 0xe7, 0xd1, 0x95, 0xd5, 0x4, 0x40, 0x2f, 0x7a, 0x5, 0x4f, 0xc2, 0x97, 0xbc}}
return a, nil return a, nil
} }
@ -1626,7 +1627,7 @@ func _1675247084_add_activity_center_statesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0664), modTime: time.Unix(1676987564, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x90, 0x7d, 0x55, 0xc7, 0x40, 0x29, 0x26, 0x97, 0x45, 0x5c, 0xdf, 0xba, 0x61, 0xb, 0xfc, 0x3d, 0x7a, 0x6c, 0x42, 0xe4, 0x95, 0x78, 0xb0, 0xc5, 0x1f, 0x73, 0xe9, 0x33, 0x51, 0xc8, 0x81}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x90, 0x7d, 0x55, 0xc7, 0x40, 0x29, 0x26, 0x97, 0x45, 0x5c, 0xdf, 0xba, 0x61, 0xb, 0xfc, 0x3d, 0x7a, 0x6c, 0x42, 0xe4, 0x95, 0x78, 0xb0, 0xc5, 0x1f, 0x73, 0xe9, 0x33, 0x51, 0xc8, 0x81}}
return a, nil return a, nil
} }
@ -1646,7 +1647,7 @@ func _1675272329_fix_protocol_migrationUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xe0, 0x11, 0x4c, 0x66, 0x55, 0x72, 0xd3, 0xe6, 0x98, 0xa4, 0xe7, 0x44, 0xf9, 0x3b, 0x3a, 0x3f, 0xd9, 0x91, 0x1e, 0x4f, 0xfc, 0x56, 0x63, 0xe5, 0xa4, 0x83, 0xfc, 0x7c, 0xcf, 0x18, 0x99}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xe0, 0x11, 0x4c, 0x66, 0x55, 0x72, 0xd3, 0xe6, 0x98, 0xa4, 0xe7, 0x44, 0xf9, 0x3b, 0x3a, 0x3f, 0xd9, 0x91, 0x1e, 0x4f, 0xfc, 0x56, 0x63, 0xe5, 0xa4, 0x83, 0xfc, 0x7c, 0xcf, 0x18, 0x99}}
return a, nil return a, nil
} }
@ -1666,7 +1667,7 @@ func _1676998418_fix_activity_center_migrationUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0664), modTime: time.Unix(1677251785, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8a, 0xdc, 0x64, 0xb1, 0x47, 0x67, 0xda, 0x2c, 0x26, 0x29, 0x6b, 0x6f, 0xb, 0xfa, 0x45, 0xf3, 0xad, 0x8b, 0x1a, 0x5f, 0x1c, 0xed, 0xd7, 0xea, 0x54, 0xf5, 0x3f, 0xb8, 0xf6, 0xf9, 0x44, 0x53}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8a, 0xdc, 0x64, 0xb1, 0x47, 0x67, 0xda, 0x2c, 0x26, 0x29, 0x6b, 0x6f, 0xb, 0xfa, 0x45, 0xf3, 0xad, 0x8b, 0x1a, 0x5f, 0x1c, 0xed, 0xd7, 0xea, 0x54, 0xf5, 0x3f, 0xb8, 0xf6, 0xf9, 0x44, 0x53}}
return a, nil return a, nil
} }
@ -1686,7 +1687,7 @@ func _1677278861_add_deleted_column_to_activity_center_notifications_tableUpSql(
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0x3a, 0x95, 0xaf, 0x81, 0xb0, 0x85, 0x8d, 0x73, 0xda, 0x7b, 0x2a, 0x35, 0xa6, 0xaa, 0xcc, 0x4c, 0x35, 0xa3, 0xa8, 0xbd, 0xd1, 0x37, 0xe8, 0x5d, 0x83, 0xa4, 0x33, 0x1f, 0x10, 0xe4, 0xe6}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0x3a, 0x95, 0xaf, 0x81, 0xb0, 0x85, 0x8d, 0x73, 0xda, 0x7b, 0x2a, 0x35, 0xa6, 0xaa, 0xcc, 0x4c, 0x35, 0xa3, 0xa8, 0xbd, 0xd1, 0x37, 0xe8, 0x5d, 0x83, 0xa4, 0x33, 0x1f, 0x10, 0xe4, 0xe6}}
return a, nil return a, nil
} }
@ -1706,7 +1707,7 @@ func _1677486338_add_community_tokens_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0x7b, 0x3d, 0x7e, 0x79, 0xc4, 0x3a, 0xf1, 0xda, 0x4b, 0xc6, 0xd1, 0xd, 0xfb, 0xb2, 0xb9, 0x7f, 0x81, 0x29, 0xab, 0xd8, 0x1, 0x20, 0xd7, 0xe1, 0xaf, 0x3e, 0x67, 0x1b, 0xdb, 0xf9, 0xd5}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0x7b, 0x3d, 0x7e, 0x79, 0xc4, 0x3a, 0xf1, 0xda, 0x4b, 0xc6, 0xd1, 0xd, 0xfb, 0xb2, 0xb9, 0x7f, 0x81, 0x29, 0xab, 0xd8, 0x1, 0x20, 0xd7, 0xe1, 0xaf, 0x3e, 0x67, 0x1b, 0xdb, 0xf9, 0xd5}}
return a, nil return a, nil
} }
@ -1726,7 +1727,7 @@ func _1678292329_add_collapsed_categoriesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x63, 0x86, 0xd5, 0x7, 0xe2, 0x25, 0x15, 0x1b, 0xfe, 0xf3, 0xe, 0x50, 0x48, 0x11, 0x3c, 0x7c, 0xc6, 0xe5, 0xab, 0x8d, 0x1f, 0xe8, 0x3c, 0xcb, 0xf0, 0x8d, 0xa7, 0x49, 0x4c, 0x16, 0x4f}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x63, 0x86, 0xd5, 0x7, 0xe2, 0x25, 0x15, 0x1b, 0xfe, 0xf3, 0xe, 0x50, 0x48, 0x11, 0x3c, 0x7c, 0xc6, 0xe5, 0xab, 0x8d, 0x1f, 0xe8, 0x3c, 0xcb, 0xf0, 0x8d, 0xa7, 0x49, 0x4c, 0x16, 0x4f}}
return a, nil return a, nil
} }
@ -1746,7 +1747,7 @@ func _1678800760_add_index_to_raw_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0xd9, 0x8d, 0x22, 0x46, 0xae, 0x7b, 0x53, 0x3e, 0x51, 0x39, 0xad, 0xad, 0x38, 0x50, 0x6, 0xfa, 0xb9, 0xc4, 0x9f, 0x8d, 0xd2, 0x67, 0x0, 0xef, 0x58, 0x13, 0xab, 0x6a, 0x67, 0xf3, 0x7e}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0xd9, 0x8d, 0x22, 0x46, 0xae, 0x7b, 0x53, 0x3e, 0x51, 0x39, 0xad, 0xad, 0x38, 0x50, 0x6, 0xfa, 0xb9, 0xc4, 0x9f, 0x8d, 0xd2, 0x67, 0x0, 0xef, 0x58, 0x13, 0xab, 0x6a, 0x67, 0xf3, 0x7e}}
return a, nil return a, nil
} }
@ -1766,7 +1767,7 @@ func _1678877478_add_communities_requests_to_join_revealed_addresses_tableUpSql(
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x82, 0x1, 0xb4, 0xb2, 0x94, 0x25, 0xd5, 0x2e, 0x45, 0xc3, 0xb1, 0x2c, 0xeb, 0x1a, 0x52, 0xe0, 0x4b, 0x9b, 0x46, 0xf4, 0xc, 0xac, 0x1, 0x1e, 0x90, 0xbc, 0x64, 0x38, 0x10, 0xf1, 0xaf, 0xac}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x82, 0x1, 0xb4, 0xb2, 0x94, 0x25, 0xd5, 0x2e, 0x45, 0xc3, 0xb1, 0x2c, 0xeb, 0x1a, 0x52, 0xe0, 0x4b, 0x9b, 0x46, 0xf4, 0xc, 0xac, 0x1, 0x1e, 0x90, 0xbc, 0x64, 0x38, 0x10, 0xf1, 0xaf, 0xac}}
return a, nil return a, nil
} }
@ -1786,7 +1787,7 @@ func _1679326850_add_community_token_ownersUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0664), modTime: time.Unix(1680094975, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xe6, 0x25, 0x67, 0xd1, 0xd6, 0x54, 0x88, 0xb1, 0x80, 0x1e, 0x2d, 0x9c, 0xfa, 0x1c, 0xc7, 0x63, 0x6e, 0xf9, 0x66, 0xb1, 0x68, 0xc6, 0xf8, 0x51, 0xb6, 0xd5, 0x4e, 0x93, 0x39, 0x5e, 0xc0}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xe6, 0x25, 0x67, 0xd1, 0xd6, 0x54, 0x88, 0xb1, 0x80, 0x1e, 0x2d, 0x9c, 0xfa, 0x1c, 0xc7, 0x63, 0x6e, 0xf9, 0x66, 0xb1, 0x68, 0xc6, 0xf8, 0x51, 0xb6, 0xd5, 0x4e, 0x93, 0x39, 0x5e, 0xc0}}
return a, nil return a, nil
} }
@ -1806,7 +1807,7 @@ func _1680011500_add_album_images_countUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x55, 0x99, 0x31, 0xcc, 0x80, 0x78, 0xc3, 0x51, 0x13, 0x63, 0x6f, 0x1a, 0xfd, 0x53, 0xd2, 0xf4, 0x13, 0x4b, 0xb2, 0x4f, 0x99, 0xb8, 0x7b, 0x7, 0x99, 0xb6, 0xab, 0x88, 0x2e, 0x7, 0x8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x55, 0x99, 0x31, 0xcc, 0x80, 0x78, 0xc3, 0x51, 0x13, 0x63, 0x6f, 0x1a, 0xfd, 0x53, 0xd2, 0xf4, 0x13, 0x4b, 0xb2, 0x4f, 0x99, 0xb8, 0x7b, 0x7, 0x99, 0xb6, 0xab, 0x88, 0x2e, 0x7, 0x8}}
return a, nil return a, nil
} }
@ -1826,7 +1827,7 @@ func _1680114896_add_index_on_album_idUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x7e, 0xd5, 0xcd, 0x2d, 0xab, 0xd4, 0x32, 0x26, 0x50, 0x3a, 0x5b, 0x8e, 0x1c, 0xcc, 0x35, 0xf8, 0xa1, 0x2a, 0xc1, 0x23, 0xf6, 0x90, 0xfe, 0x84, 0x3, 0xde, 0x5a, 0xee, 0xc6, 0xfc, 0x2a}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x7e, 0xd5, 0xcd, 0x2d, 0xab, 0xd4, 0x32, 0x26, 0x50, 0x3a, 0x5b, 0x8e, 0x1c, 0xcc, 0x35, 0xf8, 0xa1, 0x2a, 0xc1, 0x23, 0xf6, 0x90, 0xfe, 0x84, 0x3, 0xde, 0x5a, 0xee, 0xc6, 0xfc, 0x2a}}
return a, nil return a, nil
} }
@ -1846,7 +1847,7 @@ func _1681655289_add_mute_tillUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xbe, 0xce, 0xb8, 0xe1, 0x30, 0xe7, 0xa7, 0xe0, 0x7d, 0x97, 0xf4, 0x26, 0xb8, 0x57, 0x1d, 0x2a, 0xed, 0x18, 0xf2, 0xa, 0xe3, 0x77, 0x29, 0x18, 0x55, 0x9, 0x74, 0x2c, 0x24, 0x5a, 0x19}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xbe, 0xce, 0xb8, 0xe1, 0x30, 0xe7, 0xa7, 0xe0, 0x7d, 0x97, 0xf4, 0x26, 0xb8, 0x57, 0x1d, 0x2a, 0xed, 0x18, 0xf2, 0xa, 0xe3, 0x77, 0x29, 0x18, 0x55, 0x9, 0x74, 0x2c, 0x24, 0x5a, 0x19}}
return a, nil return a, nil
} }
@ -1866,7 +1867,7 @@ func _1681934966_add_index_response_toUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0xed, 0xa6, 0x7e, 0x51, 0xf2, 0xa1, 0x3c, 0x78, 0x9a, 0xa7, 0x7a, 0x51, 0x25, 0x7d, 0xdd, 0x4b, 0xf3, 0x45, 0xeb, 0x3f, 0xad, 0x23, 0x3e, 0xac, 0x16, 0x28, 0x62, 0x7, 0x8c, 0xe0, 0xa0}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0xed, 0xa6, 0x7e, 0x51, 0xf2, 0xa1, 0x3c, 0x78, 0x9a, 0xa7, 0x7a, 0x51, 0x25, 0x7d, 0xdd, 0x4b, 0xf3, 0x45, 0xeb, 0x3f, 0xad, 0x23, 0x3e, 0xac, 0x16, 0x28, 0x62, 0x7, 0x8c, 0xe0, 0xa0}}
return a, nil return a, nil
} }
@ -1886,7 +1887,7 @@ func _1682528339_add_index_user_messages_unseenUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0664), modTime: time.Unix(1683581871, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xfa, 0x98, 0xdd, 0x74, 0x5e, 0x21, 0x1f, 0xf2, 0x56, 0x17, 0x96, 0xfe, 0xbb, 0x44, 0x4c, 0xa1, 0xd8, 0x9f, 0x2e, 0x6, 0x2f, 0xd8, 0x23, 0xec, 0x94, 0x8c, 0x53, 0xf3, 0xf0, 0x40, 0xe7}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xfa, 0x98, 0xdd, 0x74, 0x5e, 0x21, 0x1f, 0xf2, 0x56, 0x17, 0x96, 0xfe, 0xbb, 0x44, 0x4c, 0xa1, 0xd8, 0x9f, 0x2e, 0x6, 0x2f, 0xd8, 0x23, 0xec, 0x94, 0x8c, 0x53, 0xf3, 0xf0, 0x40, 0xe7}}
return a, nil return a, nil
} }
@ -1906,7 +1907,7 @@ func _1683707289_recreate_deleted_for_mesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x9d, 0xd6, 0x45, 0x41, 0x29, 0x44, 0xf6, 0x14, 0x38, 0xeb, 0xdf, 0x6b, 0x5d, 0x9c, 0x45, 0x4b, 0xc3, 0xa8, 0xbd, 0x38, 0x14, 0xd9, 0x73, 0xf1, 0x51, 0xbb, 0x9f, 0x14, 0x36, 0xf2, 0x11}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x9d, 0xd6, 0x45, 0x41, 0x29, 0x44, 0xf6, 0x14, 0x38, 0xeb, 0xdf, 0x6b, 0x5d, 0x9c, 0x45, 0x4b, 0xc3, 0xa8, 0xbd, 0x38, 0x14, 0xd9, 0x73, 0xf1, 0x51, 0xbb, 0x9f, 0x14, 0x36, 0xf2, 0x11}}
return a, nil return a, nil
} }
@ -1926,7 +1927,7 @@ func _1683725607_mark_discord_messages_as_seenUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd7, 0x2a, 0xc3, 0x43, 0xea, 0x5e, 0x3, 0x2e, 0xce, 0x79, 0xea, 0xa5, 0x67, 0x61, 0x8c, 0xe4, 0xb9, 0xb7, 0x4d, 0xd5, 0xd5, 0xb0, 0x35, 0xc8, 0x2b, 0xa0, 0x3f, 0xd8, 0xde, 0xea, 0x4e, 0x16}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd7, 0x2a, 0xc3, 0x43, 0xea, 0x5e, 0x3, 0x2e, 0xce, 0x79, 0xea, 0xa5, 0x67, 0x61, 0x8c, 0xe4, 0xb9, 0xb7, 0x4d, 0xd5, 0xd5, 0xb0, 0x35, 0xc8, 0x2b, 0xa0, 0x3f, 0xd8, 0xde, 0xea, 0x4e, 0x16}}
return a, nil return a, nil
} }
@ -1946,7 +1947,7 @@ func _1684174617_add_url_previews_to_user_messagesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0xb0, 0x72, 0xe3, 0xe4, 0xa9, 0x63, 0x82, 0xea, 0x52, 0x70, 0xb6, 0xa0, 0x73, 0x55, 0x7a, 0x78, 0xa8, 0xd2, 0xb0, 0xf4, 0x78, 0x8a, 0xd, 0x5a, 0xa2, 0x9d, 0x92, 0xdc, 0xce, 0x1c, 0x71}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0xb0, 0x72, 0xe3, 0xe4, 0xa9, 0x63, 0x82, 0xea, 0x52, 0x70, 0xb6, 0xa0, 0x73, 0x55, 0x7a, 0x78, 0xa8, 0xd2, 0xb0, 0xf4, 0x78, 0x8a, 0xd, 0x5a, 0xa2, 0x9d, 0x92, 0xdc, 0xce, 0x1c, 0x71}}
return a, nil return a, nil
} }
@ -1966,7 +1967,7 @@ func _1684175608_add_token_balancesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x4e, 0xe0, 0x48, 0x34, 0x1, 0x4d, 0x88, 0x11, 0x54, 0x20, 0x52, 0x5c, 0x57, 0x14, 0xa9, 0xa9, 0x36, 0xa4, 0x28, 0x59, 0x48, 0xa8, 0xa, 0x76, 0xec, 0x37, 0xee, 0x9e, 0xd2, 0x20, 0xaa}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x4e, 0xe0, 0x48, 0x34, 0x1, 0x4d, 0x88, 0x11, 0x54, 0x20, 0x52, 0x5c, 0x57, 0x14, 0xa9, 0xa9, 0x36, 0xa4, 0x28, 0x59, 0x48, 0xa8, 0xa, 0x76, 0xec, 0x37, 0xee, 0x9e, 0xd2, 0x20, 0xaa}}
return a, nil return a, nil
} }
@ -1986,7 +1987,7 @@ func _1684979808_sync_activity_center_notificationsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0xf5, 0xf7, 0x94, 0xa9, 0xa1, 0x60, 0x26, 0x9d, 0xca, 0x31, 0xf, 0x14, 0xd, 0x70, 0xf8, 0xab, 0x40, 0x29, 0x73, 0x61, 0xbd, 0x1b, 0xb6, 0xc4, 0x31, 0x77, 0x9e, 0x32, 0xa8, 0xce, 0x6d}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0xf5, 0xf7, 0x94, 0xa9, 0xa1, 0x60, 0x26, 0x9d, 0xca, 0x31, 0xf, 0x14, 0xd, 0x70, 0xf8, 0xab, 0x40, 0x29, 0x73, 0x61, 0xbd, 0x1b, 0xb6, 0xc4, 0x31, 0x77, 0x9e, 0x32, 0xa8, 0xce, 0x6d}}
return a, nil return a, nil
} }
@ -2006,7 +2007,7 @@ func _1685383829_add_communities_mute_tillUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbf, 0x58, 0x96, 0xe5, 0x66, 0xcb, 0xde, 0xed, 0x76, 0xb8, 0x5a, 0x86, 0x81, 0x9a, 0x60, 0x51, 0x12, 0x37, 0x54, 0x9a, 0x36, 0x3e, 0xd1, 0x4a, 0xbe, 0x9a, 0xab, 0x20, 0x7f, 0x1d, 0xf4, 0x73}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbf, 0x58, 0x96, 0xe5, 0x66, 0xcb, 0xde, 0xed, 0x76, 0xb8, 0x5a, 0x86, 0x81, 0x9a, 0x60, 0x51, 0x12, 0x37, 0x54, 0x9a, 0x36, 0x3e, 0xd1, 0x4a, 0xbe, 0x9a, 0xab, 0x20, 0x7f, 0x1d, 0xf4, 0x73}}
return a, nil return a, nil
} }
@ -2026,7 +2027,7 @@ func _1685964183_add_chainids_to_revealed_addressesUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xb5, 0xa8, 0xd7, 0xad, 0x9c, 0x54, 0xa5, 0xe9, 0xdb, 0x42, 0x2d, 0xd0, 0xd7, 0x22, 0x1, 0x93, 0xf3, 0x4f, 0x53, 0xf7, 0x1e, 0xbe, 0x4b, 0xac, 0xc7, 0x63, 0x15, 0xdf, 0xe0, 0x6, 0xf8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xb5, 0xa8, 0xd7, 0xad, 0x9c, 0x54, 0xa5, 0xe9, 0xdb, 0x42, 0x2d, 0xd0, 0xd7, 0x22, 0x1, 0x93, 0xf3, 0x4f, 0x53, 0xf7, 0x1e, 0xbe, 0x4b, 0xac, 0xc7, 0x63, 0x15, 0xdf, 0xe0, 0x6, 0xf8}}
return a, nil return a, nil
} }
@ -2046,7 +2047,7 @@ func _1687370421_add_communities_muted_till_newUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0x73, 0x96, 0x1d, 0xc8, 0x3e, 0xca, 0xf5, 0xdc, 0xe3, 0xac, 0x3f, 0x9c, 0xc3, 0x67, 0x12, 0x9c, 0x19, 0x1, 0x4, 0x2b, 0xea, 0x6b, 0xe1, 0x59, 0x59, 0x89, 0x3d, 0xef, 0x4a, 0x6e, 0xbe}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0x73, 0x96, 0x1d, 0xc8, 0x3e, 0xca, 0xf5, 0xdc, 0xe3, 0xac, 0x3f, 0x9c, 0xc3, 0x67, 0x12, 0x9c, 0x19, 0x1, 0x4, 0x2b, 0xea, 0x6b, 0xe1, 0x59, 0x59, 0x89, 0x3d, 0xef, 0x4a, 0x6e, 0xbe}}
return a, nil return a, nil
} }
@ -2066,7 +2067,7 @@ func _1687416607_add_communities_check_channel_permission_responses_tableUpSql()
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6, 0x3, 0x1a, 0xde, 0x9d, 0xbc, 0x50, 0x9d, 0xf1, 0x6d, 0x5a, 0x1c, 0x28, 0x92, 0x19, 0x89, 0x76, 0x4e, 0x8b, 0x60, 0xa9, 0xf, 0xe9, 0x76, 0xf1, 0xee, 0x75, 0x92, 0xbd, 0xda, 0x72}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6, 0x3, 0x1a, 0xde, 0x9d, 0xbc, 0x50, 0x9d, 0xf1, 0x6d, 0x5a, 0x1c, 0x28, 0x92, 0x19, 0x89, 0x76, 0x4e, 0x8b, 0x60, 0xa9, 0xf, 0xe9, 0x76, 0xf1, 0xee, 0x75, 0x92, 0xbd, 0xda, 0x72}}
return a, nil return a, nil
} }
@ -2086,7 +2087,7 @@ func _1687856939_add_community_tokens_decimalsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0x76, 0x42, 0x70, 0xc9, 0x7b, 0x16, 0xf6, 0xfe, 0x7, 0x1c, 0x99, 0xe5, 0x38, 0xfd, 0xa0, 0x3b, 0x93, 0x40, 0xbc, 0x66, 0xc2, 0xd1, 0xdd, 0xe9, 0xc7, 0xbf, 0xae, 0x36, 0xcc, 0x46, 0x57}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0x76, 0x42, 0x70, 0xc9, 0x7b, 0x16, 0xf6, 0xfe, 0x7, 0x1c, 0x99, 0xe5, 0x38, 0xfd, 0xa0, 0x3b, 0x93, 0x40, 0xbc, 0x66, 0xc2, 0xd1, 0xdd, 0xe9, 0xc7, 0xbf, 0xae, 0x36, 0xcc, 0x46, 0x57}}
return a, nil return a, nil
} }
@ -2106,7 +2107,7 @@ func _1687959987_modify_community_tokens_supply_as_stringUpSql() (*asset, error)
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x57, 0x89, 0xbf, 0x9b, 0xed, 0x9b, 0x18, 0x3f, 0x84, 0xb5, 0x3c, 0x78, 0x40, 0x60, 0xea, 0x33, 0x26, 0x50, 0x3, 0xda, 0x28, 0x92, 0xd3, 0xb6, 0xff, 0x40, 0xa7, 0x19, 0x2, 0xa7, 0x17, 0xf9}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x57, 0x89, 0xbf, 0x9b, 0xed, 0x9b, 0x18, 0x3f, 0x84, 0xb5, 0x3c, 0x78, 0x40, 0x60, 0xea, 0x33, 0x26, 0x50, 0x3, 0xda, 0x28, 0x92, 0xd3, 0xb6, 0xff, 0x40, 0xa7, 0x19, 0x2, 0xa7, 0x17, 0xf9}}
return a, nil return a, nil
} }
@ -2126,7 +2127,7 @@ func _1689258900_add_airdrop_address_to_revealed_addressesUpSql() (*asset, error
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x7e, 0xaf, 0x5c, 0xd, 0xe5, 0x1e, 0x67, 0x1a, 0x6d, 0xd, 0x28, 0x20, 0x7a, 0x1a, 0x45, 0x6e, 0xba, 0x80, 0x91, 0xb0, 0xd6, 0xfd, 0xc2, 0xb9, 0x42, 0x5c, 0x8d, 0x6e, 0x3e, 0x6e, 0xb2}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x7e, 0xaf, 0x5c, 0xd, 0xe5, 0x1e, 0x67, 0x1a, 0x6d, 0xd, 0x28, 0x20, 0x7a, 0x1a, 0x45, 0x6e, 0xba, 0x80, 0x91, 0xb0, 0xd6, 0xfd, 0xc2, 0xb9, 0x42, 0x5c, 0x8d, 0x6e, 0x3e, 0x6e, 0xb2}}
return a, nil return a, nil
} }
@ -2146,7 +2147,7 @@ func _1689266326_create_communities_events_tableUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x4e, 0xe, 0xba, 0x29, 0x16, 0x46, 0x38, 0x19, 0xa4, 0x5, 0x40, 0x46, 0xaf, 0x9a, 0x6, 0x89, 0xe0, 0x9c, 0xcc, 0xec, 0x8a, 0xb, 0x40, 0x85, 0x6f, 0xcc, 0x5, 0x24, 0x2a, 0x33, 0xfa}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x4e, 0xe, 0xba, 0x29, 0x16, 0x46, 0x38, 0x19, 0xa4, 0x5, 0x40, 0x46, 0xaf, 0x9a, 0x6, 0x89, 0xe0, 0x9c, 0xcc, 0xec, 0x8a, 0xb, 0x40, 0x85, 0x6f, 0xcc, 0x5, 0x24, 0x2a, 0x33, 0xfa}}
return a, nil return a, nil
} }
@ -2166,7 +2167,7 @@ func _1689931300_add_community_tokens_deployer_and_priv_levelUpSql() (*asset, er
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3f, 0x24, 0xd9, 0x4d, 0xe, 0x4b, 0xe3, 0x4c, 0xd1, 0xc, 0x72, 0xd4, 0x99, 0xe4, 0xb9, 0xb8, 0xe9, 0x38, 0x9e, 0x11, 0x48, 0xea, 0xe3, 0x5d, 0xd9, 0xd0, 0xef, 0x96, 0x38, 0x5a, 0xd4, 0xa5}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3f, 0x24, 0xd9, 0x4d, 0xe, 0x4b, 0xe3, 0x4c, 0xd1, 0xc, 0x72, 0xd4, 0x99, 0xe4, 0xb9, 0xb8, 0xe9, 0x38, 0x9e, 0x11, 0x48, 0xea, 0xe3, 0x5d, 0xd9, 0xd0, 0xef, 0x96, 0x38, 0x5a, 0xd4, 0xa5}}
return a, nil return a, nil
} }
@ -2186,11 +2187,31 @@ func _1693311881_add_unfurled_links_to_message_editsUpSql() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0664), modTime: time.Unix(1694098269, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xc7, 0x7c, 0xe4, 0x80, 0x6f, 0xf8, 0x96, 0xb, 0x37, 0xff, 0xa2, 0xab, 0x1c, 0xbd, 0x25, 0x8d, 0x1e, 0x9a, 0x65, 0xe9, 0x45, 0xaf, 0x7f, 0x77, 0x84, 0x1b, 0x10, 0x1b, 0x1a, 0x5, 0xcc}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xc7, 0x7c, 0xe4, 0x80, 0x6f, 0xf8, 0x96, 0xb, 0x37, 0xff, 0xa2, 0xab, 0x1c, 0xbd, 0x25, 0x8d, 0x1e, 0x9a, 0x65, 0xe9, 0x45, 0xaf, 0x7f, 0x77, 0x84, 0x1b, 0x10, 0x1b, 0x1a, 0x5, 0xcc}}
return a, nil return a, nil
} }
var __1693311981_community_shardUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\xf4\x09\x71\x0d\x52\x08\x71\x74\xf2\x71\x55\x48\xce\xcf\xcd\x2d\xcd\xcb\x2c\xc9\x4c\x2d\x8e\x47\x62\x2b\x38\xba\xb8\x28\x38\xfb\xfb\x84\xfa\xfa\x29\x14\x67\x24\x16\xa5\xc4\x27\xe7\x94\x16\x97\xa4\x16\x29\x78\xfa\x85\x28\xb8\xb8\xba\x39\x86\xfa\x84\x28\xf8\x85\xfa\xf8\x58\x73\x91\x65\x5c\x66\x5e\x4a\x6a\x05\x16\xc3\x00\x01\x00\x00\xff\xff\xe7\x6c\xc4\x0e\x9c\x00\x00\x00")
func _1693311981_community_shardUpSqlBytes() ([]byte, error) {
return bindataRead(
__1693311981_community_shardUpSql,
"1693311981_community_shard.up.sql",
)
}
func _1693311981_community_shardUpSql() (*asset, error) {
bytes, err := _1693311981_community_shardUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "1693311981_community_shard.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1694098617, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x12, 0xf9, 0xde, 0x49, 0x9f, 0x95, 0xaa, 0x22, 0x5e, 0x54, 0x5a, 0x1, 0xd, 0xc6, 0x1f, 0x42, 0x93, 0xe8, 0x69, 0x30, 0x11, 0x69, 0x41, 0x7f, 0x87, 0x57, 0x56, 0x2a, 0x32, 0xb9, 0x3e}}
return a, nil
}
var _readmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\x91\xc1\xce\xd3\x30\x10\x84\xef\x7e\x8a\x91\x7a\x01\xa9\x2a\x8f\xc0\x0d\x71\x82\x03\x48\x1c\xc9\x36\x9e\x36\x96\x1c\x6f\xf0\xae\x93\xe6\xed\x91\xa3\xc2\xdf\xff\x66\xed\xd8\x33\xdf\x78\x4f\xa7\x13\xbe\xea\x06\x57\x6c\x35\x39\x31\xa7\x7b\x15\x4f\x5a\xec\x73\x08\xbf\x08\x2d\x79\x7f\x4a\x43\x5b\x86\x17\xfd\x8c\x21\xea\x56\x5e\x47\x90\x4a\x14\x75\x48\xde\x64\x37\x2c\x6a\x96\xae\x99\x48\x05\xf6\x27\x77\x13\xad\x08\xae\x8a\x51\xe7\x25\xf3\xf1\xa9\x9f\xf9\x58\x58\x2c\xad\xbc\xe0\x8b\x56\xf0\x21\x5d\xeb\x4c\x95\xb3\xae\x84\x60\xd4\xdc\xe6\x82\x5d\x1b\x36\x6d\x39\x62\x92\xf5\xb8\x11\xdb\x92\xd3\x28\xce\xe0\x13\xe1\x72\xcd\x3c\x63\xd4\x65\x87\xae\xac\xe8\xc3\x28\x2e\x67\x44\x66\x3a\x21\x25\xa2\x72\xac\x14\x67\xbc\x84\x9f\x53\x32\x8c\x52\x70\x25\x56\xd6\xfd\x8d\x05\x37\xad\x30\x9d\x9f\xa6\x86\x0f\xcd\x58\x7f\xcf\x34\x93\x3b\xed\x90\x9f\xa4\x1f\xcf\x30\x85\x4d\x07\x58\xaf\x7f\x25\xc4\x9d\xf3\x72\x64\x84\xd0\x7f\xf9\x9b\x3a\x2d\x84\xef\x85\x48\x66\x8d\xd8\x88\x9b\x8c\x8c\x98\x5b\xf6\x74\x14\x4e\x33\x0d\xc9\xe0\x93\x38\xda\x12\xc5\x69\xbd\xe4\xf0\x2e\x7a\x78\x07\x1c\xfe\x13\x9f\x91\x29\x31\x95\x7b\x7f\x62\x59\x37\xb4\xe5\x5e\x25\xfe\x33\xee\xd5\x53\x71\xd6\xda\x3a\xd8\xcb\xde\x2e\xf8\xa1\x90\x55\x53\x0c\xc7\xaa\x0d\xe9\x76\x14\x29\x1c\x7b\x68\xdd\x2f\xe1\x6f\x00\x00\x00\xff\xff\x3c\x0a\xc2\xfe\x2a\x02\x00\x00") var _readmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\x91\xc1\xce\xd3\x30\x10\x84\xef\x7e\x8a\x91\x7a\x01\xa9\x2a\x8f\xc0\x0d\x71\x82\x03\x48\x1c\xc9\x36\x9e\x36\x96\x1c\x6f\xf0\xae\x93\xe6\xed\x91\xa3\xc2\xdf\xff\x66\xed\xd8\x33\xdf\x78\x4f\xa7\x13\xbe\xea\x06\x57\x6c\x35\x39\x31\xa7\x7b\x15\x4f\x5a\xec\x73\x08\xbf\x08\x2d\x79\x7f\x4a\x43\x5b\x86\x17\xfd\x8c\x21\xea\x56\x5e\x47\x90\x4a\x14\x75\x48\xde\x64\x37\x2c\x6a\x96\xae\x99\x48\x05\xf6\x27\x77\x13\xad\x08\xae\x8a\x51\xe7\x25\xf3\xf1\xa9\x9f\xf9\x58\x58\x2c\xad\xbc\xe0\x8b\x56\xf0\x21\x5d\xeb\x4c\x95\xb3\xae\x84\x60\xd4\xdc\xe6\x82\x5d\x1b\x36\x6d\x39\x62\x92\xf5\xb8\x11\xdb\x92\xd3\x28\xce\xe0\x13\xe1\x72\xcd\x3c\x63\xd4\x65\x87\xae\xac\xe8\xc3\x28\x2e\x67\x44\x66\x3a\x21\x25\xa2\x72\xac\x14\x67\xbc\x84\x9f\x53\x32\x8c\x52\x70\x25\x56\xd6\xfd\x8d\x05\x37\xad\x30\x9d\x9f\xa6\x86\x0f\xcd\x58\x7f\xcf\x34\x93\x3b\xed\x90\x9f\xa4\x1f\xcf\x30\x85\x4d\x07\x58\xaf\x7f\x25\xc4\x9d\xf3\x72\x64\x84\xd0\x7f\xf9\x9b\x3a\x2d\x84\xef\x85\x48\x66\x8d\xd8\x88\x9b\x8c\x8c\x98\x5b\xf6\x74\x14\x4e\x33\x0d\xc9\xe0\x93\x38\xda\x12\xc5\x69\xbd\xe4\xf0\x2e\x7a\x78\x07\x1c\xfe\x13\x9f\x91\x29\x31\x95\x7b\x7f\x62\x59\x37\xb4\xe5\x5e\x25\xfe\x33\xee\xd5\x53\x71\xd6\xda\x3a\xd8\xcb\xde\x2e\xf8\xa1\x90\x55\x53\x0c\xc7\xaa\x0d\xe9\x76\x14\x29\x1c\x7b\x68\xdd\x2f\xe1\x6f\x00\x00\x00\xff\xff\x3c\x0a\xc2\xfe\x2a\x02\x00\x00")
func readmeMdBytes() ([]byte, error) { func readmeMdBytes() ([]byte, error) {
@ -2206,7 +2227,7 @@ func readmeMd() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x6e, 0xfb, 0xcc, 0x81, 0x94, 0x4d, 0x8c, 0xa0, 0x3b, 0x5, 0xb0, 0x18, 0xd6, 0xbb, 0xb3, 0x79, 0xc8, 0x8f, 0xff, 0xc1, 0x10, 0xf9, 0xf, 0x20, 0x1b, 0x4a, 0x74, 0x96, 0x42, 0xd7, 0xa8}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x6e, 0xfb, 0xcc, 0x81, 0x94, 0x4d, 0x8c, 0xa0, 0x3b, 0x5, 0xb0, 0x18, 0xd6, 0xbb, 0xb3, 0x79, 0xc8, 0x8f, 0xff, 0xc1, 0x10, 0xf9, 0xf, 0x20, 0x1b, 0x4a, 0x74, 0x96, 0x42, 0xd7, 0xa8}}
return a, nil return a, nil
} }
@ -2226,7 +2247,7 @@ func docGo() (*asset, error) {
return nil, err return nil, err
} }
info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xcc, 0x41, 0xe1, 0x61, 0x12, 0x97, 0xe, 0x36, 0x8c, 0xa7, 0x9e, 0xe0, 0x6e, 0x59, 0x9e, 0xee, 0xd5, 0x4a, 0xcf, 0x1e, 0x60, 0xd6, 0xc3, 0x3a, 0xc9, 0x6c, 0xf2, 0x86, 0x5a, 0xb4, 0x1e}} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xcc, 0x41, 0xe1, 0x61, 0x12, 0x97, 0xe, 0x36, 0x8c, 0xa7, 0x9e, 0xe0, 0x6e, 0x59, 0x9e, 0xee, 0xd5, 0x4a, 0xcf, 0x1e, 0x60, 0xd6, 0xc3, 0x3a, 0xc9, 0x6c, 0xf2, 0x86, 0x5a, 0xb4, 0x1e}}
return a, nil return a, nil
} }
@ -2524,6 +2545,8 @@ var _bindata = map[string]func() (*asset, error){
"1693311881_add_unfurled_links_to_message_edits.up.sql": _1693311881_add_unfurled_links_to_message_editsUpSql, "1693311881_add_unfurled_links_to_message_edits.up.sql": _1693311881_add_unfurled_links_to_message_editsUpSql,
"1693311981_community_shard.up.sql": _1693311981_community_shardUpSql,
"README.md": readmeMd, "README.md": readmeMd,
"doc.go": docGo, "doc.go": docGo,
@ -2671,8 +2694,9 @@ var _bintree = &bintree{nil, map[string]*bintree{
"1689266326_create_communities_events_table.up.sql": &bintree{_1689266326_create_communities_events_tableUpSql, map[string]*bintree{}}, "1689266326_create_communities_events_table.up.sql": &bintree{_1689266326_create_communities_events_tableUpSql, map[string]*bintree{}},
"1689931300_add_community_tokens_deployer_and_priv_level.up.sql": &bintree{_1689931300_add_community_tokens_deployer_and_priv_levelUpSql, map[string]*bintree{}}, "1689931300_add_community_tokens_deployer_and_priv_level.up.sql": &bintree{_1689931300_add_community_tokens_deployer_and_priv_levelUpSql, map[string]*bintree{}},
"1693311881_add_unfurled_links_to_message_edits.up.sql": &bintree{_1693311881_add_unfurled_links_to_message_editsUpSql, map[string]*bintree{}}, "1693311881_add_unfurled_links_to_message_edits.up.sql": &bintree{_1693311881_add_unfurled_links_to_message_editsUpSql, map[string]*bintree{}},
"README.md": &bintree{readmeMd, map[string]*bintree{}}, "1693311981_community_shard.up.sql": &bintree{_1693311981_community_shardUpSql, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}}, "README.md": &bintree{readmeMd, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
}} }}
// RestoreAsset restores an asset under the given directory. // RestoreAsset restores an asset under the given directory.

View File

@ -0,0 +1,2 @@
ALTER TABLE communities_communities ADD COLUMN shard_cluster INT DEFAULT NULL;
ALTER TABLE communities_communities ADD COLUMN shard_index INT DEFAULT NULL;

View File

@ -95,6 +95,7 @@ const (
ApplicationMetadataMessage_SYNC_ACCOUNTS_POSITIONS ApplicationMetadataMessage_Type = 70 ApplicationMetadataMessage_SYNC_ACCOUNTS_POSITIONS ApplicationMetadataMessage_Type = 70
ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED ApplicationMetadataMessage_Type = 71 ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED ApplicationMetadataMessage_Type = 71
ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE ApplicationMetadataMessage_Type = 72 ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE ApplicationMetadataMessage_Type = 72
ApplicationMetadataMessage_COMMUNITY_SHARD_KEY ApplicationMetadataMessage_Type = 73
) )
var ApplicationMetadataMessage_Type_name = map[int32]string{ var ApplicationMetadataMessage_Type_name = map[int32]string{
@ -170,6 +171,7 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{
70: "SYNC_ACCOUNTS_POSITIONS", 70: "SYNC_ACCOUNTS_POSITIONS",
71: "COMMUNITY_EVENTS_MESSAGE_REJECTED", 71: "COMMUNITY_EVENTS_MESSAGE_REJECTED",
72: "COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE", 72: "COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE",
73: "COMMUNITY_SHARD_KEY",
} }
var ApplicationMetadataMessage_Type_value = map[string]int32{ var ApplicationMetadataMessage_Type_value = map[string]int32{
@ -245,6 +247,7 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{
"SYNC_ACCOUNTS_POSITIONS": 70, "SYNC_ACCOUNTS_POSITIONS": 70,
"COMMUNITY_EVENTS_MESSAGE_REJECTED": 71, "COMMUNITY_EVENTS_MESSAGE_REJECTED": 71,
"COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE": 72, "COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE": 72,
"COMMUNITY_SHARD_KEY": 73,
} }
func (x ApplicationMetadataMessage_Type) String() string { func (x ApplicationMetadataMessage_Type) String() string {
@ -323,72 +326,73 @@ func init() {
} }
var fileDescriptor_ad09a6406fcf24c7 = []byte{ var fileDescriptor_ad09a6406fcf24c7 = []byte{
// 1066 bytes of a gzipped FileDescriptorProto // 1077 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x56, 0x5b, 0x53, 0x1b, 0x37, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x56, 0x5b, 0x53, 0x1b, 0x37,
0x14, 0x2e, 0x84, 0x02, 0x11, 0x97, 0x08, 0x85, 0x8b, 0x01, 0x73, 0x73, 0x08, 0x21, 0x49, 0xeb, 0x14, 0x2e, 0x84, 0x02, 0x11, 0x97, 0x08, 0x85, 0x8b, 0x01, 0x73, 0x73, 0x08, 0x21, 0x49, 0xeb,
0xb4, 0xa4, 0xed, 0xb4, 0x4d, 0xd3, 0x56, 0x96, 0x0e, 0xb6, 0xf0, 0xae, 0xb4, 0x91, 0xb4, 0xee, 0xb4, 0xa4, 0xed, 0xb4, 0x4d, 0xd3, 0x56, 0x96, 0x0e, 0xb6, 0xf0, 0xae, 0xb4, 0x91, 0xb4, 0xee,
0x38, 0x2f, 0x1a, 0xa7, 0x71, 0x33, 0xcc, 0x24, 0xc1, 0x13, 0x9c, 0x07, 0xde, 0xfa, 0x7b, 0xfb, 0x38, 0x2f, 0x1a, 0xa7, 0x71, 0x33, 0xcc, 0x24, 0xc1, 0x13, 0x9c, 0x07, 0x9e, 0xfb, 0x2b, 0xfa,
0x2b, 0x3a, 0xda, 0xab, 0x01, 0x13, 0x9e, 0x60, 0x75, 0x3e, 0x1d, 0xe9, 0x7c, 0xe7, 0x3b, 0x9f, 0x6f, 0x3b, 0xda, 0xab, 0x01, 0x13, 0x9e, 0x60, 0x75, 0x3e, 0x1d, 0xe9, 0x7c, 0xe7, 0x3b, 0x9f,
0x8c, 0x6a, 0xbd, 0xc1, 0xe0, 0xfd, 0xe9, 0xdf, 0xbd, 0xe1, 0xe9, 0xd9, 0x47, 0xf7, 0xa1, 0x3f, 0x8c, 0x6a, 0xbd, 0xc1, 0xe0, 0xfd, 0xe9, 0xdf, 0xbd, 0xe1, 0xe9, 0xd9, 0x47, 0xf7, 0xa1, 0x3f,
0xec, 0xbd, 0xed, 0x0d, 0x7b, 0xee, 0x43, 0xff, 0xfc, 0xbc, 0xf7, 0xae, 0x5f, 0x1f, 0x7c, 0x3a, 0xec, 0xbd, 0xed, 0x0d, 0x7b, 0xee, 0x43, 0xff, 0xfc, 0xbc, 0xf7, 0xae, 0x5f, 0x1f, 0x7c, 0x3a,
0x1b, 0x9e, 0x91, 0xd9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xfe, 0x25, 0x68, 0x83, 0x96, 0x1b, 0x1b, 0x9e, 0x91, 0xd9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xfe, 0x23, 0x68, 0x83, 0x96, 0x1b,
0xc2, 0x0c, 0x1f, 0xa6, 0x70, 0x52, 0x45, 0x77, 0xcf, 0x4f, 0xdf, 0x7d, 0xec, 0x0d, 0x3f, 0x7f, 0xc2, 0x0c, 0x1f, 0xa6, 0x70, 0x52, 0x45, 0x77, 0xcf, 0x4f, 0xdf, 0x7d, 0xec, 0x0d, 0x3f, 0x7f,
0xea, 0x57, 0x26, 0x76, 0x27, 0x0e, 0xe7, 0x75, 0xb9, 0x40, 0x2a, 0x68, 0x66, 0xd0, 0xbb, 0x78, 0xea, 0x57, 0x26, 0x76, 0x27, 0x0e, 0xe7, 0x75, 0xb9, 0x40, 0x2a, 0x68, 0x66, 0xd0, 0xbb, 0x78,
0x7f, 0xd6, 0x7b, 0x5b, 0x99, 0x4c, 0x62, 0xf9, 0x27, 0x79, 0x89, 0xa6, 0x86, 0x17, 0x83, 0x7e, 0x7f, 0xd6, 0x7b, 0x5b, 0x99, 0x4c, 0x62, 0xf9, 0x27, 0x79, 0x89, 0xa6, 0x86, 0x17, 0x83, 0x7e,
0xe5, 0xce, 0xee, 0xc4, 0xe1, 0xe2, 0xd1, 0xe3, 0x7a, 0x7e, 0x5e, 0xfd, 0xe6, 0xb3, 0xea, 0xf6, 0xe5, 0xce, 0xee, 0xc4, 0xe1, 0xe2, 0xd1, 0xe3, 0x7a, 0x7e, 0x5e, 0xfd, 0xe6, 0xb3, 0xea, 0xf6,
0x62, 0xd0, 0xd7, 0xc9, 0xb6, 0xda, 0x7f, 0x18, 0x4d, 0xf9, 0x4f, 0x32, 0x87, 0x66, 0x62, 0xd9, 0x62, 0xd0, 0xd7, 0xc9, 0xb6, 0xda, 0xbf, 0x4b, 0x68, 0xca, 0x7f, 0x92, 0x39, 0x34, 0x13, 0xcb,
0x96, 0xea, 0x2f, 0x89, 0xbf, 0x22, 0x18, 0xcd, 0xb3, 0x16, 0xb5, 0x2e, 0x04, 0x63, 0x68, 0x13, 0xb6, 0x54, 0x7f, 0x49, 0xfc, 0x15, 0xc1, 0x68, 0x9e, 0xb5, 0xa8, 0x75, 0x21, 0x18, 0x43, 0x9b,
0xf0, 0x04, 0x21, 0x68, 0x91, 0x29, 0x69, 0x29, 0xb3, 0x2e, 0x8e, 0x38, 0xb5, 0x80, 0x27, 0xc9, 0x80, 0x27, 0x08, 0x41, 0x8b, 0x4c, 0x49, 0x4b, 0x99, 0x75, 0x71, 0xc4, 0xa9, 0x05, 0x3c, 0x49,
0x16, 0x5a, 0x0f, 0x21, 0x6c, 0x80, 0x36, 0x2d, 0x11, 0x65, 0xcb, 0xc5, 0x96, 0x3b, 0x64, 0x03, 0xb6, 0xd0, 0x7a, 0x08, 0x61, 0x03, 0xb4, 0x69, 0x89, 0x28, 0x5b, 0x2e, 0xb6, 0xdc, 0x21, 0x1b,
0xad, 0x9a, 0xae, 0x64, 0x2e, 0xa2, 0x42, 0x3b, 0x21, 0x8d, 0xa5, 0x41, 0x40, 0xad, 0x50, 0x12, 0x68, 0xd5, 0x74, 0x25, 0x73, 0x11, 0x15, 0xda, 0x09, 0x69, 0x2c, 0x0d, 0x02, 0x6a, 0x85, 0x92,
0x4f, 0x91, 0x7d, 0x54, 0xe5, 0x10, 0x69, 0x60, 0xd4, 0x02, 0x77, 0x09, 0xec, 0x12, 0xe2, 0xeb, 0x78, 0x8a, 0xec, 0xa3, 0x2a, 0x87, 0x48, 0x03, 0xa3, 0x16, 0xb8, 0x4b, 0x60, 0x97, 0x10, 0x5f,
0x8d, 0xc9, 0xd9, 0x09, 0xf2, 0x00, 0xed, 0x68, 0x78, 0x15, 0x83, 0xb1, 0x8e, 0x72, 0xae, 0xc1, 0x6f, 0x4c, 0xce, 0x4e, 0x90, 0x07, 0x68, 0x47, 0xc3, 0xab, 0x18, 0x8c, 0x75, 0x94, 0x73, 0x0d,
0x18, 0x77, 0xac, 0xb4, 0xb3, 0x9a, 0x4a, 0x43, 0x59, 0x02, 0x9c, 0x26, 0x4f, 0xd0, 0x01, 0x65, 0xc6, 0xb8, 0x63, 0xa5, 0x9d, 0xd5, 0x54, 0x1a, 0xca, 0x12, 0xe0, 0x34, 0x79, 0x82, 0x0e, 0x28,
0x0c, 0x22, 0xeb, 0x6e, 0xc3, 0xce, 0x90, 0xa7, 0xe8, 0x11, 0x07, 0x16, 0x08, 0x09, 0xb7, 0x82, 0x63, 0x10, 0x59, 0x77, 0x1b, 0x76, 0x86, 0x3c, 0x45, 0x8f, 0x38, 0xb0, 0x40, 0x48, 0xb8, 0x15,
0x67, 0xc9, 0x1a, 0xba, 0x9f, 0x83, 0x46, 0x03, 0x77, 0xc9, 0x32, 0xc2, 0x06, 0x24, 0xbf, 0xb4, 0x3c, 0x4b, 0xd6, 0xd0, 0xfd, 0x1c, 0x34, 0x1a, 0xb8, 0x4b, 0x96, 0x11, 0x36, 0x20, 0xf9, 0xa5,
0x8a, 0xc8, 0x0e, 0xda, 0xbc, 0x9a, 0x7b, 0x14, 0x30, 0x47, 0x76, 0x51, 0xf5, 0x5a, 0xa1, 0x2e, 0x55, 0x44, 0x76, 0xd0, 0xe6, 0xd5, 0xdc, 0xa3, 0x80, 0x39, 0xb2, 0x8b, 0xaa, 0xd7, 0x0a, 0x75,
0x27, 0xb5, 0x73, 0x84, 0xe7, 0x3d, 0xa1, 0xd7, 0x11, 0x94, 0x31, 0x15, 0x4b, 0x8b, 0x17, 0xc8, 0x39, 0xa9, 0x9d, 0x23, 0x3c, 0xef, 0x09, 0xbd, 0x8e, 0xa0, 0x8c, 0xa9, 0x58, 0x5a, 0xbc, 0x40,
0x1e, 0xda, 0xba, 0x1e, 0x8e, 0xe2, 0x46, 0x20, 0x98, 0xf3, 0xed, 0xc2, 0x8b, 0x64, 0x1b, 0x6d, 0xf6, 0xd0, 0xd6, 0xf5, 0x70, 0x14, 0x37, 0x02, 0xc1, 0x9c, 0x6f, 0x17, 0x5e, 0x24, 0xdb, 0x68,
0xe4, 0x19, 0x99, 0xe2, 0xe0, 0x28, 0xef, 0x80, 0xb6, 0xc2, 0x40, 0x08, 0xd2, 0xe2, 0x7b, 0xa4, 0x23, 0xcf, 0xc8, 0x14, 0x07, 0x47, 0x79, 0x07, 0xb4, 0x15, 0x06, 0x42, 0x90, 0x16, 0xdf, 0x23,
0x86, 0xb6, 0xa3, 0xd8, 0xb4, 0x9c, 0x54, 0x56, 0x1c, 0x0b, 0x96, 0xa6, 0xd0, 0xd0, 0x14, 0xc6, 0x35, 0xb4, 0x1d, 0xc5, 0xa6, 0xe5, 0xa4, 0xb2, 0xe2, 0x58, 0xb0, 0x34, 0x85, 0x86, 0xa6, 0x30,
0xea, 0x94, 0x79, 0xec, 0x49, 0xfa, 0x32, 0xc6, 0x69, 0x30, 0x91, 0x92, 0x06, 0xf0, 0x12, 0xd9, 0x56, 0xa7, 0xcc, 0x63, 0x4f, 0xd2, 0x97, 0x31, 0x4e, 0x83, 0x89, 0x94, 0x34, 0x80, 0x97, 0xc8,
0x44, 0x6b, 0xd7, 0xc1, 0xaf, 0x62, 0xd0, 0x5d, 0x4c, 0xc8, 0x3e, 0xda, 0xbd, 0x21, 0x58, 0xa6, 0x26, 0x5a, 0xbb, 0x0e, 0x7e, 0x15, 0x83, 0xee, 0x62, 0x42, 0xf6, 0xd1, 0xee, 0x0d, 0xc1, 0x32,
0xb8, 0xef, 0xab, 0x1e, 0x77, 0x5e, 0x42, 0x21, 0x5e, 0xf6, 0x25, 0x8d, 0x0b, 0x67, 0xdb, 0x57, 0xc5, 0x7d, 0x5f, 0xf5, 0xb8, 0xf3, 0x12, 0x0a, 0xf1, 0xb2, 0x2f, 0x69, 0x5c, 0x38, 0xdb, 0xbe,
0xbc, 0x32, 0x21, 0x54, 0x27, 0xc2, 0x69, 0xc8, 0xa8, 0x5e, 0x25, 0xeb, 0x68, 0xa5, 0xa9, 0x55, 0xe2, 0x95, 0x09, 0xa1, 0x3a, 0x11, 0x4e, 0x43, 0x46, 0xf5, 0x2a, 0x59, 0x47, 0x2b, 0x4d, 0xad,
0x1c, 0x25, 0xb4, 0x38, 0x21, 0x3b, 0xc2, 0xa6, 0xd5, 0xad, 0x91, 0x25, 0xb4, 0x90, 0x2e, 0x72, 0xe2, 0x28, 0xa1, 0xc5, 0x09, 0xd9, 0x11, 0x36, 0xad, 0x6e, 0x8d, 0x2c, 0xa1, 0x85, 0x74, 0x91,
0x90, 0x56, 0xd8, 0x2e, 0xae, 0x78, 0x34, 0x53, 0x61, 0x18, 0x4b, 0x61, 0xbb, 0x8e, 0x83, 0x61, 0x83, 0xb4, 0xc2, 0x76, 0x71, 0xc5, 0xa3, 0x99, 0x0a, 0xc3, 0x58, 0x0a, 0xdb, 0x75, 0x1c, 0x0c,
0x5a, 0x44, 0x09, 0x7a, 0x9d, 0x54, 0xd1, 0x72, 0x19, 0x1a, 0xc9, 0xb3, 0x91, 0xe8, 0x73, 0x0b, 0xd3, 0x22, 0x4a, 0xd0, 0xeb, 0xa4, 0x8a, 0x96, 0xcb, 0xd0, 0x48, 0x9e, 0x8d, 0x44, 0x9f, 0x5b,
0xad, 0x97, 0xd1, 0xa2, 0xe9, 0xca, 0x9d, 0x28, 0x21, 0xf1, 0x26, 0xb9, 0x87, 0xe6, 0x22, 0x21, 0x68, 0xbd, 0x8c, 0x16, 0x4d, 0x57, 0xee, 0x44, 0x09, 0x89, 0x37, 0xc9, 0x3d, 0x34, 0x17, 0x09,
0x8b, 0x89, 0xa8, 0xfa, 0xb1, 0x02, 0x2e, 0xca, 0xb1, 0xda, 0xf2, 0xb7, 0x31, 0x96, 0xda, 0xd8, 0x59, 0x4c, 0x44, 0xd5, 0x8f, 0x15, 0x70, 0x51, 0x8e, 0xd5, 0x96, 0xbf, 0x8d, 0xb1, 0xd4, 0xc6,
0xe4, 0x53, 0xb5, 0xed, 0xeb, 0xe1, 0x10, 0xc0, 0xc8, 0x28, 0xed, 0x78, 0x6d, 0x8d, 0x93, 0x4e, 0x26, 0x9f, 0xaa, 0x6d, 0x5f, 0x0f, 0x87, 0x00, 0x46, 0x46, 0x69, 0xc7, 0x6b, 0x6b, 0x9c, 0x74,
0x76, 0x34, 0xde, 0xf5, 0xb3, 0x46, 0xa5, 0x92, 0xdd, 0x50, 0xc5, 0xc6, 0x85, 0x60, 0xb5, 0x60, 0xb2, 0xa3, 0xf1, 0xae, 0x9f, 0x35, 0x2a, 0x95, 0xec, 0x86, 0x2a, 0x36, 0x2e, 0x04, 0xab, 0x05,
0xae, 0x41, 0x2d, 0x6b, 0xe1, 0x3d, 0xb2, 0x82, 0x96, 0x92, 0xcd, 0x49, 0xd9, 0x1a, 0x42, 0xd5, 0x73, 0x0d, 0x6a, 0x59, 0x0b, 0xef, 0x91, 0x15, 0xb4, 0x94, 0x6c, 0x4e, 0xca, 0xd6, 0x10, 0xaa,
0x01, 0x8e, 0x6b, 0xbe, 0x73, 0xe5, 0x72, 0x76, 0x94, 0xf1, 0x24, 0x72, 0xfc, 0x80, 0x20, 0x34, 0x0e, 0x70, 0x5c, 0xf3, 0x9d, 0x2b, 0x97, 0xb3, 0xa3, 0x8c, 0x27, 0x91, 0xe3, 0x07, 0x04, 0xa1,
0xdd, 0xa0, 0xac, 0x1d, 0x47, 0x78, 0xbf, 0x50, 0xa5, 0x67, 0xb7, 0xe3, 0x2b, 0x65, 0x20, 0x2d, 0xe9, 0x06, 0x65, 0xed, 0x38, 0xc2, 0xfb, 0x85, 0x2a, 0x3d, 0xbb, 0x1d, 0x5f, 0x29, 0x03, 0x69,
0xe8, 0x14, 0xfa, 0xb0, 0x50, 0xe5, 0xd5, 0x70, 0x3a, 0x94, 0xc0, 0xf1, 0x81, 0x57, 0xdd, 0x58, 0x41, 0xa7, 0xd0, 0x87, 0x85, 0x2a, 0xaf, 0x86, 0xd3, 0xa1, 0x04, 0x8e, 0x0f, 0xbc, 0xea, 0xc6,
0x08, 0x17, 0x26, 0x14, 0xc6, 0x00, 0xc7, 0x8f, 0x12, 0x26, 0x3c, 0xa6, 0xa1, 0x54, 0x3b, 0xa4, 0x42, 0xb8, 0x30, 0xa1, 0x30, 0x06, 0x38, 0x7e, 0x94, 0x30, 0xe1, 0x31, 0x0d, 0xa5, 0xda, 0x21,
0xba, 0x8d, 0x0f, 0xc9, 0x2a, 0x22, 0xe9, 0x0d, 0x03, 0xa0, 0xda, 0xb5, 0x84, 0xb1, 0x4a, 0x77, 0xd5, 0x6d, 0x7c, 0x48, 0x56, 0x11, 0x49, 0x6f, 0x18, 0x00, 0xd5, 0xae, 0x25, 0x8c, 0x55, 0xba,
0xf1, 0x63, 0x4f, 0x63, 0xb2, 0x6e, 0xc0, 0x5a, 0x21, 0x9b, 0xf8, 0x09, 0x39, 0x44, 0xfb, 0x65, 0x8b, 0x1f, 0x7b, 0x1a, 0x93, 0x75, 0x03, 0xd6, 0x0a, 0xd9, 0xc4, 0x4f, 0xc8, 0x21, 0xda, 0x2f,
0x23, 0xb2, 0x5a, 0x1c, 0xd5, 0xac, 0x25, 0x3a, 0xe0, 0x42, 0xda, 0x94, 0x60, 0x03, 0x21, 0xdb, 0x1b, 0x91, 0xd5, 0xe2, 0xa8, 0x66, 0x2d, 0xd1, 0x01, 0x17, 0xd2, 0xa6, 0x04, 0x1b, 0x08, 0xd9,
0xf8, 0xa9, 0xef, 0x75, 0x6a, 0x4a, 0x5a, 0x1d, 0x8b, 0x00, 0x5c, 0x24, 0x98, 0x8d, 0x35, 0x18, 0xc6, 0x4f, 0x7d, 0xaf, 0x53, 0x53, 0xd2, 0xea, 0x58, 0x04, 0xe0, 0x22, 0xc1, 0x6c, 0xac, 0xc1,
0xfc, 0x4d, 0x91, 0x36, 0x1f, 0xb8, 0x6f, 0x13, 0x56, 0x53, 0x6b, 0xc9, 0x87, 0x2a, 0x97, 0x65, 0xe0, 0x6f, 0x8a, 0xb4, 0xf9, 0xc0, 0x7d, 0x9b, 0xb0, 0x9a, 0x5a, 0x4b, 0x3e, 0x54, 0xb9, 0x2c,
0xdd, 0xd3, 0xa7, 0xc1, 0xea, 0x74, 0xd2, 0x2e, 0x07, 0x9f, 0x91, 0x03, 0x54, 0xbb, 0x51, 0x18, 0xeb, 0x9e, 0x3e, 0x0d, 0x56, 0xa7, 0x93, 0x76, 0x39, 0xf8, 0x8c, 0x1c, 0xa0, 0xda, 0x8d, 0xc2,
0xa5, 0x76, 0xbf, 0x2b, 0x7b, 0x50, 0x80, 0xb3, 0x9a, 0x0c, 0xfe, 0xde, 0xfb, 0x45, 0xbe, 0xb5, 0x28, 0xb5, 0xfb, 0x5d, 0xd9, 0x83, 0x02, 0x9c, 0xd5, 0x64, 0xf0, 0xf7, 0xde, 0x2f, 0xf2, 0xad,
0x70, 0x09, 0xd0, 0xc5, 0x0c, 0xe0, 0x23, 0x2f, 0x8b, 0x2b, 0xf7, 0xbb, 0x04, 0x78, 0xee, 0x53, 0x85, 0x4b, 0x80, 0x2e, 0x66, 0x00, 0x1f, 0x79, 0x59, 0x5c, 0xb9, 0xdf, 0x25, 0xc0, 0x73, 0x9f,
0xe4, 0x9e, 0x34, 0x16, 0xf1, 0x43, 0x21, 0x0e, 0xab, 0x63, 0xe3, 0xad, 0x38, 0x36, 0xa0, 0xf1, 0x22, 0xf7, 0xa4, 0xb1, 0x88, 0x1f, 0x0a, 0x71, 0x58, 0x1d, 0x1b, 0x6f, 0xc5, 0xb1, 0x01, 0x8d,
0x8f, 0x45, 0xcf, 0x47, 0xd1, 0x45, 0x7d, 0x3f, 0x15, 0x3d, 0xbf, 0x52, 0xb9, 0xe3, 0xc0, 0x84, 0x7f, 0x2c, 0x7a, 0x3e, 0x8a, 0x2e, 0xea, 0xfb, 0xa9, 0xe8, 0xf9, 0x95, 0xca, 0x1d, 0x07, 0x26,
0xf1, 0x89, 0x7f, 0x4e, 0x9d, 0x68, 0x0c, 0x05, 0x01, 0xd0, 0x0e, 0xe0, 0x5f, 0x7c, 0x3c, 0x49, 0x8c, 0x4f, 0xfc, 0x73, 0xea, 0x44, 0x63, 0x28, 0x08, 0x80, 0x76, 0x00, 0xff, 0xe2, 0xe3, 0x49,
0x91, 0x69, 0xdd, 0xdb, 0x6f, 0x58, 0x4a, 0xfe, 0xd7, 0xa2, 0xf9, 0x86, 0x76, 0x80, 0xe7, 0x2e, 0x8a, 0x4c, 0xeb, 0xde, 0x7e, 0xc3, 0x52, 0xf2, 0xbf, 0x16, 0xcd, 0x37, 0xb4, 0x03, 0x3c, 0x77,
0x8d, 0x5f, 0x78, 0x4f, 0x29, 0xf3, 0x32, 0x2a, 0x19, 0x04, 0xd7, 0x46, 0xef, 0x37, 0xcf, 0x4c, 0x69, 0xfc, 0xc2, 0x7b, 0x4a, 0x99, 0x97, 0x51, 0xc9, 0x20, 0xb8, 0x36, 0x7a, 0xbf, 0x79, 0x66,
0x16, 0x1b, 0x5b, 0xf7, 0xcb, 0xa2, 0xd9, 0x6d, 0xe8, 0xfa, 0xf7, 0x09, 0xff, 0x5e, 0x30, 0x61, 0xb2, 0xd8, 0xd8, 0xba, 0x5f, 0x16, 0xcd, 0x6e, 0x43, 0xd7, 0xbf, 0x4f, 0xf8, 0xf7, 0x82, 0x09,
0x14, 0x13, 0x34, 0x70, 0x5e, 0x2f, 0x06, 0xff, 0x41, 0xaa, 0xa8, 0x92, 0x2c, 0x83, 0x34, 0x09, 0xa3, 0x98, 0xa0, 0x81, 0xf3, 0x7a, 0x31, 0xf8, 0x0f, 0x52, 0x45, 0x95, 0x64, 0x19, 0xa4, 0x49,
0x39, 0x92, 0x86, 0xe0, 0x38, 0x58, 0x2a, 0x02, 0xfc, 0xa7, 0x6f, 0xf4, 0x58, 0x65, 0x8f, 0x9a, 0xc8, 0x91, 0x34, 0x04, 0xc7, 0xc1, 0x52, 0x11, 0xe0, 0x3f, 0x7d, 0xa3, 0xc7, 0x2a, 0x7b, 0xd4,
0x95, 0xc1, 0xd4, 0x7b, 0xea, 0xad, 0x38, 0xe7, 0x9d, 0x00, 0x70, 0xc3, 0x1f, 0x59, 0x96, 0x08, 0xac, 0x0c, 0xa6, 0xde, 0x53, 0x6f, 0xc5, 0x39, 0xef, 0x04, 0x80, 0x1b, 0xfe, 0xc8, 0xb2, 0x44,
0x1d, 0x90, 0xd6, 0x14, 0xc4, 0x30, 0xff, 0x28, 0x8e, 0x44, 0xbd, 0x9d, 0x98, 0x16, 0xd5, 0x25, 0xe8, 0x80, 0xb4, 0xa6, 0x20, 0x86, 0xf9, 0x47, 0x71, 0x24, 0xea, 0xed, 0xc4, 0xb4, 0xa8, 0x2e,
0x47, 0x60, 0x30, 0xf7, 0x2c, 0x8d, 0x6a, 0xd9, 0xb1, 0xd8, 0x58, 0x15, 0x8a, 0xd7, 0xb9, 0x73, 0x39, 0x02, 0x83, 0xb9, 0x67, 0x69, 0x54, 0xcb, 0x8e, 0xc5, 0xc6, 0xaa, 0x50, 0xbc, 0xce, 0x9d,
0x04, 0x4a, 0x63, 0x28, 0xe4, 0x97, 0xa1, 0x8c, 0x8b, 0x94, 0x11, 0xe9, 0x95, 0x8f, 0xc9, 0x43, 0x23, 0x50, 0x1a, 0x43, 0x21, 0xbf, 0x0c, 0x65, 0x5c, 0xa4, 0x8c, 0x48, 0xaf, 0x7c, 0x4c, 0x1e,
0xb4, 0x77, 0xd3, 0x2d, 0x9c, 0x86, 0x13, 0x60, 0x7e, 0xb6, 0x9b, 0xfe, 0xf9, 0x2d, 0x61, 0x91, 0xa2, 0xbd, 0x9b, 0x6e, 0xe1, 0x34, 0x9c, 0x00, 0xf3, 0xb3, 0xdd, 0xf4, 0xcf, 0x6f, 0x09, 0x8b,
0x16, 0x1d, 0x11, 0x40, 0x33, 0x13, 0x52, 0xfa, 0xb0, 0xe7, 0x57, 0x6f, 0x35, 0x16, 0x5e, 0xcf, 0xb4, 0xe8, 0x88, 0x00, 0x9a, 0x99, 0x90, 0xd2, 0x87, 0x3d, 0xbf, 0x7a, 0xcb, 0xbf, 0xa8, 0x23,
0xd5, 0x9f, 0xbd, 0xc8, 0x7f, 0xa1, 0xbc, 0x99, 0x4e, 0xfe, 0x7b, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x4a, 0x6f, 0x51, 0xcd, 0x3d, 0xff, 0x58, 0x34, 0x16, 0x5e, 0xcf, 0xd5, 0x9f, 0xbd, 0xc8, 0x7f,
0xff, 0xff, 0xec, 0x56, 0x69, 0xd7, 0x48, 0x09, 0x00, 0x00, 0xba, 0xbc, 0x99, 0x4e, 0xfe, 0x7b, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xc9, 0x3a,
0x61, 0x61, 0x09, 0x00, 0x00,
} }

View File

@ -85,5 +85,6 @@ message ApplicationMetadataMessage {
SYNC_ACCOUNTS_POSITIONS = 70; SYNC_ACCOUNTS_POSITIONS = 70;
COMMUNITY_EVENTS_MESSAGE_REJECTED = 71; COMMUNITY_EVENTS_MESSAGE_REJECTED = 71;
COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE = 72; COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE = 72;
COMMUNITY_SHARD_KEY = 73;
} }
} }

View File

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

View File

@ -5,6 +5,7 @@ package protobuf;
import "enums.proto"; import "enums.proto";
import "contact.proto"; import "contact.proto";
import "shard.proto";
message StickerMessage { message StickerMessage {
string hash = 1; string hash = 1;
@ -168,6 +169,8 @@ message ChatMessage {
repeated UnfurledLink unfurled_links = 16; repeated UnfurledLink unfurled_links = 16;
Shard shard = 17;
enum ContentType { enum ContentType {
UNKNOWN_CONTENT_TYPE = 0; UNKNOWN_CONTENT_TYPE = 0;
TEXT_PLAIN = 1; TEXT_PLAIN = 1;

View File

@ -1144,15 +1144,17 @@ func (m *CommunityCancelRequestToJoin) GetDisplayName() string {
} }
type CommunityRequestToJoinResponse struct { type CommunityRequestToJoinResponse struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
Community *CommunityDescription `protobuf:"bytes,2,opt,name=community,proto3" json:"community,omitempty"` Community *CommunityDescription `protobuf:"bytes,2,opt,name=community,proto3" json:"community,omitempty"`
Accepted bool `protobuf:"varint,3,opt,name=accepted,proto3" json:"accepted,omitempty"` Accepted bool `protobuf:"varint,3,opt,name=accepted,proto3" json:"accepted,omitempty"`
Grant []byte `protobuf:"bytes,4,opt,name=grant,proto3" json:"grant,omitempty"` Grant []byte `protobuf:"bytes,4,opt,name=grant,proto3" json:"grant,omitempty"`
CommunityId []byte `protobuf:"bytes,5,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` CommunityId []byte `protobuf:"bytes,5,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
MagnetUri string `protobuf:"bytes,6,opt,name=magnet_uri,json=magnetUri,proto3" json:"magnet_uri,omitempty"` MagnetUri string `protobuf:"bytes,6,opt,name=magnet_uri,json=magnetUri,proto3" json:"magnet_uri,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` ProtectedTopicPrivateKey []byte `protobuf:"bytes,7,opt,name=protected_topic_private_key,json=protectedTopicPrivateKey,proto3" json:"protected_topic_private_key,omitempty"`
XXX_unrecognized []byte `json:"-"` Shard *Shard `protobuf:"bytes,8,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_sizecache int32 `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *CommunityRequestToJoinResponse) Reset() { *m = CommunityRequestToJoinResponse{} } func (m *CommunityRequestToJoinResponse) Reset() { *m = CommunityRequestToJoinResponse{} }
@ -1222,6 +1224,20 @@ func (m *CommunityRequestToJoinResponse) GetMagnetUri() string {
return "" return ""
} }
func (m *CommunityRequestToJoinResponse) GetProtectedTopicPrivateKey() []byte {
if m != nil {
return m.ProtectedTopicPrivateKey
}
return nil
}
func (m *CommunityRequestToJoinResponse) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
type CommunityRequestToLeave struct { type CommunityRequestToLeave struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
CommunityId []byte `protobuf:"bytes,2,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` CommunityId []byte `protobuf:"bytes,2,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
@ -1672,135 +1688,138 @@ func init() {
} }
var fileDescriptor_f937943d74c1cd8b = []byte{ var fileDescriptor_f937943d74c1cd8b = []byte{
// 2066 bytes of a gzipped FileDescriptorProto // 2122 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x41, 0x73, 0x1b, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcf, 0x73, 0x1b, 0x49,
0xf5, 0xcf, 0x68, 0x64, 0x5b, 0x7a, 0xb2, 0x6c, 0xb9, 0x93, 0xd8, 0x13, 0x27, 0xd9, 0x28, 0xf3, 0xf5, 0xdf, 0xd1, 0x48, 0xb6, 0xf4, 0x64, 0xd9, 0x72, 0x27, 0xb1, 0x27, 0x4e, 0xb2, 0x51, 0xe6,
0xff, 0x53, 0x78, 0x43, 0xa1, 0xec, 0x1a, 0x28, 0x52, 0xbb, 0xb0, 0xbb, 0x8a, 0x3c, 0x64, 0xb5, 0xfb, 0xdd, 0xc2, 0x1b, 0x0a, 0x67, 0xd7, 0x40, 0x91, 0xda, 0x65, 0x7f, 0x28, 0xf2, 0x90, 0xd5,
0x89, 0x46, 0xde, 0x96, 0xbc, 0x81, 0x2d, 0x60, 0xaa, 0x3d, 0xd3, 0xb6, 0xbb, 0x22, 0xcd, 0x88, 0x26, 0x1a, 0x79, 0x5b, 0xf2, 0x06, 0xb6, 0x80, 0xa9, 0xf6, 0x4c, 0xdb, 0xee, 0x8a, 0x34, 0x23,
0xe9, 0x96, 0x0b, 0x71, 0xe0, 0x00, 0x7c, 0x02, 0xf8, 0x00, 0x1c, 0xb8, 0xc3, 0x47, 0xe0, 0x40, 0xa6, 0x5b, 0x2e, 0xc4, 0x81, 0x03, 0xf0, 0x17, 0xc0, 0x1f, 0xc0, 0x81, 0x3b, 0xfc, 0x09, 0x1c,
0x15, 0x47, 0xee, 0xdc, 0x38, 0x72, 0xe4, 0xcc, 0x89, 0xea, 0xee, 0x99, 0xd1, 0x8c, 0x24, 0xc7, 0xa8, 0xe2, 0xb8, 0x77, 0x6e, 0xfc, 0x09, 0x9c, 0x39, 0x51, 0xdd, 0x3d, 0x33, 0x9a, 0x91, 0xe4,
0x59, 0x16, 0xaa, 0x38, 0x69, 0xde, 0xeb, 0xd7, 0xaf, 0xdf, 0x7b, 0xfd, 0xeb, 0xd7, 0xbf, 0x16, 0x38, 0xcb, 0x42, 0x15, 0x27, 0xcd, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xf7, 0x3e, 0xfd, 0xfa, 0xd3,
0xec, 0xf8, 0xd1, 0x78, 0x3c, 0x0d, 0x99, 0x60, 0x94, 0xb7, 0x26, 0x71, 0x24, 0x22, 0x54, 0x51, 0x82, 0x6d, 0x3f, 0x1a, 0x8f, 0xa7, 0x21, 0x13, 0x8c, 0xf2, 0x83, 0x49, 0x1c, 0x89, 0x08, 0x55,
0x3f, 0xa7, 0xd3, 0xb3, 0xfd, 0x9b, 0xfe, 0x05, 0x11, 0x1e, 0x0b, 0x68, 0x28, 0x98, 0x98, 0xe9, 0xd5, 0xcf, 0xe9, 0xf4, 0x6c, 0xef, 0x86, 0x7f, 0x41, 0x84, 0xc7, 0x02, 0x1a, 0x0a, 0x26, 0x66,
0xe1, 0xfd, 0x1a, 0x0d, 0xa7, 0xe3, 0xc4, 0xd6, 0xbe, 0x84, 0xb5, 0x67, 0x31, 0x09, 0x05, 0x7a, 0x7a, 0x78, 0xaf, 0x4e, 0xc3, 0xe9, 0x98, 0xa7, 0x02, 0xbf, 0x20, 0x71, 0xa0, 0x05, 0xfb, 0x12,
0x08, 0x9b, 0xa9, 0xa7, 0x99, 0xc7, 0x02, 0xcb, 0x68, 0x1a, 0x07, 0x9b, 0xb8, 0x96, 0xe9, 0xba, 0x2a, 0x4f, 0x63, 0x12, 0x0a, 0xf4, 0x00, 0x36, 0x52, 0xb7, 0x33, 0x8f, 0x05, 0x96, 0xd1, 0x32,
0x01, 0xba, 0x0b, 0xd5, 0x31, 0x1d, 0x9f, 0xd2, 0x58, 0x8e, 0x97, 0xd4, 0x78, 0x45, 0x2b, 0xba, 0xf6, 0x37, 0x70, 0x3d, 0xd3, 0x75, 0x03, 0x74, 0x07, 0x6a, 0x63, 0x3a, 0x3e, 0xa5, 0xb1, 0x1c,
0x01, 0xda, 0x83, 0x8d, 0x64, 0x31, 0xcb, 0x6c, 0x1a, 0x07, 0x55, 0xbc, 0x2e, 0xc5, 0x6e, 0x80, 0x2f, 0xa9, 0xf1, 0xaa, 0x56, 0x74, 0x03, 0xb4, 0x0b, 0xeb, 0xc9, 0xca, 0x96, 0xd9, 0x32, 0xf6,
0x6e, 0xc1, 0x9a, 0x3f, 0x8a, 0xfc, 0x57, 0x56, 0xb9, 0x69, 0x1c, 0x94, 0xb1, 0x16, 0xec, 0x3f, 0x6b, 0x78, 0x4d, 0x8a, 0xdd, 0x00, 0xdd, 0x84, 0x8a, 0x3f, 0x8a, 0xfc, 0x97, 0x56, 0xb9, 0x65,
0x97, 0x60, 0xbb, 0x93, 0xfa, 0xee, 0x29, 0x27, 0xe8, 0x5b, 0xb0, 0x16, 0x47, 0x23, 0xca, 0x2d, 0xec, 0x97, 0xb1, 0x16, 0xec, 0xbf, 0x96, 0x60, 0xab, 0x93, 0xfa, 0xee, 0x29, 0x27, 0xe8, 0xbb,
0xa3, 0x69, 0x1e, 0x6c, 0x1d, 0x3e, 0x68, 0xa5, 0x79, 0xb4, 0x16, 0x2c, 0x5b, 0x58, 0x9a, 0x61, 0x50, 0x89, 0xa3, 0x11, 0xe5, 0x96, 0xd1, 0x32, 0xf7, 0x37, 0x0f, 0xef, 0x1f, 0xa4, 0x9b, 0x3a,
0x6d, 0x8d, 0x3e, 0x81, 0x9d, 0x98, 0x5e, 0x52, 0x32, 0xa2, 0x81, 0x47, 0x7c, 0x3f, 0x9a, 0x86, 0x58, 0xb0, 0x3c, 0xc0, 0xd2, 0x0c, 0x6b, 0x6b, 0xf4, 0x29, 0x6c, 0xc7, 0xf4, 0x92, 0x92, 0x11,
0x82, 0x5b, 0xa5, 0xa6, 0x79, 0x50, 0x3b, 0xbc, 0x33, 0x77, 0x81, 0x13, 0x93, 0xb6, 0xb6, 0x78, 0x0d, 0x3c, 0xe2, 0xfb, 0xd1, 0x34, 0x14, 0xdc, 0x2a, 0xb5, 0xcc, 0xfd, 0xfa, 0xe1, 0xed, 0xb9,
0x5a, 0xb2, 0x0c, 0xdc, 0x88, 0x8b, 0x4a, 0x8e, 0x1e, 0xc1, 0xce, 0x88, 0x70, 0xe1, 0x4d, 0x27, 0x0b, 0x9c, 0x98, 0xb4, 0xb5, 0xc5, 0x93, 0x92, 0x65, 0xe0, 0x66, 0x5c, 0x54, 0x72, 0xf4, 0x10,
0x01, 0x11, 0xd4, 0xd3, 0x81, 0x9b, 0x2a, 0xf0, 0x6d, 0x39, 0x70, 0xa2, 0xf4, 0x1d, 0x95, 0xc2, 0xb6, 0x47, 0x84, 0x0b, 0x6f, 0x3a, 0x09, 0x88, 0xa0, 0x9e, 0x0e, 0xdc, 0x54, 0x81, 0x6f, 0xc9,
0x2f, 0x0d, 0x58, 0x53, 0x81, 0xa0, 0x3a, 0x54, 0x71, 0xff, 0x85, 0xe3, 0xb9, 0x7d, 0xd7, 0x69, 0x81, 0x13, 0xa5, 0xef, 0xa8, 0x2d, 0xfc, 0xda, 0x80, 0x8a, 0x0a, 0x04, 0x35, 0xa0, 0x86, 0xfb,
0xdc, 0x40, 0x5b, 0x00, 0x4a, 0xec, 0xbf, 0x74, 0x1d, 0xdc, 0x30, 0x32, 0xb9, 0x7d, 0xd4, 0xeb, 0xcf, 0x1d, 0xcf, 0xed, 0xbb, 0x4e, 0xf3, 0x0d, 0xb4, 0x09, 0xa0, 0xc4, 0xfe, 0x0b, 0xd7, 0xc1,
0xba, 0x8d, 0x32, 0xba, 0x0d, 0x3b, 0x4a, 0x1e, 0xf6, 0x9f, 0x3b, 0xae, 0xd7, 0x6b, 0x0f, 0x86, 0x4d, 0x23, 0x93, 0xdb, 0x47, 0xbd, 0xae, 0xdb, 0x2c, 0xa3, 0x5b, 0xb0, 0xad, 0xe4, 0x61, 0xff,
0x0e, 0x6e, 0xac, 0xd9, 0xe5, 0x4a, 0xa9, 0x51, 0xb2, 0xcb, 0x15, 0xb3, 0x61, 0x3e, 0xd2, 0x06, 0x99, 0xe3, 0x7a, 0xbd, 0xf6, 0x60, 0xe8, 0xe0, 0x66, 0xc5, 0x2e, 0x57, 0x4b, 0xcd, 0x92, 0x5d,
0xbd, 0xb6, 0xdb, 0x7e, 0xe6, 0x78, 0x27, 0x03, 0x07, 0x0f, 0x1e, 0xdd, 0xd6, 0xaa, 0xfe, 0x91, 0xae, 0x9a, 0x4d, 0xf3, 0xa1, 0x36, 0xe8, 0xb5, 0xdd, 0xf6, 0x53, 0xc7, 0x3b, 0x19, 0x38, 0x78,
0x83, 0xdb, 0x43, 0xc7, 0xeb, 0xf4, 0xdd, 0xa1, 0xe3, 0x0e, 0xed, 0x5f, 0x98, 0xb0, 0x9b, 0x95, 0xf0, 0xf0, 0x96, 0x56, 0xf5, 0x8f, 0x1c, 0xdc, 0x1e, 0x3a, 0x5e, 0xa7, 0xef, 0x0e, 0x1d, 0x77,
0x67, 0x18, 0xbd, 0xa2, 0x61, 0x8f, 0x0a, 0x12, 0x10, 0x41, 0xd0, 0x19, 0x20, 0x3f, 0x0a, 0x45, 0x68, 0xff, 0xca, 0x84, 0x9d, 0x2c, 0x3d, 0xc3, 0xe8, 0x25, 0x0d, 0x7b, 0x54, 0x90, 0x80, 0x08,
0x4c, 0x7c, 0xe1, 0x91, 0x20, 0x88, 0x29, 0xe7, 0x49, 0x71, 0x6b, 0x87, 0xdf, 0x5e, 0x51, 0xdc, 0x82, 0xce, 0x00, 0xf9, 0x51, 0x28, 0x62, 0xe2, 0x0b, 0x8f, 0x04, 0x41, 0x4c, 0x39, 0x4f, 0x92,
0xc2, 0xec, 0x56, 0x27, 0x99, 0xda, 0x4e, 0x67, 0x3a, 0xa1, 0x88, 0x67, 0x78, 0xc7, 0x5f, 0xd4, 0x5b, 0x3f, 0xfc, 0xde, 0x8a, 0xe4, 0x16, 0x66, 0x1f, 0x74, 0x92, 0xa9, 0xed, 0x74, 0xa6, 0x13,
0xa3, 0x26, 0xd4, 0x02, 0xca, 0xfd, 0x98, 0x4d, 0x04, 0x8b, 0x42, 0x85, 0x8c, 0x2a, 0xce, 0xab, 0x8a, 0x78, 0x86, 0xb7, 0xfd, 0x45, 0x3d, 0x6a, 0x41, 0x3d, 0xa0, 0xdc, 0x8f, 0xd9, 0x44, 0xb0,
0x24, 0x06, 0xd8, 0x98, 0x9c, 0xd3, 0x04, 0x1a, 0x5a, 0x40, 0xef, 0x41, 0x55, 0xc8, 0x25, 0x87, 0x28, 0x54, 0xc8, 0xa8, 0xe1, 0xbc, 0x4a, 0x62, 0x80, 0x8d, 0xc9, 0x39, 0x4d, 0xa0, 0xa1, 0x05,
0xb3, 0x09, 0x55, 0xe8, 0xd8, 0x3a, 0xbc, 0x77, 0x55, 0x58, 0xd2, 0x06, 0xcf, 0xcd, 0xd1, 0x2e, 0xf4, 0x1e, 0xd4, 0x84, 0x5c, 0x72, 0x38, 0x9b, 0x50, 0x85, 0x8e, 0xcd, 0xc3, 0xbb, 0x57, 0x85,
0xac, 0xf3, 0xd9, 0xf8, 0x34, 0x1a, 0x59, 0x6b, 0x1a, 0x6d, 0x5a, 0x42, 0x08, 0xca, 0x21, 0x19, 0x25, 0x6d, 0xf0, 0xdc, 0x1c, 0xed, 0xc0, 0x1a, 0x9f, 0x8d, 0x4f, 0xa3, 0x91, 0x55, 0xd1, 0x68,
0x53, 0x6b, 0x5d, 0x69, 0xd5, 0x37, 0xda, 0x87, 0x4a, 0x40, 0x7d, 0x36, 0x26, 0x23, 0x6e, 0x6d, 0xd3, 0x12, 0x42, 0x50, 0x0e, 0xc9, 0x98, 0x5a, 0x6b, 0x4a, 0xab, 0xbe, 0xd1, 0x1e, 0x54, 0x03,
0x34, 0x8d, 0x83, 0x3a, 0xce, 0xe4, 0xfd, 0x23, 0x59, 0xbd, 0x55, 0x89, 0xa2, 0x06, 0x98, 0xaf, 0xea, 0xb3, 0x31, 0x19, 0x71, 0x6b, 0xbd, 0x65, 0xec, 0x37, 0x70, 0x26, 0xef, 0x1d, 0xc9, 0xec,
0xe8, 0x4c, 0x9d, 0x83, 0x32, 0x96, 0x9f, 0x32, 0x8b, 0x4b, 0x32, 0x9a, 0xd2, 0x24, 0x43, 0x2d, 0xad, 0xda, 0x28, 0x6a, 0x82, 0xf9, 0x92, 0xce, 0xd4, 0x39, 0x28, 0x63, 0xf9, 0x29, 0x77, 0x71,
0xbc, 0x57, 0x7a, 0x62, 0xd8, 0x7f, 0x33, 0xe0, 0x56, 0x16, 0xef, 0x31, 0x8d, 0xc7, 0x8c, 0x73, 0x49, 0x46, 0x53, 0x9a, 0xec, 0x50, 0x0b, 0xef, 0x95, 0x1e, 0x1b, 0xf6, 0xdf, 0x0d, 0xb8, 0x99,
0x16, 0x85, 0x1c, 0xdd, 0x81, 0x0a, 0x0d, 0xb9, 0x17, 0x85, 0x23, 0xed, 0xa9, 0x82, 0x37, 0x68, 0xc5, 0x7b, 0x4c, 0xe3, 0x31, 0xe3, 0x9c, 0x45, 0x21, 0x47, 0xb7, 0xa1, 0x4a, 0x43, 0xee, 0x45,
0xc8, 0xfb, 0xe1, 0x68, 0x86, 0x2c, 0xd8, 0x98, 0xc4, 0xec, 0x92, 0x08, 0xed, 0xaf, 0x82, 0x53, 0xe1, 0x48, 0x7b, 0xaa, 0xe2, 0x75, 0x1a, 0xf2, 0x7e, 0x38, 0x9a, 0x21, 0x0b, 0xd6, 0x27, 0x31,
0x11, 0x7d, 0x17, 0xd6, 0x89, 0xef, 0x53, 0xce, 0x55, 0xb9, 0xb6, 0x0e, 0xbf, 0xb2, 0xa2, 0x28, 0xbb, 0x24, 0x42, 0xfb, 0xab, 0xe2, 0x54, 0x44, 0x1f, 0xc0, 0x1a, 0xf1, 0x7d, 0xca, 0xb9, 0x4a,
0xb9, 0x45, 0x5a, 0x6d, 0x65, 0x8c, 0x93, 0x49, 0xf6, 0x10, 0xd6, 0xb5, 0x06, 0x21, 0xd8, 0x3a, 0xd7, 0xe6, 0xe1, 0x5b, 0x2b, 0x92, 0x92, 0x5b, 0xe4, 0xa0, 0xad, 0x8c, 0x71, 0x32, 0xc9, 0x1e,
0x71, 0x9f, 0xbb, 0xfd, 0x97, 0xae, 0xd7, 0xee, 0x74, 0x9c, 0xc1, 0xa0, 0x71, 0x03, 0xed, 0x40, 0xc2, 0x9a, 0xd6, 0x20, 0x04, 0x9b, 0x27, 0xee, 0x33, 0xb7, 0xff, 0xc2, 0xf5, 0xda, 0x9d, 0x8e,
0xdd, 0xed, 0x7b, 0x3d, 0xa7, 0xf7, 0xd4, 0xc1, 0x83, 0x8f, 0xbb, 0xc7, 0x0d, 0x03, 0xdd, 0x84, 0x33, 0x18, 0x34, 0xdf, 0x40, 0xdb, 0xd0, 0x70, 0xfb, 0x5e, 0xcf, 0xe9, 0x3d, 0x71, 0xf0, 0xe0,
0xed, 0xae, 0xfb, 0x59, 0x77, 0xd8, 0x1e, 0x76, 0xfb, 0xae, 0xd7, 0x77, 0x5f, 0xfc, 0xa0, 0x51, 0x93, 0xee, 0x71, 0xd3, 0x40, 0x37, 0x60, 0xab, 0xeb, 0x7e, 0xde, 0x1d, 0xb6, 0x87, 0xdd, 0xbe,
0x92, 0xa0, 0xed, 0xbb, 0x1e, 0x76, 0x3e, 0x3d, 0x71, 0x06, 0xc3, 0x86, 0x69, 0xff, 0xca, 0x84, 0xeb, 0xf5, 0xdd, 0xe7, 0x3f, 0x6a, 0x96, 0x24, 0x68, 0xfb, 0xae, 0x87, 0x9d, 0xcf, 0x4e, 0x9c,
0xba, 0xda, 0x89, 0x4e, 0xcc, 0x04, 0x8d, 0x19, 0x41, 0x3f, 0x7a, 0x0d, 0xbc, 0x5a, 0xf3, 0x90, 0xc1, 0xb0, 0x69, 0xda, 0xbf, 0x31, 0xa1, 0xa1, 0x2a, 0xd1, 0x89, 0x99, 0xa0, 0x31, 0x23, 0xe8,
0x0b, 0x93, 0xbe, 0x00, 0xaa, 0xde, 0x81, 0xb2, 0x90, 0xc0, 0x28, 0xbd, 0x01, 0x30, 0x94, 0x65, 0x27, 0xaf, 0x80, 0xd7, 0xc1, 0x3c, 0xe4, 0xc2, 0xa4, 0xaf, 0x80, 0xaa, 0x77, 0xa0, 0x2c, 0x24,
0x0e, 0x13, 0xe6, 0x4a, 0x4c, 0x94, 0x73, 0x98, 0xd8, 0x85, 0x75, 0x32, 0x96, 0x67, 0x3e, 0xc5, 0x30, 0x4a, 0xaf, 0x01, 0x0c, 0x65, 0x99, 0xc3, 0x84, 0xb9, 0x12, 0x13, 0xe5, 0x1c, 0x26, 0x76,
0x8f, 0x96, 0x64, 0x8f, 0x53, 0x20, 0xf3, 0x58, 0xc0, 0xad, 0xf5, 0xa6, 0x79, 0x50, 0xc6, 0x15, 0x60, 0x8d, 0x8c, 0xe5, 0x99, 0x4f, 0xf1, 0xa3, 0x25, 0xd9, 0xe3, 0x14, 0xc8, 0x3c, 0x16, 0x70,
0xa5, 0xe8, 0x06, 0x1c, 0x3d, 0x80, 0x9a, 0xdc, 0xcd, 0x09, 0x11, 0x82, 0xc6, 0xa1, 0xc2, 0x52, 0x6b, 0xad, 0x65, 0xee, 0x97, 0x71, 0x55, 0x29, 0xba, 0x01, 0x47, 0xf7, 0xa1, 0x2e, 0xab, 0x39,
0x15, 0x03, 0x0d, 0xf9, 0xb1, 0xd6, 0x14, 0x90, 0x56, 0x51, 0xc0, 0xf9, 0x4f, 0x23, 0xed, 0x37, 0x21, 0x42, 0xd0, 0x38, 0x54, 0x58, 0xaa, 0x61, 0xa0, 0x21, 0x3f, 0xd6, 0x9a, 0x02, 0xd2, 0xaa,
0x26, 0x58, 0xc5, 0x02, 0xcc, 0x91, 0x80, 0xb6, 0xa0, 0x94, 0x74, 0xee, 0x2a, 0x2e, 0xb1, 0x00, 0x0a, 0x38, 0xff, 0x69, 0xa4, 0xfd, 0xce, 0x04, 0xab, 0x98, 0x80, 0x39, 0x12, 0xd0, 0x26, 0x94,
0xbd, 0x5f, 0x28, 0xe1, 0x57, 0xaf, 0x2a, 0xe1, 0xdc, 0x43, 0x2b, 0x57, 0xcd, 0x0f, 0x60, 0x4b, 0x92, 0xce, 0x5d, 0xc3, 0x25, 0x16, 0xa0, 0xf7, 0x0b, 0x29, 0xfc, 0xc6, 0x55, 0x29, 0x9c, 0x7b,
0x57, 0xc2, 0x4f, 0xf6, 0xce, 0x32, 0xd5, 0xd6, 0xee, 0x5d, 0xb1, 0xb5, 0xb8, 0x2e, 0x0a, 0xf0, 0x38, 0xc8, 0x65, 0xf3, 0x43, 0xd8, 0xd4, 0x99, 0xf0, 0x93, 0xda, 0x59, 0xa6, 0x2a, 0xed, 0xee,
0xb8, 0x03, 0x95, 0xe4, 0x42, 0xe0, 0x56, 0xb9, 0x69, 0x1e, 0x54, 0xf1, 0x86, 0xbe, 0x11, 0x38, 0x15, 0xa5, 0xc5, 0x0d, 0x51, 0x80, 0xc7, 0x6d, 0xa8, 0x26, 0x17, 0x02, 0xb7, 0xca, 0x2d, 0x73,
0xba, 0x0f, 0xc0, 0xb8, 0x97, 0xa2, 0x7f, 0x4d, 0xa1, 0xbf, 0xca, 0xf8, 0xb1, 0x56, 0xd8, 0x7f, 0xbf, 0x86, 0xd7, 0xf5, 0x8d, 0xc0, 0xd1, 0x3d, 0x00, 0xc6, 0xbd, 0x14, 0xfd, 0x15, 0x85, 0xfe,
0x30, 0xa0, 0xac, 0x0e, 0xf9, 0x3d, 0xb0, 0x52, 0xfc, 0xea, 0x5e, 0x79, 0xec, 0xe0, 0x5e, 0x77, 0x1a, 0xe3, 0xc7, 0x5a, 0x61, 0xff, 0xc9, 0x80, 0xb2, 0x3a, 0xe4, 0x77, 0xc1, 0x4a, 0xf1, 0xab,
0x30, 0xe8, 0xf6, 0xdd, 0xc6, 0x0d, 0xd4, 0x80, 0xcd, 0xa7, 0x4e, 0xa7, 0xdf, 0x4b, 0x1b, 0xab, 0x7b, 0xe5, 0xb1, 0x83, 0x7b, 0xdd, 0xc1, 0xa0, 0xdb, 0x77, 0x9b, 0x6f, 0xa0, 0x26, 0x6c, 0x3c,
0x21, 0xb1, 0x9d, 0x68, 0x34, 0xbe, 0x1b, 0x25, 0x74, 0x0b, 0x1a, 0x9d, 0xb6, 0xeb, 0x7d, 0xd6, 0x71, 0x3a, 0xfd, 0x5e, 0xda, 0x58, 0x0d, 0x89, 0xed, 0x44, 0xa3, 0xf1, 0xdd, 0x2c, 0xa1, 0x9b,
0x75, 0x5e, 0x7a, 0x9d, 0x8f, 0xdb, 0xae, 0xeb, 0xbc, 0x68, 0x98, 0xe8, 0x3e, 0xdc, 0xc9, 0xb4, 0xd0, 0xec, 0xb4, 0x5d, 0xef, 0xf3, 0xae, 0xf3, 0xc2, 0xeb, 0x7c, 0xd2, 0x76, 0x5d, 0xe7, 0x79,
0x6d, 0xf7, 0xc8, 0x3b, 0xee, 0x0f, 0x86, 0xd9, 0x70, 0x19, 0xed, 0xc1, 0xcd, 0xc4, 0x4f, 0xb1, 0xd3, 0x44, 0xf7, 0xe0, 0x76, 0xa6, 0x6d, 0xbb, 0x47, 0xde, 0x71, 0x7f, 0x30, 0xcc, 0x86, 0xcb,
0x45, 0xa3, 0x5d, 0x40, 0x85, 0x01, 0xdd, 0xe1, 0xd7, 0xed, 0x7f, 0x56, 0x73, 0xe7, 0xff, 0xa8, 0x68, 0x17, 0x6e, 0x24, 0x7e, 0x8a, 0x2d, 0x1a, 0xed, 0x00, 0x2a, 0x0c, 0xe8, 0x0e, 0xbf, 0x66,
0xd8, 0xf8, 0xf4, 0x1d, 0x62, 0xe4, 0x2e, 0x3f, 0xe4, 0xc0, 0x86, 0xbe, 0x37, 0xd3, 0x7b, 0xea, 0xff, 0xb3, 0x96, 0x3b, 0xff, 0x47, 0xc5, 0xc6, 0xa7, 0xef, 0x10, 0x23, 0x77, 0xf9, 0x21, 0x07,
0x6b, 0x2b, 0xb6, 0x26, 0xe7, 0xa6, 0xa5, 0xaf, 0xbd, 0xe4, 0xac, 0xa4, 0x73, 0xd1, 0x47, 0x50, 0xd6, 0xf5, 0xbd, 0x99, 0xde, 0x53, 0xdf, 0x5c, 0x51, 0x9a, 0x9c, 0x9b, 0x03, 0x7d, 0xed, 0x25,
0x9b, 0xcc, 0xdb, 0x80, 0x02, 0x7d, 0xed, 0xf0, 0xad, 0xd7, 0x37, 0x0b, 0x9c, 0x9f, 0x82, 0x0e, 0x67, 0x25, 0x9d, 0x8b, 0x3e, 0x86, 0xfa, 0x64, 0xde, 0x06, 0x14, 0xe8, 0xeb, 0x87, 0x6f, 0xbe,
0xa1, 0x92, 0x92, 0x03, 0xb5, 0x0d, 0xb5, 0xc3, 0xdd, 0xdc, 0x74, 0xb5, 0x5b, 0x7a, 0x14, 0x67, 0xba, 0x59, 0xe0, 0xfc, 0x14, 0x74, 0x08, 0xd5, 0x94, 0x29, 0xa8, 0x32, 0xd4, 0x0f, 0x77, 0x72,
0x76, 0xe8, 0x43, 0x58, 0x93, 0xfb, 0xa8, 0x4f, 0x47, 0xed, 0xf0, 0xed, 0x6b, 0x42, 0x97, 0x5e, 0xd3, 0x55, 0xb5, 0xf4, 0x28, 0xce, 0xec, 0xd0, 0x47, 0x50, 0x91, 0x75, 0xd4, 0xa7, 0xa3, 0x7e,
0x92, 0xc0, 0xf5, 0x3c, 0x09, 0x8c, 0x53, 0x12, 0x7a, 0x23, 0xc6, 0x85, 0xb5, 0xa1, 0x81, 0x71, 0xf8, 0xf6, 0x35, 0xa1, 0x4b, 0x2f, 0x49, 0xe0, 0x7a, 0x9e, 0x04, 0xc6, 0x29, 0x09, 0xbd, 0x11,
0x4a, 0xc2, 0x17, 0x8c, 0x0b, 0xe4, 0x02, 0xf8, 0x44, 0xd0, 0xf3, 0x28, 0x66, 0x54, 0x9e, 0xa0, 0xe3, 0xc2, 0x5a, 0xd7, 0xc0, 0x38, 0x25, 0xe1, 0x73, 0xc6, 0x05, 0x72, 0x01, 0x7c, 0x22, 0xe8,
0x85, 0x56, 0xb2, 0x7a, 0x81, 0x6c, 0x82, 0x5e, 0x25, 0xe7, 0x01, 0x3d, 0x01, 0x8b, 0xc4, 0xfe, 0x79, 0x14, 0x33, 0x2a, 0x4f, 0xd0, 0x42, 0x2b, 0x59, 0xbd, 0x40, 0x36, 0x41, 0xaf, 0x92, 0xf3,
0x05, 0xbb, 0xa4, 0xde, 0x98, 0x9c, 0x87, 0x54, 0x8c, 0x58, 0xf8, 0x2a, 0xb9, 0xd5, 0xab, 0x6a, 0x80, 0x1e, 0x83, 0x45, 0x62, 0xff, 0x82, 0x5d, 0x52, 0x6f, 0x4c, 0xce, 0x43, 0x2a, 0x46, 0x2c,
0x47, 0x76, 0x93, 0xf1, 0x5e, 0x36, 0xac, 0x2e, 0x77, 0xf4, 0x0c, 0xb6, 0x48, 0x30, 0x66, 0xa1, 0x7c, 0x99, 0xdc, 0xea, 0x35, 0x55, 0x91, 0x9d, 0x64, 0xbc, 0x97, 0x0d, 0xab, 0xcb, 0x1d, 0x3d,
0xc7, 0xa9, 0x10, 0x2c, 0x3c, 0xe7, 0x16, 0xa8, 0xfa, 0x34, 0x57, 0x44, 0xd3, 0x96, 0x86, 0x83, 0x85, 0x4d, 0x12, 0x8c, 0x59, 0xe8, 0x71, 0x2a, 0x04, 0x0b, 0xcf, 0xb9, 0x05, 0x2a, 0x3f, 0xad,
0xc4, 0x0e, 0xd7, 0x49, 0x5e, 0x44, 0xff, 0x07, 0x75, 0x16, 0x8a, 0x38, 0xf2, 0xc6, 0x94, 0x73, 0x15, 0xd1, 0xb4, 0xa5, 0xe1, 0x20, 0xb1, 0xc3, 0x0d, 0x92, 0x17, 0xd1, 0xff, 0x41, 0x83, 0x85,
0x79, 0x05, 0xd6, 0xd4, 0xf1, 0xdc, 0x54, 0xca, 0x9e, 0xd6, 0x49, 0xa3, 0x68, 0x9a, 0x37, 0xda, 0x22, 0x8e, 0xbc, 0x31, 0xe5, 0x5c, 0x5e, 0x81, 0x75, 0x75, 0x3c, 0x37, 0x94, 0xb2, 0xa7, 0x75,
0xd4, 0x46, 0x4a, 0x99, 0x1a, 0x35, 0xa1, 0x4a, 0x43, 0x3f, 0x9e, 0x4d, 0x04, 0x0d, 0xac, 0xba, 0xd2, 0x28, 0x9a, 0xe6, 0x8d, 0x36, 0xb4, 0x91, 0x52, 0xa6, 0x46, 0x2d, 0xa8, 0xd1, 0xd0, 0x8f,
0x3c, 0x34, 0x8a, 0xc4, 0xcc, 0x95, 0xb2, 0xd1, 0x09, 0x72, 0xce, 0xad, 0x2d, 0x55, 0x55, 0xf5, 0x67, 0x13, 0x41, 0x03, 0xab, 0x21, 0x0f, 0x8d, 0x22, 0x31, 0x73, 0xa5, 0x6c, 0x74, 0x82, 0x9c,
0x8d, 0x08, 0xec, 0xe8, 0x63, 0x9c, 0x87, 0xca, 0xb6, 0xaa, 0xec, 0x37, 0xaf, 0xa9, 0xec, 0x42, 0x73, 0x6b, 0x53, 0x65, 0x55, 0x7d, 0x23, 0x02, 0xdb, 0xfa, 0x18, 0xe7, 0xa1, 0xb2, 0xa5, 0x32,
0x73, 0x48, 0xea, 0xdb, 0x10, 0x0b, 0x6a, 0xf4, 0x43, 0xb8, 0x33, 0xa7, 0x8e, 0x6a, 0x94, 0x7b, 0xfb, 0x9d, 0x6b, 0x32, 0xbb, 0xd0, 0x1c, 0x92, 0xfc, 0x36, 0xc5, 0x82, 0x1a, 0xfd, 0x18, 0x6e,
0xe3, 0x84, 0x46, 0x58, 0x0d, 0xb5, 0x54, 0xf3, 0x3a, 0xba, 0x81, 0xf7, 0xfc, 0x82, 0x9e, 0x67, 0xcf, 0xa9, 0xa3, 0x1a, 0xe5, 0xde, 0x38, 0xa1, 0x11, 0x56, 0x53, 0x2d, 0xd5, 0xba, 0x8e, 0x6e,
0x2c, 0xe6, 0x1d, 0xb8, 0x45, 0x7c, 0xa1, 0xb6, 0x50, 0xe3, 0xde, 0x53, 0x5c, 0xcd, 0xda, 0x51, 0xe0, 0x5d, 0xbf, 0xa0, 0xe7, 0x19, 0x8b, 0x79, 0x07, 0x6e, 0x12, 0x5f, 0xa8, 0x12, 0x6a, 0xdc,
0xfb, 0x87, 0xf4, 0x58, 0x72, 0x40, 0x3a, 0x72, 0x64, 0xff, 0x04, 0x36, 0xf3, 0x07, 0x26, 0xdf, 0x7b, 0x8a, 0xab, 0x59, 0xdb, 0xaa, 0x7e, 0x48, 0x8f, 0x25, 0x07, 0xa4, 0x23, 0x47, 0xf6, 0x4e,
0x5f, 0xab, 0xba, 0xbf, 0x3e, 0xce, 0xf7, 0xd7, 0x02, 0x4d, 0x5c, 0x60, 0x9a, 0xb9, 0xd6, 0xbb, 0x60, 0x23, 0x7f, 0x60, 0xf2, 0xfd, 0xb5, 0xa6, 0xfb, 0xeb, 0xa3, 0x7c, 0x7f, 0x2d, 0xd0, 0xc4,
0xff, 0x29, 0xc0, 0x1c, 0xcc, 0x2b, 0x9c, 0x7e, 0xbd, 0xe8, 0x74, 0x6f, 0x85, 0x53, 0x39, 0x3f, 0x05, 0xa6, 0x99, 0x6b, 0xbd, 0x7b, 0x9f, 0x01, 0xcc, 0xc1, 0xbc, 0xc2, 0xe9, 0xb7, 0x8a, 0x4e,
0xef, 0xf2, 0x73, 0xd8, 0x5e, 0x80, 0xef, 0x0a, 0xbf, 0xef, 0x16, 0xfd, 0xde, 0x5d, 0xe5, 0x57, 0x77, 0x57, 0x38, 0x95, 0xf3, 0xf3, 0x2e, 0xbf, 0x80, 0xad, 0x05, 0xf8, 0xae, 0xf0, 0xfb, 0x6e,
0x3b, 0x99, 0xe5, 0x7d, 0x9f, 0xc3, 0xed, 0x95, 0x1b, 0xb8, 0x62, 0x85, 0x27, 0xc5, 0x15, 0xec, 0xd1, 0xef, 0x9d, 0x55, 0x7e, 0xb5, 0x93, 0x59, 0xde, 0xf7, 0x39, 0xdc, 0x5a, 0x59, 0xc0, 0x15,
0xeb, 0x2f, 0x8a, 0xfc, 0x95, 0xf4, 0xe3, 0x1c, 0x01, 0x2d, 0x1c, 0x05, 0x74, 0x04, 0x0f, 0x26, 0x2b, 0x3c, 0x2e, 0xae, 0x60, 0x5f, 0x7f, 0x51, 0xe4, 0xaf, 0xa4, 0x9f, 0xe6, 0x08, 0x68, 0xe1,
0x2c, 0x4c, 0x41, 0xed, 0x91, 0xd1, 0x28, 0xdb, 0x43, 0x1a, 0x92, 0xd3, 0x11, 0x0d, 0x12, 0x52, 0x28, 0xa0, 0x23, 0xb8, 0x3f, 0x61, 0x61, 0x0a, 0x6a, 0x8f, 0x8c, 0x46, 0x59, 0x0d, 0x69, 0x48,
0x74, 0x77, 0xc2, 0xc2, 0x04, 0xe6, 0xed, 0xd1, 0x28, 0xdb, 0x3c, 0x65, 0x62, 0xff, 0xb5, 0x04, 0x4e, 0x47, 0x34, 0x48, 0x48, 0xd1, 0x9d, 0x09, 0x0b, 0x13, 0x98, 0xb7, 0x47, 0xa3, 0xac, 0x78,
0xf5, 0x42, 0x05, 0xd1, 0x07, 0xf3, 0xfe, 0xa9, 0xe9, 0xc6, 0xff, 0x5f, 0x51, 0xeb, 0x37, 0x6b, 0xca, 0xc4, 0xfe, 0x5b, 0x09, 0x1a, 0x85, 0x0c, 0xa2, 0x0f, 0xe7, 0xfd, 0x53, 0xd3, 0x8d, 0xff,
0x9c, 0xa5, 0x2f, 0xd7, 0x38, 0xcd, 0x37, 0x6c, 0x9c, 0x0f, 0xa0, 0x96, 0xb4, 0x26, 0xf5, 0xc0, 0xbf, 0x22, 0xd7, 0xaf, 0xd7, 0x38, 0x4b, 0x5f, 0xaf, 0x71, 0x9a, 0xaf, 0xd9, 0x38, 0xef, 0x43,
0xd2, 0x6c, 0x24, 0xed, 0x56, 0xf2, 0x7d, 0xb5, 0x0f, 0x95, 0x49, 0xc4, 0x99, 0x22, 0xd1, 0xb2, 0x3d, 0x69, 0x4d, 0xea, 0x81, 0xa5, 0xd9, 0x48, 0xda, 0xad, 0xe4, 0xfb, 0x6a, 0x0f, 0xaa, 0x93,
0x1b, 0xaf, 0xe1, 0x4c, 0xfe, 0x2f, 0x61, 0xda, 0x0e, 0x60, 0x67, 0x09, 0x44, 0x8b, 0x81, 0x1a, 0x88, 0x33, 0x45, 0xa2, 0x65, 0x37, 0xae, 0xe0, 0x4c, 0xfe, 0x2f, 0x61, 0xda, 0x0e, 0x60, 0x7b,
0x4b, 0x81, 0xa6, 0x84, 0xaa, 0x54, 0x24, 0xd9, 0x59, 0xf0, 0x66, 0x31, 0x78, 0xfb, 0xd7, 0x06, 0x09, 0x44, 0x8b, 0x81, 0x1a, 0x4b, 0x81, 0xa6, 0x84, 0xaa, 0x54, 0x24, 0xd9, 0x59, 0xf0, 0x66,
0x6c, 0x2f, 0xbc, 0xbf, 0x24, 0xfd, 0x4d, 0x48, 0x63, 0xb2, 0x40, 0x2a, 0xa2, 0x7b, 0x50, 0xe5, 0x31, 0x78, 0xfb, 0xb7, 0x06, 0x6c, 0x2d, 0xbc, 0xbf, 0x24, 0xfd, 0x4d, 0x48, 0x63, 0xb2, 0x40,
0xec, 0x3c, 0x24, 0x62, 0x1a, 0xd3, 0xe4, 0x99, 0x39, 0x57, 0x48, 0x82, 0xe6, 0x5f, 0x10, 0xa6, 0x2a, 0xa2, 0xbb, 0x50, 0xe3, 0xec, 0x3c, 0x24, 0x62, 0x1a, 0xd3, 0xe4, 0x99, 0x39, 0x57, 0x48,
0x09, 0x9a, 0xa9, 0x09, 0x9a, 0x52, 0x48, 0x62, 0xf1, 0x08, 0x1a, 0x8c, 0xb7, 0x59, 0x1c, 0xc4, 0x82, 0xe6, 0x5f, 0x10, 0xa6, 0x09, 0x9a, 0xa9, 0x09, 0x9a, 0x52, 0x48, 0x62, 0xf1, 0x10, 0x9a,
0xd1, 0x24, 0x21, 0x59, 0xaa, 0xce, 0x15, 0xbc, 0xa4, 0xb7, 0xff, 0x61, 0xe4, 0x70, 0x8b, 0xe9, 0x8c, 0xb7, 0x59, 0x1c, 0xc4, 0xd1, 0x24, 0x21, 0x59, 0x2a, 0xcf, 0x55, 0xbc, 0xa4, 0xb7, 0xff,
0x4f, 0xa6, 0x94, 0x8b, 0x61, 0xf4, 0x49, 0xc4, 0xae, 0xba, 0xb5, 0x13, 0x2e, 0x9f, 0xcb, 0x5c, 0x61, 0xe4, 0x70, 0x8b, 0xe9, 0xcf, 0xa6, 0x94, 0x8b, 0x61, 0xf4, 0x69, 0xc4, 0xae, 0xba, 0xb5,
0x72, 0x79, 0x57, 0x26, 0x7f, 0xe5, 0xe3, 0x77, 0xf1, 0x55, 0x5d, 0x5e, 0x7e, 0x55, 0x3f, 0x84, 0x13, 0x2e, 0x9f, 0xdb, 0xb9, 0xe4, 0xf2, 0xae, 0xdc, 0xfc, 0x95, 0x8f, 0xdf, 0xc5, 0x57, 0x75,
0xcd, 0x80, 0xf1, 0xc9, 0x88, 0xcc, 0xb4, 0xeb, 0xb5, 0xe4, 0xf9, 0xa4, 0x75, 0xca, 0xfd, 0xf7, 0x79, 0xf9, 0x55, 0xfd, 0x00, 0x36, 0x02, 0xc6, 0x27, 0x23, 0x32, 0xd3, 0xae, 0x2b, 0xc9, 0xf3,
0x56, 0xbd, 0x70, 0xd7, 0xaf, 0x79, 0xe1, 0x2e, 0xbf, 0x6e, 0xed, 0xdf, 0x1a, 0x70, 0x2f, 0x4b, 0x49, 0xeb, 0x94, 0xfb, 0x1f, 0xac, 0x7a, 0xe1, 0xae, 0x5d, 0xf3, 0xc2, 0x5d, 0x7e, 0xdd, 0xda,
0xd9, 0x09, 0x98, 0x18, 0x5c, 0x90, 0x98, 0x06, 0x73, 0xce, 0xbd, 0x3a, 0xf1, 0xc5, 0x24, 0x4a, 0xbf, 0x37, 0xe0, 0x6e, 0xb6, 0x65, 0x27, 0x60, 0x62, 0x70, 0x41, 0x62, 0x1a, 0xcc, 0x39, 0xf7,
0xcb, 0x49, 0xac, 0x8c, 0xd0, 0xfc, 0xe2, 0x11, 0xfe, 0x3e, 0x1f, 0x61, 0x87, 0x84, 0x3e, 0x1d, 0xea, 0x8d, 0x2f, 0x6e, 0xa2, 0xb4, 0xbc, 0x89, 0x95, 0x11, 0x9a, 0x5f, 0x3d, 0xc2, 0x3f, 0xe6,
0xfd, 0x4f, 0x6f, 0x8d, 0xfd, 0x77, 0x03, 0xde, 0x5a, 0x8d, 0x22, 0x4c, 0xf9, 0x24, 0x0a, 0x39, 0x23, 0xec, 0x90, 0xd0, 0xa7, 0xa3, 0xff, 0xe9, 0xd2, 0xd8, 0x5f, 0x96, 0xe0, 0xcd, 0xd5, 0x28,
0xbd, 0x22, 0xe4, 0xef, 0x40, 0x35, 0x5b, 0xea, 0x35, 0x1d, 0x28, 0x77, 0x1f, 0xe3, 0xf9, 0x04, 0xc2, 0x94, 0x4f, 0xa2, 0x90, 0xd3, 0x2b, 0x42, 0xfe, 0x3e, 0xd4, 0xb2, 0xa5, 0x5e, 0xd1, 0x81,
0x79, 0xda, 0xe4, 0x6b, 0x4f, 0x51, 0x01, 0x53, 0x01, 0x3c, 0x93, 0xe5, 0x7a, 0xe7, 0x31, 0x09, 0x72, 0xf7, 0x31, 0x9e, 0x4f, 0x90, 0xa7, 0x4d, 0xbe, 0xf6, 0x14, 0x15, 0x30, 0x15, 0xc0, 0x33,
0x45, 0x92, 0x91, 0x16, 0x96, 0xd2, 0x5d, 0x5b, 0x4e, 0xf7, 0x3e, 0x80, 0x66, 0x49, 0xde, 0x34, 0x59, 0xae, 0x77, 0x1e, 0x93, 0x50, 0x24, 0x3b, 0xd2, 0xc2, 0xd2, 0x76, 0x2b, 0xcb, 0xdb, 0xbd,
0x66, 0xc9, 0x0b, 0xba, 0xaa, 0x35, 0x27, 0x31, 0xb3, 0x31, 0xec, 0x2d, 0x67, 0xfa, 0x82, 0x92, 0x07, 0xa0, 0x59, 0x92, 0x37, 0x8d, 0x59, 0xf2, 0x82, 0xae, 0x69, 0xcd, 0x49, 0xcc, 0xd0, 0x07,
0x4b, 0xfa, 0x6f, 0xe3, 0xc6, 0xfe, 0x3e, 0x3c, 0xcc, 0x75, 0x27, 0x7d, 0x01, 0x2c, 0x12, 0xb2, 0x70, 0x47, 0xc6, 0x47, 0x7d, 0x41, 0x03, 0x4f, 0x44, 0x13, 0xe6, 0xa7, 0x14, 0xde, 0x93, 0xad,
0x2b, 0xbc, 0x17, 0xa3, 0x2d, 0x2d, 0x46, 0xfb, 0x47, 0x03, 0x6a, 0x2f, 0xc9, 0xab, 0x69, 0xca, 0x68, 0x5d, 0x39, 0xb4, 0x32, 0x93, 0xa1, 0xb4, 0x48, 0x28, 0xfd, 0x33, 0x3a, 0x43, 0x6f, 0x41,
0x9e, 0x1a, 0x60, 0x72, 0x76, 0x9e, 0xfc, 0xad, 0x25, 0x3f, 0x65, 0x9f, 0x11, 0x6c, 0x4c, 0xb9, 0x45, 0xfd, 0xf1, 0xa4, 0x1e, 0x46, 0xf5, 0xc3, 0xad, 0xf9, 0x66, 0x25, 0x0a, 0x03, 0xac, 0x47,
0x20, 0xe3, 0x89, 0x9a, 0x5f, 0xc6, 0x73, 0x85, 0x5c, 0x54, 0x44, 0x13, 0xe6, 0xab, 0xf2, 0x6e, 0x6d, 0x0c, 0xbb, 0xcb, 0xf9, 0x7c, 0x4e, 0xc9, 0x25, 0xfd, 0xb7, 0xd1, 0x69, 0xff, 0x10, 0x1e,
0x62, 0x2d, 0xa8, 0x47, 0x3b, 0x99, 0x8d, 0x22, 0x92, 0xe2, 0x25, 0x15, 0xf5, 0x48, 0x10, 0xb0, 0xe4, 0x7a, 0xa0, 0xbe, 0x66, 0x16, 0x69, 0xdf, 0x15, 0xde, 0x8b, 0x39, 0x29, 0x2d, 0xe4, 0xc4,
0xf0, 0x3c, 0x29, 0x6d, 0x2a, 0xca, 0x6e, 0x79, 0x41, 0xf8, 0x85, 0x2a, 0xe8, 0x26, 0x56, 0xdf, 0xfe, 0xb3, 0x01, 0xf5, 0x17, 0xe4, 0xe5, 0x34, 0xe5, 0x68, 0x4d, 0x30, 0x39, 0x3b, 0x4f, 0xfe,
0xc8, 0x86, 0x4d, 0x71, 0xc1, 0xe2, 0xe0, 0x98, 0xc4, 0xb2, 0x0e, 0xc9, 0x53, 0xb2, 0xa0, 0xb3, 0x3c, 0x93, 0x9f, 0xb2, 0x9b, 0x09, 0x36, 0xa6, 0x5c, 0x90, 0xf1, 0x44, 0xcd, 0x2f, 0xe3, 0xb9,
0x7f, 0x0e, 0xfb, 0xb9, 0x04, 0xd2, 0xb2, 0xa4, 0xb4, 0xc8, 0x82, 0x8d, 0x4b, 0x1a, 0xcb, 0xdb, 0x42, 0x2e, 0xaa, 0x32, 0xa9, 0x8a, 0xb8, 0x81, 0xb5, 0xa0, 0xfe, 0x1a, 0x20, 0xb3, 0x51, 0x44,
0x48, 0xe5, 0x54, 0xc7, 0xa9, 0x28, 0xd7, 0x3b, 0x8b, 0xa3, 0x71, 0x92, 0x92, 0xfa, 0x96, 0x2f, 0x52, 0x54, 0xa6, 0xa2, 0x1e, 0x09, 0x02, 0x16, 0x9e, 0x27, 0x05, 0x4c, 0x45, 0xd9, 0x93, 0x2f,
0x43, 0x11, 0x25, 0x7f, 0x64, 0x95, 0x44, 0x24, 0xd7, 0x97, 0x2f, 0x6e, 0x1a, 0x8a, 0xa1, 0x4a, 0x08, 0xbf, 0x50, 0x65, 0xdb, 0xc0, 0xea, 0x1b, 0xd9, 0xb0, 0x21, 0x2e, 0x58, 0x1c, 0x1c, 0x93,
0x52, 0x3e, 0xd0, 0x36, 0x71, 0x41, 0x67, 0xff, 0xce, 0x00, 0xb4, 0x1c, 0xc0, 0x6b, 0x16, 0xfe, 0x58, 0xe6, 0x21, 0x79, 0xb0, 0x16, 0x74, 0xf6, 0x2f, 0x61, 0x2f, 0xb7, 0x81, 0x34, 0x2d, 0x29,
0x08, 0x2a, 0x19, 0xed, 0xd3, 0x88, 0xce, 0xdd, 0xcb, 0x57, 0xa7, 0x82, 0xb3, 0x59, 0xe8, 0x5d, 0xf9, 0xb2, 0x60, 0xfd, 0x92, 0xc6, 0xf2, 0xce, 0x53, 0x7b, 0x6a, 0xe0, 0x54, 0x94, 0xeb, 0x9d,
0xe9, 0x41, 0xd9, 0xa4, 0xdd, 0xe3, 0xf6, 0x4a, 0x0f, 0x38, 0x33, 0xb3, 0xff, 0x64, 0xc0, 0x83, 0xc5, 0xd1, 0x38, 0xd9, 0x92, 0xfa, 0x96, 0xef, 0x4f, 0x11, 0x25, 0x7f, 0x97, 0x95, 0x44, 0x24,
0x65, 0xdf, 0xdd, 0x30, 0xa0, 0x3f, 0x7d, 0x83, 0x5a, 0x7d, 0xf9, 0x90, 0x77, 0x61, 0x3d, 0x3a, 0xd7, 0x97, 0xef, 0x7a, 0x1a, 0x0a, 0x05, 0x06, 0xf5, 0x0c, 0xdc, 0xc0, 0x05, 0x9d, 0xfd, 0x07,
0x3b, 0xe3, 0x54, 0x24, 0xd5, 0x4d, 0x24, 0xb9, 0x0b, 0x9c, 0xfd, 0x8c, 0x26, 0xff, 0x7a, 0xaa, 0x03, 0xd0, 0x72, 0x00, 0xaf, 0x58, 0xf8, 0x63, 0xa8, 0x66, 0xe4, 0x52, 0x9f, 0x9b, 0xdc, 0xed,
0xef, 0x45, 0x8c, 0x94, 0x33, 0x8c, 0xd8, 0x7f, 0x31, 0x60, 0xef, 0x8a, 0x2c, 0xd0, 0x73, 0xa8, 0x7f, 0xf5, 0x56, 0x70, 0x36, 0x0b, 0xbd, 0x2b, 0x3d, 0x28, 0x9b, 0xb4, 0x47, 0xdd, 0x5a, 0xe9,
0x24, 0x8f, 0x94, 0x94, 0xee, 0x3c, 0x7e, 0x5d, 0x8c, 0x6a, 0x52, 0x2b, 0x11, 0x12, 0xe6, 0x93, 0x01, 0x67, 0x66, 0xf6, 0x5f, 0x0c, 0xb8, 0xbf, 0xec, 0xbb, 0x1b, 0x06, 0xf4, 0xe7, 0xaf, 0x91,
0x39, 0xd8, 0x3f, 0x83, 0x7a, 0x61, 0x68, 0x05, 0x91, 0xf8, 0xb0, 0x48, 0x24, 0xde, 0xbe, 0x76, 0xab, 0xaf, 0x1f, 0xf2, 0x0e, 0xac, 0x45, 0x67, 0x67, 0x9c, 0x8a, 0x24, 0xbb, 0x89, 0x24, 0xab,
0xb1, 0xac, 0x2a, 0x73, 0x62, 0xf1, 0xb4, 0xfe, 0x79, 0xad, 0xf5, 0xf8, 0xfd, 0x74, 0xe6, 0xe9, 0xc0, 0xd9, 0x2f, 0x68, 0xf2, 0xdf, 0xaa, 0xfa, 0x5e, 0xc4, 0x48, 0x39, 0xc3, 0x88, 0xfd, 0xa5,
0xba, 0xfa, 0xfa, 0xc6, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xba, 0xde, 0x8a, 0xe5, 0xae, 0x16, 0x01, 0xbb, 0x57, 0xec, 0x02, 0x3d, 0x83, 0x6a, 0xf2, 0x14, 0x4a, 0x49, 0xd5, 0xa3, 0x57, 0xc5,
0x00, 0x00, 0xa8, 0x26, 0x1d, 0x24, 0x42, 0xc2, 0xaf, 0x32, 0x07, 0x7b, 0x67, 0xd0, 0x28, 0x0c, 0xad, 0xa0,
0x2b, 0x1f, 0x15, 0xe9, 0xca, 0xdb, 0xd7, 0x2e, 0x96, 0x65, 0x65, 0x4e, 0x5f, 0x9e, 0x34, 0xbe,
0xa8, 0x1f, 0x3c, 0x7a, 0x3f, 0x9d, 0x79, 0xba, 0xa6, 0xbe, 0xbe, 0xfd, 0xaf, 0x00, 0x00, 0x00,
0xff, 0xff, 0xa6, 0x25, 0xae, 0xc0, 0x21, 0x17, 0x00, 0x00,
} }

View File

@ -3,6 +3,7 @@ syntax = "proto3";
option go_package = "./;protobuf"; option go_package = "./;protobuf";
import "chat_identity.proto"; import "chat_identity.proto";
import "enums.proto"; import "enums.proto";
import "shard.proto";
package protobuf; package protobuf;
@ -155,6 +156,8 @@ message CommunityRequestToJoinResponse {
bytes grant = 4; bytes grant = 4;
bytes community_id = 5; bytes community_id = 5;
string magnet_uri = 6; string magnet_uri = 6;
bytes protected_topic_private_key = 7;
Shard shard = 8;
} }
message CommunityRequestToLeave { message CommunityRequestToLeave {

View File

@ -0,0 +1,107 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: community_shard_key.proto
package protobuf
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type CommunityShardKey struct {
CommunityId []byte `protobuf:"bytes,1,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
PrivateKey []byte `protobuf:"bytes,2,opt,name=private_key,json=privateKey,proto3" json:"private_key,omitempty"`
Clock uint64 `protobuf:"varint,3,opt,name=clock,proto3" json:"clock,omitempty"`
Shard *Shard `protobuf:"bytes,4,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CommunityShardKey) Reset() { *m = CommunityShardKey{} }
func (m *CommunityShardKey) String() string { return proto.CompactTextString(m) }
func (*CommunityShardKey) ProtoMessage() {}
func (*CommunityShardKey) Descriptor() ([]byte, []int) {
return fileDescriptor_03da8310cde9b7b2, []int{0}
}
func (m *CommunityShardKey) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommunityShardKey.Unmarshal(m, b)
}
func (m *CommunityShardKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommunityShardKey.Marshal(b, m, deterministic)
}
func (m *CommunityShardKey) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommunityShardKey.Merge(m, src)
}
func (m *CommunityShardKey) XXX_Size() int {
return xxx_messageInfo_CommunityShardKey.Size(m)
}
func (m *CommunityShardKey) XXX_DiscardUnknown() {
xxx_messageInfo_CommunityShardKey.DiscardUnknown(m)
}
var xxx_messageInfo_CommunityShardKey proto.InternalMessageInfo
func (m *CommunityShardKey) GetCommunityId() []byte {
if m != nil {
return m.CommunityId
}
return nil
}
func (m *CommunityShardKey) GetPrivateKey() []byte {
if m != nil {
return m.PrivateKey
}
return nil
}
func (m *CommunityShardKey) GetClock() uint64 {
if m != nil {
return m.Clock
}
return 0
}
func (m *CommunityShardKey) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
func init() {
proto.RegisterType((*CommunityShardKey)(nil), "protobuf.CommunityShardKey")
}
func init() {
proto.RegisterFile("community_shard_key.proto", fileDescriptor_03da8310cde9b7b2)
}
var fileDescriptor_03da8310cde9b7b2 = []byte{
// 173 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xce, 0xcf, 0xcd,
0x2d, 0xcd, 0xcb, 0x2c, 0xa9, 0x8c, 0x2f, 0xce, 0x48, 0x2c, 0x4a, 0x89, 0xcf, 0x4e, 0xad, 0xd4,
0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x52, 0xdc, 0x60, 0x29,
0x88, 0xb0, 0xd2, 0x14, 0x46, 0x2e, 0x41, 0x67, 0x98, 0xa6, 0x60, 0x90, 0x84, 0x77, 0x6a, 0xa5,
0x90, 0x22, 0x17, 0x0f, 0xc2, 0xa4, 0xcc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x6e,
0xb8, 0x98, 0x67, 0x8a, 0x90, 0x3c, 0x17, 0x77, 0x41, 0x51, 0x66, 0x59, 0x62, 0x49, 0x2a, 0xc8,
0x12, 0x09, 0x26, 0xb0, 0x0a, 0x2e, 0xa8, 0x10, 0xc8, 0x0c, 0x11, 0x2e, 0xd6, 0xe4, 0x9c, 0xfc,
0xe4, 0x6c, 0x09, 0x66, 0x05, 0x46, 0x0d, 0x96, 0x20, 0x08, 0x47, 0x48, 0x95, 0x8b, 0x15, 0x6c,
0xbd, 0x04, 0x8b, 0x02, 0xa3, 0x06, 0xb7, 0x11, 0xbf, 0x1e, 0xcc, 0x59, 0x7a, 0x60, 0xcb, 0x83,
0x20, 0xb2, 0x4e, 0xbc, 0x51, 0xdc, 0x7a, 0xfa, 0xd6, 0x30, 0xb9, 0x24, 0x36, 0x30, 0xcb, 0x18,
0x10, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xda, 0x17, 0x6d, 0xe0, 0x00, 0x00, 0x00,
}

View File

@ -0,0 +1,14 @@
syntax = "proto3";
option go_package = "./;protobuf";
package protobuf;
import "shard.proto";
message CommunityShardKey {
bytes community_id = 1;
bytes private_key = 2;
uint64 clock = 3;
Shard shard = 4;
}

View File

@ -4,7 +4,7 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
) )
//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto ./emoji_reaction.proto ./enums.proto ./group_chat_invitation.proto ./chat_identity.proto ./communities.proto ./pin_message.proto ./anon_metrics.proto ./status_update.proto ./sync_settings.proto ./contact_verification.proto ./community_update.proto ./url_data.proto ./community_privileged_user_sync_message.proto //go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto ./emoji_reaction.proto ./enums.proto ./shard.proto ./group_chat_invitation.proto ./chat_identity.proto ./communities.proto ./pin_message.proto ./anon_metrics.proto ./status_update.proto ./sync_settings.proto ./contact_verification.proto ./community_update.proto ./community_shard_key.proto ./url_data.proto ./community_privileged_user_sync_message.proto
func Unmarshal(payload []byte) (*ApplicationMetadataMessage, error) { func Unmarshal(payload []byte) (*ApplicationMetadataMessage, error) {
var message ApplicationMetadataMessage var message ApplicationMetadataMessage

View File

@ -0,0 +1,87 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: shard.proto
package protobuf
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type Shard struct {
Cluster int32 `protobuf:"varint,1,opt,name=cluster,proto3" json:"cluster,omitempty"`
Index int32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Shard) Reset() { *m = Shard{} }
func (m *Shard) String() string { return proto.CompactTextString(m) }
func (*Shard) ProtoMessage() {}
func (*Shard) Descriptor() ([]byte, []int) {
return fileDescriptor_319ea41e44cdc364, []int{0}
}
func (m *Shard) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Shard.Unmarshal(m, b)
}
func (m *Shard) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Shard.Marshal(b, m, deterministic)
}
func (m *Shard) XXX_Merge(src proto.Message) {
xxx_messageInfo_Shard.Merge(m, src)
}
func (m *Shard) XXX_Size() int {
return xxx_messageInfo_Shard.Size(m)
}
func (m *Shard) XXX_DiscardUnknown() {
xxx_messageInfo_Shard.DiscardUnknown(m)
}
var xxx_messageInfo_Shard proto.InternalMessageInfo
func (m *Shard) GetCluster() int32 {
if m != nil {
return m.Cluster
}
return 0
}
func (m *Shard) GetIndex() int32 {
if m != nil {
return m.Index
}
return 0
}
func init() {
proto.RegisterType((*Shard)(nil), "protobuf.Shard")
}
func init() {
proto.RegisterFile("shard.proto", fileDescriptor_319ea41e44cdc364)
}
var fileDescriptor_319ea41e44cdc364 = []byte{
// 99 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2e, 0xce, 0x48, 0x2c,
0x4a, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x4a, 0xe6,
0x5c, 0xac, 0xc1, 0x20, 0x09, 0x21, 0x09, 0x2e, 0xf6, 0xe4, 0x9c, 0xd2, 0xe2, 0x92, 0xd4, 0x22,
0x09, 0x46, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x18, 0x57, 0x48, 0x84, 0x8b, 0x35, 0x33, 0x2f, 0x25,
0xb5, 0x42, 0x82, 0x09, 0x2c, 0x0e, 0xe1, 0x38, 0xf1, 0x46, 0x71, 0xeb, 0xe9, 0x5b, 0xc3, 0xcc,
0x49, 0x62, 0x03, 0xb3, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xef, 0xcf, 0x9d, 0x21, 0x67,
0x00, 0x00, 0x00,
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
option go_package = "./;protobuf";
package protobuf;
message Shard {
int32 cluster = 1;
int32 index = 2;
}

View File

@ -228,6 +228,7 @@ func (m *User) GetColor() string {
type URLData struct { type URLData struct {
// Community, Channel, or User // Community, Channel, or User
Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
Shard *Shard `protobuf:"bytes,2,opt,name=shard,proto3" json:"shard,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -265,6 +266,13 @@ func (m *URLData) GetContent() []byte {
return nil return nil
} }
func (m *URLData) GetShard() *Shard {
if m != nil {
return m.Shard
}
return nil
}
func init() { func init() {
proto.RegisterType((*Community)(nil), "protobuf.Community") proto.RegisterType((*Community)(nil), "protobuf.Community")
proto.RegisterType((*Channel)(nil), "protobuf.Channel") proto.RegisterType((*Channel)(nil), "protobuf.Channel")
@ -277,24 +285,26 @@ func init() {
} }
var fileDescriptor_5f1e15b5f0115710 = []byte{ var fileDescriptor_5f1e15b5f0115710 = []byte{
// 295 bytes of a gzipped FileDescriptorProto // 321 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x90, 0xb1, 0x4e, 0xeb, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0xb1, 0x4e, 0xc3, 0x30,
0x14, 0x86, 0xe5, 0xdb, 0xa6, 0xbd, 0x39, 0x69, 0x18, 0x4c, 0x07, 0x6f, 0x84, 0x74, 0xc9, 0x14, 0x10, 0x40, 0x15, 0xda, 0xb4, 0xe4, 0xdc, 0x80, 0x64, 0x3a, 0x58, 0x2c, 0x84, 0x20, 0xa4, 0x4c,
0x04, 0x8c, 0x6c, 0x94, 0x05, 0x09, 0x31, 0x58, 0xea, 0xc2, 0x12, 0x39, 0x8e, 0x29, 0x46, 0xb1, 0x41, 0x94, 0x91, 0x8d, 0xb2, 0x80, 0x10, 0x83, 0x51, 0x17, 0x96, 0xc8, 0x4d, 0x4c, 0x6b, 0x14,
0x1d, 0x39, 0xf6, 0xd0, 0x77, 0xe2, 0x25, 0x78, 0x33, 0x84, 0x93, 0x50, 0x16, 0xb6, 0x4e, 0x3e, 0xdb, 0x95, 0xe3, 0x0c, 0xfd, 0x27, 0x7e, 0x82, 0x3f, 0x43, 0xb5, 0x1b, 0xc2, 0xc2, 0xd6, 0xc9,
0xff, 0xa7, 0xa3, 0xe3, 0x4f, 0x3f, 0x9c, 0x79, 0xdb, 0x56, 0x0d, 0x73, 0xac, 0xec, 0xac, 0x71, 0x77, 0xef, 0x4e, 0xe7, 0xe7, 0x93, 0xe1, 0xa4, 0x35, 0x75, 0x51, 0x31, 0xcb, 0xf2, 0x8d, 0xd1,
0x06, 0xff, 0x0f, 0x4f, 0xed, 0x5f, 0xf3, 0x0f, 0x04, 0xf1, 0xd6, 0x28, 0xe5, 0xb5, 0x74, 0x07, 0x56, 0xe3, 0x63, 0x77, 0x2c, 0xdb, 0x8f, 0x73, 0xd4, 0xac, 0x99, 0xa9, 0x3c, 0x4e, 0xbf, 0x02,
0x7c, 0x09, 0xab, 0x46, 0xf6, 0x5d, 0xcb, 0x0e, 0x95, 0x66, 0x4a, 0x10, 0x94, 0xa1, 0x22, 0xa6, 0x88, 0xe6, 0x5a, 0xca, 0x56, 0x09, 0xbb, 0xc5, 0x97, 0x30, 0xa9, 0x44, 0xb3, 0xa9, 0xd9, 0xb6,
0xc9, 0xc8, 0x9e, 0x99, 0x12, 0x38, 0x83, 0xa4, 0x11, 0x3d, 0xb7, 0xb2, 0x73, 0xd2, 0x68, 0xf2, 0x50, 0x4c, 0x72, 0x12, 0x24, 0x41, 0x16, 0x51, 0xb4, 0x67, 0xaf, 0x4c, 0x72, 0x9c, 0x00, 0xaa,
0x6f, 0xdc, 0x38, 0x22, 0xbc, 0x81, 0x54, 0x09, 0x55, 0x0b, 0xdb, 0x57, 0xdc, 0x78, 0xed, 0xc8, 0x78, 0x53, 0x1a, 0xb1, 0xb1, 0x42, 0x2b, 0x72, 0xb4, 0xef, 0xe8, 0x11, 0xbe, 0x82, 0x58, 0x72,
0x2c, 0x43, 0x45, 0x4a, 0x57, 0x23, 0xdc, 0x7e, 0x33, 0xbc, 0x86, 0x88, 0x9b, 0xd6, 0x58, 0x32, 0xb9, 0xe4, 0xa6, 0x29, 0x4a, 0xdd, 0x2a, 0x4b, 0x06, 0x49, 0x90, 0xc5, 0x74, 0xb2, 0x87, 0xf3,
0x0f, 0x07, 0x86, 0x80, 0x2f, 0x20, 0x71, 0x6c, 0x5f, 0x49, 0xdd, 0x48, 0x2e, 0x7a, 0x12, 0x65, 0x1d, 0xc3, 0x53, 0x08, 0x4b, 0x5d, 0x6b, 0x43, 0x86, 0x6e, 0x80, 0x4f, 0xf0, 0x05, 0x20, 0xcb,
0xb3, 0x22, 0xa5, 0xe0, 0xd8, 0xfe, 0x71, 0x20, 0xf9, 0x27, 0x82, 0xe5, 0xf6, 0x8d, 0x69, 0x2d, 0x56, 0x85, 0x50, 0x95, 0x28, 0x79, 0x43, 0xc2, 0x64, 0x90, 0xc5, 0x14, 0x2c, 0x5b, 0x3d, 0x79,
0xda, 0xd3, 0xc8, 0xae, 0x21, 0x12, 0xca, 0xbc, 0xcb, 0x20, 0x19, 0xd3, 0x21, 0xfc, 0x61, 0x77, 0x92, 0x7e, 0x07, 0x30, 0x9e, 0xaf, 0x99, 0x52, 0xbc, 0x3e, 0x8c, 0xec, 0x14, 0x42, 0x2e, 0xf5,
0x0d, 0x31, 0x9f, 0xaa, 0x22, 0x51, 0x86, 0x8a, 0xe4, 0xe6, 0xbc, 0x9c, 0x9a, 0x2c, 0x7f, 0x5a, 0xa7, 0x70, 0x92, 0x11, 0xf5, 0xc9, 0x3f, 0x76, 0xb7, 0x10, 0x95, 0xdd, 0xaa, 0x48, 0x98, 0x04,
0xa4, 0xc7, 0x2d, 0x8c, 0x61, 0xee, 0xbd, 0x6c, 0xc8, 0x22, 0xdc, 0x09, 0x73, 0xce, 0x60, 0xbe, 0x19, 0x9a, 0x9d, 0xe5, 0xdd, 0x5a, 0xf3, 0xdf, 0x2d, 0xd2, 0xbe, 0x0b, 0x63, 0x18, 0xb6, 0xad,
0xeb, 0x85, 0x3d, 0x99, 0xff, 0x60, 0x3a, 0xfb, 0x65, 0x9a, 0x6f, 0x60, 0xb9, 0xa3, 0x4f, 0x0f, 0xa8, 0xc8, 0xc8, 0xcd, 0x71, 0x71, 0xca, 0x60, 0xb8, 0x68, 0xb8, 0x39, 0x98, 0xbf, 0x37, 0x1d,
0xcc, 0x31, 0x4c, 0x60, 0xc9, 0x8d, 0x76, 0x42, 0xbb, 0xf0, 0xc1, 0x8a, 0x4e, 0xf1, 0x3e, 0x7d, 0xfc, 0x31, 0x4d, 0x9f, 0x61, 0xbc, 0xa0, 0x2f, 0x8f, 0xcc, 0x32, 0x4c, 0x60, 0x5c, 0x6a, 0x65,
0x49, 0xca, 0xab, 0xbb, 0xc9, 0xbf, 0x5e, 0x84, 0xe9, 0xf6, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xb9, 0xb2, 0xee, 0x82, 0x09, 0xed, 0x52, 0x7c, 0x0d, 0xa1, 0xfb, 0x09, 0x6e, 0x2c, 0x9a, 0x9d,
0x08, 0xbf, 0x32, 0x2c, 0x02, 0x00, 0x00, 0xf6, 0x4f, 0x79, 0xdb, 0x61, 0xea, 0xab, 0x0f, 0xf1, 0x3b, 0xca, 0x6f, 0xee, 0xbb, 0xda, 0x72,
0xe4, 0xa2, 0xbb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, 0x2e, 0xf3, 0xde, 0x60, 0x02, 0x00,
0x00,
} }

View File

@ -3,6 +3,8 @@ syntax = "proto3";
option go_package = "./;protobuf"; option go_package = "./;protobuf";
package protobuf; package protobuf;
import "shard.proto";
message Community { message Community {
string display_name = 1; string display_name = 1;
string description = 2; string description = 2;
@ -29,4 +31,5 @@ message User {
message URLData { message URLData {
// Community, Channel, or User // Community, Channel, or User
bytes content = 1; bytes content = 1;
Shard shard = 2;
} }

View File

@ -0,0 +1,30 @@
package requests
import (
"errors"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/common"
)
type SetCommunityShard struct {
CommunityID types.HexBytes `json:"communityId"`
Shard *common.Shard `json:"shard,omitempty"`
PrivateKey *types.HexBytes `json:"privateKey,omitempty"`
}
func (s *SetCommunityShard) Validate() error {
if s == nil {
return errors.New("invalid request")
}
if s.Shard != nil {
// TODO: for now only MainStatusShard(16) is accepted
if s.Shard.Cluster != common.MainStatusShard {
return errors.New("invalid shard cluster")
}
if s.Shard.Index > 1023 {
return errors.New("invalid shard index. Only 0-1023 is allowed")
}
}
return nil
}

View File

@ -8,9 +8,10 @@ import (
"sync" "sync"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
) )
@ -18,6 +19,11 @@ const (
minPow = 0.0 minPow = 0.0
) )
type Shard struct {
Cluster uint16
Index uint16
}
type RawFilter struct { type RawFilter struct {
FilterID string FilterID string
Topic types.TopicType Topic types.TopicType
@ -131,7 +137,7 @@ func (f *FiltersManager) InitPublicFilters(publicFiltersToInit []FiltersToInitia
var filters []*Filter var filters []*Filter
// Add public, one-to-one and negotiated filters. // Add public, one-to-one and negotiated filters.
for _, pf := range publicFiltersToInit { for _, pf := range publicFiltersToInit {
f, err := f.LoadPublic(pf.ChatID, pf.PubsubTopic) // TODO: pubsubtopic f, err := f.LoadPublic(pf.ChatID, pf.PubsubTopic)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -141,8 +147,8 @@ func (f *FiltersManager) InitPublicFilters(publicFiltersToInit []FiltersToInitia
} }
type CommunityFilterToInitialize struct { type CommunityFilterToInitialize struct {
CommunityID []byte Shard *Shard
PrivKey *ecdsa.PrivateKey PrivKey *ecdsa.PrivateKey
} }
func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []CommunityFilterToInitialize) ([]*Filter, error) { func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []CommunityFilterToInitialize) ([]*Filter, error) {
@ -151,30 +157,43 @@ func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []Com
defer f.mutex.Unlock() defer f.mutex.Unlock()
for _, cf := range communityFiltersToInitialize { for _, cf := range communityFiltersToInitialize {
pubsubTopic := GetPubsubTopic(cf.CommunityID) if cf.PrivKey == nil {
identityStr := PublicKeyToStr(&cf.PrivKey.PublicKey) continue
rawFilter, err := f.addAsymmetric(identityStr, pubsubTopic, cf.PrivKey, true)
if err != nil {
f.logger.Debug("could not register community filter", zap.Error(err))
return nil, err
}
filterID := identityStr + "-admin"
filter := &Filter{
ChatID: filterID,
FilterID: rawFilter.FilterID,
PubsubTopic: pubsubTopic,
ContentTopic: rawFilter.Topic,
Identity: identityStr,
Listen: true,
OneToOne: true,
} }
f.filters[filterID] = filter communityPubsubTopic := GetPubsubTopic(cf.Shard)
topics := []string{communityPubsubTopic}
if communityPubsubTopic != relay.DefaultWakuTopic {
topics = append(topics, relay.DefaultWakuTopic)
}
f.logger.Debug("registering filter for", zap.String("chatID", filterID), zap.String("type", "community"), zap.String("topic", rawFilter.Topic.String())) // TODO: requests to join / cancels are currently being sent into the default waku topic.
// They must be sent into an specific non protected shard
for _, pubsubTopic := range topics {
identityStr := PublicKeyToStr(&cf.PrivKey.PublicKey)
rawFilter, err := f.addAsymmetric(identityStr, pubsubTopic, cf.PrivKey, true)
if err != nil {
f.logger.Debug("could not register community filter", zap.Error(err))
return nil, err
filters = append(filters, filter) }
filterID := identityStr + "-admin"
filter := &Filter{
ChatID: filterID,
FilterID: rawFilter.FilterID,
PubsubTopic: pubsubTopic,
ContentTopic: rawFilter.Topic,
Identity: identityStr,
Listen: true,
OneToOne: true,
}
f.filters[filterID] = filter
f.logger.Debug("registering filter for", zap.String("chatID", filterID), zap.String("type", "community"), zap.String("topic", rawFilter.Topic.String()))
filters = append(filters, filter)
}
} }
return filters, nil return filters, nil
} }

View File

@ -13,9 +13,11 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
"github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peer"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/waku-org/go-waku/waku/v2/protocol"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/status-im/status-go/connection" "github.com/status-im/status-go/connection"
"github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto"
@ -672,6 +674,14 @@ func (t *Transport) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey)
return t.waku.StorePubsubTopicKey(topic, privKey) return t.waku.StorePubsubTopicKey(topic, privKey)
} }
func GetPubsubTopic(communityID []byte) string { func (t *Transport) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
return t.waku.RetrievePubsubTopicKey(topic)
}
func GetPubsubTopic(shard *Shard) string {
if shard != nil {
return protocol.NewStaticShardingPubsubTopic(shard.Cluster, shard.Index).String()
}
return relay.DefaultWakuTopic return relay.DefaultWakuTopic
} }

View File

@ -436,6 +436,11 @@ func (api *PublicAPI) RemovePrivateKey(id types.HexBytes) (*protocol.MessengerRe
return api.service.messenger.RemovePrivateKey(id) return api.service.messenger.RemovePrivateKey(id)
} }
// Sets the community shard for a community and updates all active filters for the community
func (api *PublicAPI) SetCommunityShard(request *requests.SetCommunityShard) (*protocol.MessengerResponse, error) {
return api.service.messenger.SetCommunityShard(request)
}
// ExportCommunity exports the private key of the community with given ID // ExportCommunity exports the private key of the community with given ID
func (api *PublicAPI) ExportCommunity(id types.HexBytes) (types.HexBytes, error) { func (api *PublicAPI) ExportCommunity(id types.HexBytes) (types.HexBytes, error) {
key, err := api.service.messenger.ExportCommunity(id) key, err := api.service.messenger.ExportCommunity(id)
@ -1169,12 +1174,22 @@ func (api *PublicAPI) EnsVerified(pk, ensName string) error {
return api.service.messenger.ENSVerified(pk, ensName) return api.service.messenger.ENSVerified(pk, ensName)
} }
// DEPRECATED
func (api *PublicAPI) RequestCommunityInfoFromMailserver(communityID string) (*communities.Community, error) { func (api *PublicAPI) RequestCommunityInfoFromMailserver(communityID string) (*communities.Community, error) {
return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, true) return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, nil, true)
} }
func (api *PublicAPI) RequestCommunityInfoFromMailserverWithShard(communityID string, shard *common.Shard) (*communities.Community, error) {
return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, shard, true)
}
// DEPRECATED
func (api *PublicAPI) RequestCommunityInfoFromMailserverAsync(communityID string) error { func (api *PublicAPI) RequestCommunityInfoFromMailserverAsync(communityID string) error {
return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID) return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID, nil)
}
func (api *PublicAPI) RequestCommunityInfoFromMailserverAsyncWithShard(communityID string, shard *common.Shard) error {
return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID, shard)
} }
func (api *PublicAPI) ActivityCenterNotifications(request protocol.ActivityCenterNotificationsRequest) (*protocol.ActivityCenterPaginationResponse, error) { func (api *PublicAPI) ActivityCenterNotifications(request protocol.ActivityCenterNotificationsRequest) (*protocol.ActivityCenterPaginationResponse, error) {

View File

@ -561,6 +561,10 @@ func (s *Service) CanProvideCollectibleMetadata(id thirdparty.CollectibleUniqueI
} }
func (s *Service) FetchCollectibleMetadata(id thirdparty.CollectibleUniqueID, tokenURI string) (*thirdparty.FullCollectibleData, error) { func (s *Service) FetchCollectibleMetadata(id thirdparty.CollectibleUniqueID, tokenURI string) (*thirdparty.FullCollectibleData, error) {
if s.messenger == nil {
return nil, fmt.Errorf("messenger not ready")
}
communityID := tokenURIToCommunityID(tokenURI) communityID := tokenURIToCommunityID(tokenURI)
if communityID == "" { if communityID == "" {
@ -670,7 +674,12 @@ func (s *Service) fetchCommunity(communityID string) (*communities.Community, er
} }
// Try to fetch metadata from Messenger communities // Try to fetch metadata from Messenger communities
community, err := s.messenger.RequestCommunityInfoFromMailserver(communityID, true)
// TODO: we need the shard information in the collectible to be able to retrieve info for
// communities that have specific shards
var shard *common.Shard = nil // TODO: build this with info from token
community, err := s.messenger.RequestCommunityInfoFromMailserver(communityID, shard, true)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -5,6 +5,7 @@ import (
"testing" "testing"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/waku-org/go-waku/waku/v2/protocol/relay" "github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/appdatabase" "github.com/status-im/status-go/appdatabase"

View File

@ -10,6 +10,7 @@ import (
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol" "github.com/status-im/status-go/protocol"
"github.com/status-im/status-go/protocol/common"
) )
// Make sure that Service implements node.Lifecycle interface. // Make sure that Service implements node.Lifecycle interface.
@ -69,12 +70,12 @@ type PublicAPI struct {
service *Service service *Service
} }
func (p *PublicAPI) CommunityInfo(communityID types.HexBytes) (json.RawMessage, error) { func (p *PublicAPI) CommunityInfo(communityID types.HexBytes, shard *common.Shard) (json.RawMessage, error) {
if p.service.messenger == nil { if p.service.messenger == nil {
return nil, ErrNotInitialized return nil, ErrNotInitialized
} }
community, err := p.service.messenger.RequestCommunityInfoFromMailserver(communityID.String(), true) community, err := p.service.messenger.RequestCommunityInfoFromMailserver(communityID.String(), shard, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -22,9 +22,10 @@ import (
"testing" "testing"
"time" "time"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"golang.org/x/exp/maps" "golang.org/x/exp/maps"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/status-im/status-go/wakuv2/common" "github.com/status-im/status-go/wakuv2/common"
) )

View File

@ -23,10 +23,11 @@ import (
"fmt" "fmt"
"sync" "sync"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"go.uber.org/zap" "go.uber.org/zap"
"golang.org/x/exp/maps" "golang.org/x/exp/maps"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"

View File

@ -13,13 +13,14 @@ import (
"github.com/status-im/status-go/wakuv2/common" "github.com/status-im/status-go/wakuv2/common"
"go.uber.org/zap"
"golang.org/x/exp/maps"
node "github.com/waku-org/go-waku/waku/v2/node" node "github.com/waku-org/go-waku/waku/v2/node"
"github.com/waku-org/go-waku/waku/v2/protocol" "github.com/waku-org/go-waku/waku/v2/protocol"
"github.com/waku-org/go-waku/waku/v2/protocol/filter" "github.com/waku-org/go-waku/waku/v2/protocol/filter"
"github.com/waku-org/go-waku/waku/v2/protocol/relay" "github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/waku-org/go-waku/waku/v2/protocol/subscription" "github.com/waku-org/go-waku/waku/v2/protocol/subscription"
"go.uber.org/zap"
"golang.org/x/exp/maps"
) )
const ( const (

View File

@ -990,16 +990,17 @@ func (w *Waku) broadcast() {
select { select {
case envelope := <-w.sendQueue: case envelope := <-w.sendQueue:
var err error var err error
logger := w.logger.With(zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.String("contentTopic", envelope.Message().ContentTopic), zap.Int64("timestamp", envelope.Message().Timestamp))
if w.settings.LightClient { if w.settings.LightClient {
w.logger.Info("publishing message via lightpush", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic())) w.logger.Info("publishing message via lightpush")
_, err = w.node.Lightpush().PublishToTopic(context.Background(), envelope.Message(), lightpush.WithPubSubTopic(envelope.PubsubTopic())) _, err = w.node.Lightpush().PublishToTopic(context.Background(), envelope.Message(), lightpush.WithPubSubTopic(envelope.PubsubTopic()))
} else { } else {
w.logger.Info("publishing message via relay", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic())) logger.Info("publishing message via relay")
_, err = w.node.Relay().PublishToTopic(context.Background(), envelope.Message(), envelope.PubsubTopic()) _, err = w.node.Relay().PublishToTopic(context.Background(), envelope.Message(), envelope.PubsubTopic())
} }
if err != nil { if err != nil {
w.logger.Error("could not send message", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.Error(err)) logger.Error("could not send message", zap.Error(err))
w.envelopeFeed.Send(common.EnvelopeEvent{ w.envelopeFeed.Send(common.EnvelopeEvent{
Hash: gethcommon.BytesToHash(envelope.Hash()), Hash: gethcommon.BytesToHash(envelope.Hash()),
Event: common.EventEnvelopeExpired, Event: common.EventEnvelopeExpired,
@ -1437,7 +1438,19 @@ func (w *Waku) SubscribeToPubsubTopic(topic string, pubkey *ecdsa.PublicKey) err
return nil return nil
} }
func (w *Waku) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) {
if w.protectedTopicStore == nil {
return nil, nil
}
return w.protectedTopicStore.FetchPrivateKey(topic)
}
func (w *Waku) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error { func (w *Waku) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error {
if w.protectedTopicStore == nil {
return nil
}
return w.protectedTopicStore.Insert(topic, privKey, &privKey.PublicKey) return w.protectedTopicStore.Insert(topic, privKey, &privKey.PublicKey)
} }

View File

@ -11,12 +11,14 @@ import (
"github.com/cenkalti/backoff/v3" "github.com/cenkalti/backoff/v3"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"golang.org/x/exp/maps"
"github.com/waku-org/go-waku/waku/v2/dnsdisc" "github.com/waku-org/go-waku/waku/v2/dnsdisc"
"github.com/waku-org/go-waku/waku/v2/protocol/pb" "github.com/waku-org/go-waku/waku/v2/protocol/pb"
"github.com/waku-org/go-waku/waku/v2/protocol/relay" "github.com/waku-org/go-waku/waku/v2/protocol/relay"
"github.com/waku-org/go-waku/waku/v2/protocol/store" "github.com/waku-org/go-waku/waku/v2/protocol/store"
"github.com/waku-org/go-waku/waku/v2/protocol/subscription" "github.com/waku-org/go-waku/waku/v2/protocol/subscription"
"golang.org/x/exp/maps"
"github.com/status-im/status-go/protocol/tt" "github.com/status-im/status-go/protocol/tt"
"github.com/status-im/status-go/wakuv2/common" "github.com/status-im/status-go/wakuv2/common"