From e0fc81676f5f10039554b7cae871939758beb90b Mon Sep 17 00:00:00 2001 From: Tomoya Kimura Date: Fri, 3 Dec 2021 13:07:03 +0900 Subject: [PATCH] feat: add autoware_system_monitor package (#14) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * release v0.4.0 * Fixed uninitialized variable. (#763) * Fixed various bugs. (#768) * Fixed various bugs. * Fixed wrong status report of NIC. * Added the mode of CPU Usage to check statistics calculated as averages among all processors by default. (#788) * fix uninitialized variables (#816) * remove ROS1 packages temporarily Signed-off-by: mitsudome-r * Revert "remove ROS1 packages temporarily" This reverts commit a9436882d50dc09fa5b8d6c0a151a10def76b242. Signed-off-by: mitsudome-r * add COLCON_IGNORE to ros1 packages Signed-off-by: mitsudome-r * Rename launch files to launch.xml (#28) * Port system monitor to ros2 (#71) * Implement a utility function that spins and updates a monitor node. * Port cpu monitor * Port hdd monitor. * Port mem_monitor to ROS2 * Port net_monitor to ROS2 * Port ntp_monitor to ROS2 * Port process_monitor to ROS2 * Port GPU_monitor to ROS2 * Port msr_reader and hdd_reader to ROS2 * Clean up the build and launch files: * Clean up and comment on CMake and package files. * Port the launch file to ROS2 * Rename h files to hpp (#142) * Change includes * Rename files * Adjustments to make things compile * Other packages * Adjust copyright notice on 532 out of 699 source files (#143) * Use quotes for includes where appropriate (#144) * Use quotes for includes where appropriate * Fix lint tests * Make tests pass hopefully * Run uncrustify on the entire Pilot.Auto codebase (#151) * Run uncrustify on the entire Pilot.Auto codebase * Exclude open PRs * ROS2 Linting: system_monitor (#207) * Add linters * Fix clang-tidy error in util.hpp * Ros2 v0.8.0 system monitor (#276) * fix dependency of system_monitor Signed-off-by: Takagi, Isamu * Rename ROS-related .yaml to .param.yaml (#352) * Rename ROS-related .yaml to .param.yaml Signed-off-by: Kenji Miyake * Remove prefix 'default_' of yaml files Signed-off-by: Kenji Miyake * Rename vehicle_info.yaml to vehicle_info.param.yaml Signed-off-by: Kenji Miyake * Rename diagnostic_aggregator's param files Signed-off-by: Kenji Miyake * Fix overlooked parameters Signed-off-by: Kenji Miyake * Exclude SwPowerCap as an error. (#1146) (#364) Co-authored-by: ito-san <57388357+ito-san@users.noreply.github.com> * [Update v0.9.0] system monitor (#365) * Disable CPU Load Average warning. (#1147) Signed-off-by: mitsudome-r * Fix cpu_monitor respawning forever. (#1150) * Disable cpu_temperature in planning simulation (#1151) Signed-off-by: mitsudome-r * Net Monitor: Handle as an error if specified device not exist. (#1152) * Handled as an error if specified device not exist. * Disable network diags in simulation Signed-off-by: Kenji Miyake Co-authored-by: Kenji Miyake * apply ament_uncrustify Signed-off-by: mitsudome-r * Disable resource monitoring in planning_simulator (#1172) Signed-off-by: Kenji Miyake * Treat logging errors as safe faults (#1164) Signed-off-by: Kenji Miyake * Fix test code of system_monitor (#1178) Signed-off-by: Kenji Miyake Co-authored-by: ito-san <57388357+ito-san@users.noreply.github.com> Co-authored-by: Kenji Miyake Co-authored-by: Kenji Miyake <31987104+kenji-miyake@users.noreply.github.com> * Use thread for ntpdate. (#1160) (#375) * Use thread for ntpdate. (#1160) Signed-off-by: mitsudome-r * removed unused variable Signed-off-by: mitsudome-r * Import v0.9.1 (#431) * add local optimal solution ocillation check to ndt_scan_matcher (#1182) * Add obstacle_crush diagnostic (#1186) Signed-off-by: Kenji Miyake * Fix diagnostics api (#1185) * Fix diagnostics api Signed-off-by: Kenji Miyake * Don't overwrite level Signed-off-by: Kenji Miyake * Overwrite level of No Fault diagnostics Signed-off-by: Kenji Miyake * Add missing diag in autoware_error_monitor.yaml (#1187) Signed-off-by: Kenji Miyake * Filter hazard_status (#1191) * Filter hazard_status Signed-off-by: Kenji Miyake * Filter leaf diagnostics Signed-off-by: Kenji Miyake * Fix wrong calculation of available memory. (#1168) * Fixed wrong calculation of available memory. * Added comments about output example of free -tb command. * Change monitoring method to get HDD temperature and usage per specified device. (#1195) * Changed monitoring method to get temperature and usage per specified device. * Fixed test codes. * Removed unnecessary (void) parameter. * return input pointcloud when ground plane not found (#1190) * fix yaw-smoothing bug (#1198) * Fix lint Signed-off-by: Kenji Miyake Co-authored-by: Taichi Higashide Co-authored-by: ito-san <57388357+ito-san@users.noreply.github.com> Co-authored-by: tkimura4 * Fix typo in system module (#434) * Fix typo in system module * Change variable name * Move comments * Apply uncrustify * Split system_monitor config (#452) Signed-off-by: Kenji Miyake * Remove unnecessary diagnostic update. (#455) * add use_sim-time option (#454) * Sync public repo (#1228) * [simple_planning_simulator] add readme (#424) * add readme of simple_planning_simulator Signed-off-by: Takamasa Horibe * Update simulator/simple_planning_simulator/README.md * set transit_margin_time to intersect. planner (#460) * Fix pose2twist (#462) Signed-off-by: Takagi, Isamu * Ros2 vehicle info param server (#447) * add vehicle_info_param_server * update vehicle info * apply format * fix bug * skip unnecessary search * delete vehicle param file * fix bug * Ros2 fix topic name part2 (#425) * Fix topic name of traffic_light_classifier Signed-off-by: Takagi, Isamu * Fix topic name of traffic_light_visualization Signed-off-by: Takagi, Isamu * Fix topic name of traffic_light_ssd_fine_detector Signed-off-by: Takagi, Isamu * Fix topic name of traffic_light_map_based_detector Signed-off-by: Takagi, Isamu * Fix lint traffic_light_recognition Signed-off-by: Takagi, Isamu * Fix lint traffic_light_ssd_fine_detector Signed-off-by: Takagi, Isamu * Fix lint traffic_light_classifier Signed-off-by: Takagi, Isamu * Fix lint traffic_light_classifier Signed-off-by: Takagi, Isamu * Fix lint traffic_light_ssd_fine_detector Signed-off-by: Takagi, Isamu * Fix issues in hdd_reader (#466) * Fix some issues detected by Coverity Scan and Clang-Tidy * Update launch command * Add more `close(new_sock)` * Simplify the definitions of struct * fix: re-construct laneletMapLayer for reindex RTree (#463) * Rviz overlay render fix (#461) * Moved painiting in SteeringAngle plugin to update() Signed-off-by: Adam Dabrowski * super class now back to MFD Signed-off-by: Adam Dabrowski * uncrustified Signed-off-by: Adam Dabrowski * acquire data in mutex Signed-off-by: Adam Dabrowski * back to RTD as superclass Signed-off-by: Adam Dabrowski * Rviz overlay render in update (#465) * Moved painiting in SteeringAngle plugin to update() Signed-off-by: Adam Dabrowski * super class now back to MFD Signed-off-by: Adam Dabrowski * uncrustified Signed-off-by: Adam Dabrowski * acquire data in mutex Signed-off-by: Adam Dabrowski * removed unnecessary includes and some dead code Signed-off-by: Adam Dabrowski * Adepted remaining vehicle plugin classes to render-in-update concept. Returned to MFD superclass Signed-off-by: Adam Dabrowski * restored RTD superclass Signed-off-by: Adam Dabrowski Co-authored-by: Takamasa Horibe Co-authored-by: tkimura4 Co-authored-by: Takagi, Isamu <43976882+isamu-takagi@users.noreply.github.com> Co-authored-by: Kazuki Miyahara Co-authored-by: Makoto Tokunaga Co-authored-by: Adam Dąbrowski * Fix issues in gpu_monitor (#1248) * Fix issues in gpu_monitor * Fix uninitialized variables * Use range-based for loop * Fix compile errors of tegra_gpu_monitor * Replace C-style to C++-style * Make iterators const * Fix fmt::format() usage error * Unify Apache-2.0 license name (#1242) * Remove use_sim_time for set_parameter (#1260) Signed-off-by: wep21 * [system_monitor] change some nodes into components (#1234) Signed-off-by: mitsudome-r Signed-off-by: wep21 Co-authored-by: Takeshi Miura <57553950+1222-takeshi@users.noreply.github.com> Co-authored-by: Takeshi Miura Co-authored-by: wep21 * add system_monitor.launch.py (#1238) * add system_monitor.launch.py * refactor system_monitor.launch.py * fix launch bug * fix typo * fix launch py * fix param loading * format code * fix system monitor executor to publish diagnostics asynclonously (#1283) * Fix lint errors (#1378) * Fix lint errors Signed-off-by: Kenji Miyake * Fix variable names Signed-off-by: Kenji Miyake * Add kernel CPU usage. (#1465) * Add kernel CPU usage. * Change CPU x: usage to CPU x: total. * Changed variable name. * Add markdownlint and prettier (#1661) * Add markdownlint and prettier Signed-off-by: Kenji Miyake * Ignore .param.yaml Signed-off-by: Kenji Miyake * Apply format Signed-off-by: Kenji Miyake * suppress warnings for system monitor (#1723) * fix for hdd_monitor * fix no initialization and warning * change command for ntp_monitor (#1705) * [EVT4-403] change command for ntp_monitor * [EVT4-403] fixed CI build error * [EVT4-403] fixed cpplint error * delete executeChronyc thread, fix error topic and log output code * fix cpplint error and code style divergence * fix cpplint error(missing correction) * Fix MD029 (#1813) Signed-off-by: Kenji Miyake * Fix -Wunused-parameter (#1836) * Fix -Wunused-parameter Signed-off-by: Kenji Miyake * Fix mistake Signed-off-by: Kenji Miyake * fix spell * Fix lint issues Signed-off-by: Kenji Miyake * Ignore flake8 warnings Signed-off-by: Kenji Miyake Co-authored-by: Hiroki OTA * add gpu usage per process (#1798) * add gpu usage per process * change illegal usage(4294967295%) to 0%, and fix CI running errors * Replace gettimeofday with rclcpp::Node::now(). * Fix uncrustify error. * Replace rclcpp::Node::now() with rclcpp::Clock(RCL_SYSTEM_TIME). Co-authored-by: ito-san * fix some typos (#1941) * fix some typos * fix typo * Fix typo Signed-off-by: Kenji Miyake Co-authored-by: Kenji Miyake * suppress warnings for system directory #2046 * add sort-package-xml hook in pre-commit (#1881) * add sort xml hook in pre-commit * change retval to exit_status * rename * add prettier plugin-xml * use early return * add license note * add tier4 license * restore prettier * change license order * move local hooks to public repo * move prettier-xml to pre-commit-hooks-ros * update version for bug-fix * apply pre-commit * Add execution time logging. (#2066) * Add markdown-link-check pre-commit (#2215) * add markdown-lint-check pre-commit * delete files argument * add optional hook * modify comment * add comment * delete hook * add retry option * add option * add files arg * Fix links in hdd_reader.md Signed-off-by: Kenji Miyake * Ignore 403 Signed-off-by: Kenji Miyake * Ignore tier4 github url Signed-off-by: Kenji Miyake * Update link Signed-off-by: Kenji Miyake Co-authored-by: Kenji Miyake * Change formatter to clang-format and black (#2332) * Revert "Temporarily comment out pre-commit hooks" This reverts commit 748e9cdb145ce12f8b520bcbd97f5ff899fc28a3. * Replace ament_lint_common with autoware_lint_common Signed-off-by: Kenji Miyake * Remove ament_cmake_uncrustify and ament_clang_format Signed-off-by: Kenji Miyake * Apply Black Signed-off-by: Kenji Miyake * Apply clang-format Signed-off-by: Kenji Miyake * Fix build errors Signed-off-by: Kenji Miyake * Fix for cpplint * Fix include double quotes to angle brackets Signed-off-by: Kenji Miyake * Apply clang-format Signed-off-by: Kenji Miyake * Fix build errors Signed-off-by: Kenji Miyake * Add COLCON_IGNORE (#500) Signed-off-by: Kenji Miyake * remove COLCON_IGNORE in system_packages and map_tf_generator (#532) Co-authored-by: mitsudome-r Co-authored-by: ito-san <57388357+ito-san@users.noreply.github.com> Co-authored-by: Kazuki Miyahara Co-authored-by: Nikolai Morin Co-authored-by: Yunus Emre Çalışkan Co-authored-by: Jilada Eccleston Co-authored-by: Daisuke Nishimatsu <42202095+wep21@users.noreply.github.com> Co-authored-by: Takagi, Isamu Co-authored-by: Kenji Miyake <31987104+kenji-miyake@users.noreply.github.com> Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> Co-authored-by: Kenji Miyake Co-authored-by: Taichi Higashide Co-authored-by: Takamasa Horibe Co-authored-by: Takagi, Isamu <43976882+isamu-takagi@users.noreply.github.com> Co-authored-by: Makoto Tokunaga Co-authored-by: Adam Dąbrowski Co-authored-by: Takeshi Miura <57553950+1222-takeshi@users.noreply.github.com> Co-authored-by: Takeshi Miura Co-authored-by: wep21 Co-authored-by: Hiroki OTA Co-authored-by: v-kitahara8153 <86092199+v-kitahara8153@users.noreply.github.com> Co-authored-by: ito-san Co-authored-by: Keisuke Shima <19993104+KeisukeShima@users.noreply.github.com> Co-authored-by: taikitanaka3 <65527974+taikitanaka3@users.noreply.github.com> --- system/system_monitor/CHANGELOG.rst | 8 + system/system_monitor/CMakeLists.txt | 315 ++++++ system/system_monitor/README.md | 179 ++++ system/system_monitor/cmake/FindNVML.cmake | 34 + .../config/cpu_monitor.param.yaml | 8 + .../config/gpu_monitor.param.yaml | 8 + .../config/hdd_monitor.param.yaml | 11 + .../config/mem_monitor.param.yaml | 4 + .../config/net_monitor.param.yaml | 4 + .../config/ntp_monitor.param.yaml | 5 + .../config/process_monitor.param.yaml | 3 + system/system_monitor/docs/class_diagrams.md | 29 + system/system_monitor/docs/hdd_reader.md | 58 ++ .../docs/images/class_cpu_monitor.png | Bin 0 -> 127936 bytes .../docs/images/class_gpu_monitor.png | Bin 0 -> 135193 bytes .../docs/images/class_hdd_monitor.png | Bin 0 -> 47011 bytes .../docs/images/class_mem_monitor.png | Bin 0 -> 44561 bytes .../docs/images/class_net_monitor.png | Bin 0 -> 43396 bytes .../docs/images/class_ntp_monitor.png | Bin 0 -> 43371 bytes .../docs/images/class_process_monitor.png | Bin 0 -> 108046 bytes .../docs/images/seq_cpu_monitor.png | Bin 0 -> 108200 bytes .../docs/images/seq_gpu_monitor.png | Bin 0 -> 111248 bytes .../docs/images/seq_hdd_monitor.png | Bin 0 -> 63852 bytes .../docs/images/seq_mem_monitor.png | Bin 0 -> 60290 bytes .../docs/images/seq_net_monitor.png | Bin 0 -> 60053 bytes .../docs/images/seq_ntp_monitor.png | Bin 0 -> 60252 bytes .../docs/images/seq_process_monitor.png | Bin 0 -> 107081 bytes system/system_monitor/docs/msr_reader.md | 40 + system/system_monitor/docs/ros_parameters.md | 84 ++ system/system_monitor/docs/seq_diagrams.md | 29 + .../system_monitor/docs/topics_cpu_monitor.md | 104 ++ .../system_monitor/docs/topics_gpu_monitor.md | 113 +++ .../system_monitor/docs/topics_hdd_monitor.md | 47 + .../system_monitor/docs/topics_mem_monitor.md | 28 + .../system_monitor/docs/topics_net_monitor.md | 31 + .../system_monitor/docs/topics_ntp_monitor.md | 20 + .../docs/topics_process_monitor.md | 75 ++ .../include/hdd_reader/hdd_reader.hpp | 64 ++ .../include/msr_reader/msr_reader.hpp | 51 + .../cpu_monitor/arm_cpu_monitor.hpp | 53 + .../cpu_monitor/cpu_monitor_base.hpp | 158 +++ .../cpu_monitor/intel_cpu_monitor.hpp | 59 ++ .../cpu_monitor/raspi_cpu_monitor.hpp | 75 ++ .../cpu_monitor/tegra_cpu_monitor.hpp | 53 + .../cpu_monitor/unknown_cpu_monitor.hpp | 38 + .../gpu_monitor/gpu_monitor_base.hpp | 129 +++ .../gpu_monitor/nvml_gpu_monitor.hpp | 133 +++ .../gpu_monitor/tegra_gpu_monitor.hpp | 103 ++ .../gpu_monitor/unknown_gpu_monitor.hpp | 37 + .../hdd_monitor/hdd_monitor.hpp | 105 ++ .../mem_monitor/mem_monitor.hpp | 76 ++ .../net_monitor/net_monitor.hpp | 104 ++ .../system_monitor/net_monitor/nl80211.hpp | 60 ++ .../ntp_monitor/ntp_monitor.hpp | 80 ++ .../process_monitor/diag_task.hpp | 179 ++++ .../process_monitor/process_monitor.hpp | 124 +++ .../system_monitor/system_monitor_utility.hpp | 124 +++ .../launch/system_monitor.launch.py | 156 +++ .../launch/system_monitor.launch.xml | 33 + system/system_monitor/package.xml | 31 + .../reader/hdd_reader/hdd_reader.cpp | 591 +++++++++++ .../reader/msr_reader/msr_reader.cpp | 285 ++++++ .../src/cpu_monitor/arm_cpu_monitor.cpp | 48 + .../src/cpu_monitor/cpu_monitor_base.cpp | 333 +++++++ .../src/cpu_monitor/intel_cpu_monitor.cpp | 211 ++++ .../src/cpu_monitor/raspi_cpu_monitor.cpp | 85 ++ .../src/cpu_monitor/tegra_cpu_monitor.cpp | 48 + .../src/cpu_monitor/unknown_cpu_monitor.cpp | 29 + .../src/gpu_monitor/gpu_monitor_base.cpp | 76 ++ .../src/gpu_monitor/nvml_gpu_monitor.cpp | 401 ++++++++ .../src/gpu_monitor/tegra_gpu_monitor.cpp | 210 ++++ .../src/gpu_monitor/unknown_gpu_monitor.cpp | 29 + .../src/hdd_monitor/hdd_monitor.cpp | 304 ++++++ .../src/mem_monitor/mem_monitor.cpp | 137 +++ .../src/net_monitor/net_monitor.cpp | 233 +++++ .../src/net_monitor/nl80211.cpp | 205 ++++ .../src/ntp_monitor/ntp_monitor.cpp | 139 +++ .../src/process_monitor/process_monitor.cpp | 314 ++++++ .../test/config/test_hdd_monitor.param.yaml | 9 + .../test/config/test_net_monitor.param.yaml | 5 + .../test/config/test_ntp_monitor.param.yaml | 5 + .../test/src/cpu_monitor/mpstat1.cpp | 20 + .../test/src/cpu_monitor/mpstat2.cpp | 20 + .../src/cpu_monitor/test_arm_cpu_monitor.cpp | 695 +++++++++++++ .../cpu_monitor/test_intel_cpu_monitor.cpp | 917 ++++++++++++++++++ .../cpu_monitor/test_raspi_cpu_monitor.cpp | 695 +++++++++++++ .../cpu_monitor/test_tegra_cpu_monitor.cpp | 681 +++++++++++++ .../cpu_monitor/test_unknown_cpu_monitor.cpp | 78 ++ .../src/gpu_monitor/test_nvml_gpu_monitor.cpp | 552 +++++++++++ .../gpu_monitor/test_tegra_gpu_monitor.cpp | 499 ++++++++++ .../gpu_monitor/test_unknown_gpu_monitor.cpp | 76 ++ .../test/src/hdd_monitor/df1.cpp | 20 + .../test/src/hdd_monitor/test_hdd_monitor.cpp | 712 ++++++++++++++ .../test/src/mem_monitor/free1.cpp | 20 + .../test/src/mem_monitor/test_mem_monitor.cpp | 280 ++++++ .../test/src/net_monitor/test_net_monitor.cpp | 192 ++++ .../test/src/ntp_monitor/ntpdate1.cpp | 20 + .../test/src/ntp_monitor/test_ntp_monitor.cpp | 303 ++++++ .../test/src/process_monitor/echo1.cpp | 20 + .../test/src/process_monitor/sed1.cpp | 20 + .../test/src/process_monitor/sort1.cpp | 20 + .../process_monitor/test_process_monitor.cpp | 379 ++++++++ .../test/src/process_monitor/top1.cpp | 20 + .../test/src/process_monitor/top2.cpp | 22 + .../test/src/process_monitor/top3.cpp | 26 + 105 files changed, 13246 insertions(+) create mode 100644 system/system_monitor/CHANGELOG.rst create mode 100644 system/system_monitor/CMakeLists.txt create mode 100644 system/system_monitor/README.md create mode 100644 system/system_monitor/cmake/FindNVML.cmake create mode 100644 system/system_monitor/config/cpu_monitor.param.yaml create mode 100644 system/system_monitor/config/gpu_monitor.param.yaml create mode 100644 system/system_monitor/config/hdd_monitor.param.yaml create mode 100644 system/system_monitor/config/mem_monitor.param.yaml create mode 100644 system/system_monitor/config/net_monitor.param.yaml create mode 100644 system/system_monitor/config/ntp_monitor.param.yaml create mode 100644 system/system_monitor/config/process_monitor.param.yaml create mode 100644 system/system_monitor/docs/class_diagrams.md create mode 100644 system/system_monitor/docs/hdd_reader.md create mode 100644 system/system_monitor/docs/images/class_cpu_monitor.png create mode 100644 system/system_monitor/docs/images/class_gpu_monitor.png create mode 100644 system/system_monitor/docs/images/class_hdd_monitor.png create mode 100644 system/system_monitor/docs/images/class_mem_monitor.png create mode 100644 system/system_monitor/docs/images/class_net_monitor.png create mode 100644 system/system_monitor/docs/images/class_ntp_monitor.png create mode 100644 system/system_monitor/docs/images/class_process_monitor.png create mode 100644 system/system_monitor/docs/images/seq_cpu_monitor.png create mode 100644 system/system_monitor/docs/images/seq_gpu_monitor.png create mode 100644 system/system_monitor/docs/images/seq_hdd_monitor.png create mode 100644 system/system_monitor/docs/images/seq_mem_monitor.png create mode 100644 system/system_monitor/docs/images/seq_net_monitor.png create mode 100644 system/system_monitor/docs/images/seq_ntp_monitor.png create mode 100644 system/system_monitor/docs/images/seq_process_monitor.png create mode 100644 system/system_monitor/docs/msr_reader.md create mode 100644 system/system_monitor/docs/ros_parameters.md create mode 100644 system/system_monitor/docs/seq_diagrams.md create mode 100644 system/system_monitor/docs/topics_cpu_monitor.md create mode 100644 system/system_monitor/docs/topics_gpu_monitor.md create mode 100644 system/system_monitor/docs/topics_hdd_monitor.md create mode 100644 system/system_monitor/docs/topics_mem_monitor.md create mode 100644 system/system_monitor/docs/topics_net_monitor.md create mode 100644 system/system_monitor/docs/topics_ntp_monitor.md create mode 100644 system/system_monitor/docs/topics_process_monitor.md create mode 100644 system/system_monitor/include/hdd_reader/hdd_reader.hpp create mode 100644 system/system_monitor/include/msr_reader/msr_reader.hpp create mode 100644 system/system_monitor/include/system_monitor/cpu_monitor/arm_cpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/cpu_monitor/cpu_monitor_base.hpp create mode 100644 system/system_monitor/include/system_monitor/cpu_monitor/intel_cpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/cpu_monitor/raspi_cpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/cpu_monitor/tegra_cpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/cpu_monitor/unknown_cpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/gpu_monitor/gpu_monitor_base.hpp create mode 100644 system/system_monitor/include/system_monitor/gpu_monitor/nvml_gpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/gpu_monitor/tegra_gpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/gpu_monitor/unknown_gpu_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/hdd_monitor/hdd_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/mem_monitor/mem_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/net_monitor/net_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/net_monitor/nl80211.hpp create mode 100644 system/system_monitor/include/system_monitor/ntp_monitor/ntp_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/process_monitor/diag_task.hpp create mode 100644 system/system_monitor/include/system_monitor/process_monitor/process_monitor.hpp create mode 100644 system/system_monitor/include/system_monitor/system_monitor_utility.hpp create mode 100644 system/system_monitor/launch/system_monitor.launch.py create mode 100644 system/system_monitor/launch/system_monitor.launch.xml create mode 100644 system/system_monitor/package.xml create mode 100644 system/system_monitor/reader/hdd_reader/hdd_reader.cpp create mode 100644 system/system_monitor/reader/msr_reader/msr_reader.cpp create mode 100644 system/system_monitor/src/cpu_monitor/arm_cpu_monitor.cpp create mode 100644 system/system_monitor/src/cpu_monitor/cpu_monitor_base.cpp create mode 100644 system/system_monitor/src/cpu_monitor/intel_cpu_monitor.cpp create mode 100644 system/system_monitor/src/cpu_monitor/raspi_cpu_monitor.cpp create mode 100644 system/system_monitor/src/cpu_monitor/tegra_cpu_monitor.cpp create mode 100644 system/system_monitor/src/cpu_monitor/unknown_cpu_monitor.cpp create mode 100644 system/system_monitor/src/gpu_monitor/gpu_monitor_base.cpp create mode 100644 system/system_monitor/src/gpu_monitor/nvml_gpu_monitor.cpp create mode 100644 system/system_monitor/src/gpu_monitor/tegra_gpu_monitor.cpp create mode 100644 system/system_monitor/src/gpu_monitor/unknown_gpu_monitor.cpp create mode 100644 system/system_monitor/src/hdd_monitor/hdd_monitor.cpp create mode 100644 system/system_monitor/src/mem_monitor/mem_monitor.cpp create mode 100644 system/system_monitor/src/net_monitor/net_monitor.cpp create mode 100644 system/system_monitor/src/net_monitor/nl80211.cpp create mode 100644 system/system_monitor/src/ntp_monitor/ntp_monitor.cpp create mode 100644 system/system_monitor/src/process_monitor/process_monitor.cpp create mode 100644 system/system_monitor/test/config/test_hdd_monitor.param.yaml create mode 100644 system/system_monitor/test/config/test_net_monitor.param.yaml create mode 100644 system/system_monitor/test/config/test_ntp_monitor.param.yaml create mode 100644 system/system_monitor/test/src/cpu_monitor/mpstat1.cpp create mode 100644 system/system_monitor/test/src/cpu_monitor/mpstat2.cpp create mode 100644 system/system_monitor/test/src/cpu_monitor/test_arm_cpu_monitor.cpp create mode 100644 system/system_monitor/test/src/cpu_monitor/test_intel_cpu_monitor.cpp create mode 100644 system/system_monitor/test/src/cpu_monitor/test_raspi_cpu_monitor.cpp create mode 100644 system/system_monitor/test/src/cpu_monitor/test_tegra_cpu_monitor.cpp create mode 100644 system/system_monitor/test/src/cpu_monitor/test_unknown_cpu_monitor.cpp create mode 100644 system/system_monitor/test/src/gpu_monitor/test_nvml_gpu_monitor.cpp create mode 100644 system/system_monitor/test/src/gpu_monitor/test_tegra_gpu_monitor.cpp create mode 100644 system/system_monitor/test/src/gpu_monitor/test_unknown_gpu_monitor.cpp create mode 100644 system/system_monitor/test/src/hdd_monitor/df1.cpp create mode 100644 system/system_monitor/test/src/hdd_monitor/test_hdd_monitor.cpp create mode 100644 system/system_monitor/test/src/mem_monitor/free1.cpp create mode 100644 system/system_monitor/test/src/mem_monitor/test_mem_monitor.cpp create mode 100644 system/system_monitor/test/src/net_monitor/test_net_monitor.cpp create mode 100644 system/system_monitor/test/src/ntp_monitor/ntpdate1.cpp create mode 100644 system/system_monitor/test/src/ntp_monitor/test_ntp_monitor.cpp create mode 100644 system/system_monitor/test/src/process_monitor/echo1.cpp create mode 100644 system/system_monitor/test/src/process_monitor/sed1.cpp create mode 100644 system/system_monitor/test/src/process_monitor/sort1.cpp create mode 100644 system/system_monitor/test/src/process_monitor/test_process_monitor.cpp create mode 100644 system/system_monitor/test/src/process_monitor/top1.cpp create mode 100644 system/system_monitor/test/src/process_monitor/top2.cpp create mode 100644 system/system_monitor/test/src/process_monitor/top3.cpp diff --git a/system/system_monitor/CHANGELOG.rst b/system/system_monitor/CHANGELOG.rst new file mode 100644 index 0000000000000..ce6769d12e186 --- /dev/null +++ b/system/system_monitor/CHANGELOG.rst @@ -0,0 +1,8 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package system_monitor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1.1x.0 (2020-xx-xx) +------------------- +* Initial commit +* Contributors: Fumihito Ito diff --git a/system/system_monitor/CMakeLists.txt b/system/system_monitor/CMakeLists.txt new file mode 100644 index 0000000000000..03ca85213b40b --- /dev/null +++ b/system/system_monitor/CMakeLists.txt @@ -0,0 +1,315 @@ +cmake_minimum_required(VERSION 3.5) +project(system_monitor) + +## Compile as C++14, supported in ROS Melodic and newer +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) +endif() +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic -Werror) +endif() + +find_package(ament_cmake_auto REQUIRED) +ament_auto_find_build_dependencies() + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +find_package(NVML) +find_package(fmt REQUIRED) +set(LIBRARIES fmt) + +########### +## Build ## +########### + +## Specify additional locations of header files + +find_path(LIBNL3_INCLUDE_DIRS + NAMES netlink/netlink.h + PATH_SUFFIXES libnl3 +) + +if(NVML_FOUND) + include_directories( + include + ${LIBNL3_INCLUDE_DIRS} + ${NVML_INCLUDE_DIRS} + ) +else() + include_directories( + include + ${LIBNL3_INCLUDE_DIRS} + ) +endif() + +## Declare a C++ executable + +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(CMAKE_CPU_PLATFORM "intel") + add_definitions(-D_CPU_INTEL_) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm") + if(CMAKE_HOST_SYSTEM_VERSION MATCHES ".*raspi.*") + set(CMAKE_CPU_PLATFORM "raspi") + add_definitions(-D_CPU_RASPI_) + elseif(CMAKE_HOST_SYSTEM_VERSION MATCHES ".*tegra.*") + set(CMAKE_CPU_PLATFORM "tegra") + add_definitions(-D_CPU_TEGRA_) + else() + set(CMAKE_CPU_PLATFORM "arm") + add_definitions(-D_CPU_ARM_) + endif() +else() + set(CMAKE_CPU_PLATFORM "unknown") +endif() + +if(NVML_FOUND) + set(CMAKE_GPU_PLATFORM "nvml") + add_definitions(-D_GPU_NVML_) + set(GPU_LIBRARY ${NVML_LIBRARIES}) +else() + if(CMAKE_CPU_PLATFORM STREQUAL "tegra") + set(CMAKE_GPU_PLATFORM "tegra") + add_definitions(-D_GPU_TEGRA_) + else() + set(CMAKE_GPU_PLATFORM "unknown") + endif() +endif() + +message(STATUS "HOST_SYSTEM_VERSION: " ${CMAKE_HOST_SYSTEM_VERSION}) +message(STATUS "SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR}) +message(STATUS "CPU PLATFORM: " ${CMAKE_CPU_PLATFORM}) +message(STATUS "GPU PLATFORM: " ${CMAKE_GPU_PLATFORM}) + +set(CPU_MONITOR_SOURCE + src/cpu_monitor/cpu_monitor_base.cpp + src/cpu_monitor/${CMAKE_CPU_PLATFORM}_cpu_monitor.cpp +) + +ament_auto_add_library(cpu_monitor_lib SHARED + ${CPU_MONITOR_SOURCE} +) + +ament_auto_add_library(hdd_monitor_lib SHARED + src/hdd_monitor/hdd_monitor.cpp +) + +ament_auto_add_library(mem_monitor_lib SHARED + src/mem_monitor/mem_monitor.cpp +) + +ament_auto_add_library(net_monitor_lib SHARED + src/net_monitor/net_monitor.cpp + src/net_monitor/nl80211.cpp +) + +ament_auto_add_library(ntp_monitor_lib SHARED + src/ntp_monitor/ntp_monitor.cpp +) + +ament_auto_add_library(process_monitor_lib SHARED + src/process_monitor/process_monitor.cpp +) + +set(GPU_MONITOR_SOURCE + src/gpu_monitor/gpu_monitor_base.cpp + src/gpu_monitor/${CMAKE_GPU_PLATFORM}_gpu_monitor.cpp +) +ament_auto_add_library(gpu_monitor_lib SHARED + ${GPU_MONITOR_SOURCE} +) + +ament_auto_add_executable(msr_reader + reader/msr_reader/msr_reader.cpp +) + +ament_auto_add_executable(hdd_reader + reader/hdd_reader/hdd_reader.cpp +) + +find_library(NL3 nl-3 REQUIRED) +find_library(NLGENL3 nl-genl-3 REQUIRED) +list(APPEND NL_LIBS ${NL3} ${NLGENL3}) + +find_package(Boost REQUIRED COMPONENTS + serialization + thread + filesystem + regex +) + +## Specify libraries to link a library or executable target against +target_link_libraries(cpu_monitor_lib ${Boost_LIBRARIES} ${LIBRARIES}) +target_link_libraries(hdd_monitor_lib ${Boost_LIBRARIES} ${LIBRARIES}) +target_link_libraries(mem_monitor_lib ${LIBRARIES}) +target_link_libraries(net_monitor_lib ${NL_LIBS} ${LIBRARIES}) +target_link_libraries(ntp_monitor_lib ${Boost_LIBRARIES} ${LIBRARIES}) +target_link_libraries(process_monitor_lib ${LIBRARIES}) +target_link_libraries(gpu_monitor_lib ${GPU_LIBRARY} ${Boost_LIBRARIES} ${LIBRARIES}) +target_link_libraries(msr_reader ${Boost_LIBRARIES} ${LIBRARIES}) +target_link_libraries(hdd_reader ${Boost_LIBRARIES} ${LIBRARIES}) + +rclcpp_components_register_node(cpu_monitor_lib + PLUGIN "CPUMonitor" + EXECUTABLE cpu_monitor +) + +rclcpp_components_register_node(hdd_monitor_lib + PLUGIN "HDDMonitor" + EXECUTABLE hdd_monitor +) + +rclcpp_components_register_node(mem_monitor_lib + PLUGIN "MemMonitor" + EXECUTABLE mem_monitor +) + +rclcpp_components_register_node(net_monitor_lib + PLUGIN "NetMonitor" + EXECUTABLE net_monitor +) + +rclcpp_components_register_node(ntp_monitor_lib + PLUGIN "NTPMonitor" + EXECUTABLE ntp_monitor +) + +rclcpp_components_register_node(process_monitor_lib + PLUGIN "ProcessMonitor" + EXECUTABLE process_monitor +) + +rclcpp_components_register_node(gpu_monitor_lib + PLUGIN "GPUMonitor" + EXECUTABLE gpu_monitor +) + +# TODO(yunus.caliskan): Port the tests to ROS2, robustify the tests. +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + ament_lint_auto_find_test_dependencies() + + # ament_add_gtest(test_cpu_monitor + # test/src/cpu_monitor/test_${CMAKE_CPU_PLATFORM}_cpu_monitor.cpp + # ${CPU_MONITOR_SOURCE} + # ) + + # ament_target_dependencies(test_cpu_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_cpu_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_cpu_monitor ${Boost_LIBRARIES} ${LIBRARIES}) + + # ament_add_gtest(test_hdd_monitor + # test/src/hdd_monitor/test_hdd_monitor.cpp + # src/hdd_monitor/hdd_monitor.cpp + # ) + + # ament_target_dependencies(test_hdd_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_hdd_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_hdd_monitor ${Boost_LIBRARIES} ${LIBRARIES} + # ) + + # ament_add_gtest(test_mem_monitor + # test/src/mem_monitor/test_mem_monitor.cpp + # src/mem_monitor/mem_monitor.cpp + # ) + + # ament_target_dependencies(test_mem_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_mem_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_mem_monitor ${Boost_LIBRARIES} ${LIBRARIES}) + + # ament_add_gtest(test_net_monitor + # test/src/net_monitor/test_net_monitor.cpp + # src/net_monitor/net_monitor.cpp + # src/net_monitor/nl80211.cpp + # ) + + # ament_target_dependencies(test_net_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_net_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_net_monitor ${Boost_LIBRARIES} ${NL_LIBS} ${LIBRARIES}) + + # ament_add_gtest(test_ntp_monitor + # test/src/ntp_monitor/test_ntp_monitor.cpp + # src/ntp_monitor/ntp_monitor.cpp + # ) + + # ament_target_dependencies(test_ntp_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_ntp_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_ntp_monitor ${Boost_LIBRARIES} ${LIBRARIES}) + + # ament_add_gtest(test_process_monitor + # test/src/process_monitor/test_process_monitor.cpp + # src/process_monitor/process_monitor.cpp + # ) + + # ament_target_dependencies(test_process_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_process_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_process_monitor ${Boost_LIBRARIES} ${LIBRARIES}) + + # ament_add_gtest(test_gpu_monitor + # test/src/gpu_monitor/test_${CMAKE_GPU_PLATFORM}_gpu_monitor.cpp + # ${GPU_MONITOR_SOURCE} + # ) + + # ament_target_dependencies(test_gpu_monitor + # "rclcpp" + # "diagnostic_msgs" + # ) + + # target_include_directories(test_gpu_monitor + # PRIVATE "include" + # ) + + # target_link_libraries(test_gpu_monitor ${GPU_LIBRARY} ${LIBRARIES}) + +endif() + +############# +## Install ## +############# + +ament_auto_package(INSTALL_TO_SHARE + launch + config +) diff --git a/system/system_monitor/README.md b/system/system_monitor/README.md new file mode 100644 index 0000000000000..8b4dd9873f7ba --- /dev/null +++ b/system/system_monitor/README.md @@ -0,0 +1,179 @@ +# System Monitor for Autoware + +**Further improvement of system monitor functionality for Autoware.** + +## Description + +This package provides the following nodes for monitoring system: + +- CPU Monitor +- HDD Monitor +- Memory Monitor +- Network Monitor +- NTP Monitor +- Process Monitor +- GPU Monitor + +### Supported architecture + +- x86_64 +- arm64v8/aarch64 + +### Operation confirmed platform + +- PC system intel core i7 +- NVIDIA Jetson AGX Xavier +- Raspberry Pi4 Model B + +## How to use + +Use colcon build and launch in the same way as other packages. + +```sh +colcon build +source install/setup.bash +ros2 launch system_monitor system_monitor.launch.xml +``` + +CPU and GPU monitoring method differs depending on platform.
+CMake automatically chooses source to be built according to build environment.
+If you build this package on intel platform, CPU monitor and GPU monitor which run on intel platform are built. + +## ROS topics published by system monitor + +Every topic is published in 1 minute interval. + +- [CPU Monitor](docs/topics_cpu_monitor.md) +- [HDD Monitor](docs/topics_hdd_monitor.md) +- [Mem Monitor](docs/topics_mem_monitor.md) +- [Net Monitor](docs/topics_net_monitor.md) +- [NTP Monitor](docs/topics_ntp_monitor.md) +- [Process Monitor](docs/topics_process_monitor.md) +- [GPU Monitor](docs/topics_gpu_monitor.md) + +[Usage] ✓:Supported, -:Not supported + +| Node | Message | Intel | arm64(tegra) | arm64(raspi) | Notes | +| --------------- | ---------------------- | :---: | :----------: | :----------: | ------------------------------------------------------------- | +| CPU Monitor | CPU Temperature | ✓ | ✓ | ✓ | | +| | CPU Usage | ✓ | ✓ | ✓ | | +| | CPU Load Average | ✓ | ✓ | ✓ | | +| | CPU Thermal Throttling | ✓ | - | ✓ | | +| | CPU Frequency | ✓ | ✓ | ✓ | Notification of frequency only, normally error not generated. | +| HDD Monitor | HDD Temperature | ✓ | ✓ | ✓ | | +| | HDD Usage | ✓ | ✓ | ✓ | | +| Memory Monitor | Memory Usage | ✓ | ✓ | ✓ | | +| Net Monitor | Network Usage | ✓ | ✓ | ✓ | | +| NTP Monitor | NTP Offset | ✓ | ✓ | ✓ | | +| Process Monitor | Tasks Summary | ✓ | ✓ | ✓ | | +| | High-load Proc[0-9] | ✓ | ✓ | ✓ | | +| | High-mem Proc[0-9] | ✓ | ✓ | ✓ | | +| GPU Monitor | GPU Temperature | ✓ | ✓ | - | | +| | GPU Usage | ✓ | ✓ | - | | +| | GPU Memory Usage | ✓ | - | - | | +| | GPU Thermal Throttling | ✓ | - | - | | +| | GPU Frequency | - | ✓ | - | | + +## ROS parameters + +See [ROS parameters](docs/ros_parameters.md). + +## Notes + +### CPU monitor for intel platform + +Thermal throttling event can be monitored by reading contents of MSR(Model Specific Register), and accessing MSR is only allowed for root by default, so this package provides the following approach to minimize security risks as much as possible:
+ +- Provide a small program named 'msr_reader' which accesses MSR and sends thermal throttling status to CPU monitor by using socket programming. +- Run 'msr_reader' as a specific user instead of root. +- CPU monitor is able to know the status as an unprivileged user since thermal throttling status is sent by socket communication. + +### Instructions before starting + +1. Create a user to run 'msr_reader'. + + ```sh + sudo adduser + ``` + +2. Load kernel module 'msr' into your target system.
+ The path '/dev/cpu/CPUNUM/msr' appears. + + ```sh + sudo modprobe msr + ``` + +3. Allow user to access MSR with read-only privilege using the Access Control List (ACL). + + ```sh + sudo setfacl -m u::r /dev/cpu/*/msr + ``` + +4. Assign capability to 'msr_reader' since msr kernel module requires rawio capability. + + ```sh + sudo setcap cap_sys_rawio=ep install/system_monitor/lib/system_monitor/msr_reader + ``` + +5. Run 'msr_reader' as the user you created, and run system_monitor as a generic user. + + ```sh + su + install/system_monitor/lib/system_monitor/msr_reader + ``` + +### See also + +[msr_reader](docs/msr_reader.md) + +## HDD Monitor + +Generally, S.M.A.R.T. information is used to monitor HDD temperature, and normally accessing disk device node is allowed for root user or disk group.
+As with the CPU monitor, this package provides an approach to minimize security risks as much as possible:
+ +- Provide a small program named 'hdd_reader' which accesses S.M.A.R.T. information and sends HDD temperature to HDD monitor by using socket programming. +- Run 'hdd_reader' as a specific user. +- HDD monitor is able to know HDD temperature as an unprivileged user since HDD temperature is sent by socket communication. + +### Instructions before starting + +1. Create a user to run 'hdd_reader'. + + ```sh + sudo adduser + ``` + +2. Add user to the disk group. + + ```sh + sudo usermod -a -G disk + ``` + +3. Assign capabilities to 'hdd_reader' since SCSI kernel module requires rawio capability to send ATA PASS-THROUGH (12) command and NVMe kernel module requires admin capability to send Admin Command. + + ```sh + sudo setcap 'cap_sys_rawio=ep cap_sys_admin=ep' install/system_monitor/lib/system_monitor/hdd_reader + ``` + +4. Run 'hdd_reader' as the user you created, and run system_monitor as a generic user. + + ```sh + su + install/system_monitor/lib/system_monitor/hdd_reader + ``` + +### See also + +[hdd_reader](docs/hdd_reader.md) + +## GPU Monitor for intel platform + +Currently GPU monitor for intel platform only supports NVIDIA GPU whose information can be accessed by NVML API. + +Also you need to install CUDA libraries. +For installation instructions for CUDA 10.0, see [NVIDIA CUDA Installation Guide for Linux](https://docs.nvidia.com/cuda/archive/10.0/cuda-installation-guide-linux/index.html). + +## UML diagrams + +See [Class diagrams](docs/class_diagrams.md). +See [Sequence diagrams](docs/seq_diagrams.md). diff --git a/system/system_monitor/cmake/FindNVML.cmake b/system/system_monitor/cmake/FindNVML.cmake new file mode 100644 index 0000000000000..0a79009ab98d2 --- /dev/null +++ b/system/system_monitor/cmake/FindNVML.cmake @@ -0,0 +1,34 @@ +# Copyright 2020 Tier IV, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# - Find NVML +# Find the native NVML(NVIDIA Management Library) includes and libraries +# +# NVML_INCLUDE_DIRS - where to find nvml.h. +# NVML_LIBRARIES - the library needed to use NVML. +# NVML_FOUND - True if NVML found. + +if(NOT NVML_INCLUDE_DIRS) + find_path(NVML_INCLUDE_DIRS nvml.h PATHS /usr/local/cuda/include) +endif() + +if(NOT NVML_LIBRARIES) + find_library(NVML_LIBRARIES NAMES nvidia-ml) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(NVML DEFAULT_MSG NVML_LIBRARIES NVML_INCLUDE_DIRS) + +message(STATUS "NVML include dir: ${NVML_INCLUDE_DIRS}") +message(STATUS "NVML library : ${NVML_LIBRARIES}") diff --git a/system/system_monitor/config/cpu_monitor.param.yaml b/system/system_monitor/config/cpu_monitor.param.yaml new file mode 100644 index 0000000000000..e9f91cb1708e4 --- /dev/null +++ b/system/system_monitor/config/cpu_monitor.param.yaml @@ -0,0 +1,8 @@ +/**: + ros__parameters: + temp_warn: 90.0 + temp_error: 95.0 + usage_warn: 0.90 + usage_error: 1.00 + usage_avg: true + msr_reader_port: 7634 diff --git a/system/system_monitor/config/gpu_monitor.param.yaml b/system/system_monitor/config/gpu_monitor.param.yaml new file mode 100644 index 0000000000000..d96b9f24640b2 --- /dev/null +++ b/system/system_monitor/config/gpu_monitor.param.yaml @@ -0,0 +1,8 @@ +/**: + ros__parameters: + temp_warn: 90.0 + temp_error: 95.0 + gpu_usage_warn: 0.90 + gpu_usage_error: 1.00 + memory_usage_warn: 0.95 + memory_usage_error: 0.99 diff --git a/system/system_monitor/config/hdd_monitor.param.yaml b/system/system_monitor/config/hdd_monitor.param.yaml new file mode 100644 index 0000000000000..bf687ae848059 --- /dev/null +++ b/system/system_monitor/config/hdd_monitor.param.yaml @@ -0,0 +1,11 @@ +/**: + ros__parameters: + hdd_reader_port: 7635 + num_disks: 1 + disks: # Until multi type lists are allowed, name N the disks as disk0...disk{N-1} + disk0: + name: /dev/sda + temp_warn: 55.0 + temp_error: 70.0 + usage_warn: 0.95 + usage_error: 0.99 diff --git a/system/system_monitor/config/mem_monitor.param.yaml b/system/system_monitor/config/mem_monitor.param.yaml new file mode 100644 index 0000000000000..93688d608a9ef --- /dev/null +++ b/system/system_monitor/config/mem_monitor.param.yaml @@ -0,0 +1,4 @@ +/**: + ros__parameters: + usage_warn: 0.95 + usage_error: 0.99 diff --git a/system/system_monitor/config/net_monitor.param.yaml b/system/system_monitor/config/net_monitor.param.yaml new file mode 100644 index 0000000000000..d0707ddba399f --- /dev/null +++ b/system/system_monitor/config/net_monitor.param.yaml @@ -0,0 +1,4 @@ +/**: + ros__parameters: + devices: ["*"] + usage_warn: 0.95 diff --git a/system/system_monitor/config/ntp_monitor.param.yaml b/system/system_monitor/config/ntp_monitor.param.yaml new file mode 100644 index 0000000000000..db54f70d1ce59 --- /dev/null +++ b/system/system_monitor/config/ntp_monitor.param.yaml @@ -0,0 +1,5 @@ +/**: + ros__parameters: + server: ntp.nict.jp + offset_warn: 0.1 + offset_error: 5.0 diff --git a/system/system_monitor/config/process_monitor.param.yaml b/system/system_monitor/config/process_monitor.param.yaml new file mode 100644 index 0000000000000..3d6d82fae5ce2 --- /dev/null +++ b/system/system_monitor/config/process_monitor.param.yaml @@ -0,0 +1,3 @@ +/**: + ros__parameters: + num_of_procs: 5 diff --git a/system/system_monitor/docs/class_diagrams.md b/system/system_monitor/docs/class_diagrams.md new file mode 100644 index 0000000000000..662e6a26195a7 --- /dev/null +++ b/system/system_monitor/docs/class_diagrams.md @@ -0,0 +1,29 @@ +# Class diagrams + +## CPU Monitor + +![CPU Monitor](images/class_cpu_monitor.png) + +## HDD Monitor + +![HDD Monitor](images/class_hdd_monitor.png) + +## Memory Monitor + +![Memory Monitor](images/class_mem_monitor.png) + +## Net Monitor + +![Net Monitor](images/class_net_monitor.png) + +## NTP Monitor + +![NTP Monitor](images/class_ntp_monitor.png) + +## Process Monitor + +![Process Monitor](images/class_process_monitor.png) + +## GPU Monitor + +![GPU Monitor](images/class_gpu_monitor.png) diff --git a/system/system_monitor/docs/hdd_reader.md b/system/system_monitor/docs/hdd_reader.md new file mode 100644 index 0000000000000..f1092286df0e2 --- /dev/null +++ b/system/system_monitor/docs/hdd_reader.md @@ -0,0 +1,58 @@ +# hdd_reader + +## Name + +hdd_reader - Read S.M.A.R.T. information for monitoring HDD temperature + +## Synopsis + +hdd_reader [OPTION] + +## Description + +Read S.M.A.R.T. information for monitoring HDD temperature.
+This runs as a daemon process and listens to a TCP/IP port (7635 by default). + +**Options:**
+_-h, --help_
+    Display help
+_-p, --port #_
+    Port number to listen to + +**Exit status:**
+Returns 0 if OK; non-zero otherwise. + +## Notes + +The 'hdd_reader' accesses minimal data enough to get Model number, Serial number, and HDD temperature.
+This is an approach to limit its functionality, however, the functionality can be expanded for further improvements and considerations in the future.

+ +### [ATA] + +| Purpose | Name | Length | +| --------------------------- | -------------------- | -------------------- | +| Model number, Serial number | IDENTIFY DEVICE data | 256 words(512 bytes) | +| HDD temperature | SMART READ DATA | 256 words(512 bytes) | + +For details please see the documents below.
+ +- [ATA Command Set - 4 (ACS-4)](https://www.t13.org/system/files/Project%20Drafts/2017/di529r20-ATA/ATAPI%20Command%20Set%20-%204_2.pdf) +- [ATA/ATAPI Command Set - 3 (ACS-3)](https://www.t13.org/system/files/Standards/2013/d2161r5-ATA/ATAPI%20Command%20Set%20-%203.pdf) +- [SMART Attribute Overview](https://www.t13.org/system/files/Documents/2005/e05171r0-SMART%20Attributes%20Overview_1.pdf) +- [SMART Attribute Annex](https://www.t13.org/system/files/Documents/2005/e05148r0-ACS-SMART%20Attributes%20Annex_1.pdf) + +### [NVMe] + +| Purpose | Name | Length | +| --------------------------- | ---------------------------------- | ---------------- | +| Model number, Serial number | Identify Controller data structure | 4096 bytes | +| HDD temperature | SMART / Health Information | 1 Dword(4 bytes) | + +For details please see the documents below.
+ +- [NVM Express 1.2b](https://www.nvmexpress.org/wp-content/uploads/NVM_Express_1_2b_Gold_20160603.pdf) + +## Operation confirmed drives + +- SAMSUNG MZVLB1T0HALR (SSD) +- Western Digital My Passport (Portable HDD) diff --git a/system/system_monitor/docs/images/class_cpu_monitor.png b/system/system_monitor/docs/images/class_cpu_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb87810b0209823626ae1fa85543f37e57db51c GIT binary patch literal 127936 zcmeFXXLu9W);~%JoKQkDEp!4n7zjqaP_2

Y7n6U=wwXde=x`2qE+i213VRnoS9z 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 literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/images/class_gpu_monitor.png b/system/system_monitor/docs/images/class_gpu_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..857f3bc8b0ff13e3c14145a5970cac331bd350e3 GIT binary patch literal 135193 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 literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/images/class_hdd_monitor.png b/system/system_monitor/docs/images/class_hdd_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae7f9bf0dccfb38757b806503687d4d940c77fd GIT binary patch literal 47011 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 X`jv=|0Nk; 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 YZFUCQXwxNt>l2*rwUq>`Bu!An54m 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

jbZHr2s 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 literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/images/seq_gpu_monitor.png b/system/system_monitor/docs/images/seq_gpu_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b145a40cb997bd7ae2dbabb78f60c8111c4f7e GIT binary patch literal 111248 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 z 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 literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/images/seq_hdd_monitor.png b/system/system_monitor/docs/images/seq_hdd_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..73538f8cf237092a46115ec98b5607903ac6f608 GIT binary patch literal 63852 zcmb5WSRWz!db`#Z}1wfA=fs;6!LJIehXLHNGN_H`P;E;v3+c~dq; z{?|DKLZE*@*gqh`L(spYG(v!XF#b=B#NxloCsi^2r;7CHY5G3-J0jr!gg{mQO9;b% zM;WlEHRExC&x<7fg~0w-ut(2xUj#*}Hv3y1{rnRp-b+-;)3v`NEZFaxt^glmk#*C1 zNxmlMKbr{@hmn6$|3twdwqBt1FW&FD`0Hq1{F)3r z$9r@JEwcS}`12k?dC=^6lT>RmfYW0F9{5jHtmT96`ZPBCwElH%^Pid>Mhh4ssO%pk zQe^)i@)Y?8gqH9>U>q$zL|H&!`>XEH7fw6;!1x~quN!C_rlmKVm6~iQ&hDH3;+fMF zH^V)4GPVxkIwrnjGX?Dc%ChW5zn_>GUh-$LT|S{Dic0cef%qrWD7>t79K4m_e?F>E z&COVl=S_~okSu!#x|(sxy~u~q7Jj8boDE8t-+NLda0%!jMi!a{%FXa8{oP9B>d?S%-U(4WtDO%2xH#FjXnn{dj~r4r~X1U|VjDXxMmgIyf8iOz!d zx3@weDJmAURmkK+} z@C%K=aC?w!{QRC63*|5s1?%AN)RbTLRl-nJqiTBcqGKdE4lX0Rf!Lw!jE~Plk>!+g z7AZL8d_rfRI1jq^H8iLlD7pIsQhm+xXWa4t+C!+Rw*ueq+?wm-3AA0-f1UVK89SP# z(ff*EbNzQm;WjjY9bBaBs!?u5`ck>I4YFo*fU99}W+Je5HKTs5lU;HM(v z>+oY2%oe?U;Oxm_cU6NQcZ-ySYN^JDGj3EkZf7S_f{wotT-(;Ys5Og0(~yIU%umkk zr_eOm`zXxQo@Qp$V7K|mX`|>e*kxOGsOGd2!Eq*Q9q_+1eo-k%y-65Mll1gbfzIdO z%ht}kF@}-i)dgQES#Ja|Js5F5f{#Ow7GItFbed|s5o}{xhcZ<*r9-|Si=?eoBvCZN zmk=aln%J=xITv+H@fg)K;7lcj5 zp%jveDa@|@7FbRzfy{p0{(Wa53B#=WjsjDO%&E3?<$Ohf9Zs6H<&3?N8SG z6{BgCJ)Zfe2&q&F;q__@XUH9Nl*kBI-FW$diA6vgqy<%5)~63e@Zw;zKF(Uq54y0t zAYH&(37^+26+z~?WLtgGL2% zT9U5dU^aVh8aK^qp%B!?Mp7m+Q^s~zLYl-Ft@qAqYLTdsinv|og$0}1jmAZ`ZvGyF zsn19?PFSTMeQr6-eI~{_d+jB+QVQqd?LBU=yJ+bN#slAB=bJwiHA~^3H>s7aac>+X zKEotrJ@-;|isv^fAAzYc-cF|36o!#)nb@g3a7STOC+pcm)Xl(QA@u4%TYvlwUIg%Y=q(7EFWPA=7YfM2aZq(@^IKp zvL69$qa|ZXhJY}XHu`VpU%tP&pmI?7ry8ztwz(hDq!O`c+KQvD3ovO)+kS1XKdg-b zXWtJ6MXpRKF$JIfL4-zuu^ux}uBV+D-<<5ng6A(Pi1lu#5iw^aA<^kkbCSL~HMeH7 zY25C_Okr`}zwc~NELlF`20?^)x#;VV!A20oJEOs-d&qGAmZex=@GV2gkAcyBxlcZ0 zGd>@{*pstP3d;oLRIY&v^jCeRv-Vq?gu0zM?blj>?b`*Y=nFXi*80tRxYG;wa?^ob zxu+Tt`s`h;Y8A075NeZly~MNcSlzR{*t&axi$pI|kPM-34{7!@*TjQ;2Ud;S;SAUz2f%%{48i+;e%^)je~86ase@T(4;Uj?(@ z$?cgY0#2!6we=aLI%ha9Vk2-j`-MH6M^zNW%Gfgy++xw00ViaHGFbxGFjq9|8K zXtYYJ!^3KJdC&E(@I}u9l;>#@O{zhI<1d&zjDp3pZBAe&4h15jnqe&*=(D-Hf2FUr z5`)87#(T~s!2FlA zKJYO$L}j^fL$;nZIOBR_Hn@4)Bj2Odo!W;6D2WjQ%;CpaSX#1%QCXlFd75w1XWzi% z9%Vk-E=0=@L*}*`WSKto5$AzdiX8&uPy0z;p$%heM}R53DwgDsU-vZGQ|$8U0HDEmN?MLK zlwVf+1@B8<9}&2`d}4@?&`Yw)ZL=uOS&<0KpJ zU^9_eX1BB)1x^Rlwm|0v42)X0nzVB^mR&UGoS;2@s`JyNc)YmVDL+V)S^puuo0f(+ zM7sHL9KAPtFCD!{#LgW05op{7aMQQ2(o@lvuU=<<_icB^ki$BYufnY_(Z$6-kT?9EW6%&Eat-0uGQcIId08+BN*gPW@Y%r~a6C-#?w zn$(?Ge#iJPgJ5$8&!A1rkqaM5mC6BHEHX@xxy>mr05<3o0Q@m7Pk`)g)V%i_CXRQg z$L`G#y7*t4+}|UBnJRe<_cqot_+0YM=R7OFjtp!nmb;uU|I&_9&XMiULh49S+O2Lv zRnhXeL`GrDy&R|*o#~6(Swj;OS0S^@4Jdxa9F$NVPZ#ZLe83iTMq+ZkWD~h?ZKW>9 zA*PHu_9MIB>mw{$n3WpXD1PX;dv&bLkzZ+GHuL<#$9a5T>wr@0VW`z|3DlFo?^g z+cBxa*&8=m@e!UdzPPd|2YZ;7!W_J-#M5Qwk;jNp@}l{U*YRx9Mih$^^AuhX)3dVS z`-}*u>RjUJMIMBXKLGEUDZXo?Kf~yg)Npe*0Jwq<5%#Zr`AQ)PSHD$=2@3YZoPAVQ ze7>5UDxcpV*ZFudIbn}zkcJb_712x<#QUxRnk~?Ux~|1IeK<(PrG)|vnYd$9)kc_a zn|H9(`vn;~5rKMLW5yDUg=W8sdq%E$MT3Vn7GS^>=0IsHvUd< zbqFs5B{dBk412j`5T>4#d$&_MS{cLmQlqb(S3aw?Fsm4XKB7Q?_6?bEa%1p#P7%tQ z(f&I8=7O9?F0aUeH^-&f7oXB>PVa_)Rg))`G5dlwS}$Urn`8prBW#q-BwvZ#1d?1R zRlG~uD}M=DdSy5}GtPlBE0Z!3L3(q*@8B!Z$sh*n2?Bg!cmON4II(N)wIE#aS$qHE zEbV@vYWov*swj`Qg^Kxw3cESJH!VNNIrk+$&qs``pjU)TUOtAV3y|Uwa6mH#ZSoZ} zG;vflvc&T#vDRVShFmh>31WX(qMS0SH&V=H0l<5;)QiYqIu?O8Aft19eyIwHN~w$Kdn_YUd}E;MHU@E>~BD05O# z`2=n@9=j5iw0J)nqF9i~!7$@MpaiY&@{k~RUx<7-Grfjd6wTV0^bv1Ft&=k4BsJMn zqUwW$$^L@jI72STqM`kJU(`ESrM3nbG?sca0z9A)i2z+P6R)RYi(I>*nL8_FftG@E z-EgoUs63S)2bh+91qH)}L(8_G3+io*U&nFM2S43%k6X~$uOV=?5)Hv8vaTur+2^cl zVYbqc30N7Xw=7H>ZH=Ie7N=MBm5*_AO0~lYuZ&nQ% zW4H)-Ss|tCCUWVNjPr7bCf>*y1nnYmNm@w|cU2H>$|Z*O4bctRn_=b{__oJ#_RRhV z<8zfGm+?MWsW9H#BLrD;1^T&dk$=&mPR9CRusW(*IhDFuV7@-+%%uJJ#=Fw1J)~B~ zC(eLfV1UuSN5-+VNhfpoysJ`XYj z<%{yi)BuRYn7~B-_scA*q&*|fyHWmHwGt9PEiW)qmSkR@0FhoDG+_@L5&H6~aq7#i4S*k6Xp6;gu2=$csXsD(ND zdv2;yOo+Qh%6dBuT-DAy#(mOOd+TyOfLz>BirS{O_QjJT8!g@NxReKzdiaU-@e#ks?c6iHk^adUk6!LRG_k@E)(DAW3!fOA-`-d#6a( zl1DOrU+zLQa1paxW6(!vES?`WLEgb`Wf1OtzkT*(BPrhBJs`v~BJ};RHBZ_&}?6Mp-Uq z_uC2E3Me@YROZ&_TYLNCKD^gRTNZu@heF{F|Ex@~{rWK@y08I6PFPt9G?*Rv)zx!$ zU=cqwTQs4mTUh~;tx=;7Ei=UsW&C%BOMT~r&$*!0e)j;;U2$*anZ=r48+Nk~wfVD6 zM-v|#K79;PC9`IWecbMJC$4SV3sBF^O-Dj&zt0ht1frI6s= zZDAdVq%}&^tm3s-^zdur#7x~nm7}Ju_UH)NR%|+N`|4)c5>8iV6x0iENWHJEyeob$ zPxMAmW(Fc^05KJ)U+%`$F2LBDJk$^ZB-*U{m06r~b74AB0%R|e#=6#D$rir+_Q8_u zRpQLW!DBx+_WMZ9uJ|ZI&i&?o_q9eT%B4h^PW4+`OA$`N*OfLMX#wT~*{S0PWFe^rMQt>sw0*kl$Ff=Po$W1u@L?HCPwE{P^tXn5<} z%k0x+;zR~S*cA!Uy4R6{5JZ;W?04NmS04cgZ*d&wipa~oXcf(gdHUc?5afOkBQ1xi zhbb$g10eg@d^o;G>5{mv9S2z%!TsJ0GY(8B(*y5SWT%7J0FX9~K#5B{?6JRpK&(ei zK5DH8QDZHOZmQed+C9QnclLc2_sqwJ%sB;oJ7 z^jdfO@|kQ19zv1_ka{1$d|h+a#3$0vL1QyN_C)0I zdNPHUin+x}?8^)el0hr8gwYhLaie_x2-7sb4)iCs0aWC|hP|FZ!`H+X=V@XZ5A8Fz z#l0KVgBB0GFX>{%8l)0_-PSs4Mjj2n6&V~G_bXM|M-VZh-ZB-E3M^xXC4A>Rdp1q4 zHBS(k3m&d1q0cW7RZr4#o!?w4t5t|`gKOWlJYQlxEhS2o>g}iU z+Qfl| zm6|MH&yUrmr!_5uC|KkHS1$@?_%-O|b!>4yZBEVCbG>|xI!!~zkKtg2BOl}xvm;qTh$nwEuc#Xd(xo=vbsR)hI)VsD~E5sg&Ao)d@ot$zteX+j?4-C&!7K)(nuUG4>oI30;L z&nGs1{Zdh3>ZKqgse63g3A4bA~U9glQa;2{q5L- z-|6CoS){7FN&IdT6}XqWS-=w=)+f8HmWnL& zyXW&Y76#I|shd&za+^ZE8=6em#hF!}yxCQShRe8ZOi3lTCXNMMe-_69*`fqg9;7s& zJpqG`CZ8UrJa38?s_4Ld87!feLo2k-0vr!Z%w4IeWHvRG91KX7$uw=;bVO=swqIyl zMYd%PSoscMS8LHPFzLX|2mzOkTYpu69X{PLBCVgdtoXB0Nf-+}@tlcl>;TR)D^jog zi7HEjEai5<_5o(_wf1*-WN)+hcf1sirx*io#3{(Cnw^(^l&sfMz^;J;+fGrDU2BBi ze0HQ3vNX`n@mX2GFl!RBpVmgLo3inIxvm`d5O2SZfWbnKhXv^tGS4NpPETSPO9P?R z8lH2@oyK)%uOnHv+`W)Hrdyf#%%@ek>cx1zEIP`S3%{VLVcm*$_zNoK(H}Hw%sZD9 zNmY`v=X;7snhaw#O=o=+9jRIdS)1JA2@|*iP;hQjW7RO85u~(`Fb__voUQGlCGp*z ziqTm5H?~wb@e9JESe%HyDf(rTDS(57BHR`>r3W8gwd?^Nmc<40%pJX&OSR%-r`k#+ zSTb$0;hM(^&)5H;ey)+^)s*7`g${O}kZ}SM0TYlDf_TFt%-N__n!I;~B))w#BK}#& z0P=*?arVF5Ge`^lBgI*MnFYDP&AcWL;(pwkie-g{Pta!SK70*s>(CaKK4Hx|@WZ{~ z|2sH-KEAW*1TMl+ybMfk#pgHDE_(G*U&?Q70G_z<#wx_$DDojyd)vN4x=jR6|KYyw zI@xnnveGDn)?qZB+6H|pB2i=Bdc^E)GqBPBUl^NzRn15o;Gq6})eQ4^O)))}@f_db z?(!_7!ArjioX_`4Gkn7Y>t$?SV}1d~#(1H3;>N}sV=y=3#q$eXamBHgUn0v#PUy5XdGofofO<7CrU05;HCmca3v}hI^Esx`R&U8U1UIm_+ z>B*yTv3?(pZ`E}!vplXp((j<0e)#C$1WTJ4Tl`2-d)f!AatGp$z->b3R z07qK(8}Z+VP`~CoO`;g^4Y>`qW*}tOWzNerKS&hD6QIZ@pogfmJ76rPePC>4SRi$v z29L}zKtEV5`Lmv@A9CGiT;S?`E39E3Agv|kWeA*YIE9R~{P>Ke%5nHDZU~-aycwuC5UX7goR1*%}Zy#2$$e zR9)qLn%g#j`aq!3QHgCZ)w-_mcj=qiDzUhZ^Hh~OEUmct#Zc7G2bTyMmtOnil^!;w zZP)YU5x0JO*+Ua{ze)i@pjrn7&_<01(SPtP9cg=Vx<^;0T*~ZQ)myFN#@AXN@YVY;#d_~Y&EmdWRbgJ=aiVGW$4R?T~Cm$j$5-7 zE^39a&}f2r!;Ly?jKLrKV(K-s3+wF+RM}5@e#RC;0I`FNsh_!O(G_WI`_m1Mr#Jl7 z94j4Q8dDf~MT;mC85=7McbgLX1j#hRRSAiMcg&dR=dGmG-S4yv0U8qWw-w)=)=7^v z<4Ba|&GaNC7c@nd8e%&=oDnUX>YZerlcY}rr-(($ppY@ z2-SH~K&+PJKyd|n!Sh5Y1DdbpX%|QTa+7X*f$GM~YZVT>k`|uBI_pC{)gl2v32G{) zU!b0&CfSW_$l@rE@|$f-w4;){$>2Ul<%sKzBp_=}*Hs2dbd9AD;61pobH0UAv!Q$vk!!g zbjo~^M|T3Mg(tV-0$wg71OWK6a5fGHPG>J1RepQ&Jze=J(bqG!X6U>vA)rXR)^ofYAm=L^ z?6h={E2*Mhv{?-_aN=N~gc6gg3-9a=>YJ>jrmU6=idZv!&1`AChGD-qTrlZ5W0;FA)2Hf(=f`?ocf?3&l4uN2LEH&c*y}AUr3&)t7E3kPBL; znt~GP)6vQ2cSN*S))D&#-HGW*+$+#%{=L(j(ubTpdxqGjHsgZ41a z>sP?`=#v2q+tp9-(wUN;I^}}b%s=`nSye{>P!pG;$Sq6X>z@u6Q zmPoK_xiGE1?$;csQ(y}E^L`j87iO=sa2(X*=OVKOTr+0E$z-#U zve$E~UEm`9_+5#q{At(-OB4shBPv>dGxz}^)C{JR<5sz__CT8zLHII8Il*Xy!fNlZ zIP+|nwiu)ugth6GjMxl1Xhy|d-F7K@aYO8|0wT3sQJWClkoLS#U0g4+0itA9T{IL_ zS4`Y^hPk(%N~;Lwbp76h7rJif5GPF<|yFI!D#RJxz`u4b~f1P>BegU{{96kbMn-XAJWzz+}d; zTv{S9=3)1R`HNIMkayy#t(ay~uf!%&YzNZ0hpPO7Z{?4X6#IV8+)0I@X&E9kyP$1o zBU~e&wlAx9^GS&@ku|iH9GqQE*S-e7r@OtsZ1o9nAW|DDTn@)z5#AId;HV~_&^d#9 z#ax0V9mMOZ4RZwoKX9P+c!(nJd@lTS_>d%3s7s~cgNx))gQoX8P(X@e&|Y&fC6clv z9a>hY1!RoU$poF zWWngNJ-vwo9y{T{dOg{awm^-7BS!wIcLZgPeLyh4%8={WO2|i4OJH;iLeDBeV1Z5v z=*-rBoQwk=zaZ&7q|X<4OyMctc@JTE1rmVBDo@5}}P zxF|RiPzc_(hwBhcRgPtpUP7%SaV6M0XJ%9(nQ!0G1{g>hlnI3 z>L@j$+IVtV_S$nhA}N~rH>977^gt};&ttiINC=X=077m+KGhblRFe_6D!672h#}zl znLfW35Q@iVPbdRe19St>xr3JU)4}ma?Os3V?df{wU_8KK4JecIv!VMhUe?@GcBX#v zb`n(^@j%r9l52SfQvLd{HEK9oS7D-*xf1vY6A28BK-|znZ{VZfwF`r~gF~h##i#$I zaS=%yX7f|J>O&2E`3fTZL_0_(B^R%QnZh@Tc>(6anN3dQ-(cyO8~|KIYh|BBxA zVwhIokN$lCk0DWkhRR4|!SoNpQ|pBTgZD20zyBKm4+8*C|IR9|T3! zo8?lE_HJ7Jyi>gNS6gJDCW7(~+FN889ospTv7j>LopV)OK3IY+VRLN(-%j-RS7DWq zakO~znuV8k-uuG)qAVa;tO;fyq}Gn<2i{(mAw`{A{$1OTV@2&fq zLGq2Nj#^udhz@}Q6qJwr!QWtq1S0tPi<`eQRk1J&A@{Lc0|3nAb9Ra2dZX%*tP^&~ z4evi7;55@d#TEw3Gx)lOL9^6^j7uZcep5!mr8{@f91baP&(9Z|U7t}mU@r;#2i1X` z+||~9i&pYtSuMA_j}@2Km}M5@Z>bs+#AW_-_JC36YIMZUCTLgY1tL-5OK~^?R&OB% z`5H>Xy9*fp@YBfxa zplnzQ_XmKL8*|VW&7k4AgkW__;3-pM|7MI6Y1HjcnRqQ!q!~e^%pzK+x=@vzeO1a; z*&y#hudL)k0Zr2&15M1>SYyUhZ+coqM!QvzXjsl5#cpn+8OlYod0NFr6 zdYvi_Eo#_^vP(BDIml_-D}|R#eIAaa>coW}#iHTEDZyj-+|(_{l9^a#s_he6C}^1H0St$6txNeJISk z;%5I)Hre68#tEXPo7DS`ywCzaEflW+m8m$6P#FD95g|dsH6RiKnlHGCHqWl)X{9KA zJ7UJu_%n#YsfEW?CgbNduePF{(^BWa(W})|P}6};h&bJf;i%)5%?UqE&)Q!d-o$<1 zkVOv`Df9`jjG{PEX@BD%@r$^@=6uUQ7uztYeS}reoNiM|&7W@AK~C3(P;jqFugt3V z>suVpl)gf#_LjfGB43eKyf65VSs9%niZrEs`|9vB_F7Hx6k<%adv1b=2uPRd0glk9 z96z@5eO)_sv4jl8qb*Z8A}=-niNVov)}+TB=#;H)cF2(HsZjmK)fTR*~4Ao<4vrc5xf@TXq$t)?zek5yYC zK8qA`RP)OnalXeP6-B?YdZynba>^v~m;2yUS3B4+3%ypZcpyH3pAwlH6Ro%BN)&+N z?Ax_K#cuRXnG-KNBT&P{qIei@&WRC~GaLCH%ZFS#P3ivbSoE`)NWKqPFtUL#d zGTdG&(JH|wwqb0;>57CNUh2acLVv%z^ZPPU!oiNGMc6YfO}iEV0myrh#4nOF4W1uv zJhBA%4?grF1T%adZLQg{A|$Pkxvh62rM2{J4~`~tJU6+WRU2$RdJ-r){F z3EZEJfz_*i^iC+y$`%gy8jYInH|u@_-J8a>9t^tx#sBb#5~2ePQ=xI@mbuB@1EI}j ze^9*15r}LL9BAm`07h9|@GdY)7~=!XHn@NSOA8tqTLEvVLVCQB=G&l=Yz{dEa=t~V z&0`vg4XpikIbkN1py!d609X2KTeg=&*3M-3T1DD$1LU0)fURPF=TmH;aUhz7fXt2o znK2w>96)?|*&~qC@iq-ELv->W8?b8WSim)qs|YJtN~bn*fP71lM1z-%+7VHk5kzd; z3QK?DG;_b2&ZpmbOHfjYjz|?B{!V`E+RpVZ?S%{0(uAb;BglZR#W5jy;o;sML1KoL zAuSRLt8q;~qY$>!dlb>JRF#CfRj%cjy0<$nn>fF8?ab6r?n6()pVmO1VNXoL0q}8> zGVS+sn+-gk>CP_z zm&{QURh|meR%jA`0@H&z`&BfM0TmZ(4S-?yDwIy6V179r=xTm5kV2GRjoRU0s~_YD(+aaTQ4T?jUf@5vZv_kMV^lIH0 zC@LJ*AHG0MrKu_sb0=8)766UuJfXYtdEMmhNIx*t6<@x+8iUyP7WR)iXn&}lDA3>y z$}Vq|nJIIwHEZr8=x4`9VaMNUpGSGWwnnblc4Tu6#yA~J*5B5Wz`EHldq>>}G=oD$ z+6)DW?*c8n%J8^BsjBo|>Ic{dkKR8J;Y*kHeOTHz1)ezadW$2Y~o8AjCUPgH3aNq)%}Jv``d>oHLAcvl(Q zfLdT+i&GP8mGU|QutqY!2kp+j?~viEAX-6LunSp=2@r&EHIMhBel-)F;2YY2cm(8^ zzzcvuZ~gkA#wI{+V$2*38ovQ0m0Ff1SU_a^H*WBQ@KLB3yPv&xEtZ)}psLfVEs1l9 zvcCdYQFp?kBd5yCiFpENw_rUgkYzc;-UNY-kgAurDnG78X1uG(L$6j=JzJxIy?1=4 zkFVJOx)#F$%g7@NbyWda5Ca}Bk49Rz0qBykvdw6#$AZt|5eB^2goUr|QFip)QWY(k z+SakxLpr+5KaBbj*}IEGz^kXlM5^+DGH39)7Te z>B`K<-|lsk^YmRm4;F0J15YPFst7=1cqDpPN{#KU%wnZ+s(tf>-$*^8f)=RKHx&j1 zC&V9++KMKEW8!jZsoiHZX{37x5aH_>56i}24N>gwei?vqT0gCgP;J4FSS3jC2GEAvjMdLsgP zXNG*GRqZif?#BLJe?>p90S2g-F6-}TR*4BNgrBH?Er7Z|b_Ttr5K({-*NN{I11jQeauAbA>-&dM!8a_#q&3;KYB)OYk0wI?$|QRFtU9 z8yB?{A5#IOK8p4Uo=iCN4Pt_Lwh#mV3mt-MZh#ND7ayWgwyq`zmrF$h_;7O;f`QcHskm1& z4ax_ib394-juZ(XM5Y2lhNN&clG}qS1v#bzNoYVRfm8LQD%j^!`MC$=SzrabGlB#i zK#4sW!eIC^QWmpU2>7{3=@xVkyV3ErSpBV8x_*Vv-nT@)H$cl|Ao+EI9Mp#tF^A5h z-+8?_5h!wBoQMFN_-k>16R9EqIB^7WjNuB)o_TR%{IuXl6JiD|X8j8#Ze~>MjdV0v zs95^RycRD1&s0%Ki8kK3l>93E{;+^rZP4)+Qzp z4{;qXK(rvn(87l?FN0CaWF=#y;W)I0BUv91SqT9c+OO44L-6m%wdMam34q}Nl=JUn z#rvCk!8zKy239m<9{>9n4|t0IHiI~mJrb{F>S<>9=?#h5`$2AW5ognRg-M29%)ij0 zfkb&fLmiE?__K$%YhXvXVn$ZRWNm7!12GDUMW;=+v~cs1C6sOmtfedR1{iV52goy6 zDN|k!L{{|qYEa+pAZ@;xp|$kh2ZV*&^G-GuJPCS7$d~;YTB6^cA4`jvm$IoGf4xrHcYq+EPI-_0un8FF!*xeZoQsZNCCM z4Fi54MECDU;Q^HpXwy7zKynblva7BHCG~8Q86;yeq*dh(tPwSNdr16z?#t0j3jYZx9F0#oL-%^JSF8KLBCJ5hNcqkDpB zWepAMk$KA8e(b`4!?OkB#as=?v`0YR-*jU<4=k2IB8e-+x}`nvlNGZ_GiG3P)5fz* z+r$P3TU=HCI5`jLsE#i5PmF#! z5Tk`2|LR0DH^-v|Oevx0wm4KmEMt^q7AIec<`&`(@P*ImT244ns#wtyD> z9tya`(8x83{h`&gHGOqfOHnP*Xd`NiOG8#22_H3tK9HKeZ{TNbcw}asJ+?P8^`1Fg zz^`ujVA`H}+(d3*rHkN3V7=(=3L6l8hc&Zr>f`>!Ao7*+GKi1#fdGR@{9GVK0*~)> zn~R1>@ti;Q!P>ZW+A0OfvdlVL-qEqQQJCeY(CpN8KM4G;38v?!fs8=>%zlIN*&?&~ z4ge`yYksSfXCfB*ty^|yO+c&?`yvg1518M2()tu9Rw9E7{0@!>t0&<12s>Tj!2~`~ z9E4KhO##4;*^-Z4#w|zc=?Pyh(-bdoy-0kOk~VynjJz$7ey(zAFH$rCIY0g)1wo>O zR$s$`7(n0_zi81?UT-m3hBVY^s1mA?&S1^@cfuNjNWTS6j&Vw8KUguF<7VGr#aIu^ zN^GU*DeAJka04+DiF~&f13##vP@ta#qx-q&YV0AP?S~&xLqAd=10oWO_(q;_9B+HmF!qi)6G@ zNz$Thl@L+c+K5sqEm}y@LJLJyDy7JCjXt0I_r34q{{8Vhe>}%wJIs5z-sk(g&gFH! z&J#n3V~6`X2vH71j0z8R#>7JD41_F_E(cMczY{?yat_c61k8f)Cq+ll0G&L*$(2v@ z_eCqEkuEWgPKww#G&(#2L@p){7A5Bk{b14{3Bc}MNVIrq3hzwvu6u>q>2FU~T3#l+t0Wh`rSY!kPq}JYS98r!1g>ifwGROsi1Q22@g(u|_ z=@gti9utHR1@W}m37?M>ptaZ`GdAu&u){cKs6!kt0BmRsnt*kLOQXC2`UWGbX-poH zPl^VlHb<#k=E%WHKtnScCWydl6BCX+njOb=@ukQSU0F2MupG^=F*sy2; z$tPSI09utAUHDA+!Jjxw^C z>KCo>SK@gt@hY@}92@QjcVvZ6yc;Rg83ueXM$Pesx*)v&-^GRGSaAeL2E_8e$A(y_ zK#F9+SQNa+PmGKNNi2N{g z0zoDa#u6z|fj08<3G^knM8{%tJuqk*lBf{!9HYSKvOpDD3{!%WKsz`Xn?s=n0=4u;!wFHcSa7J18pUEo z0c+t6kB^hlPskN+<@yCgND$DjyKid<bXjg!3#=G#y zTqk-U;Lox6R34GT6R-ke*^CHD0E|om`2~QCII+|yZLg-cA4)&~RVpVHlceAVf@WR+ zc&fkJDM|#IbtO_?EXzqY(Rv8hga{JxMG`hq=D_q(J1F5aEND}Vq6J9M{J)_Kix)>E zN)Tp1qAlPh?LNS@M} z0jjnr7eR#3PasrBL<(IUyd@$D+7}rka~4yg!jwr9drq1#PcnDNd-+ngfw5 z4eQ5YsBtlL2cbG3P9b$diJY(;e~Oj?1inNx8Uf`5c;Yw(i5?V-zyXf2B9=yS6wr`P zY!ViPw^%9FpM#R~SUxc*5)l+ff*gF|m~fOYBU(jbMN=L9;{6pwxwj%v0NOdcp^6|B zg^LUf7l{E$fl8HW?W5QaB?Aq9I3&eU#?_k9sCW?+XgR|fMO70-e7R6c4p&AxJ77Rq z=uK5ei4k(P_D>8~3X~8GoMQR0ktnr*hVl<5VWF(R2(B=KM-|0}b6xy={k;J!CPL#W zP7)uj71G`k_-HB}t&&klCPJpPZBw-^t z1R22>MaKs?3DF81lPVPX^2tPhbqtFVO^WwZhDW2A;T(ZV0eG|O2sp)u$Rwd0$Shny zxFY~*K=sFukKjsiEFM>dbMOrkVto7F3CzI*NTc^f)A&5TR5P$Oxfa!j{NU zcn8q^frf>v7(q(s2pEQnbB5!ofm{wBf%3-k`zp_%TpXAY3LAV`10` zb_6xbDV_v4Oj5ivN){WAir@#jNTJ?_le%zKPz8gDVmQcs1E~bG zABI5WbA>UO=m~&J8c7o7LaG;}?7A~OC zKtrBL#dnV5sF4m#Dv!g&_^Aore5eBriE)IBok4SH3`Rnd#PTD-s63Q6N1H)&`~WZx z#;F2>M2ZTEig1clf`^dBW9bN2kcT+q1r8!Cg%uE>;dpD-I2aYnTagi%%>A7RVEd0zqk?0CqP&9509jjZ#vKoTv2lL4dJ}J}{gEJTg)d z$fIkgpMfEVu@0csi8)adKn6u~q2f3vT(pmaG?ql+5`BY2{!B3c!=L3H>lejCp-5o5 zPGpplLyy;LK9>o40~}*HKCC!AnIlAs2s|f@3`J(f@JZTGKbpgdb|q-xMSqlvsRXm~ zqJ1L;1QnTy1S5EOT)tc!0e1zBFjSR;Gu(ye;!k8!0~`qw1%nb32MT>+AEKWRDVFcd zLgQJk&itq#6#(doJfaltPjY|@Bv3?DU<}STA|M{;5GZC!Da-(0EEs3QW;!qed;{V{ z41%+d!$b#Ckb*~~I8wl}0c3;G2IW2&A_k`xu^g132?i#C$+=*P9wAl@_w(oQK?7j8 zL>Lf`V)JQy9u5~rQ}U6dNKoL#upO!1YMCn>Y;+Rd&o@pAy2IieX)zIebPOm+@xd+B zT+o=s#W+Vpr7$)_D=Qfo=|FJwAqfy*-lhu=6EC0=qoI7Pi&hGH^#iRCuB6y#IABbn1BJ`s^DA9T1tjZ{n6T%SNb z7{lejV?`?i&|pX>EJC3Ml^LoWOv8ylQsekc6jVWUkzoA7;Y?1X+J)~F9tBge*ytD; z9&|SONfA;o78q2vnKUUO2t+9`&|wgcR=Ohb@!DMlWCx}|M1i09AQC$|f*z%Wp+U{U z&pFV+*TI3NM8>euB8C`@fulr2F-{74L|hPzLRUzmi4v{D^kq9kk>Okt-XEdh`>R{V;ysMTI?M-2F(4h6sRZM~jL2?rb^H&3wFj`88cL5Ym|2St~n1sS~ zji(C$4+R!0CrQKvD3cQhVE&HWNJ?y^FAU6O^mBBL5kb|F3?hJ_WUL5WWPn-> z$Kq9NEzCi2ibBW9;21%)kWY|{Q$K}L%sZ~$vSfX*Z(HqM0<2>RMo5;&SC(xQDhf03HQMc~kpaU7OECQufQ zWP$Wk=FgS+iz7iL5rm5v9{6VaapU14tW@i*!50zZ&n3x_G8Y$#FPG#>Q24PWB!35F z03ke*93T~|NlXmhDUbqp6+|-~fERJn?jbTF4seFOp)On~OG|p70;U>0Hat)qE)_%u z(lO2y3P9ipKxA-1j0`LGMG#a}DpUbRCQ8`^k+&#D>uH2ohY2i%z@tDVXek_q!^&ZC zz}av}3?$7*9_55*;o_Na1~UNf%A~r8F(hgLOhWcnf_6^<0@77BY56y zI2!FOr-H6mW&{BfArfLS4k%%u+HZm$9uVOw2loVDE-?}`*%ic_pj(^Z3P_^B=mIbu zOUL+w_G%~!A3(wq0<`PXKAJNWOeF-&83zQ9f)``8A;Uzv#)AiGCoV!6B$6KhbKx?f z6G}{r=LPWD5=SJ+5kV}4!c&D9(6Q{`!U1D7DH8+uWD^99XciEFw`k(0)R_Q-OZeVw z3S8wF$Bc}H0d}F15gEtC!Gyj` zgUMKGZFK91iW9+r1;Rx5`@)%yP{58=fyP3fOz42Z$B4qCWC&#tP{?q=FbOBnNdlQ% z$bxEh!&@C2CuDJXEQKQs^g`eiV45}&M20vij;QqJDPo`$5Y}TD+8iGI7E_}Tpxagz z;RuB~tDI2;Fw%(P7!^ncgJ#)s0FHxWV$eb`0*Whl^a&s_0<_P|i_?ON3cvyYzXaMJ zY8=!TOCdXJBQ_@@(Ln`=gT4eOQVeK44ENPGDFGq^m};ZdTw#m~!RBerf;UDS6b)RA zw+i&O;$mqC1&j_3;6eo?rNk!+XiyL#J|5-*4|Jq+qFm&WQA}t6DrjQPCY6T;y(Qi> z9B9@A196G*Fg`UvMgzl?9T+GPOyP`+3W7Q#R1u(OB9`L-2gK=EKB(!s1To-rKcZq{ z%%1`e!d7p8Q0<5jFkOWT3IZ1B5D40V5g-i((>TC~Bw^J5!k5uL&%^+C(8<`4eRvZD zvKZorM$(mGA9M7T^rrTk>sJQmU(nz2dhlc>dlic({qcH`9O5te0lE6ZA{8ZFHOO3u zqlH}Q#b3FXWZ)OS|M}&FPlIkP`={KxpM&^%KkKsR{cJavYel3ykM8kZuTIQXZc1;DIQx{-;=kTvN&Uh4g31Nt*&;stFZ8x{ecA7DTrCVE?r}In3Ozqj^$C?fzIJ0^kLSsIj64KswQGCEZ23UJ8pq7+cbiYVNiY8A5naI} z_QILtnHPOsdV?Br<&3UT4{_w`%jkBGr>_5AOhMB?-o1tqHL+g|dOrU>x53VER(|%9 z%Wu{$^Fk1X!)X19{|}yk=rrHxJpzuOeYczP_ZexXi@gv&@lA4^CN}%Y#}uuAy!4-A zb#ya#wK#+0Z4Nh{_$#;~TQ5y)>c_PHOvpRevX0q*mvCXPuAZ%Vo)8>Qa@c|Wdn+OZ ztje^*qTNoXS<0%k(TWpdCRwCEmAu-cU3>h78GHZUD*L#Gp!ro8x%4M~aM#^=kDoe8 z?iOrQjtn_(>VNig*QF^la&CS)(Ys+F;~~6Lir$v;_z?T?ld-2~H)b!r^tfPe`nT!j zlXNqeKdLnTdzXCOJi86E^D{Pu&OaJJ^t%6Xo(R{@{cQSkr0&|`S8j`$q{Y zi64V`l@?g~h4?qCW1iRUFnQG*@Pbj+KK)JInvJaRDjuyfZ`avC`+aYB0FQO}k&m_w?6G#D&&ms(l`w=)C$ z^#nf~;tzWyEW4k3Ikj;5rkl5{ELyp1*4JS=SHBFrES*VRPTKr7EF~Q-AJR;1EjIWH zRln9n@9I0Y#2rh@uAG;ANjb8-&!vCY^6x9cpB5uNf7_jgp#6UHU|;22kEqqheZDq0 zzUscUZ$QXt987F_c&eB8{E}>u{!rA7w@`Q8#l_4wVYZ<|3q(&VW_BtpnR#bITy>!l z=q9JU15azmAk0+@Q)*we-S|Q?Pq&tCv?d*#i;e&Nx@VyN;ibotg=^K!J<+WX(rkxA z!`g~M62^K$YZHGH$Hsate)pZ_NlX_6-+bKHE)W=fz5O`J0l>!eGoxEd7EwKGzP+d% zcU}8!?zSdU?g`&xA&23AT&@r8{*qm)dIz!yVtqcd(y#Mjs=8)lU*O0tK9+}6?4Pt)LV}1Q7;J?-ffuAJUucg zCt=Ukn(F=O*H##)ryt&#ld$)hJ~_yUj%vBT=fOF-#kU2HW=02NFzv(NAJj_C+6px{ zG7ycXPVYtw=P>X7xcS3pi2e4bD)4OF?6gmznp^vpA|ZWGQ;ZIK%F;KV7-Dpm!WXoc z{+#D^+v|jl{cfWsrtQyPpSzb1%_-Y;gs}+?u4|P~y+{nmUU!z9xcWhB!h^_f17BA3 zwXNLYy8ebCQ=wx!Z*SG(GF0Nv)z2V0cY=H2Pe0mNCw_XKxHII{lWXOB9`9S_zcy~b zea5~eKG#1@dS;UEec3QD?_VL=nw=FIi65sL+&a+cImJHV*nIo>Ur}E+?>tat`)4#F z?U(K$cHIr@v((`x@x#I(`S+|k1X*{X{w|k>uWpxH<-f<*ZJR$m;r0D(d-`6P5HdFD zWo+MbWY2!?YP-W3Ltoxt3vPv2`uF}x6C1swLl_S0;c>ioiwLt9rC2CCmXMWGUxy7Oj>aiIDr}rr*5_*jDMfVL?{JVXo=IO@kWXerce?Ik} zNIDaBE6>Krr0BQtnMD>}t;Lq>A@qZzZFFl~%>!>E@;02)^~z4SHo5LR&-T9EoxNi^ zI4^un+5ORrdiOeK`qW-H2R)s16k?V-`c!Y#5jyh4{CB2aX3cpP1Hn(IdH$K0=ABmu zP8ntmx+UnH`OnH97q|d2-X4z^M+K9~MfXEy)GX?_HqGyq)zXcv2m3Oi z?x^g@9Lf~= zD-F%>CZF4H9^Ui3&GllE)p2ynLVHbyhuitGUG@iXU2mF5w?YeQHhcONn&+30%eFkT z^gp!xVid%zt#Rq~O+bQa;kM+{S5jTgMwXlBdL-!7kB60PRrGsn48I@g(x*@OY%hJ0 z{j5lnk-qPj>9G~7G?x-SSX@b{sw@=~dD+zxYE%pRKQk;&?Tm^@i6D&)o*>tu*e(y60DZLsq#>YfO1; zzR$@|clZ29I?HyMkq20wSGoS(={29<^1YH9x_%k>t^c5Ce;M(9s55Y#dKB-j?^>1A zuUSRg6{=?&47=X)Z+x;fOy_8@@|ZXyV6GowlbZoz@8}v`+i~qZ0<9fn9}LIZZe7O;r@>uh6?ZKpYXWvD^SS?W+qd|K7^g zCwZ#*d6z$#@PI`0@aMQxosV=+{g?IM8>{zUxkZjWxGCo>=U-Sf$s40qjgWs54 z&%PjhGfzU-&F*<}c|{HBZ+t;-C^Oyp`NQKP(vKEmW0T9w^pz;p`T4agW)8nRIeq6` zXJ|&GaIm@Y?bE*zk;c%~M@OIhsM4$Tjt$qiWyP9xZwkYSnY6;C8*^~?_rI#_SE_%^ zWnXW>C=K(nYmfYEYtI_$K{8uEC&cNth{a8JxaOa`%NB89S-ShytutO4v;4XrCABkt z?OluZ9W#!vJ?mFKb4u#H@?y;b+t2g7E?!kiH_@hpknOs~_GYM{7_zi#e(HyU!nw!f z8J|BMG`vu(eQh~`GyL834=*jwIf&t>AU0#N44xtN@0Myhbz0x7xU+9@BIE1*xvLb# zx)sq)MRW`Mi;ZjF&`M_PKVm`AIYe(5fHW`T?%VQ+knGlk)$|s8Sbm1Kpa;Px9>~j~ z={#Nm6lTmc7NWM7@UgQ$7i@Ajix2Bucj}euStZxL%h2$Gg_qQbwCMbcD~WE7oaU`> zZ}0DaoV=gKm}z19p{L+wN7+lm&!PL&EA9@T()8PR#Y5hulDeaxRT*5A^A$+^(5|nN2QISnZ4=9?=u&9T;I18OD+#Vpm)ydu2fqk&RM?2 z>C#Tf$$jaQqqjpi4^oZ=(Hr!DwgCVbne}scAb2IKYU&Bh9`EK%yYBw}UCJ-7Pn94O z=eWd#d>iOA|JvKKLqq*NJn-O&chTqLb(0uasPFs3zI-NfVHpQ(&YZfujgzd>j$n4#~ zc{9agF=v3d zBN(g1C&iSd`UG7UYFMo@`7kuXepYb(CU>~_<>^hYE=VIH?;bXOaaj>C{_<@2Buv`E zQyY56e*aMZ7_>N!-CORlUtP&~yYkkCeF(-66F?;8hDKptuH|zJco7vOJ4{dcU?J8aza+R_dx~ol_(ky75n!T3p z-r)60e|_VNUR*NsNi`jrmj9NOV(XK(FsS-V&%Fh$#enUTck))X$+isN_O7d2tUhyF zxM{hobu&+xDMU$nwoQHaUKVRs*a6+=46j-z^+?fM6;y$Kw|tpzx>s`MTl;O_vNZce z7yUx*6ob!^yXQjBO1i!E@fi!2o#a0*G~B*6?)~R&dH&b^%EgZgQhu#W{PpcHjCEvn)R)jPll+AzUcX>Kn^%zYVI09Jz}v^Zea^rk-BF{q(ZVzQkJPr%NzlR7@_e7Phmy8j=Nf zRx?ir9`;DQg!>lr^z5lj_Obj-&C^%V3U{jwB~QhXCGj2S;C}UiqZJ#!;>&=@JCO2$Ixu+L@ zC_Qt9O0iYhla`PxrrRVLUNr7`xMB#X>A=gW|Hap&u8R^L_BjfEHh1i&#D%* zwGOk%+aPA@lY8?nX;Pinc0Wovu+!L`^?re*%S_MquhrhAz0f&>cM|WShBNhlO47*b zwW~%9rcu)-7eDtAoJeZvDW?DVtx2x>=sL~db<@@Sm#ew z`j@IocdXxJZ%JPN?1Fk=1_+3Do8I1^|7*?32W6;9=(LYX%^RC6Pe2vj>gV+p`j(dC zoy=7uH2>O-BlD*y?#{^BnJoA{_QRy#WdL=r#IuC7eQ(w-{5)zByig*~@4lgDJN-r^ zjoxt2RN|(2Jtz05>Vie%fi3RuQf}sZH5Ws^kKSKx_M)Tilk5EIzP&F)j~-XOX%*8X9TFcWr)*coC)ltQmNP&IILn>obba@{=?UlW zqF-oPj*$k(wx*+}v2koc66wHq2B-#)!sKNk9@Dm(YytKWG`24}3jbu2fwc1w1_%M(4q zP@TS(rCf4#m?Hb>d5FR6>(gg@-JX5$;q1g+kEfU~ebatwv*^tZTp78VYG-!RM1#w* zw_8qFzda(Mcj-ayw2ib1<7d^UQ@+sVtkC?Ayz(4(TuLv0Y-TfaCA!4a&&)d8$Oi|6(mBz*J&|2y5`-v-$xSQ^^^hBM?V}a?HlUtIq2zT@IUE`t2T*!I-n zbu`3J;sOo8Rc4yx_rV9YRPk#aKA)dsn4gibY%{vBB8s>JF}Zf`5_Gg+*vKm<&hfYzsj+>OtteHFC;X<)qq# zam&jt_ZqrSa3?|f8jd|KX4bn6hCJOl)p&_5qTlI5S#Dwf<2rsZq$K1(yda^R@*;KC z(_L8wQ;CD?3u+deynDFPa94onMw*;9l{~z5bw7X#yW)U}*Rw5hI|iFB8Agx~S`T$k z>YSVfS^Z2;z8hr6)}l`@71O2%4`cIU2#h$tRJqATQIT^rY^q(YNyM?1S>G=%(_IE} z29VZ5H>ssj)byKap*z3=$9~T&u}IEMD-)tLCEnFDTrY7gAD#5G1UaPbA?wqmg&l;P z&1>GMM&Bal++DcahBS^$FWv~(~Z~t%e zlA?Pb6Ajl;t|<*MkBSb+^81d*-Z0UjEscJDVdQ-Ci6PvmyPtAnXBfXT0+udO_vA>#%)Ve zabf4*Ql&;MFPL+i{6X*z(Mg4H!am70@6?krCv9(7?M>Do$Z<14W^}DY`=J^0m2_7> z@SE=U^laO6*Qcc!zCWe?;ABx!)|F`8%nwBl*L6Vtm9Po1);_-oL_@lnxqmpnY7EGQ zdEUC2LXs60tDjw{J?EWMFAUYBXA8SaeHtC9XaDip7o2_9APA_Zk_WF$_D&;(|qw)rNVwg)Px?uexDhvnf-q~Y4oH8A^mTD*b0)iPaFO-KirZKr2xj|!sdx5 zTJiH-OvDA*M!j_rHt6i@9rFGy)7`Miy)*AOe7dpJy5(^jV)EGlAT@m1#Bv2wo^&ef zu{NJSXU}}p!!K3@h+bVa3~}?Al2YNcoqO&1jKQoIT7@;7c=+(U-fA;8P zaBR;AJw?x@hR-io=@_3_j>!<+0~mF}ab0@DNdSZ!=Z7>O`#yj7|Hu-zSnM zJC7PjshO{9a^6I8N%RH|cmd!(Pc9_t8|e&;swQGF5KmAWRC*^v#KQw|D|<=mt=`kH&EC_-EFCW!)2c^zI<2 zRM50&KFEQmYEgP!x^i?!`=!IW&#%d}Q4aY31A>mOsSeJim)+Py)A+sZISOOp!AfKk z50?E#^|37-2yz-?)pnOuZo#}wsk{xYrc(!}A;4+&3uA8hhZ1yRx-UN4-REhU`{+#l z&5u_v8tVO+GYNd&d@=X-%bY?@Lq^>;?1HDInF(!g5|+FWUO})Lez_k33o>ordenY# zr`&+HNhtfaH)f#s!&^8bw%)KJ`p4fF{C?Ax-kmR4$-<`I#gv0LwX%Dzwz}}O3&fK9 zV&KbM>syXOIJ9LyN+rENrz-!!8D4cE*yovDBU@mf6Ta+(EDLK`GxdC!QH+~XH?xyi zw|r84)d_<~Jtcc@S>_(8YQhw2f=tu1i-k6c2EfWyURXKM$^u}@lhjKA3B$kkCY-wV z@X{__6J_@t%cbPO*Pj-07wdl<(~aDEuzYr=?(nafZ6`o%4$uO7OA-u5l1t9g;fMy~?jeb<~i4%joiTXNkg#pGif&LsW(Y?ZbUu{ri# zvz7POsd;TiA1WQ@6?FT66>kr%u(RJVcVe?Px-OkAt<@dgq;td||K*j$T|T?!goB*N zH_LI^#>7P9HDT+P#gOxE>{(!*_=Jz6@gBGQl1)Yv$Ql)DZ&_UpT}`{L@dFMUe@edfx6cd< z3!4jN>uvhkJ*6t<#r&i{BQ_u&-dq#ic^s@lIs9?nd?%i!zx~V!S`o3BR+J_P!1?AO zUPgF)dKfk?t;zYAXZZfugjw9N{v2VytyW0$AbojBf38;XA3JcGO-)y^OkZ4*qd@B1 zhTrGO}zFU~#_R_6`mb9UoMteG*mP5R~>a0(k_SMS?O&1Wohg^)-jdKt^? z#xC=KeCvkqqa(7rN1TmZVxD{T+|81H?_*f|ADq@v!D+mk1!L&p8v4GxX)^4~^+-(J zI5HIey|3+77Obe^E0Ead;bCUY)WF-MY*(phQ_o68WqVRKXVLGIx@vo^XZrAAy{NOx z@ab=T-egTl=;fMJhdmZJImJBTOM^0Gwa3A zFF+lm?(Q6Xak(@}{Pe8OQfwOi?AJeI3AG77W;{HB4aoDW0|3PdN%yrpolMPPbd%wn zmBoGXfoF`Xhta1_-vJ3a!@3UuWr3ICPQA!OJbUr+`yy=TjX%Yjr4xI6VK?_3O(knZ??yzYu}R2 zL;$7{A zb@izkrKXR#y2Ofi%jG9QUO5HIzTR+cn-K^cV=^-f2}kYc_B}Y(Xb!VCwz+u4Z~yYX z%5NVYN8HawtcPTdhSf|d>%RZ!FuFo7+j5;U|2WB6_+%QSEZsv^n9$MhdB193B2A}m zLOS1uR@De~wOiTA$ScVI%73QaBKYb5Khy5Y(7XTl9ih|w(k{KINBv{4EVq1r_EME0 zDRzIPQOo@Ng1Td<9qhs97wuo!f$jVG%NI(@>-{z)X8O0bfc2+rGuIukF}Cg4zTZ>- zwcaDWnrBt~Eda(@p~;B83XQl~Y%_E>@ZXM^ZmaJ!Ycy-;M+4F_^`AeEsX?hj$ z-K9@+18W3sn^p$-j=iuwDX5E?`{{+*?TqF0<)N3Q<}NWWQ7NCky1lsWv8AY?<&)XX z(U*4U;6G0j^^!g!HeXF-@nd8?8yQegoXlJ~?AgWdkj|wR;kOT3EZBOf{u9o{=TQ82 z@~P1uR$*=%?}kJ+r$39TBQKbBS6>@_F|S;Y#}{kr)@$@^XA{dOFZbVC2CxOeE@(0P z%=p%unGF!LBSH&?3+Ld_)61OY)RVq_#j6Jfo5D0hS?A{@%*<~1XqV@yBT!(i=y7wr z+Qd%+kilD?nN`i*eh;pVua6S18J3s+y+ix=Bi0%=^>`=K&m z2`AOsmR5517q9a^>ivU6)7*85Y4Z;xZ55@s*L~lSx^~&vB`5fqY)y6tYy+rvr`tAu zs9#;$vT^y3#`D`oTL8@2>jBCqJB<#-bPd++@Xd6vv_H5ab>3`sDSS?g<@T^i%U_@Q z+Ww&GYRg>2_3>~`z?ql%!Fkfai!nCGeZG4&!Q~GoDvPbrtrec2lCj(AR7UvFdrRKa zM3Eep;M+6A8sJg@jNL}=wbovjVbgRYc*`SQj_TRsH^o#MVL8^6zwzO0NGxasbj zwax%!k>1Z*Z!`4z*4H1J>$GwC6YB&|1Qp zzrS$JjSF_Wz6`!da5_!X8B@b)iLHX?MxKY(Z14Em-u-FHUTI&$lE9W@nx_wE_dYyV zJwE$H4Fq@7X8!Hjr3-34q8?crv_AdX`=y0ZyXmXtk(zm1Y24M_M|BaBufwnAwq8D& zx-zA3Y&)LTUauaTTz46c?2l@Dc+BY{?ieBWfXBcYkL2bnyf1MSW7OG|nXo^ zd(4RO^?)FrdUi=L^-a<0o4*JN=j8XSzh_lhwc{;1jsAO?ecS&559mnDe?SLqQO8C* z9#+Z#JWTbxA8>A#J0(2CwPwj;UC#7%j=3WJ(iOa4?}}chmsMQTmn~6$D-NGrymF*8 zy!F8hUPnPm#R=ue9M?n%)Ukkc>fc)a;mue7tCFu*9yL;Ku=CbiJ1RE$O^aEo-7K@G zRp@;5k1MD`c1zE^opYS+apR9BgPJlmeFa4R_9;Riq5qYO+Wr3F2KOBiHfyez$S@;|MP+Q}@urbzb31+wExlf<%0{t{S_MHIXnJxyT?_0+m z!JVq-dtbdCYU{l9HPqs{M?F$U*3mpbuI$^Z^JY39|9W;uWkFNH!xv^#cQ|=oB`nlt zbHCi|&q(HJ9fh^m#k-k1REv?xtvQK=eHVS-kN3tzU*9Rc;u`mD<-wM(%=#I%+P8DC zKX={Ol;H87vnx1Xd%hseZr?gwRPk%`nqSeD`jg+4R5ez^gp(kGiAw*{Ex#1Q-p&pH z1Ix5$LUR4;8_&6a-G_*n|GlF%XvJCfzzk6^Y#yk0GcFQzQDL`D^bcE@co`fXRlUV~ zIW=2ejrPemJiyz@J+GMTbl?ony|t7vV}R9)K3(ARrFW6cG#zIkFd{kCDMz+%zQOhx zDw)dMpt1kzAFRKJ&=)`*n5xXFSBB~wf@Gqrw|}c%v%WcZYNq`9;EnomtC-Z+u2&Qu zFRvu*HEdhk_44FBPzX9+v8;HZZE|B}Z+VF-?Ba&4M}7bU`RMTVGb7TKkNX3e_!{BB7vLWz3rmv>6{J|qiNwI^=J0} zsXJmtx{vogcnt5gfZZ^hv*Y3MMsf(Edj5FbM*UCcuGl|g)D6x2ndlV^$SKBbJzV~Z znC!rk^15YJkY!zm*D@Td+YYy7SdmODpF`ccSVGOO-ffGX$t{w1?9Dwj(D^~eEKwbN&)J|c(`zH`<9P@jfB+Ae0wo5XZ5yc%mW#heWUeDb;%}sGHh8V zF8vt^x7w2e;p|8lGP*WnU*L^sv#wu~&Qs?Tx{%5Hmt{Q<8#j2KWxcq_H&;*Bp^2D_ z{SteR@kspS?gs}|k7Ly*_|UF}wj=nO`;nJ%u^X*F72Xj?OoHI9tP6&hrRFuy8DopC z>d;3X`OvHUjsuu$#&*&4gT)WL6CbvhGbigh$_1GWicN}o>ek&~2ajtCWu2Fbsi(I7 z%5k3Mn;{z%_iwnND;^Czo{oz@X#F8Q8@hqmkKF0;3WEDPqAGEmEcWxCC% z-_?|qA-5k386!+t;cx(geB;h~|U%CP&1iu>{W&^t%oKPZ8}tRK&>xj1Ka=kD=82`9b0VxvrKQj0YC z5ql}Vg9qkf6)m(8?CRbJn{{pHoqs#^RM9iF6KdCTM(g9f8FyFN4BeU2eK#eM9=XC+ zW0;LzZSdzZ{Flu>|9Q^g9?S8e$Mc=AHQx-^eSJ5a)J%j3hDWP+TC7-3%&9wFL*)`b zTBLJpK6UxsdQu*;;;W5u!*=;5DrA}0vS)w#e=O3|Ec0%!@tLkq&e-tBe_*v>P>XRs zn;wJLvvrFx8{K>sWzCcZ>tFDA9^W@G{{rlOa>bpqUI(n7eJ0$-*qd1G9jf0n#!O5; z(^-Y}Iej-|^RsKPugaAW&h+dkie?q^;}3)FQpg2& zLoChro}qVgOp?N*>h69<>LMW^ma>3}=TTsKq7-K)hk z%N36tUznZ!VU!Lz`I~;YVp76bQ|6Wv59tltwFsH1dCCGU5VKgPc~6e@)?=Ohp7gzj z7mokMDt|dQMNZ@=Cix#tTkn;CWHDyB(T@J*6If%+>%N6iWNpUkt2sWtwJE9C(oEtr z0l@@(6Q}@j+xqsCY#{a6HNCyO@ge}@yv*OGt4mpvm+iCeOzr30N4Fy= ztews9X(u)R4PQ0PEpV8U8m!zNOP~M7704~^@w2vsjDgzT^XK2Zt2Fxg`AJLLjyqp2 z{wEQ~FxNmfWp}Rjew8O1x>+EBe`sE;QJInZ&wn)eI-@~u$(_;8uE@e{6oJXJYz2npFm*^kM@4H|1U}nfU#XE6E7)c zu&F!;z^)rARv^suK;aE5*IhkR)mGjITG+N~KkF_?}z5m0T)ny8vjJPi+ zhpIy`-C%NYx#RXyV=b;4GUNKLd!U5STr0!g(Oz}LLko!@UK#O|{~>J0iLs z+M8gtN}?rf6y3T{Jf&G~C@~_kt`Lb4jCmg(vhKd`^~i{9W0F4Zz3L;kOi@Avlq_V{2)zqN1R-NrQq`v0)eJM7FJ zpaEFTUlMU)z7^1fYwx^jpVk6-+;vk_J+CuOuNF*HdFvQKYqBTA)E#FP7Q+N@DJln% z`0>xT53{xSX))zQ-(#KN>6N-6rQrvO?M7PAIMibIo&^CqFEgu;9-TC0M%Ry5NlnkH zh4s8|fEINt({6U!BG0tIbL>+sXF@M;2gu5XYg-M%;cP$4BeKQ>*;4 zB-PYzGj^{f|55IoJ?l1&&aG2_zXtHDYTo^-Xi3?8S)W$q5$fe-k3zNg+ph#fm-mlO z8WFQyjjg=^t!18;EEKRl@uY|Nap82png3Kjk2NveKHA`@B#Jkmkmo zdq>X++U$?Y2Tsje=*0n)o*#oRwrIKlBx?+d!ncKJ!Q9AOvl5QX2*_EKG)mE-_qCpC zY)i{p)5CJ^`DhGu`Q|q~>*QtKT05bQln3bp3?y6T>AA$*btyZIm%aw@*!K^tv=A(?`8E8b2h9LYB^f}L5u-o9u;9XynhVT52tcjW z1$@^1%n#)dakG{G=%@N|_Je$6VEv}LXHQB3&mB+QicU543w0H=+G@#QK%}S?lVy@` z?;ippJ;0hD979dfa=@Ggtqp(!Wz}VETue9$4}WuWk4~pT@#&?{G4E}rhv}uv>Gh*S zMuPV8u`H>FhsRuxjTbhTK04_SSSa%jyC>A7diia=)!uF{eSQ7v(7QYPmif<-msPdb zs$_s`HQA0_P4e$nA-`+Vi6JTK8K$XsgH%`{y zqDA;O3tQAiq?_)t9{hm_vt_u<#X9x{9tCB9zIL43lKcMYxuw6p_wUd*nv*YVFE{MF z9`jHEsCtI^k)yf=fSE+U$ksyg4VhM`$!&@wPJH^yz^zk_S}={QUjojOSMTB2X*olj-Ou zJF0#WYQDcErQq7if&;2oBpNtWi(mbLZPCxSK2ojzF8H31yf%53AJ3eeQJjW85P6iG zs(A?{Lk2H(ac3o@wLJ9l=f;_yU4TTG_l~Wf=C!SL$6LIX&ZcM zbb)Ub&SQ~FO!j8WeiPRzxcmZ;Q@h5#o%+_mJ*8*k*!T9l(50RGKnZ4gg}ctYd3n}C z&y7FHKD9tTW|BmZWS*L-V8yS03|Dl-2~W)jPX}V<8`T% z3rTrlKjh)pXMhKBU9sEiR1l)RWx=|QcMs3Nm42gXT;8QuA1HH3*3+4t@_K5k?_io{ z-^ODuqNlS!9pIO4e&pr8n|l@sr=`gy`Ej&-N%O1kqP+Ne7!l=JFs1-A^ z4;-@IXO$A`SLGkONpC}BDe0H7?S9|GqhZGxpmawyp4T5S4bV6MOOJ*K&e*xC%Vzva z+=q+`n+wC`VReQb_WO$uqhDEX21YBm`he{+i5}QEpv55rzk1l{`E6!F!(%{#oCPX& z2i6>PPZ(YtPX6J;P6xuD?r5BRS6dz3{UNIgr_fi@W(2W2h?N=&c#O8;eb!JTuiGgv zD)g7F9|n7kmcN8l69hIz_Hn%Yw9@z|T7nqPMf2@`kBXHy~XK7u}vB z)7zqL*|ndUsfWWo`a3SWqPKsxjpz)oeWjXbpXytKakQzo(7(ozbMyEvNhB&F$nWo{ zXz3pt`H8^XB8V3>6!n+nMWr@(sx>eQ_D*-I`MeXLzF}5rh4__rbo@kiLGV`=5 z&X|*AT;2+9uZjG*xh^?YFWg=Kps8i}BB3c#zgBPk-9x&1HL=(Q2#zL?6)pITtSh>g zUyKDI!1C{ze`Vu%mVo_e)P^Recd{p?Tu9B~WS_VygMj9n;>w0z#(a9BTL}+&R?Y*7 z=oN~-N0sY_t#dQfvRNmh>QZr;M^S+(#(Q*W$~BEPJ~ut2B~s;RBSR#4XJN>ZW_ zJUh5}*D7$*HqXN8D%5r?;iS-PLC@m6v8c{&Ng94#c26?e3QxuoXk|ODX!=l0MA5SJ zIeixc02ZYm-X=#3zuZx8QE~O=h5Aoh7J}Nx1{RO8Y&1Q3mTf2D>YO{ozhGo7H=i60 z{+eo$w$l0blI)vReDI_>pCUhwYT=@=WEy?_EU~j6dU5ky!oK>F$ja&W6!(vt@f@V6 zpE09V&uOoevAuCBC0;QEC?yx_Q4vb{@}5qC&B%b^H0EAe(qI5 zb88_){qh9A^&c&FyZgfBS)b*z-toVFGjO10CY&KVzB=OV7M?q+Kqq=T9le51eUmEA zR0dY@GV>&%KF%; zwA-9;DZ6&rI8c$gbJbUy&e|9y{;J#^Kk>#8fl%Gcgq6<+v31QNivm8Sdi)A!DY13d z6<$0U_s?r0*!StsU~&!XnBI`ZqKbPN!5ara@TJT@fS_MS=58V|i7~5wRrP0_2*N$+ zkC%4c4#7bBv7%hNwp>>iWbB#vRJ~RGKk}!-XPh^ZqBcb~FW02o$49QX`4Xv*FW7NB|@?*8dA|QA0Bp%o?E0pckWygK)QJbG@-Xht0rXq zEMjxNyi(_-x}BxP|BG##L#5TNQ%ftzC3o~6m)v-U1qI$`@=3tv54qO0xe7^+k1tCZ ze*E~s!y~B1LxwLJyc>3R4M6nI_^d~g<+0%Sr zB`62yvyG755+ETpD0WCz4D=}iY|4WcWa1o3xX69D)$PN8T^NE;iDUwb?aFP)^`B6G z+Y-D3sbPTYCrQfT$gntmeGhdgoU{n{dVBktKUb&hckz@H_o~~m3P>XNGY@YVxfvs`-FI-q8!`#3 z)=JvkJ_r%Fxb1Omw9xz+KpA4-pKsB%Y?whH2L zjptyK^O;0!1cr^?dkO05W2Q>q8H-nbvu4!IT ztv=#*3j8OoU>&(=p`|1OIZ8e^=0j`nbx27I)H_Vj8B)3nzfjy&^i7lfm?J*9r<~Ac_=+? zn<0Ic5P^cd6RDMYL!BQ6YYNMETcX`r3cI08)E*7*#iizZK{JkLwl3?sdKzi$9 z5vA*V`!uPoE2yqqARPY(Tc8%N@kr}v$RJ$yFsQV=Np<(<<{h+fZ0(!I)0Dn5-5Y2! zh6=n%=be1~B+Y)Z6Y0Cp&K{jEK0WaWC-xuLDIMx;-nw-`J&pUEjtz62 z3#T@Pc7eu%z##0We(7wFyOur)0{aDz*`c}8-xR^9uW{||+D8SJnSo9-JMeIsqL;sa zoiIJ4(NHZQq+KA3HmlvecU1*yC5&b?JCdm#je$o;VufS9>s?a!CL(;aI zqtg(>Jf2c!JXYB;=CMNolOv!l^!oO(agY(>SpEd$$P%$Z5s12yxX>{-w3N?uGDRwD z;BDQ8dFO0>KE8!hv4b=Ot=@(o`ee0+Th8u!4J%?4{nsrIu$@lv6b(;I7e7{R&7+l) z{yzDf#0#Ooh*M9Jc=1_+!{<|E1nr?}Cgl{XH3lY(tjpsH-my;gSTSI;*Q5IKrbL=y zuw^tU){-k-E4hlhgxUm>1Zc+=1aedxF-1WuA7cS`mz~!BxnNQ->5nZP5Bs@MTHvw3 zTIj)m6V}FP+nc;*=sr7CkSeZ>vho*2Zimx<-VT5+Hw!4`X0*D`G0XZ6@EJOYRZ+-w{8?5p&;Bw#Vz#86GPZ`<)VIF3+Tm!u8vaEq`M<^?1m=DuG^`3}^RE&= zTR77Z6P%Jtsfw*zf=oRx?UD5+sAWdrQ)2cSDi7^B^N_E}&WBX4x=(Q2j?{S@IsUKy zas2%v*@JV2oolo(k;3LqqOgcW?V;f>Vx4u%@dC%t|-- z?NAA)FntM{%AAn*G?nJq7+5&?;7CM*;dq35i|C1tp|K)txGG zIjHWf4NIZTGa1=EkMZ`XvbHhjnj@F$=LVUYG)^H{COAM|V>KE*-XuaN8^1@%s^zTe z$jsiE@6}-1Wt7G;3uuzJ8>jiU3cO=&1UPv98K14omJ2skDYRW)qKshS)rk?>aR#%! zV-|R{QFz>t@kli&O5i^%y0FbAujH zY#+Bg;kCn-7BA|Nbn|41M=YU3p?9*y^=Y7wxZRj*TqVKv6`r4%kgfBtu^~^H&Ltd? zdbK3wQDY<8!LmX^B9`~O2C`GynNCJcAdF*(qi9k@F)(8n9TXX_2{Y!^mnW)un8MmH zksF!cn4rYHI$s$~edQ9C@e|m7%pY54QE{7d_B=S&X^39$SGa10$y0h)gpyyDmXShn zu1#jkH+wg%_QIdP>G>e%SPa7984TWjI~IYW2LFJfw{@OwFGD2jN;kg3>G&;ProhH| zFa`w8Y^OX|LAEigLnRFVxI{ik?1Sx`CEQkD9vhb>bA(jOLf+i?W+!&6K{vPh=@Bd> zPe)R19N6Wk{D~l0W!}^!)uM=K{e@SnhK1@^0shUUv5A?qu_2J2?Rc`2H}%%gx-ez- z6rE^&v;kTlvC@JMHD2yg-9=m!@`3kxI3%y4^^s4cEf{_w2pf&Sl=E?(!|XIIfc&$u zCntH{5KsWk^!I}o8HEo_zT#G)A6jl+wLMS?%dh|FjFnY!JfhSV@*lejPD^-zTkQ_+ z`4r1PDVEpYxehk@3VDsT#&2${7uwwo)qVkmyN;kB$cC&Pgv!@wE;*mF(Jsze|Br)L zLvMxs3}uzDw%BO3zZZe9gzh}0bxQ?Gs%^xd>5gxe!@g7<@bhloUircK;R6w0&k?!q zFN;*8^Ipb#&B*B6;BfENd+mKlm*j}~E9G&jb2?YS>a#6EZ+u&6iM*49)1p0@`Z^VL zhCs|c&p3;k5Kh5VEt|=Dd}1Mg48SGwuu0FnGks(RKX>Y3s4PUYBU3p`hY`-B{8LA` zNr_}LtShpflm+s`4^?k88P}-z3WLZXHyvwcgv{F-E*a?db3Wb15|2KOrqP<4nf#!|E2&yg2vsHW!IroQ2-r#-&`9c z%OT6nwWun3jRGKL$X1obUpg*?@*xzGp}1kH=iJwfB!aYkOC2MpiSS^)PgyF9VC;{U zwsI$bC>6)4O$aRTz=x6z7m-Ae@Uz^D^jSw?w>;Yi*Y6fj+{)4Xjq(0}c;X9fJUoyt z_dmp>Uy{cE$p@k(n^u^;A8Ao2(a*g|MbE(l)zjze`{T}kE%A6{S@`U888T%jauF0> zbYkR=KLZp;--mr#14Q#_uEGu|r#)CydHm2t8JC;gT%XR$Y#pcxWWjiqZvMgTJ_5Ak z26J*uk=A97UfTm453_4`orssdQ;1A(jvq4dEIm2Wo*YQd0x}avHbWPu^{@(H3@2q| zWXv7iYzbUEKKb;DaetHdI9gFrQR>u)A|w{5k!tSe0>y9~1{+WFzk8fmwJAOz$?2Zhp|r|`!b z#1KQSW-{NsfdTWO%Xm{f)*+qm)8XJ1-Eh`R(m>d+$0vA1xb1U?rt|YJw#iq9?vu2K|- z8WV4ZY|#X)&HI6>{Jkr+a0o(Ry3`;=yYB=d8}&Xo5DAtEnp1scOjftN;vMdvzc)P0 z8Npauv?))dvoRM*L$!ZKB9%2 zZa6-?2n7}qwN=n{V6LMDR3cYLNzhYXP$P9BJcM1oCCEWL8Z-@56dR~*kgz}L?zfLa zENEx36;U2Jr~V3ah70eottm1t>-Elh_%U7Bi@DcA=R{^5^>ul`4iPGF$_jpSOIS_V{dJawN+vw6TS0Btud9ot4Nzwc-0M_7PFftL zcg>_QY48{to0%y+_+x%N^0j(BmB>gcz3l0Ou{g|C)$WEu1I(g4-ygy~&m?{B1j7V{K`!?Zp(no8=)`8c_Qx#?9u`;XmRm^4c%& zI7qF(=T=>3w$I@5RGLX!G6XhxBhU49N6bYg;q{j2Lwdy&J>mQN&%Cg}GhT;Ow39sb zpYj9<$^Ui%pi`&yA5uNL3W0n&Q^-ndYl12N_hSP-!pYAj9?!Ypta>B_7NnUVfM6@3 z{~Id98NT!2BMA%#uu^;XyNw`e^Wy(_IsH=^|G)KtFs&kogFnYKo>sj3{@d@Sb^gJF zC;)dVNIQ~}6Mvwo^z4O>n=;-@ee{Z9UpY=YY8-9Nxt1(?Y>u=^OT2A>1)#+XH8lH6 zBLDuQ3bgqR>w68R_fIdk3L(m$b<-jr+!vtRp!M@)&qMP7e!K3vCmEvRBX5^oFxmq{ z_7f&N&d8ozV*G2{9W);szaJwTv?RQpTlxBHXv!f25hNOP^3WFpQ22x>J6Pi{qly~i z1un@z#{{%fHGS_4^1x$2sU<)KSPk{N#m~;-=b@ViRu3|`_khW>9qcfGq~%8sRAcDI z?Ff<8uL}!DHh-+L>8d5}dHY$~A{i0XMcZgh2J2rgBC@`=!B59weWNkxyn@TZ&<_pZ3DZ=bq*cbs#2E+4px`3afABP20hO;I$??vrhH4M~i^5KPQ ztPAYoS<_~%p&J~aoS91%FBC6K86SpdKhP{Gt%-eOg9KBhzoEw+RvJCq%Qp1qucl1u zSQZ%h1csxrnUZW&y8~(2X!Ma^4vG9LcG$C3Pae|R|Gg#nTYKt2QAYEtRU^>P=tv^d zIIvL$JK3K-$8t)*-J7{bE zb$iY@Rfq-ZEwJXYYEdzKZr*#d!?`0PB}YUgou4V7HFfBC%8I-ZJO+P%!(B;aV4c`Pg2zjXd6(YTH?BV-DsXm#4daV>mCzw4sHpr7U*jp~Qy$uv-tM_UoZ$+s&Ge zz@NUne@>(&)#c7{;6*M^hxmWNKZ)aMOx^DLvx^k%Iz0}k2QNcBE6%7Lch7(+#N|_e zowH|y_0qy*aCZgjrEJTS_OvQz*T#a*%V2j0zb0S4 zqa0xl$c4owYL+QZlQSTo!Qc$lfKNZkEwsaZu;ak-r){AAe1#;{vUVo4@*x9czp!&3 zpYplyBf(8BbyiXkZ| zmtyf2iEiPH27Kfj1@{*|X4KA*hzAYT0s7M5aROsf z;C=nE*mD?Z_!GLZY<>>%9E>|Tl+Vcmm#KJ^0_y#lFC)8Q=GCADij?bf9;9gxFdPD$ zaN^z25H_upC&_iav;dY@c27lgm?WAJqPF(75qFNLgI{!}{aTIKcX1)t|lJ1$U8Myu5*#VYhry!O>d1 zK&Z@w1{lVk^?|{`6<^Q3e?CsPJY4Ty+I9_q&Rowm; zudv5Hp;2VTo6sb3A6AD4AwsEOu;jq?yd{wrIp6?!2MHwC-XdCQ&(}pf1{X89y+s<^U*#ZF0xQ-rr}`GzHbKe=&*0B z(dl(T%rSBO@$ihFVE#2gka#}+j`0PTe6X8Of#r?=CRRj zzYisRdPb)PZrI?Mp+im_v!FKFbGU(b+F9#HipMvtP4h86rm_@4o$|9_A+Zvqoq(h` zB)M5y18Rv4eOc0;<@PhB4gc5Wr^IVA;!kD^s+%Fd#q5Chq63h zQ*?)tufUo2=~HSG*+>;N*KesaYn}Wgl0w;k^MpZ~n5V(^KBVCC`@BPc9Y44d?48$j znHwOV8P6$0C6Fp}YQ$O%`r>sOK|bv{WCK`*i4G z-X};nH(PcI%w9e8dFXh?dV1vPRu*$nIX5_6^<>~=2*~hfzd0{K*9uf;3Z-D1fE*F- zY{Ov}G~rl-N4P+s&XV3m)d*+08=!dJn6mDj!Ccp_p<4{^M|Nk*^aLh@gBR85`VFV| zF}ds#1!?kb)by-mVLqh`J&`Zf!`u>(WSL=wS!LhEj|CIxTXmn6qT@7mZTwz?@rPhm z8!VkKQtEKeQVx+{`8ZVgI;n75kwL5g)_;2+P`mz@VLrC0ij_iYWYfGSEZ#3~L)N>J z%_Ugf94wwo+q9q|<+6I>+3s!3z;?R7D&__+FE2-XNOmON1QYv!{_1?5s%^9E^9J#1 zCu;9+62uz5=Z!UYLxyirzAUBuGD=CyOwkgAx@PQtLg5%xhl6R7tvMnMkGg+ePN)V+ zK;gc;mY!T*IFmK`LsLJA2{#(OW6kpUf=6kJU^w2CWL8OvVL&y_ettu%7`DBy9Q%C@ zEn-BmU_YI8sO?SD)ms_n#I4F!Y}NJ2BOO=T#gEMuht7XO#+&d>o_a}G>p_Y~<&>yu z-TvXVKA%9-ivsx{0^OR-&MFk_hMQUOkVv3O?QRj@T_Z0aV##|AsP-RU;s(mv_G7gz znSYb#(An!hzl^qGaXYBaenKlM?cV3OqJs4R)Q7VzJQ_oi^CgKGdweMKqlcB!cF*6h z8k};6KSs5)a7A4rd^B6Aij>UK{(zM~-3;=AbKu$D8-x1CiU9>x-ZKH(`T|9haR?3Fg?R z@U0pFB7o?#gE1{-;CiE5Q|Lxen@%`r;SJWT_%0-|(sD*KReeh@L ze2M@nbe(>F0jKxjx(;>;b_|f@f%_4zx%xBS9rQ1+R#2qYlaF_0^eR+!NOh|pEhBZ~ z=I_K&6yLlQGNhQ>J)Xi@a?~6ne5p~rJHyA>_Oe4x{COfOmu<{{7fSoY4t|21wLPW( z`%VfM@jFc28NCb5dnxa*>J_5(w;a(vjf*d4xg?q##wox)R1DADeGkf9q&GtCFeQz;V1#4tNdF#)KStR7E7oID zL^)hUuE@Azu^2sbsKfY7ukIAwDPk{v%qVoxU2N(O536Gx#$2j)klQ z?uY9#J%)|0mN7X4&O50Kcum>}TN5?q?O*g#&f4ex8BG!{5HDcoHe5d57&Q9wupQpt z*10oPt7UU~GS+D`P*3h9pWThR0RMp4lH< zTuOeFJ$B9NIfE~fBu}_acBadd!yy+!OKg~OrpJ@B(LW^k3A5AI_YUcn`Zi9UpG~50 z3C5$V5>NDOFv=v%?AXCf_HgguFd-OVzuTyjdSBj+@W}qP@Vuzb6_cnFA-;VO~eU$YJ$ zc*ybj1|i^8xq|Cs|M6KVnDX7KhqNwZgojz!Mxe{FfVaubk}x|qQS{OC6bAX|%X?Rk zn#AoS-0~v58S6|%;mxUDRek%}(l+p6fKcz&;ORn-AM3_N`B&b)eHJ6U`*@~)X=K^n zlPU021?_i~8@#aW;^^Z&R1!7|iHfwWS|%cM)FIIkj^t43zr&784)P{P!0`T0b(f%QtOYa|ZZ}4gtXrCIP`1BgJTb|-X z_jipeMd!Yc-L(;7^!r+H*n77;#<_dj(r0=Bo#Vr1@PVJN69NXxE8I0my$MXP_SB?GU1*mZNFvMk!e1*^-UxE9w=Gu!%qC6x>tEh$>-l(Ah9u2;*X7@uLEm<>o zcsyUVKOWDTyWx-{J>DJzy3El$Ed1D3`@i`yEphv|qw=};1!Z(&V0RkdTXs0c538vT znUXY$DeuF7A7D6pe}3+N{KH_kW+2aC$$q%HIJ3{89b@7fev2Qvt)PIjv_lIJ=sqSE z>|A|EAArR3mSBI~TzNKnj)TOF>Zt1!19(*DxO>zehtNA@@YRz%4&Yq(!HAB?)vD?I zLpEd@LWf1(;jn}%kLKkjxBl{-heH)phQ1oz2N$bI+Z*sd^}0jfhDO2h`k#XAjUim#tLOH?=+bSKo&8@xPe)!^9GbD@B^N-sB=wrQvkbQd8L3> z3J=^n-|wz;W8Rd^ZA_dxE-0vlzn1hlF-ntGElRbxAnxab9*b$YUE1fZkCq4|2MVk4 z8a^mieZu8(QB})D^U=>mo6s5M0lyy06NACI^*yUMX1+de`C{q*sb{_QL|E{^YxgS4 zo9g>qUtPcA@w!gS=CCrjYIqM(J+iL051)Jx9HNSefJzIag{7AUA0)(Yg!Nb#llJFP zY?GgOQn@P$t^EZz9g}A$#a>2G`4Pt{qfcxKFAMnGG*e_;s$UEJYOa}9q173TNv~_1 zVqjC6($*ndu@wwwVn{#Dw5z)g951U;UVG19-#2}%{eEciTz`eAgV`-F8^O%;8(+kq zgS?RTY4}#f2ZgZB=5oA4zA@|lCuBId!ng$WMlh6&KC}2oUnBmG#4&{ZJzOz#qkrE&dM(? zzx5v#{OJYENn245dNb|pJMDhon*L)DPI!k=q{Zq@9jq&g`Y#)sI27Z58dyxld4rV&`Wz$i;JjaQjnl@I3`yczvbc=)C zDsW*>S?W9b;5>wxuIM_1v28vwKJ6+ZO0+mGW_}}wS&uOo>`2ea zTlr`yV%yxc?hun$W{>ViMmtxw zJH*mu->i8|vz}gkLWFo1(p z|JUFp8>FMb=vbM)R!xmtzr{02tcj?OAVj?XN-KP!7W{c-@nhdZAj4J!)~dO+8jqL| z^Y<*!mD$m4+vt!HqkdU~gB@FT82YIxPIzMV9{E7Rn=F(FdFh6I==)t*r(`3-y*=w; z)p5}wM;MO=;24fz#r?3j!;zYEZ<=meO-E9+zx4mkX>iX$j}U5aOG` z=KAPQZD5uCk32l|HNsj;=XvINUe9BAFg+lD3HVMwEmu%HN&O=F=Xr|uu)?`0mj{pt zt0+&% zJS>N$ICB{i{Mt%_73*nKVh`Lix~m-1q>XYpD7v&MNXp2~htu;n; z*EY2D1g?6V_+-)`NS_krcA)-j&G9y;ZPxR`rx+y&%bFSRmDa#{0Ch5|a-Uk$l3hn%{w=5S)P4?zzA&FeZ%} zH4X^yGnjie(OPq*BD{rwnmUrY|GhP7E?EM0Sb`($uon>+UB)pvVzOZg>0+E+R{k`7 zJGN}k)-Z(O&OnAi1)I|hjvMbkXH=DrxjLM}Hx1nxz_tH<9RIE31eh<;-}A*uBeiu# z|KA_|Upx`EwUEJz$Wacl+JB<^WARDf8!C+UH;f2aroG)+Qtxx7W{XFJ$x9>1PH8$> z<31n}IDO@WGdLI%wk<*s)r2TLb!#-#x9G5t!o7M3cP8p_J9#0|oeo{dwV?NQ4i{g^ zx+8q#E(UL^+|!e^S)p)oe!+e# z7=P{hXE2s?`8pE(r328#6!hv&!JC#p0YvExxeOzC)4(ppfNG>sGc*9?Lz?F4Si3UH zL+iiGfG0XCZ;jyJQ}zoS4BIHSZg+o94oA!!i0fSWaysdVS~(!j{b8HuIVop|BhCCTz8AO?Dnx-VNJ>7|QVIzvP^s&h5$_Xn-JuV)|ov<;vsEnQuct}}Ey zBvPRWp=?UQ?&uV~lVhky(AK>Yk}B(QkLCk&n^xeHQ<9Q+Z0?**gJezzSQJv<58gVJpL00ORy$ox1j;2-p`KK@CcL=n zRO_lbdU=M02p}p0eDLP!l6DdR`Ibb13bpX0A2E$5+ zEP^EN4Kf=2Pfw->mf}?V2z$*T9x|j~DlywQ@I)wSXkq4I+z0x;p($Q0`0CWNY;(l1 zh&S0>izGq9=nCN}l8y1{62B$DaOE}{n+z3iXY1?CpbEkzrkw4OxJC7tpzpCJpW?Mu zFr%dH#@IkM?6OQ-AsQPV(4+LNY!qy2hM{Y-LaXl!6Z>pM#l`_Ki3UnA9{;)86V?~- zKaCoj{uYWUZm1f#q0)RhT%yl z2GxGfDr)w$iX;!kZ_F0Ja~hrFAZw!u7+P{@EMY_2KzY@9Ve^_~>-Qt@iiwK!9WRXN zgiY$ICu49HV9V~$E9E%kCXg6;ksZTZ?*2aw5lKmzEMvP)-@^%;MDs{MrSsV#R`ha= z;1RAJB<)v_0CNGZ7K&xf>%7kr2(&T{HW_u!u`)DL>*A)x$cGDVu0DY?c(-Z=FWW#c z(Zchi407SJ)9Xmw*~Q@VZ$X0gQpaVX3MEyff;jPuljVn4p**6F^(LMO+}J3M_rkW1 zD)P{|53&qLKk4B5MkyH-c>?C>W84b9WY`9YtTvMBq>~HfqXZw&vg|F>n`HDVvnmcf zBDE70T>}{)KBP+7v=%n4CX9Rv$}iK4iUb6U&e6A@1f1vdQcvc88Xet*T^C{?Str7a zF$^#LG%tJiFep z#E(H?NII;LYOZ~Pk|m?@wTCuRXj}m!AJf1EC4Gws)%(VQnba6AU|5g)WCwd5vU8yT zW|?>=zaz6ncB^FW`EU^sgH-7PWfgqLhVjS!8NN2oYy4EraUACt&{RJ57tA-t0+3HYd6SLQxaP8{v`q0+P=?|84R+$U#Lq000Wx zpE1ysA}O`vEI7u;l=Px+UK)ItLDDCLZ_C^NpttDDm+!@FYiTjr6;~4{pBWGdO=B`t zxqlO*tJBo_DUbL+%d#>Fxvg{TiI&+2V%+Elq~aJuC~M+SFyHegjYz;g77-Aove9gG z?97B2=q4@{T1QGwLVz$VHCT6t%yKfI;1AR#2>Q~*SoMpF@jq^^+IZSfq>@7X^loucErLB&x~O|RC~=}Gf*?=^~%A(Ua-JNk)_ z=WCU)sdOVw&zmUv`E7u_?q<^p{T{`--SYtxRluqkC;X}_X5Qr8%^u~75WamW*7Tn0 zBXuP($*2C9Q2GmFm|vSe z<`;ef zvj0>S5QKOzye_J5vuJM$vEk-fyy7Fmr6-1zt(|JB?+(4^iWlgTN3Io+L@TkqHhtin|VT|!%pW|KdSD|>$B0bJKw{BIKNLP1F=xL-H)}=5HL>)W7kw#Q3hnqyLO;fYI$Kk;9z&Ro3~R zoC&^DdJBmCmp^(U$_^q$6_N#D{N_=kK|ZEc0$z`ELr1}l2`#)-idHL->*(=bIBX<)CLJM7zcQrwBdBcG(S##M6!LI)t<`Z$i zX+6s8x*!+r(KtUZLKa{Wh;<6lvH9W=s=8w(-uLi%UK9RQ_DOQvK zTc@Gp2?XU8X);}bSK4IByoSteUp<%dISc4HBH}+1SPE6EN8#mDlm4G=Zl5vS0Jr7K zat0c_HUF9;o$jwS(%AWrH7e8;>&`!1g*l2`JK(`IKZ5Bp1@LBaqzGJ~+V4M(-nA1y z;raHq>F36Y?SQ7^kQ}WD0WcYy(Fw@pUVB)} zvEm|bbKAr;`uRxcy5}|9mfLU6Ej}|sgtrGgSyCB@j&T+|_37`xyn%x%{P=w5OZtNcs;0R|mQTO}83B}9z5^PeCYTjWu%g5;fZ{cXR8#JV zRXCVSYTqMl5}$W&L2I_ZBEvdxDlNli0j?5fkeh2Ed%6nS)l|?8#ND}3R{&f&iYtRo zM&OFM>l+3tPugSefjnw|C4z_PnvO<0{lj=*DvV z$OSk&8Q8|&b%IgqyDp$X7cfJ)i9pAlvz=bQRXCT(sTPC;Ah$pM_~4Jt7aH6hrsg(+ zj2fcmH%z+XH>bCU`wiIm1NwLGV+n8_90Zjf8n_*^|D_7awg21RcMNx_JCPq^Mw^go z(00`z3|$V&oOUX~WU@PVJ!RZ)<7!q^hzalpQ%7nx(Stu)TwfG88=n2~{dB!YjLVU@ zDR%_*ba{h=(J(lx`pkt;d-xyLyQJ(%%tVmI4RsP2L26%2taIzv-jGpEzuV-rjYfP4 zrE>nf;4^RmRk$3L#+7M0lGw`r^Nt`rZ>#MGo0Ftc&{7iA(RPA632Br9&~Sz85cox6 zvk^E}zCC@hy07#D10U_g)r(7yxx>nyjkyj!NZ3#ZVLApZm6^>h)OyV>3t+^ z`+D1;FqtnF1p|I>NN6JT3?tX>h6bwm1nV_yxje#Xz{par%_x1@>2C5}94m%3&n=Q> zZSt}~-(F9Xbe<9(GoU%axG!+Ko3RO;+oKa{(R$xFgi)9A=paRc&?s>{B5CebWww}I ztF?EQ+#_x|pCWt8bCASvfp>+uIVq^}bjL@K+U=#@_`W(9Y`l)8j;+q)}vbFcFKgMCdI5Cy} zQ^@JKhxyD3IQ`@FItE{+$egm>Aa9|#D}+ZZqArt}-|F*+(+_G2lj}0M4m7?)cW)-X zU`OP*ND1|~HxN+#&_?NwjZL5K ztr#7C-ShB6OB|c9r)!iKV<$b|9@F6Wsx6DOuzFSP9f^qjUWq76VA2V+Xup3sKvpUx z9;4Z|8+met12s3zAxQmbC;LKgfZL$uDd1Cnv|T#RTjb5oxaY)UOAQYJ0{S!K1p)K7 zSCVa7i~!j&{DJKBCm%zru)dC=Yj&mu+_~)V%K_B9-S>mu#R{R@z4^?Yu1F)`^S=VT zMlE~TE&HMGmS3ju%FZgFrkfMK#Y&j;*om2a{a zS+s{YhXm_#`at#m(i(2_K((R0rRtU7ANf0Z&lx69TeM`XnZhvY4jWKF-&kInS|R_xy((5M8X9S zM?l$>(zAz_ByNXIpeDILv`X;!BOZ(b-oL)f9+Nk9fW1@41KkFXENOu>Gx0X&O8QF+bviTPt+ z@)7ltpA@GUgVbx>Q~*GWflPRTeMD$}W%yJV^uj6v|7Z&M;=kAt<81GN^LPr-YwFUh z?e?c`6cn7|TB<50FLglEIC@(fSC-_BJ@J%N)jP-W1wxTcwOp=l%W~ zGHIdYr!ZM;p7RtVyDYD^F>K$+6Uf@N4`YPM&9jGb!gN0#aYkYFFZ8m)Wis}^{FUBE z3F9V<0CY8>eIP5>xq(R#(X8rRc|jP$(Rcu|t_4#RBow<`&VurF88Y!5P|#UqkgvQy zWbMq|5NMO40fj?+P}06lcF*+1mn{H+xElB?Os*mI6v>dukAACB#$80hrDf8sG^;fJ z#gey}X!I@GMv*O)E{NwbLexe`k0v4F4alxPj?k$SK*;p-0ie?~o#oEQPLz$_JtG3| z{E+p~fJCs#GeLmo4&RvOs71&}1g9gE{te2yj(ei_Vp0={(5P?f;SRf0_o^1N5n$L? z{5#DLX(%9qMnqpTo9RTR3h7J=)7 z_%jK%*4on(>f!I9$xHs5fQk5y?dxz3ir@vTZr6dG`H`WKq7Jr7Tg47K+oUG!R_Fw= zxLkj86W$Ix2~8M%z;%m|wPt8q<7Nx#QoE4lwC2Tb1)sS-5hT$GE%)S_m}i`ehy*#U z15aB6B57Exx1EcFEwB1}8?_aYAn+yEc?=oVx^%G<2`zvS%JES6 zLmq=tf(c-l5EjzUA)4L*#MTLYDV(7*;{Ko|*M0+N5GV-c9=%ZHuEPb3xPKKOf+-eW zd~$Rym&8c8^~UEC@)}&E$;33;;oIi=7tt5gDCh#GDHpg$SFbqx|Y|#Nhm1W+L)}5$QoYQ>dexbUA23p7*7Zs$)?8PB2XhT6#ZjPEZkZxCWFl zypyWG1ZZLhWWdvstbjWBgpG!L%iYGUZ2hcDh&+G5gnZ7a02l3|G-@j)#2=0B)XH*L zfdHL3<~ZgA@`KQRM1Fvc;)N5=_aY!^G^VO0aLT4IIjo!e^ zF{+-V6&9;kNfozkwy54g+n)#Gx9ECm_LB`yyn$tSySjICnN0DMprscYShgAjZwabB z#fncgpF_JrsY@;N>FH9<;$%94nxg7wT%V-pQ?=jctPeNe-rsXHRzh0v7iS%3DEm1%DK!p`(gBeS4+1+ff0D1y*KrPY1`dCU?~f$;<|+-$cbTkmT+)sdtf9@ zuI2S}5wO*?es47%4)h!}Q8MRjskwfBgE$z5c`?aCWE3o0v%mk1tP`b&d~FjDOKE+fPl{b*GZ&DO?mR2?Ae3HwbL5B9eNI(8p3x3L{_)a8fKwk z(2BnY4NyJjCwlk%E^CHvD?@@@*MaLJaI)!+>7Kg))2;sZ1%a3S2~yc(k@|i%>vonQ zfU?Zx&$cD<9Ci^zD8n&``&+w}l{m7*ElOnn9xp>fm%~^r0#ez%1HZTO)(^3%*w6|3 zcC?V{NgV9+`7NC=Ae#c4Dg$K6C4BTh4s%KmzTa|8W`sw~`$%dD0aZ-hg9vaCs>kAr z<^AT$c6_c4jHIxYiCnB5yJLTBOMIqs|CF;^CYeqqSz(9%%91Lac!PM2?*AcEtEF%&k7K@K#-q$71q1}%Q*Y_hPcVEP{Ylh|W7P0` z-W-2WDer~IcCDT?uoN5&_x9_1#@xn!Wtv9dYx=J35n& za4w^1wThtVEsm$vB7PF0*2#Tx$J;V!7hT#Du$T3A8xm$)m@bkWvD!VC;py0cPlB64 zT+(_(63dEBZE`&z%M54otgKz9$Tz}i5rdvg_%#eN39+YJdZ{z!t>;<)m?+JK$RpZ4 z8Sp!-K#%*c!9+3q+eA&NhC&U8(g~|1LJ=nCNx$Zd{UX9$=ePgsbA*K!BZZPb1ip;G zv>vB}f7zbF^6MG`^$h?@+{d?f z2D02|R3(_{Bssh2@YW@MlZNTK-R0v;gBj9*9Rwg~xLS}C+|v-EAr(X>Y+`SdSy z!IQ}v7cOEHHAs+q5uQ-_ot}ToN(B9`MDhDrl=!nFN})+B4(dQm zB_5acWu2j&w^c_?oijNZ^jq&oe1qUk=+cvUJNZ2aK|yXsM{&aZnQ|BCFaeT<5QeU! z{X2e9v#)ig;8iUKDw@y}i|#yKq%L1X+8=QxvXQVgBRkrGz{r{;ZiDvT27dZ1(&rT3 z3X^m8x|IMCIFKWEaS>Pn{EtMuUg9qv=nYN-gxCy$k8r{l@_1a=l7TkH*-!IGFm6p; zbhRTEK9hm|`vVq(C*b%HYdkGKq)S@{8UHR&!JWZZw*aab;xn7NR+^WB$dWetkbrlF z%FGl|a|t0y$!D$J0q@~0_x-iPnL*%(41D39bAX0OfT`}mAX9Bd-w3c&1jN^;c}mBi zdCcd*H@dXKT!XPLnmKaOr8pp9m7DQ5;~<;wsY`g4BWK(SZ_NM!{DLCLl&r)AHD(3A z@G%->e%Y*xWL+W1FqUZC$vPa?T0RKxh3u)(P8EUl6Zl6KI)o$xnLfiy>L#szO)JkGHR#~tz>BMdbM-b6eTP~XP~q$3&HA6~k-*qt>@J#}uhd^{U%VXrvK{_;itkNTaty z)7M9w_vM8;Q%Rr|r|V`*>jAHjL=rADH)3+0Jn*=o#Us zrLCO;c?t~>dHBI{%jR(d-u>99xcKydHc1JjK3FUkQ=4)qe6(VQ-X{K8p-~iCB4p^& zu@~GpX>h&JL@_-Qwrg!h(g>k5i(m!rfNydEVcutL>E!C&pX-Nbhi_Fa#0b^7#Oc0wI)>Img-^XPh?zpX-LN2dxUd>Fya|ly3`yOE?YD5~BN?Knsp@y@9K2tb zsbbmgjgT2SV>oHwm?9&^FW8*&UgB_=EY#?9XykoI;7gY!Tz%LdViUgQf&>^0KlsJ8 z2v6_ZCz(N-fluLN&~_rsfE_UvvEC0m9~X#GXLkC@i7Ia$mx z3(GswGg&)Po(fqFcV0GtieAEblAELaJ*2jdyy^_wz^2PvFea>Xx2<{o!dj$5?iu_)u{VnEnxJS z@d{BZbZg44=(s9x#osVLHqg+}7x3nkw~m2S30iFG3b5c4L$a+6saX5Tth>E3CsYzJ zN-{Prw@7eb7i1Ju%#OL;())Sw8641=TL*c|B?ve!zaPWFOj&mvT+Lo?_QCFx1NE+& zx3Ic;6?lr@J4>(*j2MoMPuKa!DleNU687IZe14HOWz{&B<1-)Z&AMG~8b0%6J+^`Q zi~f#S-Pl`z$9%i-5**}CWA(qpIxE1VE;-S-?(D-&JZW#Ddm4UQ6O!r=mcL@!fVy?v z4%u9;IWP>o-FJSK!aT?Q0pt)!Ixi}5IBvv_na?Mu`SzJXP%qsi%x)-8fS^Im3xx9I zr7wq7sqhs_Fm!6QUEBS(;&~XrIo|x;rO_rBhyidIL2Wly`}}(k1Q`l*8k_v{rd8`Y z<|DMjU;(CcEShrE59_v04d$W#S=vj1@vBPhbTjxOepRzZxsZvr(<61gUv0SNlh1ZI zu?>p7-PR}qLOaL>Q%_0pkoQ|R1~`?^_sjP_&_`-FsyI0un{vL9KHt#r4&nE`)DGh9 zR^sJ34|`Ku5AFy*w4y{guQ3j6aOY_a68vv7?ljY8_B{s|1s-NyFg2h&b5&usV-PB^ zr~u+dSy)ecZP#srYBvrF=Oi*VHWZ;GZYh&|MX=y$#|m*gY3Zkj3L?qy@YNY+(UC_?K{{fiHL2xSp!puQXLq?}Y3)LqlY zNluuG@Y8VvV`7kb>OlTvfWDd?olZ|N4i6c7l^69k_5GwZM__HyDz9H%v{HiUDs|5m zKRn{QhB$BVc!XAfgrOez0mwb`mVgDZ2U>>Qu6 zI2^2=yKK1faKKVZSJ-HXqBWfM2d4cFaP3x#58M^MMzIGQEZ5J#(;7#^ zy?4~Eloy5^6*6v=$S_@G8F;5z*PfNrbf&y??UKiA+O503Em7n+iggtKom!nbSVxab zJohByxGjIq%glc&K=aY^;^v_uSnJBh6p_RPV)iNhUt-IgL3dkh^_V(hqqN3|^ z|23-9NTQ*6-dMIKM$Vb`r#Vy_xlhaErmumY`ACOq@^%l){*V{@GTWY~phbk}tkRs? zXM#%cts-BI`J{tp2~l3UBo$JzSM!#Z%iALu4Qcy$m2FpA)oB&cfeUY+xc((}5YHM- zOW!o?S~GYd;BQ#yRS@`OCDZA|Xvm>$3 z%3UQgC&V>{!8I;8H}P?QP8f=fv6@bg>Q)epL%%C8*dFiP4XK+pP6c*aDcjtG!jQMj z#))k+MYf3&V|+Rt6MDg?u5N1K?X(zbxh+iP+LACw{HM+4=ZiG@Nbd>S++mkP6;t>1=DH~&4d zh8Pj_05ReV{UQW0VuH&5{6)|sR&Za-N7;z0WWlk_?a`vq|Ni_Taq}XWNmn_I@nqZt z!SZ_PYga~sZ7kB7gw7F_W0eU-0aLwnb93{Anj4vBh}_6dEkwfo%ZQJ_9*o z%7*S4_xxkI8qzi+&re%(JOG=>#KrU&@pP=k+DUt}Dm_cOw>|T{zNCp}L{6bPy}kIOgE1MUy#;3#!)>?o|q!11tH`S5)(sQ8sk^5h%&Y$fEXjG2wc=Gvc-s)wLryG48!-ppgdT| z{12>=76%mHh%o*2r@br)uVS~+T!mcMMqY6t8HAX@90|ZWNVXCRjg>_DEVt;CkFcLo za38!sZPbqztA+@$RwFdCOWX!n+rHpw%UfIx?rOfw+3biv@DPi;>qF5I zwx*+xq<#d!5b6ae+-vd_K9huE4RN&2PnCrCXXz;38r~dp#7{X_<1?tG zOxhcbM_`8SGBE}5IL+OL;>%;B1L2)P^@2pD>Whv=2W|YK^x}~vh47nOD|iJ zSfIdhxqP1b^agtL70u)$g*%iub3uFZ3m;2_m_O7 ziwoHX_}kz-T;TH}iT^-g|2x>D=eaL}B2}CHEsuWwi4yN6s^sa~-w_t<_f1!T53$I)>AfUh zlk=a=1d7ARKdFDB;1FA{(*OzyB=k?{pD0Cs{t4qGIPov)On<;1qP?lvc`u)Vj@RC1^?eYmNQB;x#3&cN}M&V_xE|oxEA@IqKNpTfi8SLVyO>`Etzr7U- zA$N@$fzEs#*hF@p| zhTDT=6X}uM&o;8dcMi7ab$Xac~*g4a5#*XMB7fiY%v`vq-@y z=My^n#Cg!Quc1NhK*`-7km_reKjW4M&>lify%qR==hj>wPoV9x{_Dh_%Gl8?jow!T zo9n+j3b&yF?BF70SB-KjDkn(favwwij|3;Jg*nU*=J1Mn=cx<|;Hps#2R{`VUxy#N zV7BP(17}YbyQ>=fxLc$oR7*8JoN=SVaXUMa5_J5H;M%tCMXgy3nuZ))WPWmPKZT~j z-bZ1c_B1o22D{BiP8&s+!7kgfLp7(J2#zyZ>wy2A@rz19>P^C6nxvA{He5qunawD{`Wr_)s9jbIzoI+UrhDIN0tSR`$wB8j3AzJwqd z)5MOo$hoLnipQv?0cVPF5q+g#brwj0nqax@NXq%b#-EU$1e6mdQPkK_eW(ff45g4% zOksBIx4?2*31s%`_U}6jNf>6`cNCaPWKOlEE9WZ;>~PYoEobbF%#b(Tzi_0jtr$(C z?D5P$MM$Me2(MRLI79BBqeMoy>c-0tOe_N0AT6lcvOaw%f)@vy^>Nl>e$a*G1?d9T zO8C5HsR%O9CEMzg4uTs$^5X>U7hKvhu0{ETEesYhC-VpfuP{Kb862faeZMVA_Q`uD z5@$*@r*0&Ue4I)1`7#D%eU;S!^(suwcP+5BjQ0coKGcBmA_93~p-J&|pm5Q3(voxq z2ea98)3|9?3x%LAHj*-tnKHJ!64E5bXuWq$#VzQ#`*>`3Ovn@pdxJrZ_CdRBr86d`gIL163h$ESQ~sz^R|i2rO2rG90S;pV42= zU4)W?l1*A`KaVi_F=%pz3rHOPf`P{8U>FMfJ`>&+=Bo3~&-odHD61kWDyW*RT~W<~ zs20P_QaH8!S|VZny3AhQidypRUydTetBusDU?U9oX88z1Fdqa~KX8OXkcY!&lKlv1 z8!Z`AG6aO7w9$V%|MLCK1(k!sKh=i7EK(4jfgob35iaRnv?X^skt?qP2+Ya zW(te*{(WbIV#)FeHwYrc%SB&@3^sxw-Wd%x-9v`^w=Bg1gKrr^ehiH6%YE`0oALPo z#-5yYQdlM^r*aKcpug%foweWEB-HK9X}{J2Y~Lm{Cj$LgNt#n#;mTqJs#f@BD-Z5x;E^oNgixL>Fs41*0Hdag{D z;YTU9RcuQrt=l4+oDA9hx19y)cxc$+*A8>FBJMaHg0};D5=p$Y?;}IE0lUWZi)jp& z1rDOa2r={4-XO{?TtpG|m9A_6Oc>M;lkWib1m9R&%p!i;2EIt3_3NR994PumAB{{p zR-mwWOrDXJy;CTXF-zx=E;=(eP}kEq!z;1-L{3^*Ypl;L_$eVC;>Eu@iLj*pQC zgKRM;gV;R|XADgF8Vluf7qiWBpg;;7g`nRF20mOusl9qbyGUO2u1m6J7e%=`LZek$ z9UfM*%X_YOg)e#@pgd2LXi^Ot9Dl*&VH7N$ZF2%MaVQWG)eLLlK%dRk{VRQ~l^7hx zB0uM}jB3SQRU6SQCql>K`nyI?zvTcc9qM8|Kd9p)yDDm;GTV@1Hr{hC0p`D?^?{G6 zAu7v-8?yDR!5P;Zv%$^V9{C=v?$kasKuL@cU=BaV!qSp8jLHJd$kTk2KKlk9_bBtx zb|G4R7&5ojAj|Zrk2nv!QtS{IhZ<-?lBD*!hO!#xmUo@bVdk@tA*ZWGDsrH(t!iRh zJ$A0?+CI7N?ChkF+_H#&a`q1UbmyjWza77W-H9gnZsu(_mt5!delg75)!~LB;+DM+ z4oEi>YB>L~rvt!YCjABpACsv+3vC!%I|5AMRk0+8{JN*fo?@3*2LKJmQ_^y@q5QJi zFL+<_`iQ{gH3J^5xQL2qA_b@>#s2ePFtnS%YU~KyPYBA1B#(2b+n+ zGP|YaC~!KUwgoybU|`g`)uf%XvFxHb=LGHPQ=OkC#pA`@PWeHa%=!=M-Ly2sA=1r{ zWeDyl>yKlQQ9{;@sm{6zejKWXaAy0(|81OA5 z`{Fe5)!0ChSSNA=#TkJ1`_nmg_u<8^_l)1I2-C>c695>P-+k~!8&`NI4tqNoKltt zUiMjV97W($yEkdB>9k-xQk9zPFIA#Ai`J9~A@RN=L)t}sTk)kfGidBvi zcnZP$TzVB(rO*K+RDuJQa!!UWIvOii9bs{8hu8Aci9o$?MV7@VhJ+Z$e)THjj z@;k-i_qvpNeFmb#?J$7$~ z(8d4SuvE1c+`ImN-a*k|&7E(uw(r$GVs*0A! zB{B+I?&Uzm=uBVK&KjDSxC)tFZb0!X=AeY~c)Dm`;{&#!GZK^QC7Z~FYb$j*4l!lS zu^-v}ULRr6!mJdLVHUr~>{7yzX{>p^_*v75j?{VZi4Lln>z`526ISnGJP>sYptDTi z1^^mDgmHFXyR#n3{Vd-YNuz4HnoI9M)h0_}Ex#jbfiQ)|d%ygm0A~IYfh_HX{%U23XxcaR^Oi-{N=Io=g;`7z) zRQdb{xz5Lv$q9QzgEX9Yu83x`Al`Qk&}@M&)O9V!>BB)PE-e&b$iy9+sy4!W+q{FN z-Y>||i3rr|8Z(w)B(L5vb&ytEC0>SC=cGZWQ)))3n`ZFUSmc36gREabK?MP1`ku-V z8m>ebVmx?l45}k-6J*QhBhMTyrN{f;2ye%}T%?9dCFM*T4I(Vz7| z+~BbOSJ(fp|!NgrQWQVY7wDEU>t3!Ah zD5+`SVA#tggD~}^+`FC9(aIRcml}QTyz*JCg;~WA^brLDv~S3SlN*D_bBa*bjP}>z zHy7kIa(P7#yg4q-zW9`8b9y)YtC~EijM*2g(RvZ{+$0m|9$}+wCizO_CXnPpsp4JI zUinMN(ksK+nQ;!3S(%iP2-2Gaeg|KPP6jbpPY~b>!vk2U#fe>WuLa?X&)WMRXKD8X zRokDiQ$=~aEmX`eRM^e&y=nPD&bcr7c|Kxf1-&9%^71h>U4RsifCHK_Xp^s)p^2la zktLo_iM0;nHsq24PZ0aV66KUpy^&(p`I0N|_TsbuO1u0k4(9)%S)jXXW*Z>g9KogW zhKw(Wc9H*%r4j!%OM~)&bJ;U600h9fjK}LBSz32ltBMo|KJX{`B&n7EO4L971W7y= ztCRx+VV8iZ8ppbYR$N(OZO?)^SXE)q(-G+p$bYMqoRC#lJv5>+20 zO!gPx?lR$BftX+kqFQwGx2&Vw#c;`nz^$=7HBCr*9`~z zfyz_)ae!&rS5PoqIJ9j0xuD+0_;nm7eelyQ_qYX}{Tc#SE71^qBI}y+pMB1{7G^6A znShmHddtGJ(bfpcXmN@)vl0cML7R9-ieHQuZCjhjhaaRT5rd(oZ-w@r9y%}bXfp2>(XV2_^Fg{l~ zavAS~l?vm%JwlKrSD>HU7Wo$~>SU}B2CJj0l~bvk1?KC6&P>{mZ@eqL+Cyq(eBun) z1qK-Hdt@9-n{+aV-^=Be7K=xWYjeAVJ4Q~(c2*S~yM1L_vOMJKTu6LM8xF7{nIN2jb5HK+Cky${s>G9Cuk_+o=rTJO@5Zl=%RuhJtm zxROG8)PCZG8y$*g-{9jY@FZm@%;YTXM^CX@=X}H|s~GY8dh)U(@J#8`bR$^Wk_I>E zRYp~{x_amNYc_#N3t55{a0rS7hz}|aSYv{s*x7~p#WJ~&%eWcF60&^2KU$;_#lwpi;x z+}x)}9{_xqJOOx4z(Zgrh1UNX(9t>{_xS!y;Csnwd~gYSBM9Q4;_V$+p?_XBY770y zNJ8e!%EK77F7eI~NBB25)dA8n_7EH~)uCb?Bp9moJi-eQPLXXA5UU~w+y}GVrPLZ$ zCcH^w`JARlFx3R$(-A7`IyNNtC&AO+VS4KIfR6F(3##>DsZqJp0~7iwPWv;7enCX9 zgH<581PKVsusrZhAI$-!vIXG>zetGaN10p$B7-VwZ{5RmYy__HC-r+OtL&2Us157uIg)gsZk^q?!`uV}gRRuYPD!z9c~bxOa+lEqNs4 z_vJ1`0~ay7H3ofz#^U*56XYH2RtDkT_uFSrHj?7~-2*}_BSPN~Tl1uiL%y1dD9f#B zdw!erD*6EHzmUR&(TXT75FQK!ruu6*F1XNa zEjEn>JN_}*+wT)*I+nQf2(7#NnM`tM>qhPlk=s=<%`2V&!PO=onZg(EAQyx~=%9o< zpZa?yAAu9>$(wr*<5qKE;6B08>an|SkymolKxJ-yzO}bM?!$YHv}NIka3~b+@XyKw+pixpq6-^9{ERt9?9LxZJY!luVzZVd4Zr2_m220BW#GI)&dv|Etsl$w z`8-qqn`kn{xkeGXZ;xbFxI9j8zI->>uwsOsykKKKBH~=Wq4IGI9gr!&SPBW=-4@n? zNLr&r%_?4dMGwC=PR!ITR5@zeYLAYPZN;YZwy$o6E#Y)^MnS#shSdAo%DdwC@Agm2Bb5ZyzklUM0?4 z96a`OW518o?23;fF_qLWL5q> zWi{-k1Bew!Ui+vLeiib>`B!x~(OQn>i%n(`A(%91GzPk}(vH!<=aOiWg@(7jz05vM zCQf8Pgk6ykt$Q6Q2tj1|&3@NCboCK{@D|5$u86$ci&oK`n5PfU1VQcxG179FdYG~@ zIsmed&4=TAlrD+u+HsJT5!~<1Fyp|4GClBKMRq!f4FGA=2$Z0Me2$ ze+_|7@10gl0<;>{d2w0LqI?;+MYJi^kJ>NYW6eP*AJ&4DaFy@Z^3xqP?PV3eTqp}j z7DkS^0PCj$Kl2%dvLUoC^1188?XVpIX1mgb;Ah}onBmX=Dh;KF6*M;UV^2gLuP0Mz zshC@w#Jp*{E8$d-aY}o4wG<;2Lah@io@z6eVTim-* zJ!tX3`;snJtU)T_*KMt%X5`WETam%BalcZPeFPCB>Mc_tslYOJSi*PCvuD%vTJr>v zx!~cN68iiSQS~G(*ZIw*vRZ{0H@Nm)%kw4HLmn6ddNwU6s7zaE)Ka2Usos7nuZ^tG zD#+#fAObAqYDnJct09_yF6I2rkZ9ju`jx0OFKxN+8Hx1m=!D294Cb{|^m1%(ffTP+ zEZe5NtC#$&X1G@NCNtO|#96K0c4!PMiH#pfJe6j;Tgya!@X!J0(Eg*{JQ7O|F%y%o z<*J&a%QP?OMzSjeNCR@Z!+{EnUi>UQUFFg$H}nwGFTkNjw0RpNHxg{EY>dpnP^roC z_54^}dRo&mh=N5PaP^{KhF^nTUdI;a)8@2Iez$9=TMj_}ei+ZeK3cnt_2M&~ z%eWwVGS|!3sM9ob{1^^aIPyVGF*}kagn05t^NPBWAYE$nUB^LGrDKSy7<=We0zh^p z0L-7~u>8-&5bEx+@z2=1G;236qUj~#_sqh^X6W-};wulqTds-VL@X2=t2p)8$^Uh|`g1^L%3C z*Dn7p`I7tKX*WZpU_?<3Z zm_@3(o5b%nQGt7@n*}`4VSN(a)xJyL=r1xG*onSc(zhr}LjBp1NT+KCZK=pYzk5Dk zV__hTo4OgbFSjYwyP?U1U7T6v$(vnOXt<2q#*|cYYvNeI^=EM$kS$6;+~d+u{01`t>HPh z+-Y2Q_BxVv%iRmPW4e`z&wN^yt6q%f%c7%Px$p~`8rH37hrggw9{oY1#=LV$kyIrq zd%mZLq{%Q=({$EH(UGcUkhRGzo-lzc00rkZHC7Gd89_=53G?8z%Guf;S`y#gsThr= ze`8C96Tculip7cOo1$MfnF2USD8g-FQ+n{>Rm&dWVOd--&)m_gxl}7YcB-vJf+f=? z8?Je*@O=Fb>gO6sUQIbJQ0QRi2^l9K5ikKcA&56T!kmp-rOA6&NaEW^BjTTR3?NTP z9cTZ`J%hB+KT@3KmsyYt+{|n8AnwPlsaRHM_yldH?!(vMwhnD!=@Zth13%mw{=b9c z=i@t@PT(RO#mm6tR(yUV?V?v7^`-pQ2H=SsZ>&Q6jUpdXwYTj%q}xRB^dIi)u9H1S zB`b|GXdOo5scq1wA`&&`tw+q>HUk^||An#n7uAf!0S@ZlR?RSv*A&xp8PD+@?k>+V z8oczY!1;WyG{ZMcuwKUIHRcy!Y>XFrCvI%KF$QxZUOd0R6;~WvOXA41nNk0N17NHD zDhl0;i*V(qj=48%`K3rUI1{?&)0DN;-h~xIeZmoxLW^dx(egO1=S&xL;#J_8nVvif z7wh-o_*Px#GRx!oBmEA_>4%U0O|Z0?v9^P^I;1FbMoiwoh z`ej=n;`YD?GFcpno1S~AlIV|Ep3nBrpKyEc9tn+zz_LgJkpqBFT1oaVEkXyA?nhJC zm7gPDAhzmL%f>h`b`Adpe&w+N@q_#IQX_Ww?F|I|>FOGRaAEa3ovi_ZL+p_lLDf~> zr@3tds1F1h9hKMyQ?2U?f0w?QtrCmtI8Rln!_tbIUkpY4d~k`Nap|>BUg=>|+IBrp z9&zipmpwFL_p1~j1gdpV0BzKG5d8l1v|T86%S*!2Y2>bNya;i6Uu z3ymh2H{7VR#u)suFQ#5IyRhEQK$ZQZ=Vxpo1Q0vOnEIKk7G06Xwm;qAczVNM&9Tw} zrZI()SG0&Sk+HGDaJMP3PmoMAT$PYGc*l&1e%?x2-Th9>5TGF;e_Qe0X`S>)Gmb=Q z-b_zYazRsMsUf!0!x_;s99YwWAOjcU=q=9FMGG02o%U9nX-X=xV+yWtkW2uahESa+ z1;lDe4is0Q7d%gdGNAcdo_2BcFE{D77pQK$yjJ1BD{0|5tg}AUQ!Nqzl%S?!`UUDa zYLeZ^hAfWqD8JdZL^~?En+)z_RF1gbNCL9vbX{eTMAujf0p5cPJLg*{MY}+hrK}L? zfa-qFORjmP0U~`315zglVA5&(fY}NXEycZ7sF4F`n!>UA`Yzu&fPsUU`514ZC#GX(#5{iyR!9`O3 zbfu30f8;l8ggd?kBo*`64kg-LS>?AU-_wa@y7124puWjUYRYQ4polfo*UXmIYZ&%>!v&L`GluEu`RkmQ zYKH`xBF>GThNM;LH(g1|EC<-mZvrv2kb42=I;#|zn2EudVTYc$v0=b}dswpUu zJ{_HWen&)WWgW3^(4Cl`#NC&uR6)2LJ+e4E!yTd?HuQXqKu4o_FIwhJI%p5$ynY32 zk3Jc|uwDHGFP$mrsZ%a^&HQr@Y(P!0S@qD13b0oMixL0X(W@V2K2) zmJ8!*07OyJ=mx1cVbm#9=zh(CIt8YnKktWua$)v53&%k{el9Xwz%^qgoJ=+wDSJJ) z+66AskKdJ;%Abafutae{JffoYH-jG#Ld{@0Ic}8;YY((p5ri*eloO0LD6IAli!;xL zX^TOsL0Fq^$%xIMgJx9R)oque7dONXD;s72u5TE) z%M%*E^(j6ftG;b&6$54;qjOX}+|%Uv(O|uC1(k@<33g?84B6KZc*Zcl0!(Hc%cUg( zV;**2n7>HH19>N&+KOo=^-63a#daW_d#K7U_*VWHNwM$e%$-yinwB9#vkTgWHo`UX zY5THzH=mRk6InxB$-&vxbnR>Kd%D~E%T}KN2O_nh!sT!b7U4}X0*-3(37s>zSIi|? z(m}kg+Avoj@B;^0kB2Do&ga5UhYv|og}PK4KDbB@HE4Rj0|lfg2JJN$Qz9u#;sMJd z>}yAb!-LbFf0tRl(r|Qe_mM-7t>`d!c7%GapBi5t=}RDsh)+BK6T;Ur;kdyyKvY$Gt2<+%5o0i>e_C<>?Ko*QH z+tZsk;IR`9tk;t*X$#aSIAY|VdPh*!*arjytPHu1t%Q6;wFE}TAoQ#f1QzI&fX-~~ z$H_S0@e7jPL;8Gy#}uCOo%axyS0LfoECv*pr}W{)B_(F}sZ6-2rS6wW_|9w)fQy1N z0fpdgd$rlKJ)>ZGdqk_^?hg#Y$ALAZ7WnK!6YfpqT+o z>Nd1Uq7|oXICBnsQbwh>PtRwfTBke*Z!mxNNku+D@AG43YMhYOTXhBaZ)!^Um4P#( z`2g(6F#9FK1zqat?@l9@lv!+&l~kG{c3(i6@s!>3n1hM^4#oo<)_^iOKO4IL;$_V}WoPOqZzoZ; z5f4-yAi0)zAl0uATcd`fbrmK`nJa;hFpI5;oTs@a;r@e-%~<8AppZ zuUU9$=e;kyFUkUv#hPFSLTc@pe&Fq8Szb|m*(OC9eLX02d>34$ihx!VVD-n%=Hc9P ze7n>)kOFx>v*BN{rW7s~EJoVtefQZrBVi0BX~KtcJ)AN&n=NFairzqt83Qxyxd5ON>8H2}a&K4+IWt~aV4$vR<&-0=Pb z0!}mSQ*2?dJcF-m7&J>w$hb68?Kfp4T)J}y&Eb#&_xyaZ+4UK91NM@ze^4FB$z5&z zw`e6Vmeq2*`&e;#jagN-xohmjP33C3K;*ZL3zMk{1h7)j@U9~97c;<0Fbr&hz%2+D?~ zaDM<;xiJTA(F_`%O9)n{1fDWA_HV{Gkw)GAl!@0uMVb*r$}FOFstZ-g*;l1pl@0P9 z^vX&u6wovcGSI|~jWuRG^`@s)WVBlaiH7A2VoZy*x2s@HfcKHX%7o_X29OODq}Qp^ z(4vNoD7$pil7pPKy;69|)aT(ys!m+!Q7jrhoDw{S&rRKOEQvWi;BT@O;2o`c2jW@2 zqlw4hN47+>)x*QqwacmHCM`J7%qI}?izWlaMYEJ6Qi;@OjsSTYzgHPhwHLblyR&!9 zGn1e8xhD>RrvE@*63j@Zq^N3_pd#Q-TclIuEq66B%I7-vJFvSQfBcoW+lRuuD{l4= zWs@BaY@8r!x=Fq7$O|p-(?anIP??J32!+w#6cG|6TmvE@p!tHEX!Gn!o>q#|w+t_*_`mx^sN2W;Z5B44O#SH zkwTvU%P5KymG(FO5xPS+DBLg&FMCk)com&9prRv2nF|=^vbMyzrMxs zOzA6>YH#@~Eb z-`BNM7fZ-cJlZmqBl1%7pBNk+XH8VH*YPfF@%1|E*QOW6P5$AgxQc?6Pt7rO6BBx9uf4L7%b+v;Hv(RhhiU;Bo_$iUOG0}Q^u0#PS&c0m> zRP09IlsWOTGXgbCEQ*Km=A0N&IkS=Pv3$s-)0FP-jzvFeFl{&rjI%WRP z{{Y46TP>u~{z%e(U11^yS7ak~x&b~8x=QOZoDspT82QCE7uKJzBvP0)Az$UOCd2Ke z60H(^VjIRboUTad;iW#DA@ujVJHIazB^>N{T7*5*(zI&<5P-Y~N&F%?)8P5x#v@CB z|KOt^oFZZwzux3hyF4j|Ds|_dhzxN#XDHCDmLS6-#4j)lT;UU%f-t$f>K*O?l)(Mj z7+AgPNAH9Jt!&|NuhFRKezWd3(7kC~>%p)KQ2Y;%C?Pt)FclhSZke0hJrLSl_6NnA z9D&I8z=4J?4q%kk1@8i*gfTwAY=a9Zu(Y6&u@&%!Dx}97X}%2_$>xw#Am>|z+B~L_ z*udIvmlI}E33?uB32>#)wq<)cWbI6buT`WCH$dJ=0oW?$cRs}i8V90T2*~UhkQu{4 z#sS2ampuYG9dFa%GDIg2vH`1>js;u;xr(rYrF3c|2gtV+Ni=xLs2vft89~Iht+4bb zPBZtb>3sT~w*)1X=!jJD;qT^W7VJ_qGu@l8boUs6Y?mLyx705<3Ip31n=^W z(f^?k?_YqSQGiSSZB*ErnkaBJ#BnfK`&E-b9smNFzfj>12=O*Vw5YW-a%!Q;j*+ow;POU!oSALDdnlZQR&Vv0GG^B z6IGrH)K+K`e*)8kIr~*KkO37JYYl*5_bQZ5qhNkH9q4L)GvmXkh;S%2+~HY=7aD-H z8lMNbax)oNTCoLeh-IgF==%4Q|A|cw79fTdCPMA{y$=_9Xi>=LhuqK@$AE_v)(?)M zsE|sU-kFi7&)Q9XWKnn>4_ivj~<4=V0hvRf}E@Qoo6-lindneo8N($!#-D>g#;VMkm8DRZ>fNhNf3 z02_oIH-QGv|0bk0g#9}~{69Ls%m}Ml)E`M=zu2$~ASAe5EsLf;2(&`*H}q=V7$_U8y&8kq_ZIe#I%t2Wo+!}Z4azQW zl$j}Wt~G1!Bj{(xMq$U_YM)1WzqUrM*mh)d4aPVfOxEAllEAvzFMCJb2sDF3McNDn ziSGg}yvp#nL8`P6s>cjYokQqNtQmWg#X|NtCpu|Hnm+4@6jBuy-02=bkRIF|VfK(BH#_&k=u9O2u_GU zAhi`u1joeX)Ka_8Xwpdc4j{tUG05+89BDIqA}oU+A}Gc&N|nSb=UWL1z=#b){h`!!HVpDxs1!O{r0%0Mfy$qC0ht${wUl;W z748A+s~!Rdl{qppg4I&V5j)iDg}xT>;nl9%8;6m_6k#i%GznKv$K zDL$qGNPQIT6Fix4<{QKW@oXUm{uep~*W3UfaxXqaqikJG4lb9F1P+$D390?Y#7!A2 z+;hpkzZ5nDa3ZZq;JnbSHgV#OiIf>e^!eARgj6 zT!3gnjG=`OV_pWMl*vlQNW*bx4M(y*AhHqyFtlH*ord7wk88{Se-Z%011RU;#)|hh z_kwe@cMYs)#ytM_A3WeG{>KdBO!i2;mZ_(i;ioqwX72~N(M6n1=M^RydNKb(iv|+q z{S0+9&f?D=-mZZi;ffhq8I!fCu@1y2C>EVI+0w$zOO{Z&A+VON$Qxk9DIXxuV5LlX zIS^UV=c_?|w}Z6#W`@?%dmj)MZqGZ}RPZF|9U))#XK0Cjdwwh}VqVI^ss}FaNQYDt zkbOnYqGUYi^`v_7%|jMeOnLI1-Up$Tvl&|R>YBm8p3iNbMww_&gj6I|L_R*eyrB*9e%JF3nNe81t zLQ2;DSNoP3y9upPzR@WPvW7op(_}fNhg=d<}|8F=%GFiMPh+O(^NklH&uTq4` zl$T+rD}X~ZV!$B++$i!GwF3^ZWg6W6TJj5R*Hn+bCvd9*FM)qx>!z1S-8LOQFB9_N61#OsK_1NbpT1$p+twZOm3^3X=I2fv9Bg~1L8&)4X0Me;&8 zutqjLUjLC_4pR-x4SpjC_{<9a={3kO)4B$*xa9E3^+7*z9bI=3%QAExINAbQ^m{1a z5q+ZVoLGqrF7P`z9;}{#-y`gFg$EP(KyeUC zi8loRJ7!Bhb{V%Esi!A=xlB{M!1W^WRZ80MSu*mrK>E4Lsl7r=d!yMmmEv>)#1$3?ls&I61~Cq5WXRY>u0KgB4>vEGw~< zqNk|K^1=ZW45>c743=^`A*%-4hgF%{oH=8kw6s@$$){3;t zR#DotX+@5Y!bZgNBmfa%QLkM16rSIDybLOluI(3nCCNVuS!Wd6PHA0~)_X zuyMjL(2Yn1m_zVAs8}iu&UI3{OG1QP7)+=@iQ?!SSBkSQNhD?~NJxYeIRxrV#tI35 zHuMMF20)NpAit0bm`cE@#mjsdWB{%G=-6Nd3M9sZ;(R0A;J$!Dlo7d7PH-p@tB6NN zz=aW9Ejr=xuzZA;JEX|s{)0P=bA>|UxM5&HBM~^16HLnX1MHhKK@&pZ`ttB1AZl}x zD&$TqlmrwsBb@mRlopt<6e4;Y#|=$Xz(E(ZFrG||5&@;4OJFQP?W)m!8(qzc)v)C_ zU$`4mqejuWa5Xs37fu8H2@qs|Hxvo9Q=kyg@iYXegeT+C{-BKo4CC$>=nDi@?%Ewi zE#ZsV+TFmJ=jtbyg;N970=imA$AVCbk8_ftk@9#Vf*TKI2J;m{InH0>3I-C%QTdDM z+yIt>?2ZuNq+%y3#Dzr(kASLKIHnvP1k=J=u681F;eg}w3#8)&IJ&clj}M?p!$7Gr z)hRZ@7vbs-b#?QlFe2O`;dmDn*z%cpCx0GF3Qhq9hHe1}8It55>@UDm)leEt%woAa zG2vjpM2LiR1=w|+2{1QEoRq+Y`zoPwH)p0$8XwPgA|ZeQk$z5Gs1ux^WCWqy*kU?G zgmQt%IqF~yUCN7%=S%rQ7vQ!S;ToJvAfAZzgQ0{0ZnO{?PDu~IILQfO5=Nv9R0VO} z;?)QxK}N&CoT#+Pv5`_-oq-QVYFKEf8{F^zE-oa<#0-`knB{*T8=|0msV_Me%7aAk zBzQ4scteH%S8NDnGbfvHrYZ`^9pD5bl86jCbP_I4+^#KtD(2 zk+{JuE}t4EqmvnuFlPcD;0r(*v1BB+wpP;*(0FL9uRNJSkA)!WM#J zU5ONpqPoZ@OAo<4!6Sq`p@beRhfo4E5EU#01oF)_l zkphV%*Y1yEjK3Td_+fpCPI8WR8)e4}p>xb7RMYSA|D0SvWZk?H?Kx z<|05Su@sU(h~^Q312wT!q6i<4QPD*H6dH@KRs!9uh5;i61XJ+-5CRn&Msorr4aojr zcyNvsOXYIZSO_{ofDFKpad9vh1>-~|If>D%&^TW@j-k@v2ylTyLYFA~gCL;#1K~_l zlOt5F3}++>>k11Zg>zUuxW6BY7cYaNwZKO%B3~9>!3YN8ns6S39PSzy zK}1Q_E;K3{lqkCd1VhL?1Xu1NC&9zy5_hpej1w!cyjZ9(93~fvQO+m^ok3!|#N&a6 zNgCwpFPG8$8N6^eDbx>$N)T#dkUJ6VN+6aFk-BlzP$ik-PlhPa;UpXagTw{%ID%ND zXp-QPGDG-EC?57^IYRt z8ea&7#AQ*C7!A&k2Ze6|Qaqv=|C^2kq-{ z#C%&IKz9fJkL{A}1IfAq=E|{vUxz=ZK?Ih-SBT@fAm#o9N-Phr4fRDVmdG8ar56MJ)f5%zl_x?o`8YL!;tN{v za5+4Mm;rMKg)k&F#1-bobqfrpkiwjB5+#`!8wV17;(%aG0A9v(r6Pi;?yfv`gc=a^ z!Q5aeED#TY@g-0=J3JPPW`xCKA>m?*lt>9fqd+?wIt4-wLx;r)$vD>l$YcdlgpwOf zbRvS=29ym_8GWnXMzMTlI}$E)5zUnV4>rKFz7fbs1A#B3W;U#5V0U3#RHena6n-e2k9z;N}cIs zt*zvsr320>0MCbmew%JwWIUe~EQ0b-ZrbVKOpXgSA9%P6&mggmJ>Kp&S|=R5|lt?y5Lp zT(~e)s--=V6koZ}9Ro@s-0?CI3@D}$d{-O{@1&Nq__0tVoC|7K#7w0VXssC+hvX_n zOmrv~1E*`LPJ}2F^f!Y--IN?2ffOtYU@)lx2pV7GtC7$-0pUE*h6}=_id10;(4^Cu zq11rP3`qgH;V^tjaXgAYR2l3hL1Jhy3X7?6HWviSKAZLMb4Tqp1kPww`EFB>v zi$NPWq6ms~QHC<&BAkh#N~tJVqIH;Px+~O|#=!>#!j-&04VCMQ4HgE52SD7yKy(}L zuGK{Q5h*MLD7|wRKHPxcK7P_SKssMvT4 zj7$j&a;K2o#7I0T%vnP4Q-N|%J{}KeN&KM{3DRAv41{z2=r9DrPeB4zuM`Fj$q))q zNQl26T!WdEhlerT72ulS8h#L#E)g(?f;FC`ZG(=Qj06*d6PpK=;87ATR(TOm%QyhgUa|Y@{6`2`F z!8!}j!4w45pQPk5*;LSFK}iOkL)qXd{M=+AAuOs8G%*Nw2?d?8G}`Fa$v;l$40a$S zBM=RvI6;9rRt*XZxpD!-KPXm6W6R;H2rwaOKw(0|h2r^gg@6jx&J90}EKWe>aH&cs zXHW})Rf2BX!5}ikO0mHzKdv$sN(5m&lB~t>;J28>hJ$KbHNy!Cbyd6i<3LLzq7yru z02;tCx>aDmm8-g6_r2*0DkecKQve<8bu_yY9lt6;9!Uv z1_N~oF8EkbdPqZSiI6?$mjGr3Rwqj)=aHVr7IDiA? z<5iLXHkd&XxcGQyH(0n+D2wf;V6rLDF#m|jKAR*i3e=YPgxe zGi3lQ(Vg<^u0lWqQ#K_G1P3k2DYSU$yF zpd`Yb!y)0I92gE@DCoukKEw;y{~NuG_IV~7xPwZ@eBG7SQ>HANfZ#_3 zHSJisDmz??X(DC?&$63yD|K8EO=P_xWt*5Qz{n7(F-aq?M zK;&>RNxJAH-95|Zwl{uGQhxlNY3W-gM81BscBXaz*CBmR^+wZkawY5ng%U9Nojy9f z_+>T6n#^w1?k`^>&wDQ^wz2Jec~Sj1RCva0XkWDDaEV3 zVuxhsgnybN+2=|X7bO2aN56~Cd^@+LU=)tdf!sj-y=f!x-oXuSr6hwaX>o+H{{AWY z`;$86=KEY52@lDCzcH!7>+k6YweRWPkYNm7ra6Iy$)R0ju5-6#no`%G00d)LtV$t^mp z#^bbm|2}(Cl2L(IhqI;VNSj@B<+3x+sHx>0rOh91D8qlgVl(ST7ae%AWX~r5Gqmb~ z)sNFx8&g&4SR% zBlq?{u>I$c=Y*-j{F1btZ{z77TV`?JDy-L6s!|cDEmj+RB3~Di42;jNzE_}c`2F{T zz>O24dAc*XCo9I<8b_aw9cN`07WV2}T|XgvaN_t-;AlB>XztIi-c!#$i}GvLe4^dY zkN54^NlDAOAnNEV6#ZK2={JbAfzleCJg<(HQ}Y@I{W?W^r!9-n&my6PtgrfbdFy5Pl$fCtb2lw|u@z~dJLcFYX; z`Sk^%AkKK0iQReFIH9%ShiShlMqFqzhf9^}paP64DK^9FMCSitA&1(b8T z(*}9x?mww@KpxV`wms{3X3w|eE;sQ>NdwzGvEP=7K4?Izw<<1gE81cs-;p1B(J}i_ z&AWFM{f+U9l2H@CcSmH7wmkf#>{nDjwD<0O_U&B%>T;L&$#)I^PG9iT&$j>Wg1i~8 z&xpn@XuhKr_4%L6C12`l!y$~M(HrQOU~xhC=;<>pTu~(_o*esgaK zVv@$2IPm!eq)#KQHwLz6yVNX~W&bFm4)?uTA9Xcu7Tn;?{SUQG_kzAu3=+3JzvbOv z5c=rx-5z2Ycj`8B9hkBGW5+YY*LnMxux@X+b=dShWYbp0nCZ$jve&$q)9W1$-Z}g6 zHYr~<{qI)4Z0cV9ZFYpCSNg)5;$$gIbB|4H&>5OJIeSoPe;y3ai+*0*vqAX&x@om{ zu+i({(3P3?BSy*g`yI_1D+^ru*eu`MNeSINaXpk_0~*sPtJRj~N5l4oMedZ{ z4fw+LGstXn>2Tc}0`Oh|0|y&cM5R_q{0Mek7V^yifyHbf0GE^93ydRJyTJ`I2G zZp;^8fhX4-&h;Q8M$%jBi{4_}N^=_ute;hkcRYEg+n1KYyuAcREX`V4Rmkao9KkP& zMSD-o(e3>9ssr5rVS3(D@TZfnhoyYDWK?jWbJ1MLKVg5aFM7RV%*3wmsxW4QrXrm=U;ETtfTl=Gb?+-${{$zaj^L_V-TBk z>0GASEuC!l7byN^Oh$w0vxO;RbN=|g7&{Q^QIn}<8wCY}=Ii381=PUq<*jz^zt(s5 zkV~s=LFL(r&3lu7j=%86LlQ_a*@!hoJIZ=6$uf4RYWAdioT9%i%_jxZ_AK@@hJ0hl z9Cde%>atdzaNvx;u$;x1T^Z_xRL+*c=%gxM5TMgOUsm!Gas zMsSHYTmya}v!U?=^gX$k7CNrKRdt1Ri=qycw%&gen!k<19em8mZ7x zY)C&Uxol|o;^1Fj`o+3gmfU!;Ys!v&dB&ExdutypNACIh#o82G^yJM_gRIk4JNMd5 z&W{T-rXDoR3UH68I6U93cD99C@T4o>KnEd%@tl1Na3_6uzUeG&!~kA*#efkyvG08br8SxWK6q2 z8lO?QX+-znzNh|Y=+1*h+iWubomkV2Qe-`nJ05+*nDk{4usPkg5|kq^dW=;A!)r(# zz1<%zSbhKQhIcmT5dYkiw|&TcRla|@GI47WTcI(&8poWy?%B(^A2IT8(I&OFf7i{_ zG|Rc|z|Hr?=H~4BH!NIIuU7VUKb4!!b!9tQ*EK%Ly-|JZ?_=yw3Y=k=oN*-JMBYd5 zRK&S~J03L67sNHDyJgt9Hcv0LYSElnb7ao_h?V&Cd(}mMgGBVQP#s?#8;<9-g!yTu zqDQZGa=w3QH>Q^_Oy;itn3DN?y8g@g9TmB=8IMMe{}cMp?zZ2Mxv(P3sdJX~=lQ68 zHcQzdis1tho%+$NrLNX@OsKPH*9+`QpI@KhS!6TS%?5;7uaa3;E?M0%_w5Nka@zXK zj3X@Tce9NyteKi-T##UTzzXxw{*48+;ypp9O!Vk%=&XR)aMng_J>+$9ithW2q(}N$ zk^3w?PMalnp>}NT!@QbxKG5(>!po>#$Feh%+Cc!d%6nUPQl9R!9!Kjutk{x|yQu8Js^nKX23b z8;N7_!^6YN6rHa}$#hBee7mj5W>FS;H5;0X_vyY*0Rbm&n*7xn+~aHq(+peuAK$d9 z(N)9M;*XWSm$)x15vS=7c76SL)5BoC-Q3PWW$*jDcehR_R)A*usYdNLe}IGiX1#2- zG{~AZ7Z;_gS95>sy))@a)%vO&pKGrce5^g_cv1D8zQ-JH#Cvt-L8bb~emkP2iEMe| z0SL|S=eJkW4Hv9RN+C5>h+bS|p!O_wHLwlNx%1*AidY&2pSjotJ$~4G^R0{=a2x03 zm6er}i9d<2OCn7VnZY8GMlkI0NU1x5C&GIRtl=L@= zZ-X_uko)1f>k&8czMXTHo>+fVb9Lj0)7rSNNsX5UMY8r8UCv=otqih?9-DeVcK zR=i#JeY$ptJZ83dPyF6`F61nIpsm_2v|#S_xNlqPyeFa*tBdO>#o@=>*d5PuRYTp2 z$~blV+G`IMnH-<`&osM+>ix_Ac~cy*b%~c|!^EHQ{-Ggcwmq3}3O&yTYZ;Zc#H;Gb zVP|Q3jmhxnXbS*v=)+DnW$dTB7CEyEOzh?rCH(4Lc`l*9dFsHIr@QNm!mLpH%nNfl z&vJZye3JOPQ?h?!_Ag7mSGQ-0w?Wp6`+G~$bXcpzZ;(2@h$J1>-515=q61XgVrTY~ z=_5#5;+uTme{67;ZZgkJzZXhdACfIAHjQh9A1foq6M*H?;UF#8(?}jq1pinFrEkl~ zeS1CzxXZ8<3y+G?pl3(D5?}@kRt@L*q^4ANhX46JQm@YSP*R*$6on2w+H2Mj$pZ0(r zeyn;Zr+7swx?!pDil95^Z~xh~-O#jf^O~4jmDIgPpVR#-#xiUIclhs|{ki}1J-%6g z?}r;Hi(T#aE%n}45_zSnuCC83IYYn-SgHB>wQ!HAx9pux*XSxq#Khrb?|II(}w%)?!Lo%)aOAjHMZ? z-QZ#Sy563*3eIs4zr;;9T2Z|><0P;hb_bX?zkG9QcV$L>Dj-@7Mm*fJ2nvQ~jxP33 zbj9?Z_Ggqs#mrRq54RE{OV-tcL(rG1MxU5u?$c>E=zLg@Np{-jDzKcYv;zCc)_ET; zGIlo7GnoUcBFZY?T8-5O=dL|X(F}DroTOx1J7P{@DB0b5{GP_k!`~k*tv?W5srn8P zHM(SfjlR7p(MAwiA@t4jRKLEQVYkLI?0Ot;aDMat<^HcH7C<$lKhHHTnSVU9#|N|U z;DGhP!jQAUcIzvL6GUFh-l&3O*Z7C*2&IHs36klQ9j+dl6k@96D^?rr(momoj6M>gD4|VIUdq&Xt^R$qL_TJpFw*7vD0QP%J zA3y#+h!B^HOD9BQvlqhtNt}ke`{TygJZE>*gWtPV1>Qtm`=m-(r!a1mg5fXiL^5pAR=CW}tqp@yocM z+;^W^Av0@?TeNSQcj)t|{3Dkwwo%D}jMw{T`?kq8N1Gj7^XX2{?no;e!rh%GVqdMZ zqYN9qE+Vhna`IFiYrb9L)v{2de%;BD8JM4Et9$lE;!Mn`(mqjfQ<{EX!{+%r_vQJH zQIgM#_nQ>Fhi`nni?I74`StB;dm@P4(mf+umL)gd?3>Z3Fw;+8eOm_(RYc+M|Jb+n z{|Go2$yj>)7x<&nws#S~)y(Z0n+F$LJDzX;>eAgPUwCDWkO<<(4bhsk2Q>TQ6P6 zej2m&-9`HH*!SV@%30H1p2nr7zB)jAy=}YdPm9g1iHaFI(=HL45@n+CFXPY4Fl6$t zZS$gu*XYFPs$`whhLiV|t)o{$uLu6^DDh7K@KRO()e+}m+o|Melv?hE`6YkrsUsQY~eJKrxH=(Aju_GiR&JJ!v&zHe76 zh!(N=rJt^D&55bMU%L0zegLAsz89=I5wLsL@$pE9WTWNOwH&(>sI)Vs*`o6Q6$hhq z`G6F_?ppljTs~#z^`S*Oa~hma24{ZMqA(l6pIjYD&*ZeO`#~;z+vW6Qy7@ zQEEfbg7p7H!H55%;I(0ANM@IFIg!cKTbk)wCc~o3){2+0t>8m}Dd`M)SE|*GLcwjj zDARiT>^u4ER%ahltH1r|pQ=~W;9*?{BEcEKcY5?{-a7W@qG%SCscS9U79FcK$nsoi zcb;{j9r5j&j!8~ovCq>(&&^8K&b;^Xn*W8wj;X&ByOyl4+?e|I{3pBQ#cTPqgLAKK z8+o-k^k7WoMvM9`#iQdNeq{T!*Bv$Kp-wC1W*59Os&~jn02<@m?T)cCYcxvH9s`!) z%H$(ZiQ0IJwXeI zaQQ4;-Bx)F{`#t;y6=xp(Zg;!C=yQ*IuLrj-gif%b^VNNBb~0jfDjepAYL(40+UX*sNx1Mmv5W+~Og9@#Yx`jTsgxsbRXGXi5_&wRDTnZzJ z5mK-XV?O2||AN(!)NezPs)2}plfQuVKIy@&(6_fVgNxUv8a6i`-a8DSOMZ{{ zO{)X)7;)9AW4iATPSM+?(|+qk52CJZrDudRV<`r9FGOVtId%$@e4_nmQAvqK*NT(B zeAJ70%?7Wv6vg-#QIHm|ehfh5zgcazcjyC>_Q-KMgv~{5Y&~d;&S&b`{|APxcT0R` zzbfJ)`Lctj4jF7>mwRlh`(;_h?+mgX7WkL%$bS8)E~au9c<3S%y9jc5J01?*mcDko zj>*c6m4|dak4)a;3*$T4eaRWt16xtSC%0}ExlXHCUFiu=1U$~I)jwR1yq@^um3%#} zeMilljBKmhj`BjXrJCi__`2Hal8%iID}nQ>{#DoaUW+ZdSXn+3z}WhKVJwmU7J%5n zpX*h+*n!-<-@j%WBjbpU(&+1Sv(edkTXN0LSV~W%_4{Xjw2#=-cr|Zn@%nFz^5@%m zeJc|hNyGq;8Du4(RMrV+I~L?w?>@i&cA(9+>85sL?56WR)wgRyWVxDsM9hbQ>s#-R zQ_q!LNGbJccsuyzX%nENDqgJ}TDVtnbZFU`u$h;5L@T>T_MSS5-)-uRF-4hFOyp(N zHcg|XyY0b34;~aOpVLffTk}wgnJrAuJ_A}?3-HPwK+pn@X3Seq5`a%GvopE^nkMDH z=esv7GJ<4j&Bx;2i70V0$f`%K+Sqg2XM37y-HNG3!%L?c%-7rXWBE+*48La20gsX9 zn1IsJ0Ix{Q|GCGp_8=~~?DyOq4FC!L?>{2tzfYLa;9(?Lr2VQI)?Lo_T`LKcg{M=l zq&pDiaUMBf?z{p}#Ey`+ZhF=F2;=wLL{yTCjX|*5o6IwnUuY_kJzhL>%)TSrgR$vv5oM;-Ka)*Jhj8jY%^fFL=~7YsK8BwPsSI(Ph3zTHaSUAMz@) znyR$cn(rDTsvJMhI)8l=fz8uB|AnO`BAT@cf%$fIsqsUvmxICeNBre_=TA!mp}r0Y@xY>SOA9tPd@pr=kdEBtQSS9HpJk zMoGo@7wZB9>iV!csH81&^r_2Y;qE26eq$#8fVqZEQ!x%NShlRJt^016nR{SO`LotO zgyxN^{7TYzAD09yoMXHM>r>H{ab~=R*4MZG!=o#i9;e#WwvQ|Ri)X0o@=WM{p}WT7 z@Yb|)m$uz5HU`hSXEmE{L*b{_bywCX2fA7={K#24d!D*Y|83gLoyy;*(EC>%MGYOx z9g5OPi#>KH^O16;)|9!rc^~BlS!Yo`ZKIoGQC7^y5vDJ0R$7J4J-=e=?s@xj3IZQ} zA%eSFusaGC<_t#jDM7>ZefBU7RYg1dAup-;iSu-T$YYm&?cVTMH)mX@ZNU;NJ8PY1 z59fSKPx1if9-k-}Fs!n;cQjFkxYOY1^K1^v+Utj$)B4Ey+l9Bi!CL#vel6roR4r@n zHeIG?FQZ-hZ|t7#@R%9qVdlL;06Xfha|9%mi1{x1)(hx3ooAb-QX_zSY}^)gO}1P; z(6)3YDg2n8_sG+uZYc{^Q@2gK{(l1DzgluyQ71dYXX+o?HM#2)CNUX%Y{0$b*Xwoy zXd7Osf+F{srvkK1|5&L;XW6B1F?-3;H(r4_wl49)hPyf`c9%s>3oJb1?-vkHN?Pvg zn|o>Ix7TFf%lF;-`q;>i4u|TMl;T5cAJx_x{_6XL`fyz#9qNv#OdMO#({u%O6efZQ z-$8!%G?|_wovs3Sk9Y#1e~DjjaC>~njD9~Q`AtdWN%fB}s^R|So%KaK0k?1xAj5*_ z8x{6p`!1|=hS5Ksf7&oCWtl~|>32MQ3PGp68p8E;Rb(jf9LLBRTYw{G3Ks`_q8Iun#y98pdOz!0#y z_d7w}72CPQQyS)-f#ox`>rE&txStKwp? z(Q^>4?9w@{+;efGv9V;x@VUJXxrnm*a+M4F$)Py|d#gr^eYZ}-9zn#mseTVbTORH$ zLI}r42j5ky%SV6hm}O=u|MKK(#&FR;z(l6RlgJ0(TOVCibWw&!MsC^?WF^IR0clI3v%j}I zFbqAvJ{ohZXTN}Df~8!aHrsqgx;JN?^V<74dzYSUdN7KohN;`HVCU-Vns8u zHXO*#KOK0m@ck)kOom;0M%3vG{|DgyZc5GnCAcSlZWsQ(T9{aTQ1|EL2KjAK%&Mj~ z?M`qh!>7UO(|>||x5Z!wTC2d8`~>q1Rbr1>pMlOSwr?AoC>|fm2G(L)bQz2~F;;9}e5ZDl-5T$Y7UUsg$v)q42!Nh9%&!68yE_>OP z*)}C-K-RQl){xHz=Mn&6@T*Y+AUnZZ&PoB}_?g%GAK703yet{}`YvpEIAu6-c7Zk$ZdGVlzVC&x>1U7>`Py*pcx}@O@;`i+ugMP;xBb6c#&F4} zRN-FQ}@v;1}pY_-9q0!Ve7fN zagOixODkVoPP{33`%7`|;n&w^X4@YaTk%BjFBM>(XWBb$n{29fnUYssG&eNTF4GTs zHCy~S=*)oGfPO5bJn~zcv-eoP3+$@T_73XFXSk!M&4+}ClkqQ4K?<>FyQGwSfPHs+ zjiu3t+I}rvFS&jKXsWV(>P3wxOyo^!`{l1Y?m21Q{Z8L1kWi^dy_9{-kic1 z59;O%J!+0MTY}lAd!EtQosB-a0**CxELhiA@k4p3Ypv10N#o^_^f{$}iYd9IjT8fr zR733(9=^bMJN2>sz3(9%^_=n*gAc;=bYdnXgQKfmgd2arO6eHX*8#oE#z{PathXzUkLafvHBVB8mT+{7RJNAV>3%YxW~ zPnApe{gy7M&a^>xW>ri252_EX71+SUpVG*?kp*3wyd>rp*V7(u4}817=f|EyuIJLI ziTXVYT{bQ#jkH@P|& z;#*@+;d0H-g(U8o`HfU$Qn2}$=Yu4g^My@6mb}0Di}3vrtkiVDnx<2#+p6zIsYVY_ zcaka!B2Ld=5gfVWV&=hSkR>dLx#2k)FD~pXXt*%_mP6RWa?|2_pRV+MP8;7%^WI@e z|Cex?(_w5)YW9Mp^uwnQ7>db;$9kmu$pKcmCf0WzpJ!Nx_`%cH(kN4d!9p5|k zCbb~jhSsQj9;z5G?{IuxB)7W6r_L%_JNsVoh+wVRm$2-lJu@U2Z*h-?$prb4WX)oLND0qHe3rw%5Y$ecS52-2ZxL zf8YEh!CNuyd-q+e)2_`;Mq9@!{ObF57daWW)$ZuEFtg)j{4m})f6hhkH7Vsg!*ol0 z8Vu8Z+6w;gu}8F=4zs9u!yj`%F|)Vn*$3V#TnN8vL3JrS(MUWMB{!c?=sU53irT(a zo$d->t4ztbyLi@hD^A4|Y(Aot{VdY>l4WMo`3j>)eKn>OOZzfjWU^7Omcr|O`f8p7 zJ1A@P<5I7+u7nH+9YudX&jvp7gB6hT?&1dT9gG#Ls|po2`fJbdf`MO|nh6m%rr8m# zy&vMEcS*q%_Z7K=Hjy0`9hQfY zV*0n=swugjFKmZhjiZb9`-rH}CGc_%X>%PVe=Tx$Y+B3q+eyk@=cTG&I>YSX^XrZ} z$@M73ACg6a6~`l*?%H3$Fzv`SX{UcQ=ov&<+A(lCCnC8l=3>I{zRl=EXJ+i{jz~Iqe*MXf_3>BLvCe=%D{M3( z&CYuKx%!o9z5Dqn_o%%Il4Jv5!7x~|oV~|y?M@KC?c#R#uXS72T4U4!yjnF(AwGl_3`ibZ~8M^4|@y3y0LoG zM)76MvZ94`eZ8nBht~50JD+`+&iCMJ^ZjNu6*dc^ss<86Ovg1Y0lnty(1*{(5f;5n z>hYM9ufB2jYX2kt?_WO`={$TAQWUKv)qn_QUY$qqAqRqGw7&8EkdCzp+rsh@=C2Yn zNFvu2W0%?zdajt-sh80=+zGlIK!t3Mzx;GX6SHdVRiD(P8nM^Iy~e|q;c#Z{dF9)O zz^&Poigq6fR;;Xh>z%*3j%^n++LiyK%e8CwM)kTd(d=98D{V3B8*-}0B|!D`ICIe+=t4#x2?Bp)>l}GL#Fh2djAoSDSkb3(%pi8hY2;Ctxxgh!ClWl4hb4s6N zIy+-$wqWx^K$F%lI4W$f9?HZ`^D{1RvN5pyPnO90FH2B37t{EFkK2R-D;xJIRA=Ga#!8{E?uBsHOskJL zK@S`(OzO-I-1NM+-ylnP*Pv+jpUYcoGS)q=IVilTXKFXE9>Lq)QfK8L8L7c#bB5l2 z8(eOX)pjj$h`0E1i9Kq~Z7P-$kk53*QeG_nJ@?Sk1(aiUgy3zqx0mH4-4F3RFr{PX zquDoKSyb?9pFiJr$1YY@3@5-`G8KSC;5Z#wPDy`Qlf1v=u9mKI90gec zf5e&iK_`AahT?_rdpHdg(!RPlIHw@$V!^0e!t(vr9Z@m$4|i>!Y8P=S2^)XF`rCz! z#|KN^?^yrOiq?+7kgSE2!Vmfp8=Z9ZLx&s%8}8v5^$Gj6oGFevC)9zNYV`2YmHI|4 zV+{P@*_yt>@RL@%7Sx=T<&Vxed`5PL;<)78zz&2CXvYc&uIHMc$5KAUKk)^D*9BpF z{LC4Ll2;e4DDZS{n3fIOE!l2O7-HCA+NP)F%r;t)9+B>s?YE6t{hO9+Cmph1 z8=NN^FDR&cwK)U3_vEDzSpicJj8IErHfP)2mj7CwEq3K#y|e!zpNeX(InaNwzN*GM z?qQkQKifyq<*@|+C*jQclkT;ys7y;=GC;Fo{3A4@&A+u}R+=3STz7HyaVB;)7C!JnGT z+ig=HTf!}kp>zbQGixcsr*8q4US(t#G5+-(!{v>raqFS=(C23YW?d3Q7y<-EY>L{w zsd3K)xG{u}jGd8~gVy&Qi?vE$OLj6JW!6KaxW_~ zI`MqAdU5H%oahS^zgj!DAJ;0VfRb$s5QC*_3I?K~Kpcf1#MhMH3=hq7&mtdY*giYw zY1eQf;d@KAksXFBeiJ`8_}I-op4T?+hx#uD`S$?*te=sxZLdQ_AC8<*pRDQphQfR~ zaIm^&!RI~tH|uMFyw=1sHOlC>QZzHj@*tyaSZ|>>>s-dm?g(f5?@x|8^sn@oSI}Vi z#&T2T)#27Q_2ulf48QaFp5-@hFWD;Wsk!X5sZ1yQ_RtmJa|^ch+{XXeI^#m|^UJa8 zqxG|_4{Zi4=i(dW-KYYYf0wadO=_gx|GZ>EER+ut@^kp%7c!ZbKiAS{y~b|yteN;d z5;&-LEB00FWjd=}>sB0oJz7B+s^ZoEflTk5K<#rNP-f98Je&a1Oh5iekh^#3O-!{x z0QHk>_{U@H<>(a-bIWpn475A!G5Z+N*J*LUF>+hkF5{QWi+n4x5AR=h)(3vStISv% zHy_kn>Jaax#Uvw}AyM8GwlKN;I|I?wKKKvA){)Ybkbw%hK78=&r;~>pKb8;pCOh?g z)iOO__6Ao3DgV0cxTOYxlxE@Y@G{WAOy7N(mYS1hs36*JT}fDCZcU5(&@jB*OPfB` z63QMAUB}w2|9%>*GkD<@fT(lsRrP9SOmdC>ez_lJrv44(AL5xUJAb0@SWNP)y$j!V zXJ&$@4&KtjTW%zQZAwW4T7*dweV_E{Iygp)YfF9L`mgT=%VC>5XByt4BqJ@l?P!PMhm>HRV5;)#)J{-g>3q z`B$#3eSX^=-ebirn}CRBR3V+Qbz=Ix<(6q)pWjrUQ;oI2fO4>r_I?I2h;4`bs zVJ88h<>@fo&@?eG-v_$*(z0bngFpXZtg+eCKkC17w#6D2thyJfYu)j!`d+O{(h6y@ zepc9qnf=8_YFHPVT=Q@t3J4#}1&S7F(=%alkH3UY~Oh0cPM~XQu}H5BmLQ%+>cT2|!Hs2#}Qh zFHlPp2^&Ba$oIBt;}mrDawEcJK3OZy7$5JuJ%QZ2*tH-0)+(g9O%){}K!DRwsdkpN zJ^uW9WM8lWE3bIvs^@R2G;upv10>eBHPi2amg-X^W>sG7mb&Ac5pc zt2Rry^!TEv33f^FcD9yh28=6|R;BBy>h~$}sgBRx_~Lx@jRioC7SQ?nTsol6@ z_Zt7%yt80oJXv&DnBA+Z3Yl&3J!@qM0m$S|VY3Y`^Xo}Q%VUOta4XCKJ-~`73|(1F zy^Kvw6B*(Gh~91(em!m_Ah*v{bjZFuS!7Mf`1SK`%w|1urLe(i<{~GAjkxZp8@~ET z51>^_j4}X1qc`74#(rUrb(Yty3(?7T2wP*b_T`F(k82Z0FJ-tkOv@TdnX(I#I6nB+ z9_2u*+D1EIt25a9!2{eDvO4op{fh;8m+&|OU7=~pAn8$ z>34hLkH-PWn9?;BpQmne576`VomrP!-(6%pJ_J2ES_~9f z{L?{{3sv@FFqgQ`^OLC;Gk&y5tO;c&RumyWCH}G)9qQTbE^XO31^gdt5l=J!7~tUu zr`iLncQ4&Ey!>?qn4IfNic>f2%K!fu$(n43`oi>$wB6RZ?oyrGe?}eJ^w%~NW|B`f z>)4#v*}rkc$ccm5Ch%^(POv2SYK!8EWlvYtI=7RA}#IVyXc!YT@?xQRHzOyEB~;<|8cTmcBJ zS=VIk249}#jwSn~&b+_N#1JeR)acJ|-gE6nrjM=mtWGqFNdIk}ehOHnXf;e-CF*a! z%QwSSOb>AHK9-az0~qw>=|G2-^UlpXT<&e2ZCixNK(%*toE=@`K#@J(d_~w`WX&2t zvnTHjy!w<`wTxf%#o%zM@GmlUa)^%`UmcetP7bZYMC`xq6F+s*D`FhzIj7X7oU+ z=M+YipV6dcRSx(xh87Tx6F?2XRUlL?ZDRxdAD@h>_;G6eyn`2Nj4>H?r#CgkW-%pj z>(uChv;}LT3UrB-L%knw8a51MTFWt(2TQzZHflnd-eEi93Bsb9q8ZHXft1`WV%&~5 z@w}ZWnZ+;lBk>;YVNc;LTBiiJ$}D-AJ4IacKiYfmps2F#ZJ2HvB`6sYMI=WB1<9!q zkR;G#$*3R_B}oQp5ecHCCMc;5Tn^eboW)z!8{ zMWncKiRDMP`FpsBEz2tSErX=+&hN?#EIbq4L=xiQ0+XybwGvbMc~-4VvnQzQH`k9p>`FHZ~i+$5gl$LZjrOejzQG(kn?e-&?-s&(fK1& zflc5kZz3<%heh6u2OiOym*?Lf0=c;9CSh%=K&^eA`sVnR?ah4Cp-G`rLmbQo1Qx*r z10m(|%FcaxuHOSbcAk(myWDi>6bX&^@RRswHy(iBb(mQglxvR~0! ztedR%{dy-b`58E!WVP!)QGL^|(#^CUJSeOgJ{y$Opm3J0=YJaAw}(8VSlXnrAM~hA z=UZ9zdbv3#AH@b73RjR6Y=uJ1{>mA+Wc}1envs(^?ZVlvbhQ&)miNk>1&T6zT0d~N zfEhRVn;HN8#C<6tixn;wlZHdjTboR_8*^kT!a&qPdSL`@GaBLwO7|p{53H`6;^7?8tITZbdU^S%%QAS zrt%%>i4&97krppZ1_SA)<2KawStx*@m@w17n zUqJ8_{~jHwc1m;?C87M;?QJu8$f>TJQKDny#4j*?pf>(>`}R0BH6h8C{=)tvm3Yt$ z5F@bBGFsvfeFD z)p#Cw$p>sTu9tJEu4xc`ZI5=a<)KfZmTi*xX{sW%Vc)G}l1x)@<7@)VC zM&Cya-9=3pA-Dk(chG6E?&8Y;uhKJimtN{}DtIT0;9lJ1L(HgE`6GTKhNw2(p%ilU z1o3`c*>QJ0PHyl1R|#o%gOEEcgig45EDLMz-tmK*Pk+4q((Ug%Ww%)S=|ZKW=L&YP z{KwM^IJCtG;cIrsL=aKoMEs!JDAmQ|W|uGJ?lwi>d4S#EHergr!+H{a#fiiC z$m;`uQ7T`^JWA$mhC{y}0rmgFE>If*M-<|K66dQ1ODB=td=(x;VG$0)yxlKQnTP>1 z#YX-&GgZrTfr1xseV2*uF=rbj3d#$>J;J)sf6yH|F!9_pkqjWic_euG7dSNcd;TB{ z!SywTRHt6iAW_f>I^lg6_oC~CEYD{QYBPe@a@>iWrejZ6YWu;Tf4-H*5+BA76OepD z3P7S7!n8^Yx>yCwh)XP!r4|7D>DZlM44WS@RfPcTF7!uX=D3Hz&B`Fu~ zyWaFXC!!SwKzJt-`WG^PAb-vj3qjontA5PA>76L$&TbZ(@?EI+gyQ3Ru6$G;C3hrt zAuHp3ir+F%9{&8Y#!G5V267d}VEoXCjndFP;VqRo(ULdi_zdZ1N zH|PIvo716%U;8H0P!q`UjED_P zyqGNZrxt)2k>G&%1u;qgn_tz(&wY&FxZQw)s@3I&CD)I}TSq-HiF zp4cn6@4_MEf;&DKH0!@YkUbspX<86kT*h{e1flRl~tTK~u zHs|fKPwOSbobmWB>0wh5saRpT|a7t^FKWjS{X zWC!2ned(*Y3VehycZ=#lpd(|^H2-rb!_)V3e(f2 z&O!)0w+wPQJD4~kheL#IKrc)Hf1%>wHdICdVJ`xzC7r}*#;KXlgCrMVh(lKba^O!y zpJoso%Cf9*PVPlJT-gGkg;)r71%G;gTPGnf^!T+fPAv2NHc~L@1R>j<@>Fn+`^kCj zSb(?lz6F|Rbe@*|bza<~^Q|u+o=;E;2{h3FG1)`d3nDw|HAcH@Z({@^Z?kF$WC6R< zpWATc8oFgaC#nd9lefKd5vQulEy0UVytc4w?*Sqx>-LM=Q=-vmj}OhLe2g$ubIq+# z0L5eUmC3UsLsr7Mzc5cL$Q(e&aUgC1H;aGLM6v{T)GlbED}29NoN#-`3~`KE``F_P zubu*tl*uSqQ*ttbS`bRvoNW`h)%%iyKjrsk@#&>Nt^w0oI$d~Q=eG&Jl$4VrKhp5o6ZX>wwa)3#@a1V*5bdQ4aYc8Ho<)NtUZ z)O94fSjqS+x&W>4GAvY2q>H^y9u~E5$$*ZDH7n+bj?EwHq!xTkYR@5RSV>msJ45%RhGP{y6yN zS@q@5`xd9$!s=xuKJ?!Vu)_CThAyjA*L0BsL5TzsJF(0(23$rsQl8q3ColYhD6qkH zXx=$7yZiDeNLoQLY$Cq0*22Sl#CR7-ms?s7UwIHvcZL%R|0z1an83Q4A9o+RAV8%M z^y9QvFBDe-Pqdd$cTpf@ZCNjc%&IZiyq&P2l`PD%IMtbNFYNneP%rff6I42I>%moE zaLoUdj2MHg?=5B4Y99bifhsu5RYZ5_v16Q%3lN~RLYDU0yxR8KrjPug-@puH%JL2m zw-J!wPMts0zc`vw(UW&bkG zV5t`7?k@-FFMy4I;uJjwN`0FoBZ^ZWc-vFUinZIPY=gg3Eah=GC#1$>FTypQj@=7B zYKKva&~8o{;BEgPed&EH&L+vm|Lam72&UP1jb5hq+>q&9!R*+1@joGe5+`SXM&(ht zqf2*|PaaaR)vo-NJE{Q3;3>QZi;~T$OkH>nHWrr$0%(k=P5pkt9?<~Z%KVw-HkTOe zQbw)XVxFu1_o2l+-qj5N-IwPAv((U8Ah?H({NrYGj0juWBq^v1MDm75{%GVcI$JiS zqt!)VuQcOc*fcafs8uLz-f1exo5n;bJmmU}YG_gEZ^As0{oj2zA{l-3zO>d8f z=$fi_{M0dbdp>B>01sZ~K3L<0IOH~U`cm5Dut`ZR?&^(44W(L%PbBQyu+HPW9#F+h zOugK(4)1BT1+yNLdJ!H?49!}>WoOw-;_HUJ-@*!_Vg%a)&OrQM_bBK%WIty zi%)@AW9`k?Z-pem!msb=SCWo_bovw&9y5R&0qOcK06I^A+l)WqWY}L0<=5wcq)a>E z#K_2hI?6V5RXy2r{f8SUd3P0CRGfsGAYjTP&Gb36;l0nJP~$r77}!VaWdI)P7TAKy7he!T$9 zC24yUwzXY^VQXuBo_JV#dOfc^mO8~@7c9R-?9)iMKTdY01AaluAo{fvAFyi;8K!)V zm&@%ke|&+$8QhNa z9)VT8z!v>;Smn2&wjL}5!TSfGA`2;OY;5ME2~p9S(M5}QU>SC=@)RjR7ErYzaHTIB zyzT`2q4N|{1@C;r1!3udc9XmGyW>IpJME3lpJV-V@vcU2F7|}A{PQ`)p`jHkgq!emv{Z=yxCnYM($zlE{-y8o<$tAAsealqpR`$bPAFg znGIHtmvZ&YU#)H|bt8uIgmWJyOu;ZwATla>QlusBux+s@G`rB6Ivl-URt~`MJ=17= zN#S2y4se)hl{Xf`ApsGc$QzJwkC9LN+L`jGX~>|wsdTfP?9LuDSg8$egw_acQWM3N zEFO#YD%Nv$IlNf(8biFL*;P!lKsMRXWAd?Ja{KnXwjtv}x4{Nd>(`(8X4URkXxr3i zk&rOyv0Bzm5MqJ^+CFF7m-SG=$XBFQc8>Qd_c@*-`O14bsiMw#T3y2xE~$ynA>6%p z@y%W6P;og;);zI@cQ_<*n`HwExsi?+ULZ@W&}Mug58WyNUS3(S&v7k~gfi*&EVrO; z(uZ+sf85fMV{eB~}U}YK^8nlo)AB28ypMSDO3jP9SoIQ={ZohWe1)>W_Qd zky87IGHKSdBeqfC2dVlj5u z6Y`C1!!6GWyKjH@_>lp5smcNN1?e9dd~HiFPd6t~2+UG z!g-K{)L-_-=B7zW;sew6^%PeiMpJTl`y!VQkegE^34FA#>#9ul|NQpo$^ne|*WS-S zDkDbv0;o6EJk)-Cqp0 z6e9$RP93$ZG>%*9Gzw6?zQ+K~TPh##b|QdU4EjdoC`AZNY1#Bb$<)K3pYA5t>pQS> zgyh`U@5xu7Qe$N~yIxE?>ur*1u1QuKlV|T50MBy%j>VVYoLCkq+qDU2Kaoyw(NHS8#4Tosxj1@Y@DX{nCpig+x;S|3VaRY5dGCEx zsV%uyBAH?!*=&!~fNzQ#IsvdWb*5cQOmjR}iPjM$4Z$s6r5n(okjXEroXBKVi?w~GR5<<6CxmYq}ihTxsLt5RJ0-FZ45 zO-Z&JB_(R`4JU}FB!tveQ}*R*VW(f>8w4$w&pafP@jr&keGyBw@iSEnf0Y7nT}O85 z5>MbuInCzdAOV?)4c$JJCb2tBVd%I=F7ZWuD`rg0PSQvYilpU5J zeJ$u6m;RS_{W3~A#n3T5jJA7OSqE?A*ZHy#zbWe1P21a1okof`Shwe`^bgYf7zhS? zniJPPT8C{2Y<_X`MchH;Bn0=(THR9+;@3}XAWUIyuqTQ+1o1rue-v(-H|c0PvI31| zyk5tlb)Gi4*2E~Z4?2Zh-!c42*Jji-xV(Ak;PJRCU-sjQxE{mMupi+w^qY(CS zU(6D`{doPSMy#7XG`D~~VN$+dZ(50;)H%bkRQ2&}XKG^hjRaK~BQC4ykt4GJV3h|_ z?Oem&+`55Hr9vn0i38RqMf-jUmOs!tYJDKhSSh3yJ~d58B?CyAI^E!XJzjr;Ed&9~ zr&=?(R@&F29th)pgpF|7YM0jEU%(h%MDz9Vir|d$cPT}rD#*TmED$ej;;;RwhL;Fp z8z3^qC~0zhc4dyY=^EwKQ4$n!MN>MnnFIEB?9QudVja;NqW7?~?B@>e>n2LD*Ek9L zXyD79NP0IC5(0GZQ%Ol(!}#zw&qEb+7uPAgIQzqB5g$ifJ%;~4l zqC4^_Hjdyua?cXd@1N9X5DfaT2vzaC*&7Kzb+kSP0NQ2{F+K9CRekZ!q@x!v+X$dF ztzC58-P0G}3+~fIyK9GyLCcJ1s_80@GG4vLGtp=VI@{-`vOY51PE7T2UI{Ju5TLur zoJn{Uj?u&_|DHIjbq?X>?};z_;LG-2J8G+KKlkG1L59F41d$XP7hJVbB(|>KIn9K1 zrKC!WB5Udt#9fc%3Geclyk8KHUKz(>x>KQg-8_?ecGFNLKv#oyeC39Q;2BaZ*Sw3k zF4-e4UOVoc;n+BC{qcg-#)GO{tA@j-d!MyfzQ?Z`)+{!+wrXr{yn1vml6>iomp%4< z2HV2i3k7IL<$ULngQ{k8FXcjAEZV{UrNqo04fi|LLbzLzPomslc_})+W7T~_qXeVb`$-IE%p$0pi7L(EyPKa!;~7~5XkX{ia7tJA?_Qro_oHsC8}F3uYUPH>)Vwy;HL8 zBCr|y{KOWk%Z{PUf`?9}s^pU!-(ZHOdI~s;mvlo}2j!TfI1Zg@kbBrQT8E$Q#TOWn zo8|C2SuwWt=8;doqIsFLxJZ3ke5`Wseu)>Jmhh7P;;5t3h4M>qV~^GDkvl}R$kn7K zOyGOYg|_{$Dlo*ij~}(%D%I2COm$Ne930JTUSF z&gL3zyto1_o6mI~Y265B!B*8LtK(@2j~x}RY_Wri>j~8O9t+*@H@+Nhs~Ng9y%*SM zkI6O$2*0|`ne{RU${ci{@fHg-Qc?jlZmg(qQefwq!J)_gF`i@hnJV`~yXZJ#fvD!J ztxp-X!!1#ULWPv;pxNQYri&IT)pD|}tFH&h?a0katW>}__ub~^2euM&W3tAhhFd`Y_r0|OD&0h0Y3tYd z%ik*9hF_Oh%a1f&ISftBTCY(tfuM-I0xcP^Xy0D~b>uuQZy!K``y*j_{VavT2atQ> zfgnQ0e}Q=J^#gN>4EXNjifu_}hV0`))wz*sPaek3OY3CxIUT8DhlR~bzK~ov)@64N z(FezW9HOo)E~pezhQK=V!AO*GAIX3mTBp5$MrH;DhJ5VuzNd>{M?H_SZ>!;E;uhrQ zS}a|?cr*!_=}J1d4O zyTkj`2Vya`WLw=`gwyRE`k;zR#yYgcqr!LXHOy|W;AZ7M@*^@Tk@7T8z?6I#+=@cp z6-ZC0X%nHZU>Iyqq4?WU+frU_%mtwTom*TX)|-3$x^e-D(i%mA@dIProZ3?gP4b7ojAaxxFL6WeBHm1YooP80ZVg!-eOi+J&iW&4jqzC0E z@k%K!2OaqHTk&nIb*&E-^yqsIN9N6a-Gdb-()Mlf^c2nzkMCCuEVnqyRFn8s*7ERI z3hlKq;46ZE3^~qM7}hswa`e;ez5kk3yzl1P_NZx1dN1n7h%$@{mN8iLjLF6(K3sDJq*D#`d$z1O*(IHlq`67LA3IOGWnxC&L)!N9iM4#u)}~3nlQ4Kre4?LeH1CjUI3gAW9;3)4hg&^{ls~Jq zz2SZO&Iv8I6)jrA=2k5Umkpal~VwqSC_;%9+m)_rSaVtH{}Z*o<$!*Ud3=pxZSXzFN6md+^i3vIa&w%Qbj$GWs0% za7EdQvzQ_54Qb&yf&Y{E%!wx#+d(08EAr+aem9WmA*-OJ^%M2qCA84xMd*(NLFA{J zVXEMpcv_wgG0K188ZY0_U%!h-Wkut607g_8@7GR!6ov9+YsQqL`-LBRs(9+~BOn+& z%lbpTD^$h5u;O#r$cY^!`6m=u=5J;pwK3hts%MSw=3AgS`7d;cT!fEoyhLf#H2mc; z3gJZrKprc1P5?;2qk;E&8Rdv1RuLki`v*p!qpJT^&4C|+IHFIK;eUWDl;~hO<4Hjy zB6q9U^P<&%Sg`MV7>|)d)~W={#u52%IR3+i$IduxpsF$??uk?V$7cQsgpg~@^^Zdj zv$xyz`$9~_|BjqA0b(*E7IV`!=o9+V6k+SThQa>S7~ZNq2fD^2X-|1|7Vp35QqyvA zne{lc^|gXnofaYZOpv;|=*`Y*HD*J;t%w0g(Yv3@T6}2d)NK6y)OeaR z-wQK*@@wH4U0t%Yo0*ko1iSak<6djC`K=K(c58X247m46w{w?nDeRA=6qIM~i+n|@ z+y@f*nvE&3D+!B>UJxWc8u4sBPpLU-5oZ8(7^9xE>P2Y zGYB|wm;XHKHmleds(l4{=874bj@R;xh%AQaadK zHbHAixs^VnJixLVr8>6yLrac}|EO2rc^<^jVZ$w)R7iz-{Z&vC4-W-1&o z9CE;<_6eUb_TN~_-rg{gKA44<`}H9_&$cPl{qlwUOkayC?WEd=SGKnn;f%c<%r22R zYEiBUiHwOZRwv8G;2I{$wNLvjT_3r#I~NT*3fnE;Ip|)kV&gwfQI$LZ;hLkgLkBaP zxP8>)H(wj7-UsT~1bvmPI(I*EYyUCC88`~C0fd;T@ zuQU{7`Q6v5qOCYw5%Muwz#bZH>0yh_AHQ&uE&R0#79kJL?ze3d`@Dm7Yq*@e5E5ta zeakxlgS>{XpTHQqd4;i%-o4iGKFXxF2glUI2UBGJJw@uhqm^=>GQ1~iKbItdCchKZ zNmFe+ai>Ly%P$Q8!DUpl$@@OA?0@rBVRY{Cno&aTmJiD;Kw{s>Cl#|?zKWMlcz#qH z^6AwbrS3Je4dJVu%8z`xLSN&)SwPm~jSJM%sv7bc#B`+JBZLy{C_J@f+vog1_;etd;!1gryZKzoVX@wF z5rIOB3PrwNG#uv<&D#A${#@h@NblaZTKkPo(QSxn-LoA!bDIXef>t2@fa9TOdWsgn%bXV@Yyga@5S>b~>VG}3G(1lXVXYet2o3c7^ z_}@ECumv8qaCt{l5=(r))Gu|p2Su8)V|-|Ewyi|{z0T`k&_|2tpsr@hl;G@KyH*Yc zto^O!rLSFPv%Xxf_~TuQ-zlAIrDONVa)IJZF!~>Y+7jz+{ANH zG+M0Web<3pwF4>o(8ss-a1iq z7l~??5#_Ku<~Jy-rg{n0guquFSqnYNV$e?|-bRiPjgFq zIThw2=k5a+uZm)^Lr?DRAkJoKlqs=H;8s{i*6jcarfbn8yS?-{--`u17;-@!8_^4m z)<=v24s!74o4VXW!)ZIh_tzT!#+p&-Sly>WQ|T7!*p|%5rn&6D`DjWS%I8{PKe6hn zsVt<6G9?2ve>Z1O(P&S`54w|YUaMo(pE00V$Xj`RVPEfE4=ei<`?`(?bgL$I$uHWm z!x_Qh4omSI;iN~Sb}$#+-!a$2Ff8S7)2_h#H`5LSanbLfh^6>{&hQ#G3}*k|LH^AX z{(rh$f_u(#Bzah)Tz4s4OqT<0+N-n6*=Zrn>su)c&=rH-$w+ zL|jI7h=-1;U=Hl3dv+2#6u)yM+XapRx4H@)E%N~J^#FG|Iflc(e*!{;$-GpX#M;ZB zwZZ$9)#_l3O{>KvE?jMkHR7`1B7PwmB4;L17i*R^-JLDQYVBiCb}2XNl(O%aGfvR# z(^SL&+!o_CD(=7C@&s2jw46)=rsv@zfp~0AyAOy{_4BDts#phYVH$br3HMsJMq3zE3B{nfS%lN@t6#8H1thzynd z@)s8o9d(dNjZCGjm!2Lc<&Ok+>Sa`%#6&h_j4_$#`Ky$ilmQ3OU;*?Ytazv?g~Aw% zPeg`MbGo0VM`5`1RpC;9_`OE_VPV=AHt2Dv=QpXi!#F3MC@BRGD*Q1$dR%+#VYF~q z^>Gyp{WXQXD3n8ZK4J@a)5*}nx4)}mDd?s7qsXqt=W}rqT^9h&QQoj;ic-bSTE2>t zo!(zyR+<%lFI!T6zW%XQ;B21P!js(tlwZap52qksM}WHH6_Gl?(H%gAi-Ar$37D-; z0LW>TrSLU{HuyCj=@Adrn_E5))_mu|Cn!frBgsQJ~^UM2^@bJ-@b6ge^?^ezFm%3FB zohqrBJ}~5vYCV$P1T1;TDnR)uz%_)mmCv2F+iPahC50k5v8IhOAltM}OKpw`z#l9RQ9;{jq@yLPXK}g_8&Xv%hh)l4O8|peV%MM6+q| z7odvEwpm3dbLCK%TMzlkc=|k{U~NO7ldu`6s2qTO7r*dwf6e;0I%{R=_x|@l3T_O| z4C-x~A@Rbs{i{`Zgt`yDVlv`~E+l*Bl%F}-E|5*g&klWeQ$1o7RP&iLMkpERe2av7 z2hFsxvyO!^Y898@n-=hW9E~5Nezvmn^-J9Pj2Pod&ByccRNO%qBD^Tj9k+P@IJdAb zh}6oMG(#QdJ|42zE+9!w0>-n=t!i|-d2TF{_Rw6Hl8FG3!~X-y@!qE*B#^v3e6bdt zr)-A0{}nnzTo%zBu=caIK;@m&syeWnmVL(6r((8x;#QJlcF0?*0uW%8e4d98qG}}I zQ>MF>5Gqf(mxV;ow~pv>Yv?n7C@4XJV&QwmzJBg%8-o?f3LI3p=I`r>m!UA$mLWwA zULLSUV0{@xd!OK8gP?;gW zUKrWddq}txX1n{z%8kIHmr!r_jVH;g8BaT6_ z?Cw9Z4i<&+4C*!y@r&Ib76mRzvYc8Y7Z=OnE9=8!Z!__QB$7vwQLW;AO9vCPz-7N$ zYbnsfJ5w0}S37racjNB82PP|^x^xAfse9_? z8`BfQgvG@CLRTITZs~Lz-sDhxmkBWg>8f@Wy~*Hg^|DoRR$h;rlA>nG1U&W?rXdvA zhHoEgI6?>9)Vr{Jb*Fl6Wl`P5lBYj$<086h{xvJZbG3o@hR+En(#n51Ry8H%)WiF; zJl%bKcJ38un7`1TFQR`F{t@=e`V}~&r1{46u7*q6EwLP!ZXcR?h^6*95cNOjVUl8` zM-TKR--9n9RSTd1*bDZu_3q@&c2< zRC%?U64=571ek)$q9nci7#Y?P+k4&g;G+lu@zUUULV0G!L6s8fL^AMIH0X}M{EO-T zG2gR%NCyfvJZ!6VbatUOYuQ353e#s2DoUrry!DwJ=d@j9* z4lI%)2B=6Qv#e#^PXHH^MXhV?B@O>GGN29*D^Z&@D*}aP^)Yu6+5E|-@KUIgHZNAl zI|i6ulafE`&zMl~FYfg%I|YOl=GuS7FFQN>Uu+6o-G5Q`UqtZ#&7j2KZ7Y;QOeJV= zBmfo}y7efG3{%EU?@)YUN`~u2ULH3K%hv8X0|y6(yen0q3W+|UGLbVBC^vM;6whBVoU_qkq4C_0S`kK|GtbS< zeeN4Wf#Hmo#J}rve%r<9kAj$wnD7_FP}8^jY5O$%%w7I?o#Io9*W=e!AwE9zSIjG% zzBX9U-{4-Px9u|4*x)n&K9fb@;PHL*QP;3i6&5|dUc5?4eN^z=i~siAp}y9zNU3CC zTRY*sh2U#x9+_26y{AlzE%-_s*9wh|joVaqADRq(4_RjfnL$OBD#9Nl{Pp@ORHx)Y zUD>yJ1h0dNx3&oyBaLk;D@T&A;zF!_6fa$3lR8&#-nZ1Tn+o0WocT5?vQ0hrOp<8X z5$cCLK=lw@G0Y-3DSe16S%I5iL9v)IhmMM&sZmp6!wP{Aggo?K#gzo^iYZn|N8aWt zRH#>kGS<`th27FA->tmb`QQ@?@n_cV_x_^v`TSP* z8-#Vg*k4Ov&h7k8j8H|7pUw`i^GsKI)EEx!6fK>`DBy9XmEObX4m!trHT|%fJt&qC zQ#Qrl2|kZcnSLoy!_)}?gnl&*K~O6_Kt$7A$as$3`B_zq{t>?4i@D-d1YZ#7gmB>S z|K>+wdEVN$$dWJC+{{~nY=#VWD70Z*r&dl45v0KEdLn3}ooGw;3OTl~#@(gY8WyZ-2?=BUrdWx102LF;0If~+)1j=H~TFSHh z*pM5*RV$At6yKa$pz z%|ko(`kZC>5K1VPtMD1g%yQSZ(~D zM62Gs>0YsR5gI{*vRr281wOVF9a!I?v3ha z?@_cv(*pa)ucVk1tq?hn?9xk#Ofvb2ScyrfgYYfV0rsL~n9;Q-SF6I)7-eVzpG`Zi z3IRJ6n}YvC(lNus8XN(+Um%KdYF&aBQb?#T==VM#f8*Cg++x1+rj~pC_fxEK)d$hS z?oXEwv!bSf@wKW+uC(3R{6lk37GcW`f#~Kt9K3)JUg}XnOSF3=RBR(!XhWn`UM}=X-bmSi~ z>(uHE7o(%3?%N#gJ(pe+tTp}}Fd`Ck*jp)-B=#qs=I{S7`a2Q?1DRzmqECyK`gM-w zx5_5=0H@ECG;IY|p)W&5x|9ib@KXIFEC2C`Z+i%#5wC*g8$MOOLDI5sjy6NFQ%$j) zB6*%=T40z}OVU=ph)S*Vato_%^^#_7L#kYGafX|Iy8-7Hh!uzOu`olW-BUV&xP z606y@{-3Aa2AAVkk!bM+(J^_s>2pb)9<9Ox_6|1d^@suzF^vJ(!h`oN z&~$g8Di@BNl-=M!C6k{JJr0vOt)_B-lX!IxO?XEbxC;>+Tdr0)Kd*JU!t7U8^x9MH z5M8pP=9uNYoVCoT6O_C+5uef#)P=Y{)(F+ju9|0b%2trk4!c`DcCxx1c%^3z#^q2V z8Q~#6qMGoBj}Q1g8sR<@?X;{ss>si0FVlk{&=fC;jmq1NL0V!B3-SC>C(N30j9$ zL3sF^CqIsp3?H^*w(IkGz-!CWGU+wK6)EFjUdDaa_R zoPs$oCI$Gvl1FXgy2?#{I)@7xseP-_m>j;O9=O6N`?dUZ&@)vb~p+(3Cp=atow zfDfpIQQyw%7knxy1u@1xLu&fb-0`0yy|iVDt%S+~D>OS(xcx?xNtTWe={1@0RxXkT z(zjdeE>CH7EA3_f)hV)Pu^(1~6gRZ^Erc=t>yPL;~XyO5=&X~mfE!QXH#10Z&zt)rAIoK>m1Mz>FzCa z;HF{SDzlcpT-e4D6lE0}uw|NM7{&mL{#fw1;A!*_C22nWbV`Y}I`DPb>Z7&X>8^G+eJo|v-Y{^z51cTk^|2fa3T-=W(@N!mlv_is_;Y7~tUC%ru0N|_+dY`FW-a_3pE z-+5SA$E-K6U1ES5qQ?nmAQ?@-?L8n;2XA#^h#Y^F6E{rfz+xzzp|t)bHUF%hVg=_z z4<>rbTUa+2$?Ai`@hC204<(7s5KkF$p8X^RO|JVR7k_5i>8l? z#2Qx|=$?tGGQ;%kLQ{_$*SFwY{kkH(9;s)n>k6ZsC11925w~oyU;E~4s!Z~?0aDr2 z`ptL67^TT}lDN5>BfZo(XLq5GgC6Mou8i|PDM{O`IC746#uvJ?zIMrF1~0bvKue`r zDARpbcm>GSfz8b9XF0eLtHPoYM#UJLAB;JcgH64 z?+I`don^>dOl{J%I!SlAV8j#bvlM7g7;%C>!*UxIHtVUX=2VK66^j%~iSX&r|+wG)t0`PlZqCCm)nxNfFu#2r{!Z2Urj#DU@ImU+hh0{Bgv7Zk^ z>ObZUcR44FS|T`>8ePNmK~>hz*NO_24H?YratYuFPhuUij-J`a3!XN;Ui!8D%j z5rwFf<-!H=!a=Hq9CrD0>{w1lbe}Wtex7*@0`vdVFcC0{1e?hh%(AL%uPH>~_wNsa zIbdMIV%7JYxcd#cIZ=ku?wn*ON-QTWu!u6Gw~hL64hw&ntI<)Y+Ra|oa2QtXI+C_N zeu@)E2}b1XDa3BF1L-Q8hZD?bNk%L- z;x;F8y^&Q~JQ;ShzTU1?2p&cC5``Rjyi;d97tDZ}4pP%kV*?)i#KZr>XZ$DbMa# zsmA=;eX9D=S$letHu4fmoW#Y$t#iY6H5vS)rLLz|a? literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/images/seq_net_monitor.png b/system/system_monitor/docs/images/seq_net_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2b26fe87499d258121383efb1ed1d0464b7a49 GIT binary patch literal 60053 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 z zKJ>Qwy7DGYoZ7e6vjLm2uI8}1W&fg;jvBzZr%vEH%2~T>Yilw31@59#8AY;p3e-hd z16fh7ZrK?#icfb>cTQioWy_Y~cegfcW$|@VjW^OZrbnIIt zussi`;xFd)@<~S+<%sjHX7vbkDWZ?bWli-q(>gN~wi|ZeLRz3wG?EBej{U6PPl-n|Ll# zad6e^wMS`p@q_OtlXz7VZD-j!f%PXx3M#Zcei}Y{f)?Jcgzf8jac!Pv}{LcOp!@a#IO!aJ0_ifE5`L!RSu`Udde-nS(o-Pb&%qJ!f{aFn(R=ar?REd z>j-B4O~#v+F1tXUJAcJapyNvtjwEadpRBK4L_?2gEF9frqi`gKtG_-yzT~9__sN5a z;M+=%_%JVuR^ahPjlK82QR@GSj0}HC7rrRMeS4(cGTPeNGTxcG;N{}=(V{ zUEca(@tfNc6ILz%km=Ox!Vhh%Y;Wo3jdL>V#$id#Dfh2em;keSVCMy|8dJi=D04U8 zG?@>j7Uq<;CmT=2-+Sef*-}hteGL6Ce&4axsxCM-uu2+~RH8oEZ?LdVL z8)Xat5M|Gr?s4^gvf0Nxl&(?D0j}=o!Df~wCSO0R&Cy+a>Pcv#Ho7By_So+pwMlpG zvZmbX`F{`W=vsV!bjx)L{bf-+Mf&OB&TRLw0nLLe-k1g?9^bSriPoPUdS>O4->dOg zXzdlOHSf@WE;J@4FR^m1At&tG?eXEB)wW2=hrX5mS7KYK{BS5ytL698>MQiSeq$Xk zvTL{Y;U!n1Qfkk7Xa8wjzJ)S9|Kjmign{JH11plN@;nkWCz2CVI+s_jPM4{ZcOQ~; z1->agsPQIwmL?|th~S8cp)DcW<>v4~vc^3ukZ0h9xu#O{?N_h^Y3 zm8k~rmi9MpFKWtOhq@$7>1n(m{q^-ZL*Mr8;-8oJ5^l{8&jXSz_~Ujd8lEY$G?Uf) zLv&4wuaD~Im%2BkS#18c)>GFSgm@iA;-kis-`6AmwxhLL1}K|PbEYm4N`5aF9*TH4 z__<{;@buT>^UXlzh9uH%$(=WhuSmLB`{n*o6OZ1PdP%!9G1Nl6vo?w5)yr4^nY*%8 z`Z97|-Mup>E=$LX{Is&Vj?T(;A3LH#wTVaFUm-^mB4oxb%pWEt*a<%?}#aku|HnfbAAb5OrG5JbbUsq+Emp|_Q@0f42RJ@$q^W|0o;ilL>`;I;St8XNjPO);q(VbnDO|aqiE0^UR z%YGO*uIzk;yIbAx?yl_V@70`)2S+!2*_J)~;Zo~7_2Umg+;kKePv1nxb?w8!>Blz9 zGZ44wPviJomS-W1X@vmkNPf>U=)IE)z56wBm6sIq2unL3f82`v$eHVJFL~tbuAH>H zUG`FQbl2m49b|W7>xsMSOT~uax3`b&^=^ox4TPV*qMX7#7)#zAcaeJnoy}jb211> zbj+-rkOH4As%aJaPT0&lU-TaD{Q=DMJnCb8Ok(*H!evv7tsXN2|GewflR4zVCq;tz zFaY)bzf)30EaiQd(%Qq{?agY2g`v71R(R+B2azt*Ej

>&h9S>zs3G<$_uz+r4JV zIq!@t#gp@?(xZOecb_umZI>H-(vEYvLZyOuy4!x{@~7NihkD5)gP*WP4b+BGn~=1-8fE_-XU=JR@E*NW z<4yL=(w1Gh$g4%1GJd-;mC4b$>%ocqfcS)I%e`muzvE2DxgH=sxIXiY8-kdjw~&se zZ80nz4b~s%a~j-4!qYK@}E@jZ_;J82f%-+s&0~AYkm+S?&Se+pDV* z&G|a^%lKaE0cO{`j$U~PE|>iimo=loC6-!*LOZBkj!?fVJ#xa7KKr!K>Ka)+5y;H* zdA8w$(Hd1r1JUN(?Fqkf;(J$C%xTk`_cds~N|m%B*YIR3)zU4a7Ttb*CxnzQHBPX4 zQSs=+Elt>T>KY*551~CLHJH`*zI)SLwk7--jlP{1nwc?>x4JX#I_|f*|J}X$ZHn>s z(^|P+&N^TF`SZ2)H5*S`?Xr@E_j_c2JbOTuy3o#AW7+J{GkCIR1edFhCVlu;(^OGs zjQx-JoKUwU-dR5{EnmmDQ=y$zxA2y|k=K7q=FO}+nBN_H4GXKm$@E#O@3%L795;yF zseZ@#~wN&G5x@iw`F)kM0p^Hj>}xP0jbc)3M&W?3rWiJ+p59wX5GiYC5desW-)|iR0PnKb|z_9WrSyx*uNcp{Dxww~XAWl$|>(w(JCZmh>Ei zqKC~<3yb`Z*ef+dhPhF_b@Zo^5| zo>|pypU}Gk{Dv3aK^JLDH*On8fPdY)HT~-1=JwhIFB@v<{uK~_Rke+Z&d(^D1GRR~T|`az@Z{KOi*o_T90v{8 zuV4S>*0$wiLv3}RUY=8d^RdJ2x}RTPyMH<2{W}%CW zJ?|V`=@j$rz3;DIzq&8gPQ#8na}Ile295=r!Y+Cr2!4A*fd_=@_( zXg~S0r*u$%a&j_oGorK)55jb3FNtrJYV>S_Aq%zB;AmMBkaa5_Uw8P==>Pv8tPg@M z3a*h~d0B95WpvY{v||E#n8ns*GqPG5%-FchqI-CGVVDND=Ux&w$&adJj;&3Yp1j*) z{yU&@fa!up*z`f-C*{L$tCxTO@RXboc0 zfm6XTBRUvZ$7lKui>-5J26oV$VYJNh-@q^qk1@|q`KAO$lSca*vi;CyBt*dh_lBGk zxwdt!B|+({ebk>6cx}_av@zsez7!i_e>%6SOZLv)$&MbUxZb|7Lu>cV@qS=};W zedlh|{wCtlQsx2ow>1j##Z9ecVIIL(Rmf0JKYy~Sct`0Gje|1^cIC<~cAf8Mj!&j{ z65{s%jNTc}u=u$5545hmsE`cct`%D-&}P{3VtrB}040)4;(z%FIxI0+^T_9LlmqVo z{1RARDe6V)+XVWB*&cXrChmWHBnYpz&}c*8RP}xkyr;E{7uM(V=VIsC!dSvQ0nmClO~4t>1DRmI`YXvD-W!q%B__@_k1V$XT6wfcm=`doVx| znd=chNH6WWYQQ^k(B<^ac|$8UMr<>#F}`=I>!Z~vFMl0ZZ=ieRfsG!^?SMoc$ zzka=>_s|NLd*0$xp6ng5gfJSIU+Uf9nmb9hz*%6KkK5Xo0|<`_5Q1&ryjcIm1=t1V zO2zkee2#IAH+#8W_k26r>%s1l&TlxnaI$8*&TVUQz*IFQb=BC-h}DrauKE zR|nnoRetNw)CFc?T~__aPx)6X&(l7=oOj8{Rp}~bJ}y#(7a1&W(o}hA;a47j|M^#? zie<~K4Ho9D#V&)EhE$xT8R-no47L54`qE>(ryJbhO_=r@q79B`@d9c#uC2G!d!jic zDR0|C#)l#|lkk|Er{>{ev%On|?}E^qcW=lZ`?xo9rRouphetGis>FJ=X5$XV>QnhZ zC<8XCS$C$6T3z)6dgJ8K(G8N7jz##SQC3Pxnyc`SkiV?Wx#rLZ*M_c- zgeNo4ldf2tood;feI@1t;m0ZmV=G)9>gAj*5f8cxJuCn3=>B&=lc1&8tE{VP_mh<` zx4u7b%x*9DS~w+Ib%As{C6+^?|GlJk^nLAogUaE%qZ8&W(rrJDe9z^d7JZpq3XbYh zFrebrBO|GI?@x)ojY?ZV6=%**RSLZIvK2R;vdl@H+TB{x_ObKy%2jP8rHz$I9Bn^Hg%w7;ZT#3)aih4m^U{_ zzV3o3b2R&yLtp>pklKmM6 z%ePcMIvg(`d><+=enR&hEsPpKVvhGsT70#D{dX4JGzs-Pv-+bO=J@UDa(!k=sr>o& z{U%<~S(-Lc>Bm<O_e4Hi0 zEC}rWoJ;lkcEq3qy+PStWHX!cPr-?LUv|vJKl!gY5gVFd)vmydCShfn{8#bb#T$Inn2>DGfNl5fcq;@Ip&d1R#+2Gm2pqkr~C2G z9RHkMlk9D@F`g+35=tz{N=={Ikdtlf@5O#giYccuSopEViZ?Vj`G8#%#9 zsZyEHvg&PLP58h2-Rg6mzVz7Eib0O=YHeA*y&+A<268_5mQj<*=B0Lop(E3KCKVMI z{x*?ImmwE^+FxFG$_yi6!>1{g%}(l9eE(EeL{lSpn^Bc@BL`5 zSe|VcPd#;*c2|2Hp}#h|r05EIs<_xt_YyfFoN&)l-LizX`_G0W>-(Q*2i7mG-uHKU zU(qN3o@Y%re3{1eh-N2j!6s&`59o;Y&u!m)(YW5`QD*11#cpLsUT55t{>guxy2|mz z76BYu`2gl0oQ@wlop9-c_0jcnUodS=LiajveO$SN-4QXbY3hpl-;K)owGcJ#wIP73 z_138g((65Z_5j!@44r8~8rZN6K`lfWI8}>*6T|zCpOBrx<^+(^!;`*E|1z)h)-VK;gKt|ZmdInaoeVG-o@~RiD#_N4~yTR$#>%;0}&G)^p4s9^J9^Dnxd7T`! zj@)Zka^$3@&8baEmLG6Z`v+)MXvbvi9jMk-i_%O6IGOWD;&3vswJ&##a_69MS;n@6 zsl5Tj63>cr^PlOTw^I~veRt5uW$&^dCKbHkx``Jai_zQB%-jH@YZ@Um;Z00ECQ3xft@x?UEaXH^_b=4hNcV)Bck5Kd)A5P+qx|#%OlJ6?sKKp ztD{ow?y6`1JpDTO&-dUl<08N&@~NoY-J%^*UUcAFznf9InSvBx^z&BZ*J4_=6XuBB zDRJSP`FX|SvsAkk7e@CY)IlRs4NT>;{|9!P|KmjJp~rP4o=zQevRzYRk}L_pCT7(C zG}*AyF2Jn9j5iu?r~4AB({|zFL#KU5)?Qc|e)>@}r68*5DD}|kt7P$cCJ%>D_<3!~ zwyqV_sbvd6gTaLC*_2|^v&Ni}BdzxayQB}_?=;Ew9{c!niTdAdrQs)6mk3jGq8DDr z>swnzt2NWpoH;4y=Nq{!5#6e3Ir5=s zrGL!ubzkAeBrE*DA!Dya;Mh`a9Ws7wpXgf!$WsUE&7fvWMDHIUZ#sXC*jhlv(9QI$ zL#95y;W<+;bseY*7d+x(4ARJoV?}x=dQcrx4QPy z`oz+Z7v>-fizzJX0%t3qJM`Re-3jo2Mtfl#uh#@nE9ad{`+AyMc~9^BGjv}@ckPZa zg5C{7^MvCm1#8xmNXOk|RLlG%9gU4FD|Hvi7aI#)*5U+1uaZg5@fS2OdobY<_9> zXjtUGzoOyp;HVk_9H&oFb}OA930WpMPQfNb8X7{8C#FlL$di z#|^KAiP~#(<32Bv6iz4f0is{q;>haL@SW;Qjg&R7I(|WpXO$9|BNz67b4>1Jm8+X} zLP0!USJe}Cs4ToCws=AnwTY*9^+IPR_L^z z?dkwaIav94XfE*h3M+qFq@CT~k>*esq;u_7)Bpf9-#$ML?khFO;~(o$-B;wja+7{# z>79;WS6Bn>Y`tfzRVbP$Lp~FnuO%28TIj~U?f7N7Q7;BHgMWHFa{1F|p$gsC5^(Bc zmtW={GFf#0-WTP(nJ5(w%X>RN<)1_F2oJEgAF8CP%HDlh(Kei!32-~yuJ@b>JrF+Z zPt$mlJ_8G;ik@zQ&Okn8-cYTU`#6bfyytwK>LJq^XmF91G|p+mW(R%iNBCfkCca>o z-NcZ2D)kaUPJAl`6M`&Lv2t1_ zFJ7*{Z4|RRM>U1$#gB$zfdEB11v}Jsc&7{aTd3DURV+4i`tZ8{u#PK8de4&X7tc)9ZR02Ntov|6Y zX+xQA?*7Lli#h{_6%CuglrssDZf5@A_=V6t3p7gMJ2%VAOmtL0quB?zb6rIho-17(_M68=JH{)c=vtJZvr1!sf;3;FlkK zZnFnWGnqQ;8~qPhfDYMkyBKiG+Lp{5TazSyqQ7d{cjaYg%+jg?L~rnLEbQ3Z{dQ`= ztvT>*yWZu6D#$wCZU$8TU-Kx`QCpKfv`{Pv9zoGh1U0(pN2q_)5M3ci};;x z{U6hw1J+bJ0Co*G#Lfdim$Kvzz;JrOpI_5|zV7zoy}jvjQ}#6#fQrZ)Y9>2==uS>e z_4M{G>34*MAKf730%nHh4RQaAGoH6}Las*}m2Ig_J&Qdt7>U|+t1-mH0I2KAutQmcLEv({pXjrgSCIB{|H;k z!VJLg^{brOJI6nFdbC>W<^%j`^_JV)ae0@dB)Piu`v)ulnYDox^afDot`uF-2^Ze7 zU(l*2|yTwvSk1>UQ0fU09>K;joab?)T<6m@pJysb6Q!mIGvU20Ld!};D4M^(e)+n zK^LK?R4eLYo_WzRcb2fR$2{MelkwWDI;KZmJkWGVQ)iiXk#FkL6K<#B`xaJh`)LpE zP5Rbb*9(|KfHze+)Rz+9T1=@wY&!eJ8UKBNk)?6TyCL}yA9d@`m+Iou$fw6o244XT zvHOc!8(RQI-NkOX#%p^9(7xf<*L2pBitZeRFbI|Wkk*`t`+Fk>TQ0cAPgcEty$V9# zb91~Q(+czCRascduW!92--`n;oZ6If-m`AmyC0ukQf`n2rvChN2`U7Lb28wG`7lYp zP1^tzwn7&&`RQCi;1+Q4%u&|koCP||?F02zhIg_aVt-q-DPP~c!F{TGPGy%?9^+^C zXvoP6O}_OtWD+lsELD)X3Lw@q-SR8wQaHudZho?-PLNgRio6 zjlJSaD+fjgnoaBo89!q`y*SgIynKE5!ISWP#eJW5?wn=GOYH^ND8>(S#Qu=a?m26Z zWqvMMwCR_(R$!vKX4Xf)6U=Qx;IWujOasDeb9L)`KN_qG&Kq6?R6S&H{=Ali8+8U-+v^L1&9ix?v9_s}k_^=0r8+`n;(UsW@=}gEawEvPIWF zo8=}^|iUr3TCq7XqtH1*YIS}j7R8eX8DD>4FPvIbOPI$5?C7$F@r*dKP{o%UYhzXSv{i+j{mdZU9Hb>^6|8 zn9gt&^j*GY*V2Arn8;4d2vYOgl)3%+q{(6}J*gIe4O z+Y>PT>GNl!(4t)1PR>0PwWX+_{My>h3L}rWz=5PX0`-Z-L>Tp}-kN}U>E`I-BcC6Q zytdzEd0_Y}SbYOq`ChzUO5mLv-1NkGtuu+ZjKEt;DWJXK zs}`(uL&U=Uoy2beLfzk!?4N6fY+!p6d=rG1AJq5)ws zxUuhmdyiS?9@3HC!|{(@-+&_kdRxlp7kDLGEY=sPq+@&`Uc+TRkxV-zNiv0 zEOYYXR7&f?+W)Dv?jt9MF4Y#Vy9B86CF`Z=XE_3EUF(pI8HNRU9Zt>iCOKF_)qqU@Grhczp!Y zO8J_e5oGLl0&quHmU%a52LWNoe)A+3O1?N)AD7=^`(BTzFhh^tXj$KRC}Y0;K8q{< z)6Z)Z-?LUXYQF@z6VuJ{8BBY0U-_6-sl_5pS z{MFIk`?@~YXISf8=Q`KATCc7zWm}y{_>{k09VlSX7AY3VtA%=~KqVk-!)*lF$7dkm zHBrtF^1~V~KWaU@J{J6|*i_mt%CMF~jTz)i4kn#+m5bGCLe>G9>k@k1rcYhN4NDLd z6J<2M#QhVF*wB`E(wahte3ojr!uL2+Y0JQbt)p@kHuX7n(_&}aX!+t#AL6bFquFo9 zC|v6N#YcA3LDazFhWCHn3wt%#oye+yrt3`SCr{(GcCbE>27{WfKS}M3C`%z3d z?nqf&$3Vq}uusn3TLpJ{Cv_^4wj#bEYR-g#r}C;tGZn8EcvOA(7Pn|WbUb-2q{FPV zari{$C9eo(#Gu^$yFnRpdsaq3XK;_x3%=;s7oUI;()wuN_L5GCui-+9xAX180a%e< zg;;?(2(Q#adIb_Jq82G-dGMd47uE9*c5kK-Ewk}8GmmvX6Sj)IYUc+*w~?PrLH!Wm}R9J45US5CF0 zi2uQEhaknw_?KoH={N_p^NZEne9E^*F`i&JC7)na#Q@uWIsT6VnvuYJVDK9a-h6a>g(}tg{5puN&~mFUDWAS zwWPYnJq|RS-q1Z1-{W}x$2Z$D1lFR+f3yvwxh2i(QI4Y)MliY=HMWb@%ppY|k`Bq? znT2%r^07_MpmQY5N7y6z8W3{XlAC^ra)nBDwt(Fz59DAQMTgWdDGaH+Y=Lc_D!4HnkO7utUPF{HyqTxU2MF zM>r;*nI(|Gi93rNo&UJ--zN?Ni24#5^${8*-14HsvYe*_4E`QCP;JI>n;NIx5bZzM zoGs=KCXR3v2H^dq=qeIEC4D*Z9JP3YAmey7n#o!V=H^}WZq)OqLv?)0a32LRCk)`| z0dG+xeCky!vLGr_f*FZ*KO?M#EY5Do^*8hKKZ}Ey!~gFrj)xI(XM4?l3kp!qe|UIL zN+Y41J4BNafM7z4?{TV!5wN^BTP~XDg!Ix2?%Kf9Q|<9Zrll-khMZo-JCtg2CcvJL z;T6l&M;+yEsbAn;VlHw?n=)8jzGe`n=9)1}FAy)lPza6_sz)^Li(~@bzy&AERy}HQ z)oXWSkyPNqtU_{REhX_o*lqAbWy;1WnkaQR#ZsZpt1t6#+mCVi!s51<`#Z8+n>Y5{ zJ?{N6%6N71CZEL}I6W*J?9#W;C*kWgPO^C7jy*BR<^Ua1>jIS-uO9~ouYMXZxHTBT zz$139n;p@11aEz#0Ci32PP6B1_h5r}>E@%6M^|!vzkOWzdXwcyltwJa1Vl})Ns^~p zNWPDGTo=g-KKv||y=(S$fy>e8k(j%m{?r0w9kX8PW`4&~H=~BsOyguArXRsCSkWU{ zj)pzVH23Kc+aqaqsrVcdjBsWhiVWLBKAL4pT}vtN4Tte>x;Y5(o;n7nJeNwNJb>Cn zwo;rjRaZYg%F68<_96lrh9{rCizi&$J?=WBoW+5b9J>---7y2z-f1w!?tOz!2D@&;5Q(KlSW^co?KNJdN!`1;=JNSNJrfkI zv_YhPWXSB1bd-!EQkS`S0r3%X9}xr1$8#TcX?v=qz`{Uf<*+%T>9T7&2=QgD!_~z> zLD+M$&X?{BAm)Ci2=Sc_sxuJpB62ka(9tb_y?xZysM-_sVi2^O^>h7dI{kFd)XUoj zcRe>(FZlZTo$k(%(@fx{LW0^ntr*ZRof&EH_FWsf(jR;ij}bCL1AZRJZxTU|>!ljv zP~b4Z>A53Y$tzNqAqQBFTqv0LSw(Jq*@_P+2L8)aVfiB>kDd zFkz`Y*^MBGTuavc_WHj&6F`GG$1^Qp8Q9|wcUXF`TcK(onuoad%6bk>v#)6n>Sn~8z;U85n}?i#V&+kh1>14Iz*^E zi%k?T;P#y9Dv5zvJ_C5|i5wnEhBMgwXPPI ze?LxF6&ffe)AOT^a*P7{WeJbBx3|Slx1tNt+7+cn`P5kRin3vI5Db2wvIF@OGAaLl zoX&)JKhT7=8~ZO~$snn%c=hD<=-pQl&%tKVAW z3aQ$~V-kPhF-T?oq@!X2p1#nL&H2fVNZfSyUAB;rkf;eDT>7P*HRC_(4TX}u;E%^0 z*o8|hf5N3GmXJ8qw4mSvP1})vW+c3L=lNH7vD@|p)}3}>E=4;8HU7SYl)p=!!8WB) z2~Fz9Faso`RO(z{rc)S)*GV9QpwQ=Soj<$0&!zA8WhFQB3UPjTg{smY2*o-xXh?*l z5JCp!s1bzmZ(3j6)M_z;4Uuv%X1oo-un4fiTA}ZdVU7ee-a(6~!L5rYh`2EJeKYX( z0@Mzc=bMRn>7{sY&6PWv>z{7OK-q2B7CAK+kbX$na16Ur1e=Tt(XClTFhiLp)1GFWIw?E% zNvjs;8GsrW)sd)RcQ<+oxP5wegk9E+1c+~A$NhqMl8u#FjVNZJ(UMQF!-1@Wib5Uf?=K}1D`Q`?Mee}rY4G)-Wz2T5_Mdjr!o)he{{5H$|5%k9>K7e zcX`U+>jP`g)j31WA#P)CLvG{hsOQ%p^CJt-Fgd7R=zt_Tj(>Z4@rWvJIZgG> zRBY$P&aA`0p{oKd=jA#L*41t9H5Z>T*1p8;^mhRe#5N4T*jwI0N~?@@H@SgO@g7k) zhvl>ktQfU`R&&x>Q|+U_fIm+a#gNA|UPre=TCCdX(x1zPwL!%+@@wsZCQSZG%W2WA zY!dcZy|iObB%TKd0~U|;r1zQav};aBh+ zoE|WR@sp14h7f~fd9Tes2Zv~|srC2VZsdPq?4>>>rIzidZ_B-56jQj)zG0LQumfop zd2dAnZc+oJgx(4L$EfIBl6fk%GIJ7D5}rK0YM(eFCbyi=dro`b3t@)!AfZRMc;8>- zhh9Ue5AIgpM7RefE8l|C=(3Cf2b027QAcLWlus_Z{>czwAJXFIxyq}p?Gg>2w!%ZT zSKD0q{ZL3)4-X~dk}N+Z#VV!Hbz34z_UlnveqSbBMUdK;eeXz+Sa zv1aJhd@V?lt7o9zdiTEjYn&mL*!5L>+RW1|*Sjw!n9~8FFVH!i>Nf#|?oFs)K0Vug z*B4m1O|3gnESw8Ti3nCneyDtkgmZElvId&*++ohc5RQm>&gkl9$TEPc{yEHiN#{eq z75?5rgIJL66Y<$68@wk6@11>8sphtIopww#pUsZN;RNhHntjx}H5D*VIc6PEH#ASe zE#H)yix#S39qf!DsnUOuVoGPEXicig|GPHTt;`odzP>3j6>bDZ{rpfhpHYD>)%lTXkNj-&|ex3r@hpalOddeM}0gic;^ICt59Ys8L;*31wHFQ=s6H`Sh->|0ZIbA zzK$MppKMbDupsU>j+=Uwz8@HQ9KaMq=yp+)z$>g_RGTy{o42p{?bz61SckoKph_yK zuziFLVSJJ>3ApH?*F0khM1lcTZXpO+e0TKJyJTLfIB}jh z8PTQrLR@!7TmSyl1V|MWwL`ABJ2{{Ls_jcKtXlhSi~fW}EtgrD#l(;2ogfv&SEum` zt8)u-OIJ5c%0fMVfmzyABarvPS`ZhAAlWv^kg4BE|7v_~Uz+sg5{I69P3O#(+{imcddpsjpfVd#-xn~PY^d2DGKzie zD#C=V=z>bo@db)BB%5*n3+d6~LV*7Z8W*Q^MpIQhh|sg6I3fRTN62xvaT4%Vg;CNx z6xwL@+8*B1@9&{%;M|X2UuHRCRfOT~xaPqQm=H;HDQzvO^ubBAp%4w17t-0Q8F{VUAfVVM1GS`C0fB+06$xc#9Y0gp4JJBL zvU&T$zaJ#CBu^Ch=hX^CX5gv(ud4biq8hGH%yhYr zXfq>@zUFG!(ZzVv{R|`>!I52W?ahMeOf*9n@zu7|zSIV0w;vYfUs!EI`tKVP4tKK1rcmAY8Ll zAzt8P!P=8G+`L}Wv?a7Hzolxy{XOk z*e~hrI?1TvTJl;K@(NqB5);ycGW(pzQjWCr6}Q~nk6WI?RodYSbT@16^2Ou4z;Cw- zSkz#}yoxR|zC`x!T=!)iJ5hr|t?t+x5bm^J+kyajFFF`vUIMyOwfm!UwOq z%VZo1B+c6_l$0dBg%ndyx{`%MhVJu>+1Z^yse@`K4EpzHPu*=Tw_;UO-ts{9+)8fu z^@Dto7769wx2PDJ(he<`PcIt_B?P!kS-<@5T*o>syPP&vtksd5u&BxUa<19d2JQS& zmGkNkqFvI_ys%xoL-^$ z^?GND)^=+pM#UW?mwB&f*f9#l4qIa6re0qvR3nTm#I+3uFY#)qQKSiZ{S z%bXjGDKEAbePx&Pr)JMg#lbz!PPu+geclm2z+0;4(f%VtGx5#Wi_`|hDR1+!0H#&J z2W9$4teBHblrE=Ps#?%dod-3IT33W+MEhh^}!Uy5k7F)cNR4k zw4*`Z!PmQ%r~ryKT#8_yLo ze8j$Uu95#Gnhi>f_b`oLVI}Vzr@#8hchBAV_9MpG^3+LW70E04U0oNeb*t_{b+8y| z&~2zH-6u|+G*38UlPynUqWRg(_i<9@*NfF|n)fd7j!OVIfKQ*iAW9ypcf_tThfq`5 z1ko5|P9-WY2MK8@h+0%}g10LC`B2j?aZ5Lb_nQ1J28!PpVjp2cu&Ex^(xYgUqyKry zIb98xRBA;-;>p(i_u>oJRSTy0?)o>`W4-JW71RVAS0JS%7DMv*r69gd&0Lo6&mY(l z*~uo_Z!@Mg_$*o_jf!FPI#nQ)lGGM5IuU>{vRI-hp*f9DXg)GdvLJ)EwX&_0IhI+OqbanuR^qX>QOWDgsYQWR-RRU&7 zyyy2U<>4;Sg`EvzmkVN`*m)R1L6^m;_0d-_LzHQGwwu|erPwxzS@3d(!ZkGQ?_ZvN zg0Xu-d;D#@b-_vMq#yX}nTOX7qq#3IeyuwS7rQ^j%6p1;cc9VHm0~ZQUZ=)SiXKcQzcYH~* zLHhd282O%kQ#}ReW0`xFyijjaOEX(y9*3Q45tN*xB{(N?3*m>!Fe4jWIlLYwk9_d9 zrX?iTD9F~nkTUV3wM;_MxH=cYhw;wa6eXr)@5-n)uf|sj7=V1K=6$E6W=kTK>XnKH zdDw5HJY7Udk`lcrWJXN9W?vNOwS}@;fMV zR5K?aFr?ZsYDPJbYwuL(-(7mY^pRZ58|(IkUCcSj z$J%cXm9GRTWJu*#kV`cD^AZkMzq~jcGI%cpBOJQ$;U3u?>AiO(_|9Xr6WaJf6pZ;f zIXMLlI$sJ4b_A?Ao$5NUSi4Nixa5Fj|E|nHSDI5^tX_L?HCpk^f{P)&XM@^**wlNR z=$I(C{#B{3#d-U(qUD8zfTHHWYqj50Q-U_gBUqUs1=oT23T@oNMb;vS&s0(od~zT{Sr?3WZa*pyqANz zo9?nYjI#_!@Jt3f!!GgL&cG&Cd9soHs(nZ@Q^7A38ZM0kYlwh0{M)@jTpLii2{qId zP`Y_tHIh;8W^3`vKdI`Fl5mZ6VAzE41wC|sng{Kxg0jjFSmmy^L9`+6&`yug)c2-q zKD)R@;I!;H6nqI+js6v80I6*rS`U==^NS#}xuX==z(y}wL6cDm zVSkQrM#3Lf9F{zLeCxH-)MwVGH}*aqx_@p&8_mswXO(ckOC%ZE$yd6s&b=XnrcL)>FZGvLS2xsr#jkGEOu1HWUC#$gbRu_5W9A74gp0#uv;ypKq+ zK>HXkWX!L7M~w9BigIH*v{q@lntREf?4wh>5|JmEM4!cSV?k@dx5*;dOo| z(Q4OKc_%??)F%3PD-@iZ@cjJyy2=J6yGCCm-1Psx5C-wM#-PZNkmH^+v@@^L3(@5u z_Z_ORnpH=D&Jg# z+Iyt_SRdBrIgAU5Ns(rFB_kd&lm(M_Bpj)~j6JSYjnWwWV^8k=FMCp569QCTh5~pb zu7WLR38I6xSx__7M)2Vw(t82{YyUZq^7b%Fopu#fEp$O-5C?GJ#Xul=loB54u3MvL#U6y#W}c+36^>S1YZQd^;7f4T$a*>Gu|b3K$o z`05%ys(x;xnA|I0M<2RR-sp^HgyIA7>i*r~f%HA7Bf z?rmYL3(9+E%g^Ce8U_jvR3Pf@GaGrGt@4z)2n3s_;iNd%=uT*V#-;+@CH=yV14<4#bY!ntUj@jB+DLu~q zH3d{i{n8z!9~q<}^9vBl^V+`*dv_*-5pn8Z$FKOyA{|VOtOiP}6HQzf38|4}8i3qFqZ3?Z2w*^?#_@@I;Wd|P*M{Js+^AasBt%O+~_gCYnw$6K((00yJEZp8nmaKF=@n(cPAT0|&%%{&wz@?yo$p zGbPi#bLHeCT;>U2&G}FX4@8y8nK$DOd!}U7r@j$TB*&tvnTrI&Y@h9y`$;}g{LY2M zsI{l!z&Tz;s_W}NEs1zV^#iT;{UuIoD}!=zk-e3Ee3OG2H9ur5DCS7|3Vbc0F_h! z_8Kp^{$(;?sw_fCV6i(_WgY$sEJFY90b~Eaez^9d=M(}rnStJodpJ80^n1cJr2aMG z(Z?rqW0gW5KUNM12=FTAhEjpSYDXHR`;CsDI))J%?t&NOHq23d7_@zSr?Sa2r0$;f zuXU!8LZRE&wbMG=AD13?RyWGye(IG^ld8KzrFXPmb&p>C^uy~B*FDS&UKZu$96#2^ zN~^7w^KzYDYC3_d``1d@&imQ%&-Z_f&IS(HeH|V9zOkC^nR!L=)3#F2{ed2ML7eGGlFu5 z4M5a+P`f}8Q0$ft5Y7gQ0YcUd9wfdz`bgI`{iz$|VZ-2Cq(P=`mVQMDbbsvpq+p11E zH!(v%QfrpIUS=Ny{s$g^*hihOW_|Nh<+MTYX5!TJv{o23#sQiM_YzN#8ImHMWLafg zGC&eCe8~|+>(3s(Z@O9sLsbKRFZ|-rm5h5AhaVJg*t%~&uU*RYn_+!hxw-Y_(bqCz zylC@!j@PGmdcea9G@Q&E$nyOdDFHH59v`J&Tb^>zzQ_?e|2lmbhWdmHUjT6&slGUH zbmMzv@DWL;t~daHFAiOWVjjI;bss!#&a03okLLbR6V4>5i6VH|@$laDoEnu?#SN*P z2pnWhes%^52h_#-D(&q#u6`EhQT2LM0@zqRqOZ*IE#=+H=FQGa=K@#XXn4G{Jl6p* zM)220PjIxa;S;avWb;l)8RP-M{rpEEs)R_yLGNIPXU34%cwQS;IQcfn+gh*3@rXrL zOBwYAHt79-%;kfHzWm~`dMH7S z$W=yIFIHhW!p5V6ui%$~(#EsF(zqNhqILqAoE-PY2H!ka&Ba*3*HJHDx1r;+L-fXL z>G3|Aec^WvwM0NR!wsoK@$h`OMEkV{Bhvhw>5n%>rIjC#htlxM$PAR}&oA^uVT7kL zJiEmoUmU8=Kju36q3jf9U`$7}iFfUTXRPHtBl*kHr1|HFUj1{h1Cx{jH`~9xI2=59 zBp5J^#F=N5mLOk23aXs=oFSZ;`8w?Kc-yCb;s#ru+D#Vs7dwx}w!10IA+*qjVy!Ok zhTZ~U>rd~>g{fxB9;R3wQR<>BqVFW+(U3Z;Ho&5gsqHSx$*>#Lv5$Xke+~EcoMSD5 z1qc^U&K2(cap?pFTX!t36EmvJ)+` zeP(q%CM|PPpvy^t^i+CzBg9m!k03^9hbCLmw_LuKTh(YQt&fx4KT{As_G@$Cai?g| zHyT6t2j|~#-yb>P`Wai*t+-}m+2B>|hcZa#xTO5^^Zi@FR^QM?rs$-VgIx0&JZo)S zs7?;*g{R#`yetj3eBNKKV|`+{P9?i2nMrUStjcEK!(yS+m~Y%w>)?j8yxAg%9M3+B zsj#^4R(bYS`W0N#;^4ifm)_4yXKzN;0BxUk`5{z--I3IT7kF$JEkcJL5y)g5LpgsP zZE|{P_`D}pc}Ea(CNjS&xrIju`@^Y^EUJ*FN{{qj8fmB*lFr-RBxShd>vkCzQ#nr( z4#ppabBi-X&h0&XcJ_O-D<9m$q2sm=;A37WRk{tCm^KXFf2IiJM(Q6Rlli7>Va_Mh z<@?a4aeUs67iJzRG^E0x)Xa1FD7qf=UNDjSF?jYB^;^JDJPp%@;a%V9>s_{sNqRl; z{`y*VLtgLkFG`gMRK7GM7oxQ76^X(&4GUg#?;INMeUd%y^Z9(OpsD5sf6-C;fI4P5c$EIy42ENAgzz&AbfqDeXa4w@Wq)^kD_pau1VBIfS}X%6I|ZczPd!W zP%mT~;=fQ_sQc?%TLs0d?7seKkDgZ z!AU$B!K1Yw)feFf^9?=THeX*p9C%PSE3;Ri^^Bf?o^2S>ks@U9%HZX}swWxAy^GeE zK7ZelcV6jubCDV)?@#7E4sSlA6Ut4m#-=)k5U9B_d7&pJPcI)Fh$4rD$<7qlbb*T1 z0R6@S1M_+7nhW#X>FpA_zyXH6D0<3p9Jc0Qx8~Mo3@PTMjb;NqQ9TctOgvw4?47vYwY~GKcc5SY z@S!uLq?GKcxW`}d_O%DE%3oDb;DbBiV&K_2|MqO03umG6%8a54hz9HApP^9nvJp5C z&pAL6dq&X~_D+m&UT9Iju6iu|vf-~^3WAxSq@ld7cM8Oo5+JpEvv#pK0;{cQSo&Op z6b6@);KhZzrFk2CGZB0_X3PZ=9J;VVcfD8HooDfj7ixx;E7onH9n zw&NyqrgUI&!H%+WIN1h$fbHBli&P26Jjl2APW~97EIOmqJJ@2ue~(Kbw{$gzGODT}63Eh|rjR&jS)kincj01w2#Lhq)A3wsM@w#(Qr zoP)p6>}D(qg}pAqH~$ZFWP#(ngnCX@c*oTlmd1yJ)=jbW|fetKn?NY`p*S{~@LV@bTqB{LJ z61=+OuTIj#bCLgkt^iIPf_VPtC;tF^7P$X+XH3nB-go7dj3c}_p&GVm*TZbu#+y(~ zsRKPTryD+1=xl!R@K9Y|No+2Awx8V)4}Tx+6c!0ot#4ao53ry*_oX5ShIW{#36%zse+_p9IQRz8c0bIP53>y+KveaR6TO{Z?km6x0Nx8yKZPEA(cN zZ7P5Y*T^P`vH zr=$ywE8yZJejYDI3`>q42`T2)Iu}tPf{p1q#R<)~^nf3ic2DmcegYxNX^S4u@$42= z>ov~23zT3$d=cYy^E?v{rzROhDF`o!LQkBa?>&Y_Cmm8i&W_pxDo$b!t1>!?!u@RM z5+~(_gD9Bz%s-y1l^(xowgT*J#~Y2qm&fPM=_O-Lr$C5y8xS6b<`PsHFK^6d=>U4C zyMM8-C|&_jX!Ygy((?nAS;fs}ea&b^{*aVGL z)vzW-aUO>|>>>!-DHfDJbm{+TO>^`(bxFSi5I$&_%{>iqS0Z#b?F1$kf${FyeB4CX zQUdZmpW_nsj~72fX^*v5d^J8O;h@psjBj7XYz;GtE`syK?dkNP;4QOrw67HV63m&1HvA zMN4*zx$f*tB^o#YbqY}mi`>kevr|36JNH@5Con}<#sbZufLZ|BOQt~c1MNDOk$q*) z$Ww(Vi#RV74DM%AjT)C2mjG)X@yC7`H^S98_iF<`E+CNMcJdx-0hI1ir6)I^w}E&| z%s#X9WS$_Y6wuZ@F<+X0x*+f5u$%^MM|fAdi~*!BI1LoPC(X~o$|obI7M$fi>Oqin zPP+#GOt%afZuGmqp^wAh0O2<@E_Vt`T=`-n$%63#>7{gz0r_~5VXg!8MsTtbC(X|) z#xnLdBYl1EpEIb3fM%-V(HCk3EqZ(ik6yD1f5cR(VBZ_k+alu-tsnR3Bbx`d)fIlF{E*4^OL&f5&PyXT=1{0S!Ks(5e&PdRDO#ox?^A) z)_b{W(6WkClAIL7`-=JJnNUpzn>{u+;K0ZKc`%sq;uG*vyDrI|B#3)oLZt8YI^}M! zycdl@58w0a-4JtKGV?H@$M6xoO7+x+fW=ko;huLk0H!oLa6)D3+rH%eb|Jmj#y8cP z!qnb*57-JcaMyxZ=zf0D**9jsFl*o6S-W3TZk8B5#X}4YoiV21+&?! zTk%l^cL+v?Ii*Ve<5xlD=tQF%W@spk-#mT|G-sVK9+%n=t8on#oJi14MOD<;s4!{X zqdos{Riqz^s$Q`QVhGqGFB-$JyD>UFrt_BAk(syGrjA$KA@u6L{`4Z6_3XaPPZL*0 z%%*5f9$e)8GMCCJajc5!1L8p<|5&eHE@IN1iqW~+J5hOKJ3s22UPAWm!psGkk=D2U z>5ziE^K=lax=QplL}{Df_we+bhLA(-Yr2tmF2xh3k=CD(UQ%P7d+RU$B=4hM-5&4h zBFG%gXyGt;Y^Rsn{A+hi5VgUWP(HT~-GkYwsU>E+6Y%#yhj#}Vj#TxJpC@rctVlcu zCLVVHg&kIn;%GtwgU!CXbhnNu(B-uJcea`FroFr9x^7wcsd9S!lV#mv8UBc*D#vGP za8?fd$15aTfaQ;LKi;=MS-YhAZfbAJ!COuR>T#uwyaWKAJT=iJBYAsuLE zB4hth=jI;L?FQCB`;@k$Z&DI@60)+2yxn}*x%cmjr?{=Zvw9uEN7NsqY}}YhpLw3V zxvXV%j1mG{L&!HeH9PUYxk1oQGGX-5rPpfd6f*`>NBnK-1jKwkTdd41!cn=;IPEU$ zJ*_q7W!K|lxI-}V-TOPgs zI$jDPtC6sQI4uN*jGOW33GPnPh1eu5zV|CzDBZI~#|PiFz=N?iSM3BX3ph&T&`&PM3avi>}Fjc2j~ z8obJ5+oxg$;m_^syIUFw-Fwd+ZUXCTNR^{xBD)t_YlG=RfU5-bFMo7agp(vBj}mQI zswEeFM;wAVLi}H`sete^DfKKLq%c2mcYP z<79{G&ya=?sq&0UPsBc%-GOjkHT*9wFj+S+!)})KzG>kvq|fv5D_^>z5)Z*sP+rGL z)L7-d>B0r57c;^6dBgozRLN(2nCu+8Fm&pV15yhbG8pU5f<;b(v)F+!h8r6j9`pIP z)3OH2EREq~9%yEe1h4+n1PZ&WhhpzRUPb>^vEZ*DIDk5=7h6s63dWgV8*=RJ;W?jj zwryuSio_Gk)tdNSt2l{ecTke!^z{)A7kkN5)Hr;=@KErvl0JtQS_;58Z^AgE2-L#V z;cGVuCvo*JrNc7;V-FSw2<}%Rdv2C_7kQdcgq*lORY4Q{WT-xmWLZ7KXkLv zQ08fKwp;0W(<<4AL!@&2zt9qhZ8@Su4fm){`fD8!PWCh@>0wHIDW%}7pJuO|#+O?v zU@)0~NBT=4yWDza_&>Sz|N4{tsD<*n(FCBjUqX4N<7C^d(GT)u8>u*m!lsLIVT-m8b?EHg>uD9aiHl3c=l6960Hb*Tz1@>pdxhJ_Uv=g=wdI5J@kv-y z?FO%T6bGeh0*NOpMD-tkNA+U5q!?>I=dtD{nYEX=C;>6&KEV~+zyTZ2y+xe#a=-7Q z^~YVr$orTK6u8W7+{uLvMpfS{#SLnk0OVY3gV|c3zd5O0zCQAM=u3lVW0PUirapaoLI!Q}T6JVKoZ#`4RrCqdsiP`5 z@+{L74y|1>$Rb}G11giq3}7fjVyQ?mvPJ@jfWSD_rbUUqgOFr-rr&ITUlpHKi(qn_ ztBW=NCtn4ZCf64s3%!@>{0tH~*7r4V5kvVG3LvOs>-MF}BtcP=Vgk%8{eOF=38*na zOhh%jXtL$SbpkbeapFD(yuR2ZFB+M$BKqDajNmMuXKHEf@vkNu=n|E~bS~~yGGX}M z*>I?wH3Fr>G;sZu8Ib7lc&jJVak*~9$pvY7vi!lb2gxjjHa2np?7bbn4>C!YZergG zN~2AfbKCADBV(CvWZdP%Jk}?|4{Jlj zeBC^n3w-*AR6?4ZXTjDd`(FtV?ROly@&V{ek;FMlR3rm3y?iM`q*n1>q^;5C&7nL_ zN?01AFW*zbh81WNcw^ucWJ46@Zo0|1j*1}6DuYRwIT1-Dtiki&qDZp79aAZS7K(1LbS#c&x!l}MVV7;2+4fb)P{Vt&#n z)3i1YI7uBSX5v3$^&k#OB6iD8MqgWRLz_UU)2&wk;HS+WZzj)0#gBeE8>`6g=jSKk z@gz~J?H zWs%)YRplY<@)$8UcJh7KrYjqlqY%xL()Ow`pgq?q*a;~hp5d2r*)|$p8@(!8e9=hC z4h#iC@mE9nlibewWIjT4Ry*qOY@I=A2N#}8@_K2I-i$M;6B!Hod6`wgw~E0I8}nek zGmiR>KvqDnO=YlIsoAS7ee*^Wi|6u_UPT0}dXM}$wz0$hb6hKGO&W&-AIzT{ZS-@0 zkt=N0kcP3I@4dI+Y;{0XK`}`Vh3yxaYVg`UymCD!U_F-0+~%CgOT=_XxZj%cVN|g( zCiKtIN!0m~Oaf`;O%`v-=8Ow;#jP(jpb9_gq`Ra;Lka!1*u$G9q1 zlVY5^b4f4~`sSk9@XYdbsx0Y#lrwCyW#DAeR}B1pgx(eC-^Kd#YdxM7EL*~It$YIiU9e)>-1126t`X>c8=xGNXy)o*IfCqksAkv^2@A_cGRk%rsS9^gEe z=~o~ZU7=@A>P^0I`|+0JM^eo<&;*=Y_Nb0L=?w4;E4+v~>7fokiiX!U7Pr5?Ho93D z6%CTS4xU(rGiF4W=8YLL)IvK?Y!V2{QYG=580o{oTla?4uP!~IP^%*m&`WcuU09_} zayh*~>VYxX%&I`om%IVX;_AtvRkwB~yoYY@Og1E#8<#>ajWv(h6zV-si^>I=q0$#$ z77>e6-Intf-cn_7&za0s692)yq!{Vbn{+pK4^i2NsQ02^&;86~y|{?XQ@}S}-skkm zGB+z|v!m>D(Omtfibq`~CWZzR^FMP;1m{2PJKDH(k|}o3*mpRbS|sq~S72kL2R<45 zZeAaSch>4X-pnjkN#~Flt2%v+^;)KB?=RpN_-@;HM9xL^p34e!3iA04l zQd-%QhNstoAUF_GsMllj+$^_MpW~lLf`)WD^=OUHwQRYRIv_*B?XSQWDLnfE7g`En#e z4H~$7%9xkE`h@yuFy&eZ0Dy}~s^J{fs;EbJQP}s~nR06{fzt5Ee1)7!%L#g*7R7jg z3zSiR#gci10ul)f+7oM(Ma)F^NU+*DM!iYuvzYBveZ$4nkG#qS9z+O^7ZJ(j=EP0^U#mFF1q_UHTUGcarER5JB|1XhgR zKpmV@>!KT-r8=RWmULQS8u5_#TeE}QD}zERgEo#HIf!0;H4FCknEfr4Yq-AOo_baU zS=o28U9VnY0!yWZ4THjM%rlplml1gdIJo_fDPGQT(ue=X7VdG7F*uj3VjI~jx(uCL zDlb8sz0xm=)G{D^GhJy42A-G8D*B%6Z^(c-3G)@BLJ4S?p7PG_W*SebzM|1P1gI*c z6APfC#9Ky z{h1ME9c*2B6H04Kb6lk8r0^4`H7yN*)Kw<`@pV7+X>j;W(7M6vD` zS_V92QAPuM zp3|AWE#M}jh}!D;^^i^g@zzS8mgbIxnCy$6orzjXaCKGbY>^<4pi1UA_0#zivP31k z&ijW(!vMW8yZXY7oyIw-D~3E4%nXsQPN1=Hf87ff8%6^|>ng2xiEF zN*T$dK05{ReUH-KgR3jTw7vasOp3gwIfCBmat_f=tAr))`?Wr)=0)>0l!oz9Do>1N z*HOVzu`LYqv%|IrcB0P4&+n{`N=|U-q)A>JeQ4`!^QPa5uNe1G%v$W^hMz4>Y} z$FWjM&-Jjy-z~OGk8US>wd(%Zu^mm1*&E!UF8KY!u~3Z=ft&!w2RDtjVw9}%bXns| zOx2Dy;-^YVdp%Dz7Ey8&f#3;Zd~NMO$;(4rrR}qJjhr**zceb6^Zv@PzU&EyrBm@Q zkKXLMEQzO7jlosd9IR)HmOQmhVO{bI=lO($G?_>k29mBTQ_&ja`HS2~*9o{ew9z(R z30}eEKi?DH@jDf3RNn8Vu2LzEq7=MIFq$|9NzIN|uaZHO{SpYb4h~8ObVx#wU}>Du z#A?5}vhrTf$y=-;Vd(_I6|}Zh>F5al1}!BiMg#Z!dSa9S1|%BZ35bwJbFh9dWd!5dV=}>Ki17JD<4a?T3sn!D?^1n=@jNeW~fV zlC3=4lgH5O_#g60(fd&1sJ@b{dII62B0k88KbQJ0{4SfPjTDXI!jL_QFoD>ha{^mGDi=Q1D}=JQFKzECEQ~!!kr`p2hm-~DcVLRG&2hO-`$28?$YI8 zlFjs*Zd%p)mbxU9)boA277c|xMI`kOhcio_r0qop7J>wI8cu)MiJGZEWFPYNaQn9( zKv@qoaSCL4UTph7CxZ&n zGA2An8-eRY3ma;S>}fh)jGmHNhhU`_914$qm`t67)Rodr{q^5JaJWl2SyQMye<0*B zvW;YguX&OMG9F5Cjm--fOSDBL5G|5dY(U_@Dp7-~RTu|0qkG^S8hK4;J`?|EK>E9QjYm z|Neje?Qj3v|F!esK3rwf7k~RZ%Ko+YcLb`ZZT~yU{T)I0zR31<8o@3&K1_L2Hbwr| zIRrwWe?ZtjAi_h?zoRtrdH*5*{J>QFSNWtW#{XQAK0Qs}Cx1r-{GSl0>VFAg`0pqK z_Oxa^F7SDg#J>>O{|ff#dG3p#NY!S4%cGxvqQrZNDtWs0cZ3D|ebW`-LoBjxdN0Y> z|w zE%v1P>rIF6PW}r*ob$5?_8J(8$Kijy;jdV?1~ku~#`-U}elOndx%lg7Ui_L2JjZ)< z1}(Dvb@=lhL3z;Zd6QIYGJw-#0v`BJRjlQM@A@=0`?UUbZS$X-9YzZnBB<;iBvNGm zAo3LX2ZWaJKVTd!K15kSVEe1?&lgTR{J{7h2Co}v9Hyl=o0XbuD9-Mi{^FU_6gR^? zb~3gO;W{S1V>1Qq0LrrLMZcez7+&&cv0Xl)C5lS&V1f82(GbsW5v;D0`^)cq)EVn!6=l8WI))_P>BU&gf!w+Lz!&S)5rdlI>qkFI6UCV-j@nH%kT@0 zz;JtzZ2bJ57z^bv6$R_y@6?oE_Eo}ARikQp@}grTIT#ZH*$u=FWoLYR9*QidoU=&5 zDd!V9`^0(BwXdN;?Lf)hACT&6mOtZ`2hbiuO}!QPe&^O)A5Wm|vi|GDpUT+LEREh* z1e@!>I|{d<0qo!+Wmk=ID=H^QTG0gnVHt%W(v59aWSdFQDN3gD_y4F^9J8DEDV zyI{8H?E_~|7Q3q&{J2}BBveZ^KAdr*!f`u0krH(Ljo{k0?nSLx44Q@m%%REvO_heod}LIS?hrRo$-rGLF!GyV49?-mkM+~|6aCs z=8Z9o6t6D$O38X7fa$@A^AUU;dbIfJ+^5r2j!?vMC+%{a7Szr6P%<5x#^V z8Pmj$waB@sTZ+f1rU7S)aS?r`V09Kqftp~s?MTY`!p5JFo&=N=CQ;PbP<^Ng`3$9y zR7_!Z?YF>kS_x$K>-O(E3rQGe-FFn2N@Py8r7Pzv3hZ#wtSx8kjm(fY-M?_8t*sbM zqwMj_KSfBTN(ir4TR21Rprb@axa!8s4@@iq+8`~c+Oj@i z)=K!iW~m4=&n4UHlMaF#Kl0-Q?H63yGOk7Wge?pfF(>l~2CpzcuNfSrNqxU9O7_Wn zCK6{#G^cJPj(nU+^Z7CcWPO#@0QD+N&37%ZwT$-z|31`!@gf3wVWCO!b)az3b<&b_ z1qZX)bJMtKRttroE;f=fk(n~KyAskQ#%R5FR#S^aja0<#GA}IH)NV8`vUT(K7)*Ue zs&T?9{pfScVeT_A*4b+>xs_5l7jN%zgWW|-PcR<%4m;ocp{Q932fazHY>j*4An_R{ zA?vx9s#83_QTYf=jq!Fe&89dk##C{(^zV=U^BL`#uxi7Urt+&d>Q7gD9&aDk`X&tzA*g zf~Xe5%u+bD{aPYn{kqIv-iliC?O%=}!mEwcsbC`v_h$JBLogo%RzGlrLXd~UW|I8~ zXd5jVQ!)gEp|sI|JOA?i%>|W%!avn;jkC@DkS3LgMblOsbzOi-Q`+`xbNyj$3^@CK zC@6AeN{K1>><=O|3XJubfpR_V%=qSHKNdWHQ9-PCJB^4rD+!5CkD8P8)v38Pn@!_( zCuRzZ^ZtEjgJQ|@2{#BL#LGorhYU7?Al?}bHr+#p`?oB`0)uZELVgU4?#q4h8JqF> z0LGr2by8R+D5r7_RG`1=Go7{H+9cHN%xS;Y0&L$dKt*4``M1_@-ou?IA9}7# zm*Gb#wpDCPD6QKfnw$*T{kNS3>3C?^;nxmxwIc2~9fG$5dJ;*zwC^KBw*kAx^owZ> zmIV%?!w50+*4`k>EnGwq^_8w{08ALv50mcz_5|NpTg)PU+6KNzp!Msag&ZjQMjwq# zI#!^tcuby=mc3Ibk}*r?kS;niH&EBpO<+FN9bEJSUaprx9n1hpgMnXl==>^}{Z4Mr zG!bx04XdrsDAhT`c@Z0dyV)=7;XJCMAXdhnf#4R4&I~vqBb4EKPkorBIxVD;T#k>C z2ZL-eCxh5M4rdHZ`5Fu5a~HGCa-cv89EG6Y2?jn~LaDuaL%T>`^sY;?W*0@dIzppW zS{)u%v&(y~cZDx{9-ur=lW0;68XSMY62YLXxERx`whE=azS!&SB=WkRhk5Mk;cku&ruh zTRnEJ>DoTI?(FQOkleC}e{%K?`*i1~a=#tFgWZWH_-^KHHgbW@VaX36A9^;@Ea<}q!frt-F`s2K}JNAM^=MMq%XjCiTA;0)(U4` z(p;8@1+BMgw+FTFN#m~c5q00)-}2?sX$T>PAo5wfqkUkym|25oWk7FgMjt2Hcn6z_ z#4@|3D{z6#39nn zkK^dQ*?Z~eJtB7I(2qdlHh`PHg_WL)wtV$E^Sf`mGamn~1(;B$?2N)s+96Mc2N>`z zB>Unt@zz4utHg!N`UtXo;yZbnOt19MXjX1CdR(l09!Ryk1IqDPvjmC4kJY|+f{lS8 zV@@Ywvai-CDYA2nq)e^_TiHNI*OG|zmv@}k!l^&JN_b6f$k88W9SnxD&?<0(h#>=+ zMVF2!8hjnxK!(%Fkm!&3O9m43&4rj$>h+oa9XK26Vs>=v$xvz#G{HK1pExY>z?@Q+ z2VeyqM_s~#sEN7vBNqDh-Yr6)#0@a_~b&;Yjt%_BS z6L<>2`&@bzSEbMaBvgU}m2ysoE;<@3R~=z-ZHL$gww1YsN=U(B!_UrKn@4QpL0Fq_ zB1Hrf{yb)s5YFUnraBHw0$^{3DrHU$rs8(@&$lx_E8nQYiXGfs6=1$Gg*~yqB-Ett z#PU1Fe;EXuGk6AVVvbz+NUBs0&|;Bcg3N7Bc>%CNp8(*Gad`q{Z=>eD-!O5!Lp^qH zhS0_T+T{Ko0nAj%W4O1mmci$eZ$9T)`E_JqQ?cCTeEFAllyZ)2e-=_liqdX%6RL`q z$0affTkhpR#pq05)Xo~3n79g=U2Z_}E9Rht@_4#vU*iL|pfeJa>m{4Wg=;HyISw&p z%&{NY{azno(ZZ}0kzp3U$LvzVkZG)WzW7Eggz?3dMLF2Rv=rvxT_v6_Gmkt*jFK14cf5{glQyDQoS3KZf|#C_4c})( zI92BoM=$aqbo>E$&rI=M8~qtZpQMJHy8*xzbcnEj?aNmRNx1s0LQGJwALi_%vf}gA z>{R*u2D#41lgSBtM1wS(c&>d(1{4t>l!nbU?i{JF?EnuTqRzHSLdWbr&DT1shei-)mY?#M}w?iKtTloWcr@U z5E`yT7-BqlZ49a-Z4+e6=OfP?EvJ^4QH#A>+zYqcc>Rtbnv2;ayi;c{{Z73jLOqs8jKRcRHe`peYP9ipf~!M# z87Qe~;9%IxC4(^aq};om($UHo#+Mp>?Y#0?t%X^|5cClR0<>?)gp(VC$8(BM){OSo z;WroLG;(=G4!k)o&A#}QW^;Ns{HvNgsf^hdtkHTA^V}p8=pJFCY$o|ie-<2K}y0Z$P7!xH6`QN593*7=ev@Al%e|3bU`8xH3Gp;@52Yi1iD-5kNC z@rH~qh<1_xhNThzElY#)fOFY1FaQL=xs1o_AX!>>S*wZ^2tM#9`6Q{8|4P(9{RBxo z7ORv417VkdsT#++g;rcyVQtTXIapO;&(jgxKsHDaF(GbOgL=J`-2LdH%eV2y>x%)!o!Z%g-8VGl9_lt6?&FFh}Xq5k`Stel!O?xq$#p!frnuH_eRfQmNHtu zWx>|=XIW(T>&jdbajTLkuVn<_?LGOkPBH?Y(8YSy3tDBq>$5C<`V30n$QZ*# zz{?6LT{n?Sr(~R$J2de|&LC(PiA&N-g1D=Ka8oWZv~P%R$leSy$H2Eema}K}KNz2@ z9J!45!Agbk-X0;yk}J^9ZHxSi7IiY#2ZPm7)yk>V%>wiFL1!lI$2Z=UUhN^ZGCpwz z>;eOf_B}F=rA<1S!|&yCON+%L#lTE2COl`TEWo3HpBihOs8elQRtd5hGgc{Ok1pV zAa3r{qYnT+Or8KdC*UD4lS1o%4d`f{k9&N7Ch)!FG(Nb5y%7X)Q1SK-tk6F%8?}Xg zWF#STX60dwT946FT6sP@}M86=S z*TE`~T!I9IWmq2grjO=;QrUv=gI^>>^rK9!0g*u!wYTnJIyM5=_>=lQl~s00c~pl0 zX)X+WC+V|c2ag-El_}00Zlp-!`iYz4%MX5CkB^)`U_ikhtTm!<)7-6_hYImi`_uOq5!Ks@kOEC#>^a#GTO`WM!2=Y*@aXQY}E=3|0_vafz{bTh-uK&QPd1X`{oMmXEF(hS4_ou3jYGbgiYUvi zX?uQ~^eXxQ>%Wk~gwcv9Ef5|I1g83HI5Atkx!O9iJSRpGn4iU6qfB+{Dl4}t#_4D2 z=q)yl1v~yR+1u|EW;&L*^a!oH`k72}XzNDq4w2hcG0iKU0KwHJADO}z?;sb1L+GG{ zJD>V{CLe(l?8%#Z593yIVBkK%(dx0gZjo1da?qIlHlR|4z!k}tr*isw7;Tj0Vs^is zu&scS!$4(jeZIA~KkmbOjkIOqhj1tq?(omb1lzA4GolL{K;(p#l|X~pkzZXsX9pJX zL$gH_n!1%0AlVu<`p_~{3{l2^XSmdNPWYS)TJ3ia5Zx8`R-Rd``L$s;`%s%d+jKPX zvEkFl5LGg3w%Et*PIuzkw!LumI_%CLNIYX&K4P<$B@Msj@s(@Whh^ZrLC($(wyht_ z_W3+h|C?ws#kocix^ItUR=7M)Z@zpt*sx-Rp1fdVJ|f~=zM=AQ3>}auz*q_i-rW|~ zfk;}TM9nH*dqoewHcrgcEmS#b+G>xEkZr}L^R};UhArWAbw)wG@P^d;+RD4)_wqz< z1Z8F*q6QFCf%@fcT5`Go(#Q9fsIMG^;<%>;b5h0i~Xfy`8v(k>yz~_=^l7)u1zP-#o zO(srcK!jb95UqP1DF{Ji`OSXUJ#_UEfbbT_ajuBG+>2JxoS3H%&ICd32Qkuen0lD9 zGCBaVkIjeUdz3DT>)LUUl@Z+U%`oG@gfczwUPX2~hz$T~(+HHf#KRu@`v=5&)a0Yq zdJr|%vgoF|&8^)dY;|YfXK~MbY{;BbFgcmsW>*4yf(E%_rO83iDbEyMbCec0hfA+@ zw=bW`hTtJ2c>t;R0nFDmXH9$}{XG5{OyWi9{pH+8OqFU)8F{dM3sPo7ezPkE5dhMX zFnDQ(4u@9xJ9%n)sNaQ-DAx`C?D2>lyH^r*YeXHHSJ{;zg#E_ zNESwpxB%;?0zdN^g|Z>EF7mnS#O<&h0cN|>h2Ur4UYOy}|0)fohZQt7^J7m$9J=Z`Q=^Xou=VjDn3E^OHA2{e37Y;m3@rt#1|b6ecI zQ9Wq!!26OeR;)oP;n!`gqh{pM@LQ3=v2njrm3;&eBkCfReE!X+YrLtOu7&o}~UCZ+&)8l}{e=gRY4lxsx zujQ(mqsufe=ti|&RyguOPBA-@C4_kLNArrhksw`a^IgY5RHb8xsu+9at^z=I zB>>Ey=dk?G#1QK4vGLE?yEJPzFQVxs;`hwL!8DaVc_-#lq`1nO-66A9GkzftSwwMo z+ZWV!sI=P>@cJM-4JP&`N)*vZ73?{2h~N5`aFizGLEa6vDG2n70Mq4Ou!z%vuE%==- zUYJFyx|_uBHc^3lshb5n(P4cO-POKJ-{>zg8`z1yTGF>DOG5qGkw~X&25qUxLce=H zUt?h)jhng|wJ*0R)Vra{gk79j<;j~}RcN@3+s2esa%nyj)Su^mtg1ZXxqrV(auIma#MtTCL$Z zx7=x5clJ7xb<5ogxnsJOiO+mmm8)Ki=gXp_T)FTIni|%vXotU`QXc(5qsF{*Ns&|~ zDSN)Bh@{CdR?~FWN70e0WstSWEuJueD*y%OHZ@ia;~7Cp3kmb!w947q9$FIL-KiLj zrGH~fg%iIZJc`AM=$oQnHkkrANGQT>VN-hW;Z@5X;9*%@Fwfl4tGQGwK6a|DM1m#L zCL6AKtnhsO59;R{NnTAkE>P%T=Ls1nAQ3PDIU$HQJi?rfTBXT*S4iU9M&9L3AP#mbM zM$H=B-D}-Zldp{r`or`B&A9!~qWK-&f5rkJl8_a~aR^9qumA zG8(+}tHAkuuQbCqOt4^Lw&*#ltPPUvC;B4uIEe_bmCRunVFtE z3K#45;rLcv=Q7LV`Xl`g%ISxX{!Os7nX$G1*o(Z4^3IN=eNnB!)U(Q4^7_3R+YNA} zWxo;seF*hyzSAU%0pF0@P-_N4c3tMYT=RoOVLSnfYyx_SO1lHbV%i7BMur7a2Ws%h z3twrR+GTn&1#*Yn?Q( z{rY8FAmaAG2Qpb4iJP8#sgmfASf0=J&!2F6?;Z(_h`_Q)0+9oNPg+U#FD*g`lkP`T z*Oi|mUm&*XQ_IFUFm?_91%BnR0r7+T^-?2t`0Wh@{pso&fpB5!K8Xc9`22-u;3V)ZrnXM9w>o`wUsl(EWn_mn?{d{nVpmFK7PhRO^Q`&Yt zPabjWx0gLMVfU*PAOxy)PylVzco6*u&(e{$C#QRKWy+P#19~N|QIbp?l?EzG=MwoZ z0BtBuN|jZv@G^z=keOtTEUi>F^dgQ`k;PUs8%-9u8+J~KSz3m^eAx8_+3L78OW~qc z2n&rSm^a+0v&Is}^06#}Ku}_dpGhCIBIC#g5iGJQnTHXCl%MhR;A%9!(-D#clNHdN^ zY2HjvQgT64WT_#x)596jG8|abf*=DIwyu4Q7z$455f&r7a(r2!&+4Fggq2w>7_`+(UB5-r8OR;ZB!XymR515XM4fnRUO(J=c!*hr_$ zCwX)ypj!T5xD!Apf#QjXZ{iuj7~oaOF~h1vooow$hEK*+I}ez0@x-1`HWG@CMZrZ< z{&b~}0e|E-Y=k?$1tb;o*bXJyTv_F}C*RYRpAvmNV{3-a+Y$nbv}--by8&{(vcXPE z2f30e>P4H?Km#WZ21+O~sk-pa-k`q8N@~h#xuA$O)7Q+F)@vB{d&32jo->B&>G|uN zmuiOunj+4Po`$4V={H?T$t(xRXHo?ZCcrcG0?Qwnys?qZ|6XUov#k(_Oq4vz7tf}X z(%m@QZLtOF0?lX42LA%F4=C8+bnFh*QnOHe19L?BU*cTM&j!MC;#+;`b^^Jeb*d>S zkv<)re11nnYh@j=Z_u5Xp2Xdks8m6?96ho)JHs8K9yauRj6g@Dc`sV#O*&`~z$}z_4BY1TUQ_>8VpLc+LEC4{Sx9K-O|}?7}^%Z@}wP-za>1-kfCsXaPK`WnhT} ztCkDnY5+u0(&z@MIAPQ&ROo)qfjR}Ipg-@2fpTH?It#}^J$^1STfjAACY($*8!3A| zx7r0R(vRPjn984qjj%*#4MgU{2TXO?aXEhA;+_N1gK&H*(argx=Tr`;JO0QPPyDsf1Y?vg`wh-mY&L zxXTk7zx63TA*;S^Y83-!AER?rJ>1je_|ag!aRrr#&BcnsOs5O~HgzXD8V9LuF8 z0%IO_Uzop0#RGXKp4y6OCiO~eBE@zfoqMRtFZfpe7)i13=ggf{7@C$LLbD6nhBm@A z@@f0BdN-ex7!z4TTgk!M)pYG^@O!%3`^#3J00$zqp~B^G3>M){F#?Wi@(Go`08FzS3}XaQBfzkFDr1cXot&uAdrT9_dRUi-=D=029L3GU2$vH9%OH zPo=X){s({_D0n(p6_WY(9c_SdB>1pSGQ~<%upnjmu|R+j1E84! zOzJkYNTL;|Y&dfcd{RcGw@=S!qFSds2X8Qc_en)QK=1QoW@?;})mwE1_-|@T`IUh) zqxk^r$uRpR!UbLG>F-V>mXuj+l9g1NB6eRun(>t0Ig|6+>ne!zm*S;ALUM>mLZXgR zBdU!jmu0U#w}hdQyD)PZ}2i zf{Je1@hUi(-Pi1v*#byPUL>$CJ78sYpn&*kAqFkWAEZ#6?~DhhY4ZOq-}n10~xWm#TPeAy;N8GSt{bbJ?FrHX)76JYhn&F10U zb9}qhH;@8(KeORqv8EI*7A!{E>3#R**(-{Y4ba;Rpw&^LLX0fG56}}XQBVhFwQjo8q zlrc}@3&@vWTkSe)!_dclYLC$)gbpmRRe-E~_h-#W>BK-#t(P>{q>oSA25Um&VeWzB#)CkIk zrEq@$Sh+C=ZP5%Go=XT;rv#odHTG}DIFUx({*;N=LPeSpM9M6pb*c+h$=O$>T$K&- z9`wpeE)>u-4KmQgjEyyBJoTohRb;eV1&M~`3}Q@+wYRHaO@Q~2!ODc@>IRSv6r|Uw z($J!YjVQZx(~^Unw!Kn#$<*iJNUBa;=us>hKAaLfhR;piax95CJ>YM$72qAMdI#cJ zzN3l9;77JZv(>}H*0sy2^38*I+E40N##liEjE1WV`1kh=_o6nI7N>jmq(3 zE8o|(Qx{9fP(0c)l_T;}^Pd({0wdy*){!S;I?+gbNxNp@Hh zJwOM^0w-yntgGFPH3-hSVuj#3J=A!t=DYPH90ihpEMUq60}FrZHQ#FL0`*w672>l< zAxAa8+!5z{98yvAE30SvO(LgEB7eCLPIa||4YSZ|<%$R56Zk2SxiQgtd#*$QD9*lJ z3smez-;_D=vNHlTOe~6r@#dTuQ8}}b@3DNyrPGw|?~X-3i;3j>fCVEf`J+Ng_?d@L z(r5@^(5)20DNPv$(#A?o|B#=Vb!wB^HAGFZ%gMbACko1&dt*tK4qY{G){B^a#Rb?C z=0r43>t2*l1B6rNY_G8!F^I;T6CmVgSscgkZrwe=?0vm0azM~HEH1PdX_Y#?^g3n! z&;J0$>RTmHW${PuOw2KH6dT+u_nXq zr4p?Yd}15MHk__V=;5V4oFVl0yF0%x6D1t%cv^%#)6%qS0T6(^2TA-QIn&_z;l?9N zfdAm5ADkj$8Nc4-QoB4UhAMUEpNI@`IcF%)td=0dBE&B+3tZt7nu0L7yy_k90F=P} z*%(;8>PPQ{03*~BH_*LlTEJz%UgWXKtCB+&vK5T=oaW zn;e12_P~LLE)HOn)dlYYql7U&z-)sHD6q7kk+BuwHZOgwym)A zCr&f>tLc3Dowo!fmFS36@!{{}$FA*M@6uklU@c8ZYCnPu=vo{Tk{2HC?GYqqSQ*kH zp|Bd)^fL-!JH1B{9ZOY7s9WV)j;VXQZU&^cnWVBpd)ACn?i@ zKeySy<4L|o1>7%0f`Oubv7{YOiF9CGE&dE~Jy@dPa0z)LN#Flj>5*nW4^v-1`AO|B zP_CcJO49-4=})6ixQ}2aP|Mp=7me=Z>|@oSAfjg|{2D}S7ZdU*k-XTyuj4=fGz9PR zj?w?F5bs}sp;3TK{(V%~nwltZHN9zKpp@BnZHos4+!x#M6{^2G;(U8$&Rt= zb~Mr)%>m<2Tsd`jV})E#7xNMchQ^AMAh#xJX>mu20PDpK6CFeFU=b^bYSgi#S3I-E zMoKl|p8cCSL|Gz#XI(}Aw$H#0triU@~d!yTS=c%cDE ztMPe|D>svYr4?JihFEr*hpvA=`JdS2U;$!SVItJ7-}`W(hZco=e#i}taSV7!Vg2A3 ziVCTu>75yQ`mEjLM;3**(FI*VHOg7(g(Ba`j(pr&GxV|rgp05WIS8J_T|b4wVy5a>Qg#nD5%&DeNiKSVbjfeQ3mM7ss{D)wH} z=eXXWB~jI?vnVhy_Mqa9CA;-v0^b-C;cZGHof!|TEL{yYxnd)fA9lnwkTOSmom4_s z2e3idaT93p{BJ^9L)gC)#Q&r7%Z#v^Mg5T^_KOX>078P>)v{>ngFq_;e?zaWKmk-k|LA zMwyv1=UTJoK7xLBY!r6C7Lp?b{V)H#IS#G0`;SuA9abE1=Gr0KJcNFh~W!JX~_1nI%eF*ZU4 zcHG&f81Sp?Dj>br*}Mi9QAu(U29kGk!9?|Bf`twCOQ#k7fbU29g_HdJ8a*cLee_NJ zA67QVzzQbGUA_6*rMIqev(3b^^v0 zGSg=v|2mn(;?QZ3I&}buF9Sln<5bv%2kQfVaL=ar)Scv)e9^;${@AUB% z`(M{$IA9rhM4_%K01INkox#gGFG-3ZS`32Sv*v9O&3fSJ1V|MDXbg`;?@Fn$y_H$4G)}c|p70x~M^w-PRr;pFfZ&Aq z15#VjL~u-8PA#?jj3$kA?*Jlv9fSNn$B|alIwi03J%QYhfxu$0*OnsrYidUB{ohIE zOT%|+D8e%MA%bEYqf|+}a=w+I0F2l$)E`PsXTu=Bg-W5LMe06E6R7-I7m#`JSxag6 zRpB16zUm=hP?;kmBUmk!9I->aUg&E9KQ73|$FNrd1mf|4M3ZdFR6D*gUgBtzP*B3t z)wW0I`nYql9qVARd8%U!m3tBX8AM&Ze8YW`$#76ayke)Qz*2!fQe^{)j`_lNufQGFNb(&K!>=zG_{OcZs@ zJ%A_!Jh3&Rm&4ywewyF4*h~s63w5sW=S#2U<{du-WDcD8FL?>xLs18sRg8)fm3iZ$ zmf~Y7fYe9PKEaa-XTCv95YHB3;D4b*aLoUXOx%>g z!abMl`%7Un04LI#1kMZHdUM$_Xu*)Fn%&F(nDsl~hgvM87Z=17TOErWM)KYvm-&rn zBTPF75Qd9v_zn`&`%JE3weg?d`OWRfMC&=pesN zBaOX1-q-zzv%))P04P`?f_uDw?2iSqjSHn=m&sA+ou2|&hXWsO&O$JdT09l^YNkQ? zKy;2L3Ez<-0ffj@K**33u10cuP^BQpbRY>0C?#;Jo>T??qN4Nz80&$HA~m8@Y(y8$oB?lnG7VqPLPB8kRs;LdGtH4 z7bgNm?u!!1OO+FK#nn7Vc9b;PK=)x{AfbVfW@qTp~TIMioKDJ1`8ES z|2_vq^DP`!U!jz}d}<7Pq6a|IZs8Y&O|d#H6(B^LJ93lLv}`nab=` zPDsUVl~$$02Z6nOOA$trgmMc6BShVc@f~H5PEolZ|H5ZWSRf(17>J%Uf5Y0u1mYpC z!v%;I#28xmFy>`2N|~%=j5HjF)^H^210pLS07Lt=+Gz;>{kXRL|0e-3Jb-fkeXMwY zb1yhYd)L5K3@&$yB(y>H#4-B-ur;CaC_d#rh+Fy?+E#_KSN9O+w)^-5%W?ORy}ZWM>?dM zfb1)B7A5N`K+04~UR3^c#fYJ9>f3stF39~cD|6%L6~5iDOAV%IPVoyI;FDh*6MQKq z`Pg9Z(5UO=z#YNKDcXi%T6)<5l`TS0mwxF$t|#KaRgNGIUjGSap?pp6P_qf(QJ|-5vi0n`W9%8_w~zMxE45m&QjRZsNIDoD z5>m4EzuLFV*j;!uIqlMTcSj~vR%uz~y8=ODjCbKVhEVOu#NBPJ|3gv0BQE7~@A2%3 znzGD63_yz@B3O3Sm7t`aO)`UIOop_o+<`TsCT|akpU-_c`pn15LoN(c z{6W&Fllb<$DLiqM7B*iUSfU3OnWavgzGe->14CfSytY}xw>Kk{oNXs64`g&tFs-bi zVLdWWncI(D7;t#DV7!>C;h6Ra$ordajOT&H5=bO*g;=+=2Y#|*7HP%|jBeU^mT8;V z;9!fZ${#1^AzhVLTyI;#w7TBV9J>~N$KN(8D?HO&{(r?GlF8yVLFCeROCoaFew89j zro0S0T>%`T5d#hp;6{9+&D#)`Bt_A*OmWMWyJ@`$8C=7N$c)mt|E0Pz& zfi<$}@%oSaa+qphZtxpHz-LzQPp?6SnbtLc#U+PNt`GW&>*%_RSeBvlz|j`aqTfRS zmlztkCb2)Xnzp8|&T1*D1sZKcZE1d1aDm^!@nH1?{2pPaD?FIM2a1DG zO1vom*fCr3vCFvSNIgB_%VnD41+Eu~uTs*6&ytb11=7z|PVGgCCLrg>U!)*Nl+fyH zI1mE}+~OB4TFUD!Cd-h9It^7qHPRWZS^rL0V-V@Lz{xRA3GD|fW^>%^8>|@XVOfc- z6g@>Y8WCdsW!)bb>RhA5c ztkC5V_Gfe6A+v&oH8jr=b%*Iy@O+k0xA8*(f=tbpc$*NW84pG57P;w9e(YooJ~2ri zD76?=D84-YfAjVx&`|&X|7b)-izu`zBBH`zmMme$j2UJ(GYpa$V-{n^%owwjtx`zI z)+&@1Sxcpq(rzn0iKLB+lom@-X>nhp&+q^H|L*zTbM8I&+7G3D_77FyY9fS+QK0FIkQNE@%wCRE&uRN1uEfbL|-JZv4CRX-hN&{ zPzBfQD5@BNI8w74IPqP)Wzs;VpDK!_60&e0loH?}QeU(zj*Q~PIYtl!a-j^5RJ(wI zM01r$F^lKJk<;L)D7-`rVLCW-=z&3wDh@tEhVX}KU@cEG5qSu}@p=2P@KJb{Q?!8S z6E0zZQe`GY6y$|+fjhduyy)y8xI-Y(SqZlM2qFZ@$4J0eK!G952PH*QkOX8Dk*RVF zhl)8II3xlA_DfW>kR=DZt`i9gbBL9YcnB|rqYUO0A(X_$MM5YVPc*bQgy#rBkQ8ix z3@lR2qDNz#9b{Y;LCuozMR5X&KO#lY}}iTJPB&@nP%%0vwg0BQt+?*$}JKrtx-b(?IbNGF0QGD3rWoH#?kq0PZkpgT$GyzIvI*_?Q8o&Y@9~vc6 z3gbwTpnwe=)F64Fz`%XU-drvZ^Y=2KrWFco&`2ylu*u@1P-wm|kgeG_(B5)2Sq$)> z4C@u+;14Ppyu?VC2)>vG-s59Pawd%!Bt!;A0XYtYOvNZ2p=^kPCO|3UXj~Bap#$)E znIK9^AUg^)k)KbXFCG>x#Y6?l$gu%x(B0l_9D_^;9R~`3!Q_!e#>V+0oi*PKiVF;o zQ#j-pM=S_E&?u@GK@r7+L;~xwKov^tqy%3A<>0_JhfE0s)6yFS#Yf7d;G;fjB$F8l zb_;K4T&yfW4vke(Nf->$8E~==Vzm?Sa1rw&qr|{$B9`f`@&O^ew}|JDf&*?d4#p#K zodW`aevZkf@CY29fXR@uXzUn<6Nw1$1)z*LQc9$zR?{1c6yQOY%2`DxD!755Sl2I( z;-_|w6oO*i7>O^2=`5QnJp^q+1PS@V7#2b1K=)BQD4|pgC{v82GGb8tzo8407fT>W z6hX06P3jj-jrCV(7PB)d#!(KmSoA0%5R^Jm$YLj;VUh>IQ4~oGSLTo5$rU_A1W)Ng z16f-nOu&x93Zm5Ph$y&&cZ@Iw-dj__4t6gFr=K zRR}+v8V!VVA{Jpvr2)#8C``38TI}S7aF#KsLN<~E5ewu>fm#d)Wv?U&E=r-<4uo(j z2FszTaiRc+C^aKiA#p|uoiQ9gvPJ;}UP3Ark8}n)ah!q}5F|z5fW}xMr4k_ms+Tj1 zhymd(Mndu9Amu!!j|fR5faFM!gD(^vj`XEPtBA~K3IrSHry$6^6@da!&f)E-2tty% zUV-64F%T(GC^F6dD8?dXpui93MTW?@nr$>PPUr|`In4!0QR9Vtd6a|{u8eSTK!dQ* zo1%^sBjha2KhazXn1sM^iiu@;A=LsZ(l4BdabyOvxlwE$MJNsD!mz%6-hdVpqWsCu zF+Q4INOMbYMpFV%Dj8WC1O7)7Z4&(XY9uh1V>v|P7-$UeJOm$u$%(*Y#Xr#B-z$cN z^ryw4{0UxknMxTL6cH4q5bW@wB#{I@5hA4zASVb!8J!>F9~&M=4G)N+ zaG3}N(^mt`1Z;05+r@#Y_6MSQA(RDVACzb>kuyQ<8%p*e(1}O~5);P= zhX9fWWPh-H1XqG%^0+FTgKtn2+6PO+$3mfWEQCpchO>;(&>dfd>YZw3p}K^3K>h#Q0mbTzB&?4m3wm_N;&Y=0&h7-dvSnz46a+&S0~gE1c(EME7dZ+8p)#Quz2P%50;Q}fZ z6yyn2e3w{`+RK4X;c@6_tQzmlcXXh7p&?MQ3n(rXp<{?KQho%m%0qf{Gzgl51;jY8 zQw19mF)}EU?Hr*54`?8TR=NFgN4k15mU`p~!)+28M@n-FM1&%c z7oc%J115)32T zH$s3{k?3B)f``ZD%f)Oc92CM(R1Pjs7!T%0pi>wSe2jud7R7=@pV)_h^&v|6E=-g^ z6Yj!~3{nAtp1>nWpngOLs367>5g91L`LY>tIEO$nT|%Zad@;bzhDCRvF?<=ZLK@!1 z$6=}hDM-O1kRfEyY(UwdH9@%#nt;Zsg-iz}D1vc{aguX^iymI8hGP9Vd{6)w9uvg~ zN3!@-J`abBr7HPe#0Ze!MYA9jZ?y~#1q+?%kM)g}faPzyOE@)Wu%jTq>QbfN~kQ0B$%7 zR5|mZaAmA8Hc%KK(a@e~x|d7{$AVG_I8ho61&S$@zy%K_LR2!2K;(!<@IdW~I6?sd z)|#=gXr3ZE!Z!eiMX)qfCn`Ds_?tO8!W3LSi9(S2up^j0sBnSWOC7`F`ULWU4VMFt z8LecXfJvtlTcHM-8HyaZ;jq0Zv3xqxQ9*#kpt0dlIwwL6<2#2(I;of}lt|_eDx0tp zgap_EgUmLaD!~VVD8&g>7=)vga4-Kj&8h-@2V5W`!QcKtL{>CAAX4ds0yzt;OQ3_V zg9BCRC1Rn3G%>J&BS$-;ofQG>*dQlzfI<>Yh|wIFzAP6B~cFC0PW z7wF>vV}R&34zAHedz0xL6ezuei-}HA0Ng}4`Kf_Q7$w2S!GMI*FV@A^DTYjk#{~$0 z4#i0-C&q~Jj&x3}BgaL+cJhO8BgoPSUnk(ph=ssKLPvE3jQ}Vp8Iz5RV5r4VjK7Md zp*hITk*HW16fKC3;^XCFxl%^KhZE&uA`hhobgRr!s8+!giWsp_jSxZ9zy!iS91<0Y zhe%W$uV^tF2e<|Vs7z8~VqwHUP}io4fueXq4cmwF6RJ5}1P&Du%VGMV17*=(OaMP+ zeq5QKI09r6LAZ$Kfj=xPHx4SqNHnK4coEQkT%ycN27|@;a*1%f0?Uda`Z;(p@Zk|8 zhD59;($W6Tfn+FL5KVUgr--v=4UrJBKr`&^2;(|3HKGR!P^tw;!vn?P5`dC<)XFhmkwQg2RSG zq@UV>LWU{0#)AfF92XsFL?RZDxlmb@Gg3^A z<1zTG7>F0Zh#;0i`ctCNpkmnp#sRjP0_s8~Eh3hVbBgjM&{0ezMZu4VWCE831r0cdMuMmChDoVZ4pRtB3<8}4fHRg_ z6Wv0Pu|g-X1EJY|zEC>E5vXHTpsBa0I0{Pa$$7gRmY=(_nb;Q%s3OfNEP68{+8b zqH;mvfu#`{5*bJWMzbtAAjiRHM5riW0mYR=d>BL;L-V}6SPiMD04f0RL!kLfjdS$H zkV!6@h|QTma8N;^pf16gC<3L2;l7$8B_Koqt~Q#P8zoX9SUkNqz;zT5l`%e%U*En-m@f)RuTtaiCZe z7~&G*ocI)mj0((@9cW0QlfnfT8RY1KP_aSHgp}g|1;S}5ALMjlK{RLpmY|rj`BV6V zu+`fSWIIFxIy_22MmPmJ1cGv41c0HyjRU+%jEejZdKu00Oc}U?O2!`(uTrN?TR9Dj z@(NIH`gl|~cOj;0XPEF@O7A=^@3XyT)$^ZE*D=shDCRENDp7zRI@_#y!@Xw9yrGwW z4LnXbKY8}!=lh@IzQwlH#m}=|;V-9+Q7@?rss`hTI}BEMY`rl#uYP93$k(^?+!Cc` zLz{kf|2Z^yaaOYLrkAOPuvM>5tkoLYfmqib6_=yqo1}S_V^(g%7kw@$*g23%ShZ>N z`S9K&GqSGLRVZA{UcR|h^}F|5pRHMsNBW|X^DD9Y-=;wI=&o%?%1^!(JAFC{}Who0yeT1)7wp0bzDFjA_A7XB)5_e>87oh!`4 zXHC=F2VO}(7o-k%?M1I>e_PU!Zw*@()s%Kc%JOJ8E$rXPXz;VpGFqv5bs46{#L4y; z9NK!NwsNL0h@m|&{=14mzDI zJalCY8)ic~Wo8z)_ixACo~5&f1g5Izx9bc3sUsV2&04LS!0VWOa(Ch${Il`!hRTim z?7uMruPJp{_fq#hPf56QZe!aj?CbBoS!*5VO+v%++72U@#|^ocdbAW;?>5Rs>Aguw zWwhD_U6}S*_#_3ni+GIQNqP71jMm|cOEad|7ouJ;`yCQcT}c~OAXM+U@<=9|rZlfBEVY z`_4nZYST4zo$}l(*R$>kCG;irpImnm+%a$NRa_lpT4%mDT)9j7xin?fKjkl0E?k#8 za{+qBB=WwwBqw1YoiYF}?XFtC{8^NuO?AqY`>HZ_^Aj^0>hU6@_7=)2n%Z**N) z!nST@cRvqLU4}5yKfq7Vcu!?NKH;Gp88zODbGet*W3p0q??Pa0oVEJvk))$bPp=H$ zcDdxylLqFduPx2BOXR2AA=sTzaLb=6JIfJ z=;!)U$Ey-=l%`z&{@5CZ-W!(W({icz$xEM7q6NufR}NaixMicg;JKmErF~D+7CCB5 zCpx_P^?m-i8pX~>D0KVFE;aN$bkFs?I0Q8!PW~`GZ~g7|r~08{(wWup8nNN)hMymE zDoI6i4q=2l{%eN8FQ!;qtSs|g&g`TspT>>&l!M=9aU$%)X5CWHm*u>k(V1gE?p16d zU*dJiCFP*dN7V5D%L6H5xkr+@Jts|~LxUPBR?So+DUHhaX z1JF111NNk%!0pq*bLzKPuhFT$x}~$GIC{3dO|sx+!mQVK_v|_L`9SX^yLa=bO#ARzy>{&z>7JBw#Qax_ZZ?vz;WdAKd-%z9muU14#*_nwNL@#^WJx#n>QXKh+3B`TmI zAf%t)BpDf<8_^U-t?&%Ju5RHck1lsz!EFt_SI3_o;EqJM-aB*tz}blL`D2QvnK_m} z?w+4fOuCtWSTDf$Q)8LQk_+!LKX73Q7NqLtg-&S(m4)4@chbCD*W~2XrkuXHHr)8{ z;Y0k|d$1&-swT~wiOrgbxOiIjY(-}?=}xL4O@)m$S!1Y`m4D{7&uF-3)!V~* z9qoC~9*P?SK0bBE_y76z3Pt~MZ35CI3ND8&*~sTypHfOEW?Iu5w)6>ZD|(bDt>w0=V`eyn5j$ixHVC2h5=_D z8Ou(OGZ3V88|K`6l=#bmE8Up4UH-aHx36)(hi}b7n^x7|YX(Q(L ztJGlMPaj>C+7%n-Qhx-WOgAQB-^?A{dRk}j$L<5~9&_EG!k5JdpB6~x2)5*E_w#bU zBc@L8X?i;flBmJTV-?V|@Ezk@_jm1`ri*jkU;g*>OwtkR%rUkJk}QTsiuQelRV}Nk zX)KQoe5JM_(bH|l^ZqV$Tg`{cJSC?SC`He~uO(RbcPJyxi*|b+>VN&jz$2w$(Z35u z%N-oZUyB6CH`Ho#j^EtO_S7uviDJa6@PFxt%Lzp7fk$K%8U zvH^&t+y_eC`*1zi$8YB?_>y(~`&xrq)~40}cElp&%3BYLudk?MTch&t1nuExRV+gH zzQ0Bt-ZDOIja2SZj)$WDJ-G`!SKg}smKlFJF%H`PR?w^0^?}@_?0*ts+5CLgOFfyo zL;i*JZ&2eY);9Fm`hED-=l6W&76Hr%bu^rw!{)o42aEcTsiA-|swLIe#Uo zJ@kJ@oI!8&pR`QV&Z?_3TqQ!^!3J%67PsM!?!c~jq`BqUUv7Io5vJ?7CEdVi_iJ_S zmIVtm!B|1enL6}by_gg_^5FW?bh``dwc8@GH}HBOE{ol)3VLd|d2dnN+6R;cGMxty zqmMK70uLlL=ylxov&&i;>hfXlqAemDt?rsP)Y6?6uyRL_lY&J8&}|~@jW;^Y>o8fS zCzmD%H=vV-u#e_e`PseQ(jJmtxF;v6AKYQ>#vOIj-1S19bT8UUtuNRS%7FEB3~d+} z9@2T94DPb<((rS0;hw8A#{Nkr!rm;2@Y`wBEB0BEeq>KpQm`Qiz+O|86L*L9E_dDM z$VQ*=&GN2Cʅ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

d}T^VV=Lgu26Gt&^u_>exlSQs zeb?*ffJ$Ul_J4pq>e$K5EN*q;yui<&TZ^ujb!$X=b5�B<)KpWTAHAawCU=*N>~g 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

Om`` zP77VkJU04sfAT9_B=@UjB&cpLT~UI>zX^fBt-7<8xV`zdIYqRx!Q^i3^nq15Aia_i z?x)ne;=trY^1BpH&dsqabQzAv91pbZL9w(IzjhWN64i0?l^7(8Udav}-A?u>d=^WG zuL&ZwQ|S83WMUtw;$=3I-mE@%7KoW%O!xYyyoLnqgaHm7U^p7QC1%@JPeQVn1FxxO zdVXW`bLCXs=ers>vK0IgOz5-S*Us3LL{gz!M`EY_pk%*o;Op*pYoFgr+)Ed>K$pUY zL_FG9EEZOIN8pAXb`cy-7&Ab*ka~Zbbtzv$_KiE|yuq<#teL?8G;R~FY*>k&9ls57 zi~T`lH=7(D;S&Y>pyX)vd>g2>uJ^nHQ}=0qyv?Hv+3X?P%Sf`9 zKsd!$l;sh<2A#E_L|3?Az3ARO0oUuPXzlr`W52hPI*>@=Q^wyR!EK7O`46! z?rue|V(DWF=fEs3wgclM3I$aOiN-3HrC;7xuuQ^H%$BXly`Sqi9XUhpNb?3&qdVT4+Onk zmDilf25gW?VC@nV7aNYRtgIx=KWa+y2DuXcLt^PNkWP~YsWu59iE4jB!6gRkoeFU> z+xUJ6)}%k&$=46|pF`cQbJ%!)uCfC@)p~QuBop6iF3 zxddcI?^?QqK!#xu%{hzv_NtF}N z_kv6kdp4keX_3R@9Ijy@P0+HNXH4(GmT<$f!h{9$OoeZ9sg8<$X%qiIRDryA^|M0h zi`b^MKF4Y>b6rrw)V(wD{AMC#^3!tHXJ2dlgaBF(D!BD-*k3{wXe;cI@tii;fR=Iv z0AN?%Hvcrs0h4C3B@GfezE|RnYbGZprUUwe-yvu73Gxg|I{+`BGTz0q4wUYQAg3?5abb@R1?G(+hlY1(>X1( z6|+e@wL^7jcaVR{iQ|{NIs{Ua-sgfCGCjx~Ue{g_IA;3^ejsvw13Q;__)CNqGCmgb z3(4=r!T9@`%X#tSF;4=i;9f0x>iYp0Ls$1g@vI9FuIb6xxl_LWHc8Y1%3sGG^czVp zM+WUN9wvkqe0-(&DUuKN&>^LrYY0(oSnuCsx~zXRJp=|`NLOcp5BU)E{e#DIHs{D5 z;h?qGI@2GGl$JGD4=GuT-w4`M=^J9os$4Ia{?(IkK{H`}acMGB%VY>-F6oNneZ2s&!$k9E$0Xf5wSs9`DVUN7v zp!hI!rrDC}$4Ua-#g12dP|3GK4Oi`X^7`0`%pdsjOfWCby9l+McuteF%8z8yd#NMR zdGo4xPiS#Mclz@Ty;(Dku$kn0oxm8clwXX5yQeWg3h`j06IE{tso3}sWxNRg(#I<=v24KNt z5KksNBd-rpPYw(1dbTI<&3B;@=TXs|qfDGD6^}-xBBB8zC^K<`$n$2w|Bp?S!TL$v&LO%W2k9P0XAMA zGDkaK#Tu{RM0U+-&-E){ca+N5=M9pY+I^s*Wfce!%Kg6yE4jgDcp303%`aO0!K}T~ z?=i5b!x&;TD1rE*r%Xf6KXxps>ZnfN5JYpKw=uGnnLIk%-(2(H2b{YnQr=hx@o4PY zS;Ug`!hYVL%wAmRbl8Vt!Ad%@`!SAty?^+xQy7Ot?tAcVN zpgxt!zAZ4gydyZwnS6H%0~cA_tDxksPZUsc*U)%Tl}3UtT^kEoPu9(p<&|ihR8gZR zPzryyjL_K~qb~CQUZ!0sQA!*6?d|bY6ExlQh|?EKKTC5$G3zkLj+sU)t4y}YA+4S5Vf#$8Mr+u)vscokwX|OK04)~r82-Ea2_*<46py5aaT zU8d4XRDQ<$QA%5efChh2NB^ZSx1S&H_1oM$7r*{F#O7|M@~O#3%`9^RB0Ju6zp*aa(%DpxgL7n+*QzAMVr>4(%j|T-!v`( z$0#RLdr5dnGs!s2`&hJXI5lrFHfrGRA&>ViyfeAEIeRArw02+Ew?yI_UJY(GR6#)A zbPvmG3qiN{{I|P&{5d=#+sB^pI_GkvzbL#zAITmHEUpLL3B8DQRkxC#6fen0F{WW? z*RGU9pnURj8Lp|g{&bt3uhBj^-QrL(CfYw3$BYk51JM=hCQ-#Q{Jt=TZL%z+} z@WK_MJ$j(jevGP40|zGSbm{377t9Yr&x6PnrF1>w$#v-}%3`^Iyc3ZTrIK{q z`9(JUMLhB3WxV1gTjUsg8VYmNW`N<}Y3+FGa2Vw}*gM9XM^6ZL5^SW-CgJM5#rGVA zLG$1$$ipO;w2}S)zkCd(u&Q*TO}G(GHHoRwBg064fLW0e$9)>8AYv%_06Uy*$UeTN z!ElqHD6guKpjgNUs~$yx@kv&`ewN3c(#__mM$C^dgKVoxN|YF>P%v1%!helKZx3o! z?WKqH$#)aX=mG{DZX^95az1j?@s)k*kha{nAQz6aLc=JSFkp*zSLr0>y{oCne?Y=A zOdbgZv<{!2lY$Y1F7UL_B<0>m?8tVvfj=1vv20+FI(s#7fBr3bA6jg@fK1Vd=d^XJ zJ~M+Y8lPl3^aWXfDrbg64m2p)cxMA)zc?BpTt%U33!6k9qt*>q<0NM9bOU$?1~KBj zDR@lr;F^x~9WqnAFTQR~h(mcPl|jz#tg-;x419 z2RZN46x1WO6qbvQ$|0M$a+utU3O!0crph{cH7o|lEsk7G753-q2A&p9HFtG29d7zm zl7|^TF&zr1a987yzSpE7R7De~snWlcl4wYcyyrI2?1m z6d2P@dmJ6|ieM=8k*uNROoZZZk&eP2!gq&4>8s2A8Iu$tnWz6}aFm)iT7HohrlplB TuX$9Ez#qJpk>*|X(_#Muc?JKn literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/images/seq_process_monitor.png b/system/system_monitor/docs/images/seq_process_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..b759fcc5cca4bd4cb04f0d2b1cd9149534e9601d GIT binary patch literal 107081 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 O|Ea6!pi53%4EjIo6lkCT literal 0 HcmV?d00001 diff --git a/system/system_monitor/docs/msr_reader.md b/system/system_monitor/docs/msr_reader.md new file mode 100644 index 0000000000000..c8594be011625 --- /dev/null +++ b/system/system_monitor/docs/msr_reader.md @@ -0,0 +1,40 @@ +# msr_reader + +## Name + +msr_reader - Read MSR register for monitoring thermal throttling event + +## Synopsis + +msr_reader [OPTION] + +## Description + +Read MSR register for monitoring thermal throttling event.
+This runs as a daemon process and listens to a TCP/IP port (7634 by default). + +**Options:**
+_-h, --help_
+    Display help
+_-p, --port #_
+    Port number to listen to + +**Exit status:**
+Returns 0 if OK; non-zero otherwise. + +## Notes + +The 'msr_reader' accesses minimal data enough to get thermal throttling event.
+This is an approach to limit its functionality, however, the functionality can be expanded for further improvements and considerations in the future. + +| Register Address | Name | Length | +| ---------------- | ------------------------- | ------ | +| 1B1H | IA32_PACKAGE_THERM_STATUS | 64bit | + +For details please see the documents below.
+ +- [Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual](https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf) + +## Operation confirmed platform + +- PC system intel core i7 diff --git a/system/system_monitor/docs/ros_parameters.md b/system/system_monitor/docs/ros_parameters.md new file mode 100644 index 0000000000000..e42f843c78992 --- /dev/null +++ b/system/system_monitor/docs/ros_parameters.md @@ -0,0 +1,84 @@ +# ROS parameters + +## CPU Monitor + +cpu_monitor: + +| Name | Type | Unit | Default | Notes | +| :-------------- | :---: | :-----: | :-----: | :---------------------------------------------------------------------------- | +| temp_warn | float | DegC | 90.0 | Generates warning when CPU temperature reaches a specified value or higher. | +| temp_error | float | DegC | 95.0 | Generates error when CPU temperature reaches a specified value or higher. | +| usage_warn | float | %(1e-2) | 0.90 | Generates warning when CPU usage reaches a specified value or higher. | +| usage_error | float | %(1e-2) | 1.00 | Generates error when CPU usage reaches a specified value or higher. | +| load1_warn | float | %(1e-2) | 0.90 | Generates warning when load average 1min reaches a specified value or higher. | +| load5_warn | float | %(1e-2) | 0.80 | Generates warning when load average 5min reaches a specified value or higher. | +| msr_reader_port | int | n/a | 7634 | Port number to connect to msr_reader. | + +## HDD Monitor + +hdd_monitor: + +  disks: + +| Name | Type | Unit | Default | Notes | +| :--------- | :----: | :--: | :-----: | :-------------------------------------------------------------------------- | +| name | string | n/a | none | The disk name to monitor temperature. (e.g. /dev/sda) | +| temp_error | float | DegC | 55.0 | Generates warning when HDD temperature reaches a specified value or higher. | +| temp_error | float | DegC | 70.0 | Generates error when HDD temperature reaches a specified value or higher. | + +hdd_monitor: + +| Name | Type | Unit | Default | Notes | +| :-------------- | :---: | :-----: | :-----: | :--------------------------------------------------------------------- | +| hdd_reader_port | int | n/a | 7635 | Port number to connect to hdd_reader. | +| usage_warn | float | %(1e-2) | 0.95 | Generates warning when disk usage reaches a specified value or higher. | +| usage_error | float | %(1e-2) | 0.99 | Generates error when disk usage reaches a specified value or higher. | + +## Memory Monitor + +mem_monitor: + +| Name | Type | Unit | Default | Notes | +| :---------- | :---: | :-----: | :-----: | :-------------------------------------------------------------------------------- | +| usage_warn | float | %(1e-2) | 0.95 | Generates warning when physical memory usage reaches a specified value or higher. | +| usage_error | float | %(1e-2) | 0.99 | Generates error when physical memory usage reaches a specified value or higher. | + +## Net Monitor + +net_monitor: + +| Name | Type | Unit | Default | Notes | +| :--------- | :----------: | :-----: | :-----: | :----------------------------------------------------------------------------------- | +| devices | list[string] | n/a | none | The name of network interface to monitor. (e.g. eth0, \* for all network interfaces) | +| usage_warn | float | %(1e-2) | 0.95 | Generates warning when network usage reaches a specified value or higher. | + +## NTP Monitor + +ntp_monitor: + +| Name | Type | Unit | Default | Notes | +| :----------- | :----: | :--: | :------------: | :---------------------------------------------------------------------------------------- | +| server | string | n/a | ntp.ubuntu.com | The name of NTP server to synchronize date and time. (e.g. ntp.nict.jp for Japan) | +| offset_warn | float | sec | 0.1 | Generates warning when NTP offset reaches a specified value or higher. (default is 100ms) | +| offset_error | float | sec | 5.0 | Generates warning when NTP offset reaches a specified value or higher. (default is 5sec) | + +## Process Monitor + +process_monitor: + +| Name | Type | Unit | Default | Notes | +| :----------- | :--: | :--: | :-----: | :------------------------------------------------------------------------------ | +| num_of_procs | int | n/a | 5 | The number of processes to generate High-load Proc[0-9] and High-mem Proc[0-9]. | + +## GPU Monitor + +gpu_monitor: + +| Name | Type | Unit | Default | Notes | +| :----------------- | :---: | :-----: | :-----: | :--------------------------------------------------------------------------- | +| temp_warn | float | DegC | 90.0 | Generates warning when GPU temperature reaches a specified value or higher. | +| temp_error | float | DegC | 95.0 | Generates error when GPU temperature reaches a specified value or higher. | +| gpu_usage_warn | float | %(1e-2) | 0.90 | Generates warning when GPU usage reaches a specified value or higher. | +| gpu_usage_error | float | %(1e-2) | 1.00 | Generates error when GPU usage reaches a specified value or higher. | +| memory_usage_warn | float | %(1e-2) | 0.90 | Generates warning when GPU memory usage reaches a specified value or higher. | +| memory_usage_error | float | %(1e-2) | 1.00 | Generates error when GPU memory usage reaches a specified value or higher. | diff --git a/system/system_monitor/docs/seq_diagrams.md b/system/system_monitor/docs/seq_diagrams.md new file mode 100644 index 0000000000000..8fadedb6416a1 --- /dev/null +++ b/system/system_monitor/docs/seq_diagrams.md @@ -0,0 +1,29 @@ +# Sequence diagrams + +## CPU Monitor + +![CPU Monitor](images/seq_cpu_monitor.png) + +## HDD Monitor + +![HDD Monitor](images/seq_hdd_monitor.png) + +## Memory Monitor + +![Memory Monitor](images/seq_mem_monitor.png) + +## Net Monitor + +![Net Monitor](images/seq_net_monitor.png) + +## NTP Monitor + +![NTP Monitor](images/seq_ntp_monitor.png) + +## Process Monitor + +![Process Monitor](images/seq_process_monitor.png) + +## GPU Monitor + +![GPU Monitor](images/seq_gpu_monitor.png) diff --git a/system/system_monitor/docs/topics_cpu_monitor.md b/system/system_monitor/docs/topics_cpu_monitor.md new file mode 100644 index 0000000000000..6243ea0cdda56 --- /dev/null +++ b/system/system_monitor/docs/topics_cpu_monitor.md @@ -0,0 +1,104 @@ +# ROS topics: CPU Monitor + +## CPU Temperature + +/diagnostics/cpu_monitor: CPU Temperature + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | +| WARN | warm | +| ERROR | hot | + +[values] + +| key (example) | value (example) | +| ------------------------------------------- | --------------- | +| Package id 0, Core [0-9], thermal_zone[0-9] | 50.0 DegC | + +\*key: thermal_zone[0-9] for ARM architecture. + +## CPU Usage + +/diagnostics/cpu_monitor: CPU Usage + +[summary] + +| level | message | +| ----- | --------------- | +| OK | OK | +| WARN | high load | +| ERROR | very high Lload | + +[values] + +| key | value (example) | +| --------------------- | ------------------------------- | +| CPU [all,0-9]: status | OK / high load / very high load | +| CPU [all,0-9]: usr | 2.00% | +| CPU [all,0-9]: nice | 0.00% | +| CPU [all,0-9]: sys | 1.00% | +| CPU [all,0-9]: idle | 97.00% | + +## CPU Load Average + +/diagnostics/cpu_monitor: CPU Load Average + +[summary] + +| level | message | +| ----- | --------- | +| OK | OK | +| WARN | high load | + +[values] + +| key | value (example) | +| ----- | --------------- | +| 1min | 14.50% | +| 5min | 14.55% | +| 15min | 9.67% | + +## CPU Thermal Throttling + +> Intel and raspi platform only.
+> Tegra platform not supported. + +/diagnostics/cpu_monitor: CPU Thermal Throttling + +[summary] + +| level | message | +| ----- | ---------- | +| OK | OK | +| ERROR | throttling | + +[values for intel platform] + +| key | value (example) | +| ----------------------------- | --------------- | +| CPU [0-9]: Pkg Thermal Status | OK / throttling | + +[values for raspi platform] + +| key | value (example) | +| ------ | --------------------------------------------------------------- | +| status | All clear / Currently throttled / Soft temperature limit active | + +## CPU Frequency + +/diagnostics/cpu_monitor: CPU Frequency + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | + +[values] + +| key | value (example) | +| ---------------- | --------------- | +| CPU [0-9]: clock | 2879MHz | diff --git a/system/system_monitor/docs/topics_gpu_monitor.md b/system/system_monitor/docs/topics_gpu_monitor.md new file mode 100644 index 0000000000000..42ce63fab2e64 --- /dev/null +++ b/system/system_monitor/docs/topics_gpu_monitor.md @@ -0,0 +1,113 @@ +# ROS topics: GPU Monitor + +> Intel and tegra platform only.
+> Raspi platform not supported. + +## GPU Temperature + +/diagnostics/gpu_monitor: GPU Temperature + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | +| WARN | warm | +| ERROR | hot | + +[values] + +| key (example) | value (example) | +| ----------------------------------- | --------------- | +| GeForce GTX 1650, thermal_zone[0-9] | 46.0 DegC | + +\*key: thermal_zone[0-9] for ARM architecture. + +## GPU Usage + +/diagnostics/gpu_monitor: GPU Usage + +[summary] + +| level | message | +| ----- | -------------- | +| OK | OK | +| WARN | high load | +| ERROR | very high load | + +[values] + +| key | value (example) | +| ----------------- | ------------------------------- | +| GPU [0-9]: status | OK / high load / very high load | +| GPU [0-9]: name | GeForce GTX 1650, gpu.[0-9] | +| GPU [0-9]: usage | 19.0% | + +\*key: gpu.[0-9] for ARM architecture. + +## GPU Memory Usage + +> Intel platform only.
+> There is no separate gpu memory in tegra. Both cpu and gpu uses cpu memory. + +/diagnostics/gpu_monitor: GPU Memory Usage + +[summary] + +| level | message | +| ----- | -------------- | +| OK | OK | +| WARN | high load | +| ERROR | very high load | + +[values] + +| key | value (example) | +| ----------------- | ------------------------------- | +| GPU [0-9]: status | OK / high load / very high load | +| GPU [0-9]: name | GeForce GTX 1650 | +| GPU [0-9]: usage | 13.0% | +| GPU [0-9]: total | 3G | +| GPU [0-9]: used | 1G | +| GPU [0-9]: free | 2G | + +## GPU Thermal Throttling + +> Intel platform only.
+> Tegra platform not supported. + +/diagnostics/gpu_monitor: GPU Thermal Throttling + +[summary] + +| level | message | +| ----- | ---------- | +| OK | OK | +| ERROR | throttling | + +[values] + +| key | value (example) | +| ------------------------- | -------------------------------- | +| GPU [0-9]: status | OK / throttling | +| GPU [0-9]: name | GeForce GTX 1650 | +| GPU [0-9]: graphics clock | 1020 MHz | +| GPU [0-9]: reasons | GpuIdle / SwThermalSlowdown etc. | + +## GPU Frequency + +> Tegra platform only. + +/diagnostics/gpu_monitor: GPU Frequency + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | + +[values] + +| key (example) | value (example) | +| ------------------------- | --------------- | +| GPU 17000000.gv11b: clock | 318 MHz | diff --git a/system/system_monitor/docs/topics_hdd_monitor.md b/system/system_monitor/docs/topics_hdd_monitor.md new file mode 100644 index 0000000000000..dbc9820edd24c --- /dev/null +++ b/system/system_monitor/docs/topics_hdd_monitor.md @@ -0,0 +1,47 @@ +# ROS topics: CPU Monitor + +## HDD Temperature + +/diagnostics/hdd_monitor: HDD Temperature + +[summary] + +| level | message | +| ----- | ------------ | +| OK | OK | +| WARN | hot | +| ERROR | critical hot | + +[values] + +| key | value (example) | +| ---------------------- | -------------------------- | +| HDD [0-9]: status | OK / hot / critical hot | +| HDD [0-9]: name | /dev/nvme0 | +| HDD [0-9]: model | SAMSUNG MZVLB1T0HBLR-000L7 | +| HDD [0-9]: serial | S4EMNF0M820682 | +| HDD [0-9]: temperature | 37.0 DegC | + +## HDD Usage + +/diagnostics/hdd_monitor: HDD Usage + +[summary] + +| level | message | +| ----- | ------------------- | +| OK | OK | +| WARN | low disk space | +| ERROR | very low disk space | + +[values] + +| key | value (example) | +| --------------------- | ----------------------------------------- | +| HDD [0-9]: status | OK / low disk space / very low disk space | +| HDD [0-9]: filesystem | /dev/nvme0n1p4 | +| HDD [0-9]: size | 264G | +| HDD [0-9]: used | 172G | +| HDD [0-9]: avail | 749G | +| HDD [0-9]: use | 69% | +| HDD [0-9]: mounted on | / | diff --git a/system/system_monitor/docs/topics_mem_monitor.md b/system/system_monitor/docs/topics_mem_monitor.md new file mode 100644 index 0000000000000..ae55c2aff0246 --- /dev/null +++ b/system/system_monitor/docs/topics_mem_monitor.md @@ -0,0 +1,28 @@ +# ROS topics: Memory Monitor + +## Memory Usage + +/diagnostics/mem_monitor: Memory Usage + +[summary] + +| level | message | +| ----- | -------------- | +| OK | OK | +| WARN | high load | +| ERROR | very high load | + +[values] + +| key | value (example) | +| ------------ | --------------- | +| Mem: usage | 18.99% | +| Mem: total | 31G | +| Mem: used | 5.9G | +| Mem: free | 15G | +| Swap: total | 2.0G | +| Swap: used | 0B | +| Swap: free | 2.0G | +| Total: total | 33G | +| Total: used | 5.9G | +| Total: free | 17G | diff --git a/system/system_monitor/docs/topics_net_monitor.md b/system/system_monitor/docs/topics_net_monitor.md new file mode 100644 index 0000000000000..1e0eefe12063c --- /dev/null +++ b/system/system_monitor/docs/topics_net_monitor.md @@ -0,0 +1,31 @@ +# ROS topics: Net Monitor + +## Network Usage + +/diagnostics/cpu_monitor: Network Usage + +[summary] + +| level | message | +| ----- | --------- | +| OK | OK | +| WARN | high load | +| ERROR | down | + +[values] + +| key | value (example) | +| ----------------------------- | --------------------- | +| Network [0-9]: status | OK / high load / down | +| Network [0-9]: interface name | wlp82s0 | +| Network [0-9]: rx_usage | 0.00% | +| Network [0-9]: tx_usage | 0.00% | +| Network [0-9]: rx_traffic | 0.00 MB/s | +| Network [0-9]: tx_traffic | 0.00 MB/s | +| Network [0-9]: capacity | 400.0 MB/s | +| Network [0-9]: mtu | 1500 | +| Network [0-9]: rx_bytes | 58455228 | +| Network [0-9]: rx_errors | 0 | +| Network [0-9]: tx_bytes | 11069136 | +| Network [0-9]: tx_errors | 0 | +| Network [0-9]: collisions | 0 | diff --git a/system/system_monitor/docs/topics_ntp_monitor.md b/system/system_monitor/docs/topics_ntp_monitor.md new file mode 100644 index 0000000000000..398c40026707a --- /dev/null +++ b/system/system_monitor/docs/topics_ntp_monitor.md @@ -0,0 +1,20 @@ +# ROS topics: NTP Monitor + +## NTP Offset + +/diagnostics/ntp_monitor: NTP Offset + +[summary] + +| level | message | +| ----- | -------- | +| OK | OK | +| WARN | high | +| ERROR | too high | + +[values] + +| key | value (example) | +| ---------- | --------------- | +| NTP Offset | -0.013181 sec | +| NTP Delay | 0.053880 sec | diff --git a/system/system_monitor/docs/topics_process_monitor.md b/system/system_monitor/docs/topics_process_monitor.md new file mode 100644 index 0000000000000..97899172881fe --- /dev/null +++ b/system/system_monitor/docs/topics_process_monitor.md @@ -0,0 +1,75 @@ +# ROS topics: Process Monitor + +## Tasks Summary + +/diagnostics/process_monitor: Tasks Summary + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | + +[values] + +| key | value (example) | +| -------- | --------------- | +| total | 409 | +| running | 2 | +| sleeping | 321 | +| stopped | 0 | +| zombie | 0 | + +## High-load Proc[0-9] + +/diagnostics/process_monitor: High-load Proc[0-9] + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | + +[values] + +| key | value (example) | +| ------- | ------------------------ | +| COMMAND | /usr/lib/firefox/firefox | +| %CPU | 37.5 | +| %MEM | 2.1 | +| PID | 14062 | +| USER | autoware | +| PR | 20 | +| NI | 0 | +| VIRT | 3461152 | +| RES | 669052 | +| SHR | 481208 | +| S | S | +| TIME+ | 23:57.49 | + +## High-mem Proc[0-9] + +/diagnostics/process_monitor: High-mem Proc[0-9] + +[summary] + +| level | message | +| ----- | ------- | +| OK | OK | + +[values] + +| key | value (example) | +| ------- | ----------------------------------------------- | +| COMMAND | /snap/multipass/1784/usr/bin/qemu-system-x86_64 | +| %CPU | 0 | +| %MEM | 2.5 | +| PID | 1565 | +| USER | root | +| PR | 20 | +| NI | 0 | +| VIRT | 3722320 | +| RES | 812432 | +| SHR | 20340 | +| S | S | +| TIME+ | 0:22.84 | diff --git a/system/system_monitor/include/hdd_reader/hdd_reader.hpp b/system/system_monitor/include/hdd_reader/hdd_reader.hpp new file mode 100644 index 0000000000000..e06bd6766dccc --- /dev/null +++ b/system/system_monitor/include/hdd_reader/hdd_reader.hpp @@ -0,0 +1,64 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file hdd_reader.h + * @brief HDD reader definitions + */ + +#ifndef HDD_READER__HDD_READER_HPP_ +#define HDD_READER__HDD_READER_HPP_ + +#include +#include +#include + +#include +#include + +/** + * @brief HDD information + */ +struct HDDInfo +{ + int error_code_; //!< @brief error code, 0 on success, otherwise error + std::string model_; //!< @brief Model number + std::string serial_; //!< @brief Serial number + uint8_t temp_; //!< @brief temperature(DegC) + // Lowest byte of the raw value contains the exact temperature value (Celsius degrees) + // in S.M.A.R.T. information. + + /** + * @brief Load or save data members. + * @param [inout] ar archive reference to load or save the serialized data members + * @param [in] version version for the archive + * @note NOLINT syntax is needed since this is an interface to serialization and + * used inside boost serialization. + */ + template + void serialize(archive & ar, const unsigned /*version*/) // NOLINT(runtime/references) + { + ar & error_code_; + ar & model_; + ar & serial_; + ar & temp_; + } +}; + +/** + * @brief HDD information list + */ +typedef std::map HDDInfoList; + +#endif // HDD_READER__HDD_READER_HPP_ diff --git a/system/system_monitor/include/msr_reader/msr_reader.hpp b/system/system_monitor/include/msr_reader/msr_reader.hpp new file mode 100644 index 0000000000000..650932891cc2f --- /dev/null +++ b/system/system_monitor/include/msr_reader/msr_reader.hpp @@ -0,0 +1,51 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file msr_reader.h + * @brief MSR reader definitions + */ + +#ifndef MSR_READER__MSR_READER_HPP_ +#define MSR_READER__MSR_READER_HPP_ + +#include +#include + +#include + +/** + * @brief MSR information + */ +struct MSRInfo +{ + int error_code_; //!< @brief error code, 0 on success, otherwise error + std::vector pkg_thermal_status_; //!< @brief Pkg Thermal Status + + /** + * @brief Load or save data members. + * @param [inout] ar archive reference to load or save the serialized data members + * @param [in] version version for the archive + * @note NOLINT syntax is needed since this is an interface to serialization and + * used inside boost serialization. + */ + template + void serialize(archive & ar, const unsigned /*version*/) // NOLINT(runtime/references) + { + ar & error_code_; + ar & pkg_thermal_status_; + } +}; + +#endif // MSR_READER__MSR_READER_HPP_ diff --git a/system/system_monitor/include/system_monitor/cpu_monitor/arm_cpu_monitor.hpp b/system/system_monitor/include/system_monitor/cpu_monitor/arm_cpu_monitor.hpp new file mode 100644 index 0000000000000..44b828d0bf38c --- /dev/null +++ b/system/system_monitor/include/system_monitor/cpu_monitor/arm_cpu_monitor.hpp @@ -0,0 +1,53 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file arm_cpu_monitor.h + * @brief ARM CPU monitor class + */ + +#ifndef SYSTEM_MONITOR__CPU_MONITOR__ARM_CPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__CPU_MONITOR__ARM_CPU_MONITOR_HPP_ + +#include "system_monitor/cpu_monitor/cpu_monitor_base.hpp" + +#include + +class CPUMonitor : public CPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + explicit CPUMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief get names for core temperature files + */ + void getTempNames() override; + +protected: + /** + * @brief check CPU thermal throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) +}; + +#endif // SYSTEM_MONITOR__CPU_MONITOR__ARM_CPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/cpu_monitor/cpu_monitor_base.hpp b/system/system_monitor/include/system_monitor/cpu_monitor/cpu_monitor_base.hpp new file mode 100644 index 0000000000000..5f5d8d2fb6fd9 --- /dev/null +++ b/system/system_monitor/include/system_monitor/cpu_monitor/cpu_monitor_base.hpp @@ -0,0 +1,158 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file cpu_monitor_base.h + * @brief CPU monitor base class + */ + +#ifndef SYSTEM_MONITOR__CPU_MONITOR__CPU_MONITOR_BASE_HPP_ +#define SYSTEM_MONITOR__CPU_MONITOR__CPU_MONITOR_BASE_HPP_ + +#include + +#include +#include +#include +#include + +/** + * @brief CPU temperature information + */ +typedef struct cpu_temp_info +{ + std::string label_; //!< @brief cpu label + std::string path_; //!< @brief sysfs path to cpu temperature + + cpu_temp_info() : label_(), path_() {} + cpu_temp_info(const std::string & label, const std::string & path) : label_(label), path_(path) {} +} cpu_temp_info; + +/** + * @brief CPU frequency information + */ +typedef struct cpu_freq_info +{ + int index_; //!< @brief cpu index + std::string path_; //!< @brief sysfs path to cpu frequency + + cpu_freq_info() : index_(0), path_() {} + cpu_freq_info(int index, const std::string & path) : index_(index), path_(path) {} +} cpu_freq_info; + +class CPUMonitorBase : public rclcpp::Node +{ +public: + /** + * @brief Update the diagnostic state. + */ + void update(); + + /** + * @brief get names for core temperature files + */ + virtual void getTempNames(); + + /** + * @brief get names for cpu frequency files + */ + virtual void getFreqNames(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + CPUMonitorBase(const std::string & node_name, const rclcpp::NodeOptions & options); + + /** + * @brief check CPU temperature + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkTemp( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check CPU usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check CPU load average + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkLoad( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check CPU thermal throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + */ + virtual void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check CPU frequency + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkFrequency( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + int num_cores_; //!< @brief number of cores + std::vector temps_; //!< @brief CPU list for temperature + std::vector freqs_; //!< @brief CPU list for frequency + bool mpstat_exists_; //!< @brief flag if mpstat exists + + float temp_warn_; //!< @brief CPU temperature(DegC) to generate warning + float temp_error_; //!< @brief CPU temperature(DegC) to generate error + float usage_warn_; //!< @brief CPU usage(%) to generate warning + float usage_error_; //!< @brief CPU usage(%) to generate error + bool usage_avg_; //!< @brief Check CPU usage calculated as averages among all processors + + /** + * @brief CPU temperature status messages + */ + const std::map temp_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "warm"}, {DiagStatus::ERROR, "hot"}}; + + /** + * @brief CPU usage status messages + */ + const std::map load_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "high load"}, {DiagStatus::ERROR, "very high load"}}; + + /** + * @brief CPU thermal throttling status messages + */ + const std::map thermal_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "unused"}, {DiagStatus::ERROR, "throttling"}}; +}; + +#endif // SYSTEM_MONITOR__CPU_MONITOR__CPU_MONITOR_BASE_HPP_ diff --git a/system/system_monitor/include/system_monitor/cpu_monitor/intel_cpu_monitor.hpp b/system/system_monitor/include/system_monitor/cpu_monitor/intel_cpu_monitor.hpp new file mode 100644 index 0000000000000..a4891656b7659 --- /dev/null +++ b/system/system_monitor/include/system_monitor/cpu_monitor/intel_cpu_monitor.hpp @@ -0,0 +1,59 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file intel_cpu_monitor.h + * @brief CPU monitor class + */ + +#ifndef SYSTEM_MONITOR__CPU_MONITOR__INTEL_CPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__CPU_MONITOR__INTEL_CPU_MONITOR_HPP_ + +#include "system_monitor/cpu_monitor/cpu_monitor_base.hpp" + +#include + +class CPUMonitor : public CPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit CPUMonitor(const rclcpp::NodeOptions & options); + +protected: + /** + * @brief check CPU thermal throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief get names for core temperature files + */ + void getTempNames() override; + + /** + * @brief Add a loadable kernel module msr + */ + void modprobeMSR(); + + int msr_reader_port_; //!< @brief port number to connect to msr_reader +}; + +#endif // SYSTEM_MONITOR__CPU_MONITOR__INTEL_CPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/cpu_monitor/raspi_cpu_monitor.hpp b/system/system_monitor/include/system_monitor/cpu_monitor/raspi_cpu_monitor.hpp new file mode 100644 index 0000000000000..b0456cf34963e --- /dev/null +++ b/system/system_monitor/include/system_monitor/cpu_monitor/raspi_cpu_monitor.hpp @@ -0,0 +1,75 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file raspi_cpu_monitor.h + * @brief Raspberry Pi CPU monitor class + */ + +#ifndef SYSTEM_MONITOR__CPU_MONITOR__RASPI_CPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__CPU_MONITOR__RASPI_CPU_MONITOR_HPP_ + +#include "system_monitor/cpu_monitor/cpu_monitor_base.hpp" + +#include + +#define raspiUnderVoltageDetected (1 << 0) // 0x00001 +#define raspiArmFrequencyCapped (1 << 1) // 0x00002 +#define raspiCurrentlyThrottled (1 << 2) // 0x00004 +#define raspiSoftTemperatureLimitActive (1 << 3) // 0x00008 +#define raspiUnderVoltageHasOccurred (1 << 16) // 0x10000 +#define raspiArmFrequencyCappedHasOccurred (1 << 17) // 0x20000 +#define raspiThrottlingHasOccurred (1 << 18) // 0x40000 +#define raspiSoftTemperatureLimitHasOccurred (1 << 19) // 0x80000 + +#define raspiThermalThrottlingMask (raspiCurrentlyThrottled | raspiSoftTemperatureLimitActive) + +#define throttledToString(X) \ + (((X)&raspiUnderVoltageDetected) ? "Under-voltage detected" \ + : ((X)&raspiArmFrequencyCapped) ? "Arm frequency capped" \ + : ((X)&raspiCurrentlyThrottled) ? "Currently throttled" \ + : ((X)&raspiSoftTemperatureLimitActive) ? "Soft temperature limit active" \ + : ((X)&raspiUnderVoltageHasOccurred) ? "Under-voltage has occurred" \ + : ((X)&raspiArmFrequencyCappedHasOccurred) ? "Arm frequency capped has occurred" \ + : ((X)&raspiThrottlingHasOccurred) ? "Throttling has occurred" \ + : ((X)&raspiSoftTemperatureLimitHasOccurred) ? "Soft temperature limit has occurred" \ + : "UNKNOWN") + +class CPUMonitor : public CPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + explicit CPUMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief get names for core temperature files + */ + void getTempNames() override; + +protected: + /** + * @brief check CPU thermal throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) +}; + +#endif // SYSTEM_MONITOR__CPU_MONITOR__RASPI_CPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/cpu_monitor/tegra_cpu_monitor.hpp b/system/system_monitor/include/system_monitor/cpu_monitor/tegra_cpu_monitor.hpp new file mode 100644 index 0000000000000..e86e21470e4dc --- /dev/null +++ b/system/system_monitor/include/system_monitor/cpu_monitor/tegra_cpu_monitor.hpp @@ -0,0 +1,53 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file tegra_cpu_monitor.h + * @brief TEGRA CPU monitor class + */ + +#ifndef SYSTEM_MONITOR__CPU_MONITOR__TEGRA_CPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__CPU_MONITOR__TEGRA_CPU_MONITOR_HPP_ + +#include "system_monitor/cpu_monitor/cpu_monitor_base.hpp" + +#include + +class CPUMonitor : public CPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + explicit CPUMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief get names for core temperature files + */ + void getTempNames() override; + +protected: + /** + * @brief check CPU thermal throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) +}; + +#endif // SYSTEM_MONITOR__CPU_MONITOR__TEGRA_CPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/cpu_monitor/unknown_cpu_monitor.hpp b/system/system_monitor/include/system_monitor/cpu_monitor/unknown_cpu_monitor.hpp new file mode 100644 index 0000000000000..926011a3ed285 --- /dev/null +++ b/system/system_monitor/include/system_monitor/cpu_monitor/unknown_cpu_monitor.hpp @@ -0,0 +1,38 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file unknown_cpu_monitor.h + * @brief Unknown CPU monitor class + */ + +#ifndef SYSTEM_MONITOR__CPU_MONITOR__UNKNOWN_CPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__CPU_MONITOR__UNKNOWN_CPU_MONITOR_HPP_ + +#include "system_monitor/cpu_monitor/cpu_monitor_base.hpp" + +#include + +class CPUMonitor : public CPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + explicit CPUMonitor(const rclcpp::NodeOptions & options); +}; + +#endif // SYSTEM_MONITOR__CPU_MONITOR__UNKNOWN_CPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/gpu_monitor/gpu_monitor_base.hpp b/system/system_monitor/include/system_monitor/gpu_monitor/gpu_monitor_base.hpp new file mode 100644 index 0000000000000..9c4f6c7510c94 --- /dev/null +++ b/system/system_monitor/include/system_monitor/gpu_monitor/gpu_monitor_base.hpp @@ -0,0 +1,129 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file gpu_monitor.h + * @brief GPU monitor class + */ + +#ifndef SYSTEM_MONITOR__GPU_MONITOR__GPU_MONITOR_BASE_HPP_ +#define SYSTEM_MONITOR__GPU_MONITOR__GPU_MONITOR_BASE_HPP_ + +#include + +#include +#include +#include + +class GPUMonitorBase : public rclcpp::Node +{ +public: + /** + * @brief Update the diagnostic state. + */ + virtual void update(); + + /** + * @brief Terminate the node, log final statements. An independent function is preferred to allow + * an explicit way to operate actions that require a valid rclcpp context. By default this method + * does nothing. + */ + virtual void shut_down(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + GPUMonitorBase(const std::string & node_name, const rclcpp::NodeOptions & options); + + /** + * @brief check GPU temperature + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkTemp( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check GPU usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check GPU memory usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkMemoryUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check GPU throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check GPU frequency + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + virtual void checkFrequency( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + + float temp_warn_; //!< @brief GPU temperature(DegC) to generate warning + float temp_error_; //!< @brief GPU temperature(DegC) to generate error + float gpu_usage_warn_; //!< @brief GPU usage(%) to generate warning + float gpu_usage_error_; //!< @brief GPU usage(%) to generate error + float memory_usage_warn_; //!< @brief GPU memory usage(%) to generate warning + float memory_usage_error_; //!< @brief GPU memory usage(%) to generate error + + /** + * @brief GPU temperature status messages + */ + const std::map temp_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "warm"}, {DiagStatus::ERROR, "hot"}}; + + /** + * @brief GPU usage status messages + */ + const std::map load_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "high load"}, {DiagStatus::ERROR, "very high load"}}; + + /** + * @brief GPU throttling status messages + */ + const std::map throttling_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "unused"}, {DiagStatus::ERROR, "throttling"}}; +}; + +#endif // SYSTEM_MONITOR__GPU_MONITOR__GPU_MONITOR_BASE_HPP_ diff --git a/system/system_monitor/include/system_monitor/gpu_monitor/nvml_gpu_monitor.hpp b/system/system_monitor/include/system_monitor/gpu_monitor/nvml_gpu_monitor.hpp new file mode 100644 index 0000000000000..c29a026ba914c --- /dev/null +++ b/system/system_monitor/include/system_monitor/gpu_monitor/nvml_gpu_monitor.hpp @@ -0,0 +1,133 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file nvml_gpu_monitor.h + * @brief NVML GPU monitor class + */ + +#ifndef SYSTEM_MONITOR__GPU_MONITOR__NVML_GPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__GPU_MONITOR__NVML_GPU_MONITOR_HPP_ + +#include "system_monitor/gpu_monitor/gpu_monitor_base.hpp" + +#include + +#include +#include +#include + +#define reasonToString(X) \ + (((X)&nvmlClocksThrottleReasonGpuIdle) ? "GpuIdle" \ + : ((X)&nvmlClocksThrottleReasonApplicationsClocksSetting) ? "ApplicationsClocksSetting" \ + : ((X)&nvmlClocksThrottleReasonSwPowerCap) ? "SwPowerCap" \ + : ((X)&nvmlClocksThrottleReasonHwSlowdown) ? "HwSlowdown" \ + : ((X)&nvmlClocksThrottleReasonSyncBoost) ? "SyncBoost" \ + : ((X)&nvmlClocksThrottleReasonSwThermalSlowdown) ? "SwThermalSlowdown" \ + : ((X)&nvmlClocksThrottleReasonHwThermalSlowdown) ? "HwThermalSlowdown" \ + : ((X)&nvmlClocksThrottleReasonHwPowerBrakeSlowdown) ? "HwPowerBrakeSlowdown" \ + : ((X)&nvmlClocksThrottleReasonDisplayClockSetting) ? "DisplayClockSetting" \ + : "UNKNOWN") + +/** + * @brief GPU information + */ +struct gpu_info +{ + nvmlDevice_t device; //!< @brief handle for a particular device + char name[NVML_DEVICE_NAME_BUFFER_SIZE]; //!< @brief name of device + nvmlPciInfo_t pci; //!< @brief PCI information about a GPU device + nvmlUtilization_t utilization; //!< @brief Utilization information for a device +}; + +class GPUMonitor : public GPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + explicit GPUMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief Terminate the node, log final statements. An independent function is preferred to allow + * an explicit way to operate actions that require a valid rclcpp context. By default this method + * does nothing. + */ + void shut_down() override; + +protected: + /** + * @brief check GPU temperature + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkTemp( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief check GPU usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief add stat of GPU usage per process + * @param [in] index GPU index + * @param [in] device GPU device + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + */ + void addProcessUsage( + int index, nvmlDevice_t device, diagnostic_updater::DiagnosticStatusWrapper & stat); + + /** + * @brief check GPU memory usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkMemoryUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief check GPU throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief get human-readable output for memory size + * @param [in] size size with bytes + * @return human-readable output + * @note NOLINT syntax is needed since struct nvmlMemory_t has unsigned long long values to return + * memory size. + */ + std::string toHumanReadable(unsigned long long size); // NOLINT(runtime/int) + + static const size_t MAX_ARRAY_SIZE = 64; + static const size_t MAX_NAME_LENGTH = 128; + + std::vector gpus_; //!< @brief list of gpus + uint64_t current_timestamp_ = 0; //!< @brief latest timestamp[usec] of addProcessUsage() +}; + +#endif // SYSTEM_MONITOR__GPU_MONITOR__NVML_GPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/gpu_monitor/tegra_gpu_monitor.hpp b/system/system_monitor/include/system_monitor/gpu_monitor/tegra_gpu_monitor.hpp new file mode 100644 index 0000000000000..c8d513d64f296 --- /dev/null +++ b/system/system_monitor/include/system_monitor/gpu_monitor/tegra_gpu_monitor.hpp @@ -0,0 +1,103 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/** + * @file tegra_gpu_monitor.h + * @brief Tegra TGPU monitor class + */ + +#ifndef SYSTEM_MONITOR__GPU_MONITOR__TEGRA_GPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__GPU_MONITOR__TEGRA_GPU_MONITOR_HPP_ + +#include "system_monitor/gpu_monitor/gpu_monitor_base.hpp" + +#include +#include + +struct gpu_info +{ + std::string label_; //!< @brief gpu label + std::string path_; //!< @brief sysfs path to gpu temperature + + gpu_info() : label_(), path_() {} + gpu_info(const std::string & l, const std::string & p) : label_(l), path_(p) {} +}; + +class GPUMonitor : public GPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + explicit GPUMonitor(const rclcpp::NodeOptions & options); + +protected: + /** + * @brief check GPU temperature + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkTemp( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief check GPU usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief check GPU throttling + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkThrottling( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief check GPU frequency + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkFrequency( + diagnostic_updater::DiagnosticStatusWrapper & stat) override; // NOLINT(runtime/references) + + /** + * @brief get names for gpu temperature files + */ + void getTempNames(); + + /** + * @brief get names for gpu load files + */ + void getLoadNames(); + + /** + * @brief get names for gpu frequency files + */ + void getFreqNames(); + + std::vector temps_; //!< @brief GPU list for temperature + std::vector loads_; //!< @brief GPU list for utilization + std::vector freqs_; //!< @brief GPU list for frequency +}; + +#endif // SYSTEM_MONITOR__GPU_MONITOR__TEGRA_GPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/gpu_monitor/unknown_gpu_monitor.hpp b/system/system_monitor/include/system_monitor/gpu_monitor/unknown_gpu_monitor.hpp new file mode 100644 index 0000000000000..a512c2e9109bf --- /dev/null +++ b/system/system_monitor/include/system_monitor/gpu_monitor/unknown_gpu_monitor.hpp @@ -0,0 +1,37 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file unknown_gpu_monitor.h + * @brief Unknown GPU monitor class + */ + +#ifndef SYSTEM_MONITOR__GPU_MONITOR__UNKNOWN_GPU_MONITOR_HPP_ +#define SYSTEM_MONITOR__GPU_MONITOR__UNKNOWN_GPU_MONITOR_HPP_ + +#include "system_monitor/gpu_monitor/gpu_monitor_base.hpp" + +#include + +class GPUMonitor : public GPUMonitorBase +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit GPUMonitor(const rclcpp::NodeOptions & options); +}; + +#endif // SYSTEM_MONITOR__GPU_MONITOR__UNKNOWN_GPU_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/hdd_monitor/hdd_monitor.hpp b/system/system_monitor/include/system_monitor/hdd_monitor/hdd_monitor.hpp new file mode 100644 index 0000000000000..4ed7fe0a89c85 --- /dev/null +++ b/system/system_monitor/include/system_monitor/hdd_monitor/hdd_monitor.hpp @@ -0,0 +1,105 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file hdd_monitor.h + * @brief HDD monitor class + */ + +#ifndef SYSTEM_MONITOR__HDD_MONITOR__HDD_MONITOR_HPP_ +#define SYSTEM_MONITOR__HDD_MONITOR__HDD_MONITOR_HPP_ + +#include + +#include +#include +#include +#include + +/** + * @brief error and warning temperature levels + */ +struct HDDParam +{ + float temp_warn_; //!< @brief HDD temperature(DegC) to generate warning + float temp_error_; //!< @brief HDD temperature(DegC) to generate error + float usage_warn_; //!< @brief HDD usage(%) to generate warning + float usage_error_; //!< @brief HDD usage(%) to generate error + + HDDParam() : temp_warn_(55.0), temp_error_(70.0), usage_warn_(0.95), usage_error_(0.99) {} +}; + +class HDDMonitor : public rclcpp::Node +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit HDDMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief Update the diagnostic state. + */ + void update(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief check HDD temperature + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkTemp(diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief check HDD usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief get HDD parameters + */ + void getHDDParams(); + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + + int hdd_reader_port_; //!< @brief port number to connect to hdd_reader + std::map hdd_params_; //!< @brief list of error and warning levels + std::vector hdd_devices_; //!< @brief list of devices + + /** + * @brief HDD temperature status messages + */ + const std::map temp_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "hot"}, {DiagStatus::ERROR, "critical hot"}}; + + /** + * @brief HDD usage status messages + */ + const std::map usage_dict_ = { + {DiagStatus::OK, "OK"}, + {DiagStatus::WARN, "low disk space"}, + {DiagStatus::ERROR, "very low disk space"}}; +}; + +#endif // SYSTEM_MONITOR__HDD_MONITOR__HDD_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/mem_monitor/mem_monitor.hpp b/system/system_monitor/include/system_monitor/mem_monitor/mem_monitor.hpp new file mode 100644 index 0000000000000..697f4e2e1bac6 --- /dev/null +++ b/system/system_monitor/include/system_monitor/mem_monitor/mem_monitor.hpp @@ -0,0 +1,76 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file mem_monitor.h + * @brief Memory monitor class + */ + +#ifndef SYSTEM_MONITOR__MEM_MONITOR__MEM_MONITOR_HPP_ +#define SYSTEM_MONITOR__MEM_MONITOR__MEM_MONITOR_HPP_ + +#include + +#include +#include +#include + +class MemMonitor : public rclcpp::Node +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit MemMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief Update the diagnostic state. + */ + void update(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief check Memory usage + * @param @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief get human-readable output for memory size + * @param [in] str size with bytes + * @return human-readable output + */ + std::string toHumanReadable(const std::string & str); + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + + float usage_warn_; //!< @brief Memory usage(%) to generate warning + float usage_error_; //!< @brief Memory usage(%) to generate error + + /** + * @brief Memory usage status messages + */ + const std::map usage_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "high load"}, {DiagStatus::ERROR, "very high load"}}; +}; + +#endif // SYSTEM_MONITOR__MEM_MONITOR__MEM_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/net_monitor/net_monitor.hpp b/system/system_monitor/include/system_monitor/net_monitor/net_monitor.hpp new file mode 100644 index 0000000000000..834dd2950ab69 --- /dev/null +++ b/system/system_monitor/include/system_monitor/net_monitor/net_monitor.hpp @@ -0,0 +1,104 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file net_monitor.h + * @brief Net monitor class + */ + +#ifndef SYSTEM_MONITOR__NET_MONITOR__NET_MONITOR_HPP_ +#define SYSTEM_MONITOR__NET_MONITOR__NET_MONITOR_HPP_ + +#include "system_monitor/net_monitor/nl80211.hpp" + +#include + +#include +#include +#include +#include + +#define toMbit(X) (static_cast(X) / 1000000 * 8) + +/** + * @brief Bytes information + */ +typedef struct bytes +{ + unsigned int rx_bytes; //!< @brief total bytes received + unsigned int tx_bytes; //!< @brief total bytes transmitted + + bytes() : rx_bytes(0), tx_bytes(0) {} +} bytes; + +class NetMonitor : public rclcpp::Node +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit NetMonitor(const rclcpp::NodeOptions & options); + /** + * @brief destructor + */ + ~NetMonitor(); + + /** + * @brief Update the diagnostic state. + */ + void update(); + + /** + * @brief Shutdown nl80211 object + */ + void shutdown_nl80211(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief check CPU usage + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkUsage( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief get wireless speed + * @param [in] ifa_name interface name + * @return wireless speed + */ + float getWirelessSpeed(const char * ifa_name); + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + std::map bytes_; //!< @brief list of bytes + rclcpp::Time last_update_time_; //!< @brief last update time + std::vector device_params_; //!< @brief list of devices + NL80211 nl80211_; // !< @brief 802.11 netlink-based interface + + float usage_warn_; //!< @brief Memory usage(%) to generate warning + + /** + * @brief Network usage status messages + */ + const std::map usage_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "high load"}, {DiagStatus::ERROR, "down"}}; +}; + +#endif // SYSTEM_MONITOR__NET_MONITOR__NET_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/net_monitor/nl80211.hpp b/system/system_monitor/include/system_monitor/net_monitor/nl80211.hpp new file mode 100644 index 0000000000000..0400b1524cca0 --- /dev/null +++ b/system/system_monitor/include/system_monitor/net_monitor/nl80211.hpp @@ -0,0 +1,60 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file nl80211.h + * @brief 802.11 netlink-based interface class + */ + +#ifndef SYSTEM_MONITOR__NET_MONITOR__NL80211_HPP_ +#define SYSTEM_MONITOR__NET_MONITOR__NL80211_HPP_ + +class NL80211 +{ +public: + /** + * @brief constructor + * @param [in] node_name Name of the node. + * @param [in] options Options associated with this node. + */ + NL80211(); + + /** + * @brief initialize + */ + void init(); + + /** + * @brief get bitrate + * @param [in] ifa_name interface name + * @return bitrate + */ + float getBitrate(const char * ifa_name); + + /** + * @brief shutdown + */ + void shutdown(); + + float bitrate_; //!< @brief bitrate + +private: + bool + initialized_; //!< @brief Indicating whether initialization was completed successfully or not + struct nl_sock * socket_; //!< @brief Netlink socket + int id_; //!< @brief Generic netlink family id + struct nl_cb * cb_; //!< @brief Callback handle +}; + +#endif // SYSTEM_MONITOR__NET_MONITOR__NL80211_HPP_ diff --git a/system/system_monitor/include/system_monitor/ntp_monitor/ntp_monitor.hpp b/system/system_monitor/include/system_monitor/ntp_monitor/ntp_monitor.hpp new file mode 100644 index 0000000000000..c319b8e35d5dd --- /dev/null +++ b/system/system_monitor/include/system_monitor/ntp_monitor/ntp_monitor.hpp @@ -0,0 +1,80 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file ntp_monitor.h + * @brief NTP monitor class + */ + +#ifndef SYSTEM_MONITOR__NTP_MONITOR__NTP_MONITOR_HPP_ +#define SYSTEM_MONITOR__NTP_MONITOR__NTP_MONITOR_HPP_ + +#include + +#include +#include +#include +#include + +class NTPMonitor : public rclcpp::Node +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit NTPMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief Update the diagnostic state. + */ + void update(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief check NTP Offset + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void checkOffset( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief function to execute chronyc + * @param [out] outOffset offset value of NTP time + * @param [out] out_tracking_map "chronyc tracking" output for diagnostic + * @return if error occurred, return error string + */ + std::string executeChronyc( + float & outOffset, std::map & out_tracking_map); + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + bool chronyc_exists_; //!< @brief flag if chronyc exists + + float offset_warn_; //!< @brief NTP offset(sec) to generate warning + float offset_error_; //!< @brief NTP offset(sec) to generate error + + /** + * @brief NTP offset status messages + */ + const std::map offset_dict_ = { + {DiagStatus::OK, "OK"}, {DiagStatus::WARN, "high"}, {DiagStatus::ERROR, "too high"}}; +}; + +#endif // SYSTEM_MONITOR__NTP_MONITOR__NTP_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/process_monitor/diag_task.hpp b/system/system_monitor/include/system_monitor/process_monitor/diag_task.hpp new file mode 100644 index 0000000000000..183f86baa2a08 --- /dev/null +++ b/system/system_monitor/include/system_monitor/process_monitor/diag_task.hpp @@ -0,0 +1,179 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file diag_task.h + * @brief diagnostics task for high load/memory procs + */ + +#ifndef SYSTEM_MONITOR__PROCESS_MONITOR__DIAG_TASK_HPP_ +#define SYSTEM_MONITOR__PROCESS_MONITOR__DIAG_TASK_HPP_ + +#include + +#include + +class DiagTask : public diagnostic_updater::DiagnosticTask +{ +public: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief constructor + * @param [in] name diagnostics status name + */ + explicit DiagTask(const std::string & name) : DiagnosticTask(name) {} + + /** + * @brief main loop + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + */ + void run(diagnostic_updater::DiagnosticStatusWrapper & stat) + { + stat.summary(level_, message_); + + if (level_ != DiagStatus::OK) { + stat.add("content", content_); + } else { + stat.add("COMMAND", command_); + stat.add("%CPU", cpu_); + stat.add("%MEM", mem_); + stat.add("PID", pid_); + stat.add("USER", user_); + stat.add("PR", pr_); + stat.add("NI", ni_); + stat.add("VIRT", virt_); + stat.add("RES", res_); + stat.add("SHR", shr_); + stat.add("S", s_); + stat.add("TIME+", time_); + } + stat.summary(level_, message_); + } + + /** + * @brief set diagnostics status + * @param [in] status Diagnostics error level + * @param [in] message Diagnostics status message + */ + void setDiagnosticsStatus(int level, const std::string & message) + { + level_ = level; + message_ = message; + } + + /** + * @brief set error content + * @param [in] error_command Error command + * @param [in] content Error content + */ + void setErrorContent(const std::string & error_command, const std::string & content) + { + error_command_ = error_command; + content_ = content; + } + + /** + * @brief set process id + * @param [in] pid process id + */ + void setProcessId(const std::string & pid) { pid_ = pid; } + + /** + * @brief set user name + * @param [in] user user name + */ + void setUserName(const std::string & user) { user_ = user; } + + /** + * @brief set priority + * @param [in] pr priority + */ + void setPriority(const std::string & pr) { pr_ = pr; } + + /** + * @brief set nice value + * @param [in] ni nice value + */ + void setNiceValue(const std::string & ni) { ni_ = ni; } + + /** + * @brief set virtual image + * @param [in] virt virtual image + */ + void setVirtualImage(const std::string & virt) { virt_ = virt; } + + /** + * @brief set resident size + * @param [in] res resident size + */ + void setResidentSize(const std::string & res) { res_ = res; } + + /** + * @brief set shared mem size + * @param [in] shr shared mem size + */ + void setSharedMemSize(const std::string & shr) { shr_ = shr; } + + /** + * @brief set process status + * @param [in] s process status + */ + void setProcessStatus(const std::string & s) { s_ = s; } + + /** + * @brief set CPU usage + * @param [in] cpu CPU usage + */ + void setCPUUsage(const std::string & cpu) { cpu_ = cpu; } + + /** + * @brief set memory usage + * @param [in] mem memory usage + */ + void setMemoryUsage(const std::string & mem) { mem_ = mem; } + + /** + * @brief set CPU time + * @param [in] time CPU time + */ + void setCPUTime(const std::string & time) { time_ = time; } + + /** + * @brief set Command name/line + * @param [in] command Command name/line + */ + void setCommandName(const std::string & command) { command_ = command; } + +private: + int level_; //!< @brief Diagnostics error level + std::string message_; //!< @brief Diagnostics status message + std::string error_command_; //!< @brief Error command + std::string content_; //!< @brief Error content + + std::string pid_; //!< @brief Process Id + std::string user_; //!< @brief User Name + std::string pr_; //!< @brief Priority + std::string ni_; //!< @brief Nice value + std::string virt_; //!< @brief Virtual Image (kb) + std::string res_; //!< @brief Resident size (kb) + std::string shr_; //!< @brief Shared Mem size (kb) + std::string s_; //!< @brief Process Status + std::string cpu_; //!< @brief CPU usage + std::string mem_; //!< @brief Memory usage + std::string time_; //!< @brief CPU Time + std::string command_; //!< @brief Command name/line +}; + +#endif // SYSTEM_MONITOR__PROCESS_MONITOR__DIAG_TASK_HPP_ diff --git a/system/system_monitor/include/system_monitor/process_monitor/process_monitor.hpp b/system/system_monitor/include/system_monitor/process_monitor/process_monitor.hpp new file mode 100644 index 0000000000000..39bf897116b0a --- /dev/null +++ b/system/system_monitor/include/system_monitor/process_monitor/process_monitor.hpp @@ -0,0 +1,124 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file process_monitor.h + * @brief Process monitor class + */ + +#ifndef SYSTEM_MONITOR__PROCESS_MONITOR__PROCESS_MONITOR_HPP_ +#define SYSTEM_MONITOR__PROCESS_MONITOR__PROCESS_MONITOR_HPP_ + +#include "system_monitor/process_monitor/diag_task.hpp" + +#include + +#include + +#include +#include +#include + +namespace bp = boost::process; + +class ProcessMonitor : public rclcpp::Node +{ +public: + /** + * @brief constructor + * @param [in] options Options associated with this node. + */ + explicit ProcessMonitor(const rclcpp::NodeOptions & options); + + /** + * @brief Update the diagnostic state + */ + void update(); + +protected: + using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + + /** + * @brief monitor processes + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void monitorProcesses( + diagnostic_updater::DiagnosticStatusWrapper & stat); // NOLINT(runtime/references) + + /** + * @brief get task summary + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @param [in] output top command output + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void getTasksSummary( + diagnostic_updater::DiagnosticStatusWrapper & stat, + const std::string & output); // NOLINT(runtime/references) + + /** + * @brief remove header + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + * @param [in] output top command output + * @note NOLINT syntax is needed since diagnostic_updater asks for a non-const reference + * to pass diagnostic message updated in this function to diagnostic publish calls. + */ + void removeHeader( + diagnostic_updater::DiagnosticStatusWrapper & stat, + std::string & output); // NOLINT(runtime/references) + + /** + * @brief get high load processes + * @param [in] output top command output + */ + void getHighLoadProcesses(const std::string & output); + + /** + * @brief get high memory processes + * @param [in] output top command output + */ + void getHighMemoryProcesses(const std::string & output); + + /** + * @brief get top-rated processes + * @param [in] tasks list of diagnostics tasks for high load procs + * @param [in] output top command output + */ + void getTopratedProcesses(std::vector> * tasks, bp::pipe * p); + + /** + * @brief get top-rated processes + * @param [in] tasks list of diagnostics tasks for high load procs + * @param [in] message Diagnostics status message + * @param [in] error_command Error command + * @param [in] content Error content + */ + void setErrorContent( + std::vector> * tasks, const std::string & message, + const std::string & error_command, const std::string & content); + + diagnostic_updater::Updater updater_; //!< @brief Updater class which advertises to /diagnostics + + char hostname_[HOST_NAME_MAX + 1]; //!< @brief host name + + int num_of_procs_; //!< @brief number of processes to show + std::vector> + load_tasks_; //!< @brief list of diagnostics tasks for high load procs + std::vector> + memory_tasks_; //!< @brief list of diagnostics tasks for high memory procs +}; + +#endif // SYSTEM_MONITOR__PROCESS_MONITOR__PROCESS_MONITOR_HPP_ diff --git a/system/system_monitor/include/system_monitor/system_monitor_utility.hpp b/system/system_monitor/include/system_monitor/system_monitor_utility.hpp new file mode 100644 index 0000000000000..fc27757394aee --- /dev/null +++ b/system/system_monitor/include/system_monitor/system_monitor_utility.hpp @@ -0,0 +1,124 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file system_monitor_utility.h + * @brief System Monitor Utility class + */ + +#ifndef SYSTEM_MONITOR__SYSTEM_MONITOR_UTILITY_HPP_ +#define SYSTEM_MONITOR__SYSTEM_MONITOR_UTILITY_HPP_ + +#include +#include +#include + +#include +#include +#include +#include + +namespace fs = boost::filesystem; + +typedef struct thermal_zone +{ + std::string type_; //!< @brief thermal zone name + std::string label_; //!< @brief thermal_zone[0-9] + std::string path_; //!< @brief sysfs path to temperature + + thermal_zone() : type_(), label_(), path_() {} + thermal_zone(const std::string & type, const std::string & label, const std::string & path) + : type_(type), label_(label), path_(path) + { + } +} thermal_zone; + +class SystemMonitorUtility +{ +public: + /** + * @brief get thermal zone information + * @param [in] t thermal zone name + * @param [in] pointer to thermal zone information + */ + static void getThermalZone(const std::string & t, std::vector * therm) + { + if (therm == nullptr) { + return; + } + + therm->clear(); + + const fs::path root("/sys/class/thermal"); + + for (const fs::path & path : + boost::make_iterator_range(fs::directory_iterator(root), fs::directory_iterator())) { + if (!fs::is_directory(path)) { + continue; + } + + std::cmatch match; + const char * therm_dir = path.generic_string().c_str(); + + // not thermal_zone[0-9] + if (!std::regex_match(therm_dir, match, std::regex(".*/thermal_zone(\\d+)"))) { + continue; + } + + std::string type; + const fs::path type_path = path / "type"; + fs::ifstream ifs(type_path, std::ios::in); + if (ifs) { + std::string line; + if (std::getline(ifs, line)) { + type = line; + } + } + ifs.close(); + + if (type != t) { + continue; + } + + const fs::path temp_path = path / "temp"; + therm->emplace_back(t, path.filename().generic_string(), temp_path.generic_string()); + } + } + + /** + * @brief Remember start time to measure elapsed time + * @return start time + */ + static std::chrono::high_resolution_clock::time_point startMeasurement() + { + return std::chrono::high_resolution_clock::now(); + } + + /** + * @brief Measure elapsed time since start time and report + * @param [in] t_start start time + * @param [out] stat diagnostic message passed directly to diagnostic publish calls + */ + static void stopMeasurement( + const std::chrono::high_resolution_clock::time_point & start, + diagnostic_updater::DiagnosticStatusWrapper & stat) + { + // Measure elapsed time since start time and report + const auto t_end = std::chrono::high_resolution_clock::now(); + const float elapsed_ms = std::chrono::duration(t_end - start).count(); + stat.addf("execution time", "%f ms", elapsed_ms); + } +}; + +#endif // SYSTEM_MONITOR__SYSTEM_MONITOR_UTILITY_HPP_ diff --git a/system/system_monitor/launch/system_monitor.launch.py b/system/system_monitor/launch/system_monitor.launch.py new file mode 100644 index 0000000000000..1a54f8954dce2 --- /dev/null +++ b/system/system_monitor/launch/system_monitor.launch.py @@ -0,0 +1,156 @@ +# Copyright 2020 Tier IV, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from ament_index_python.packages import get_package_share_directory +import launch +from launch.actions import DeclareLaunchArgument +from launch.actions import OpaqueFunction +from launch.substitutions import LaunchConfiguration +from launch_ros.actions import ComposableNodeContainer +from launch_ros.descriptions import ComposableNode +import yaml + + +def launch_setup(context, *args, **kwargs): + + with open(LaunchConfiguration("cpu_monitor_config_file").perform(context), "r") as f: + cpu_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + cpu_monitor = ComposableNode( + package="system_monitor", + plugin="CPUMonitor", + name="cpu_monitor", + parameters=[ + cpu_monitor_config, + ], + ) + with open(LaunchConfiguration("hdd_monitor_config_file").perform(context), "r") as f: + hdd_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + hdd_monitor = ComposableNode( + package="system_monitor", + plugin="HDDMonitor", + name="hdd_monitor", + parameters=[ + hdd_monitor_config, + ], + ) + with open(LaunchConfiguration("mem_monitor_config_file").perform(context), "r") as f: + mem_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + mem_monitor = ComposableNode( + package="system_monitor", + plugin="MemMonitor", + name="mem_monitor", + parameters=[ + mem_monitor_config, + ], + ) + with open(LaunchConfiguration("net_monitor_config_file").perform(context), "r") as f: + net_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + net_monitor = ComposableNode( + package="system_monitor", + plugin="NetMonitor", + name="net_monitor", + parameters=[ + net_monitor_config, + ], + ) + with open(LaunchConfiguration("ntp_monitor_config_file").perform(context), "r") as f: + ntp_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + ntp_monitor = ComposableNode( + package="system_monitor", + plugin="NTPMonitor", + name="ntp_monitor", + parameters=[ + ntp_monitor_config, + ], + ) + with open(LaunchConfiguration("process_monitor_config_file").perform(context), "r") as f: + process_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + process_monitor = ComposableNode( + package="system_monitor", + plugin="ProcessMonitor", + name="process_monitor", + parameters=[ + process_monitor_config, + ], + ) + with open(LaunchConfiguration("gpu_monitor_config_file").perform(context), "r") as f: + gpu_monitor_config = yaml.safe_load(f)["/**"]["ros__parameters"] + gpu_monitor = ComposableNode( + package="system_monitor", + plugin="GPUMonitor", + name="gpu_monitor", + parameters=[ + gpu_monitor_config, + ], + ) + + # set container to run all required components in the same process + container = ComposableNodeContainer( + name="system_monitor_container", + namespace="system_monitor", + package="rclcpp_components", + executable="component_container_mt", + composable_node_descriptions=[ + cpu_monitor, + hdd_monitor, + mem_monitor, + net_monitor, + ntp_monitor, + process_monitor, + gpu_monitor, + ], + output="screen", + ) + return [container] + + +def generate_launch_description(): + system_monitor_path = os.path.join( + get_package_share_directory("system_launch"), "config", "system_monitor" + ) + return launch.LaunchDescription( + [ + DeclareLaunchArgument( + "cpu_monitor_config_file", + default_value=os.path.join(system_monitor_path, "cpu_monitor.param.yaml"), + ), + DeclareLaunchArgument( + "hdd_monitor_config_file", + default_value=os.path.join(system_monitor_path, "hdd_monitor.param.yaml"), + ), + DeclareLaunchArgument( + "mem_monitor_config_file", + default_value=os.path.join(system_monitor_path, "mem_monitor.param.yaml"), + ), + DeclareLaunchArgument( + "net_monitor_config_file", + default_value=os.path.join(system_monitor_path, "net_monitor.param.yaml"), + ), + DeclareLaunchArgument( + "ntp_monitor_config_file", + default_value=os.path.join(system_monitor_path, "ntp_monitor.param.yaml"), + ), + DeclareLaunchArgument( + "process_monitor_config_file", + default_value=os.path.join(system_monitor_path, "process_monitor.param.yaml"), + ), + DeclareLaunchArgument( + "gpu_monitor_config_file", + default_value=os.path.join(system_monitor_path, "gpu_monitor.param.yaml"), + ), + OpaqueFunction(function=launch_setup), + ] + ) diff --git a/system/system_monitor/launch/system_monitor.launch.xml b/system/system_monitor/launch/system_monitor.launch.xml new file mode 100644 index 0000000000000..ac6e2918cd18c --- /dev/null +++ b/system/system_monitor/launch/system_monitor.launch.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/system_monitor/package.xml b/system/system_monitor/package.xml new file mode 100644 index 0000000000000..3e44457ebdfb6 --- /dev/null +++ b/system/system_monitor/package.xml @@ -0,0 +1,31 @@ + + + + system_monitor + 1.13.0 + The system_monitor package + Fumihito Ito + + Apache License 2.0 + + ament_cmake_auto + + diagnostic_msgs + diagnostic_updater + fmt + libnl-3-dev + rclcpp + rclcpp_components + std_msgs + + chrony + sysstat + + ament_cmake_gtest + ament_lint_auto + autoware_lint_common + + + ament_cmake + + diff --git a/system/system_monitor/reader/hdd_reader/hdd_reader.cpp b/system/system_monitor/reader/hdd_reader/hdd_reader.cpp new file mode 100644 index 0000000000000..b5b691e64c854 --- /dev/null +++ b/system/system_monitor/reader/hdd_reader/hdd_reader.cpp @@ -0,0 +1,591 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file hdd_reader.cpp + * @brief HDD information read class + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// 7634-7647 Unassigned +constexpr int PORT = 7635; + +/** + * @brief HDD information + */ +struct HDD_Info +{ + std::string model_; //!< @brief Model number + std::string serial_; //!< @brief Serial number + int temperature_; //!< @brief Temperature +}; + +/** + * @brief ATA PASS-THROUGH (12) command + * @note For details please see the document below. + * - ATA Command Pass-Through + * https://www.t10.org/ftp/t10/document.04/04-262r8.pdf + */ +struct ATAPassThrough12 +{ + uint8_t operation_code_; //!< @brief OPERATION CODE (A1h) + uint8_t reserved0_ : 1; //!< @brief Reserved + uint8_t protocol_ : 4; //!< @brief PROTOCOL + uint8_t multiple_count_ : 3; //!< @brief MULTIPLE_COUNT + uint8_t t_length_ : 2; //!< @brief T_LENGTH + uint8_t byt_blok_ : 1; //!< @brief BYT_BLOK + uint8_t t_dir_ : 1; //!< @brief T_DIR + uint8_t reserved1_ : 1; //!< @brief Reserved + uint8_t ck_cond_ : 1; //!< @brief CK_COND + uint8_t off_line_ : 2; //!< @brief OFF_LINE + uint8_t features_; //!< @brief FEATURES (0:7) + uint8_t sector_count_; //!< @brief SECTOR_COUNT (0:7) + uint8_t lba_low_; //!< @brief LBA_LOW (0:7) + uint8_t lba_mid_; //!< @brief LBA_MID (0:7) + uint8_t lbe_high_; //!< @brief LBE_HIGH (0:7) + uint8_t device_; //!< @brief DEVICE + uint8_t command_; //!< @brief COMMAND + uint8_t reserved2_; //!< @brief Reserved + uint8_t control_; //!< @brief CONTROL +}; + +/** + * @brief Attribute Table Format + * @note For details please see the documents below. + * - SMART Attribute Overview + * http://www.t13.org/Documents/UploadedDocuments/docs2005/e05171r0-ACS-SMARTAttributes_Overview.pdf + */ +struct AttributeEntry +{ + uint8_t attribute_id_; //!< @brief Attribute ID + // Flags + uint16_t warranty_ : 1; //!< @brief Bit 0 – Warranty + uint16_t offline_ : 1; //!< @brief Bit 1 – Offline + uint16_t performance_ : 1; //!< @brief Bit 2 – Performance + uint16_t error_rate_ : 1; //!< @brief Bit 3 – Error rate + uint16_t event_count_ : 1; //!< @brief Bit 4 – Event count + uint16_t self_preservation_ : 1; //!< @brief Bit 5 – Self-preservation + uint16_t reserved_ : 10; //!< @brief Bits 6–15 – Reserved + + uint8_t current_value_; //!< @brief Current value + uint8_t worst_value_; //!< @brief Worst value + uint32_t data_; //!< @brief Data + uint16_t attribute_specific_; //!< @brief Attribute-specific + uint8_t threshold_; //!< @brief Threshold +} __attribute__((packed)); // Minimize total struct memory 16 to 12 + +/** + * @brief Device SMART data structure + * @note For details please see the documents below. + * - ATA/ATAPI Command Set - 3 (ACS-3) + * http://www.t13.org/Documents/UploadedDocuments/docs2013/d2161r5-ATAATAPI_Command_Set_-_3.pdf + * - SMART Attribute Overview + * http://www.t13.org/Documents/UploadedDocuments/docs2005/e05171r0-ACS-SMARTAttributes_Overview.pdf + */ +struct SMARTData +{ + // Offset 0..361 X Vendor specific + uint16_t smart_structure_version_; //!< @brief SMART structure version + AttributeEntry attribute_entry_[30]; //!< @brief Attribute entry 1 - 30 + // Offset 362 to 511 + uint8_t off_line_data_collection_status_; //!< @brief Off-line data collection status + uint8_t self_test_execution_status_byte_; //!< @brief Self-test execution status byte + uint16_t vendor_specific0_; //!< @brief Vendor specific + uint8_t vendor_specific1_; //!< @brief Vendor specific + uint8_t off_line_data_collection_capability_; //!< @brief Off-line data collection capability + uint16_t smart_capability_; //!< @brief SMART capability + uint8_t error_logging_capability_; //!< @brief Error logging capability + uint8_t vendor_specific2_; //!< @brief Vendor specific + uint8_t short_self_test_polling_time_; //!< @brief Short self-test polling time (in minutes) + uint8_t extended_self_test_polling_time_; //!< @brief Extended self-test polling time in minutes + uint8_t + conveyance_self_test_polling_time_; //!< @brief Conveyance self-test polling time in minutes + uint16_t //!< @brief Extended self-test polling time + extended_self_test_polling_time_word_; //!< in minutes (word) + uint8_t reserved_[9]; //!< @brief Reserved + uint8_t vendor_specific3_[125]; //!< @brief Vendor specific + uint8_t data_structure_checksum_; //!< @brief Data structure checksum +} __attribute__((packed)); // Minimize total struct memory 514 to 512 + +/** + * @brief print usage + */ +void usage() +{ + printf("Usage: hdd_reader [options]\n"); + printf(" -h --help : Display help\n"); + printf(" -p --port # : Port number to listen to.\n"); + printf("\n"); +} + +/** + * @brief exchanges the values of 2 bytes + * @param [inout] ptr a pointer to ATA string + * @param [in] size size of ATA string + * @note Each pair of bytes in an ATA string is swapped. + * FIRMWARE REVISION field example + * Word Value + * 23 6162h ("ba") + * 24 6364h ("dc") + * 25 6566h ("fe") + * 26 6720h (" g") + * -> "abcdefg " + */ +void swap_char(char * ptr, size_t size) +{ + for (auto i = 0U; i < size; i += 2U) { + std::swap(ptr[i], ptr[i + 1]); + } +} + +/** + * @brief get IDENTIFY DEVICE for ATA drive + * @param [in] fd file descriptor to device + * @param [out] info a pointer to HDD information + * @return 0 on success, otherwise error + * @note For details please see the documents below. + * - ATA Command Pass-Through + * https://www.t10.org/ftp/t10/document.04/04-262r8.pdf + * - ATA Command Set - 4 (ACS-4) + * http://www.t13.org/Documents/UploadedDocuments/docs2016/di529r14-ATAATAPI_Command_Set_-_4.pdf + */ +int get_ata_identify(int fd, HDDInfo * info) +{ + sg_io_hdr_t hdr{}; + ATAPassThrough12 ata{}; + unsigned char data[512]{}; // 256 words + + // Create a command descriptor block(CDB) + ata.operation_code_ = 0xA1; // ATA PASS-THROUGH (12) command + ata.protocol_ = 0x4; // PIO Data-In + ata.t_dir_ = 0x1; // from the ATA device to the application client + ata.byt_blok_ = 0x1; // the number of blocks specified in the T_LENGTH field + ata.t_length_ = 0x2; // length is specified in the SECTOR_COUNT field + ata.sector_count_ = 0x01; // 1 sector + ata.command_ = 0xEC; // IDENTIFY DEVICE + + // Create a control structure + hdr.interface_id = 'S'; // This must be set to 'S' + hdr.dxfer_direction = SG_DXFER_FROM_DEV; // a SCSI READ command + hdr.cmd_len = sizeof(ata); // length in bytes of the SCSI command that 'cmdp' points to + hdr.cmdp = (unsigned char *)&ata; // SCSI command to be executed + hdr.dxfer_len = sizeof(data); // number of bytes to be moved in the data transfer + hdr.dxferp = data; // a pointer to user memory + hdr.timeout = 1000; // 1 second + + // send SCSI command to device + if (ioctl(fd, SG_IO, &hdr) < 0) { + return errno; + } + + // IDENTIFY DEVICE + // Word 10..19 Serial number + char serial_number[20 + 1]{}; + strncpy(serial_number, reinterpret_cast(data) + 20, 20); + swap_char(serial_number, 20); + info->serial_ = serial_number; + boost::trim(info->serial_); + + // Word 27..46 Model number + char model_number[40 + 1]{}; + strncpy(model_number, reinterpret_cast(data) + 54, 40); + swap_char(model_number, 40); + info->model_ = model_number; + boost::trim(info->model_); + + return EXIT_SUCCESS; +} + +/** + * @brief get SMART DATA for ATA drive + * @param [in] fd file descriptor to device + * @param [out] info a pointer to HDD information + * @return 0 on success, otherwise error + * @note For details please see the documents below. + * - ATA Command Pass-Through + * https://www.t10.org/ftp/t10/document.04/04-262r8.pdf + * - ATA/ATAPI Command Set - 3 (ACS-3) + * http://www.t13.org/Documents/UploadedDocuments/docs2013/d2161r5-ATAATAPI_Command_Set_-_3.pdf + * - SMART Attribute Overview + * http://www.t13.org/Documents/UploadedDocuments/docs2005/e05171r0-ACS-SMARTAttributes_Overview.pdf + * - SMART Attribute Annex + * http://www.t13.org/documents/uploadeddocuments/docs2005/e05148r0-acs-smartattributesannex.pdf + */ +int get_ata_SMARTData(int fd, HDDInfo * info) +{ + sg_io_hdr_t hdr{}; + ATAPassThrough12 ata{}; + SMARTData data{}; + + // Create a command descriptor block(CDB) + ata.operation_code_ = 0xA1; // ATA PASS-THROUGH (12) command + ata.protocol_ = 0x4; // PIO Data-In + ata.t_dir_ = 0x1; // from the ATA device to the application client + ata.byt_blok_ = 0x1; // the number of blocks specified in the T_LENGTH field + ata.t_length_ = 0x2; // length is specified in the SECTOR_COUNT field + ata.features_ = 0xD0; // SMART READ DATA + ata.sector_count_ = 0x01; // 1 sector + ata.lba_mid_ = 0x4F; // Fixed + ata.lbe_high_ = 0xC2; // Fixed + ata.command_ = 0xB0; // SMART READ DATA + + // Create a control structure + hdr.interface_id = 'S'; // This must be set to 'S' + hdr.dxfer_direction = SG_DXFER_FROM_DEV; // a SCSI READ command + hdr.cmd_len = sizeof(ata); // length in bytes of the SCSI command that 'cmdp' points to + hdr.cmdp = (unsigned char *)&ata; // SCSI command to be executed + hdr.dxfer_len = sizeof(data); // number of bytes to be moved in the data transfer + hdr.dxferp = &data; // a pointer to user memory + hdr.timeout = 1000; // 1 second + + // send SCSI command to device + if (ioctl(fd, SG_IO, &hdr) < 0) { + return errno; + } + + // Retrieve C2h Enclosure Temperature + for (int i = 0; i < 30; ++i) { + if (data.attribute_entry_[i].attribute_id_ == 0xC2) { + info->temp_ = static_cast(data.attribute_entry_[i].data_); + return EXIT_SUCCESS; + } + } + + return ENOENT; +} + +/** + * @brief get Identify for NVMe drive + * @param [in] fd file descriptor to device + * @param [out] info a pointer to HDD information + * @return 0 on success, otherwise error + * @note For details please see the document below. + * - NVM Express 1.2b + * https://www.nvmexpress.org/wp-content/uploads/NVM_Express_1_2b_Gold_20160603.pdf + */ +int get_nvme_identify(int fd, HDDInfo * info) +{ + nvme_admin_cmd cmd{}; + char data[4096]{}; // Fixed size for Identify command + + // The Identify command returns a data buffer that describes information about the NVM subsystem + cmd.opcode = 0x06; // Identify + cmd.addr = (uint64_t)data; // memory address of data + cmd.data_len = sizeof(data); // length of data + cmd.cdw10 = 0x01; // Identify Controller data structure + + // send Admin Command to device + int ret = ioctl(fd, NVME_IOCTL_ADMIN_CMD, &cmd); + if (ret < 0) { + return errno; + } + + // Identify Controller Data Structure + // Bytes 23:04 Serial Number (SN) + char serial_number[20 + 1]{}; + strncpy(serial_number, data + 4, 20); + info->serial_ = serial_number; + boost::trim(info->serial_); + + // Bytes 63:24 Model Number (MN) + char model_number[40 + 1]{}; + strncpy(model_number, data + 24, 40); + info->model_ = model_number; + boost::trim(info->model_); + + return EXIT_SUCCESS; +} + +/** + * @brief get SMART / Health Information for NVMe drive + * @param [in] fd file descriptor to device + * @param [inout] info a pointer to HDD information + * @return 0 on success, otherwise error + * @note For details please see the document below. + * - NVM Express 1.2b + * https://www.nvmexpress.org/wp-content/uploads/NVM_Express_1_2b_Gold_20160603.pdf + */ +int get_nvme_SMARTData(int fd, HDDInfo * info) +{ + nvme_admin_cmd cmd{}; + char data[4]{}; // 1 Dword (get byte 0 to 3) + + // The Get Log Page command returns a data buffer containing the log page requested + cmd.opcode = 0x02; // Get Log Page + cmd.nsid = 0xFFFFFFFF; // Global log page + cmd.addr = (uint64_t)data; // memory address of data + cmd.data_len = sizeof(data); // length of data + cmd.cdw10 = 0x00010002; // Bit 27:16 Number of Dwords (NUMD) = 001h (1 Dword) + // - Minimum necessary size to obtain a temperature + // Bit 07:00 = 02h (SMART / Health Information) + + // send Admin Command to device + int ret = ioctl(fd, NVME_IOCTL_ADMIN_CMD, &cmd); + if (ret < 0) { + return errno; + } + + // Bytes 2:1 Composite Temperature + // Convert kelvin to celsius + unsigned int temperature = ((data[2] << 8) | data[1]) - 273; + info->temp_ = static_cast(temperature); + + return EXIT_SUCCESS; +} + +/** + * @brief check HDD temperature + * @param [in] port port to listen + */ +void run(int port) +{ + // Create a new socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + syslog(LOG_ERR, "Failed to create a new socket. %s\n", strerror(errno)); + return; + } + + // Allow address reuse + int ret = 0; + int opt = 1; + ret = setsockopt( + sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&opt), (socklen_t)sizeof(opt)); + if (ret < 0) { + syslog(LOG_ERR, "Failed to set socket FD's option. %s\n", strerror(errno)); + close(sock); + return; + } + + // Give the socket FD the local address ADDR + sockaddr_in addr{}; + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + syslog(LOG_ERR, "Failed to give the socket FD the local address ADDR. %s\n", strerror(errno)); + close(sock); + return; + } + + // Prepare to accept connections on socket FD + ret = listen(sock, 5); + if (ret < 0) { + syslog(LOG_ERR, "Failed to prepare to accept connections on socket FD. %s\n", strerror(errno)); + close(sock); + return; + } + + sockaddr_in client{}; + socklen_t len = sizeof(client); + + while (true) { + // Await a connection on socket FD + int new_sock = accept(sock, reinterpret_cast(&client), &len); + if (new_sock < 0) { + syslog( + LOG_ERR, "Failed to prepare to accept connections on socket FD. %s\n", strerror(errno)); + close(sock); + return; + } + + // Receive list of device from a socket + char buf[1024]{}; + ret = recv(new_sock, buf, sizeof(buf) - 1, 0); + if (ret < 0) { + syslog(LOG_ERR, "Failed to receive. %s\n", strerror(errno)); + close(new_sock); + close(sock); + return; + } + // No data received + if (ret == 0) { + syslog(LOG_ERR, "No data received. %s\n", strerror(errno)); + close(new_sock); + close(sock); + return; + } + + // Restore list of devices + std::vector hdd_devices; + + try { + buf[sizeof(buf) - 1] = '\0'; + std::istringstream iss(buf); + boost::archive::text_iarchive oa(iss); + oa & hdd_devices; + } catch (const std::exception & e) { + syslog(LOG_ERR, "exception. %s\n", e.what()); + close(new_sock); + close(sock); + return; + } + + HDDInfoList list; + std::ostringstream oss; + boost::archive::text_oarchive oa(oss); + + for (auto & hdd_device : hdd_devices) { + HDDInfo info{}; + + // Open a file + int fd = open(hdd_device.c_str(), O_RDONLY); + if (fd < 0) { + info.error_code_ = errno; + syslog(LOG_ERR, "Failed to open a file. %s\n", strerror(info.error_code_)); + continue; + } + + // AHCI device + if (boost::starts_with(hdd_device.c_str(), "/dev/sd")) { + // Get IDENTIFY DEVICE for ATA drive + info.error_code_ = get_ata_identify(fd, &info); + if (info.error_code_ != 0) { + syslog( + LOG_ERR, "Failed to get IDENTIFY DEVICE for ATA drive. %s\n", + strerror(info.error_code_)); + close(fd); + continue; + } + // Get SMART DATA for ATA drive + info.error_code_ = get_ata_SMARTData(fd, &info); + if (info.error_code_ != 0) { + syslog( + LOG_ERR, "Failed to get SMART LOG for ATA drive. %s\n", strerror(info.error_code_)); + close(fd); + continue; + } + } else if (boost::starts_with(hdd_device.c_str(), "/dev/nvme")) { // NVMe device + // Get Identify for NVMe drive + info.error_code_ = get_nvme_identify(fd, &info); + if (info.error_code_ != 0) { + syslog( + LOG_ERR, "Failed to get Identify for NVMe drive. %s\n", strerror(info.error_code_)); + close(fd); + continue; + } + // Get SMART / Health Information for NVMe drive + info.error_code_ = get_nvme_SMARTData(fd, &info); + if (info.error_code_ != 0) { + syslog( + LOG_ERR, "Failed to get SMART / Health Information for NVMe drive. %s\n", + strerror(info.error_code_)); + close(fd); + continue; + } + } + + // Close the file descriptor FD + info.error_code_ = close(fd); + if (info.error_code_ < 0) { + info.error_code_ = errno; + syslog(LOG_ERR, "Failed to close the file descriptor FD. %s\n", strerror(info.error_code_)); + } + + list[hdd_device] = info; + } + + oa << list; + // Write N bytes of BUF to FD + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + if (ret < 0) { + syslog(LOG_ERR, "Failed to write N bytes of BUF to FD. %s\n", strerror(errno)); + } + + // Close the file descriptor FD + ret = close(new_sock); + if (ret < 0) { + syslog(LOG_ERR, "Failed to close the file descriptor FD. %s\n", strerror(errno)); + } + } + + close(sock); +} + +int main(int argc, char ** argv) +{ + static struct option long_options[] = { + {"help", no_argument, nullptr, 'h'}, + {"port", required_argument, nullptr, 'p'}, + {nullptr, 0, nullptr, 0}}; + + // Parse command-line options + int c = 0; + int option_index = 0; + int port = PORT; + while ((c = getopt_long(argc, argv, "hp:", long_options, &option_index)) != -1) { + switch (c) { + case 'h': + usage(); + return EXIT_SUCCESS; + + case 'p': + try { + port = boost::lexical_cast(optarg); + } catch (const boost::bad_lexical_cast & e) { + printf("Error: %s\n", e.what()); + return EXIT_FAILURE; + } + break; + + default: + break; + } + } + + // Put the program in the background + if (daemon(0, 0) < 0) { + printf("Failed to put the program in the background. %s\n", strerror(errno)); + return errno; + } + + // Open connection to system logger + openlog(nullptr, LOG_PID, LOG_DAEMON); + + run(port); + + // Close descriptor used to write to system logger + closelog(); + + return EXIT_SUCCESS; +} diff --git a/system/system_monitor/reader/msr_reader/msr_reader.cpp b/system/system_monitor/reader/msr_reader/msr_reader.cpp new file mode 100644 index 0000000000000..17bbfd20a7667 --- /dev/null +++ b/system/system_monitor/reader/msr_reader/msr_reader.cpp @@ -0,0 +1,285 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file msr_reader.cpp + * @brief MSR read class + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace fs = boost::filesystem; + +// 7634-7647 Unassigned +constexpr int PORT = 7634; + +/** + * @brief Package Thermal Status Information + * For details please see the documents below. + * - Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual + * https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf + */ +typedef struct +{ + uint64_t pkg_thermal_status_ : 1; //!< @brief 0 Pkg Thermal Status (RO) + uint64_t pkg_thermal_status_log_ : 1; //!< @brief 1 Pkg Thermal Status Log (R/W) + uint64_t pkg_prochot_event_ : 1; //!< @brief 2 Pkg PROCHOT # event (RO) + uint64_t pkg_prochot_log_ : 1; //!< @brief 3 Pkg PROCHOT # log (R/WC0) + uint64_t pkg_critical_temperature_status_ : 1; //!< @brief 4 Pkg Critical Temperature Status (RO) + uint64_t //!< @brief 5 Pkg Critical Temperature + pkg_critical_temperature_status_log_ : 1; //!< Status Log (R/WC0) + uint64_t pkg_thermal_threshold_1_status_ : 1; //!< @brief 6 Pkg Thermal Threshold #1 Status (RO) + uint64_t pkg_thermal_threshold_1_log_ : 1; //!< @brief 7 Pkg Thermal Threshold #1 log (R/WC0) + uint64_t pkg_thermal_threshold_2_status_ : 1; //!< @brief 8 Pkg Thermal Threshold #2 Status (RO) + uint64_t pkg_thermal_threshold_2_log_ : 1; //!< @brief 9 Pkg Thermal Threshold #2 log (R/WC0) + uint64_t pkg_power_limitation_status_ : 1; //!< @brief 10 Pkg Power Limitation Status (RO) + uint64_t pkg_power_limitation_log_ : 1; //!< @brief 11 Pkg Power Limitation log (R/WC0) + uint64_t reserved1_ : 4; //!< @brief 15:12 Reserved + uint64_t pkg_digital_readout_ : 7; //!< @brief 22:16 Pkg Digital Readout (RO) + uint64_t reserved2_ : 41; //!< @brief 63:23 Reserved +} PackageThermalStatus; + +/** + * @brief print usage + */ +void usage() +{ + printf("Usage: msr_reader [options]\n"); + printf(" -h --help : Display help\n"); + printf(" -p --port # : Port number to listen to.\n"); + printf("\n"); +} + +/** + * @brief check CPU thermal throttling + * @param [in] port port to listen + * @param [in] list list of path to msr + */ +void run(int port, const std::vector & list) +{ + // Create a new socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + syslog(LOG_ERR, "Failed to create a new socket. %s\n", strerror(errno)); + return; + } + + // Allow address reuse + int ret = 0; + int opt = 1; + ret = setsockopt( + sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&opt), (socklen_t)sizeof(opt)); + if (ret < 0) { + syslog(LOG_ERR, "Failed to set socket FD's option. %s\n", strerror(errno)); + close(sock); + return; + } + + // Give the socket FD the local address ADDR + sockaddr_in addr; + memset(&addr, 0, sizeof(sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + syslog(LOG_ERR, "Failed to give the socket FD the local address ADDR. %s\n", strerror(errno)); + close(sock); + return; + } + + // Prepare to accept connections on socket FD + ret = listen(sock, 5); + if (ret < 0) { + syslog(LOG_ERR, "Failed to prepare to accept connections on socket FD. %s\n", strerror(errno)); + close(sock); + return; + } + + sockaddr_in client; + socklen_t len = sizeof(client); + + while (true) { + // Await a connection on socket FD + int new_sock = accept(sock, reinterpret_cast(&client), &len); + if (new_sock < 0) { + syslog( + LOG_ERR, "Failed to prepare to accept connections on socket FD. %s\n", strerror(errno)); + close(sock); + return; + } + + ret = 0; + std::ostringstream oss; + boost::archive::text_oarchive oa(oss); + MSRInfo msr{0, {}}; + + for (auto itr = list.begin(); itr != list.end(); ++itr) { + // Open a file + int fd = open(itr->c_str(), O_RDONLY); + if (fd < 0) { + msr.error_code_ = errno; + syslog(LOG_ERR, "Failed to open a file. %s\n", strerror(msr.error_code_)); + break; + } + + // Read from a file descriptor + PackageThermalStatus val; + ret = pread(fd, &val, sizeof(uint64_t), 0x1b1); + if (ret < 0) { + msr.error_code_ = errno; + syslog(LOG_ERR, "Failed to read from a file descriptor. %s\n", strerror(msr.error_code_)); + close(fd); + break; + } + + // Close the file descriptor FD + ret = close(fd); + if (ret < 0) { + msr.error_code_ = errno; + syslog(LOG_ERR, "Failed to close the file descriptor FD. %s\n", strerror(msr.error_code_)); + break; + } + + msr.pkg_thermal_status_.push_back(val.pkg_thermal_status_); + } + + oa << msr; + // Write N bytes of BUF to FD + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + if (ret < 0) { + syslog(LOG_ERR, "Failed to write N bytes of BUF to FD. %s\n", strerror(errno)); + } + + // Close the file descriptor FD + ret = close(new_sock); + if (ret < 0) { + syslog(LOG_ERR, "Failed to close the file descriptor FD. %s\n", strerror(errno)); + } + } + + close(sock); +} + +int main(int argc, char ** argv) +{ + static struct option long_options[] = { + {"help", no_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {0, 0, 0, 0}}; + + // Parse command-line options + int c = 0; + int option_index = 0; + int port = PORT; + while ((c = getopt_long(argc, argv, "hp:", long_options, &option_index)) != -1) { + switch (c) { + case 'h': + usage(); + return EXIT_SUCCESS; + + case 'p': + try { + port = boost::lexical_cast(optarg); + } catch (const boost::bad_lexical_cast & e) { + printf("Error: %s\n", e.what()); + return EXIT_FAILURE; + } + break; + + default: + break; + } + } + + if (!fs::exists("/dev/cpu")) { + printf("Failed to access /dev/cpu.\n"); + return EXIT_FAILURE; + } + + std::vector list; + const fs::path root("/dev/cpu"); + + for (const fs::path & path : boost::make_iterator_range( + fs::recursive_directory_iterator(root), fs::recursive_directory_iterator())) { + if (fs::is_directory(path)) { + continue; + } + + std::cmatch match; + const char * msr = path.generic_string().c_str(); + + // /dev/cpu/[0-9]/msr ? + if (!std::regex_match(msr, match, std::regex(".*msr"))) { + continue; + } + + list.push_back(path.generic_string()); + } + + std::sort(list.begin(), list.end(), [](const std::string & c1, const std::string & c2) { + std::cmatch match; + const std::regex filter(".*/(\\d+)/msr"); + int n1 = 0; + int n2 = 0; + if (std::regex_match(c1.c_str(), match, filter)) { + n1 = std::stoi(match[1].str()); + } + if (std::regex_match(c2.c_str(), match, filter)) { + n2 = std::stoi(match[1].str()); + } + return n1 < n2; + }); // NOLINT + + if (list.empty()) { + printf("No msr found in /dev/cpu.\n"); + return EXIT_FAILURE; + } + + // Put the program in the background + if (daemon(0, 0) < 0) { + printf("Failed to put the program in the background. %s\n", strerror(errno)); + return errno; + } + + // Open connection to system logger + openlog(nullptr, LOG_PID, LOG_DAEMON); + + run(port, list); + + // Close descriptor used to write to system logger + closelog(); + + return EXIT_SUCCESS; +} diff --git a/system/system_monitor/src/cpu_monitor/arm_cpu_monitor.cpp b/system/system_monitor/src/cpu_monitor/arm_cpu_monitor.cpp new file mode 100644 index 0000000000000..4b7fe6c03e32d --- /dev/null +++ b/system/system_monitor/src/cpu_monitor/arm_cpu_monitor.cpp @@ -0,0 +1,48 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file arm_cpu_monitor.cpp + * @brief ARM CPU monitor class + */ + +#include "system_monitor/cpu_monitor/arm_cpu_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include +#include + +CPUMonitor::CPUMonitor(const rclcpp::NodeOptions & options) : CPUMonitorBase("cpu_monitor", options) +{ +} + +void CPUMonitor::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // TODO(Fumihito Ito): implement me +} + +void CPUMonitor::getTempNames() +{ + // Jetson TX1 TX2 Nano: thermal_zone1, Xavier: thermal_zone0 + std::vector therms; + SystemMonitorUtility::getThermalZone("CPU-therm", &therms); + + for (auto itr = therms.begin(); itr != therms.end(); ++itr) { + temps_.emplace_back(itr->label_, itr->path_); + } +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(CPUMonitor) diff --git a/system/system_monitor/src/cpu_monitor/cpu_monitor_base.cpp b/system/system_monitor/src/cpu_monitor/cpu_monitor_base.cpp new file mode 100644 index 0000000000000..4f30892125955 --- /dev/null +++ b/system/system_monitor/src/cpu_monitor/cpu_monitor_base.cpp @@ -0,0 +1,333 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file cpu_monitor_base.cpp + * @brief CPU monitor base class + */ + +#include "system_monitor/cpu_monitor/cpu_monitor_base.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace bp = boost::process; +namespace fs = boost::filesystem; +namespace pt = boost::property_tree; + +CPUMonitorBase::CPUMonitorBase(const std::string & node_name, const rclcpp::NodeOptions & options) +: Node(node_name, options), + updater_(this), + hostname_(), + num_cores_(0), + temps_(), + freqs_(), + mpstat_exists_(false), + temp_warn_(declare_parameter("temp_warn", 90.0)), + temp_error_(declare_parameter("temp_error", 95.0)), + usage_warn_(declare_parameter("usage_warn", 0.90)), + usage_error_(declare_parameter("usage_error", 1.00)), + usage_avg_(declare_parameter("usage_avg", true)) +{ + gethostname(hostname_, sizeof(hostname_)); + num_cores_ = boost::thread::hardware_concurrency(); + + // Check if command exists + fs::path p = bp::search_path("mpstat"); + mpstat_exists_ = (p.empty()) ? false : true; + + updater_.setHardwareID(hostname_); + updater_.add("CPU Temperature", this, &CPUMonitorBase::checkTemp); + updater_.add("CPU Usage", this, &CPUMonitorBase::checkUsage); + updater_.add("CPU Load Average", this, &CPUMonitorBase::checkLoad); + updater_.add("CPU Thermal Throttling", this, &CPUMonitorBase::checkThrottling); + updater_.add("CPU Frequency", this, &CPUMonitorBase::checkFrequency); +} + +void CPUMonitorBase::update() { updater_.force_update(); } + +void CPUMonitorBase::checkTemp(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (temps_.empty()) { + stat.summary(DiagStatus::ERROR, "temperature files not found"); + return; + } + + int level = DiagStatus::OK; + std::string error_str = ""; + + for (auto itr = temps_.begin(); itr != temps_.end(); ++itr) { + // Read temperature file + const fs::path path(itr->path_); + fs::ifstream ifs(path, std::ios::in); + if (!ifs) { + stat.add("file open error", itr->path_); + error_str = "file open error"; + continue; + } + + float temp; + ifs >> temp; + ifs.close(); + temp /= 1000; + stat.addf(itr->label_, "%.1f DegC", temp); + + if (temp >= temp_error_) { + level = std::max(level, static_cast(DiagStatus::ERROR)); + } else if (temp >= temp_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + } + + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, error_str); + } else { + stat.summary(level, temp_dict_.at(level)); + } + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void CPUMonitorBase::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (!mpstat_exists_) { + stat.summary(DiagStatus::ERROR, "mpstat error"); + stat.add( + "mpstat", "Command 'mpstat' not found, but can be installed with: sudo apt install sysstat"); + return; + } + + // Get CPU Usage + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c("mpstat -P ALL 1 1 -o JSON", bp::std_out > is_out, bp::std_err > is_err); + c.wait(); + + if (c.exit_code() != 0) { + std::ostringstream os; + is_err >> os.rdbuf(); + stat.summary(DiagStatus::ERROR, "mpstat error"); + stat.add("mpstat", os.str().c_str()); + return; + } + + std::string cpu_name; + float usr{0.0}; + float nice{0.0}; + float sys{0.0}; + float idle{0.0}; + float usage{0.0}; + float total{0.0}; + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + + pt::ptree pt; + try { + // Analyze JSON output + read_json(is_out, pt); + + for (const pt::ptree::value_type & child1 : pt.get_child("sysstat.hosts")) { + const pt::ptree & hosts = child1.second; + + for (const pt::ptree::value_type & child2 : hosts.get_child("statistics")) { + const pt::ptree & statistics = child2.second; + + for (const pt::ptree::value_type & child3 : statistics.get_child("cpu-load")) { + const pt::ptree & cpu_load = child3.second; + + if (boost::optional v = cpu_load.get_optional("cpu")) { + cpu_name = v.get(); + } + if (boost::optional v = cpu_load.get_optional("usr")) { + usr = v.get(); + } + if (boost::optional v = cpu_load.get_optional("nice")) { + nice = v.get(); + } + if (boost::optional v = cpu_load.get_optional("sys")) { + sys = v.get(); + } + if (boost::optional v = cpu_load.get_optional("idle")) { + idle = v.get(); + } + + total = usr + nice + sys; + usage = total * 1e-2; + + level = DiagStatus::OK; + if (usage >= usage_error_) { + level = DiagStatus::ERROR; + } else if (usage >= usage_warn_) { + level = DiagStatus::WARN; + } + + stat.add(fmt::format("CPU {}: status", cpu_name), load_dict_.at(level)); + stat.addf(fmt::format("CPU {}: total", cpu_name), "%.2f%%", total); + stat.addf(fmt::format("CPU {}: usr", cpu_name), "%.2f%%", usr); + stat.addf(fmt::format("CPU {}: nice", cpu_name), "%.2f%%", nice); + stat.addf(fmt::format("CPU {}: sys", cpu_name), "%.2f%%", sys); + stat.addf(fmt::format("CPU {}: idle", cpu_name), "%.2f%%", idle); + + if (usage_avg_ == true) { + if (cpu_name == "all") { + whole_level = level; + } + } else { + whole_level = std::max(whole_level, level); + } + } + } + } + } catch (const std::exception & e) { + stat.summary(DiagStatus::ERROR, "mpstat exception"); + stat.add("mpstat", e.what()); + return; + } + + stat.summary(whole_level, load_dict_.at(whole_level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void CPUMonitorBase::checkLoad(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + double loadavg[3]; + + std::ifstream ifs("/proc/loadavg", std::ios::in); + + if (!ifs) { + stat.summary(DiagStatus::ERROR, "uptime error"); + stat.add("uptime", strerror(errno)); + return; + } + + std::string line; + + if (!std::getline(ifs, line)) { + stat.summary(DiagStatus::ERROR, "uptime error"); + stat.add("uptime", "format error"); + return; + } + + if (sscanf(line.c_str(), "%lf %lf %lf", &loadavg[0], &loadavg[1], &loadavg[2]) != 3) { + stat.summary(DiagStatus::ERROR, "uptime error"); + stat.add("uptime", "format error"); + return; + } + + loadavg[0] /= num_cores_; + loadavg[1] /= num_cores_; + loadavg[2] /= num_cores_; + + stat.summary(DiagStatus::OK, "OK"); + stat.addf("1min", "%.2f%%", loadavg[0] * 1e2); + stat.addf("5min", "%.2f%%", loadavg[1] * 1e2); + stat.addf("15min", "%.2f%%", loadavg[2] * 1e2); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void CPUMonitorBase::checkThrottling( + [[maybe_unused]] diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + RCLCPP_INFO(this->get_logger(), "CPUMonitorBase::checkThrottling not implemented."); +} + +void CPUMonitorBase::checkFrequency(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (freqs_.empty()) { + stat.summary(DiagStatus::ERROR, "frequency files not found"); + return; + } + + for (auto itr = freqs_.begin(); itr != freqs_.end(); ++itr) { + // Read scaling_cur_freq file + const fs::path path(itr->path_); + fs::ifstream ifs(path, std::ios::in); + if (ifs) { + std::string line; + if (std::getline(ifs, line)) { + stat.addf(fmt::format("CPU {}: clock", itr->index_), "%d MHz", std::stoi(line) / 1000); + } + } + ifs.close(); + } + + stat.summary(DiagStatus::OK, "OK"); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void CPUMonitorBase::getTempNames() +{ + RCLCPP_INFO(this->get_logger(), "CPUMonitorBase::getTempNames not implemented."); +} + +void CPUMonitorBase::getFreqNames() +{ + const fs::path root("/sys/devices/system/cpu"); + + for (const fs::path & path : + boost::make_iterator_range(fs::directory_iterator(root), fs::directory_iterator())) { + if (!fs::is_directory(path)) { + continue; + } + + std::cmatch match; + const char * cpu_dir = path.generic_string().c_str(); + + // /sys/devices/system/cpu[0-9] ? + if (!std::regex_match(cpu_dir, match, std::regex(".*cpu(\\d+)"))) { + continue; + } + + // /sys/devices/system/cpu[0-9]/cpufreq/scaling_cur_freq + cpu_freq_info freq; + const fs::path freq_path = path / "cpufreq/scaling_cur_freq"; + freq.index_ = std::stoi(match[1].str()); + freq.path_ = freq_path.generic_string(); + freqs_.push_back(freq); + } + + std::sort(freqs_.begin(), freqs_.end(), [](const cpu_freq_info & c1, const cpu_freq_info & c2) { + return c1.index_ < c2.index_; + }); // NOLINT +} diff --git a/system/system_monitor/src/cpu_monitor/intel_cpu_monitor.cpp b/system/system_monitor/src/cpu_monitor/intel_cpu_monitor.cpp new file mode 100644 index 0000000000000..3cc7b5f5c629c --- /dev/null +++ b/system/system_monitor/src/cpu_monitor/intel_cpu_monitor.cpp @@ -0,0 +1,211 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file _cpu_monitor.cpp + * @brief CPU monitor class + */ + +#include "system_monitor/cpu_monitor/intel_cpu_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +namespace fs = boost::filesystem; + +CPUMonitor::CPUMonitor(const rclcpp::NodeOptions & options) : CPUMonitorBase("cpu_monitor", options) +{ + msr_reader_port_ = declare_parameter("msr_reader_port", 7634); + + this->getTempNames(); + this->getFreqNames(); +} + +void CPUMonitor::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + // Create a new socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + stat.summary(DiagStatus::ERROR, "socket error"); + stat.add("socket", strerror(errno)); + return; + } + + // Specify the receiving timeouts until reporting an error + struct timeval tv; + tv.tv_sec = 10; + tv.tv_usec = 0; + int ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "setsockopt error"); + stat.add("setsockopt", strerror(errno)); + close(sock); + return; + } + + // Connect the socket referred to by the file descriptor + sockaddr_in addr; + memset(&addr, 0, sizeof(sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_port = htons(msr_reader_port_); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "connect error"); + stat.add("connect", strerror(errno)); + close(sock); + return; + } + + // Receive messages from a socket + char buf[1024] = ""; + ret = recv(sock, buf, sizeof(buf) - 1, 0); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "recv error"); + stat.add("recv", strerror(errno)); + close(sock); + return; + } + // No data received + if (ret == 0) { + stat.summary(DiagStatus::ERROR, "recv error"); + stat.add("recv", "No data received"); + close(sock); + return; + } + + // Close the file descriptor FD + ret = close(sock); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "close error"); + stat.add("close", strerror(errno)); + return; + } + + // Restore MSR information + MSRInfo info; + + try { + std::istringstream iss(buf); + boost::archive::text_iarchive oa(iss); + oa >> info; + } catch (const std::exception & e) { + stat.summary(DiagStatus::ERROR, "recv error"); + stat.add("recv", e.what()); + return; + } + + // msr_reader returns an error + if (info.error_code_ != 0) { + stat.summary(DiagStatus::ERROR, "msr_reader error"); + stat.add("msr_reader", strerror(info.error_code_)); + return; + } + + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + int index = 0; + + for (auto itr = info.pkg_thermal_status_.begin(); itr != info.pkg_thermal_status_.end(); + ++itr, ++index) { + if (*itr) { + level = DiagStatus::ERROR; + } else { + level = DiagStatus::OK; + } + + stat.add(fmt::format("CPU {}: Pkg Thermal Status", index), thermal_dict_.at(level)); + + whole_level = std::max(whole_level, level); + } + + stat.summary(whole_level, thermal_dict_.at(whole_level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void CPUMonitor::getTempNames() +{ + const fs::path root("/sys/devices/platform/coretemp.0"); + + if (!fs::exists(root)) { + return; + } + + for (const fs::path & path : boost::make_iterator_range( + fs::recursive_directory_iterator(root), fs::recursive_directory_iterator())) { + if (fs::is_directory(path)) { + continue; + } + + std::cmatch match; + const std::string temp_input = path.generic_string(); + + // /sys/devices/platform/coretemp.0/hwmon/hwmon[0-9]/temp[0-9]_input ? + if (!std::regex_match(temp_input.c_str(), match, std::regex(".*temp(\\d+)_input"))) { + continue; + } + + cpu_temp_info temp; + temp.path_ = temp_input; + temp.label_ = path.filename().generic_string(); + + std::string label = boost::algorithm::replace_all_copy(temp_input, "input", "label"); + const fs::path label_path(label); + fs::ifstream ifs(label_path, std::ios::in); + if (ifs) { + std::string line; + if (std::getline(ifs, line)) { + temp.label_ = line; + } + } + ifs.close(); + temps_.push_back(temp); + } + + std::sort(temps_.begin(), temps_.end(), [](const cpu_temp_info & c1, const cpu_temp_info & c2) { + std::smatch match; + const std::regex filter(".*temp(\\d+)_input"); + int n1 = 0; + int n2 = 0; + if (std::regex_match(c1.path_, match, filter)) { + n1 = std::stoi(match[1].str()); + } + if (std::regex_match(c2.path_, match, filter)) { + n2 = std::stoi(match[1].str()); + } + return n1 < n2; + }); // NOLINT +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(CPUMonitor) diff --git a/system/system_monitor/src/cpu_monitor/raspi_cpu_monitor.cpp b/system/system_monitor/src/cpu_monitor/raspi_cpu_monitor.cpp new file mode 100644 index 0000000000000..995bfddff0bfe --- /dev/null +++ b/system/system_monitor/src/cpu_monitor/raspi_cpu_monitor.cpp @@ -0,0 +1,85 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file raspi_cpu_monitor.cpp + * @brief Raspberry Pi CPU monitor class + */ + +#include "system_monitor/cpu_monitor/raspi_cpu_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include +#include + +#include +#include + +namespace fs = boost::filesystem; + +CPUMonitor::CPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) +: CPUMonitorBase("cpu_monitor", options) +{ +} + +void CPUMonitor::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + int level = DiagStatus::OK; + std::vector status; + + const fs::path path("/sys/devices/platform/soc/soc:firmware/get_throttled"); + fs::ifstream ifs(path, std::ios::in); + if (!ifs) { + stat.summary(DiagStatus::ERROR, "file open error"); + stat.add("get_throttled", "file open error"); + return; + } + + int throttled; + ifs >> std::hex >> throttled; + ifs.close(); + + // Consider only thermal throttling as an error + if ((throttled & raspiThermalThrottlingMask) == raspiThermalThrottlingMask) { + level = DiagStatus::ERROR; + } + + while (throttled) { + int flag = throttled & ((~throttled) + 1); + throttled ^= flag; + status.push_back(throttledToString(flag)); + } + if (status.empty()) { + status.emplace_back("All clear"); + } + + stat.add("status", boost::algorithm::join(status, ", ")); + + stat.summary(level, thermal_dict_.at(level)); +} + +void CPUMonitor::getTempNames() +{ + // thermal_zone0 + std::vector therms; + SystemMonitorUtility::getThermalZone("cpu-thermal", &therms); + + for (auto itr = therms.begin(); itr != therms.end(); ++itr) { + temps_.emplace_back(itr->label_, itr->path_); + } +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(CPUMonitor) diff --git a/system/system_monitor/src/cpu_monitor/tegra_cpu_monitor.cpp b/system/system_monitor/src/cpu_monitor/tegra_cpu_monitor.cpp new file mode 100644 index 0000000000000..19e9f362c1fbb --- /dev/null +++ b/system/system_monitor/src/cpu_monitor/tegra_cpu_monitor.cpp @@ -0,0 +1,48 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file tegra_cpu_monitor.cpp + * @brief TEGRA PU monitor class + */ + +#include "system_monitor/cpu_monitor/tegra_cpu_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include +#include + +CPUMonitor::CPUMonitor(const rclcpp::NodeOptions & options) : CPUMonitorBase("cpu_monitor", options) +{ + // There is no event record for thermal throttling. + // Need to manually monitor temperature to figure out if thermal limits crossed or not. + updater_.removeByName("CPU Thermal Throttling"); +} + +void CPUMonitor::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & stat) {} + +void CPUMonitor::getTempNames() +{ + // Jetson TX1 TX2 Nano: thermal_zone1, Xavier: thermal_zone0 + std::vector therms; + SystemMonitorUtility::getThermalZone("CPU-therm", &therms); + + for (auto itr = therms.begin(); itr != therms.end(); ++itr) { + temps_.emplace_back(itr->label_, itr->path_); + } +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(CPUMonitor) diff --git a/system/system_monitor/src/cpu_monitor/unknown_cpu_monitor.cpp b/system/system_monitor/src/cpu_monitor/unknown_cpu_monitor.cpp new file mode 100644 index 0000000000000..79b115e4f7af5 --- /dev/null +++ b/system/system_monitor/src/cpu_monitor/unknown_cpu_monitor.cpp @@ -0,0 +1,29 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file unknown_cpu_monitor.cpp + * @brief Unknown CPU monitor class + */ + +#include "system_monitor/cpu_monitor/unknown_cpu_monitor.hpp" + +#include + +CPUMonitor::CPUMonitor(const rclcpp::NodeOptions & options) : CPUMonitorBase("cpu_monitor", options) +{ +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(CPUMonitor) diff --git a/system/system_monitor/src/gpu_monitor/gpu_monitor_base.cpp b/system/system_monitor/src/gpu_monitor/gpu_monitor_base.cpp new file mode 100644 index 0000000000000..d21de67f643ce --- /dev/null +++ b/system/system_monitor/src/gpu_monitor/gpu_monitor_base.cpp @@ -0,0 +1,76 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file nvml_gpu_monitor.cpp + * @brief GPU monitor class + */ + +#include "system_monitor/gpu_monitor/gpu_monitor_base.hpp" + +#include + +#include + +GPUMonitorBase::GPUMonitorBase(const std::string & node_name, const rclcpp::NodeOptions & options) +: Node(node_name, options), + updater_(this), + hostname_{""}, + temp_warn_(declare_parameter("temp_warn", 90.0)), + temp_error_(declare_parameter("temp_error", 95.0)), + gpu_usage_warn_(declare_parameter("gpu_usage_warn", 0.90)), + gpu_usage_error_(declare_parameter("gpu_usage_error", 1.00)), + memory_usage_warn_(declare_parameter("memory_usage_warn", 0.95)), + memory_usage_error_(declare_parameter("memory_usage_error", 0.99)) +{ + gethostname(hostname_, sizeof(hostname_)); + + updater_.setHardwareID(hostname_); + updater_.add("GPU Temperature", this, &GPUMonitorBase::checkTemp); + updater_.add("GPU Usage", this, &GPUMonitorBase::checkUsage); + updater_.add("GPU Memory Usage", this, &GPUMonitorBase::checkMemoryUsage); + updater_.add("GPU Thermal Throttling", this, &GPUMonitorBase::checkThrottling); + updater_.add("GPU Frequency", this, &GPUMonitorBase::checkFrequency); +} + +void GPUMonitorBase::update() { updater_.force_update(); } + +void GPUMonitorBase::shut_down() +{ /*NOOP by default.*/ +} + +void GPUMonitorBase::checkTemp(diagnostic_updater::DiagnosticStatusWrapper & /* stat */) +{ + RCLCPP_INFO_ONCE(get_logger(), "GPUMonitorBase::checkTemp not implemented."); +} + +void GPUMonitorBase::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & /* stat */) +{ + RCLCPP_INFO_ONCE(get_logger(), "GPUMonitorBase::checkUsage not implemented."); +} + +void GPUMonitorBase::checkMemoryUsage(diagnostic_updater::DiagnosticStatusWrapper & /* stat */) +{ + RCLCPP_INFO_ONCE(get_logger(), "GPUMonitorBase::checkMemoryUsage not implemented."); +} + +void GPUMonitorBase::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & /* stat */) +{ + RCLCPP_INFO_ONCE(get_logger(), "GPUMonitorBase::checkThrottling not implemented."); +} + +void GPUMonitorBase::checkFrequency(diagnostic_updater::DiagnosticStatusWrapper & /* stat */) +{ + RCLCPP_INFO_ONCE(get_logger(), "GPUMonitorBase::checkFrequency not implemented."); +} diff --git a/system/system_monitor/src/gpu_monitor/nvml_gpu_monitor.cpp b/system/system_monitor/src/gpu_monitor/nvml_gpu_monitor.cpp new file mode 100644 index 0000000000000..19026717bc77b --- /dev/null +++ b/system/system_monitor/src/gpu_monitor/nvml_gpu_monitor.cpp @@ -0,0 +1,401 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file nvml_gpu_monitor.cpp + * @brief GPU monitor class + */ + +#include "system_monitor/gpu_monitor/nvml_gpu_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +GPUMonitor::GPUMonitor(const rclcpp::NodeOptions & options) : GPUMonitorBase("gpu_monitor", options) +{ + // Include frequency into GPU Thermal Throttling thus remove. + updater_.removeByName("GPU Frequency"); + + nvmlReturn_t ret = nvmlInit(); + if (ret != NVML_SUCCESS) { + RCLCPP_ERROR(this->get_logger(), "Failed to initialize NVML: %s\n", nvmlErrorString(ret)); + } + + unsigned int deviceCount = 0; + ret = nvmlDeviceGetCount(&deviceCount); + if (ret != NVML_SUCCESS) { + RCLCPP_ERROR( + this->get_logger(), "Failed to retrieve the number of compute devices: %s", + nvmlErrorString(ret)); + } + + for (unsigned int index = 0; index < deviceCount; ++index) { + gpu_info info{}; + ret = nvmlDeviceGetHandleByIndex(index, &info.device); + if (ret != NVML_SUCCESS) { + RCLCPP_ERROR( + this->get_logger(), "Failed to acquire the handle for a particular device [%d]: %s", index, + nvmlErrorString(ret)); + continue; + } + ret = nvmlDeviceGetName(info.device, info.name, NVML_DEVICE_NAME_BUFFER_SIZE); + if (ret != NVML_SUCCESS) { + RCLCPP_ERROR( + this->get_logger(), "Failed to retrieve the name of this device [%d]: %s", index, + nvmlErrorString(ret)); + continue; + } + ret = nvmlDeviceGetPciInfo(info.device, &info.pci); + if (ret != NVML_SUCCESS) { + RCLCPP_ERROR( + this->get_logger(), "Failed to retrieve the PCI attributes [%d]: %s", index, + nvmlErrorString(ret)); + continue; + } + gpus_.push_back(info); + } +} + +void GPUMonitor::shut_down() +{ + nvmlReturn_t ret = nvmlShutdown(); + if (ret != NVML_SUCCESS) { + RCLCPP_ERROR(this->get_logger(), "Failed to shut down NVML: %s", nvmlErrorString(ret)); + } +} + +void GPUMonitor::checkTemp(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + int level = DiagStatus::OK; + int index = 0; + nvmlReturn_t ret{}; + + if (gpus_.empty()) { + stat.summary(DiagStatus::ERROR, "gpu not found"); + return; + } + + for (auto itr = gpus_.begin(); itr != gpus_.end(); ++itr, ++index) { + unsigned int temp = 0; + ret = nvmlDeviceGetTemperature(itr->device, NVML_TEMPERATURE_GPU, &temp); + if (ret != NVML_SUCCESS) { + stat.summary(DiagStatus::ERROR, "Failed to retrieve the current temperature"); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.add(fmt::format("GPU {}: bus-id", index), itr->pci.busId); + stat.add(fmt::format("GPU {}: content", index), nvmlErrorString(ret)); + return; + } + + level = DiagStatus::OK; + stat.addf(itr->name, "%d.0 DegC", temp); + if (temp >= temp_error_) { + level = std::max(level, static_cast(DiagStatus::ERROR)); + } else if (temp >= temp_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + } + + stat.summary(level, temp_dict_.at(level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void GPUMonitor::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + int index = 0; + nvmlReturn_t ret{}; + + if (gpus_.empty()) { + stat.summary(DiagStatus::ERROR, "gpu not found"); + return; + } + + for (auto itr = gpus_.begin(); itr != gpus_.end(); ++itr, ++index) { + ret = nvmlDeviceGetUtilizationRates(itr->device, &itr->utilization); + if (ret != NVML_SUCCESS) { + stat.summary(DiagStatus::ERROR, "Failed to retrieve the current utilization rates"); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.add(fmt::format("GPU {}: bus-id", index), itr->pci.busId); + stat.add(fmt::format("GPU {}: content", index), nvmlErrorString(ret)); + return; + } + + level = DiagStatus::OK; + float usage = static_cast(itr->utilization.gpu) / 100.0; + if (usage >= gpu_usage_error_) { + level = std::max(level, static_cast(DiagStatus::ERROR)); + } else if (usage >= gpu_usage_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + + stat.add(fmt::format("GPU {}: status", index), load_dict_.at(level)); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.addf(fmt::format("GPU {}: usage", index), "%d.0%%", itr->utilization.gpu); + + addProcessUsage(index, itr->device, stat); + + whole_level = std::max(whole_level, level); + } + + stat.summary(whole_level, load_dict_.at(whole_level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void GPUMonitor::addProcessUsage( + int index, nvmlDevice_t device, diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + nvmlReturn_t ret{}; + std::list running_pid_list; + + // Get Compute Process ID + uint32_t info_count = MAX_ARRAY_SIZE; + std::unique_ptr infos; + infos = std::make_unique(MAX_ARRAY_SIZE); + ret = nvmlDeviceGetComputeRunningProcesses_v2(device, &info_count, infos.get()); + if (ret != NVML_SUCCESS) { + RCLCPP_WARN( + this->get_logger(), "Failed to nvmlDeviceGetComputeRunningProcesses_v2 NVML: %s", + nvmlErrorString(ret)); + return; + } + for (uint32_t cnt = 0; cnt < info_count; ++cnt) { + running_pid_list.push_back(infos[cnt].pid); + } + + // Get Graphics Process ID + info_count = MAX_ARRAY_SIZE; + infos = std::make_unique(MAX_ARRAY_SIZE); + ret = nvmlDeviceGetGraphicsRunningProcesses_v2(device, &info_count, infos.get()); + if (ret != NVML_SUCCESS) { + RCLCPP_WARN( + this->get_logger(), "Failed to nvmlDeviceGetGraphicsRunningProcesses_v2 NVML: %s", + nvmlErrorString(ret)); + return; + } + for (uint32_t cnt = 0; cnt < info_count; ++cnt) { + running_pid_list.push_back(infos[cnt].pid); + } + + // Get util_count(1st call of nvmlDeviceGetProcessUtilization) + uint32_t util_count = 0; + ret = nvmlDeviceGetProcessUtilization(device, NULL, &util_count, current_timestamp_); + // This function result will not succeed, because arg[util_count(in)] is 0. + if (ret != NVML_ERROR_INSUFFICIENT_SIZE) { + RCLCPP_WARN( + this->get_logger(), "Failed to nvmlDeviceGetProcessUtilization(1st) NVML: %s", + nvmlErrorString(ret)); + return; + } + // Check util_count + if (util_count <= 0) { + RCLCPP_WARN(this->get_logger(), "Illegal util_count: %d", util_count); + return; + } + + // Get utils data(2nd call of nvmlDeviceGetProcessUtilization) + std::unique_ptr utils; + utils = std::make_unique(util_count); + ret = nvmlDeviceGetProcessUtilization(device, utils.get(), &util_count, current_timestamp_); + if (ret != NVML_SUCCESS) { + RCLCPP_WARN( + this->get_logger(), "Failed to nvmlDeviceGetProcessUtilization(2nd) NVML: %s", + nvmlErrorString(ret)); + return; + } + + // Add data to diagnostic + int add_cnt = 0; + for (uint32_t cnt = 0; cnt < util_count; ++cnt) { + for (auto pid : running_pid_list) { + // PID check, because it contains illegal PID data. ex) PID:0 + if (utils[cnt].pid == pid) { + char name[MAX_NAME_LENGTH + 1] = {}; + nvmlSystemGetProcessName(utils[cnt].pid, name, MAX_NAME_LENGTH); + stat.add(fmt::format("GPU {0}: process {1}: pid", index, add_cnt), utils[cnt].pid); + stat.add(fmt::format("GPU {0}: process {1}: name", index, add_cnt), name); + stat.addf( + fmt::format("GPU {0}: process {1}: usage", index, add_cnt), "%ld.0%%", + ((utils[cnt].smUtil != UINT32_MAX) ? utils[cnt].smUtil : 0)); + ++add_cnt; + break; + } + } + } + + // Update timestamp(usec) + rclcpp::Clock system_clock(RCL_SYSTEM_TIME); + current_timestamp_ = system_clock.now().nanoseconds() / 1000; +} + +void GPUMonitor::checkMemoryUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + int index = 0; + nvmlReturn_t ret{}; + + if (gpus_.empty()) { + stat.summary(DiagStatus::ERROR, "gpu not found"); + return; + } + + for (auto itr = gpus_.begin(); itr != gpus_.end(); ++itr, ++index) { + nvmlMemory_t memory; + ret = nvmlDeviceGetMemoryInfo(itr->device, &memory); + if (ret != NVML_SUCCESS) { + stat.summary( + DiagStatus::ERROR, "Failed to retrieve the amount of used, free and total memory"); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.add(fmt::format("GPU {}: bus-id", index), itr->pci.busId); + stat.add(fmt::format("GPU {}: content", index), nvmlErrorString(ret)); + return; + } + + level = DiagStatus::OK; + float usage = static_cast(itr->utilization.memory) / 100.0; + if (usage >= memory_usage_error_) { + level = std::max(level, static_cast(DiagStatus::ERROR)); + } else if (usage >= memory_usage_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + + stat.add(fmt::format("GPU {}: status", index), load_dict_.at(level)); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.addf(fmt::format("GPU {}: usage", index), "%d.0%%", itr->utilization.memory); + stat.add(fmt::format("GPU {}: total", index), toHumanReadable(memory.total)); + stat.add(fmt::format("GPU {}: used", index), toHumanReadable(memory.used)); + stat.add(fmt::format("GPU {}: free", index), toHumanReadable(memory.free)); + + whole_level = std::max(whole_level, level); + } + + stat.summary(whole_level, load_dict_.at(whole_level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void GPUMonitor::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + int index = 0; + nvmlReturn_t ret{}; + std::vector reasons; + + if (gpus_.empty()) { + stat.summary(DiagStatus::ERROR, "gpu not found"); + return; + } + + for (auto itr = gpus_.begin(); itr != gpus_.end(); ++itr, ++index) { + unsigned int clock = 0; + ret = nvmlDeviceGetClockInfo(itr->device, NVML_CLOCK_GRAPHICS, &clock); + if (ret != NVML_SUCCESS) { + stat.summary(DiagStatus::ERROR, "Failed to retrieve the current clock speeds"); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.add(fmt::format("GPU {}: bus-id", index), itr->pci.busId); + stat.add(fmt::format("GPU {}: content", index), nvmlErrorString(ret)); + return; + } + + unsigned long long clocksThrottleReasons = 0LL; // NOLINT + ret = nvmlDeviceGetCurrentClocksThrottleReasons(itr->device, &clocksThrottleReasons); + if (ret != NVML_SUCCESS) { + stat.summary(DiagStatus::ERROR, "Failed to retrieve current clocks throttling reasons"); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.add(fmt::format("GPU {}: bus-id", index), itr->pci.busId); + stat.add(fmt::format("GPU {}: content", index), nvmlErrorString(ret)); + return; + } + + while (clocksThrottleReasons) { + unsigned long long flag = clocksThrottleReasons & ((~clocksThrottleReasons) + 1); // NOLINT + clocksThrottleReasons ^= flag; + reasons.emplace_back(reasonToString(flag)); + + switch (flag) { + case nvmlClocksThrottleReasonGpuIdle: + case nvmlClocksThrottleReasonApplicationsClocksSetting: + case nvmlClocksThrottleReasonSwPowerCap: + // we do not treat as error + break; + default: + level = DiagStatus::ERROR; + break; + } + } + + stat.add(fmt::format("GPU {}: status", index), throttling_dict_.at(level)); + stat.add(fmt::format("GPU {}: name", index), itr->name); + stat.addf(fmt::format("GPU {}: graphics clock", index), "%d MHz", clock); + + if (reasons.empty()) { + reasons.emplace_back("ReasonNone"); + } + + stat.add(fmt::format("GPU {}: reasons", index), boost::algorithm::join(reasons, ", ")); + + whole_level = std::max(whole_level, level); + } + + stat.summary(whole_level, throttling_dict_.at(whole_level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +std::string GPUMonitor::toHumanReadable(unsigned long long size) // NOLINT +{ + const char * units[] = {"B", "K", "M", "G", "T"}; + int count = 0; + double dsize = size; + + while (dsize > 1024) { + dsize /= 1024; + ++count; + } + const char * format = (dsize > 0 && dsize < 10) ? "{:.1f}{}" : "{:.0f}{}"; + return fmt::format(format, dsize, units[count]); +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(GPUMonitor) diff --git a/system/system_monitor/src/gpu_monitor/tegra_gpu_monitor.cpp b/system/system_monitor/src/gpu_monitor/tegra_gpu_monitor.cpp new file mode 100644 index 0000000000000..a9ae72321efd1 --- /dev/null +++ b/system/system_monitor/src/gpu_monitor/tegra_gpu_monitor.cpp @@ -0,0 +1,210 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file tegra_gpu_monitor.cpp + * @brief Tegra GPU monitor class + */ + +#include "system_monitor/gpu_monitor/tegra_gpu_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include + +#include +#include +#include +#include + +namespace fs = boost::filesystem; + +GPUMonitor::GPUMonitor(const rclcpp::NodeOptions & options) : GPUMonitorBase("gpu_monitor", options) +{ + getTempNames(); + getLoadNames(); + getFreqNames(); + + // There is no separate gpu memory in tegra. Both cpu and gpu uses cpu memory. thus remove. + updater_.removeByName("GPU Memory Usage"); + // There is no event record for thermal throttling. + // Need to manually monitor temperature to figure out if thermal limits crossed or not. + updater_.removeByName("GPU Thermal Throttling"); +} + +void GPUMonitor::checkTemp(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + if (temps_.empty()) { + stat.summary(DiagStatus::ERROR, "temperature files not found"); + return; + } + + int level = DiagStatus::OK; + std::string error_str; + + for (const auto & itr : temps_) { + // Read temperature file + const fs::path path(itr.path_); + fs::ifstream ifs(path, std::ios::in); + if (!ifs) { + stat.add("file open error", itr.path_); + error_str = "file open error"; + continue; + } + + float temp{}; + ifs >> temp; + ifs.close(); + temp /= 1000; + stat.addf(itr.label_, "%.1f DegC", temp); + + level = DiagStatus::OK; + if (temp >= temp_error_) { + level = std::max(level, static_cast(DiagStatus::ERROR)); + } else if (temp >= temp_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + } + + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, error_str); + } else { + stat.summary(level, temp_dict_.at(level)); + } +} + +void GPUMonitor::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + if (loads_.empty()) { + stat.summary(DiagStatus::ERROR, "load files not found"); + return; + } + + int level = DiagStatus::OK; + std::string error_str; + + for (const auto & itr : loads_) { + // Read load file + const fs::path path(itr.path_); + fs::ifstream ifs(path, std::ios::in); + if (!ifs) { + stat.add("file open error", itr.path_); + error_str = "file open error"; + continue; + } + + float load{}; + ifs >> load; + ifs.close(); + stat.addf(itr.label_, "%.1f%%", load / 10); + + level = DiagStatus::OK; + load /= 1000; + if (load >= gpu_usage_error_) { + level = std::max(level, static_cast(DiagStatus::ERROR)); + } else if (load >= gpu_usage_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + } + + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, error_str); + } else { + stat.summary(level, load_dict_.at(level)); + } +} + +void GPUMonitor::checkThrottling(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // TODO(Fumihito Ito): implement me +} + +void GPUMonitor::checkFrequency(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + if (freqs_.empty()) { + stat.summary(DiagStatus::ERROR, "frequency files not found"); + return; + } + + for (const auto & freq : freqs_) { + // Read cur_freq file + const fs::path path(freq.path_); + fs::ifstream ifs(path, std::ios::in); + if (ifs) { + std::string line; + if (std::getline(ifs, line)) { + stat.addf(fmt::format("GPU {}: clock", freq.label_), "%d MHz", std::stoi(line) / 1000000); + } + } + ifs.close(); + } + + stat.summary(DiagStatus::OK, "OK"); +} + +void GPUMonitor::getTempNames() +{ + // Jetson TX1 TX2 Nano: thermal_zone1, Xavier: thermal_zone0 + std::vector therms; + SystemMonitorUtility::getThermalZone("GPU-therm", &therms); + + for (const auto & therm : therms) { + temps_.emplace_back(therm.label_, therm.path_); + } +} + +void GPUMonitor::getLoadNames() +{ + const fs::path root("/sys/devices"); + + for (const fs::path & path : + boost::make_iterator_range(fs::directory_iterator(root), fs::directory_iterator())) { + if (!fs::is_directory(path)) { + continue; + } + + std::cmatch match; + const char * str_path = path.generic_string().c_str(); + + // /sys/devices/gpu.[0-9] ? + if (!std::regex_match(str_path, match, std::regex(".*gpu\\.(\\d+)"))) { + continue; + } + + // /sys/devices/gpu.[0-9]/load + const fs::path load_path = path / "load"; + loads_.emplace_back(path.filename().generic_string(), load_path.generic_string()); + } +} + +void GPUMonitor::getFreqNames() +{ + const fs::path root("/sys/class/devfreq"); + + for (const fs::path & path : + boost::make_iterator_range(fs::directory_iterator(root), fs::directory_iterator())) { + // /sys/class/devfreq/?????/cur_freq ? + if (!fs::is_directory(path)) { + continue; + } + + const fs::path freq_path = path / "cur_freq"; + freqs_.emplace_back(path.filename().generic_string(), freq_path.generic_string()); + } +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(GPUMonitor) diff --git a/system/system_monitor/src/gpu_monitor/unknown_gpu_monitor.cpp b/system/system_monitor/src/gpu_monitor/unknown_gpu_monitor.cpp new file mode 100644 index 0000000000000..5043e75ec7c68 --- /dev/null +++ b/system/system_monitor/src/gpu_monitor/unknown_gpu_monitor.cpp @@ -0,0 +1,29 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file unknown_gpu_monitor.cpp + * @brief Unknown GPU monitor class + */ + +#include "system_monitor/gpu_monitor/unknown_gpu_monitor.hpp" + +#include + +GPUMonitor::GPUMonitor(const rclcpp::NodeOptions & options) : GPUMonitorBase("gpu_monitor", options) +{ +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(GPUMonitor) diff --git a/system/system_monitor/src/hdd_monitor/hdd_monitor.cpp b/system/system_monitor/src/hdd_monitor/hdd_monitor.cpp new file mode 100644 index 0000000000000..249b9f93786ab --- /dev/null +++ b/system/system_monitor/src/hdd_monitor/hdd_monitor.cpp @@ -0,0 +1,304 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file hdd_monitor.cpp + * @brief HDD monitor class + */ + +#include "system_monitor/hdd_monitor/hdd_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace bp = boost::process; + +HDDMonitor::HDDMonitor(const rclcpp::NodeOptions & options) +: Node("hdd_monitor", options), + updater_(this), + hdd_reader_port_(declare_parameter("hdd_reader_port", 7635)) +{ + gethostname(hostname_, sizeof(hostname_)); + + getHDDParams(); + + updater_.setHardwareID(hostname_); + updater_.add("HDD Temperature", this, &HDDMonitor::checkTemp); + updater_.add("HDD Usage", this, &HDDMonitor::checkUsage); +} + +void HDDMonitor::update() { updater_.force_update(); } + +void HDDMonitor::checkTemp(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (hdd_params_.empty()) { + stat.summary(DiagStatus::ERROR, "invalid disk parameter"); + return; + } + + // Create a new socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + stat.summary(DiagStatus::ERROR, "socket error"); + stat.add("socket", strerror(errno)); + return; + } + + // Specify the receiving timeouts until reporting an error + struct timeval tv; + tv.tv_sec = 10; + tv.tv_usec = 0; + int ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "setsockopt error"); + stat.add("setsockopt", strerror(errno)); + close(sock); + return; + } + + // Connect the socket referred to by the file descriptor + sockaddr_in addr; + memset(&addr, 0, sizeof(sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_port = htons(hdd_reader_port_); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "connect error"); + stat.add("connect", strerror(errno)); + close(sock); + return; + } + + std::ostringstream oss; + boost::archive::text_oarchive oa(oss); + oa & hdd_devices_; + + // Write list of devices to FD + ret = write(sock, oss.str().c_str(), oss.str().length()); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "write error"); + stat.add("write", strerror(errno)); + RCLCPP_ERROR(get_logger(), "write error"); + close(sock); + return; + } + + // Receive messages from a socket + char buf[1024] = ""; + ret = recv(sock, buf, sizeof(buf) - 1, 0); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "recv error"); + stat.add("recv", strerror(errno)); + close(sock); + return; + } + // No data received + if (ret == 0) { + stat.summary(DiagStatus::ERROR, "recv error"); + stat.add("recv", "No data received"); + close(sock); + return; + } + + // Close the file descriptor FD + ret = close(sock); + if (ret < 0) { + stat.summary(DiagStatus::ERROR, "close error"); + stat.add("close", strerror(errno)); + return; + } + + // Restore HDD information list + HDDInfoList list; + + try { + std::istringstream iss(buf); + boost::archive::text_iarchive oa(iss); + oa >> list; + } catch (const std::exception & e) { + stat.summary(DiagStatus::ERROR, "recv error"); + stat.add("recv", e.what()); + return; + } + + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + int index = 0; + std::string error_str = ""; + + for (auto itr = hdd_params_.begin(); itr != hdd_params_.end(); ++itr, ++index) { + // Retrieve HDD information + auto itrh = list.find(itr->first); + if (itrh == list.end()) { + stat.add(fmt::format("HDD {}: status", index), "hdd_reader error"); + stat.add(fmt::format("HDD {}: name", index), itr->first.c_str()); + stat.add(fmt::format("HDD {}: hdd_reader", index), strerror(ENOENT)); + error_str = "hdd_reader error"; + continue; + } + + if (itrh->second.error_code_ != 0) { + stat.add(fmt::format("HDD {}: status", index), "hdd_reader error"); + stat.add(fmt::format("HDD {}: name", index), itr->first.c_str()); + stat.add(fmt::format("HDD {}: hdd_reader", index), strerror(itrh->second.error_code_)); + error_str = "hdd_reader error"; + continue; + } + + float temp = static_cast(itrh->second.temp_); + + level = DiagStatus::OK; + if (temp >= itr->second.temp_error_) { + level = DiagStatus::ERROR; + } else if (temp >= itr->second.temp_warn_) { + level = DiagStatus::WARN; + } + + stat.add(fmt::format("HDD {}: status", index), temp_dict_.at(level)); + stat.add(fmt::format("HDD {}: name", index), itr->first.c_str()); + stat.add(fmt::format("HDD {}: model", index), itrh->second.model_.c_str()); + stat.add(fmt::format("HDD {}: serial", index), itrh->second.serial_.c_str()); + stat.addf(fmt::format("HDD {}: temperature", index), "%.1f DegC", temp); + + whole_level = std::max(whole_level, level); + } + + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, error_str); + } else { + stat.summary(whole_level, temp_dict_.at(whole_level)); + } + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void HDDMonitor::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (hdd_params_.empty()) { + stat.summary(DiagStatus::ERROR, "invalid disk parameter"); + return; + } + + int hdd_index = 0; + int whole_level = DiagStatus::OK; + std::string error_str = ""; + + for (auto itr = hdd_params_.begin(); itr != hdd_params_.end(); ++itr, ++hdd_index) { + // Get summary of disk space usage of ext4 + bp::ipstream is_out; + bp::ipstream is_err; + // Invoke shell to use shell wildcard expansion + bp::child c( + "/bin/sh", "-c", fmt::format("df -Pht ext4 {}*", itr->first.c_str()), bp::std_out > is_out, + bp::std_err > is_err); + c.wait(); + + if (c.exit_code() != 0) { + std::ostringstream os; + is_err >> os.rdbuf(); + error_str = "df error"; + stat.add(fmt::format("HDD {}: status", hdd_index), "df error"); + stat.add(fmt::format("HDD {}: name", hdd_index), itr->first.c_str()); + stat.add(fmt::format("HDD {}: df", hdd_index), os.str().c_str()); + continue; + } + + int level = DiagStatus::OK; + std::string line; + int index = 0; + std::vector list; + float usage; + + while (std::getline(is_out, line) && !line.empty()) { + // Skip header + if (index <= 0) { + ++index; + continue; + } + + boost::split(list, line, boost::is_space(), boost::token_compress_on); + + usage = std::atof(boost::trim_copy_if(list[4], boost::is_any_of("%")).c_str()) * 1e-2; + + level = DiagStatus::OK; + if (usage >= itr->second.usage_error_) { + level = DiagStatus::ERROR; + } else if (usage >= itr->second.usage_warn_) { + level = DiagStatus::WARN; + } + + stat.add(fmt::format("HDD {}: status", hdd_index), usage_dict_.at(level)); + stat.add(fmt::format("HDD {}: filesystem", hdd_index), list[0].c_str()); + stat.add(fmt::format("HDD {}: size", hdd_index), list[1].c_str()); + stat.add(fmt::format("HDD {}: used", hdd_index), list[2].c_str()); + stat.add(fmt::format("HDD {}: avail", hdd_index), list[3].c_str()); + stat.add(fmt::format("HDD {}: use", hdd_index), list[4].c_str()); + stat.add(fmt::format("HDD {}: mounted on", hdd_index), list[5].c_str()); + + whole_level = std::max(whole_level, level); + ++index; + } + } + + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, error_str); + } else { + stat.summary(whole_level, usage_dict_.at(whole_level)); + } + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void HDDMonitor::getHDDParams() +{ + const auto num_disks = this->declare_parameter("num_disks", 0); + for (auto i = 0; i < num_disks; ++i) { + const auto prefix = "disks.disk" + std::to_string(i); + HDDParam param; + param.temp_warn_ = declare_parameter(prefix + ".temp_warn"); + param.temp_error_ = declare_parameter(prefix + ".temp_error"); + param.usage_warn_ = declare_parameter(prefix + ".usage_warn"); + param.usage_error_ = declare_parameter(prefix + ".usage_error"); + const auto name = declare_parameter(prefix + ".name"); + + hdd_params_[name] = param; + + hdd_devices_.push_back(name); + } +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(HDDMonitor) diff --git a/system/system_monitor/src/mem_monitor/mem_monitor.cpp b/system/system_monitor/src/mem_monitor/mem_monitor.cpp new file mode 100644 index 0000000000000..c9d3f3e14d515 --- /dev/null +++ b/system/system_monitor/src/mem_monitor/mem_monitor.cpp @@ -0,0 +1,137 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file memory_monitor.cpp + * @brief Memory monitor class + */ + +#include "system_monitor/mem_monitor/mem_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include + +#include +#include + +namespace bp = boost::process; + +MemMonitor::MemMonitor(const rclcpp::NodeOptions & options) +: Node("mem_monitor", options), + updater_(this), + usage_warn_(declare_parameter("usage_warn", 0.95)), + usage_error_(declare_parameter("usage_error", 0.99)) +{ + gethostname(hostname_, sizeof(hostname_)); + updater_.setHardwareID(hostname_); + updater_.add("Memory Usage", this, &MemMonitor::checkUsage); +} + +void MemMonitor::update() { updater_.force_update(); } + +void MemMonitor::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + // Get total amount of free and used memory + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c("free -tb", bp::std_out > is_out, bp::std_err > is_err); + c.wait(); + if (c.exit_code() != 0) { + std::ostringstream os; + is_err >> os.rdbuf(); + stat.summary(DiagStatus::ERROR, "free error"); + stat.add("free", os.str().c_str()); + return; + } + + int level = DiagStatus::OK; + std::string line; + int index = 0; + std::vector list; + float usage; + + /* + Output example of `free -tb` + + list[0] list[1] list[2] list[3] list[4] list[5] list[6] + index 0 | total used free shared buff/cache available + index 1 | Mem: 32809744 12554780 13090376 292840 7164588 19622092 + index 2 | Swap: 33554428 1767680 31786748 + index 3 | Total: 66364172 14322460 44877124 + */ + while (std::getline(is_out, line) && !line.empty()) { + // Skip header + if (index <= 0) { + ++index; + continue; + } + + boost::split(list, line, boost::is_space(), boost::token_compress_on); + + // Physical memory + if (index == 1) { + // available divided by total is available memory including calculation for buff/cache, + // so the subtraction of this from 1 gives real usage. + usage = 1.0f - std::atof(list[6].c_str()) / std::atof(list[1].c_str()); + + if (usage >= usage_error_) { + level = DiagStatus::ERROR; + } else if (usage >= usage_warn_) { + level = DiagStatus::WARN; + } + + stat.addf(fmt::format("{} usage", list[0]), "%.2f%%", usage * 1e+2); + } + + stat.add(fmt::format("{} total", list[0]), toHumanReadable(list[1])); + stat.add(fmt::format("{} used", list[0]), toHumanReadable(list[2])); + stat.add(fmt::format("{} free", list[0]), toHumanReadable(list[3])); + + // Add an additional information for physical memory + if (index == 1) { + stat.add(fmt::format("{} shared", list[0]), toHumanReadable(list[4])); + stat.add(fmt::format("{} buff/cache", list[0]), toHumanReadable(list[5])); + stat.add(fmt::format("{} available", list[0]), toHumanReadable(list[6])); + } + ++index; + } + + stat.summary(level, usage_dict_.at(level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +std::string MemMonitor::toHumanReadable(const std::string & str) +{ + const char * units[] = {"B", "K", "M", "G", "T"}; + int count = 0; + double size = std::atol(str.c_str()); + + while (size > 1024) { + size /= 1024; + ++count; + } + const char * format = (size > 0 && size < 10) ? "{:.1f}{}" : "{:.0f}{}"; + return fmt::format(format, size, units[count]); +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(MemMonitor) diff --git a/system/system_monitor/src/net_monitor/net_monitor.cpp b/system/system_monitor/src/net_monitor/net_monitor.cpp new file mode 100644 index 0000000000000..1ca0f71081af1 --- /dev/null +++ b/system/system_monitor/src/net_monitor/net_monitor.cpp @@ -0,0 +1,233 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file net_monitor.cpp + * @brief Net monitor class + */ + +#include "system_monitor/net_monitor/net_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +NetMonitor::NetMonitor(const rclcpp::NodeOptions & options) +: Node("net_monitor", options), + updater_(this), + last_update_time_{0, 0, this->get_clock()->get_clock_type()}, + device_params_( + declare_parameter>("devices", std::vector())), + usage_warn_(declare_parameter("usage_warn", 0.95)) +{ + gethostname(hostname_, sizeof(hostname_)); + updater_.setHardwareID(hostname_); + updater_.add("Network Usage", this, &NetMonitor::checkUsage); + + nl80211_.init(); +} + +NetMonitor::~NetMonitor() { shutdown_nl80211(); } + +void NetMonitor::update() { updater_.force_update(); } + +void NetMonitor::shutdown_nl80211() { nl80211_.shutdown(); } + +void NetMonitor::checkUsage(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (device_params_.empty()) { + stat.summary(DiagStatus::ERROR, "invalid device parameter"); + return; + } + + const struct ifaddrs * ifa; + struct ifaddrs * ifas = nullptr; + + rclcpp::Duration duration = this->now() - last_update_time_; + + // Get network interfaces + if (getifaddrs(&ifas) < 0) { + stat.summary(DiagStatus::ERROR, "getifaddrs error"); + stat.add("getifaddrs", strerror(errno)); + return; + } + + int level = DiagStatus::OK; + int whole_level = DiagStatus::OK; + int index = 0; + std::string error_str; + float rx_traffic{0.0}; + float tx_traffic{0.0}; + float rx_usage{0.0}; + float tx_usage{0.0}; + std::vector interface_names; + + for (ifa = ifas; ifa; ifa = ifa->ifa_next) { + // Skip no addr + if (!ifa->ifa_addr) { + continue; + } + // Skip loopback + if (ifa->ifa_flags & IFF_LOOPBACK) { + continue; + } + // Skip non AF_PACKET + if (ifa->ifa_addr->sa_family != AF_PACKET) { + continue; + } + // Skip device not specified + if ( + boost::find(device_params_, ifa->ifa_name) == device_params_.end() && + boost::find(device_params_, "*") == device_params_.end()) { + continue; + } + + int fd; + struct ifreq ifrm; + struct ifreq ifrc; + struct ethtool_cmd edata; + + // Get MTU information + fd = socket(AF_INET, SOCK_DGRAM, 0); + strncpy(ifrm.ifr_name, ifa->ifa_name, IFNAMSIZ - 1); + if (ioctl(fd, SIOCGIFMTU, &ifrm) < 0) { + if (errno == ENOTSUP) { + stat.add(fmt::format("Network {}: status", index), "Not Supported"); + } else { + stat.add(fmt::format("Network {}: status", index), "Error"); + error_str = "ioctl error"; + } + + stat.add(fmt::format("Network {}: interface name", index), ifa->ifa_name); + stat.add("ioctl(SIOCGIFMTU)", strerror(errno)); + + ++index; + close(fd); + interface_names.push_back(ifa->ifa_name); + continue; + } + + // Get network capacity + float speed = 0.0; + strncpy(ifrc.ifr_name, ifa->ifa_name, IFNAMSIZ - 1); + ifrc.ifr_data = (caddr_t)&edata; + edata.cmd = ETHTOOL_GSET; + if (ioctl(fd, SIOCETHTOOL, &ifrc) < 0) { + // possibly wireless connection, get bitrate(MBit/s) + speed = nl80211_.getBitrate(ifa->ifa_name); + if (speed <= 0) { + if (errno == ENOTSUP) { + stat.add(fmt::format("Network {}: status", index), "Not Supported"); + } else { + stat.add(fmt::format("Network {}: status", index), "Error"); + error_str = "ioctl error"; + } + + stat.add(fmt::format("Network {}: interface name", index), ifa->ifa_name); + stat.add("ioctl(SIOCETHTOOL)", strerror(errno)); + + ++index; + close(fd); + interface_names.push_back(ifa->ifa_name); + continue; + } + } else { + speed = edata.speed; + } + + level = (ifa->ifa_flags & IFF_RUNNING) ? DiagStatus::OK : DiagStatus::ERROR; + + auto * stats = (struct rtnl_link_stats *)ifa->ifa_data; + if (bytes_.find(ifa->ifa_name) != bytes_.end()) { + rx_traffic = toMbit(stats->rx_bytes - bytes_[ifa->ifa_name].rx_bytes) / duration.seconds(); + tx_traffic = toMbit(stats->tx_bytes - bytes_[ifa->ifa_name].tx_bytes) / duration.seconds(); + rx_usage = rx_traffic / speed; + tx_usage = tx_traffic / speed; + if (rx_usage >= usage_warn_ || tx_usage > usage_warn_) { + level = std::max(level, static_cast(DiagStatus::WARN)); + } + } + + stat.add(fmt::format("Network {}: status", index), usage_dict_.at(level)); + stat.add(fmt::format("Network {}: interface name", index), ifa->ifa_name); + stat.addf(fmt::format("Network {}: rx_usage", index), "%.2f%%", rx_usage * 1e+2); + stat.addf(fmt::format("Network {}: tx_usage", index), "%.2f%%", tx_usage * 1e+2); + stat.addf(fmt::format("Network {}: rx_traffic", index), "%.2f MBit/s", rx_traffic); + stat.addf(fmt::format("Network {}: tx_traffic", index), "%.2f MBit/s", tx_traffic); + stat.addf(fmt::format("Network {}: capacity", index), "%.1f MBit/s", speed); + stat.add(fmt::format("Network {}: mtu", index), ifrm.ifr_mtu); + stat.add(fmt::format("Network {}: rx_bytes", index), stats->rx_bytes); + stat.add(fmt::format("Network {}: rx_errors", index), stats->rx_errors); + stat.add(fmt::format("Network {}: tx_bytes", index), stats->tx_bytes); + stat.add(fmt::format("Network {}: tx_errors", index), stats->tx_errors); + stat.add(fmt::format("Network {}: collisions", index), stats->collisions); + + close(fd); + + bytes_[ifa->ifa_name].rx_bytes = stats->rx_bytes; + bytes_[ifa->ifa_name].tx_bytes = stats->tx_bytes; + whole_level = std::max(whole_level, level); + ++index; + + interface_names.push_back(ifa->ifa_name); + } + + freeifaddrs(ifas); + + // Check if specified device exists + for (const auto & device : device_params_) { + // Skip if all devices specified + if (device == "*") { + continue; + } + // Skip if device already appended + if (boost::find(interface_names, device) != interface_names.end()) { + continue; + } + + stat.add(fmt::format("Network {}: status", index), "No Such Device"); + stat.add(fmt::format("Network {}: interface name", index), device); + error_str = "no such device"; + ++index; + } + + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, error_str); + } else { + stat.summary(whole_level, usage_dict_.at(whole_level)); + } + + last_update_time_ = this->now(); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(NetMonitor) diff --git a/system/system_monitor/src/net_monitor/nl80211.cpp b/system/system_monitor/src/net_monitor/nl80211.cpp new file mode 100644 index 0000000000000..5779372f36079 --- /dev/null +++ b/system/system_monitor/src/net_monitor/nl80211.cpp @@ -0,0 +1,205 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file nl80211.cpp + * @brief 802.11 netlink-based interface class + */ + +#include "system_monitor/net_monitor/nl80211.hpp" + +#include +#include +#include +#include + +NL80211::NL80211() : bitrate_(0.0), initialized_(false), socket_(nullptr), id_(-1), cb_(nullptr) {} + +// Attribute validation policy +static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1]; +static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1]; + +static int callback(struct nl_msg * msg, void * arg) +{ + int ret; + auto * rate = reinterpret_cast(arg); + + // Return actual netlink message. + struct nlmsghdr * nlh = nlmsg_hdr(msg); + // Return pointer to message payload. + auto * ghdr = static_cast(nlmsg_data(nlh)); + + struct nlattr * tb[NL80211_ATTR_MAX + 1]; + struct nlattr * sinfo[NL80211_STA_INFO_MAX + 1]; + struct nlattr * rinfo[NL80211_RATE_INFO_MAX + 1]; + + // Create attribute index based on a stream of attributes. + ret = + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(ghdr, 0), genlmsg_attrlen(ghdr, 0), nullptr); + // Returns 0 on success or a negative error code. + if (ret < 0) { + return NL_SKIP; + } + + // Information about a station missing + if (!tb[NL80211_ATTR_STA_INFO]) { + return NL_SKIP; + } + + // Create attribute index based on nested attribute. + ret = nla_parse_nested(sinfo, NL80211_STA_INFO_MAX, tb[NL80211_ATTR_STA_INFO], stats_policy); + // Returns 0 on success or a negative error code. + if (ret < 0) { + return NL_SKIP; + } + + // current unicast tx rate missing + if (!sinfo[NL80211_STA_INFO_TX_BITRATE]) { + return NL_SKIP; + } + + // Create attribute index based on nested attribute. + ret = + nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy); + // Returns 0 on success or a negative error code. + if (ret < 0) { + return NL_SKIP; + } + + // total bitrate exists + if (rinfo[NL80211_RATE_INFO_BITRATE]) { + // Return payload of 16 bit integer attribute. + *rate = static_cast(nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE])) / 10; + } + + return NL_SKIP; +} + +void NL80211::init() +{ + // Allocate new netlink socket. + socket_ = nl_socket_alloc(); + // Returns newly allocated netlink socket or NULL. + if (!socket_) { + return; + } + + // Connect a generic netlink socket. + // Returns 0 on success or a negative error code. + int ret = genl_connect(socket_); + if (ret < 0) { + shutdown(); + return; + } + + // Resolve generic netlink family name to its identifier. + id_ = genl_ctrl_resolve(socket_, "nl80211"); + // Returns a positive identifier or a negative error code. + if (id_ < 0) { + shutdown(); + return; + } + + // Allocate a new callback handle. + cb_ = nl_cb_alloc(NL_CB_DEFAULT); + // Returns newly allocated callback handle or NULL. + if (!cb_) { + shutdown(); + return; + } + + // Set up a callback. + ret = nl_cb_set(cb_, NL_CB_VALID, NL_CB_CUSTOM, callback, reinterpret_cast(&bitrate_)); + // Returns 0 on success or a negative error code. + if (ret < 0) { + shutdown(); + return; + } + + initialized_ = true; +} + +float NL80211::getBitrate(const char * ifa_name) +{ + int ret; + struct nl_msg * msg; + void * hdr; + int index; + + bitrate_ = 0.0; + + if (!initialized_) { + return bitrate_; + } + + // Get index of the network interface + index = if_nametoindex(ifa_name); + // Returns index number of the network interface on success + // or 0 on error and errno is set appropriately + if (!index) { + return bitrate_; + } + + // Allocate a new netlink message with the default maximum payload size. + msg = nlmsg_alloc(); + // Returns newly allocated netlink message or NULL. + if (!msg) { + return bitrate_; + } + + // Add Generic Netlink headers to Netlink message. + hdr = genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, id_, 0, NLM_F_DUMP, NL80211_CMD_GET_STATION, 0); + // Returns pointer to user header or NULL if an error occurred. + if (!hdr) { + nlmsg_free(msg); + return bitrate_; + } + + // Add 32 bit integer attribute to netlink message. + ret = nla_put_u32(msg, NL80211_ATTR_IFINDEX, index); + // Returns 0 on success or a negative error code. + if (ret < 0) { + nlmsg_free(msg); + return bitrate_; + } + + // Finalize and transmit Netlink message. + ret = nl_send_auto(socket_, msg); + // Returns number of bytes sent or a negative error code. + if (ret < 0) { + nlmsg_free(msg); + return bitrate_; + } + + // Receive a set of messages from a netlink socket. + ret = nl_recvmsgs(socket_, cb_); + // 0 on success or a negative error code from nl_recv(). + if (ret < 0) { + nlmsg_free(msg); + return bitrate_; + } + + nlmsg_free(msg); + return bitrate_; +} + +void NL80211::shutdown() +{ + if (cb_) { + nl_cb_put(cb_); + } + nl_close(socket_); + nl_socket_free(socket_); + initialized_ = false; +} diff --git a/system/system_monitor/src/ntp_monitor/ntp_monitor.cpp b/system/system_monitor/src/ntp_monitor/ntp_monitor.cpp new file mode 100644 index 0000000000000..49f5ec57eda4c --- /dev/null +++ b/system/system_monitor/src/ntp_monitor/ntp_monitor.cpp @@ -0,0 +1,139 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file ntp_monitor.cpp + * @brief NTP monitor class + */ + +#include "system_monitor/ntp_monitor/ntp_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include +#include + +#include + +#include +#include +#include + +namespace bp = boost::process; +namespace fs = boost::filesystem; + +NTPMonitor::NTPMonitor(const rclcpp::NodeOptions & options) +: Node("ntp_monitor", options), + updater_(this), + offset_warn_(declare_parameter("offset_warn", 0.1)), + offset_error_(declare_parameter("offset_error", 5.0)) +{ + gethostname(hostname_, sizeof(hostname_)); + + // Check if command exists + fs::path p = bp::search_path("chronyc"); + chronyc_exists_ = (p.empty()) ? false : true; + + updater_.setHardwareID(hostname_); + updater_.add("NTP Offset", this, &NTPMonitor::checkOffset); +} + +void NTPMonitor::update() { updater_.force_update(); } + +void NTPMonitor::checkOffset(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + if (!chronyc_exists_) { + stat.summary(DiagStatus::ERROR, "chronyc error"); + stat.add( + "chronyc", "Command 'chronyc' not found, but can be installed with: sudo apt install chrony"); + return; + } + + std::string error_str; + float offset = 0.0f; + std::map tracking_map; + error_str = executeChronyc(offset, tracking_map); + if (!error_str.empty()) { + stat.summary(DiagStatus::ERROR, "chronyc error"); + stat.add("chronyc", error_str); + return; + } + + int level = DiagStatus::OK; + + // Check an earlier offset as well + float abs = std::abs(offset); + if (abs >= offset_error_) { + level = DiagStatus::ERROR; + } else if (abs >= offset_warn_) { + level = DiagStatus::WARN; + } + for (auto itr = tracking_map.begin(); itr != tracking_map.end(); ++itr) { + stat.add(itr->first, itr->second); + } + stat.summary(level, offset_dict_.at(level)); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +std::string NTPMonitor::executeChronyc( + float & out_offset, std::map & out_tracking_map) +{ + std::string result; + + // Tracking chrony status + bp::ipstream is_out; + bp::child c("chronyc tracking", bp::std_out > is_out); + c.wait(); + if (c.exit_code() != 0) { + std::ostringstream os; + is_out >> os.rdbuf(); + result = os.str().c_str(); + return result; + } + + std::string line; + std::cmatch match; + const std::regex filter("^(.+[A-Za-z()]) *: (.*)"); + const std::regex filter_system_time("([0-9.]*) seconds (slow|fast).*"); + + while (std::getline(is_out, line) && !line.empty()) { + if (std::regex_match(line.c_str(), match, filter)) { + out_tracking_map[match[1].str()] = match[2].str(); + } + } + + // System time : conversion string to float + std::string str_system_time = out_tracking_map["System time"]; + if (std::regex_match(str_system_time.c_str(), match, filter_system_time)) { + out_offset = std::atof(match[1].str().c_str()); + + if (match[2].str() == "fast") { + // "fast" is - value(match to ntpdate) + out_offset *= -1; + } else { + // "slow" is + value(match to ntpdate) + } + } else { + RCLCPP_WARN(get_logger(), "regex_match: illegal result. str = %s", str_system_time.c_str()); + } + return result; +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(NTPMonitor) diff --git a/system/system_monitor/src/process_monitor/process_monitor.cpp b/system/system_monitor/src/process_monitor/process_monitor.cpp new file mode 100644 index 0000000000000..661753196128e --- /dev/null +++ b/system/system_monitor/src/process_monitor/process_monitor.cpp @@ -0,0 +1,314 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file process_monitor.cpp + * @brief Process monitor class + */ + +#include "system_monitor/process_monitor/process_monitor.hpp" + +#include "system_monitor/system_monitor_utility.hpp" + +#include + +#include +#include +#include +#include + +ProcessMonitor::ProcessMonitor(const rclcpp::NodeOptions & options) +: Node("process_monitor", options), + updater_(this), + num_of_procs_(declare_parameter("num_of_procs", 5)) +{ + int index; + + gethostname(hostname_, sizeof(hostname_)); + + updater_.setHardwareID(hostname_); + updater_.add("Tasks Summary", this, &ProcessMonitor::monitorProcesses); + + for (index = 0; index < num_of_procs_; ++index) { + auto task = std::make_shared(fmt::format("High-load Proc[{}]", index)); + load_tasks_.push_back(task); + updater_.add(*task); + } + for (index = 0; index < num_of_procs_; ++index) { + auto task = std::make_shared(fmt::format("High-mem Proc[{}]", index)); + memory_tasks_.push_back(task); + updater_.add(*task); + } +} + +void ProcessMonitor::update() { updater_.force_update(); } + +void ProcessMonitor::monitorProcesses(diagnostic_updater::DiagnosticStatusWrapper & stat) +{ + // Remember start time to measure elapsed time + const auto t_start = SystemMonitorUtility::startMeasurement(); + + bp::ipstream is_err; + bp::ipstream is_out; + std::ostringstream os; + + // Get processes + bp::child c("top -bn1 -o %CPU -w 128", bp::std_out > is_out, bp::std_err > is_err); + c.wait(); + if (c.exit_code() != 0) { + is_err >> os.rdbuf(); + stat.summary(DiagStatus::ERROR, "top error"); + stat.add("top", os.str().c_str()); + setErrorContent(&load_tasks_, "top error", "top", os.str().c_str()); + setErrorContent(&memory_tasks_, "top error", "top", os.str().c_str()); + return; + } + + is_out >> os.rdbuf(); + std::string str = os.str(); + + // Get task summary + getTasksSummary(stat, str); + // Remove header + removeHeader(stat, str); + + // Get high load processes + getHighLoadProcesses(str); + + // Get high memory processes + getHighMemoryProcesses(str); + + // Measure elapsed time since start time and report + SystemMonitorUtility::stopMeasurement(t_start, stat); +} + +void ProcessMonitor::getTasksSummary( + diagnostic_updater::DiagnosticStatusWrapper & stat, const std::string & output) +{ + bp::pipe p; + std::string line; + + // Echo output for grep + { + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c(fmt::format("echo {}", output), bp::std_out > p, bp::std_err > is_err); + c.wait(); + if (c.exit_code() != 0) { + std::ostringstream os; + is_err >> os.rdbuf(); + stat.summary(DiagStatus::ERROR, "echo error"); + stat.add("echo", os.str().c_str()); + return; + } + } + // Find matching pattern of summary + { + bp::ipstream is_out; + bp::child c("grep Tasks:", bp::std_out > is_out, bp::std_in < p); + c.wait(); + // no matching line + if (c.exit_code() != 0) { + stat.summary(DiagStatus::ERROR, "matching pattern not found"); + stat.add("name", "Tasks:"); + return; + } + + std::getline(is_out, line); + std::cmatch match; + const std::regex filter( + "^Tasks: (\\d+) total,\\s+(\\d+) running,\\s+(\\d+) sleeping,\\s+(\\d+) stopped,\\s+(\\d+) " + "zombie"); + + if (std::regex_match(line.c_str(), match, filter)) { + stat.add("total", match[1].str()); + stat.add("running", match[2].str()); + stat.add("sleeping", match[3].str()); + stat.add("stopped", match[4].str()); + stat.add("zombie", match[5].str()); + stat.summary(DiagStatus::OK, "OK"); + } else { + stat.summary(DiagStatus::ERROR, "invalid format"); + } + } +} + +void ProcessMonitor::removeHeader( + diagnostic_updater::DiagnosticStatusWrapper & stat, std::string & output) +{ + bp::pipe p1; + bp::pipe p2; + std::ostringstream os; + + // Echo output for sed + { + bp::ipstream is_err; + bp::child c(fmt::format("echo {}", output), bp::std_out > p1, bp::std_err > is_err); + c.wait(); + if (c.exit_code() != 0) { + is_err >> os.rdbuf(); + stat.summary(DiagStatus::ERROR, "echo error"); + stat.add("echo", os.str().c_str()); + return; + } + } + // Remove %Cpu section + { + bp::ipstream is_err; + bp::child c("sed \"/^%Cpu/d\"", bp::std_out > p2, bp::std_err > is_err, bp::std_in < p1); + c.wait(); + // no matching line + if (c.exit_code() != 0) { + stat.summary(DiagStatus::ERROR, "sed error"); + stat.add("sed", "Failed to remove header"); + return; + } + } + // Remove header + { + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c("sed \"1,6d\"", bp::std_out > is_out, bp::std_err > is_err, bp::std_in < p2); + c.wait(); + // no matching line + if (c.exit_code() != 0) { + stat.summary(DiagStatus::ERROR, "sed error"); + stat.add("sed", "Failed to remove header"); + return; + } + // overwrite + is_out >> os.rdbuf(); + output = os.str(); + } +} + +void ProcessMonitor::getHighLoadProcesses(const std::string & output) +{ + bp::pipe p; + std::ostringstream os; + + // Echo output for sed + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c(fmt::format("echo {}", output), bp::std_out > p, bp::std_err > is_err); + c.wait(); + if (c.exit_code() != 0) { + is_err >> os.rdbuf(); + setErrorContent(&load_tasks_, "echo error", "echo", os.str().c_str()); + return; + } + + // Get top-rated + getTopratedProcesses(&load_tasks_, &p); +} + +void ProcessMonitor::getHighMemoryProcesses(const std::string & output) +{ + bp::pipe p1; + bp::pipe p2; + std::ostringstream os; + + // Echo output for sed + { + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c(fmt::format("echo {}", output), bp::std_out > p1, bp::std_err > is_err); + c.wait(); + if (c.exit_code() != 0) { + is_err >> os.rdbuf(); + setErrorContent(&memory_tasks_, "echo error", "echo", os.str().c_str()); + return; + } + } + // Sort by memory usage + { + bp::ipstream is_out; + bp::ipstream is_err; + bp::child c("sort -r -k 10", bp::std_out > p2, bp::std_err > is_err, bp::std_in < p1); + c.wait(); + if (c.exit_code() != 0) { + is_err >> os.rdbuf(); + setErrorContent(&memory_tasks_, "sort error", "sort", os.str().c_str()); + return; + } + } + + // Get top-rated + getTopratedProcesses(&memory_tasks_, &p2); +} + +void ProcessMonitor::getTopratedProcesses( + std::vector> * tasks, bp::pipe * p) +{ + if (tasks == nullptr || p == nullptr) { + return; + } + + bp::ipstream is_out; + bp::ipstream is_err; + std::ostringstream os; + + bp::child c( + fmt::format("sed -n \"1,{} p\"", num_of_procs_), bp::std_out > is_out, bp::std_err > is_err, + bp::std_in < *p); + + c.wait(); + // Failed to modify line + if (c.exit_code() != 0) { + is_err >> os.rdbuf(); + setErrorContent(tasks, "sed error", "sed", os.str().c_str()); + return; + } + + std::vector list; + std::string line; + int index = 0; + + while (std::getline(is_out, line) && !line.empty()) { + boost::trim_left(line); + boost::split(list, line, boost::is_space(), boost::token_compress_on); + + tasks->at(index)->setDiagnosticsStatus(DiagStatus::OK, "OK"); + tasks->at(index)->setProcessId(list[0]); + tasks->at(index)->setUserName(list[1]); + tasks->at(index)->setPriority(list[2]); + tasks->at(index)->setNiceValue(list[3]); + tasks->at(index)->setVirtualImage(list[4]); + tasks->at(index)->setResidentSize(list[5]); + tasks->at(index)->setSharedMemSize(list[6]); + tasks->at(index)->setProcessStatus(list[7]); + tasks->at(index)->setCPUUsage(list[8]); + tasks->at(index)->setMemoryUsage(list[9]); + tasks->at(index)->setCPUTime(list[10]); + tasks->at(index)->setCommandName(list[11]); + ++index; + } +} + +void ProcessMonitor::setErrorContent( + std::vector> * tasks, const std::string & message, + const std::string & error_command, const std::string & content) +{ + if (tasks == nullptr) { + return; + } + + for (auto itr = tasks->begin(); itr != tasks->end(); ++itr) { + (*itr)->setDiagnosticsStatus(DiagStatus::ERROR, message); + (*itr)->setErrorContent(error_command, content); + } +} + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(ProcessMonitor) diff --git a/system/system_monitor/test/config/test_hdd_monitor.param.yaml b/system/system_monitor/test/config/test_hdd_monitor.param.yaml new file mode 100644 index 0000000000000..491cd6cfe6353 --- /dev/null +++ b/system/system_monitor/test/config/test_hdd_monitor.param.yaml @@ -0,0 +1,9 @@ +/**: + ros__parameters: + hdd_reader_port: 7635 + disks: + - name: /dev/sda + temp_warn: 55.0 + temp_error: 70.0 + usage_warn: 0.95 + usage_error: 0.99 diff --git a/system/system_monitor/test/config/test_net_monitor.param.yaml b/system/system_monitor/test/config/test_net_monitor.param.yaml new file mode 100644 index 0000000000000..aacf8a3bdcf7f --- /dev/null +++ b/system/system_monitor/test/config/test_net_monitor.param.yaml @@ -0,0 +1,5 @@ + +/**: + ros__parameters: + devices: [ wlp82s0 ] + usage_warn: 0.95 diff --git a/system/system_monitor/test/config/test_ntp_monitor.param.yaml b/system/system_monitor/test/config/test_ntp_monitor.param.yaml new file mode 100644 index 0000000000000..bf659a0b6c2cb --- /dev/null +++ b/system/system_monitor/test/config/test_ntp_monitor.param.yaml @@ -0,0 +1,5 @@ +/**: + ros__parameters: + server: ntp.ubuntu.com + offset_warn: 0.1 + offset_error: 5.0 diff --git a/system/system_monitor/test/src/cpu_monitor/mpstat1.cpp b/system/system_monitor/test/src/cpu_monitor/mpstat1.cpp new file mode 100644 index 0000000000000..0b44abd00f720 --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/mpstat1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file mpstat1.cpp + * @brief dummy mpstat mpstat to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/cpu_monitor/mpstat2.cpp b/system/system_monitor/test/src/cpu_monitor/mpstat2.cpp new file mode 100644 index 0000000000000..35466a986817a --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/mpstat2.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file mpstat2.cpp + * @brief dummy mpstat executable to provide nothing + */ + +int main(int argc, char ** argv) { return 0; } diff --git a/system/system_monitor/test/src/cpu_monitor/test_arm_cpu_monitor.cpp b/system/system_monitor/test/src/cpu_monitor/test_arm_cpu_monitor.cpp new file mode 100644 index 0000000000000..056f8a46193df --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/test_arm_cpu_monitor.cpp @@ -0,0 +1,695 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/cpu_monitor/arm_cpu_monitor.hpp" + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +static constexpr const char * TEST_FILE = "test"; + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestCPUMonitor : public CPUMonitor +{ + friend class CPUMonitorTestSuite; + +public: + TestCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addTempName(const std::string & path) { temps_.emplace_back(path, path); } + void clearTempNames() { temps_.clear(); } + + void addFreqName(int index, const std::string & path) { freqs_.emplace_back(index, path); } + void clearFreqNames() { freqs_.clear(); } + + void setMpstatExists(bool mpstat_exists) { mpstat_exists_ = mpstat_exists; } + + void changeUsageWarn(float usage_warn) { usage_warn_ = usage_warn; } + void changeUsageError(float usage_error) { usage_error_ = usage_error; } + + void changeLoad1Warn(float load1_warn) { load1_warn_ = load1_warn; } + void changeLoad5Warn(float load5_warn) { load5_warn_ = load5_warn; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class CPUMonitorTestSuite : public ::testing::Test +{ +public: + CPUMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + mpstat_ = exe_dir_ + "/mpstat"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string mpstat_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_cpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestCPUMonitor::diagCallback, monitor_.get(), _1)); + monitor_->getTempNames(); + monitor_->getFreqNames(); + + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + } + + void TearDown() + { + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +TEST_F(CPUMonitorTestSuite, tempWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify warning + { + // Write warning level + std::ofstream ofs(TEST_FILE); + ofs << 90000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify error + { + // Write error level + std::ofstream ofs(TEST_FILE); + ofs << 95000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempTemperatureFilesNotFoundTest) +{ + // Clear list + monitor_->clearTempNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "temperature files not found"); +} + +TEST_F(CPUMonitorTestSuite, tempFileOpenErrorTest) +{ + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "file open error"); + ASSERT_TRUE(findValue(status, "file open error", value)); + ASSERT_STREQ(value.c_str(), TEST_FILE); +} + +TEST_F(CPUMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageWarn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageError(1.00); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageMpstatNotFoundTest) +{ + // Set flag false + monitor_->setMpstatExists(false); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); + ASSERT_STREQ( + value.c_str(), + "Command 'mpstat' not found, but can be installed with: sudo apt install sysstat"); +} + +TEST_F(CPUMonitorTestSuite, load1WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeLoad1Warn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeLoad1Warn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, load5WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeLoad5Warn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeLoad5Warn(0.80); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, DISABLED_throttlingTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, freqTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, freqFrequencyFilesNotFoundTest) +{ + // Clear list + monitor_->clearFreqNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "frequency files not found"); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatErrorTest) +{ + // Symlink mpstat1 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat1", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatExceptionTest) +{ + // Symlink mpstat2 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat2", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat exception"); +} + +// for coverage +class DummyCPUMonitor : public CPUMonitorBase +{ + friend class CPUMonitorTestSuite; + +public: + DummyCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitorBase(node_name, options) + { + } + void update() { updater_.force_update(); } +}; + +TEST_F(CPUMonitorTestSuite, dummyCPUMonitorTest) +{ + rclcpp::NodeOptions options; + std::unique_ptr monitor = + std::make_unique("dummy_cpu_monitor", options); + monitor->getTempNames(); + monitor->getFreqNames(); + // Publish topic + monitor->update(); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/cpu_monitor/test_intel_cpu_monitor.cpp b/system/system_monitor/test/src/cpu_monitor/test_intel_cpu_monitor.cpp new file mode 100644 index 0000000000000..c6ab5de8771a4 --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/test_intel_cpu_monitor.cpp @@ -0,0 +1,917 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/cpu_monitor/intel_cpu_monitor.hpp" + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +static constexpr const char * TEST_FILE = "test"; +static constexpr const char * DOCKER_ENV = "/.dockerenv"; + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestCPUMonitor : public CPUMonitor +{ + friend class CPUMonitorTestSuite; + +public: + TestCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addTempName(const std::string & path) { temps_.emplace_back(path, path); } + void clearTempNames() { temps_.clear(); } + bool isTempNamesEmpty() { return temps_.empty(); } + + void addFreqName(int index, const std::string & path) { freqs_.emplace_back(index, path); } + void clearFreqNames() { freqs_.clear(); } + + void setMpstatExists(bool mpstat_exists) { mpstat_exists_ = mpstat_exists; } + + void changeUsageWarn(float usage_warn) { usage_warn_ = usage_warn; } + void changeUsageError(float usage_error) { usage_error_ = usage_error; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class CPUMonitorTestSuite : public ::testing::Test +{ +public: + CPUMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + mpstat_ = exe_dir_ + "/mpstat"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string mpstat_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_cpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestCPUMonitor::diagCallback, monitor_.get(), _1)); + monitor_->getTempNames(); + monitor_->getFreqNames(); + + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + } + + void TearDown() + { + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +enum ThreadTestMode { + Normal = 0, + Throttling, + ReturnsError, + RecvTimeout, + RecvNoData, + FormatError, +}; + +bool stop_thread; +pthread_mutex_t mutex; + +void * msr_reader(void * args) +{ + ThreadTestMode * mode = reinterpret_cast(args); + + // Create a new socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + return nullptr; + } + + // Allow address reuse + int ret = 0; + int opt = 1; + ret = setsockopt( + sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&opt), (socklen_t)sizeof(opt)); + if (ret < 0) { + close(sock); + return nullptr; + } + + // Give the socket FD the local address ADDR + sockaddr_in addr; + memset(&addr, 0, sizeof(sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_port = htons(7634); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + close(sock); + return nullptr; + } + + // Prepare to accept connections on socket FD + ret = listen(sock, 5); + if (ret < 0) { + close(sock); + return nullptr; + } + + sockaddr_in client; + socklen_t len = sizeof(client); + + // Await a connection on socket FD + int new_sock = accept(sock, reinterpret_cast(&client), &len); + if (new_sock < 0) { + close(sock); + return nullptr; + } + + ret = 0; + std::ostringstream oss; + boost::archive::text_oarchive oa(oss); + MSRInfo msr = {0}; + + switch (*mode) { + case Normal: + msr.error_code_ = 0; + msr.pkg_thermal_status_.push_back(false); + oa << msr; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case Throttling: + msr.error_code_ = 0; + msr.pkg_thermal_status_.push_back(true); + oa << msr; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case ReturnsError: + msr.error_code_ = EACCES; + oa << msr; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case RecvTimeout: + // Wait for recv timeout + while (true) { + pthread_mutex_lock(&mutex); + if (stop_thread) { + break; + } + pthread_mutex_unlock(&mutex); + sleep(1); + } + break; + + case RecvNoData: + // Send nothing, close socket immediately + break; + + case FormatError: + // Send wrong data + oa << "test"; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + default: + break; + } + + // Close the file descriptor FD + close(new_sock); + close(sock); + + return nullptr; +} + +TEST_F(CPUMonitorTestSuite, tempWarnTest) +{ + // Skip test if process runs inside CI environment + if (monitor_->isTempNamesEmpty() && fs::exists(DOCKER_ENV)) { + return; + } + + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify warning + { + // Write warning level + std::ofstream ofs(TEST_FILE); + ofs << 90000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempErrorTest) +{ + // Skip test if process runs inside CI environment + if (monitor_->isTempNamesEmpty() && fs::exists(DOCKER_ENV)) { + return; + } + + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify error + { + // Write error level + std::ofstream ofs(TEST_FILE); + ofs << 95000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempTemperatureFilesNotFoundTest) +{ + // Clear list + monitor_->clearTempNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "temperature files not found"); +} + +TEST_F(CPUMonitorTestSuite, tempFileOpenErrorTest) +{ + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "file open error"); + ASSERT_TRUE(findValue(status, "file open error", value)); + ASSERT_STREQ(value.c_str(), TEST_FILE); +} + +TEST_F(CPUMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageWarn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageError(1.00); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageMpstatNotFoundTest) +{ + // Set flag false + monitor_->setMpstatExists(false); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); + ASSERT_STREQ( + value.c_str(), + "Command 'mpstat' not found, but can be installed with: sudo apt install sysstat"); +} + +TEST_F(CPUMonitorTestSuite, load1WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + // Depending on running situation of machine. + ASSERT_TRUE(status.level == DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, load5WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + // Depending on running situation of machine. + ASSERT_TRUE(status.level == DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, throttlingTest) +{ + pthread_t th; + ThreadTestMode mode = Normal; + pthread_create(&th, nullptr, msr_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, throttlingThrottlingTest) +{ + pthread_t th; + ThreadTestMode mode = Throttling; + pthread_create(&th, nullptr, msr_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "throttling"); +} + +TEST_F(CPUMonitorTestSuite, throttlingReturnsErrorTest) +{ + pthread_t th; + ThreadTestMode mode = ReturnsError; + pthread_create(&th, nullptr, msr_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "msr_reader error"); + ASSERT_TRUE(findValue(status, "msr_reader", value)); + ASSERT_STREQ(value.c_str(), strerror(EACCES)); +} + +TEST_F(CPUMonitorTestSuite, throttlingRecvTimeoutTest) +{ + pthread_t th; + ThreadTestMode mode = RecvTimeout; + pthread_create(&th, nullptr, msr_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + // Recv timeout occurs, thread is no longer needed + pthread_mutex_lock(&mutex); + stop_thread = true; + pthread_mutex_unlock(&mutex); + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "recv error"); + ASSERT_TRUE(findValue(status, "recv", value)); + ASSERT_STREQ(value.c_str(), strerror(EWOULDBLOCK)); +} + +TEST_F(CPUMonitorTestSuite, throttlingRecvNoDataTest) +{ + pthread_t th; + ThreadTestMode mode = RecvNoData; + pthread_create(&th, nullptr, msr_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "recv error"); + ASSERT_TRUE(findValue(status, "recv", value)); + ASSERT_STREQ(value.c_str(), "No data received"); +} + +TEST_F(CPUMonitorTestSuite, throttlingFormatErrorTest) +{ + pthread_t th; + ThreadTestMode mode = FormatError; + pthread_create(&th, nullptr, msr_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "recv error"); + ASSERT_TRUE(findValue(status, "recv", value)); + ASSERT_STREQ(value.c_str(), "input stream error"); +} + +TEST_F(CPUMonitorTestSuite, throttlingConnectErrorTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "connect error"); + ASSERT_TRUE(findValue(status, "connect", value)); + ASSERT_STREQ(value.c_str(), strerror(ECONNREFUSED)); +} + +TEST_F(CPUMonitorTestSuite, freqTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, freqFrequencyFilesNotFoundTest) +{ + // Clear list + monitor_->clearFreqNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "frequency files not found"); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatErrorTest) +{ + // Symlink mpstat1 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat1", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatExceptionTest) +{ + // Symlink mpstat2 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat2", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat exception"); +} + +// for coverage +class DummyCPUMonitor : public CPUMonitorBase +{ + friend class CPUMonitorTestSuite; + +public: + DummyCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitorBase(node_name, options) + { + } + void update() { updater_.force_update(); } +}; + +TEST_F(CPUMonitorTestSuite, dummyCPUMonitorTest) +{ + rclcpp::NodeOptions options; + std::unique_ptr monitor = + std::make_unique("dummy_cpu_monitor", options); + monitor->getTempNames(); + monitor->getFreqNames(); + // Publish topic + monitor->update(); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/cpu_monitor/test_raspi_cpu_monitor.cpp b/system/system_monitor/test/src/cpu_monitor/test_raspi_cpu_monitor.cpp new file mode 100644 index 0000000000000..f58124deef67c --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/test_raspi_cpu_monitor.cpp @@ -0,0 +1,695 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/cpu_monitor/raspi_cpu_monitor.hpp" + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +static constexpr const char * TEST_FILE = "test"; + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestCPUMonitor : public CPUMonitor +{ + friend class CPUMonitorTestSuite; + +public: + TestCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addTempName(const std::string & path) { temps_.emplace_back(path, path); } + void clearTempNames() { temps_.clear(); } + + void addFreqName(int index, const std::string & path) { freqs_.emplace_back(index, path); } + void clearFreqNames() { freqs_.clear(); } + + void setMpstatExists(bool mpstat_exists) { mpstat_exists_ = mpstat_exists; } + + void changeUsageWarn(float usage_warn) { usage_warn_ = usage_warn; } + void changeUsageError(float usage_error) { usage_error_ = usage_error; } + + void changeLoad1Warn(float load1_warn) { load1_warn_ = load1_warn; } + void changeLoad5Warn(float load5_warn) { load5_warn_ = load5_warn; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class CPUMonitorTestSuite : public ::testing::Test +{ +public: + CPUMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + mpstat_ = exe_dir_ + "/mpstat"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string mpstat_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_cpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestCPUMonitor::diagCallback, monitor_.get(), _1)); + monitor_->getTempNames(); + monitor_->getFreqNames(); + + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + } + + void TearDown() + { + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +TEST_F(CPUMonitorTestSuite, tempWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify warning + { + // Write warning level + std::ofstream ofs(TEST_FILE); + ofs << 90000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify error + { + // Write error level + std::ofstream ofs(TEST_FILE); + ofs << 95000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempTemperatureFilesNotFoundTest) +{ + // Clear list + monitor_->clearTempNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "temperature files not found"); +} + +TEST_F(CPUMonitorTestSuite, tempFileOpenErrorTest) +{ + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "file open error"); + ASSERT_TRUE(findValue(status, "file open error", value)); + ASSERT_STREQ(value.c_str(), TEST_FILE); +} + +TEST_F(CPUMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageWarn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageError(1.00); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageMpstatNotFoundTest) +{ + // Set flag false + monitor_->setMpstatExists(false); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); + ASSERT_STREQ( + value.c_str(), + "Command 'mpstat' not found, but can be installed with: sudo apt install sysstat"); +} + +TEST_F(CPUMonitorTestSuite, load1WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeLoad1Warn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeLoad1Warn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, load5WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeLoad5Warn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeLoad5Warn(0.80); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, DISABLED_throttlingTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, freqTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, freqFrequencyFilesNotFoundTest) +{ + // Clear list + monitor_->clearFreqNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "frequency files not found"); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatErrorTest) +{ + // Symlink mpstat1 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat1", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatExceptionTest) +{ + // Symlink mpstat2 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat2", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat exception"); +} + +// for coverage +class DummyCPUMonitor : public CPUMonitorBase +{ + friend class CPUMonitorTestSuite; + +public: + DummyCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitorBase(node_name, options) + { + } + void update() { updater_.force_update(); } +}; + +TEST_F(CPUMonitorTestSuite, dummyCPUMonitorTest) +{ + rclcpp::NodeOptions options; + std::unique_ptr monitor = + std::make_unique("dummy_cpu_monitor", options); + monitor->getTempNames(); + monitor->getFreqNames(); + // Publish topic + monitor->update(); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/cpu_monitor/test_tegra_cpu_monitor.cpp b/system/system_monitor/test/src/cpu_monitor/test_tegra_cpu_monitor.cpp new file mode 100644 index 0000000000000..104ef3cb454d9 --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/test_tegra_cpu_monitor.cpp @@ -0,0 +1,681 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/cpu_monitor/tegra_cpu_monitor.hpp" + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +static constexpr const char * TEST_FILE = "test"; + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestCPUMonitor : public CPUMonitor +{ + friend class CPUMonitorTestSuite; + +public: + TestCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addTempName(const std::string & path) { temps_.emplace_back(path, path); } + void clearTempNames() { temps_.clear(); } + + void addFreqName(int index, const std::string & path) { freqs_.emplace_back(index, path); } + void clearFreqNames() { freqs_.clear(); } + + void setMpstatExists(bool mpstat_exists) { mpstat_exists_ = mpstat_exists; } + + void changeUsageWarn(float usage_warn) { usage_warn_ = usage_warn; } + void changeUsageError(float usage_error) { usage_error_ = usage_error; } + + void changeLoad1Warn(float load1_warn) { load1_warn_ = load1_warn; } + void changeLoad5Warn(float load5_warn) { load5_warn_ = load5_warn; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class CPUMonitorTestSuite : public ::testing::Test +{ +public: + CPUMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + mpstat_ = exe_dir_ + "/mpstat"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string mpstat_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_cpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestCPUMonitor::diagCallback, monitor_.get(), _1)); + monitor_->getTempNames(); + monitor_->getFreqNames(); + + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + } + + void TearDown() + { + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + // Remove dummy executable if exists + if (fs::exists(mpstat_)) { + fs::remove(mpstat_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +TEST_F(CPUMonitorTestSuite, tempWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify warning + { + // Write warning level + std::ofstream ofs(TEST_FILE); + ofs << 90000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify error + { + // Write error level + std::ofstream ofs(TEST_FILE); + ofs << 95000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, tempTemperatureFilesNotFoundTest) +{ + // Clear list + monitor_->clearTempNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "temperature files not found"); +} + +TEST_F(CPUMonitorTestSuite, tempFileOpenErrorTest) +{ + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "file open error"); + ASSERT_TRUE(findValue(status, "file open error", value)); + ASSERT_STREQ(value.c_str(), TEST_FILE); +} + +TEST_F(CPUMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageWarn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageError(1.00); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, usageMpstatNotFoundTest) +{ + // Set flag false + monitor_->setMpstatExists(false); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); + ASSERT_STREQ( + value.c_str(), + "Command 'mpstat' not found, but can be installed with: sudo apt install sysstat"); +} + +TEST_F(CPUMonitorTestSuite, load1WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeLoad1Warn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeLoad1Warn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, load5WarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeLoad5Warn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeLoad5Warn(0.80); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Load Average", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(CPUMonitorTestSuite, freqTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(CPUMonitorTestSuite, freqFrequencyFilesNotFoundTest) +{ + // Clear list + monitor_->clearFreqNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("CPU Frequency", status)); + + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "frequency files not found"); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatErrorTest) +{ + // Symlink mpstat1 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat1", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat error"); + ASSERT_TRUE(findValue(status, "mpstat", value)); +} + +TEST_F(CPUMonitorTestSuite, usageMpstatExceptionTest) +{ + // Symlink mpstat2 to mpstat + fs::create_symlink(exe_dir_ + "/mpstat2", mpstat_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("CPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "mpstat exception"); +} + +// for coverage +class DummyCPUMonitor : public CPUMonitorBase +{ + friend class CPUMonitorTestSuite; + +public: + DummyCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitorBase(node_name, options) + { + } + void update() { updater_.force_update(); } +}; + +TEST_F(CPUMonitorTestSuite, dummyCPUMonitorTest) +{ + rclcpp::NodeOptions options; + std::unique_ptr monitor = + std::make_unique("dummy_cpu_monitor", options); + monitor->getTempNames(); + monitor->getFreqNames(); + // Publish topic + monitor->update(); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/cpu_monitor/test_unknown_cpu_monitor.cpp b/system/system_monitor/test/src/cpu_monitor/test_unknown_cpu_monitor.cpp new file mode 100644 index 0000000000000..53fffe03bb02b --- /dev/null +++ b/system/system_monitor/test/src/cpu_monitor/test_unknown_cpu_monitor.cpp @@ -0,0 +1,78 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/cpu_monitor/unknown_cpu_monitor.hpp" + +#include + +#include + +#include +#include + +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +class TestCPUMonitor : public CPUMonitor +{ + friend class CPUMonitorTestSuite; + +public: + TestCPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : CPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void update() { updater_.force_update(); } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; +}; + +class CPUMonitorTestSuite : public ::testing::Test +{ +public: + CPUMonitorTestSuite() {} + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_cpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestCPUMonitor::diagCallback, monitor_.get(), _1)); + monitor_->getTempNames(); + monitor_->getFreqNames(); + } + + void TearDown() { rclcpp::shutdown(); } +}; + +TEST_F(CPUMonitorTestSuite, test) { ASSERT_TRUE(true); } + +int main(int argc, char ** argv) +{ + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/gpu_monitor/test_nvml_gpu_monitor.cpp b/system/system_monitor/test/src/gpu_monitor/test_nvml_gpu_monitor.cpp new file mode 100644 index 0000000000000..c5eee02076597 --- /dev/null +++ b/system/system_monitor/test/src/gpu_monitor/test_nvml_gpu_monitor.cpp @@ -0,0 +1,552 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/gpu_monitor/nvml_gpu_monitor.hpp" + +#include + +#include + +#include + +#include +#include + +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +class TestGPUMonitor : public GPUMonitor +{ + friend class GPUMonitorTestSuite; + +public: + TestGPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : GPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addGPU(const gpu_info & info) { gpus_.push_back(info); } + void clearGPU() { gpus_.clear(); } + + void changeTempWarn(float temp_warn) { temp_warn_ = temp_warn; } + void changeTempError(float temp_error) { temp_error_ = temp_error; } + + void changeGPUUsageWarn(float gpu_usage_warn) { gpu_usage_warn_ = gpu_usage_warn; } + void changeGPUUsageError(float gpu_usage_error) { gpu_usage_error_ = gpu_usage_error; } + + void changeMemoryUsageWarn(float memory_usage_warn) { memory_usage_warn_ = memory_usage_warn; } + void changeMemoryUsageError(float memory_usage_error) + { + memory_usage_error_ = memory_usage_error; + } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class GPUMonitorTestSuite : public ::testing::Test +{ +public: + GPUMonitorTestSuite() {} + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_gpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestGPUMonitor::diagCallback, monitor_.get(), _1)); + } + + void TearDown() { rclcpp::shutdown(); } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } +}; + +TEST_F(GPUMonitorTestSuite, tempWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeTempWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeTempWarn(90.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, tempErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify error + { + // Change error level + monitor_->changeTempError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeTempError(95.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, gpuUsageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeGPUUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeGPUUsageWarn(0.90); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, gpuUsageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify error + { + // Change error level + monitor_->changeGPUUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeGPUUsageError(1.00); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, gpuMemoryUsageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeMemoryUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeMemoryUsageWarn(0.95); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, gpuMemoryUsageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify error + { + // Change error level + monitor_->changeMemoryUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeMemoryUsageError(0.99); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, throttlingTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(GPUMonitorTestSuite, gpuNotFoundTest) +{ + // Clear list + monitor_->clearGPU(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "gpu not found"); + + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "gpu not found"); + + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "gpu not found"); + + ASSERT_TRUE(monitor_->findDiagStatus("GPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "gpu not found"); +} + +TEST_F(GPUMonitorTestSuite, illegalDeviceHandleTest) +{ + // Clear list + monitor_->clearGPU(); + // Add blank device + gpu_info gpu; + monitor_->addGPU(gpu); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "Failed to retrieve the current temperature"); + + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "Failed to retrieve the current utilization rates"); + + ASSERT_TRUE(monitor_->findDiagStatus("GPU Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ( + status.message.c_str(), "Failed to retrieve the amount of used, free and total memory"); + + ASSERT_TRUE(monitor_->findDiagStatus("GPU Thermal Throttling", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "Failed to retrieve the current clock speeds"); +} + +// for coverage +class DummyGPUMonitor : public GPUMonitorBase +{ + friend class GPUMonitorTestSuite; + +public: + DummyGPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : GPUMonitorBase(node_name, options) + { + } + void update() { updater_.force_update(); } +}; + +TEST_F(GPUMonitorTestSuite, dummyGPUMonitorTest) +{ + rclcpp::NodeOptions options; + std::unique_ptr monitor = + std::make_unique("dummy_gpu_monitor", options); + // Publish topic + monitor->update(); +} + +int main(int argc, char ** argv) +{ + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/gpu_monitor/test_tegra_gpu_monitor.cpp b/system/system_monitor/test/src/gpu_monitor/test_tegra_gpu_monitor.cpp new file mode 100644 index 0000000000000..44b26e8b2433d --- /dev/null +++ b/system/system_monitor/test/src/gpu_monitor/test_tegra_gpu_monitor.cpp @@ -0,0 +1,499 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/gpu_monitor/tegra_gpu_monitor.hpp" + +#include + +#include +#include + +#include + +#include +#include + +static constexpr const char * TEST_FILE = "test"; + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +class TestGPUMonitor : public GPUMonitor +{ + friend class GPUMonitorTestSuite; + +public: + TestGPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : GPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addTempName(const std::string & path) { temps_.emplace_back(path, path); } + void clearTempNames() { temps_.clear(); } + + void addLoadName(const std::string & path) { loads_.emplace_back(path, path); } + void clearLoadNames() { loads_.clear(); } + + void addFreqName(const std::string & path) { freqs_.emplace_back(path, path); } + void clearFreqNames() { freqs_.clear(); } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class GPUMonitorTestSuite : public ::testing::Test +{ +public: + GPUMonitorTestSuite() {} + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_gpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestGPUMonitor::diagCallback, monitor_.get(), _1)); + } + + void TearDown() + { + // Remove test file if exists + if (fs::exists(TEST_FILE)) { + fs::remove(TEST_FILE); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } +}; + +TEST_F(GPUMonitorTestSuite, tempWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify warning + { + // Write warning level + std::ofstream ofs(TEST_FILE); + ofs << 90000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, tempErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Verify error + { + // Write error level + std::ofstream ofs(TEST_FILE); + ofs << 95000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 89900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, tempTemperatureFilesNotFoundTest) +{ + // Clear list + monitor_->clearTempNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "temperature files not found"); +} + +TEST_F(GPUMonitorTestSuite, tempFileOpenErrorTest) +{ + // Add test file to list + monitor_->addTempName(TEST_FILE); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "file open error"); + ASSERT_TRUE(findValue(status, "file open error", value)); + ASSERT_STREQ(value.c_str(), TEST_FILE); +} + +TEST_F(GPUMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addLoadName(TEST_FILE); + + // Verify warning + { + // Write warning level + std::ofstream ofs(TEST_FILE); + ofs << 900 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 890 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Add test file to list + monitor_->addLoadName(TEST_FILE); + + // Verify error + { + // Write error level + std::ofstream ofs(TEST_FILE); + ofs << 1000 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Write normal level + std::ofstream ofs(TEST_FILE); + ofs << 890 << std::endl; + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(GPUMonitorTestSuite, usageTemperatureFilesNotFoundTest) +{ + // Clear list + monitor_->clearLoadNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "load files not found"); +} + +TEST_F(GPUMonitorTestSuite, usageFileOpenErrorTest) +{ + // Add test file to list + monitor_->addLoadName(TEST_FILE); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "file open error"); + ASSERT_TRUE(findValue(status, "file open error", value)); + ASSERT_STREQ(value.c_str(), TEST_FILE); +} + +TEST_F(GPUMonitorTestSuite, freqTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Frequency", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(GPUMonitorTestSuite, freqFrequencyFilesNotFoundTest) +{ + // Clear list + monitor_->clearFreqNames(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("GPU Frequency", status)); + + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "frequency files not found"); +} + +// for coverage +class DummyGPUMonitor : public GPUMonitorBase +{ + friend class GPUMonitorTestSuite; + +public: + DummyGPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : GPUMonitorBase(node_name, options) + { + } + void update() { updater_.force_update(); } +}; + +TEST_F(GPUMonitorTestSuite, dummyGPUMonitorTest) +{ + rclcpp::NodeOptions options; + std::unique_ptr monitor = + std::make_unique("dummy_gpu_monitor", options); + // Publish topic + monitor->update(); +} + +int main(int argc, char ** argv) +{ + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/gpu_monitor/test_unknown_gpu_monitor.cpp b/system/system_monitor/test/src/gpu_monitor/test_unknown_gpu_monitor.cpp new file mode 100644 index 0000000000000..06ebce8cc6ce2 --- /dev/null +++ b/system/system_monitor/test/src/gpu_monitor/test_unknown_gpu_monitor.cpp @@ -0,0 +1,76 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/gpu_monitor/unknown_gpu_monitor.hpp" + +#include + +#include + +#include +#include + +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +class TestGPUMonitor : public GPUMonitor +{ + friend class GPUMonitorTestSuite; + +public: + TestGPUMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : GPUMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void update() { updater_.force_update(); } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; +}; + +class GPUMonitorTestSuite : public ::testing::Test +{ +public: + GPUMonitorTestSuite() {} + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_gpu_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestGPUMonitor::diagCallback, monitor_.get(), _1)); + } + + void TearDown() { rclcpp::shutdown(); } +}; + +TEST_F(GPUMonitorTestSuite, test) { ASSERT_TRUE(true); } + +int main(int argc, char ** argv) +{ + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/hdd_monitor/df1.cpp b/system/system_monitor/test/src/hdd_monitor/df1.cpp new file mode 100644 index 0000000000000..99700d9d381d5 --- /dev/null +++ b/system/system_monitor/test/src/hdd_monitor/df1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file df.cpp + * @brief dummy df executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/hdd_monitor/test_hdd_monitor.cpp b/system/system_monitor/test/src/hdd_monitor/test_hdd_monitor.cpp new file mode 100644 index 0000000000000..64d78de19418d --- /dev/null +++ b/system/system_monitor/test/src/hdd_monitor/test_hdd_monitor.cpp @@ -0,0 +1,712 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/hdd_monitor/hdd_monitor.hpp" + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestHDDMonitor : public HDDMonitor +{ + friend class HDDMonitorTestSuite; + +public: + TestHDDMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : HDDMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void addHDDParams( + const std::string & name, float temp_warn, float temp_error, float usage_warn, + float usage_error) + { + HDDParam param; + param.temp_warn_ = temp_warn; + param.temp_error_ = temp_error; + param.usage_warn_ = usage_warn; + param.usage_error_ = usage_error; + hdd_params_[name] = param; + } + + void changeHDDParams(float temp_warn, float temp_error, float usage_warn, float usage_error) + { + for (auto itr = hdd_params_.begin(); itr != hdd_params_.end(); ++itr) { + itr->second.temp_warn_ = temp_warn; + itr->second.temp_error_ = temp_error; + itr->second.usage_warn_ = usage_warn; + itr->second.usage_error_ = usage_error; + } + } + + void removeHDDParams(const std::string & name) + { + for (auto itr = hdd_params_.begin(); itr != hdd_params_.end(); ++itr) { + if (itr->first == name) { + hdd_params_.erase(itr); + break; + } + } + } + + void clearHDDParams() { hdd_params_.clear(); } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class HDDMonitorTestSuite : public ::testing::Test +{ +public: + HDDMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + df_ = exe_dir_ + "/df"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string df_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_hdd_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestHDDMonitor::diagCallback, monitor_.get(), _1)); + // Remove dummy executable if exists + if (fs::exists(df_)) { + fs::remove(df_); + } + } + + void TearDown() + { + // Remove dummy executable if exists + if (fs::exists(df_)) { + fs::remove(df_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +enum ThreadTestMode { + Normal = 0, + Hot, + CriticalHot, + ReturnsError, + RecvTimeout, + RecvNoData, + FormatError, +}; + +bool stop_thread; +pthread_mutex_t mutex; + +void * hdd_reader(void * args) +{ + ThreadTestMode * mode = reinterpret_cast(args); + + // Create a new socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + return nullptr; + } + + // Allow address reuse + int ret = 0; + int opt = 1; + ret = setsockopt( + sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&opt), (socklen_t)sizeof(opt)); + if (ret < 0) { + close(sock); + return nullptr; + } + + // Give the socket FD the local address ADDR + sockaddr_in addr; + memset(&addr, 0, sizeof(sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_port = htons(7635); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + close(sock); + return nullptr; + } + + // Prepare to accept connections on socket FD + ret = listen(sock, 5); + if (ret < 0) { + close(sock); + return nullptr; + } + + sockaddr_in client; + socklen_t len = sizeof(client); + + // Await a connection on socket FD + int new_sock = accept(sock, reinterpret_cast(&client), &len); + if (new_sock < 0) { + close(sock); + return nullptr; + } + + // Receive list of device from a socket + char buf[1024] = ""; + ret = recv(new_sock, buf, sizeof(buf) - 1, 0); + if (ret < 0) { + close(sock); + return nullptr; + } + // No data received + if (ret == 0) { + close(sock); + return nullptr; + } + + ret = 0; + std::ostringstream oss; + boost::archive::text_oarchive oa(oss); + HDDInfoList list; + HDDInfo info = {0}; + + switch (*mode) { + case Normal: + info.error_code_ = 0; + info.temp_ = 40; + list["/dev/sda"] = info; + oa << list; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case Hot: + info.error_code_ = 0; + info.temp_ = 55; + list["/dev/sda"] = info; + oa << list; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case CriticalHot: + info.error_code_ = 0; + info.temp_ = 70; + list["/dev/sda"] = info; + oa << list; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case ReturnsError: + info.error_code_ = EACCES; + list["/dev/sda"] = info; + oa << list; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + case RecvTimeout: + // Wait for recv timeout + while (true) { + pthread_mutex_lock(&mutex); + if (stop_thread) { + break; + } + pthread_mutex_unlock(&mutex); + sleep(1); + } + break; + + case RecvNoData: + // Send nothing, close socket immediately + break; + + case FormatError: + // Send wrong data + oa << "test"; + ret = write(new_sock, oss.str().c_str(), oss.str().length()); + break; + + default: + break; + } + + // Close the file descriptor FD + close(new_sock); + close(sock); + + return nullptr; +} + +TEST_F(HDDMonitorTestSuite, tempNormalTest) +{ + pthread_t th; + ThreadTestMode mode = Normal; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(HDDMonitorTestSuite, tempWarnTest) +{ + pthread_t th; + ThreadTestMode mode = Hot; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); +} + +TEST_F(HDDMonitorTestSuite, tempErrorTest) +{ + pthread_t th; + ThreadTestMode mode = CriticalHot; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); +} + +TEST_F(HDDMonitorTestSuite, tempReturnsErrorTest) +{ + pthread_t th; + ThreadTestMode mode = ReturnsError; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "hdd_reader error"); + ASSERT_TRUE(findValue(status, "HDD 0: hdd_reader", value)); + ASSERT_STREQ(value.c_str(), strerror(EACCES)); +} + +TEST_F(HDDMonitorTestSuite, tempRecvTimeoutTest) +{ + pthread_t th; + ThreadTestMode mode = RecvTimeout; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + // Recv timeout occurs, thread is no longer needed + pthread_mutex_lock(&mutex); + stop_thread = true; + pthread_mutex_unlock(&mutex); + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "recv error"); + ASSERT_TRUE(findValue(status, "recv", value)); + ASSERT_STREQ(value.c_str(), strerror(EWOULDBLOCK)); +} + +TEST_F(HDDMonitorTestSuite, tempRecvNoDataTest) +{ + pthread_t th; + ThreadTestMode mode = RecvNoData; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "recv error"); + ASSERT_TRUE(findValue(status, "recv", value)); + ASSERT_STREQ(value.c_str(), "No data received"); +} + +TEST_F(HDDMonitorTestSuite, tempFormatErrorTest) +{ + pthread_t th; + ThreadTestMode mode = FormatError; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "recv error"); + ASSERT_TRUE(findValue(status, "recv", value)); + ASSERT_STREQ(value.c_str(), "input stream error"); +} + +TEST_F(HDDMonitorTestSuite, tempConnectErrorTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "connect error"); + ASSERT_TRUE(findValue(status, "connect", value)); + ASSERT_STREQ(value.c_str(), strerror(ECONNREFUSED)); +} + +TEST_F(HDDMonitorTestSuite, tempInvalidDiskParameterTest) +{ + // Clear list + monitor_->clearHDDParams(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "invalid disk parameter"); +} + +TEST_F(HDDMonitorTestSuite, tempNoSuchDeviceTest) +{ + // Add test file to list + monitor_->addHDDParams("/dev/sdx", 55.0, 77.0, 0.95, 0.99); + + pthread_t th; + ThreadTestMode mode = Normal; + pthread_create(&th, nullptr, hdd_reader, &mode); + // Wait for thread started + rclcpp::WallRate(10).sleep(); + + // Publish topic + monitor_->update(); + + pthread_join(th, NULL); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Temperature", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "hdd_reader error"); + ASSERT_TRUE(findValue(status, "HDD 1: hdd_reader", value)); + ASSERT_STREQ(value.c_str(), strerror(ENOENT)); + + // Remove test fie from list + monitor_->removeHDDParams("/dev/sdx"); +} + +TEST_F(HDDMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeHDDParams(55.0, 77.0, 0.00, 0.99); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeHDDParams(55.0, 77.0, 0.95, 0.99); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(HDDMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change error level + monitor_->changeHDDParams(55.0, 77.0, 0.95, 0.00); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeHDDParams(55.0, 77.0, 0.95, 0.99); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(HDDMonitorTestSuite, usageDfErrorTest) +{ + // Symlink df1 to df + fs::create_symlink(exe_dir_ + "/df1", df_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("HDD Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "df error"); + ASSERT_TRUE(findValue(status, "HDD 0: df", value)); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/mem_monitor/free1.cpp b/system/system_monitor/test/src/mem_monitor/free1.cpp new file mode 100644 index 0000000000000..a6e2bb49c3093 --- /dev/null +++ b/system/system_monitor/test/src/mem_monitor/free1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file free1.cpp + * @brief dummy free executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/mem_monitor/test_mem_monitor.cpp b/system/system_monitor/test/src/mem_monitor/test_mem_monitor.cpp new file mode 100644 index 0000000000000..11ef07795ac68 --- /dev/null +++ b/system/system_monitor/test/src/mem_monitor/test_mem_monitor.cpp @@ -0,0 +1,280 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/mem_monitor/mem_monitor.hpp" + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestMemMonitor : public MemMonitor +{ + friend class MemMonitorTestSuite; + +public: + TestMemMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : MemMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void changeUsageWarn(float usage_warn) { usage_warn_ = usage_warn; } + void changeUsageError(float usage_error) { usage_error_ = usage_error; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class MemMonitorTestSuite : public ::testing::Test +{ +public: + MemMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + free_ = exe_dir_ + "/free"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string free_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_mem_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestMemMonitor::diagCallback, monitor_.get(), _1)); + + // Remove dummy executable if exists + if (fs::exists(free_)) { + fs::remove(free_); + } + } + + void TearDown() + { + // Remove dummy executable if exists + if (fs::exists(free_)) { + fs::remove(free_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +TEST_F(MemMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageWarn(0.95); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(MemMonitorTestSuite, usageErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageError(0.99); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(MemMonitorTestSuite, usageFreeErrorTest) +{ + // Symlink free1 to free + fs::create_symlink(exe_dir_ + "/free1", free_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("Memory Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "free error"); + ASSERT_TRUE(findValue(status, "free", value)); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/net_monitor/test_net_monitor.cpp b/system/system_monitor/test/src/net_monitor/test_net_monitor.cpp new file mode 100644 index 0000000000000..34dc7adb9cf6a --- /dev/null +++ b/system/system_monitor/test/src/net_monitor/test_net_monitor.cpp @@ -0,0 +1,192 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/net_monitor/net_monitor.hpp" + +#include + +#include +#include + +#include + +#include +#include +#include + +static constexpr const char * DOCKER_ENV = "/.dockerenv"; + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +class TestNetMonitor : public NetMonitor +{ + friend class NetMonitorTestSuite; + +public: + TestNetMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : NetMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void changeUsageWarn(float usage_warn) { usage_warn_ = usage_warn; } + + const std::vector getDeviceParams() { return device_params_; } + void clearDeviceParams() { device_params_.clear(); } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class NetMonitorTestSuite : public ::testing::Test +{ +public: + NetMonitorTestSuite() {} + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_net_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestNetMonitor::diagCallback, monitor_.get(), _1)); + } + + void TearDown() { rclcpp::shutdown(); } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } +}; + +TEST_F(NetMonitorTestSuite, usageWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("Network Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeUsageWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Network Usage", status)); + // Skip test if process runs inside docker + // Don't know what interface should be monitored. + if (!fs::exists(DOCKER_ENV)) { + ASSERT_EQ(status.level, DiagStatus::WARN); + } + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeUsageWarn(0.95); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Network Usage", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(NetMonitorTestSuite, usageInvalidDeviceParameterTest) +{ + // Clear list + monitor_->clearDeviceParams(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Network Usage", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "invalid device parameter"); +} + +int main(int argc, char ** argv) +{ + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/ntp_monitor/ntpdate1.cpp b/system/system_monitor/test/src/ntp_monitor/ntpdate1.cpp new file mode 100644 index 0000000000000..0f79345c1e6c0 --- /dev/null +++ b/system/system_monitor/test/src/ntp_monitor/ntpdate1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file ntpdate1.cpp + * @brief dummy ntpdate executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/ntp_monitor/test_ntp_monitor.cpp b/system/system_monitor/test/src/ntp_monitor/test_ntp_monitor.cpp new file mode 100644 index 0000000000000..0b0b98127eeee --- /dev/null +++ b/system/system_monitor/test/src/ntp_monitor/test_ntp_monitor.cpp @@ -0,0 +1,303 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/ntp_monitor/ntp_monitor.hpp" + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestNTPMonitor : public NTPMonitor +{ + friend class NTPMonitorTestSuite; + +public: + TestNTPMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : NTPMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + void changeOffsetWarn(float offset_warn) { offset_warn_ = offset_warn; } + void changeOffsetError(float offset_error) { offset_error_ = offset_error; } + + void setNtpdateExists(bool ntpdate_exists) { ntpdate_exists_ = ntpdate_exists; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class NTPMonitorTestSuite : public ::testing::Test +{ +public: + NTPMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + ntpdate_ = exe_dir_ + "/ntpdate"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string ntpdate_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_ntp_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestNTPMonitor::diagCallback, monitor_.get(), _1)); + + // Remove dummy executable if exists + if (fs::exists(ntpdate_)) { + fs::remove(ntpdate_); + } + } + + void TearDown() + { + // Remove dummy executable if exists + if (fs::exists(ntpdate_)) { + fs::remove(ntpdate_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +TEST_F(NTPMonitorTestSuite, offsetWarnTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeOffsetWarn(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::WARN); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeOffsetWarn(0.05); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(NTPMonitorTestSuite, offsetErrorTest) +{ + // Verify normal behavior + { + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } + + // Verify warning + { + // Change warning level + monitor_->changeOffsetError(0.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + } + + // Verify normal behavior + { + // Change back to normal + monitor_->changeOffsetError(5.0); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(NTPMonitorTestSuite, offsetNtpdateNotFoundTest) +{ + // Set flag false + monitor_->setNtpdateExists(false); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "ntpdate error"); + ASSERT_TRUE(findValue(status, "ntpdate", value)); + ASSERT_STREQ( + value.c_str(), + "Command 'ntpdate' not found, but can be installed with: sudo apt install ntpdate"); +} + +TEST_F(NTPMonitorTestSuite, offsetNtpdateErrorTest) +{ + // Symlink ntpdate1 to ntpdate + fs::create_symlink(exe_dir_ + "/ntpdate1", ntpdate_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + ASSERT_TRUE(monitor_->findDiagStatus("NTP Offset", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "ntpdate error"); +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/process_monitor/echo1.cpp b/system/system_monitor/test/src/process_monitor/echo1.cpp new file mode 100644 index 0000000000000..e029bc48c6ed2 --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/echo1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file echo1.cpp + * @brief dummy echo executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/process_monitor/sed1.cpp b/system/system_monitor/test/src/process_monitor/sed1.cpp new file mode 100644 index 0000000000000..5e7d953cf244a --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/sed1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file sed1.cpp + * @brief dummy sed executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/process_monitor/sort1.cpp b/system/system_monitor/test/src/process_monitor/sort1.cpp new file mode 100644 index 0000000000000..ba48b612f05b7 --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/sort1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file sort1.cpp + * @brief dummy sort executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/process_monitor/test_process_monitor.cpp b/system/system_monitor/test/src/process_monitor/test_process_monitor.cpp new file mode 100644 index 0000000000000..d1cecf9cecd24 --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/test_process_monitor.cpp @@ -0,0 +1,379 @@ +// Copyright 2020 Tier IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "system_monitor/process_monitor/process_monitor.hpp" + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +namespace bp = boost::process; +namespace fs = boost::filesystem; +using DiagStatus = diagnostic_msgs::msg::DiagnosticStatus; + +char ** argv_; + +class TestProcessMonitor : public ProcessMonitor +{ + friend class ProcessMonitorTestSuite; + +public: + TestProcessMonitor(const std::string & node_name, const rclcpp::NodeOptions & options) + : ProcessMonitor(node_name, options) + { + } + + void diagCallback(const diagnostic_msgs::msg::DiagnosticArray::ConstSharedPtr diag_msg) + { + array_ = *diag_msg; + } + + int getNumOfProcs() const { return num_of_procs_; } + + void update() { updater_.force_update(); } + + const std::string removePrefix(const std::string & name) + { + return boost::algorithm::erase_all_copy(name, prefix_); + } + + bool findDiagStatus(const std::string & name, DiagStatus & status) // NOLINT + { + for (int i = 0; i < array_.status.size(); ++i) { + if (removePrefix(array_.status[i].name) == name) { + status = array_.status[i]; + return true; + } + } + return false; + } + +private: + diagnostic_msgs::msg::DiagnosticArray array_; + const std::string prefix_ = std::string(this->get_name()) + ": "; +}; + +class ProcessMonitorTestSuite : public ::testing::Test +{ +public: + ProcessMonitorTestSuite() + { + // Get directory of executable + const fs::path exe_path(argv_[0]); + exe_dir_ = exe_path.parent_path().generic_string(); + // Get dummy executable path + top_ = exe_dir_ + "/top"; + echo_ = exe_dir_ + "/echo"; + sed_ = exe_dir_ + "/sed"; + sort_ = exe_dir_ + "/sort"; + } + +protected: + std::unique_ptr monitor_; + rclcpp::Subscription::SharedPtr sub_; + std::string exe_dir_; + std::string top_; + std::string echo_; + std::string sed_; + std::string sort_; + + void SetUp() + { + using std::placeholders::_1; + rclcpp::init(0, nullptr); + rclcpp::NodeOptions node_options; + monitor_ = std::make_unique("test_process_monitor", node_options); + sub_ = monitor_->create_subscription( + "/diagnostics", 1000, std::bind(&TestProcessMonitor::diagCallback, monitor_.get(), _1)); + + // Remove dummy executable if exists + if (fs::exists(top_)) { + fs::remove(top_); + } + if (fs::exists(echo_)) { + fs::remove(echo_); + } + if (fs::exists(sed_)) { + fs::remove(sed_); + } + if (fs::exists(sort_)) { + fs::remove(sort_); + } + } + + void TearDown() + { + // Remove dummy executable if exists + if (fs::exists(top_)) { + fs::remove(top_); + } + if (fs::exists(echo_)) { + fs::remove(echo_); + } + if (fs::exists(sed_)) { + fs::remove(sed_); + } + if (fs::exists(sort_)) { + fs::remove(sort_); + } + rclcpp::shutdown(); + } + + bool findValue(const DiagStatus status, const std::string & key, std::string & value) // NOLINT + { + for (auto itr = status.values.begin(); itr != status.values.end(); ++itr) { + if (itr->key == key) { + value = itr->value; + return true; + } + } + return false; + } + + void modifyPath() + { + // Modify PATH temporarily + auto env = boost::this_process::environment(); + std::string new_path = env["PATH"].to_string(); + new_path.insert(0, fmt::format("{}:", exe_dir_)); + env["PATH"] = new_path; + } +}; + +TEST_F(ProcessMonitorTestSuite, tasksSummaryTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + ASSERT_TRUE(monitor_->findDiagStatus("Tasks Summary", status)); + ASSERT_EQ(status.level, DiagStatus::OK); +} + +TEST_F(ProcessMonitorTestSuite, highLoadProcTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + for (int i = 0; i < monitor_->getNumOfProcs(); ++i) { + ASSERT_TRUE(monitor_->findDiagStatus(fmt::format("High-load Proc[{}]", i), status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(ProcessMonitorTestSuite, highMemProcTest) +{ + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + for (int i = 0; i < monitor_->getNumOfProcs(); ++i) { + ASSERT_TRUE(monitor_->findDiagStatus(fmt::format("High-mem Proc[{}]", i), status)); + ASSERT_EQ(status.level, DiagStatus::OK); + } +} + +TEST_F(ProcessMonitorTestSuite, topErrorTest) +{ + // Symlink top1 to top + fs::create_symlink(exe_dir_ + "/top1", top_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("Tasks Summary", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "top error"); + ASSERT_TRUE(findValue(status, "top", value)); + ASSERT_STREQ(value.c_str(), ""); + + for (int i = 0; i < monitor_->getNumOfProcs(); ++i) { + ASSERT_TRUE(monitor_->findDiagStatus(fmt::format("High-load Proc[{}]", i), status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "top error"); + + ASSERT_TRUE(monitor_->findDiagStatus(fmt::format("High-mem Proc[{}]", i), status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "top error"); + } +} + +TEST_F(ProcessMonitorTestSuite, matchingPatternNotFoundTest) +{ + // Symlink top2 to top + fs::create_symlink(exe_dir_ + "/top2", top_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("Tasks Summary", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "matching pattern not found"); +} + +TEST_F(ProcessMonitorTestSuite, invalidFormatTest) +{ + // Symlink top3 to top + fs::create_symlink(exe_dir_ + "/top3", top_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("Tasks Summary", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "invalid format"); +} + +TEST_F(ProcessMonitorTestSuite, echoErrorTest) +{ + // Symlink sed1 to sed + fs::create_symlink(exe_dir_ + "/echo1", echo_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("Tasks Summary", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "echo error"); +} + +TEST_F(ProcessMonitorTestSuite, sedErrorTest) +{ + // Symlink sed1 to sed + fs::create_symlink(exe_dir_ + "/sed1", sed_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + ASSERT_TRUE(monitor_->findDiagStatus("Tasks Summary", status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "sed error"); +} + +TEST_F(ProcessMonitorTestSuite, sortErrorTest) +{ + // Symlink sort1 to sort + fs::create_symlink(exe_dir_ + "/sort1", sort_); + + // Modify PATH temporarily + modifyPath(); + + // Publish topic + monitor_->update(); + + // Give time to publish + rclcpp::WallRate(2).sleep(); + rclcpp::spin_some(monitor_->get_node_base_interface()); + + // Verify + DiagStatus status; + std::string value; + + for (int i = 0; i < monitor_->getNumOfProcs(); ++i) { + ASSERT_TRUE(monitor_->findDiagStatus(fmt::format("High-mem Proc[{}]", i), status)); + ASSERT_EQ(status.level, DiagStatus::ERROR); + ASSERT_STREQ(status.message.c_str(), "sort error"); + } +} + +int main(int argc, char ** argv) +{ + argv_ = argv; + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/system/system_monitor/test/src/process_monitor/top1.cpp b/system/system_monitor/test/src/process_monitor/top1.cpp new file mode 100644 index 0000000000000..56f9243122f23 --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/top1.cpp @@ -0,0 +1,20 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file top1.cpp + * @brief dummy top executable to return error + */ + +int main(int argc, char ** argv) { return -1; } diff --git a/system/system_monitor/test/src/process_monitor/top2.cpp b/system/system_monitor/test/src/process_monitor/top2.cpp new file mode 100644 index 0000000000000..c759ed2c21441 --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/top2.cpp @@ -0,0 +1,22 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file top2.cpp + * @brief dummy top executable to provide nothing + */ + +#include + +int main(int argc, char ** argv) { return 0; } diff --git a/system/system_monitor/test/src/process_monitor/top3.cpp b/system/system_monitor/test/src/process_monitor/top3.cpp new file mode 100644 index 0000000000000..2725ee2676064 --- /dev/null +++ b/system/system_monitor/test/src/process_monitor/top3.cpp @@ -0,0 +1,26 @@ +// Copyright 2020 Autoware Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @file top3.cpp + * @brief dummy top executable to provide invalid output + */ + +#include + +int main(int argc, char ** argv) +{ + printf("Tasks:"); + return 0; +}