diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/WorkbenchReplacement/App.swift b/WorkbenchReplacement/App.swift index cf5480f..3b08ab8 100644 --- a/WorkbenchReplacement/App.swift +++ b/WorkbenchReplacement/App.swift @@ -13,5 +13,287 @@ struct WorkbenchReplacementApp: App { .commands { CommandGroup(replacing: .newItem) {} } + + + Settings { + WorkbenchSettingsView() + } +} +} + + +// MARK: - Application Preferences + +@MainActor +final class WorkbenchPreferences: ObservableObject { + static let shared = WorkbenchPreferences() + + @AppStorage("preferences.editorFontSize") + var editorFontSize = 13.0 + + @AppStorage("preferences.uppercaseKeywords") + var uppercaseKeywords = true + + @AppStorage("preferences.showLineNumbers") + var showLineNumbers = true + + @AppStorage("preferences.tabWidth") + var tabWidth = 4 + + @AppStorage("preferences.resultRowHeight") + var resultRowHeight = 24.0 + + @AppStorage("preferences.resultColumnWidth") + var resultColumnWidth = 170.0 + + @AppStorage("preferences.alternatingRows") + var alternatingRows = true + + @AppStorage("preferences.appearance") + var appearance = "light" + + @AppStorage("preferences.autoExpandTables") + var autoExpandTables = true +} + + +// MARK: - Workbench Settings + +struct WorkbenchSettingsView: View { + + @AppStorage("preferences.editorFontSize") + private var editorFontSize = 13.0 + + @AppStorage("preferences.uppercaseKeywords") + private var uppercaseKeywords = true + + @AppStorage("preferences.showLineNumbers") + private var showLineNumbers = true + + @AppStorage("preferences.tabWidth") + private var tabWidth = 4 + + @AppStorage("preferences.defaultRowLimit") + private var defaultRowLimit = 500 + + @AppStorage("preferences.resultRowHeight") + private var resultRowHeight = 24.0 + + @AppStorage("preferences.resultColumnWidth") + private var resultColumnWidth = 170.0 + + @AppStorage("preferences.alternatingRows") + private var alternatingRows = true + + @AppStorage("preferences.autoExpandTables") + private var autoExpandTables = true + + var body: some View { + TabView { + + editorSettings + .tabItem { + Label( + "SQL Editor", + systemImage: "chevron.left.forwardslash.chevron.right" + ) + } + + executionSettings + .tabItem { + Label( + "Query Execution", + systemImage: "bolt" + ) + } + + resultSettings + .tabItem { + Label( + "Result Grid", + systemImage: "tablecells" + ) + } + + generalSettings + .tabItem { + Label( + "General", + systemImage: "gearshape" + ) + } + } + .frame(width: 620, height: 390) + .preferredColorScheme(.light) + } + + private var editorSettings: some View { + settingsPage("SQL Editor") { + + settingsRow("Font Size") { + Stepper( + "\(Int(editorFontSize)) pt", + value: $editorFontSize, + in: 10...24, + step: 1 + ) + .frame(width: 130) + } + + settingsRow("Tab Width") { + Picker("", selection: $tabWidth) { + Text("2 spaces").tag(2) + Text("4 spaces").tag(4) + Text("8 spaces").tag(8) + } + .labelsHidden() + .frame(width: 150) + } + + settingsRow("SQL Formatting") { + Toggle( + "Automatically uppercase SQL keywords", + isOn: $uppercaseKeywords + ) + } + + settingsRow("Editor Display") { + Toggle( + "Show line numbers", + isOn: $showLineNumbers + ) + } + } + } + + private var executionSettings: some View { + settingsPage("Query Execution") { + + settingsRow("Default Row Limit") { + HStack(spacing: 12) { + TextField( + "", + value: $defaultRowLimit, + format: .number + ) + .textFieldStyle(.roundedBorder) + .frame(width: 110) + + Stepper( + "", + value: $defaultRowLimit, + in: 50...100000, + step: 50 + ) + .labelsHidden() + } + } + + Text( + "Controls the number of rows retrieved when opening a table from the schema navigator." + ) + .font(.system(size: 12)) + .foregroundStyle(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.leading, 190) + + Divider() + .padding(.vertical, 12) + + Text("Examples") + .font(.headline) + + Text( + "500 rows: Faster browsing and lower memory usage.\n" + + "5,000 rows: Useful for larger datasets.\n" + + "50,000 rows: May take longer to retrieve." + ) + .font(.system(size: 12)) + .foregroundStyle(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + } + } + + private var resultSettings: some View { + settingsPage("Result Grid") { + + settingsRow("Row Height") { + Stepper( + "\(Int(resultRowHeight)) px", + value: $resultRowHeight, + in: 18...40, + step: 1 + ) + .frame(width: 130) + } + + settingsRow("Column Width") { + Stepper( + "\(Int(resultColumnWidth)) px", + value: $resultColumnWidth, + in: 80...400, + step: 10 + ) + .frame(width: 140) + } + + settingsRow("Appearance") { + Toggle( + "Alternating row colours", + isOn: $alternatingRows + ) + } + } + } + + private var generalSettings: some View { + settingsPage("General") { + + settingsRow("Navigator") { + Toggle( + "Automatically expand table folders", + isOn: $autoExpandTables + ) + } + } + } + + private func settingsPage( + _ title: String, + @ViewBuilder content: () -> Content + ) -> some View { + + VStack(alignment: .leading, spacing: 18) { + + Text(title) + .font(.system(size: 20, weight: .semibold)) + + Divider() + + content() + + Spacer(minLength: 0) + } + .padding(26) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(Color(nsColor: .windowBackgroundColor)) + } + + private func settingsRow( + _ title: String, + @ViewBuilder content: () -> Content + ) -> some View { + + HStack(alignment: .center, spacing: 16) { + + Text(title) + .font(.system(size: 13)) + .frame(width: 170, alignment: .trailing) + + content() + + Spacer(minLength: 0) + } + .frame(height: 30) } } diff --git a/WorkbenchReplacement/App.swift.backup-20261016-172158 b/WorkbenchReplacement/App.swift.backup-20261016-172158 new file mode 100644 index 0000000..cf5480f --- /dev/null +++ b/WorkbenchReplacement/App.swift.backup-20261016-172158 @@ -0,0 +1,17 @@ +import SwiftUI + +@main +struct WorkbenchReplacementApp: App { + @StateObject private var model = DatabaseModel() + + var body: some Scene { + WindowGroup("Workbench Replacement") { + MainView() + .environmentObject(model) + .frame(minWidth: 1000, minHeight: 650) + } + .commands { + CommandGroup(replacing: .newItem) {} + } + } +} diff --git a/WorkbenchReplacement/App.swift.backup-20261016-172337 b/WorkbenchReplacement/App.swift.backup-20261016-172337 new file mode 100644 index 0000000..bf1f010 --- /dev/null +++ b/WorkbenchReplacement/App.swift.backup-20261016-172337 @@ -0,0 +1,177 @@ +import SwiftUI + +@main +struct WorkbenchReplacementApp: App { + @StateObject private var model = DatabaseModel() + + var body: some Scene { + WindowGroup("Workbench Replacement") { + MainView() + .environmentObject(model) + .frame(minWidth: 1000, minHeight: 650) + } + .commands { + CommandGroup(replacing: .newItem) {} + } + + + Settings { + WorkbenchSettingsView() + } +} +} + + +// MARK: - Application Preferences + +@MainActor +final class WorkbenchPreferences: ObservableObject { + static let shared = WorkbenchPreferences() + + @AppStorage("preferences.editorFontSize") + var editorFontSize = 13.0 + + @AppStorage("preferences.uppercaseKeywords") + var uppercaseKeywords = true + + @AppStorage("preferences.showLineNumbers") + var showLineNumbers = true + + @AppStorage("preferences.tabWidth") + var tabWidth = 4 + + @AppStorage("preferences.resultRowHeight") + var resultRowHeight = 24.0 + + @AppStorage("preferences.resultColumnWidth") + var resultColumnWidth = 170.0 + + @AppStorage("preferences.alternatingRows") + var alternatingRows = true + + @AppStorage("preferences.appearance") + var appearance = "light" + + @AppStorage("preferences.autoExpandTables") + var autoExpandTables = true +} + +struct WorkbenchSettingsView: View { + @AppStorage("preferences.editorFontSize") + private var editorFontSize = 13.0 + + @AppStorage("preferences.uppercaseKeywords") + private var uppercaseKeywords = true + + @AppStorage("preferences.showLineNumbers") + private var showLineNumbers = true + + @AppStorage("preferences.tabWidth") + private var tabWidth = 4 + + @AppStorage("preferences.resultRowHeight") + private var resultRowHeight = 24.0 + + @AppStorage("preferences.resultColumnWidth") + private var resultColumnWidth = 170.0 + + @AppStorage("preferences.alternatingRows") + private var alternatingRows = true + + @AppStorage("preferences.appearance") + private var appearance = "light" + + @AppStorage("preferences.autoExpandTables") + private var autoExpandTables = true + + var body: some View { + TabView { + Form { + HStack { + Text("Editor Font Size") + Spacer() + Stepper( + "\(Int(editorFontSize)) pt", + value: $editorFontSize, + in: 10...24, + step: 1 + ) + .frame(width: 130) + } + + Toggle( + "Automatically uppercase SQL keywords", + isOn: $uppercaseKeywords + ) + + Toggle( + "Show line numbers", + isOn: $showLineNumbers + ) + + Picker("Tab Width", selection: $tabWidth) { + Text("2 spaces").tag(2) + Text("4 spaces").tag(4) + Text("8 spaces").tag(8) + } + } + .padding(20) + .tabItem { + Label("SQL Editor", systemImage: "chevron.left.forwardslash.chevron.right") + } + + Form { + HStack { + Text("Result Row Height") + Spacer() + Stepper( + "\(Int(resultRowHeight)) px", + value: $resultRowHeight, + in: 18...40, + step: 1 + ) + .frame(width: 130) + } + + HStack { + Text("Default Column Width") + Spacer() + Stepper( + "\(Int(resultColumnWidth)) px", + value: $resultColumnWidth, + in: 80...400, + step: 10 + ) + .frame(width: 140) + } + + Toggle( + "Alternating row colours", + isOn: $alternatingRows + ) + } + .padding(20) + .tabItem { + Label("Result Grid", systemImage: "tablecells") + } + + Form { + Picker("Appearance", selection: $appearance) { + Text("Light").tag("light") + Text("Dark").tag("dark") + Text("System").tag("system") + } + + Toggle( + "Automatically expand table folders", + isOn: $autoExpandTables + ) + } + .padding(20) + .tabItem { + Label("General", systemImage: "gearshape") + } + } + .frame(width: 560, height: 330) + } +} diff --git a/WorkbenchReplacement/DatabaseModel.swift b/WorkbenchReplacement/DatabaseModel.swift index d48fa03..b12439c 100644 --- a/WorkbenchReplacement/DatabaseModel.swift +++ b/WorkbenchReplacement/DatabaseModel.swift @@ -47,6 +47,7 @@ final class DatabaseModel: ObservableObject { @Published var result = QueryResult() @Published var databases: [String] = [] @Published var schemaTables: [String: [String]] = [:] + @Published var schemaViews: [String: [String]] = [:] @Published var selectedDatabase = "" @Published var isRunning = false @Published var status = "Not connected" @@ -74,40 +75,92 @@ final class DatabaseModel: ObservableObject { sql = SQLFormatter.uppercaseKeywords(sql) } + func loadTables(database: String) { - guard let profile = selected else { return } + guard let profile = selected else { + status = "Select a MySQL connection" + return + } let password = PasswordStore.read(profile.id) - let escaped = database.replacingOccurrences(of: "`", with: "``") + let escaped = database.replacingOccurrences( + of: "`", + with: "``" + ) + + status = "Loading tables from \(database)…" Task { do { let parsed = try await NativeMySQLRunner.run( profile: profile, - database: "", + database: database, password: password, - sql: "SHOW TABLES FROM `\\(escaped)`" + sql: "SHOW FULL TABLES FROM `\(escaped)`" ) - schemaTables[database] = parsed.rows.compactMap { $0.first } + var tables: [String] = [] + var views: [String] = [] + + for row in parsed.rows { + guard let name = row.first else { + continue + } + + if row.count > 1 && row[1] == "VIEW" { + views.append(name) + } else { + tables.append(name) + } + } + + schemaTables[database] = tables + schemaViews[database] = views + + status = "Loaded \(tables.count) tables and \(views.count) views from \(database)" } catch { - status = "Unable to load tables: \\(error.localizedDescription)" + status = "Unable to load tables: \(error.localizedDescription)" + result = QueryResult(message: error.localizedDescription) } } } - func selectTable(database: String, table: String) { - let db = database.replacingOccurrences(of: "`", with: "``") - let tbl = table.replacingOccurrences(of: "`", with: "``") - sql = "SELECT * FROM `\\(db)`.`\\(tbl)` LIMIT 100;" + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences( + of: "`", + with: "``" + ) + + let tbl = table.replacingOccurrences( + of: "`", + with: "``" + ) + + selectedDatabase = database + + let configuredLimit = UserDefaults.standard.integer( + forKey: "preferences.defaultRowLimit" + ) + + let rowLimit = configuredLimit > 0 + ? min(configuredLimit, 100000) + : 500 + + sql = "SELECT * FROM `\(db)`.`\(tbl)` LIMIT \(rowLimit);" + runSQL() } func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } func runSQL() { - formatSQL() + if UserDefaults.standard.object( + forKey: "preferences.uppercaseKeywords" + ) as? Bool ?? true { + formatSQL() + } execute(sql, listingDatabases: false) } private func execute(_ statement: String, listingDatabases: Bool) { diff --git a/WorkbenchReplacement/DatabaseModel.swift.backup-20261016-170516 b/WorkbenchReplacement/DatabaseModel.swift.backup-20261016-170516 new file mode 100644 index 0000000..d48fa03 --- /dev/null +++ b/WorkbenchReplacement/DatabaseModel.swift.backup-20261016-170516 @@ -0,0 +1,294 @@ +import Foundation +import Security + +struct ConnectionProfile: Identifiable, Codable, Hashable { + var id = UUID() + var name = "Local MySQL" + var host = "127.0.0.1" + var port = 3306 + var username = "root" + var database = "" +} +struct QueryResult { + var columns: [String] = [] + var rows: [[String]] = [] + var message = "" +} + +enum PasswordStore { + static func read(_ id: UUID) -> String { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne] + var value: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &value) == errSecSuccess, + let data = value as? Data else { return "" } + return String(data: data, encoding: .utf8) ?? "" + } + static func save(_ password: String, id: UUID) { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString] + SecItemDelete(query as CFDictionary) + guard !password.isEmpty else { return } + var attributes = query + attributes[kSecValueData as String] = Data(password.utf8) + SecItemAdd(attributes as CFDictionary, nil) + } +} + +@MainActor +final class DatabaseModel: ObservableObject { + @Published var profiles: [ConnectionProfile] = [] + @Published var selectedID: UUID? + @Published var sql = "SELECT VERSION() AS server_version;" + @Published var result = QueryResult() + @Published var databases: [String] = [] + @Published var schemaTables: [String: [String]] = [:] + @Published var selectedDatabase = "" + @Published var isRunning = false + @Published var status = "Not connected" + private let storageKey = "WorkbenchReplacement.connectionProfiles.native.v1" + + init() { + if let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } + if profiles.isEmpty { profiles = [ConnectionProfile()] } + selectedID = profiles.first?.id + } + var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } + func save(_ profile: ConnectionProfile, password: String) { + if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } + else { profiles.append(profile) } + PasswordStore.save(password, id: profile.id) + selectedID = profile.id + persist() + } + private func persist() { + if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) } + } + + func formatSQL() { + sql = SQLFormatter.uppercaseKeywords(sql) + } + + func loadTables(database: String) { + guard let profile = selected else { return } + + let password = PasswordStore.read(profile.id) + let escaped = database.replacingOccurrences(of: "`", with: "``") + + Task { + do { + let parsed = try await NativeMySQLRunner.run( + profile: profile, + database: "", + password: password, + sql: "SHOW TABLES FROM `\\(escaped)`" + ) + + schemaTables[database] = parsed.rows.compactMap { $0.first } + } catch { + status = "Unable to load tables: \\(error.localizedDescription)" + } + } + } + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences(of: "`", with: "``") + let tbl = table.replacingOccurrences(of: "`", with: "``") + + sql = "SELECT * FROM `\\(db)`.`\\(tbl)` LIMIT 100;" + runSQL() + } + + func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } + + func runSQL() { + formatSQL() + execute(sql, listingDatabases: false) + } + private func execute(_ statement: String, listingDatabases: Bool) { + guard let profile = selected else { status = "Select a connection"; return } + guard !statement.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + isRunning = true + status = "Connecting…" + let activeDB = listingDatabases ? "" : (selectedDatabase.isEmpty ? profile.database : selectedDatabase) + let password = PasswordStore.read(profile.id) + Task { + do { + let parsed = try await NativeMySQLRunner.run(profile: profile, database: activeDB, password: password, sql: statement) + if listingDatabases { + databases = parsed.rows.compactMap { $0.first } + status = "Connected to \(profile.name)" + } else { + result = parsed + status = "Query completed (\(parsed.rows.count) rows)" + } + } catch { + status = "Error" + result = QueryResult(message: error.localizedDescription) + } + isRunning = false + } + } +} + + +// MARK: - SQL Keyword Formatter + +enum SQLFormatter { + + private static let keywords: Set = [ + "SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", + "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TABLE", + "DATABASE", "SCHEMA", "USE", "SHOW", "DESCRIBE", "EXPLAIN", + "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", + "ON", "AS", "AND", "OR", "NOT", "NULL", "IS", "IN", + "BETWEEN", "LIKE", "ORDER", "BY", "GROUP", "HAVING", + "LIMIT", "OFFSET", "ASC", "DESC", "DISTINCT", "ALL", + "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "INDEX", + "UNIQUE", "DEFAULT", "AUTO_INCREMENT", "IF", "EXISTS", + "CASCADE", "RESTRICT", "SET", "BEGIN", "COMMIT", + "ROLLBACK", "TRANSACTION", "UNION", "CASE", "WHEN", + "THEN", "ELSE", "END", "TRUE", "FALSE", "COUNT", + "SUM", "AVG", "MIN", "MAX", "HAVING", "WITH", + "RECURSIVE", "TRUNCATE", "REPLACE", "VIEW", + "PROCEDURE", "FUNCTION", "TRIGGER", "GRANT", + "REVOKE", "DISTINCT", "CURRENT_TIMESTAMP" + ] + + static func uppercaseKeywords(_ sql: String) -> String { + let chars = Array(sql) + var output = "" + var index = 0 + + enum State { + case normal + case singleQuote + case doubleQuote + case backtick + case lineComment + case blockComment + } + + var state = State.normal + + while index < chars.count { + let ch = chars[index] + let next: Character? = index + 1 < chars.count + ? chars[index + 1] : nil + + switch state { + case .normal: + if ch == "'" { + state = .singleQuote + output.append(ch) + index += 1 + } else if ch == "\"" { + state = .doubleQuote + output.append(ch) + index += 1 + } else if ch == "`" { + state = .backtick + output.append(ch) + index += 1 + } else if ch == "-" && next == "-" && + (index + 2 == chars.count || + chars[index + 2].isWhitespace) { + state = .lineComment + output += "--" + index += 2 + } else if ch == "#" { + state = .lineComment + output.append(ch) + index += 1 + } else if ch == "/" && next == "*" { + state = .blockComment + output += "/*" + index += 2 + } else if ch.isLetter || ch == "_" { + let start = index + while index < chars.count && + (chars[index].isLetter || + chars[index].isNumber || + chars[index] == "_" || + chars[index] == "$") { + index += 1 + } + + let word = String(chars[start.. String { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne] + var value: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &value) == errSecSuccess, + let data = value as? Data else { return "" } + return String(data: data, encoding: .utf8) ?? "" + } + static func save(_ password: String, id: UUID) { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString] + SecItemDelete(query as CFDictionary) + guard !password.isEmpty else { return } + var attributes = query + attributes[kSecValueData as String] = Data(password.utf8) + SecItemAdd(attributes as CFDictionary, nil) + } +} + +@MainActor +final class DatabaseModel: ObservableObject { + @Published var profiles: [ConnectionProfile] = [] + @Published var selectedID: UUID? + @Published var sql = "SELECT VERSION() AS server_version;" + @Published var result = QueryResult() + @Published var databases: [String] = [] + @Published var schemaTables: [String: [String]] = [:] + @Published var selectedDatabase = "" + @Published var isRunning = false + @Published var status = "Not connected" + private let storageKey = "WorkbenchReplacement.connectionProfiles.native.v1" + + init() { + if let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } + if profiles.isEmpty { profiles = [ConnectionProfile()] } + selectedID = profiles.first?.id + } + var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } + func save(_ profile: ConnectionProfile, password: String) { + if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } + else { profiles.append(profile) } + PasswordStore.save(password, id: profile.id) + selectedID = profile.id + persist() + } + private func persist() { + if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) } + } + + func formatSQL() { + sql = SQLFormatter.uppercaseKeywords(sql) + } + + func loadTables(database: String) { + guard let profile = selected else { return } + + let password = PasswordStore.read(profile.id) + let escaped = database.replacingOccurrences(of: "`", with: "``") + + Task { + do { + let parsed = try await NativeMySQLRunner.run( + profile: profile, + database: "", + password: password, + sql: "SHOW TABLES FROM `\\(escaped)`" + ) + + schemaTables[database] = parsed.rows.compactMap { $0.first } + } catch { + status = "Unable to load tables: \\(error.localizedDescription)" + } + } + } + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences(of: "`", with: "``") + let tbl = table.replacingOccurrences(of: "`", with: "``") + + sql = "SELECT * FROM `\\(db)`.`\\(tbl)` LIMIT 100;" + runSQL() + } + + func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } + + func runSQL() { + formatSQL() + execute(sql, listingDatabases: false) + } + private func execute(_ statement: String, listingDatabases: Bool) { + guard let profile = selected else { status = "Select a connection"; return } + guard !statement.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + isRunning = true + status = "Connecting…" + let activeDB = listingDatabases ? "" : (selectedDatabase.isEmpty ? profile.database : selectedDatabase) + let password = PasswordStore.read(profile.id) + Task { + do { + let parsed = try await NativeMySQLRunner.run(profile: profile, database: activeDB, password: password, sql: statement) + if listingDatabases { + databases = parsed.rows.compactMap { $0.first } + status = "Connected to \(profile.name)" + } else { + result = parsed + status = "Query completed (\(parsed.rows.count) rows)" + } + } catch { + status = "Error" + result = QueryResult(message: error.localizedDescription) + } + isRunning = false + } + } +} + + +// MARK: - SQL Keyword Formatter + +enum SQLFormatter { + + private static let keywords: Set = [ + "SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", + "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TABLE", + "DATABASE", "SCHEMA", "USE", "SHOW", "DESCRIBE", "EXPLAIN", + "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", + "ON", "AS", "AND", "OR", "NOT", "NULL", "IS", "IN", + "BETWEEN", "LIKE", "ORDER", "BY", "GROUP", "HAVING", + "LIMIT", "OFFSET", "ASC", "DESC", "DISTINCT", "ALL", + "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "INDEX", + "UNIQUE", "DEFAULT", "AUTO_INCREMENT", "IF", "EXISTS", + "CASCADE", "RESTRICT", "SET", "BEGIN", "COMMIT", + "ROLLBACK", "TRANSACTION", "UNION", "CASE", "WHEN", + "THEN", "ELSE", "END", "TRUE", "FALSE", "COUNT", + "SUM", "AVG", "MIN", "MAX", "HAVING", "WITH", + "RECURSIVE", "TRUNCATE", "REPLACE", "VIEW", + "PROCEDURE", "FUNCTION", "TRIGGER", "GRANT", + "REVOKE", "DISTINCT", "CURRENT_TIMESTAMP" + ] + + static func uppercaseKeywords(_ sql: String) -> String { + let chars = Array(sql) + var output = "" + var index = 0 + + enum State { + case normal + case singleQuote + case doubleQuote + case backtick + case lineComment + case blockComment + } + + var state = State.normal + + while index < chars.count { + let ch = chars[index] + let next: Character? = index + 1 < chars.count + ? chars[index + 1] : nil + + switch state { + case .normal: + if ch == "'" { + state = .singleQuote + output.append(ch) + index += 1 + } else if ch == "\"" { + state = .doubleQuote + output.append(ch) + index += 1 + } else if ch == "`" { + state = .backtick + output.append(ch) + index += 1 + } else if ch == "-" && next == "-" && + (index + 2 == chars.count || + chars[index + 2].isWhitespace) { + state = .lineComment + output += "--" + index += 2 + } else if ch == "#" { + state = .lineComment + output.append(ch) + index += 1 + } else if ch == "/" && next == "*" { + state = .blockComment + output += "/*" + index += 2 + } else if ch.isLetter || ch == "_" { + let start = index + while index < chars.count && + (chars[index].isLetter || + chars[index].isNumber || + chars[index] == "_" || + chars[index] == "$") { + index += 1 + } + + let word = String(chars[start.. String { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne] + var value: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &value) == errSecSuccess, + let data = value as? Data else { return "" } + return String(data: data, encoding: .utf8) ?? "" + } + static func save(_ password: String, id: UUID) { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString] + SecItemDelete(query as CFDictionary) + guard !password.isEmpty else { return } + var attributes = query + attributes[kSecValueData as String] = Data(password.utf8) + SecItemAdd(attributes as CFDictionary, nil) + } +} + +@MainActor +final class DatabaseModel: ObservableObject { + @Published var profiles: [ConnectionProfile] = [] + @Published var selectedID: UUID? + @Published var sql = "SELECT VERSION() AS server_version;" + @Published var result = QueryResult() + @Published var databases: [String] = [] + @Published var schemaTables: [String: [String]] = [:] + @Published var schemaViews: [String: [String]] = [:] + @Published var selectedDatabase = "" + @Published var isRunning = false + @Published var status = "Not connected" + private let storageKey = "WorkbenchReplacement.connectionProfiles.native.v1" + + init() { + if let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } + if profiles.isEmpty { profiles = [ConnectionProfile()] } + selectedID = profiles.first?.id + } + var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } + func save(_ profile: ConnectionProfile, password: String) { + if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } + else { profiles.append(profile) } + PasswordStore.save(password, id: profile.id) + selectedID = profile.id + persist() + } + private func persist() { + if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) } + } + + func formatSQL() { + sql = SQLFormatter.uppercaseKeywords(sql) + } + + + func loadTables(database: String) { + guard let profile = selected else { + status = "Select a MySQL connection" + return + } + + let password = PasswordStore.read(profile.id) + let escaped = database.replacingOccurrences( + of: "`", + with: "``" + ) + + status = "Loading tables from \(database)…" + + Task { + do { + let parsed = try await NativeMySQLRunner.run( + profile: profile, + database: database, + password: password, + sql: "SHOW FULL TABLES FROM `\(escaped)`" + ) + + var tables: [String] = [] + var views: [String] = [] + + for row in parsed.rows { + guard let name = row.first else { + continue + } + + if row.count > 1 && row[1] == "VIEW" { + views.append(name) + } else { + tables.append(name) + } + } + + schemaTables[database] = tables + schemaViews[database] = views + + status = "Loaded \(tables.count) tables and \(views.count) views from \(database)" + } catch { + status = "Unable to load tables: \(error.localizedDescription)" + result = QueryResult(message: error.localizedDescription) + } + } + } + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences(of: "`", with: "``") + let tbl = table.replacingOccurrences(of: "`", with: "``") + + sql = "SELECT * FROM `\\(db)`.`\\(tbl)` LIMIT 100;" + runSQL() + } + + func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } + + func runSQL() { + formatSQL() + execute(sql, listingDatabases: false) + } + private func execute(_ statement: String, listingDatabases: Bool) { + guard let profile = selected else { status = "Select a connection"; return } + guard !statement.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + isRunning = true + status = "Connecting…" + let activeDB = listingDatabases ? "" : (selectedDatabase.isEmpty ? profile.database : selectedDatabase) + let password = PasswordStore.read(profile.id) + Task { + do { + let parsed = try await NativeMySQLRunner.run(profile: profile, database: activeDB, password: password, sql: statement) + if listingDatabases { + databases = parsed.rows.compactMap { $0.first } + status = "Connected to \(profile.name)" + } else { + result = parsed + status = "Query completed (\(parsed.rows.count) rows)" + } + } catch { + status = "Error" + result = QueryResult(message: error.localizedDescription) + } + isRunning = false + } + } +} + + +// MARK: - SQL Keyword Formatter + +enum SQLFormatter { + + private static let keywords: Set = [ + "SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", + "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TABLE", + "DATABASE", "SCHEMA", "USE", "SHOW", "DESCRIBE", "EXPLAIN", + "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", + "ON", "AS", "AND", "OR", "NOT", "NULL", "IS", "IN", + "BETWEEN", "LIKE", "ORDER", "BY", "GROUP", "HAVING", + "LIMIT", "OFFSET", "ASC", "DESC", "DISTINCT", "ALL", + "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "INDEX", + "UNIQUE", "DEFAULT", "AUTO_INCREMENT", "IF", "EXISTS", + "CASCADE", "RESTRICT", "SET", "BEGIN", "COMMIT", + "ROLLBACK", "TRANSACTION", "UNION", "CASE", "WHEN", + "THEN", "ELSE", "END", "TRUE", "FALSE", "COUNT", + "SUM", "AVG", "MIN", "MAX", "HAVING", "WITH", + "RECURSIVE", "TRUNCATE", "REPLACE", "VIEW", + "PROCEDURE", "FUNCTION", "TRIGGER", "GRANT", + "REVOKE", "DISTINCT", "CURRENT_TIMESTAMP" + ] + + static func uppercaseKeywords(_ sql: String) -> String { + let chars = Array(sql) + var output = "" + var index = 0 + + enum State { + case normal + case singleQuote + case doubleQuote + case backtick + case lineComment + case blockComment + } + + var state = State.normal + + while index < chars.count { + let ch = chars[index] + let next: Character? = index + 1 < chars.count + ? chars[index + 1] : nil + + switch state { + case .normal: + if ch == "'" { + state = .singleQuote + output.append(ch) + index += 1 + } else if ch == "\"" { + state = .doubleQuote + output.append(ch) + index += 1 + } else if ch == "`" { + state = .backtick + output.append(ch) + index += 1 + } else if ch == "-" && next == "-" && + (index + 2 == chars.count || + chars[index + 2].isWhitespace) { + state = .lineComment + output += "--" + index += 2 + } else if ch == "#" { + state = .lineComment + output.append(ch) + index += 1 + } else if ch == "/" && next == "*" { + state = .blockComment + output += "/*" + index += 2 + } else if ch.isLetter || ch == "_" { + let start = index + while index < chars.count && + (chars[index].isLetter || + chars[index].isNumber || + chars[index] == "_" || + chars[index] == "$") { + index += 1 + } + + let word = String(chars[start.. String { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne] + var value: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &value) == errSecSuccess, + let data = value as? Data else { return "" } + return String(data: data, encoding: .utf8) ?? "" + } + static func save(_ password: String, id: UUID) { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString] + SecItemDelete(query as CFDictionary) + guard !password.isEmpty else { return } + var attributes = query + attributes[kSecValueData as String] = Data(password.utf8) + SecItemAdd(attributes as CFDictionary, nil) + } +} + +@MainActor +final class DatabaseModel: ObservableObject { + @Published var profiles: [ConnectionProfile] = [] + @Published var selectedID: UUID? + @Published var sql = "SELECT VERSION() AS server_version;" + @Published var result = QueryResult() + @Published var databases: [String] = [] + @Published var schemaTables: [String: [String]] = [:] + @Published var schemaViews: [String: [String]] = [:] + @Published var selectedDatabase = "" + @Published var isRunning = false + @Published var status = "Not connected" + private let storageKey = "WorkbenchReplacement.connectionProfiles.native.v1" + + init() { + if let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } + if profiles.isEmpty { profiles = [ConnectionProfile()] } + selectedID = profiles.first?.id + } + var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } + func save(_ profile: ConnectionProfile, password: String) { + if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } + else { profiles.append(profile) } + PasswordStore.save(password, id: profile.id) + selectedID = profile.id + persist() + } + private func persist() { + if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) } + } + + func formatSQL() { + sql = SQLFormatter.uppercaseKeywords(sql) + } + + + func loadTables(database: String) { + guard let profile = selected else { + status = "Select a MySQL connection" + return + } + + let password = PasswordStore.read(profile.id) + let escaped = database.replacingOccurrences( + of: "`", + with: "``" + ) + + status = "Loading tables from \(database)…" + + Task { + do { + let parsed = try await NativeMySQLRunner.run( + profile: profile, + database: database, + password: password, + sql: "SHOW FULL TABLES FROM `\(escaped)`" + ) + + var tables: [String] = [] + var views: [String] = [] + + for row in parsed.rows { + guard let name = row.first else { + continue + } + + if row.count > 1 && row[1] == "VIEW" { + views.append(name) + } else { + tables.append(name) + } + } + + schemaTables[database] = tables + schemaViews[database] = views + + status = "Loaded \(tables.count) tables and \(views.count) views from \(database)" + } catch { + status = "Unable to load tables: \(error.localizedDescription)" + result = QueryResult(message: error.localizedDescription) + } + } + } + + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences( + of: "`", + with: "``" + ) + + let tbl = table.replacingOccurrences( + of: "`", + with: "``" + ) + + selectedDatabase = database + + sql = "SELECT * FROM `\(db)`.`\(tbl)` LIMIT 100;" + + runSQL() + } + + func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } + + func runSQL() { + formatSQL() + execute(sql, listingDatabases: false) + } + private func execute(_ statement: String, listingDatabases: Bool) { + guard let profile = selected else { status = "Select a connection"; return } + guard !statement.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + isRunning = true + status = "Connecting…" + let activeDB = listingDatabases ? "" : (selectedDatabase.isEmpty ? profile.database : selectedDatabase) + let password = PasswordStore.read(profile.id) + Task { + do { + let parsed = try await NativeMySQLRunner.run(profile: profile, database: activeDB, password: password, sql: statement) + if listingDatabases { + databases = parsed.rows.compactMap { $0.first } + status = "Connected to \(profile.name)" + } else { + result = parsed + status = "Query completed (\(parsed.rows.count) rows)" + } + } catch { + status = "Error" + result = QueryResult(message: error.localizedDescription) + } + isRunning = false + } + } +} + + +// MARK: - SQL Keyword Formatter + +enum SQLFormatter { + + private static let keywords: Set = [ + "SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", + "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TABLE", + "DATABASE", "SCHEMA", "USE", "SHOW", "DESCRIBE", "EXPLAIN", + "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", + "ON", "AS", "AND", "OR", "NOT", "NULL", "IS", "IN", + "BETWEEN", "LIKE", "ORDER", "BY", "GROUP", "HAVING", + "LIMIT", "OFFSET", "ASC", "DESC", "DISTINCT", "ALL", + "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "INDEX", + "UNIQUE", "DEFAULT", "AUTO_INCREMENT", "IF", "EXISTS", + "CASCADE", "RESTRICT", "SET", "BEGIN", "COMMIT", + "ROLLBACK", "TRANSACTION", "UNION", "CASE", "WHEN", + "THEN", "ELSE", "END", "TRUE", "FALSE", "COUNT", + "SUM", "AVG", "MIN", "MAX", "HAVING", "WITH", + "RECURSIVE", "TRUNCATE", "REPLACE", "VIEW", + "PROCEDURE", "FUNCTION", "TRIGGER", "GRANT", + "REVOKE", "DISTINCT", "CURRENT_TIMESTAMP" + ] + + static func uppercaseKeywords(_ sql: String) -> String { + let chars = Array(sql) + var output = "" + var index = 0 + + enum State { + case normal + case singleQuote + case doubleQuote + case backtick + case lineComment + case blockComment + } + + var state = State.normal + + while index < chars.count { + let ch = chars[index] + let next: Character? = index + 1 < chars.count + ? chars[index + 1] : nil + + switch state { + case .normal: + if ch == "'" { + state = .singleQuote + output.append(ch) + index += 1 + } else if ch == "\"" { + state = .doubleQuote + output.append(ch) + index += 1 + } else if ch == "`" { + state = .backtick + output.append(ch) + index += 1 + } else if ch == "-" && next == "-" && + (index + 2 == chars.count || + chars[index + 2].isWhitespace) { + state = .lineComment + output += "--" + index += 2 + } else if ch == "#" { + state = .lineComment + output.append(ch) + index += 1 + } else if ch == "/" && next == "*" { + state = .blockComment + output += "/*" + index += 2 + } else if ch.isLetter || ch == "_" { + let start = index + while index < chars.count && + (chars[index].isLetter || + chars[index].isNumber || + chars[index] == "_" || + chars[index] == "$") { + index += 1 + } + + let word = String(chars[start.. String { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne] + var value: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &value) == errSecSuccess, + let data = value as? Data else { return "" } + return String(data: data, encoding: .utf8) ?? "" + } + static func save(_ password: String, id: UUID) { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString] + SecItemDelete(query as CFDictionary) + guard !password.isEmpty else { return } + var attributes = query + attributes[kSecValueData as String] = Data(password.utf8) + SecItemAdd(attributes as CFDictionary, nil) + } +} + +@MainActor +final class DatabaseModel: ObservableObject { + @Published var profiles: [ConnectionProfile] = [] + @Published var selectedID: UUID? + @Published var sql = "SELECT VERSION() AS server_version;" + @Published var result = QueryResult() + @Published var databases: [String] = [] + @Published var schemaTables: [String: [String]] = [:] + @Published var schemaViews: [String: [String]] = [:] + @Published var selectedDatabase = "" + @Published var isRunning = false + @Published var status = "Not connected" + private let storageKey = "WorkbenchReplacement.connectionProfiles.native.v1" + + init() { + if let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } + if profiles.isEmpty { profiles = [ConnectionProfile()] } + selectedID = profiles.first?.id + } + var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } + func save(_ profile: ConnectionProfile, password: String) { + if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } + else { profiles.append(profile) } + PasswordStore.save(password, id: profile.id) + selectedID = profile.id + persist() + } + private func persist() { + if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) } + } + + func formatSQL() { + sql = SQLFormatter.uppercaseKeywords(sql) + } + + + func loadTables(database: String) { + guard let profile = selected else { + status = "Select a MySQL connection" + return + } + + let password = PasswordStore.read(profile.id) + let escaped = database.replacingOccurrences( + of: "`", + with: "``" + ) + + status = "Loading tables from \(database)…" + + Task { + do { + let parsed = try await NativeMySQLRunner.run( + profile: profile, + database: database, + password: password, + sql: "SHOW FULL TABLES FROM `\(escaped)`" + ) + + var tables: [String] = [] + var views: [String] = [] + + for row in parsed.rows { + guard let name = row.first else { + continue + } + + if row.count > 1 && row[1] == "VIEW" { + views.append(name) + } else { + tables.append(name) + } + } + + schemaTables[database] = tables + schemaViews[database] = views + + status = "Loaded \(tables.count) tables and \(views.count) views from \(database)" + } catch { + status = "Unable to load tables: \(error.localizedDescription)" + result = QueryResult(message: error.localizedDescription) + } + } + } + + + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences( + of: "`", + with: "``" + ) + + let tbl = table.replacingOccurrences( + of: "`", + with: "``" + ) + + selectedDatabase = database + + sql = "SELECT * FROM `\(db)`.`\(tbl)` LIMIT 100;" + + runSQL() + } + + func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } + + func runSQL() { + formatSQL() + execute(sql, listingDatabases: false) + } + private func execute(_ statement: String, listingDatabases: Bool) { + guard let profile = selected else { status = "Select a connection"; return } + guard !statement.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + isRunning = true + status = "Connecting…" + let activeDB = listingDatabases ? "" : (selectedDatabase.isEmpty ? profile.database : selectedDatabase) + let password = PasswordStore.read(profile.id) + Task { + do { + let parsed = try await NativeMySQLRunner.run(profile: profile, database: activeDB, password: password, sql: statement) + if listingDatabases { + databases = parsed.rows.compactMap { $0.first } + status = "Connected to \(profile.name)" + } else { + result = parsed + status = "Query completed (\(parsed.rows.count) rows)" + } + } catch { + status = "Error" + result = QueryResult(message: error.localizedDescription) + } + isRunning = false + } + } +} + + +// MARK: - SQL Keyword Formatter + +enum SQLFormatter { + + private static let keywords: Set = [ + "SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", + "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TABLE", + "DATABASE", "SCHEMA", "USE", "SHOW", "DESCRIBE", "EXPLAIN", + "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", + "ON", "AS", "AND", "OR", "NOT", "NULL", "IS", "IN", + "BETWEEN", "LIKE", "ORDER", "BY", "GROUP", "HAVING", + "LIMIT", "OFFSET", "ASC", "DESC", "DISTINCT", "ALL", + "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "INDEX", + "UNIQUE", "DEFAULT", "AUTO_INCREMENT", "IF", "EXISTS", + "CASCADE", "RESTRICT", "SET", "BEGIN", "COMMIT", + "ROLLBACK", "TRANSACTION", "UNION", "CASE", "WHEN", + "THEN", "ELSE", "END", "TRUE", "FALSE", "COUNT", + "SUM", "AVG", "MIN", "MAX", "HAVING", "WITH", + "RECURSIVE", "TRUNCATE", "REPLACE", "VIEW", + "PROCEDURE", "FUNCTION", "TRIGGER", "GRANT", + "REVOKE", "DISTINCT", "CURRENT_TIMESTAMP" + ] + + static func uppercaseKeywords(_ sql: String) -> String { + let chars = Array(sql) + var output = "" + var index = 0 + + enum State { + case normal + case singleQuote + case doubleQuote + case backtick + case lineComment + case blockComment + } + + var state = State.normal + + while index < chars.count { + let ch = chars[index] + let next: Character? = index + 1 < chars.count + ? chars[index + 1] : nil + + switch state { + case .normal: + if ch == "'" { + state = .singleQuote + output.append(ch) + index += 1 + } else if ch == "\"" { + state = .doubleQuote + output.append(ch) + index += 1 + } else if ch == "`" { + state = .backtick + output.append(ch) + index += 1 + } else if ch == "-" && next == "-" && + (index + 2 == chars.count || + chars[index + 2].isWhitespace) { + state = .lineComment + output += "--" + index += 2 + } else if ch == "#" { + state = .lineComment + output.append(ch) + index += 1 + } else if ch == "/" && next == "*" { + state = .blockComment + output += "/*" + index += 2 + } else if ch.isLetter || ch == "_" { + let start = index + while index < chars.count && + (chars[index].isLetter || + chars[index].isNumber || + chars[index] == "_" || + chars[index] == "$") { + index += 1 + } + + let word = String(chars[start.. String { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne] + var value: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &value) == errSecSuccess, + let data = value as? Data else { return "" } + return String(data: data, encoding: .utf8) ?? "" + } + static func save(_ password: String, id: UUID) { + let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: "WorkbenchReplacement.MySQL", + kSecAttrAccount as String: id.uuidString] + SecItemDelete(query as CFDictionary) + guard !password.isEmpty else { return } + var attributes = query + attributes[kSecValueData as String] = Data(password.utf8) + SecItemAdd(attributes as CFDictionary, nil) + } +} + +@MainActor +final class DatabaseModel: ObservableObject { + @Published var profiles: [ConnectionProfile] = [] + @Published var selectedID: UUID? + @Published var sql = "SELECT VERSION() AS server_version;" + @Published var result = QueryResult() + @Published var databases: [String] = [] + @Published var schemaTables: [String: [String]] = [:] + @Published var schemaViews: [String: [String]] = [:] + @Published var selectedDatabase = "" + @Published var isRunning = false + @Published var status = "Not connected" + private let storageKey = "WorkbenchReplacement.connectionProfiles.native.v1" + + init() { + if let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([ConnectionProfile].self, from: data) { profiles = decoded } + if profiles.isEmpty { profiles = [ConnectionProfile()] } + selectedID = profiles.first?.id + } + var selected: ConnectionProfile? { profiles.first { $0.id == selectedID } } + func save(_ profile: ConnectionProfile, password: String) { + if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile } + else { profiles.append(profile) } + PasswordStore.save(password, id: profile.id) + selectedID = profile.id + persist() + } + private func persist() { + if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) } + } + + func formatSQL() { + sql = SQLFormatter.uppercaseKeywords(sql) + } + + + func loadTables(database: String) { + guard let profile = selected else { + status = "Select a MySQL connection" + return + } + + let password = PasswordStore.read(profile.id) + let escaped = database.replacingOccurrences( + of: "`", + with: "``" + ) + + status = "Loading tables from \(database)…" + + Task { + do { + let parsed = try await NativeMySQLRunner.run( + profile: profile, + database: database, + password: password, + sql: "SHOW FULL TABLES FROM `\(escaped)`" + ) + + var tables: [String] = [] + var views: [String] = [] + + for row in parsed.rows { + guard let name = row.first else { + continue + } + + if row.count > 1 && row[1] == "VIEW" { + views.append(name) + } else { + tables.append(name) + } + } + + schemaTables[database] = tables + schemaViews[database] = views + + status = "Loaded \(tables.count) tables and \(views.count) views from \(database)" + } catch { + status = "Unable to load tables: \(error.localizedDescription)" + result = QueryResult(message: error.localizedDescription) + } + } + } + + + + func selectTable(database: String, table: String) { + let db = database.replacingOccurrences( + of: "`", + with: "``" + ) + + let tbl = table.replacingOccurrences( + of: "`", + with: "``" + ) + + selectedDatabase = database + + sql = "SELECT * FROM `\(db)`.`\(tbl)` LIMIT 100;" + + runSQL() + } + + func loadDatabases() { execute("SHOW DATABASES;", listingDatabases: true) } + + func runSQL() { + if UserDefaults.standard.object( + forKey: "preferences.uppercaseKeywords" + ) as? Bool ?? true { + formatSQL() + } + execute(sql, listingDatabases: false) + } + private func execute(_ statement: String, listingDatabases: Bool) { + guard let profile = selected else { status = "Select a connection"; return } + guard !statement.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + isRunning = true + status = "Connecting…" + let activeDB = listingDatabases ? "" : (selectedDatabase.isEmpty ? profile.database : selectedDatabase) + let password = PasswordStore.read(profile.id) + Task { + do { + let parsed = try await NativeMySQLRunner.run(profile: profile, database: activeDB, password: password, sql: statement) + if listingDatabases { + databases = parsed.rows.compactMap { $0.first } + status = "Connected to \(profile.name)" + } else { + result = parsed + status = "Query completed (\(parsed.rows.count) rows)" + } + } catch { + status = "Error" + result = QueryResult(message: error.localizedDescription) + } + isRunning = false + } + } +} + + +// MARK: - SQL Keyword Formatter + +enum SQLFormatter { + + private static let keywords: Set = [ + "SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", + "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "TABLE", + "DATABASE", "SCHEMA", "USE", "SHOW", "DESCRIBE", "EXPLAIN", + "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", + "ON", "AS", "AND", "OR", "NOT", "NULL", "IS", "IN", + "BETWEEN", "LIKE", "ORDER", "BY", "GROUP", "HAVING", + "LIMIT", "OFFSET", "ASC", "DESC", "DISTINCT", "ALL", + "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "INDEX", + "UNIQUE", "DEFAULT", "AUTO_INCREMENT", "IF", "EXISTS", + "CASCADE", "RESTRICT", "SET", "BEGIN", "COMMIT", + "ROLLBACK", "TRANSACTION", "UNION", "CASE", "WHEN", + "THEN", "ELSE", "END", "TRUE", "FALSE", "COUNT", + "SUM", "AVG", "MIN", "MAX", "HAVING", "WITH", + "RECURSIVE", "TRUNCATE", "REPLACE", "VIEW", + "PROCEDURE", "FUNCTION", "TRIGGER", "GRANT", + "REVOKE", "DISTINCT", "CURRENT_TIMESTAMP" + ] + + static func uppercaseKeywords(_ sql: String) -> String { + let chars = Array(sql) + var output = "" + var index = 0 + + enum State { + case normal + case singleQuote + case doubleQuote + case backtick + case lineComment + case blockComment + } + + var state = State.normal + + while index < chars.count { + let ch = chars[index] + let next: Character? = index + 1 < chars.count + ? chars[index + 1] : nil + + switch state { + case .normal: + if ch == "'" { + state = .singleQuote + output.append(ch) + index += 1 + } else if ch == "\"" { + state = .doubleQuote + output.append(ch) + index += 1 + } else if ch == "`" { + state = .backtick + output.append(ch) + index += 1 + } else if ch == "-" && next == "-" && + (index + 2 == chars.count || + chars[index + 2].isWhitespace) { + state = .lineComment + output += "--" + index += 2 + } else if ch == "#" { + state = .lineComment + output.append(ch) + index += 1 + } else if ch == "/" && next == "*" { + state = .blockComment + output += "/*" + index += 2 + } else if ch.isLetter || ch == "_" { + let start = index + while index < chars.count && + (chars[index].isLetter || + chars[index].isNumber || + chars[index] == "_" || + chars[index] == "$") { + index += 1 + } + + let word = String(chars[start.. = [] + @State private var expandedTableFolders: Set = [] + @State private var selectedTableName: String? = nil + @State private var outputExpanded = true + var body: some View { - NavigationSplitView { - navigator - .navigationSplitViewColumnWidth( - min: 220, - ideal: 270, - max: 400 - ) - } detail: { - editorPanel + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar } - .navigationSplitViewStyle(.balanced) - .frame(minWidth: 1000, minHeight: 650) + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme( + UserDefaults.standard.string( + forKey: "preferences.appearance" + ) == "dark" ? .dark : .light + ) + .background(Color(nsColor: .windowBackgroundColor)) .sheet(isPresented: $showingEditor) { ConnectionEditor( profile: $editing, @@ -33,14 +73,101 @@ struct MainView: View { } } + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + // MARK: - Navigator private var navigator: some View { VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + HStack { - Text("NAVIGATOR") + Text("SCHEMAS") .font(.system(size: 11, weight: .bold)) - .foregroundStyle(.secondary) Spacer() @@ -50,21 +177,48 @@ struct MainView: View { Image(systemName: "arrow.clockwise") } .buttonStyle(.borderless) - .help("Refresh schemas") } - .padding(12) + .padding(.horizontal, 12) + .frame(height: 34) Divider() - List(selection: $model.selectedID) { + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } - Section("MYSQL CONNECTIONS") { + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { ForEach(model.profiles) { profile in - Label( - profile.name, - systemImage: "server.rack" - ) - .tag(profile.id) + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) .contextMenu { Button("Edit Connection") { edit(profile) @@ -72,324 +226,458 @@ struct MainView: View { } } } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } - Section("SCHEMAS") { - ForEach(model.databases, id: \.self) { db in - DisclosureGroup { - schemaContents(db) - } label: { - Label( - db, - systemImage: "cylinder.split.1x2" - ) - .fontWeight( - model.selectedDatabase == db - ? .semibold : .regular - ) - .contextMenu { - Button("Set as Default Schema") { - model.selectedDatabase = db - } - Button("Refresh Tables") { - model.loadTables(database: db) - } - } - .onTapGesture { - model.selectedDatabase = db - if model.schemaTables[db] == nil { - model.loadTables(database: db) - } - } - } + // MARK: - Compact Schema Tree + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + HStack(spacing: 5) { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + .frame(width: 17) + + Text(db) + .font(.system(size: 12, weight: + model.selectedDatabase == db + ? .semibold : .regular)) + .lineLimit(1) + + Spacer(minLength: 0) + } + .frame(height: 25) + .padding(.leading, 10) + .contentShape(Rectangle()) + .onTapGesture { + toggleSchema(db) + } + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + // Tables folder + HStack(spacing: 5) { + Image(systemName: + expandedTableFolders.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text("Tables") + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, 28) + .contentShape(Rectangle()) + .onTapGesture { + if expandedTableFolders.contains(db) { + expandedTableFolders.remove(db) + } else { + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) } } } - .listStyle(.sidebar) + + // Tables + if expandedTableFolders.contains(db) { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + tableNode(database: db, table: table) + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .font(.system(size: 11)) + .buttonStyle(.borderless) + .padding(.leading, 66) + .frame(height: 24) + } + } + + folderNode("Views", indent: 28) + folderNode("Stored Procedures", indent: 28) + folderNode("Functions", indent: 28) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func tableNode(database: String, table: String) -> some View { + let identifier = database + "." + table + let isSelected = selectedTableName == identifier + + return HStack(spacing: 5) { + Image(systemName: "tablecells") + .font(.system(size: 11)) + .foregroundStyle( + isSelected ? Color.blue : Color.gray + ) + .frame(width: 17) + + Text(table) + .font(.system(size: 12)) + .lineLimit(1) + .truncationMode(.middle) + + Spacer(minLength: 0) + } + .frame(height: 23) + .padding(.leading, 49) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + isSelected + ? Color.blue.opacity(0.14) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture { + selectedTableName = identifier + } + .onTapGesture(count: 2) { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + } + } + + private func folderNode( + _ title: String, + indent: CGFloat + ) -> some View { + HStack(spacing: 5) { + Image(systemName: "chevron.right") + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text(title) + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, indent) + .frame(maxWidth: .infinity, alignment: .leading) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar Divider() - HStack { - Button { - editing = ConnectionProfile( - name: "New Connection" - ) - editingPassword = "" - showingEditor = true - } label: { - Label( - "New Connection", - systemImage: "plus" - ) - } - .buttonStyle(.borderless) - - Spacer() - } - .padding(10) - } - } - - @ViewBuilder - private func schemaContents(_ database: String) -> some View { - if let tables = model.schemaTables[database] { - if tables.isEmpty { - Text("No tables") - .foregroundStyle(.secondary) - } else { - ForEach(tables, id: \.self) { table in - Label(table, systemImage: "tablecells") - .font(.system(size: 12)) - .onTapGesture(count: 2) { - model.selectTable( - database: database, - table: table - ) - } - .contextMenu { - Button("Select First 100 Rows") { - model.selectTable( - database: database, - table: table - ) - } - } - } - } - } else { - Button("Load Tables") { - model.loadTables(database: database) - } - .buttonStyle(.borderless) - } - } - - // MARK: - SQL Editor - - private var editorPanel: some View { - VStack(spacing: 0) { - editorToolbar + queryToolbar Divider() VSplitView { sqlEditor - .frame(minHeight: 180) + .frame(minHeight: 230) - resultsPanel - .frame(minHeight: 180) + bottomWorkspace + .frame(minHeight: 230) } - - Divider() - - statusBar } - .navigationTitle("WorkbenchReplacement") } - private var editorToolbar: some View { + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { HStack(spacing: 14) { - - Label( - "SQL Editor", - systemImage: - "chevron.left.forwardslash.chevron.right" - ) - .font(.headline) - - Divider() - .frame(height: 20) - Button { model.runSQL() } label: { - Label( - "Execute", - systemImage: "bolt.fill" - ) + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) } - .keyboardShortcut( - .return, - modifiers: [.command] - ) - .disabled(model.isRunning) + .help("Execute SQL") Button { model.formatSQL() } label: { - Label( - "Format SQL", - systemImage: "text.alignleft" - ) + Image(systemName: "text.alignleft") } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) Spacer() - if !model.selectedDatabase.isEmpty { - Label( - model.selectedDatabase, - systemImage: "cylinder" - ) + Text("SQL Editor") + .font(.system(size: 11)) .foregroundStyle(.secondary) - } - - Button { - model.loadDatabases() - } label: { - Image(systemName: "arrow.clockwise") - } - .help("Refresh schemas") } .buttonStyle(.borderless) - .padding(12) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) } private var sqlEditor: some View { - VStack(alignment: .leading, spacing: 0) { - HStack { - Image(systemName: "doc.text") - Text("Query 1") - .fontWeight(.medium) + HStack(spacing: 0) { + if UserDefaults.standard.object( + forKey: "preferences.showLineNumbers" + ) as? Bool ?? true { + lineNumbers - Spacer() - - Text("MySQL") - .foregroundStyle(.secondary) + Rectangle() + .fill(WB.border) + .frame(width: 1) } - .font(.system(size: 12)) - .padding(.horizontal, 12) - .padding(.vertical, 8) - Divider() + Rectangle() + .fill(WB.border) + .frame(width: 1) - TextEditor(text: $model.sql) - .font( - .system( - size: 14, - design: .monospaced - ) - ) - .scrollContentBackground(.hidden) - .padding(12) - .background( - Color(nsColor: .textBackgroundColor) - ) + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } } } - // MARK: - Results - private var resultsPanel: some View { VStack(spacing: 0) { - HStack { - Label( - "Result Grid", - systemImage: "tablecells" - ) - .font(.headline) + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) Spacer() Text(model.result.message) - .font(.caption) .foregroundStyle(.secondary) } - .padding(12) + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) Divider() if model.result.columns.isEmpty { - ContentUnavailableView( - "No Results", - systemImage: "tablecells", - description: Text( - "Execute a SQL query to display results." - ) - ) + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } } else { - resultsGrid + resultGrid } } } - private var resultsGrid: some View { - ScrollView([.horizontal, .vertical]) { - Grid( - alignment: .leading, - horizontalSpacing: 0, - verticalSpacing: 0 - ) { - GridRow { - ForEach( - model.result.columns.indices, - id: \.self - ) { index in - Text(model.result.columns[index]) - .fontWeight(.semibold) - .frame( - minWidth: 150, - alignment: .leading - ) - .padding(8) - .background( - Color(nsColor: - .controlBackgroundColor) - ) - } + + private var resultGrid: some View { + NativeResultGrid( + columns: model.result.columns, + rows: model.result.rows + ) + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) } - ForEach( - model.result.rows.indices, - id: \.self - ) { rowIndex in - resultRow( - model.result.rows[rowIndex], - index: rowIndex - ) - } + Spacer() } + .font(.system(size: 12)) + .padding(12) + + Spacer() } } - private func resultRow( - _ row: [String], - index: Int - ) -> some View { - GridRow { - ForEach( - model.result.columns.indices, - id: \.self - ) { columnIndex in - Text( - columnIndex < row.count - ? row[columnIndex] : "" - ) - .font( - .system( - size: 12, - design: .monospaced - ) - ) - .frame( - minWidth: 150, - alignment: .leading - ) - .padding(8) - .background( - index.isMultiple(of: 2) - ? Color.clear - : Color(nsColor: - .alternatingContentBackgroundColors[0]) - ) - } - } - } - - // MARK: - Status + // MARK: - Status Bar private var statusBar: some View { - HStack { + HStack(spacing: 10) { Circle() .fill( model.status == "Error" @@ -402,10 +690,37 @@ struct MainView: View { Spacer() - Text(model.selected?.name ?? "No connection") + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") } - .font(.caption) - .padding(9) + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) } private func edit(_ profile: ConnectionProfile) { @@ -415,10 +730,144 @@ struct MainView: View { } } +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: CGFloat( + UserDefaults.standard.object( + forKey: "preferences.editorFontSize" + ) as? Double ?? 13 + ), + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: CGFloat( + UserDefaults.standard.object( + forKey: "preferences.editorFontSize" + ) as? Double ?? 13 + ), + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + // MARK: - Connection Editor struct ConnectionEditor: View { - @Binding var profile: ConnectionProfile @Binding var password: String @@ -454,7 +903,7 @@ struct ConnectionEditor: View { ) SecureField( - "Password (stored in macOS Keychain)", + "Password (macOS Keychain)", text: $password ) @@ -464,12 +913,6 @@ struct ConnectionEditor: View { ) } - Text( - "Native MySQL connection. Local TCP connections and SSH tunnels are supported." - ) - .font(.caption) - .foregroundStyle(.secondary) - HStack { Spacer() @@ -487,3 +930,184 @@ struct ConnectionEditor: View { .frame(width: 520) } } + + + +// MARK: - High Performance Native Result Grid + +struct NativeResultGrid: NSViewRepresentable { + + let columns: [String] + let rows: [[String]] + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSScrollView() + scroll.hasVerticalScroller = true + scroll.hasHorizontalScroller = true + scroll.autohidesScrollers = true + scroll.drawsBackground = true + scroll.backgroundColor = .white + + let table = NSTableView() + table.headerView = NSTableHeaderView() + table.usesAlternatingRowBackgroundColors = + UserDefaults.standard.object( + forKey: "preferences.alternatingRows" + ) as? Bool ?? true + table.rowHeight = CGFloat( + UserDefaults.standard.object( + forKey: "preferences.resultRowHeight" + ) as? Double ?? 24 + ) + table.intercellSpacing = NSSize(width: 1, height: 1) + table.allowsMultipleSelection = true + table.allowsColumnResizing = true + table.allowsColumnReordering = true + table.columnAutoresizingStyle = .noColumnAutoresizing + table.backgroundColor = .white + + context.coordinator.columns = columns + context.coordinator.rows = rows + + table.delegate = context.coordinator + table.dataSource = context.coordinator + + configureColumns(table) + + scroll.documentView = table + table.reloadData() + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let table = scroll.documentView as? NSTableView else { + return + } + + let oldColumns = context.coordinator.columns + + context.coordinator.columns = columns + context.coordinator.rows = rows + + if oldColumns != columns { + configureColumns(table) + } + + table.reloadData() + } + + private func configureColumns(_ table: NSTableView) { + for column in Array(table.tableColumns) { + table.removeTableColumn(column) + } + + for (index, name) in columns.enumerated() { + let identifier = NSUserInterfaceItemIdentifier( + "column_\(index)" + ) + + let column = NSTableColumn(identifier: identifier) + column.title = name + column.width = CGFloat( + UserDefaults.standard.object( + forKey: "preferences.resultColumnWidth" + ) as? Double ?? 170 + ) + column.minWidth = 70 + column.maxWidth = 700 + column.resizingMask = .userResizingMask + + table.addTableColumn(column) + } + } + + final class Coordinator: NSObject, + NSTableViewDataSource, + NSTableViewDelegate { + + var columns: [String] = [] + var rows: [[String]] = [] + + func numberOfRows(in tableView: NSTableView) -> Int { + rows.count + } + + func tableView( + _ tableView: NSTableView, + viewFor tableColumn: NSTableColumn?, + row: Int + ) -> NSView? { + + guard let tableColumn, + row >= 0, + row < rows.count else { + return nil + } + + let identifier = tableColumn.identifier.rawValue + + guard identifier.hasPrefix("column_"), + let columnIndex = Int(identifier.dropFirst(7)), + columnIndex < columns.count else { + return nil + } + + let cellIdentifier = + NSUserInterfaceItemIdentifier("ResultCell") + + let cell: NSTableCellView + + if let reused = tableView.makeView( + withIdentifier: cellIdentifier, + owner: nil + ) as? NSTableCellView { + cell = reused + } else { + cell = NSTableCellView() + cell.identifier = cellIdentifier + + let field = NSTextField(labelWithString: "") + field.font = NSFont.monospacedSystemFont( + ofSize: 12, + weight: .regular + ) + field.lineBreakMode = .byTruncatingTail + field.translatesAutoresizingMaskIntoConstraints = false + + cell.addSubview(field) + cell.textField = field + + NSLayoutConstraint.activate([ + field.leadingAnchor.constraint( + equalTo: cell.leadingAnchor, + constant: 7 + ), + field.trailingAnchor.constraint( + equalTo: cell.trailingAnchor, + constant: -7 + ), + field.centerYAnchor.constraint( + equalTo: cell.centerYAnchor + ) + ]) + } + + let values = rows[row] + + cell.textField?.stringValue = + columnIndex < values.count + ? values[columnIndex] + : "" + + return cell + } + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-170516 b/WorkbenchReplacement/MainView.swift.backup-20261016-170516 new file mode 100644 index 0000000..55e9d80 --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-170516 @@ -0,0 +1,489 @@ + +import SwiftUI + +struct MainView: View { + + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + var body: some View { + NavigationSplitView { + navigator + .navigationSplitViewColumnWidth( + min: 220, + ideal: 270, + max: 400 + ) + } detail: { + editorPanel + } + .navigationSplitViewStyle(.balanced) + .frame(minWidth: 1000, minHeight: 650) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + HStack { + Text("NAVIGATOR") + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + .help("Refresh schemas") + } + .padding(12) + + Divider() + + List(selection: $model.selectedID) { + + Section("MYSQL CONNECTIONS") { + ForEach(model.profiles) { profile in + Label( + profile.name, + systemImage: "server.rack" + ) + .tag(profile.id) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + + Section("SCHEMAS") { + ForEach(model.databases, id: \.self) { db in + DisclosureGroup { + schemaContents(db) + } label: { + Label( + db, + systemImage: "cylinder.split.1x2" + ) + .fontWeight( + model.selectedDatabase == db + ? .semibold : .regular + ) + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + .onTapGesture { + model.selectedDatabase = db + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + } + } + } + .listStyle(.sidebar) + + Divider() + + HStack { + Button { + editing = ConnectionProfile( + name: "New Connection" + ) + editingPassword = "" + showingEditor = true + } label: { + Label( + "New Connection", + systemImage: "plus" + ) + } + .buttonStyle(.borderless) + + Spacer() + } + .padding(10) + } + } + + @ViewBuilder + private func schemaContents(_ database: String) -> some View { + if let tables = model.schemaTables[database] { + if tables.isEmpty { + Text("No tables") + .foregroundStyle(.secondary) + } else { + ForEach(tables, id: \.self) { table in + Label(table, systemImage: "tablecells") + .font(.system(size: 12)) + .onTapGesture(count: 2) { + model.selectTable( + database: database, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: database, + table: table + ) + } + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: database) + } + .buttonStyle(.borderless) + } + } + + // MARK: - SQL Editor + + private var editorPanel: some View { + VStack(spacing: 0) { + editorToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 180) + + resultsPanel + .frame(minHeight: 180) + } + + Divider() + + statusBar + } + .navigationTitle("WorkbenchReplacement") + } + + private var editorToolbar: some View { + HStack(spacing: 14) { + + Label( + "SQL Editor", + systemImage: + "chevron.left.forwardslash.chevron.right" + ) + .font(.headline) + + Divider() + .frame(height: 20) + + Button { + model.runSQL() + } label: { + Label( + "Execute", + systemImage: "bolt.fill" + ) + } + .keyboardShortcut( + .return, + modifiers: [.command] + ) + .disabled(model.isRunning) + + Button { + model.formatSQL() + } label: { + Label( + "Format SQL", + systemImage: "text.alignleft" + ) + } + + Spacer() + + if !model.selectedDatabase.isEmpty { + Label( + model.selectedDatabase, + systemImage: "cylinder" + ) + .foregroundStyle(.secondary) + } + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .help("Refresh schemas") + } + .buttonStyle(.borderless) + .padding(12) + } + + private var sqlEditor: some View { + VStack(alignment: .leading, spacing: 0) { + HStack { + Image(systemName: "doc.text") + Text("Query 1") + .fontWeight(.medium) + + Spacer() + + Text("MySQL") + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .padding(.vertical, 8) + + Divider() + + TextEditor(text: $model.sql) + .font( + .system( + size: 14, + design: .monospaced + ) + ) + .scrollContentBackground(.hidden) + .padding(12) + .background( + Color(nsColor: .textBackgroundColor) + ) + } + } + + // MARK: - Results + + private var resultsPanel: some View { + VStack(spacing: 0) { + + HStack { + Label( + "Result Grid", + systemImage: "tablecells" + ) + .font(.headline) + + Spacer() + + Text(model.result.message) + .font(.caption) + .foregroundStyle(.secondary) + } + .padding(12) + + Divider() + + if model.result.columns.isEmpty { + ContentUnavailableView( + "No Results", + systemImage: "tablecells", + description: Text( + "Execute a SQL query to display results." + ) + ) + } else { + resultsGrid + } + } + } + + private var resultsGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { index in + Text(model.result.columns[index]) + .fontWeight(.semibold) + .frame( + minWidth: 150, + alignment: .leading + ) + .padding(8) + .background( + Color(nsColor: + .controlBackgroundColor) + ) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { rowIndex in + resultRow( + model.result.rows[rowIndex], + index: rowIndex + ) + } + } + } + } + + private func resultRow( + _ row: [String], + index: Int + ) -> some View { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { columnIndex in + Text( + columnIndex < row.count + ? row[columnIndex] : "" + ) + .font( + .system( + size: 12, + design: .monospaced + ) + ) + .frame( + minWidth: 150, + alignment: .leading + ) + .padding(8) + .background( + index.isMultiple(of: 2) + ? Color.clear + : Color(nsColor: + .alternatingContentBackgroundColors[0]) + ) + } + } + } + + // MARK: - Status + + private var statusBar: some View { + HStack { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "No connection") + } + .font(.caption) + .padding(9) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (stored in macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + Text( + "Native MySQL connection. Local TCP connections and SSH tunnels are supported." + ) + .font(.caption) + .foregroundStyle(.secondary) + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-170655 b/WorkbenchReplacement/MainView.swift.backup-20261016-170655 new file mode 100644 index 0000000..8e8179d --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-170655 @@ -0,0 +1,854 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1050, minHeight: 700) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 14) + .frame(height: 58) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 5) { + Button { + toggleSchema(db) + } label: { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .frame(width: 15) + } + .buttonStyle(.plain) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + + Text(db) + .font(.system(size: 12)) + .fontWeight( + model.selectedDatabase == db + ? .bold : .regular + ) + + Spacer() + } + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background( + model.selectedDatabase == db + ? Color.blue.opacity(0.13) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + model.loadTables(database: db) + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + .padding(.leading, 24) + } + } + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 5) { + DisclosureGroup { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + Label(table, systemImage: "tablecells") + .font(.system(size: 12)) + .padding(.vertical, 3) + .onTapGesture(count: 2) { + model.selectTable( + database: db, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: db, + table: table + ) + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .buttonStyle(.borderless) + } + } label: { + Label("Tables", systemImage: "folder") + } + + Label("Views", systemImage: "folder") + Label("Stored Procedures", systemImage: "folder") + Label("Functions", systemImage: "folder") + } + .font(.system(size: 12)) + .padding(.vertical, 3) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 180) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 15) + .frame(height: 33) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 36) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 150) + + if outputExpanded { + actionOutput + .frame(minHeight: 85) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 32) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 25) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-170825 b/WorkbenchReplacement/MainView.swift.backup-20261016-170825 new file mode 100644 index 0000000..3b64a37 --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-170825 @@ -0,0 +1,861 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1050, minHeight: 700) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 14) + .frame(height: 58) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 5) { + Button { + toggleSchema(db) + } label: { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .frame(width: 15) + } + .buttonStyle(.plain) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + + Text(db) + .font(.system(size: 12)) + .fontWeight( + model.selectedDatabase == db + ? .bold : .regular + ) + + Spacer() + } + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background( + model.selectedDatabase == db + ? Color.blue.opacity(0.13) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + model.loadTables(database: db) + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + .padding(.leading, 24) + } + } + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 5) { + DisclosureGroup { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + Label(table, systemImage: "tablecells") + .font(.system(size: 12)) + .padding(.vertical, 3) + .onTapGesture(count: 2) { + model.selectTable( + database: db, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: db, + table: table + ) + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .buttonStyle(.borderless) + } + } label: { + Label("Tables", systemImage: "folder") + } + + Label("Views", systemImage: "folder") + Label("Stored Procedures", systemImage: "folder") + Label("Functions", systemImage: "folder") + } + .font(.system(size: 12)) + .padding(.vertical, 3) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 180) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 15) + .frame(height: 33) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 36) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 150) + + if outputExpanded { + actionOutput + .frame(minHeight: 85) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 32) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 25) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-170924 b/WorkbenchReplacement/MainView.swift.backup-20261016-170924 new file mode 100644 index 0000000..0f9d3fd --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-170924 @@ -0,0 +1,861 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 5) { + Button { + toggleSchema(db) + } label: { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .frame(width: 15) + } + .buttonStyle(.plain) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + + Text(db) + .font(.system(size: 12)) + .fontWeight( + model.selectedDatabase == db + ? .bold : .regular + ) + + Spacer() + } + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background( + model.selectedDatabase == db + ? Color.blue.opacity(0.13) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + model.loadTables(database: db) + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + .padding(.leading, 24) + } + } + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 5) { + DisclosureGroup { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + Label(table, systemImage: "tablecells") + .font(.system(size: 12)) + .padding(.vertical, 3) + .onTapGesture(count: 2) { + model.selectTable( + database: db, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: db, + table: table + ) + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .buttonStyle(.borderless) + } + } label: { + Label("Tables", systemImage: "folder") + } + + Label("Views", systemImage: "folder") + Label("Stored Procedures", systemImage: "folder") + Label("Functions", systemImage: "folder") + } + .font(.system(size: 12)) + .padding(.vertical, 3) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 180) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-171209 b/WorkbenchReplacement/MainView.swift.backup-20261016-171209 new file mode 100644 index 0000000..0e57561 --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-171209 @@ -0,0 +1,861 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 5) { + Button { + toggleSchema(db) + } label: { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .frame(width: 15) + } + .buttonStyle(.plain) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + + Text(db) + .font(.system(size: 12)) + .fontWeight( + model.selectedDatabase == db + ? .bold : .regular + ) + + Spacer() + } + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background( + model.selectedDatabase == db + ? Color.blue.opacity(0.13) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + model.loadTables(database: db) + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + .padding(.leading, 24) + } + } + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 5) { + DisclosureGroup { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + Label(table, systemImage: "tablecells") + .font(.system(size: 12)) + .padding(.vertical, 3) + .onTapGesture(count: 2) { + model.selectTable( + database: db, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: db, + table: table + ) + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .buttonStyle(.borderless) + } + } label: { + Label("Tables", systemImage: "folder") + } + + Label("Views", systemImage: "folder") + Label("Stored Procedures", systemImage: "folder") + Label("Functions", systemImage: "folder") + } + .font(.system(size: 12)) + .padding(.vertical, 3) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-171257 b/WorkbenchReplacement/MainView.swift.backup-20261016-171257 new file mode 100644 index 0000000..d4eb648 --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-171257 @@ -0,0 +1,883 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 5) { + Button { + toggleSchema(db) + } label: { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .frame(width: 15) + } + .buttonStyle(.plain) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + + Text(db) + .font(.system(size: 12)) + .fontWeight( + model.selectedDatabase == db + ? .bold : .regular + ) + + Spacer() + } + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background( + model.selectedDatabase == db + ? Color.blue.opacity(0.13) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + model.loadTables(database: db) + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + .padding(.leading, 24) + } + } + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + + DisclosureGroup { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \\.self) { table in + HStack(spacing: 6) { + Image(systemName: "tablecells") + .foregroundStyle(.secondary) + .frame(width: 16) + + Text(table) + .lineLimit(1) + .truncationMode(.middle) + + Spacer(minLength: 0) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.leading, 4) + .padding(.vertical, 3) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectTable( + database: db, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: db, + table: table + ) + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .frame(maxWidth: .infinity, alignment: .leading) + .buttonStyle(.borderless) + } + } label: { + Label("Tables", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + } + + Label("Views", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + + Label("Stored Procedures", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + + Label("Functions", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity, alignment: .leading) + .font(.system(size: 12)) + .padding(.vertical, 3) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-171647 b/WorkbenchReplacement/MainView.swift.backup-20261016-171647 new file mode 100644 index 0000000..9246cfc --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-171647 @@ -0,0 +1,883 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 5) { + Button { + toggleSchema(db) + } label: { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .frame(width: 15) + } + .buttonStyle(.plain) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + + Text(db) + .font(.system(size: 12)) + .fontWeight( + model.selectedDatabase == db + ? .bold : .regular + ) + + Spacer() + } + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background( + model.selectedDatabase == db + ? Color.blue.opacity(0.13) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + model.loadTables(database: db) + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + .padding(.leading, 24) + } + } + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 2) { + + DisclosureGroup { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + HStack(spacing: 6) { + Image(systemName: "tablecells") + .foregroundStyle(.secondary) + .frame(width: 16) + + Text(table) + .lineLimit(1) + .truncationMode(.middle) + + Spacer(minLength: 0) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.leading, 4) + .padding(.vertical, 3) + .contentShape(Rectangle()) + .onTapGesture(count: 2) { + model.selectTable( + database: db, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + model.selectTable( + database: db, + table: table + ) + } + } + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .frame(maxWidth: .infinity, alignment: .leading) + .buttonStyle(.borderless) + } + } label: { + Label("Tables", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + } + + Label("Views", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + + Label("Stored Procedures", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + + Label("Functions", systemImage: "folder") + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity, alignment: .leading) + .font(.system(size: 12)) + .padding(.vertical, 3) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-171907 b/WorkbenchReplacement/MainView.swift.backup-20261016-171907 new file mode 100644 index 0000000..73e9e01 --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-171907 @@ -0,0 +1,960 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var expandedTableFolders: Set = [] + @State private var selectedTableName: String? = nil + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + + // MARK: - Compact Schema Tree + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + HStack(spacing: 5) { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + .frame(width: 17) + + Text(db) + .font(.system(size: 12, weight: + model.selectedDatabase == db + ? .semibold : .regular)) + .lineLimit(1) + + Spacer(minLength: 0) + } + .frame(height: 25) + .padding(.leading, 10) + .contentShape(Rectangle()) + .onTapGesture { + toggleSchema(db) + } + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + // Tables folder + HStack(spacing: 5) { + Image(systemName: + expandedTableFolders.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text("Tables") + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, 28) + .contentShape(Rectangle()) + .onTapGesture { + if expandedTableFolders.contains(db) { + expandedTableFolders.remove(db) + } else { + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + // Tables + if expandedTableFolders.contains(db) { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + tableNode(database: db, table: table) + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .font(.system(size: 11)) + .buttonStyle(.borderless) + .padding(.leading, 66) + .frame(height: 24) + } + } + + folderNode("Views", indent: 28) + folderNode("Stored Procedures", indent: 28) + folderNode("Functions", indent: 28) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func tableNode(database: String, table: String) -> some View { + let identifier = database + "." + table + let isSelected = selectedTableName == identifier + + return HStack(spacing: 5) { + Image(systemName: "tablecells") + .font(.system(size: 11)) + .foregroundStyle( + isSelected ? Color.blue : Color.gray + ) + .frame(width: 17) + + Text(table) + .font(.system(size: 12)) + .lineLimit(1) + .truncationMode(.middle) + + Spacer(minLength: 0) + } + .frame(height: 23) + .padding(.leading, 49) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + isSelected + ? Color.blue.opacity(0.14) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture { + selectedTableName = identifier + } + .onTapGesture(count: 2) { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + } + } + + private func folderNode( + _ title: String, + indent: CGFloat + ) -> some View { + HStack(spacing: 5) { + Image(systemName: "chevron.right") + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text(title) + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, indent) + .frame(maxWidth: .infinity, alignment: .leading) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + private var resultGrid: some View { + ScrollView([.horizontal, .vertical]) { + Grid( + alignment: .leading, + horizontalSpacing: 0, + verticalSpacing: 0 + ) { + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text(model.result.columns[column]) + .fontWeight(.semibold) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background(WB.header) + } + } + + ForEach( + model.result.rows.indices, + id: \.self + ) { row in + GridRow { + ForEach( + model.result.columns.indices, + id: \.self + ) { column in + Text( + column < model.result.rows[row].count + ? model.result.rows[row][column] + : "" + ) + .lineLimit(1) + .frame( + width: 170, + alignment: .leading + ) + .padding(7) + .background( + row.isMultiple(of: 2) + ? Color(nsColor: .textBackgroundColor) + : WB.sidebar + ) + } + } + } + } + .font(.system(size: 12, design: .monospaced)) + } + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-172024 b/WorkbenchReplacement/MainView.swift.backup-20261016-172024 new file mode 100644 index 0000000..0515f28 --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-172024 @@ -0,0 +1,1083 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var expandedTableFolders: Set = [] + @State private var selectedTableName: String? = nil + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + + // MARK: - Compact Schema Tree + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + HStack(spacing: 5) { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + .frame(width: 17) + + Text(db) + .font(.system(size: 12, weight: + model.selectedDatabase == db + ? .semibold : .regular)) + .lineLimit(1) + + Spacer(minLength: 0) + } + .frame(height: 25) + .padding(.leading, 10) + .contentShape(Rectangle()) + .onTapGesture { + toggleSchema(db) + } + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + // Tables folder + HStack(spacing: 5) { + Image(systemName: + expandedTableFolders.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text("Tables") + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, 28) + .contentShape(Rectangle()) + .onTapGesture { + if expandedTableFolders.contains(db) { + expandedTableFolders.remove(db) + } else { + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + // Tables + if expandedTableFolders.contains(db) { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + tableNode(database: db, table: table) + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .font(.system(size: 11)) + .buttonStyle(.borderless) + .padding(.leading, 66) + .frame(height: 24) + } + } + + folderNode("Views", indent: 28) + folderNode("Stored Procedures", indent: 28) + folderNode("Functions", indent: 28) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func tableNode(database: String, table: String) -> some View { + let identifier = database + "." + table + let isSelected = selectedTableName == identifier + + return HStack(spacing: 5) { + Image(systemName: "tablecells") + .font(.system(size: 11)) + .foregroundStyle( + isSelected ? Color.blue : Color.gray + ) + .frame(width: 17) + + Text(table) + .font(.system(size: 12)) + .lineLimit(1) + .truncationMode(.middle) + + Spacer(minLength: 0) + } + .frame(height: 23) + .padding(.leading, 49) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + isSelected + ? Color.blue.opacity(0.14) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture { + selectedTableName = identifier + } + .onTapGesture(count: 2) { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + } + } + + private func folderNode( + _ title: String, + indent: CGFloat + ) -> some View { + HStack(spacing: 5) { + Image(systemName: "chevron.right") + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text(title) + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, indent) + .frame(maxWidth: .infinity, alignment: .leading) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + + private var resultGrid: some View { + NativeResultGrid( + columns: model.result.columns, + rows: model.result.rows + ) + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} + + +// MARK: - High Performance Native Result Grid + +struct NativeResultGrid: NSViewRepresentable { + + let columns: [String] + let rows: [[String]] + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSScrollView() + + scroll.hasVerticalScroller = true + scroll.hasHorizontalScroller = true + scroll.autohidesScrollers = true + scroll.drawsBackground = true + + let table = NSTableView() + + table.usesAlternatingRowBackgroundColors = true + table.rowHeight = 24 + table.intercellSpacing = NSSize(width: 1, height: 1) + table.allowsMultipleSelection = true + table.allowsColumnReordering = true + table.allowsColumnResizing = true + table.columnAutoresizingStyle = .noColumnAutoresizing + + table.delegate = context.coordinator + table.dataSource = context.coordinator + + scroll.documentView = table + + context.coordinator.rows = rows + context.coordinator.columns = columns + + configureColumns(table) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let table = scroll.documentView as? NSTableView else { + return + } + + let oldColumns = context.coordinator.columns + + context.coordinator.rows = rows + context.coordinator.columns = columns + + if oldColumns != columns { + configureColumns(table) + } + + table.reloadData() + } + + private func configureColumns(_ table: NSTableView) { + for column in table.tableColumns { + table.removeTableColumn(column) + } + + for (index, name) in columns.enumerated() { + let column = NSTableColumn( + identifier: NSUserInterfaceItemIdentifier( + "column_\\(index)" + ) + ) + + column.title = name + column.width = 170 + column.minWidth = 70 + column.maxWidth = 600 + + table.addTableColumn(column) + } + } + + final class Coordinator: NSObject, + NSTableViewDataSource, + NSTableViewDelegate { + + var columns: [String] = [] + var rows: [[String]] = [] + + func numberOfRows(in tableView: NSTableView) -> Int { + rows.count + } + + func tableView( + _ tableView: NSTableView, + viewFor tableColumn: NSTableColumn?, + row: Int + ) -> NSView? { + + guard let tableColumn, + row >= 0, + row < rows.count else { + return nil + } + + let identifier = tableColumn.identifier.rawValue + + guard let columnIndex = Int( + identifier.replacingOccurrences( + of: "column_", + with: "" + ) + ) else { + return nil + } + + let cellIdentifier = + NSUserInterfaceItemIdentifier("ResultCell") + + let cell: NSTableCellView + + if let reused = tableView.makeView( + withIdentifier: cellIdentifier, + owner: nil + ) as? NSTableCellView { + cell = reused + } else { + cell = NSTableCellView() + cell.identifier = cellIdentifier + + let textField = NSTextField(labelWithString: "") + textField.font = NSFont.monospacedSystemFont( + ofSize: 12, + weight: .regular + ) + + textField.lineBreakMode = .byTruncatingTail + textField.translatesAutoresizingMaskIntoConstraints = false + + cell.addSubview(textField) + cell.textField = textField + + NSLayoutConstraint.activate([ + textField.leadingAnchor.constraint( + equalTo: cell.leadingAnchor, + constant: 7 + ), + textField.trailingAnchor.constraint( + equalTo: cell.trailingAnchor, + constant: -7 + ), + textField.centerYAnchor.constraint( + equalTo: cell.centerYAnchor + ) + ]) + } + + let values = rows[row] + + cell.textField?.stringValue = + columnIndex < values.count + ? values[columnIndex] + : "" + + return cell + } + } +} diff --git a/WorkbenchReplacement/MainView.swift.backup-20261016-172158 b/WorkbenchReplacement/MainView.swift.backup-20261016-172158 new file mode 100644 index 0000000..f8d56ef --- /dev/null +++ b/WorkbenchReplacement/MainView.swift.backup-20261016-172158 @@ -0,0 +1,1082 @@ + +import SwiftUI +import AppKit + +// MARK: - Classic Workbench Colours + +private enum WB { + static let toolbar = Color(nsColor: NSColor( + calibratedWhite: 0.88, alpha: 1 + )) + static let sidebar = Color(nsColor: NSColor( + calibratedWhite: 0.94, alpha: 1 + )) + static let border = Color(nsColor: NSColor( + calibratedWhite: 0.76, alpha: 1 + )) + static let header = Color(nsColor: NSColor( + calibratedWhite: 0.91, alpha: 1 + )) +} + +// MARK: - Main Window + +struct MainView: View { + @EnvironmentObject private var model: DatabaseModel + + @State private var showingEditor = false + @State private var editing = ConnectionProfile() + @State private var editingPassword = "" + + @State private var expandedSchemas: Set = [] + @State private var expandedTableFolders: Set = [] + @State private var selectedTableName: String? = nil + @State private var outputExpanded = true + + var body: some View { + VStack(spacing: 0) { + mainToolbar + + Rectangle() + .fill(WB.border) + .frame(height: 1) + + HSplitView { + navigator + .frame( + minWidth: 210, + idealWidth: 265, + maxWidth: 420 + ) + + workspace + .frame(minWidth: 600) + } + + statusBar + } + .frame(minWidth: 1100, minHeight: 720) + .preferredColorScheme(.light) + .background(Color(nsColor: .windowBackgroundColor)) + .sheet(isPresented: $showingEditor) { + ConnectionEditor( + profile: $editing, + password: $editingPassword + ) { + model.save(editing, password: editingPassword) + showingEditor = false + } + } + } + + // MARK: - Main Toolbar + + private var mainToolbar: some View { + HStack(spacing: 16) { + Image(systemName: "externaldrive.connected.to.line.below") + .font(.system(size: 23)) + .foregroundStyle(.blue) + + Text("MySQL Workbench") + .font(.system(size: 15, weight: .semibold)) + .foregroundStyle(.black) + + Rectangle() + .fill(WB.border) + .frame(width: 1, height: 30) + + toolbarButton( + "New Connection", + icon: "plus.rectangle.on.rectangle" + ) { + editing = ConnectionProfile(name: "New Connection") + editingPassword = "" + showingEditor = true + } + + toolbarButton( + "Refresh", + icon: "arrow.clockwise" + ) { + model.loadDatabases() + } + + toolbarButton( + "Execute", + icon: "bolt.fill" + ) { + model.runSQL() + } + .keyboardShortcut(.return, modifiers: [.command]) + + toolbarButton( + "Format SQL", + icon: "text.alignleft" + ) { + model.formatSQL() + } + + Spacer() + + VStack(alignment: .trailing, spacing: 2) { + Text(model.selected?.name ?? "No Connection") + .font(.system(size: 12, weight: .semibold)) + + Text(model.selectedDatabase.isEmpty + ? "No default schema" + : model.selectedDatabase) + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + } + .padding(.horizontal, 10) + .frame(height: 46) + .background(WB.toolbar) + } + + private func toolbarButton( + _ title: String, + icon: String, + action: @escaping () -> Void + ) -> some View { + Button(action: action) { + VStack(spacing: 3) { + Image(systemName: icon) + .font(.system(size: 19)) + .frame(height: 23) + + Text(title) + .font(.system(size: 10)) + } + .foregroundStyle(.black) + .frame(minWidth: 65) + } + .buttonStyle(.plain) + .help(title) + } + + // MARK: - Navigator + + private var navigator: some View { + VStack(spacing: 0) { + sectionHeader("NAVIGATOR") + + HStack { + Text("SCHEMAS") + .font(.system(size: 11, weight: .bold)) + + Spacer() + + Button { + model.loadDatabases() + } label: { + Image(systemName: "arrow.clockwise") + } + .buttonStyle(.borderless) + } + .padding(.horizontal, 12) + .frame(height: 34) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 2) { + ForEach(model.databases, id: \.self) { db in + schemaNode(db) + } + } + .padding(.vertical, 8) + } + + Divider() + + sectionHeader("MYSQL CONNECTIONS") + + ScrollView { + VStack(alignment: .leading, spacing: 4) { + ForEach(model.profiles) { profile in + Button { + model.selectedID = profile.id + model.loadDatabases() + } label: { + Label( + profile.name, + systemImage: "server.rack" + ) + .frame( + maxWidth: .infinity, + alignment: .leading + ) + .padding(6) + .background( + model.selectedID == profile.id + ? Color.blue.opacity(0.14) + : Color.clear + ) + } + .buttonStyle(.plain) + .contextMenu { + Button("Edit Connection") { + edit(profile) + } + } + } + } + .padding(8) + } + .frame(height: 125) + } + .background(WB.sidebar) + } + + + // MARK: - Compact Schema Tree + + private func schemaNode(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + HStack(spacing: 5) { + Image(systemName: + expandedSchemas.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "cylinder.split.1x2") + .foregroundStyle(.blue) + .frame(width: 17) + + Text(db) + .font(.system(size: 12, weight: + model.selectedDatabase == db + ? .semibold : .regular)) + .lineLimit(1) + + Spacer(minLength: 0) + } + .frame(height: 25) + .padding(.leading, 10) + .contentShape(Rectangle()) + .onTapGesture { + toggleSchema(db) + } + .onTapGesture(count: 2) { + model.selectedDatabase = db + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + .contextMenu { + Button("Set as Default Schema") { + model.selectedDatabase = db + } + + Button("Refresh Tables") { + model.loadTables(database: db) + } + } + + if expandedSchemas.contains(db) { + schemaChildren(db) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func toggleSchema(_ db: String) { + if expandedSchemas.contains(db) { + expandedSchemas.remove(db) + } else { + expandedSchemas.insert(db) + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + private func schemaChildren(_ db: String) -> some View { + VStack(alignment: .leading, spacing: 0) { + + // Tables folder + HStack(spacing: 5) { + Image(systemName: + expandedTableFolders.contains(db) + ? "chevron.down" + : "chevron.right" + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text("Tables") + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, 28) + .contentShape(Rectangle()) + .onTapGesture { + if expandedTableFolders.contains(db) { + expandedTableFolders.remove(db) + } else { + expandedTableFolders.insert(db) + + if model.schemaTables[db] == nil { + model.loadTables(database: db) + } + } + } + + // Tables + if expandedTableFolders.contains(db) { + if let tables = model.schemaTables[db] { + ForEach(tables, id: \.self) { table in + tableNode(database: db, table: table) + } + } else { + Button("Load Tables") { + model.loadTables(database: db) + } + .font(.system(size: 11)) + .buttonStyle(.borderless) + .padding(.leading, 66) + .frame(height: 24) + } + } + + folderNode("Views", indent: 28) + folderNode("Stored Procedures", indent: 28) + folderNode("Functions", indent: 28) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func tableNode(database: String, table: String) -> some View { + let identifier = database + "." + table + let isSelected = selectedTableName == identifier + + return HStack(spacing: 5) { + Image(systemName: "tablecells") + .font(.system(size: 11)) + .foregroundStyle( + isSelected ? Color.blue : Color.gray + ) + .frame(width: 17) + + Text(table) + .font(.system(size: 12)) + .lineLimit(1) + .truncationMode(.middle) + + Spacer(minLength: 0) + } + .frame(height: 23) + .padding(.leading, 49) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + isSelected + ? Color.blue.opacity(0.14) + : Color.clear + ) + .contentShape(Rectangle()) + .onTapGesture { + selectedTableName = identifier + } + .onTapGesture(count: 2) { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + .contextMenu { + Button("Select First 100 Rows") { + selectedTableName = identifier + model.selectTable( + database: database, + table: table + ) + } + } + } + + private func folderNode( + _ title: String, + indent: CGFloat + ) -> some View { + HStack(spacing: 5) { + Image(systemName: "chevron.right") + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .frame(width: 13) + + Image(systemName: "folder") + .foregroundStyle(.secondary) + .frame(width: 17) + + Text(title) + .font(.system(size: 12)) + + Spacer(minLength: 0) + } + .frame(height: 24) + .padding(.leading, indent) + .frame(maxWidth: .infinity, alignment: .leading) + } + + // MARK: - Workspace + + private var workspace: some View { + VStack(spacing: 0) { + queryTabBar + + Divider() + + queryToolbar + + Divider() + + VSplitView { + sqlEditor + .frame(minHeight: 230) + + bottomWorkspace + .frame(minHeight: 230) + } + } + } + + private var queryTabBar: some View { + HStack(spacing: 0) { + HStack(spacing: 8) { + Image(systemName: "doc.text") + .foregroundStyle(.blue) + + Text("Query 1") + .font(.system(size: 12, weight: .semibold)) + + Image(systemName: "xmark") + .font(.system(size: 9)) + .foregroundStyle(.secondary) + } + .padding(.horizontal, 10) + .frame(height: 29) + .background(Color(nsColor: .textBackgroundColor)) + + Spacer() + } + .background(WB.header) + } + + private var queryToolbar: some View { + HStack(spacing: 14) { + Button { + model.runSQL() + } label: { + Image(systemName: "bolt.fill") + .foregroundStyle(.orange) + } + .help("Execute SQL") + + Button { + model.formatSQL() + } label: { + Image(systemName: "text.alignleft") + } + .help("Format SQL") + + Divider() + .frame(height: 17) + + Text("Default Schema:") + .font(.system(size: 11)) + + Text(model.selectedDatabase.isEmpty + ? "None" + : model.selectedDatabase) + .font(.system(size: 11, weight: .semibold)) + + Spacer() + + Text("SQL Editor") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .buttonStyle(.borderless) + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private var sqlEditor: some View { + HStack(spacing: 0) { + lineNumbers + + Rectangle() + .fill(WB.border) + .frame(width: 1) + + SQLTextView(text: $model.sql) + } + .background(Color(nsColor: .textBackgroundColor)) + } + + private var lineNumbers: some View { + ScrollView { + VStack(alignment: .trailing, spacing: 0) { + ForEach( + 1...max(1, model.sql.components( + separatedBy: "\n" + ).count), + id: \.self + ) { number in + Text("\(number)") + .frame(height: 19) + } + } + .padding(.horizontal, 9) + .padding(.top, 8) + } + .font(.system(size: 12, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 48) + .background(WB.header) + .allowsHitTesting(false) + } + + // MARK: - Results and Action Output + + private var bottomWorkspace: some View { + VSplitView { + resultsPanel + .frame(minHeight: 230) + + if outputExpanded { + actionOutput + .frame(minHeight: 90) + } + } + } + + private var resultsPanel: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "tablecells") + Text("Result Grid") + .fontWeight(.semibold) + + Spacer() + + Text(model.result.message) + .foregroundStyle(.secondary) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 28) + .background(WB.header) + + Divider() + + if model.result.columns.isEmpty { + VStack { + Spacer() + Text("No query results") + .foregroundStyle(.secondary) + Spacer() + } + } else { + resultGrid + } + } + } + + + private var resultGrid: some View { + NativeResultGrid( + columns: model.result.columns, + rows: model.result.rows + ) + } + + private var actionOutput: some View { + VStack(spacing: 0) { + HStack { + Image(systemName: "list.bullet.rectangle") + Text("Action Output") + .fontWeight(.semibold) + + Spacer() + + Button { + outputExpanded = false + } label: { + Image(systemName: "chevron.down") + } + .buttonStyle(.borderless) + } + .font(.system(size: 12)) + .padding(.horizontal, 12) + .frame(height: 26) + .background(WB.header) + + Divider() + + HStack(alignment: .top, spacing: 12) { + Image(systemName: + model.status == "Error" + ? "xmark.circle.fill" + : "checkmark.circle.fill" + ) + .foregroundStyle( + model.status == "Error" + ? .red : .green + ) + + VStack(alignment: .leading, spacing: 5) { + Text(model.status) + .fontWeight(.semibold) + + Text(model.result.message) + .foregroundStyle(.secondary) + } + + Spacer() + } + .font(.system(size: 12)) + .padding(12) + + Spacer() + } + } + + // MARK: - Status Bar + + private var statusBar: some View { + HStack(spacing: 10) { + Circle() + .fill( + model.status == "Error" + ? Color.red : Color.green + ) + .frame(width: 8, height: 8) + + Text(model.status) + .lineLimit(1) + + Spacer() + + Text(model.selected?.name ?? "Disconnected") + + Divider() + .frame(height: 13) + + Text(model.selectedDatabase.isEmpty + ? "No Schema" + : model.selectedDatabase) + + Divider() + .frame(height: 13) + + Text("UTF-8") + } + .font(.system(size: 11)) + .padding(.horizontal, 12) + .frame(height: 22) + .background(WB.header) + } + + private func sectionHeader(_ title: String) -> some View { + HStack { + Text(title) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(.secondary) + + Spacer() + } + .padding(.horizontal, 12) + .frame(height: 30) + .background(WB.header) + } + + private func edit(_ profile: ConnectionProfile) { + editing = profile + editingPassword = PasswordStore.read(profile.id) + showingEditor = true + } +} + +// MARK: - Native SQL Text Editor + +struct SQLTextView: NSViewRepresentable { + @Binding var text: String + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSTextView.scrollableTextView() + let editor = scroll.documentView as! NSTextView + + scroll.appearance = NSAppearance(named: .aqua) + editor.appearance = NSAppearance(named: .aqua) + editor.backgroundColor = .white + editor.textColor = .black + scroll.backgroundColor = .white + + editor.isEditable = true + editor.isRichText = false + editor.allowsUndo = true + editor.isAutomaticQuoteSubstitutionEnabled = false + editor.isAutomaticDashSubstitutionEnabled = false + editor.font = NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + editor.textContainerInset = NSSize( + width: 10, + height: 8 + ) + editor.delegate = context.coordinator + editor.string = text + + context.coordinator.highlight(editor) + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let editor = scroll.documentView as? NSTextView else { + return + } + + if editor.string != text { + let selection = editor.selectedRange() + editor.string = text + + let safeLocation = min( + selection.location, + (text as NSString).length + ) + + editor.setSelectedRange( + NSRange(location: safeLocation, length: 0) + ) + + context.coordinator.highlight(editor) + } + } + + final class Coordinator: NSObject, NSTextViewDelegate { + var parent: SQLTextView + + init(_ parent: SQLTextView) { + self.parent = parent + } + + func textDidChange(_ notification: Notification) { + guard let editor = notification.object as? NSTextView else { + return + } + + parent.text = editor.string + highlight(editor) + } + + func highlight(_ editor: NSTextView) { + guard let storage = editor.textStorage else { + return + } + + let text = editor.string as NSString + let range = NSRange( + location: 0, + length: text.length + ) + + storage.beginEditing() + + storage.setAttributes([ + .foregroundColor: NSColor.textColor, + .font: NSFont.monospacedSystemFont( + ofSize: 13, + weight: .regular + ) + ], range: range) + + let pattern = """ + \\b(SELECT|FROM|WHERE|INSERT|UPDATE|DELETE|CREATE|TABLE|DATABASE|SHOW|USE|JOIN|LEFT|RIGHT|INNER|OUTER|ON|AS|AND|OR|ORDER|GROUP|BY|LIMIT|VALUES|SET|NULL|NOT|IN|LIKE|DISTINCT|ALTER|DROP|DESCRIBE|EXPLAIN)\\b + """ + + if let regex = try? NSRegularExpression( + pattern: pattern, + options: [.caseInsensitive] + ) { + for match in regex.matches( + in: editor.string, + range: range + ) { + storage.addAttribute( + .foregroundColor, + value: NSColor.systemBlue, + range: match.range + ) + } + } + + storage.endEditing() + } + } +} + +// MARK: - Connection Editor + +struct ConnectionEditor: View { + @Binding var profile: ConnectionProfile + @Binding var password: String + + let save: () -> Void + + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text("Connection Settings") + .font(.title2.bold()) + + Form { + TextField( + "Connection Name", + text: $profile.name + ) + + TextField( + "Hostname", + text: $profile.host + ) + + TextField( + "Port", + value: $profile.port, + format: .number + ) + + TextField( + "Username", + text: $profile.username + ) + + SecureField( + "Password (macOS Keychain)", + text: $password + ) + + TextField( + "Default Schema", + text: $profile.database + ) + } + + HStack { + Spacer() + + Button("Cancel") { + dismiss() + } + + Button("Save") { + save() + } + .buttonStyle(.borderedProminent) + } + } + .padding(24) + .frame(width: 520) + } +} + + + +// MARK: - High Performance Native Result Grid + +struct NativeResultGrid: NSViewRepresentable { + + let columns: [String] + let rows: [[String]] + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + func makeNSView(context: Context) -> NSScrollView { + let scroll = NSScrollView() + scroll.hasVerticalScroller = true + scroll.hasHorizontalScroller = true + scroll.autohidesScrollers = true + scroll.drawsBackground = true + scroll.backgroundColor = .white + + let table = NSTableView() + table.headerView = NSTableHeaderView() + table.usesAlternatingRowBackgroundColors = true + table.rowHeight = 23 + table.intercellSpacing = NSSize(width: 1, height: 1) + table.allowsMultipleSelection = true + table.allowsColumnResizing = true + table.allowsColumnReordering = true + table.columnAutoresizingStyle = .noColumnAutoresizing + table.backgroundColor = .white + + context.coordinator.columns = columns + context.coordinator.rows = rows + + table.delegate = context.coordinator + table.dataSource = context.coordinator + + configureColumns(table) + + scroll.documentView = table + table.reloadData() + + return scroll + } + + func updateNSView( + _ scroll: NSScrollView, + context: Context + ) { + guard let table = scroll.documentView as? NSTableView else { + return + } + + let oldColumns = context.coordinator.columns + + context.coordinator.columns = columns + context.coordinator.rows = rows + + if oldColumns != columns { + configureColumns(table) + } + + table.reloadData() + } + + private func configureColumns(_ table: NSTableView) { + for column in Array(table.tableColumns) { + table.removeTableColumn(column) + } + + for (index, name) in columns.enumerated() { + let identifier = NSUserInterfaceItemIdentifier( + "column_\(index)" + ) + + let column = NSTableColumn(identifier: identifier) + column.title = name + column.width = 170 + column.minWidth = 70 + column.maxWidth = 700 + column.resizingMask = .userResizingMask + + table.addTableColumn(column) + } + } + + final class Coordinator: NSObject, + NSTableViewDataSource, + NSTableViewDelegate { + + var columns: [String] = [] + var rows: [[String]] = [] + + func numberOfRows(in tableView: NSTableView) -> Int { + rows.count + } + + func tableView( + _ tableView: NSTableView, + viewFor tableColumn: NSTableColumn?, + row: Int + ) -> NSView? { + + guard let tableColumn, + row >= 0, + row < rows.count else { + return nil + } + + let identifier = tableColumn.identifier.rawValue + + guard identifier.hasPrefix("column_"), + let columnIndex = Int(identifier.dropFirst(7)), + columnIndex < columns.count else { + return nil + } + + let cellIdentifier = + NSUserInterfaceItemIdentifier("ResultCell") + + let cell: NSTableCellView + + if let reused = tableView.makeView( + withIdentifier: cellIdentifier, + owner: nil + ) as? NSTableCellView { + cell = reused + } else { + cell = NSTableCellView() + cell.identifier = cellIdentifier + + let field = NSTextField(labelWithString: "") + field.font = NSFont.monospacedSystemFont( + ofSize: 12, + weight: .regular + ) + field.lineBreakMode = .byTruncatingTail + field.translatesAutoresizingMaskIntoConstraints = false + + cell.addSubview(field) + cell.textField = field + + NSLayoutConstraint.activate([ + field.leadingAnchor.constraint( + equalTo: cell.leadingAnchor, + constant: 7 + ), + field.trailingAnchor.constraint( + equalTo: cell.trailingAnchor, + constant: -7 + ), + field.centerYAnchor.constraint( + equalTo: cell.centerYAnchor + ) + ]) + } + + let values = rows[row] + + cell.textField?.stringValue = + columnIndex < values.count + ? values[columnIndex] + : "" + + return cell + } + } +} diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o index 965b586..d116e6e 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata index 2e02fcb..0724fec 100644 --- a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata +++ b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata @@ -9,6 +9,158 @@ "startingColumn": 21, "startingLine": 8 } + }, + { + "comment": "", + "key": "SQL Editor", + "location": { + "startingColumn": 25, + "startingLine": 97 + } + }, + { + "comment": "", + "key": "Query Execution", + "location": { + "startingColumn": 25, + "startingLine": 105 + } + }, + { + "comment": "", + "key": "Result Grid", + "location": { + "startingColumn": 25, + "startingLine": 113 + } + }, + { + "comment": "", + "key": "General", + "location": { + "startingColumn": 25, + "startingLine": 121 + } + }, + { + "comment": "", + "key": "%lld pt", + "location": { + "startingColumn": 21, + "startingLine": 135 + } + }, + { + "comment": "", + "key": "", + "location": { + "startingColumn": 24, + "startingLine": 144 + } + }, + { + "comment": "", + "key": "2 spaces", + "location": { + "startingColumn": 26, + "startingLine": 145 + } + }, + { + "comment": "", + "key": "4 spaces", + "location": { + "startingColumn": 26, + "startingLine": 146 + } + }, + { + "comment": "", + "key": "8 spaces", + "location": { + "startingColumn": 26, + "startingLine": 147 + } + }, + { + "comment": "", + "key": "Automatically uppercase SQL keywords", + "location": { + "startingColumn": 21, + "startingLine": 155 + } + }, + { + "comment": "", + "key": "Show line numbers", + "location": { + "startingColumn": 21, + "startingLine": 162 + } + }, + { + "comment": "", + "key": "Controls the number of rows retrieved when opening a table from the schema navigator.", + "location": { + "startingColumn": 17, + "startingLine": 193 + } + }, + { + "comment": "", + "key": "Examples", + "location": { + "startingColumn": 18, + "startingLine": 203 + } + }, + { + "comment": "", + "key": "", + "location": { + "startingColumn": 25, + "startingLine": 175 + } + }, + { + "comment": "", + "key": "", + "location": { + "startingColumn": 25, + "startingLine": 183 + } + }, + { + "comment": "", + "key": "%lld px", + "location": { + "startingColumn": 21, + "startingLine": 222 + } + }, + { + "comment": "", + "key": "%lld px", + "location": { + "startingColumn": 21, + "startingLine": 232 + } + }, + { + "comment": "", + "key": "Alternating row colours", + "location": { + "startingColumn": 21, + "startingLine": 242 + } + }, + { + "comment": "", + "key": "Automatically expand table folders", + "location": { + "startingColumn": 21, + "startingLine": 254 + } } ] }, diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps index 028fb6e..c94be9d 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.dia b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.dia index d338a45..093d351 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.dia and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.dia differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o index e049e9d..aaf4c61 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftdeps b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftdeps index 2c62cd1..4965eb7 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftdeps and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftdeps differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o index de5b814..22df5ce 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata index 983ef73..2d4d09c 100644 --- a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata +++ b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata @@ -4,42 +4,18 @@ "Localizable": [ { "comment": "", - "key": "WorkbenchReplacement", + "key": "MySQL Workbench", "location": { - "startingColumn": 26, - "startingLine": 187 - } - }, - { - "comment": "", - "key": "NAVIGATOR", - "location": { - "startingColumn": 22, - "startingLine": 41 - } - }, - { - "comment": "", - "key": "Refresh schemas", - "location": { - "startingColumn": 23, - "startingLine": 53 - } - }, - { - "comment": "", - "key": "MYSQL CONNECTIONS", - "location": { - "startingColumn": 25, - "startingLine": 61 + "startingColumn": 18, + "startingLine": 84 } }, { "comment": "", "key": "SCHEMAS", "location": { - "startingColumn": 25, - "startingLine": 76 + "startingColumn": 22, + "startingLine": 169 } }, { @@ -47,87 +23,47 @@ "key": "Edit Connection", "location": { "startingColumn": 36, - "startingLine": 69 - } - }, - { - "comment": "", - "key": "No tables", - "location": { - "startingColumn": 22, - "startingLine": 137 - } - }, - { - "comment": "", - "key": "Load Tables", - "location": { - "startingColumn": 20, - "startingLine": 160 + "startingLine": 223 } }, { "comment": "", "key": "Set as Default Schema", "location": { - "startingColumn": 40, - "startingLine": 90 + "startingColumn": 24, + "startingLine": 280 } }, { "comment": "", "key": "Refresh Tables", "location": { - "startingColumn": 40, - "startingLine": 94 + "startingColumn": 24, + "startingLine": 284 } }, { "comment": "", - "key": "New Connection", + "key": "Load Tables", "location": { - "startingColumn": 25, - "startingLine": 121 + "startingColumn": 28, + "startingLine": 354 + } + }, + { + "comment": "", + "key": "Tables", + "location": { + "startingColumn": 22, + "startingLine": 327 } }, { "comment": "", "key": "Select First 100 Rows", "location": { - "startingColumn": 36, - "startingLine": 150 - } - }, - { - "comment": "", - "key": "SQL Editor", - "location": { - "startingColumn": 17, - "startingLine": 194 - } - }, - { - "comment": "", - "key": "Refresh schemas", - "location": { - "startingColumn": 19, - "startingLine": 241 - } - }, - { - "comment": "", - "key": "Execute", - "location": { - "startingColumn": 21, - "startingLine": 207 - } - }, - { - "comment": "", - "key": "Format SQL", - "location": { - "startingColumn": 21, - "startingLine": 221 + "startingColumn": 20, + "startingLine": 410 } }, { @@ -135,39 +71,79 @@ "key": "Query 1", "location": { "startingColumn": 22, - "startingLine": 251 + "startingLine": 472 } }, { "comment": "", - "key": "MySQL", + "key": "Default Schema:", "location": { - "startingColumn": 22, - "startingLine": 256 + "startingColumn": 18, + "startingLine": 508 } }, { "comment": "", - "key": "Execute a SQL query to display results.", + "key": "SQL Editor", "location": { - "startingColumn": 25, - "startingLine": 307 + "startingColumn": 18, + "startingLine": 518 } }, { "comment": "", - "key": "No Results", + "key": "Execute SQL", "location": { - "startingColumn": 21, - "startingLine": 304 + "startingColumn": 19, + "startingLine": 496 + } + }, + { + "comment": "", + "key": "Format SQL", + "location": { + "startingColumn": 19, + "startingLine": 503 + } + }, + { + "comment": "", + "key": "%lld", + "location": { + "startingColumn": 26, + "startingLine": 558 } }, { "comment": "", "key": "Result Grid", "location": { - "startingColumn": 21, - "startingLine": 287 + "startingColumn": 22, + "startingLine": 590 + } + }, + { + "comment": "", + "key": "No query results", + "location": { + "startingColumn": 26, + "startingLine": 608 + } + }, + { + "comment": "", + "key": "Action Output", + "location": { + "startingColumn": 22, + "startingLine": 630 + } + }, + { + "comment": "", + "key": "UTF-8", + "location": { + "startingColumn": 18, + "startingLine": 705 } }, { @@ -175,15 +151,7 @@ "key": "Connection Settings", "location": { "startingColumn": 18, - "startingLine": 431 - } - }, - { - "comment": "", - "key": "Native MySQL connection. Local TCP connections and SSH tunnels are supported.", - "location": { - "startingColumn": 17, - "startingLine": 468 + "startingLine": 880 } }, { @@ -191,7 +159,7 @@ "key": "Connection Name", "location": { "startingColumn": 21, - "startingLine": 436 + "startingLine": 885 } }, { @@ -199,7 +167,7 @@ "key": "Hostname", "location": { "startingColumn": 21, - "startingLine": 441 + "startingLine": 890 } }, { @@ -207,7 +175,7 @@ "key": "Port", "location": { "startingColumn": 21, - "startingLine": 446 + "startingLine": 895 } }, { @@ -215,15 +183,15 @@ "key": "Username", "location": { "startingColumn": 21, - "startingLine": 452 + "startingLine": 901 } }, { "comment": "", - "key": "Password (stored in macOS Keychain)", + "key": "Password (macOS Keychain)", "location": { "startingColumn": 21, - "startingLine": 457 + "startingLine": 906 } }, { @@ -231,7 +199,7 @@ "key": "Default Schema", "location": { "startingColumn": 21, - "startingLine": 462 + "startingLine": 911 } }, { @@ -239,7 +207,7 @@ "key": "Cancel", "location": { "startingColumn": 24, - "startingLine": 476 + "startingLine": 919 } }, { @@ -247,7 +215,7 @@ "key": "Save", "location": { "startingColumn": 24, - "startingLine": 480 + "startingLine": 923 } } ] diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps index 35b3385..be3b94d 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors index 41a45cd..b68590b 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule index 4c75fe1..3718105 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule differ diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo index d840a8f..7dd48c4 100644 Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d670dbc41da7bcccf06990b0bd105269 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/38154eb18ed76721f21d9a4726168a90 similarity index 99% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d670dbc41da7bcccf06990b0bd105269 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/38154eb18ed76721f21d9a4726168a90 index b202b52..1ff3662 100644 Binary files a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d670dbc41da7bcccf06990b0bd105269 and b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/38154eb18ed76721f21d9a4726168a90 differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/build-request.json b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/build-request.json similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/build-request.json rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/build-request.json diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/description.msgpack b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/description.msgpack similarity index 99% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/description.msgpack rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/description.msgpack index cf34665..7f396cd 100644 Binary files a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/description.msgpack and b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/description.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/manifest.json b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/manifest.json similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/manifest.json rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/manifest.json diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/target-graph.txt b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/target-graph.txt similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/target-graph.txt rename to build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/target-graph.txt diff --git a/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/task-store.msgpack b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/task-store.msgpack new file mode 100644 index 0000000..2206931 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/2435d0868a8768668f46b049370ba588.xcbuilddata/task-store.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/756a932d82ce86043544a83aeeb1de78 b/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/756a932d82ce86043544a83aeeb1de78 deleted file mode 100644 index 6aed236..0000000 Binary files a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/attachments/756a932d82ce86043544a83aeeb1de78 and /dev/null differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/task-store.msgpack b/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/task-store.msgpack deleted file mode 100644 index 64c0c37..0000000 Binary files a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/task-store.msgpack and /dev/null differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/task-store.msgpack b/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/task-store.msgpack deleted file mode 100644 index df604ee..0000000 Binary files a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/task-store.msgpack and /dev/null differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc diff --git a/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/844dd827368ca9dedb2b19baf3d6c714 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/844dd827368ca9dedb2b19baf3d6c714 new file mode 100644 index 0000000..34f8a64 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/844dd827368ca9dedb2b19baf3d6c714 differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 diff --git a/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/build-request.json b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/build-request.json new file mode 100644 index 0000000..2f983be --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/build-request.json @@ -0,0 +1,66 @@ +{ + "buildCommand" : { + "command" : "build", + "skipDependencies" : false, + "style" : "buildOnly" + }, + "configuredTargets" : [ + { + "guid" : "34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14" + } + ], + "containerPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj", + "continueBuildingAfterErrors" : false, + "dependencyScope" : "workspace", + "enableIndexBuildArena" : false, + "hideShellScriptEnvironment" : false, + "parameters" : { + "action" : "build", + "activeArchitecture" : "arm64", + "activeRunDestination" : { + "disableOnlyActiveArch" : false, + "hostTargetedPlatform" : null, + "platform" : "macosx", + "sdk" : "macosx27.0", + "sdkVariant" : "macos", + "supportedArchitectures" : [ + "arm64e", + "arm64", + "x86_64" + ], + "targetArchitecture" : "arm64" + }, + "arenaInfo" : { + "buildIntermediatesPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex", + "buildProductsPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products", + "derivedDataPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build", + "indexDataStoreFolderPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Index.noindex/DataStore", + "indexEnableDataStore" : true, + "indexPCHPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Index.noindex/PrecompiledHeaders", + "pchPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders" + }, + "configurationName" : "Debug", + "overrides" : { + "commandLine" : { + "table" : { + + } + }, + "synthesized" : { + "table" : { + "ACTION" : "build", + "ENABLE_PREVIEWS" : "NO", + "ENABLE_XOJIT_PREVIEWS" : "YES", + "ONLY_ACTIVE_ARCH" : "YES", + "TOOLCHAINS" : "com.apple.dt.toolchain.Metal.32023.921.5 $(inherited)" + } + } + } + }, + "schemeCommand" : "launch", + "showNonLoggedProgress" : true, + "useDryRun" : false, + "useImplicitDependencies" : true, + "useLegacyBuildLocations" : false, + "useParallelTargets" : true +} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/description.msgpack b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/description.msgpack similarity index 99% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/description.msgpack rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/description.msgpack index edd352a..32ec59a 100644 Binary files a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/description.msgpack and b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/description.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/manifest.json b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/manifest.json similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/manifest.json rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/manifest.json diff --git a/build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/target-graph.txt b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/target-graph.txt similarity index 100% rename from build/Build/Intermediates.noindex/XCBuildData/843261e86582a13fd83d1289100d0b6b.xcbuilddata/target-graph.txt rename to build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/target-graph.txt diff --git a/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/task-store.msgpack b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/task-store.msgpack new file mode 100644 index 0000000..a8ab76a Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/a246cfa007f5f0bb067024e4c1eac266.xcbuilddata/task-store.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 new file mode 100644 index 0000000..b41c2b4 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 @@ -0,0 +1 @@ +@rpath/WorkbenchReplacement.debug.dylib \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f @@ -0,0 +1,5 @@ + + + + + diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc new file mode 100644 index 0000000..38c3fe3 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc @@ -0,0 +1,49 @@ +{ + "" : { + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.dia", + "emit-module-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary-emit-module.d", + "emit-module-diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary-emit-module.dia", + "pch" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary-Bridging-header.pch", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.swiftdeps" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App~partial.swiftmodule" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel~partial.swiftmodule" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView~partial.swiftmodule" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol~partial.swiftmodule" + } +} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 new file mode 100644 index 0000000..ee59dbc --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 @@ -0,0 +1 @@ +{"case-sensitive":"false","roots":[],"version":0} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 new file mode 100644 index 0000000..d78c86b --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 @@ -0,0 +1 @@ +["AnyResolverProviding","AppEntity","AppEnum","AppExtension","AppIntent","AppIntentsPackage","AppShortcutProviding","AppShortcutsProvider","AppUnionValue","AppUnionValueCasesProviding","DynamicOptionsProvider","EntityQuery","ExtensionPointDefining","IntentValueQuery","Resolver","TransientEntity","_AssistantIntentsProvider","_GenerativeFunctionExtractable","_IntentValueRepresentable"] \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed new file mode 100644 index 0000000..f9bf4c6 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed @@ -0,0 +1,4 @@ +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 new file mode 100644 index 0000000..b2f4ea6 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 @@ -0,0 +1,4 @@ +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d3a090ccbccc4a2bbd58a3018530b3af b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d3a090ccbccc4a2bbd58a3018530b3af new file mode 100644 index 0000000..09ea535 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d3a090ccbccc4a2bbd58a3018530b3af differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e new file mode 100644 index 0000000..e69de29 diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 new file mode 100644 index 0000000..5920ce0 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 @@ -0,0 +1,4 @@ +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 new file mode 100644 index 0000000..81feccc --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 @@ -0,0 +1 @@ +WorkbenchReplacement.debug.dylib \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af new file mode 100644 index 0000000..3842541 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af @@ -0,0 +1,8 @@ + + + + + com.apple.security.get-task-allow + + + diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 new file mode 100644 index 0000000..dd8b535 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/build-request.json b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/build-request.json similarity index 97% rename from build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/build-request.json rename to build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/build-request.json index ed952da..cb3dcea 100644 --- a/build/Build/Intermediates.noindex/XCBuildData/69f67b13647b23476e4a199d44d0239c.xcbuilddata/build-request.json +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/build-request.json @@ -50,7 +50,7 @@ "table" : { "ACTION" : "build", "COLOR_DIAGNOSTICS" : "YES", - "diagnostic_message_length" : "167", + "diagnostic_message_length" : "162", "ENABLE_PREVIEWS" : "NO", "ENABLE_XOJIT_PREVIEWS" : "YES", "ONLY_ACTIVE_ARCH" : "YES", diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/description.msgpack b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/description.msgpack new file mode 100644 index 0000000..d826de2 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/description.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/manifest.json b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/manifest.json new file mode 100644 index 0000000..1fb7dbf --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/manifest.json @@ -0,0 +1 @@ +{"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":[""]},"nodes":{"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules":{"is-mutated":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true}},"commands":{"":{"tool":"phony","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/_CodeSignature","/Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex","/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache","","","","","","","","",""],"outputs":[""]},"":{"tool":"stale-file-removal","expectedOutputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/_CodeSignature","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist"],"roots":["/tmp/WorkbenchReplacement.dst","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products"],"outputs":[""]},"":{"tool":"stale-file-removal","expectedOutputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml"],"outputs":[""]},"P0:::ClangStatCache /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang-stat-cache /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache":{"tool":"shell","description":"ClangStatCache /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang-stat-cache /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache","inputs":[],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang-stat-cache","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk","-o","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache"],"env":{},"always-out-of-date":true,"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj","signature":"d4ef45907cf3236d96171349ed1b904b"},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules"]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--AppExtensionInfoPlistGeneratorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--AppIntentsMetadataTaskProducer":{"tool":"phony","inputs":["","","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-ChangeAlternatePermissions":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-ChangePermissions":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-CodeSign":{"tool":"phony","inputs":["","","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-CopyAside":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-GenerateStubAPI":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-RegisterExecutionPolicyException":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-RegisterProduct":{"tool":"phony","inputs":["","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-StripSymbols":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-Validate":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--CopySwiftPackageResourcesTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--CustomTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--DocumentationTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ExtensionPointExtractorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--GenerateAppPlaygroundAssetCatalogTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--GeneratedFilesTaskProducer":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--HeadermapTaskProducer":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--InfoPlistTaskProducer":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ModuleMapTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ModuleVerifierTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ProductPostprocessingTaskProducer":{"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ProductStructureTaskProducer":{"tool":"phony","inputs":["","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--RealityAssetsTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SanitizerTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--StubBinaryTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftABIBaselineGenerationTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftFrameworkABICheckerTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftPackageCopyFilesTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftStandardLibrariesTaskProducer":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TAPISymbolExtractorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestEntryPointTaskProducerFactory":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestHostTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestTargetPostprocessingTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestTargetTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--copy-headers-completion":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--fused-phase0-compile-sources&link-binary©-bundle-resources":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--generated-headers":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--swift-generated-headers":{"tool":"phony","inputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h"],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"code-sign-task","description":"CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist/","","","","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/_CodeSignature","",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib":{"tool":"code-sign-task","description":"CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist/","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib":{"tool":"code-sign-task","description":"CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist/","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CopySwiftLibs /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","","",""],"outputs":[""],"deps":"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/SwiftStdLibToolInputDependencies.dep"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ExtractAppIntentsMetadata":{"tool":"shell","description":"ExtractAppIntentsMetadata","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/appintentsmetadataprocessor","--toolchain-dir","/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain","--module-name","WorkbenchReplacement","--sdk-root","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk","--xcode-version","27A9275","--platform-family","macOS","--deployment-target","15.0","--bundle-identifier","net.absdev.WorkbenchReplacement","--output","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Resources","--target-triple","arm64-apple-macos15.0","--binary-file","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","--dependency-file","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","--stringsdata-file","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata","--source-file-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","--metadata-file-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","--static-metadata-file-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","--swift-const-vals-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","--compile-time-extraction","--deployment-aware-processing","--no-app-shortcuts-localization"],"env":{},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","signature":"e943b3d3a6f115dd17caa8739c15d434"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--begin-compiling":{"tool":"phony","inputs":["","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--begin-linking":{"tool":"phony","inputs":["","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--begin-scanning":{"tool":"phony","inputs":["","","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--end":{"tool":"phony","inputs":["","","","","","","","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--entry":{"tool":"phony","inputs":["","","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--immediate":{"tool":"phony","inputs":["","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--linker-inputs-ready":{"tool":"phony","inputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt"],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--modules-ready":{"tool":"phony","inputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h"],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--unsigned-product-ready":{"tool":"phony","inputs":["","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--will-sign":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"mkdir","description":"MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents":{"tool":"mkdir","description":"MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS":{"tool":"mkdir","description":"MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ProcessInfoPlistFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist":{"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo"]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ProcessProductPackaging /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent":{"tool":"process-product-entitlements","description":"ProcessProductPackaging /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent"]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ProcessProductPackagingDER /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der":{"tool":"shell","description":"ProcessProductPackagingDER /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der"],"args":["/usr/bin/derq","query","-f","xml","-i","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","-o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","--raw"],"env":{},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","signature":"95f941adf078789ab05d31191d052e98"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:RegisterExecutionPolicyException /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:RegisterWithLaunchServices /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"lsregisterurl","description":"RegisterWithLaunchServices /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:SwiftDriver Compilation WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler":{"tool":"swift-driver-compilation","description":"SwiftDriver Compilation WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","","","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues"]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Touch /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"shell","description":"Touch /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app"],"env":{},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","signature":"a00747d0c0f76c01aeca52216ba67e33"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Validate /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"validate-product","description":"Validate /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","","","",""],"outputs":["",""]},"P2:::WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ConstructStubExecutorLinkFileList /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt":{"tool":"construct-stub-executor-input-file-list","description":"ConstructStubExecutorLinkFileList /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","inputs":["/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/libPreviewsJITStubExecutor_no_swift_entry_point.a","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/libPreviewsJITStubExecutor.a","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement normal":{"tool":"linker","description":"Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement normal","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","",""]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib normal":{"tool":"shell","description":"Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib normal","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-Xlinker","-reproducible","-target","arm64-apple-macos15.0","-dynamiclib","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk","-Os","-Xlinker","-no_warn_duplicate_libraries","-L/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","-L/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","-F/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","-F/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","-filelist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","-install_name","@rpath/WorkbenchReplacement.debug.dylib","-Xlinker","-rpath","-Xlinker","/usr/lib/swift","-Xlinker","-object_path_lto","-Xlinker","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","-rdynamic","-Xlinker","-dependency_info","-Xlinker","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","-fobjc-link-runtime","-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx","-L/usr/lib/swift","-Xlinker","-add_ast_path","-Xlinker","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","-Xlinker","-alias","-Xlinker","_main","-Xlinker","___debug_main_executable_dylib_entry_point","-Xlinker","-no_adhoc_codesign","-o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib"],"env":{"PATH":"/Applications/Xcode.app/Contents/SharedFrameworks/SwiftBuild.framework/Versions/A/PlugIns/SWBBuildService.bundle/Contents/PlugIns/SWBUniversalPlatformPlugin.bundle/Contents/Frameworks/SWBUniversalPlatform.framework/Resources:/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain/usr/bin:/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain/usr/local/bin:/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/Applications/ServBay/script/alias:/Applications/ServBay/bin:/Applications/ServBay/sbin:/Applications/ServBay/script:/Applications/ServBay/package/python/current/Python.framework/Versions/Current/bin:/Applications/ServBay/package/node/current/bin:/Applications/ServBay/package/ruby/current/bin:/Applications/ServBay/package/python/3.9/current/bin:/Users/markgregory/.local/bin:/opt/homebrew/opt/postgresql@18/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/opt/X11/bin:/Library/Apple/usr/bin:/opt/homebrew/bin:/Users/markgregory/Library/Application Support/JetBrains/Toolbox/scripts:/Users/markgregory/.composer/vendor/bin:/Users/mag/.lmstudio/bin"},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","deps":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat"],"deps-style":"dependency-info","signature":"0f4dd5282aebfbd43cee7f18d30408f7"},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib normal":{"tool":"linker","description":"Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib normal","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","",""]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:SwiftDriver Compilation Requirements WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler":{"tool":"swift-driver-compilation-requirement","description":"SwiftDriver Compilation Requirements WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:SwiftMergeGeneratedHeaders /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h":{"tool":"swift-header-tool","description":"SwiftMergeGeneratedHeaders /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist"]}}} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/target-graph.txt b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/target-graph.txt new file mode 100644 index 0000000..58a7840 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/target-graph.txt @@ -0,0 +1,2 @@ +Target dependency graph (1 target) +Target 'WorkbenchReplacement' in project 'WorkbenchReplacement' (no dependencies) \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/task-store.msgpack b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/task-store.msgpack new file mode 100644 index 0000000..faceb6f Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/b4f9670003ddbc00bd0e34134fd05c3c.xcbuilddata/task-store.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/build.db b/build/Build/Intermediates.noindex/XCBuildData/build.db index dc2dbec..4eea198 100644 Binary files a/build/Build/Intermediates.noindex/XCBuildData/build.db and b/build/Build/Intermediates.noindex/XCBuildData/build.db differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 new file mode 100644 index 0000000..b41c2b4 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/15726fb86eddf5eb007ad1da55571215 @@ -0,0 +1 @@ +@rpath/WorkbenchReplacement.debug.dylib \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/2de6a04cdba79ed13580c47dfd70cc5f @@ -0,0 +1,5 @@ + + + + + diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc new file mode 100644 index 0000000..38c3fe3 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/4f5c2426dceb78351a3ede0458739fcc @@ -0,0 +1,49 @@ +{ + "" : { + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.dia", + "emit-module-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary-emit-module.d", + "emit-module-diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary-emit-module.dia", + "pch" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary-Bridging-header.pch", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.swiftdeps" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App~partial.swiftmodule" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel~partial.swiftmodule" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView~partial.swiftmodule" + }, + "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift" : { + "const-values" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues", + "dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.d", + "diagnostics" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.dia", + "index-unit-output-path" : "/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o", + "llvm-bc" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.bc", + "object" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o", + "swift-dependencies" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftdeps", + "swiftmodule" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol~partial.swiftmodule" + } +} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/6247fba5cfd7eddd54ec37af0638add6 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/6247fba5cfd7eddd54ec37af0638add6 new file mode 100644 index 0000000..1d2606e Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/6247fba5cfd7eddd54ec37af0638add6 differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 new file mode 100644 index 0000000..ee59dbc --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/8bba4233626f64a7ea772bb94a08a1a9 @@ -0,0 +1 @@ +{"case-sensitive":"false","roots":[],"version":0} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 new file mode 100644 index 0000000..d78c86b --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/9a2910799639cff85464f3dcb75559c1 @@ -0,0 +1 @@ +["AnyResolverProviding","AppEntity","AppEnum","AppExtension","AppIntent","AppIntentsPackage","AppShortcutProviding","AppShortcutsProvider","AppUnionValue","AppUnionValueCasesProviding","DynamicOptionsProvider","EntityQuery","ExtensionPointDefining","IntentValueQuery","Resolver","TransientEntity","_AssistantIntentsProvider","_GenerativeFunctionExtractable","_IntentValueRepresentable"] \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed new file mode 100644 index 0000000..f9bf4c6 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/b47c260a05c70c9e20ee4b0d1fc4e6ed @@ -0,0 +1,4 @@ +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 new file mode 100644 index 0000000..b2f4ea6 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/b6a63299643304380633b19a42b96379 @@ -0,0 +1,4 @@ +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/d41d8cd98f00b204e9800998ecf8427e new file mode 100644 index 0000000..e69de29 diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 new file mode 100644 index 0000000..5920ce0 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/d88acc6e91fc370129743fcdc3e34ab1 @@ -0,0 +1,4 @@ +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift +/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 new file mode 100644 index 0000000..81feccc --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/dccfce55fa07ed9ec6f5920d7bed9910 @@ -0,0 +1 @@ +WorkbenchReplacement.debug.dylib \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af new file mode 100644 index 0000000..3842541 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/f86cbb10517a3bd51f252887359b04af @@ -0,0 +1,8 @@ + + + + + com.apple.security.get-task-allow + + + diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 new file mode 100644 index 0000000..dd8b535 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/attachments/fd8314defc70a8778956f026c0ddfd19 differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/build-request.json b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/build-request.json new file mode 100644 index 0000000..2f983be --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/build-request.json @@ -0,0 +1,66 @@ +{ + "buildCommand" : { + "command" : "build", + "skipDependencies" : false, + "style" : "buildOnly" + }, + "configuredTargets" : [ + { + "guid" : "34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14" + } + ], + "containerPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj", + "continueBuildingAfterErrors" : false, + "dependencyScope" : "workspace", + "enableIndexBuildArena" : false, + "hideShellScriptEnvironment" : false, + "parameters" : { + "action" : "build", + "activeArchitecture" : "arm64", + "activeRunDestination" : { + "disableOnlyActiveArch" : false, + "hostTargetedPlatform" : null, + "platform" : "macosx", + "sdk" : "macosx27.0", + "sdkVariant" : "macos", + "supportedArchitectures" : [ + "arm64e", + "arm64", + "x86_64" + ], + "targetArchitecture" : "arm64" + }, + "arenaInfo" : { + "buildIntermediatesPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex", + "buildProductsPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products", + "derivedDataPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build", + "indexDataStoreFolderPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Index.noindex/DataStore", + "indexEnableDataStore" : true, + "indexPCHPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Index.noindex/PrecompiledHeaders", + "pchPath" : "/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders" + }, + "configurationName" : "Debug", + "overrides" : { + "commandLine" : { + "table" : { + + } + }, + "synthesized" : { + "table" : { + "ACTION" : "build", + "ENABLE_PREVIEWS" : "NO", + "ENABLE_XOJIT_PREVIEWS" : "YES", + "ONLY_ACTIVE_ARCH" : "YES", + "TOOLCHAINS" : "com.apple.dt.toolchain.Metal.32023.921.5 $(inherited)" + } + } + } + }, + "schemeCommand" : "launch", + "showNonLoggedProgress" : true, + "useDryRun" : false, + "useImplicitDependencies" : true, + "useLegacyBuildLocations" : false, + "useParallelTargets" : true +} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/description.msgpack b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/description.msgpack new file mode 100644 index 0000000..8f5aa7e Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/description.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/manifest.json b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/manifest.json new file mode 100644 index 0000000..1fb7dbf --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/manifest.json @@ -0,0 +1 @@ +{"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":[""]},"nodes":{"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex":{"is-mutated":true},"/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules":{"is-mutated":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true}},"commands":{"":{"tool":"phony","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/_CodeSignature","/Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex","/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache","","","","","","","","",""],"outputs":[""]},"":{"tool":"stale-file-removal","expectedOutputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/_CodeSignature","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist"],"roots":["/tmp/WorkbenchReplacement.dst","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products"],"outputs":[""]},"":{"tool":"stale-file-removal","expectedOutputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml"],"outputs":[""]},"P0:::ClangStatCache /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang-stat-cache /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache":{"tool":"shell","description":"ClangStatCache /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang-stat-cache /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache","inputs":[],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang-stat-cache","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk","-o","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache"],"env":{},"always-out-of-date":true,"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj","signature":"d4ef45907cf3236d96171349ed1b904b"},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/ExplicitPrecompiledModules"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/PrecompiledHeaders"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products"],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/CompilationCache.noindex"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex"]},"P0:::CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules":{"tool":"create-build-directory","description":"CreateBuildDirectory /Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules","inputs":[],"outputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/SDKExplicitPrecompiledModules"]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--AppExtensionInfoPlistGeneratorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--AppIntentsMetadataTaskProducer":{"tool":"phony","inputs":["","","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-ChangeAlternatePermissions":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-ChangePermissions":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-CodeSign":{"tool":"phony","inputs":["","","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-CopyAside":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-GenerateStubAPI":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-RegisterExecutionPolicyException":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-RegisterProduct":{"tool":"phony","inputs":["","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-StripSymbols":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--Barrier-Validate":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--CopySwiftPackageResourcesTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--CustomTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--DocumentationTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ExtensionPointExtractorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--GenerateAppPlaygroundAssetCatalogTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--GeneratedFilesTaskProducer":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--HeadermapTaskProducer":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--InfoPlistTaskProducer":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ModuleMapTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ModuleVerifierTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ProductPostprocessingTaskProducer":{"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--ProductStructureTaskProducer":{"tool":"phony","inputs":["","","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--RealityAssetsTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SanitizerTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--StubBinaryTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftABIBaselineGenerationTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftFrameworkABICheckerTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftPackageCopyFilesTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--SwiftStandardLibrariesTaskProducer":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TAPISymbolExtractorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestEntryPointTaskProducerFactory":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestHostTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestTargetPostprocessingTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--TestTargetTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--copy-headers-completion":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--fused-phase0-compile-sources&link-binary©-bundle-resources":{"tool":"phony","inputs":["","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt"],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--generated-headers":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:::Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--swift-generated-headers":{"tool":"phony","inputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h"],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"code-sign-task","description":"CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist/","","","","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/_CodeSignature","",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib":{"tool":"code-sign-task","description":"CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist/","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib":{"tool":"code-sign-task","description":"CodeSign /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift/","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist/","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:CopySwiftLibs /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","","",""],"outputs":[""],"deps":"/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/SwiftStdLibToolInputDependencies.dep"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ExtractAppIntentsMetadata":{"tool":"shell","description":"ExtractAppIntentsMetadata","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/appintentsmetadataprocessor","--toolchain-dir","/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain","--module-name","WorkbenchReplacement","--sdk-root","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk","--xcode-version","27A9275","--platform-family","macOS","--deployment-target","15.0","--bundle-identifier","net.absdev.WorkbenchReplacement","--output","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Resources","--target-triple","arm64-apple-macos15.0","--binary-file","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","--dependency-file","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","--stringsdata-file","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata","--source-file-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","--metadata-file-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","--static-metadata-file-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","--swift-const-vals-list","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","--compile-time-extraction","--deployment-aware-processing","--no-app-shortcuts-localization"],"env":{},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","signature":"e943b3d3a6f115dd17caa8739c15d434"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--begin-compiling":{"tool":"phony","inputs":["","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--begin-linking":{"tool":"phony","inputs":["","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--begin-scanning":{"tool":"phony","inputs":["","","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--end":{"tool":"phony","inputs":["","","","","","","","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--entry":{"tool":"phony","inputs":["","","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--immediate":{"tool":"phony","inputs":["","","","","","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--linker-inputs-ready":{"tool":"phony","inputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt"],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--modules-ready":{"tool":"phony","inputs":["","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h"],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--unsigned-product-ready":{"tool":"phony","inputs":["","","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Gate target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14--will-sign":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"mkdir","description":"MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents":{"tool":"mkdir","description":"MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS":{"tool":"mkdir","description":"MkDir /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS",""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ProcessInfoPlistFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist":{"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/PkgInfo"]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ProcessProductPackaging /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent":{"tool":"process-product-entitlements","description":"ProcessProductPackaging /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent"]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ProcessProductPackagingDER /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der":{"tool":"shell","description":"ProcessProductPackagingDER /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der"],"args":["/usr/bin/derq","query","-f","xml","-i","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent","-o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.app.xcent.der","--raw"],"env":{},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","signature":"95f941adf078789ab05d31191d052e98"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:RegisterExecutionPolicyException /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:RegisterWithLaunchServices /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"lsregisterurl","description":"RegisterWithLaunchServices /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["","","",""],"outputs":[""]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:SwiftDriver Compilation WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler":{"tool":"swift-driver-compilation","description":"SwiftDriver Compilation WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","","","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.stringsdata","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.swiftconstvalues","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.swiftconstvalues"]},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Touch /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"shell","description":"Touch /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app"],"env":{},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","signature":"a00747d0c0f76c01aeca52216ba67e33"},"P0:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Validate /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app":{"tool":"validate-product","description":"Validate /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/Info.plist","","","",""],"outputs":["",""]},"P2:::WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex"],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb-VFS/all-product-headers.yaml"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:ConstructStubExecutorLinkFileList /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt":{"tool":"construct-stub-executor-input-file-list","description":"ConstructStubExecutorLinkFileList /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","inputs":["/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/libPreviewsJITStubExecutor_no_swift_entry_point.a","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/libPreviewsJITStubExecutor.a","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.abi.json"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftdoc"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule":{"tool":"file-copy","description":"Copy /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule/","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement normal":{"tool":"linker","description":"Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement normal","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-ExecutorLinkFileList-normal-arm64.txt","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement","",""]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib normal":{"tool":"shell","description":"Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib normal","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/DatabaseModel.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MySQLProtocol.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib","","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-Xlinker","-reproducible","-target","arm64-apple-macos15.0","-dynamiclib","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX27.0.sdk","-Os","-Xlinker","-no_warn_duplicate_libraries","-L/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","-L/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","-F/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/EagerLinkingTBDs/Debug","-F/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug","-filelist","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","-install_name","@rpath/WorkbenchReplacement.debug.dylib","-Xlinker","-rpath","-Xlinker","/usr/lib/swift","-Xlinker","-object_path_lto","-Xlinker","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_lto.o","-rdynamic","-Xlinker","-dependency_info","-Xlinker","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat","-fobjc-link-runtime","-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx","-L/usr/lib/swift","-Xlinker","-add_ast_path","-Xlinker","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","-Xlinker","-alias","-Xlinker","_main","-Xlinker","___debug_main_executable_dylib_entry_point","-Xlinker","-no_adhoc_codesign","-o","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib"],"env":{"PATH":"/Applications/Xcode.app/Contents/SharedFrameworks/SwiftBuild.framework/Versions/A/PlugIns/SWBBuildService.bundle/Contents/PlugIns/SWBUniversalPlatformPlugin.bundle/Contents/Frameworks/SWBUniversalPlatform.framework/Resources:/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain/usr/bin:/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain/usr/local/bin:/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v27.1.266.1.3TPee2/Metal.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/Applications/ServBay/script/alias:/Applications/ServBay/bin:/Applications/ServBay/sbin:/Applications/ServBay/script:/Applications/ServBay/package/python/current/Python.framework/Versions/Current/bin:/Applications/ServBay/package/node/current/bin:/Applications/ServBay/package/ruby/current/bin:/Applications/ServBay/package/python/3.9/current/bin:/Users/markgregory/.local/bin:/opt/homebrew/opt/postgresql@18/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/opt/X11/bin:/Library/Apple/usr/bin:/opt/homebrew/bin:/Users/markgregory/Library/Application Support/JetBrains/Toolbox/scripts:/Users/markgregory/.composer/vendor/bin:/Users/mag/.lmstudio/bin"},"working-directory":"/Volumes/Developer/Applications/WorkbenchReplacement","deps":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_dependency_info.dat"],"deps-style":"dependency-info","signature":"0f4dd5282aebfbd43cee7f18d30408f7"},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib normal":{"tool":"linker","description":"Ld /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib normal","inputs":["",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib","",""]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:SwiftDriver Compilation Requirements WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler":{"tool":"swift-driver-compilation-requirement","description":"SwiftDriver Compilation Requirements WorkbenchReplacement normal arm64 com.apple.xcode.tools.swift.compiler","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/App.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MainView.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/DatabaseModel.swift","/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement/MySQLProtocol.swift","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","","","","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement Swift Compilation Requirements Finished","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-dependency-scan.dia","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.abi.json","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftdoc"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:SwiftMergeGeneratedHeaders /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h":{"tool":"swift-header-tool","description":"SwiftMergeGeneratedHeaders /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","inputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-Swift.h","",""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/WorkbenchReplacement-Swift.h"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/DerivedSources/Entitlements.plist"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-OutputFileMap.json"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.LinkFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftConstValuesFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.SwiftFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement_const_extract_protocols.json"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibInstallName-normal-arm64.txt"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-DebugDylibPath-normal-arm64.txt"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-non-framework-target-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-all-target-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-generated-files.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-own-target-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement-project-headers.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyMetadataFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.DependencyStaticMetadataFileList"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/WorkbenchReplacement.hmap"]},"P2:target-WorkbenchReplacement-34f2007b1d0798da0712fb82baec90fb2878cdfbaa5fcb5fa30c8485a83dfb14-:Debug:WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist","inputs":[""],"outputs":["/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/empty-WorkbenchReplacement.plist"]}}} \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/target-graph.txt b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/target-graph.txt new file mode 100644 index 0000000..58a7840 --- /dev/null +++ b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/target-graph.txt @@ -0,0 +1,2 @@ +Target dependency graph (1 target) +Target 'WorkbenchReplacement' in project 'WorkbenchReplacement' (no dependencies) \ No newline at end of file diff --git a/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/task-store.msgpack b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/task-store.msgpack new file mode 100644 index 0000000..b522828 Binary files /dev/null and b/build/Build/Intermediates.noindex/XCBuildData/cccaed5622a247c59d49b208a7c53ae2.xcbuilddata/task-store.msgpack differ diff --git a/build/Build/Intermediates.noindex/XCBuildData/prior-build-descriptions.txt b/build/Build/Intermediates.noindex/XCBuildData/prior-build-descriptions.txt index 551b3ca..4398038 100644 --- a/build/Build/Intermediates.noindex/XCBuildData/prior-build-descriptions.txt +++ b/build/Build/Intermediates.noindex/XCBuildData/prior-build-descriptions.txt @@ -1,2 +1,7 @@ 69f67b13647b23476e4a199d44d0239c 843261e86582a13fd83d1289100d0b6b +b4f9670003ddbc00bd0e34134fd05c3c +cccaed5622a247c59d49b208a7c53ae2 +2435d0868a8768668f46b049370ba588 +a246cfa007f5f0bb067024e4c1eac266 +2435d0868a8768668f46b049370ba588 diff --git a/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt b/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt index e10b75c..ac95126 100644 --- a/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt +++ b/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt @@ -1,2 +1,15 @@ /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app +/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement index c30be19..50b912e 100755 Binary files a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement and b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement differ diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib index 610ab47..9239d56 100755 Binary files a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib and b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib differ diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib index 62092ad..3e659a9 100755 Binary files a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib and b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib differ diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources index 22a090d..b7753ee 100644 --- a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources +++ b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources @@ -10,7 +10,7 @@ cdhash - hitaRAVyUQKiLID3/ydJ1Gi9jVE= + pbQjjW/Ln494NFYT5UR4kmh5yTs= requirement identifier "WorkbenchReplacement.debug" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */ diff --git a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo index d840a8f..7dd48c4 100644 Binary files a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo and b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo differ diff --git a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule index 4c75fe1..3718105 100644 Binary files a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule and b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule differ diff --git a/build/Index.noindex/DataStore/v5/records/0R/MainView.swift-159KIT927MC0R b/build/Index.noindex/DataStore/v5/records/0R/MainView.swift-159KIT927MC0R new file mode 100644 index 0000000..62f5061 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/0R/MainView.swift-159KIT927MC0R differ diff --git a/build/Index.noindex/DataStore/v5/records/29/MainView.swift-2XNX9J2W7Y029 b/build/Index.noindex/DataStore/v5/records/29/MainView.swift-2XNX9J2W7Y029 new file mode 100644 index 0000000..45873d0 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/29/MainView.swift-2XNX9J2W7Y029 differ diff --git a/build/Index.noindex/DataStore/v5/records/3V/DatabaseModel.swift-2A5CNLGHHR73V b/build/Index.noindex/DataStore/v5/records/3V/DatabaseModel.swift-2A5CNLGHHR73V new file mode 100644 index 0000000..596da59 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/3V/DatabaseModel.swift-2A5CNLGHHR73V differ diff --git a/build/Index.noindex/DataStore/v5/records/5Y/DatabaseModel.swift-34JVOJ8EXB65Y b/build/Index.noindex/DataStore/v5/records/5Y/DatabaseModel.swift-34JVOJ8EXB65Y new file mode 100644 index 0000000..0f94741 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/5Y/DatabaseModel.swift-34JVOJ8EXB65Y differ diff --git a/build/Index.noindex/DataStore/v5/records/6W/MainView.swift-2J5LXGQZ9E66W b/build/Index.noindex/DataStore/v5/records/6W/MainView.swift-2J5LXGQZ9E66W new file mode 100644 index 0000000..83ae9a5 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/6W/MainView.swift-2J5LXGQZ9E66W differ diff --git a/build/Index.noindex/DataStore/v5/records/CA/arm64e-apple-macos.swiftinterface-9VU26OR0BXCA b/build/Index.noindex/DataStore/v5/records/CA/arm64e-apple-macos.swiftinterface-9VU26OR0BXCA new file mode 100644 index 0000000..84598b5 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/CA/arm64e-apple-macos.swiftinterface-9VU26OR0BXCA differ diff --git a/build/Index.noindex/DataStore/v5/records/FG/DatabaseModel.swift-18SIVQF7CRRFG b/build/Index.noindex/DataStore/v5/records/FG/DatabaseModel.swift-18SIVQF7CRRFG new file mode 100644 index 0000000..be0f445 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/FG/DatabaseModel.swift-18SIVQF7CRRFG differ diff --git a/build/Index.noindex/DataStore/v5/records/HK/MainView.swift-35X1OSLITEYHK b/build/Index.noindex/DataStore/v5/records/HK/MainView.swift-35X1OSLITEYHK new file mode 100644 index 0000000..9e908ec Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/HK/MainView.swift-35X1OSLITEYHK differ diff --git a/build/Index.noindex/DataStore/v5/records/J3/MainView.swift-32D5SH1A9H2J3 b/build/Index.noindex/DataStore/v5/records/J3/MainView.swift-32D5SH1A9H2J3 new file mode 100644 index 0000000..7165011 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/J3/MainView.swift-32D5SH1A9H2J3 differ diff --git a/build/Index.noindex/DataStore/v5/records/JG/arm64e-apple-macos.swiftinterface-18YNGB3E440JG b/build/Index.noindex/DataStore/v5/records/JG/arm64e-apple-macos.swiftinterface-18YNGB3E440JG new file mode 100644 index 0000000..52f93c9 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/JG/arm64e-apple-macos.swiftinterface-18YNGB3E440JG differ diff --git a/build/Index.noindex/DataStore/v5/records/JQ/MainView.swift-1VS7IWQPOPYJQ b/build/Index.noindex/DataStore/v5/records/JQ/MainView.swift-1VS7IWQPOPYJQ new file mode 100644 index 0000000..7529624 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/JQ/MainView.swift-1VS7IWQPOPYJQ differ diff --git a/build/Index.noindex/DataStore/v5/records/JW/App.swift-2P77QUBXRQJJW b/build/Index.noindex/DataStore/v5/records/JW/App.swift-2P77QUBXRQJJW new file mode 100644 index 0000000..0dbdf49 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/JW/App.swift-2P77QUBXRQJJW differ diff --git a/build/Index.noindex/DataStore/v5/records/MI/App.swift-VOIK7UXGUZMI b/build/Index.noindex/DataStore/v5/records/MI/App.swift-VOIK7UXGUZMI new file mode 100644 index 0000000..af443e1 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/MI/App.swift-VOIK7UXGUZMI differ diff --git a/build/Index.noindex/DataStore/v5/records/RM/MainView.swift-2JVAZQMDIHRM b/build/Index.noindex/DataStore/v5/records/RM/MainView.swift-2JVAZQMDIHRM new file mode 100644 index 0000000..74651df Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/RM/MainView.swift-2JVAZQMDIHRM differ diff --git a/build/Index.noindex/DataStore/v5/records/WS/arm64e-apple-macos.swiftinterface-32HV1LNPD7SWS b/build/Index.noindex/DataStore/v5/records/WS/arm64e-apple-macos.swiftinterface-32HV1LNPD7SWS new file mode 100644 index 0000000..5ff812e Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/WS/arm64e-apple-macos.swiftinterface-32HV1LNPD7SWS differ diff --git a/build/Index.noindex/DataStore/v5/records/XP/DatabaseModel.swift-1ADJELNYB18XP b/build/Index.noindex/DataStore/v5/records/XP/DatabaseModel.swift-1ADJELNYB18XP new file mode 100644 index 0000000..b2f496c Binary files /dev/null and b/build/Index.noindex/DataStore/v5/records/XP/DatabaseModel.swift-1ADJELNYB18XP differ diff --git a/build/Index.noindex/DataStore/v5/units/App.o-OQXOM6J6ZNBE b/build/Index.noindex/DataStore/v5/units/App.o-OQXOM6J6ZNBE index b0a3aa1..b25ca98 100644 Binary files a/build/Index.noindex/DataStore/v5/units/App.o-OQXOM6J6ZNBE and b/build/Index.noindex/DataStore/v5/units/App.o-OQXOM6J6ZNBE differ diff --git a/build/Index.noindex/DataStore/v5/units/AppKit-CL9YTLJPOU9I6ZH8JT9DWO0D4.pcm-30EQRP2J2QS55 b/build/Index.noindex/DataStore/v5/units/AppKit-CL9YTLJPOU9I6ZH8JT9DWO0D4.pcm-30EQRP2J2QS55 new file mode 100644 index 0000000..0343b7a Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/AppKit-CL9YTLJPOU9I6ZH8JT9DWO0D4.pcm-30EQRP2J2QS55 differ diff --git a/build/Index.noindex/DataStore/v5/units/ApplicationServices-3BSKXHGPFFJGNJDUX4MJHAROJ.pcm-36YBRMQTEDV4V b/build/Index.noindex/DataStore/v5/units/ApplicationServices-3BSKXHGPFFJGNJDUX4MJHAROJ.pcm-36YBRMQTEDV4V new file mode 100644 index 0000000..7664bfc Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/ApplicationServices-3BSKXHGPFFJGNJDUX4MJHAROJ.pcm-36YBRMQTEDV4V differ diff --git a/build/Index.noindex/DataStore/v5/units/CFNetwork-PPAEVAYES3T1V01FG7N3BQIG.pcm-3OHVBH6A4OUS0 b/build/Index.noindex/DataStore/v5/units/CFNetwork-PPAEVAYES3T1V01FG7N3BQIG.pcm-3OHVBH6A4OUS0 new file mode 100644 index 0000000..56517a4 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CFNetwork-PPAEVAYES3T1V01FG7N3BQIG.pcm-3OHVBH6A4OUS0 differ diff --git a/build/Index.noindex/DataStore/v5/units/CUPS-57WLPWZ0ACOTR94MV37RVAV5N.pcm-3KUG5Q9JODFIX b/build/Index.noindex/DataStore/v5/units/CUPS-57WLPWZ0ACOTR94MV37RVAV5N.pcm-3KUG5Q9JODFIX new file mode 100644 index 0000000..6bb7310 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CUPS-57WLPWZ0ACOTR94MV37RVAV5N.pcm-3KUG5Q9JODFIX differ diff --git a/build/Index.noindex/DataStore/v5/units/ColorSync-5IMHY8TOW2LEQC89ZGQZ3SE2.pcm-3N358XZ67GX5J b/build/Index.noindex/DataStore/v5/units/ColorSync-5IMHY8TOW2LEQC89ZGQZ3SE2.pcm-3N358XZ67GX5J new file mode 100644 index 0000000..fb4602d Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/ColorSync-5IMHY8TOW2LEQC89ZGQZ3SE2.pcm-3N358XZ67GX5J differ diff --git a/build/Index.noindex/DataStore/v5/units/CoreData-365S85DEAB5MO16ZWK6H24GK0.pcm-4MY69JUWOLGX b/build/Index.noindex/DataStore/v5/units/CoreData-365S85DEAB5MO16ZWK6H24GK0.pcm-4MY69JUWOLGX new file mode 100644 index 0000000..8f8963e Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CoreData-365S85DEAB5MO16ZWK6H24GK0.pcm-4MY69JUWOLGX differ diff --git a/build/Index.noindex/DataStore/v5/units/CoreGraphics-8M433BZBPSU56NLVMEW2VRNO3.pcm-M75PFM4GQMAF b/build/Index.noindex/DataStore/v5/units/CoreGraphics-8M433BZBPSU56NLVMEW2VRNO3.pcm-M75PFM4GQMAF new file mode 100644 index 0000000..c28e522 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CoreGraphics-8M433BZBPSU56NLVMEW2VRNO3.pcm-M75PFM4GQMAF differ diff --git a/build/Index.noindex/DataStore/v5/units/CoreImage-FGQVU0R8OIEEQIIUMDUUILMU.pcm-39YHGQJHYGV3Q b/build/Index.noindex/DataStore/v5/units/CoreImage-FGQVU0R8OIEEQIIUMDUUILMU.pcm-39YHGQJHYGV3Q new file mode 100644 index 0000000..3e0067b Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CoreImage-FGQVU0R8OIEEQIIUMDUUILMU.pcm-39YHGQJHYGV3Q differ diff --git a/build/Index.noindex/DataStore/v5/units/CoreServices-CFUHL0JHQ5BZ6JO9EU6U9ZFT2.pcm-14TZPPFNY9BK6 b/build/Index.noindex/DataStore/v5/units/CoreServices-CFUHL0JHQ5BZ6JO9EU6U9ZFT2.pcm-14TZPPFNY9BK6 new file mode 100644 index 0000000..11d419d Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CoreServices-CFUHL0JHQ5BZ6JO9EU6U9ZFT2.pcm-14TZPPFNY9BK6 differ diff --git a/build/Index.noindex/DataStore/v5/units/CoreText-E1R0W0Y9CSZ897CAZN8WPG95C.pcm-FAUXQNIPE6ER b/build/Index.noindex/DataStore/v5/units/CoreText-E1R0W0Y9CSZ897CAZN8WPG95C.pcm-FAUXQNIPE6ER new file mode 100644 index 0000000..9c804de Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CoreText-E1R0W0Y9CSZ897CAZN8WPG95C.pcm-FAUXQNIPE6ER differ diff --git a/build/Index.noindex/DataStore/v5/units/CoreVideo-EJL32H99KVX6Y1J5TJJGEMK5S.pcm-3I7ALS1DVHTXP b/build/Index.noindex/DataStore/v5/units/CoreVideo-EJL32H99KVX6Y1J5TJJGEMK5S.pcm-3I7ALS1DVHTXP new file mode 100644 index 0000000..bb93178 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/CoreVideo-EJL32H99KVX6Y1J5TJJGEMK5S.pcm-3I7ALS1DVHTXP differ diff --git a/build/Index.noindex/DataStore/v5/units/DatabaseModel.o-1OFYNQPC4KXNF b/build/Index.noindex/DataStore/v5/units/DatabaseModel.o-1OFYNQPC4KXNF index f5d868e..285f76f 100644 Binary files a/build/Index.noindex/DataStore/v5/units/DatabaseModel.o-1OFYNQPC4KXNF and b/build/Index.noindex/DataStore/v5/units/DatabaseModel.o-1OFYNQPC4KXNF differ diff --git a/build/Index.noindex/DataStore/v5/units/DiskArbitration-UH5H15Q4SG0MDJZNRGQDQ6UF.pcm-2QXY56B7OGEZS b/build/Index.noindex/DataStore/v5/units/DiskArbitration-UH5H15Q4SG0MDJZNRGQDQ6UF.pcm-2QXY56B7OGEZS new file mode 100644 index 0000000..ead0949 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/DiskArbitration-UH5H15Q4SG0MDJZNRGQDQ6UF.pcm-2QXY56B7OGEZS differ diff --git a/build/Index.noindex/DataStore/v5/units/Foundation-7EMR5SDFA90I2YC1MIW01MOVL.pcm-274IIQV29E6EU b/build/Index.noindex/DataStore/v5/units/Foundation-7EMR5SDFA90I2YC1MIW01MOVL.pcm-274IIQV29E6EU new file mode 100644 index 0000000..9188f3a Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/Foundation-7EMR5SDFA90I2YC1MIW01MOVL.pcm-274IIQV29E6EU differ diff --git a/build/Index.noindex/DataStore/v5/units/IOKit-DKQW29SB1ZTDE6ZAO5AADMA1S.pcm-1FZOE7NMP6314 b/build/Index.noindex/DataStore/v5/units/IOKit-DKQW29SB1ZTDE6ZAO5AADMA1S.pcm-1FZOE7NMP6314 new file mode 100644 index 0000000..468ce9e Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/IOKit-DKQW29SB1ZTDE6ZAO5AADMA1S.pcm-1FZOE7NMP6314 differ diff --git a/build/Index.noindex/DataStore/v5/units/IOSurface-8ZVH3UFJ5E2RSXE7HEG17X5FN.pcm-EGYTBCN8V0DV b/build/Index.noindex/DataStore/v5/units/IOSurface-8ZVH3UFJ5E2RSXE7HEG17X5FN.pcm-EGYTBCN8V0DV new file mode 100644 index 0000000..c9ff790 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/IOSurface-8ZVH3UFJ5E2RSXE7HEG17X5FN.pcm-EGYTBCN8V0DV differ diff --git a/build/Index.noindex/DataStore/v5/units/ImageIO-5J9HQ8F6U459VGN562S803HL5.pcm-SJ2TUXI69829 b/build/Index.noindex/DataStore/v5/units/ImageIO-5J9HQ8F6U459VGN562S803HL5.pcm-SJ2TUXI69829 new file mode 100644 index 0000000..76c1d1d Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/ImageIO-5J9HQ8F6U459VGN562S803HL5.pcm-SJ2TUXI69829 differ diff --git a/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 b/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 index 4cc7161..173eaec 100644 Binary files a/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 and b/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 differ diff --git a/build/Index.noindex/DataStore/v5/units/Metal-CT6H1MCTUNZDQSSNO61HFZLZE.pcm-1O7KPAC86Z1VG b/build/Index.noindex/DataStore/v5/units/Metal-CT6H1MCTUNZDQSSNO61HFZLZE.pcm-1O7KPAC86Z1VG new file mode 100644 index 0000000..3b60109 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/Metal-CT6H1MCTUNZDQSSNO61HFZLZE.pcm-1O7KPAC86Z1VG differ diff --git a/build/Index.noindex/DataStore/v5/units/OpenGL-1OAFZ5HF502S7XTONQ752M7MU.pcm-2YTJY0GY9O6R7 b/build/Index.noindex/DataStore/v5/units/OpenGL-1OAFZ5HF502S7XTONQ752M7MU.pcm-2YTJY0GY9O6R7 new file mode 100644 index 0000000..ff85657 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/OpenGL-1OAFZ5HF502S7XTONQ752M7MU.pcm-2YTJY0GY9O6R7 differ diff --git a/build/Index.noindex/DataStore/v5/units/QuartzCore-D5VLT03F69HLIRAW7N9WCLS9Z.pcm-1GN5807PO023R b/build/Index.noindex/DataStore/v5/units/QuartzCore-D5VLT03F69HLIRAW7N9WCLS9Z.pcm-1GN5807PO023R new file mode 100644 index 0000000..37813a3 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/QuartzCore-D5VLT03F69HLIRAW7N9WCLS9Z.pcm-1GN5807PO023R differ diff --git a/build/Index.noindex/DataStore/v5/units/Symbols-9PHANA662J50AKDDU8SRE4Y2D.pcm-2D4OPJ1BW5SG6 b/build/Index.noindex/DataStore/v5/units/Symbols-9PHANA662J50AKDDU8SRE4Y2D.pcm-2D4OPJ1BW5SG6 new file mode 100644 index 0000000..c641bf1 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/Symbols-9PHANA662J50AKDDU8SRE4Y2D.pcm-2D4OPJ1BW5SG6 differ diff --git a/build/Index.noindex/DataStore/v5/units/UniformTypeIdentifiers-5ZR71CNS0PF9KPP6CSDEK2SX4.pcm-1NU913WQ5YZ9U b/build/Index.noindex/DataStore/v5/units/UniformTypeIdentifiers-5ZR71CNS0PF9KPP6CSDEK2SX4.pcm-1NU913WQ5YZ9U new file mode 100644 index 0000000..fa8db29 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/UniformTypeIdentifiers-5ZR71CNS0PF9KPP6CSDEK2SX4.pcm-1NU913WQ5YZ9U differ diff --git a/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-2NV6Z6Z5M73X8 b/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-2NV6Z6Z5M73X8 new file mode 100644 index 0000000..f81066a Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-2NV6Z6Z5M73X8 differ diff --git a/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-2PNIPGI15HDCA b/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-2PNIPGI15HDCA new file mode 100644 index 0000000..ca53e25 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-2PNIPGI15HDCA differ diff --git a/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-3EHJAD13RYA3F b/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-3EHJAD13RYA3F new file mode 100644 index 0000000..2902454 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/arm64e-apple-macos.swiftinterface-3EHJAD13RYA3F differ diff --git a/build/Index.noindex/DataStore/v5/units/libkern-7N5WSDNOM8I5Q6ZE8VEO29KQF.pcm-2YL0IVSRF3EZG b/build/Index.noindex/DataStore/v5/units/libkern-7N5WSDNOM8I5Q6ZE8VEO29KQF.pcm-2YL0IVSRF3EZG new file mode 100644 index 0000000..11041d0 Binary files /dev/null and b/build/Index.noindex/DataStore/v5/units/libkern-7N5WSDNOM8I5Q6ZE8VEO29KQF.pcm-2YL0IVSRF3EZG differ diff --git a/build/Logs/Build/08CB705E-125D-48D6-8C79-FB565F97B588.xcactivitylog b/build/Logs/Build/08CB705E-125D-48D6-8C79-FB565F97B588.xcactivitylog deleted file mode 100644 index b4347ae..0000000 Binary files a/build/Logs/Build/08CB705E-125D-48D6-8C79-FB565F97B588.xcactivitylog and /dev/null differ diff --git a/build/Logs/Build/39117903-4ED2-4BF1-95E3-7389000741E2.xcactivitylog b/build/Logs/Build/39117903-4ED2-4BF1-95E3-7389000741E2.xcactivitylog new file mode 100644 index 0000000..8c0fbb2 Binary files /dev/null and b/build/Logs/Build/39117903-4ED2-4BF1-95E3-7389000741E2.xcactivitylog differ diff --git a/build/Logs/Build/3B6E84FF-4395-4A20-ADDB-2DB07ED1B469.xcactivitylog b/build/Logs/Build/3B6E84FF-4395-4A20-ADDB-2DB07ED1B469.xcactivitylog new file mode 100644 index 0000000..fae1996 Binary files /dev/null and b/build/Logs/Build/3B6E84FF-4395-4A20-ADDB-2DB07ED1B469.xcactivitylog differ diff --git a/build/Logs/Build/8641539F-A8EC-4383-99D4-D8C8CD6D1BB0.xcactivitylog b/build/Logs/Build/8641539F-A8EC-4383-99D4-D8C8CD6D1BB0.xcactivitylog new file mode 100644 index 0000000..a92d603 Binary files /dev/null and b/build/Logs/Build/8641539F-A8EC-4383-99D4-D8C8CD6D1BB0.xcactivitylog differ diff --git a/build/Logs/Build/8AB107D3-D873-4B3D-BC96-10C1959B79FA.xcactivitylog b/build/Logs/Build/8AB107D3-D873-4B3D-BC96-10C1959B79FA.xcactivitylog new file mode 100644 index 0000000..63e06cc Binary files /dev/null and b/build/Logs/Build/8AB107D3-D873-4B3D-BC96-10C1959B79FA.xcactivitylog differ diff --git a/build/Logs/Build/B9F5F819-D384-475A-819C-35E7A0465CFC.xcactivitylog b/build/Logs/Build/B9F5F819-D384-475A-819C-35E7A0465CFC.xcactivitylog new file mode 100644 index 0000000..6ca63f4 Binary files /dev/null and b/build/Logs/Build/B9F5F819-D384-475A-819C-35E7A0465CFC.xcactivitylog differ diff --git a/build/Logs/Build/C2E31441-8716-47C8-9C6B-5441C51C874B.xcactivitylog b/build/Logs/Build/C2E31441-8716-47C8-9C6B-5441C51C874B.xcactivitylog deleted file mode 100644 index 6b19b4c..0000000 Binary files a/build/Logs/Build/C2E31441-8716-47C8-9C6B-5441C51C874B.xcactivitylog and /dev/null differ diff --git a/build/Logs/Build/C4026A69-9D50-4418-9A98-64F9FB217636.xcactivitylog b/build/Logs/Build/C4026A69-9D50-4418-9A98-64F9FB217636.xcactivitylog deleted file mode 100644 index 906a776..0000000 Binary files a/build/Logs/Build/C4026A69-9D50-4418-9A98-64F9FB217636.xcactivitylog and /dev/null differ diff --git a/build/Logs/Build/D4B2064F-F2FB-4A50-851E-6D3CD05451D3.xcactivitylog b/build/Logs/Build/D4B2064F-F2FB-4A50-851E-6D3CD05451D3.xcactivitylog new file mode 100644 index 0000000..9939119 Binary files /dev/null and b/build/Logs/Build/D4B2064F-F2FB-4A50-851E-6D3CD05451D3.xcactivitylog differ diff --git a/build/Logs/Build/EAB55EAF-275B-48F7-94D6-360B15EFEA9F.xcactivitylog b/build/Logs/Build/EAB55EAF-275B-48F7-94D6-360B15EFEA9F.xcactivitylog deleted file mode 100644 index bf301af..0000000 Binary files a/build/Logs/Build/EAB55EAF-275B-48F7-94D6-360B15EFEA9F.xcactivitylog and /dev/null differ diff --git a/build/Logs/Build/LogStoreManifest.plist b/build/Logs/Build/LogStoreManifest.plist index 1a78d68..8a7d60c 100644 --- a/build/Logs/Build/LogStoreManifest.plist +++ b/build/Logs/Build/LogStoreManifest.plist @@ -6,7 +6,7 @@ 13 logs - 08CB705E-125D-48D6-8C79-FB565F97B588 + 39117903-4ED2-4BF1-95E3-7389000741E2 className IDECommandLineBuildLog @@ -15,7 +15,7 @@ domainType Xcode.IDEActivityLogDomainType.BuildLog fileName - 08CB705E-125D-48D6-8C79-FB565F97B588.xcactivitylog + 39117903-4ED2-4BF1-95E3-7389000741E2.xcactivitylog hasPrimaryLog primaryObservable @@ -40,15 +40,15 @@ signature Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug timeStartedRecording - 813858621.38476598 + 813860213.20873797 timeStoppedRecording - 813858633.31322706 + 813860220.64267504 title Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug uniqueIdentifier - 08CB705E-125D-48D6-8C79-FB565F97B588 + 39117903-4ED2-4BF1-95E3-7389000741E2 - C2E31441-8716-47C8-9C6B-5441C51C874B + 3B6E84FF-4395-4A20-ADDB-2DB07ED1B469 className IDECommandLineBuildLog @@ -57,7 +57,175 @@ domainType Xcode.IDEActivityLogDomainType.BuildLog fileName - C2E31441-8716-47C8-9C6B-5441C51C874B.xcactivitylog + 3B6E84FF-4395-4A20-ADDB-2DB07ED1B469.xcactivitylog + hasPrimaryLog + + primaryObservable + + highLevelStatus + S + totalNumberOfAnalyzerIssues + 0 + totalNumberOfErrors + 0 + totalNumberOfTestFailures + 0 + totalNumberOfWarnings + 0 + + schemeIdentifier-containerName + WorkbenchReplacement project + schemeIdentifier-schemeName + WorkbenchReplacement + schemeIdentifier-sharedScheme + 1 + signature + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + timeStartedRecording + 813860620.37516606 + timeStoppedRecording + 813860626.23837602 + title + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + uniqueIdentifier + 3B6E84FF-4395-4A20-ADDB-2DB07ED1B469 + + 8641539F-A8EC-4383-99D4-D8C8CD6D1BB0 + + className + IDECommandLineBuildLog + documentTypeString + <nil> + domainType + Xcode.IDEActivityLogDomainType.BuildLog + fileName + 8641539F-A8EC-4383-99D4-D8C8CD6D1BB0.xcactivitylog + hasPrimaryLog + + primaryObservable + + highLevelStatus + S + totalNumberOfAnalyzerIssues + 0 + totalNumberOfErrors + 0 + totalNumberOfTestFailures + 0 + totalNumberOfWarnings + 0 + + schemeIdentifier-containerName + WorkbenchReplacement project + schemeIdentifier-schemeName + WorkbenchReplacement + schemeIdentifier-sharedScheme + 1 + signature + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + timeStartedRecording + 813860633.59039497 + timeStoppedRecording + 813860633.89476001 + title + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + uniqueIdentifier + 8641539F-A8EC-4383-99D4-D8C8CD6D1BB0 + + 8AB107D3-D873-4B3D-BC96-10C1959B79FA + + className + IDECommandLineBuildLog + documentTypeString + <nil> + domainType + Xcode.IDEActivityLogDomainType.BuildLog + fileName + 8AB107D3-D873-4B3D-BC96-10C1959B79FA.xcactivitylog + hasPrimaryLog + + primaryObservable + + highLevelStatus + S + totalNumberOfAnalyzerIssues + 0 + totalNumberOfErrors + 0 + totalNumberOfTestFailures + 0 + totalNumberOfWarnings + 0 + + schemeIdentifier-containerName + WorkbenchReplacement project + schemeIdentifier-schemeName + WorkbenchReplacement + schemeIdentifier-sharedScheme + 1 + signature + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + timeStartedRecording + 813860067.35162795 + timeStoppedRecording + 813860073.60434604 + title + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + uniqueIdentifier + 8AB107D3-D873-4B3D-BC96-10C1959B79FA + + B9F5F819-D384-475A-819C-35E7A0465CFC + + className + IDECommandLineBuildLog + documentTypeString + <nil> + domainType + Xcode.IDEActivityLogDomainType.BuildLog + fileName + B9F5F819-D384-475A-819C-35E7A0465CFC.xcactivitylog + hasPrimaryLog + + primaryObservable + + highLevelStatus + S + totalNumberOfAnalyzerIssues + 0 + totalNumberOfErrors + 0 + totalNumberOfTestFailures + 0 + totalNumberOfWarnings + 0 + + schemeIdentifier-containerName + WorkbenchReplacement project + schemeIdentifier-schemeName + WorkbenchReplacement + schemeIdentifier-sharedScheme + 1 + signature + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + timeStartedRecording + 813860426.73277402 + timeStoppedRecording + 813860433.27968204 + title + Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug + uniqueIdentifier + B9F5F819-D384-475A-819C-35E7A0465CFC + + D4B2064F-F2FB-4A50-851E-6D3CD05451D3 + + className + IDECommandLineBuildLog + documentTypeString + <nil> + domainType + Xcode.IDEActivityLogDomainType.BuildLog + fileName + D4B2064F-F2FB-4A50-851E-6D3CD05451D3.xcactivitylog hasPrimaryLog primaryObservable @@ -71,7 +239,7 @@ totalNumberOfTestFailures 0 totalNumberOfWarnings - 3 + 1 schemeIdentifier-containerName WorkbenchReplacement project @@ -82,97 +250,13 @@ signature Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug timeStartedRecording - 813859080.25959396 + 813860350.04701102 timeStoppedRecording - 813859089.87704694 + 813860356.91845095 title Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug uniqueIdentifier - C2E31441-8716-47C8-9C6B-5441C51C874B - - C4026A69-9D50-4418-9A98-64F9FB217636 - - className - IDECommandLineBuildLog - documentTypeString - <nil> - domainType - Xcode.IDEActivityLogDomainType.BuildLog - fileName - C4026A69-9D50-4418-9A98-64F9FB217636.xcactivitylog - hasPrimaryLog - - primaryObservable - - highLevelStatus - S - totalNumberOfAnalyzerIssues - 0 - totalNumberOfErrors - 0 - totalNumberOfTestFailures - 0 - totalNumberOfWarnings - 0 - - schemeIdentifier-containerName - WorkbenchReplacement project - schemeIdentifier-schemeName - WorkbenchReplacement - schemeIdentifier-sharedScheme - 1 - signature - Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug - timeStartedRecording - 813859165.20980597 - timeStoppedRecording - 813859165.73095906 - title - Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug - uniqueIdentifier - C4026A69-9D50-4418-9A98-64F9FB217636 - - EAB55EAF-275B-48F7-94D6-360B15EFEA9F - - className - IDECommandLineBuildLog - documentTypeString - <nil> - domainType - Xcode.IDEActivityLogDomainType.BuildLog - fileName - EAB55EAF-275B-48F7-94D6-360B15EFEA9F.xcactivitylog - hasPrimaryLog - - primaryObservable - - highLevelStatus - S - totalNumberOfAnalyzerIssues - 0 - totalNumberOfErrors - 0 - totalNumberOfTestFailures - 0 - totalNumberOfWarnings - 0 - - schemeIdentifier-containerName - WorkbenchReplacement project - schemeIdentifier-schemeName - WorkbenchReplacement - schemeIdentifier-sharedScheme - 1 - signature - Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug - timeStartedRecording - 813858899.99901402 - timeStoppedRecording - 813858901.043365 - title - Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug - uniqueIdentifier - EAB55EAF-275B-48F7-94D6-360B15EFEA9F + D4B2064F-F2FB-4A50-851E-6D3CD05451D3 diff --git a/build/ModuleCache.noindex/29YH5DT344330/Accessibility-RCJSN2GG3RAR.pcm b/build/ModuleCache.noindex/29YH5DT344330/Accessibility-RCJSN2GG3RAR.pcm new file mode 100644 index 0000000..0dff377 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Accessibility-RCJSN2GG3RAR.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/AppKit-2VI8NB39I5AT6.pcm b/build/ModuleCache.noindex/29YH5DT344330/AppKit-2VI8NB39I5AT6.pcm new file mode 100644 index 0000000..18f8eef Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/AppKit-2VI8NB39I5AT6.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/ApplicationServices-3NXEUUZF9JJBD.pcm b/build/ModuleCache.noindex/29YH5DT344330/ApplicationServices-3NXEUUZF9JJBD.pcm new file mode 100644 index 0000000..df28d10 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/ApplicationServices-3NXEUUZF9JJBD.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CFNetwork-1PNPO1ORVQZLS.pcm b/build/ModuleCache.noindex/29YH5DT344330/CFNetwork-1PNPO1ORVQZLS.pcm new file mode 100644 index 0000000..79011ec Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CFNetwork-1PNPO1ORVQZLS.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CUPS-1HLHMKUB322XA.pcm b/build/ModuleCache.noindex/29YH5DT344330/CUPS-1HLHMKUB322XA.pcm new file mode 100644 index 0000000..0b00805 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CUPS-1HLHMKUB322XA.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/ColorSync-3EIM4S8RXNRVI.pcm b/build/ModuleCache.noindex/29YH5DT344330/ColorSync-3EIM4S8RXNRVI.pcm new file mode 100644 index 0000000..1157c2c Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/ColorSync-3EIM4S8RXNRVI.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CommonCrypto-3LRGWQZU0RAZJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/CommonCrypto-3LRGWQZU0RAZJ.pcm new file mode 100644 index 0000000..4110c99 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CommonCrypto-3LRGWQZU0RAZJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreAudio-J9DSWC1670R6.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreAudio-J9DSWC1670R6.pcm new file mode 100644 index 0000000..46b1038 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreAudio-J9DSWC1670R6.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreAudioTypes-11649WXSRCA0E.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreAudioTypes-11649WXSRCA0E.pcm new file mode 100644 index 0000000..68b0f0b Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreAudioTypes-11649WXSRCA0E.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreData-1KHK1L2CYC2N6.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreData-1KHK1L2CYC2N6.pcm new file mode 100644 index 0000000..aee15ef Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreData-1KHK1L2CYC2N6.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreFoundation-16SA8WK3L6MQN.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreFoundation-16SA8WK3L6MQN.pcm new file mode 100644 index 0000000..1c7fb15 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreFoundation-16SA8WK3L6MQN.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreGraphics-1PSDCAYCIV3T9.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreGraphics-1PSDCAYCIV3T9.pcm new file mode 100644 index 0000000..9cc2dd1 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreGraphics-1PSDCAYCIV3T9.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreImage-39ZO87840M5PP.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreImage-39ZO87840M5PP.pcm new file mode 100644 index 0000000..60da9ad Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreImage-39ZO87840M5PP.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreMedia-SHYM2JB41P4U.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreMedia-SHYM2JB41P4U.pcm new file mode 100644 index 0000000..0b5d6d7 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreMedia-SHYM2JB41P4U.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreServices-39NCTJOEW7PQ2.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreServices-39NCTJOEW7PQ2.pcm new file mode 100644 index 0000000..2b68616 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreServices-39NCTJOEW7PQ2.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreText-3FAL1B4J38DIR.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreText-3FAL1B4J38DIR.pcm new file mode 100644 index 0000000..1339719 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreText-3FAL1B4J38DIR.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreTransferable-27T896KGHFB3R.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreTransferable-27T896KGHFB3R.pcm new file mode 100644 index 0000000..1ff83f3 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreTransferable-27T896KGHFB3R.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/CoreVideo-DBBGB2LXU3HG.pcm b/build/ModuleCache.noindex/29YH5DT344330/CoreVideo-DBBGB2LXU3HG.pcm new file mode 100644 index 0000000..2a2234c Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/CoreVideo-DBBGB2LXU3HG.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Darwin-1FXX23EKWOBA9.pcm b/build/ModuleCache.noindex/29YH5DT344330/Darwin-1FXX23EKWOBA9.pcm new file mode 100644 index 0000000..c9d4742 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Darwin-1FXX23EKWOBA9.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/DataDetection-R5W4QHNMPWVH.pcm b/build/ModuleCache.noindex/29YH5DT344330/DataDetection-R5W4QHNMPWVH.pcm new file mode 100644 index 0000000..c1305b5 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/DataDetection-R5W4QHNMPWVH.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/DeveloperToolsSupport-3SUCMSK9ZS2JA.pcm b/build/ModuleCache.noindex/29YH5DT344330/DeveloperToolsSupport-3SUCMSK9ZS2JA.pcm new file mode 100644 index 0000000..6566979 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/DeveloperToolsSupport-3SUCMSK9ZS2JA.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/DiskArbitration-3LBJF5I58QD8.pcm b/build/ModuleCache.noindex/29YH5DT344330/DiskArbitration-3LBJF5I58QD8.pcm new file mode 100644 index 0000000..92208e0 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/DiskArbitration-3LBJF5I58QD8.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Dispatch-R76HXUP80TVL.pcm b/build/ModuleCache.noindex/29YH5DT344330/Dispatch-R76HXUP80TVL.pcm new file mode 100644 index 0000000..5b63ba1 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Dispatch-R76HXUP80TVL.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Foundation-24LYWIP48SHNP.pcm b/build/ModuleCache.noindex/29YH5DT344330/Foundation-24LYWIP48SHNP.pcm new file mode 100644 index 0000000..93abc88 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Foundation-24LYWIP48SHNP.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/IOKit-1IAL9NTK1TABA.pcm b/build/ModuleCache.noindex/29YH5DT344330/IOKit-1IAL9NTK1TABA.pcm new file mode 100644 index 0000000..5dd9b59 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/IOKit-1IAL9NTK1TABA.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/IOSurface-26455DPS9NDS0.pcm b/build/ModuleCache.noindex/29YH5DT344330/IOSurface-26455DPS9NDS0.pcm new file mode 100644 index 0000000..f6367f8 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/IOSurface-26455DPS9NDS0.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/ImageIO-2ZSF831VT29UB.pcm b/build/ModuleCache.noindex/29YH5DT344330/ImageIO-2ZSF831VT29UB.pcm new file mode 100644 index 0000000..2f7a3ff Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/ImageIO-2ZSF831VT29UB.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/MachO-20RPYVQSX341K.pcm b/build/ModuleCache.noindex/29YH5DT344330/MachO-20RPYVQSX341K.pcm new file mode 100644 index 0000000..17babfd Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/MachO-20RPYVQSX341K.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Metal-1GCZV9N85NJOH.pcm b/build/ModuleCache.noindex/29YH5DT344330/Metal-1GCZV9N85NJOH.pcm new file mode 100644 index 0000000..7f6bebb Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Metal-1GCZV9N85NJOH.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/OSLog-218FBXNFJGY61.pcm b/build/ModuleCache.noindex/29YH5DT344330/OSLog-218FBXNFJGY61.pcm new file mode 100644 index 0000000..4bbb38b Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/OSLog-218FBXNFJGY61.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/ObjectiveC-1G8H182PQX3QE.pcm b/build/ModuleCache.noindex/29YH5DT344330/ObjectiveC-1G8H182PQX3QE.pcm new file mode 100644 index 0000000..7e00b9c Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/ObjectiveC-1G8H182PQX3QE.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/OpenGL-H89XJT7GTCP.pcm b/build/ModuleCache.noindex/29YH5DT344330/OpenGL-H89XJT7GTCP.pcm new file mode 100644 index 0000000..d95140d Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/OpenGL-H89XJT7GTCP.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/QuartzCore-39A8LQKF980J1.pcm b/build/ModuleCache.noindex/29YH5DT344330/QuartzCore-39A8LQKF980J1.pcm new file mode 100644 index 0000000..d87a15a Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/QuartzCore-39A8LQKF980J1.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Security-3QCVXOV25KK54.pcm b/build/ModuleCache.noindex/29YH5DT344330/Security-3QCVXOV25KK54.pcm new file mode 100644 index 0000000..4943b5c Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Security-3QCVXOV25KK54.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Spatial-1JZLH83HN83CS.pcm b/build/ModuleCache.noindex/29YH5DT344330/Spatial-1JZLH83HN83CS.pcm new file mode 100644 index 0000000..cef0d9f Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Spatial-1JZLH83HN83CS.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/SwiftShims-2IMTS4WWRU7VJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/SwiftShims-2IMTS4WWRU7VJ.pcm new file mode 100644 index 0000000..0fb5b19 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/SwiftShims-2IMTS4WWRU7VJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/SwiftUI-3DCHKT5UWXXCX.pcm b/build/ModuleCache.noindex/29YH5DT344330/SwiftUI-3DCHKT5UWXXCX.pcm new file mode 100644 index 0000000..ecc56b2 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/SwiftUI-3DCHKT5UWXXCX.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/SwiftUICore-86HIVXUC6WOA.pcm b/build/ModuleCache.noindex/29YH5DT344330/SwiftUICore-86HIVXUC6WOA.pcm new file mode 100644 index 0000000..af09e6a Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/SwiftUICore-86HIVXUC6WOA.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/Symbols-3KC1789KJFX94.pcm b/build/ModuleCache.noindex/29YH5DT344330/Symbols-3KC1789KJFX94.pcm new file mode 100644 index 0000000..dc6de73 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/Symbols-3KC1789KJFX94.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/UniformTypeIdentifiers-1OLJP4K3PLM48.pcm b/build/ModuleCache.noindex/29YH5DT344330/UniformTypeIdentifiers-1OLJP4K3PLM48.pcm new file mode 100644 index 0000000..e71bee5 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/UniformTypeIdentifiers-1OLJP4K3PLM48.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/XPC-T0ZXCAST7PE3.pcm b/build/ModuleCache.noindex/29YH5DT344330/XPC-T0ZXCAST7PE3.pcm new file mode 100644 index 0000000..36da8da Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/XPC-T0ZXCAST7PE3.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_AvailabilityInternal-2YSBQADOLX02V.pcm b/build/ModuleCache.noindex/29YH5DT344330/_AvailabilityInternal-2YSBQADOLX02V.pcm new file mode 100644 index 0000000..c3360b1 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_AvailabilityInternal-2YSBQADOLX02V.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_float-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_float-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..a3d169c Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_float-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_intrinsics-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_intrinsics-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..07dd596 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_intrinsics-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_inttypes-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_inttypes-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..035aebd Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_inttypes-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_limits-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_limits-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..89d970a Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_limits-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdarg-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdarg-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..3a18ddc Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdarg-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdatomic-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdatomic-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..e0865e3 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdatomic-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdbool-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdbool-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..54e35e4 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdbool-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stddef-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stddef-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..2633d85 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stddef-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdint-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdint-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..1d5d064 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_stdint-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_Builtin_tgmath-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_tgmath-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..f6606ea Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_Builtin_tgmath-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation1-2YSBQADOLX02V.pcm b/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation1-2YSBQADOLX02V.pcm new file mode 100644 index 0000000..1c03574 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation1-2YSBQADOLX02V.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation2-3J4ZFA06I5V1P.pcm b/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation2-3J4ZFA06I5V1P.pcm new file mode 100644 index 0000000..a03d457 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation2-3J4ZFA06I5V1P.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation3-2NSGASPTSNBVQ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation3-2NSGASPTSNBVQ.pcm new file mode 100644 index 0000000..3f83827 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_DarwinFoundation3-2NSGASPTSNBVQ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/_SwiftConcurrencyShims-2IMTS4WWRU7VJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/_SwiftConcurrencyShims-2IMTS4WWRU7VJ.pcm new file mode 100644 index 0000000..591b073 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/_SwiftConcurrencyShims-2IMTS4WWRU7VJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/launch-3T3BU4MASLMUM.pcm b/build/ModuleCache.noindex/29YH5DT344330/launch-3T3BU4MASLMUM.pcm new file mode 100644 index 0000000..af77d37 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/launch-3T3BU4MASLMUM.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/libDER-26DYHF6GC6WWA.pcm b/build/ModuleCache.noindex/29YH5DT344330/libDER-26DYHF6GC6WWA.pcm new file mode 100644 index 0000000..75a1e6c Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/libDER-26DYHF6GC6WWA.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/libkern-2KQ0X67RTM1JF.pcm b/build/ModuleCache.noindex/29YH5DT344330/libkern-2KQ0X67RTM1JF.pcm new file mode 100644 index 0000000..4a4e916 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/libkern-2KQ0X67RTM1JF.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/os-2MV8OP7R98AN8.pcm b/build/ModuleCache.noindex/29YH5DT344330/os-2MV8OP7R98AN8.pcm new file mode 100644 index 0000000..33e06c7 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/os-2MV8OP7R98AN8.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/os_object-2MV8OP7R98AN8.pcm b/build/ModuleCache.noindex/29YH5DT344330/os_object-2MV8OP7R98AN8.pcm new file mode 100644 index 0000000..3f016ef Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/os_object-2MV8OP7R98AN8.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/os_workgroup-2MV8OP7R98AN8.pcm b/build/ModuleCache.noindex/29YH5DT344330/os_workgroup-2MV8OP7R98AN8.pcm new file mode 100644 index 0000000..f0adba7 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/os_workgroup-2MV8OP7R98AN8.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/ptrauth-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/ptrauth-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..8cd73c3 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/ptrauth-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/ptrcheck-2OQWMRBVRD4OJ.pcm b/build/ModuleCache.noindex/29YH5DT344330/ptrcheck-2OQWMRBVRD4OJ.pcm new file mode 100644 index 0000000..564b594 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/ptrcheck-2OQWMRBVRD4OJ.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/simd-KY25Q80SBOHY.pcm b/build/ModuleCache.noindex/29YH5DT344330/simd-KY25Q80SBOHY.pcm new file mode 100644 index 0000000..d134723 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/simd-KY25Q80SBOHY.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/string_h-47SZ9A199RUD.pcm b/build/ModuleCache.noindex/29YH5DT344330/string_h-47SZ9A199RUD.pcm new file mode 100644 index 0000000..c652ad3 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/string_h-47SZ9A199RUD.pcm differ diff --git a/build/ModuleCache.noindex/29YH5DT344330/sys_types-3J4ZFA06I5V1P.pcm b/build/ModuleCache.noindex/29YH5DT344330/sys_types-3J4ZFA06I5V1P.pcm new file mode 100644 index 0000000..4863710 Binary files /dev/null and b/build/ModuleCache.noindex/29YH5DT344330/sys_types-3J4ZFA06I5V1P.pcm differ diff --git a/build/ModuleCache.noindex/Session.modulevalidation b/build/ModuleCache.noindex/Session.modulevalidation index f9b3710..473413d 100644 --- a/build/ModuleCache.noindex/Session.modulevalidation +++ b/build/ModuleCache.noindex/Session.modulevalidation @@ -1 +1 @@ -1792166365.5126538: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex") +1792167833.8494911: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex") diff --git a/build/SDKExplicitPrecompiledModules/Accessibility-ASNNI3TMR2IM9NIM218I0Y52F.pcm b/build/SDKExplicitPrecompiledModules/Accessibility-ASNNI3TMR2IM9NIM218I0Y52F.pcm new file mode 100644 index 0000000..3cfa0a7 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Accessibility-ASNNI3TMR2IM9NIM218I0Y52F.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/AppKit-3QOQFDKCPOLCN.swiftmodule b/build/SDKExplicitPrecompiledModules/AppKit-3QOQFDKCPOLCN.swiftmodule new file mode 100644 index 0000000..e1837c3 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/AppKit-3QOQFDKCPOLCN.swiftmodule differ diff --git a/build/SDKExplicitPrecompiledModules/AppKit-EWGFAC6RV8J9T1SDXIJHVAS1C.pcm b/build/SDKExplicitPrecompiledModules/AppKit-EWGFAC6RV8J9T1SDXIJHVAS1C.pcm new file mode 100644 index 0000000..2154eb3 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/AppKit-EWGFAC6RV8J9T1SDXIJHVAS1C.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/ApplicationServices-AJMG69FF7881EKQ53OMB3KM51.pcm b/build/SDKExplicitPrecompiledModules/ApplicationServices-AJMG69FF7881EKQ53OMB3KM51.pcm new file mode 100644 index 0000000..b35b21e Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/ApplicationServices-AJMG69FF7881EKQ53OMB3KM51.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CFNetwork-5BEJILXA6MXRBBDSDH0A1GS79.pcm b/build/SDKExplicitPrecompiledModules/CFNetwork-5BEJILXA6MXRBBDSDH0A1GS79.pcm new file mode 100644 index 0000000..677b100 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CFNetwork-5BEJILXA6MXRBBDSDH0A1GS79.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CUPS-5V3VENVZEIISRDQZOJ8X7U4UK.pcm b/build/SDKExplicitPrecompiledModules/CUPS-5V3VENVZEIISRDQZOJ8X7U4UK.pcm new file mode 100644 index 0000000..feb9a94 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CUPS-5V3VENVZEIISRDQZOJ8X7U4UK.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/ColorSync-86O0RDEHR5E13IKHOZ123WI8K.pcm b/build/SDKExplicitPrecompiledModules/ColorSync-86O0RDEHR5E13IKHOZ123WI8K.pcm new file mode 100644 index 0000000..3463321 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/ColorSync-86O0RDEHR5E13IKHOZ123WI8K.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CommonCrypto-CKQUOG7PBKMM0XSKXD1RP1Q0D.pcm b/build/SDKExplicitPrecompiledModules/CommonCrypto-CKQUOG7PBKMM0XSKXD1RP1Q0D.pcm new file mode 100644 index 0000000..be34bb9 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CommonCrypto-CKQUOG7PBKMM0XSKXD1RP1Q0D.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreAudio-9D9P6F1O7QCF8SH79FQT824I4.pcm b/build/SDKExplicitPrecompiledModules/CoreAudio-9D9P6F1O7QCF8SH79FQT824I4.pcm new file mode 100644 index 0000000..66d1011 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreAudio-9D9P6F1O7QCF8SH79FQT824I4.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreAudioTypes-9H2AUQMRF8JGW3PSO5TXE6RMK.pcm b/build/SDKExplicitPrecompiledModules/CoreAudioTypes-9H2AUQMRF8JGW3PSO5TXE6RMK.pcm new file mode 100644 index 0000000..70837df Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreAudioTypes-9H2AUQMRF8JGW3PSO5TXE6RMK.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreData-4Y4ID3RTHDXNE068ATT9ENQ3D.pcm b/build/SDKExplicitPrecompiledModules/CoreData-4Y4ID3RTHDXNE068ATT9ENQ3D.pcm new file mode 100644 index 0000000..fec2c1e Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreData-4Y4ID3RTHDXNE068ATT9ENQ3D.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreFoundation-1NTYTHJS7OAK5NYPHEKQ9BQ59.pcm b/build/SDKExplicitPrecompiledModules/CoreFoundation-1NTYTHJS7OAK5NYPHEKQ9BQ59.pcm new file mode 100644 index 0000000..000670c Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreFoundation-1NTYTHJS7OAK5NYPHEKQ9BQ59.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreGraphics-6WJSR7D7PXLUOD6CSZ9SJXMAC.pcm b/build/SDKExplicitPrecompiledModules/CoreGraphics-6WJSR7D7PXLUOD6CSZ9SJXMAC.pcm new file mode 100644 index 0000000..3500ad4 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreGraphics-6WJSR7D7PXLUOD6CSZ9SJXMAC.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreImage-4A1SLAR6CN2T7X8G6HRUOPZYS.pcm b/build/SDKExplicitPrecompiledModules/CoreImage-4A1SLAR6CN2T7X8G6HRUOPZYS.pcm new file mode 100644 index 0000000..0caa327 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreImage-4A1SLAR6CN2T7X8G6HRUOPZYS.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreMedia-1Y1AEXJX64VIXDTC770AV0E05.pcm b/build/SDKExplicitPrecompiledModules/CoreMedia-1Y1AEXJX64VIXDTC770AV0E05.pcm new file mode 100644 index 0000000..fc43f20 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreMedia-1Y1AEXJX64VIXDTC770AV0E05.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreServices-2GO2V3OKUURAD5E57T5R117ZK.pcm b/build/SDKExplicitPrecompiledModules/CoreServices-2GO2V3OKUURAD5E57T5R117ZK.pcm new file mode 100644 index 0000000..13f2090 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreServices-2GO2V3OKUURAD5E57T5R117ZK.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreText-BAHRHM8AQU38872K1WZH0HK9R.pcm b/build/SDKExplicitPrecompiledModules/CoreText-BAHRHM8AQU38872K1WZH0HK9R.pcm new file mode 100644 index 0000000..acfe81b Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreText-BAHRHM8AQU38872K1WZH0HK9R.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreTransferable-4832IXSG3B7CT39Q85HFB6MXY.pcm b/build/SDKExplicitPrecompiledModules/CoreTransferable-4832IXSG3B7CT39Q85HFB6MXY.pcm new file mode 100644 index 0000000..032654c Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreTransferable-4832IXSG3B7CT39Q85HFB6MXY.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/CoreVideo-40YE2Y1G77H8LV8428GL1Z6BW.pcm b/build/SDKExplicitPrecompiledModules/CoreVideo-40YE2Y1G77H8LV8428GL1Z6BW.pcm new file mode 100644 index 0000000..6d0930c Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/CoreVideo-40YE2Y1G77H8LV8428GL1Z6BW.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Darwin-AQR6ZZ2LM94Q8TDDUC9TWZZAH.pcm b/build/SDKExplicitPrecompiledModules/Darwin-AQR6ZZ2LM94Q8TDDUC9TWZZAH.pcm new file mode 100644 index 0000000..bb475d4 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Darwin-AQR6ZZ2LM94Q8TDDUC9TWZZAH.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/DataDetection-5BI2PTSBRYOG29RDZUQ3SN5JV.pcm b/build/SDKExplicitPrecompiledModules/DataDetection-5BI2PTSBRYOG29RDZUQ3SN5JV.pcm new file mode 100644 index 0000000..dda4c3f Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/DataDetection-5BI2PTSBRYOG29RDZUQ3SN5JV.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/DeveloperToolsSupport-38DNZHCSRBZTDOE77ZG35MKV6.pcm b/build/SDKExplicitPrecompiledModules/DeveloperToolsSupport-38DNZHCSRBZTDOE77ZG35MKV6.pcm new file mode 100644 index 0000000..541e086 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/DeveloperToolsSupport-38DNZHCSRBZTDOE77ZG35MKV6.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/DiskArbitration-1AIBC221LG47QC52U5QC66J34.pcm b/build/SDKExplicitPrecompiledModules/DiskArbitration-1AIBC221LG47QC52U5QC66J34.pcm new file mode 100644 index 0000000..7ee0ecb Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/DiskArbitration-1AIBC221LG47QC52U5QC66J34.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Dispatch-DDG1EKPQ1E45RZ5SBNB0VW5N9.pcm b/build/SDKExplicitPrecompiledModules/Dispatch-DDG1EKPQ1E45RZ5SBNB0VW5N9.pcm new file mode 100644 index 0000000..bb3ccd7 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Dispatch-DDG1EKPQ1E45RZ5SBNB0VW5N9.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Foundation-6GO07KRBNSRK6728TQG3JGFCL.pcm b/build/SDKExplicitPrecompiledModules/Foundation-6GO07KRBNSRK6728TQG3JGFCL.pcm new file mode 100644 index 0000000..110e459 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Foundation-6GO07KRBNSRK6728TQG3JGFCL.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/IOKit-F0A1QRG87COVAGO7CJ00NETNL.pcm b/build/SDKExplicitPrecompiledModules/IOKit-F0A1QRG87COVAGO7CJ00NETNL.pcm new file mode 100644 index 0000000..ad6b09d Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/IOKit-F0A1QRG87COVAGO7CJ00NETNL.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/IOSurface-E66LDQOEDWP0CX5PD5R57XIF.pcm b/build/SDKExplicitPrecompiledModules/IOSurface-E66LDQOEDWP0CX5PD5R57XIF.pcm new file mode 100644 index 0000000..0d788af Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/IOSurface-E66LDQOEDWP0CX5PD5R57XIF.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/ImageIO-81KVIPWXY6WCBO0OWZXRVX0A.pcm b/build/SDKExplicitPrecompiledModules/ImageIO-81KVIPWXY6WCBO0OWZXRVX0A.pcm new file mode 100644 index 0000000..daa76b8 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/ImageIO-81KVIPWXY6WCBO0OWZXRVX0A.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/MachO-5CLDJQ95VEFX6KT14V0IVBBUG.pcm b/build/SDKExplicitPrecompiledModules/MachO-5CLDJQ95VEFX6KT14V0IVBBUG.pcm new file mode 100644 index 0000000..1bae0c3 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/MachO-5CLDJQ95VEFX6KT14V0IVBBUG.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Metal-B0EP2QDXGOF3DMGDD8DGPWF0B.pcm b/build/SDKExplicitPrecompiledModules/Metal-B0EP2QDXGOF3DMGDD8DGPWF0B.pcm new file mode 100644 index 0000000..dfd2941 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Metal-B0EP2QDXGOF3DMGDD8DGPWF0B.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/OSLog-8LHJMHE8RFZAFCQUYXYA92E48.pcm b/build/SDKExplicitPrecompiledModules/OSLog-8LHJMHE8RFZAFCQUYXYA92E48.pcm new file mode 100644 index 0000000..4d52643 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/OSLog-8LHJMHE8RFZAFCQUYXYA92E48.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/ObjectiveC-8Q042I5TD0JQK3465YUFP3J2T.pcm b/build/SDKExplicitPrecompiledModules/ObjectiveC-8Q042I5TD0JQK3465YUFP3J2T.pcm new file mode 100644 index 0000000..36cf3f9 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/ObjectiveC-8Q042I5TD0JQK3465YUFP3J2T.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/OpenGL-8USBBBWBY9T1IO3YV7O0F1L8P.pcm b/build/SDKExplicitPrecompiledModules/OpenGL-8USBBBWBY9T1IO3YV7O0F1L8P.pcm new file mode 100644 index 0000000..9b870d2 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/OpenGL-8USBBBWBY9T1IO3YV7O0F1L8P.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/QuartzCore-2YEP6R8KIZQ9CSNM4MU59HNDR.pcm b/build/SDKExplicitPrecompiledModules/QuartzCore-2YEP6R8KIZQ9CSNM4MU59HNDR.pcm new file mode 100644 index 0000000..5b7ab31 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/QuartzCore-2YEP6R8KIZQ9CSNM4MU59HNDR.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Security-ABBWLV7X4KAYD02K08XSLQK8V.pcm b/build/SDKExplicitPrecompiledModules/Security-ABBWLV7X4KAYD02K08XSLQK8V.pcm new file mode 100644 index 0000000..89c0205 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Security-ABBWLV7X4KAYD02K08XSLQK8V.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Spatial-2PUFQ7YULET0E3X9PL5QIBS9B.pcm b/build/SDKExplicitPrecompiledModules/Spatial-2PUFQ7YULET0E3X9PL5QIBS9B.pcm new file mode 100644 index 0000000..f410568 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Spatial-2PUFQ7YULET0E3X9PL5QIBS9B.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/SwiftShims-9ENJL7HDKTWAAQDBBKKA6SGZB.pcm b/build/SDKExplicitPrecompiledModules/SwiftShims-9ENJL7HDKTWAAQDBBKKA6SGZB.pcm new file mode 100644 index 0000000..d3ff246 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/SwiftShims-9ENJL7HDKTWAAQDBBKKA6SGZB.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/SwiftUI-1WNRVVZ2Z3C6L.swiftmodule b/build/SDKExplicitPrecompiledModules/SwiftUI-1WNRVVZ2Z3C6L.swiftmodule new file mode 100644 index 0000000..ac71b9f Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/SwiftUI-1WNRVVZ2Z3C6L.swiftmodule differ diff --git a/build/SDKExplicitPrecompiledModules/SwiftUI-4ZGUALNQGYZZKWMF72MZBIOMB.pcm b/build/SDKExplicitPrecompiledModules/SwiftUI-4ZGUALNQGYZZKWMF72MZBIOMB.pcm new file mode 100644 index 0000000..11dbf02 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/SwiftUI-4ZGUALNQGYZZKWMF72MZBIOMB.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/SwiftUICore-1DSK7EM8KPQNC.swiftmodule b/build/SDKExplicitPrecompiledModules/SwiftUICore-1DSK7EM8KPQNC.swiftmodule new file mode 100644 index 0000000..98b1d02 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/SwiftUICore-1DSK7EM8KPQNC.swiftmodule differ diff --git a/build/SDKExplicitPrecompiledModules/SwiftUICore-9U1J2LF54QXU0M2M8127VPJU9.pcm b/build/SDKExplicitPrecompiledModules/SwiftUICore-9U1J2LF54QXU0M2M8127VPJU9.pcm new file mode 100644 index 0000000..8493e86 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/SwiftUICore-9U1J2LF54QXU0M2M8127VPJU9.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/Symbols-4JDS3K9BLWARMS93BFZB66GIJ.pcm b/build/SDKExplicitPrecompiledModules/Symbols-4JDS3K9BLWARMS93BFZB66GIJ.pcm new file mode 100644 index 0000000..4aa955e Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/Symbols-4JDS3K9BLWARMS93BFZB66GIJ.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/UniformTypeIdentifiers-7RMXHF8RRBORWMEBW93KAMD5R.pcm b/build/SDKExplicitPrecompiledModules/UniformTypeIdentifiers-7RMXHF8RRBORWMEBW93KAMD5R.pcm new file mode 100644 index 0000000..15482f6 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/UniformTypeIdentifiers-7RMXHF8RRBORWMEBW93KAMD5R.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/XPC-6LKD46ABLJ6TGZCK37TOP2QMP.pcm b/build/SDKExplicitPrecompiledModules/XPC-6LKD46ABLJ6TGZCK37TOP2QMP.pcm new file mode 100644 index 0000000..17383ff Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/XPC-6LKD46ABLJ6TGZCK37TOP2QMP.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_AvailabilityInternal-9QA2V1C9KGCSP4Z9C6B7DZ0IZ.pcm b/build/SDKExplicitPrecompiledModules/_AvailabilityInternal-9QA2V1C9KGCSP4Z9C6B7DZ0IZ.pcm new file mode 100644 index 0000000..250a17b Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_AvailabilityInternal-9QA2V1C9KGCSP4Z9C6B7DZ0IZ.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_float-4ASMFUP7AXVNKHLJV5YWHN19G.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_float-4ASMFUP7AXVNKHLJV5YWHN19G.pcm new file mode 100644 index 0000000..9ff0de4 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_float-4ASMFUP7AXVNKHLJV5YWHN19G.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_intrinsics-AF8C3GF56QI7DJC94YARDR69C.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_intrinsics-AF8C3GF56QI7DJC94YARDR69C.pcm new file mode 100644 index 0000000..abd48bb Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_intrinsics-AF8C3GF56QI7DJC94YARDR69C.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_inttypes-YL7YXNNMPIULGJRR0CDZPEVJ.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_inttypes-YL7YXNNMPIULGJRR0CDZPEVJ.pcm new file mode 100644 index 0000000..94edb43 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_inttypes-YL7YXNNMPIULGJRR0CDZPEVJ.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_limits-AR6QXCFY0A5P472HYE1S4602K.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_limits-AR6QXCFY0A5P472HYE1S4602K.pcm new file mode 100644 index 0000000..9a03c28 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_limits-AR6QXCFY0A5P472HYE1S4602K.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_stdarg-5BIPYYLDJ0CTIRJXU4FDADI8P.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_stdarg-5BIPYYLDJ0CTIRJXU4FDADI8P.pcm new file mode 100644 index 0000000..62fa9b4 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_stdarg-5BIPYYLDJ0CTIRJXU4FDADI8P.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_stdatomic-4DTUUTY76WGP7WBE90BZAZ23X.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_stdatomic-4DTUUTY76WGP7WBE90BZAZ23X.pcm new file mode 100644 index 0000000..b533212 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_stdatomic-4DTUUTY76WGP7WBE90BZAZ23X.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_stdbool-9NG47OUHQC2O9NXDOMTSV5JTT.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_stdbool-9NG47OUHQC2O9NXDOMTSV5JTT.pcm new file mode 100644 index 0000000..893af77 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_stdbool-9NG47OUHQC2O9NXDOMTSV5JTT.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_stddef-3C3UJ6YB2ZXN3UVG1641KKD31.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_stddef-3C3UJ6YB2ZXN3UVG1641KKD31.pcm new file mode 100644 index 0000000..57839ce Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_stddef-3C3UJ6YB2ZXN3UVG1641KKD31.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_stdint-1IMDAW9OT82FGBG4GSCA926QI.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_stdint-1IMDAW9OT82FGBG4GSCA926QI.pcm new file mode 100644 index 0000000..780a231 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_stdint-1IMDAW9OT82FGBG4GSCA926QI.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_Builtin_tgmath-BBX20IF78HPGI84Y6B4Q00R20.pcm b/build/SDKExplicitPrecompiledModules/_Builtin_tgmath-BBX20IF78HPGI84Y6B4Q00R20.pcm new file mode 100644 index 0000000..4fe83ad Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_Builtin_tgmath-BBX20IF78HPGI84Y6B4Q00R20.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_DarwinFoundation1-8S33MTTRX312NGLCPRANIRPDM.pcm b/build/SDKExplicitPrecompiledModules/_DarwinFoundation1-8S33MTTRX312NGLCPRANIRPDM.pcm new file mode 100644 index 0000000..7516a23 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_DarwinFoundation1-8S33MTTRX312NGLCPRANIRPDM.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_DarwinFoundation2-D6CF3BRFNQBHA99CXWRFIBICE.pcm b/build/SDKExplicitPrecompiledModules/_DarwinFoundation2-D6CF3BRFNQBHA99CXWRFIBICE.pcm new file mode 100644 index 0000000..9b75544 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_DarwinFoundation2-D6CF3BRFNQBHA99CXWRFIBICE.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_DarwinFoundation3-21HNZN9YJIMKT4W2G1LA8QDRQ.pcm b/build/SDKExplicitPrecompiledModules/_DarwinFoundation3-21HNZN9YJIMKT4W2G1LA8QDRQ.pcm new file mode 100644 index 0000000..7dc461a Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_DarwinFoundation3-21HNZN9YJIMKT4W2G1LA8QDRQ.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/_SwiftConcurrencyShims-CHPJC036P53A4LNI24Z5JCXT0.pcm b/build/SDKExplicitPrecompiledModules/_SwiftConcurrencyShims-CHPJC036P53A4LNI24Z5JCXT0.pcm new file mode 100644 index 0000000..4db5339 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/_SwiftConcurrencyShims-CHPJC036P53A4LNI24Z5JCXT0.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/launch-8IAW0N5OSNOIJ5HRBCY0LI2WA.pcm b/build/SDKExplicitPrecompiledModules/launch-8IAW0N5OSNOIJ5HRBCY0LI2WA.pcm new file mode 100644 index 0000000..13361e1 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/launch-8IAW0N5OSNOIJ5HRBCY0LI2WA.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/libDER-82OC4HVWX9ITLOIPLGZDWN46Y.pcm b/build/SDKExplicitPrecompiledModules/libDER-82OC4HVWX9ITLOIPLGZDWN46Y.pcm new file mode 100644 index 0000000..b711413 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/libDER-82OC4HVWX9ITLOIPLGZDWN46Y.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/libkern-80IGW9AFZR6F6DX4XNGV08VWB.pcm b/build/SDKExplicitPrecompiledModules/libkern-80IGW9AFZR6F6DX4XNGV08VWB.pcm new file mode 100644 index 0000000..d7cdc46 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/libkern-80IGW9AFZR6F6DX4XNGV08VWB.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/os-EXT4RAYO41Y07MU8SG1OBMXYV.pcm b/build/SDKExplicitPrecompiledModules/os-EXT4RAYO41Y07MU8SG1OBMXYV.pcm new file mode 100644 index 0000000..a10992a Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/os-EXT4RAYO41Y07MU8SG1OBMXYV.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/os_object-CMICY631VMWE5OHI0QQ2L2DDT.pcm b/build/SDKExplicitPrecompiledModules/os_object-CMICY631VMWE5OHI0QQ2L2DDT.pcm new file mode 100644 index 0000000..ddfd114 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/os_object-CMICY631VMWE5OHI0QQ2L2DDT.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/os_workgroup-9CI27Q7KR99HFC7RC67YBJ9O9.pcm b/build/SDKExplicitPrecompiledModules/os_workgroup-9CI27Q7KR99HFC7RC67YBJ9O9.pcm new file mode 100644 index 0000000..b45bcb2 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/os_workgroup-9CI27Q7KR99HFC7RC67YBJ9O9.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/ptrauth-EF3UYD19HEKZ7BX6GCQO1ZBXR.pcm b/build/SDKExplicitPrecompiledModules/ptrauth-EF3UYD19HEKZ7BX6GCQO1ZBXR.pcm new file mode 100644 index 0000000..e1638b9 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/ptrauth-EF3UYD19HEKZ7BX6GCQO1ZBXR.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/ptrcheck-879ZFRTEOB2W3IQ6103Z6PAOE.pcm b/build/SDKExplicitPrecompiledModules/ptrcheck-879ZFRTEOB2W3IQ6103Z6PAOE.pcm new file mode 100644 index 0000000..d17ef45 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/ptrcheck-879ZFRTEOB2W3IQ6103Z6PAOE.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/simd-2XHHPKAOQG8BDY3U1SNUUYD6F.pcm b/build/SDKExplicitPrecompiledModules/simd-2XHHPKAOQG8BDY3U1SNUUYD6F.pcm new file mode 100644 index 0000000..249cadd Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/simd-2XHHPKAOQG8BDY3U1SNUUYD6F.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/string_h-DI7D30FYE3JWRB8KU3YNBPR4X.pcm b/build/SDKExplicitPrecompiledModules/string_h-DI7D30FYE3JWRB8KU3YNBPR4X.pcm new file mode 100644 index 0000000..f304263 Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/string_h-DI7D30FYE3JWRB8KU3YNBPR4X.pcm differ diff --git a/build/SDKExplicitPrecompiledModules/sys_types-7HWNBJJ5LWRSPTP933DWL9WQD.pcm b/build/SDKExplicitPrecompiledModules/sys_types-7HWNBJJ5LWRSPTP933DWL9WQD.pcm new file mode 100644 index 0000000..755aa9e Binary files /dev/null and b/build/SDKExplicitPrecompiledModules/sys_types-7HWNBJJ5LWRSPTP933DWL9WQD.pcm differ diff --git a/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache b/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache index 649997c..59213bd 100644 Binary files a/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache and b/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache differ diff --git a/build/info.plist b/build/info.plist index c849da1..7d320df 100644 --- a/build/info.plist +++ b/build/info.plist @@ -3,7 +3,7 @@ LastAccessedDate - 2026-10-16T15:59:25Z + 2026-10-16T16:23:53Z WorkspacePath /Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj