Nick Cooke
4b26b31c1f
[Firestore] Follow-up review items from #11954 ( #11970 )
2023-10-20 18:54:19 +00:00
Nick Cooke
85cfe574bb
[Release] Update CHANGELOGs for 10.17.0 ( #11963 )
2023-10-18 14:26:29 -04:00
Andrew Heard
760d449145
[visionOS] Fix FirebaseDatabase build on Xcode 15.1 beta 1 ( #11937 )
2023-10-13 16:33:34 -04:00
Nick Cooke
2ee43e0b75
[Database] Consolidate Database and DatabaseSwift ( #11807 )
2023-10-13 14:53:03 -04:00
Andrew Heard and Nick Cooke
f3a14c249e
Add FirebaseAppCheckInterop umbrella header ( #11860 )
...
Co-authored-by: Nick Cooke <36927374+ncooke3@users.noreply.github.com >
2023-10-11 18:39:18 -04:00
Paul Beusterien
455de9c017
More fixes for AppCheckInterop ( #11813 )
2023-09-15 11:35:51 -07:00
Andrew Heard
0bf46a3bca
[Database] Replace deprecated NSKeyedUnarchiver method in FLevelDBStorageEngine ( #11479 )
...
Replaced use of the deprecated `unarchiveObjectWithData:` method with `unarchivedObjectOfClasses:fromData:error:`, available in iOS 11+ (above our minimum deployment target).
2023-06-26 13:57:47 -04:00
Andrew Heard
9460b8226e
[Database] Remove outdated FLevelDBStorageEngineTests test ( #11478 )
...
The test `testExtremeDoublesAsServerCache` only applies to iOS < 11. Removed the test since our minimum deployment target is already iOS 11. This also resolves the test failure on visionOS.
2023-06-26 11:59:50 -04:00
Nick Cooke
ffc697be0e
[Functions] Fix typo in HTTPSCallableOptions initializer ( #11318 )
2023-05-23 07:43:08 -07:00
Nick Cooke
867697b8f3
[Infra] Upgrade to clang-format16 ( #10973 )
2023-03-20 12:47:43 -04:00
Nick Cooke
96d07fe973
[Infra] Favor SWIFTPM_MODULE_BUNDLE macro over C function across repo ( #10625 )
...
* [Infra] Favor SWIFTPM_MODULE_BUNDLE in RC unit tests
* Favor across repo
2022-12-29 18:23:29 -05:00
Paul Beusterien
8bbb85e9fb
Fixed unused warnings building in release config ( #10313 )
2022-10-06 15:24:44 -07:00
Morgan Chen
7ad23807e5
add deprecation for watchOS ( #10274 )
...
* add deprecation for watchOS
* fix style script mangling link and run style
* rephrase deprecation message
* Add changelog
2022-09-27 16:00:50 -07:00
Iulian Onofrei
06fdcf02dc
Database: Fix misleading documentation in childByAutoId ( #10217 )
2022-09-19 08:49:37 -07:00
Paul Beusterien
737700d885
Fix priority inversion issue exposed by Xcode 14 ( #10144 )
2022-08-26 11:04:43 -07:00
Paul Beusterien
3862a56dd3
Fix RTDB race condition ( #9973 )
2022-07-01 14:38:51 -07:00
Nick Cooke
ced8b554a0
[Infra] Standardize CHANGELOG header format ( #9777 )
2022-05-10 17:54:58 -04:00
Paul Beusterien
aefb2a469b
Make RTDB integration tests runnable on a real target ( #9688 )
2022-04-22 14:27:20 -07:00
Jan Wyszynski and Ryan Wilson
8a9e385eb4
Make getDataWithCompletionBlock snapshot nullable ( #9655 )
...
* Make getDataWithCompletionBlock snapshot nullable
* fix DatabaseAPITests
* update changelog
* fix changelog
* breaking change
* Capitalize Swift
Co-authored-by: Ryan Wilson <wilsonryan@google.com >
2022-04-19 20:27:31 -04:00
Paul Beusterien
3ef42c1ac4
Address v9, resolved, and obsolete TODO's ( #9659 )
2022-04-15 08:14:44 -07:00
Morgan Chen
9f2a3132fa
Use Swift syntax in reference documentation ( #9594 )
...
* fix returns typo
* change some headers
* style
* the rest of the header comments
* revert changes to FIRStorageReference
2022-04-08 14:50:22 -07:00
Paul Beusterien
7b946765ec
Remove slashes from log messages ( #9391 )
2022-04-06 14:19:47 -07:00
Ryan Wilson
73279db127
Enable async/await APIs for iOS 13, etc. ( #9540 )
...
* Enable async/await APIs for iOS 13, etc.
This bumps the required compiler version to 5.5.2 which was included in
Xcode 13.2, where backporting was first introduced.
This breaks less developers and enables developers who aren't using
these APIs to still compile using Xcode 13.0 and 13.1.
As far as I can tell, the only breakage this includes now is developers
who are using Xcode 13.0 or 13.1, targeting iOS 15 and using one of
these 7 APIs. It will result in a compiler error and they'll have to
either use the completion handler version or upgrade to Xcode 13.2+ to
fix the compilation error.
* Missed checks, CHANGELOG
* Fixed avialability, added watchOS for RTDB
* Moved to watchOS 7 for all async/await APIs to match platform support
2022-04-01 09:56:33 -04:00
Nick Cooke
a09083f9d0
[v9] Reorganize FirebaseCore* modules ( #9482 )
...
* [skip ci] [will revert] Add debug printing to `pod_lib_lint.rb`
* Reorganize FirebaseCore libraries for SPM and CP
* [skip ci] Revert "[skip ci] [will revert] Add debug printing to `pod_lib_lint.rb`"
This reverts commit 2a837e39708c21b0a324743ab226bd6c01047de7.
* Review and fix CI
* Remove `heartbeat_logging.yml` and add `core_internal.yml`
* Remove trailing whitespace
* Fix more whitespace 😞
* Fix `core_internal.yml` scheme name
* Update `check_imports.swift` and TODO
* Review
* Add FirebaseCoreInternal pod to Firestore example's Podfile
* [skip ci] Review - remove TODOs
* [skip ci] Remove duplicate `XCTest` import
2022-03-23 06:08:14 -07:00
Paul Beusterien
a1cb5656fc
Auth and Messaging Interop for Swift ( #9314 )
2022-03-23 06:08:13 -07:00
Paul Beusterien
e748d16594
AppCheckInterop for Swift dependents ( #9299 )
2022-03-23 06:07:17 -07:00
Paul Beusterien
4f793064da
Set up Core Internal for SPM ( #9298 )
2022-03-23 06:07:17 -07:00
Paul Beusterien
5e8790d78a
Update to SwiftFormat 0.49.2 ( #9239 )
2022-01-21 13:03:15 -08:00
Paul Beusterien
1b34c4c90b
Remove unused 3P source from RTDB tests ( #9217 )
2022-01-18 12:19:19 -08:00
Paul Beusterien
c7456c9f6f
Release note for FNextPushId fix ( #9192 )
2022-01-10 16:32:12 -08:00
Morten Bek Ditlevsen
f9b583963e
Attempt at fixing issue with getting next and previous push id ( #8817 )
2022-01-10 16:16:52 -08:00
Paul Beusterien
00625a6d1a
Fix RTDB crash from race ( #9123 )
2021-12-22 08:58:36 -08:00
Paul Beusterien
f318406ed1
Fix CocoaPods license files for RTDB and Firestore ( #9124 )
2021-12-22 08:58:13 -08:00
Nick Cooke
d6e7bb7d38
Update async-related directives in Swift build tests ( #9063 )
...
* Update directives in Swift build tests
* Fix CoreAPITests
* Fix CoreAPITests 2
* Fix installations and style
2021-12-09 14:30:43 -05:00
Paul Beusterien
e33695557a
Fix URL handling bug when path is a substring of host ( #8880 )
2021-11-01 09:55:14 -07:00
Paul Beusterien
62827f36b2
Fix DatabaseUnitSwift Xcode 13.0.0 build ( #8837 )
2021-10-20 15:18:41 -07:00
Paul Beusterien
33692eb578
Fix Remote Config Integration CI ( #8774 )
2021-10-11 07:38:51 -07:00
Paul Beusterien
c7c0149351
Update to clang-format@13 ( #8739 )
2021-10-04 07:52:21 -07:00
Maksym Malyhin
4d518509ed
Database: fix App Check token refresh ( #8549 )
...
* Database: fix App Check token refresh
* Changelog
2021-08-24 11:52:51 -04:00
Marina
97197178bd
Fix getData crashing in offline ( #8484 )
...
Fixes #8357
The issue was that `node` property of `FCacheNode` pokes one level deeper: (FCacheNode.m:66)
```
- (id<FNode>)node {
return self.indexedNode.node;
}
```
2021-08-09 20:53:09 -07:00
Nick Cooke
540b7e8a9a
Get Database Swift API Test building on Xcode13b4 ( #8466 )
...
* Test builds for Xcode13b4
* Fix comment mistake
2021-07-30 13:07:22 -04:00
Jesus Crespo
7633a59a18
Database API build tests ( #8396 )
...
* Add tests for Database and DatabaseQuery
* Add tests for DatabaseReference
* Add tests for DataEventType
* Add tests for DataSnapshot
* Add tests for MutableData
* Add tests for ServerValue
* Add tests for TransactionResult
* Fix CI for CocoaPods
* Fix CI for SPM and style
* Improve readability
* Fix CI for tvOS
* Refactor type checking
* Fix comments
Add unsurfaced parameter names and shorten async lines
* Fix switch conditional evaluates to a constant
* Fix type checking
* Shorten switch statement
* Add to SPM tests
2021-07-22 16:50:30 -05:00
Paul Beusterien
0d90f2f12d
Update to clang-format 12.0.1 ( #8397 )
2021-07-16 11:40:42 -07:00
Jan Wyszynski
41b0073999
Dispatch getData callbacks on FRepo callback queue ( #8247 )
2021-07-16 05:48:57 -07:00
Nick Cooke
89f237ae78
Swift first exception messages ( #8295 )
...
* Swift first exception messages
* Review
* Minor edit
* Minor edit 2
2021-06-25 11:25:23 -04:00
Paul Beusterien
fd36167c8c
Migrate back to unforked OCMock for SPM ( #8042 )
2021-05-11 11:39:55 -07:00
Paul Beusterien
4662da7514
8.0.0 changlelog formatting ( #7987 )
2021-04-27 14:36:20 -07:00
Paul Beusterien
9482fb41c7
Add missing protocol to fix Xcode 12.5 warning ( #7943 )
2021-04-23 11:45:19 -07:00
Maksym Malyhin
c197bbdde9
App Check changelogs ( #7949 )
2021-04-23 11:40:44 -04:00
47e0a982fb
App check and storage, functions and RTDB support ( #7928 )
...
* AppAttestation initial public API
* Run ./scripts/style.sh
* Copyright
* Cleanup
* Cleanup
* Get token forcing refresh method
* Formatting
* Forcing refresh samples
* Interop introduced
* Code samples for Interop
* Run ./scripts/style.sh
* Cleanup
* TODOs and Copirights
* Fix build
* Supported iOS versions
* Remove unnecessary bridging header
* Run ./scripts/style.sh
* [WIP] DeviceCheckAttestationProvider as a subspec
* cleanup
* Add memory attributes to readonly properties
* Move FIRDeviceCheckAttestationProvider.h to private headers
* TODO for `FirebaseAppAttestation/Core` name
* Remove memory attributes from FIRAppAttestationToken properties
* FIRAppAttestationTests.testSetAttestationProviderFactory introduced
* FIRAppAttestationToken initializer
* Basic FIRLibrary implementation and FIRAppAttestationProviderFactory ingestion.
* Fix
* FIRAppAttestationToken+Interop.h
* TODOs
* Tests: reset FIRApps
* GHA for App Attestation
* Run ./scripts/style.sh
* Style fixes.
* Run ./scripts/style.sh
* TODO
* Nullable initializer and type annpotations
* TODOs
* TODOs
* TODO
* Fix spec and allow warnings
* AppAttestation initial public API
* Run ./scripts/style.sh
* Copyright
* Cleanup
* Cleanup
* Get token forcing refresh method
* Formatting
* Forcing refresh samples
* Interop introduced
* Code samples for Interop
* Run ./scripts/style.sh
* Cleanup
* TODOs and Copirights
* Fix build
* Supported iOS versions
* Remove unnecessary bridging header
* Run ./scripts/style.sh
* [WIP] DeviceCheckAttestationProvider as a subspec
* cleanup
* Add memory attributes to readonly properties
* Move FIRDeviceCheckAttestationProvider.h to private headers
* TODO for `FirebaseAppAttestation/Core` name
* Remove memory attributes from FIRAppAttestationToken properties
* FIRAppAttestationTests.testSetAttestationProviderFactory introduced
* FIRAppAttestationToken initializer
* Basic FIRLibrary implementation and FIRAppAttestationProviderFactory ingestion.
* Fix
* FIRAppAttestationToken+Interop.h
* TODOs
* Tests: reset FIRApps
* Run ./scripts/style.sh
* Style fixes.
* Run ./scripts/style.sh
* TODO
* Nullable initializer and type annpotations
* TODOs
* TODOs
* TODO
* Revert FirestoreDecoder.swift formatting.
* Basic implementation of FIRDeviceCheckAttestationProvider and tests (#626 )
* DeviceCheck attestation provider sceleton
* DeviceCheck attestation provider sceleton
* Basic FIRDeviceCheckAttestationProviderTests
* Run ./scripts/style.sh
* FIRAppAttestStorage implementation and tests (#627 )
* FIRDeviceCheckAttestationProvider designated init
* FIRAppAttestStorage API and basic tests.
* FIRAppAttestStoredToken: NSSecureCoding implementation
* WIP Storage
* Add `accessGroup` param to `FIRAppAttestStorage`
* FIRAppAttestStorage implementation
* Use constants
* FIRAppAttestStorage API doc
* Coding style and typos.
* Code formatting
* Attestation Token caching (#630 )
* Storage instance and looging
* AppAttestation caching
* Tests and cleanup
* Cleanup
* Rename App Attestation -> App Check (#631 )
* Rename App Attestation -> App Check
* Run ./scripts/style.sh
* Update GHA
* Default Custom Provider (#633 )
* AppCheck: remove not unnecessary public API (#634 )
* AppCheck: remove not unnecessary public API
* Run ./scripts/style.sh
* AppCheck: DeviceCheck token server API (#635 )
* Generic HTTP request handling
* [draft] AppCheck: device check HTTP API and simple tests
* Parse response
* Cleanup
* AppCheck: API errors and tests (#636 )
* AppCheck errors
* API service tests and fixes
* Cleanup
* Run ./scripts/style.sh
* Naming
* AppCheck: Register device check provider factory as a default (#637 )
* AppCheck errors
* API service tests and fixes
* Cleanup
* Run ./scripts/style.sh
* AppCheck: register FIRDeviceCheckProvider as a component
* Naming
* Registre device check provider factory as a default
* FIRDeviceCheckProvider tests
* AppCheck: API communication common for all providers moved to FIRAppCheckAPIService (#640 )
* FIRAppCheckAPIService introduced
* Move URL seession stub to FIRURLSessionOCMockStub
* Run ./scripts/style.sh
* Move approximate date comparing to FIRDateTestUtils
* compose request in FIRAppCheckAPIService
* FIRAppCheckAPIServiceTests
* Use FIRAppCheckAPIService in FIRDeviceCheckProvider
* Cleanup
* DeviceCheck mock server integration and tests (#686 )
* DeviceCheck mock server integration and tests
* TODO
* Update FIROptions.h import
* Temporary add FirebaseAppCheck to skip import validation
* TestUtilities moved to SharedTestUtilities
* FirebaseAppCheck.podspec: TestUtilities->SharedTestUtilities
* SwiftPM: add OCMock dependency to SharedTestUtilities
* FIRURLSessionOCMockStub: #import "OCMock.h"
* App Check: Firebase 7 fixes (#715 )
* AppCheck Firebase 7
* FirebaseCore repo-relative imports
* Fix FIRAppCheckStorage.m compilation
* Repo relative imports
* linebreak
* AppCheck: debug FAC token provider (#716 )
* AppCheck Firebase 7
* FirebaseCore repo-relative imports
* Fix FIRAppCheckStorage.m compilation
* Repo relative imports
* linebreak
* Remove FIRAppCheckDefaultCustomProvider
* FIRAppCheckDebugProvider introduced
* FIRAppCheckDebugProviderTests
* style
* Print locally generated debug token to console
* Fix imports
* mullability and line breaks
* typo
* Comments
* TODO
* AppCheck: merge into single spec (package) (#717 )
* Standard package folder structure
* Move interop header into AppCheck sources folder
* Combine public headers in the standard dir
* Private headers to internal
* Podspec
* Headers import udpdate
* style
* Fix header imports
* Enable check_imports.swift and fix imports
* AppCheck: server request adjustments (#718 )
* Wrap DeviceCheck token into JSON
* AppChek - remove static_framework requirement
* WIP
* Update default base URL
* Set content-type header
* Check for empty response data
* Fix tests
* Style and formatting
* Podspec - revert wrong change and remove static_framework
* Assign error to error pointer safely.
* AppCheck: primitive test app (#719 )
* Remove static_framework requirement
* WIP: FIRAppCheckTestApp introduced
* Delete .plist
* Copyright
* Remove empty test targets
* pod deintegrate
* Remove test targets from Podfile
* formatting
* Storage: integration with AppCheck (#720 )
* Storage: add AppCheck interop dependency
* Inject AppCheck into FIRStorageTokenAuthorizer
* initial AppCheck integration
* Introduce AppCheck fake
* AppCheck fake implementation
* FIRStorageTokenAuthorizer tests and fixes
* @"Authorization" header constant
* Log AppCheck error.
* Cleanup
* FIRStorageTokenAuthorizerTests: helpers
* TODO
* Cleanup
* AppCheck: separate 2P and 3P API (#724 )
* FIRAppCheckInterop: remove a convenience method.
* Rename: FIRAppCheckTokenInterop->FIRAppCheckTokenResultInterop
* FIRAppCheckTokenResult introduced
* Update FIRAppCheckTokenHandlerInterop, FIRAppCheckTokenResultInterop and tests
* style
* Update token result
* Update storage integration
* Adjust check_imports.swift for test files
* Don't use internal AppCheck classes in Storage tests
* style
* Rename token to tokenResult in 2P API
* Add private Core headers to app check sources
* Fix storage log message code format
* token clarification comments in API docs
* Rename token->tokenResult
* AppCheck cleanup (#737 )
* Fix public headers import
* Cleanup imported test utils
* FirebaseAppCheck podspec: revert git URL
* AppCheck: Debug token to AppCheck token exchange API (#739 )
* GUL: make NSURLSession promise extension public
* Use NSURLSession+GULPromises to send requests
* style
* Move FIRAppCheckToken+APIResponse to Core dir
* rename
* FIRAppCheckDebugProviderAPIService introduced
* Move async token parsing API to FIRAppCheckToken extension
* Move token exchange response handling to FIRAppCheckAPIService. Tests WIP.
* Move API response parsing tests to FIRAppCheckAPIServiceTests
* FIRAppCheckDebugProviderAPIServiceTests
* Cleanup
* style
* App Check debug provider: integrate with exchange API (#743 )
* Move FIROption validation to FIRAppCheckValidator
* FIRAppCheckDebugProvider token exchange and tests
* Fix FIRAppCheckDebugProviderFactoryTests
* style
* App Check test app debug provider fix (#747 )
* App Check: minor touchups (#750 )
* Update dummy token value
* Print local debug token to logs
* Require GoogleUtilities v7.2 and above
* Print debug token on init
* Don't print debug token again
* App Check: use prod environment (#751 )
* App Check: use prod backend by default.
* Update token expiration threshold
* App Check SwiftPM support (#753 )
* AppCheck SwiftPM package definition
* Promise header import fix
* OCMock header fix
* Fix fixture dependent tests
* Exclude Keychain dependent tests
* License
* ./scripts/style.sh
* Cleanup
* Format with proper SwiftFormat version
* `.process` resources.
* Swift tests target
* Cleanup and code formatting
* App Check: token auto-refresh (#754 )
* FIRAppCheckTokenRefresher API defined
* FIRAppCheckTokenRefresher implementation draft
* [WIP] Token refresher integration
* Token refresher integration
* FIRAppCheckTests: token refresher tests
* FIRAppCheckTests: additional tests cases
* FIRAppCheckTimer introduced
* FIRAppCheckTokenRefresher: use FIRAppCheckTimer instead of the dispatch timer.
* FIRFakeTimer
* FIRAppCheckTokenRefresherTests testInitialRefresh
* FIRAppCheckTokenRefresherTests: testNextRefreshOnRefreshSuccess
* ./scripts/style.sh
* Exponential backoff
* Style and comments
* Move token refresh files to a separate folder
* FIRAppCheckTimerTests
* FIRAppCheck: use expicit class in init
* FIRAppCheckDebugProviderFactory Swift name
* FIRAppCheckTokenRefresher: Increment/decrement directly
* App Check fixes (#755 )
* Fix backoff: no backoff for the initial request
* Use eager initialization
* FIRAppCheckTokenRefresher: don't refresh until handler set
* FIRAppCheckIntegrationTests: disable token refresher
* Fix testInitialRefresh test
* style
* FIRAppCheckIntegrationTests fix
* Temporary exclude App Check from platfrom logging (#756 )
* App Check: send app check SDK version only in the header (#757 )
* App Check: store FAC token per app ID (#758 )
* App Check: store FAC token per app ID
* update podspec
* API docs
* FIRAppCheck initWithApp tests
* AppCheckCustomProvideApp (#760 )
* Functions: App Check integration (#762 )
* Functions: app check API added to FUNContextProvider
* FUNContextProviderTests
* FUNContextProvider app check support
* ./scripts/style.sh
* FIRFunctions: pass FAC token as HTTP header
* Fix SPM
* Fix Firebase-Package scheme bad merge
* Cleanup
* RTDB: pass FAC token to web socket (#763 )
* RTDB: pass FAC token to web socket
* FIRAppCheckFake default init
* Rename FAuthTokenProvider to FIRDatabaseConnectionContext; integrate with App Check
* Pass App Check token in the HTTP header
* Rename
* Fix existing tests
* TODO
* ./scripts/style.sh
* Context provider: assume separate FAC token change listener
* FIRDatabaseConnectionContextProviderTests
* Remove unused files
* Copy NSMutableURLRequest
* Cleanup
* ./scripts/style.sh
* FIRDatabaseConnectionContextProvider: sync callback when no auth or app check
* Cleanup
* Rename "authToken" leftovers to "context"
* Fix renaming
* Pass missing headers to NSURLSessionWebSocketTask
* Cleanup
* add a name to TODO
* App Check: token update notifications (#764 )
* AppCheck: token did change API and tests
* notification implementation and fixes
* Run ./scripts/style.sh
* Update comments
* RTDB: send app check token updates to keep connection open (#765 )
* Pass AppCheck instance as an object into the the FAC token update notification
* FIRDatabaseConnectionContext: add FAC token change listener API
* formatting
* Send FAC token updates to open connection
* More informative empty response message
* refreshAppCheckToken fixes
* Remove assertion
* Don't modify state
* forceTokensRefresh -> forceTokenRefreshes
* Call listeners on [FIRDatabaseQuery sharedQueue]
* App Check API cleanup and docs (#766 )
* AppCheck public API and docs cleanup
* More API docs
* Fix compilation errors
* typos and wording
* Make summary different from description (pod lib lint warning)
* port app check workflow changes from another branch
* pod lib lint: remove --allow-warnings
* App Check cleanup (#767 )
* Cleanup debug code and outdated TODOs
* Fix FIRDeviceCheckProvider availablility for SPM
* Fix availability in tests
* Fix availability in tests
* Make sure os requirements are consistent for tests specs
* Migrate v1alpha URLs to v1beta
* Migrate v1alpha URLs to v1beta
* Run ./scripts/style.sh
* Functions tests: fix Xcode 11 warnings (#7931 )
* Functions tests: fix Xcode 11 warnings
* style
* App Check: token auto-refresh opt-out API (#769 )
* FIRAppCheckSettings introduced (WIP)
* FIRAppCheckSettingsTests
* Style
* Make FIRAppCheckSettings instance per-app.
* FIRAppCheckTokenRefresher: use FIRAppCheckSettings.isTokenAutoRefreshEnabled (WIP)
* Tests
* Add public instance getters
* Fix analyzer warnings
* Fix testspec OS versions
* FIRAppCheckTokenRefresher expiration date update; tests
* FIRAppCheck.isTokenAutoRefreshEnabled implementation and tests
* style
* FIRAppCheck: Use specific types for variables in the default init
* More precise comments
* missing symbol
* FIRAppCheckSettings: remove defensive conditions from init.
Co-authored-by: Nick Cooke <nickcooke@google.com >
Co-authored-by: Nick Cooke <36927374+ncooke3@users.noreply.github.com >
2021-04-21 21:01:11 -04:00