diff --git a/.gitignore b/.gitignore
index b4d4cf94..602a9578 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,4 +24,11 @@ ci/apple*
omvll.log
# Tmp folder
-tmp/*
\ No newline at end of file
+tmp/*
+
+# Samples
+samples/GoodNight*
+samples/HackerNews*
+samples/HexaCalc*
+samples/Kotoba*
+samples/SnowPlow*
\ No newline at end of file
diff --git a/ci/Jenkinsfile-MacOs b/ci/Jenkinsfile-MacOs
index 467b8c53..c7c0eaca 100644
--- a/ci/Jenkinsfile-MacOs
+++ b/ci/Jenkinsfile-MacOs
@@ -69,7 +69,7 @@ pipeline {
sh 'gzip -d ${OUTPUT_FOLDER}/omvll_unsigned.dylib.gz'
// Get TAK delivery
sh 'ci/devtools-bash-utils/nexus.sh -o tmp/TAK-Client.zip -g com.build38.tak -i tak-delivery -v 2.14.2 -c 1426 -e zip download-v2'
- sh 'unzip ${TMP_FOLDER}/TAK-Client.zip -d tmp/'
+ sh 'unzip ${TMP_FOLDER}/TAK-Client.zip -d ${TMP_FOLDER}'
// Get signer from nexus
sh 'ci/devtools-bash-utils/nexus.sh -o ci/apple-platform-rs.tar.gz -g com.indygreg -i apple-platform-rs -v 0.26.0 -e tar.gz download-v2'
@@ -78,6 +78,9 @@ pipeline {
// Get Python lib dependency
sh 'ci/devtools-bash-utils/nexus.sh -o tmp/Python-3.10.7.tgz -g org.python -i python -v 3.10.7 -e tgz download-v2'
sh 'tar -C ${DIST_FOLDER} -xvf tmp/Python-3.10.7.tgz'
+
+ // Get Samples repo
+ sh 'ci/getSampleRepositories.sh'
}
}
}
@@ -115,7 +118,7 @@ pipeline {
cd samples
. ./omvll.env
cd ObjCHelloOmvll
- xcodebuild -scheme ObjCHelloOmvll clean build -sdk iphoneos ONLY_ACTIVE_ARCH=YES
+ xcodebuild -scheme ObjCHelloOmvll clean build -sdk iphoneos -derivedDataPath ./output ONLY_ACTIVE_ARCH=YES
ret=$?
exit $ret
'''
@@ -134,7 +137,7 @@ pipeline {
cd samples
. ./omvll.env
cd SwiftHelloOmvll
- xcodebuild -scheme SwiftHelloOmvll clean build -configuration Release -sdk iphoneos ONLY_ACTIVE_ARCH=YES
+ xcodebuild -scheme SwiftHelloOmvll clean build -configuration Release -sdk iphoneos -derivedDataPath ./output ONLY_ACTIVE_ARCH=YES
ret=$?
exit $ret
'''
@@ -143,6 +146,35 @@ pipeline {
}
}
+ stage('Test apps') {
+ steps {
+ script {
+ dir("${WORKSPACE}") {
+ sh '''#!/usr/bin/env bash
+ source ci/devtools-bash-utils/utils.sh
+ cd samples
+ . ./omvll.env
+ cd GoodNight
+ execute xcodebuild -project GoodNight.xcodeproj -scheme GoodNight -sdk iphoneos -configuration Release -derivedDataPath ./output clean build
+ cd -
+ cd HexaCalc
+ execute xcodebuild -project HexaCalc.xcodeproj -scheme HexaCalc -sdk iphoneos -configuration Release -derivedDataPath ./output clean build
+ cd -
+ cd Kotoba
+ execute xcodebuild -project code/Kotoba.xcodeproj -scheme Kotoba -sdk iphoneos -configuration Release -derivedDataPath ./output clean build
+ cd -
+ cd HackerNews
+ execute xcodebuild -workspace HackerNews.xcworkspace -scheme HackerNews -sdk iphoneos -configuration Release -derivedDataPath ./output clean build
+ cd -
+ cd SnowPlow
+ execute xcodebuild -workspace Examples/demo/SnowplowObjcDemo/SnowplowDemo.xcworkspace -scheme SnowplowDemo -sdk iphoneos -configuration Release -derivedDataPath ./output clean build
+ cd -
+ '''
+ }
+ }
+ }
+ }
+
stage('Create artifact') {
steps {
script {
@@ -187,13 +219,22 @@ pipeline {
}
success {
script {
- bitbucketStatusNotify(
- buildState: 'SUCCESSFUL',
- buildName: "${env.JOB_NAME}",
- buildKey: "${env.JOB_NAME}",
- repoSlug: "${env.REPO_SLUG}",
- commitId: "${env.GIT_COMMIT}"
- )
+ // Upload android artifacts when failed
+ archiveArtifacts allowEmptyArchive: true, artifacts:
+ // iOS Apps
+ "samples/ObjCHelloOmvll/output/Build/Products/Debug-iphoneos/ObjCHelloOmvll.app/**," +
+ "samples/SwiftHelloOmvll/output/Build/Products/Debug-iphoneos/SwiftHelloOmvll.app/**," +
+ "samples/GoodNight/output/Build/Products/Debug-iphoneos/GoodNight.app/**," +
+ "samples/HackerNews/output/Build/Products/Release-iphoneos/HackerNews.app/**," +
+ "samples/Kotoba/output/Build/Products/Release-iphoneos/Kotoba.app/**," +
+ "samples/SnowPlow/output/Build/Products/Release-iphoneos/SnowplowDemo.app/**,", fingerprint: true
+ bitbucketStatusNotify(
+ buildState: 'SUCCESSFUL',
+ buildName: "${env.JOB_NAME}",
+ buildKey: "${env.JOB_NAME}",
+ repoSlug: "${env.REPO_SLUG}",
+ commitId: "${env.GIT_COMMIT}"
+ )
}
}
unsuccessful {
diff --git a/samples/omvll.env b/samples/omvll.env
index 1e7f55ca..42de2be6 100644
--- a/samples/omvll.env
+++ b/samples/omvll.env
@@ -1,5 +1,5 @@
# This needs to be set from this specific folder using . ./omvll.env
export OMVLL_CONFIG=$(pwd)/omvll-config.py
-export OMVLL_PYTHONPATH=$(pwd)/../ci/distribution/Python-3.10.7/Lib
+export OMVLL_PYTHONPATH=$(pwd)/../tmp/Python-3.10.7/Lib
export OMVLL_PLUGIN_PATH=$(pwd)/../src/build_xcode/omvll.dylib
export OMVLL_SWIFT_FRONTEND_SHIM_VERBOSE=1
\ No newline at end of file
diff --git a/samples/patches/GoodNight.patch b/samples/patches/GoodNight.patch
new file mode 100644
index 00000000..6ff8d86a
--- /dev/null
+++ b/samples/patches/GoodNight.patch
@@ -0,0 +1,221 @@
+diff --git a/GoodNight Widget/GoodNight Widget.entitlements b/GoodNight Widget/GoodNight Widget.entitlements
+index 7a93f66..147b8ee 100644
+--- a/GoodNight Widget/GoodNight Widget.entitlements
++++ b/GoodNight Widget/GoodNight Widget.entitlements
+@@ -4,7 +4,7 @@
+
+ com.apple.security.application-groups
+
+- group.com.agatiello.GoodNight
++ group.com.build38.signal.group
+
+
+
+diff --git a/GoodNight.xcodeproj/project.pbxproj b/GoodNight.xcodeproj/project.pbxproj
+index fa96a93..9a92727 100755
+--- a/GoodNight.xcodeproj/project.pbxproj
++++ b/GoodNight.xcodeproj/project.pbxproj
+@@ -55,6 +55,9 @@
+ 92F23AC21BD72AE700A097CB /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92F23AC41BD72AE700A097CB /* Storyboard.storyboard */; };
+ 92FEA6B11DE6B324001EA06B /* TemperatureTouchBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92FEA6B01DE6B324001EA06B /* TemperatureTouchBarController.m */; };
+ ACCE45A21C1B6D3100CD094C /* SpringBoardServicesClient.m in Sources */ = {isa = PBXBuildFile; fileRef = ACCE45A11C1B6D3100CD094C /* SpringBoardServicesClient.m */; };
++ B101C2B62BBC339100E11CBF /* libWBC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2B42BBC339100E11CBF /* libWBC.a */; };
++ B101C2B72BBC339100E11CBF /* libTAK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2B52BBC339100E11CBF /* libTAK.a */; };
++ B101C2B92BBC33A400E11CBF /* license.tak in Resources */ = {isa = PBXBuildFile; fileRef = B101C2B82BBC33A400E11CBF /* license.tak */; };
+ B96BB64F1B38D96600F1C3AE /* GammaController.m in Sources */ = {isa = PBXBuildFile; fileRef = B96BB64E1B38D96600F1C3AE /* GammaController.m */; };
+ B9E5364B1B38D90D0097BF90 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B9E5364A1B38D90D0097BF90 /* main.m */; };
+ B9E5364E1B38D90D0097BF90 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B9E5364D1B38D90D0097BF90 /* AppDelegate.m */; };
+@@ -186,6 +189,9 @@
+ 92FEA6B01DE6B324001EA06B /* TemperatureTouchBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TemperatureTouchBarController.m; sourceTree = ""; };
+ ACCE45A01C1B6D3100CD094C /* SpringBoardServicesClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpringBoardServicesClient.h; sourceTree = ""; };
+ ACCE45A11C1B6D3100CD094C /* SpringBoardServicesClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpringBoardServicesClient.m; sourceTree = ""; };
++ B101C2B42BBC339100E11CBF /* libWBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libWBC.a; path = "../../tmp/TAK-Client/iOS/C/libs/libWBC.a"; sourceTree = ""; };
++ B101C2B52BBC339100E11CBF /* libTAK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTAK.a; path = "../../tmp/TAK-Client/iOS/C/libs/libTAK.a"; sourceTree = ""; };
++ B101C2B82BBC33A400E11CBF /* license.tak */ = {isa = PBXFileReference; lastKnownFileType = file; name = license.tak; path = "../../tmp/TAK-Client/licenses/license.tak"; sourceTree = ""; };
+ B96BB64D1B38D96600F1C3AE /* GammaController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GammaController.h; sourceTree = ""; };
+ B96BB64E1B38D96600F1C3AE /* GammaController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GammaController.m; sourceTree = ""; };
+ B9E536461B38D90D0097BF90 /* GoodNight.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GoodNight.app; sourceTree = BUILT_PRODUCTS_DIR; };
+@@ -220,6 +226,8 @@
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B101C2B62BBC339100E11CBF /* libWBC.a in Frameworks */,
++ B101C2B72BBC339100E11CBF /* libTAK.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+@@ -347,6 +355,8 @@
+ 925B811F1BE2BCE1003A6C4B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
++ B101C2B52BBC339100E11CBF /* libTAK.a */,
++ B101C2B42BBC339100E11CBF /* libWBC.a */,
+ 928F58251DED09B100BB52B8 /* MASShortcut.framework */,
+ 926B25451DEBC35B00F19980 /* Sparkle.framework */,
+ 925B81201BE2BCE1003A6C4B /* NotificationCenter.framework */,
+@@ -617,6 +627,7 @@
+ B9E5363D1B38D90D0097BF90 = {
+ isa = PBXGroup;
+ children = (
++ B101C2B82BBC33A400E11CBF /* license.tak */,
+ 75885DCC1C2027A500B57791 /* Shared */,
+ B9E536481B38D90D0097BF90 /* GoodNight */,
+ 925B81221BE2BCE1003A6C4B /* GoodNight Widget */,
+@@ -734,8 +745,8 @@
+ };
+ 925B811D1BE2BCE1003A6C4B = {
+ CreatedOnToolsVersion = 7.2;
+- DevelopmentTeam = 9QKLXG4845;
+- ProvisioningStyle = Manual;
++ DevelopmentTeam = WCMG6DCKKM;
++ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.ApplicationGroups.iOS = {
+ enabled = 1;
+@@ -747,8 +758,8 @@
+ };
+ B9E536451B38D90D0097BF90 = {
+ CreatedOnToolsVersion = 7.0;
+- DevelopmentTeam = 9QKLXG4845;
+- ProvisioningStyle = Manual;
++ DevelopmentTeam = WCMG6DCKKM;
++ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.ApplicationGroups.iOS = {
+ enabled = 1;
+@@ -768,8 +779,13 @@
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
++ English,
+ en,
+ Base,
++ ja,
++ nl,
++ de,
++ fr,
+ );
+ mainGroup = B9E5363D1B38D90D0097BF90;
+ productRefGroup = B9E536471B38D90D0097BF90 /* Products */;
+@@ -806,6 +822,7 @@
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B101C2B92BBC33A400E11CBF /* license.tak in Resources */,
+ 0025148E1CDCCFCC00482F87 /* Localizable.strings in Resources */,
+ 75885DCB1C2026B700B57791 /* Defaults.plist in Resources */,
+ 92F23ABF1BD72ADD00A097CB /* LaunchScreen.storyboard in Resources */,
+@@ -1075,8 +1092,9 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Brand Assets";
+ CODE_SIGN_ENTITLEMENTS = GoodNight/GoodNight.entitlements;
+- CODE_SIGN_IDENTITY = "iPhone Distribution: ADA Tech, LLC";
+- DEVELOPMENT_TEAM = 9QKLXG4845;
++ CODE_SIGN_IDENTITY = "Apple Development";
++ CODE_SIGN_STYLE = Automatic;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+@@ -1086,10 +1104,11 @@
+ GCC_THUMB_SUPPORT = NO;
+ INFOPLIST_FILE = "$(SRCROOT)/GoodNight/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+- PRODUCT_BUNDLE_IDENTIFIER = com.agatiello.GoodNight;
++ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../tmp/TAK-Client/iOS/C/libs";
++ OTHER_LDFLAGS = "-lstdc++";
++ PRODUCT_BUNDLE_IDENTIFIER = com.build38.GoodNight;
+ PRODUCT_NAME = GoodNight;
+- PROVISIONING_PROFILE = "d859dcdf-12a2-465a-8ed2-3cb6ab6bf02b";
+- PROVISIONING_PROFILE_SPECIFIER = GoodNight;
++ PROVISIONING_PROFILE_SPECIFIER = "";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Enterprise;
+@@ -1100,15 +1119,16 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ CODE_SIGN_ENTITLEMENTS = "GoodNight Widget/GoodNight Widget.entitlements";
+- DEVELOPMENT_TEAM = 9QKLXG4845;
++ CODE_SIGN_IDENTITY = "Apple Development";
++ CODE_SIGN_STYLE = Automatic;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ ENABLE_BITCODE = NO;
+ GCC_PREFIX_HEADER = GoodNight/PrefixHeader.pch;
+ INFOPLIST_FILE = "GoodNight Widget/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
+- PRODUCT_BUNDLE_IDENTIFIER = "com.agatiello.GoodNight.GoodNight-Widget";
++ PRODUCT_BUNDLE_IDENTIFIER = "com.build38.GoodNight.GoodNight-Widget";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+- PROVISIONING_PROFILE = "0294b426-e9c0-493a-bf93-262f3f9d5307";
+- PROVISIONING_PROFILE_SPECIFIER = "GoodNight Widget (Development)";
++ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ };
+ name = Debug;
+@@ -1133,9 +1153,11 @@
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_ENTITLEMENTS = "GoodNight Widget/GoodNight Widget.entitlements";
++ CODE_SIGN_IDENTITY = "Apple Development";
++ CODE_SIGN_STYLE = Automatic;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+- DEVELOPMENT_TEAM = 9QKLXG4845;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ ENABLE_BITCODE = NO;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+@@ -1151,10 +1173,9 @@
+ INFOPLIST_FILE = "GoodNight Widget/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
+ MTL_ENABLE_DEBUG_INFO = NO;
+- PRODUCT_BUNDLE_IDENTIFIER = "com.agatiello.GoodNight.GoodNight-Widget";
++ PRODUCT_BUNDLE_IDENTIFIER = "com.build38.GoodNight.GoodNight-Widget";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+- PROVISIONING_PROFILE = "877dad75-3f5b-4e87-83cc-3f39379469bf";
+- PROVISIONING_PROFILE_SPECIFIER = "GoodNight Widget";
++ PROVISIONING_PROFILE_SPECIFIER = "";
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ VALIDATE_PRODUCT = YES;
+@@ -1215,8 +1236,9 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Brand Assets";
+ CODE_SIGN_ENTITLEMENTS = GoodNight/GoodNight.entitlements;
+- CODE_SIGN_IDENTITY = "iPhone Developer: Anthony Agatiello (J9M2GPP36A)";
+- DEVELOPMENT_TEAM = 9QKLXG4845;
++ CODE_SIGN_IDENTITY = "Apple Development";
++ CODE_SIGN_STYLE = Automatic;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ ENABLE_BITCODE = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+@@ -1226,10 +1248,11 @@
+ GCC_THUMB_SUPPORT = NO;
+ INFOPLIST_FILE = "$(SRCROOT)/GoodNight/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+- PRODUCT_BUNDLE_IDENTIFIER = com.agatiello.GoodNight;
++ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../tmp/TAK-Client/iOS/C/libs";
++ OTHER_LDFLAGS = "-lstdc++";
++ PRODUCT_BUNDLE_IDENTIFIER = com.build38.GoodNight;
+ PRODUCT_NAME = GoodNight;
+- PROVISIONING_PROFILE = "588851c4-c84d-4ac4-a98d-e468ce1eca1e";
+- PROVISIONING_PROFILE_SPECIFIER = "GoodNight (Development)";
++ PROVISIONING_PROFILE_SPECIFIER = "";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+diff --git a/GoodNight/GoodNight.entitlements b/GoodNight/GoodNight.entitlements
+index 7a93f66..147b8ee 100644
+--- a/GoodNight/GoodNight.entitlements
++++ b/GoodNight/GoodNight.entitlements
+@@ -4,7 +4,7 @@
+
+ com.apple.security.application-groups
+
+- group.com.agatiello.GoodNight
++ group.com.build38.signal.group
+
+
+
diff --git a/samples/patches/HackerNews.patch b/samples/patches/HackerNews.patch
new file mode 100644
index 00000000..56eae264
--- /dev/null
+++ b/samples/patches/HackerNews.patch
@@ -0,0 +1,311 @@
+diff --git a/HackerNews.xcodeproj/project.pbxproj b/HackerNews.xcodeproj/project.pbxproj
+index f42a2fc..c8cb1c6 100644
+--- a/HackerNews.xcodeproj/project.pbxproj
++++ b/HackerNews.xcodeproj/project.pbxproj
+@@ -10,6 +10,9 @@
+ 4F8219F707E687C004248DF1 /* libPods-HackerNewsTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 968F53F3E2A631FD683B394F /* libPods-HackerNewsTests.a */; };
+ 98F2FC9208B97EF48EA94F5C /* libPods-HackerNews.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A6179244E1E7A250286CCF78 /* libPods-HackerNews.a */; };
+ A639CD2397C7DD8F920991EF /* libPods-HackerNewsUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 192727F69DBDD660CDA8204C /* libPods-HackerNewsUITests.a */; };
++ B139F6B52BA9C9BD00806ED9 /* libTAK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B139F6B32BA9C9BD00806ED9 /* libTAK.a */; };
++ B139F6B62BA9C9BD00806ED9 /* libWBC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B139F6B42BA9C9BD00806ED9 /* libWBC.a */; };
++ B139F6B82BA9CA5F00806ED9 /* license.tak in Resources */ = {isa = PBXBuildFile; fileRef = B139F6B72BA9CA5F00806ED9 /* license.tak */; };
+ D7229DF8193EB2C2008F661B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D74A035F193DA4F500F01247 /* Images.xcassets */; };
+ D74A0359193DA4F500F01247 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74A0358193DA4F500F01247 /* AppDelegate.swift */; };
+ D74A035E193DA4F500F01247 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D74A035C193DA4F500F01247 /* Main.storyboard */; };
+@@ -44,6 +47,9 @@
+ 968F53F3E2A631FD683B394F /* libPods-HackerNewsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HackerNewsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ A6179244E1E7A250286CCF78 /* libPods-HackerNews.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HackerNews.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ A6DF7E9167DA8234327BD2B4 /* Pods-HackerNewsUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackerNewsUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-HackerNewsUITests/Pods-HackerNewsUITests.release.xcconfig"; sourceTree = ""; };
++ B139F6B32BA9C9BD00806ED9 /* libTAK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTAK.a; path = "../tmp/TAK-Client/iOS/C/libs/libTAK.a"; sourceTree = ""; };
++ B139F6B42BA9C9BD00806ED9 /* libWBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libWBC.a; path = "../tmp/TAK-Client/iOS/C/libs/libWBC.a"; sourceTree = ""; };
++ B139F6B72BA9CA5F00806ED9 /* license.tak */ = {isa = PBXFileReference; lastKnownFileType = file; name = license.tak; path = "../../tmp/TAK-Client/licenses/license.tak"; sourceTree = ""; };
+ B84E16FC9C96879C64AC2254 /* Pods-HackerNews.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackerNews.release.xcconfig"; path = "Pods/Target Support Files/Pods-HackerNews/Pods-HackerNews.release.xcconfig"; sourceTree = ""; };
+ CDADB96A77180BC65D64FC00 /* Pods-HackerNewsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackerNewsTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-HackerNewsTests/Pods-HackerNewsTests.release.xcconfig"; sourceTree = ""; };
+ D71CA51D194698BC006DE243 /* HackerNews-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HackerNews-Bridging-Header.h"; sourceTree = ""; };
+@@ -67,6 +73,8 @@
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B139F6B52BA9C9BD00806ED9 /* libTAK.a in Frameworks */,
++ B139F6B62BA9C9BD00806ED9 /* libWBC.a in Frameworks */,
+ 98F2FC9208B97EF48EA94F5C /* libPods-HackerNews.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+@@ -106,6 +114,8 @@
+ 3B07FA30BCC75CD6EA81C8E9 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
++ B139F6B32BA9C9BD00806ED9 /* libTAK.a */,
++ B139F6B42BA9C9BD00806ED9 /* libWBC.a */,
+ A6179244E1E7A250286CCF78 /* libPods-HackerNews.a */,
+ 968F53F3E2A631FD683B394F /* libPods-HackerNewsTests.a */,
+ 192727F69DBDD660CDA8204C /* libPods-HackerNewsUITests.a */,
+@@ -116,6 +126,7 @@
+ D74A034A193DA4F500F01247 = {
+ isa = PBXGroup;
+ children = (
++ B139F6B72BA9CA5F00806ED9 /* license.tak */,
+ D74A0355193DA4F500F01247 /* HackerNews */,
+ D74A0368193DA4F600F01247 /* HackerNewsTests */,
+ D7EF90A81B6C617F00EB6915 /* HackerNewsUITests */,
+@@ -204,8 +215,6 @@
+ D74A034F193DA4F500F01247 /* Sources */,
+ D74A0350193DA4F500F01247 /* Frameworks */,
+ D74A0351193DA4F500F01247 /* Resources */,
+- E649E0F0A245F27646543313 /* [CP] Embed Pods Frameworks */,
+- 2CD489E7A998054DCD029114 /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+@@ -224,8 +233,6 @@
+ D74A0361193DA4F600F01247 /* Sources */,
+ D74A0362193DA4F600F01247 /* Frameworks */,
+ D74A0363193DA4F600F01247 /* Resources */,
+- 1FFE991F90CC111CD0FE9EDA /* [CP] Embed Pods Frameworks */,
+- 92E674EBF015FC33B307D66C /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+@@ -245,8 +252,6 @@
+ D7EF90A31B6C617F00EB6915 /* Sources */,
+ D7EF90A41B6C617F00EB6915 /* Frameworks */,
+ D7EF90A51B6C617F00EB6915 /* Resources */,
+- FADDE607A9687B1CFB5A1780 /* [CP] Copy Pods Resources */,
+- A23E0496E9CEB14DB919223F /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+@@ -289,6 +294,7 @@
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
++ English,
+ en,
+ Base,
+ );
+@@ -309,6 +315,7 @@
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B139F6B82BA9CA5F00806ED9 /* license.tak in Resources */,
+ D74A035E193DA4F500F01247 /* Main.storyboard in Resources */,
+ D7229DF8193EB2C2008F661B /* Images.xcassets in Resources */,
+ );
+@@ -331,34 +338,22 @@
+ /* End PBXResourcesBuildPhase section */
+
+ /* Begin PBXShellScriptBuildPhase section */
+- 1FFE991F90CC111CD0FE9EDA /* [CP] Embed Pods Frameworks */ = {
+- isa = PBXShellScriptBuildPhase;
+- buildActionMask = 2147483647;
+- files = (
+- );
+- inputPaths = (
+- );
+- name = "[CP] Embed Pods Frameworks";
+- outputPaths = (
+- );
+- runOnlyForDeploymentPostprocessing = 0;
+- shellPath = /bin/sh;
+- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackerNewsTests/Pods-HackerNewsTests-frameworks.sh\"\n";
+- showEnvVarsInLog = 0;
+- };
+ 23B36DD4702EE7C031BF2A86 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
++ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
++ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputPaths = (
++ "$(DERIVED_FILE_DIR)/Pods-HackerNews-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+- 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";
++ 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";
+ showEnvVarsInLog = 0;
+ };
+ 25ECEC59AC32C6EDC014FAB8 /* [CP] Check Pods Manifest.lock */ = {
+@@ -367,28 +362,16 @@
+ files = (
+ );
+ inputPaths = (
++ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
++ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputPaths = (
++ "$(DERIVED_FILE_DIR)/Pods-HackerNewsTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+- 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";
+- showEnvVarsInLog = 0;
+- };
+- 2CD489E7A998054DCD029114 /* [CP] Copy Pods Resources */ = {
+- isa = PBXShellScriptBuildPhase;
+- buildActionMask = 2147483647;
+- files = (
+- );
+- inputPaths = (
+- );
+- name = "[CP] Copy Pods Resources";
+- outputPaths = (
+- );
+- runOnlyForDeploymentPostprocessing = 0;
+- shellPath = /bin/sh;
+- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackerNews/Pods-HackerNews-resources.sh\"\n";
++ 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";
+ showEnvVarsInLog = 0;
+ };
+ 71708FAC63CB9F6C090885FF /* [CP] Check Pods Manifest.lock */ = {
+@@ -397,73 +380,16 @@
+ files = (
+ );
+ inputPaths = (
++ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
++ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputPaths = (
++ "$(DERIVED_FILE_DIR)/Pods-HackerNewsUITests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+- 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";
+- showEnvVarsInLog = 0;
+- };
+- 92E674EBF015FC33B307D66C /* [CP] Copy Pods Resources */ = {
+- isa = PBXShellScriptBuildPhase;
+- buildActionMask = 2147483647;
+- files = (
+- );
+- inputPaths = (
+- );
+- name = "[CP] Copy Pods Resources";
+- outputPaths = (
+- );
+- runOnlyForDeploymentPostprocessing = 0;
+- shellPath = /bin/sh;
+- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackerNewsTests/Pods-HackerNewsTests-resources.sh\"\n";
+- showEnvVarsInLog = 0;
+- };
+- A23E0496E9CEB14DB919223F /* [CP] Embed Pods Frameworks */ = {
+- isa = PBXShellScriptBuildPhase;
+- buildActionMask = 2147483647;
+- files = (
+- );
+- inputPaths = (
+- );
+- name = "[CP] Embed Pods Frameworks";
+- outputPaths = (
+- );
+- runOnlyForDeploymentPostprocessing = 0;
+- shellPath = /bin/sh;
+- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackerNewsUITests/Pods-HackerNewsUITests-frameworks.sh\"\n";
+- showEnvVarsInLog = 0;
+- };
+- E649E0F0A245F27646543313 /* [CP] Embed Pods Frameworks */ = {
+- isa = PBXShellScriptBuildPhase;
+- buildActionMask = 2147483647;
+- files = (
+- );
+- inputPaths = (
+- );
+- name = "[CP] Embed Pods Frameworks";
+- outputPaths = (
+- );
+- runOnlyForDeploymentPostprocessing = 0;
+- shellPath = /bin/sh;
+- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackerNews/Pods-HackerNews-frameworks.sh\"\n";
+- showEnvVarsInLog = 0;
+- };
+- FADDE607A9687B1CFB5A1780 /* [CP] Copy Pods Resources */ = {
+- isa = PBXShellScriptBuildPhase;
+- buildActionMask = 2147483647;
+- files = (
+- );
+- inputPaths = (
+- );
+- name = "[CP] Copy Pods Resources";
+- outputPaths = (
+- );
+- runOnlyForDeploymentPostprocessing = 0;
+- shellPath = /bin/sh;
+- shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackerNewsUITests/Pods-HackerNewsUITests-resources.sh\"\n";
++ 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";
+ showEnvVarsInLog = 0;
+ };
+ /* End PBXShellScriptBuildPhase section */
+@@ -616,10 +542,32 @@
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMPRESS_PNG_FILES = YES;
+- DEVELOPMENT_TEAM = P229S7564Q;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = HackerNews/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
++ LIBRARY_SEARCH_PATHS = (
++ "$(inherited)",
++ "\"${PODS_CONFIGURATION_BUILD_DIR}/Firebase\"",
++ "\"${PODS_ROOT}/Firebase\"",
++ "$(PROJECT_DIR)/../../tmp/TAK-Client/iOS/C/libs",
++ );
++ OTHER_CFLAGS = "-fno-legacy-pass-manager";
++ OTHER_LDFLAGS = (
++ "$(inherited)",
++ "-ObjC",
++ "-l\"Firebase\"",
++ "-l\"FirebaseStatic\"",
++ "-l\"c++\"",
++ "-l\"icucore\"",
++ "-framework",
++ "\"CFNetwork\"",
++ "-framework",
++ "\"Security\"",
++ "-framework",
++ "\"SystemConfiguration\"",
++ "-lstdc++",
++ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.amitburst.hn;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+@@ -639,10 +587,32 @@
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMPRESS_PNG_FILES = YES;
+- DEVELOPMENT_TEAM = P229S7564Q;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = HackerNews/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.2;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
++ LIBRARY_SEARCH_PATHS = (
++ "$(inherited)",
++ "\"${PODS_CONFIGURATION_BUILD_DIR}/Firebase\"",
++ "\"${PODS_ROOT}/Firebase\"",
++ "$(PROJECT_DIR)/../../tmp/TAK-Client/iOS/C/libs",
++ );
++ OTHER_CFLAGS = "-fno-legacy-pass-manager";
++ OTHER_LDFLAGS = (
++ "$(inherited)",
++ "-ObjC",
++ "-l\"Firebase\"",
++ "-l\"FirebaseStatic\"",
++ "-l\"c++\"",
++ "-l\"icucore\"",
++ "-framework",
++ "\"CFNetwork\"",
++ "-framework",
++ "\"Security\"",
++ "-framework",
++ "\"SystemConfiguration\"",
++ "-lstdc++",
++ );
+ PRODUCT_BUNDLE_IDENTIFIER = me.amitburst.hn;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
diff --git a/samples/patches/HexaCalc.patch b/samples/patches/HexaCalc.patch
new file mode 100644
index 00000000..c378c6ff
--- /dev/null
+++ b/samples/patches/HexaCalc.patch
@@ -0,0 +1,418 @@
+diff --git a/HexaCalc.xcodeproj/project.pbxproj b/HexaCalc.xcodeproj/project.pbxproj
+index 84319f0..2512b33 100644
+--- a/HexaCalc.xcodeproj/project.pbxproj
++++ b/HexaCalc.xcodeproj/project.pbxproj
+@@ -12,43 +12,26 @@
+ 9D7C09BF25EC61E700771D52 /* HexaCalcIconIndigo-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099625EC61E500771D52 /* HexaCalcIconIndigo-83.5@3x~ipad.png */; };
+ 9D7C09C025EC61E700771D52 /* HexaCalcIconBlue@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099725EC61E500771D52 /* HexaCalcIconBlue@2x~ipad.png */; };
+ 9D7C09C125EC61E700771D52 /* HexaCalcIconOrange~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099825EC61E500771D52 /* HexaCalcIconOrange~ipad.png */; };
+- 9D7C09C225EC61E700771D52 /* HexaCalcIconRed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099925EC61E500771D52 /* HexaCalcIconRed@2x.png */; };
+ 9D7C09C325EC61E700771D52 /* HexaCalcIconGreen-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099A25EC61E500771D52 /* HexaCalcIconGreen-83.5@3x~ipad.png */; };
+- 9D7C09C425EC61E700771D52 /* HexaCalcIconIndigo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099B25EC61E500771D52 /* HexaCalcIconIndigo@2x.png */; };
+ 9D7C09C525EC61E700771D52 /* HexaCalcIconRed~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099C25EC61E500771D52 /* HexaCalcIconRed~ipad.png */; };
+ 9D7C09C625EC61E700771D52 /* HexaCalcIconPurple-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099D25EC61E500771D52 /* HexaCalcIconPurple-83.5@3x~ipad.png */; };
+ 9D7C09C725EC61E700771D52 /* HexaCalcIconPurple@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099E25EC61E500771D52 /* HexaCalcIconPurple@2x~ipad.png */; };
+- 9D7C09C825EC61E700771D52 /* HexaCalcIconGreen@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C099F25EC61E500771D52 /* HexaCalcIconGreen@2x.png */; };
+ 9D7C09C925EC61E700771D52 /* HexaCalcIconGreen@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A025EC61E500771D52 /* HexaCalcIconGreen@2x~ipad.png */; };
+ 9D7C09CA25EC61E700771D52 /* HexaCalcIconYellow-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A125EC61E500771D52 /* HexaCalcIconYellow-83.5@3x~ipad.png */; };
+ 9D7C09CB25EC61E700771D52 /* HexaCalcIconYellow~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A225EC61E500771D52 /* HexaCalcIconYellow~ipad.png */; };
+ 9D7C09CC25EC61E700771D52 /* HexaCalcIconTeal~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A325EC61E500771D52 /* HexaCalcIconTeal~ipad.png */; };
+- 9D7C09CD25EC61E700771D52 /* HexaCalcIconGreen@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A425EC61E500771D52 /* HexaCalcIconGreen@3x.png */; };
+- 9D7C09CE25EC61E700771D52 /* HexaCalcIconPurple@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A525EC61E600771D52 /* HexaCalcIconPurple@3x.png */; };
+- 9D7C09CF25EC61E700771D52 /* HexaCalcIconOrange@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A625EC61E600771D52 /* HexaCalcIconOrange@2x.png */; };
+- 9D7C09D025EC61E700771D52 /* HexaCalcIconIndigo@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A725EC61E600771D52 /* HexaCalcIconIndigo@3x.png */; };
+- 9D7C09D125EC61E700771D52 /* HexaCalcIconRed@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A825EC61E600771D52 /* HexaCalcIconRed@3x.png */; };
+ 9D7C09D225EC61E700771D52 /* HexaCalcIconOrange-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09A925EC61E600771D52 /* HexaCalcIconOrange-83.5@3x~ipad.png */; };
+- 9D7C09D325EC61E700771D52 /* HexaCalcIconPurple@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09AA25EC61E600771D52 /* HexaCalcIconPurple@2x.png */; };
+ 9D7C09D425EC61E700771D52 /* HexaCalcIconPurple~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09AB25EC61E600771D52 /* HexaCalcIconPurple~ipad.png */; };
+- 9D7C09D525EC61E700771D52 /* HexaCalcIconYellow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09AC25EC61E600771D52 /* HexaCalcIconYellow@2x.png */; };
+ 9D7C09D625EC61E700771D52 /* HexaCalcIconBlue~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09AD25EC61E600771D52 /* HexaCalcIconBlue~ipad.png */; };
+ 9D7C09D725EC61E700771D52 /* HexaCalcIconYellow@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09AE25EC61E600771D52 /* HexaCalcIconYellow@2x~ipad.png */; };
+ 9D7C09D825EC61E700771D52 /* HexaCalcIconOrange@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09AF25EC61E600771D52 /* HexaCalcIconOrange@2x~ipad.png */; };
+ 9D7C09D925EC61E700771D52 /* HexaCalcIconBlue-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B025EC61E600771D52 /* HexaCalcIconBlue-83.5@3x~ipad.png */; };
+- 9D7C09DA25EC61E700771D52 /* HexaCalcIconTeal@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B125EC61E600771D52 /* HexaCalcIconTeal@3x.png */; };
+ 9D7C09DB25EC61E700771D52 /* HexaCalcIconTeal@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B225EC61E600771D52 /* HexaCalcIconTeal@2x~ipad.png */; };
+ 9D7C09DC25EC61E700771D52 /* HexaCalcIconRed-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B325EC61E600771D52 /* HexaCalcIconRed-83.5@3x~ipad.png */; };
+- 9D7C09DD25EC61E700771D52 /* HexaCalcIconGreen1024.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B425EC61E600771D52 /* HexaCalcIconGreen1024.png */; };
+ 9D7C09DE25EC61E700771D52 /* HexaCalcIconGreen~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B525EC61E600771D52 /* HexaCalcIconGreen~ipad.png */; };
+ 9D7C09DF25EC61E700771D52 /* HexaCalcIconTeal-83.5@3x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B625EC61E600771D52 /* HexaCalcIconTeal-83.5@3x~ipad.png */; };
+- 9D7C09E025EC61E700771D52 /* HexaCalcIconBlue@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B725EC61E600771D52 /* HexaCalcIconBlue@2x.png */; };
+- 9D7C09E125EC61E700771D52 /* HexaCalcIconYellow@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B825EC61E600771D52 /* HexaCalcIconYellow@3x.png */; };
+ 9D7C09E225EC61E700771D52 /* HexaCalcIconIndigo~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09B925EC61E600771D52 /* HexaCalcIconIndigo~ipad.png */; };
+- 9D7C09E325EC61E700771D52 /* HexaCalcIconOrange@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09BA25EC61E600771D52 /* HexaCalcIconOrange@3x.png */; };
+- 9D7C09E425EC61E700771D52 /* HexaCalcIconTeal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09BB25EC61E600771D52 /* HexaCalcIconTeal@2x.png */; };
+ 9D7C09E525EC61E700771D52 /* HexaCalcIconIndigo@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09BC25EC61E700771D52 /* HexaCalcIconIndigo@2x~ipad.png */; };
+- 9D7C09E625EC61E700771D52 /* HexaCalcIconBlue@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09BD25EC61E700771D52 /* HexaCalcIconBlue@3x.png */; };
+ 9D7C09E725EC61E700771D52 /* HexaCalcIconRed@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D7C09BE25EC61E700771D52 /* HexaCalcIconRed@2x~ipad.png */; };
+ 9D8460252A46C182008C5A99 /* HistoryButtonViewConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D8460242A46C182008C5A99 /* HistoryButtonViewConverter.swift */; };
+ 9D8A805524CB82A0008CDECE /* Formatter+BinaryString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D8A805424CB82A0008CDECE /* Formatter+BinaryString.swift */; };
+@@ -85,6 +68,9 @@
+ 9DEF24A824C553F100701F5B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9DEF24A624C553F100701F5B /* LaunchScreen.storyboard */; };
+ 9DEF24BE24C5578300701F5B /* DecimalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DEF24BD24C5578300701F5B /* DecimalViewController.swift */; };
+ 9DF9A11A294C30730074C07D /* SettingsHexaCalcUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DF9A119294C30730074C07D /* SettingsHexaCalcUITests.swift */; };
++ B101C2BD2BBD47C900E11CBF /* libTAK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2BB2BBD47C900E11CBF /* libTAK.a */; };
++ B101C2BE2BBD47C900E11CBF /* libWBC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2BC2BBD47C900E11CBF /* libWBC.a */; };
++ B101C2C02BBD47D400E11CBF /* license.tak in Resources */ = {isa = PBXBuildFile; fileRef = B101C2BF2BBD47D400E11CBF /* license.tak */; };
+ C272D50A28E75D7C00E6C374 /* CalculationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C272D50928E75D7C00E6C374 /* CalculationData.swift */; };
+ C2D2E1C428DDF90A0094DA13 /* CalculationHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2D2E1C328DDF90A0094DA13 /* CalculationHistoryViewController.swift */; };
+ /* End PBXBuildFile section */
+@@ -181,6 +167,9 @@
+ 9DEF24A924C553F100701F5B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 9DEF24BD24C5578300701F5B /* DecimalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecimalViewController.swift; sourceTree = ""; };
+ 9DF9A119294C30730074C07D /* SettingsHexaCalcUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsHexaCalcUITests.swift; sourceTree = ""; };
++ B101C2BB2BBD47C900E11CBF /* libTAK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTAK.a; path = "../../tmp/TAK-Client/iOS/C/libs/libTAK.a"; sourceTree = ""; };
++ B101C2BC2BBD47C900E11CBF /* libWBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libWBC.a; path = "../../tmp/TAK-Client/iOS/C/libs/libWBC.a"; sourceTree = ""; };
++ B101C2BF2BBD47D400E11CBF /* license.tak */ = {isa = PBXFileReference; lastKnownFileType = file; name = license.tak; path = "../../tmp/TAK-Client/licenses/license.tak"; sourceTree = ""; };
+ C272D50928E75D7C00E6C374 /* CalculationData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalculationData.swift; sourceTree = ""; };
+ C2D2E1C328DDF90A0094DA13 /* CalculationHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalculationHistoryViewController.swift; sourceTree = ""; };
+ /* End PBXFileReference section */
+@@ -197,6 +186,8 @@
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B101C2BD2BBD47C900E11CBF /* libTAK.a in Frameworks */,
++ B101C2BE2BBD47C900E11CBF /* libWBC.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+@@ -350,9 +341,11 @@
+ 9DEF248A24C553F000701F5B = {
+ isa = PBXGroup;
+ children = (
++ B101C2BF2BBD47D400E11CBF /* license.tak */,
+ 9DEF249524C553F000701F5B /* HexaCalc */,
+ 9DE32E3428DEDBDF00BB222C /* HexaCalcUITests */,
+ 9DEF249424C553F000701F5B /* Products */,
++ B101C2BA2BBD47C900E11CBF /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+@@ -380,6 +373,15 @@
+ path = HexaCalc;
+ sourceTree = "";
+ };
++ B101C2BA2BBD47C900E11CBF /* Frameworks */ = {
++ isa = PBXGroup;
++ children = (
++ B101C2BB2BBD47C900E11CBF /* libTAK.a */,
++ B101C2BC2BBD47C900E11CBF /* libWBC.a */,
++ );
++ name = Frameworks;
++ sourceTree = "";
++ };
+ /* End PBXGroup section */
+
+ /* Begin PBXNativeTarget section */
+@@ -469,22 +471,15 @@
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+- 9D7C09D025EC61E700771D52 /* HexaCalcIconIndigo@3x.png in Resources */,
++ B101C2C02BBD47D400E11CBF /* license.tak in Resources */,
+ 9D7C09E725EC61E700771D52 /* HexaCalcIconRed@2x~ipad.png in Resources */,
+ 9D7C09C525EC61E700771D52 /* HexaCalcIconRed~ipad.png in Resources */,
+- 9D7C09CE25EC61E700771D52 /* HexaCalcIconPurple@3x.png in Resources */,
+ 9D7C09C125EC61E700771D52 /* HexaCalcIconOrange~ipad.png in Resources */,
+ 9DEF24A824C553F100701F5B /* LaunchScreen.storyboard in Resources */,
+ 9DC7581B27ED88A800BB2953 /* SwitchTableViewCell.xib in Resources */,
+- 9D7C09E125EC61E700771D52 /* HexaCalcIconYellow@3x.png in Resources */,
+- 9D7C09CF25EC61E700771D52 /* HexaCalcIconOrange@2x.png in Resources */,
+- 9D7C09E625EC61E700771D52 /* HexaCalcIconBlue@3x.png in Resources */,
+- 9D7C09DD25EC61E700771D52 /* HexaCalcIconGreen1024.png in Resources */,
+ 9DEF24A524C553F100701F5B /* Assets.xcassets in Resources */,
+ 9D7C09D625EC61E700771D52 /* HexaCalcIconBlue~ipad.png in Resources */,
+ 9DEF24A024C553F000701F5B /* Main.storyboard in Resources */,
+- 9D7C09D525EC61E700771D52 /* HexaCalcIconYellow@2x.png in Resources */,
+- 9D7C09D325EC61E700771D52 /* HexaCalcIconPurple@2x.png in Resources */,
+ 9D7C09C725EC61E700771D52 /* HexaCalcIconPurple@2x~ipad.png in Resources */,
+ 9D7C09D825EC61E700771D52 /* HexaCalcIconOrange@2x~ipad.png in Resources */,
+ 9D7C09DC25EC61E700771D52 /* HexaCalcIconRed-83.5@3x~ipad.png in Resources */,
+@@ -493,27 +488,18 @@
+ 9D7C09CC25EC61E700771D52 /* HexaCalcIconTeal~ipad.png in Resources */,
+ 9D7C09C925EC61E700771D52 /* HexaCalcIconGreen@2x~ipad.png in Resources */,
+ 9D7C09D225EC61E700771D52 /* HexaCalcIconOrange-83.5@3x~ipad.png in Resources */,
+- 9D7C09CD25EC61E700771D52 /* HexaCalcIconGreen@3x.png in Resources */,
+ 9D7C09CB25EC61E700771D52 /* HexaCalcIconYellow~ipad.png in Resources */,
+ 9D7C09E525EC61E700771D52 /* HexaCalcIconIndigo@2x~ipad.png in Resources */,
+ 9D7C09C325EC61E700771D52 /* HexaCalcIconGreen-83.5@3x~ipad.png in Resources */,
+- 9D7C09D125EC61E700771D52 /* HexaCalcIconRed@3x.png in Resources */,
+- 9D7C09C425EC61E700771D52 /* HexaCalcIconIndigo@2x.png in Resources */,
+ 9D7C09D425EC61E700771D52 /* HexaCalcIconPurple~ipad.png in Resources */,
+- 9D7C09E425EC61E700771D52 /* HexaCalcIconTeal@2x.png in Resources */,
+- 9D7C09E025EC61E700771D52 /* HexaCalcIconBlue@2x.png in Resources */,
+ 9D7C09D925EC61E700771D52 /* HexaCalcIconBlue-83.5@3x~ipad.png in Resources */,
+- 9D7C09E325EC61E700771D52 /* HexaCalcIconOrange@3x.png in Resources */,
+- 9D7C09C225EC61E700771D52 /* HexaCalcIconRed@2x.png in Resources */,
+ 9D7C09C025EC61E700771D52 /* HexaCalcIconBlue@2x~ipad.png in Resources */,
+ 9D7C09DE25EC61E700771D52 /* HexaCalcIconGreen~ipad.png in Resources */,
+ 9D7C09C625EC61E700771D52 /* HexaCalcIconPurple-83.5@3x~ipad.png in Resources */,
+- 9D7C09DA25EC61E700771D52 /* HexaCalcIconTeal@3x.png in Resources */,
+ 9D7C09E225EC61E700771D52 /* HexaCalcIconIndigo~ipad.png in Resources */,
+ 9D7C09D725EC61E700771D52 /* HexaCalcIconYellow@2x~ipad.png in Resources */,
+ 9D7C09DB25EC61E700771D52 /* HexaCalcIconTeal@2x~ipad.png in Resources */,
+ 9D7C09CA25EC61E700771D52 /* HexaCalcIconYellow-83.5@3x~ipad.png in Resources */,
+- 9D7C09C825EC61E700771D52 /* HexaCalcIconGreen@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+@@ -769,7 +755,7 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 10;
+- DEVELOPMENT_TEAM = QMBJV5C74X;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = HexaCalc/Info.plist;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+@@ -777,7 +763,9 @@
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
++ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../tmp/TAK-Client/iOS/C/libs";
+ MARKETING_VERSION = 1.5.0;
++ OTHER_LDFLAGS = "-lstdc++";
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.HexaCalc;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+@@ -791,7 +779,7 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 10;
+- DEVELOPMENT_TEAM = QMBJV5C74X;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = HexaCalc/Info.plist;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+@@ -799,7 +787,9 @@
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
++ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../tmp/TAK-Client/iOS/C/libs";
+ MARKETING_VERSION = 1.5.0;
++ OTHER_LDFLAGS = "-lstdc++";
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.HexaCalc;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+diff --git a/HexaCalc/Info.plist b/HexaCalc/Info.plist
+index ec6056c..eed4117 100644
+--- a/HexaCalc/Info.plist
++++ b/HexaCalc/Info.plist
+@@ -10,81 +10,6 @@
+ $(EXECUTABLE_NAME)
+ CFBundleIcons
+
+- CFBundleAlternateIcons
+-
+- HexaCalcIconBlue
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconBlue
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconGreen
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconGreen
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconIndigo
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconIndigo
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconOrange
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconOrange
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconPurple
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconPurple
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconRed
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconRed
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconTeal
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconTeal
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconYellow
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconYellow
+-
+- UIPrerenderedIcon
+- NO
+-
+-
+ CFBundlePrimaryIcon
+
+ CFBundleIconFiles
+@@ -97,81 +22,6 @@
+
+ CFBundleIcons~ipad
+
+- CFBundleAlternateIcons
+-
+- HexaCalcIconBlue
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconBlue
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconGreen
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconGreen
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconIndigo
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconIndigo
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconOrange
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconOrange
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconPurple
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconPurple
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconRed
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconRed
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconTeal
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconTeal
+-
+- UIPrerenderedIcon
+- NO
+-
+- HexaCalcIconYellow
+-
+- CFBundleIconFiles
+-
+- HexaCalcIconYellow
+-
+- UIPrerenderedIcon
+- NO
+-
+-
+ CFBundlePrimaryIcon
+
+ CFBundleIconFiles
+diff --git a/HexaCalc/Model/ColourNumberConverter.swift b/HexaCalc/Model/ColourNumberConverter.swift
+index a04a064..3a47afd 100644
+--- a/HexaCalc/Model/ColourNumberConverter.swift
++++ b/HexaCalc/Model/ColourNumberConverter.swift
+@@ -58,48 +58,10 @@ class ColourNumberConverter {
+ }
+
+ static func getAppIconNameFromIndex(index: Int) -> String {
+- switch index {
+- case 0:
+- return "HexaCalcIconRed"
+- case 1:
+- return "HexaCalcIconOrange"
+- case 2:
+- return "HexaCalcIconYellow"
+- case 3:
+- return "HexaCalcIconGreen"
+- case 4:
+- return "HexaCalcIconBlue"
+- case 5:
+- return "HexaCalcIconTeal"
+- case 6:
+- return "HexaCalcIconIndigo"
+- case 7:
+- return "HexaCalcIconPurple"
+- default:
+- return "HexaCalcIconGreen"
+- }
++ return "HexaCalcIconGreen"
+ }
+
+ static func getColourNameFromIndex(index: Int) -> String {
+- switch index {
+- case 0:
+- return "Red"
+- case 1:
+- return "Orange"
+- case 2:
+- return "Yellow"
+- case 3:
+- return "Green"
+- case 4:
+- return "Blue"
+- case 5:
+- return "Teal"
+- case 6:
+- return "Indigo"
+- case 7:
+- return "Violet"
+- default:
+- return "Green"
+- }
++ return "Green"
+ }
+ }
diff --git a/samples/patches/Kotoba.patch b/samples/patches/Kotoba.patch
new file mode 100644
index 00000000..74d694d9
--- /dev/null
+++ b/samples/patches/Kotoba.patch
@@ -0,0 +1,166 @@
+diff --git a/code/Kotoba.xcodeproj/project.pbxproj b/code/Kotoba.xcodeproj/project.pbxproj
+index 621986b..0dd9c0a 100644
+--- a/code/Kotoba.xcodeproj/project.pbxproj
++++ b/code/Kotoba.xcodeproj/project.pbxproj
+@@ -22,6 +22,9 @@
+ 967E998BC07D453DE26EEE83 /* WordListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967E990F894B4E27CE8337A4 /* WordListDataSource.swift */; };
+ 967E99DE08067E1B31567C98 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE918C4F1A22A5F5006043CF /* AppDelegate.swift */; };
+ 967E9E3969BCBD8408ADCB69 /* WordListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967E990F894B4E27CE8337A4 /* WordListDataSource.swift */; };
++ B101C2B02BBC135100E11CBF /* libWBC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2AE2BBC135100E11CBF /* libWBC.a */; };
++ B101C2B12BBC135100E11CBF /* libTAK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2AF2BBC135100E11CBF /* libTAK.a */; };
++ B101C2B32BBC136A00E11CBF /* license.tak in Resources */ = {isa = PBXBuildFile; fileRef = B101C2B22BBC136A00E11CBF /* license.tak */; };
+ B6232DEF24A7881700B0CC38 /* RoundedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967E98DD562220BBE20A8C1F /* RoundedView.swift */; };
+ B62B309823B7F60900583D3D /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = B62B309A23B7F60900583D3D /* Localizable.stringsdict */; };
+ B65A4E02238435ED000C9A4F /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44CFA6AA2381F0CB00D7ECCC /* Debug.swift */; };
+@@ -110,6 +113,9 @@
+ 967E9C49B74C80223D273414 /* Chocktuba.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Chocktuba.swift; sourceTree = ""; };
+ 967E9CB9914B758828733936 /* WordListStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordListStore.swift; sourceTree = ""; };
+ 967E9EDA541A0A73088A86DC /* WordListStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordListStrings.swift; sourceTree = ""; };
++ B101C2AE2BBC135100E11CBF /* libWBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libWBC.a; path = "../../tmp/TAK-Client/iOS/C/libs/libWBC.a"; sourceTree = ""; };
++ B101C2AF2BBC135100E11CBF /* libTAK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTAK.a; path = "../../tmp/TAK-Client/iOS/C/libs/libTAK.a"; sourceTree = ""; };
++ B101C2B22BBC136A00E11CBF /* license.tak */ = {isa = PBXFileReference; lastKnownFileType = file; name = license.tak; path = "../../../tmp/TAK-Client/licenses/license.tak"; sourceTree = ""; };
+ B62B309923B7F60900583D3D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; };
+ B62B309D23B7FA0B00583D3D /* chock */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = chock; path = chock.lproj/Main.strings; sourceTree = ""; };
+ B62B309E23B7FA2B00583D3D /* chock */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = chock; path = chock.lproj/Localizable.strings; sourceTree = ""; };
+@@ -160,6 +166,8 @@
+ buildActionMask = 2147483647;
+ files = (
+ B6F3964824629E7A009E0B7C /* CloudKit.framework in Frameworks */,
++ B101C2B02BBC135100E11CBF /* libWBC.a in Frameworks */,
++ B101C2B12BBC135100E11CBF /* libTAK.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+@@ -183,6 +191,8 @@
+ B6F3964524629E77009E0B7C /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
++ B101C2AF2BBC135100E11CBF /* libTAK.a */,
++ B101C2AE2BBC135100E11CBF /* libWBC.a */,
+ B6F3964624629E77009E0B7C /* CloudKit.framework */,
+ );
+ name = Frameworks;
+@@ -202,6 +212,7 @@
+ BE918C411A22A5F5006043CF = {
+ isa = PBXGroup;
+ children = (
++ B101C2B22BBC136A00E11CBF /* license.tak */,
+ BE918C4C1A22A5F5006043CF /* Kotoba */,
+ BEA413B81D1CABB600D177C2 /* KotobaTests */,
+ BEB2324D1D1DD3B800369560 /* KotobaUITests */,
+@@ -374,12 +385,12 @@
+ TargetAttributes = {
+ B6F4594A2460E15100E2174D = {
+ CreatedOnToolsVersion = 11.4.1;
+- DevelopmentTeam = 8B38X92RJ6;
++ DevelopmentTeam = WCMG6DCKKM;
+ ProvisioningStyle = Automatic;
+ };
+ BE918C491A22A5F5006043CF = {
+ CreatedOnToolsVersion = 6.2;
+- DevelopmentTeam = 8B38X92RJ6;
++ DevelopmentTeam = WCMG6DCKKM;
+ LastSwiftMigration = 1120;
+ };
+ BEA413B61D1CABB600D177C2 = {
+@@ -433,6 +444,7 @@
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B101C2B32BBC136A00E11CBF /* license.tak in Resources */,
+ 44D1096623A84262007C477C /* Localizable.strings in Resources */,
+ BE918C551A22A5F5006043CF /* Main.storyboard in Resources */,
+ 4440B41D236CF92100369CE8 /* Colors.xcassets in Resources */,
+@@ -652,14 +664,14 @@
+ CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+- DEVELOPMENT_TEAM = 8B38X92RJ6;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ INFOPLIST_FILE = ShareExtension/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+- PRODUCT_BUNDLE_IDENTIFIER = com.willhains.Kotoba.ShareExtension;
++ PRODUCT_BUNDLE_IDENTIFIER = com.build38.Kotoba.ShareExtension;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ SUPPORTS_MACCATALYST = NO;
+@@ -682,13 +694,13 @@
+ CODE_SIGN_STYLE = Automatic;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+- DEVELOPMENT_TEAM = 8B38X92RJ6;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ INFOPLIST_FILE = ShareExtension/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
+ MTL_FAST_MATH = YES;
+- PRODUCT_BUNDLE_IDENTIFIER = com.willhains.Kotoba.ShareExtension;
++ PRODUCT_BUNDLE_IDENTIFIER = com.build38.Kotoba.ShareExtension;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ SUPPORTS_MACCATALYST = NO;
+@@ -811,12 +823,14 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-red";
+ CODE_SIGN_ENTITLEMENTS = Kotoba/Kotoba.entitlements;
+ CURRENT_PROJECT_VERSION = 1592141211;
+- DEVELOPMENT_TEAM = 8B38X92RJ6;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = Kotoba/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
++ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../../tmp/TAK-Client/iOS/C/libs";
+ MARKETING_VERSION = 2.0;
+- PRODUCT_BUNDLE_IDENTIFIER = com.willhains.Kotoba;
++ OTHER_LDFLAGS = "-lstdc++";
++ PRODUCT_BUNDLE_IDENTIFIER = com.build38.Kotoba;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+@@ -836,12 +850,14 @@
+ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-red";
+ CODE_SIGN_ENTITLEMENTS = Kotoba/Kotoba.entitlements;
+ CURRENT_PROJECT_VERSION = 1592141211;
+- DEVELOPMENT_TEAM = 8B38X92RJ6;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = Kotoba/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
++ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../../tmp/TAK-Client/iOS/C/libs";
+ MARKETING_VERSION = 2.0;
+- PRODUCT_BUNDLE_IDENTIFIER = com.willhains.Kotoba;
++ OTHER_LDFLAGS = "-lstdc++";
++ PRODUCT_BUNDLE_IDENTIFIER = com.build38.Kotoba;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+diff --git a/code/Kotoba/Kotoba.entitlements b/code/Kotoba/Kotoba.entitlements
+index 6effa6c..f5fe7ca 100644
+--- a/code/Kotoba/Kotoba.entitlements
++++ b/code/Kotoba/Kotoba.entitlements
+@@ -14,7 +14,7 @@
+
+ com.apple.security.application-groups
+
+- group.com.willhains.Kotoba
++ group.com.build38.tak
+
+ com.apple.security.files.user-selected.read-only
+
+diff --git a/code/ShareExtension/ShareExtension.entitlements b/code/ShareExtension/ShareExtension.entitlements
+index 90fb769..945503c 100644
+--- a/code/ShareExtension/ShareExtension.entitlements
++++ b/code/ShareExtension/ShareExtension.entitlements
+@@ -14,7 +14,7 @@
+
+ com.apple.security.application-groups
+
+- group.com.willhains.Kotoba
++ group.com.build38.tak
+
+ com.apple.security.network.client
+
diff --git a/samples/patches/SnowPlowExamples.patch b/samples/patches/SnowPlowExamples.patch
new file mode 100644
index 00000000..0e35e482
--- /dev/null
+++ b/samples/patches/SnowPlowExamples.patch
@@ -0,0 +1,165 @@
+diff --git a/demo/SnowplowObjcDemo/SnowplowDemo.xcodeproj/project.pbxproj b/demo/SnowplowObjcDemo/SnowplowDemo.xcodeproj/project.pbxproj
+index 7d1216d..d3ea5be 100644
+--- a/demo/SnowplowObjcDemo/SnowplowDemo.xcodeproj/project.pbxproj
++++ b/demo/SnowplowObjcDemo/SnowplowDemo.xcodeproj/project.pbxproj
+@@ -18,6 +18,9 @@
+ 043172A91B7366B8008A927D /* DemoUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 043172A81B7366B8008A927D /* DemoUtils.m */; };
+ 47E8A0EB3ECED58DD2874330 /* Pods_SnowPlowDemoShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A1668E8170F8F4A56A036B7 /* Pods_SnowPlowDemoShareExtension.framework */; };
+ 6B3BF22228BCB7D400170BB9 /* Tracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B3BF22128BCB7D400170BB9 /* Tracker.swift */; };
++ B101C2C92BBD49E700E11CBF /* libWBC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2C72BBD49E600E11CBF /* libWBC.a */; };
++ B101C2CA2BBD49E700E11CBF /* libTAK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B101C2C82BBD49E600E11CBF /* libTAK.a */; };
++ B101C2CC2BBD49F100E11CBF /* license.tak in Resources */ = {isa = PBXBuildFile; fileRef = B101C2CB2BBD49F100E11CBF /* license.tak */; };
+ B10C0221289B2C0600770C3E /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10C0220289B2C0600770C3E /* ShareViewController.swift */; };
+ B10C0224289B2C0600770C3E /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B10C0222289B2C0600770C3E /* MainInterface.storyboard */; };
+ B10C0228289B2C0600770C3E /* SnowPlowDemoShareExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = B10C021E289B2C0600770C3E /* SnowPlowDemoShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+@@ -106,6 +109,9 @@
+ 6B3BF22128BCB7D400170BB9 /* Tracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tracker.swift; sourceTree = ""; };
+ 708A613346C83076752DA514 /* Pods-SnowPlowDemoShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SnowPlowDemoShareExtension.debug.xcconfig"; path = "Target Support Files/Pods-SnowPlowDemoShareExtension/Pods-SnowPlowDemoShareExtension.debug.xcconfig"; sourceTree = ""; };
+ 740DCC07B75E8AD9FD1BB20D /* Pods-SnowplowDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SnowplowDemo.release.xcconfig"; path = "Target Support Files/Pods-SnowplowDemo/Pods-SnowplowDemo.release.xcconfig"; sourceTree = ""; };
++ B101C2C72BBD49E600E11CBF /* libWBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libWBC.a; path = "../../../../../tmp/TAK-Client/iOS/C/libs/libWBC.a"; sourceTree = ""; };
++ B101C2C82BBD49E600E11CBF /* libTAK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTAK.a; path = "../../../../../tmp/TAK-Client/iOS/C/libs/libTAK.a"; sourceTree = ""; };
++ B101C2CB2BBD49F100E11CBF /* license.tak */ = {isa = PBXFileReference; lastKnownFileType = file; name = license.tak; path = "../../../../../tmp/TAK-Client/licenses/license.tak"; sourceTree = ""; };
+ B10C021E289B2C0600770C3E /* SnowPlowDemoShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SnowPlowDemoShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
+ B10C0220289B2C0600770C3E /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; };
+ B10C0223289B2C0600770C3E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; };
+@@ -118,6 +124,8 @@
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B101C2C92BBD49E700E11CBF /* libWBC.a in Frameworks */,
++ B101C2CA2BBD49E700E11CBF /* libTAK.a in Frameworks */,
+ E134DAD3C64350D5745090BD /* Pods_SnowplowDemo.framework in Frameworks */,
+ B10C023A289B2F8500770C3E /* Analytics.framework in Frameworks */,
+ );
+@@ -151,6 +159,7 @@
+ 043172721B7365D3008A927D = {
+ isa = PBXGroup;
+ children = (
++ B101C2CB2BBD49F100E11CBF /* license.tak */,
+ 0431727D1B7365D4008A927D /* SnowplowDemo */,
+ 0431729A1B7365D4008A927D /* SnowplowDemoTests */,
+ B10C021F289B2C0600770C3E /* SnowPlowDemoShareExtension */,
+@@ -229,6 +238,8 @@
+ 732484D89E64AED2D558B48A /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
++ B101C2C82BBD49E600E11CBF /* libTAK.a */,
++ B101C2C72BBD49E600E11CBF /* libWBC.a */,
+ 3710BBFEF122A6658C1C43E7 /* Pods_SnowplowDemo.framework */,
+ 3A1668E8170F8F4A56A036B7 /* Pods_SnowPlowDemoShareExtension.framework */,
+ );
+@@ -349,13 +360,16 @@
+ TargetAttributes = {
+ 0431727A1B7365D4008A927D = {
+ CreatedOnToolsVersion = 6.4;
++ DevelopmentTeam = WCMG6DCKKM;
+ };
+ 043172961B7365D4008A927D = {
+ CreatedOnToolsVersion = 6.4;
++ DevelopmentTeam = WCMG6DCKKM;
+ TestTargetID = 0431727A1B7365D4008A927D;
+ };
+ B10C021D289B2C0600770C3E = {
+ CreatedOnToolsVersion = 13.4.1;
++ DevelopmentTeam = WCMG6DCKKM;
+ ProvisioningStyle = Automatic;
+ };
+ B10C0233289B2F8500770C3E = {
+@@ -390,6 +404,7 @@
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
++ B101C2CC2BBD49F100E11CBF /* license.tak in Resources */,
+ 0431728D1B7365D4008A927D /* Main.storyboard in Resources */,
+ 043172921B7365D4008A927D /* LaunchScreen.xib in Resources */,
+ 0431728F1B7365D4008A927D /* Images.xcassets in Resources */,
+@@ -684,9 +699,28 @@
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = SnowplowDemo/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
++ LIBRARY_SEARCH_PATHS = (
++ "$(inherited)",
++ "\"${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"",
++ /usr/lib/swift,
++ "$(PROJECT_DIR)/../../../../../tmp/TAK-Client/iOS/C/libs",
++ );
++ OTHER_LDFLAGS = (
++ "$(inherited)",
++ "-framework",
++ "\"CoreTelephony\"",
++ "-framework",
++ "\"Foundation\"",
++ "-framework",
++ "\"SnowplowTracker\"",
++ "-framework",
++ "\"UIKit\"",
++ "-lstdc++",
++ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.snowplowanalytics.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+@@ -698,9 +732,28 @@
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ INFOPLIST_FILE = SnowplowDemo/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
++ LIBRARY_SEARCH_PATHS = (
++ "$(inherited)",
++ "\"${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"",
++ /usr/lib/swift,
++ "$(PROJECT_DIR)/../../../../../tmp/TAK-Client/iOS/C/libs",
++ );
++ OTHER_LDFLAGS = (
++ "$(inherited)",
++ "-framework",
++ "\"CoreTelephony\"",
++ "-framework",
++ "\"Foundation\"",
++ "-framework",
++ "\"SnowplowTracker\"",
++ "-framework",
++ "\"UIKit\"",
++ "-lstdc++",
++ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.snowplowanalytics.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+@@ -710,6 +763,7 @@
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(SDKROOT)/Developer/Library/Frameworks",
+ "$(inherited)",
+@@ -730,6 +784,7 @@
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(SDKROOT)/Developer/Library/Frameworks",
+ "$(inherited)",
+@@ -756,6 +811,7 @@
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SnowPlowDemoShareExtension/Info.plist;
+@@ -790,6 +846,7 @@
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
++ DEVELOPMENT_TEAM = WCMG6DCKKM;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = SnowPlowDemoShareExtension/Info.plist;