Skip to content

Commit 36a47aa

Browse files
nickustinovclaude
andcommitted
Fix CI: extract protocols to separate file, exclude GUI code from tests
- Move CharacteristicUpdatable, CharacteristicRefreshable, ReachabilityUpdatable protocols to Protocols.swift - Exclude MacOSController, HotkeyManager, Settings from test target - These files require GUI access which isn't available in CI Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent cbaac8a commit 36a47aa

4 files changed

Lines changed: 41 additions & 40 deletions

File tree

Itsyhome.xcodeproj/project.pbxproj

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
069D686EF497B4BE291ED8F9 /* ValueConversionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1BB4554FA59FCE166E2B86 /* ValueConversionTests.swift */; };
1414
08D8F3C60170681EF3187BCE /* ThermostatMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86C440D0DF207C3DF9F3A5AD /* ThermostatMenuItem.swift */; };
1515
0AE9FFB43AE2BAEE112BEE83 /* HomeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 748347D84F0BDF92DA4DE1E4 /* HomeKit.framework */; };
16-
0B5A0E8BDADB137BECF43102 /* MacOSController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D500F71D0EA63DEF283D8B /* MacOSController.swift */; };
1716
0C50A9F7E4B39D3073FCB0C2 /* BridgeProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88919649EAF34363518DE9FF /* BridgeProtocols.swift */; };
1817
0D1340AA633BF40EC7B797C4 /* SecuritySystemMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBD57CCBF703A5861D8AEFB0 /* SecuritySystemMenuItem.swift */; };
1918
0E3C04C26FCF48722D26C6CE /* ToggleSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CD9AB0F2E79886D06C197E2 /* ToggleSwitch.swift */; };
2019
12B4142969F3A501717A290A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 71AB516B350323CC9A1DAEE4 /* Assets.xcassets */; };
2120
14F0AEFAB30B89C65383EA67 /* macOSBridge.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5735B31C003BD03DE4B28206 /* macOSBridge.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
2221
1539311789FA41246C3F438C /* ValveMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E64829BF9C061EB52A28437 /* ValveMenuItem.swift */; };
23-
158EC3D55E6D386D2AD13DC0 /* PreferencesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC234CA03045239CB9D178E6 /* PreferencesManager.swift */; };
2422
160978BDC19974A59FB1A4BB /* LightMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73072FCFE16311A3C25C1C2C /* LightMenuItem.swift */; };
2523
16A327E2FD58F4B48606729C /* BaseMenuItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFE6ECEB559109472BA360A /* BaseMenuItems.swift */; };
2624
1F371D887A255246B1D0476A /* ContactSensorMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97294F841A6CCBC4B68DB7E2 /* ContactSensorMenuItem.swift */; };
@@ -35,7 +33,6 @@
3533
4959FC69F1F23C3ABA0365A1 /* SwitchMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B74BF9E1E02D2CF34C9F37 /* SwitchMenuItem.swift */; };
3634
4D254CB705D49D273EE1922F /* SensorMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DA790B8C69170774D51C97 /* SensorMenuItem.swift */; };
3735
4DE21C1DE370423C77BB118D /* SensorSummaryMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 117549B5BED7ADDFB473C53C /* SensorSummaryMenuItem.swift */; };
38-
4FFE43A644E86DE5F6BC7A70 /* AccessoriesSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221351A6C7AB72AC5F0E1714 /* AccessoriesSettingsView.swift */; };
3936
51296CE1AEA687F0449B01EA /* ModeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7593F05E9EAB8871D43D8E8 /* ModeButton.swift */; };
4037
52BED706E1E2183D364BA285 /* BridgeProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88919649EAF34363518DE9FF /* BridgeProtocols.swift */; };
4138
52D57DDBC763425D57606E8C /* ContactSensorMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97294F841A6CCBC4B68DB7E2 /* ContactSensorMenuItem.swift */; };
@@ -44,19 +41,18 @@
4441
54727DEB4A151CC024B9D31E /* ScenesGridMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B33028C597EEA3DAE92520C3 /* ScenesGridMenuItem.swift */; };
4542
550336C45D91454C7E897346 /* HumidifierMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2203CC92AE39248AE04E2480 /* HumidifierMenuItem.swift */; };
4643
5E2CF28F91004D72D8819802 /* AirPurifierMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F1F563C08E919FE1477C44 /* AirPurifierMenuItem.swift */; };
47-
6358B88B51A4AFF8BFDE7CEA /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500307E119D41807918FC3C /* GeneralSettingsView.swift */; };
4844
646767AF7A71690332C474E0 /* ACMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F7082F795BA2C9AA55C64A0 /* ACMenuItem.swift */; };
4945
67926ADF4BFE82DCEF6BB9D1 /* BridgeProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88919649EAF34363518DE9FF /* BridgeProtocols.swift */; };
5046
67E9EC3321181637F2778AD9 /* ModeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7593F05E9EAB8871D43D8E8 /* ModeButton.swift */; };
5147
680D90D25922D1D80083CFC7 /* SecuritySystemMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBD57CCBF703A5861D8AEFB0 /* SecuritySystemMenuItem.swift */; };
5248
73574BD61159AC8923B414F8 /* FanMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3AE776817A51695FBA936B1 /* FanMenuItem.swift */; };
5349
772EAC65582AA05AFFA09210 /* AirPurifierMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F1F563C08E919FE1477C44 /* AirPurifierMenuItem.swift */; };
54-
8058276155A06E658931BB23 /* FavouritesSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37D58E82DEF89116DBA8936 /* FavouritesSectionHeader.swift */; };
5550
806CCEC2325035CD0F9D0690 /* LockMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374C26148C6FEAAFD207413 /* LockMenuItem.swift */; };
5651
80BA4CBB1ADDA67E5A9ABB5A /* FanMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3AE776817A51695FBA936B1 /* FanMenuItem.swift */; };
5752
851260AF14FDF357AD88C04F /* BlindMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDA7864F1CCF19AD70E1F96 /* BlindMenuItem.swift */; };
5853
874A311DF0D311BD252A5F4C /* SceneMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3AD56C9EA919B09E7896B55 /* SceneMenuItem.swift */; };
5954
89A0591720D0B4F0527FA985 /* FavouritesSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37D58E82DEF89116DBA8936 /* FavouritesSectionHeader.swift */; };
55+
9152D628D15146FC06FE6B70 /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3A3EB6D0DE7E9C0DE57ABAF /* Protocols.swift */; };
6056
93F37AF55F715D6075134E69 /* ValueConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB6A2D48574EFA0940AA54 /* ValueConversion.swift */; };
6157
94D04698ADBC211F1A888348 /* ThermostatMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86C440D0DF207C3DF9F3A5AD /* ThermostatMenuItem.swift */; };
6258
98F783AA77C8DA2CF5D5A923 /* ModernSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA517D9CAF4A470166D8C402 /* ModernSlider.swift */; };
@@ -66,24 +62,21 @@
6662
AD9481FF14C9C1A6554663B1 /* ValueConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB6A2D48574EFA0940AA54 /* ValueConversion.swift */; };
6763
AE2684040DE50AEBB0A3A844 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A554C4D26C15417928E429D4 /* Assets.xcassets */; };
6864
B6E0BA859343F2AC750C12D5 /* HotkeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8DAE0D0C65A8D06C17611F3 /* HotkeyManager.swift */; };
69-
C589670D591DAEB729B20765 /* AboutSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6222EC075A53E4D9A33DEA /* AboutSettingsView.swift */; };
7065
C8A37E1284E27AADA3A6906B /* DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181D73D7B6680B4F8CD37D4E /* DesignSystem.swift */; };
7166
CA8E1F973147B8CE2E58FA52 /* BlindMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDA7864F1CCF19AD70E1F96 /* BlindMenuItem.swift */; };
7267
CAFADC7AC3708C1CF63E3E15 /* SwitchMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B74BF9E1E02D2CF34C9F37 /* SwitchMenuItem.swift */; };
73-
CCAE2E5C44629B8A9F975F98 /* FavouritesRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05CB381453EB6F2A71F1382F /* FavouritesRowView.swift */; };
7468
CCFB8C68628CB06195CD5CBB /* ValveMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E64829BF9C061EB52A28437 /* ValveMenuItem.swift */; };
7569
CD6AE61B7DE19AA5DCD88280 /* ToggleSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CD9AB0F2E79886D06C197E2 /* ToggleSwitch.swift */; };
7670
CD9CC7D9F4C6F66CB4098F96 /* ModernSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA517D9CAF4A470166D8C402 /* ModernSlider.swift */; };
7771
CFC1E7D355E86CF204C816D8 /* AboutSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6222EC075A53E4D9A33DEA /* AboutSettingsView.swift */; };
7872
D2096D71A418CA85F0ECD074 /* PreferencesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC234CA03045239CB9D178E6 /* PreferencesManager.swift */; };
73+
D6E99C5EF38C95797107C163 /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3A3EB6D0DE7E9C0DE57ABAF /* Protocols.swift */; };
7974
DB962F06C77A87E8D2AAA55E /* DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181D73D7B6680B4F8CD37D4E /* DesignSystem.swift */; };
8075
E003741ECCB38525B6A202D9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A554C4D26C15417928E429D4 /* Assets.xcassets */; };
8176
E19EB0697A29FB223575BEFA /* macOSBridge.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5735B31C003BD03DE4B28206 /* macOSBridge.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
8277
E21BA614ED89B3714FBE9E1D /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500307E119D41807918FC3C /* GeneralSettingsView.swift */; };
8378
F0D475122112E46686ADF3C1 /* SensorSummaryMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 117549B5BED7ADDFB473C53C /* SensorSummaryMenuItem.swift */; };
8479
F2A340D41E3B57E9F7FEE940 /* HomeKitManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F296FBD051BAC5B51F5322 /* HomeKitManager.swift */; };
85-
F49355D77BA99C4DA9A9A013 /* SettingsWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39978B305FBE0EDCA33CCAFB /* SettingsWindowController.swift */; };
86-
FAC9A5DCB22D3F637788CC7E /* HotkeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8DAE0D0C65A8D06C17611F3 /* HotkeyManager.swift */; };
8780
FB77F2B3B67AF9C30D7A3108 /* LocalChangeNotifiableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074390035F5E079496B2A9FD /* LocalChangeNotifiableTests.swift */; };
8881
FC8D776A1F8F0E75A5D9222E /* FavouritesRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05CB381453EB6F2A71F1382F /* FavouritesRowView.swift */; };
8982
/* End PBXBuildFile section */
@@ -137,6 +130,7 @@
137130
97294F841A6CCBC4B68DB7E2 /* ContactSensorMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactSensorMenuItem.swift; sourceTree = "<group>"; };
138131
9CD9AB0F2E79886D06C197E2 /* ToggleSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleSwitch.swift; sourceTree = "<group>"; };
139132
9CDA7864F1CCF19AD70E1F96 /* BlindMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlindMenuItem.swift; sourceTree = "<group>"; };
133+
A3A3EB6D0DE7E9C0DE57ABAF /* Protocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Protocols.swift; sourceTree = "<group>"; };
140134
A3AD56C9EA919B09E7896B55 /* SceneMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneMenuItem.swift; sourceTree = "<group>"; };
141135
A500307E119D41807918FC3C /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = "<group>"; };
142136
A554C4D26C15417928E429D4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -182,6 +176,7 @@
182176
D8DAE0D0C65A8D06C17611F3 /* HotkeyManager.swift */,
183177
874AC367AE516CA50259C5B9 /* Info.plist */,
184178
29D500F71D0EA63DEF283D8B /* MacOSController.swift */,
179+
A3A3EB6D0DE7E9C0DE57ABAF /* Protocols.swift */,
185180
46EB6A2D48574EFA0940AA54 /* ValueConversion.swift */,
186181
6D6AC7C83D2E3676E42DF659 /* Controls */,
187182
D2258862CCE787F231C5D76E /* DesignSystem */,
@@ -480,6 +475,7 @@
480475
51296CE1AEA687F0449B01EA /* ModeButton.swift in Sources */,
481476
98F783AA77C8DA2CF5D5A923 /* ModernSlider.swift in Sources */,
482477
D2096D71A418CA85F0ECD074 /* PreferencesManager.swift in Sources */,
478+
9152D628D15146FC06FE6B70 /* Protocols.swift in Sources */,
483479
0189B807373567481D495882 /* SceneMenuItem.swift in Sources */,
484480
54727DEB4A151CC024B9D31E /* ScenesGridMenuItem.swift in Sources */,
485481
680D90D25922D1D80083CFC7 /* SecuritySystemMenuItem.swift in Sources */,
@@ -499,34 +495,26 @@
499495
buildActionMask = 2147483647;
500496
files = (
501497
00F3743A0841F193C487A90D /* ACMenuItem.swift in Sources */,
502-
C589670D591DAEB729B20765 /* AboutSettingsView.swift in Sources */,
503-
4FFE43A644E86DE5F6BC7A70 /* AccessoriesSettingsView.swift in Sources */,
504498
5E2CF28F91004D72D8819802 /* AirPurifierMenuItem.swift in Sources */,
505499
16A327E2FD58F4B48606729C /* BaseMenuItems.swift in Sources */,
506500
851260AF14FDF357AD88C04F /* BlindMenuItem.swift in Sources */,
507501
67926ADF4BFE82DCEF6BB9D1 /* BridgeProtocols.swift in Sources */,
508502
52D57DDBC763425D57606E8C /* ContactSensorMenuItem.swift in Sources */,
509503
C8A37E1284E27AADA3A6906B /* DesignSystem.swift in Sources */,
510504
73574BD61159AC8923B414F8 /* FanMenuItem.swift in Sources */,
511-
CCAE2E5C44629B8A9F975F98 /* FavouritesRowView.swift in Sources */,
512-
8058276155A06E658931BB23 /* FavouritesSectionHeader.swift in Sources */,
513505
530B7958DAC64B1723E66A79 /* GarageDoorMenuItem.swift in Sources */,
514-
6358B88B51A4AFF8BFDE7CEA /* GeneralSettingsView.swift in Sources */,
515-
FAC9A5DCB22D3F637788CC7E /* HotkeyManager.swift in Sources */,
516506
550336C45D91454C7E897346 /* HumidifierMenuItem.swift in Sources */,
517507
160978BDC19974A59FB1A4BB /* LightMenuItem.swift in Sources */,
518508
FB77F2B3B67AF9C30D7A3108 /* LocalChangeNotifiableTests.swift in Sources */,
519509
28A43FD6F2622B9CF35BC2C0 /* LockMenuItem.swift in Sources */,
520-
0B5A0E8BDADB137BECF43102 /* MacOSController.swift in Sources */,
521510
67E9EC3321181637F2778AD9 /* ModeButton.swift in Sources */,
522511
CD9CC7D9F4C6F66CB4098F96 /* ModernSlider.swift in Sources */,
523-
158EC3D55E6D386D2AD13DC0 /* PreferencesManager.swift in Sources */,
512+
D6E99C5EF38C95797107C163 /* Protocols.swift in Sources */,
524513
874A311DF0D311BD252A5F4C /* SceneMenuItem.swift in Sources */,
525514
538121CA4DBF8EEB27C242A1 /* ScenesGridMenuItem.swift in Sources */,
526515
0D1340AA633BF40EC7B797C4 /* SecuritySystemMenuItem.swift in Sources */,
527516
4D254CB705D49D273EE1922F /* SensorMenuItem.swift in Sources */,
528517
4DE21C1DE370423C77BB118D /* SensorSummaryMenuItem.swift in Sources */,
529-
F49355D77BA99C4DA9A9A013 /* SettingsWindowController.swift in Sources */,
530518
4959FC69F1F23C3ABA0365A1 /* SwitchMenuItem.swift in Sources */,
531519
9FBEDE4F029FFD689286563C /* SwitchMenuItemTests.swift in Sources */,
532520
94D04698ADBC211F1A888348 /* ThermostatMenuItem.swift in Sources */,

macOSBridge/MacOSController.swift

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -832,25 +832,3 @@ public class MacOSController: NSObject, iOS2Mac, NSMenuDelegate {
832832
}
833833
}
834834

835-
// MARK: - Protocols for menu items
836-
837-
protocol CharacteristicUpdatable {
838-
func updateValue(for characteristicId: UUID, value: Any, isLocalChange: Bool)
839-
}
840-
841-
protocol CharacteristicRefreshable {
842-
var characteristicIdentifiers: [UUID] { get }
843-
}
844-
845-
protocol ReachabilityUpdatable {
846-
var serviceIdentifier: UUID { get }
847-
func setReachable(_ isReachable: Bool)
848-
}
849-
850-
// MARK: - Local UI Sync
851-
852-
extension Notification.Name {
853-
/// Posted when a menu item locally changes a characteristic value.
854-
/// userInfo contains "characteristicId" (UUID) and "value" (Any).
855-
static let characteristicDidChangeLocally = Notification.Name("characteristicDidChangeLocally")
856-
}

macOSBridge/Protocols.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// Protocols.swift
3+
// macOSBridge
4+
//
5+
// Protocols for menu items and characteristic updates
6+
//
7+
8+
import Foundation
9+
10+
// MARK: - Protocols for menu items
11+
12+
protocol CharacteristicUpdatable {
13+
func updateValue(for characteristicId: UUID, value: Any, isLocalChange: Bool)
14+
}
15+
16+
protocol CharacteristicRefreshable {
17+
var characteristicIdentifiers: [UUID] { get }
18+
}
19+
20+
protocol ReachabilityUpdatable {
21+
var serviceIdentifier: UUID { get }
22+
func setReachable(_ isReachable: Bool)
23+
}
24+
25+
// MARK: - Local UI sync
26+
27+
extension Notification.Name {
28+
/// Posted when a menu item locally changes a characteristic value.
29+
/// userInfo contains "characteristicId" (UUID) and "value" (Any).
30+
static let characteristicDidChangeLocally = Notification.Name("characteristicDidChangeLocally")
31+
}

project.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ targets:
8383
sources:
8484
- path: macOSBridgeTests
8585
- path: macOSBridge
86+
excludes:
87+
- "MacOSController.swift"
88+
- "HotkeyManager.swift"
89+
- "Settings/**"
8690
- path: Itsyhome/Shared
8791
buildPhase: sources
8892
dependencies:

0 commit comments

Comments
 (0)