Skip to content

Commit a2dc4fe

Browse files
Merge pull request #308 from pusher/feature/291-encryped-channels-support-for-spm
Encrypted channels via Swift Package Manager & tvOS support with PusherSwiftWithEncryption
2 parents 0709a7d + b85a5b0 commit a2dc4fe

File tree

30 files changed

+355
-81
lines changed

30 files changed

+355
-81
lines changed

Cartfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
github "ashleymills/Reachability.swift" ~> 5.0.0
2-
github "jedisct1/swift-sodium" == 0.8.0
2+
github "bitmark-inc/tweetnacl-swiftwrap" ~> 1.0
33
github "pusher/NWWebSocket" ~> 0.3.0

Cartfile.resolved

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
github "ashleymills/Reachability.swift" "v5.0.0"
2-
github "jedisct1/swift-sodium" "0.8.0"
2+
github "bitmark-inc/tweetnacl-swiftwrap" "1.0.2"
33
github "pusher/NWWebSocket" "0.3.0"

Consumption-Tests/Carthage-Latest/ObjectiveC.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@
482482
inputFileListPaths = (
483483
);
484484
inputPaths = (
485-
Sodium,
485+
TweetNacl,
486486
Reachability,
487487
PusherSwiftWithEncryption,
488488
NWWebSocket,
@@ -504,7 +504,7 @@
504504
inputFileListPaths = (
505505
);
506506
inputPaths = (
507-
Sodium,
507+
TweetNacl,
508508
Reachability,
509509
PusherSwiftWithEncryption,
510510
NWWebSocket,
@@ -570,7 +570,7 @@
570570
inputPaths = (
571571
Reachability,
572572
PusherSwiftWithEncryption,
573-
Sodium,
573+
TweetNacl,
574574
NWWebSocket,
575575
);
576576
name = "Carthage: Copy Platform Specific Frameworks";

Consumption-Tests/Carthage-Latest/Swift.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@
523523
files = (
524524
);
525525
inputPaths = (
526-
Sodium,
526+
TweetNacl,
527527
Reachability,
528528
PusherSwiftWithEncryption,
529529
NWWebSocket,
@@ -543,7 +543,7 @@
543543
inputFileListPaths = (
544544
);
545545
inputPaths = (
546-
Sodium,
546+
TweetNacl,
547547
Reachability,
548548
PusherSwiftWithEncryption,
549549
NWWebSocket,
@@ -588,7 +588,7 @@
588588
inputPaths = (
589589
Reachability,
590590
PusherSwiftWithEncryption,
591-
Sodium,
591+
TweetNacl,
592592
NWWebSocket,
593593
);
594594
name = "Carthage: Copy Platform Specific Frameworks";

Consumption-Tests/Carthage-Minimum/ObjectiveC.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@
482482
inputFileListPaths = (
483483
);
484484
inputPaths = (
485-
Sodium,
485+
TweetNacl,
486486
Reachability,
487487
PusherSwiftWithEncryption,
488488
NWWebSocket,
@@ -504,7 +504,7 @@
504504
inputFileListPaths = (
505505
);
506506
inputPaths = (
507-
Sodium,
507+
TweetNacl,
508508
Reachability,
509509
PusherSwiftWithEncryption,
510510
NWWebSocket,
@@ -570,7 +570,7 @@
570570
inputPaths = (
571571
Reachability,
572572
PusherSwiftWithEncryption,
573-
Sodium,
573+
TweetNacl,
574574
NWWebSocket,
575575
);
576576
name = "Carthage: Copy Platform Specific Frameworks";

Consumption-Tests/Carthage-Minimum/Swift.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@
523523
files = (
524524
);
525525
inputPaths = (
526-
Sodium,
526+
TweetNacl,
527527
Reachability,
528528
PusherSwiftWithEncryption,
529529
NWWebSocket,
@@ -543,7 +543,7 @@
543543
inputFileListPaths = (
544544
);
545545
inputPaths = (
546-
Sodium,
546+
TweetNacl,
547547
Reachability,
548548
PusherSwiftWithEncryption,
549549
NWWebSocket,
@@ -588,7 +588,7 @@
588588
inputPaths = (
589589
Reachability,
590590
PusherSwiftWithEncryption,
591-
Sodium,
591+
TweetNacl,
592592
NWWebSocket,
593593
);
594594
name = "Carthage: Copy Platform Specific Frameworks";

Consumption-Tests/Cocoapods-Latest/ObjectiveC.xcodeproj/project.pbxproj

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@
4242
E2A5E52E2437807E00EE93A0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A5E52124377C7100EE93A0 /* main.m */; };
4343
E2A5E52F2437807E00EE93A0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A5E51324377C6F00EE93A0 /* AppDelegate.m */; };
4444
E2A5E5322437807E00EE93A0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2A5E51824377C6F00EE93A0 /* Main.storyboard */; };
45+
E9D875DF7BDE443167C6E2F4 /* Pods_ObjectiveC_tvOS_WithEncryption.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C9D4172CE5A8B1A185074F0 /* Pods_ObjectiveC_tvOS_WithEncryption.framework */; };
4546
/* End PBXBuildFile section */
4647

4748
/* Begin PBXFileReference section */
49+
0212BAA31A5EE3811CA4F429 /* Pods-ObjectiveC-tvOS-WithEncryption.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-tvOS-WithEncryption.release.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-tvOS-WithEncryption/Pods-ObjectiveC-tvOS-WithEncryption.release.xcconfig"; sourceTree = "<group>"; };
4850
22DDAA885418CCAC29EA9E4C /* Pods-ObjectiveC-iOS-WithEncryption.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-iOS-WithEncryption.debug.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-iOS-WithEncryption/Pods-ObjectiveC-iOS-WithEncryption.debug.xcconfig"; sourceTree = "<group>"; };
4951
238D71AD7E1EB50321EE8AB0 /* Pods-ObjectiveC-iOS-WithoutEncryption.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-iOS-WithoutEncryption.debug.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-iOS-WithoutEncryption/Pods-ObjectiveC-iOS-WithoutEncryption.debug.xcconfig"; sourceTree = "<group>"; };
5052
27786F1F3C259C9FA22128DC /* Pods_ObjectiveC_iOS_WithEncryption.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ObjectiveC_iOS_WithEncryption.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -72,10 +74,12 @@
7274
739B568724362B5F00937ECD /* ObjectiveC-macOS-WithEncryption.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ObjectiveC-macOS-WithEncryption.app"; sourceTree = BUILT_PRODUCTS_DIR; };
7375
86292644AA9B319410A3FF62 /* Pods-ObjectiveC-macOS-WithoutEncryption.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-macOS-WithoutEncryption.release.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-macOS-WithoutEncryption/Pods-ObjectiveC-macOS-WithoutEncryption.release.xcconfig"; sourceTree = "<group>"; };
7476
8BE05229D1A0BA42A7F8BE75 /* Pods_ObjectiveC_tvOS_WithoutEncryption.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ObjectiveC_tvOS_WithoutEncryption.framework; sourceTree = BUILT_PRODUCTS_DIR; };
77+
8C9D4172CE5A8B1A185074F0 /* Pods_ObjectiveC_tvOS_WithEncryption.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ObjectiveC_tvOS_WithEncryption.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7578
9688D8A1D813F65A85946447 /* Pods-ObjectiveC-tvOS-WithoutEncryption.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-tvOS-WithoutEncryption.debug.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-tvOS-WithoutEncryption/Pods-ObjectiveC-tvOS-WithoutEncryption.debug.xcconfig"; sourceTree = "<group>"; };
7679
9929D75E9E6F9DEAB4DFF423 /* Pods_ObjectiveC_macOS_WithEncryption.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ObjectiveC_macOS_WithEncryption.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7780
A52BF843D128C78D389224F4 /* Pods-ObjectiveC-tvOS-WithoutEncryption.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-tvOS-WithoutEncryption.release.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-tvOS-WithoutEncryption/Pods-ObjectiveC-tvOS-WithoutEncryption.release.xcconfig"; sourceTree = "<group>"; };
7881
A8898C7552BADDD6E3ACC3CA /* Pods_ObjectiveC_iOS_WithoutEncryption.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ObjectiveC_iOS_WithoutEncryption.framework; sourceTree = BUILT_PRODUCTS_DIR; };
82+
B5A231959B57730567731764 /* Pods-ObjectiveC-tvOS-WithEncryption.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ObjectiveC-tvOS-WithEncryption.debug.xcconfig"; path = "Target Support Files/Pods-ObjectiveC-tvOS-WithEncryption/Pods-ObjectiveC-tvOS-WithEncryption.debug.xcconfig"; sourceTree = "<group>"; };
7983
E2A5E51024377C6F00EE93A0 /* ObjectiveC-tvOS-WithoutEncryption.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ObjectiveC-tvOS-WithoutEncryption.app"; sourceTree = BUILT_PRODUCTS_DIR; };
8084
E2A5E51224377C6F00EE93A0 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
8185
E2A5E51324377C6F00EE93A0 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@@ -137,6 +141,7 @@
137141
isa = PBXFrameworksBuildPhase;
138142
buildActionMask = 2147483647;
139143
files = (
144+
E9D875DF7BDE443167C6E2F4 /* Pods_ObjectiveC_tvOS_WithEncryption.framework in Frameworks */,
140145
);
141146
runOnlyForDeploymentPostprocessing = 0;
142147
};
@@ -188,6 +193,7 @@
188193
9929D75E9E6F9DEAB4DFF423 /* Pods_ObjectiveC_macOS_WithEncryption.framework */,
189194
4F456455169E20D7E10FEC24 /* Pods_ObjectiveC_macOS_WithoutEncryption.framework */,
190195
8BE05229D1A0BA42A7F8BE75 /* Pods_ObjectiveC_tvOS_WithoutEncryption.framework */,
196+
8C9D4172CE5A8B1A185074F0 /* Pods_ObjectiveC_tvOS_WithEncryption.framework */,
191197
);
192198
name = Frameworks;
193199
sourceTree = "<group>";
@@ -205,6 +211,8 @@
205211
86292644AA9B319410A3FF62 /* Pods-ObjectiveC-macOS-WithoutEncryption.release.xcconfig */,
206212
9688D8A1D813F65A85946447 /* Pods-ObjectiveC-tvOS-WithoutEncryption.debug.xcconfig */,
207213
A52BF843D128C78D389224F4 /* Pods-ObjectiveC-tvOS-WithoutEncryption.release.xcconfig */,
214+
B5A231959B57730567731764 /* Pods-ObjectiveC-tvOS-WithEncryption.debug.xcconfig */,
215+
0212BAA31A5EE3811CA4F429 /* Pods-ObjectiveC-tvOS-WithEncryption.release.xcconfig */,
208216
);
209217
path = Pods;
210218
sourceTree = "<group>";
@@ -390,10 +398,12 @@
390398
isa = PBXNativeTarget;
391399
buildConfigurationList = E2A5E5342437807E00EE93A0 /* Build configuration list for PBXNativeTarget "ObjectiveC-tvOS-WithEncryption" */;
392400
buildPhases = (
401+
BE7FF752447EC4E408AAF91E /* [CP] Check Pods Manifest.lock */,
393402
E2A5E52B2437807E00EE93A0 /* Sources */,
394403
E2A5E5302437807E00EE93A0 /* Frameworks */,
395404
E2A5E5312437807E00EE93A0 /* Resources */,
396405
E2A5E5332437807E00EE93A0 /* Carthage: Copy Platform Specific Frameworks */,
406+
A60DBA775A65D16F9D5D1920 /* [CP] Embed Pods Frameworks */,
397407
);
398408
buildRules = (
399409
);
@@ -726,14 +736,14 @@
726736
"${BUILT_PRODUCTS_DIR}/NWWebSocket-iOS/NWWebSocket.framework",
727737
"${BUILT_PRODUCTS_DIR}/ReachabilitySwift-iOS/Reachability.framework",
728738
"${BUILT_PRODUCTS_DIR}/PusherSwiftWithEncryption-iOS/PusherSwiftWithEncryption.framework",
729-
"${BUILT_PRODUCTS_DIR}/Sodium-iOS/Sodium.framework",
739+
"${BUILT_PRODUCTS_DIR}/TweetNacl-iOS/TweetNacl.framework",
730740
);
731741
name = "[CP] Embed Pods Frameworks";
732742
outputPaths = (
733743
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NWWebSocket.framework",
734744
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
735745
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PusherSwiftWithEncryption.framework",
736-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sodium.framework",
746+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TweetNacl.framework",
737747
);
738748
runOnlyForDeploymentPostprocessing = 0;
739749
shellPath = /bin/sh;
@@ -762,6 +772,52 @@
762772
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ObjectiveC-tvOS-WithoutEncryption/Pods-ObjectiveC-tvOS-WithoutEncryption-frameworks.sh\"\n";
763773
showEnvVarsInLog = 0;
764774
};
775+
A60DBA775A65D16F9D5D1920 /* [CP] Embed Pods Frameworks */ = {
776+
isa = PBXShellScriptBuildPhase;
777+
buildActionMask = 2147483647;
778+
files = (
779+
);
780+
inputPaths = (
781+
"${PODS_ROOT}/Target Support Files/Pods-ObjectiveC-tvOS-WithEncryption/Pods-ObjectiveC-tvOS-WithEncryption-frameworks.sh",
782+
"${BUILT_PRODUCTS_DIR}/NWWebSocket-tvOS/NWWebSocket.framework",
783+
"${BUILT_PRODUCTS_DIR}/ReachabilitySwift-tvOS/Reachability.framework",
784+
"${BUILT_PRODUCTS_DIR}/PusherSwiftWithEncryption-tvOS/PusherSwiftWithEncryption.framework",
785+
"${BUILT_PRODUCTS_DIR}/TweetNacl-tvOS/TweetNacl.framework",
786+
);
787+
name = "[CP] Embed Pods Frameworks";
788+
outputPaths = (
789+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NWWebSocket.framework",
790+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
791+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PusherSwiftWithEncryption.framework",
792+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TweetNacl.framework",
793+
);
794+
runOnlyForDeploymentPostprocessing = 0;
795+
shellPath = /bin/sh;
796+
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ObjectiveC-tvOS-WithEncryption/Pods-ObjectiveC-tvOS-WithEncryption-frameworks.sh\"\n";
797+
showEnvVarsInLog = 0;
798+
};
799+
BE7FF752447EC4E408AAF91E /* [CP] Check Pods Manifest.lock */ = {
800+
isa = PBXShellScriptBuildPhase;
801+
buildActionMask = 2147483647;
802+
files = (
803+
);
804+
inputFileListPaths = (
805+
);
806+
inputPaths = (
807+
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
808+
"${PODS_ROOT}/Manifest.lock",
809+
);
810+
name = "[CP] Check Pods Manifest.lock";
811+
outputFileListPaths = (
812+
);
813+
outputPaths = (
814+
"$(DERIVED_FILE_DIR)/Pods-ObjectiveC-tvOS-WithEncryption-checkManifestLockResult.txt",
815+
);
816+
runOnlyForDeploymentPostprocessing = 0;
817+
shellPath = /bin/sh;
818+
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
819+
showEnvVarsInLog = 0;
820+
};
765821
C818D98DD13E56F7C9BD6A92 /* [CP] Check Pods Manifest.lock */ = {
766822
isa = PBXShellScriptBuildPhase;
767823
buildActionMask = 2147483647;
@@ -794,14 +850,14 @@
794850
"${BUILT_PRODUCTS_DIR}/NWWebSocket-macOS/NWWebSocket.framework",
795851
"${BUILT_PRODUCTS_DIR}/ReachabilitySwift-macOS/Reachability.framework",
796852
"${BUILT_PRODUCTS_DIR}/PusherSwiftWithEncryption-macOS/PusherSwiftWithEncryption.framework",
797-
"${BUILT_PRODUCTS_DIR}/Sodium-macOS/Sodium.framework",
853+
"${BUILT_PRODUCTS_DIR}/TweetNacl-macOS/TweetNacl.framework",
798854
);
799855
name = "[CP] Embed Pods Frameworks";
800856
outputPaths = (
801857
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NWWebSocket.framework",
802858
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
803859
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PusherSwiftWithEncryption.framework",
804-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sodium.framework",
860+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TweetNacl.framework",
805861
);
806862
runOnlyForDeploymentPostprocessing = 0;
807863
shellPath = /bin/sh;
@@ -1254,6 +1310,7 @@
12541310
};
12551311
E2A5E5352437807E00EE93A0 /* Debug */ = {
12561312
isa = XCBuildConfiguration;
1313+
baseConfigurationReference = B5A231959B57730567731764 /* Pods-ObjectiveC-tvOS-WithEncryption.debug.xcconfig */;
12571314
buildSettings = {
12581315
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
12591316
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -1279,6 +1336,7 @@
12791336
};
12801337
E2A5E5362437807E00EE93A0 /* Release */ = {
12811338
isa = XCBuildConfiguration;
1339+
baseConfigurationReference = 0212BAA31A5EE3811CA4F429 /* Pods-ObjectiveC-tvOS-WithEncryption.release.xcconfig */;
12821340
buildSettings = {
12831341
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
12841342
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;

Consumption-Tests/Cocoapods-Latest/Podfile.template

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ target 'Swift-tvOS-WithoutEncryption' do
3333
project 'Swift.xcodeproj'
3434
pod 'PusherSwift', :path => '../../'
3535
end
36+
target 'Swift-tvOS-WithEncryption' do
37+
platform :tvos, TVOS_VERSION
38+
project 'Swift.xcodeproj'
39+
pod 'PusherSwiftWithEncryption', :path => '../../'
40+
end
3641
target 'ObjectiveC-iOS-WithoutEncryption' do
3742
platform :ios, IOS_VERSION
3843
project 'ObjectiveC.xcodeproj'
@@ -58,3 +63,8 @@ target 'ObjectiveC-tvOS-WithoutEncryption' do
5863
project 'ObjectiveC.xcodeproj'
5964
pod 'PusherSwift', :path => '../../'
6065
end
66+
target 'ObjectiveC-tvOS-WithEncryption' do
67+
platform :tvos, TVOS_VERSION
68+
project 'ObjectiveC.xcodeproj'
69+
pod 'PusherSwiftWithEncryption', :path => '../../'
70+
end

0 commit comments

Comments
 (0)