forked from project-chip/connectedhomeip
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update local master #13
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…#4149) This should give us better type-safety.
* [doc] Add instruction for running cirque tests * Restyled by prettier-markdown * Add instruction for running single test * Move doc to src/test_driver/linux-cirque/cirque.md * Fix doxygen * Restyled by prettier-markdown Co-authored-by: Restyled.io <[email protected]>
* [cirque] Add cirque test for Echo * Install common packages in base image
* Add Workflow for ZAP template generation * Update ZAP submodule and remove tracking of master in CI * Update workflow file
Add the initial API for the key value storage interface. Other changes will implement this API for the various platforms.
* Initial definition of an mDNS advertiser * Make chip app server listen on mdns by default * Replace DiscoveryManager with advertiser * Fix compilation, ensure we shutdown before we listen for mDNS server, to make sure multiple start calls work * Always advertise as operational, add some more logging * Register delegates, add some logging, fix PTR records * Remove errand space * Fix crash in ESP code on broadcast * Fix return value: ref return does not work well * Update logging verbosity on ESP32: chip already configures its logging, so mark esp verbosity to verbose * hex format server name * Better logging, fix server discovery * Update registration of names * Restyle fixes * Make ipv4 in minmdns optional * Fix logic error in interface lister * Move Clone into SystemPacketBuffer. Clean up a bit of handle usage in mdns * Make stringbuilder a support class * Restyle fixes * Fix build after merge with master * Rename Clone to CloneData * Replace minimal-mdns with minimal * Clariy update for interface iteration
When lighting-app is built with the Pigweed RPC server using 'rpc.overlay' configuration overlay, it must build pw_sys_io backend using Zephyr Console API. Pigweed, however, uses more strict warning settings than Zephyr and the build fails due to some warnings which are not fixed in the currently supported version of nRF Connect SDK. Suppress those warnings and clean the CMakeLists.txt file a bit.
* Fix CHIPDeviceController when storage delegate is nullptr CHIPDeviceController releases results of the Rendezvous session assuming that they have been persisted. However some platforms, like Android, don't provide implementation of PersistentStorageDelegate yet. * Apply code review comment * Add TODO comment
* Add regen all script * Make the directory check more flexible
* Start CHIP event-loop by default during initialization. * Add CHIP memory init during initialization
* Update SPAKE2p pairing code to match spec - update message handshake to include PBKDF param exchange - update msg types and error codes - add error handling via error message handshake * delete commented out code * use little endian byte ordering in the messages * address review comments * fix build
Co-authored-by: Restyled.io <[email protected]>
The default configuration for the reporting plugin that is contained in `EMBER_AF_GENERATED_REPORTING_CONFIG_DEFAULTS` is currently not loaded. There are a few different issues: * `EMBER_AF_GENERATED_PLUGIN_STACK_STATUS_FUNCTION_CALLS` which contains some bits of the plugins initialization is never called * The dynamically generated `EMBER_AF_GENERATED_REPORTING_CONFIG_DEFAULTS_TABLE_SIZE` is bigger than `EMBER_AF_PLUGIN_REPORTING_TABLE_SIZE` * The `EmberAfPluginReportingEntry` has trying to be load/save from the disk, which is not supported yet. * Some of the plugins callbacks that are loaded by `EMBER_AF_GENERATED_PLUGIN_STACK_STATUS_FUNCTION_CALLS` does not exists. Either because the plugin is not part of CHIP or because the plugin has been hand crafted and this method was missing.
…4175) * [controller] Support ble connect using discriminator on linux python cli * Add macOS support * dbus.Dictionary can be iterable * Output format update * Print traceback on exception * Fix exception * Simple cleanup on CoreBluetoothMgr
* [nrfconnect] Build CHIP as out-of-tree Zephyr module Redesign the way nRF Connect examples integrate with CHIP libraries. Instead of importing CMake modules which directly configure build of CHIP libraries, create a separate CMake project for CHIP which also satisfies the Zephyr module requirements (e.g. it provides a module manifest file). It allows a nRF Connect application to simply add CHIP to the Zephyr module list and load Zephyr build scripts to make sure that CHIP is properly pulled into the project. The new design, apart from following recommendations from the Zephyr community, will allow to easily integrate CHIP into projects that need CHIP as an in-tree Zephyr module (like nRF Connect SDK itself or other Zephyr-based projects). By the way, clean some things up in the build scripts area. * Bump nRF Docker image version in the workflow * Restyled by prettier-markdown * Restyled by prettier-yaml * Set more Kconfig variables by default for CHIP Co-authored-by: Restyled.io <[email protected]>
…ketBufferHandle' directly instead of 'uint16_t' (#4181)
* [doc] Add document for chip device controller python cli * Add note about building bluez * Update doc
This will help avoid issues like the one fixed by #4165, where a pip package used by pigweed updated underneath us and broke. These are gathered from install_requires in setup.py of packages we install. Currently we don't have a way to fail the build if there's an unpinned dep; they'll have to be found manually and added to requirements.in.
#4158) * Integrated examples/common/chip-app-server to the CHIP src/app/server. examples/common/chip-app-server should is not a part of CHIP, while is needed by most of CHIP devices and is based on CHIP API. * Created src/app/server directory to store all CHIP accessory device specific files. * Moved examples/common/chip-app-server content to the src/app/server. * Removed examples/common/chip-app-server. * Aligned READMEs to describe directories content. * Restyled by gn Co-authored-by: Restyled.io <[email protected]>
* Some cleanup in secure session manager code * Address review comments * address review comments * review comments * update enum variants
#4219) * Define global attributes ids only once instead of repeating them for all clusters * Update src/app/zap-templates/attribute-id.zapt Co-authored-by: Boris Zbarsky <[email protected]> Co-authored-by: Boris Zbarsky <[email protected]>
…ExchangeManager (#4293)
#### Problem The `CHECK_RETURN_VALUE` macro is conditionally defined to a non-standard attribute that indicates that a function return value should not be ignored. C++17 standardizes this as `[[nodiscard]]` and some compilers also support this attribute in earlier versions. #### Summary of Changes Use `[[nodiscard]]` when it is known to be available. - C++17 or later - gcc 7 or later, per https://gcc.gnu.org/projects/cxx-status.html - clang 4 or later, per https://clang.llvm.org/cxx_status.html
Spec requirement is that device shall require explicit trigger of NFC pairing mode via a physical interaction on the device, while currently NFC tag emulation is started automatically after init. * Moved NFC tag starting method from init to the button handler * Added GetTagState method to the NFCWidget * Aligned samples documentation
* Add Common protocol definations * Rename CommonProtocol.h to Constants.h * Rename secure_channel/SecureChannelProtocol.h to secure_channel/Constants.h
* Add more unit tests for sending pre-encrypted messages * restyled * Fix test compilation * restyled
* Revise CHIPTLV to increase PacketBuffer safety #### Problem CHIPTLV stores pointers to PacketBuffers (and CHIPCircularTLVBuffers) as integers, and its code also uses some unsafe PacketBuffer methods that are used nowhere else and should be removed. #### Summary of Changes - Replace the `int mBufHandle` used to hold pointers in TLV classes, and the associated callbacks, with a TLVBackingStore interface. - Implement the TLVBackingStore interface on CHIPCircularTLVBuffers. - Implement the TLVBackingStore interface for PacketBuffers, and add PacketBufferTLVReader/Writer modelled on CHIPCircularTLVReader/Writer. - Incidentally, move existing interface documentation to CHIPTLV.h. fixes #4163 Revise CHIPTLV for PacketBuffer safety * Fix doxygen * Correct copyright dates * Code review * Remove #pragma GCC diagnostic
* Initial definition of an mDNS advertiser * Make chip app server listen on mdns by default * Replace DiscoveryManager with advertiser * Fix compilation, ensure we shutdown before we listen for mDNS server, to make sure multiple start calls work * Always advertise as operational, add some more logging * Register delegates, add some logging, fix PTR records * Remove errand space * Fix crash in ESP code on broadcast * Fix return value: ref return does not work well * Update logging verbosity on ESP32: chip already configures its logging, so mark esp verbosity to verbose * hex format server name * Better logging, fix server discovery * Update registration of names * Restyle fixes * Make ipv4 in minmdns optional * Fix logic error in interface lister * Move Clone into SystemPacketBuffer. Clean up a bit of handle usage in mdns * Make stringbuilder a support class * Restyle fixes * Fix build after merge with master * Use dynamic memory allocation for responders * Update to use dynamic memory for qnames as well * Use clear to reset state * Move Flat allocated qnames in separate file and add unit tests * Add some doccomments * Remove redundant information from srv responder contructor arguments * Order of init fix * Rename Clone to CloneData * Add nullptr setting during clear * Replace minimal-mdns with minimal * Clariy update for interface iteration * Validate qname memory allocation * Restyle fixes * Make doxygen happy * Make doxygen happy * Cleanup doccomments * Minimize template-specific code within minimal mdns memory allocation code - hoping for a size reduction of code * Add methods for commisionable advertisement in the minmdns advertiser * Create an example advertiser app, that uses the mdns advertiser * Added some documentation, renamed advertiser to exclude minimal since we use the platform advertiser in this example * Added error handling and remove -v option (apparently we auto-use it for version, which seems unfortunate) * Only enable -4 option if ipv4 is configured * Fix ipv4 listening for minmdns * Update parameters to match examples in spec * Vid/pid are 16-bit apparently * Make the example app server advertise operational as well * Rename Commisionable to Commsioning - this is what we actually added. Naming is a bit too close for comfort ... * Restyle fixes * Add back method definition (merge error) * Implement assignment operator in Optional since =default does not work * Replace commisionable with commisioning * Update based on code review feedback * Shorten the advertiser parameters code: do not build everything into one * Fix compilation (missing braces on method call) * Fix crash min minmdns query builder - header buffer assignment is required on reset
* [zephyr] Fix compatibility with newer Zephyr As a result of zephyrproject-rtos/zephyr#29357 BLE indication callback parameter type has changed in recent Zephyr revisions. * Restyled by clang-format Co-authored-by: Restyled.io <[email protected]>
* CHIP Certificate Implementation. -- Implements core logic to load, process, validate CHIP certificates. -- Implements CHIP to X509 certificate conversion functions. -- Implements X509 to CHIP Certificate conversion functions. * Addressed Review Comments. * Addressed Review Comments. * CHIP Certificate Implementation. -- Implements core logic to load, process, validate CHIP certificates. -- Implements CHIP to X509 certificate conversion functions. -- Implements X509 to CHIP Certificate conversion functions. * Apply suggestions from code review Co-authored-by: Boris Zbarsky <[email protected]> * Addressed Review Comments * Fixed compile error Co-authored-by: Boris Zbarsky <[email protected]>
* Add TCP support to chip echo test app * Change argument 'tcp' to '--tcp'
) * Initial support of the Texas Instruments CC13X2 CC26X2 MCU family * Update headers to match repository * Switched License header to Apache 2.0 for SysConfig file. * Replaced C ternary statements with boolean returns. * Replaced Pre-processor include guards with `#pragma once`. * Removed unnecessary forward declarations. * Restyled by whitespace * Restyled by clang-format * Restyled by gn * Restyled by prettier-markdown * fix whitespace (tab) issue from restyled * fix clang-format build issues from restyled Includes for board specific header files need path delimiters. * Restyled by whitespace * revert incorrect changes to m5stack-tft repo * remove common nv driver Revert to using the SDK version of the common nv driver and enable the POSIX-like porting layer. * remove ti sdk files Revert to using the platform support files in the board specific example from the TI SDK. This adds a step to installing the TI SDK to fix-up changes to work with the development version of OpenThread. * Restyled by clang-format * Restyled by gn * Restyled by prettier-markdown * add freertos as a submodule * move openthread platform to simplelink build file * clean up build graph * fix OpenThread configuration to match TI SDK * update lwip config header * Restyled by clang-format * Restyled by gn * remove usage of $HOME This now requires the user to set the absolute locations of the TI SDK and SysConfig tools. * Restyled by prettier-markdown * fix build issues * size sha workspace for the CC13X2 CC26X2 * Restyled by gn * fix gn style and remove commented out code * fix cpp elif in efr32 * re-enable openthread on efr32 and disable on esp32 * align with other platform doxygen disable defines Co-authored-by: Restyled.io <[email protected]>
…eFlag_ from ExFlagValues (#4323)
…ad of kDefaultSetupPinCode (#4196)
* Update TestSystemPacketBuffer #### Problem Uses of `PacketBuffer` have largely been replaced by `PacketBufferHandle`. The unit test had not kept up. #### Summary of Changes - Added tests for PacketBufferHandle specifically. - Added many checks of reference counts to verify the ownership model. - Some more refactoring into `PacketBufferTest`, friend class of `PacketBuffer` and `PacketBufferHandle`, to use private fields and track buffer allocations. part of #2707 - Figure out a way to express PacketBuffer ownership in the type system * Release buffers more often so that tests work with small pools.
* Configure BLE central role for Linux controller * Clean Bluez code * BLE Central for Linux * Don't start BLE discovery if Bluez already knows the device * Code style changes
This PR adds some custom types to CHIP ZCL in order to sync generated files and the values from `src/app/util/basic-types.h` The custom types lives inside their own XML files in `src/app/zap-templates/custom-types.xml`. Some of the JS helpers have been updated to take into accounts those new types and to have a single source of trust in `src/app/zap-templates/common/ChipTypesHelper.js'. Lastly the content of the `gen/` folders has been updated to reflect those changes.
* Add support for commisionable advertisement * Minor fixes based on review comments * Use a flag to enable/disable commisionable mode * Restyled by clang-format * Revert enable/disable flag for commisionable mode After discussions with the group, it was decided that we don't need a compile time option to enable/disable the commisionable mode, but instead have some kind of a stop advertising command to do this. * Restyled by clang-format Co-authored-by: Restyled.io <[email protected]>
hnnajh
pushed a commit
that referenced
this pull request
Jul 22, 2022
It's not safe to access line editing state from the IO thread while inside readline() on the main thread. Remove the code that attempts to redraw readline after printing logs. This avoids segfaults during logging at the cost of those logs overwriting the prompt (this is not trivial to fix as readline is a blocking API). ================== WARNING: ThreadSanitizer: data race (pid=63005) Write of size 1 at 0x55f81c7745ff by main thread: #0 InteractiveStartCommand::ParseCommand(char*) ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:127 (chip-tool+0x874911) #1 InteractiveStartCommand::RunCommand() ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:85 (chip-tool+0x874594) #2 CHIPCommand::StartWaiting(std::chrono::duration<unsigned int, std::ratio<1l, 1000l> >) ../../examples/chip-tool/commands/common/CHIPCommand.cpp:408 (chip-tool+0x83e478) #3 CHIPCommand::Run() ../../examples/chip-tool/commands/common/CHIPCommand.cpp:187 (chip-tool+0x83c839) #4 Commands::RunCommand(int, char**, bool) ../../examples/chip-tool/commands/common/Commands.cpp:147 (chip-tool+0x85d4f7) #5 Commands::Run(int, char**) ../../examples/chip-tool/commands/common/Commands.cpp:51 (chip-tool+0x85c288) #6 main <null> (chip-tool+0x569c0a) Previous read of size 1 at 0x55f81c7745ff by thread T5 (mutexes: write M185): #0 LoggingCallback ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:46 (chip-tool+0x874479) #1 chip::Logging::LogV(unsigned char, unsigned char, char const*, __va_list_tag*) ../../src/lib/support/logging/CHIPLogging.cpp:221 (chip-tool+0x8ee4dc) #2 chip::Logging::Log(unsigned char, unsigned char, char const*, ...) ../../src/lib/support/logging/CHIPLogging.cpp:172 (chip-tool+0x8ee30a) #3 chip::app::ReadClient::RefreshLivenessCheckTimer() <null> (chip-tool+0x8b1746) #4 chip::app::ReadClient::ProcessSubscribeResponse(chip::System::PacketBufferHandle&&) ../../src/app/ReadClient.cpp:845 (chip-tool+0x8b20ec) #5 chip::app::ReadClient::OnMessageReceived(chip::Messaging::ExchangeContext*, chip::PayloadHeader const&, chip::System::PacketBufferHandle&&) ../../src/app/ReadClient.cpp:409 (chip-tool+0x8ae2a4) #6 chip::Messaging::ExchangeContext::HandleMessage(unsigned int, chip::PayloadHeader const&, chip::BitFlags<chip::Messaging::MessageFlagValues, unsigned int>, chip::System::PacketBufferHandle&&) <null> (chip-tool+0xa0517a) #7 operator()<chip::Messaging::ExchangeContext> ../../src/messaging/ExchangeMgr.cpp:219 (chip-tool+0xa08c73) #8 Call ../../src/lib/support/Pool.h:126 (chip-tool+0xa0912d) #9 chip::internal::HeapObjectList::ForEachNode(void*, chip::Loop (*)(void*, void*)) ../../src/lib/support/Pool.cpp:127 (chip-tool+0x8ee05a) #10 ForEachActiveObject<chip::Messaging::ExchangeManager::OnMessageReceived(const chip::PacketHeader&, const chip::PayloadHeader&, const chip::SessionHandle&, chip::SessionMessageDelegate::DuplicateMessage, chip::System::PacketBufferHandle&&)::<lambda(auto:2*)> > ../../src/lib/support/Pool.h:396 (chip-tool+0xa08d10) #11 chip::Messaging::ExchangeManager::OnMessageReceived(chip::PacketHeader const&, chip::PayloadHeader const&, chip::SessionHandle const&, chip::SessionMessageDelegate::DuplicateMessage, chip::System::PacketBufferHandle&&) ../../src/messaging/ExchangeMgr.cpp:212 (chip-tool+0xa07e91) #12 chip::SessionManager::SecureUnicastMessageDispatch(chip::PacketHeader const&, chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/SessionManager.cpp:616 (chip-tool+0xa1548b) #13 chip::SessionManager::OnMessageReceived(chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/SessionManager.cpp:443 (chip-tool+0xa14426) #14 chip::TransportMgrBase::HandleMessageReceived(chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/TransportMgrBase.cpp:76 (chip-tool+0xa17dfa) #15 chip::Transport::Base::HandleMessageReceived(chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/raw/Base.h:102 (chip-tool+0xb19728) #16 chip::Transport::UDP::OnUdpReceive(chip::Inet::UDPEndPoint*, chip::System::PacketBufferHandle&&, chip::Inet::IPPacketInfo const*) ../../src/transport/raw/UDP.cpp:122 (chip-tool+0xb1a48b) #17 chip::Inet::UDPEndPointImplSockets::HandlePendingIO(chip::BitFlags<chip::System::SocketEventFlags, unsigned char>) ../../src/inet/UDPEndPointImplSockets.cpp:688 (chip-tool+0xb00aa0) #18 chip::Inet::UDPEndPointImplSockets::HandlePendingIO(chip::BitFlags<chip::System::SocketEventFlags, unsigned char>, long) ../../src/inet/UDPEndPointImplSockets.cpp:569 (chip-tool+0xafff89) #19 chip::System::LayerImplSelect::HandleEvents() ../../src/system/SystemLayerImplSelect.cpp:406 (chip-tool+0xb07563) #20 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_RunEventLoop() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:181 (chip-tool+0x98a227) #21 chip::DeviceLayer::PlatformManager::RunEventLoop() ../../src/include/platform/PlatformManager.h:362 (chip-tool+0x988f75) #22 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::EventLoopTaskMain(void*) ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:205 (chip-tool+0x98a87c) Location is global '(anonymous namespace)::gIsCommandRunning' of size 1 at 0x55f81c7745ff (chip-tool+0x000000c485ff) Mutex M185 (0x55f81c776180) created at: #0 pthread_mutex_lock ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4240 (libtsan.so.0+0x4f30a) #1 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_LockChipStack() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:78 (chip-tool+0x989e90) #2 chip::DeviceLayer::PlatformManager::LockChipStack() ../../src/include/platform/PlatformManager.h:410 (chip-tool+0x988fa5) #3 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_RunEventLoop() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:170 (chip-tool+0x98a147) #4 chip::DeviceLayer::PlatformManager::RunEventLoop() ../../src/include/platform/PlatformManager.h:362 (chip-tool+0x988f75) #5 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::EventLoopTaskMain(void*) ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:205 (chip-tool+0x98a87c) Thread T5 (tid=63013, running) created by main thread at: #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:969 (libtsan.so.0+0x5ad75) #1 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_StartEventLoopTask() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:231 (chip-tool+0x98a40a) #2 chip::DeviceLayer::PlatformManager::StartEventLoopTask() ../../src/include/platform/PlatformManager.h:375 (chip-tool+0xaacca2) #3 chip::Controller::DeviceControllerFactory::ServiceEvents() ../../src/controller/CHIPDeviceControllerFactory.cpp:331 (chip-tool+0xab0417) #4 CHIPCommand::StartWaiting(std::chrono::duration<unsigned int, std::ratio<1l, 1000l> >) ../../examples/chip-tool/commands/common/CHIPCommand.cpp:403 (chip-tool+0x83e353) #5 CHIPCommand::Run() ../../examples/chip-tool/commands/common/CHIPCommand.cpp:187 (chip-tool+0x83c839) #6 Commands::RunCommand(int, char**, bool) ../../examples/chip-tool/commands/common/Commands.cpp:147 (chip-tool+0x85d4f7) #7 Commands::Run(int, char**) ../../examples/chip-tool/commands/common/Commands.cpp:51 (chip-tool+0x85c288) #8 main <null> (chip-tool+0x569c0a) SUMMARY: ThreadSanitizer: data race ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:127 in InteractiveStartCommand::ParseCommand(char*) ==================
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
<<<<<FILL ME IN - the issue this PR is intended to address>>>>>
Summary of Changes
<<<<<FILL ME IN - what's in this PR>>>>>
Fixes #<<<<<FILL ME IN - issue number(s). If no issue, please create one>>>>>