From 2f9b38e823c5512ae6d98e4313b888ca7531157a Mon Sep 17 00:00:00 2001
From: Bruno Muniz Azevedo Filho <bruno@elixxir.io>
Date: Wed, 22 Jun 2022 00:28:01 -0300
Subject: [PATCH] Removed database target

---
 .../Session/Session+Contacts.swift            |   1 -
 Sources/Integration/Session/Session.swift     |  59 +-
 Sources/Integration/Session/SessionType.swift |  11 -
 Sources/Models/Attachment.swift               |  98 +--
 Sources/Models/Contact.swift                  | 246 +++---
 Sources/Models/FileTransfer.swift             |  74 +-
 Sources/Models/Group.swift                    |  84 +--
 Sources/Models/GroupChatInfo.swift            |  44 +-
 Sources/Models/GroupMember.swift              |  84 +--
 Sources/Models/GroupMessage.swift             | 112 +--
 Sources/Models/Message.swift                  | 140 ++--
 Sources/Models/Payload.swift                  |  78 +-
 Sources/Models/Reply.swift                    |  38 +-
 Sources/Models/SingleChatInfo.swift           |  36 +-
 Sources/PushFeature/PushHandler.swift         |   1 -
 .../xcshareddata/swiftpm/Package.resolved     | 700 +++++++++---------
 16 files changed, 872 insertions(+), 934 deletions(-)

diff --git a/Sources/Integration/Session/Session+Contacts.swift b/Sources/Integration/Session/Session+Contacts.swift
index 53204708..c78c8fa3 100644
--- a/Sources/Integration/Session/Session+Contacts.swift
+++ b/Sources/Integration/Session/Session+Contacts.swift
@@ -1,7 +1,6 @@
 import Retry
 import Models
 import Shared
-import Database
 import Foundation
 
 extension Session {
diff --git a/Sources/Integration/Session/Session.swift b/Sources/Integration/Session/Session.swift
index 2982b295..bb47d124 100644
--- a/Sources/Integration/Session/Session.swift
+++ b/Sources/Integration/Session/Session.swift
@@ -3,7 +3,7 @@ import Models
 import Shared
 import Combine
 import Defaults
-import Database
+import XXModels
 import Foundation
 import BackupFeature
 import NetworkMonitor
@@ -52,7 +52,7 @@ public final class Session: SessionType {
     @Dependency var networkMonitor: NetworkMonitoring
 
     public let client: Client
-    public let dbManager: DatabaseManager
+    public let dbManager: Database
     private var cancellables = Set<AnyCancellable>()
 
     public var myId: Data { client.bindings.myId }
@@ -76,61 +76,6 @@ public final class Session: SessionType {
         networkMonitor.statusPublisher.map { $0 == .available }.eraseToAnyPublisher()
     }
 
-    public func groups(_ request: Group.Request) -> AnyPublisher<[Group], Never> {
-        self.dbManager
-            .publisher(fetch: Group.self, request)
-            .catch { _ in Just([]) }
-            .eraseToAnyPublisher()
-    }
-
-    public func groupMembers(_ request: GroupMember.Request) -> AnyPublisher<[GroupMember], Never> {
-        self.dbManager
-            .publisher(fetch: GroupMember.self, request)
-            .catch { _ in Just([]) }
-            .eraseToAnyPublisher()
-    }
-
-    lazy public var contacts: (Contact.Request) -> AnyPublisher<[Contact], Never> = {
-        self.dbManager.publisher(fetch: Contact.self, $0).catch { _ in Just([]) }.eraseToAnyPublisher()
-    }
-
-    lazy public var singleMessages: (Contact) -> AnyPublisher<[Message], Never> = {
-        self.dbManager.publisher(fetch: Message.self, .withContact($0.userId)).catch { _ in Just([]) }.eraseToAnyPublisher()
-    }
-
-    lazy public var groupMessages: (Group) -> AnyPublisher<[GroupMessage], Never> = {
-        self.dbManager.publisher(fetch: GroupMessage.self, .fromGroup($0.groupId)).catch { _ in Just([]) }.eraseToAnyPublisher()
-    }
-
-    lazy public var groupChats: (GroupChatInfo.Request) -> AnyPublisher<[GroupChatInfo], Never> = {
-        self.dbManager.publisher(fetch: GroupChatInfo.self, $0).catch { _ in Just([]) }.eraseToAnyPublisher()
-    }
-
-    lazy public var singleChats: (SingleChatInfo.Request) -> AnyPublisher<[SingleChatInfo], Never> = { _ in
-        self.dbManager.publisher(fetch: Contact.self, .friends)
-            .flatMap { [unowned self] contactList -> AnyPublisher<[SingleChatInfo], Error> in
-                let contactIds = contactList.map { $0.userId }
-
-                let messagesPublisher: AnyPublisher<[Message], Error> = dbManager
-                    .publisher(fetch: .latestOnesFromContactIds(contactIds))
-                    .map { $0.sorted(by: { $0.timestamp > $1.timestamp }) }
-                    .eraseToAnyPublisher()
-
-                return messagesPublisher.map { messages -> [SingleChatInfo] in
-                    contactList.map { contact -> SingleChatInfo in
-                        SingleChatInfo(contact: contact, lastMessage: messages.first {
-                            $0.sender == contact.userId || $0.receiver == contact.userId
-                        })
-                    }
-                }
-                .eraseToAnyPublisher()
-            }
-            .catch { _ in Just([]) }
-            .map { $0.filter { $0.lastMessage != nil }}
-            .map { $0.sorted(by: { $0.lastMessage!.timestamp > $1.lastMessage!.timestamp })}
-            .eraseToAnyPublisher()
-    }
-
     public init(
         passphrase: String,
         backupFile: Data,
diff --git a/Sources/Integration/Session/SessionType.swift b/Sources/Integration/Session/SessionType.swift
index 12146949..e32ecf0a 100644
--- a/Sources/Integration/Session/SessionType.swift
+++ b/Sources/Integration/Session/SessionType.swift
@@ -1,6 +1,5 @@
 import Models
 import Combine
-import Database
 import Foundation
 
 public protocol SessionType {
@@ -10,16 +9,6 @@ public protocol SessionType {
     var hasRunningTasks: Bool { get }
     var isOnline: AnyPublisher<Bool, Never> { get }
 
-    var contacts: (Contact.Request) -> AnyPublisher<[Contact], Never> { get }
-    var singleMessages: (Contact) -> AnyPublisher<[Message], Never> { get }
-    var singleChats: (SingleChatInfo.Request) -> AnyPublisher<[SingleChatInfo], Never> { get }
-
-    func groupMembers(_: GroupMember.Request) -> AnyPublisher<[GroupMember], Never>
-
-    func groups(_: Group.Request) -> AnyPublisher<[Group], Never>
-    var groupMessages: (Group) -> AnyPublisher<[GroupMessage], Never> { get }
-    var groupChats: (GroupChatInfo.Request) -> AnyPublisher<[GroupChatInfo], Never> { get }
-
     func deleteMyself() throws
     func getId(from: Data) -> Data?
 
diff --git a/Sources/Models/Attachment.swift b/Sources/Models/Attachment.swift
index 5e4d0689..92eb3c09 100644
--- a/Sources/Models/Attachment.swift
+++ b/Sources/Models/Attachment.swift
@@ -1,49 +1,49 @@
-//import Foundation
-//
-//public struct Attachment: Codable, Equatable, Hashable {
-//
-//    public enum Extension: Int64, Codable, CaseIterable {
-//        case image
-//        case audio
-//
-//        public static func from(_ string: String) -> Extension? {
-//            self.allCases.first{ $0.written == string }
-//        }
-//
-//        public var written: String {
-//            switch self {
-//            case .image:
-//                return "jpeg"
-//            case .audio:
-//                return "m4a"
-//            }
-//        }
-//
-//        public var writtenExtended: String {
-//            switch self {
-//            case .image:
-//                return "image"
-//            case .audio:
-//                return "voice message"
-//            }
-//        }
-//    }
-//
-//    public let data: Data?
-//    public let name: String
-//    public var transferId: Data?
-//    public let _extension: Extension
-//    public var progress: Float = 0.0
-//
-//    public init(
-//        name: String,
-//        data: Data? = nil,
-//        transferId: Data? = nil,
-//        _extension: Extension
-//    ) {
-//        self.data = data
-//        self.name = name
-//        self._extension = _extension
-//        self.transferId = transferId
-//    }
-//}
+import Foundation
+
+public struct Attachment: Codable, Equatable, Hashable {
+
+    public enum Extension: Int64, Codable, CaseIterable {
+        case image
+        case audio
+
+        public static func from(_ string: String) -> Extension? {
+            self.allCases.first{ $0.written == string }
+        }
+
+        public var written: String {
+            switch self {
+            case .image:
+                return "jpeg"
+            case .audio:
+                return "m4a"
+            }
+        }
+
+        public var writtenExtended: String {
+            switch self {
+            case .image:
+                return "image"
+            case .audio:
+                return "voice message"
+            }
+        }
+    }
+
+    public let data: Data?
+    public let name: String
+    public var transferId: Data?
+    public let _extension: Extension
+    public var progress: Float = 0.0
+
+    public init(
+        name: String,
+        data: Data? = nil,
+        transferId: Data? = nil,
+        _extension: Extension
+    ) {
+        self.data = data
+        self.name = name
+        self._extension = _extension
+        self.transferId = transferId
+    }
+}
diff --git a/Sources/Models/Contact.swift b/Sources/Models/Contact.swift
index 754bf91d..1959743e 100644
--- a/Sources/Models/Contact.swift
+++ b/Sources/Models/Contact.swift
@@ -1,123 +1,123 @@
-//import UIKit
-//import DifferenceKit
-//
-//public protocol IndexableItem {
-//    var indexedOn: NSString { get }
-//}
-//
-//public class IndexedListCollator<Item: IndexableItem> {
-//    private final class CollationWrapper: NSObject {
-//        let value: Any
-//        @objc let indexedOn: NSString
-//
-//        init(value: Any, indexedOn: NSString) {
-//            self.value = value
-//            self.indexedOn = indexedOn
-//        }
-//
-//        func unwrappedValue<UnwrappedType>() -> UnwrappedType {
-//            return value as! UnwrappedType
-//        }
-//    }
-//
-//    public init() {}
-//
-//    public func sectioned(items: [Item]) -> (sections: [[Item]], collation: UILocalizedIndexedCollation) {
-//        let collation = UILocalizedIndexedCollation.current()
-//        let selector = #selector(getter: CollationWrapper.indexedOn)
-//
-//        let wrappedItems = items.map { item in
-//            CollationWrapper(value: item, indexedOn: item.indexedOn)
-//        }
-//
-//        let sortedObjects = collation.sortedArray(from: wrappedItems, collationStringSelector: selector) as! [CollationWrapper]
-//
-//        var sections = collation.sectionIndexTitles.map { _ in [Item]() }
-//        sortedObjects.forEach { item in
-//            let sectionNumber = collation.section(for: item, collationStringSelector: selector)
-//            sections[sectionNumber].append(item.unwrappedValue())
-//        }
-//
-//        return (sections: sections.filter { !$0.isEmpty }, collation: collation)
-//    }
-//}
-//
-//public struct Contact: Codable, Hashable, Equatable {
-//    public enum Request {
-//        case all
-//        case failed
-//        case friends
-//        case received
-//        case requested
-//        case isRecent
-//        case verificationInProgress
-//        case withUserId(Data)
-//        case withUserIds([Data])
-//        case withUsername(String)
-//    }
-//
-//    public enum Status: Int64, Codable {
-//        case friend
-//        case stranger
-//        case verified
-//        case verificationFailed
-//        case verificationInProgress
-//        case requested
-//        case requesting
-//        case requestFailed
-//        case confirming
-//        case confirmationFailed
-//        case hidden
-//    }
-//
-//    public var id: Int64?
-//    public var photo: Data?
-//    public let userId: Data
-//    public var email: String?
-//    public var phone: String?
-//    public var status: Status
-//    public var marshaled: Data
-//    public var createdAt: Date
-//    public let username: String
-//    public var nickname: String?
-//    public var isRecent: Bool
-//
-//    public init(
-//        photo: Data?,
-//        userId: Data,
-//        email: String?,
-//        phone: String?,
-//        status: Status,
-//        marshaled: Data,
-//        username: String,
-//        nickname: String?,
-//        createdAt: Date,
-//        isRecent: Bool
-//    ) {
-//        self.email = email
-//        self.phone = phone
-//        self.photo = photo
-//        self.status = status
-//        self.userId = userId
-//        self.username = username
-//        self.nickname = nickname
-//        self.marshaled = marshaled
-//        self.createdAt = createdAt
-//        self.isRecent = isRecent
-//    }
-//
-//    public var differenceIdentifier: Data { userId }
-//
-//    public static var databaseTableName: String { "contacts" }
-//}
-//
-//extension Contact: Differentiable {}
-//extension Contact: IndexableItem {
-//    public var indexedOn: NSString {
-//        guard let nickname = nickname else {
-//            return "\(username.first!)" as NSString
-//        }
-//
-//        return "\(nickname.first!)" as NSString
-//    }
-//}
+import UIKit
+import DifferenceKit
+
+public protocol IndexableItem {
+    var indexedOn: NSString { get }
+}
+
+public class IndexedListCollator<Item: IndexableItem> {
+    private final class CollationWrapper: NSObject {
+        let value: Any
+        @objc let indexedOn: NSString
+
+        init(value: Any, indexedOn: NSString) {
+            self.value = value
+            self.indexedOn = indexedOn
+        }
+
+        func unwrappedValue<UnwrappedType>() -> UnwrappedType {
+            return value as! UnwrappedType
+        }
+    }
+
+    public init() {}
+
+    public func sectioned(items: [Item]) -> (sections: [[Item]], collation: UILocalizedIndexedCollation) {
+        let collation = UILocalizedIndexedCollation.current()
+        let selector = #selector(getter: CollationWrapper.indexedOn)
+
+        let wrappedItems = items.map { item in
+            CollationWrapper(value: item, indexedOn: item.indexedOn)
+        }
+
+        let sortedObjects = collation.sortedArray(from: wrappedItems, collationStringSelector: selector) as! [CollationWrapper]
+
+        var sections = collation.sectionIndexTitles.map { _ in [Item]() }
+        sortedObjects.forEach { item in
+            let sectionNumber = collation.section(for: item, collationStringSelector: selector)
+            sections[sectionNumber].append(item.unwrappedValue())
+        }
+
+        return (sections: sections.filter { !$0.isEmpty }, collation: collation)
+    }
+}
+
+public struct Contact: Codable, Hashable, Equatable {
+    public enum Request {
+        case all
+        case failed
+        case friends
+        case received
+        case requested
+        case isRecent
+        case verificationInProgress
+        case withUserId(Data)
+        case withUserIds([Data])
+        case withUsername(String)
+    }
+
+    public enum Status: Int64, Codable {
+        case friend
+        case stranger
+        case verified
+        case verificationFailed
+        case verificationInProgress
+        case requested
+        case requesting
+        case requestFailed
+        case confirming
+        case confirmationFailed
+        case hidden
+    }
+
+    public var id: Int64?
+    public var photo: Data?
+    public let userId: Data
+    public var email: String?
+    public var phone: String?
+    public var status: Status
+    public var marshaled: Data
+    public var createdAt: Date
+    public let username: String
+    public var nickname: String?
+    public var isRecent: Bool
+
+    public init(
+        photo: Data?,
+        userId: Data,
+        email: String?,
+        phone: String?,
+        status: Status,
+        marshaled: Data,
+        username: String,
+        nickname: String?,
+        createdAt: Date,
+        isRecent: Bool
+    ) {
+        self.email = email
+        self.phone = phone
+        self.photo = photo
+        self.status = status
+        self.userId = userId
+        self.username = username
+        self.nickname = nickname
+        self.marshaled = marshaled
+        self.createdAt = createdAt
+        self.isRecent = isRecent
+    }
+
+    public var differenceIdentifier: Data { userId }
+
+    public static var databaseTableName: String { "contacts" }
+}
+
+extension Contact: Differentiable {}
+extension Contact: IndexableItem {
+    public var indexedOn: NSString {
+        guard let nickname = nickname else {
+            return "\(username.first!)" as NSString
+        }
+
+        return "\(nickname.first!)" as NSString
+    }
+}
diff --git a/Sources/Models/FileTransfer.swift b/Sources/Models/FileTransfer.swift
index 8eb06ba2..79fac5d1 100644
--- a/Sources/Models/FileTransfer.swift
+++ b/Sources/Models/FileTransfer.swift
@@ -1,37 +1,37 @@
-//import Foundation
-//
-//public struct FileTransfer {
-//    public enum Request {
-//        case withTID(Data)
-//        case withContactId(Data)
-//    }
-//
-//    public var tid: Data
-//    public var id: Int64?
-//    public var contact: Data
-//    public var fileName: String
-//    public var fileType: String
-//    public var isIncoming: Bool
-//
-//    public static var databaseTableName: String { "transfers" }
-//
-//    public init(
-//        id: Int64? = nil,
-//        tid: Data,
-//        contact: Data,
-//        fileName: String,
-//        fileType: String,
-//        isIncoming: Bool
-//    ) {
-//        self.id = id
-//        self.tid = tid
-//        self.contact = contact
-//        self.fileName = fileName
-//        self.fileType = fileType
-//        self.isIncoming = isIncoming
-//    }
-//}
-//
-//extension FileTransfer: Codable {}
-//extension FileTransfer: Hashable {}
-//extension FileTransfer: Equatable {}
+import Foundation
+
+public struct FileTransfer {
+    public enum Request {
+        case withTID(Data)
+        case withContactId(Data)
+    }
+
+    public var tid: Data
+    public var id: Int64?
+    public var contact: Data
+    public var fileName: String
+    public var fileType: String
+    public var isIncoming: Bool
+
+    public static var databaseTableName: String { "transfers" }
+
+    public init(
+        id: Int64? = nil,
+        tid: Data,
+        contact: Data,
+        fileName: String,
+        fileType: String,
+        isIncoming: Bool
+    ) {
+        self.id = id
+        self.tid = tid
+        self.contact = contact
+        self.fileName = fileName
+        self.fileType = fileType
+        self.isIncoming = isIncoming
+    }
+}
+
+extension FileTransfer: Codable {}
+extension FileTransfer: Hashable {}
+extension FileTransfer: Equatable {}
diff --git a/Sources/Models/Group.swift b/Sources/Models/Group.swift
index 20634688..feda834c 100644
--- a/Sources/Models/Group.swift
+++ b/Sources/Models/Group.swift
@@ -1,42 +1,42 @@
-//import Foundation
-//import KeychainAccess
-//
-//public struct Group: Codable, Equatable, Hashable {
-//    public enum Status: Int64, Codable {
-//        case hidden
-//        case pending
-//        case deleting
-//        case participating
-//    }
-//
-//    public enum Request {
-//        case pending
-//        case accepted
-//        case withGroupId(Data)
-//    }
-//
-//    public var id: Int64?
-//    public var name: String
-//    public var leader: Data
-//    public var groupId: Data
-//    public var status: Status
-//    public var serialize: Data
-//    public var createdAt: Date
-//    public static var databaseTableName: String { "groups" }
-//
-//    public init(
-//        leader: Data,
-//        name: String,
-//        groupId: Data,
-//        status: Status,
-//        createdAt: Date,
-//        serialize: Data
-//    ) {
-//        self.name = name
-//        self.leader = leader
-//        self.status = status
-//        self.groupId = groupId
-//        self.createdAt = createdAt
-//        self.serialize = serialize
-//    }
-//}
+import Foundation
+import KeychainAccess
+
+public struct Group: Codable, Equatable, Hashable {
+    public enum Status: Int64, Codable {
+        case hidden
+        case pending
+        case deleting
+        case participating
+    }
+
+    public enum Request {
+        case pending
+        case accepted
+        case withGroupId(Data)
+    }
+
+    public var id: Int64?
+    public var name: String
+    public var leader: Data
+    public var groupId: Data
+    public var status: Status
+    public var serialize: Data
+    public var createdAt: Date
+    public static var databaseTableName: String { "groups" }
+
+    public init(
+        leader: Data,
+        name: String,
+        groupId: Data,
+        status: Status,
+        createdAt: Date,
+        serialize: Data
+    ) {
+        self.name = name
+        self.leader = leader
+        self.status = status
+        self.groupId = groupId
+        self.createdAt = createdAt
+        self.serialize = serialize
+    }
+}
diff --git a/Sources/Models/GroupChatInfo.swift b/Sources/Models/GroupChatInfo.swift
index e2d56675..9b39ff6d 100644
--- a/Sources/Models/GroupChatInfo.swift
+++ b/Sources/Models/GroupChatInfo.swift
@@ -1,22 +1,22 @@
-//import Foundation
-//
-//public struct GroupChatInfo: Codable, Equatable, Hashable {
-//    public enum Request {
-//        case accepted
-//        case fromGroup(Data)
-//    }
-//
-//    public var group: Group
-//    public var members: [GroupMember]
-//    public var lastMessage: GroupMessage?
-//
-//    public init(
-//        group: Group,
-//        members: [GroupMember],
-//        lastMessage: GroupMessage? = nil
-//    ) {
-//        self.group = group
-//        self.members = members
-//        self.lastMessage = lastMessage
-//    }
-//}
+import Foundation
+
+public struct GroupChatInfo: Codable, Equatable, Hashable {
+    public enum Request {
+        case accepted
+        case fromGroup(Data)
+    }
+
+    public var group: Group
+    public var members: [GroupMember]
+    public var lastMessage: GroupMessage?
+
+    public init(
+        group: Group,
+        members: [GroupMember],
+        lastMessage: GroupMessage? = nil
+    ) {
+        self.group = group
+        self.members = members
+        self.lastMessage = lastMessage
+    }
+}
diff --git a/Sources/Models/GroupMember.swift b/Sources/Models/GroupMember.swift
index c0f7123f..25c619f3 100644
--- a/Sources/Models/GroupMember.swift
+++ b/Sources/Models/GroupMember.swift
@@ -1,42 +1,42 @@
-//import Foundation
-//
-//public struct GroupMember {
-//    public enum Request {
-//        case all
-//        case strangers
-//        case fromGroup(Data)
-//        case withUserId(Data)
-//    }
-//
-//    public enum Status: Int64, Codable {
-//        case usernameSet
-//        case pendingUsername
-//    }
-//
-//    public var id: Int64?
-//    public var userId: Data
-//    public var groupId: Data
-//    public var status: Status
-//    public var username: String
-//    public var photo: Data?
-//
-//    public init(
-//        id: Int64? = nil,
-//        userId: Data,
-//        groupId: Data,
-//        status: Status,
-//        username: String,
-//        photo: Data? = nil
-//    ) {
-//        self.id = id
-//        self.userId = userId
-//        self.groupId = groupId
-//        self.username = username
-//        self.status = status
-//        self.photo = photo
-//    }
-//}
-//
-//extension GroupMember: Codable {}
-//extension GroupMember: Hashable {}
-//extension GroupMember: Equatable {}
+import Foundation
+
+public struct GroupMember {
+    public enum Request {
+        case all
+        case strangers
+        case fromGroup(Data)
+        case withUserId(Data)
+    }
+
+    public enum Status: Int64, Codable {
+        case usernameSet
+        case pendingUsername
+    }
+
+    public var id: Int64?
+    public var userId: Data
+    public var groupId: Data
+    public var status: Status
+    public var username: String
+    public var photo: Data?
+
+    public init(
+        id: Int64? = nil,
+        userId: Data,
+        groupId: Data,
+        status: Status,
+        username: String,
+        photo: Data? = nil
+    ) {
+        self.id = id
+        self.userId = userId
+        self.groupId = groupId
+        self.username = username
+        self.status = status
+        self.photo = photo
+    }
+}
+
+extension GroupMember: Codable {}
+extension GroupMember: Hashable {}
+extension GroupMember: Equatable {}
diff --git a/Sources/Models/GroupMessage.swift b/Sources/Models/GroupMessage.swift
index 771d4ceb..ffdb6df4 100644
--- a/Sources/Models/GroupMessage.swift
+++ b/Sources/Models/GroupMessage.swift
@@ -1,56 +1,56 @@
-//import Foundation
-//
-//public struct GroupMessage: Codable, Equatable, Hashable {
-//    public enum Request {
-//        case withUniqueId(Data)
-//        case id(Int64)
-//        case sending
-//        case fromGroup(Data)
-//        case unreadsFromGroup(Data)
-//    }
-//
-//    public static var databaseTableName: String { "groupMessages" }
-//
-//    public enum Status: Int64, Codable {
-//        case sent
-//        case read
-//        case failed
-//        case sending
-//        case received
-//    }
-//
-//    public var id: Int64?
-//    public var uniqueId: Data?
-//    public var groupId: Data
-//    public var sender: Data
-//    public var roundId: Int64?
-//    public var payload: Payload
-//    public var status: Status
-//    public var roundURL: String?
-//    public var unread: Bool
-//    public var timestamp: Int
-//
-//    public init(
-//        id: Int64? = nil,
-//        sender: Data,
-//        groupId: Data,
-//        payload: Payload,
-//        unread: Bool,
-//        timestamp: Int = 0,
-//        uniqueId: Data?,
-//        status: Status,
-//        roundId: Int64? = nil,
-//        roundURL: String? = nil
-//    ) {
-//        self.id = id
-//        self.sender = sender
-//        self.groupId = groupId
-//        self.payload = payload
-//        self.unread = unread
-//        self.timestamp = timestamp
-//        self.uniqueId = uniqueId
-//        self.status = status
-//        self.roundId = roundId
-//        self.roundURL = roundURL
-//    }
-//}
+import Foundation
+
+public struct GroupMessage: Codable, Equatable, Hashable {
+    public enum Request {
+        case withUniqueId(Data)
+        case id(Int64)
+        case sending
+        case fromGroup(Data)
+        case unreadsFromGroup(Data)
+    }
+
+    public static var databaseTableName: String { "groupMessages" }
+
+    public enum Status: Int64, Codable {
+        case sent
+        case read
+        case failed
+        case sending
+        case received
+    }
+
+    public var id: Int64?
+    public var uniqueId: Data?
+    public var groupId: Data
+    public var sender: Data
+    public var roundId: Int64?
+    public var payload: Payload
+    public var status: Status
+    public var roundURL: String?
+    public var unread: Bool
+    public var timestamp: Int
+
+    public init(
+        id: Int64? = nil,
+        sender: Data,
+        groupId: Data,
+        payload: Payload,
+        unread: Bool,
+        timestamp: Int = 0,
+        uniqueId: Data?,
+        status: Status,
+        roundId: Int64? = nil,
+        roundURL: String? = nil
+    ) {
+        self.id = id
+        self.sender = sender
+        self.groupId = groupId
+        self.payload = payload
+        self.unread = unread
+        self.timestamp = timestamp
+        self.uniqueId = uniqueId
+        self.status = status
+        self.roundId = roundId
+        self.roundURL = roundURL
+    }
+}
diff --git a/Sources/Models/Message.swift b/Sources/Models/Message.swift
index 77ae89db..fec18587 100644
--- a/Sources/Models/Message.swift
+++ b/Sources/Models/Message.swift
@@ -1,70 +1,70 @@
-//import Foundation
-//import DifferenceKit
-//
-//public struct Message: Codable, Equatable, Hashable {
-//    public enum Request {
-//        case sending
-//        case withUniqueId(Data)
-//        case withId(Int64)
-//        case sendingAttachment
-//        case withContact(Data)
-//        case unreadsFromContactId(Data)
-//        case latestOnesFromContactIds([Data])
-//    }
-//
-//    public enum Status: Int64, Codable {
-//        case read
-//        case sent
-//        case sending
-//        case sendingAttachment
-//        case receivingAttachment
-//        case received
-//        case failedToSend
-//        case timedOut
-//    }
-//
-//    public var id: Int64?
-//    public var unread: Bool
-//    public let sender: Data
-//    public var roundURL: String?
-//    public var report: Data?
-//    public var status: Status
-//    public let receiver: Data
-//    public var timestamp: Int
-//    public var uniqueId: Data?
-//    public var payload: Payload
-//    public static var databaseTableName: String { "messages" }
-//
-//    public init (
-//        sender: Data,
-//        receiver: Data,
-//        payload: Payload,
-//        unread: Bool,
-//        timestamp: Int,
-//        uniqueId: Data?,
-//        status: Status,
-//        roundURL: String? = nil
-//    ) {
-//        self.sender = sender
-//        self.unread = unread
-//        self.status = status
-//        self.payload = payload
-//        self.receiver = receiver
-//        self.uniqueId = uniqueId
-//        self.timestamp = timestamp
-//        self.roundURL = roundURL
-//    }
-//}
-//
-//public extension Message.Status {
-//    var canReply: Bool {
-//        switch self {
-//        case .sent, .received, .read:
-//            return true
-//        default:
-//            return false
-//        }
-//    }
-//}
-//
-//extension Message: Differentiable {}
+import Foundation
+import DifferenceKit
+
+public struct Message: Codable, Equatable, Hashable {
+    public enum Request {
+        case sending
+        case withUniqueId(Data)
+        case withId(Int64)
+        case sendingAttachment
+        case withContact(Data)
+        case unreadsFromContactId(Data)
+        case latestOnesFromContactIds([Data])
+    }
+
+    public enum Status: Int64, Codable {
+        case read
+        case sent
+        case sending
+        case sendingAttachment
+        case receivingAttachment
+        case received
+        case failedToSend
+        case timedOut
+    }
+
+    public var id: Int64?
+    public var unread: Bool
+    public let sender: Data
+    public var roundURL: String?
+    public var report: Data?
+    public var status: Status
+    public let receiver: Data
+    public var timestamp: Int
+    public var uniqueId: Data?
+    public var payload: Payload
+    public static var databaseTableName: String { "messages" }
+
+    public init (
+        sender: Data,
+        receiver: Data,
+        payload: Payload,
+        unread: Bool,
+        timestamp: Int,
+        uniqueId: Data?,
+        status: Status,
+        roundURL: String? = nil
+    ) {
+        self.sender = sender
+        self.unread = unread
+        self.status = status
+        self.payload = payload
+        self.receiver = receiver
+        self.uniqueId = uniqueId
+        self.timestamp = timestamp
+        self.roundURL = roundURL
+    }
+}
+
+public extension Message.Status {
+    var canReply: Bool {
+        switch self {
+        case .sent, .received, .read:
+            return true
+        default:
+            return false
+        }
+    }
+}
+
+extension Message: Differentiable {}
diff --git a/Sources/Models/Payload.swift b/Sources/Models/Payload.swift
index fac93d27..4fda3b78 100644
--- a/Sources/Models/Payload.swift
+++ b/Sources/Models/Payload.swift
@@ -1,39 +1,39 @@
-//import Foundation
-//
-//public struct Payload: Codable, Equatable, Hashable {
-//    public var text: String
-//    public var reply: Reply?
-//    public var attachment: Attachment?
-//
-//    public init(text: String, reply: Reply?, attachment: Attachment?) {
-//        self.text = text
-//        self.reply = reply
-//        self.attachment = attachment
-//    }
-//
-//    public init(with marshaled: Data) throws {
-//        let proto = try CMIXText(serializedData: marshaled)
-//
-//        var reply: Reply?
-//
-//        if proto.hasReply {
-//            reply = Reply(
-//                messageId: proto.reply.messageID,
-//                senderId: proto.reply.senderID
-//            )
-//        }
-//
-//        self.init(text: proto.text, reply: reply, attachment: nil)
-//    }
-//
-//    public func asData() -> Data {
-//        var protoModel = CMIXText()
-//        protoModel.text = text
-//
-//        if let reply = reply {
-//            protoModel.reply = reply.asTextReply()
-//        }
-//
-//        return try! protoModel.serializedData()
-//    }
-//}
+import Foundation
+
+public struct Payload: Codable, Equatable, Hashable {
+    public var text: String
+    public var reply: Reply?
+    public var attachment: Attachment?
+
+    public init(text: String, reply: Reply?, attachment: Attachment?) {
+        self.text = text
+        self.reply = reply
+        self.attachment = attachment
+    }
+
+    public init(with marshaled: Data) throws {
+        let proto = try CMIXText(serializedData: marshaled)
+
+        var reply: Reply?
+
+        if proto.hasReply {
+            reply = Reply(
+                messageId: proto.reply.messageID,
+                senderId: proto.reply.senderID
+            )
+        }
+
+        self.init(text: proto.text, reply: reply, attachment: nil)
+    }
+
+    public func asData() -> Data {
+        var protoModel = CMIXText()
+        protoModel.text = text
+
+        if let reply = reply {
+            protoModel.reply = reply.asTextReply()
+        }
+
+        return try! protoModel.serializedData()
+    }
+}
diff --git a/Sources/Models/Reply.swift b/Sources/Models/Reply.swift
index 6b71cad6..22fcf55a 100644
--- a/Sources/Models/Reply.swift
+++ b/Sources/Models/Reply.swift
@@ -1,19 +1,19 @@
-//import Foundation
-//
-//public struct Reply: Codable, Equatable, Hashable {
-//    public let messageId: Data
-//    public let senderId: Data
-//
-//    public init(messageId: Data, senderId: Data) {
-//        self.messageId = messageId
-//        self.senderId = senderId
-//    }
-//
-//    func asTextReply() -> TextReply {
-//        var reply = TextReply()
-//        reply.messageID = messageId
-//        reply.senderID = senderId
-//
-//        return reply
-//    }
-//}
+import Foundation
+
+public struct Reply: Codable, Equatable, Hashable {
+    public let messageId: Data
+    public let senderId: Data
+
+    public init(messageId: Data, senderId: Data) {
+        self.messageId = messageId
+        self.senderId = senderId
+    }
+
+    func asTextReply() -> TextReply {
+        var reply = TextReply()
+        reply.messageID = messageId
+        reply.senderID = senderId
+
+        return reply
+    }
+}
diff --git a/Sources/Models/SingleChatInfo.swift b/Sources/Models/SingleChatInfo.swift
index 79fc4ba0..21c7f7d2 100644
--- a/Sources/Models/SingleChatInfo.swift
+++ b/Sources/Models/SingleChatInfo.swift
@@ -1,18 +1,18 @@
-//import Foundation
-//
-//public struct SingleChatInfo: Codable, Equatable, Hashable {
-//    public enum Request {
-//        case all
-//    }
-//
-//    public var contact: Contact
-//    public var lastMessage: Message?
-//
-//    public init(
-//        contact: Contact,
-//        lastMessage: Message?
-//    ) {
-//        self.contact = contact
-//        self.lastMessage = lastMessage
-//    }
-//}
+import Foundation
+
+public struct SingleChatInfo: Codable, Equatable, Hashable {
+    public enum Request {
+        case all
+    }
+
+    public var contact: Contact
+    public var lastMessage: Message?
+
+    public init(
+        contact: Contact,
+        lastMessage: Message?
+    ) {
+        self.contact = contact
+        self.lastMessage = lastMessage
+    }
+}
diff --git a/Sources/PushFeature/PushHandler.swift b/Sources/PushFeature/PushHandler.swift
index bb0b19cd..fcf5e150 100644
--- a/Sources/PushFeature/PushHandler.swift
+++ b/Sources/PushFeature/PushHandler.swift
@@ -1,7 +1,6 @@
 import UIKit
 import Models
 import Defaults
-import Database
 import Integration
 import DependencyInjection
 
diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
index d7628f46..e65586a6 100644
--- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,349 +1,355 @@
 {
-  "object": {
-    "pins": [
-      {
-        "package": "abseil",
-        "repositoryURL": "https://github.com/firebase/abseil-cpp-SwiftPM.git",
-        "state": {
-          "branch": null,
-          "revision": "fffc3c2729be5747390ad02d5100291a0d9ad26a",
-          "version": "0.20200225.4"
-        }
-      },
-      {
-        "package": "Alamofire",
-        "repositoryURL": "https://github.com/Alamofire/Alamofire.git",
-        "state": {
-          "branch": null,
-          "revision": "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864",
-          "version": "5.5.0"
-        }
-      },
-      {
-        "package": "AppAuth",
-        "repositoryURL": "https://github.com/openid/AppAuth-iOS.git",
-        "state": {
-          "branch": null,
-          "revision": "01131d68346c8ae552961c768d583c715fbe1410",
-          "version": "1.4.0"
-        }
-      },
-      {
-        "package": "BoringSSL-GRPC",
-        "repositoryURL": "https://github.com/firebase/boringssl-SwiftPM.git",
-        "state": {
-          "branch": null,
-          "revision": "734a8247442fde37df4364c21f6a0085b6a36728",
-          "version": "0.7.2"
-        }
-      },
-      {
-        "package": "ChatLayout",
-        "repositoryURL": "https://github.com/ekazaev/ChatLayout",
-        "state": {
-          "branch": null,
-          "revision": "d0edb6f3ae716a26842467c540a6bee909b80360",
-          "version": "1.1.14"
-        }
-      },
-      {
-        "package": "combine-schedulers",
-        "repositoryURL": "https://github.com/pointfreeco/combine-schedulers",
-        "state": {
-          "branch": null,
-          "revision": "4cf088c29a20f52be0f2ca54992b492c54e0076b",
-          "version": "0.5.3"
-        }
-      },
-      {
-        "package": "CwlCatchException",
-        "repositoryURL": "https://github.com/mattgallagher/CwlCatchException.git",
-        "state": {
-          "branch": null,
-          "revision": "35f9e770f54ce62dd8526470f14c6e137cef3eea",
-          "version": "2.1.1"
-        }
-      },
-      {
-        "package": "CwlPreconditionTesting",
-        "repositoryURL": "https://github.com/mattgallagher/CwlPreconditionTesting.git",
-        "state": {
-          "branch": null,
-          "revision": "fb7a26374e8570ff5c68142e5c83406d6abae0d8",
-          "version": "2.0.2"
-        }
-      },
-      {
-        "package": "DifferenceKit",
-        "repositoryURL": "https://github.com/ra1028/DifferenceKit",
-        "state": {
-          "branch": null,
-          "revision": "62745d7780deef4a023a792a1f8f763ec7bf9705",
-          "version": "1.2.0"
-        }
-      },
-      {
-        "package": "FilesProvider",
-        "repositoryURL": "https://github.com/amosavian/FileProvider.git",
-        "state": {
-          "branch": null,
-          "revision": "abf68a62541a4193c8d106367ddb3648e8ab693f",
-          "version": "0.26.0"
-        }
-      },
-      {
-        "package": "Firebase",
-        "repositoryURL": "https://github.com/firebase/firebase-ios-sdk.git",
-        "state": {
-          "branch": null,
-          "revision": "08686f04881483d2bc098b2696e674c0ba135e47",
-          "version": "8.10.0"
-        }
-      },
-      {
-        "package": "GoogleAPIClientForREST",
-        "repositoryURL": "https://github.com/google/google-api-objectivec-client-for-rest",
-        "state": {
-          "branch": null,
-          "revision": "22e0bb02729d60db396e8b90d8189313cd86ba53",
-          "version": "1.6.0"
-        }
-      },
-      {
-        "package": "GoogleAppMeasurement",
-        "repositoryURL": "https://github.com/google/GoogleAppMeasurement.git",
-        "state": {
-          "branch": null,
-          "revision": "9b2f6aca5b4685c45f9f5481f19bee8e7982c538",
-          "version": "8.9.1"
-        }
-      },
-      {
-        "package": "GoogleDataTransport",
-        "repositoryURL": "https://github.com/google/GoogleDataTransport.git",
-        "state": {
-          "branch": null,
-          "revision": "15ccdfd25ac55b9239b82809531ff26605e7556e",
-          "version": "9.1.2"
-        }
-      },
-      {
-        "package": "GoogleSignIn",
-        "repositoryURL": "https://github.com/google/GoogleSignIn-iOS",
-        "state": {
-          "branch": null,
-          "revision": "60ca2bfd218ccb194a746a79b41d9d50eb7e3af0",
-          "version": "6.1.0"
-        }
-      },
-      {
-        "package": "GoogleUtilities",
-        "repositoryURL": "https://github.com/google/GoogleUtilities.git",
-        "state": {
-          "branch": null,
-          "revision": "b3bb0c5551fb3f80ca939829639ab5b093edd14f",
-          "version": "7.7.0"
-        }
-      },
-      {
-        "package": "GRDB",
-        "repositoryURL": "https://github.com/groue/GRDB.swift",
-        "state": {
-          "branch": null,
-          "revision": "32b2923e890df320906e64cbd0faca22a8bfda14",
-          "version": "5.12.0"
-        }
-      },
-      {
-        "package": "gRPC",
-        "repositoryURL": "https://github.com/firebase/grpc-SwiftPM.git",
-        "state": {
-          "branch": null,
-          "revision": "fb405dd2c7901485f7e158b24e3a0a47e4efd8b5",
-          "version": "1.28.4"
-        }
-      },
-      {
-        "package": "GTMSessionFetcher",
-        "repositoryURL": "https://github.com/google/gtm-session-fetcher.git",
-        "state": {
-          "branch": null,
-          "revision": "bc6a19702ac76ac4e488b68148710eb815f9bc56",
-          "version": "1.7.0"
-        }
-      },
-      {
-        "package": "GTMAppAuth",
-        "repositoryURL": "https://github.com/google/GTMAppAuth.git",
-        "state": {
-          "branch": null,
-          "revision": "40f4103fb52109032c05599a0c39ad43edbdf80a",
-          "version": "1.2.2"
-        }
-      },
-      {
-        "package": "KeychainAccess",
-        "repositoryURL": "https://github.com/kishikawakatsumi/KeychainAccess",
-        "state": {
-          "branch": null,
-          "revision": "84e546727d66f1adc5439debad16270d0fdd04e7",
-          "version": "4.2.2"
-        }
-      },
-      {
-        "package": "leveldb",
-        "repositoryURL": "https://github.com/firebase/leveldb.git",
-        "state": {
-          "branch": null,
-          "revision": "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
-          "version": "1.22.2"
-        }
-      },
-      {
-        "package": "nanopb",
-        "repositoryURL": "https://github.com/firebase/nanopb.git",
-        "state": {
-          "branch": null,
-          "revision": "7ee9ef9f627d85cbe1b8c4f49a3ed26eed216c77",
-          "version": "2.30908.0"
-        }
-      },
-      {
-        "package": "Nimble",
-        "repositoryURL": "https://github.com/Quick/Nimble",
-        "state": {
-          "branch": null,
-          "revision": "c93f16c25af5770f0d3e6af27c9634640946b068",
-          "version": "9.2.1"
-        }
-      },
-      {
-        "package": "Promises",
-        "repositoryURL": "https://github.com/google/promises.git",
-        "state": {
-          "branch": null,
-          "revision": "611337c330350c9c1823ad6d671e7f936af5ee13",
-          "version": "2.0.0"
-        }
-      },
-      {
-        "package": "Quick",
-        "repositoryURL": "https://github.com/Quick/Quick",
-        "state": {
-          "branch": null,
-          "revision": "8cce6acd38f965f5baa3167b939f86500314022b",
-          "version": "3.1.2"
-        }
-      },
-      {
-        "package": "Retry",
-        "repositoryURL": "https://github.com/icanzilb/Retry.git",
-        "state": {
-          "branch": null,
-          "revision": "3beacada357968bcf9e5a2da520abfb374188afe",
-          "version": "0.6.3"
-        }
-      },
-      {
-        "package": "ScrollViewController",
-        "repositoryURL": "https://github.com/darrarski/ScrollViewController",
-        "state": {
-          "branch": null,
-          "revision": "9a52bb056504bb4766ddb5ac518097dd48736303",
-          "version": "1.2.0"
-        }
-      },
-      {
-        "package": "SnapKit",
-        "repositoryURL": "https://github.com/SnapKit/SnapKit",
-        "state": {
-          "branch": null,
-          "revision": "d458564516e5676af9c70b4f4b2a9178294f1bc6",
-          "version": "5.0.1"
-        }
-      },
-      {
-        "package": "swift-case-paths",
-        "repositoryURL": "https://github.com/pointfreeco/swift-case-paths",
-        "state": {
-          "branch": null,
-          "revision": "241301b67d8551c26d8f09bd2c0e52cc49f18007",
-          "version": "0.8.0"
-        }
-      },
-      {
-        "package": "swift-collections",
-        "repositoryURL": "https://github.com/apple/swift-collections",
-        "state": {
-          "branch": null,
-          "revision": "48254824bb4248676bf7ce56014ff57b142b77eb",
-          "version": "1.0.2"
-        }
-      },
-      {
-        "package": "swift-composable-architecture",
-        "repositoryURL": "https://github.com/pointfreeco/swift-composable-architecture.git",
-        "state": {
-          "branch": null,
-          "revision": "313dd217dcd1d0478118ec5d15225fd473c1564a",
-          "version": "0.32.0"
-        }
-      },
-      {
-        "package": "swift-custom-dump",
-        "repositoryURL": "https://github.com/pointfreeco/swift-custom-dump",
-        "state": {
-          "branch": null,
-          "revision": "51698ece74ecf31959d3fa81733f0a5363ef1b4e",
-          "version": "0.3.0"
-        }
-      },
-      {
-        "package": "swift-identified-collections",
-        "repositoryURL": "https://github.com/pointfreeco/swift-identified-collections",
-        "state": {
-          "branch": null,
-          "revision": "680bf440178a78a627b1c2c64c0855f6523ad5b9",
-          "version": "0.3.2"
-        }
-      },
-      {
-        "package": "SwiftProtobuf",
-        "repositoryURL": "https://github.com/apple/swift-protobuf",
-        "state": {
-          "branch": null,
-          "revision": "7e2c5f3cbbeea68e004915e3a8961e20bd11d824",
-          "version": "1.18.0"
-        }
-      },
-      {
-        "package": "SwiftyBeaver",
-        "repositoryURL": "https://github.com/SwiftyBeaver/SwiftyBeaver.git",
-        "state": {
-          "branch": null,
-          "revision": "2c039501d6eeb4d4cd4aec4a8d884ad28862e044",
-          "version": "1.9.5"
-        }
-      },
-      {
-        "package": "SwiftyDropbox",
-        "repositoryURL": "https://github.com/dropbox/SwiftyDropbox.git",
-        "state": {
-          "branch": null,
-          "revision": "7af87d903be1cf0af0e76e0394d992943055894e",
-          "version": "8.2.1"
-        }
-      },
-      {
-        "package": "xctest-dynamic-overlay",
-        "repositoryURL": "https://github.com/pointfreeco/xctest-dynamic-overlay",
-        "state": {
-          "branch": null,
-          "revision": "50a70a9d3583fe228ce672e8923010c8df2deddd",
-          "version": "0.2.1"
-        }
-      }
-    ]
-  },
-  "version": 1
+  "pins" : [
+    {
+      "identity" : "abseil-cpp-swiftpm",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/firebase/abseil-cpp-SwiftPM.git",
+      "state" : {
+        "revision" : "fffc3c2729be5747390ad02d5100291a0d9ad26a",
+        "version" : "0.20200225.4"
+      }
+    },
+    {
+      "identity" : "alamofire",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/Alamofire/Alamofire.git",
+      "state" : {
+        "revision" : "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864",
+        "version" : "5.5.0"
+      }
+    },
+    {
+      "identity" : "appauth-ios",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/openid/AppAuth-iOS.git",
+      "state" : {
+        "revision" : "01131d68346c8ae552961c768d583c715fbe1410",
+        "version" : "1.4.0"
+      }
+    },
+    {
+      "identity" : "boringssl-swiftpm",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/firebase/boringssl-SwiftPM.git",
+      "state" : {
+        "revision" : "734a8247442fde37df4364c21f6a0085b6a36728",
+        "version" : "0.7.2"
+      }
+    },
+    {
+      "identity" : "chatlayout",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/ekazaev/ChatLayout",
+      "state" : {
+        "revision" : "d0edb6f3ae716a26842467c540a6bee909b80360",
+        "version" : "1.1.14"
+      }
+    },
+    {
+      "identity" : "client-ios-db",
+      "kind" : "remoteSourceControl",
+      "location" : "https://git.xx.network/elixxir/client-ios-db.git",
+      "state" : {
+        "revision" : "e1b3b1a8d1df6d259c99289e8d09e73fbfa9fe63"
+      }
+    },
+    {
+      "identity" : "combine-schedulers",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/combine-schedulers",
+      "state" : {
+        "revision" : "4cf088c29a20f52be0f2ca54992b492c54e0076b",
+        "version" : "0.5.3"
+      }
+    },
+    {
+      "identity" : "cwlcatchexception",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/mattgallagher/CwlCatchException.git",
+      "state" : {
+        "revision" : "35f9e770f54ce62dd8526470f14c6e137cef3eea",
+        "version" : "2.1.1"
+      }
+    },
+    {
+      "identity" : "cwlpreconditiontesting",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git",
+      "state" : {
+        "revision" : "fb7a26374e8570ff5c68142e5c83406d6abae0d8",
+        "version" : "2.0.2"
+      }
+    },
+    {
+      "identity" : "differencekit",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/ra1028/DifferenceKit",
+      "state" : {
+        "revision" : "62745d7780deef4a023a792a1f8f763ec7bf9705",
+        "version" : "1.2.0"
+      }
+    },
+    {
+      "identity" : "fileprovider",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/amosavian/FileProvider.git",
+      "state" : {
+        "revision" : "abf68a62541a4193c8d106367ddb3648e8ab693f",
+        "version" : "0.26.0"
+      }
+    },
+    {
+      "identity" : "firebase-ios-sdk",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/firebase/firebase-ios-sdk.git",
+      "state" : {
+        "revision" : "08686f04881483d2bc098b2696e674c0ba135e47",
+        "version" : "8.10.0"
+      }
+    },
+    {
+      "identity" : "google-api-objectivec-client-for-rest",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/google-api-objectivec-client-for-rest",
+      "state" : {
+        "revision" : "22e0bb02729d60db396e8b90d8189313cd86ba53",
+        "version" : "1.6.0"
+      }
+    },
+    {
+      "identity" : "googleappmeasurement",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/GoogleAppMeasurement.git",
+      "state" : {
+        "revision" : "9b2f6aca5b4685c45f9f5481f19bee8e7982c538",
+        "version" : "8.9.1"
+      }
+    },
+    {
+      "identity" : "googledatatransport",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/GoogleDataTransport.git",
+      "state" : {
+        "revision" : "15ccdfd25ac55b9239b82809531ff26605e7556e",
+        "version" : "9.1.2"
+      }
+    },
+    {
+      "identity" : "googlesignin-ios",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/GoogleSignIn-iOS",
+      "state" : {
+        "revision" : "60ca2bfd218ccb194a746a79b41d9d50eb7e3af0",
+        "version" : "6.1.0"
+      }
+    },
+    {
+      "identity" : "googleutilities",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/GoogleUtilities.git",
+      "state" : {
+        "revision" : "b3bb0c5551fb3f80ca939829639ab5b093edd14f",
+        "version" : "7.7.0"
+      }
+    },
+    {
+      "identity" : "grdb.swift",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/groue/GRDB.swift",
+      "state" : {
+        "revision" : "e02f2c8abacff2799ed14926edcbf6e76fb9f805",
+        "version" : "5.25.0"
+      }
+    },
+    {
+      "identity" : "grpc-swiftpm",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/firebase/grpc-SwiftPM.git",
+      "state" : {
+        "revision" : "fb405dd2c7901485f7e158b24e3a0a47e4efd8b5",
+        "version" : "1.28.4"
+      }
+    },
+    {
+      "identity" : "gtm-session-fetcher",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/gtm-session-fetcher.git",
+      "state" : {
+        "revision" : "bc6a19702ac76ac4e488b68148710eb815f9bc56",
+        "version" : "1.7.0"
+      }
+    },
+    {
+      "identity" : "gtmappauth",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/GTMAppAuth.git",
+      "state" : {
+        "revision" : "40f4103fb52109032c05599a0c39ad43edbdf80a",
+        "version" : "1.2.2"
+      }
+    },
+    {
+      "identity" : "keychainaccess",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/kishikawakatsumi/KeychainAccess",
+      "state" : {
+        "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7",
+        "version" : "4.2.2"
+      }
+    },
+    {
+      "identity" : "leveldb",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/firebase/leveldb.git",
+      "state" : {
+        "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
+        "version" : "1.22.2"
+      }
+    },
+    {
+      "identity" : "nanopb",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/firebase/nanopb.git",
+      "state" : {
+        "revision" : "7ee9ef9f627d85cbe1b8c4f49a3ed26eed216c77",
+        "version" : "2.30908.0"
+      }
+    },
+    {
+      "identity" : "nimble",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/Quick/Nimble",
+      "state" : {
+        "revision" : "c93f16c25af5770f0d3e6af27c9634640946b068",
+        "version" : "9.2.1"
+      }
+    },
+    {
+      "identity" : "promises",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/google/promises.git",
+      "state" : {
+        "revision" : "611337c330350c9c1823ad6d671e7f936af5ee13",
+        "version" : "2.0.0"
+      }
+    },
+    {
+      "identity" : "quick",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/Quick/Quick",
+      "state" : {
+        "revision" : "8cce6acd38f965f5baa3167b939f86500314022b",
+        "version" : "3.1.2"
+      }
+    },
+    {
+      "identity" : "retry",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/icanzilb/Retry.git",
+      "state" : {
+        "revision" : "3beacada357968bcf9e5a2da520abfb374188afe",
+        "version" : "0.6.3"
+      }
+    },
+    {
+      "identity" : "scrollviewcontroller",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/darrarski/ScrollViewController",
+      "state" : {
+        "revision" : "9a52bb056504bb4766ddb5ac518097dd48736303",
+        "version" : "1.2.0"
+      }
+    },
+    {
+      "identity" : "snapkit",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/SnapKit/SnapKit",
+      "state" : {
+        "revision" : "d458564516e5676af9c70b4f4b2a9178294f1bc6",
+        "version" : "5.0.1"
+      }
+    },
+    {
+      "identity" : "swift-case-paths",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-case-paths",
+      "state" : {
+        "revision" : "241301b67d8551c26d8f09bd2c0e52cc49f18007",
+        "version" : "0.8.0"
+      }
+    },
+    {
+      "identity" : "swift-collections",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/apple/swift-collections",
+      "state" : {
+        "revision" : "48254824bb4248676bf7ce56014ff57b142b77eb",
+        "version" : "1.0.2"
+      }
+    },
+    {
+      "identity" : "swift-composable-architecture",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-composable-architecture.git",
+      "state" : {
+        "revision" : "313dd217dcd1d0478118ec5d15225fd473c1564a",
+        "version" : "0.32.0"
+      }
+    },
+    {
+      "identity" : "swift-custom-dump",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-custom-dump",
+      "state" : {
+        "revision" : "51698ece74ecf31959d3fa81733f0a5363ef1b4e",
+        "version" : "0.3.0"
+      }
+    },
+    {
+      "identity" : "swift-identified-collections",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-identified-collections",
+      "state" : {
+        "revision" : "680bf440178a78a627b1c2c64c0855f6523ad5b9",
+        "version" : "0.3.2"
+      }
+    },
+    {
+      "identity" : "swift-protobuf",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/apple/swift-protobuf",
+      "state" : {
+        "revision" : "7e2c5f3cbbeea68e004915e3a8961e20bd11d824",
+        "version" : "1.18.0"
+      }
+    },
+    {
+      "identity" : "swiftybeaver",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/SwiftyBeaver/SwiftyBeaver.git",
+      "state" : {
+        "revision" : "2c039501d6eeb4d4cd4aec4a8d884ad28862e044",
+        "version" : "1.9.5"
+      }
+    },
+    {
+      "identity" : "swiftydropbox",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/dropbox/SwiftyDropbox.git",
+      "state" : {
+        "revision" : "7af87d903be1cf0af0e76e0394d992943055894e",
+        "version" : "8.2.1"
+      }
+    },
+    {
+      "identity" : "xctest-dynamic-overlay",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay",
+      "state" : {
+        "revision" : "50a70a9d3583fe228ce672e8923010c8df2deddd",
+        "version" : "0.2.1"
+      }
+    }
+  ],
+  "version" : 2
 }
-- 
GitLab