├── Cleaner
├── Assets.xcassets
│ ├── Contents.json
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
├── Test.swift
├── CleanerApp.swift
├── Cleaner.entitlements
├── Manager
│ └── MergeConflictCleaner.swift
└── ContentView.swift
├── Cleaner.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── macbookair.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
├── CleanerUITests
├── CleanerUITestsLaunchTests.swift
└── CleanerUITests.swift
└── CleanerTests
└── CleanerTests.swift
/Cleaner/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Cleaner/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Cleaner/Test.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Test.swift
3 | // Cleaner
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 | import Foundation
8 |
9 |
--------------------------------------------------------------------------------
/Cleaner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Cleaner/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Cleaner/CleanerApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CleanerApp.swift
3 | // Cleaner
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct CleanerApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Cleaner/Cleaner.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Cleaner.xcodeproj/xcuserdata/macbookair.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Cleaner.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/CleanerUITests/CleanerUITestsLaunchTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CleanerUITestsLaunchTests.swift
3 | // CleanerUITests
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 |
8 | import XCTest
9 |
10 | final class CleanerUITestsLaunchTests: XCTestCase {
11 |
12 | override class var runsForEachTargetApplicationUIConfiguration: Bool {
13 | true
14 | }
15 |
16 | override func setUpWithError() throws {
17 | continueAfterFailure = false
18 | }
19 |
20 | @MainActor
21 | func testLaunch() throws {
22 | let app = XCUIApplication()
23 | app.launch()
24 |
25 | // Insert steps here to perform after app launch but before taking a screenshot,
26 | // such as logging into a test account or navigating somewhere in the app
27 |
28 | let attachment = XCTAttachment(screenshot: app.screenshot())
29 | attachment.name = "Launch Screen"
30 | attachment.lifetime = .keepAlways
31 | add(attachment)
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Cleaner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "scale" : "1x",
6 | "size" : "16x16"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "scale" : "2x",
11 | "size" : "16x16"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "scale" : "1x",
16 | "size" : "32x32"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "scale" : "2x",
21 | "size" : "32x32"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "scale" : "1x",
26 | "size" : "128x128"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "scale" : "2x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "scale" : "1x",
36 | "size" : "256x256"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "scale" : "2x",
41 | "size" : "256x256"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "scale" : "1x",
46 | "size" : "512x512"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "scale" : "2x",
51 | "size" : "512x512"
52 | }
53 | ],
54 | "info" : {
55 | "author" : "xcode",
56 | "version" : 1
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/CleanerUITests/CleanerUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CleanerUITests.swift
3 | // CleanerUITests
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 |
8 | import XCTest
9 |
10 | final class CleanerUITests: XCTestCase {
11 |
12 | override func setUpWithError() throws {
13 | // Put setup code here. This method is called before the invocation of each test method in the class.
14 |
15 | // In UI tests it is usually best to stop immediately when a failure occurs.
16 | continueAfterFailure = false
17 |
18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
19 | }
20 |
21 | override func tearDownWithError() throws {
22 | // Put teardown code here. This method is called after the invocation of each test method in the class.
23 | }
24 |
25 | @MainActor
26 | func testExample() throws {
27 | // UI tests must launch the application that they test.
28 | let app = XCUIApplication()
29 | app.launch()
30 |
31 | // Use XCTAssert and related functions to verify your tests produce the correct results.
32 | }
33 |
34 | @MainActor
35 | func testLaunchPerformance() throws {
36 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
37 | // This measures how long it takes to launch your application.
38 | measure(metrics: [XCTApplicationLaunchMetric()]) {
39 | XCUIApplication().launch()
40 | }
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Cleaner/Manager/MergeConflictCleaner.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MergeConflictCleaner.swift
3 | // Cleaner
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 |
8 | import Foundation
9 |
10 | class MergeConflictCleaner {
11 |
12 | enum ConflictResolution {
13 | case head // Keep HEAD version (first section)
14 | case incoming // Keep incoming branch version (second section)
15 | case removeAll // Remove all conflicted sections
16 | }
17 |
18 | func clean(content: String, resolution: ConflictResolution = .head) -> String {
19 | var result = ""
20 | var conflictDepth = 0
21 | var inHeadSection = false
22 | var inIncomingSection = false
23 |
24 | for line in content.components(separatedBy: .newlines) {
25 | if line.hasPrefix("<<<<<<<") {
26 | conflictDepth += 1
27 | inHeadSection = true
28 | inIncomingSection = false
29 | continue
30 | } else if line.hasPrefix("=======") && conflictDepth > 0 {
31 | inHeadSection = false
32 | inIncomingSection = true
33 | continue
34 | } else if line.hasPrefix(">>>>>>>") {
35 | conflictDepth = max(0, conflictDepth - 1)
36 | inHeadSection = false
37 | inIncomingSection = false
38 | continue
39 | }
40 |
41 | // Determine if we should include this line
42 | let shouldIncludeLine: Bool
43 |
44 | if conflictDepth == 0 {
45 | // Always include lines outside conflicts
46 | shouldIncludeLine = true
47 | } else {
48 | // Inside a conflict - decide based on resolution strategy
49 | switch resolution {
50 | case .head:
51 | shouldIncludeLine = inHeadSection
52 | case .incoming:
53 | shouldIncludeLine = inIncomingSection
54 | case .removeAll:
55 | shouldIncludeLine = false
56 | }
57 | }
58 |
59 | if shouldIncludeLine {
60 | result += line + "\n"
61 | }
62 | }
63 |
64 | return result
65 | }
66 | }
67 |
68 |
--------------------------------------------------------------------------------
/Cleaner/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Cleaner
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 | import SwiftUI
8 | import AppKit
9 |
10 | struct ContentView: View {
11 | @State private var inputText = ""
12 | @State private var cleanedContent = ""
13 | @State private var showingCopyAlert = false
14 | @State private var selectedResolution: MergeConflictCleaner.ConflictResolution = .head
15 |
16 | let cleaner = MergeConflictCleaner()
17 |
18 | var body: some View {
19 | VStack(spacing: 20) {
20 | Text("Merge Conflict Cleaner")
21 | .font(.largeTitle)
22 | .fontWeight(.bold)
23 | .padding()
24 |
25 | VStack(alignment: .leading, spacing: 10) {
26 | Text("Paste your text with merge conflicts:")
27 | .font(.headline)
28 |
29 | TextEditor(text: $inputText)
30 | .border(Color.gray, width: 1)
31 | .frame(minHeight: 150)
32 | .padding(.horizontal)
33 | }
34 |
35 | VStack(alignment: .leading, spacing: 10) {
36 | Text("Resolution Strategy:")
37 | .font(.headline)
38 | .padding()
39 |
40 | Picker("Resolution Strategy", selection: $selectedResolution) {
41 | Text("Keep HEAD (first option)").tag(MergeConflictCleaner.ConflictResolution.head)
42 | Text("Keep Incoming (second option)").tag(MergeConflictCleaner.ConflictResolution.incoming)
43 | Text("Remove All Conflicts").tag(MergeConflictCleaner.ConflictResolution.removeAll)
44 | }
45 | .pickerStyle(SegmentedPickerStyle())
46 | .padding(.horizontal)
47 | .padding()
48 | }
49 |
50 | Button("Clean Merge Conflicts") {
51 | cleanedContent = cleaner.clean(content: inputText, resolution: selectedResolution)
52 | }
53 | .padding()
54 | .background(Color.blue)
55 | .foregroundColor(.white)
56 | .cornerRadius(8)
57 | .disabled(inputText.isEmpty)
58 |
59 | if !cleanedContent.isEmpty {
60 | VStack(alignment: .leading, spacing: 10) {
61 | HStack {
62 | Text("Cleaned Content:")
63 | .font(.headline)
64 |
65 | Spacer()
66 |
67 | Button("Copy to Clipboard") {
68 | NSPasteboard.general.clearContents()
69 | NSPasteboard.general.setString(cleanedContent, forType: .string)
70 | showingCopyAlert = true
71 | }
72 | .padding(.horizontal, 12)
73 | .padding(.vertical, 6)
74 | .background(Color.green)
75 | .foregroundColor(.white)
76 | .cornerRadius(6)
77 | .font(.caption)
78 | }
79 |
80 | ScrollView {
81 | Text(cleanedContent)
82 | .font(.system(.body, design: .monospaced))
83 | .padding()
84 | .frame(maxWidth: .infinity, alignment: .leading)
85 | .background(Color.gray.opacity(0.1))
86 | .cornerRadius(8)
87 | }
88 | .frame(maxHeight: 300)
89 | }
90 | .padding(.horizontal)
91 | }
92 |
93 | Spacer()
94 | }
95 | .alert("Copied!", isPresented: $showingCopyAlert) {
96 | Button("OK", role: .cancel) { }
97 | } message: {
98 | Text("Cleaned content has been copied to clipboard")
99 | }
100 | }
101 | }
102 |
103 | #Preview {
104 | ContentView()
105 | }
106 |
--------------------------------------------------------------------------------
/CleanerTests/CleanerTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CleanerTests.swift
3 | // CleanerTests
4 | //
5 | // Created by Daniel Jermaine on 05/07/2025.
6 | //
7 |
8 | import XCTest
9 | @testable import Cleaner
10 | import XCTest
11 |
12 | class MergeConflictCleanerTests: XCTestCase {
13 |
14 | var cleaner: MergeConflictCleaner!
15 |
16 | override func setUp() {
17 | super.setUp()
18 | cleaner = MergeConflictCleaner()
19 | }
20 |
21 | override func tearDown() {
22 | cleaner = nil
23 | super.tearDown()
24 | }
25 |
26 | // Test 1: Simple single conflict
27 | func testSimpleSingleConflict() {
28 | let input = """
29 | func greet() {
30 | print("Hello")
31 | <<<<<<< HEAD
32 | print("Welcome to our app")
33 | =======
34 | print("Welcome to the application")
35 | >>>>>>> feature/greeting
36 | }
37 | """
38 |
39 | let expected = """
40 | func greet() {
41 | print("Hello")
42 | }
43 | """
44 |
45 | let result = cleaner.clean(content: input)
46 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines),
47 | expected.trimmingCharacters(in: .whitespacesAndNewlines))
48 | }
49 |
50 | // Test 2: Multiple conflicts in same function
51 | func testMultipleConflictsInSameFunction() {
52 | let input = """
53 | func processData() {
54 | let data = fetchData()
55 | <<<<<<< HEAD
56 | validateData(data)
57 | =======
58 | sanitizeData(data)
59 | >>>>>>> feature/validation
60 |
61 | let processed = transform(data)
62 |
63 | <<<<<<< HEAD
64 | saveToDatabase(processed)
65 | =======
66 | saveToCache(processed)
67 | saveToDatabase(processed)
68 | >>>>>>> feature/caching
69 | }
70 | """
71 |
72 | let expected = """
73 | func processData() {
74 | let data = fetchData()
75 |
76 | let processed = transform(data)
77 |
78 | }
79 | """
80 |
81 | let result = cleaner.clean(content: input)
82 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines),
83 | expected.trimmingCharacters(in: .whitespacesAndNewlines))
84 | }
85 |
86 | // Test 3: Nested conflicts (conflict within conflict)
87 | func testNestedConflicts() {
88 | let input = """
89 | class APIClient {
90 | <<<<<<< HEAD
91 | func makeRequest() {
92 | let url = "https://api.example.com"
93 | <<<<<<< develop
94 | let method = "GET"
95 | =======
96 | let method = "POST"
97 | >>>>>>> feature/post-support
98 | performRequest(url: url, method: method)
99 | }
100 | =======
101 | func executeRequest() {
102 | let endpoint = "https://api.newservice.com"
103 | sendRequest(to: endpoint)
104 | }
105 | >>>>>>> feature/new-api
106 | }
107 | """
108 |
109 | let expected = """
110 | class APIClient {
111 | }
112 | """
113 |
114 | let result = cleaner.clean(content: input)
115 | print(result)
116 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines),
117 | expected.trimmingCharacters(in: .whitespacesAndNewlines))
118 | }
119 |
120 | // Test 4: Property conflicts
121 | func testPropertyConflicts() {
122 | let input = """
123 | struct User {
124 | let id: String
125 | let name: String
126 | <<<<<<< HEAD
127 | let email: String
128 | let phone: String?
129 | =======
130 | let emailAddress: String
131 | let phoneNumber: String?
132 | let isVerified: Bool
133 | >>>>>>> feature/user-verification
134 |
135 | init(id: String, name: String) {
136 | self.id = id
137 | self.name = name
138 | }
139 | }
140 | """
141 |
142 | let expected = """
143 | struct User {
144 | let id: String
145 | let name: String
146 |
147 | init(id: String, name: String) {
148 | self.id = id
149 | self.name = name
150 | }
151 | }
152 | """
153 |
154 | let result = cleaner.clean(content: input)
155 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines),
156 | expected.trimmingCharacters(in: .whitespacesAndNewlines))
157 | }
158 |
159 | // Test 5: Import conflicts
160 | func testImportConflicts() {
161 | let input = """
162 | <<<<<<< HEAD
163 | import Foundation
164 | import UIKit
165 | import CoreData
166 | =======
167 | import Foundation
168 | import SwiftUI
169 | import Combine
170 | >>>>>>> feature/swiftui-migration
171 |
172 | class ViewController {
173 | func viewDidLoad() {
174 | setupUI()
175 | }
176 | }
177 | """
178 |
179 | let expected = """
180 |
181 | class ViewController {
182 | func viewDidLoad() {
183 | setupUI()
184 | }
185 | }
186 | """
187 |
188 | let result = cleaner.clean(content: input)
189 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines),
190 | expected.trimmingCharacters(in: .whitespacesAndNewlines))
191 | }
192 |
193 | // Test 7: No conflicts (should return original)
194 | func testNoConflicts() {
195 | let input = """
196 | func simpleFunction() {
197 | print("Hello, World!")
198 | return "Success"
199 | }
200 |
201 | class SimpleClass {
202 | var property: String = "value"
203 |
204 | func method() {
205 | // This is a comment
206 | doSomething()
207 | }
208 | }
209 | """
210 |
211 | let result = cleaner.clean(content: input)
212 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines),
213 | input.trimmingCharacters(in: .whitespacesAndNewlines))
214 | }
215 |
216 |
217 | // Test 9: Only conflict markers (edge case)
218 | func testOnlyConflictMarkers() {
219 | let input = """
220 | <<<<<<< HEAD
221 | =======
222 | >>>>>>> feature/test
223 | """
224 |
225 | let expected = ""
226 | let result = cleaner.clean(content: input)
227 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), expected)
228 | }
229 |
230 | // Test 10: Performance test with large content
231 | func testPerformanceWithLargeContent() {
232 | var largeInput = ""
233 | for i in 0..<1000 {
234 | largeInput += """
235 | func function\(i)() {
236 | print("Function \(i)")
237 | <<<<<<< HEAD
238 | return "version1"
239 | =======
240 | return "version2"
241 | >>>>>>> feature/branch\(i)
242 | }
243 |
244 | """
245 | }
246 |
247 | measure {
248 | _ = cleaner.clean(content: largeInput)
249 | }
250 | }
251 | }
252 |
253 | // MARK: - Test Data Generator
254 | extension MergeConflictCleanerTests {
255 |
256 | /// Generates a test merge conflict for manual testing
257 | static func generateTestConflict() -> String {
258 | return """
259 | // Test all scenarios with this comprehensive example
260 | import Foundation
261 |
262 | <<<<<<< HEAD
263 | import UIKit
264 | import CoreData
265 | =======
266 | import SwiftUI
267 | import Combine
268 | >>>>>>> feature/swiftui
269 |
270 | class DataManager {
271 |
272 | <<<<<<< HEAD
273 | var storage: [String: Any] = [:]
274 |
275 | func save(key: String, value: Any) {
276 | storage[key] = value
277 | print("Saved to memory")
278 | }
279 | =======
280 | var database: CoreDataStack = CoreDataStack()
281 |
282 | func save(key: String, value: Any) {
283 | database.save(key: key, value: value)
284 | print("Saved to database")
285 | }
286 | >>>>>>> feature/persistence
287 |
288 | func load(key: String) -> Any? {
289 | <<<<<<< HEAD
290 | return storage[key]
291 | =======
292 | return database.load(key: key)
293 | >>>>>>> feature/persistence
294 | }
295 | }
296 | """
297 | }
298 | }
299 |
--------------------------------------------------------------------------------
/Cleaner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 77;
7 | objects = {
8 |
9 | /* Begin PBXContainerItemProxy section */
10 | D04847F12E19BE1D00B269AF /* PBXContainerItemProxy */ = {
11 | isa = PBXContainerItemProxy;
12 | containerPortal = D04847D72E19BE1B00B269AF /* Project object */;
13 | proxyType = 1;
14 | remoteGlobalIDString = D04847DE2E19BE1B00B269AF;
15 | remoteInfo = Cleaner;
16 | };
17 | D04847FB2E19BE1D00B269AF /* PBXContainerItemProxy */ = {
18 | isa = PBXContainerItemProxy;
19 | containerPortal = D04847D72E19BE1B00B269AF /* Project object */;
20 | proxyType = 1;
21 | remoteGlobalIDString = D04847DE2E19BE1B00B269AF;
22 | remoteInfo = Cleaner;
23 | };
24 | /* End PBXContainerItemProxy section */
25 |
26 | /* Begin PBXFileReference section */
27 | D04847DF2E19BE1B00B269AF /* Cleaner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cleaner.app; sourceTree = BUILT_PRODUCTS_DIR; };
28 | D04847F02E19BE1D00B269AF /* CleanerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CleanerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
29 | D04847FA2E19BE1D00B269AF /* CleanerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CleanerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
30 | /* End PBXFileReference section */
31 |
32 | /* Begin PBXFileSystemSynchronizedRootGroup section */
33 | D04847E12E19BE1B00B269AF /* Cleaner */ = {
34 | isa = PBXFileSystemSynchronizedRootGroup;
35 | path = Cleaner;
36 | sourceTree = "";
37 | };
38 | D04847F32E19BE1D00B269AF /* CleanerTests */ = {
39 | isa = PBXFileSystemSynchronizedRootGroup;
40 | path = CleanerTests;
41 | sourceTree = "";
42 | };
43 | D04847FD2E19BE1D00B269AF /* CleanerUITests */ = {
44 | isa = PBXFileSystemSynchronizedRootGroup;
45 | path = CleanerUITests;
46 | sourceTree = "";
47 | };
48 | /* End PBXFileSystemSynchronizedRootGroup section */
49 |
50 | /* Begin PBXFrameworksBuildPhase section */
51 | D04847DC2E19BE1B00B269AF /* Frameworks */ = {
52 | isa = PBXFrameworksBuildPhase;
53 | buildActionMask = 2147483647;
54 | files = (
55 | );
56 | runOnlyForDeploymentPostprocessing = 0;
57 | };
58 | D04847ED2E19BE1D00B269AF /* Frameworks */ = {
59 | isa = PBXFrameworksBuildPhase;
60 | buildActionMask = 2147483647;
61 | files = (
62 | );
63 | runOnlyForDeploymentPostprocessing = 0;
64 | };
65 | D04847F72E19BE1D00B269AF /* Frameworks */ = {
66 | isa = PBXFrameworksBuildPhase;
67 | buildActionMask = 2147483647;
68 | files = (
69 | );
70 | runOnlyForDeploymentPostprocessing = 0;
71 | };
72 | /* End PBXFrameworksBuildPhase section */
73 |
74 | /* Begin PBXGroup section */
75 | D04847D62E19BE1B00B269AF = {
76 | isa = PBXGroup;
77 | children = (
78 | D04847E12E19BE1B00B269AF /* Cleaner */,
79 | D04847F32E19BE1D00B269AF /* CleanerTests */,
80 | D04847FD2E19BE1D00B269AF /* CleanerUITests */,
81 | D04847E02E19BE1B00B269AF /* Products */,
82 | );
83 | sourceTree = "";
84 | };
85 | D04847E02E19BE1B00B269AF /* Products */ = {
86 | isa = PBXGroup;
87 | children = (
88 | D04847DF2E19BE1B00B269AF /* Cleaner.app */,
89 | D04847F02E19BE1D00B269AF /* CleanerTests.xctest */,
90 | D04847FA2E19BE1D00B269AF /* CleanerUITests.xctest */,
91 | );
92 | name = Products;
93 | sourceTree = "";
94 | };
95 | /* End PBXGroup section */
96 |
97 | /* Begin PBXNativeTarget section */
98 | D04847DE2E19BE1B00B269AF /* Cleaner */ = {
99 | isa = PBXNativeTarget;
100 | buildConfigurationList = D04848042E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "Cleaner" */;
101 | buildPhases = (
102 | D04847DB2E19BE1B00B269AF /* Sources */,
103 | D04847DC2E19BE1B00B269AF /* Frameworks */,
104 | D04847DD2E19BE1B00B269AF /* Resources */,
105 | );
106 | buildRules = (
107 | );
108 | dependencies = (
109 | );
110 | fileSystemSynchronizedGroups = (
111 | D04847E12E19BE1B00B269AF /* Cleaner */,
112 | );
113 | name = Cleaner;
114 | packageProductDependencies = (
115 | );
116 | productName = Cleaner;
117 | productReference = D04847DF2E19BE1B00B269AF /* Cleaner.app */;
118 | productType = "com.apple.product-type.application";
119 | };
120 | D04847EF2E19BE1D00B269AF /* CleanerTests */ = {
121 | isa = PBXNativeTarget;
122 | buildConfigurationList = D04848072E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerTests" */;
123 | buildPhases = (
124 | D04847EC2E19BE1D00B269AF /* Sources */,
125 | D04847ED2E19BE1D00B269AF /* Frameworks */,
126 | D04847EE2E19BE1D00B269AF /* Resources */,
127 | );
128 | buildRules = (
129 | );
130 | dependencies = (
131 | D04847F22E19BE1D00B269AF /* PBXTargetDependency */,
132 | );
133 | fileSystemSynchronizedGroups = (
134 | D04847F32E19BE1D00B269AF /* CleanerTests */,
135 | );
136 | name = CleanerTests;
137 | packageProductDependencies = (
138 | );
139 | productName = CleanerTests;
140 | productReference = D04847F02E19BE1D00B269AF /* CleanerTests.xctest */;
141 | productType = "com.apple.product-type.bundle.unit-test";
142 | };
143 | D04847F92E19BE1D00B269AF /* CleanerUITests */ = {
144 | isa = PBXNativeTarget;
145 | buildConfigurationList = D048480A2E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerUITests" */;
146 | buildPhases = (
147 | D04847F62E19BE1D00B269AF /* Sources */,
148 | D04847F72E19BE1D00B269AF /* Frameworks */,
149 | D04847F82E19BE1D00B269AF /* Resources */,
150 | );
151 | buildRules = (
152 | );
153 | dependencies = (
154 | D04847FC2E19BE1D00B269AF /* PBXTargetDependency */,
155 | );
156 | fileSystemSynchronizedGroups = (
157 | D04847FD2E19BE1D00B269AF /* CleanerUITests */,
158 | );
159 | name = CleanerUITests;
160 | packageProductDependencies = (
161 | );
162 | productName = CleanerUITests;
163 | productReference = D04847FA2E19BE1D00B269AF /* CleanerUITests.xctest */;
164 | productType = "com.apple.product-type.bundle.ui-testing";
165 | };
166 | /* End PBXNativeTarget section */
167 |
168 | /* Begin PBXProject section */
169 | D04847D72E19BE1B00B269AF /* Project object */ = {
170 | isa = PBXProject;
171 | attributes = {
172 | BuildIndependentTargetsInParallel = 1;
173 | LastSwiftUpdateCheck = 1620;
174 | LastUpgradeCheck = 1620;
175 | TargetAttributes = {
176 | D04847DE2E19BE1B00B269AF = {
177 | CreatedOnToolsVersion = 16.2;
178 | };
179 | D04847EF2E19BE1D00B269AF = {
180 | CreatedOnToolsVersion = 16.2;
181 | TestTargetID = D04847DE2E19BE1B00B269AF;
182 | };
183 | D04847F92E19BE1D00B269AF = {
184 | CreatedOnToolsVersion = 16.2;
185 | TestTargetID = D04847DE2E19BE1B00B269AF;
186 | };
187 | };
188 | };
189 | buildConfigurationList = D04847DA2E19BE1B00B269AF /* Build configuration list for PBXProject "Cleaner" */;
190 | developmentRegion = en;
191 | hasScannedForEncodings = 0;
192 | knownRegions = (
193 | en,
194 | Base,
195 | );
196 | mainGroup = D04847D62E19BE1B00B269AF;
197 | minimizedProjectReferenceProxies = 1;
198 | preferredProjectObjectVersion = 77;
199 | productRefGroup = D04847E02E19BE1B00B269AF /* Products */;
200 | projectDirPath = "";
201 | projectRoot = "";
202 | targets = (
203 | D04847DE2E19BE1B00B269AF /* Cleaner */,
204 | D04847EF2E19BE1D00B269AF /* CleanerTests */,
205 | D04847F92E19BE1D00B269AF /* CleanerUITests */,
206 | );
207 | };
208 | /* End PBXProject section */
209 |
210 | /* Begin PBXResourcesBuildPhase section */
211 | D04847DD2E19BE1B00B269AF /* Resources */ = {
212 | isa = PBXResourcesBuildPhase;
213 | buildActionMask = 2147483647;
214 | files = (
215 | );
216 | runOnlyForDeploymentPostprocessing = 0;
217 | };
218 | D04847EE2E19BE1D00B269AF /* Resources */ = {
219 | isa = PBXResourcesBuildPhase;
220 | buildActionMask = 2147483647;
221 | files = (
222 | );
223 | runOnlyForDeploymentPostprocessing = 0;
224 | };
225 | D04847F82E19BE1D00B269AF /* Resources */ = {
226 | isa = PBXResourcesBuildPhase;
227 | buildActionMask = 2147483647;
228 | files = (
229 | );
230 | runOnlyForDeploymentPostprocessing = 0;
231 | };
232 | /* End PBXResourcesBuildPhase section */
233 |
234 | /* Begin PBXSourcesBuildPhase section */
235 | D04847DB2E19BE1B00B269AF /* Sources */ = {
236 | isa = PBXSourcesBuildPhase;
237 | buildActionMask = 2147483647;
238 | files = (
239 | );
240 | runOnlyForDeploymentPostprocessing = 0;
241 | };
242 | D04847EC2E19BE1D00B269AF /* Sources */ = {
243 | isa = PBXSourcesBuildPhase;
244 | buildActionMask = 2147483647;
245 | files = (
246 | );
247 | runOnlyForDeploymentPostprocessing = 0;
248 | };
249 | D04847F62E19BE1D00B269AF /* Sources */ = {
250 | isa = PBXSourcesBuildPhase;
251 | buildActionMask = 2147483647;
252 | files = (
253 | );
254 | runOnlyForDeploymentPostprocessing = 0;
255 | };
256 | /* End PBXSourcesBuildPhase section */
257 |
258 | /* Begin PBXTargetDependency section */
259 | D04847F22E19BE1D00B269AF /* PBXTargetDependency */ = {
260 | isa = PBXTargetDependency;
261 | target = D04847DE2E19BE1B00B269AF /* Cleaner */;
262 | targetProxy = D04847F12E19BE1D00B269AF /* PBXContainerItemProxy */;
263 | };
264 | D04847FC2E19BE1D00B269AF /* PBXTargetDependency */ = {
265 | isa = PBXTargetDependency;
266 | target = D04847DE2E19BE1B00B269AF /* Cleaner */;
267 | targetProxy = D04847FB2E19BE1D00B269AF /* PBXContainerItemProxy */;
268 | };
269 | /* End PBXTargetDependency section */
270 |
271 | /* Begin XCBuildConfiguration section */
272 | D04848022E19BE1E00B269AF /* Debug */ = {
273 | isa = XCBuildConfiguration;
274 | buildSettings = {
275 | ALWAYS_SEARCH_USER_PATHS = NO;
276 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
277 | CLANG_ANALYZER_NONNULL = YES;
278 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
279 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
280 | CLANG_ENABLE_MODULES = YES;
281 | CLANG_ENABLE_OBJC_ARC = YES;
282 | CLANG_ENABLE_OBJC_WEAK = YES;
283 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
284 | CLANG_WARN_BOOL_CONVERSION = YES;
285 | CLANG_WARN_COMMA = YES;
286 | CLANG_WARN_CONSTANT_CONVERSION = YES;
287 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
288 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
289 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
290 | CLANG_WARN_EMPTY_BODY = YES;
291 | CLANG_WARN_ENUM_CONVERSION = YES;
292 | CLANG_WARN_INFINITE_RECURSION = YES;
293 | CLANG_WARN_INT_CONVERSION = YES;
294 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
295 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
296 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
297 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
298 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
299 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
300 | CLANG_WARN_STRICT_PROTOTYPES = YES;
301 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
302 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
303 | CLANG_WARN_UNREACHABLE_CODE = YES;
304 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
305 | COPY_PHASE_STRIP = NO;
306 | DEBUG_INFORMATION_FORMAT = dwarf;
307 | ENABLE_STRICT_OBJC_MSGSEND = YES;
308 | ENABLE_TESTABILITY = YES;
309 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
310 | GCC_C_LANGUAGE_STANDARD = gnu17;
311 | GCC_DYNAMIC_NO_PIC = NO;
312 | GCC_NO_COMMON_BLOCKS = YES;
313 | GCC_OPTIMIZATION_LEVEL = 0;
314 | GCC_PREPROCESSOR_DEFINITIONS = (
315 | "DEBUG=1",
316 | "$(inherited)",
317 | );
318 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
319 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
320 | GCC_WARN_UNDECLARED_SELECTOR = YES;
321 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
322 | GCC_WARN_UNUSED_FUNCTION = YES;
323 | GCC_WARN_UNUSED_VARIABLE = YES;
324 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
325 | MACOSX_DEPLOYMENT_TARGET = 15.2;
326 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
327 | MTL_FAST_MATH = YES;
328 | ONLY_ACTIVE_ARCH = YES;
329 | SDKROOT = macosx;
330 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
331 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
332 | };
333 | name = Debug;
334 | };
335 | D04848032E19BE1E00B269AF /* Release */ = {
336 | isa = XCBuildConfiguration;
337 | buildSettings = {
338 | ALWAYS_SEARCH_USER_PATHS = NO;
339 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
340 | CLANG_ANALYZER_NONNULL = YES;
341 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
342 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
343 | CLANG_ENABLE_MODULES = YES;
344 | CLANG_ENABLE_OBJC_ARC = YES;
345 | CLANG_ENABLE_OBJC_WEAK = YES;
346 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
347 | CLANG_WARN_BOOL_CONVERSION = YES;
348 | CLANG_WARN_COMMA = YES;
349 | CLANG_WARN_CONSTANT_CONVERSION = YES;
350 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
351 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
352 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
353 | CLANG_WARN_EMPTY_BODY = YES;
354 | CLANG_WARN_ENUM_CONVERSION = YES;
355 | CLANG_WARN_INFINITE_RECURSION = YES;
356 | CLANG_WARN_INT_CONVERSION = YES;
357 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
358 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
359 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
360 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
361 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
362 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
363 | CLANG_WARN_STRICT_PROTOTYPES = YES;
364 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
365 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
366 | CLANG_WARN_UNREACHABLE_CODE = YES;
367 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
368 | COPY_PHASE_STRIP = NO;
369 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
370 | ENABLE_NS_ASSERTIONS = NO;
371 | ENABLE_STRICT_OBJC_MSGSEND = YES;
372 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
373 | GCC_C_LANGUAGE_STANDARD = gnu17;
374 | GCC_NO_COMMON_BLOCKS = YES;
375 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
376 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
377 | GCC_WARN_UNDECLARED_SELECTOR = YES;
378 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
379 | GCC_WARN_UNUSED_FUNCTION = YES;
380 | GCC_WARN_UNUSED_VARIABLE = YES;
381 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
382 | MACOSX_DEPLOYMENT_TARGET = 15.2;
383 | MTL_ENABLE_DEBUG_INFO = NO;
384 | MTL_FAST_MATH = YES;
385 | SDKROOT = macosx;
386 | SWIFT_COMPILATION_MODE = wholemodule;
387 | };
388 | name = Release;
389 | };
390 | D04848052E19BE1E00B269AF /* Debug */ = {
391 | isa = XCBuildConfiguration;
392 | buildSettings = {
393 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
394 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
395 | CODE_SIGN_ENTITLEMENTS = Cleaner/Cleaner.entitlements;
396 | CODE_SIGN_STYLE = Automatic;
397 | COMBINE_HIDPI_IMAGES = YES;
398 | CURRENT_PROJECT_VERSION = 1;
399 | DEVELOPMENT_ASSET_PATHS = "\"Cleaner/Preview Content\"";
400 | ENABLE_PREVIEWS = YES;
401 | GENERATE_INFOPLIST_FILE = YES;
402 | INFOPLIST_KEY_NSDesktopFolderUsageDescription = "This app needs access to files you select to clean merge conflicts";
403 | INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts";
404 | INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts";
405 | LD_RUNPATH_SEARCH_PATHS = (
406 | "$(inherited)",
407 | "@executable_path/../Frameworks",
408 | );
409 | MARKETING_VERSION = 1.0;
410 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.Cleaner;
411 | PRODUCT_NAME = "$(TARGET_NAME)";
412 | SWIFT_EMIT_LOC_STRINGS = YES;
413 | SWIFT_VERSION = 5.0;
414 | };
415 | name = Debug;
416 | };
417 | D04848062E19BE1E00B269AF /* Release */ = {
418 | isa = XCBuildConfiguration;
419 | buildSettings = {
420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
421 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
422 | CODE_SIGN_ENTITLEMENTS = Cleaner/Cleaner.entitlements;
423 | CODE_SIGN_STYLE = Automatic;
424 | COMBINE_HIDPI_IMAGES = YES;
425 | CURRENT_PROJECT_VERSION = 1;
426 | DEVELOPMENT_ASSET_PATHS = "\"Cleaner/Preview Content\"";
427 | ENABLE_PREVIEWS = YES;
428 | GENERATE_INFOPLIST_FILE = YES;
429 | INFOPLIST_KEY_NSDesktopFolderUsageDescription = "This app needs access to files you select to clean merge conflicts";
430 | INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts";
431 | INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts";
432 | LD_RUNPATH_SEARCH_PATHS = (
433 | "$(inherited)",
434 | "@executable_path/../Frameworks",
435 | );
436 | MARKETING_VERSION = 1.0;
437 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.Cleaner;
438 | PRODUCT_NAME = "$(TARGET_NAME)";
439 | SWIFT_EMIT_LOC_STRINGS = YES;
440 | SWIFT_VERSION = 5.0;
441 | };
442 | name = Release;
443 | };
444 | D04848082E19BE1E00B269AF /* Debug */ = {
445 | isa = XCBuildConfiguration;
446 | buildSettings = {
447 | BUNDLE_LOADER = "$(TEST_HOST)";
448 | CODE_SIGN_STYLE = Automatic;
449 | CURRENT_PROJECT_VERSION = 1;
450 | GENERATE_INFOPLIST_FILE = YES;
451 | MACOSX_DEPLOYMENT_TARGET = 15.2;
452 | MARKETING_VERSION = 1.0;
453 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerTests;
454 | PRODUCT_NAME = "$(TARGET_NAME)";
455 | SWIFT_EMIT_LOC_STRINGS = NO;
456 | SWIFT_VERSION = 5.0;
457 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cleaner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Cleaner";
458 | };
459 | name = Debug;
460 | };
461 | D04848092E19BE1E00B269AF /* Release */ = {
462 | isa = XCBuildConfiguration;
463 | buildSettings = {
464 | BUNDLE_LOADER = "$(TEST_HOST)";
465 | CODE_SIGN_STYLE = Automatic;
466 | CURRENT_PROJECT_VERSION = 1;
467 | GENERATE_INFOPLIST_FILE = YES;
468 | MACOSX_DEPLOYMENT_TARGET = 15.2;
469 | MARKETING_VERSION = 1.0;
470 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerTests;
471 | PRODUCT_NAME = "$(TARGET_NAME)";
472 | SWIFT_EMIT_LOC_STRINGS = NO;
473 | SWIFT_VERSION = 5.0;
474 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cleaner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Cleaner";
475 | };
476 | name = Release;
477 | };
478 | D048480B2E19BE1E00B269AF /* Debug */ = {
479 | isa = XCBuildConfiguration;
480 | buildSettings = {
481 | CODE_SIGN_STYLE = Automatic;
482 | CURRENT_PROJECT_VERSION = 1;
483 | GENERATE_INFOPLIST_FILE = YES;
484 | MARKETING_VERSION = 1.0;
485 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerUITests;
486 | PRODUCT_NAME = "$(TARGET_NAME)";
487 | SWIFT_EMIT_LOC_STRINGS = NO;
488 | SWIFT_VERSION = 5.0;
489 | TEST_TARGET_NAME = Cleaner;
490 | };
491 | name = Debug;
492 | };
493 | D048480C2E19BE1E00B269AF /* Release */ = {
494 | isa = XCBuildConfiguration;
495 | buildSettings = {
496 | CODE_SIGN_STYLE = Automatic;
497 | CURRENT_PROJECT_VERSION = 1;
498 | GENERATE_INFOPLIST_FILE = YES;
499 | MARKETING_VERSION = 1.0;
500 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerUITests;
501 | PRODUCT_NAME = "$(TARGET_NAME)";
502 | SWIFT_EMIT_LOC_STRINGS = NO;
503 | SWIFT_VERSION = 5.0;
504 | TEST_TARGET_NAME = Cleaner;
505 | };
506 | name = Release;
507 | };
508 | /* End XCBuildConfiguration section */
509 |
510 | /* Begin XCConfigurationList section */
511 | D04847DA2E19BE1B00B269AF /* Build configuration list for PBXProject "Cleaner" */ = {
512 | isa = XCConfigurationList;
513 | buildConfigurations = (
514 | D04848022E19BE1E00B269AF /* Debug */,
515 | D04848032E19BE1E00B269AF /* Release */,
516 | );
517 | defaultConfigurationIsVisible = 0;
518 | defaultConfigurationName = Release;
519 | };
520 | D04848042E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "Cleaner" */ = {
521 | isa = XCConfigurationList;
522 | buildConfigurations = (
523 | D04848052E19BE1E00B269AF /* Debug */,
524 | D04848062E19BE1E00B269AF /* Release */,
525 | );
526 | defaultConfigurationIsVisible = 0;
527 | defaultConfigurationName = Release;
528 | };
529 | D04848072E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerTests" */ = {
530 | isa = XCConfigurationList;
531 | buildConfigurations = (
532 | D04848082E19BE1E00B269AF /* Debug */,
533 | D04848092E19BE1E00B269AF /* Release */,
534 | );
535 | defaultConfigurationIsVisible = 0;
536 | defaultConfigurationName = Release;
537 | };
538 | D048480A2E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerUITests" */ = {
539 | isa = XCConfigurationList;
540 | buildConfigurations = (
541 | D048480B2E19BE1E00B269AF /* Debug */,
542 | D048480C2E19BE1E00B269AF /* Release */,
543 | );
544 | defaultConfigurationIsVisible = 0;
545 | defaultConfigurationName = Release;
546 | };
547 | /* End XCConfigurationList section */
548 | };
549 | rootObject = D04847D72E19BE1B00B269AF /* Project object */;
550 | }
551 |
--------------------------------------------------------------------------------