From 1f983caf327c4b2802c9ac975708067d9541e889 Mon Sep 17 00:00:00 2001 From: AlbinBernhardssonARM Date: Fri, 6 Jun 2025 14:14:21 +0200 Subject: [PATCH 01/63] Godot extension learning path Add a learning path explaining how to use the Arm Performance Studio Integration extension in Godot. --- .../godot_packages/_index.md | 58 +++++++ .../godot_packages/_next-steps.md | 8 + .../arm_mobile_studio_integrations.md | 153 ++++++++++++++++++ ...t_install_performance_studio_extension.png | Bin 0 -> 142930 bytes .../pa_dedicated_region_charts.png | Bin 0 -> 204009 bytes .../godot_packages/pa_frame_rate_regions.png | Bin 0 -> 39992 bytes .../godot_packages/sl_annotation.png | Bin 0 -> 90167 bytes .../godot_packages/sl_cam.png | Bin 0 -> 81139 bytes .../godot_packages/sl_channel.png | Bin 0 -> 91395 bytes .../godot_packages/sl_marker.png | Bin 0 -> 133620 bytes 10 files changed, 219 insertions(+) create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/_next-steps.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/godot_install_performance_studio_extension.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/pa_dedicated_region_charts.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/pa_frame_rate_regions.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_annotation.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_cam.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_channel.png create mode 100644 content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_marker.png diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md new file mode 100644 index 0000000000..a63388876b --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md @@ -0,0 +1,58 @@ +--- +title: Install and Use Arm integration extension in Godot + +minutes_to_complete: 15 + +who_is_this_for: This is an introductory topic for Godot developers who are targeting Android devices and want to get more insight into how their game performs on devices with Arm CPUs and GPUs. + +learning_objectives: + - Install the Arm Performance Studio Integration extension in Godot + - Annotate your Godot game with markers that give context to a profile in Arm Performance Studio tools + +prerequisites: + - Familiarity with Godot + - Familiarity with Arm Performance Studio tools + +author: Albin Bernhardsson, Julie Gaskin + +### Tags +skilllevels: Introductory +subjects: Performance and Architecture +armips: + - Cortex-A + - Mali +tools_software_languages: + - Godot + - Arm Performance Studio +operatingsystems: + - Windows + - macOS + - Linux + + +further_reading: + - resource: + title: Get started with Streamline + link: https://developer.arm.com/documentation/102477/latest/ + type: documentation + - resource: + title: Android performance triage with Streamline + link: https://developer.arm.com/documentation/102540/latest/ + type: documentation + - resource: + title: Get started with Performance Advisor + link: https://developer.arm.com/documentation/102478/latest/ + type: documentation + - resource: + title: Arm Performance Studio + link: https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio + type: website + + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_next-steps.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md new file mode 100644 index 0000000000..5c6d2e37d6 --- /dev/null +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md @@ -0,0 +1,153 @@ +--- +title: Arm Performance Studio Godot integrations +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Arm Performance Studio Godot integrations + +[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a free suite of analysis tools to help you profile game performance on mobile devices with Arm CPUs and GPUs. Arm provides a Godot extension to make data from Godot games visible in the Arm Performance Studio tools, [Streamline](https://developer.arm.com/Tools%20and%20Software/Streamline%20Performance%20Analyzer) and [Performance Advisor](https://developer.arm.com/Tools%20and%20Software/Performance%20Advisor). + +This package provides a simple way to incorporate annotations into your Godot project. These annotations enable you to mark the timeline with events or custom counters which provides valuable context alongside the performance data in Streamline, so you can see what was happening in the game when bottlenecks occur. For example, here we can see markers that highlight where a wave of enemies is spawning: + +![Marker annotations in Streamline](sl_annotation.png "Figure 1. Marker annotations in Streamline") + +{{% notice Note %}} +The Arm Performance Studio Integration extension is supported with Godot version 4.3 and later. +{{% /notice %}} + +### How to install the Arm Performance Studio Integration extension + +1. In Godot, click **AssetLib** to see the available extensions. + +2. Find the **Arm Performance Studio Integration** extension, then double-click to open the extension. + +3. The extension opens in a dialog box. Click **Download**. + +![Installing the Arm Performance Studio Integration extension in Godot](godot_install_performance_studio_extension.png "Figure 2. Installing the Arm Performance Studio Integration extension in Godot") + +4. A new dialog box opens where you can change the install folder if required. Click Install. + +### Using the extension + +All functionality in the extension is provided by the PerformanceStudio class, so first create an instance of it: + +```console +var performance_studio = PerformanceStudio.new() +``` + +### Adding single markers to a Godot project + +The simplest annotations are single markers, which can have a name and a color. To use them in a Godot project where you have installed this extension, simply call into the Performance Studio library as follows: + +```console +performance_studio.marker("Game Started") +``` + +This will emit a timestamped marker with the label "Game Started". When you capture a profile in Streamline, you can see this marker along the top of the timeline at the point that the game starts. + +![Marker annotation in Streamline](sl_marker.png "Figure 4. Marker annotation in Streamline") + +To give the annotation a color, use the `marker_color` method: + +```console +performance_studio.marker_color("Game Started", Color8(0, 255, 0)) +``` + +### Defining regions in a Godot project + +To define regions of interest within the game, you can specify a pair of markers prefixed with “Region Start” and “Region End”, for example: + +```console +performance_studio.marker("Region Start Times Square") +# Do work +performance_studio.marker("Region End Times Square") +``` + +These regions are shown on the frame rate analysis chart in the Performance Advisor report. + +![Regions in Performance Advisor](pa_frame_rate_regions.png "Figure 5. Regions in Performance Advisor") + +Also, dedicated charts for each region are appended to the end of the report, so you can analyze each region independently. + +![Dedicated region charts in Performance Advisor](pa_dedicated_region_charts.png "Figure 6. Dedicated region charts in Performance Advisor") + +### Using channels in a Godot project + +Channels are custom event timelines associated with a software thread. You can create channels and place annotations within them. A channel annotation has a text label and a color but, unlike markers, they span a range of time. + +To create a channel called "Spawner" and insert an annotation called "Spawning Wave", with the color red: + +```console +var channel : PerformanceStudio_Channel + +func _ready() -> void: + channel = performance_studio.create_channel("Spawner") + +# Annotations can then be inserted into a channel: +func _on_new_wave_started() -> void: + channel.annotate_color("Spawning Wave", Color8(255, 0, 0)) + +func _on_wave_completed() -> void: + channel.end() +``` + +To see channels in Streamline, select the **Core Map** view, and expand the **VkThread** thread: + +![Channel annotations in Streamline](sl_channel.png "Figure 7. Channel annotations in Streamline") + +### Creating counters + +Counters are numerical data points that can be plotted as a chart in the Streamline timeline view. Counters can be created as either absolute counters, where every value is an absolute value, or as a delta counter, where values are the number of instances of an event since the last value was emitted. All values are floats and will be presented to 2 decimal places. + +When charts are first defined, you can specify a title and series name. The title names the chart, the series names the data series. + +Multiple counter series can use the same title, which means that they will be plotted on the same chart in the Streamline timeline. + +To create a counter: + +```console +var counter = performance_studio.create_counter("Title", "Series", false) +``` + +Counter values are set easily as shown below: + +```console +counter.setValue(42.2) +``` + +### Custom Activity Maps + +[Custom Activity Map (CAM)](https://developer.arm.com/documentation/101816/latest/Annotate-your-code/User-space-annotations/Custom-Activity-Map-annotations) views allow execution information to be plotted on a hierarchical set of timelines. Like channel annotations, CAM views plot jobs on tracks, but unlike channel annotations, CAM views are not associated with a specific thread. Each CAM view contains one or more tracks and each track contains one or more jobs. + +![Custom activity maps in Streamline](sl_cam.png "Figure 8. Custom activity maps in Streamline") + +To create a custom activity map and add tracks to it: + +```console +var game_cam : PerformanceStudio_CAM +var wave_track : PerformanceStudio_CAMTrack +var ui_track : PerformanceStudio_CAMTrack + +func _ready() -> void: + # Create the CAM + game_cam = performance_studio.create_cam("Game Activity") + + # Add tracks to the CAM + wave_track = game_cam.create_track("Wave Activity") + ui_track = game_cam.create_track("UI Activity") +``` + +To create a job within a track: + +```console +var wave_job : PerformanceStudio_CAMJob + +func _on_new_wave_started() -> void: + wave_job = wave_track.create_job("Spawning Wave", Color8(255, 0, 0)) + +func _on_wave_completed() -> void: + wave_job.stop() +``` diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/godot_install_performance_studio_extension.png b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/godot_install_performance_studio_extension.png new file mode 100644 index 0000000000000000000000000000000000000000..e78b7ca25bdcccaec086ac62fccc07ccd54ab4ba GIT binary patch literal 142930 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

e{HL$C;;G@NMbOc82UZU9=YrG6F_+>?Az{ z?Jw)7R5z@8xp%aC%fAV2R*PWACJkq$8SQ?x$TdlNcC^q+6%VN@MOrp)q zcnbM>wAqjk%A^0KU#M-eXJE-Z`CN9;6!v(YY@u~v-4q&*d;GO9Y~r+hih|f~yRz$Q zq9I4QO_v`$>v&7`OiPhcTbQMiv%_s5pa9peswGXNgMHfWg4)@0HaHb_g0sQn71;UjO8MxJO{G*X@`uc)%8X4cy2peb5R)yKP9l%3_4D?O(s&wt6{|7i9 B@#Fvi literal 0 HcmV?d00001 diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/pa_dedicated_region_charts.png b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/pa_dedicated_region_charts.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e73ab3f239b42c13ae9d132e67a04fc80dc6bb GIT binary patch literal 204009 zcmce7cQjmW`|c!&Ac;hch!(xK=w*l`O0*D!(M63Cz0QmlLUck9oe+X3G5SdKC?h(9 zQKI*5W|T9?`~BYUtn=^h?6s^I+56ddyRQ4XpS>qcQ(f^U@jYSy0B}=T>9H07aE%23 zz}LQh4fmJT$!BG_f3CP{DLw*}^xj{_eZaStSCa<-%A!e*%?NOxiQXvby8-}YZs$K& zrmPse0D!YR<;U_byo}dQZu;Fn1dpOC8Y;K*Nb_G0BqmjR&J3N2)*o$jKP)X8lML$_ zP5M|idAB&_W0=eH+xa?o#h%|rmeGhs1&ZHMkScr26^^e=!K+zDp%nf=lgu_I&L$w* zK#P&!odzT4yQ@cxfzdB-lOCTgitVOOqPmZ*JUj&7Pqz9^`G8Fxcvx9mLxiQ^X`7z( ziPv$)UL101&tv}i9pJ7gfAyaagLDK$|NO4$Nr8*Q2&E2{zlfO3g@o*?rrgTxiT3RZgh)R!*4SPy`#p>19Z+g0r29reTmoY!* zB~B#!u8X}|YQ0j^I!2%5K%W?^d?IwYfdA*dY=SU}WO0b9PZdMSeP8uoeM^*_eBp*Q z6%#?&hO7SMbiRBmBeZ{Jm6z*LsY!XMx7gYJ`7`1Jj0i0!E%5pqmD_XbESulAzgjY+ z6KdB^dbKpv+&@%TckHe1CN0C!5Zc?>@|E66c5v*dj=22b_Z59?_Z^z#{!+1^w=Yjs z`YRD@l%BH1sL9Ih**lzunyoc7G{_22VjU`)uG|qtuqpi4*N1PZc$Fq%V%Mc6AA7A- zJIRTzNmdAijTUjCWqBG(O%k#poWJ)dX(YvYWUx;y%?;pILyrl-|E%(N zhK!UhU191ir}WrJs`8C+zY|8+e>y=#Qi zJ?76TSQ4k;+QWCP17J?$`YPk07W1%>3T40cDUvVzR`(GXWUGu+9=1c|WP!^_oHLE|?tooLV9O&uD61{f z`XKy9a8+z!&TH6SBpSxAjmqEge6`-|x*Q((*ZLL5I}|J)O6`qDEq>cSX_hxp+(jpU z^2m!|pGr_4$SRU@&xrVcrKRBX%8Zv3D&2x^DCVtUeRBOUaa&U zLNtD?Wd!@sC1uYLgb^5?s;o@O+Ub+zS-Qim7hKe%l1gheyTmdcQ2#CBZXQfvu(f(P zb728;npe>SxAgm~-KMw)%%%CM0sh_&s&F?mmtU zp*MF%N9;)#w(A_8@(+G93;>3YYKP1CI9@a9J zX?B@(KB`0v5-fvNH4f9SEYsX{0tpKp6gIAO=r{KM@R>?Er&8P@XCQ%#%V2RrdXYBS z@GF)OZAz8}wyxbFGJ>$_vE|pE`t)n>H zn9BC5KlTgKL3~nwF0NHybo=H>q&8T&WDQrnzSnBaj|D zV{Gd(?2^}6W6|$iDi#fs7UEFAcsGZ2d%UZ=`GRMzO3xPMyB+*>V7L0X%#CPucFZDg z(Tb-A3g63UV8KH?RFF3}ON7S}*k*ij&Et+)(^Ir@T^XamRBTRipHQ#3J)yWX%71W2 zC&sHmQ)QuaOg7yx=3_mJ0%2&LZi2ec<{n)GM{Dkb=J|m<;feuD7CvPZ zY~@AF$2ukpX7)T!to-tE;$f51zT9%UOupqGmq?=VPUmIFDE2rn`WDD>i5Hr@m$WF^xwmG0m8Qaz3$ChPT8AvM=U zaK5XF?Av4IT$|u`I9(6oDKp>Ar0BLs?>jGp?O>HogAsT7p0k zjQ)-7?Kpe!SrhY^D#n=zF_*`Z3`81T5lOEm-{%amXSYXn7^HQ0yqBEG4yX;B)ju14 ziNp1apB2nM+0+wzzrk6z?89kjXr(#U3mxh_eue1qcVkx)XJdEpGLhUyyg7-sAoP{V zb^eukQN&NDB}%fPXNIR^+`R`iNZwn#;5YES^ujk`U5~y;qra`>7BTzTfre0XRj0%R zN`HNHPs#{vX^rpqhO1jmQM-~P6-X+(8LmOUna3V<$%&A%3!ql3;vt(Y%R9B)H&fery-K2=X`~=et3QbXUqGyWgtJF= ze1uPdzB4{IL%(nDLgZ+c*;lNq+(kY5uJHz`vHR&p4dk<%NVHE>OMU6pE0?|q@YirC zQM9Wo=`Gt`u|Aeb6kfx#J~-_9)qc%#T6L*=t1GAf#Kv1PEeP@mq8`53X1R1k!%1=L z*FBlY`DnVtfE??Ik!Q}o(DonhHu(L(`X0S=!{{kb!1R1f7;Z)Zh4?JuAzE-3`D`zr zm*e}CH=b>baT*b(AxK8>*?N^UzHDXFZ>42t&IviTQzUhGj@tymrK9gB#y&(uZzUsQ z1@fU;$Mty7mzytn35cv^(wwW__RO32rL0?%IsKsY<_pxnZd()hIAz|mN^ovi-%Z-Vu2%ajAaiAd#)+lc69Wwrbe^nWgtgd zstK12LXH(R;usBAd%nF!wCrOJb8GZ6U^6ed$B{0}vyKrJ;La$Y@IA9fCqDg>&SYjx zsVQg+%3>4*%VX$w<9np?UW?B(qV*6;Fq2&GQS?O72dft~ObREplan9~{V8GR^1U08 zph01_!fMO|mpXQM%FGm52h_$D{uLtHI<{@Fy{5bjcGj%TnB-n3O(fsu8i%!(S|_d7 zT>nhPp)^=|Y*+IP`TLeWY%`GlcDX4Ih8xIqS~Z>r9}3pnpn$qsgGHAVvA@YJNP6-- zMv1z!_1)lL@;KxHD)E(rDJ~Os-`w2We&utsu3NvdM;YsHM4iRC(WyCOjwVECyq>aq zF>omT&}|W*Ppm&Kvk=l%^F^rr>LY>3|E$;fkX`ynLc6CqENI=bZDopCDDFkD^Lxg` z#Rnf#8W{yM=HW~hIdeiTf(stHBxADQ4e4fF4#@deP97&YlL%a<0B|!lCoq_rTa+&0 zv@F;9+6w_+Wy~>>ZmhS~@umDv+xUKkI+M7Y%~=&gyy4a%&-8r1f>{@MytGsBcUyPX zKP1X{G`|48dGSojFW&~p=ZYJLq zDP1XR>5xc%2li07_Z`>sN%~}2jc2-{8_Fw1%!a~3<=Q6tIm9&9uWNe#X`)|wcC3}U zmABWbDGqL`EHX<97S2vh_WRbhy@Gk0__!mp-?U~uCm<3rX_&V(L}&Wk_I&Ggl-KVN zGmdG`K@44g7H?Y8&YN1E9S&e-&&`L`PjEe-q=gi?_PgFu-BqsEh)SZbzRw_)x40)A zZf(Yyblxf$P(#A~^Du24Jw=Xxq_)3R-1|_2I;&EpENJGQbXZ=hmh_vk28W)48*7q0 zlStxn#|o7{n+ZCY!obg5N~$IgHx^C6uXJOo4MIZ=tb4~G2W!0F=fbBf=D8(G(qq&6 zgSvPTPXxXj$Y-;dp}F-74xD=ySFXPe#J@~XpX!cwjOJ%PrA-TC7va+yB4Hsx7uDK~ zdmOCx7CB#V1YeF0oAvehRl9gCuMTLmwqf~iTL3SrBcaVV_uZ&LUEIaQtJAzIIXpWAs?fO2K zQIg*37-uJz41j7%Zj3aitR<@DS%U_7(UQ!}{I@#l2CWP5w;Rv`OaZ#9uq6^pWGS`JsMa=gXj@x8{=`Lf`6xgXR z|KMYv6Vh?wv&})=4e2@deyrtKvu|GA8#bR1p9)!p2V2K)10*L`tkv6$C%L;O5%0J~ zKhEuSrBG{65dWIzL1yig7f-oJx?ipJ+Nj)ZDb7ia zP0`*RjqqtoKv5(&U|7cUaR?R1mGpU>X{PJKn>f?jbQE9(pvs}|P3O}m?#PTYG+`<` z_&|bjkDdJ@ub*RLf^LaD`eRu^#j-~;4+)e2r@qJ+7vgaEAUpR6trF@fBlK}&>`H}R z?iuIVny`k_p%V|(O34sX2J{Yqk@ zO~G$2Wo<<5{~BCo*gi(AQO&w@9&DOjvZJDLWbGEIMQ?X*rr zOvaSuu)msi8!x(Ze}K9RQK+OOM2)zS6wdr?W0JQapS-szL)@rQCVJpBEhrI5sAdwI z6{MJZm^m+MU^gj=Z06m-Vl9UT&U-s)MRFqxULF$U4GS$?UPD`PDh*noOVi^6WSaY- zd*%*$>>MKBHJ<7zilcNy=r*MqD%4>Dc$fLqjBGW*DMJp0Qij+Prw`=c9DmR3oA%dv z{V`px665xbenMV5kd(W%W2~=}5<*@T*n*Ra+}B@_RlU(C&1ih^HjQ9;!b3>hVb^RB zhe8DBTw$a_Xx?sevla*V>D$2I9B~iTVRT06xE0ox=Di^&j#_`m_n!ni#y2hMlBw=_ zw4WC;YvPGDg}C#kzZ+$*vY=*Wa%@;mb9pb2b}CFqV{H61dv71}HW8w~{c%2EWI=!5 zPEtdB-GeD5SQjC;BnW$p)i!=^I>19f#M(6v_tFxTewnW83;l(Zdpp!GyWk>@Ds8L~ zDWP>28MKl~ds<3+={%t1iDpcJsBv5`m^zzicy(@`oAT4k(=FrWaZwH#Bw^m_@?`%) z#`BuVTudEQBam5aS z$a+n2F~viy^T<>*NBSDaiC})TIY6XVUZRW5XlfjjKROSEiA7#nmLXSvflzk-^Q|&< zPNHn~$4*c}bC=QfuSk`YFO0EcJ5tE#?KjS1^d&n~291SCb}#pqlywoRNB37e)J{cH zFg5r7Mqq_Yksyq&eBn#8kN{PNzpfs&TS$DB6|Udak{ZR_Ih*-ib)G|?$C8gaJ%GAE zca{`4xDT7=4MB@BW`bqlYQ}Q<_^hCHo}5I&ehR94n$-IroAiq?JU$gW$bcYDz5prI7k2-0~H z;o=5-;$L2#7BdeyF{^xEw=kx2&e)wSMF0Ar%vqm#NV>AZ;5hQPvs~<1ba%FFTWk!G zOrCW9-krTeBkrTl#-^SAK*swyvG29K-LjqJc{&Y-gsGr8p&53|d_IY}`-$mk?5rh? z&+7%az{rC-Jr=Kly9teRNqd^_J4uALe#z^@^r0It;(qNnvch{eh(Em981vAqt)fdj zRY5>B5%0v^wJ;cx`DNK!kfez?4>--ZF{sc#p?;eX1oGVOapG0XT#n+4- zW?`%2?4K+rTn(O*Wu#_#5hRwde>#-WjhTv7LDYYY4I5z38`0mmHF@fY+hH)`r;qf&wso9l;<-&3*ly@_w*E!oi1Q|{ii!(${_S$XGhI;4#oc9x`x z|G|aO6ZxwmT8Ki91bTd9NH0O3_=<=2>;3f~x})^!q?gNOnsF#)daUS^o#NG#r>_Ed z-r=@@b~5OGi!e6iNK5@gnQRm+0{pFI%>B-1xAg1Q-NXx5k<+dzpq-Isuz0 zr7jngi_c;V@J@-Jb?<$wNS>UY@Ss)j@2!?K|5x@9ce#`(tPx$?UC~|Kb9CkV#TuR3 z`LZ0y-s8YENvxERPqE2@qx!1gUxfgWOCNd>BksNLl)Kpz-34VZh`UQlhh{IITQ~XO z+IoUX`x|HgV{{>(l0D5y?)M{2&PL%=kk8+J3IKr7sgO&_UK(>UY_2e_33L0;ekeM= zmhrdm4od(1jjB=TDd~Lis?>znS_>&b2qoV{asGdHRCgZe$eSP5@LvljRu&XR(;dph zS1dkgy$*~ro?46g%j*EZPL{d+?A{RXaCRVXcc>mR{7!1ri9hyCF&eH|f{0iaED~Xp zf$_yw^?aDh@ThN<<9(gF7qJ2)zp1nsXHys9un_@<9t&VA`|v&7f00>FRy&XQL+*Tc zt=dm~-OjaG^Bmc26J3eU0Bu(^ocP#IjBYo8jX>X|O8G}^(jq7r)S`6x2OF?nC~6wo#)EfI-rnWvl#Dn+z^reg zkV9$dkBRsdfj4@`Sc}kBRg#+vY>6OV!J$8cRa17@c)Nufd1QB!(X&^b#WKD0-M6Lq zjdz3$4d1CV*8(dyn+NyGjjgcK<1L%6tAZv}>QbP?$@j0|8xGX!QYj9fw$hYLVz!3M zQq*;MDe8D%JdgRt=TtE#cELn{w9Mrn8EukUI@Po);md=;Tnd#y1Tqe zEDg}p)>}M0#ANP$;bA|x7HaMwRbAv6KP70W_Y*Fl5^YFXvsbI?zmSkAV~5^yD*bT* z#%`tA82YlcKJ|DQiq$GoyX=kms> zSs?JA$g-%ddfnqGiGkmnVP_kPBWnE~mQmE7)PH&F{zRrSP%dzn7{ym5Gj@4$%ke5q zc#u;b-6}$mA~JRjmWhdwTj5;a@WF+@DNCXFOwB_Ux zwxQ{OY=U9bn6%JJw!yi$c@hnCqP3Ia03Qz4CnkQ`@qEM^8ic$->L&uf)i-Xr=pCt}S0(lur-gEjqHWu>=SHiNmV9%%79!>=Go*U9L>-VL z7Yvs2)Lhx1_4iw;>2)>M~fxquix8FYuwS zx{C+|8a1vcq2~W``;$}80lkUMOQYdBgT@}2;q~q|wU6TKcl4o&2XErFXSR7d#XM7b zrCZX%ibFui-sEr%pg_#DSI+zbDQN#+>VEGnL=DlH&)@L`6KANRt7(Hb5IobIy#J-I2 zS{Wo{eu58TneyMy!@2xRh6Z(K_gcvYo%v3c+PPw&W}6k2u-94H(oVr5IeXr z%^@a8R-ulEe696h0IljeSvwG+cGtVv0r_Zp_tDR0JM4`iQEX zUO(pGi?baDB4Lh_n&x?bn$KA-%k6hKbX2t*YEo)NL)LclJmQadQ(3o{;PgmcrUUQ8 zaU{@U{OpDZB5ZXmJ4N(e$)R{6_*s|?(<*WCz|s8k0S#kn=hX>GCqZN!#t(VOH^KM4 zC*Lk~OF*V^9UHe$r!|AMK!rX=GS^Dm8Cwinw{B+THGo$d1W{i)q=SL&Xer0K$a#qI zgol2sPh~L!>rQQh!vF*|;cn%C3>LkZSszZ+m&S;1^04jcpkS%B(rEgXGS_3VuXE$(r-&Gi3I;zmRg05P*Oe!> z(wMu%vuh7;J#BANZ*c1kt@i*ATz6jRMOiUli)g&=@u6UD%4T*A&&<4vK`$3FbLXfr z*Fn?_M8qHJKr8Uz3*FpElI4{7xTNE~fRRPvj4XuCz<#^P*?Ny_L680Jr*AziFh#f2 z2*(`Gkz}2VXtnV=eM#e9XQm^{(3|v8tpI92>M|}X?%#CP+EhFb6o7=Uj8V{U+3Yow z{M+@F5b)wzlcb|zgrTkZyQ}hRr9Tdd9iy zjvK;B zOsZ3tygNo?+dNvaS7aabYYyA*h-6yW(}pG*`GG(Syq_E9KHu>I8}HgyJ$WNjJFvgl zc??5{B8ZS`{Z-Uc&?kqk|A~t(M!jIh4z6YUsd{FpMDc9b{Los(W{ey16a!W_G`SE! zHuWumEpNY!e0>|7uL0KlyjZeSCLPK@^_otMuQqyOR&_1~a(LWI=f}p7aE&x%u3b&( zZuM;Zon;cT4+|p7{l{;C1EP-o*rNNoYFAs6xmQmP2L#Be6A@pLJ{l^cFIiYsyKPyc zsI_bjv0Hx}_&;4QTo;~23LW{3Z$86W{OM`Rrh1CAd28|E==zUjxSVILdO@#+KTdqc(T53v6LlJ;IvWPTeQMyt4|iNK8?{L#>-a4Fg{!i*Jw6d%p) zdsNUjMYrPS;uNETgB3&w!hVIl7awAQ+0U^xz<-(PuxJjVzO&yLv@UX|7l!T|Y!Y=@ zlLH-~r~4Tns%|PAKa_E99`a<_0MD51qHiE2Z`P+{&KcUC;PLQOJ8sv8sN3mhwWXlLe33xp z-m2jIX?OYBkRPh>AEJ3)#^{V$Nt9zU>smrAG2sy4kc16^O9`mwdF>tf{=ulG1dZ>- z-I5*p)*)Y|LKaMJS~W89ILNh+HdR_{Q2slwe3qlOX(Kh*^q$)}_k7WmB z9lxElz3RS859}5ywj<}r0!bFUGwHp(4_Vxui<5EJ-~19MYiXD4aJW&`lPXnWsXs9i z=^P&?pmO}iDfI?a!#)GFYK;&3P`)Lauz}U;@mL3kfWb-a6;X4VrR>#2uxZ5LgT=W93t(G#PdX=?Ix$$j~gLeFRUk&1ABO?xHsW^&SH&R6Uy zjMrUAt;k6uL_SD=i?FWiQH=3yqJ@}jeN`7x?_NxKp~WarjN9mC7{va}pb>U7t-)<1 zJ~I!^(=gStwhqujfRYQFs32K#^ip-K#|>qAM`a5A z#Qb5zJ1qS;xz~c9*E-#C z`*Fk;s+U`*w8FpIfys&{q2oBDO{bMgM7^eXZoDsM%lq@M)!+L3Uk9LO)xpc01p zrI#!2;Vud;&j`flD$;zZZGHGz{51{WUi1mg`OO*ibiX-!508~$^jH1anon<>UmcUX5*X~Vvw~7Wr82;% z=(}&5 zo0#tEdS~1CdZ8&M5DJrkZCZ7(hRA!QozO|R@9QVmc`HQ!=gqGjd*lCk4b1-`$3G9l z0sgf)jQ{Mr09K;@d4>c46i5-1of~_8WN!R#T_E>Nl4TM$#RY?GdrK6V*m{?`cNNL%_X0f${)QPU6YzSHLB}#3LJ#9 z0v_HYAj%~0PV@5|V82(G1&OKjVfuOg_M8hxLjA!~@Dl}0Fcr5_uI?8`vtL!XNcp#~ zqH<22F=I~_V%&H>fz9A4D11N)5pJ3J1nBW&Nw>qbZpVC(Xtg!bQR&;>KLVuXLteco zM3HTw*@m0KoYWnTd({I6q3&I~GcAvn?4SESVmzj?Gae!(k&)R?N&j3|pSS&qgSYOK zX(vSxxZzv>I9Lp_6sl6_tzDQ(eMtE6%-{+ zZWI={DZ_7tvOV)GxcO)^x-x@&$|-UhJ5lwn8}#P>u2?wc_z&s{U?nUNzt3($UH8oE z-SKD`+HBTi&sdRuBlv^?f6A?ArgrWyRH~lgE`)FstZVCca@tQCx>c_ass32cfPZSe z%5baAx^CA1^L(}s*jsNoG?x^D1xo+Qpnf@AxKKRqEr^^r;jWpy0(c*^Leky%BM$?} zfjVQ~AHkVV6f&X2hweWh+Kd13|6sZ-8a-+Q)-n>b2=CBj; z;WPQ^q$y94l+#ntwKLrTB7Q~m=CrieSybiwd0}vX`)z~#g>P?sk>eG|Q`5Cq0hN+Y zaL4t{iN?uI(x2dhu_TuL(x{e;pb_nTsErl@ij5{+JG(_n!l$70ws9aW@i!{DdG?ep zb8!+>WplQy4(z+tR*%2X^E$_c7XQoxi1I2GoBU{bEk=TvOzu6A$AmKQ4TV!RGCA~C zq0Cc4N3_`;vnY$?bnMv1>$b&vKY{A1D-AOYB*P3|tPA45w}aNFIeMJF@9M7C2Y=T2 zauE~Xt&&@gIWzmDzhyy!*disArNlQ;EHex)h^d;c44PwCLyi;HHV*~VfE#6OF-koS z8Pfp}?^C)Nbl6^6qbb8Zx{*)pUB}4|_iRiwGSeP`y}Um<)bx0S-_kH<1IWEDW6;Kw zw(m33!x^5fn5;L)VX~@ahb&fMey7JvK#_g@Veg_o&)VG?et7eJs>99lT+!cGGZ<1l zEk1rni9p^zmPM5t0#-tCRic#*qWcujE6>QD}%( zI`t-@#+IwwV~CsApmhS&tL4m;m_JlZ-R*dK?|vRb&`>Yv`!1P%>X!KYbo(s;57%&R z&T%QbWIVk-NdF-6Os1APwB;Uw4$M7aeb$^1n@VLqU1oM6_bqoEl&~tXI z33TdCb-+x$!R1>xlkrMr%n`%Gh3MFwX!6~5xoN_1wFy!Z5pWl2>K5tEyknXJ22JHb zYgS5@UtJ~f%mL2XbA9>i+aaG}md~~SX2Njtbn1p(8vSkaH)omGXV(VLv6v6L~h%Uk(PcHn>>h| zc3g&?T3-XDVS9uXL{R>`wT z6hVuoGZ#vFa#AO4ytn&v?i!M3OCk|*<07e{`kz-Lbc_jq&*;De0hwWAQAF-Qvjg`b zdXmJp(!JCyTqc)M_9uz_wjZCI!L%e)$i2y}}lkC^Nnr=RDYP*PTCzxwsfcfuFa8Nw_(sv*Ugjdr?^LjW4Ue( zmay9|Mfa1lL`f>^Bs8YrUCqs47n_sRBV(xf#-hvz z44vW^jrRx10gaM-v`j~^1|T=sF*Ev*Wxsevwr4o{1M6YhMrFjjNK)tNX5Ze`pSxK} z6_xfYP8Je)U3BS=Tbptq?nF^MO&|q}Kh=!K$1=k5gI-a|Mo0ri8}7|W!nISS?RK5! zM;UWxM|}f6vU_vQShG3OXl(4v^DgT2vnJBaChIR|3(?<}j(#jl43^(rkA+MXrct|k z2?#zvmELWq2bey;zL)$o7(1(kDm3w2K7CBO2~pc;_<{Gj0!YkG-QDOgnYf5IrzgF2 zYu_ONt$vTn*l}0*LHDWVnd4SI<;M(DsbFNM5!IsmkY^~8aa6tbr0VYO-Mb@Zy>Q{R zm=t4Mnq&07EN~*^2a2pS?9-CpRe(X#hz3E_9WW$=X89S<$rG)!LY5P&>-8hapYM%8 zp_v-IyI2k6USP9%Vo%bbXW~K^NWEgS@>J?rDx0D+6+@%;%X#0Z)$NuPuSU+$T57^?0RZ;`PVWN%k1w8jsI@#ZE?{}g z7~t%Y`c*8R%2B9UNefp}@id-JuAgzQ>QT|3NB{ueE|g`;qvePWHCjsxjsU@Gu>tQb0ss%iE+qRcvbz94rR;e`Q)n+#KOqrr?l53Dcc2GX4LFB` z@NsD>j>hHGf8i-k?gA=fpVADLV!3XX2A`j@uL!*bkZZh5JK~x8*CYq) zeG+R}r;o6*vyBC#?MxK(P?Tl_nlFD97k5lH&UnDNU2^fX7gdER{^8a#&2}b&+>#%& zVUyOn$db&tOMr_cEqfD%M~3cYq^Ov>*=sFo7QTAoRV}j|i@SYH18bdZ3=(krDb5JM zx&QuD)04A5s`G+;-xCT4+>!Au_iMA1WD)RR8zbBICIUP^4}P_tV{wb z{|QO7BqO^kcW`;a!;2GWaVJoDRB) z$0mOWNlRj(wP$lXMs-lbM&HBGKZy-M*0ZitDF2!746yUec}o;M612V(&YKuFqK#Ruj6 zd_#7(;P_Wq-F#3f^l9VSkcI*2FKS80u|w^h#u3M)4DUITom6%>-(jQ-uM{8UpI6%s zoV{wxdAE~Y6G;FR7YP8n;i6@6j@Ao6ywlVZ=UAyy;tD7&k+x~eZua}h|MGZtTiyF; zf=WV0r}6fL2?T(CbQP~7y_mH38NlYoe_)Y^U++^DR2x1G({S%3B|R41K$tabm*okTeQ%*mq* zF69@xZz_q{_Vk2m>fSsF@tf&^$M8~ncA}SwV3RLq7TS7j4^aRr(hGl1UjLUr5(1tB zzUqOJ15m_=k@*rBeIhC8$>-zsNuZUCKijND>ok8?zQ)(2o<&#<>8`E=rgzU02EI}$ zdKnzs|61(*;GeID(+d{yIWC8w=wBMQ&JvGL8W_sx1<1d*0>@znkke74oh3B&#B6YF z>%e^SYsWe~8<|Tl5&z{SRcxx5Q?2s0u=e8osuPe2c#0_nk;a6rTga(BI)=uSYXrr#eLfTVbKM`mt7=dUrBx2^Lpch~ zZ8!*(oT=kj5LdgXkGN&!&v|YG$8!c96BD0&t4^l66v_`;^yV|x&w}>>A8mS%^07cZ zxbx1cR<*~VQ3m;d-ozPR0Z&TI-Gs=z;I?Y}x;lknCy@clg)KK6OOI9ThyII^`mXY6 zn8d#y(EFo-@OyUJ8j$gwevhn}GQ(?bcPEJ&Gr3U&BY#W8_+!kWdiSESV{c83gLezDf;^R*sINU`RJTWqX@Pfw?! zUy{0nwNkFoFv4ACqb+e|XnC;kiNe}xsrZWjtjx5KU$iaI_PNp3W{npu1paHIn0j2L zaGaw`PX4ORg8^4z7q=ZXG(R)+0o3}Cu$U0mG8>(77jtu20;c2Gt=2U(w(7GA*y)DU zUHg!^G@7e*Z({a}jcyf$kN*l|#JS4Ay@hm7eKK3|#B*t!=$x6#==;df5teU3IEcwI z=4e~b_jijlv;w?ea0ZysIs&_dh%UJFl=t6Dv_W;7PPv8Ub?*0VfS(l5_wUAt~mPS@n5ZYQX}MR1Xxyg4b$xYL5rsgzhtbU@Sk6bl&T)Ba;W=uDD?Vui(~2 zbY;2uuVf1TBR%{hzP#ERqotmYioH1;q#ambeLT7f=i^sh`we3Dx5FtHTs(?!@wgZC zkILxiPy_pZ_MJNAMq6WnW-Tp;`~VM?)&-omx}U*(M=HPW1?)DS?XxdUp31_HImIkWG^4za!826Y2Wp) zXio{-88+dKDYiMx=EKVrJ;SAl^8z$dIMCcvLw$<|?O{v@{`4 zS9PZ!a@@2Dk#uzBkfMzAt=?*$v*H5h2z*82%kbyoY*M)>5@y_R8!79FF<$+_F8|PV z!h3}tM_9}Q>VRS{pQ_xXzELlwv*mJDk+{q9dXEcd+_`j$(ZJcjrP{0Bxjb9#=XL}u zCQQfwO`MhPUViv1Mzv?M4BV&6%O9gF`5^`Yk%UpSzLyEx$-io%4D2bvbTL z<*+EVAA4_;nv|gL2|@ioZve*1_GNHk+rDs?ALnc!uCTpduYB@bi$s7(9}<}hwg9JK z2J})eHQblqgezFNDCh%;9&&@=@kxN&q34AojRQoB=HbX@ojBteXa;CNDnw*n*2+)6 z=~jicJ-G=;>BCW+EFb5c+I@vR`Q#6mp>o1``#&6a_spRZ>GMYU_InA)@xDpYc^_No zNyVfB9^P3!`P?;;`vf=k9Bt2DmhJ0*UkqseK9+sXwa4AD{4Ys)h#rt`r{e+HOO0h7 z2)kBbQm_2MyTAv8?cewStgo!)rUswr5sthhrK@ z5k1)4US&Uf0R{QDUP1{T_ire5i0qF}0lj@I_8H?C-?>!M=`Vt9{hvf!pf2OTPyLRP z0B7t2aOc?^rz*e;;Sx==k1t3P*!gcA^=CL=W5Pkki{<(Q*;90p!#M(=@BLffUMy?uF=_(y0X0`2fpdJ5)-B7 zyr>j~qm^dsmxcK4K4ZGAt zvlzof{EN0EwoXbShIdJ;ZcGHF;9u+eY7c&jtE9V^ zb40+CD8iTIEk9dH>5sjW8zhS0V7bIua*8Q%K?A^EW8>JLkEJ!;$Zf7x-z|k zou7lgk`ZUQo(R&ea@l0?UQ}z+ohl-u~pV@l}6U8q4xkNS!eU*D%o>xupgxQQa{V)Hv|BIw`EuZsx-@Z}$B_#x6spUte?;p|mk zb`t3G`+r}C1DEVU+u~P3f7~@D^=Ez1#8p=cmcIJS(+U6Hh39IWq-AHEI!zyx3(u3+ z*;qJ7&FATU)4MCn58E5MK54x%NUPg>&$r(=y?C{Qo`9&5MJM8=)Q-sN4+i<$J+v9J z&ahJ|Jlq$;&IPi`Uw`F_cHa|OnPsLt`tfmZ!j6im9*z`^_J&3sD5V06HD@gBT|otM zS2F2wZ>-N7rq{5cqz?o4o1$?MiFS%O`9QJgxa9OOW@`HLt>q;Fiw1kCB0|YFSczDO zLxTK?kHICz0_yPrQn;3_JUB#>=J~cHM)OH9$oFv)1=kkwJu5SL%6lpV#5%!S`SVol zdmpHDz}NiInT!F6LSWaY>J*5M{*$vQpJ~P0k9XTWH&0{MYF$Rb95OLenf9tGD!4H~ z$)LJ3q7K$seJXYHat4#b)#S|+34i>;mzl(bGayk3C~R_kVamMoeJ)aD$m4A===#jc zbyIoG7`ZO=5p4#He(z2XEz}7SYN-UAj7NQtvjwwB5@V=x?vaMQ>lg*W{Z`{&{58W>$qyHhy$IWy(9pFm% zd^&iSM@(4TcbiM8T2DNfn4^*a80H{Z1GRqL?vy7nDu_q@?6%T$69&NbQ|9tBy@?=kf0#J@KNKGS687S!b%P{t)3eLpvCO%dDM!ihd9nVgTt!Nq1pA_+YBhpK+;=WpT6${H_{p}X2ehyD z6ON(JzG2({w004CrQ_Sp%2K$-tJuCsYT6>FbiTqURRxCPNL>;qy}Cgh1PYXQ9wGeu z26b-Ej2P-rvP2*s*F3p?hO%S5598>96jP??)froZ_RlE~#F{D+uvTwB!u< z!AtLN^$NMU$O_0+fZk$!@Z!Zcpu&R<;&3j&ENTw@9QD#<@8X+F-KZ#_JzEas`g~ zM(_V0^4>G5=`89SwIKou3IZZhR1iUmf`ZhDC{>zDFA)JL(tD2-L8SK%A|Obw2|W}M zFhHc20FhopAd~&?pYB?B-48dPW|n&X=j^lhK70RmTc$dZ1PK0@?VT_x zz$brswBXHF#X5Uww0(IBsfgc2S0nw@6g-?cr6=`M8&{7Y=D1kE#Ae1t>=Z$v^ikd< zBn^LZ?p@endjAHbZU)_;?8hBp@>>n<-~mFfu-Tt5OEWok8!Ni*IJ9%KJcIJF`SXQ@=HGVso38q5j9 zU$(M>hIMIHKa9ypQcd9}y-K&d&UHo9zJ5)NGtzNf#TQ|e2UtmJOFyZhSnsO#!~eO8 ziS2%mc(52*q#W>Ez3iDtj0AZT>{p~&)b$Q34%re)>Z=s^d-S6^MSH}MW8b)@Q&s9#r9s%(G*HE;Z+~nahR}s1M6Xy+> z%VFNZ8GP(u0sP{NAgrV()prP zOz0l5sz*NRuLiF7Xr&WW!TR&kV4Lds!@z6xF3%>D8VmIpsidu2&205!!D2`BD<0SL zLujrYJ*ZhaAm=?sDhYVNh9lvGP<6TJf|o^0c2W%$~CnPrf|0{>bF;bYLojB^9+#)dawc;T3FFlg!Z|v0rv^N4(7Pf+vpZxGKCu2R(Udm#q5=)HrT7fuHg{TrE2&r{)tm9OvcB) zg3ud}V;P_OFKfSQ?w(AI%N3}%lC-<|d814GAklDjptTsU&r)6txp5Wlxqq@oOz11H zOB1-ae@f-;G;1A|H`z~r>qk&}!U;7BfD?HB?2el5_;WKm_sm-$j?OH~%I(Gi1` zlvt83XInc|Sb;u@ongc1@nN5Vhxo`%ew)N7ABkgM-xmlx{eAPic>qZMqZk2LR@P5M z$5DOH9QBgx_ote{P#eZ4qCSu%<3)icUZ4Q4B|5&1?A zM7@sc$E!sFLM5^tZ)xp+*%JG_O;0BcOMSOTX*_s5!8Lvl2 zUI*NOY#P8A7^-BL{|b#Ux6Q(Xk$*8i*f|i?EsE-WwIU&qm5hz zqCD;g2QDivv3NK1TlhD6S@&PJ1W0OcGQ*~P8i+rv9exc;h+&AD;{FXfp=<$JC)x0P zo&U)CD`~IAZK9>58p81)A?iY{^E;<6^EMp~#;Q87+Bk|MK$KR<>2j$XiKy;2XJFL}l1T zHJ0u5O_128@`_8`f*P9J1{EvNEObkw{IiTOs{`?;l|tBGHqt0bLIHfEsQI5Qe<~&c zizKbIBCTsU!xiWw1EW?;5nX@-PxytEow(uO#;NNUffa_9&ziN^N_S}X;i`f&!z}Z-uL4>fk;}d>ASr;DZN-{+ezDrN!(Q+zEbO4T0IhTY3@v* zb@d@Hg5y{O2Z1db0mm&U|8v}w(^>$(_u#H94~eDLgn1;!q~J)#7pzX=dq(OgFJRX# z4K;tBo_y<(mFM&xafp&v3kW1b;$hL6)D<|GMbc4latvP_qte7IymGvo8JK zqSGcT>s6Qb^y+*DYB6(sKC9c{;Ud4b4rRq^nx>bRB=rOzj?24b|Hl2S!D+|gw@OyM z8)+T4-bs9B_pRLnQBS^+e2CC1WZ6sZnoR94I%T3N`OBj@3GxYw^EYEAs174b$Er-AWO;sr$#`4MV`;P=-;K+6}m_|7KRx^v9BLvOI?0?!-UA z@zIKZn5km`uq^kEv>@L-)Z!CJfPH__$@|}D$1iIsJlyyZCqu$(VU%je80n!Spdv`& z^?$DrDkek#khXHx$T{wGj|J13uE9&@r4tD>dN8C!8(V!<6n6TCP@{8$late;wg9SU z`J}GhE-8&9_xRl5oL=P1CwlyiK zTu}&?VWuOxw8K49LRaAZzhlc#2oT06#prZn{>a~(0Zj7IM&sb`)#f)*sV<4YUEkN7 zEQuyr*&GRGHIHB0ALlvk7rhZ{@wA@F#KHYr$xXB73jdZxyUq0{Wro{ z+hM+w_sNT+ci&0a8wCNpKFH_S_LTGX!I{84+YG+1e_PC=fW3JEFbe7a7=>qT z*R36*&o5Ba){_@JJ<4@!LI0xE(b7?b z9?f^$Mab5Wh^dE-EbPoreVk9+x0Dx|S-O>#=D5dG3^b1_$}tImqMIgZ_djMiJ6%w5 zMk(uux$8%rM-iPs_ucAQb6pfO+%eP|&0|N|pjzqS&KV-Xg z1Z#l+2j|<_Mc#x=-}3N%<7zRVU+B5%v*MB(bfw-!A9m(q1PLxhNdXK%ij)4^Hta%m ze!aIMte{MsjalH=tp-Xr7Gxc#APBDJ6IvY67Ge%W2%H=u%XFALJO`E;D4M40`r9=R)!&)(}Z9Z^JX6e8)qO?BLMDgxz8B*50#qg4}Ud381gS|V@2_=&A2F=ivqw`2YU2SdPTTlWQL@b z$(q7{6Y1#TF_C(2=i8NTY(8|GW?M*@&)tol9AHdEfDVz$9^>Ebv@a#s!S$#HqkK?Do#~8~YYCR{^A5#qs37 zcnd*A=UGJlDnxSV8o@hhX8BwtyR!zepV1I%GaMqx`j8+}OaBu`3L^hTm-|KjQi&sf zLRpxIP1+F7J6#(!)uN3`P@aE9o@CMzWe$B7+G}JB0tbJQK(PsJsSkjdjM1ID5@5mlQ z!rQ);6E6sbv~aEw4*W{(=~E^_1&1y|`Yf4$G}^#3&Icez(v$ltM6}Ti83eq!&J&c6 zR!AoF(Pl@6HVoT#jg95Vdg7G1vVVE6$%^0rVsTkb23$R?)$n>mYq2+sQe=eWh{svz+9gyBS#h zvYDZ{K1$uh;7AJ7RwEkK&Nj{xck`|Vo57Sr<?(Q7md>JP>Tr8;}W-5i%%Ypynx(Bt(a^5{5w204LrBFmU0eHA|%KX)tF6SHxh zBuwVaEj5_s6xKQyS&fVf$SiDEQ!V1Q9xSDdm`*e@IvzZl0xdH~C?RT`7UdtXgufjCwPS%kJ5f#Wv|ymP%-~ zWPSOHpR&AmD7A8*;lsaVt$v{ia5;bjOStU-)n1~xdY>j`vk5nke2wQm5H8&>b51MN zwS+`4BC-!NuX8VNyww;VGfHyNuhf*jaS>|~Q+&F!=mE||?!7SHI0>lgkEA$ke2?qt zGF{ne7%?U}Y$tS+BuQD84t8{aLEURbn67`~&B4()E@a(}@(d_RJa-4oVsv!NG9Kms zY9kBO{yB2mMY;G}kZ#Zw*a}ss@ntTCgu0QzGqtAdU2Y{KAxDPoT5+{?nw2*E z`n_7$r~PA37vvC%l3|=m@jvp#>vAA&&u-niWitDy#H!jki52=pQw-!Z|04EE4J0mo z$WrHR68zOx=La9~gD#+jsPH}D?&h2E%i^op4H<*E(sACqyaqQVxwZoy%L{<*qG0EQv zw7=QqaX=qe=I>2TH^*1rJ#8**12N@bf6m1L1Xb?Yh$dMpgbrNqG(s^haLyy+3voj! z7*{2r@UhBzcjjtm@gw_Fc|yQ(&u(~^TeGb-%(JO}XGl1$rR+xV#!7~vK&XG9k%3iI z!j2wIBOslSc5%k7cmd;xl3tL6rKek5QayOD%Fk!;&68SCK4jLba_IGAX)$L9@2{Bh z{?J53NdC;*LXqY4u9xqN(C<07GyKg z!{|tQmXi`|^7T#@@gz6>x}K=rHBEap&WG8}OxtDB^p>JurxlECz#F>ny4+Yw3H1ha zB9#Vxmea}nde#Q(_8m{|(#D#{r!G8(P*+m_OZ@^yU(9dyOS-%&7@Si`#LW550C>rF z=mBSbNFPz>@aQsGSd_BQXE<~^Xz$TV6>_BbTZe2b743W+dlWvY^>Z6#9mP_^1O&;m zWY{E5+28@V#V(DBS(uJmvP0@Dsm~PW+cU%Zddt+$Zf6YH^RWB+#!uafj3K-o1n2t* zrZ#DMXADEGYRM;>AftUGDctYiSsKd)>z@E%!yybHKRAC-NdjvTFTdzi<797U zR%(}g$Qjufq5ZEv6kb%&INgYi4MP(PgnpzDSM6Mn=t^XH1>~yPr!Mp(O2AtE1z*?- z1FgY;uMi1j0h+TwpNK^%pKyNyv`7QA8yD#*S!o`A9sahWN(!8Lmd?9elk5E05MBW* z1GK%rG}HWp$JZNB*tTpT+?oT1k>;qEhsr5GU_81jT`wZ6s%X>#aNZ7Nr_dW89L1$#?sKA%hrl5k& z0p5$exBygtp41n^;JrdOZ!HJ74Z{^+=s;xO;H7zN;A&4a3={NUAPbOr$6r9$9vt#u zk}xK)%n4>Eh;93Sxzk>*SC@UUhOg0`@QHevmRvE@7X$zKY!imp2IC$jWDa!aFBjnm1XFY zWx&I5FaH&a=GX*vmm1w^ed1#DkJ+v!q{mg2I77;s+vh?}y%jJ@J+4wQRzBAxFdKRSH|3ZLx>g%cB7~$u>dFyL*E&II}vB5E9O9pKEfg{3_Xn~b3XXARa zy`Zt28D_~o*H=$&F|7MBr+lqp21Fl%ARYUmZr5TZm={R@OV(JVBM<6yl2_Vc!*b#lQr_j+=~;i<~b(qLlh%$&bUL% z506ewm?(cKXmQ`mr>GFH&qd8@$yFa}gl#VH7i>3>UZGx_4eZx+Yfx&!Zl9L$tk^r* zOc0U_<&)UK{|6NCumvoMrq)+AaManPju~3Vxy%#GIMU`kE}S;fQD;W z9X^(npu+x;7uT4hkGc)|?CUnpN2*oBCi35WW>SADjM`~ToGB4lb7JeF35aSk*BoW! zXi?OX%fs&z=EZj2YuJ}8p4(yaakHK_$hl&}2G+N~KIXH}bKZ3>;eBvH~Rh`^W%}SVd97}CY!-gKP7EI3GMZRCKk%c@lkL~tmwkw|*IGHS%H{*KQKDE;IRvPD!9L(YKhe_R%@h^Q}|LU|^+8x0CisOz) z*$k%CUKl0TW3z^=eagQ3n`Oiygod4{PMDHzC*d{{=wfVS>E$Z+X6mMBXT+8jVX8iW zPaz}s#MSpl5*bzmqZ@U9ocz2_a5@&|@;v0h(O~lfkIt0-Z$fXC6fh$khuUx_2y~*M zC|Z22Z?1fKM`dX=r(J}S%sRyqvgl+=Ho7i_b+i;cU13NT9LSlLy4|<8fwNA#0T8$X z$h>qVK&|m157wmmZ~hKuylXT0JKJ78zd@9dB6OafPimwj*>3bB%}~Lu%MVx}`kOo- z1D3LQpoeybE%DjN7bmJdgXH-Bvu6O4))oKSc9oR70wj-Y^@&`cVW4}!wM1hTN$+vB zlcp(MK%jG`TY!ur!5vkEw~l zqZ|5$U;eygrL3m6{6yf_G2v8j)Eg-vWyYOfMCgIy%Qm=f3pAm%gcUe zHW8osk{-X0Sf$5WkE*?8eo>xtgf9nRhE!}ICNF9 z-!1oMWV!rb+UKS9+I*^0>T)@WCDyL&hN`#YW;>dsR9YO3u+#n-s{XXOCSSiwyYrSl|1sd(Nd~L zqkl`9n&iIYKo6AdRyoxlJ1M_=JT*==qZ&1)z&ErzodPLqqUgG`bo3$P6Lnexlgsmo z?~fx0y+7&6WpR*g843#AX=W4Ch3pt<-@MEw%AM9ZO;kcv00pP62xKt0-&;1IQn#1P90nTFGgjeg!)A zUGAqp0K~0y^&egV3KT8P{x4n`d?`I`7I7rX*yE&D#6xwA@3o_^#B}PVZ4R`Vo_b#cRH0oQjsfE)# zduk^HhRk<@2C^79?*6PV1k~DlQ$Tx{axQINezd)aR2Tohly|Z@7M;Tu6#&KIK*JKJsM<^t*7j^>Q@6lQ2 z_R=+k9HcIN@r?AvBHF!25EbCRc-P(mb^ZA+{d?Ho;o~Rh*I{rEv!G|lQGWHj3ZM** zMZqQr@K-_iW8G3RqRfV_ww+SqHQ;03;gtOP88Bp$)R2YeI7YL|wq#baiS<4*7n0%Z zna|{>nBP7o3kpzs|2eThk)b8?Ef;As)V#tHXXs9py3OUf##K&~^;pDQPcna0gm8MZT<=_0B6lz`!4?ZC#S`NoB!Gg$O^XyrpLT8Q8!m zySP|UMlx4c(#gZ&jbgE~>W?_);n}_c`lQ>2@va{eX45(;YV0P0-!jg%42Ix(1}WSZ zegr(zZ{$ee2gfTV@Yld7U)XPa7CK0Coo#tf<#2T1F6z3L%AAn4QMy~L5E4$!GG`(S zWU2y{w6|@&>44m=SNA^K@&Fm-$p@_sAPePjfgv}?{Eu$~d>OKSoB^J~@z2d+qZZsf z&pKzF)Nk2dp4%VD))x@FC(0e8q7U~mC^o3OrBz}WcSozZI@nv|#CpgH=&7dB3bTnT zY-|Z-W%t|(7}#7_l8{aP_K=>Sm>7?31%RMVBwzA=;Y=#a=>E|7H54eA zolS*!X4R8j1d=pQ{0v=8$p>=&ey<4#!-*3oepeZj{w^sQ@!gvz=$F5%hJil;e*cd~ z%vAPzZY+s1`@@)k;*3Vbg?$m z4l?jF{YfX1hiZKGmKQ(*Xo*6iOJg_sK5 zTMm629rx(YI=t0zsu`m4WPL~3tNplN5)P;{PQKQu_^E2|{ka+GL0>b)|GBcEU<|4T zsN`w<^-EIA@2}%LG6Yg4V`h9|kKS%Jwl@3u>qP$gd*_V6&JU;|LUwftziHzm1Gihd z|MSLU^wclDlxu%~*ufXb;`K}U#1X%Ekdc#*p$e)1EEaeNx_H5*P11%ao(pSd6*^s`{CAFXT4DD{VoVeEt8o-`;C%9nF08sYAQ|Z^ene1hD zx8+IfZ!SSet9>3QOYiV=yiWzxod@PCNlycCoJYa^r+Y! zB&2swe|r?>BJS9mUq83#qfFGv@wm(}zC90pd*3n*`DThg#Z*uE=BD4bw-YKU#W4%W zCAbXG$*R)b!mt}-AQy&ESKa28&+`s#NXs8>KZByvu3t8YTqk_c#M0at_b#u=xNr#l za2^(x(0#;n`#`*zFfn(?g2%e6AuPJgFq@K~Z9aK7>%k9m`QiwdTAPrXSdURY^+^|6 zpOo7E5};_=93@DYtA-5oSDpt_)14{cHKlH%auvYo&GS4MI8KoZrq{B5t0iYB(*Lmj zz(V?U)GeEZ3ae4@^{FDltIv-dVYZOE(y)bwA*;^IK*iV0AdG#=o2`z`{8@CZ;rOA< zqR9I?$UVGdrb#}M840l!CKPv^*F7g#WCZm(}^;`BvtI}KJ5rxR~f+LMqAVgA>hUsc*5t{eN*<2}ed4bLnH zR9nqUYaEm>Wjp+;TE3sno;fyXThdp4Hi5HT!q>T%56O%QB)Y#r)EuEDwPf-;eU zuzPsNtu2|>)BQr|nCFrw@33Hfuyr6@wfTi@FBRmp4U9!*43g!-{BjZ3|6Q<*H&prL-oVII7$p? zJr4pJnJ|+pHT!F0gCKk4-s`r+6D3aTGpyAkG>Q7Y{&$Fn-*@-fOT6ypEFd#7*6oOo zIwh_MepxuQ?t=V!*QFN^Wb5b&+m7Qr3;Ij_0!A5pP=UkV7ECfLhHx~PacXCS$ghlK z0gV{WA%|9O-7OXsh{y0+jM5G)Fwss~%TWkqiKt9_kwfKzP}KWaN^4qo+g&Wr{YLgn z@YJX?LA~iy*gDvSvvBm(_S7LuvIq>*Wj|=<-r9bRG4kL5%Av zDl_X2=3UH+xi$}L4Q`?gOb&kS^MqmXMmZa;o3swRwm zf8up1yx;?#VLQLS)?rn#xHD(HaI_E1c6xNUTT8M`3 zDH%co{2MPb;FxH0PKzK;ngxieES`92j~dozoL}$Q3KK4WhR|n(x(f~GI2+`=ED6%p znjE^e<`6ghbgSv%t~Uj*+3OTHYdxvk85sZ+Jw4n&w8aylm|lJI@0B-DxvvXvZW{^( zm#z8Q;CV;;B$gm@xpewwk2IGxBhNwFTL?TTJJ%E#-f`ZC2gg!*JK}dUG;TuhJDwfi zp{32z_)t z1y`EiBT`hjquzF@9!OW2`rITBpPO@Oe*nt5Y!P3S?B9|1-QfBqiCLDT6NBn90(z7J6~H^ZAC#k0@Be0Mde77yzRh@`7*g++rNy?vF0gL=J7)2 z4{VW9OxP%(y%X*gb=+-ZvGIaWOj(L+VAVJESmz;{uM7=Fp_0D}w4`s;63^SVPBxB> z)3_6NzTd&Xy6(a=rm#uVKEo|Ds2z$qcl(8YFI8?ULewt_EQ?_I(jRK5FW!n^X> zLz!JyKN6*-un!10_f|#36vSr{ui`#w)j!;-w8HsN!XoL;S5@i9-Ntr@Pv(2&pQRA? zJD}zPs76`%rFoygdySS^4s~%!o3D3tn(x9yz;4Xyk5`5%Y~8lDf7!JOOLkjj+*M*e z(}>EnMv&;9F&wyqya0_O?q!ja=V3dM;Y%DV!w@tU(2z6* za_&M`a4t4Jws&k-cCepByoug(_FWc)9~tUp8RyD;+O2QEPg_}S&MPFB{Gqnu9$q_A zB;8UEh0R)bI6M4R)H_1FzS7XIH733$nq-FT^&(iqab5`tS@l-bO6W_km<*33;Hu$C z&^J)6Wz6#zGeMBy_@outLvbTfeG0hp;EvJJ_q#e{?4{TKB6I>Fsn^{FXydk`Dzr`_ zcHq-5CDpABbArSET(#C&&VMU@GGL7CINNrQZ!aSPw3r22WBD$vJP0}pJ5A1sJNhXd z@j86wNZjr&t%Mzn_59O$q@K-6Ia723-_$38_w%>qzgeH&e}Jg9JJusVYcEtrm33=B zo#(6OClPy}p5t0=7_|;GXBUHbo8WNjaS8eMBXvh6IuwUQ*dD-KH;%+#K?3ub&~tj(jm{-Qd!RLC^7^)vMSLmE0C7>O6G=N?Ln@A>Mh$a{=NyfX}RK(3(UB z!2O}#&hFO`Qq70sv4>BzTXuc1MOOvt1wP2vz$q0bK>@iI)FA{|`kQevDn7YBhxnk; zVPp52&xFcFhnxg&=^HlUTZSUTVX$YDGGQ2u&7~!OE0o{83kVN8kQQ9i8O3SU-t4YL z6kh08=?=k&r#u8+kEwOR6rdp_=3uVJ)5(w*acTEJjlkSmhjzR36%HjjgEaR)eAS`#hBjCSvg${rP|dm%x6O@1xW$bnft)t&6ja-|}z0=4Wmsb@P;{vyKf$*lPEX-o_PRXZssj&gbBg%>yS0r_L8R6z&c8#^cG z>{|$Dh~kO)8Kvu!Y}eKxZLh4^Hk+pi$ftc&%_g3R>tVlaz7=S;@}~c$=?rB(4GW1A9{`!Tk!*xf_HUKmqDjA z?E}3(*Rkf}K_IH4Z=%USFX%@ye899$r;A2=(pZ*R4Y7{=^%=Be>1{TrQR=?>(?Tqk z+PlB2a?(I?9}LRxgt4 zSReQ24crRv6VA&T@?Z0y=g{}He)iOyxv(^K2wTYt666&u`Xy|(R;T~HQlc4KO*`7d zH*-R#qng$wsd%h z=Ky{jimv)v2`@j#kIZ}o*8)tXurBYQL-c&*sZ7+vyZU@DUa`%?((o|C=)41Ye9_pU zp@$AIyv;N`jnQ@zfy%Zyjo6)n^6{1A(BR??Bj` zeqRInXak$9rcYo|?)>YDx((@T>a%JS6*APUotIDCjyAV)2r8b4WT9&tD8v4U^)WN9 zA@|HVJutKm6d9J!IArEm+dJyQJ$>{1H_t-fmObR;QibbiT+U54PC3I6f~XiSBxGf~ z0rkE@82*3J?%+-{AOHeq)SLy zw7<~srFxhPS!uPqSrS)9@A>RcY^cLO-!Zv$@k|7$&)e=q<4t1r|I3CMRD#zbXtW#ijg`zj`a z6CygBmXw~S_P5?sb$l-2qdjEJ8d;@!0rAuM(4oPAEnza(MTs!q(C2uN>{F(oY#7@D z3@R4)h{Et2w^5m8L$vnl46eMzS!YtD)d+J=1R*<0c4!bkY%vM0pj{Rn+_n#%xQs=5 zFH|24mN|M@9TWYNk1mY;o(T8N5{B%4y=$cfspS3o#(RH=_RK;1BbiFAIiRxQ|uIL0hKK-?P^q?dVpp-*Z(Cgwk~2 zo(ozBRZ0r7V^UJxW;tiJeJmhTPN!)TflcT~YV<6Wc+6+>zNCgr-InJ_zLt=c1#0u<97J{r9MKt11&< z09bn; z(ke*nDwkcuEa)XsFb_RU+U$O^{ZrlTW7e1fzNP~lReA(2z^ zZh4H)+gRWJc~}YkBrpBt=@x1T4CjVu^3(?`S^EseTA3*`SI zZ>M4q+rnygz!)K)dH*Q&GBR9|*wfl~_*l9YdO;C+hs&g6=jU>b0=LA1L0c4*T|M<7 z*J(mvPA>72Q^Vcc69Q~ezWw)tcSExJVEtEoM%}Ue55T0GDBWVYAf;X7WB9w`rY9g7@>#_|){_sYLu!N?Jn# zz6OJ>jM5F)k~3ZPct5AM=`owQm5=oDfLpmWyQ7=!lM?${O=WL|=edimb|Km>(@49H z%?wa1dG{vu{1SCNm>!K;Lra#V#+LOt$+RFQONRV~h+4){KS$3FiaCN>tuvUI9OGrI z+0s-o3B{P6eUM`}%b*G}w}OSfXJXwj*An`yBJ%4>9# zRd#EA>5kymaw#Eg$*Y!qVp&`$>VSne{0docMZEpsX$*PV-l%hJB@1J_iulT>`fx({ z6E<^j{Vy+?RBV-qKo1V?^^DRuUU;A%JF!s6_P~1qTb8AQTEQ3;EnISJ_)0!f;9N0b z!B%CXK?uE7#9Wk&m7&C5&Yhc}(e!y&1zhf9nPk6jTt|U=e~tZS7cbI^Ol;sdY!I&x z7;Pobv8#D3tdS(f)ezx90R@J(N0nI|)^?9)6Pi}_2DaFK_GbW7X^}}Zz0}{6%_2HK zD29S1Z%V4JZbjqmFE##n#F-8rVIic)MX-eP8gm;FntYZfbRwaipRsybtn-pUdAZ?) zK!Hr_cr~PCD_zl1JQXlo@V`n69jVBAwKo<&o!9@Mz>d9BjnpY^z#7nK&$r!{FGM*% z_sG~ur=WEwHk|Hr9EiV`5mh$TTE2D?;ra5R^)N)1b2)8J+(8Z2tFk0zn5oR48tIJx zYVRuF-WbwD74H|Oz(*+9Kor|3Rj$qTE;`aG0>d`ZQR?`l+fn#Q82Ie#0s~;Mw_{U- z^~jIhaD_}ewK43425|fGq!Cj&z3hC2H6Yk$!`Wgk(8!@-2YT_?PyH%Bmjt*qK_Wa) z7YHN702s~Uh_fuEz}S3m^+f-+V;>C2Xa<_}+0azM$J!T{N-&@s6A?>?VN7^ToK)4J zK5N`scl?w}q5E34H~0ktfBn52`bve0ZKM5e+T}L-V-aM3&)}6;m2ko^C&m=P$}OJ( z5q2pQWxBH(N5AIjqUid(T$R($nYQlmsq@)`?DN~$Ey~L(m6G;q9y@8VzFI*!D_>8h zotwDM;>rI(A9QnK->AOK=vGlKzdYDhlww826RE&`J|l9HaVMTOUPn=ZN5AkWJCWDh#$>i0Dpqz< zj!8b=OE;U{onuPGU00yk1p0_oSL8FcD^h%i0&KD2?Fuzh_(%D1vDqQ&p-z zo65=>j$-&$4t?&iXR=??-O=mX8*xz^l6}i-X`4|el2#VedkAQ`&pCi z25}RN%7SN3yFf}*nHF9z1i-mv@I@%fIMQ`{tiwJ=VQ;N&r;ITtm1nHcD@Gr*rF`-l}lgL2KtkwOm`Sr z3u!>}2lkjK27|KjIoZV7tHZu)~hm3xa<{l}Q3Z@4X8fMlh z@1n?pm4Dp<(sgY56QrOd6spWM22K3{57P+kyT8U1$*T8UO8>4Mv~zN1=d;O1*Cm|- zN-dhzxW*TmLWj8m@)?sm z_6U)WtB^oQ|19d^lsR#y)aN*|cj7LnNGDS5rJ$>7vj=l>T*O*J`fw{g5`O)rz{(kG z{l3xasu*zP?R2SC&Wkf^X0|cFY-LIy={ocQD$K;=oxN#$tG{4&O!{0l7EoW7HEBOa zfIZSp-SJd?5|b|5;ym{ve(K~K>DReVEWtJ2h{B34RnPwVxv193da;si&|Je8n>Y={ z-N4Jp^PZcY$ah=&H1~vQan@4>4$NvD1&boEj%|en$C7w z=BUt7<8~aI+V*oDe4mVb{#oJ+yHTawlH&Q4rI5ab3=Di!`)mdK)HB$AkT^5o$5vo+ zQ=ucP-aVAgaRHVK&!Ea??yQp6o(<%_G?0Ew@8E}g7F_M4{Bh`8W5rtFwwT6BkHGGg zepeL7fuV6-NZs_0gYccyA;jGb;BB%1ET)6cPsaSdsY-b_v9KMpdt%8D;8X%g4$UVG z7!R&zi@$w2H{1>Bvi`Mz#pz^gyc0jGNc0Dv=#AB=KAm06lxKIlf_mg_)sBhQD$SrhJ2CM}K{FR@7dh~(HzYw?LGSl$z#X`K<-mcyfLJqacXPl%zC z!VydP+F(Go{gU)tkK2*XeojC=gxH}{w{yM#A{3kWSQ2ZtT;th zqC9@av-;hu%hY~m#qF0lLQl1iY4N+2=!jxL*=RPsNTx7uN)B#Dj!Dz>L$;~V1;*tq zzIwq?;nQ0BFLRUq0z6G+EabzX-J- zGiqI_{UAc3*EWy*c`kcM`4Pu~za z>zqHQ8tua3`JTh|Xae(98*MH0-jb4b$4{DG(Hd+Rc%LlzBPz}GuzLj%y9P>H*G8{_ zKOEAg5xK5xz{_~)v6*{9OiyM-M0@z6P;yqMc~U+5q25_1T-7xtwh=x9LeGP~B^e!I-kRdD{GfOUGLClw5YeuRLjB0>+wPc;qh+oW(0P5O8Eb6#=9pB%pMg}wK#~Zd>S<&@x zrkXvFN6dm-pBu?SFfNk18!b#rkTUkS&gJL``UsZz>zkG#m$l?$ZT4P|LqJ9I0`m17 z%z-6jv=f8lROkn2zi+conMR;>PG4%63fM-u3nuo?10e9=sWs0olihDixYMaOVc?Gf z^1J;O@BN0BFFs^7t~x{HC|O5q@N@ublHe zIMU5+5%WPMU2QuNW*ItSKSF z{*$qqMn#6=>397cvU7(QxV?S6!J0wC-ahuD=(O_2i%BOCcRkK@uz7 z?fQHxjTcMDW5Br~M^IV%YcTk`J-vD$(x#?^hw@I2?w^dA={x+8V5hg;MZv_wnTl5; zw(-!GRt%f`(h(?Yu&US?557-RReZ~cr7souWOB)(8BN|3sP1Bck9r<>Xf0IgiG+GL z@FzY&RQp2@RZy%|^&(%{Gi`F`K(ji0?IYDbO?L3YNr$oMR45}yzDHh_y@u>o=8!YL zeBMI-B2*jqK`6a~d&n8}?0SXYw=J?I?`M2+@WPigH(*uGrx-Zqx4q>pUadxpA7<|^ z_LEOM4q$`YzdTrlU-COL#u_NEhclZ5;o^G&t!c(EQpab^B;L zK@lH=@A)vCl`Z(9wxPScJ^zk;-scY)i-y~kLMpqWmnp7lMy^v`5FSP#DsW%vCUJ?K zHrp3BEPJ3OHSFq!T(EC^DMH}W$Zr55&ZyEM)}UPI-U7$;t1O9{D)j(5@=b|6@x`QY z>C0|8eM7M1{RuX#I+5XZ_<1VYV3=X8Te*{X{sUBd0|uUsdPA8+&ygy;W&2*E7RQn8 zHP~|MH&f=dXziroq>R(=t-I_mXdTPa35!a7>Cb35z3T8grwfLq98|U)Bh7x5OQ_1q zHcnnHm4qHm7n!s)8zmn@5SRBMd5-Ju>#fi?an;^0Au7Zq+ydZ+&7lQZ!zG-be(%}S zdfQbE`)*G+3PxXNDOohJYf8N=rz-D?wOR6VuZ+E7qb>b^xO?xYrl00t90Wl`h=71} z5EPWAAT5-DK|w)5QE5^XkluRC^yBk< zpYQkFd(Zvr{_%UClXD13W_M;@JF`2xJJTE?gG@`LgZc&xCRt8brJ3RtJ)YM+IPkO1 z*zZ}*vFLl!pd{2;iif7NckGyN%u`b1;kVL!2a-KC&i>N!YgNi#&Gu5+_Z_kt~R=tkT|x^tZqsQ)LINapFBTp{HU{pCSjB#h=boOe-ti zm>1B*BVTNEb5xIQi*leFHsYvuclhVpJ3_s@h=~qhS@dFRrFR7(y`OIRGd*)mi6HUQ zg+9ND0J5pjUvqd$E*f;I z!veaiA1*kSJ8CUIc%x0vY??n_W>$>=Xif22ANjp(C|fgrkcTwbU%h*xQegTI7JrE{ zZ;V|}lZ3-Uh#QQ2@#)qyXRw4jtU`7qm7(eFuht7k)eUnGMXiq4$V&(djrRYDBrQq{ zNyI$Z)RX-9o(^H-Pka~E$|_j)WOi^bm2Qe~^*Z6G0$0)ssmWfdy!tX=yUgJx^KPIR zq>`U%Q9NsiP$8^6MTQ$U-KFQ`Ay^5m@K9l^b<5zEyuT!Bo!_K`HY3Td6IWeVP(i0Z4=mJFHw1Q4_JbIa!2jXV|}&tF|+Dd z!klCcdi6XLHe@4D@vq|&9s3zPv-{P0hCvUM5r1GN!t!;Xz!}6!w^V~Qkry!8*s)~$ z&YwB71N!xp(cu zhr@XG@t=4(r4nN_a0l(~qIB)$rZ#jo_0k@L77`JX@9$9L;PX<~&y43|Tu)-wM%&{R z|LtOee2-mScH{%0O;?N+ImiSrWi?u~oF&J6#x}I)hAXe!F?3zeBGl)8^KA27i`p^W zt@!yu2j{)?(|T&Cg(BAeqFVe~Xht)f%={s+1 z#w2d_!p>kOc1pgb{gKut;$&dPfeSZ=|*-CZ-4Bva?zt5N+dEX`po4curuOm$C zJ>Dta$%<-o)EJTMMyXk!e7D;4#5kr@KWVnDh)B+YkS9pYH-IK}*92F)DVBC7cE71i zjRkgG6D_LHuIRmeY+DOqrgDXU!b>m5P-_9+e7lI6$xxEFz9YDg z=zsX`lEmslp8QD`?vd6{()U9ZOI23kbkJ^$2cOCu+x4N-;VJg_X#co>Oa;X!`<0N^ z+T8HNRoY3fb^3`y8XMo?7iY;;RQ^1>NrNG8wjJKlp6{pSqY{t(vt>a3BxvyiGNg4_ zdLWz6srDNF;%oC;u_V zxEjzrGV7N-6Zy~+An|vB739~m2`>0ch@vrsT(#;SqGW9SKQAKrua^HGZFwXo=_5_z z{25~&V1I_z5m9878uvdRiylS8w)rH!6r;XCQ+OX5@dbm-@Q#!wP60r@Ln2M9! zZJ0xB}If6@k?7+4e=8Bp}Iin{Yi z-PJ?2dc(kQ@}85SpmIme{%5l0kdQrtM?v(6%8!opVog^%=LBE9brDZL@3H&LvD6tT-&9NK-F)1}- zWmB10W3@}Qx{N7R!}KmW?nu+H!n2&x}6w^G?afa@R>^`{e7$j+2q^FR&@gq)q~@*VbS9%=fpgnJn|LWvtL~LbPfL>DjJWMESarZ{DnmU~zaE%3J& zhE{J@musE3OCJXMT&reGoWxv*1k+lqtw53n8I8&JQh(YV5jxDS+1KBiF3a>*EQtYp z8Z^4$Xy%GwGVcHK-ZQBk3UwSZGDz0p4qW=24*W;uL2ZQ#=b786Oa~xc8giPMi?sAP zBIH@&2dDj)?LV^Df|BG5_0?WEkaG%sO03m-4yhi5xVY_~a9QFy>RJ!qBUP^Y*N<(e z(1Rg}-5YN|-C8-yzmbu@bzVf8P?^bxP;$BxgEp7$$0Z;Sx5aCNIP)?;$9mDczU zR-tx;SNDzm6VdL?h6+85=bc&{*TRy0rwu&cJ$|F2a~0{Z)qe6;y3kn3=$bv8T#hLY zK5BNQBG=eb;nXY-o3U0{UP`2`9T}2VeH*oFGF*GOHaj6|wXpwvrpIbGX9)ZYYdL&G zzATj8DUGm7ORvA0h|ofoL<|HJ9Rwv2_W5A-i*uru3u$#yZh`8=`Yd{SP_Yp@@NTbl zlE-8rI(`SE0kp~}b4m!RD=5nQX!#CWIWKkiwGYFHI* zaxDG6cRz2yUEt}#zzc!QkblKsDGvMH&PJ3Jtc`zZ#QQ2+Rz6YtA|j~c*G5~hmANzQ zNj@jN^sD80%?+9yzn7Q2E< z@grjMoEcACZ~;~J&((sn5&bGFF7XHUSx2fOFF}uC8`#8ZeHkD9Jb7HXZS;8Qyh-UI zDa3eQ4)gH=W|EJ3qe)BLw(m=aU?Cw$1~dDGlgPCFIy^Z)%_)Y!=_T1@#>+ z1}I?TF}!87U8dw={?zxv_HlJvI4)?R%-xF@yA0Tej@2@?obZ)woIB z0W$`7_z%}e@8MAY@;5+xXxP;_URH6JLY`TVrp-=7ixY86AHePVwmPwGuMlGxDrxL&6u4 zi#@J+ z%@36~9^@Y8F+>`t<3o z2MoqH?BO17hl@7`zH6w>k{u4=zv<<`+B=DN{6)N*T64o@!)fDex!LN6bn(6Lo7Sde zCFLC?NXHy$hg_nUmi~r(OSV36G2w!fE4`~lthGOJ!;S$%KiO5rSba9`q-v^tAsk0_ zKYn1xp5|*j^$l*A`Rdb=SVTJReue#$Czph-9iNFDOw6%MmV=rEWCa`*cnn+;VqV1R zlCNL~i`Q+qa|1VYk)O8G72~S;XV`ewcV@`varTExH=g|NdtXxQYRTWJotT%nK1}2) zb_y#1`ARJRei*Un(PcT+Dgjx`K()XNh73TY zQJ<^*V*zdzY_W@jf~Q(6!#~5pyu`jPMBP>0&q==`%kY{#A7H{BRE{CXy89az6R-9g zUo*_A{?KBQXqjZzF0c3uOARRq3za> zdQPP9{az{SkV_~ijQjp3|`|r^8Mfshj>uB|o9BY^-TMW70f|$Zb zo$AvMg2^3Tz|M&21j?5l>DqeQXB%fh^agg$9*3(L^IE2=P5`?hG>tqa1G^lX9GB7* zqqS@Nhu?fgBA(v2T>}?v>UV8>4-*2Y;}vn6cs|VnvkSSYqx*23lH;FtoHD1a3&NHvNOB;F1u6_a_WeTC!@4F2{MpK+C*dE@7$jVBSa zS4-!~X*m2vRC<(3iZsym(1_Z#c&?})oOWWG^6iM_aJf_S8UlB5z{amPmw4^G;WC+p zy19gl3$wuz`)t}9m5H1ktz99P?tyI=A}GhU9xo}cLT+5CczvV0bJ44+jRP_J2+PWO zmqYO>j7j;ZKjh8MXDBv@Zw01;#bu=~aF1Cl)e={eqtaqymdvh~;tPWZhAGtouLMTq z8#!}Wf8n2iKhZbLPw>RnaTNMZaz2K+EWVsB{J0U|{g%(55D|AY;>a_f`Qe$j$Af)o zswXa+ab_@*a8343%rm@%_ko)&G}m0H#$HmhvJJL-gL3_$cW+X4wsTIkK2(h+eI?Pe z!WT(n;HH)0ua*7&^|h?2H1;KBzEzmhY5gfVB(!gDUni<|ymU8#Y<&eJGkF3VJ-gJ^ zstGO8`T>5S1RVaG@#wJdgts5O;sJ;n`y8h0I4|6rbgWt9;8Qz}*l-JcGQqaYwka0i z$(5&=*!5x4=qe9jw+D7Z``0BaOZ`}n0QKIMKS?aayUEFYc=e%~8pM5Hq=JaUW?Y}~ z@X{N4(PzI>IP26Z95{Uk{6`N;u{BnztRJ7Ia4*LfBA0gy5`QqBjrfkud9bQBgt!8h z*&dB^RhIb|p!=)O(q+qE3+r98+^wmbFBDG<3`irabJAZmU3v`D9pcznbsydl5`!NW z#scBCHGWt6hM8859;8Uzq@H85CLM`YWJ|%VnY>x={a&0njhy|Un@@Dmxvt2l(rEB-{tkM6X-eG*5CncVFY9XYx6j0#Caxi0?Pr6fdAuQ$Rdtdue za6u8{ePoU}?sP+TrPe#NtRctrES-i7PA^nPMbSq5b{3uI!r%FD(6KEp>Bgu3^RylV6{*0x~C*il2=2~z9u9Tcd z%V&~U!s`SKxU)NjBm)%=QSxmtr06_n@NeHrJrTO2Om z#&+ga51Xd)4zLkFCB!OJKFen%mN(1JJEVZICyuS38pKHjABOx~F#*<9z4702+M`nd z&dDc`yb%)yUS2(+pnhYsb4~-f>isvk(3#Tq7}m+Ym?W`i@Ymiz%0JEm+%s80HwbaVOSDt04=O<0z90J_NiUzb4b{#0tFXAGC+ zY@>@cE*`b4|6um#5b7WK&t@x#?B*uv9M99bV(N`0|GSh}VBM4V zIj+@9hWc!T3!}ewrfJ_m_uf*ZK}}t)crbjnKa| z$fP;{k{0+e<%dZ9&avGLDB5%B`9>zlRx&Sn;S%E$V_I6(KTXPOIx=um$N(z%w}>SK(<7?(++!At2M)h`UiC>Q>xY2u8-B z&wOjSGA=L-C%KorgWi)XY*(BA&;62F(zPh^J2?HhFWfgEw2*dYCG|wxaEV0fVhQ9_* zqv^J_`S3`f@@q0N+6%xz$$H{2$yS4bOiJ-LsSZ;OY-9cX37S0ylwYx;5F(mPis#>? z%+|=Q0$-hsuGw%I*cDVX3_%QkQ;M1pxD^A5ujX0j%J|dh^zMk+lw2Mcg{Qg+u2SVa zcy?lQ1D^iscYnx4Xh%#nik*pv@Dsz+vafIdbl1L){EQ(F<^bd0<1yzngK+IHUwMyW2-6m@|wZI=f|I$5P_l8ywWrkvMMo0X}%%HI} zd!DVtl97Jd;vpkvZ_O8MHQ-rFvPh#Wrm~!9k7#WE@G~lxNB%aY5v_p+jxoZ~;xD;B zQvcJp|G~SWkVNE!z;+P1lkFwWPbxwoRAqtdo@ET{@NH+Rp?*@t!S1a^7+F*&zdO=Y zKEhN3e#L!cfx=D^@qJGdu)Gn zZ{)04xd)uJ<|A!wz%DoaVY8gPefTd3WTXAaY?hAlFas|CY4?AjVc^zIk{LPS*_gF6 z53}vVax{?GHd629zB7OSwCrC3n2yRl2|oExX_im^Piflu94@w5r&sy5Z)GMO9US>A z3?iqLcE+{jiU>%(|C5AfbSlfZneFqxe$J2OAj{@AQ_c1DUw`9{Vf`Pu|AY4b!bD++ zv32VX9No6n-K&LcTME)QtM=s$Z`**$)Bo>~(*CEB2?1C3zm1UP9rc?&V~vjcNPoNXbd1onMi1-t`gu8|j0T8f`mrl7Tj-cV=Jw#!3?zD zFBC}nge2%F+WjXVWRO7ZokTNY_T)+nW8o)9Q0UIj*ub(Cn1KZk8KE`*myEpNIe{DJ zfXV|8!8$y@8{1=8x%of%k;^mwEk0Uq>A<}iK+?q$G?3F%Q_0tDC$b1q0QEWezio@v z(^~xy6md~*9+uH^AxxO>)Mq8xf3$^nuQ;49!1yECl$@{%k?E`uX3!=lsU-W0x* z^_hlSUI%x+(2r|~nP{ADp?}Dk`JJqt3~q~hS+yH6#V^hS+(O4elBr?P+&pS0lVJ0pe1!}D`a=UNOl**k}x2Khneh2L=BE; z-nHzU9=9|s!+9kxO9yTb7bU^~H>_S+zIX|f$bT<)GB`dKHpApNzpDM z)V@e?nLQf`-ARG`iiv_K*Z*SyKIa*Os3!(hUr)-TId^LP>rj zFa(xv7?4A6NEKo~$=3g163_tMna9Zyb9n6A{@B-+jemPovLeLDo{6eGn}-=n!c37Z z29Gs(Jj-vo)WW24Pp$b<6wi<{4cT8in&Y_m0}E{(`j+m7ZITG#Cxfy~0O1|Ag#phj z@N7cMqooeAAGvg7v?(Z%~q!dhHD3SVfeN{NbQ?-H+M{vBW|_ z9_Ac*S4PGN0+gL8OQVjL*)DwccaIHb>EUFx{g&SMjRaSmfV>ciSUz|f0PXPot<&JD zwR4N|?PEm^hn1-z%Mfv4?H@4)KOAxEYXTPJnaRK9c$J6wQB22$?pnG^0=4w8Mcr?g zT6y23TR;t~xbSeu-Mq)y_yUj63wx$dYBg1RYO1*Dy$_?^*LF)9d~aLFKR5;M_Rd$K z1ZLjmx5E!;7hucnF_nd%{b4uXl4*n8vsR3~G|j(aj8|p2Htg%H8k3dYNY;^dUmfW! z9%Xu})8M1JZnIlJTHrZ6N8r;;xnv{`rYalwWb;L%z;-xD9*5lbPUSN;TvPV?Wuj5J zh#_L^BrXpYF1$I+fd?Edih>S~NGsQ2OQSMeO8_(9IoIKts*?Yha?E{Tq@%TLesME1 zMtprKgbHNIfxQ&X@WP?+tx8XQ>&w0C@Gvtji@lV;eAmq7wD(0+$-4Zkk=5wBRL01> zJZEnxKj8gCp*+l0s`kzwcS-YL+uiDuEBDg}pBeUx;OIzB}CxI8vqGjWUI z0j8?Z=wUh(+Rr$sypg}g9f<~B39U-0^61}Q=!);JZyI6R;vs^e7&L0MV{#qmUHcVk z#7l@&Sc|HHP=>cUL-uuuIfE`Z_S=XMi}u)B^ihY?c;$Sh_x&yW14m_Ka@n3t=eXya zwKv(wM~gwXNXhWk*C$L3QfcQqhTMTh;ahEd5Zt206jA$>a0%UZ%RSv{X?ozq`+j)W zfFxk(rdOdH>%S*BNgkT=xqUnalq{F!$h&l=)*k(1Lwd?D7}JE| zzGGJ3dI0>bsSco!=^+yQ*@!Dna5DOcZYPed@2c@&J2!h;^i!OC`z?) zoy#aVN*v&!RIAj+I}*fIYJpKFo4al-tFJV>+*7@NAWFmsKflOsc4Tzw!ks~XQqtx! zU!<)iUlVioWGT7r8IC_#B}AoT2&tf26Tujv;1&nJiDoY`v!7YGH~V?_C{O>Cu()4; zwDeH9?-rUHJlG<>X45yT-0bH*c$=Cyn-GxHNJhlYCil`(9;$Hfs!vDNak7fn`CLWZ z%_V+|bH6O2IJn0LNy+}RP-%x=ftR&2pBd>^R})-O+x%#mxeKmYOzNgtoLb}2S*r3|B)IF{-7 zR#U(wdP{oPUJ&H)XL$W%cgf6P|i(P5iXU9jzC8} z&v$BJzlq;Hd{<$bGXP{aI5JsVQEWzU1Z9y5SpuJef5Jr}lj3q=!)# zP4nrnTl|&^z!V%l3|B7%FY9h3tEg2O@t`j*Eb=OdVD0pB&Okimn?hx+YMPx|mplaw+`O(d+{4fjk?A`+9o&A(^m$9?QGmG70@+Py-^Cjvp?EIXPBXg zsO09XOn&;w#=ewt{eclLOt8Dzao$}H;1DN=edj00U|8uqMs;WuzdX9AGvuLk)>SHH z0BwW=>*_%F1VV7XuWiJak-SvvpZz88jf+Yp_|HiaPNVN^{X+Dv-Y@_2&1P~k*`^=PB$hTP%BWZ6H$TrIZ z3Fv+UtTD5@Y~FHsTKi({EtHNugtg9n!cKqb&OntBXs<-G$ZG%j@nu+~U$!`Af7zm> zP=^v1d@D56-=@Picu#4czsYODt_Aa9v$PRWz*xaUHxQmVY(mttvB{qOb&^c%?ytJb((aCelwYdz8G`Rh+8Ag*3|nrsqG$pNVLZ`QOaa`Kd&#mUh`DqU7wgk=X8zkR`_q|IeIE+E0?E*O z643kU7Q^Hyd#hgt$wFo6+#%%=lN)6ZgBlr@bOn{j;64N2%;-fz%hij!>_hHlEiVj6 z$@N!loD*ViSB6Wxlpq}ePPZ3nb<$(}QH_i4K?Psp^U-e;Y3y%e5+T|bw$?yJ7zR` z?=^(Nba~o3<;s<4whVhn%GF^12IA5@Jo(jA^mw`S^v5j#2j)6EO zRwrSlh->df2A`Vq5emgc?A^?rv8D_SI|U#KE`Eotz0G5#e&wKN|`WF37kn-g{sC$z~*!jwNlT4Zno zpIC3{SLFSf(l7B-re%blxSclh$|#gX$iCl;4l@0b7L*xQ7S4cb+#52C1nAydizV@{ zfN43)(y&X|=u2f?T$BKtQS0mANde!pR#J7G?W?@X2Ru(@^E%CWm|!h?nvjj=HP`(%q)DC&vis#U*F?hHVmgiIEaZ!af1{I<+7Q0v8Wh zGsn?0mvi0mTH(OCdMkFD#rk`Js~lqm;Q8X{Pmj2Fn0MlJO)>rq%e+VL2&pLiavM~qXs4SiD7`3NKlSt5t20`Z3+NskO`LmX|!ee6#V zEXg-abURB>cpqIrs6TDq2?I#s9csQr5u9zuO}NMj>@}*3qvO6sb!w;QRyaNnM9qzP zYOW`hoLEo84w_?~r($G50hAsnJwxjK?J-$O=jMxUHA6ID7)ZaJy~({m++38B?BJ)IFGv zDu9U4H^(v~UUsAlK&Tm`JFU-Qm=*PO5De?Kb;Bfj@Ix(@mrMzK@j508^!U%JFxtscj2p_ER0L*}jpB`{aDc1?jY)C**0}#|(@v zl_^Pg!8+|;2DrKDLvZWeV3r%9H?}2;FW06iotw9K<#|R}(v_ORk@gx5_du03e+b}M z>Gn-kt-wZ~?q-%M5kZr}ZQV9XI>VV2igslslV9>(@-Fw`_zSD!P@+G)?yzSwplY0D z_D!bKi%d1(?F@jjk1E_}qnvI!y>@gUg4*}o@~lvVcrt(R?j25|vGe@Q0~K2D!gAdim))LWo-I{kci*F6)cdb|6BUspDT0_;laI0kF%Jj@D zO4ZP5Wv&co72optL$vUzh2hX~|J1QlX2f`cpeB1@=ld53@BuT$?GlqRQA(puQd<(p z#K$G0McSh)hk-&L5ANAJ5AmV0biX3UqpWq}(S)#2TBxj$=%NBG^MeknjM@WQuggjK zW-IAimNKfwRU`!?%vJAs2&MfXcIk{oRPd=L`B)xALy1Ll&{HDr4ntiD$6mQO3oP2B zka}5w&vy9%_kKcHMOiO9R$R)4&+-lk2Uf!8fs`5!@LCn&3?@MU-vs*4qwy5V2TU5p zf&HN#4lUCBF-qO!^u4v=4W$MRLGsJG2-MmEQ-%)beu99AuoSq3JcDTOX9<+ijUg{( z0+x!pU&{G0XGE)Xp8>5k@$;=~Hj-N7^+kj|gBXH#gVStSwt{7EcgFsro>%q88+Ro1 zzup7QW~eFo&foRLQSmHWun@A9iVHiDAI%|OWARvPI+QRVL*iX1$QAQWX_SU@>z%3- zK@hI{yjvir6c#S(=XT0fL<)4}{S+%I^@aVoi%NXqH zvA`b_fVxAwV^9=ieZW*H>G;!G1Jj*RKW<@0A-+!I*iP30J%bkzT{wplq;OEmx>=_JFu)^|) zIk3qqh}#|Ip-F&_uIaM?h4Mumz{cea=6a5=j7vaFLAdiZt+#iw8A+T^tpE%JC5FK1Q8x>6?E%~Hnh zqV!m9U>(}(e)siJ+vPGID-@M#tb95y)_X%SEy#824!gsf+Et-C&gqvXt~$C<%MS>* zmx=>E-?&e>P=zztGrNSj3Jl~1#?0LRh`tsDIDD7m1dF#;^Gf9nFV#D|dEnV|#J`D>o4a_iIDnGEtx?Z43>_QqwspFzfca z8uP=?W%Ke&XfOb|YFp=)EpY`jM_Jv%MP7Qxf6>x_nlt9X`5KDl?4 zN$+>DC^}Eaq4gs|JBaPJAONGXPyjYJ4tX9G3vARM`fZG3u&9UTplqwZj&YpIh;uC(r(eH=4^DJE!?~Py+}a;|MN`m>nvh9Z z!1+bF005tp+4+2Cz4PEkmX6{X1joA7=h6=}I`d%R0ZM(#0aFz$TXBWwYvXURYN7H+ zY*taBu~KUKiao|$cVCPMY|r-gcn7+j=7oMCzN)e!c65-p?@G=`9SaS<8z~4|hPhD4 zZfR>+2bEaVWVq?N-1!+5dVb-urYg5X>ZQwXGM0j7`R^%QlYrAHxqD8B^SaK<0D`5c zS3a1fb<*oxqZ{DPfW`5HW*>eP3n0yEK=s(r2}!)$6h`Cm_i7iCk9nSEBA*$5n7WOB z!e%ar3yxXsU^Sr*ZK(b{LJX25L`d@?vzl07wDqfWIzB(R^t;`4dI!Sa*Pclb@mld0(?rH_6k<&I_x6LG<=?+F^J-5V_NEgZ16P4VbJb9Zr?6; zTPACc!i29;`o4ybNc}4FZT0iQyjA7lhgDw`1y+B3q!2%>BNTwd%}Oo<#OLQ9OsImZ z+XbogH_6`PjO%<@4)N2y&b@bski^LuT!+L~{-ZKQ$2fp^;y1&rxKXy9fdtW0E!|wYf9Tgln6zt)nHn<&I+8Q^da{2Hvqi-j>rwoI-VlM4| zf?#Vcs*P>20;>DgKct#PLuFoClHO6aYGCOBH{M+bdJ{y+IjX6;4-drSQjpM1(QqYH z*IpQn>x;8)wt^nI?YWZrmiMl06jvv;7qC|#BJ7XjrX1&9E5LVQDLYT-T<4ifzBuD#uzk1(ec2k>4EOj zX!s923n~sj+U`F%9ZMRG^Y8wAPvy*QO5A&&RsAa1px@66s`nOxi&mDSlvj|e8-6cF zX)@_~dUm4n+g){3C2YDS}!DNH2Jv2;r?f}LzA5tjw(AFcM-EO0{@P$uGtG8&@t!pSA zn+{YiaeC6WviRJS@Caq}jr%0ZKY_TWyc^{-r&85!2|(<+5Q z8BXtho=~OJF(s4-yd{3;tJY-asS_S$TU1SZgZt!j5$9;yAzbMCs5IJwYC}BIsa1jG z3J}o&2K%g7=%r`>NGC8&%iAk{;XZyBSy>34{Zu2F6n>gO-fwRqzw|Xum(T@8d_a@=P5k;%i%IhvL}M6;Z_ah!X9>&_ zrS~wP-eRTqq!6Dy$1#cm#_{Ozs$E8bh?af6S(zO zz?af9l!Vd%6}CQ(5iR|}u5ZbI5su40u~(&?&q&2J--`6XJyHeD7xQ*TlI7p+5@tH2 zQ>9j>=sRN%6*fzdSpoZY7R_Fmrt>+}UAAu5UeEK>c}^77ao$5L zCb`y*eLo>@{4*X=x6=nU15%hKNzrBvhkcSKd||J>G&3q3S#(um?&EETx!l0)kc3## z+mT|BlM6GK!>RGPHL6bY3lBcyC|ug^y>Jv{%F5IjimxrBBTPTw#c3ZVniSthaOtOq z*`j`wUq}0y9rWpU`?Sr3IqGImAwIrUl{k{}sA5Km->EADI5L?A{lKfmmagLD&p3N{ z>?l)XBz)s&ftWLC(^_0nr4*|$`5sD-YdS+eUe_d>QV}zf5c-UsZ-k}B0G&r;NC^HW zKyR{y(nNlpRIo|vdMQSeaJqd&vN{B^`4t3GKy4`S{PZ3PQ-|Gngvo%2Jzvwyt;Nmb zMKu+&aCIE`MkOoGu7%d#;cyTJ3RP;*6fU0=$8a4^YrsI1lUwSq4@F`jH+n>zJz}@J zzoag_Qx%5j>i1%%A2( z!x#LkGsN*#ZN`O_&cc-9ryS(=-vJbalK=dgp7? zRgsXYF8ESb6mewzjrg=^7X8DcbGv*!Zkq?1T#p$;%207jx40r~mM(PMTAQj5<;LFy z*%(xy?$Gq)CT)Y=?wVwth3w9L@?RDR-?in~y~coQPoPX@WI+4L$CgRD-jalYN?Y`F zb6VZY1Ip-$hLT&UXMFGGhQA|Jh6D7wU$@pq`ICd~^BQLF5F^i-MuW_c1T#R0ITiGe zUFwXm0t)?gZH2-CSFskS?$vZqi!uWo zP`37gF(T6i@NB7h@bn}3kby1v_|WWk`3a84YeKh_4i7qdnzzZ9C1SHfdAa1vmT;xe z%#>5ttz`+$IUzLtG#5^)IjD9J~D2bnr zrA(2Y%T0gt@X0Nzy>3xW3^=SgJ-Mh)KSX;dZyCG5(8=c+RJ6aSpO{!U|6@#<7WZ6B zFlvRF%7e5#jAX5PYs1_b%G23#G6mU$UP@{AQUy9j`Ohnj&R8^Eg)Vg*Fxn}9IB-7g{-@sI<1vG#x?L_3Gg=(fGUeg`+Kgw44TjWBdj zem+tFENBDAqe?duf_Ut=JKi>&_JBk@A0$6vr#`x|n}qv>)%~HOnFIgeo&V@&>mk>Y*&Q>iR&)Y`p>rs`>jYc^NN)CMe)%k{31#q_e;R@89 zxLkgwdZ-<0*>P>$q9T*n>xYS{sxU*P^I-F7kJ_#~*0JWAtxEUY8%JGM%n}avAVyeZ zoP2Eb*{(w>^F#*XKamdzZugy*&%Z1%=Qs+L9YDKYNO)ZUz4#^C{qhZVs+}uR4Tt0I zaz)Tpz5Q7LvVkD!Y)TqFMb1>QEf)4%7-jJv8n{fGD~h4pT?FQ4^X)ZC5d0TrI6EkJ zhT3gIJso(4)>AuTFFU7%-;>ZX(Woy`?ux}PYr&qUx;si*csg)xe-{r(G?U2L7*pwf z5Ohyla1?HTo38s#-IrK5gN{Ci{=$aSoYR$?fcPno5upJgN&E*=cLQ0n38UB;;vP%H}B?$+M@ks-xl=xnRM=d_{Q<7O@+Jn}MG$)I^e?yVecQ z1~Tv0;4$FC zUz@C!?h6vzit(fbER=HxRH7YJRZZ7KXmDvO{boLh-sGuzoxs^Hdj*F!h=bWO=Su9^ z)yU&=V5sC?ZZ^~6)+ZKua2jo&$4=4M8&GwjJl}V-hf2T0cJ?oSjp=f3G$Q36Qlv#l z3YG3}8K^s#Z#kZAzDUs4P)Baw%I%_ZQm!1dK`Z6?+3l{sp3WPNObt%kUPKe3QFHln z3RH(X*mE-Kv4qd4?|*<`kH$SRm~PoUZ9L1b7*1?Vtt%yCFg zyo}24&evh5!n5<>zUzDN5Ce_+s$lV$HUrS-$b-dVXJ}MY{eyL#s;Nu42hYJYO?gDx(YVFXrU&W6q~mhY+X0qfZrYyL1#LKT~yEHvAa7K^0hV z`1Y3lgNf^W&H_^U@8QrzX*m!C=}*i_Ng0{kFX~qEwmtCTtG?Mj3h%G^2H%e2qlV#H z>pbic(e`yOB;8dN4$9EsOr4t0%qX|JJP_=yFV8x*eop*QbX`o6(DxZ$l$+u%C_pCX ze05-I1w>C|RXJVLNobL(5(8D-=Q^n?f>tY8&>wMyUp;P3EY+Nn^vi%;$S^Yw6-e>Q zY(P0rl14T`>u?eF1+F>Cx_s$f>(6GITP%+=o(nUT`%(IeS*D#iF$!EwzNK`gK8^>jV*S~gB!`8U!dcX}=rP92>~^?c+W_sjj`DQ>51BF( z1H?>#V{jnVW>FySr(DCqmj5e1H>!mFgy!kbIF(O6coU5bj%V?whior?+W zY?PKV&?r&<1ez55iHogvt%KoostJamb}!Z);5QA3*pf{5CGt+=>vM#!+$*X;YSrpv z`{H_wI(3D7WS+(O>Ua=RNAKcc$khf|a-_eR+8ek-^<1jR<-;nH##{2aKGt#B=5Nwp zyq~9HG*`5XPWCz&L)#Rl%{?vvdZb)T=*xrc9cJzkQT$rO%c;vo9^X(D^C{9Rg>>2< z-d^X5C!hEl{r|Z74o9m0@BfU9tfK6l(z24xz3M7TqEuv7w<26z7unaogo`(!j7u4L zXO?Tvj4SI3-K%TQYmaMQT=)0V`?J2k|KQ%o^Ks7eobx)5$1}sn*{GVn8Ob9cexTQ= zB$Ai)!_Uav4Jx?E_F+&>{&Z2yTwIFgiX>Q7GY9jVkn7}wXAnp&|B=rf2|VgDkAv=6 zLkn)W2#i=ZSBdgMHi#!bgO_f5lU=6RN{flA*U2oYZqw@gn>@I%&&IGKDKxnHFn#r) zqS;uk1ygX0bU_QAEk=#BNPBuW{W)s0eF6 z`|*r|L4ra#`MvKA$AXDG#n%Z3(bBr|3qm%v>_TF^n-ZJU`I<3nl4HS+M&`(`X({pg zM$q%IrdNqSS)k>|2psN?l18YOAzRuI$Wy4-GZVR#W;Z0tSZ2x1-rJ|esFAmV=;0#u z3lrF?@C1^>7ch3*0NN7noGCP=4=3F#N0#OGAQHjIP=nLV{{%D2KoYYVR7=`8G<#g}kyzZ^`J`Z_VY=VA`_=%y@@h#&@mJn+2`y7Eb`Nuw=iNGjm#bAlN4V< zzm`E5IgO^rXx&4Y)4RCXgBq=b5eQQ`=IdGtkOk#Ul7>0c-U5{RTbY_PsQyj2hLB6F zE)i3hk2^US*}6*#95uwQ8ctbpN1A5pun&tQFZ;y=7=v|Q_Wyma$Z;S`m3R^bnG`9e zA@a|9nTCU$pQwIw>hOAHeVrba3L=0sFNbJzB}9@;>j9Y9b;<@|o@zr@nXP{AzUb zvW=Jh*|CdmFHoVthiyslSSBQx=`@e(9g)L1{Z3ldQ;E`5wiiv@09i`Y360eW0cIj* z_rg4aILVB#ILzkmx+M;8)UHvXkj}B$iEaOSZPH@3Pm^R<*>@g46KAfaT_)Z)FY2g6 zHpMZKsus`gxh6$!U$^26^f=-1{Tpg2o^U!2Q>wGlB%K|rjegelTfEXn7(KIA{Oi=! zn_5qs3DwdIabz~kMGO&B5M~cK)ho^8`3scTSsNci*T}!ArS=AEw|chAl?+{$&X@f+2Rn%}N^ zrqJuuOccJ*lhfVcV4e*6iPP4poZ88R8@Q%~*J(4KMLIQ*byu{4m0~?LUU4Xu<;t<@ z)Awk<;4j&q(g|6E4ZPq9pL}~f|%|bTj&XG7_ zE^wMw6Y%@H2EnH%nc`{1GKwpWRzj~6nqT(iT=$QgmHOtPb%qkOHskDdymgI~ytDDk*&LQ$d_~V20ymDjzCA%mj@M zNAud>J6@JJBdoh>-}!&Gj@=9t8+(Lm389WI58m9>A3jD~YObKKy7qL7a@cvTy*tGb zDK=%ke_lmC+$BSM9x4HvoIGQNNT`Nt_F!-89EbPMk-j$*9AO4Yp{S4Wk%y^{(O-U@ zdRZDP;y3nG*~Svy?FkK0FB1yOO>O5t3IuW18wbTH*`)YgpYL`=!)e)*$s0CIhQH#g ze{D)RzlCu7>NZzrgDx1RE$UNFD!3ZFN4XIqZ6Cz-=y)5Xp4e5S+j3OF{y$c4i==O* zc`ZxS`)o{WjV)lx!~Tu7^>gJs$mG#hZtQQRaIDLNspno_SQ&7QtzT?qtp5wM{NdF3 z#%&clzHg6r!_9}s2iiDhGmq-qUz&ZYq#t&wsP(|W%R%am_{xKBefn~y*nG3oVR#xp z1lXmg6N-1LoI50#H~Kn0WZIBe?G?tav%#qxma3FO$X_Z2TlTDkt&{ebMJ;ywA2E}1 zSXqCH*RRhh@02e01TCwa?Q>zM!KvPUFD#b@`M908Fp$8_PQIcWK-$!RyBcf~*+|6G zmUkJ-ev-)w8~C81=6`ctoQ7E!X1z28fg8xk+O|EQIXbEnEsXWO(iBn*Kc{NnvK!jJ z8HV7W(!z<?MvVCr0`zit$Jn)nzUZ&-w}e1AY1D!bhKrv#{wUhneSe_JqnQVP`~d zzh|9qd(uFnnJem(v4iJ=; zI|=OTPps(~^(3$e6i1JA!*blu=pV{m>r^~$qTH@PzYON>B~uYns&DyD(Hb6#@NPxR;9-+~fbA4_g4FJuo= z9c^o_f#5T@Eb{Tb z8R-PR>|z|OsfiJ`AUMG7@7JtaUVIKHTIfnYGBfJeriw?k)}+D90DxnIC~2oC!@oNO-byb(N(%coRSVp9s&OZMi zxdco4{7}OtGBI*C&6T0yrV}h-FXa^Q0aWAs@HZ`)4FB>q@4Iw0*As;L+gouH!!SG8 z)Af#E8!KNR!wMfk%Ap2!KB-fd_U-xzuftT>VupoS={!`~Km+!%`Z$Xl&(K`s_R*F z@NetyI-PQ~U0kkg#S(qQy{^iFytk3nQ*n}@BB3-6iL>%pLVsHiA9_`8h|J`q8xVYN z{bC%R2-*%x1uokgLi^@tTlZMI7E7(oR}#Hp7XiH$VktRDt|Y4WR^ZmTZCVtb{@7dm z`%uIFkQ#C?23%bYGY*33{cnH+)xxbC;%mv_9J_MQqf!TOZz~x-b}LO}3`xP+K|Jh0 zkb?-CGmYx<0mXGdeZZAW%I*n6al-kUX?-sDi;rX1zk3*eK_6}+Fc)U5kX1ifNU`c; zcc)FLxYYyOzgf#v#(M+NJ(*r{OX|2YvaDdHuq$JGb+IEF?z@wn82NR_FxcH128<(0 z7BV<#p&;JI*0#PItussd7$#g;``h+}rc6B@IYN*8O45A(8pT}Z&|v4%P|9=DRlQ;$ z;KbogV7$a%3dqOMmR7!n`bhZQth$XenXY~UUC-d+zIOpu^2n+!av!=#*7uGZ@=gkj z9lYA0gW8c@X}Xrn|^9HClk)96t7QHpSo#s-?OFP;uGhRa9=D_rP5%c+GUWi6ziz8LJkNd;?Z{VKKv5 z`}MD%$@C>PLk*&>li=@7rm?c~X!o>JqSq3T3l<&C&<;q{-bpmVs$u_o!v)}aqD9fS zOm6vYBQRIAi6@pmZrplWGe#wkHBi5-`entw50@+2Di|`Pr7@PzjLY5-N($$WBwlW~ zXltpT)-1KYtu^`+tP@6S1G&qeKC}+}H>3rx3-x_>WEs<$ri6p5=1U7MUIl20(3W-O zF;AYZcC9T8sx5jsJ6Y2}#Q>UlL%M!e3`CkqC{sf0Oow4=)p%?Bauu_)#$tfmX#zE5d}eg zL1PP#%|hct+=F{1@3*;B8yvJ#ym4xgcFzxHFsNg>dls-3URvis1gD6^8ZN4 zRMuJrTr#|8TT`{h^iJ*o+T+&a_irNsC9+xlM?v6lcTL5}$D+0o^27K@Ip+rwmnT^w zw%hc4db-m@`cYS(*)jsL?bE(Cxae*KT--2#g_|k&MHJE`?uY^MNnqqfBJL$xuAP^h zu^5ljk@$yrAf8tOejicPgGDDi73Spp6AteY&{7B+1pQY_UclTs(W@mhNn=ov zZDVscNE5k2!v7!g3?;JfoUT*~GX_PI?&C;m`2%?{vJ!C~kb<)0ItMxtwR%EGUQI;A zV7jIcrBxwGTg^CQGv9iI*0XG^ifw##wLXWf9gG$K?N`b^74skf6f{1R3W?6pqdpC8aTifw|+IMSn{Z z0F5O)3TT&7P`kX0vW{u72M&yRa}XwIJHB5%0p8v0Tz{t>OmE&L3OnZK9b9dFsJl~$ zq}AWp#}?mBH3M`X+UgB6RdP^=dbvQ==cxd{fU4q1rC)ktn07mNfq1gG-hJc1LW~y> zf=(N4lKzv0MtgMPtChld_;%3n0{?_N{v=OvM0)+<-r|?vKoo^&ek^KxS~Ch42P$OP zJ+ZoV0VG@@76E)SLOSU9q)Y{sid^Lu*p+6~JQ^o<2(L+i*Cn_en<`6>)WI=*ykXtaZQ;UZW4Wd9dz%hzN)806(JN1Lb$-xJC+dJ52|A`(| z{Lni3^-rl&s}jPZF5!wEg>No$7TSK!s{$9c8c)$SlaW-#`pIY-)eh93$K6bicN=k& zD=0)?b@h8@H)NSHbTxN&h|!AvKibfv6@_0-45cb4W+u{OfnS!x*`UWjL%h5^%$Lt0 zyPF1u?42y#Hgb5v_Gar&O0{4>#9#x!jnAKM+a4wH)bx;wK$7UV`3(S$NaNwosbMA7 zX^cheVJ&w9z3bJ|_Fj%#t5g%_IDM`HH)@$5S zn(*A5b=~!?SaFmm*_DN}X^f9-_h@(;17QJ_N!wlLBz1K80V#j=2`A__4bsvez(2l=Mp zHU@`+7XuA7XC2Kg#a>qO^b(-k=^tD;Tnich8$MQNcG6Eh?J-vU`79jRF6exdjP~wn z4BVdOPZZ$`RWfa0W-6{baF!_ zb=Kv;R&DIijK1Furnk}k%{dPDz_jGlhW$}`C3Sz5KGiMT;J0W%U017z$8HOMw+$e7 zvWj^VX0huvgY>f!ReTjF>O|)lZB-4qxj=TVUrR3@KH7%L9OiTIHfGQS963%jxy>RlBWPiJUf@?k68b0cr;a8e4ro?aDEIto9` zI*$9xf@Bdg1(WMuYhwkQ-;k3-sb}1%QQa;Fz_lQWXRwg@U^=hH@~Pz~1-0yDv1QQz z>gp2}!~w5}!~QqJ+!f|)#)VXE%J5U&p#@8jrJv(UX|N9^=8AwSd2?x>h1IWTJ$x9V zSMW(CcrV+AT${devXuU!UsYGkh^m*i-KCD5(*E4dfIc_yGZk|%T}N%Nf^xU>bmxy3 zUOyB~t@s^;?QK!WS$;z6bpjce!6Plnyp3u<4kDvJI6E@9)gRQ1SnSr=Ucy7B z-jt5ijE#UtaP@>#)**er4cFVdp05gH2MDLO^DGXl;@)7z>ZZhIc&tD9k>?~RnEo+h zD7JWO_Iv3})-xFRw_XIeZVF?$@iJ*+5E6nssk3=}?1+csURum;fIRm+I&T}Ry9)07n?P7C8aa&=T$$ES&rh>?Z~nv zLL{@YL_@$z5$@jwUR7oVF0eLDf3~O+=>NgUt8z-av7Bns2M^Vx$fiz8476!p1j}CY z{7jv`{lmB_zfq{^)(8_cAUu*D=e400usoYeAKMxBTZT$p0LM4w9f0@OP=*xEQs?Jp2V?f+@e{Rj; z_~jF)m>%ha5{wPy$G7;b`{~kCPKN*S0STmFnZUo?6BeN?5y-)V%O`$DVPXKo7=A32HPA?^*tt; z(H++Lr};*d&QuG22aFTMWe&*_hpkKCJEJH50D~3tM5LrIUi!Xy#F`y+O<|Q!;Ze>q zmmv8RICoWGeLe$oXeSBa;{(IgNAAd-`U)h8|HuyEB+v?0A&j%-Q_3q{tNDR0aAa|l zf8SUY1{l)_BfqlSkkzv-FFWjMqD}N&>Q?<{0+kP6m=q*jMEn{sdeIUGVGJ-nT=Avo*E@bY&}WXO)xs8-uAwk&C!eFQ1oex7k%QZg_wx(fBYp>}8sGHM=YU&>NGAF`a7&Et*tm0t6MJX(va)iE zr`S9;2^Jy6zpu+V-<@eVj|%;YRs1b=|EDtG7E{PU zc;bW{5W{0VLOmolBsgAs$Fy&vcGs2ds}3IOn)z2m9OZ&wAMJ8^Vl);Bd_^$>iuUz$ z1mUM(3E_&|qAmI3d*6EpUmz#!f^(0J6e3p~p{u0Qa?Q8ugB5fhnHAiUV~xxh|KeG| zpyr>W1^(sK4z2TW-p}=~-_qsvx6?O=26&i{{wkDLM_^LM|K2}+>HjcXY<7IJUlx#q zi+9#CIqY5CnbgiiyBe%nZkBQjLa*RFoN6_kE@Ua4a{4}*no~bBy9-ENMki{=kqo;U z;sMpSg%o0TZ`pF}i1Mb#{0s?sO6Ox5*z6kIvslfNDt|L1;n9HrcwM7P8`!=hQd&5@ zojlL8{%Of%AJ(McqpeQ*bKV>a@P&zmq!LdQGhp^%(xk3@4IK#3I{8phQB`BxNUWiE zWRG00x?LnjF8XBJgGe)EE3Z)6Z}Te>sd&4KBmXzn#TDo7a;lQUL&o__w~QR#8&uz( zQIZ78R0MgzdI)r01oIXc9_?t>wH_uI0hUSEX87Q^W~iDnV*DBDoLAv-6@TyZ8Ja$e z)~lCNf271Jh1*Tx+C=70?S-8 zhLsO50StW@yKWv}enM`FS2(0p6KYNi62tdGpko7|Df2ur2Y>)@KtC-$I3qaN#x_b^ z>f9UAP@YvjZ8g`Ld#+R*)$&K-OczNhS)wz69|9X1|2S?Hx;!v`-&hXJ&%So2o4!%K zFe5jp|6Y%O(Jf04#lARZv!!7MvO=VjO5tFSbt5^;NE%cUHOso2mkN_cW>16 znE&}1^`KS3HXsoYW_p``K^y~Qtc#$I)2rl0&j*eQ?`Kc)^jR#!*m@J>%}hky^)=Otg8s=8CGz6Dgs+4s+J0#h zJj#)S3|h+IXv@l~et^l}62fVk)QgS`8fT~1pm%S$evaV`+S{A=9Yy5Xa3k2!D}Ynd zFt02CR$Rm8$cf1)RUlf>ZU%nqt*LgP0axw6Jjsrcsi|flnx7W^Z1cZiQhzo6mT3<= zAwv-au8Hz01c7PueIoJUnB!3sNH{l9x|u2r^iryd9!%3-UXezjB8IB+vBy=099S3H zH&bGL8KtgvY_X`PS65`6(JK;at8Q7#?)Q+ zG#PT}^KmlUtKdJ5X*fnQyOc2#!1&iOu>0*q7gQi^lCxRQMxJ8DZNNori-JsJ6d> zzPfEMWRG(uvgDAbH>;KxHGSIZyOffz_VgkuKz!X!u~2|9q8tT6NGM7m)Yfy->!-xd zp|4toD3E}`9st)m1(i`X<$mE_#OQXog?cT$(SS5iYwM1?*#pqJC`2LfTKHVgh zD{~4AYP#?~Yl}B?UvF=T+pGy%7_4}`J*S#aW=;*@e%$lZvpn>urj3RL?)E?70sQ0D zJ-M3JH_ThscS;+pByVWlg&UMS11g&fc85>~o{q~$$Tj{g%6q$4^VI333WrSvV(ym!-h7+HI)l+|g;|2msd*u)G*mur;eCqV-xufRv6i=S+62t&$_=6Ckc zrP~qPJ&GefAA$|Q1POSn)KBbhgIKSQ6g&mt_4Y1g+D>we^JN&pN)OaWzSJ%EG!iRb zZW&TfLS8P%gaF%p{)0W1&@=NcG*U6FN9tMny?kR}^dAdt!#hrhaz}=k<}nd9wtI6E zFDjha!Ot8Ivcu@~de}&%*HYFpu7$u0%d21Q&aB!V%(?JCSrpp{)7t{eaN~`U_4E9= z^kvXd`Ss<~FGW6arv~*vf<7A~kpWsJe zt~PsJB$g?eSN_YoK$h25WNAt~$ZTtjG0A-K zb+aR6|35)GW&OhjJf)-&Q-GV z-y^P|&kcs|o3H%P2f0PyXXN4b0i(R{U{Fk`${pYo{R(RTg0l^C9Y zHSUp%*M+OZX6%CfprQ=I+3@byP$`P{MirU6`ZKbJZW5wekYj!IDRP0~$-NQ%r7Ur$ zjn=kzhnsQDgXT@@2A^}R&#Le6I?OXK!X5nEloW7H3T@!rIC8CpmZWjv^7O6*a!RD) z+9x`h!&L>)2$*EnM9R6XQ*J{a^< zs`T2VMErdGIoAf2E`LXPpG@L07+p|T=TSqP*Q&2Te!^f9gW2TtH>fD#r^T~$%Er0c zEvk7b@`$%}@vX_0Xy5RQE-D&5VjN@Tq)Cy7h*M;^r0ov~?AG zGRR)^EF1XqYGU$D4*BoRvUnkwuAk9lEJj=w;#8cw5QJ76D!r5e?AGfytaE zD=T{)Z@2Mh0Xy|G^&Cl3Yv)+t(<9RL`~4E5eoI}{mJn4!}HJp1B6b-+<|In>z8(q0;SIf$!0F~<6!n*=?nrp6<7*uWH|bhf!n z4Mdx#ELoi*^V)NEOZ^63K8zurZclhh+a3O>k?48J0%o)y_?4lkAg_xLmRC@!-R@Zo zjDfmB%A&7T*diX3~1 zs`g^qG5|dmnbMcZD)z~;wzWG$BWBkNz6h(^UVKe6HU(1W>sNx{t*+S*>QTTdgzp@z z9sBAm^47&>_~jeIJ+ZyNG*00(8tbT>(`o@xUi$)IIqt|KJsC(YHIjTit$%pe^DUINI8x=~I zy*`|_y*UUZjPjsAsZ&#Cufk9$mCY1)k&@oGEr;LAf>^Uh3kl`cjk@F(hG-#fzX5Mr z{+O1P*qZ+Xn{r<}UI_9!@8d7RxSd~Ztm5I*{(yV(^u_p&7d6C_M4#!iOZE^;;efr2 zokUM7$nDi7e>pbi%V9JAN@Iex!*N67IezKLMGRO4c@3=yvb{) z!yf0^IxAqep`)DM63w>hLD!}`-xcQ)(7;bt*|*^(;Dld15eC9=PuFhWn+0KB+POda zW}~h6&_Tl2x~2N>Cig~<0?_Rp!`@3Nc#MDf{F)6%(L&s3znjA3Q&L=H{ke`$Ex^d0 zRXi7=a*UGj=F9GpR6DidpeK1hucnbbs5wYM>exNDbYAtd?swN}|849IzlRESpL*Ix zvr2=Gf8pwr>+&#AZ^twj;l@u7xo`oVljiuR1v*chaU({TP^{opr;76?#sfrX@i+ac zxV7=GUsmNlVi_ob=*B_46wTGv(q+LGe1n8$*_kXtcm#5h7_e-jAHY7b`}}>@dbnl+ z>HrNZ?u)!eLA05W^6lrFmDj1Dj|W!3b;B<_c!3<{-id$bzuRnNAqjjxODPtcGu4Wy zWG*|$;Csr#A2j>^#Nw~ZK9mjX-fD6j+twYOVc@zp9J35*RKlCDnFNj&mfonT-AZln-c|V9 zamvKZ`tu*G@q-l>n}PnW-RgOe?^VUG&ThPD@zygqi?&O`Z#}JsZyJ?^0V8dR!|@Fx z6tk`VxO+tJ#dTS5z}~A}fVSE|urRfq7v&w9^`8$aRyC+N@|kB+)1_wK5J}tnkp~m{ zP#P19l^tq9PshzISDlySaVxxEZaA5xCG**qf0v+4l>0azH@79NZex_bb5E>TR3z`f zwv~`o$c9zb(`IES+;?)Zx*33$9F=SkE>;p9En5l!Pz?vDA*@+^b=5xBOX8XD_J@s| z)w7O28G#{ZqAfMq6tb5lLU~pAXlZCy%uyHAXECoby(hQzbA9@7%h>;K?F5#OV$U_G zJz=$z$pV?LTsB^{?+YF-jQeM80olWDg#&Msi=71KLiDe?Ke5lp45iESq@D;W5Ns5L z91#Zgi&A%gd^?w^c5mPV;z>cDtvp)4>DnW`15N2*1=#}$_CN$M zH2%ll9{3)>KI)@B8N<>cue0`xWu9OBE#&!9Oakhdnl7Q(4Cd;PKA4mxG_-5(`_;$^ z_Q{PKNXf8q0OLED!rJ_L6`*rG+55&RjTdc(`(6q^QCtYIJmmmm6B!WYt&)!}&gxwy z7$-Td3qzdwj#CWxaog=&I zaNxF)j~xMg{o$%8J#b*KMpU#gMYodKA;g^nr!JEc81Ea&WFOEsYp$7id3$mCH)UGs z4B68l5i>M*eu<(rN@F-B=x8ioKF5*AC{%thyZ%^|7lomCXWz@ljmMP~B`>5BfhlCA z{GT*X(!|Tn4!hI} zQ*mPt1MDKtVipS}p71Xyn`u{2dJ;Ujhb&dK6#wb7&wZHJI}};li@8CD9Ij)N-mnrI zN{JKjS%K+`yMg=EN-w_ZF9nh}7i{|UXC5MFo7wF5io@Mlp#30g?GG*n?OneI;Ub(% z>64Z2<}dH9=$VM?m7gn0ce7LjHD5i|xABt2{^q{OB>uNsjC-Z6uQlhyJGJ^Z8}Tmn z?&K)eHF7bnyF1y2?nA%ENm=>#8wWst4j1gzY-w6bVYtE*YM2RR0L3AxpD>ao7@{bk zc^aLA_b>>U@HE#US%TsW#m0OjEe%Op&P)8MwC@9dtOkEeDOawHJO|9arm^8+%i4V^(K8u~UMY*=Z^{x(|o9a1oH`ytiKbb7&EQxLg zWlnbQ**20iCzB2LytN2TQaaO7?hfu1p|UOw@QtCdy{T0E!Q6&_m)veuu1lTH^0}5` zZR(L}{WBnpS)=ur<31lehH@dqco!mvz57z4)TKm2OkoWwRvl6kZI6B0Ds+XtjbS|E z_qf(Aw1AYXx;8GxOEWVx45)Kg3RO$a)sz`@7gS@xb^jaIUbwxV?DA=pUKjGh4v_FP z?B%oH&CJwm^N1drJHH;6jQSekgvru=2^snMQ&l=iN@AXr8E&K{^B0Wy^|S_SM`}&e zD5PAcEd#YTllc|Q9Ks5Bsb9O{o#Z?X(_mT`uTJzOH8m#3KH*ux7MGoUzQ@oMpRy4f zX{6zDy;QYB};#~9?J->yq(Ut6&jFnZT5S}Ds(>0VZTsHOJ)EZ zZff#LWXe);HGf%(Kzm2N{M*_%=hO20 z7WsA00c_Lxt-P__wr5`-A{p^k#!W%a$j>r5z(FXuG^Q~QH7gZVE5?tl#+{@q$CU2 z1>z}h_Q5A*3+D;gm*WDR_rk7ytp!!+ewaxLFZ%{sxY+)ww&11u$%~60c#yl9W=ZkB z^WrPb#G68v?go;!hL~o{J^epN^Fn99HCiV}Vlmlw@+(BTW3nztyC_J`RBP_^QKYyK zgbbAHBQM2R94Z;$-QxMx=LW#W*R$W;OJw>M;P3M{M4A94s1ScvF(`NuUPPLV{+Qdd ze{WnAadc4SJv1q>3s=XOLqE_ApGPr&EuTK#g$KML%rOi=l&JSUxsG}L>@_M>RX)qo z^b>feMZe6+>|32}g>JKZMxBKKDC926ce4Bh(dR%(#a8oJk+$)1+oK`b(UUe-?8Sb2 z)FA~4(B^Y0?<5*B8KvO)T46NJv)211O0OYHBIISVo~S*}^$|+1Sp;;36tI|pdze^G zsX+Snn$ZmXcDlAs>uKE);QURbGdzResy96rdv3Gx{GXI{641_W*@3S*{ooRd8pv|A?QQ#Ay3l=+=Q&&Y}MS0gv${wjrH|3vRw8}s{OO@2~_ID1t z#z_5hA|0226PcAw|57g1ay6H{Z*X}sOGBnC%17Zi;ac=%LQtG77jDp0_C|s2F+klb zsrRIoY?tAFqZbtsOSNqGaV_@$)}#Aj{bs!VzJ?~#{1f>;#ugm;V%%(1meV+J%P-Ch z$C()=vCX8P*s44)Uq{#olV2=~mbKj{rSF|jH~E&M`c0eyJXm=^I>#iEIg}*IOE_n8 zDAhvGvA?bf@hgt`rYTb$cxV+FtEltomG5NsGoNf&H9pY8Zu+(`_2>kCvaeTR{IH=% zGs$EeP-O4|uIq+%%@f;s?>|B&Q;MY=DuK6{ek4#(FjH>}&)Y3Qo}Ayrc>PF24PuR3 zr`452Ey4dj0=MI+(1vH$&2`&I#>~=CabnBSml~jq{J3?#fYx4;-N~so85VS53JnZ)rE&_FL7Ky{4IWPgogSd;?xC?lEY} zcDGY|=o6~-RL3Q5il^#qM#!t>OjrkzSIp>{Pu1!|=hk4*W8mvh3d`boV*G)_1-Eh0 zl%L_#Qr55eiXq>VJwIL<<&)@4f`3D5C2GsP(8*@{+M~P2+z|ZkmKtrLw&%r&@l4=5{S+^K3|Z9FH`K40$%*oIQxM3^>Cr6 zwP?hDlxSabuz^z<;xnUomQ5vxOiwvf<5f;;RQp+mIqC#>{s5PwZ4K`>#RhCA{Oh`w z`qw)%N8d2CTj=hJ&g=tXym;i^J4;-scC4#OTC3D4{(*7D%&UrDBd5ut=PBAw<^tlo z;Vh(Rz>Cu3@?LJ_Q~AN#>#OFt@ba;}X{F<+ayKcIUbZYo`0iPH{xXBG;T+tk;I~x# zVrluB?-eg#L;f-5n}iUdk0q}$pxFZrVZ8hE7gtAVW&!jUgn93jyPhxG?;HJ6r?~mk z8l<_=c|{=6)XL|?$2H=?uwY5KaRf(p%!~%h!oz;q3fq~Omsjkpa!<`$fX4JI2^(M9 zzS?kIO*`S$qoJ3I25+tdTa6X@}YXIFy&7TVmwvE9?;pHbwWiNTZ0^Jg1CfQW{UTOqSVSt;HX}&Yb_s5T9B2!y%L*#Qd~`t$a#qfk z>x#R7LOaYShhH7^bkw!k52EleXomA=e}Xu~*caj)djlZQuim}sUp!;B-RmCM=ak?7 zR#(<;Ik!cZ;wN&v1c?l?Ucf!n^|kM*yJodW)hCRD>1zrdbb~J7Ikuy>Vf6Sa=u?5v zW2ec1$Sd8(m&Dd(`#rAJ$5ryZp@Yvci@my_I9|IQrjXcEr3bi7vai4A(mUw#Ie|AX zPYQ7IqO8YCOj~Mx7P;D-mt^PA`xw{vGa%8H6z<5e(6MziY@Us=rM`mrxXpJ3d9d&WwaJTYseA#XOdAmS zfTb_R7)24~8|Uf%0IH&0S~d2Ojq!;y)_i{}+mY&L%MovrI5BWcXYO!UWbAXU1mEbw z*e<@BZ`#aI>zv+@{=R)h3Ncf(aML0V?e1kRVV7d-*JRhM5@x!|8JDXo z`V@q0fNu_OIR_#=o^;w-yWv#`Tr+~Ee&=;@C#Rrs=q>9`W&ZI(9he#MM5zw>+DoV( z6rIN(<$6#YWO9rimGtNhT2r&0-|&$a}yirhv3H> zSjK-nFZGid&DaoXz#T-HX_=?5yGCsb@V@EYwT)Z~Y|m1SNav-D&nYuqVr?Eqcm#`` zNV4{kM4T+jNf#avc|T#=seDd-U0F)hP=CMB~cw;NBp_p}p=a=E-N_>41?N?+Y!YE1b zjnNbKwZ{Z645YwzB^|{+Oa?KEL84=u%Afg5Kv`dc$`Ag!uJchYp&efHEPkH=bpN>}OMPQ*>zyD49y0lx2a>d3MMymdbxLnlTNbCVggF{Mzcs zk*NTil})|j4_0-e$)-LZE2eFpz-NmbWdhybuTu++TP&x#Ph008uUz1W5vHR8KaZXE zoz-;seZF7XSQL53LM?V?H^0QlHKsOV%A0LktW#OwC2Tii=i$~5IA|ZkpuMqyX}M^b z+oVj@9Z(z97Y+D&vG>~nZ=g+l9i1M3?wHQY?g)CZVz|?)R13x`a$CsZ?5s-;G4pO8 z_6j&EyE$un!$OH(_qC1_vi1MCdJC^8*SKp~MM63h1cn$;1StXOp;Kv5X;5*bI|qhF zX&4UOT}Qe>LIjB+h8#MC85)!!hx~5O^S;ko@An6=7I5u*U-8?Ke!O};;^bXY+cS}@ za5+nco5E2k!1#H?IVq?uaGLgN@#`R?&?|e=%NORl-kv)LmU$GmVv|JrSg8kpe#Ewz z3#%L4@aR(QoG>+Gj8To7D3&`8y>BjTl`4rYavg?zsxO5c6kwIm0PmDPyL&o4Qy+z5 zrCN*2<$bZfJ6g^@>C^A1Pqfrlf8}ePJtz zKj~wU%N&#^wvvyetfMSxc7ngUhwWN-q}~{Q?_Pe;iFV4)js%YM)%;{iG&{Z|5-n#A z^I@T3s|a@8xR&2EsQe{}olS^-pn%GCr9-2be8s_+n5r-XT+?09b-kTzI*CG4=_EAsz4#4`vw%K@9KeG6(8&ejaE4jF{JLfoj z@TWeGIi*Q)Ri{o4KC0cnHEUwSIOj#mfwE^?wG;G9&DnVk`nYYuRa5Q`2Y%35F-Lf@ z_2~O=UC))rCH7={>g=*RrgN{B1zqRMux!CtJ7H^s)g&uYN@0(aG|nj993I`u5a9Ct zfqL6z_~z+1U`a(A_XwV$T;lfXt87f~{akMsxz;u%Uc-Te36WjLOu7v2fAFzV7?XO?1>e zY9tFXr)&bw5T>mcH5m68c`rR-D;EFht_z0n;O0r-^Pz-6QfwxvJED(?8g(ptno#xM ztjqV%SMD+j2O<8yb3?UZ@NLJn>5~#P%o##ny*PC?$8Mxl*zhP3O1dub2(*yqKBz2Q zE6>sHAyK%m@9-w%dE2M@)u!-}_D@oeO6$tP25JPFUwZY&CP(1oKI5j3W=PSyh<=az zz!EDRcfNr<0{Tx+Wmac0?Q7)n$b=`vfD0-bD1Xw@xOwR9Y_{9_Cnd%%aIXkde&l2u z+mL0dHiT~wPJ0`5k|-68_yT00)9df}MpnALV?Jhz_c&r?Y-7c2QAq-ex}`e1=GU_h zqHSM7rU&g-)JFr~u5$LQY>(Z%tKm3Xeg?3x%4ytT6Svi$biCp7`xQhXwrVa(1$|-1 zJ|DaR6uQ8P8-E5^+^qc;nmMT@r_py0|3jU+Gbv1?lJkX+5m^*%1t_b0OMaBhTV*lt z?;y?J=bGQz!eo)|Jy$*i3d4+l>!$e0xwOl(n_sMV3>#B;SHBqjG}ktob#MIx61^Ux zA#awLC8TW@w01i;_OEavO0vp-X*NZSjRq^ZaO%Oh7f`z4&ekXX-n8sA+mj*@9Eax? zXF$?IjcNaW&cuEnGJ5Zg<&Y(%2(;>=qhb}ZMiNEj9273nSi6`+n-~Vk27_N^OV*(# zZ0&kbH91GFzOD4DE!hD8kIHp;^-D$mpLr%tVvf#s)}5a=)thX_ISc?=L3O~tu1&r@ z?Ab?RpkDP2h2}@RLm~--rHOo6qO^?hyI{VP^c{rtOz{^(h8q7cYeTMeIZ~V3av!5a z*MKJ?2;7LkHX}mPo1F6Ayjk1w9k_I6Df(c}CVaic^Vt0CvuY^JSS)$t zb@bS`=eQPDxp{Y%Fy#v%Z{MKfG@vW)Z*lG|>_%GTA^0*U^gs<><7@*c;oh4nYsISD zz2F|apE&_mFvqEQ{}JGK@FGtHBOm0kB+r0ym@PeZQ^K|p;SgINdqNXebxoPGI!E;D zCndWi#WbbZ=w<4`$#Czh!?&3gpbbI^9dEgy!mA0m5`MH5A$zx)tzi=Y~%l|X{nkP+uCPT|B5Km5+3St_k;N|J*qieDZhXLDoJPw zMDU+Kl*mlW{|YgIM;M4NU*25@0+e$rfTc`v2b^_526+?GH2IgTM;{ZLUUi!w6Pq-F zR+GcDl%3by%hYThoSH`8cth$pf`$2wR?qGvYA^zZ&isCnYOdFnWuw}rRi8B~k3X0R zQ|?IA3*4)>vDg}NAm`7nc0Y^$<{U)fjhKeLI~IEoND zvCnZr_}eloyxA*K%5b@+lG1Z?C!f%PGlp;eK6e!Hb%o@Lp{Ci+?c>`uY^4mb!PZam zvf%d;V9D^B^3tDa27fZ~(X**%>XzjE_{z`l%F}Z|gMuGJ6-)lZq3xl*aNTorm9reM z9cq20II;%3U04Ty!2z9NRjvWkV3&(!T8-+) zkL)4(Vf9J%a9JWGH8ygTa(3UYCzWNgXdU7F{`JHZL|@EPkBGh+mS7SBeQ6^5D<--PF-4H*@*~e zz9IRa_8PjhB{$XWv2cN@Ejsq?7=Xk(O7b0u@|VNcG!nD})O-=q`Eh z-!vz+A%zH$;yoL=0sqtyLJ=n*iIJEAj>N&U#~|7wxs!mEr|P^%Rx>At%HM1T=@adq z*6Z)9rSvp(AXbnPQP*f_V}(tl+fMK;{?Vt>gflYZQsVj7+po~?V_G6wW*Ze)%(lrQ zLhRcYv)1fzbY9+r9daviK0U&w0~;a;N=x^=vB2j=E(iyre7?T%hk&n>wf}NTL-(|y z-KEAWCyp0uELQdtDw`Y!d~bp4x<0BJ9d_?WT9&8*+2$WRDK?*j%I=_McTZFQ&sGG2 z%@%h6ZAZlIFy$h>3K~GwhPl_harsG!^_HEh1UGGR&&)gKzqHgemhcv~Z_Ppg4R=+s z4zoWM{V+ti{e!4qd|`6lRn%-)o8cqs9(gYSFO{aT82)Q=JOQJ+nv_ zoS?5fPAuV?=0TVzW`vYlE|0va`Zv>W(M`g9LbL#rm22ltWK%%0I<=Q;Co#D$^&r0E zGSJ;!-Mds$MaMx^cO*Kqm^CzggmGQa(jmp5r9>Y8JtZUj>^~lBCm4_p+;fO)f2ad-PV9nYRJBsjBSWL@oJQeQU<@+iAusz z*o>Q=wFfpHOB;UPH0P1{SXN&RsHOd==BRZo4EV7{PJ4p5z4-J&4M+3WjOu-MWaAhn z*l-t%k(8t@@pZ|&ZDXpBEJ&ZWgcs~zWB(;Va*ID7Etx6Yp@Z@3)g_$Jm4B^|2=p3C z5PECChzs3ka`p?myU~|PvwU?YUxE#%bM1tI;Aw$VH-Yz@H}DMF807HFtJ7WmnL6kj z57PO2m_SG}it-(9kRTV&*>9Eh7`(_sc33C*XyMr>>7$$xjVRy$KL}m{8@u+lLrZ$) zdfJDOWb*OSyi2Z+(@p;iguhSSKb)RKyfwr82LyGet)F`}y4m`3{Yv-&F5Rzv);anP z9xqB$r1aFLa_qOy>6tU5t;v?8DjJ+tV;drHFo*Yieih-aZdv(CUt@)HA2?*^{G4h2 zDA~&?ev|xbdl38~I(ucMNvs#@qn`&6y~d*+4i`9@4*GSz-^hk|jaJp_}%?Dn7R{*vHnH(OU;8%@gNS>9)4wSz? zAKeqp63K_$#b)0@M`Cl!Ekw|{GEtc^5E{MpGH7Um8lpY%zel)D9kJsPp_Mkh?b-|z`=f~`4OMQLWz7*2ccthX2D zOxV$uo4Jyy$^yPZ%O~;x7d**$7?5v9xpvD!|HM;FJFVpjrLs)3aqp#U$d8>_D~%k+ zajkUIJf)VF@LF}J7r-tNWGxtY?Xr~SD*Is1XyVD?EezOvVQoHdrfesH-|$pF$R1-c zx6}uO_uU(bbwY&$<<-C?Th-rX<1a2OxtG3{1jyGG$$`hfzuq<8MarY8WXX+Xr2}b@ zs!#ob?XF3PwSWABa9lU&2AZSyBk0zLJ;eoz`&`|qp`}}ctEKdvs_Z2>mFRa_*%RQP zy3%AFCee>Zu`2(u0*BNi>x@lT`wLn6Ibp#ct`<>OC0};!TkBc*o5!S!V(hQT?rr~U zim^R@xTjAUcpg&Kz}YD3o*!%L^by<0m(QQ8Z@1jTGVh;=vLgemuvCud;L_<|R-~$< z{}zz%5mjpp$~K&Uz$}MJRb&z*zdE7@Jw#M>3}r)_c|7|O<}m^FgwNs*OgVM-?P?j> z4jYe}QG5=bbbCKZ zM+#_godk}~<6z|;@BO~Bv&Lt5(kk^xRCZ~f4ySMCO4DpRmmdsGeW4kEUeNm4#NV z|5;~{Yv0VD?@ePJDPJz-EBFsUP;iw)gp|*kK|sS%iyHxBzS+J+oKKp@)v;Y}?UFxg z4+RP?Rg?U^HTaP!5Pr}?XyY1FI~?>Jcl8Q52{Icm4=dDLY32Ojj8VaW{Ym;opUd?K zxsc%0#P)R>ytHyGs|%GraK8rpKz|+p2ZdBXMt%^e5SAB`@&X&W+!XijyUU;VD}QEh z&v;kTKsG3X39LqZpB73(-(`q6OY#sL)5B^)IMno5xjizg zwPE66vE!=(nJ>F3^KL}ghkZjEQx}@P(b?5-A{RZ+@1K&DP+;|{@(fjTT|L#c7FCw! zs)0}Nq51K(SCkR`%LD`I5KDx)B;U&&FNgau6%2vtVeD;KQVW;(RhLf`teF*ry=s>J z@{fTriy1b-+*7^hMEJ{x6e{@2NM4jX35`&;Zk<&q&V_%cak4Q?p7GfJ_Qil@$QiN zXLJcAKV-JGT)A&3dnm(@$UHgsDmrS960j}9SLsfXnFRebd#fUCoB>eG%QpPll>*i2 z+MwgXlD1)y2bBH#M2(UJ29ph&59!sRwIm@mVxrzE{X2FNbXqa;L11hT8ZFP%t3JuCaa4tun+#m+A1tq>u;TBf zd1Ac!568aUT+!@!kO(;y`mO{7E8StL&$A}jqUNByJkJI3r{;W>vPu-S#NKM?fAEp% z4!*c8^#`j`T2hqVu=x;~knHv=rTX?(RcV1=h;TVVz>#d;_tI)m(ldkX_>L0X`TMI9 zmEw2ZV0jH+GqM!Zojf~xjqNH5S82}J`e>zVs(|MD2tzeD`81|wH-#333jUuGbNZSk zu}hbjCmIXC0`f=h_Sx_KNZNpW3Kssf^6010VvY-T8P@WxKptDBa!0#GO%0p-rjXGjn&Heu7TYf}WFWA|(@qztMx2#x(*UrcWQMDkH^ z+d^O03_)Ibf=hDPdW|`jJMKAWzQZ&nCi-MhHw7FP>L9Ert zt20%(Ak7YpBvG>QhO(=%=Zhox_G*$;`r+r$*4AIqo-}S$Z#ZV)@*?vR1hXShlpDvk zO8eAq%GkdJ(S}w^Cw2QKxtXx$mpgwFNEb8d_hcJ%)bJePgC3HPI&-TUDHDWcj)j(d zyZp2o^WBy^l>x{|J|fZUC_|VJ`xmi!wyK%a7>Ofw;uU<>QT3d1<1jAgs>~YmFzQ3q zR^sa?5|3`VbMqF`t$h!&U`s3@Jans=qLAn*QToX@LESITMHYzaiUpY;TQp-Dp7lR3 z5D>K%u`Ww+!TR3|Qx4G4rJQJ^m78*O>pBZxl#hxN1TiN1l8;KwRIiCNEd0~F&OkdP z&072+WML%y>#X!f6aNq))E15+#1b_$eq6|N2xFKj1YBYc!#R9A zuZ!EDRINt_9{2IUuEL7h+(IcN@-DFvY;$!gKli9GK>woasAN&9SD7Sk0VTLfgQ*Tm zzPCpAw_(;E;7Ll@4<+ag+|(Dk7X=?d4*kySZX~Z_Dm`7LBnB46Mer-Eaz}bIJAh7 z#^IYM`v!t#5;_VV!w$42e^%%wil^*H(Nxqwv^aD3D}cChhjv?Xd@w@;?}m*S#51-P z1ezeb+pXyZb`}ocg;gT+!!(*pw6VLP>*Vzkn$-1Enq~W)zQtzzpakaLo+S@^hQ*yb z;&h^=8j{YtVgbPB1G7D5oB!8zno^Q9 z4!1+17shKSRz(x<+-<*j* za~CYRk7;&`{8M^FS!flRG0#_RPe$+!H=r5usEKn$Ppjd#nB8?1)JqP85;L^Dte^-) zi?asLr|_bL1iBkIT~*G}F$Svzj(_nHJ0KLwZO|r1BsISkYz|Vl#XaBPNKX3H!;>Rx&eSjYk$C)NcBIk|@vi;^j|Ns-F>dI$;i_yI4bgWZLl_srDn1JE?hj_!NjbT zTt$c{pM}RX7fgSD?|aw7eK^Nnc;w7-Y*hnPZ)x`QM)xWmxUi-qH30}IwYz(eaCl-T zBQ{dlbRqrRS4YiKWjs zJ-B|T%PRR7Dzy}`D)lPpVTQm%sU(QeeoOxqzf?i!N&Ipd91DB-jbXArLhZ$DE@)sQQXq|wIrolJPRZEzGR-cEu zbqcX@^}@C`=n`F3>-Bn}9u*UBWUIwcFj1jBI-{({PN= zl&YfH9)7TxB(fA@Y-UnSIG9;b@gpNwQ>nHz3isDcU{tApTm$NgDd5hStQ-Pgk(kxN z`TN7*CU?RtK*7VeuQtam)Df&y0hGi(YLjKw2ag4&i*Qs^Ra>HFZnN-evm>%vXN!qp zc)aXhHsY7Dj$dx?^r0j-kLXBq&y+o zVhB7oSYcmmLvY7s<5oSE`8OxVsUJ9a$9FEz)8@L_nBvGHk{zm*v~H5MT>Y(q5l}LZ zhcozFcO3P+<6Ts*TTE_jHvAxpn5m=eOb^B-!fX14C3lWZjy6#im3x$#( zAKHwl@C}Lz0_knhZZ|e))4%%%vqiU(R!46T6ukKg7!TNV;Wnx7!qyEM6t;kTn zG&b8m&)&ddJ=D+W#K#1Bc*9QJTykfJSw^{;y9IibwAgd>#ipj^8)xr>))3rbzGf^_ z&$tLYAGgnResx-@JBm|?sscD=ZUkcyvb7%54;{9ICx5<3cZ7}{Yjv?|$(%Q2*Bj$w zKOb?JWvLo1^B~Z9Ri6nS!V)2DXW!coLfsu`9WrR3gt+Gczu4aSNTzP@?wh_qpkB+E zzyOW9lA@I2tO#V`AJj}LwiVDj^s#zM2=+@Ku1U`M0vy9hS?g{f&zNo3cKhJKN_5C# zkk?^@7P|2?u1@07kA+w3-IWf5hag=+#60;i@*$lE*B=PsthxT6imtXaONgk%qk08& zCzNhJ#HPi(_`5K=>oHKX*JcOzXrpt=pqmA|L=J89&-|8Fy)`l1?Llhc@G|_^bhCY9 zD}YI5sW+wzE-Hz*+V~}TNUc{{1~>UL1kO&-^i+TL={fq$Etekw-nN9l&=~zva))Vd z+^5rEBTMt{z7Cc*PJdey<0fN`o*R7Fh(+{Uq45mRL5go1`tP40 z|39`Al8-i@Dg7E|Fz3#?tnlhMTz|5tn4vB8_!iw#^|khgJ^LFn~O|ZgjGMK9z&&&xs0t??xKl6FI{*XgtG$lm#t8L4Y|bWNSnpD z&)mNDRwk62p%k`_a#q#mOFk#FN+3TWS>{9(udqq>IsC6T7ZqxH&2(EPu_@XAW%Y=y z%`_$Qlf|!>@U|xy{};znQpKoH2bi-GNKOX`0CN9K-k$9KQQ$iLdf8tbLdT6^bT1IU>vp zzsj1srRA~n@4Mmq!=B?A)hD>d8ilBWT!G=biCgp*j!S#a?bsfh6x-Hm5wR#F z>tPRj4iBym9xq@idd0r;ZpG+Z%x59kJtMVKkm%CgiRQlSKi1f!MptfWgDuUPH@rQ# z@g9G@k|B{~i>Lh|7xp^%URZ*B8|;f>Jxi+=KLf$#`tD*CBccJ#Rc{HvRAcw;(f;)P z21!dk!xXdvKWhB8|6T9tv!`?ijV;ElFxT_M+zJjqXe6pIBW&k&$9mKeA1Ym9r}yf< z*$^?yIWr13DzMHEY4wOeec_&d-BEF?LfuJQBB|;2^>&1osU;6Hc>RfWH%Lxgo^yVA zqZuV{u+Lb~Jd#yHfiwK!D4BRNK47H5Oq!YJNW8_@BEdGUah%D|cHnwZ1Q^VSbV0XI zK~zmi9Sdyn3tqr@i01|WkX!I*+L5{H@9q1BT)q#A)Fs4{ozF2zgCH^+ z?L5&9vU^xUAGbk2Zw*c5#l-F=j)+4CADne(OE|8__x2So!sEv1Q)t_CV0VTgfhT)A z21v-fKY!x%?772tX7d3eG$Zt7`RNGi zyw#8j9h1YTzrpDL^JA7v1H6M4eG59^;78K2^@OMsVHlCk*#CArN_@zhpzQZVOQ)d) z4VHf}H$ZhK>N|ZTU(g11;a5#l6KKSf-+9A8rkl9aG1)cA;S{^vk06~JG!N>tV@?Ut zE{3_2F`nx=;_z9@XQ5=c5(FJ7EtU~(*@1YtD)N^<%`QTeSTf%^%`d!f+qH4avB^07 z-nnA|QA>31UHH>0Qf(jV^4P*lX9*ZBuwowsX(rS0Uzn|t-8&ZYr~JUU72aPmBkMP% zYRnVD65_BnpB;#+u`krP=BwLUzdfF;Q;}^8AT8EHT|x}?**&zji9M$bN4CX^u30qJ zUP`m5pMSUtnpQ;9oI|F)2_~$GN7a(wE`?BLkv~4FRbzGQKvdt5A?(o}wJ^i!+do>7`+6l|Si9P*$+@KLS|!@R5dkyYQ- z;O?pUM?uO+?2WST3qTYvlvoAcmm*587!48>^5Hv3&~hVIAC$O7y5)V$+M|ua^giOS zC5U;B`FT9k#it1Dzbt!*O{)4qKRHD5hPwnSb|uZ5z^0dl0EY3^HE}0_#^I~(?S*Al z{3O_VtmCS#yigb9;~ACWD~8zcT{c0gcM^`f`r@p}C`rQn$A_TC>{YdH!#GDmyT2~O ziIC?z(O7)0gLGbo&cGUz48!S5birBaK(Mp_UY z^gCO-sYyIix7>}A(umtoY$8*_n%Dr4$~Cd}Tzj{0E5Rweuf=(2U4&y>{DA?G*hJ~R zOT}Fm+D;bZubC)zn%1~C05M{n_^Hce&2lSRp`Eim`HD4PDcIk_p+7XmxQ=Curgm~oP)BOD%IcfjZ&^sVwmp#z z-T*Ul~>Po$ob$45pUzpjk~qrf@9N!X-F(1jXsFB zCuUZj^=?=Dh7d7huvxS1A$pMeM~-^5YpLM0I)inbkTNhBM1J_1ExYyw1{(=?O{z7M zJkBB*e3sqkR<0raD7Qd%?k;-HJY@PCq!a5Q@o45_Pei{kWuT&z`P!Xt|7{ZTtLAx5FkOGc&8;MR zvAFZ<_qCZQ3&@gSqTLBlb}CP9`aBDBu!Gu$y9P5YR=jfnCLeu9-?NR0*`LW-8 z619uH-W(AxIMx^EZ_-mnTLfGkw<_fi5?qM}w?;U;ys8k7&r#qP2zKApW}!>!CP<=p zWxn$th+M6KYNXb8M(;bo%2`Dv3!!iE;5h(9q>GL~oF$03Fc6?7oR1}svNT&r>GJE* zxJ@0)a8H)M9Cglk7y4ya<^fi|Vfo!l4fFU$&qhkOY*VTQI$~oF%==1w@pn&#EwIwC zKcGo#enGs=iDH6$9N?}$??%|CNFSX`c6AV|*F~RkT>?rwLxv2(MQp z+2kb|NM!)sA{nExMsD|6TF=6T7&!_v6f$G;%Q>MK6J8Cb+mh{qs0V43K5r_MGq8y7 zV(pqnjyd=CGhVg{KJYjsoSx}T3HAx%V>o~?Fa|FzP~}OGPTbCF%!v9?6#(?g)uVl) z3WNdcXUcKhNyO;BP(@M`p|_3O&S_@#UVj~z(+Hg&h}Po#)r%(>cU|5Tu#=*Kg-v#zZ|Y-YT0gbiwP*Jz{h@5>!jR^_l?2^8|R>EZblT z8VN1$JbsK5DgCKp4Ok9o=4{GkFk+Y~fz2%;V2!y5G;z67p5hbr{A?B4%wFgK1w$xG9D&9Hkx zlcc8!P8(z1vcSUaI(QIo3#V(Bfkz-cx#RaS3jOSrMNai9ZNw6>mN%%a{tuv_i%eqB z>IIN1I$!m5N1aZ6)L@Saq1 zn(<-w$|1Hz^I_4-+-SHR^o7Wxuc8(ge!7xaN(AtzLznKfIKtm1r@lQq!i`j9@Nf&3 z9}!hn=q%F> zfT1zNFb=>Ejv>2uuEQ^@xOA6YXHZD>L5a<2xmhISJ&5fN%uRNKYL&z6*=MfY==vhP z-Z4iCP18clj_~fx@tCMU$SAm{R-gTbAjT0c-v``K%d}G^b-9k@*`_rZi*q8a>$;^n z1Bxq}J;CPw_!PbM?vRx+}Z-r137pouF z4$4Tk4ARt}4+L^Rf+_ZN0`Mspso&(~LaNQOY$twvD;aKIV>}*ceW~ofl%mB;Tm&|A z4zOl6OY;tYig5s7r-OO3X<)x&tixIX?^EGuzlJv%RshB7rS2rQ;Oo;i1^qe5u5qkF(=0(^De?8D!?l$dI+g>ty zH&M^g#`(ACIPiC1vn3Q*H>q8hg!-3j@9s*>f`t;6?{g>kJT*~m?5+uy`p9g{3>!e5 zS+d7j4yr-S!;~)viUp2tp42=5malB{hC1}6`C(45G7#iJy?V>i^e$>Vayl9$*iN#H zdt{z1YU~D<;hGTw>Ob`8cdzm!nVkl`Q@iW%Ez<&gZ;ivKMU`QN{E0l{40=nV?8pKK z4$c2O;nU@D;U^LxB6nz?y?nJP*?8o`d<}SoW~f|T!N_{W*dl4ZlA?5GzQ*8}QTr*Q z@{kXMM`BwnN5q|pWBbGxr#1qcTN7GRG8nT2*gf@55LYO{520K-tn!Y?b-q=96IWvE zmblLWb;M))PLt=%-)aMhJz)@65Zd4*PtlJx*d4i z)P6GQK)m}N|18f$Ex|!D?{kUKZK{+4O$_fPllzymoIA&WN789v;m(yc(&}>5Gj`$FSf@IUTbOCj*U1g^uR5kf@S+yo63Hl&P z^3i!Wl6*@=CUGbGN+R{c(DvaJ^#oueP%N#ehe(>%>#@lVH_oXS}@Rxw8Nc3I2%g4Pp=Dl0k z4yCUjHp0_md)|MubScZR|97gaKWx>qzmdQa#n@<4wejV=TLW*$-ofSTq7F30{yU&~ znMyHb#9EogUn29c%DUuxn?AM8G`pWrk{Iv+w%tCh-q)-ScyaH-az(hDD4;PvSicHt ztiZN`i1SXKQLgPWd&XJHKA>LGp_G8P5*#QdM}(7Tgewn%g_^V**Ad|XwiRw4csHhi zbU#o~w*j4*;h~Py7UCT{e}<|U@uFXa{YKXf`orY0&sL>f^_(@=?uY;q{y>-#_Y6>R$N7Nq~UzKM(EF zrjvfxv}?>7o8WY*)m>;*^*Y1~wgz;Nis5^Vti1nOL60!Hbze#tnwUob$ z=aHK#US}Ds;zMUlbMRWad&NA9I}HV@c*B8osxLg23k1o*KJsaZv60 zZtycU18hI^1H5oh=F-*QS^ZExKg7NHX$kkyxu{Vn6aXTS-x6@^cV-IIgtR}SPuN?Z z&8SaO*m{S={}VY2E1;Kzt??eH^3%?Jyd&ul>RtCc&#*5l>su$?T>H`>jP zQXJcee)yXsy_sYc@%gO(@U^-VX@wDRS2X`60$(W`vA@6Yk%{5=;GNFtX%+J7*kX?H zw_j@U+rcQ&^v4we8j%!34SCUbKMvy3Wq*R-8`ogZoKL?_gr4I(3PPYcSZ+N0sL@0%6l_d@hfw;^^Ghq9iB9YC=1BC za;~bC7ReZ6$h`Gk;cw zU{&BY=>;@n$ai52m4zEVDL@X|?rAP&jXm$H&fcq08MSoey`gET%;DBQnyi)mdXzrj zI+zBnpB(iKgJ<4d-e zf^;e-ZVj@+FX07z_>viwxf+m*Y)UgB3$6TYGpV=n+q4vAv>a{#QZ~_MUZueD0Y9|C z+Ulu%of#(aqXzH;-|N+!o(&UfT(+9NCFmgg)}ka>v}o^+e?NNlh4C1F3^TyQ8e^Z7n$wV9da_1r%7Y=vNBL^+YuNSf^q=z^UOjD7Yat1+hH`h;0EfGLG4luW;zv{dMKVWW)hB)68UGLMFV)O!j~Ulm znua8u)tX|bUzZYK74}5@ZTjFTp_eA3BgoR2n7YcvhpOt*=A7kCWn!Yg4gGgsbjX^> zB0sQp$#kL4I6t(|V+fm(anuvSLnZ_ViG=aVDCDE6r&<2p=v5a|1mWBVbrjS3I`L6K zncVCnhsrsAC6;^{%M3C8!52Wvr75@F(j{`b(Y6gfI9HG{9nJ8#gA8i9JZ3^Wr-bo; zMDL;QE`<@Szl1EC;b%@a6>$=*NWxnC6nPBQdcSU6{MFd=3uD!aau;-t z^?)+SCOOK^R@eG!Z#fx$w5M?7@pL&I9@uzSCs^Xo?>na&oI7kec94caYHqb`K=(DE zivm!pxcl49c`V1?HhORSt;rx@Z{^6pGH#5l&Th*lL%uo*lj-CznHIO>h9x-WN<5-J z8{opR>&F+d^~J0BU_TF3vL-Scej??YMzZa(z@mcyxY|kvpB%AbtPrpVSH4ET$f0;?!42MqqLu9N+l;o(`uqO4)Ii?ztM-HLzDJCF(mP6=LNW%upCf(A? z6P*Q*?NAdx&ne(X=3~rsoB>`{RONPW@DHl3QAi|@Be4O87)`6D8kLFO-uaXe@ zh}|T4`si;Cxa)ryMd&Qriapbow(g_PcOZ0Wa9tmCH{$*yN>FVtYN4`3KLlvxEpOfE zBcp&zl&zQmSvHZG1MQwP;ang)O1qP+bTlo9}&1K3hb1KGxEK z7;S{M?NDWE4Z4n>nEd6@!#5r1_mZ2NAN5E6sqz);>~~KNJ)v%4ivS`4i?U>VPqEqR zRWrrDZ)3R=uvDjJ9j?nL7Q(CBm39ifb;2DU_y{@7PP|95xB)h@O&%82$QHt3Ht0;X zNMeJ1z6#My4ilyckL$;MN)#4Z>Tm)h8KK|qyE3P7Dh;d7Efdtf&8bQfjlDcrX?{Er zWMC0XeaiJWrwAYU(^E23`ne&o0VaxF=11*VvIZCcYE;{c@zyiP&byd#sc5mU6_$ z$Mm*MS|2rs3^W%)7Xjh)d%t9Oov!N?d`g3qo(2E<)X`)KZ0+%K>keJ;cuE)1i!^|< zjC2jNc_Bs2hf^2_h4e3$F4c<>K$ouKoT#;2RVdFW(OnpF*)FCecENS|@DRpxKdn`^ zLYv>nSeF>8D)JJPps)-G0XMi7Ib&+Z!r1ZXh=Q3Znx$ zB|1!3OJ!xD?GLB;k1-JpDYXe zsSl(*Di2JctnNCf^*6HQOEMt0r^F1-JRNw@V1u1S@4*O7rx)BQx?iGISZK{=$8QP_ zg+_VB*xTjUf3Y|9PfitKZ#%?@<`WMgvpf)<5&q8Fz=mk@FV`vnJ zMwOY+qZ2-x_I*5~az~)=+RLS9lyO0qMsl0~B|(Y;k(g6FJKvs@Qf=q&82kzLiXgKx z4wUG%%AF|0?5)}!z9hq?>KA`bRtnw$*`vU}1kcGoA4_oqgJZG>sPR1=34XJ*rkhaz z-x|?4eO(>qF`=78^Bv6!h3Jv(z_s=)iF|T(vo?45NH`p%{{QUf2&H^b;!(o$`b2}$ zZ>_AjBd4BQYla_tamZ2!`ItWH++X=>jNGU%O3LT?n%r3sBoNu^yCXvXv`@bM-jZ7B zyqyL9<%_irqC;qwoftQrmH2zxI-!h=D$L$8EobE?IffE};=6PeZOuLsUF}XBf!#l( z>I>-WQ}PnGHeWgEBgvrB4`zYDmqD@}N$%&iV*9H#W)ySNyvNT7i>{7{n{b#Vsi#{H zvWXd`zYSJ#9rC=3CwB6Ptkp#|+^B?yO9hHvf26DJ`bLO-#Q?1b8Bl3Y=_`MmmD^+U z8gI3`OB{RR_1?dV26&rQ5v`?VfN=x)3W%+wqm7)-!vrl;?E4ma(yB_Co%;IB)5aX~ z)v$4HGD^=~Z1|~49}s$SI+Xx1+R)cKBk~D@d94~gJkB5m2-d$g!q?&T5lLeP?*=Fl zU$fCAibP=lwB)i83^p$pMYtjsr5!CVX?3~s>=}nN&0_|$DN@9%4GmsCCPigi zkQEIPIIC}dr|H-I+R5aa6&>k*_+oU9;5MAV0hXRb*YW z^x=1WipXmyjyw@)Ol`iAnxUO**X%hk-TwxAxd;=h3Ws-P)h+_vtOQU5_>OPKvD3}o zlz;7u*6p-oGp5nl#wfeH+iy}S6NQkH502j8v;JPGW@G`BQ~YF%m-VB0>`<2D+UlXY zP%tgcncd5BdZ-5seI$->2|`=cwpkEdy!Jw(_a+k+lnmvlEA?Rf>p+qa1`+rr;UB4< z7cUph&JfAs%*i5?n=ZpH`qYQX5uNjYHgH~>oK{WM298zyhMxaI`V@^;uwaAGtw}l? z))Q!|;5NA}Gua{1OS3No4i@}Nz2YTqsq%2i-L2(J_pwy`^eQmSc`#=t&F%310}Px6 zu0JB2Ik5utE`DLkDFM;@)P?a15Zq+oQlZK33OHkO0b9#Tet9EL*rJ&+kxjof9xTm5 zhW&^5XlhWRcbt56vDApt{s0(|*UBc2xlX2e_@k~_6HnIIuBg5xHmP*KCpK_#Cg(D- zeo{pZM93&cP%X#A69cq?-;WE^@R( z6j9tJnFG0H!!LzYXg$>cA0EMm-UeR+Q^lhK9t-tEr44_INhw33FrOX8w7Rmd{vw9s z&PO2d2FOtGvsdX8rE;Yl6-mS2b8tBL`?5ApC%`*PC+y~`o9Lh-J4vu6~7b!FX(-dg(csS~kj5BlXzSjcc13^jY; zEl-g4(uBGCq9(A>(#X_{)!m`Ko5SG$5v?a0!j!-j~oJulqlT; z0b#)Cks>iVB&8da?gl|}AThdgbdK)tp0D@koZmUW|6ph5`ncckx42%eJ1UrG?scv4 zXnV6Fz@@AP2e~RiNpH}Ik{TBH`;sSNF}}ok+zvxDmTaYO;pncoGPVD- zE_5w4i@CBgMir)s=$hd>r-mNeN?#jTb3Gcc~PQ-DvlR z*npKW;%yNtI!1BGBz%BnKU<80ZHa4`wg%JQ&x*2~G>9}VK$0qhu5CS17h(@WL=|eLU81bRuT49O=sqHPq6e@R2vSlrwc3?=mvpunB#KO;g8Zk zyh3hD&+RM&wqP-eZP}i{Cx}1K8V-28_Bp%)oh;Kyz$t@R}#PRV?&TCDsibN}V8v{5Hz zuFN;_0`dz6B99VZ!J3FAT(Hmz&DbX?Rzw2jE?-fhCy(S9{;JFvIQmO%n%>ZI!O@g# zA2Km`^6j^c)-)%5?t>da_U&77e#L2TasidT6~!V_Jh)>k@5JAzQu+}iIbt$#v}raF z;!iNonIf;?>$|`w$BK*;-)4|A%fL6OxRTBzfDu|>R{ZH$CEtI| zJXVQoDV6ry#26ApyoQz@@S+T48UGcw@!kpbfmqrZ)@k$Dy*KF1B#-Fj7P&HY4oh)P z$nqRoxL}UTrjfCBeVqZn`gl5UPX&;CFT zw7TKjk9icUo>%C@=5x{`Xz9JXVLOoWMOyBz7iXB>Tz{P(a)@OU*f;eGnmD{mfnsyO zJT9^qBpV1znWTFgh)A0KuJ;`-)O&H5W;qaU?-bfJGX$)6LrT=cGfoWVFXFF@##46# zlQEJt6k?wAbkNzkSoAHn1tC8!{wLdZH#>jeX&h!|so7IrrcOa~7S@Nxd?$cnV)GAH zS12HoZmcy(<<4SE_bv-$58{pY{NTm~HWj78-iKr~WW>SIH9N7DqV-qeT)TICgKu|% zIbs}`iIdtnPqoC9ouP5r_Sru-oLQDah9p=z_V%+`=GHr#E$$Er=JovxEmT`lYd+yc z7eQu1fV9-J_)12CxoHN!OE_MkBe7mte%7MiurrqQQ8@5dbcv+RPH|+I_gzZ#xiRSW zoePVMP5So*3|hvdOlD*AzB~xSAi;!~J|-07$S{A|ew9%UW~BH~Wf-|he-iKii;zU2 zR?WWYBJr6f$ymPo%k_LiUb>F|NaexifiCbZ%5wWBk;F`|`Tu)ryf4(wXut@Sg2c)4 zH0~WNw_(6t?SH~W+0@=V(S+Tu2f;tiZb%N+kE zfaJoAf?Qtk7w9tvg{8@#Pc4V`g}$Fst9r!Uud_4j&9g#>Nqpw)Ai#ttUFFyX-)`e; zjaNz`HSTrf(EK(rvAx-Mjm*EA#Wk3(0GDS#bAVveOr@a>;lkx-`F4ML48Gd`hUjcc zWK_?Q>IY-3b6^v!@7+%^nQkDMg;Z`~d_sE7oL+ zH}26P<(IShBEiMR@$-XtR$2{PIsW#P#;iv>E2~K!xg|QLR=aXvd-Z4vvYwO(w#y!k^x>_T zbY_G;T_*2+W!cQZW^!sjVL~kK=RI^{s;CAE)^45HB0}MvKM&x#KHn#b|BJLQ-B{r` zS*6{lf4UHR&908&R#Y9#Gfd^=kI8qrMMW(3qQMda{LE?Ztv+1*2Y_drgo}s_cewdu zZW$-?ngKB6Y0qhTxHzWyt9h-Z2f8>ZMO(+=Lo|BUM?~}gr&?|;)eQQuq2a~5P;TpI z>DN90n7MwQYMLwQy6SCOYnbz=N(lC`gD*NRe;?nD9@Xc>OK?fK47G1a3Sz!?JT#=w zPJeR6z3WpF7m|ic3`-A71ex>g|37BV)1Ed(Or}tfh$3c5{NY^<{WA;~afBOud0bqc z7}al%Y-p+A$y_~$wItS?$xHli&)EN_FW~69P}=om!+AKti-eokwy8$Nb6DMTLtLa! zrE&FcJj?qQ$}rq_Hi?O@;EZmnx0BTnwbM{3pTRQN^sbdPMmQg43ipWpHCW(KXDQtp zU3kDi1f}|zPAE!jPZ^PrUs(WzddRjWuEoGLT^=ai(rb*`CQiKE`|9sra{IHz%Vj*3 z<+k|ZK6#0{I6P<{Sn9*CrD;C>4j}I8*3w9{lNte@~D?h~K62W-bG z5{-PzxC;RSH@&s6s}>m4o265>``OXxMbG4yc(6Q6z*>Q;71OpkJS{WJsI}(}`Xk8# zBGdPLdt;&w8C>u4GTLCHw&c_<`qcGAjX0j23&a~;h4Mg{`5#&~H4Gg>?wIR4z$>kIZ52%noSeIsVdL=iXHD2oK9O@uWi4O;}XR z2wT^sR)AY56gah4yx*vl^s8zl!}xGtjc%6(9eTRj@~0Zs&;IbEJgK+p6tdT&%dr1d z`a47t51GRQ1gXzzwk0QtWwic?7Rd0jVTcDwi1%?W#+m4AMpH*V2gNJRZ2&h(poU5g z`_j+XZ;$on>b6jC(Dio4llexe;ZV>O!ALN?!vkTu`=js>@9{R2G1rI?=3DaQG^FYS z!FsgY$MShR@ayQ|txh2b|$y=KDG>UOVmqm?5XwO5#peP@i4Ew_hPh8at?5!*r+i; zUFhjy?E9a6_A?Eo9zvXRPeUAP{q<=P159sI4g%gA`b}as`ZJS=rYRSXit_mxYhHO9 z0Bfs3Rvl+%}cE#=Bd%YtYM6Qw;AOR^=z1sJbv1~DR>Kh4cA~6odG;$V6 z7N;UtL5UXu!NVkfa3#x+4I_opmu0(r@|bO$9HcV|pwJhPlb@T@WT;cvj(?!sRRY|0 za;!l=MQ%ZVdsGb!b7tX3tvN@rS8zM}N0e;%M_+gU!It+T-md$kL4xA!I{hU$QegOc z{Z?Ep104y2e@8V;MU?^t_;u{w8?E2gF3X#8$q=%ULaRw)FXETw3o%R?%%P5mWfFA+ zvMVJ*)QXPdb;8TGYilZFP-in@WuuDd9Hw!fvi;spenLD+?D<>3a3uf|`gd2L z@k8_*r=}Lzm$YT^O$NeKEd;8nr(5-j1UaX}YD+znN7R1Vv%E}F`6GO{k}sk<<|DkgURjI{|cJB9+vLZEOngDA(LZj3MQ{&bdMS!r(T z_|M`CCMxG>AV@G4PBztEX*lThUV{mwk^zXpYW1n(5iyNe%K%ES)jSg^nyB<7H&Jm2 z%5E9-I!K7^pz#L#dZ_cvX^{>UhU)Oqk-PG1EHY~6)sOg67q%6p=i)#(gW@<*%%SRkblE#fi3rG!+>?)6xO>O=V2ua zpWa82iPAYeO4c_&Hs_Y4fnHM7!WpqT#Dzz|+d(zbJz5wvs4b-GlKa$fE;{>ktc+Jd zFDL3~HRDybH)4Txjur9wCKohD7G&LZ4`G z_OWJ{%fVe^afta;ne?i<$CXzRB4-|9X{6k~zUx=k4>W{Dab+G~_+hZ`3pe0pKsivD z%S$0cQuY@1nry7Ws^t}wmGoO1aNLSpw)kid#nmDq*{i+>*C-AU&`{F4AE)Osh!+5* zTCRIb%R2^|yqFWonUY;s{Y(bb>$?S_{803!~_vbIbidX1G3&H0*!xP113B zod$tLd*PgoBjv2na7u-BG#NW?k7vxGY^BT$C~yT5R3=FhdqK* zop@`-LvIqe;QjvLRgHvE`T)LWdqidJ;-?}>SzOmPj<5wUqfG=x=bJ6s{e70X0J_S> zE)8E<#*V)%Tz`dJeXMvFC)&>h6q|!b1$|7|*2N2hE9FE&|KhWYswC<<`m=otyXQ__}4UOl&&jd?mvduw*H;v zo*p~zNLcoq)Uca86YUA2AEdEiLb#f7a}}NmO(<@qS%wei4_)@ZcR5_IHCEYLttQ!d zE76A`5!(~r2EMcj64|}*Ri`?M6ZyQ^I8vu|s{3?jN}_#aNSMkX5B648Xg0K^tJb=4 zDfPSUgT>f?6YA~8V`u(_c`4xo6OY5cPF4tvbGNs@2-BM3XIFzNe$%#k8K6Lm5BSDN zW;jhZJn;tGlAy~{pN(Yaf2zNcPg2!uHmDZY>Pkn!h zA4WLnAUbh2L^})eHL2bT;`r95&)2i|(RkC?^kBisOZ@$h=-d4zri@mmaQflC;$STg zq*Bhm#^{z?UM+G=rM&Ziw4>X0D$_zQh|LwXrt*d*N0H2CLZZxanuAQzl zCYg~uB~8c4eo$B#4-ola*uUg(P#cgnRKTO1&3Q-t!M%jX`J)aW+w8=x;eeTG1v7L* zDEbO4eR2tiWu&nGM9}+)2{DpmmVu*7TCq|+)Kn$hRny1532y_|jD7s3y{;!x0Wkis zu8EQRAXM2DL`q@cHvS@NA49z>o=1L5azzQXs2DC$4+=fm{Lwra954L67RLd>&A*-a zYPYB?z1~smmKgqI_FPnn++qxZ0P3^ASQ1}yCR7v$!^f3adPJ!32%B=O=QVN5D=cltp1 zX>HlpZ(jgj1NR9&cI&cMpV>LkFJf)8iX+dL zVTK;%%^iF@+L&FOoFsUM;O;MybsOSIq)on+Bvk#UK$nww1kF+D6ZE*XSbwv)POmfe zHNu{YQeAg1PI`cKH0hb1&KYt;3oG4&R_HP8>lins&EtLdzVlIgag$Q}w>7m#KS2{O zuZeY4GOTYfne~F+aqm564HfiCOy(v(#xSi7`|FIvzQG<|4B%1XamHi?jcw|AI z*eENaX?3UzTmSxLS^B%O{J{d_ASo-YB9@B~YKN(=>95XnxZc6NyLzEn>xYbRWLQY* zryfQad6Zm@T)1MLmW{huj%RvR1Y5ydCUKclR0nOZE4M769%HXZ6uci?aj;>Uh=~l0 z2J%X#9DFwFLGTiL=;@Fn%$7~pQ#3O0GY)H;?f1zrNqnGgJ`?fz?XuHTYtHbajeZ_VdU47|7Qs1jRw`p=$t?~Dap$Z7j(wN{;bOvV{CbAzFa;~XP+ zRWn*e7e+dfB%!Q6Ly;+}1#Fw`C-cMHyz7{UMTGvWhOY*IVpzsc%)`YvmuUDgDb5qv zfY}cIK79`&tJoX9M1XT2^zlp1@72gH%#6BmD7F{4w%fsRjf5Cc;IUXae(>jEhMat zC|gA1CrR27+rF5FxUR>t+siC0$oDs>1c3?G4q=S`YTvM?Pd;AF>-nr7&uzn~N&~#- z2;p)F&FgM!s5u6O(Gek@Sf}-V z*kfQ5!yhsgrHXoN(QH~WZESE?3vu!R%m%XVIg5&n{W}MeJUP8B>%?*UdazJ2#Ix17Sy^jhFj`@J=QsnD zgL5r@Zfb(C@bL%sQQGw0XzO9|TdxCq=(4nOKcj+_sl{S#+3W_$MyF(Mv7LPCf7;X zpC#pY`CoRyniktzzd^QT$%Na#WR_eMSFXVW&(IABp$8P1fF%{JtyBalr1&s+mT5)r}5|Tdl-c7J#NT5|ospIKQ&0 z>m($hZePY=ZcZ%YxG%@BbV$jK@|u=kUP#^PZs>}!HqZiz6e8s+w_{}6h7{kHWqg^` zYMwv_-oj0T)tjL`(?8WX z#F*2u+rJNp8AkY@f`5WpBLmc=_Nfj)Mk?C14@X?RxWXd58zsGgy_zPeMxowjhm^ zr*yCE0>)v&L|0n1v8g{&&md|l?1{G7HoKO>qUM2uDvpHL%825qR0xDzRBZABR@M>qV-bys{80gSfbd+gD{FneRDPL@^VdfN`1XJ zlCbq>OxsN{>d_U87N?BU;1g7~(BmuS(>=^)aFANfFyj@iq@>rFGzs{; z4|hu=+J`yMP(gg}{=hwR$JQi&kX+Wj)8FCA?7NJ`;!U~4Kz+J>I=Pe+jXi@xY~PVE zAbh>ZzbWcuk803K*+tOe=1auP)kh7rGV(geU#jK|%K!A*rYDJMqSN_#N+D>ccGJjr zIgsZWZXnOR^z4O${)rRd$SOjNqR0NV;u3mYs2oou)=Iide7c<3pvs#rubyOr6n&wy zwr({`o9L#j0OKQuP0eo8#!*YN%%@&WAsE-UvQ&}>Abl$)!Wp;64+l6dqbSU6H;S{hq{!UMZL z3r*2$#*InXrv(VnCp8x->4u{55(l&Dqd{$>Q?T)WHz{_=kbQZtYQD&0UIk+n(>~S? zV9^J4Ugj`iO*@}V1 zel_SXNFq1)%vea&drt%I6Wc` zZ`hE)nUxn6r^Xw#d{XJ7tZapk)=@7f&x<2fxWb1T*4>f?Uw)f4t8a<&7qLIa$$Le4 zWGodqT$I3lPITrbcC=F-Ji7uS94QtjUdAi!td4s|HQTqCU}i@faJ9LdEx`d$i4_g- z_*;vzP#X~J5@FH(PmJP&JEU3W3l?1xp*0YlS+@Ut1M_aAcxH0JeV~X@{#^#k?eyly z8SK1QHbP~<0Qx0yjr-}PyiAB_Aja0Xr7zDvB}{fUHKdi@%JV9nyMn1JYyYprN2dR2 zFut-|=^6ynFPbfnOT|3j>jaf%fz2-{5Ti(ku!ubNIA^-GK3(yFaYtGePb1n?%!Y-Q z>4RGu>}2USHMM@}YRDj^mDoTK5dL)`jo?UA#5vAz^9}IMBovc?@?X#^(`$Xk z;2}CZ!%RAhHEe1!^^gE89Xxt@NERk@i1Q#>lw=+WAu(p`6SAyIz`aT^y0Y!VNz#y} ze!_QzmVH5LS)To6jA%e5{MAuub5YzWroSSWhttke+%g;*Q0jF@JS#`1zL00$d^;(w z^Z#^bHkG1f_7uSi%D?OKTnXc&>oTbCbgFE*2-0c)vqnEg;_yOv(fIXJEv8PW-`D!7 z<+$}Qf6?;R7k9_kZVnsoPVDvWL8*zW?ab6Q4n}q5Bm`GmS!|^RaZvjobTqt@G)Oi_ zQewLg4?NJ;Ru!fmlM|OIEtVzLc%Tu(RNLqf8&Z?640qR@;`&PS#)@Y@#*|0yJjM9C z3$l-L6MAL`G3KQ_tp3MtQWnhZ+?*8+5(UjR`sM)oq}Oj>KLCKA{-Y93W@^BN`}AM0 z(bS+ji6Pih0{zN1o506M0It9pP*t>+@4vV+>`D^9AQ65h5?tb37Dr^=T%V;HHB+)3 zvo&iIPI~;Dv<27VSN4~7kl~b$jm|XpZoe}h%@nP0@?^^HHxrMS0p9q$3(9}%P#ThQ zjg8j@UU|K)PvdhV%orDUCf6O>4}G4i={53&>Mx`bMs;h_^d=OgUXyMI@5Hq z`l;9B+Wb^9R{75+YLLstJUlvMY52IQ*(x=FzEl{*Fx|dKQ|qZAdV=1&BkKb#VrG#R zzDPcPSJmXDy1;-)yq->KeV_izvI0rQt^rYg>65{K z;U;^`gq_SrhkjqBLjIfH)<GZme$$t1q7JeX+YLm?}1w!=GqKl;rb)u5e(xgzvG7C|=Q`R`YS}=)r zLC(nGPKb;k- z3#_>P*KF*gtzVx~TL_Z5nHXH6bGVY*i9ea`zR_i_z1DQ^ znbu#3WSwmqF^`?A)pO*`u-#(*#@3R?UHPXc&iUcf{} z5y~}o0n)e(s#T<`zlO#EgT+&~wS8xwf>+b8x6y2I&RoZN^``gY$!jqq86fYP6GQRD z;IkrL_MAAk$f5}$TfB`z{kzmmVck++WzMp7f|>zm37(WlUn8fO>}Ex#91Qg$#p(46 z%;f@is_W3dacYsGZ{@o(eSr`Rx?d#;eeGvNKe}kRDcfw*{OcUYa&UJ?E~1v%Iu2e8 zgxO=h1^^iIRC}+e=jR4n7r+y~nOLowM~7<+C;C?I*U9R6a0k30;9dBzmcrWVwBMsc zwmpFumxWnkiE#jxg?+y=q&!8nJ=O&kfp(wjUwpIb2@Dv#Yv@knOs6k_PfsSvyC^@} z4TGxu#ILkhf15o~YF3X8k(GM1o2yMa+b{Ln2jMIH7y+1l+llGIunr_<8~6TkOC_JH z_R={pXc=6}Ny7ZREL*P%-w1|IZ@9vtDZYtZ{N`U6)KQIU96%e5$u7wWUhVGOcD!je z+3bekv@WqYF#INoDJ1rg&`;-f-^q^J?umOh+Rbr=g-2K!V3n+6EWi(^f`{hBD)qVB z9X;A9P@6Yc^ygnKT)IF1x6AzC@o-9o&^$e)J_A~Dx${Cu*1MnmoY0!xS;0nJKGz@_ zmuNx`*6EZvW2c+@khetNCQauhM%w5U#&VkR#Y2hSW>Qjn+rK=)eK+IphR{%w^Q$(j zDZa>i25bJ)LG(IGuwa6Pcv05pX6de3^0aYsJ@q@idJo&2UEZ!4=lPH&#)3^swoif< z3WW1&-!Nr#Pi>C&FeY|kl?%K;W-dK8XhlDz zTkxfrn+t5Fo@Beu`V~s9No{6mEF=5sA~RoOj)u!C$^jF`+LgRNL~zqGC7xyUTC}Sv zU4n1R(4B~}8fzOu^jP-9OQP$*HURjig5~4E5}!=SG`J^S&bDU4xT#EV*R_jz%Qk<+k4y zKi(qwhWob?R4gA3iaSOpdxG@Gm4;9Ol$qvbp{!@H*bEM8*|Uz=?l3K^s-Yp8a-5AM zw9SZY_0EuGEZ*sDl07So$Bw3P--}D;u`7=wcyhF(4*6tpj+FS1n05Chkqs5R>t@Lh zF0GSco8^0A_AU?zhMoQHad*?4>>imJBF-UU^XIko(QJ&h_RmQQrQj?=W-xih{fg$npbly0Z@l4r&sqZ|vcVlF*`hn~k_&*Uztn@GO1JGU%+Cr{`fs!Cc`-ug&aJrJo?kEqO(Dck;S)deR~= z7ZxEZ+EucU&j$-j*2>zK&4}qJ&YiF_3Zb80zQk&c0~?gL9Qr*|)3=|bwm`4!Tbb5G zvMq{>=v1L=kU9D~9t&*zqRijff=))d_Z9L;x1XW-nXR8m5MM>Tt%NB(P>4-`f3-h% z1`5F|y-AL?jd*o&x3bk*S?AyvsLh!19g~6O^SN=o{c%?H2F#nNl253FeXO8Ha~tK$ zg}IWam(-*P_1VprlEZaH%1k0S9S@zulU%3X4>#0d#xqb%#jFLr{F*~}rT#AJ&%PCq zv6QscV`-*hW(c0KO*aF`paw^;1)HG9M! zEo3tso%>yq*1J#+mPgeB@r)C2`o&{tbnxC~MoQ+L5$>n(^~%l$(?2~d^X>B@DN>K` zzK+`8G$aWHQ(N@C>1KMH#7@G^o+Z~%-*LFkEI+74f^7CxU>Q1p(!!bX3iUy#EFLx6 zYo!b>17REcMrsE9C%Knv@?wsnzKEVnU4>TJ8fc(XoHWgY-}yb?Mpbdk$y=XMnnr6z z=qSw=m&Dh+w&~OUx9o4z6%pMw^0u#(#b~GEW{^YyuW0wEbxd-gK~Gm< zsoLik2-*SNDjU#o_vW`-|Ax=*m%F+E#pS{Zc{7wbzRImxNi!PJ;TlR3$?*lJ5)EI&-XDqzytIK;C5%lGxLBhz@8uHw0BzDzK73!MACB=FE9$Y z-IaB+TJh`SGs@1YA`v>58g;<7A2BuA%`2&Va%Nl5CK;yzpeB7_)doL~R$}!CLaCZx z8}Y=d`x)-P(A0gQQ4}9DI;%M`$vTLWcQxKtz84t;#&uh7=IT;~t+fQA)e!)GK7R0z z-`y{fADhGHPBi3wJ`C*#I9bbC7|Syx=S|gIF1`i4FdWfS$T-c{#lr91@f_h$q?G7% zjCiQDl|L4y<3PT%7##dF`BCY8++`plVG_$J-wyHcGGyQh#7U!VthoW6<^1^q%FHfx z`{wGYWofTYvMQn`a)&s6$uwqJ;J&}{B_&CXx^7VPntbA|PD3S`34s5hdyt=QZS{0Y zHKh(+_FzNTgM6k`ENAY2s$h`*QYKy?vC?8Jcr|<&>)v+nBkkRkw9Rj|C%qqK&LEAK zO{%)9n%8(}0h`@D_lfi&hQC|^U5}Al?+eQ_RAsVx$EQ>$oRj3(3~xrNV^kN^IvZ;b z=q^GVN`FVLaMt68k&05EMT(Jzm6w*55>EUZapIk0sqB}CA&O5D*aBc`fAJB<_%BP1 zdHHWHmy(tmi6|&*zJ0jG^!0R^KQ8q2Mc@ZBHYh@bSfQTYRg*eoTM-^uBth&l9t_N0W9mmM!6#1Kp zTFakAqwJq1T_;=#-t<5Hq?2M0e4J$^T_8QL-44MGotba6%xEs|x_b&6ahJXCaQHYi z8(qKMq9ZtZ%%@LG@ebI)XBVT(FQQEJ+*jWGmx+RdfO4Kqnz%8e@eet9_wDYu(mE_L z#enXZ3RzuZ?Aa+h4OC zPk2!2nP_4v)h$%UBla^ ztzdw>!{z$GhhYmo}dk{9SIf{QhNH z@v++R&U`~u>gxMlb1s_}=zZ!fOCBSyba`CO9-{eP6y;77#;*ORTc3#HUF#59h#Q<7 zIMu`2UqIZQR7bd~e$jNHfXAH|k$c1Zu9xzBm~XUj06y z-c1&i9*VmoI4(NcD%0ipF3loj2^o zQ|>N8=<%aMr>Ezs)E|;+kA9ubyj*&T7v%#1O?$=|J`oorqq9g9u1m4t1W0?~}{CqoYOD&}IG;|mHTHZTrSjRrCi zY(G@>ws)t{F^rK;>3zoPL}SF?Fq2+$DtjITsAZb%Q`@w|SWIREQ-7*OS(BaxPja_r zFJ1N500ocVTq*NtnW1QlCqGmf0J#}Rw~nh8&)BKWyn6}wu|JeWw%PCY*pY{q^Q;7l zuf#yX8r2WYUy6?|5Cgj`()Q4ETvIFG?980zN_36#b?UkeOXU(#G*v!X=jZfGS8D$2 zFd4k5aO_$;Dl$7{={H9Bd|l2}BG8haLz$-j9Y<27Q>5i@r)5!E-oeRZm-J#7-CFUi zvyQJ;fP$F2>=g&)S+>CAbTg-a6fboc)|F5pV{4ekAj_)9%sJ`_eqoK4ULNf6`Lnw1 zwD^LSif$JF#s2@Fno?&=&Og_Q5pjJm6tw{YD37Q4^KzA6NVw}o2q?$6k45gh&x7O; zSbRvXs{>#J!MOT}*jc!`eQ4%)v`t#)vB^r!XJ!yn7I^!Cs(Z#NW+Vl_jF5q2GMt!# z_=8Emi#7LB*p^kLj>xE46Ck~+f0W$B^Qhw}^BujrNTJ!si`Ab(D=n;M(7@;RfEznu z{AH>r?-rmYK2`AL-}K3MVz*Q}samw@%!QFAfW$W@&F0r0Z9CY#4`K_SCG&^1ucR-6 z_&;qv>babTfp&0U$ngb z4@#RrZ(den@d+VIAJi+8U&fxNqcLh)(|k%83y*$2A;k5g=&ercDJs>IJz8~N{G9!R zey>Cl?~3C!Gdxbqd$tEE(jA?9{~TUdS6CCO<6G^#16(bvB!In~e`%PamIj~ZUTT=m z^j-KwQ@NIQl6hmeCV>2yW*7P@lJr5$aE~M0R4fHh2$XnxB_N&Mm+G z@r`jaL$*&Rs*T#U7;#}!5TG3=B&L#|xLkyxQ)ypeU**OLJq4RJ8HXCNO3#{)9rK9} zsEqeILFw0unhVy7o#=69Ps3fsG5ar9&$VWGEtmb~8b&wb`8M6QBcKK^TIy8Ivo?}e_7(UG8 z7-+?iw)6hRCe_-h`Z_%jB4IB&)a^Q??W1_7>hp3xu3B1Tdult)U?pC0kIHIiDUpef zm_c$<bCvzh%A>yC~?OW&%~HuvWA<_PUCy`4(|FBTk?*fN@2GRvOK#41PNxwVwtyP;SH)i56xMNec*9ub+n`_cR4v#f^08x~W;JAp)<=*NLSZq_EEm?kKIjw%H~5dSAT% zLoF>4J);<6#Wt4h6YKFTN?O4LJ3k;U6W^728@DOosd?j8az@PKg}ce|2lM|QPC zFH;9#lNMcv{?QU$SAl&>{gcfw9KM6s`@qUY3Z+wsV?IXsDNC%7+`nVcqN_#GKTkpG z#S6Gr*p2wVWBw$PU~t5&)KFtDTSfJ9I7r>sseqwheY1NdsUw+_Wwv{tGDoSOUzH1U`umNgF>tikadOZytO>)#7GM0| zo6Rl_H$VYGCGMS?5o`T)OubOfJSQ!OR(`7}jzsdY#L-9vJ%GyiX8RFkZVQ(kfX}$b z8npS67?)Y2MZj$J%I`jt)zBL&3~$tx3@t(zpFmoN;J43w_@lJgOIA1&h?b{?oQ2qq ziE}w}Ii(XO)Ecffy*Q`?{;7KLD-X`T57RU%A(rx#`8C%t)D$zHvQt~WC|uc*>G;y2 z4+LuEZhH}+&=SIwd;1SDNydL4rp~pucS`_;X{)A9UHW}6bPzy0ui3B}nH@+7^p zG=wRU5wrx!!Wt638%^E56}^)1gzHdKA7RDto2I{lboFz?WtyW=#%)r#nTZ(`Di!E7 z?pg#shN760D465y;DT;H=uLK0Lw4r}@zwyYfOUyc*XMI(o}0CT!J1d zBwm6liu$&foNw#T8Bl-axk`s$XP|S#c2QeK7ql0n9gTp;*A3g8G-MCKP~sUn}TH>eNX-E!N{|frX8TrIzcNtUBJK-L`<>UjT;&{_Qfvw zdN(veYOTw$NkVJ>*BHrS5N-&owPVOwEZd)l7x6Ud;gk@XSlV<3QoAe<@KLkl0Pjj= zg|0XeVG+*33w>%;8(1Bxc;nm;ug3YToz>5kVJrhHqv4d8b8)yXTbw|nuY2VoXc z%}y!_iAl}^V(O`GDnU^@ZbvK!w)yQT>mGB1@3)o*)$`A#D;D=L{Q%AH*@I$s`$-3roT z4hg5Gx%XN|`GOx@r5Ke+A(-w0v?#;BbjR?HcVTBkp^Wnf^UaEGWG7)Hv`dokA%NM1 zo}-3%ll74L|D7-b0mKwaQG2_~Mu8pXrn;^kK}zqC3dNAle1G}PRRv%}ZT87CZJS)K zLWCe;jw-XnC%`TnUpe}p^i}c#s}}!aDVqs2#fU3f3_a-<6(y{yme=Bx=F&TUR>r`Q zXGdBp)X8O+qSFsZiP{B(#m z8`RXx=#IrGm}ywsT^TWdC^JB1nB1uMn)VfYK1K;ho#6uJTK3xBhJQ5^UJWZbB2KRi zTM`Uc-Edjk5}!o4f~4mndQ%l#>8A{6RD_g2^c;*NiSRHZqzi5ZB-}-4tZmvMUHcyR zUpHs#Du-DFp!N#y* zZ$2r78cNNzwcs`wI5BnIF-{or-gd0W__KpNY#dsL=Cm7e&bj)%6KVT>s9V!`J0J|K zhiMeZ-{*R#xXBwm2je(_7QZsv$XKJp_2ANNs$FM;+7AoaOq zT(115OP_l2WTF#!0RDp;MqBQzF-J_*!W`y zw>Zbxe18(e+xQ&x;$M)g@c}(Ihe<~GM^6E>K_h0a$}P`hmA6Rdvpa7T+74;QspiqI zP_8jj&ldRE84;SAP04c)Y3;=GcpDF>PvVRU(ZZ=wu+hIa+26?KR9b75b|*x`-p$|4 zL&@XiF~PD1;u(-0vzLr=k`Av^#g%Sq-gX#CA6GO?C_fxGo9K|(-LhwaSyo|7WfC2p z^BpJ19&H)w;N?wfs$95J{NW6#pir@m8j@^4^+tBlUrcpOq6actFAIqgN6-m9aY{=` z1oKI-qa}>by&H;e)-a?>^A+I=IRCyqNJ^D`q+CD+WPatfc~;#k^gE(Oa;g(`BK1j? z?d~!y9SH)eD_>V4(`4d>l~Zq-MOY!57r)-q{P{OAUWYM8GVj=@L`2z zp&G^;C%*T9D9k9fj!xddaDm8wJ26wj2cwxT!KZA0aYivk#$~WY(Qxz)&*Rkwuk8=_ zZ|L4oZ`6PZ#P)moGuCxCL=tJFG%aMFh%Iu-Ob52?1yKfG2Y+fhu82t8rU^0UMq*gQ zFJPz@7zrOx1N^5L-Xh9?h7^atA*-^utFoKBo3xMRkQscuslWEND{qus^V|jdS9`Bn z7j7v+;<3m9k!C0;G}N%;jV!y2$Fx|-Ww&Uq(lrJ+6~7YqklJbr4szZV!kbica!d`YN-v*wV`=Sw?&Z{6O97&`7Tk&7frY7aqLrAdj_C zvVFIv8;XkCj^TLT+|5Dr41fhoMOjywMpKtaisYd1`6EcUkHR<8eV0LuR4|4Mwrs<+ zwN>$1$b=?>6=sRKzR*&0#c+yhSfp1SbO1+=K&6GI*sn?ZGmh{mCttE<3XJO=YWNT(>&AdAb4$*I2nMvZ zwFk2=-o4SFw12_xQ;qOLmKQN>Nmts|W6HusDoM5CuLC=5bFr^D995x&ueUC1?Fqq} zL|V#rM5o-Iyr%83yisQ8<$c#HLCTra*L)$R3OjbC^X*_`yj^E%3DSi#MgnaBQWDLzD5HGolJQbI95rN-^7@@#8a zOn6+(c9~K#|GXD&Wzf1230fCfiLwz5)SZZ)l&?=dcspzL+|eqzTFx};VA5-zI$(%s z-c`sim)kU2@BAWJ$8Nh*>z!2f+PfMu9c``RyFup;BZC>lYKK?5!K9*0ZxVw zjFWpEHNmB~Qgidh>zSF}Tu_t|i2#&cpmyd&qX{c!paJeQUO9HUmAG<4Y?ty=84wHr zszxbKC{B_Mi3|st3q{tXjdkF7;}s@PDx!ubZ>060e1JI9s_*h>E_Aa`J-3{h8i9IU&ko4s zf0z%%d!yRM-t-)XcHy`0ZMDmLT#A^b;VIQ)Rf1aJ0R5zFvm8XFTlEn5-Bj?l4Ak&;J}zQ=lcVFOkyuA)g7VgQ zy9keENMS#3!&TWRdRLiH*Wz&2+w2jVTiQ9TBCqPr?ML z^|piFZSYgoZ){OhTx&$g(C&6IZ?4eB zMapigmvX&w4VU{%6g0G9!-{4f`E1reiahE1a!ZS}Xw15v5`(I<~6B>!8rL6vIw~;45<+8~knOg0JCB<&8K@#+g6!JyX3>uXmk@ z>YexOUs`@wP&@v6mPZ?YN(2qsl-&hEOGLDWU2qAF)cqXz)@4}yB{j^gD^%|z%q!Ka zVqNFnD|B`-llL(^0bbu!SeilkZlDSMA@>Fkrv;}(WEh%ris~X0F$MG}BI9#g$N7cy zy|UbzMff%3$UW_jTu2dfw&-f9!ouYQW%J0MHjx9QN3Jm90bNSegSQdM4C|CR5~Y9eg`1IB`(Bf$|iY5VkO) z6S?IZ()4YsBEM{w#x$DnqJD)_vx-L2$W{o@fxf^moqjf?9VRjkqHgE1I5&SMLuP-G zca!exixyGwDxMqaH(YNKaDE1#TNHRW^?qG`)-=cH;)j=;0!s5EhbgQ@Zaxl7;xud` zpNjFID%I|S54oL}m2q%;W2@)9B^+iGLgEjnfh88o^h8dO{CotVFL#obT+%h*2q){h zWV!jaI&4@+rO=7$jg#Al;v9BpDOZ(~>m_+Sgn2ura|h#A0!nUEoI}CgEh2qU$MOxa zdzt)_;S8}v2Z?^^l(a`|nw6jLlH6#MOU)@hHD6~&AsObPjCFa)JwAHk6*?PM)oe_0 zRrYcF@=Zf}KN0f#s4KETntsY$ZSX)&BH8omk9xkgkojF+kOsjjQxps|=`@e{TOUr5 zm>ZB#?A)H>zqfj#k=56rq_agm(Z)_fF{A*`E%?xNtED(?X~0~o+J*|U9ov1^SqTJa zif*)=tp1*A$|$Rj`lL*>xIs+STXycO zt^ApS>G=~{h063`N0ws#yEDme=v%88!wyBbk5F0nMb*gW+>+nRnKph8y7`ryOpFk7 z(V$R%tB)Urry8e3pH(pEHptHcIkT@dcd}b_AaqG?wS4`>r&OtSfs0T*V|p>h4aVXL zP1?M^Fq-n{>SE=aUW|{X*Yc^x>WE$VE3UIU*nIrr*w~C++12b-p)K) zX`VP1j@|H@v$dH~?dXWcvpKYcoRGwxiJ(NkUM|KFCq`@R>ks5Oo;NS#k#x37KY1p5 zq`+)wbMXAKVu1fC(WPO-dNOb2(|_`Ji7@FAW&c8I-z=W#4yzl&XAY?4m%o9kKC}4n zYWt&~;pp|=J{o?QXw0Z8h5`2V5a$~ z=dD>QNO17C2w-)5=_R}!#?K#5j&$n_h0kcqH)ZRFD{Gp^8eExED&<$um?{K^cd6e5 zsu=$C1Ur0t1T<`!-pWxyQloWG?`s~YX4WaAUskmk63Q|V;QBM@Pqk!4g`vG5pey<8 zNxse7OP6}Aq()pPH|I`hJt_cQ$uGB^ymfr9O>dZB1ToT}+m7Q2bPARGK=NaWqSj@} z6M8U^fzntfopG;|;Y%?JXfu048sMrJVt9Ve-hkL%;anK#?TFrx=rbpyVTRN#X3%wf zs4*#sh*{Q|v2&tsn~!b;$nS4R9U}Y**F%E_ykjI9lbgCe3I&_fvE2`pp#N~0v{TW= zM&2W_^44Wn?vlI;$3PLj)jS&lxqIp|Ud&O>bP$(T@QCxoGa-ioak=MqbPw3qRS)$D zI^U@~U%eT7t-Leq_={yvQ#VZ{qWck3V0%uqjxjhJM6~G4y`bIQc5=$JG=o5PsO;4Q6pFPj-Yvg5?RQao(sOb^ibgPh$v_K7U9s769l?+CJ#NE&~2^5J2Z$A zr+-%z;(9RsNM6%0`3`1$#GRAMe9(E|gudHE+7y$YT2z|PaC?$x{C#*wt5{EsJTBKa z+RG+d(YKsYNv4LKt#wy+R(NxK=+X;as)E{d1Hy(R(xbEcn-jOzEv^(C)~2PaR8$B$~>)ZA;e1=}1}cPZi2gM)J2 zhHK0$+fsHqRt*30gw^gwdP-?q0R&+;HG)M@pfo`}t zlXZ7(Z3cl6Yju&Ky6ff32rqUV9s~ z%ZIQ~*B&w?@B$z5;cw^%hhoLzw8wN}E^NEi2OS@3z!gBU5#p`g9EO$^x!s0SH*r?I zL3%qR3NG~t%4vjz;JfJ0iWy5Vz+=27^pk(oF6oKX73pD-=>_{7Qf|0|JT|OEEKgg} zqZ=y+#MF?%XCrr{-e)T*+Xp}vLS4A{5RD z^g%qCqlvdy82Y!5<0#`WF5E?YuPx}@VRHXexv}SHSJG7 z7Hi4xhj+@V$##5iLAn!Pj3*-E-+VE8^Hi!6XU>D+w*yG27)jKK4NH9%xjv~^kQf!6 zZ+FzBobr6ebf25`jn-b}*PD;LcDwST%vB%784Jew(skZEirjBWJ;zyD2GU&8cRh6WMiYO4fDMvaR zUkYAobJUC`s4TlOo;W^sc|=5esiveafTO_tBh>m~K;UDt35)34%gUJfl);)W!t5J@ zO7BWPi~IFG(7WweBUwe(-BD>DD-oJ@gVd{_RKYGp-V+vD=dh~J&~w|Gm|v-PuE0^{ z<7^&!qnFpFbxX6k_T6#t2R6)@8#k=pi}*oLn|GVHhQYl(vFFC)ypI59{=P$LDp-b! zCQu8hdQ@Py_Yh7F6Ccz!B1Yy=^{0$oLVkN?MK}*`bRT4U`om9*xztJcMF7i!C)S}E z#3&WICPLASvjs$;bf@C$GY1}=I9j*4Pa)64$Qb50nc z5At4BG-SG;)x{js7i;Ov$>_i+A5s)SdT`-nr9(P3mhxtKH$?!RAyU;%i-DD%^h6aR zZ7Q8FJxnmS7iMhCR1w~h#edf~^28aOca$M(Y8Po1EAL5Tn7s6H2y^->+a$B1hDrt? zfd=BE7*-5H$$r{PrS!xv0i?r=D{pdYbxUh=C4iNDA;x*keV^i`<8<6(43PM2NbZd@ z;T~eP&7xo7OyRow7;36}goi!M8Mxhps(Pw)AAu3u;WCjB;yKqo{|(op$a$?&y~44C zwIL_8dqpz+c1(R%lq{$UTMh>>R8*c#o^o zPCM}D{g;eiN0|*Th%t8LHVKDx9b_NqE#Hsga&*R)K}evCp6&Qu3zx|<8?3{5esDix ztE_Zx#sX+9{>2^sIv9rpqf)61e|y z#SB%{RCXUb<#W$xj&H> zUS2-&cOE|w5H^^Fkk(mGv5h9zY^(%F^7D*xK}o_(P42TIYPVuFrB}T3JrieE*)J^F z0R{bs2Vxtll5ygFmTPV*(9G?*q4(|+t5(&;*9So(nk-{COcm9WjLt<`k#V<&KEa+b<6Iv zj3stYuM$ORTc1&8>S`-pE#vyc`o#N=?VjhCpny_4R2ZB%L~(O>!v}HF;Pm_(*_$i=O!0%BTGij>MrLE&+mX~&l@O2Y zx{uTx4>wS4!xbLIKD&e5F+343)3$HQ>xDyGSV5doyLkqlqbb#xe( zr5#zpC{Z!>>#~llV(2rQPS6zB8s6WF#q_aaoRNL&eHZ#E4jr#Y@-zgV% zF`>Pa@6JPzi8eH!`@h)gQ0gmPXopwc0yW7#y zRd39`>crfuqvmbO@;AaG@6#lOmAKIsJNCfhtYJX}Mfra8XA`*zoq+Q^I=Qz4jHm*U zXN2g8InGf<OokAIu-QNp}fLX*(~*eTu@3HmJBgigY$Q=!D`-Z1-G8 zwmPX`M3uIS28%YAn$>_HFX8Qm=;}GU`VI*o;80Yz$?;XoSHHMU7Nba42FuH9NLs1C zZcSsGKYLXTgSDR@zHCy01Q7vIa@g3tfWVh=oCEDSmq0mM*9SjdJ*p&8vyduueKO&0 zLj8i{b}~o2<*=>VwU~#KA&66h7@;y(N@sh{S37K*q;K@F`er;n@Xl1J!jZ}8 z1bb^-a>JY7UOZ5ubTdC=qyEjbjMUk2sWPc~;FUjdF>}N?A+LtIJJ~+Ml~23d`6ug? zISRsV<1t1is^6|XWdF>Vb_SE>CzSiy8Tke~mAQ@(xEYWUt5xn*jJCffoiQ%Vqkk_< z4hKBj{p(HaU~vSdW-lXewT|YPT>?0wg8c<~Gii~Jt*mIL?u6ugYlEqakB&OVM>gbx zUX&g$cA60P{3P7V_w*UD2Dn{+srYBu?5|6W%n29VwlnI|I&K>de|byG{0Mp1Cj3nE zhXT6Onqm{FrUWrd-HwUAr`OU``;?Kj6UwV>ZGFuXf!pAw^d-9tJj0c-*ffP6jEOzve z6WsbjC|b>1S?zjNX@QYryKVBxFe=%_frNxz?}EH1u7PxK$H(o5Q{+3UPmL1C?BPpk z-Z?B2KRDM0A$lK7wXfTF&pKQtT>wzGk(28DjE`;pY3~-jgq7zR|B*V%(sc`0(z4+ghmgpTCyHL(^kVF$jrbFkhy(69{nyF!B%v_qt)gSoQyO@eBUc>u zO@h2pvX0Sb?)igF^0hE{xB_NMWQ7c16RF#gyRqy+CJ$+H?9B&7%B}0V-$81i!@|no z^BZ-L6ycsvlvtvL z8rNLSMmOl#Z%YIlh}r{QuHp7QzdH>~Sd9smwnD)0pRBPV>_`EwC%|Q+m;UO>C$4jo z28%8a$|1Mh;8O2ws~7F3KfunR$qykkB_S{*jKriE22UKQ5UE_Z&94QjtJlicQ7Z-x>y5yISJaK7M_DlD))5oh+MnaGq=92}{)}b6`%AgZRR^@^*Ky%RJFrGx`Q}+}C*24@ zJOk!@dRq6qNhUJw|E6Pys3n*Lx$H$6aJ{pAZL@u<#z0#@&ba|)0AGj~qZgxo>Tg|j z(CF^uE!&j09J(#g$vk*l z%E{U9Kw}TIp*L;O!m^XCMx}jT`fT?(-}A7pC-3va&DQiPO5XgnIN4_Q9?kC;OV-&L z^>Tk0lN78C0i4hm<-#%gQOq_RATb^=*_5lM#0q=o6tjsmi{mNQiqQP*Kw;Dih(Tj0 z;e`qzk=kK?v~Ie@6b;L6k3pf}M}4F1AFjPUy`^-_NL!}BP@u_R)uW5aw2pNfNrH#Z zPQAhOze{{L7OgrHAc$`FzJovgUmYZbxI)f!2gow6??{mhw(+>JU)#~6znkGbFPL87 z8$$VA<1by8U-(=Do9&&y;eRcDFuP+LWnkYab;in{G0_FuYCa^MuF^m3s>zqZoUQ{O&fO5dpM3feulTgsGD72MP zRw}lN{vG`OQmV50J?>%VPmp4ES*f$#>E@j;{c5=G$r1A=dm1*OVdAGM@-SPB0H6T@ zh}TsQ*>gHvom->mWSLVYWIbYFbW%O=+Pd=GmN zMZhj&r(?&9f+OSv-D5rb(-WSPeSHp?jm0ju)k&(R0Z+S$Nr8@AlD|In85=nSOvJ9! zKsIeHY|7|-hx@PXxx0wY3 zmu-f}fB{87rk!mc)-leD0@?>W%6IMW!NdW?D=z#%{Io&8Y%@7-n7-}5RI)=!;q@fo zPP~*B!wy$6=u=ki|PtJGMpz`va9{>sGzPXBN&0Y_rY*_xpun z)>9OpLwlP)`EEm};2mR*ApqvxGjd}#O5a0JP>EigA}yXejH6)jE0M-2@J>r}o`1cO z1+=M$o73}2WBqkfx1{ZjWCn#0KA1^~Ms>x{&IBB&T0_Z;)` zJD>qV9443gI|iu5e_tLRi|ccnMHSgce>n?)=oBA7`TiWhgFi&D_)`S$VY;Bv?{Wz! zt4kv}l`uf2f}qf@+rUVB^FL((rVTDK-k(C|YtI=&=BLb~=-W5nHyTx^UP& zB?Y(v(SXu01o&8U;x!L|KP<3!b&Uk&44d~!_ zI3h2c__Dw1$h+YV1b{Aq_vnNNcmmEd*)Bg0>fuO zgIib&7YFW5aF0FTqqUoW%_~{8VUF7O>YXFpVSN>l16ZvK@S*`$u2Z-64eVEX!Nz(B9aEuduW z2QUu7PsRa;{`hm~|43hq;LR2&QrppINf1F-J*|IK+`@cTleH~leEmn{2}DJ>KYBPu z5K-D|Ph2-w5o)sb>$333=_cN5^L-<~^XmVB+k3OnCebxc7{sSWujSNF{kHk1&Dys* zQVae}R;|pRMArAW{PfY{W7Mm(-N~jpBgP z`%k|G&?Eg%dIUK0;}6b!pAXw#QXmW3RQ4o+o)&DmEF*P8sE#S>|7;jya6b@L045$e z((w|)fx@9OP+yvGCN+YXKcMZN0n9<}&j+D#!B({*GHfGtw*<*QZDK=EjekDc^g*v> zLvS5X5WNu?0+TfhXuJ3amT11>jnBtm0ZTaF!j%H>bpOcFIcG~0{2$&N7>)QRS^r1s ziqAlwBE?7nEC_^lYB*^k{}FHDKftYkTVplj(_Y(rTfl%)Xr6?>YjqQs$N`Gc|Mr>k z+Xu?%!NOYQGJtQ1`yPCM&n=H!zXB-VOyVL~SO7Te)Y;7l>w*AkI}J$wqdn`z!+ux@ zpim(CGz~xFk^3j+`?xOc2Oep*2QVQm!{h{$fDh(3e(m&U;>$sMeaB^4`yV1{2m|Q- zdtdD2TkIb=F!NP!Kv}?MYdii8l|Lbv4{p+>8L-oCE$aWFsQ%P+xxxQ4{`rS)s{oHL z>6R~{RSyIYFkHx=ksbdX4gK%(zZH;l%a^R5T_~%IMS|F)PZmrxv5Qxn0w|l z!^=No>JM&>wWAv9^b?kWgdL%P{m(mc&H$lTXH2%7g4GBzs=R#cpM&B518D>Eq-zdN znpPp5)bOj3@XMVRE;&saBd%3~SnmQ^%I=>~)DWhlG()8Eb8eTCNz!{c76sb$U@_MQ z3A=!{p+Cdf4h%GdiX%> z_#yf(@Qe?J?oF9N(eQK2e1_`4rQZYZcug8+j-H!9bma0rrTe4H_nd+|PvEv%yf%=) zExsof|9n-^MZs&H&QXQ+drn2@obSFPwK4zPl^T{O@IK{xI0f82I@UZ6$d1MJ)c(WZ zdci465vM>9rt|k zN4BVD{wxJJ*boS(J^_OMx4~Kk0NIxU3=+=YK@It@f686#qWOOR1*EsTOs?g(zX1N0 z3l1Xs$0esf71PtP^?v#Tu8{F2HKm{xCx z-QCK*)|?S*2&oFQW*Q&v2cf+6zbM1*j$(RwC}F%0(+MSJF8iv6NjmGHy)BlNVd@#_ zyXdF(uD5`%9t9EPQze+^HnSprnTBuVvmaZl>Bk1|)UA zwazF}5kqsM0j7IJL@9AS)B5!|U*ftV)sfa}8rE2N>yiie*J86|u<4M8LkaKX(bZ=b zYLk!D@6%xoYq(5?(k*;B*Yi5o&VYThY2Mgl?-#nM@72nD#%d0~h~ckS*auH>6dIuM z&U`6QX~-V`S8TSV>M-66+@BcOgdY({et=o_GTs8c^z{Un3IXVvXm65SI3J)J!opXd z%)wBT8!(N3-W!lGrW#DmW+8NAX7<=@2o+j5_80{0JzH_TO+>cL0ea<&T66sR;t^UlYM$8GS7Zn{&QHz|`BG269JiV80kmBbYJTv!d=>_ZEqH)e0gi2ZsY~ z*qjIg0vHIy!$MPT&utSe*7*!?(OV^u9d+5lT{`*ZQ0gU^syZQUIY#BEV*ouY7jWks zp!Y}$x5hLyp^4iq)Ta6x8k zDO4c<8GQ{M1}dqsyL;p?#jUNgpwP>CK*=nD+A{o^98k{nwjdz#HkuJObKhTmbN##a zyg;<%pwE@X=(peww6_6}Sy|Lu(PnG>MH{#1%`&l|0n(44)A_4+gI`Jc8Ufa1*c7Gp zaK-S6u!X^@M*g{3PZw|@LpOAuMFU;gmv}3CgB3z0LAJ|qiq^L%hysjBGwW__Rx@Bk zx!SUHPO8ew`oKe~4Hu>he@+K50_3KNC6JSLpO;XrY?Him6Vv#_n(#56Yrt-dWyOoT z(eHE&3da|qbys+J=eVKV(Qfmc>5tZRx%)JyhahaLTd>?dp_*eHETB%qG9zF*ltcN+-e4%eJ!1+>e;8 zHJr(^(4cfp)G!f9Q3HQ>28n*OBotee6qw;lWYhZKoV*+I2iA#=c{f`^HD9{A7sJ1N zTVtE{U4?I{O`h_-Fb%avuiwAOcetN9pzZI6)HK9<;g@HxY6#GuhqMhU=hG6CGL%B* zCL57_Tj%c}WulwXUv~ogmVcjW$FAT2Gr8>I`~EX$%f)g*fxDrEO*p5o$|1LDo4U@# z2(X1e<`7Z(C+DCv6QaU}md-Eysf zJ2?OJn2a8!!4s0ufDQtG1s2hNlgI}W3d$C)IQHdEC=D5D+tubmB4lE9THeiG{eSVb zD){r~+VHvp&=*^+rMBG{|K)~P&Z;Z7sXwV`MJFA*-EsI=O{g;F90fuMrN+C_I-KlN?kDY{ePmQtQVM6TLUbUCJsym*w^`F(>T zQ!&|vaWsT?@-1qVYk0>-o`F8K&Gd(ox~~3`-l_?(+s>g?j!(%4`<3D-RNeT4cjty(j_xX(3|1#j* zkTv76?4WO*!ZI-ft=+^F%&fO<8IRDAdya-AZBVzx5=3Z?!!R}s?K8u_Eh>D!H~gY< zLp8g)lM2Z_iJ1<*7j#&5xciqh*h>N11;By;eu+x_CI#JK+g z@Gl1VGdB2t1O1S||Bf;LugK`}#p>e&OT^|R7Kb`Hq?#$jJDxO47FFYrl12Vohfj-6 z7U`mNXCyH44BfwZ!SbS0l|O#jd_4OWHD!FD1|5VuZn`x?hXW8ZQd@?;@xQrw3*;A> zfVKyDg&d4tnG%>sjgG<2duGrhRZ$($nVmb(rab|Y6lv|$l#0@FSoX)it5d9mWZY^` z4y$4@W54hNJZ&O4(;Baorli0pJ z&GltjoxX%8?G0|d*#iQ-$yxq(q<`2$7l|_(>6mu6hPFcL?c=NjM2MlACletkySSASkq)Y*GV^FGXE2os@lQ3|-wc(gBM&Cm3y~q3pMtR}u=tWW8N6ZB2RXd&CsY zyJ)KZzWTLun?=*YlAD>RDWn@r&Z)l z%?*H~glTCzYGh>(hb2UQ80Yti^zvvF%gwDxD;DnKvQ}BPp5nh+L62BTMxXCk7R6T6 z7w{Zuw=|YYY_E%j6H_>r@*MSW07nZnNnqCL3XA;8BTuqC`qSP3E42G!PvP2#dj5OI zv!7wfL_P$WT^}z?9-xLT>7u%DGf{q7*sh+^;P=1lW<5_Oplw)GS2u`*b=nBLS8znu zptE|$M|V!qGS-n5Xk^Mw@m~l=eK1bT-cjc*bvS;wZW+)P3EclMk1E97<&a7p;a5+> zl;i=7<~5a{~dL{SFEDNjHmo>U23D!-mEi?ksLiDq3}tc>+lbeo1H=^ zZoJiJ8a0U)JDH?JbWw8TF{vA6I=|zZz7CvAc^H*i*tfr6Yy4&0k=xQ=NZg+SPMHU4 zdp4+SPM5^Yl+TXOt5-{`h;6Ni_0ZOx8szv!wA`Svj)bXAq$1G?1WPM=|eqjj}I=ruoY)r@PYa`d6Vn+P>{Eq5S zzSP(7QxOPC=R9FOSZbp6JO7Z`y zgkdz>I*dhhO~8tHPLP9#l>2=%GLNPvzmZ$Zi1@Z%rP6hbYGEmTKsM8`Il(0O_!z5L zIKfogTsKP=gPRuLti|qSb1xThIAE2ahnq(Fjhp_7!Cr7jBMDp|;f4ZIyITF?Zkr{4 zq^g-qe-~;)9n5I7o-O9T`WkIvzc5lwhx(?=QxZ8zPRD~fzz?<~pw&}p3tJ3`9OSfg zLF+2IjdZ;zy;{_V)x7&FmZr1$1eFyL9Q0*ttq3+dP_f)$Zm1oj-H)XjHR7*gRLVbc8fW4_HU zWTi_y0^DGCXm8>N0DSPKmZWH#f45 zk;fmkFzg)FI8}Mi!6u51yh@^5aKk-?bXh@O{5=zn2#+PQ2oL!zxw+NkA_Z>ulkFVD z;8>>D=dq)rET+Ua>r80nIAve3zcr>R%&(wsS95>Ucyd|z9!H(AtT1rY&4Tl4`n`Lk zV*Z77IMnL!Uz?+`#LMaV4uqw{-j>kAJAOw)$#2#-S~rvFpTeih-f}C=Pa(8L|6Z=h zbl>hn4csb_GjBdS>l@-IdvK+bjd$PpsWoQffy`^ES$^^T9nEvY^`$yqSqFZYZB&P1 z=C{`u;CPHSVtvpyw-4B8g4#BIdvGGy1buWARg(T3*xF<0(i1ANYxc}qEUiwg;dg;O z1q8O$W~@f#JhL-cUnKMNw&*QT=%wW%O^ywi!@&xmEWP8#6={TGX8Z9X9S~yYD!i4r zwodf)B>jD~&qL@|I(rzN{?g2-rvY?q`LP)z<>tcLIZ)^hqO0FXA2-ytITV~n@O2H$ zL{xgC?m&}XRq9!IfdE**2s($l^Oc&qW3nQjnY-Az>pus_mU^H+tREm{EeBH@b zDO0|}Kbz=jQ`GAAlN+A<{wO`IX%Erkw0UjCr^{9uUjB)`8|h$uhFbd*cxZwHaF}=P zp+dukB}FdY$(^cv*B{4fV&WIvRI=XvbZ_^YdU1HD5l*E2f^zc{+Lm8jENv!Ev|k$#sOb6o$|C!K>2M0tT8a z_Cw&sOI+a(>7PD@9#V-1^IMzYh|R8oLVNJ|7>SDCReNd+8TH%sn`<)0smI6KlbZjlQt`fu)K6!K199uz-6vTQ%X>H<-ba)2D zqVc3bMSRARufNMlwi)HUj;9})`H%eWHOI=aH0ZB79iLtF2y|4QbW+?0jtWCElhf%n z;pR~rtP;Y&%-((|ycxslI^>l@rBh@!%Y zd5$YdgdUjkZxdyN_@ORT-M)IuvCEFf^(5d}e81Idv@Y)ad@HXu6)yHc5#8?8^O&tF zS~mPvJ0iwlqf{+TY;5f`B22#HzZWx6M2BC{fbwIsczv38W*F9mz7mTnHPlPEL;**) zj`^bYQ21OQ#KxPU$!s9X=|U~FCLoxqrd>DjpZ8TFM7ac&!t>Lg`(S6&g=nun;z)|j z*=XxGg8eHji7B|ZPk1i%w90nYYXMGUUsusD_QE3IYN5XQv|>?vkm z25moPP%(zP?WI{Cw!~h1Wop(CQEGQl-GlgsB^O|@WRrTn3%G@>*$D#jR->^yjhc*& z9|~p-F4^04Gj9PB3HINQR89;l^f;N0L3PxtZ8Ub`uQ-Rn^Bly5aDJ_uK!ChYFsw`Cy8t_I-*?^;@f*Qva@(8?`OGN3By>K>0_Joq zhqK880g=|Sm%viGsu{jCuax>V`4WRaU)N@IuYD(ThHiKxnvAZyNdPz>9wYdI%oi6D z(Gm1T`uKQSlS~!9h@XoQd64?M2~6A=V*WI@y{@Ys@fQ^iT~tV??$+qBQAxqwMo+>T@LrmCB->)Z)Wlx&or_P6NU z{kZ@M#kV0!M1=0hz0j~}8Jy>~y~k!F@5%G}qU6$MSRJbR@QjcNPa#iJl~FHguVXaf zCAcV9*!MnUZW>q5RNzo!p0tPanA8J%1j(!&N1{ITPy0W)jy*%wr&Ar$pwf4U3@OaQ zTC`>pi{iT$huwA?U(z(hFAt&Yp%PmJFw5|l)m_YT3{xis5)sCY#S+^Ig)>J*^^Owy zV2t0jgBcOu7cX>g;-)1F!|;Po3l-8E8zn+b=327THfl2@b{#wCj|y2Cg5SQCGo72> zngC|h07*g~ZPwOGU_&$^cWm^;pXxTg^9Qc&DQ&E+J9=KQw%KgU5+Iuxf0XL4;eYI- z0C=G&Acw-iM`jigBxEW*{(EId92h2FO;dm|iLy|ZZ0U!1b-D;*$fPE3U(Ea8u#>CT zEv)o0s2tIi9I2JCHBNVHL!`!|;iM3?0$zna1^MSfPW1r|?yEK0|Dka-#8x(h)%wLC1t$bRu8D{E@5y z9WQB(hfV_c>5-k>(TH>`_CQy4b{fopJ^sXT-qZpVYV4(s+3(9s-TKLF}v)YH($3^ zh!tb3X)IF%qMr@alEFrLWdiI#P5NWml8;JMW)tL3PH@XB>i8LzOSLtKsSTNsi2R4XYqTc?zt@(^jKJ`mjK?AfHjkAXMNRVjNb${M6`x4qnWh`Ti+u77c3o8jV zz&O7GI}U)J)Q-3MLl(v+=|4JXmFG*qHrjN+s>~mBqsbMceYYgli)WYzu_FrDg*La; z{jb|^W| zk+Q21ArZ2UrI00SWQH(^!7v#7o~qCL^?JSEpWk(T-e3Q9U0rjY=RD8jJkNQY$Nhd& zZjPKuXN~x;DrM=HgIM{L@k!{m`&a%H8s-2!-~O^;Ln*J9_0nWw{6GI-C~A;4I{Y1#Q&DJq7Fd43QFYJdl6az}9>)7H9<>z=5CN3Ge2h*!TV zyZ*N#YnA%xZmqm?k7Bj@^z+gK_F^C?b?UZ19rPLCh7a^tcvxQezgH7;+pJB46t6un zW3t*tfB#+8-03Q*{c(5(RAYPfzxg3CY3<A{#So408&x6fY>im zAj7lce#v0|yYk(Fgq{9^T?Z%r}y>zcJb)eqx|2c-v4b$?H~cOrfI!%uux7H z+%bdfV*6i9UAcEC2SmJpE3@@ZPv}7A)tAM#3MStUFmXZsSE&9ev9Vq0JC-4F9d`GZ zA8mg(0W#B&U^q|(1jHHLpE&zpO6$8qPHio|FTNj&4<46%Vc>Pt;g3^#d*z?y*8!CZ z$EA983v(tT07S+rWW5|}o>#YnZdvo`zd7=t86Qme>eyyCIrnFFz5Us@wP%$^X=m?$ zBj_)23NU3=e=>11_j@Tl@M?UQeZ@+1cxi@2$|mIAV*aP}=)>5vWBJ!@BynM;JYpZi z>l`r?BBsAH^I@~^4dnFiT1~4@^$J5w6^GSzan*kl>Hrn2bIK?8wr?b_kTAPdPC%i$ z+i_hs{~`nb^urpx(5+49GM|dPiXA=Fu})0v{=%^=E-ZAR`-v(Bh&d(_mz?akFkEw( z958mj1b%>Q>t~-S1`~DMPRGyxQE>pn*S`F8549W2H0#U~YP1Fe^=763X_dUTD|E|2 z%i&E;izX&O!&@euwKnrq{TvmcTRqTar8E(szqh%RFh5y9)4N^)uhV4M>~jvs&nz>) zzqe|WY<4sxn_GT3PsVbWoHAg|zuzqEu%iLj2$Y{3!>c?bmVfH$sR7%L^45fJze+R# zZNi(Cj-O7vk*5}Y^FjZ3DgI%Fq-%YO_n_k)PEfb5p=CQ&fhdz9DW zVNZy)W4?EWramEG^bN)A2pAgmqTCCaY->&aI1gqo?lHmQ4Z8azZGOyssaBU+ScracZf zuj$wj3SeAa{Vx}KO(h%dv|lpv^eFS9VavX$Bb+vzy5B0vdQHd4xSi8y*<(mj+eIx? z^i&!P35H|^$~oHd5l<6u>-)JxwtFuQWpM@URvPXkEN(gaDs?{gvqO(G?I|zz2Ye_E z)tg3klzrrekB+a6JPOdAk5JkzE>PX(6WmeVCdEjCmuXAfgRnh^0N4;!|G|gtB|tv#OYrix zudm=Fn=EtRs>uqvl`rGNmVW%6K&gMzdLwSuJhxm^OEGT%-nc$F7ouM z=Sa^9m`mayxO(-6c6Oo*g`7~Igiyrr=40hV4`!R&DyXH_)p}v4)Uq|ktMYx9-f_@4 zgd{#G5S0{unl;RwQY3aXwRdRYq5w2@}_rVzc~u5|$}*O^lt+ z;np=7Y>dH$-f|$lRVNXm)Fgl-@r>%!}97L z`LvI=n>C(urZ5K;clzR#IA@k7Lsp~Zm(s3D4hMW;k>P@3_B!ogk?wacQ(-(C$h){x zzP_G&9uT88ku%EICU73IgwG4U_p|JdzD>DDLAXid+YU%ZO^^CvftXNOb$FA6$1ASk z(-ltjn=N6$8o1H1rf769@vff&d-{kn*(kzXJ_PvA#)zXqBz!P=+;4G}Ioj;%v0l!3 z|JakHT{E^6?$F%g;D3A=G;(&h?NV=2rhjtf;$k@X{aM#HOZDLR+JKtH^dB(+`vRgc zB#VAmJ)qZJijJ#3YU1~LPUSdyq9^+G=P~Zs$oe^l?4q{!9HV?MUMrWB%V=1zR4V&^ zv0yHklomF~5Ahut+H58U5@T(xXU;*Dcs46bK5y4tLtN8YX|O2T6;#Ay!I~WUPKo=1 z2jTZe&A2dzR&0ZI=;w;O4V48{l*X1q{R8*GQI*~(v>Fdk;6z`A4&PK|D7c0bm+?8LVQZ+J?9E77sLO|4fUkxCJg{koHO zFA(>c5v}R5x?_7RJ22IvB*+z2MWngjPaD6heW4e&8L(m=PbL_l;a98wlj8%=O zeG!m>!es>)VHNytG}h#U2P^XeF!xLEaW`siaNC4Kb`v(wbdj-)LR>F<6%-QVc$H=O zl{JHdY94LG=5(oBdk+4vnEE<~7KY9hLp3F}=?(n&Vx1R>H!KTYZ&!&voru6GXJT1R z-&J}vOjt7w^9PybP+-y$J8kK>4tKHpxsUh})k!<5Y#5Tu%0;VMiGlm2{iZWNb<-5# zwnJkNUwUGzOtNeaZqSQzL1Xg{DyvT5L_I+cuT&%889}b8WKMc$myM}(&x>X6L`xi# zd~nSka!^MG!g)KgiCC;lWI#7d{Rh+onB+iRl!*;}W_^p1b9=G8Q82N?@yXec^>MGL z_a>Ifb4p5H+A~O0gnQ%$Ba0O-MUp;OivLK$8x~2-?uphLrg$G(E_Qhh{-o4>7mk`h z{$Ltb*e_ca09TYAIwE0K2Tg=A$Ci)lBiAa1l|Peuz49uQ0~W6FyrO12!mn|mrXTE# z-!8eWFwLF9&cPT_iLoFUHd4*H#{bSi#U)*XeY9b&8n|5{r%Wk_7~^i?ruV;1eoj6# zo?HnqyA&5@?_x7$T`VRW$yJT;ab#6tL&m;yeLl;l4K8s?8hZH+8EINf0s6CidxD zw!YoTss|0zCZ3`Awl=gmMHP~U|{iL8idbsa|zxI z6ru7E{o>NsCBZ!vxEMug;NCZP{rv57hq_st*viK+YY?np)p8+43*(qrTtV8JcP?MB z^)R2#2+J_?D^Ns|uhw+avlsV=B?-Fq!#N&KttZ=qwAke-Zn>_Q+8B>^B`SW;`r1H} z%aT|5p_>KHo}k+0>93~fv=}s0x~GgUMAG8X$Sf&{#N~@iZ}`Ph<@TqfW$*H+2AUoe zmE@ZFFG+_y5fV#}3l$N%NYGJ|QOyO5J%XQt^tqQ|&(GZm=y(a9#GN_vCGmckaGx^3 zrv=|@|LnK4^tM=y)lg~ZhXa@nBXbsKRmRk3@+7-6j6`_bclId#bDcUR%!L&dZ%6^`NAjqDp2BZ2ZJ_gZQ>Za>i)}~K ziX1e2#L>DUK24q{vGe{w-HUpY2T0qtT@G}|D&$OLJDuHhg9MFMJw1T3=HhVeaEzQd zO?aGnO#@EVx4JAA#iP`ts(gAsRdAQFo_uM7VZq#wq4?s0jvvD079W$1*uwxmAV#z9 zmnh!jk~Fn0P-i8@C6L6?Dkh|-eO75-Opl79$cs=KeZrCn}iPWeu&yt zKNrXyx>0nWayWcK^3XNgu&E2;N8Sa6orl!A?Zbmrg7gCmUegyN@OJo`j8dJ2Q}c8V z<251T?`beb*(OT#c{qe5TCyGL*hfD+UC*uDs=o}E7kr75LSUerJk30C!hAAVNMsfX zDFGGJKMJ}zQEhbRb%>3aT%Kb*1!SHqZ2M%h*CD9|x9!}_+0)@i&So;hkHEKE_`pJfd+vrT6w*)X6OoOhi=14tx}}XBO9XIpIieC|Gt&qubC?PN&6V)t-%1@j&WNFv;#3ew$tAwXGedV}WA0 zLor6IefdAv9T^d+acL{#YFEex`75FXY3IY&B?|Iu&!xv~5%MSpmNrdzSp#3%`sNP> zuH0ZSWa}zFWYQ#Pa>>yZ*WbONOiXURomXYJHY^N3<;1JF%L|HEC#XE#NOsB(7QV{i z*BVGlo@AMgH3>}Ir<`}V5iHM@mG-961oUDhl|Qi9<1(2OAGH+%9oU`%8sx6%Qto4s z-0P!)oZU@jlumMn#xe7@JYM{4!){5Kb52XHE9(pGe`CGUy4mR@OZ!`EGf=Tvt^4jRjyWto$Xvvd7Um!1_s*`Miiw!+7( zzXvNdLl+aw1HqVqG29{1M)K_%;CwJVVtwVUnN1m2*UO0^mj2+YQz?b_bYqU@;>61Y zapY10DUe-k7fT=y?c59T=Op@fIJJ3hj-_sh=*9gxvt54WIkjAEvgWZAP;CJPdrYhq z0y}3uJC;f@0x5aMKpS?aWaE1>$ZC6}bDcMIL&ZukES^HkGK!%cfVp3^nx`v1a-?B& zvnty^&xtPODtT%4eD8&*3p$m~uUpv)mxHx5G*&>D8q90$V-ycf!c?X&aLLh=r^_HD zmp{}7sVW!n^End4CY0VlSVPjA7RlJbbT$*@~KS(!5Mn~=;aoy1lmU+}8JI~F@IZ7-&ES3atm1mQ!M`X@c zTn#h^*4n+S!Iw&83*{kF;W@csHSal3z)}OSm9bT&&4v~16uV;YtLV}*>Wd7J3J7eE z!a^Bhew|`>xp{(~pvQ_admpFe*Vj}Fu5oI8(;pZ$0&g|u8p-Ixc=yxI z{XWa}fC9}(WfyxshYcd;`!hH3f_XWD!(j!Rjp2KJ(o3bVqO^lb~NwQ$+Ke z+B8^m^3GHWXrZ$313WlBZNo6M&#WP9YPX_E&w@14uLJQk@t9A~9W<|>i-U0p?(3SP zQ_d`WKd-r<^NzQlo9#`1W(Y3B$DSQs?X_t)|KiHrMI>my02*W`=K~$!6(XbO(%N%V z2V*W(T;^SUbk*A!yrHh>mPT|X8IoZ1nL%8q{9YUi1eVyUKQ)3}YQEe+np+pV0#DH* z4a;^X;F9YuG|zp?lrLCG&)U{w?bbffT^QU(3L=i;MMST8j|6(RYbh5l>yQ(9csE|} zWi?Mw+{^J<7gVZY*=T1@cgC>APZvp#pmp!f7(e?^U4lWNZQaro)a<81f7nz=?&px=?p6J;rfr zaSB1JuWgsg<{;i)nAz*&ZFx)&p_yz4uKdU;qK`ncNMuP2a5*&CVmiCsg zK~vk|oA>5~HRnwaO^EpeE5C`J~ zGfyr6hR=dw@+e37tZL&YRsC`ty#3(qlMoC)X!vBi>t)(QrbkCJAwTbkZ{YK)kfP`~ z6IgnHoPl+^*6t6;Zj0S6TIarQ%)0y|6SfSyXmc=T4t%&`lJ_xeqdl-1)J+kShkI66 z!m_?;}AbwDk5rDoK}6}M<%WF9VUGdAHUmCg!x-LI$8^>AlGdBI2qQ7-D6 z2v5MCLuXcDp#gKHb?`Zjkkefvl0mrWMnU?x7%5_fqOeWQN2uTR!`K_H-?hfai<7;% zj#9|bXVs_IO#*i-_Acc-&U9U?*FBU@;Q_XJ5*v|ic1!oHH+T{!K(t5-1XvEW(eC$Z z55uu7O&i|R^S)H7%d50UJ@b>cBh#SB<-LFQqtG1im*4_?Jdv{PZ z){yPPhNKug*_}X2qu6*A6vt_gsnlLQMUkV$)?G2dJgal#u%J*P8oX{2B0G{Wao(Uk za5Suy$7=(m{-kNMm3KrRay z+j=*PEQv*JHM%+)6T55-6EsNPNMV^bacZ0GSB9@c`lyy}0PtXt)kd4#u&kjiDW&2t zO>{OL_%Cqnn!nJWVXeLlITSE6=>N!F@I16*@qu-_g zSSt5W-IxO#ggiVGn6vk4kIa=?wTj7YftVr#pVcBo@h3kIE(snMBwP;sP8T03PF&*X zc`4OZK3HgdnGD}i)lzEX0@6|(lG;IywjID6i;3(NeMP?zBE0F_mXXXbr`NM&pV3fiRqg zpFwbZR=}8UEwP*~6`G{srsctZYv zL^tF^u;}f3Up@+glUpgLiThB=_EQc(fr7M9% zS-xHtw(+c%f&opIo-J7j6OG>N%Eo0$xmcC402^eMt39m_5dtcyK2MdAqWFR;ru5`Z zoiwoNHtT#Oc*_pSGQkoGY=R2dMzb+aH@H%Y?>totXk|nMGkBgY&^oxMyik?I(^p&d z<;PfRE>4Y*9}o+9ZPzo+XO3yjYifU%goC6<6HU6Z2IDq4kIWlo33M9*a_DB$zj5g7JdzD62j$g2+*FuA< zyL|2wUq;7IWg#Cc+lNxDba5cLO%SA~SH=@EEE4$9$h%v$useGy^u!VJ(3Z&`D)i5&et`npVa~zGigo`WKOQ)cB%R+WKh`y?~@A`bb-A zPr?~eDO2Ce=@PLFY01;ZZftjcCRh($Yb1m{B)?RRqQ;^ za2UToN0p!_5(GEV1U_WpM86zI;*cnuSlXDHJ9lv*rCLYus=_STZr61GZk~L;2mBj@ zEJ6`rO2uNa)`c3%X3WolovcL?9Y^sr<{t7V8U98m+%CFkJ;L#F_U*h61De8N=N3wm zjk%tc`;I}e9ue#M_NM5r7)8T(D({h56Fl0=U1^FbD8q*Mc`EDdtssMLRB3KF5d)^= zeNwKU2I{6hPacL4>94-kT~rG3Rb`uKy(~Jy@AoofK6x)cXE+6eQGE7N5evO_c1F|s zCgu`NhDe5L{6-PDBpZB{Q&9O^uv$|WDActny{Yx=MmQvJmKE=9?TW4NDUIQwr<-*g z^uZE|75DWlg^A^d*@lPLpPC;Q?=s9~Y-@6Wdv1(b$iQccLVXj11nhF4AwFCPd9z#T zvfZ&q?WzHH%Bsg0K~{bI`qVy>soyb@DQneJ5yY-E4F8p*@k>^_%M;?v&nieRb}%c~ za9r+HG~PL{_Cl|f9~}p}l*Y$%D(eKK#&J(%cHG$OTra$*1kUfdqZYXT{TZY*6nha; zaX9a9m)*+^pSe+kKF!8gKXsBliR!^jhKqGCK_vU`aVgIPH6syvap?s)rQcT#d&ArG zh%elamenFnsmZbhE)V!sx&L|X?a!5E%(pGsk+-pbr+aR~{5)5;=_UoVHjh2Cm0=gqP zEtcLuqe+-s_H#v@?s%S%jjuN~h51vH&TCFdE~VL&ohUGThl`9_rJA7#(OC<<890ga zKRY}rnIGK6_?|lB3{1r-Zc@N7%$Pl2pNk`lF{`suw~Nk^(n$bzICS?(0j-4g)(C{4 z^Pyd=g99=MyDaEOpX|P=Lc$ZdL@JOy4;5+j)9PK9hq9mda!Z^}dM1$$#on4BrhGlK zYT;KA`ehg*HJ#L0M0fI5TC$W^0-~~A%kHamT5VaV`uoAHv0~A~L+2UP&p=Q4XNEQ< zh+zmOv_P>8WsH$GSd#bRN}mz^k-zUv9Sy>jQW7#DP$lHZkG+|IC# z@A-Bff=-_~zjRF>9OYk6>N2ztTU(TbHsddI1mpx+RymRL>d_$9sQY+Xo ze>x-CcPh==Ow1!g=8)ZLF0Ux>t22Avck8*&5*&m=cc$G0bR3X@Aw}t6+o3RZY!Xi9 zkz;8vR;KKrDA?r4ZSt7ha}o}Msr#u+WNTKn5^U)9duqvQ=Y80Fm-=_Hwsn3r*aW!<)ML@$4gG4M41;N67#ZIB}W;! zbcju;a^-lTm_sp~HgV059z7F-aZP1&_5SdBMwpYDk(E(7U}n>YjnCl@l9gh)c1f1+ z1)a_Q%dgLl1MDdcBb`n2!l)B6_O+irLc{vJmNKIjg-ttyIc}$IA&diqE<`(w`u>dU zS7Pr|2*m;NXc~BNzw+eb(Q9Yu=}}*gSZp@qTtdUrQ$!eH%fGeU^(n%r|HG-WC5sgz z(aVkPSx)ASLTnl1lpv1lFk$k+XSN; ztW9>Iis|M~Zr)phg}XJDV&5Sl5!kYegodJeU7Jw?`H@rYJgWNUQo(-dl`aI#YIm-m z7@oL(V-o>EH{foHX7sWa2M@_SMW781G!VW=p5B}(Tpy+RIq4>G+*}G~_fbyO(yQ(_ zEcHiaN1#KjiPRH=oz3nmnbxMAU{IK@7C%1eXY z=-gr|+wwL`pz~1Jo6o|^8A|u@;Aj&CTmyn;Ymhux+TL<=}q)QoS!VV|fuCun93d@^9%TG``Jy$|*8wR37!eWQO7kBIk zEw%UMD_&AN;^Kmij&Er?X_wCQ-Y@uK`fiwaHQJq)pmQ;Kl5SUb`PM?o&u!8g4c^6$ zP=26XEb(E9Rg}x*{JV`$m6ZT@wu^Gt5CmK#+m77tj%@8*)tTLevL?A#YaG7SP_8yY zpb4J?!}`680N%_ewi)vIe<11Kc~ z)6k@nbKLsG9H@4xJpWZzxeC75Ql9)-!n~hJ0aW|MO^c0@`^BerJr&3~)*?42Up0#J z(Q;d-5gJavX-{_l?Ciypy#>u0G+Ssn(Pnx%K7+ zgkwS0_7ee!#9B>B5-=a*CiELk}o z1%9*Xx+&M)eErUX@{O{UcxZh*j-pwhk-i!A!33m_o+OGRl!%eSy~90iWjU0y=26T&@$*bkUaC<6a#nWT}w z=E}hxl272?nBjYAF+Ou*F$A5 z%o{2X8oSKN36kUr$JmPqQ9*THk!|Sju`=8n4PDy;49P{o3-u-hgU=txDbKps#?Xci z2le=VHb?IyG6B_LNkGMK%MinZB)R+8>1(yLk*6a$@cj?+zfT3w+sf*bQ;yxqy?;jZ zxe%m|CoSCRBHszQcZEriz@ZLLE7c`d$#4#}E4*_zj%;sE_1<-9D#^=_zr}LpJhkgW zxk}HA2|OV8irCBX&v(ff2+QJW)<^|54&IT_w14`Ym8r++OU74$SivJaTE)x`p3OTG z#WXC99^5+*1AMGi`nm1u1@6}XQ!l3tNz*pbIU!UFb` zdh=&@qr?j}cyZ0&w z6|Tkz^^}Wi`>I|uW_Fxm$-b7Z zeo#m!5Kx&o+-%Cy{<0fnj}1XAhb6X3wa7);eQh;1x6FQskKAx&h?XZC$wIv4pP92O z@vOTmTd5Oy8YwHV3fpD6tflt>`LQ*;2etS7sItOmXfr1DYpKg7i)Hl}&XgXCg_?YE zd5UWK)@9)Azeuc_*uOOJ?#6pnCr(0*XUNnibeV4>5Oj-T;Lb)KcLw$$R#5F3rJ8o| zc;{tbrIA9MiKFNuKtqz~l$Zus$K{*V9Z-419ffo-jHh{wK}>Xe=&^!8qmx>F7YeAx zQ}r8+L18`Q1V_$jQ?!Mn@W5VDJ8wJMGu(h{=6t8$Lvh_3K^MI5Ku{*N@NYYXAa#qr zxFK7?o(5{h9mSCQ_J2IE+dFT)R=vb^@8%h@lvl3`E0=W2*!lznRD^h}>)tPB17eHM zOu|px(AhZ!PiJ2_q}B`J+coN=1^6b#4XRvTH1s?g;N$(~k}q%kta1c%+OP1;Sl#sb zT1tKKNyJXevsk=C;YK=>UM74_-`}*;ui(hF(G_3#S~2@8fe$dX%1r#CBsBAKA@AIR zHy0J{u+Eg`*#yTF^+)0PFj;?1I?-ZMh{a`xPiw3y-JI%OeH=m)4Jd0gP+UX@X3 z=}|tF;bbDfvluHt6)z`n92C>_*^_1j>SPE>j^%>{2Tt`-?OOJJOz@IuAc~i?V4Z^! z>@rN~OIBtO?)=~nj={0hmz#m=-e#!-uJ%j7)(t2j9&=dKqc$v; zVHT%PWc%RVN*?DuHhelZ;r@qM#|b>2G}K}Kf{dJwbla^FK0k&66Bou4dR3ThGfAAt zWh;=rB*q%2!xRiF6e&fG6%jg5SGu>PIpPa^ge+enhA!FF`mLj7qnali>%$9;AH#$ct4tXygq8)v$ccQ+$ zw^YA$W%Lp$#RBR=+6;bO1kd?d71XN`N?$Jxo|U zO6+E*8q=kKIV=*qF5b#Op`}wLZu-UZgjYU==hh?8`@SAnYm)Eh*0X(0Q>@=qu_1|` zU+MAE;dRo}RZt71XO+U4{JbOXCI??AeBY|Fq=LN78fQzON(7b0LcgN=Xp1I~8_^rV zvn^f}yschS`xxV27Rmr>0VvC-X5>$6;~SxF`$Z+#xZYDfHV6FE*(_~XV_+^uCOY)w z(}DK1@l-aS9lNx|61s1dnu_=+qoW#?wgM~HB@2+AWXzNXg`WJAYRP=TpLN#nmt%Uo ztOe)TMoppVX&W*r38>M`X4cjLa^aUbeM6`6_AD(~NN6vvi3#6mtetex^=X;chRNmX z*Zs=tNw=>Pfh5JPcog6*1UTLQ;y&bA3zQatektO5m{0(zDo)?P`18H5(mI@x%xsv3 zNvZKW4K%)2J&L8ewFxa4iAOO3ttF064XZ}(Adl3kX;Q

5v+em> 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� z&$DTZ5{?jT$ef}o7F`c8wz~u9Ksvvt0uo*BmrSQfW$544M))S^T#K@0SwlhR2y5_N z$E;ub`n_rgBX|W5?0BMmdTo6U@9f`LGVlV&LVH41mDfke*5Bc>p|tR8xKYIC9342q zh)$}?i&YnNTN01jLyCdy1&i<{e($GctTlkv;r2u1zNIRA(*YudGT(1dT!{MGq%CE+ zVWAn<7##2jrd7$c-g@a$;l)Tl;ZyO7!`47qhnq-|CSZ-1y>=}M!0h6ldFRoRJwDgK zduMFh-xY4;|B1G38K);Xg6r9-v4>~tBW|TOEqp6<=*P5Ex+?paKJwEDJCVQYuu?0Q zEw7dZ_m0vcaZ2Ihx26`VKV!f;og3o%0~S> z`F=23_^?>PcyezQ=CyfJnxPTY;z)ZX7-Y3{N>4p;))IpUvp8>-~MH%~;dB)3` z&v^0o7ryRHN3z7i`_U$cZUj(^pJ}F?by)Sbq)8!RGyjz9p1Mm`KO|u_Ycc%G6h~-J zk7Z}dYIkPo@18wLxebF54hxVo8CIyjGC?j5>%9q^QmfCqKx+GEB*2O=Gq%q=AcefKr#n?skJ&`lNV3tv{U_PB-UQF4j9nF0%U*%<%zlek~gx z(BkxBBu5bH?T=BTUtt&d&ed8M3ZBbqpmu4fOqD4kd`N zSNtN`&}ZTI1AZuJoJRZ_6sK&!nY}ALYz>YACcY7{lc2iJ%PDcD%1g;Z$`{edZDk&# z#!&czg;AOD!LzA*wt2n$jaD6Etnl|bAssqRCHJ$Q_}f+7lvauR#%8GPoVcs*e_mk zQo7b8-p?<9#T*UVBCeAw6$%`~4Q+gk74n;%j=XT*s0@%EWr(7q)MP;-+}Iy(iw0E* z;a5-H;@*^bd`dvtTU>RlIjf?6aGRjaq*2`ERTLG^TxCvd8?iUAE<;8gVFC%x@>Lo! z_!x}lDaBK?+~lJE9v7J?Tn(ZG07#R`wTgGZj2bWhyyeaacLj^L6L=1ny!2b)-JzIx zE_?3*Qq&R_gJ{b|+;pg`D(iyS-9$&hmdRT0Rzu`@sMvqXbHCIGzQE=OzFN*>IZ(Ep z@lg2gK!Lqh6SSK#Nw7-efBclFDz<>gB-*4Gua5zHJhMZW`R6$0A>5m|viBY>N+x`} z?k`ug_ILH?uKD_lD=k(YO}0<+?pDpel;f*B;?Z$EycR|n_Q3X`GCAkm2-wS1`L$rTjE>);r3S!2yS5C;xVkZ4SWB208>+MmGw7LS@W4UAL0dE3Y5U zN=OM;9r5(q9$uqRqYqgeD^HzDbjt;+4$pXu3F_!;Y`dN&_V|?+4_kk zh|r07a*9*ysr#dcM(AxfVHZY zq(j*!rO>nx%Z9tz2+E`IxqjoZ5KzeZm8@bnD-(eZBWG+f2RPsd7n1Zj(Mvq7OAv+A z{%ti@%WqfhuiP|8x!eJIvAjymdqLs(GD21{H+O7lYaX$53pk*=(##HJFM~` zAi-EW)Y8=kWEWJrwWl4#P`LjMGvg~Ih?zm9X@W#)(1;FnmeC!E^XcH|))gdzdY^tJ z0b|kS$P9qx25r4QYx65-?H~AbjoAL9!C2|cbHTV`>-5y`qwi#oa<>6QU1~;}0>@gl zOd7OR+#AlDXx?5W7L=6C1O}eEDOm@T-r?jqJg5-VR|LD@dsz?N-<%7F5t6#H(HVau z5PG785ITG8>R%SEBH89Fl+Eak@|?)__u1VQhB6#HAIR#u-4IU9CnCM?`FbzYb?5#$ zHizwi%qmxSl@oH~^1ME_8pWbCZb|S;5t=rf=RVx@xID76$*1R^(3*O2|bG zxOzL%6@f#EM0Pk)Sy<;ggKXskQ@PVFZe8l#ybZQrhfn4u53N9+>jI2HQEs_`q~vWP zE7Q(HLKG4l_=9ZMX@jg&k%NNbr+G%yOHlQpmH4Ff?e%acGMNWU9y&?ehI;@=ljoBa_oJZH=;)Djkn%PvcIap z{_ueb4R8ITA(r!t9xHVEu!A*fQ*{O$JL@pZ+vaBU6!WlGn?Zq?1K&A{$$_r5DYg7d z>c>V-I^CaRzko{kzNns{G{5=iV=Ok()=F4QE-GV}8?R&7?0Nq!Z~&$YAF5Sbq83I~ zVx2cjM4B42A%l=)JrKZX%ksl`BZxQo;v{8jn8KQ`!6ns|B^z(5;SH5v0bP;$v6Sj$ zbX(sV)yb%-#NJmP@U=v3>E>|A27nv+Ij7d)-6s5ydGA^F(6{Trd`aAOrER>Nv!nl1 zN(^vjGR)y}lP&Ni_|%5Yp=tEq5D)+^TtGb`d=7G>cmC=5egw?`2!b!ZI#v5eulx2h zC&cyR{K8o0a)BI$L6iM8C$JE?@v4lD0qUnlAq-2&xit$H*3*PK^%uWjG`+MXzy0nn zvw9dgQU6v11}=Ax>c4D>PX+0>hv$_^ z{N?bMH`RWm6Z40WGE{GuN=`cfWMJoMq{4xJeB#SzNsz$Ihnh-4;L_9MFHJ_h4&WfG;u6z0NPq$_RK(;?2gdzus3u3=R zDcPUNW5Wh44F1je{+|M~Zr?XFzt4Bh&>T(EdSR(M57J0DF{8p~oyUgpWtCqAG%%;K zE(;9px0-)X*hY`$^94xyZ&UmghyJsu{7MQzbHsGF39e*$&w;r11DMpj1!;@D=M$R2 zEYNgXU^W0*pY0_<`EM5sg4f~9|1#z8XMFqn8T#YiK=C`uTWE|5O|mci?98A1vj(All^V2|AEXC z-v98!|GCVihnq^%Ky~$|pr>F_&0>5Dw|n(oGJ0d{?C)SPN7DaC`M-nbzx$8s=HI@` zHXbwndtBxKFWD!W!!@HKW1ORK)navv$)U#(K)C4BF%)^vFi-KdmGgWx;;;{ZBOQna z(of^xzVmyQ{hRCmeLEmI$^NaTMgz>uZP0qv#%S=>Ybbzx{rQRD5}F2}35e6m;dq4) zvv83hG|ILQx-(6rWNzQ9c*P_^DdfWySkAe0s_2-gae;4zZ2{K#;pHZ zek++yGzYr4{)dlr2y0uh!z3}F$7=wKVdlI?I@vb*&vc%G?g#q2nr%sLzr)S>|HsQB zD)Ll)O#nU)9q=Sg*IXf$>FSdC&2X$OTV?j2Fyk!WLxk_}tC$65Tgd5uyxesCOpHHv zGi-03*-7gfAV{*+)%keoXs@ZZH)SA4wAY;fUvuV6jAoVhc*GwF12o(J`Lh1O(75ca z%O!iW)TgrzXr|v&SfJOxGIKfT)b>v(IUbVD$(}MijXt%3RA&Fj%UT1_?TzW*E%ytJ z!!%!qWS!;z#L3@EI7m3PYXCwL8E~Kfa5)opfteIWlJSR*wMS-oXK+G?qJ18Tr28<1}u*%roqN#YXZ-Us*_-bPW-a!RxD$o z6Tt1r$cs7()fA@3(K>9T>GxLI>*02sGD6{%5?Kx#ObLBZdyEl9OGPqV4)Nh>wm!bA z{>&TENI;Hoe)X_UPl&{7Sb>os?JX>W*AFo{Fup2j+jY4Q^_h{Nimp9XU%iRZRdyg7q`%?VS!Jd7QU~H2q0TqlorB_t1Izg;eN1SwQS*X?QA}~ypOvUz7 z`J{K(EHOcG-Ew8w2qp_$mpH28F!XEi`leB@Vq0qhAmt=jLf#5?dv>;Jv=oq#kEFr$ z)4OWI>qi?sSAh2~i-*th=o2TT(>D?Ce5%g&?2M*L6iVaZI&>rBRfSoVV^o26R~$bv zRKT72Mnn1Qnu&(fgggz3<1dAesCO&P?-F0=s( zcoEIEpRg^~(*_6vyIb9=zwxXKlO?JuM$A6?#mvc3irs=bvO;E&xbtJn)hE+E2?9m= zgGPpyk4=}|26@>_-kSTi;U?aWP&`7|tuY~yLo2D**jB6w-c;Z^Q-_qZRo3IDg1mh< z#{peuIQqnjmX*)$?OGc3F_xf=!icZMM9X2lTMdRim=+4VB+AU3JpMcp2!@>R@RjrY z{X-F!-MJ;U3iDEOtr?=>8rh=XML*&kY}LL>8*4%@-$eYp)AnE%xAs!uZ6Kga4RWJm z7~2oV9+l~Z4qzaDW4d)QWq?*iw-7OaZ~blDHF~RrnRF#*j` zxNI;8evleFcqT_k8~6KXG0{7W1a*Y87=WRiYqPcpZ0UZy77zJ-bMWB-<*kFi{D|rF zked3BvGnv92~=QJrtQhJtqL&brU!vwzk|E+EhR2bTnmJ#LLZZT1cni*$l84FVETcs z)qQ|`SZa(35jYI9eE)8Le7xkhmumWa>ibnf`7Dukp#>O5^wHB;Ft^zsmrZ|g`l;N% z)XWKJ1+k!xIqax~x*06C3EjXB>~MH7A)YwUBj5KyDOVw$BTR@dVmF7iEn~8zGPw#qmb|LCboZZx1?8uP~i#jE5nzoz>@77a7T&c7o>Md^pc zUVi@SxA0rSd<9FpOSMs8ITjkVa;-(G-qCiLc$TkfFt{bLRc(XSEwt*R>3ch^iT4ud zP-j=3(tt!U|8#g=X~;03v3$#Ywe;i#^t7%1O(>w!LUa$rzT_~bxPt$8fY8qH8+F)7 zS`or}pS~ud{cq7KYC@V??f*u+Kfijh0chaAMY+_^3xTixEieLqh5=S3|Nq^npuNgo z=$WzGL;Y%Bm!W$r^ka`_i{*^6zqnVjjeQP~aQ@NS#gH=lGWXo-h~yt3+YNCv*`ks% zT`r|ADNhjZ-xx~~nIW`6ZJY`ut^YR4RL3_25eMWE__fe7NkO48{p&8j_EO)W`RALt z7po@6t~tCc==9ve+txp-UN)|)dqG2Z`^7&qgxin+yURn@C_++I#n&%M5(&w!MO9*? zKZFG;b#0_d9j}UO$r214F;~`S$B*;=Bbf|o_XR5B6Puo0B7E$1hv+hn?%J=Na2QmY z7`K~$Nm(Zw)-Cjpw525pfM(hg1U+Kwf(?y{i`RSe&7CBV$*~HI#lr}$A>RJOxCI%4 z#9V_gBU_(L{Y?R~d+FJgBD_KWFm8347`y0!yT;-)Ks-7h5wRGcXK+FuarXTm336KN zCh~nlF$vRT@b&2nrTLdX8!wce&jRlL?=Ge#sZYkmKcA#A0@i>xhQPe?i|uaR=o;NM z2%X^jhc`|H+`3e9u2Jy#vj2&@wom9k1baaMRnLQ(i#2Ve{{lEMfBeIMY5hCmTD4a? zFMzj{e+UsJ`oBr<-HnJ@8j#5pZXP$YCL=6wkPR00$9Lb0%!c4?E)EWc4%1#>WzXKV z%ui`H#eqMnN1HnD_ z!~8WV_gnt51B)!RT4DkbZA}vadBVS(8T|P#i>HQIGZREmNSfAHuD*?Yvo=}A;^OE6 zx0oI9cd>98vYHSbLw!7^f_)^2C>twEDbe^ne`d%-y|2eadI*d%09?Le9bv z37<*x&n#44ls_y9Y0FzGA~XI^b!Q)ybe6{Pnr5@M#ztF@oeiWhOGiz|CSOp~vD(2I zO~*1dG?>X`w4dM`N}$O$v!$ki>r0rT=J+lo`2xO;FSDB=V3IPz_+BBPAd(ogNa&)q z?K%73{JHm!`{%vqIrn})&-Xm%Irla=#4yO0c9s+rY1!~gij>rkG`PtyYFT-q7Sq0Z z6=^L=-x9P?oW=VFbxNGgAi~FNkM+r9USUx>6)iOG8OTPv%I7ZneAC zAc*RyrN%}I4mfjHT_zf{)1dMn+v#kUtpor$TcGt@)RzA3tw^BPv~I@!+lgISs2uc% zHYD!kpxX}fuJgJD+&sk-E~37|SHSv3BRp!B!t}A!`&MG|_MBARA5CIs5wtZ&GLqRw z9r8pNzqRCY=&VRp{pGoZ-@F-bCc&w^RfNGw8`G5m^ou*|e1iD^Cwkk|UjOM=!>xgF z{fv%qp>RS~yZXi-H`o+?*V3E3@$0-*GKtTtHqg`z4L))X%m)mUylC>s zlc5+uqwn0C2sR)R^qRSlitb9aSlBGOhTgm}CAxR&Hm$g{zAxu+eG&CXO|TiM=1LE! zjTY)rZ!0jd@dROk6QDBa;p!Q4*rHk2VV9~WI+oNQgZr=!q;#O@8>q)5e;x?h$T}mP zPjF68-m8mIT9}?k^CscfD?BfYrj(tIj5S#VLcQ$_e%jra7by5++A z|NKFliA)fLYNxKa9t$Rnm@Sb37N>brzQe=s$YjFjocttdbj*)hdsO!8*kUL|w2+5J zxo^)AYv9XBt1?Wuy%#;D6pT}h^ikXMGJKQeOz4+nb^Nkz`9U^n>elA_jVD-*@=(Zm zc^Q-CD=qPHg3!FL)+ZA_s=c$r{ASAeu%PL+9&Se%g=)jMgH=sCWWBs4HkJzW8zQtT zt;2CMxngVi96Jtq2x@s-XEG6ytEN-%obG8Wo~k4sBpDsYDN`L5y;=};(KYA+Trs0s z879dQkEyL{YaJO1(c|PT)DLfan|4!PE=@U5V0Y0Q&UOsY*d zT^$I%VZo-7cf;_ev5H4#Gt)<7v_}q^X-J+!H!`q+jS0fZ^^z2(!=X{@jhhC*!1Vj# z#X^)kZQc$^3kWLszHFLqCUcZjiB@*^?DB6Q+C{=&UpD;YG!vvBf~7V~j-Iq6$@+_2 zNTN=teJ}#$QNa0Eu}oxhM0G&eoD($?<)|v0hl@L z+)EaQ*O6n`1NZe!Sl{#V`M8alU`nmeY_GD}xixYCL z;upizk;*@$?ayz>CR|Wop9m?xtqG7nU2b>&SWlJ{m)@L0O2r8eoE67`NL(gNvuymh ztDCv_5OcDn$WYcK9%Eglj906%9BdE{zl8&>#ru;`?Kcmw{k0|IOAn9lj5NHRSPFLF zkA1@G4(J}gM`@*}Ec@pICp^u`UUNclu6@AlY*(SmuF{nq(~cux2)#x|JPh8RQ{76N z!3GN5nbFr$??jUpCAzrEda-pMgLC#=MKu0Gy1+--Fa_W6b3@%d-h*%}c31X{yNbAl z%+rIT8o2tvz{m&Y7Q9UVwUr2ikO-j#S22Xy2JrTrP}3K$L-5H^j=s5Mt~9o?qaC;Ma|>!dU0; zcR34aREg3DAq^=&Mca9s(67shoRxs@pN%Fpo?eZZ@!}Dvy*h~b#q_9j z*7Bb5IP`|Pu~2ipF%Y6!&4?Q6%E0y#V82v#FFS@2-N{v&pWDRACd;>XLb<#`rU35M zp;U03c9_fSHOb8#r-8rL8jl~(u~pOp1yc8<^wUf+ZvFF9g}Rm8Qgi?uhr2R=KP2v;R_A=jP*xq7SX z-+e>S6^rC;`^xJExP7O;xJ;6`ZF>0$V-a&pye0RdVb5$p=}q6_Ee#;mBPk|%&d?Z?$KbxLmTYbMe)>JWZ0m+^O|sW|kahSlEosw%?oTuKV}<+~427-^Zhq@!sq8x?a!gd0p4@x>m%wv&NzucWzv< zVuh#))X;LpiZ$dFD^~iiUkki4@pSt);IEZ_mc|Ava80}Dz!!hHoisnWVntDm$fENa z;Oh-HptgQ1R!Ab2ey{AmCVy+iiqu9E!;=?pIZpC}S+ecUqY>Pg_k^FvY@vrq8p1h5G9_ISj$ev9jQ}#41x6BfYcAS>gXc{WOD!mz5 z&>S0@Gv4+JImv$ot8{c-zvsTV!9RakZa38W_Y0E$m%I?$9mz_}I2xRJ{IXnV{@Qh+ zm!nB!q28V%KbEiGfX&n)IB$kJGOpw}hCWW)r62UxtEag4pzNbr-WQZ{=;i9yS4o-+ z52a@H1?|)kCE?6wzxUG2L-56MjoASb)fIPZp4oV3)Nvxl{2yZ&K=DWIF`>8cnv7WU z5v$C+rWn}5)9$F4RCp-suIBvEo)QjJ=X`J1rnv#_2E`boOZv?dki?J*bcn-Ee8tFH zG2ZHt#2D|uhDCjFh4;{L_VfkD)R9pd5ieBzZF2)c>SYjLJ<(eu$FahtX?u;Wj2vX0 z(>OY_VNYSw)yjm%-dJx|IfIjYRY&wtN*9R#H2CQFX1@X4D0lTpoN$4`VWBIv;6kAq zhxF&}AzPqW+BIwH>_y=za(>m7&HZ?4mB23?0lyN(lIOoY2q*MbDR%2AIdNWgYuDO- zH<`(;;&9h-FZ=-kZ171e*uha_9lp=oaaPli04XvG!lo5FkA`n=zWL3GmiSHP+Ot&Y z-{&E>?3<*ji`^my93ze&PINrb6E4bS4thO`kH|Cz;vi5-ZQhpN= zwT!;Co+OD@TU>W5B*+Y;OoD}pGS z{USO#(<>Xvar$Fo12%+-FAbN-oyJRY18ArsJ&~nowLTSfJFEx|$`s~__Bekgd3@JKT*E=E3 zKbSpPhs?-taSALB&s$N!)yYQj*{t*Zho3HZt#69Sd{P^e3(_5$(%UOohT){k6l)`^m@45_RbiBNui z^lQ+qx!V<7`&3Fbes*xK0#VsLl){$IJYq_tvpXkcgsM)#EhN3F!0ugr?5DP<3bb7z zVbQUKemnSRP10bnO+($zxnb9m($VvNb@BK>63@@6+c_b+x=)x82OwIfYS__lMtX)O z0XLm{5SH24fVRde_0A1ECT?3S(W_})I5r};8Y2xdiZ_dEs9lL zRVBnXO-8nGVSK7pdODkTt#z*7G$$LmLE6s$p^NPB$krM6PzlI(?QaQCn!;2Z^X3jV{`+b(r zRM-)Y2JE4M1-Z-vR+Hc=1iOy{#dMAI+R>7y5lG$+~%#_BFQEp~t z)j(Zqs+uh(V`%;kY$U&Wy}oCCE9)pgnWfzbb2ybGkcs^Y@S2!yQ9li$p~QQbVfV)U z&1PBvwR%8jYXo8g-#oQ(1K&NXcQ6BWjb06_6S#Mty4mNglB{p>i5;xwm0JpxX2qZV zP1J;hkqFk`+6^h*##J!*F8wEqpR($XC&D2RJ&gMTmweuD5E2BsU>U%CTKS}vP8ya; zPWTMob+|L6T@dizm6Kv_+_$X>pe%epHIZ&Q;$a+aI+xKS?B9`EtU3^Py@wwdL{X24 zJ~QuNP#C6AxcK%Uj3#5vT=F>Pqxvf2;HeK3QF*M(yfpqo887sXAO#V&gkrIY)6ucH}**DX8V~YU=ft zMXgw*0!{8R22snIG=!A;O-eTJ0`@9{mZdi;AKXcKHoxIW5 z$wC(6N+6g2mX1!z;>kh8Dhs$#hTPWL#&NKRU0qR`x^0G_R--m%3X(cyI!7Y&RWg-9 z)JaYsM5lfSx-w5+;}71aLU&`T>#9bI8%G|gBt}+vRNCU}&rr_a37J98C32|zMZb|Z zHrwY29Z-9{Jb(7nN-;NXBGohD<`#=;d=;u?RbTJ;e6mvG1M6MzNikuoSVOjF@Le|B zsaIDyKYf$kF|>1?gI^0}P2KKiou^^}ZtCWb#D+>A%;^t$t1`ouSvRRwdF7+dMEP3I zaJ+oV)#h!bpA&CX=aL#^!bp&?&0;Q33+sr5(2qdhbQSSfrBU3jVdL4ba(d`ZD` z<{`$eJ6cfdx$%;#yoQuem4SASZhG`cW0Y}2yF27y-7W1ipG2zVVlRr*YdI5R{>Gqb z^ivnPXdMr0_h1Xn!YR=R{Bdg9Cc~g)od8nsqp%P(NqkwRgGR(O9rJeO&pI zURevHJWE*7SfmuD%9?zfAUzRaF*0dina6f=Yy(j>%bPwES6`mFFHX<#>gtwH{e!1` z6q2Cm-cGMf>Y6@6y;l$1X!uquO!Hn~msf|VRwHgVnbYf|*~ip8FYKg^Z|LRpmFjyh z==|ND+K^g3;qI@0dG;y#`%#TVwzF)IuEGu#vJ;RO^i!Fq7Byxw3g;7Ynr)`WVr*VF z<$l7{!nqwU*oK4>ohfAPwHtnWOUxq;33dz2G34Ia2MvuI3QD~BxEm}3^1CzU)n!hvokN6)I|i@pg4iayXS#4%86XWvZt_zg_Pqzu)!mi1$z>*W`yOTs0za z#hCu*Et5_0HgJsK{e^3Rw&2fIy=lH5W$DEP%EmopAltaC;ca`^v%1LT>?Ga*`D!0I zZWF=7WbTeA5w*KfBy6pvUMI03CgZ3WoYSTRLA}7SPB+!CD zYq*4!r^0c91en-nz_4j)i`STnS?Y!apCby4eeuG3)uVBfuY2hmYXc=Fp&9xf2~6Ou zxG#M=Z@elirf>JM&qhF*O2orAc*UA|V74lp+jH*)xV7L(rI_B)BacB|pUN%^yMmOmAWAsk?*`L~7om z%{fC9o7=XO^jFRQT``@~5BH!QA0$Zm4W0^XILQOGh{Gy%%9>KHA||VK?(~ASHf(2N<5DXrbfAYt?KGWzRt{LtgvCs<;*~&a>H52 z^n;oXQd@XU%~t&AxU72?oP?ae>gHyd{i)w%)Iz88dK;tkQ{FxPBabuKnGg`ca?3d8 zS>2T?NJ*F5lj_oSCS)@RW?2T-bz%?8UJD%W=v^Y(jR57(^1M402QRw2!jfE)xv-CE z=St1$f*c5;4?()!){xK_obEbW9n02dc5!71j;4B66_ererci+~I@8ar%JvGDa%oX- z$?6RQ?@u?xYBT0X`#L7opG)5#hvYcZne|+u((kGgOLR|!A|2D3aQkqAd@pkC8o8Un!?<<3u|4q)2yUFPS2J&ZmT|IS^%ftt9F7$#VdIhyOl=vrBa66>@209;t8$%l7RYnGiW&T=+Ots>tiozFwf^qN^udya( z5@Kp^(=gspZ|Mdix2HEm2d{&yYI@_0x9#x*66jGAzrpO_##em3Ce<<{E)=Q0ArTy$ zdHT5E5?Zh&bSiT48nqlnoMg4UxJFeE;8UH|5Shx~BUvu;rgKr53=4)Xt;-o_+p1-j zUAFktb~e7cjf4oE4$4hZkrM>Z(i{TZ;6YOJul$k8QB0wau=h7o?jw$>26tbNy~=AO zgyQ#VR^P(g;uqgk45@H~9YL^#XPR${Ytk?hrE2gBkFajUQ)olaeMd3A4twakQQGFh z3J@i8-qa#>*q$lZzyAA;adu^6O>?ySD*hSfwNtH#V~?{6h=TWSd&zNQr{9Y5L&<)9 z&epVw=Dse{`EyQKrNDi*VTtT)4imS{>Ivvpy=3dLbr~wXCjZJGuBnhS^{;4nhqmNb`X_dm zqSKBA%tmU?eHa`Wx0gR=LqlHPe=2H*EY?uN(Y>x#HR9v<$qJd;4#@{Fr$94J&mipT zcEeTp;cY{|eCgasL61D?Mz|eW4B!Nxbqstr0Xy$Gv99rPr3m+K=z#m|_a;CHF$ZED zoIS!AR|RT1F&milv(9^Q($U$f@4;pxv-zILq&(y<l)G2j0#rn_=d_p5ZwJGG$&@du{ zg1W3p%W9g=*{s+*dD5@WzfQvH+-3&?fccqek zKP+ybB>{+H{xf^ob^VN*MIfVv^~dP``RtaZXO-54f!kmuFP;{L{E?+VbM8Wwus0uq z?-8e;?HxIeda>pAcZDHRx=t7WWMR%H6`3}%-BaG&%)N*NAJ0Q zK#G4(+LaF7C!6;u$WNx$=~;dl7mZ_pv0 z#>}r()Z|B+wHe6PKst$%=INGEx@(|ewCW2OAOz^xR#>8^1EYBOZ7b;&dW!*6`Ytpk z{W@@ITIb)v19+Q3>7|FO`Q=I-or=a#a5%zJb0ysRp^3$cp%JNMpftpaOn1}=yB6lU zYA-362>ozY7m%>>q~Z3?jgBAuq^6&>obT(1%L6;vw19|U6UZCN&h)0wOoiFtqaeh) zZxZzGgovr{h%SOl=9!H#O`%sgv*-7?bEXA)iOD{*E|RtlTdhJLX6D2zRx-1Bl@B#* z@93^QGCDbN%sBh#aop*`HM^u`qo_*7@o+c$Ud94Jv`MpAU+~>dKPY34X{td);cwmA zR}olBLy|_%9$lz%!hKe)xtz(2VLHg49t}ivedU=1W<$~#YxmrLvcsrTb2Q~@oMU2N z5IlRATcOe3&O#S0F*m_fya?6va&`uD!5aWfqX>2O>h?cEn{Q8eUY45 zuj9+f`Kbpw_L#=Sv!uIPZ^lNIDOg^s-nR+QZq)m!qXF{8mRDcLu;z*+l4Cd5PYq6m zzH$-nQ?Ne5yLIxkiap;iFBoUmoZ0mF3+vJjIeR*XO547J1QFXMCi`fV;Gr^PyCL0` zt&|o?7-Q=1mEx{^!LyvcVX@10lC~}?+x8T;m;L0~4cY4`&Dr7izQ9(o)(Fur@v{hT zzwr}v|J*kMUAxT+PmAh znz6Y#hVdoM>&{!p`HB{>WogV-CNi?Jd4BE!{>F7-ra-$`7(8chursb-V7reIsbY49 z*=M^bEA-7C#M-pZpfeG>t#@m8wj)STy?T=&!SR6kr)h`8zi=zj=>hfPeA*38mZfh- z6hAs@mXDz^KQ{RV?0Cq#Axu(MU8h*Xt51Wii-d{A=a>LO#Qc>)O}Q^$9O-3sL=CsX z^Y=*UH=l*7Ak$|OR|CP|mztw!lP1!7hVj%{dUuNYNyUy8ye`oI2pT}d^P9m-2$w1 zSKlGnZJzX{(N#Vw@$?6d(hS6NiuvHw2LHDuo90U1yS^UYu5Hon?jmSH>DP@dR<_x01HdC95A!?H`T3a7 zLW3h-a-wWMaWnhp83v%l2!KNJmKfu?NO`RF?xU)?X(EAh1_hhILvqeXLGFD63%=B- zU;&aFgLDf`MQHXI?>aEh4L9C+e=pAt?6c=6M;LooVU0OCe7>oczt!ex@o2|+dPdA> zm9C^=kXzi8(+dDOPG|H|&9Iz8in^Vv8yYM_`;KW|d-I(jJ3VaiNEd06GpVUp`RLxj z6#M-ST$k^0H2^7QQWpGu=0PY1te5N=?N?wOS%0S+K#QYEMJ%xEl6%X$4oJy=Eyvd; z9@3_j#hVCk*gq=(lf8#;9qPLOzBM_BB_J=b8P7{-O+?zcL zXSt&-6AM};h0@kZUgWDEbu~_Nruzf?3NBSp#vW@Q(Ir2=h0B{u$%t?H*!iu$`U*#$ z$3IA9_WG7Q%D@{R5g#_96%9Yq(e%y8LOXQ3HVimw$C8Yr?>t|)*`Wx;xg#0`+_m~Z zlfEF+AX&dpI~+Ru2AbGzEM`cu&yZcbV<(0I;D-g^r`Gy@$tJayF0n@nX4N0vZ*XklA@nksJ>P! zA4|3It21G=&MuA}i(43L9{i3pu2*Hqjm7Bihrgk9mQKzSUB48pPMrv;7+xx+uxE<> z#hL1^X8d66t|WdX^0AC#O>yUd014dMF|BaKk@FXmjh5px_K+s#m;5*>3QB)u9+XHW zZprMoZ7w(1yOhxS0#W`)VvE=h1gAa8#$8XwmR{H){i~sdJ@r3gyYc7QW_|b^lSVtR zdDro;{9P-au5Xf|j(&Z2ufKWa?#*e)l|XOtsrk#Z-GG1Y9r})xhajo`HaTxbrxcl^ zD^?gC^zNPF?;_MVIRzJR{8oh5sLBXCc$&adD^6^&?FqG@WozsWXPub#UR3jI?ob8Z zc12{@T_{t>i8lfvX0AT5%ZJ;v{4(%J%6d>bR{On*MPH@(1Yh9n#}sosq|z)0DXg0L za+^t6;Rv`@6ju7G3t0VEuN%dMM0S0;e(qeDbMwtLTuO@A#4)f6AVtpIM zZf0$Is^j8Rq_7eO>PAwpmW&r=4%dvL8Wx$Pz+6o~Hu{(iwc_HJ$M!ggOd@XQ4Q_{D zqXirV|AHp6(?={41PGT~l!YcTq^f>{coew*MqFTR9myw@&(ZV3&G+^aYY$dEakN38 zrbSm@-|1B0d~ab^$g^a=HYplTW6Jh0Wc4gAMyn~`)0rmT8<`hK0Xy4YDD}5{@vtFn zW*pMzTjertX2ed`I2^@SwjT`{WOjTq zeVO=VC8t|`yEH@LR|AI@`U%L^Amoe5D`Ar%Bi#e#!Bf}KkDTXZ(Sa^@Mi*h=TJ$ll z%v6=x5n}FqM}2b&xa!Cl0X;|a*=7YAErI+UD*Z``3VAgPW?D>(;amHfF@&alkGHLtYog2R#>%RFM z9>|uNI_`MHKl?e?EH&w4XncWR%IccQfjoIDRlFO1;j>22Lf8*$dri2h1ys_t>u4&? zI*=pOq+|5$e_h{bo4H*(oVETWR;lx-VbBe6dZ;*^x&kBjTEP3A#D=ZI zOs&K8i;B}%9(al9aJ9sQPLdNT+s35TV240C4~DqHf(Vv8GQ=v6WYPj3i;Il+->T1(Z$s1d3pp6soMkY(AWX$TR{Ls1L7j+Cx@a zhuQpO9p?Usj z=>orW!k2RI>=u;|=#i-bH~0D-_;dP}WAbZ$+IycAJ*ag|8!zY&PilIuM``!qFJ@T; zht;mdY&O4o*pQ3plmd*saD=KC1=yPxLHdtVJaC;&zM$u$*6SvmlHxX31PE`Wp&&_s z=s276lx&-5V#L+&=2o9UJP$_Ls}|_I)vWj z^)`Yhbx;R)A{&w5nX}p=AgUOMXu^_H*Ht{wkom3jZxaz=otqCW+V&TmB{4WP*r%nX z?XY>S1o)+c{|1779CH~6hkgGIggO9@#+ki3;$xB{9=5pVkiqD|**ZXxq4lArx&Vjb z?HsSYF%BRg32`%Ite{L4>%K}dsR3h!pCIR29B<6TSXo2$f@=Yx}fPE56fK)J81YnqBF%jZRF9G;y35}~Uj-oIdVC`-HueA|eN&cDOZ<8joY;7KT zE=+7VFyL0%&y`u|idk0jMufCE6Wurc?jqSVpZ96m@sO*3xv(MD^r1x$t-`LDx@)OZ&hqrIWnOPByoxO6pkBxBvZ|PQK_+P^2tsy7`oj0AfeL;&0`BEMPxa&#m zKc{@9LRNg6gK~eFJq@sF!Wn5)eSI7HfG!%TL73dy4H1$9aw@6hu@0sRb>onqGsl$KZrcH`YDrYzJfOoQ|o69pK ziBSME|CbqU`>e;pS=@uMP|{qmlf{Gb!qoVdMRF6R(OAx2cg8l+h(KsKp9rXZ-;?P< z&6~lif3tcP4w|?kbI9n0?MUm#sL;VvrlYsQHvIQm_GzIM24WIq>-gz&L{-hfNT>}& zO|sH9Sr^pP+R-RN>?+GWXZ$a_`5(04K5sqfzeHOT%)X%0U!)WD z7_zm`>Fzp>dHZA8OB4{!@&JO9`EG!~_ME`hu30Af{-Js78{R5QM-97FBcOwLWyozx z`v7X%&AO*aq<3dOKR*uygLPfE^_FMZ&1o6P{&C7^sBkf%o^tgT86dWEA{?}4cHZ`g zS#&WQH9|6NnNL~A=Np@%b&h~>CpvFQ3S5ijetLRG8~$^<%(@$Q zdFnYdakr4pJF5(%mHUUDcVdULe13%he?zW`sauYvmI^k<2!%5Zce5whYdUts5DY6v zOzt`fIgj^FPci=4!T;itrGNkvr$bP}@{1q3fQ92Gm53%FYA5v!(6U&w@CIl9A%_%v zzUL+t@BK&GG9J!y>f+iT4QzcWR;GZ5RY70ot*ID7ein2|{FfsyB^rp6SoCF1?M?9f zqX?Px%S9Q8^OXO*iIJ5c--i&N$Q2e12iI{gZM`U7g%hZFC+yo;z?F>1;DxL#UD_4+n` zRW#JbGuZsaS!u1EHqwDcc<%!N9YEEH1wI`fCiqwFdfkp2obr>Z7LvG?Or&a)Oo z+zB|smZeN&y*Suaiae7CT%1JL0y3*H4)|O|o_Jt#;*PpDgkyhc_z;Ip8 zRz}=}9DJ5)k5YyEGwbhM7-#s!AGZs9TN4TM5e#%V)z#5$x8#1TG~&NB?Z{iB^Z&Ot zUJv2eQx>J-oqGFz(WKA5a%iXd+OpI5E3`R#pUPXWl*z)6O=1@9527b$K1JR#41%1% zuEQ=REx90mXZd1IX$&GW%}0h*%EmVWNsJyqHJkrubXYR5_cnSbS{QM$A$0KbV@-D% z8MZMlkRrSah(E}KlHbbn;(=j{_p4LM!*z3oj?(|1Q#ON9pVNAnl39~uuG!Zwa!HY$?6gN9sh3wd?@ zB0hB_jVK*$cGZ$KbH0(Hl(E>nm$U`oeIUbHPMNcSG-aJV%~`Jk@yx~yFX6xE#q4Wt zC`T21V$=VOM@uj+wZ#hCQ1XZ50~d==MRj@9qc=5 zB*`a{gr&)}*DY}2hdE?6MKI2h+nLO?y$cls9DX^yx+p=HhF2esZ*uCtnPqbZACLFq z%g#pGhtet=RvbQowONhX?7a#T4HW}Y7PWB1Z6L|L3$-9yW7HOu=`W^WDavGTeR`2$ zP<-M&4}k!`P6$JPA$A3}Y9)+qlN>K`Z0<$B22Tz;_D;9yO6QO;u!ru;wZo4ZBsUyE zyneCvo2Y&Dq!b|gG$*Q^Ni>CQ45=4A1pjXvSYd?>82U=6@30tI2(iNEWwIQjn8!gd zu(MU(En1ar+s7ycij=ViE2lqI+63W03TpLU!^!U~fq|X0N>#n5akL9g6H`abfPk*^ z%h8Rnq`-P+4hoAj$1+@B2n(|~*ok{@oXrhE{EfkiF2an-^kf<1}jn*mmm)zEE=m@OMTN4%I-xLutU+9|2E)h3~uUlUkBNI8+}}f zZzHFLbP*UqF*uy1!trX~q0>wqR}7RStk9(+9f^FHdlZ6(7~Mlw^+AI3GUjuUY0CfJ z8H}(vK|XMgw6rw`Qq{1Rqn6fQ*3eyr3IziEjZuy8T?am=ppE__bp3y`Xau6yHNr5D zpI--Hin~}h$=qqXR>Bf1?8qQN?fq?FU`hIyk7(iJi!Y_6bVd)5RXuhT=7@!kSBsgo zp@DqhA5bZfscNtZH<%RNL%qP&XzXlQ{21ZzfJ}xF!(O$GE$h$uCgaxn-=3y{Q7g(# z_%h`N*k{f)BPcLOyLpchL4m-PDO4eQrznsg0NP07$^zpJ{{9O$yPr+=`5xR3Zr(5K89$EA5$y$=XxfFULE?>2)g^9sPP8DKvuC`%LZ6%Ly-~~emYpF4RXH+ zkt&7pX{D^UizyfLSIyzx)kh224^Xf6E*0`W@bPm^S4@+sv63;wQQ=(kNP%si-Lf-i1ey;XeiV>G5zc5(pghXbXia->AdskI^ zf~ZFIuM(Sb3q$<*&s{qN7+EoloZQbsqb?HRl&F@V7KH$=e~0yR#-}I&QzmD#oiHV# z{6Th}bZpZVg7-?G&iVgla6m0@0>!9xzfwCs4sypOeDXlyBFoRIxcD;%7)q6N5dSEe z!!Bi)YBxVKB%oSf3TUpF3?s;9g*L@bYO}q+$F(}ht0B<7O6@_^jnSEK>vV~t>hO9VA?ApN@T1eZ*z z9w;$b1$*D0uzKGB+cc-_n>$dV{VKu`@*ZEYpPZ|6uI2qpt7)*r=G99P*ITZFf&XeO z-@Ms~Vnn#_8-ThmNsp~F5IP;h;P@6tJ`$bp{0=d|@KaMWzmm26fG4rne+h=y{S|VQ z0xQOGpSV?d39GIC?Yg%z4*;s^6usUm{MIOj6$U z^7SE$J3j9BpvX1&^@`;7oz&__{y^PL*phYHbsf!{9OsRAV4#Axfm zy+~C5;=KYm+=_v!^P3z@f%`inW?+q#&j0uW>abzZoGwhwHX!s~() zEcCy2Amk4tQ#xV1(84Z1+rKbsZKC0Z(?Ddoi=2PH_YRItQCO+FAq7p`a-x8eI%8n@ zdoNq)DyPx{kfFH81?~X4RkSVDf1!Bf9cK0lZ5GxS!6DT(nN_ znLYQRouzDp=204DK!kKDiLZ67B&WJ~alJphYQ@tq!$|u8|7)?Y)Uk6=OB-55BX6 z^M{uVwH4#z`+zWcA-MGcHx<8Fy|9oa78q8xgZ;R0aCZO+5NUo^rImZgRxy^c2JEuj zf=`U+L6L^s2r*Qfb|0Vw{#H-{8|AgbCwyRr_J#yQ{Km6f^m@!xWKhvd5bV0{b=V(# zDy)gmNfOTG;!~HjX~&|`;_DzPDA32rfbiLXza>?u9N)<8gj7wY`E?G{&9_hwhL@ov zekrcVQ`kItR$!ZVyZ0lhx#|HxPW`DoESbgM5g+018^gPjygzg zk2GX(xk^3<5AJ{O^(#%67xp?G7P1yOAhOEyDgA9$FBu=x#@Bv?5&;0DNlfh!gQN7#H!U&Z%G!IwS?@PF!U{g?b_49Dxi`2cb^g<`C zMr|F1e=edI=p^pl6`vYXbLvS!r7O^2|0xyB=O?jE_SmhV|E-c9_qy1Rf8$bS8D2r@ z`_5%SX@e2LPCt|Pp}pUEHrpHogUGjitj{+hcu!7+mXCp`xH!~0<_0w~Si4mBV|9g- z5dNOBb9PBr2R=tYWi1xMLlXlz2jmU07SOpYY_)Gs^oL@f?bmHlHI?DO-<3_gHCSMm zV+24rEx!$glc1dTEQ70z2i4C1_)*XcO5E6~!=azOsxDvryU?NHOFpezc=i3V*!CBQ zT7F{_TQY%AYJ%-eSS;B_C%l@DVe;9S=4~)+RA$8}f8;_XI3*cM8hcydeuvYj;+8db z{6=ee8JsIk7{E@mWKo@v#&RHLf8JzBn0qH&h$7vCW=cj}vw4Xu5c5?{O{jFaYgaOT zgIoLIhgA&;YTUW3Wb>!yAnIHg#1n}0g*damW^p<=#Z=B7ezt4wtlxZ={H?HuzAnk1H+#~KPsF4P>kMLkFd8L zBB+|bew8?^gy9xdPgzX$l@6!Z9r@-PyOpm;5vYXy;jEz`pc#^A2tR{Ydk!EY{)$wR z51NY+Y#Vd6!}tv2csoFRquI7+wT*drBE=ze{xtJDNa66=kg*r^a!bZmD)!0N%+nrY zl|83Z924&Ynd0sXk%&pSmXmNQcUGK!^z@7^c(_gTTcdp_shuCmc=&dyO4as~XlWGp zHYVP0gM@Ur7;$rzs#E&&+bO05jq8pFxxpEHwgw@4{}(Lz~4#3I-ud6pyHD5zE2M%Zli zdhmADLFu?jjY8=dJB)yY9y&HVi{zgTQl0Ot6e#F2#~&7C+_c|#ytC{iSC93Vg*JjBb+6D0TbFQ5bbAQxQ~6O^WlL?n>u>du=cg`CIg7*G5Kx0 zz<}z=jSB!Lne8D{Q!~O5!r~^$4gPF=f%Ui~BOw!}nngy5q8H%AlVbd#}4u@gM~2~q2Gred2nZ=CPIq(kao zf!){V=4HdAdL+M%-!!^gHI|}y0PB0K8s}~GF;HS|=Yc))T&;-Z&Mq7e?X0jIHKDx@ zd^(%UB%1wmAu?&D9|J9KHw_}Fn^g_YjW+f{lVn-{~P$nhuw>!h>T zyay?Ty^>4Uk@s}0yhYU@rV-*R4_{>m)>`MHZ@gR)X>P{bO9S0LuqWk7ReGsEVW`3` z$uye5=Dv84(%8+^IFyhSU~3=ft`zlaqv@iOsFPgJ~o%o|2( zvvUAPbX>41kMT>#yDfb4qCTatk0ETp1mMFx&s3LM1C+}&+rO8r_&etU^vB7)@RIyT zjgcCWEOj);fA&*6Z4&-~Zb&GPVxBiN`!iR{qeD z4%YOu5OCZcGQYmZrLTi7Srj|&;a?pzYxOEEeu6)&I*RSJ1B2Nckf?0w>mIwzPf>=} zyl8I?O23%xDbqc<_W<+k-uqDG2F3D{F{HvoyZ0zzHHGT>6NC|*(g1TN&hPW9}HA6n#*kkP*k z3258YXcxTQVbf64PXa*4p#$m^DG#xd5=U^$p$)8g!G6ss7}ug`P|U?p#=Q-A6!77o zz$?QR;W<)({15a>C%4ga<)PWUhmEV9_O8FP902zjiE`Sg{jY-6G^AzU`1?HGHL`Mf z`rsnalYeDZuIO>$dL9(bIEB96)X%9vXajj^z1_Lp=jtCmQ!9CX;x=&4&Pa*Uj%7dvKj1oq9rV#7-@#0CWQWy^)XT)z=b zL9my*o-^L(t3>=1?zyEe9ZTLxPBSOo9vE+5@_!B?ELa^@l&YlY>t-frFf2R)~h) zhbXOeV;e|GRMK_FWAYxiUd~<(&@0wE93W1YSdMp6hJ?*nad2#kl=n6|{MJ`iX;h+# zAwhM%n+X&!KyKHv#zI;zcsdGp%V$gZQ#kzVPe%vwN*@590t1Y;9bttPQLjpB-}2~J z5`h5N{VGFg4*tVP(a#B;*q5ONbh^XS+1M`^C3}rTmE0miPmywHYJTWtjsM75YxP$* z&Kss05gavgL&<<;Jor}D&PG`2C&Vt~T+oS|$p|LEAp2IPgM2_2)C>Mskw0^>Yj zl@pr?2g&{~tfUUnE;uS%{P%xm8uEm72yDp{{N&E8w5(PXpM@*``RG+s|e~GzQeRx_Af^|(%5N9QG zrYepXEOu{9`4Z11Dc`GR+W)gZWr{`?j*(Ef=EnxFZle+|8dV#Ra&G?p?%o)0ZmhwEUa)85;4x22o%+GmE=49jy=tw=^i}`&-d_ z+HoF617|zeU<6m5L8a#!d%ByQb*y{Fp93uxV7i84Ts|{=_oo5X$PesWDS;-gQk?8E z+@9Q0_elqx(;`IAn<&^)S7))N+E+=( zFsK6BspZA3rn(^BCG7ekYSK@wdGxnLss#PTM7GjD z8*-F_g|(;Dcfz%P?SwcUEHm;zWo|i6osyVwnH}%Q0w!^mbl&9r*!`3ja@Ee}&nK5j zs?j87(ZueCq>!@OE!(mI)Qa=<`r?uz0wOwKYY<(v7DDbFSHqzF0NiaqQCWsqUZT`) zpjWKpLB#nb^(t@uk>xsKaDEnX8RyDGt(L?$0Qu+c?_7D%L%QhKJ$R84eyj@f6$#$E zCdusCIiN`bh?d)^5yBxdFn#lE|4YO*Ulo|%51LsCqQ-brT`ON2{Kyq9VDoqfB3N4d z)nTVc4a#CWg+C9db=p6l`_Nx@c~I{_tX28t0S3PK$LNs+{h0~#6P&yEe;naT8}Y6b z^ao`G0K+nfETE$3(>lKF1K*u9|8i{exgxQIaV*sO)e%ZUXy)>SO*pG%OlSI2YN!lG zE)wv!C{(w3w>j`1qM&V8UbzhgfAW@%{E=$rKy5Uw!Oa}es0h?E{U7i9?4gVInBe%< zA9hj5>p|Q-u{2Es3<|zT(9!qf2mi1H;bO&dH3?9QIDL35Bztz}j|)x*!I-Z589Tw- z%7wtq0H*%>!X3On1M=$~m%1{gBY!PVnHgi7f6gMQS@{HkfV60%IPij|Rwljb;jc~N z-}gWc?(=wzBP^etwI|4OqWDxVCDnq78lsGR2-6#vEo2-F!mF)Xo-Yh3{(>si(9Vxo zp6-&M&wf>fptt`phH3nd8gbQ!6&T0pzhe7&KY|tP_V-Kz?)x?jhpm3TjR5m7rfZcaFZ*j%Ee_2j<*c7tgo* z51VpSKMj6s0e*UN3tidxmCOO!>+J7^q?_5cZ0XV9Fsr4dfns(1{MSW(XKMXsZ?K_i za~V^F4aZq`NDfdCzAiExv!jo*_v)Yi!^{ZDe6rPvxMf%Z7|UF3jg_`KE&e|?5~PlR zX(HjB{H&AvKx{uWeGEuVdx>*vJ4@_RK}K!vKxju`~2}7&*7Pw`?}Bjyw3By&hzv6+=m?$RaB51IWOQR z;EV559le9DL-vrvn?jAz`=9AY>68-Wwr6njR?No@4M9&a4yq#`p36g-PH+GDIE+wO z4wj06V5%^PtfBHu@;^gV?tQFirOSjLbvFRT2UF)mU?Hj+stl{lID=VHBU9@~4S@D7 z0L??CLqU4QezV5UI=)1I8$Z@5Q{Iq?vghG7J`UERqZ`dS{Oxf5jDKFG_h2sQ*XG~Y zL;g5dkJ1;>D#-DJ{fa@Ngs>f4YYXWv9x_Aa4jm=fd zP0cHnT~F0$FSYyj)U*R(k`up`fkQiJte=s6_t>w+7-A-};wJB`x#>j3p`B}GB!Iy@ zov3XxTS>{G>AS#5N)+ai5ur&uU+H6 zN$`DvwZe6XBs)Pbp2rlQ$U065gDtECd>f)aVsxw$j%0UVe)8ql0z?Vzc{PT20Eidt zNIjXe@WE4MI*jyoR9;mOkY1LYM~y)!U9FB-g#|0Lb~Y^SMY zFtzryK4u~<<+(>lI{uR${T7e6>~Vi5D8Oi&#Iq<xpCA|k z|A=h{m zFk@ZsNnLMIW|VotG0@R1yLC7RcW&P>_Fct%G4`xB*eDFFr^ZU!vj|yr3=tHB&a)ce z__!8X4KSLMG!u;@gp4Oo2w9tMB^xBJm8&3Y04Q!_@Aobf-Tn>lRi zWw=5dRgO>DDl~O}q`jx#5i6VbrksL`OxVXyTL`8eI6cgDEnx-Z%EbAgKIW{R*lFlk z$9phGAZwUD%9Xn9%-u4K|B~0z{V)W^ehfBx(mSevX?>?UIe)OBk6*y({*^(<;^2cf z5r1D044H88(8l_mtI$jL%IJqLTGP<)Ltk4-C@0OMQZBuzS-}-o>=;)MrXJRoWlrkl zN9=`?`vRSy-wzQ0LQ@l#tE%e;Mk}v*mAZovK*%lJ>-)FX96#${xeoZl$}M4V#0Sxk zDdp0rVBl}zf}I?*L-4MbKg2nnF%78ldOvM=Yd|5SSubJ6&;waec~Prdm&QY(H}ug& zGWib^g5D`H58Dmd7fkhZh~RdT%9?Y+_*D@BF-79KJDR-!M0d%_g0^3C;WJo@93=#v z;}kCbGi7}OV21ZwR+o{1xk~aE{w-FpLoJT6LpIEAVSu#$BIUlgJQuEazhX8pK!!?$ zwN|q zpHU|POl0#z)fVCU>@%t0*g)S{^E49%%W?0-vlhyQte5K zlE-XTkg}C|@e<}OZLa_l^1$i~BblIal+9$l3diY=7gG!)Xi5gd^1c9&4d3F&Awkl- zf+K@P0aK-&y#t^HK|B1W8DYsBhMQ?2{KFfB8>dJbz@J|GH#d^ z11+;=jVSsRmB9VK%&rYF{RX`7d^*8vzM@VDp~dzqELf`HmUC-m*-dUrft(Rcm4?d= zOdCdjjvnlC34JMW(scA;=W<)X?fUIKefGO6sR6wU0IqXp<+k@MP$@;(|hNP8?hq5LY+=@!$+CJ7#Aj-$E_lLC4KMV+9t%DdJfYDIh?| zIHX7Rsj1@6(GLNWfFHH&88ei*A=n%|st9jYM3PA&jvgy`TVI$QdJYXC(hyUM6dCmQ z>3Fw($506I>n-kTM^P4{G|OSd3w!~H+S(m3Xn%J%(9C`)j4mW>Dy_Rb!Rcv#KZou5E9XEp2oVa8ve? z>GORzIw-id$IGuvNA5XNAf|>HRU*N#*r#p&rD9^*q@~)0HoLvpZ70~shLd>0<4=2= zwfB%2MK{^~d3Pi}#bif|h~kiBrjuFQvx=}yq_pr=Cz1nB^m47owDVP8Z#V;2z+iar zSgRq5h7SoKcRaq7(MXhc)+Okk{Iz+i*varMY>eZCr5a6p>$LRfix<+)|||-5x4T)4h_AhtoxJ41~TGKw+n5^1%VRtp83Wj~<4<-zvJL=-tPiWv;#r+_b!~5vGJmqOD9pwvC(*N@e?;3a z8`}u_k9mt0?kU4i&cXHVXboJXAkY)Wf1Lw-FBtYwrttJK9*XAXu2IWr(Vs5Au_8m) zn?7oawjT^*&8Nr4y>Wc;`H1MII?#R3PS2Qg1-P%)8LMC_9o-Y-ekwIdz%)hvv=r(2 zy_>OopScR=Fh#+`#?9%BeQN`dsCiKWOX%FkHhl{pYG}6)m8Kjf1gw(D7|X@_Kiv^r z1QHJ8;g6c~(=NDy4UC_-aqw3n34Z~}h~+xXt%~46iN6tTQ4p|K%uJ(g@9DRRz(3Z? zMmr$W!~IW`S!5NK##QkOX}ZhRfM7?2`|2AWp-t1>mxSDUQgTN-T;hyFs8&s96DrE4 za#&MhmmMvn<+rmHQ9H7#Y;ePACRN&`8V)&t!F0%?#Lc}a zxe56TNUZW)3r)+EjscIqt6IeP+I)vA4jsOa?0z;ruOXaPw}mh=5m`j<><&X*^}Eg z-tFiz{miCb+)f_=59gykReT!=tLLFfcpz7n>=GxWh9~XS5F#xxL&$hGdqZ zH=f=Io{lPQiten-<5x<^0SuU~E2Q|8Z_Smu8O{@@22EUKxchyN?#<@eTy*w?IDn9- zO^AtZ0`1jlM0*`n*ZWg1jQ4pgZBe7tG^Z_NFL`rF$`dS}K-M4m6>7au?K zf=ntK^EuK*;bBfaM98SGjm?f$nMPRYh68F;5(h#L3)6YT()cVGR@hd+v`v-v{Ra~Z z4KY02q2#YDio%Ban{ME_R?l|r15r+gX%WSf**a z4cZ$}N<1j6Yp+D_g0pLmdv@q*hm(gdbEAJwQ$d=aEq}$*B^!q`2Cr^*U1R3xa)Q1q z5Fp(!&8l>#Yml9hH-}damdahx$3#M4u|1AZkBb26gs*?LdRGmRj@AXioy=FXr~1@t zT29c36p&VhqZ#z8#35K$UE^HDHDzmQ^XA)7LHlNAzYHR6Y?t9SB-%qYU;tcCl?);s`-#!w+r@8WJD;Waa8j0LAMH zhQSYi-MNsQIPo^?ImGaqIl!k#cn|@H$z+IZl z?f`umb8Sop(sCgNpo^!zk2^Z+0%V6yDqxmSzt+a^Eyffa?5>V~U;z##ja?@Q2HH^D)F~IcSWL5*Y^R0;PjN{a zhb~UE?vFi3bj{iXAYto1<&?`*erG@9@Na}s#!;kayMiPx9eo~QQK#$V=h01EP_|gy z?ABO2PCcb)JZ9R56ClMU!v?i&S|+L8Dgbs`O{BHsD(+B-_p43`EOk@*?ahn7Z=CJ+ z?nB2Bw+@D!6F_pvnA^GR8b`E`WC+-X98k5lm|+Rq-jl%x9?KEbbOA&+tyHulCQ}X9 zGpBi>)dq!Cz#|R^o7j(oG0EB0;+ymYg2_Jj%>UyFfD}AwZMp;GxXYrPg*R(``%I#d z3!f`jE_UZ#I*%a&w(%-$5)I*eeoulnIMWP%Ar&yrj&^$Vj6Kp{oScNBb(o5Wn^?bV z%Qq%OF4@oso~CxmAPBb!Kr0=~`0S4Wo|B4=Z_dPd&M+hjTP-Hkx8hAc2`^2>Li1X; zA0-@pnSnR2|ICFsLyIzYh%vT8n*bg^U>ys8b{~$OkWgfwNZ=S}(FPwUVLzLWrz{ng~o5g!5QsNx*{(NcM#AblG2;q60zdq`>mBoD<6 z!3}5CXf{DbtdEGT+<+OhNYB+ZP00Rk7uoJT@5J@czPFQX^M2}uDvkyrp0&N0tMP3ZAM#I)+8usa`#n~f9R z``-Wk4xjFLU~+(Ee)PF4NGFR9VFG9f#cV>M7=T>{!g999kI?Z68I#6Wo3ki^ZuOXM&8dkq!OVGl}Hp%gd0_V%-N%;^%q^-Hk z0hN|xD6FG3?>kT~B)bo~PECs`Mp&XHi4153x$LO2L${h`l6-tBdE^W*BGi zqWvDj?%YNCITco>9p%N4$Lp-X7|C`QGSOAlk0(JBovM02Iqw2YK; zht64~Lr<42AK;}(7%qwaZ^E}n91|uV58`2mcUrf7y9`uQ_ zKD$pvH&Z0=j^t=ad}j1nFz)xMS`TJYC~;q(o-#zFyZmS>V7B8kqx9BRp5bos@Y;su zmwwg)1fh*taA240D_BF#zHzEx+3n$(S#>`jbwbaX;>5>8rV zo5ZF%a;v^==GEQAj^blhrBSt7@pZB&Y{sb)zIJt)QP}3UG7jcrJ{gWREKxL&*@NkM zS47);zPPqH-~;fj(A_qVHhn_ru23Ayh_r=Y@_IPLm+$Yv>)WG0YNWBR>-* zm6gM5f*QK$NOs zXser#A;iL95BD~8BBc}hTx%Bd7O;%avZA*5S^t*P3dAIRPKVQudSvKca)$C9tk+yo zafX;AvI@*he|Ygp9Spjdl3PDfgg))6bU@PrG!(LHjv`yd_K`t1W*8g+PlI}@`EN^; z82`HS5C>4c#i@&H9>tkp==Yld0s@>N^DPOt!P?_@#XZSTb3?ZIE8E__vxN1n+)k=1 z*sDr=C%lK8-63?LI~H)&dagdzdbaadB)|R`veMX6LvXv6gEgQD;9nG;OMp;R7Q_*_ z)4!3eSP#r$daxU}pp`bDx_lf7bC5v|0GJs?r=D74SrY7$RiT4%M0z zQtN(Dq<#XGBc*!ff*2P#aeyXHl0S{NDDcE868%Rm0V^Obo0Vn9RzM^~F>xWV7SMcg z>Y1IRexLqrE7YnYCOaH97~2XHa;SP?u-L78$lMyH0P+ilkTrs&G7!u0j}4c6%FyQ( z+l)jEl*zcgx(j!J&;nXEn0o99N4$`OchDl}Jd{^~M>@FL(4a8utKx7bUj0jU5szao zY0T4m(7u>!4?!c;5tPO<8_m6&=yY`(2|yJG@E*|V%f51q5Qt?h|HP8`7KC?m^URA| zqR*dKyiCA?0Vg<3V-yi9HCU0o4h_CMCj?mhdD)$+oU?}AH zD*!bLbi}1ljXTvX5A-o0!3H6tluF-Yy3+M3o+cqqWd#>7tf06JGTeyjvx*i<$g6o$ zaoZVYQxk|Vda6hfs)P9s+xwG2|N2-^ef3U*1cr7&Hzwzk`tVY>Y4kqN@B(d&=CB4BN6 zfk}dm0Fn@2^XA48`_!b9x2`;wy1yLDr2ubwuUB~av4Q8U3c-2O0>E(xftF1bVA$|K z^L^FM)-6-7KF@U)(DE+YtC94Nk)7-gOos2F6`^+n$DV;rv7Jy1!M=qVU~1Klq3jHC^q?pVp3 z1eN2@$XmTyOTu4?RUCcWYY-JJLem=FJ%{uGXL0ok!$A9c8L{-PMU`JBR#KH|8V|m+ zz*QjD4d~Y|kM=d-Uwm0y-h3B*WhLx23a_<^A+yyNh`%@I-%7)@9o)0Rp`BN~^uqf;jmr zrN3EO#QV1-?jpcQd%S{|d!6)rAW`-u^P=I|9U1y%z6sYnIW)kqg&#mESaUZCAcLoL zFypO4(~_Ay#jngGy7Who7tCZXjS5ef?Eu@gUK8Uyx$vrQA_lNvSB2--qSHZZmHk&hdGZ{R+iJJi6=@#jKJ_^%1tc6!c|QZBu$$h?iSbTU z5bclMB&mbhnJnZraQwjqQqfI|tnRdcdqpY1F?X&^s38qE*|zVqI1|s?J-yV3d8-Hb z{AJtGFVxqqekpkxI$7a8+*hg7w7L9=Yf&5il_U#|Wr;&~zZN6p)PoNX?j;Awq_ZKv z89P75Qc+mndvivWG!?Y|N<}c$b9Fjhb{6v1PU+Gi%pykg%^m#w(gRHhwuJ2cX+iy%26 zpKt+hvA+vhIEq{xqghY3K;q&hT?HZ^nB3}iGSdM^;Q~|6eov6Le!6$tUb1{{$eZP< zHx-YlJ^htL1w~CprR9+@pOxbEjDtF^SCL6D=KR%zyvPm+ly7#bzX=jdn3A&T5ZiOK zqy3rwjS)`6}Udgs(*sYS4X-)OnJj(x4NDM1i|HrA1AjnYl~ztS44i+`(O2PHb75w2qQYKj zu}fL=sP|s@D40cTK~3|UGpQo@;3Pqc)bz2Wd1!2nA9n8rAp_=#(x-D-y|se zHLW7Zpy3*(7$}{QE^E`_5d$u;0r^^`Z1lmv_{{NU2 zf&i#8s#z#K%M$SZ!q>AorVUSeSDU7jvTcSl7CBnV=W<{!;f!@oa)k z^Npo3#Z&C$&&UO|T#?`WvFmAm2uCnp{>@OJ;gKE7E!J=j@+dRxE*E|C5B(P-!4|(8 z^fG+TQ@GNV+>PULY$(3CD58s_RS2U0eVGO9 zr!BsWrBwp5wQ~I3CF6FDXfG8^5NOlFFI34mn84iTjzn6F@G{5z1rc%s-392kYHwx6 zBx&jjjuW67e^j18Q|B=Gu)Xi+ujH)Wj(&NW=V`cm9@_vm9}(ok`ToRZziD#AmZg7L z3n${NUmw)#Tz+ti1P&-#tm@%-I(S^}!YT`1U-|a52{U^S!W!n}d%q;2$B`#*Wln7i zN@wI4p^34__GI7w%d1Gm12DRNECgs7jo)}*aar$%sTe`Mdix=Q8V}$_%X7n!dVd-s z0zy18fJk`c%mqUmEjA| z&sfN2@K6q_$^+up(V(`^SH;Aviv8D%aIgZa?Sh1!W_%d_P1N7b9|6hmj(-ny%Sff~ zDp3AwdTL7iu&K++-Iax-5`;>)4(gsGL9!EWOA>*$wl?fdF-TGjhOu44_{|T5U9~(S z9DUo7d*gcg0raD>YTIt)13ROA&0(4CcukrIL!WECD=9AkZN}H#I3(w~ygb2R@W4bg zV4Ky%c3btUuFlc#LeTsSJp@H`rcJ@JzQ>_p>Y`Mg0eL=a6S&vi;9f!Whu6_5%BNz_ zZ006xSogr95Ey*wnYcMXt(@zAPN+~%1u7oDgpc;)t$km$}$q@Px>fSI?*U0eZO7n)DYqK|>hdwsr_x?Hav&SPQ{!eBi+mRJ^i zPa;b*ogW*mS7r==imhhgkP#*O_yuA(%1iXmO=pOiz52@ih%q*9gl$AfiQ00_|E9MI z;Ld9GbS*4({(S75qOR@oP(LutYC2((*7Nn8UM{C2n7-M96FA~>mJ^HoR9>r zY%cYD;npstKW|nt1QLH&pQ&5M;Yul>`yE*d;e5*RX?4iUu9RgR|N3RL+08_ioSpfV z8B>_)eXzj`Z_WDWwDVVq5^EYtd_ndmX%mQyq&&yUbTAWd2N-Q{ZoZM32 zWajgm@%NJvp^#BZI_dkvPn-cw40*ow5DY}yrUrY%KqcQ1fGJ_`yp<3?rE4|;+0-N8 z^0edAt?iirKC9b?`wG8+e2 z5d<^Q;yo9z+zqA}Kx3#?b=@DOLt#(dJX>*}3E{?tm-u}Q{@C?aY$$OYSkIP#Db3#Z z^P*0}rPlKpiNS}~0F|2#!?ArHZ1z0hhZ<&D*XEjO-lqu%F2O_2_q-zf5DX0pK@(6s z1q?6oo7>oV#Ww!R2!K4G>}^x%HHhb@?hXsYO574t{`TUJ4N(o$1=)}U^|wh6hKfx5 zvWJUJdTnfqrVP#MD#ygW0>!tV5{rnlFy3sDYIv0q5&6-h|IQ;ZpsQ+(>4^_{&Sb@d zbD060h9AX#0YJN$VK*iA!9jn<`80nb8g*OiPp{Mf3?(0rG9|4MverCH$kIV}e2y-U9bShm<>MtdWB$joXx?~YVpu|gxY42le=;R&|{Pt1LIpXqt2g6egF~Ic^H_)zROs99i;Qcq~ zh>Sp}!n(4gqEdwc8C23KN;zrMjn^Vu736yd_5k;p3569)P!~vkw%MjnLEQg&Fa|(- z6j9#1iK#3jwi^l%&7agkUB&(-G9T^XunVFV4n)Gmw#56|rH@xP*Txu~FZq-{5=W8%QWvSo(+)%r=`5tvfH6+1u0Bfb533Hn>Jy84h;G6&@VG1Ohd zSHoRf^BEMqSh0C(Z>{2X{Xfla zf)by}nH@ht(`i2~INZJinls=t`1%F|obsC(DR6MUjQ-+psX0w+%8?m>AhdBo7WV;;S{O9UFBfD-I{_(4Ug1EjI zNlHdcTj2viUniqKx0^8-B4tR~6NSgOl8RJVmk3vHGT%C)8O(i;?kpH30_7NMN)pqcczd_#kbtLB~LZT%E>{onT*&@*{o**7Od_F5>O|IU=t zYlvD&QdA8s5!WyaO8m96 zDc73n<^h~CW`bKlQFd)u@iJ3@R8vpC{O9p-uL)-J-+zlI`QKEE*H6YjcyqsPC7H89PFmOZjCK$#*J6?}9_6~E5 zndY$r4T_I*yHI@KeQ^u`%0IeK4U`}SiS;kyx->Wb?>{Wi!C#MiKQ*ZTyQlk~FZ{6NAZ7$Q#II`@{db9UT_WK(_2jQF{!kcN&+h*y zeI{S99b~%QP+hg8EVPS3{a#06{*(OFZY((=VRXCWSfB%Yff~sPx?dIHs(1mj_0M+< ztoNS(^`!)eBsWhhk(MB68PImx_W^{9fAsPPspM)3> zF?&%scrn1QjlUs925(iD6yA z0%fm%_ojPVv<|D=TY&lmn3WQyf(w86&r)RdPd=Ln3;1U!xm!01h!V_^` z<@0^3ljey<(|gHBj-S?0ks z`w2djxq_k>R%!ox#)}uW9!e1GcJB1p7Q(r9g{UacfzBg>;KPjXzwxy1#;F52o&U2x z_rK*;u54!%8gP0#k{MKE{J@LK}(li-y{Y-0F*Ghep!iXP1IezIaGO%Cxo-lP}uB_t^(i~8)X z-hjvU!zpcNnd#iU%?GkxYe|c#a46)TWiH*#c2$(|YFJXJZ~9}o#J*Q@XAMr(IOW*y zRUy=W<1QeruhT9-d>#oKWB^B<;p9F(dm^MI=MLbT()Y^g9fbZ z$+(JOsXJB&``0{8y_oIZgSvv6ClhuhyTwiRkngEpGWqr~#i&&wSxrFE0x;d=6fHCQ z-PF7(?@|;K_Nm;@^4Jw|%=BcUt;xL;w`{%EE`o?%cF>fgNRqY94{0d@%Sr;v()-Q;rH50rGRp;2x>FFb6$BsedwC%J}oj;}W;Uw^YmZ2RN^|ZpG0vmQk zp2r5*@UW_nQfk+faoYzf&A1D0yWmV0h z=E2+WX+gKId?@B6|Mo9sR_SWnG_KBa!LD92O0)(xb+YwbwW;~RjZxJ?+nLF{x`9`* z9R=GC+k^j;KBux!b}-=H1Kk{}lcu&)ONz(CTzSm^y>EL+qWRMg6_!ZMogul!`5hYW z-|Iu<6umgL!uDK^LexCbHphq_Z56n;-}-*dA>w(J@uP~>lahnm?g}~ugtvUn2y^p^ zTm39IUqI^Mon35Kh1nzDm|v`WQR;e}_$Ck-8@vp1{hiUm|F`_XBrZ7~eM3hsEx3JT zrQ02}8WD2;$69@w=dY9D7+1M8g8i%a!moAUZ z?mN$Mgr0);6<}CE%7)L#PG|95!?E;~xX#>TQ>;lz%97?KGGM?9Ok~|M7&D}QXf{$e z+VHO^?rNcr+2=TpC~258G3=+soeS|W#VnYHDc{LAb~Me&7+k34F1n#x*%_8D$0dC+ znqMPb;VXR_woe@BPL!jWgI92C@7)aJLks4r1dgE;i$BGR9Us2$U9DO3kpo9434H5N zd%r=Md?dclCX<`-DGfx=YvKXHFY>S*!;U^L+@d7e?+XEosVFDIIx z7dDO3+-a+0`2un>ZE&vA^u*KJE$6#lF4`GvY83?^iT>;L2{BlcQYzCF$5x=dkoT}| z#682OD-niGY$*RG=*1qYCuL#JRB5qsL4TTl1Bo4F1dMx8Mp?%RqzM(QkL;t1xk~Z) z`}^Z>=MB=|c}eS6+Z+78is*v7!?9thfoX63jYI?xZ}BBB4UTQ2Rf)%2YwQSm_T;jC zP#IIn_wRN)pJX>Q@I1D+Gu50Q4(Bbxk_8lvbxkT-R2+Pl(g)@1&KNygp2v0ZPLq}| zIrDQRL{y+3_~m!RC{5&M7hG57a{lI(STC>R*Rz~X^1J$R#7Ab9*CXtKc+!zKwQ&u} zzP1Qye65D_(nxx8I+FerILgx#_@$TDeFY~O!ULbwO1x4j)Y=rk1hf_47YK zC-c)6t}m-EwDivF_+@|2v+qSAZBCP21qUOiS=|-wh^=G&+9XyaaB3Uw$sjedMAIFp zO`ME|Gx~&4vAe=N(a^bfayc35=Wep-mS{?@)42`fSqS13H}zBCNY0jOtzDjKR6pQR zF(t)%-+MlHl7g#~v}A0OH0~}w>FJp$Ol2fzQ>C9m1UB;7)T1RQUy}gq`7;XB*A*T* zwbn}=)flbQ5hX|;1+Ny49!r!eS?(+$#(jrZ<2ll~wT>t|*_RW?eJAHMt!q_>hcP1{ zEv`l%#w7x?%*VcRKE9ZC!DZn2q{rE+$8Sl&k6vonT+}@`6jat)r`yBZFEjOcGV%1P z3N7;8UzAm)?FTA5D*sH?JD*fX!AaKB{!7 z8_9XOE5?Gg%4=py)Uk8TP8y>!#wjNX=l6O%mZU?RmiAAcQlpzXFD+C{^y@4Q1WqVc z@&?UD_dBzDD2xfJw1saFgHG~MsHEKG`Mbdi%z znN#|{T;iD6&wON--9Cv;Wt+Xmj=B@`CQ+5*WAak2Q(RhAehnfK>B*(bHiM-pBeha2 z;H9D<-566D8-Ir${&PwUA4kT9M-hW!X0b~Vxrby9_M2YUWO`5C)G9Oe`Df6(IGR)J zfZvp#|5!=#q4ni2;;{t>x&i`WLXN)P+PmKMh>AR?5Ba(mV=gytOAsCc+spO>F;H zeY5W<%mIfUIK4)KAMmPp{)1~;q=^>8qD3k4vy4{rM2F+ z{d1Qw2^el;PxCxj88xO>bh{5urCm;F`q4e*);?Xp@|gHT3P5iIrM+5aec znEHXo=JFTpArI!SEylV5$ak|#unGdj=)o8ZV+9p6x?I$Yv%MYSR*ms(#POwAwPWk|FR1>A0`2XG?-dC4xn_AI zKUj#uc)5kMZPQWaLD3YWykQfWQu{Pw&Va|#Y@FEEGYY>Y-QyYwusiRYF7rLaK&~O~ zy*xstBx-{1s zG|Jz7ny$1sSRY`A9&2!0$=}h+BVO#>_4t8l(X*v|^mhaoR;Is#aDSVZXm?V8w5 zctU^t(u9b%ts*u3X?$n|HiK!2^ysaX#ZMX6c2 zsJ&j2k|Nios#@(!D;3okkLBo$bHFmqEiScq_kE^8RHf!{gz^C;qyAEgUEpOuI?ISq zKAu1ks@iFzN1>NGcAzUK^THjfTH!mY^$o3zh zo5mt#7Dz3~TdP}0wgmnFD7 z?wwJsQa@^!erO6?1yhppx3~U=vo=+zLnWD0%1UiqMkLB|cUSY4Ik+p=*83^rhs(RV zhFC(ljFo&3^*d{>EmjFc~Kdf+7FvC^b1TIR?+ zJD}5laq!rzxjVL2%x-1&bn0lexyQ*Rm$MTNu>Pqg@0BulW%xpt2BW~sOoVagO?uRcTs#)$2u#a!N;OCb=XuB|#=O~}I>!VVt%arpE=bDqXK}C-tVk;aGvL0W78#{q zb0H>2j?{tgic1x=X4uY+g$^lTY`_tY!g29i+KimH=PJOetR5}wp}pd|Tl^ndS1GCF z0a?3(iwyt%V7*oVga2fF8vN_%fBx{(6#vj3fs!LDtPOma2bseOtGzM}H62x~%60$$ E0rQ)i&j0`b literal 0 HcmV?d00001 diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_annotation.png b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_annotation.png new file mode 100644 index 0000000000000000000000000000000000000000..41a08d406666db8e98cf2d5a650ff622a4c4ec43 GIT binary patch literal 90167 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%0A0C8{YVsxw!`fI3^pD3^nL((3m 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%0DVOTzl$2&wq@@*luHc=GM&vBs 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

5%mGjl7oyY!X(>>u6Dnm!Z4Wc<3L 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_marker.png b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/sl_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..9980bc6ec06c8cc05b6766d0490876960d6e3692 GIT binary patch literal 133620 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 literal 0 HcmV?d00001 From 9ee19e7ed9e015a6ecc4661d1405d79c75a0786d Mon Sep 17 00:00:00 2001 From: odidev Date: Wed, 2 Jul 2025 08:33:45 +0000 Subject: [PATCH 02/63] Create Azure Linux 3.0 custom Arm VM Signed-off-by: odidev --- .../azure-vm/_index.md | 62 +++++ .../azure-vm/_next-steps.md | 8 + .../azure-vm/azure-vm.md | 217 ++++++++++++++++++ .../azure-vm/background.md | 14 ++ 4 files changed, 301 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/azure-vm/_next-steps.md create mode 100644 content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md create mode 100644 content/learning-paths/servers-and-cloud-computing/azure-vm/background.md diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md new file mode 100644 index 0000000000..ba544863a8 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md @@ -0,0 +1,62 @@ +--- +title: Create Azure Linux 3.0 custom Arm VM + +minutes_to_complete: 120 + +who_is_this_for: This learning path helps developers create a custom Azure Linux 3.0 VM for Arm and utilize the default software stack provided by the Microsoft team. + + +learning_objectives: + - Use the qemu-img utility to create a raw disk image, boot a VM with Aarch64 ISO to install the OS onto that disk, and convert the raw disk image into VHD + - Upload the VHD to Azure and use the Azure Shared Image Gallery to create a custom image. + - Use Azure CLI to create Azure Linux 3.0 VM for Arm, using the custom image from Azure SIG. + +prerequisites: + - A [Microsoft Azure](https://azure.microsoft.com/) account with permission to create resources, including Cobalt 100 (Arm64) instances (Dpsv6). + - A local Linux machine with [QEMU](https://www.qemu.org/download/) installed to emulate Aarch64. + - An [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) installed and authenticated on your local machine. + +author: Zach Lasiuk + +### Tags +skilllevels: Advanced +subjects: Containers and Virtualization +cloud_service_providers: Microsoft Azure + + +armips: + - Neoverse-N2 + +tools_software_languages: + - QEMU + - Azure CLI + +operatingsystems: + - Linux + +further_reading: + - resource: + title: Azure Virtual Machines documentation + link: https://learn.microsoft.com/en-us/azure/virtual-machines/ + type: documentation + - resource: + title: Azure Shared Image Gallery documentation + link: https://learn.microsoft.com/en-us/azure/virtual-machines/shared-image-galleries + type: documentation + - resource: + title: QEMU User Documentation + link: https://wiki.qemu.org/Documentation + type: documentation + - resource: + title: Upload a VHD to Azure and create an image + link: https://learn.microsoft.com/en-us/azure/virtual-machines/linux/upload-vhd + type: documentation + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- + diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md new file mode 100644 index 0000000000..a25512d2a7 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md @@ -0,0 +1,217 @@ +--- +title: Create custom Azure Linux 3.0 Arm image for the VM +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Roadmap to the Azure Linux 3.0 Arm VM image + +In this learning path, we will start by [downloading the Aarch64 ISO of Azure Linux 3.0](https://github.com/microsoft/azurelinux#iso). Using qemu-img, we’ll create a raw disk image and boot a virtual machine with the ISO to install the OS onto the disk. Once the installation is complete, we will convert the raw disk to a fixed-size VHD, upload it to Azure Blob Storage, and then use the Azure CLI to create a custom Arm image. This custom image will enable us to launch Azure Linux 3.0 virtual machines on Arm-based infrastructure, even though the Azure Marketplace currently provides this image only for x64 systems. + +Next, switch to a Linux-based environment and proceed with the following steps. + +#### 1. Install the Dependencies +```bash +$ sudo apt update && sudo apt install qemu-system-arm qemu-system-aarch64 qemu-efi-aarch64 qemu-utils ovmf -y +``` +#### 2. Download the Azure Linux 3.0 ISO +```bash +$ wget https://aka.ms/azurelinux-3.0-aarch64.iso +``` +#### 3. Use qemu-img to create a 32 GB raw disk image +```bash +$ qemu-img create -f raw azurelinux-arm64.raw 34359738368 +``` +This step creates a 32 GB empty raw disk image to install the OS. + +#### 4. Boot the ISO and install the OS to the raw image +```bash +$ qemu-system-aarch64 \ + -machine virt \ + -cpu cortex-a72 \ + -m 4096 \ + -nographic \ + -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \ + -drive if=none,file=azurelinux-arm64.raw,format=raw,id=hd0 \ + -device virtio-blk-device,drive=hd0 \ + -cdrom azurelinux-3.0-aarch64.iso \ + -netdev user,id=net0 \ + -device virtio-net-device,netdev=net0 +``` + +This step boots the Azure Linux 3.0 ISO on an emulated Arm VM and installs the OS onto the raw disk. + +Once the OS boots successfully, install Azure Linux Agent required for VM provisioning, and poweroff the VM, as below: + +```bash +$ sudo dnf install WALinuxAgent -y +$ sudo systemctl enable waagent +$ sudo systemctl start waagent +$ sudo poweroff +``` +#### 5. Convert Raw Disk to VHD Format +Now that the raw disk image is all set to be used, convert the image to fixed-size VHD, campatible to Azure. + +```bash +$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc azurelinux-arm64.raw azurelinux-arm64.vhd +``` + +{{% notice Note %}} +VHD files have 512 bytes of footer attached at the end. The “force_size” flag ensures that the exact virtual size specified is used for the final VHD file (in our case, 32 GiB). Without this, qemu-img may round the size or adjust for footer overhead (especially when converting from raw to VHD). “force_size” forces the final image to match the original size. This flag helps make the final VHD size a clean, whole number in MB or GiB, which Azure requires. +{{% /notice %}} + +#### 6. Set environment variables +Below uploading the VHD file to Azure Blob storage, set the Environment Variables for the Azure CLI. + +```bash +RESOURCE_GROUP="MyCustomARM64Group" +LOCATION="centralindia" +STORAGE_ACCOUNT="mycustomarm64storage" +CONTAINER_NAME="mycustomarm64container" +VHD_NAME="azurelinux-arm64.vhd" +GALLERY_NAME="MyCustomARM64Gallery" +IMAGE_DEF_NAME="MyAzureLinuxARM64Def" +IMAGE_VERSION="1.0.0" +PUBLISHER="custom" +OFFER="custom-offer" +SKU="custom-sku" +OS_TYPE="Linux" +ARCHITECTURE="Arm64" +HYPERV_GEN="V2" +STORAGE_ACCOUNT_TYPE="Standard_LRS" +VM_NAME="MyAzureLinuxARMVM" +ADMIN_USER="azureuser" +VM_SIZE="Standard_D4ps_v6" +``` + +{{% notice Note %}} +You can modify the values of these environment variables—such as RESOURCE_GROUP, VM_NAME, LOCATION, and others—based on your naming preferences, region, and resource requirements. +{{% /notice %}} + +#### 7. Create a Resource Group on Azure +After [installing the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest), create a new resource group. + +```bash +$ az group create --name "$RESOURCE_GROUP" --location "$LOCATION" +``` + +#### 8. Create Azure Blob Storage on Azure + +```bash +$ az storage account create \ + --name "$STORAGE_ACCOUNT" \ + --resource-group "$RESOURCE_GROUP" \ + --location "$LOCATION" \ + --sku Standard_LRS \ + --kind StorageV2 +``` + +#### 9. Create Blob Container in the Blob Storage Account + +```bash + $ az storage container create \ + --name "$CONTAINER_NAME" \ + --account-name "$STORAGE_ACCOUNT" +``` + +#### 10. Upload VHD to the Blob container created in step 9 + +```bash +$ az storage blob upload \ + --account-name "$STORAGE_ACCOUNT" \ + --container-name "$CONTAINER_NAME" \ + --name "$VHD_NAME" \ + --file ./azurelinux-arm64.vhd +``` + +This successfully uploads the VHD to the Azure Blob Storage account. Confirm the same after visiting the blob storage of your Azure account. + +Now, let’s create a custom VM image from this VHD, using Azure Shared Image Gallery. + +#### 11. Create Azure Shared Image Gallery +```bash +$ az sig create \ + --resource-group "$RESOURCE_GROUP" \ + --gallery-name "$GALLERY_NAME" \ + --location "$LOCATION" +``` + +#### 12. Create the Image Definition +```bash +$ az sig image-definition create + --resource-group "$RESOURCE_GROUP" + --gallery-name "$GALLERY_NAME" + --gallery-image-definition "$IMAGE_DEF_NAME" + --publisher "$PUBLISHER" + --offer "$OFFER" + --sku "$SKU" + --os-type "$OS_TYPE" + --architecture "$ARCHITECTURE" + --hyper-v-generation "$HYPERV_GEN" +``` + +#### 13. Create Image Version +```bash +$ az sig image-version create + --resource-group "$RESOURCE_GROUP" + --gallery-name "$GALLERY_NAME" + --gallery-image-definition "$IMAGE_DEF_NAME" + --gallery-image-version "$IMAGE_VERSION" + --location "$LOCATION" + --os-vhd-uri "[https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${VHD_NAME](https://${storage_account}.blob.core.windows.net/$%7BCONTAINER_NAME%7D/$%7BVHD_NAME)}" + --os-vhd-storage-account "$STORAGE_ACCOUNT" + --storage-account-type "$STORAGE_ACCOUNT_TYPE" +``` + +This registers the VHD as a version of your custom image. + +#### 14. Retrieve the Image ID +Once the image has been versioned, retrieve the unique ID for use in VM creation. + +```bash +$ IMAGE_ID=$(az sig image-version show + --resource-group "$RESOURCE_GROUP" + --gallery-name "$GALLERY_NAME" + --gallery-image-definition "$IMAGE_DEF_NAME" + --gallery-image-version "$IMAGE_VERSION" + --query "id" -o tsv) +``` + +#### 15. Create the VM Using the Custom Image +Finally, create the VM with this custom image. + +```bash +$ az vm create \ + --resource-group "$RESOURCE_GROUP" \ + --name "$VM_NAME" \ + --image "$IMAGE_ID" \ + --size "$VM_SIZE" \ + --admin-username "$ADMIN_USER" \ + --generate-ssh-keys \ + --public-ip-sku Standard +``` + +This deploys Azure Linux 3.0 Arm64 VM from the custom image. Confirm the same after visiting your Azure account “Virtual Machines” section. + +After the VM is successfully created, fetch the Public IP of the VM. + +```bash +$ az vm show \ + --resource-group "$RESOURCE_GROUP" \ + --name "$VM_NAME" \ + --show-details \ + --query "publicIps" \ + -o tsv +``` +With the Public IP retrieved, SSH into the VM. + +```bash +$ ssh azureuser@ +``` + +Replace **public-ip-address** with the IP returned in the previous command. + +You can now log into your custom Azure Linux 3.0 Arm64 VM and start using it! + diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md new file mode 100644 index 0000000000..176d81ea1f --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md @@ -0,0 +1,14 @@ +--- +title: "Background" + +weight: 2 + +layout: "learningpathall" +--- + +## Introduction to Azure Linux 3.0 + +Azure Linux 3.0 is Microsoft's in-house, lightweight Linux distribution optimized for running cloud-native workloads on Azure. Designed with performance, security, and reliability in mind, it is fully supported by Microsoft and tailored for containers, microservices, and Kubernetes. With native support for Arm64 (Aarch64) architecture, Azure Linux 3.0 enables efficient execution of workloads on energy-efficient ARM-based infrastructure, making it a powerful choice for scalable and cost-effective cloud deployments. + +As of now, the Azure Marketplace offers official VM images of Azure Linux 3.0 only for x64-based architectures, published by Ntegral Inc. However, native Arm64 (Aarch64) images are not yet officially available. This learning path bridges that gap by guiding developers through the process of building a custom Arm VM image using the Azure Linux 3.0 ISO. By the end of this path, you'll be able to deploy and run Azure Linux 3.0 VMs on Arm-based Azure infrastructure with confidence. + From 053315d243d114ad1002618a54ee2f1a36e4092e Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Mon, 21 Jul 2025 19:34:46 +0000 Subject: [PATCH 03/63] - Updated title to "Prototype safety-critical isolation for autonomous systems on Neoverse" for clarity and Microsoft Learn style - Rewrote learning objectives to use active voice, parallel structure, and more concise phrasing - Reworded prerequisites for consistency and clarity --- .../openadkit2_safetyisolation/_index.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 4319e4824a..54dc4c5a23 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -1,5 +1,5 @@ --- -title: Prototyping Safety-Critical Isolation for Autonomous Application on Neoverse +title: Prototype safety-critical isolation for autonomous systems on Neoverse draft: true cascade: @@ -10,14 +10,15 @@ minutes_to_complete: 60 who_is_this_for: This Learning Path targets advanced automotive software engineers developing safety-critical systems. It demonstrates how to use Arm Neoverse cloud infrastructure to accelerate ISO-26262 compliant software prototyping and testing workflows. learning_objectives: - - Learn the Functional Safety principles—including risk prevention, fault detection, and ASIL compliance—to design robust and certifiable automotive software systems. - - Understand how DDS enables low-latency, scalable, and fault-tolerant data communication for autonomous driving systems using a publish-subscribe architecture. - - Distributed Development for Functional Safety. Learn how to split the simulation platform into two independent units and leverage distributed development architecture to ensure functional safety. + - Apply Functional Safety principles, including risk prevention, fault detection, and ASIL compliance, to build robust, certifiable automotive systems. + - Use DDS for low-latency, scalable, and fault-tolerant communication in autonomous driving systems using a publish-subscribe architecture. + - Implement distributed development techniques by splitting the simulation platform into independent, safety-isolated components. + prerequisites: - - Two Arm-based Neoverse cloud instances or a local Arm Neoverse Linux computer with at least 16 CPUs and 32GB of RAM. - - To have completed [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/). - - Basic knowledge of using Docker. + - Access to two Arm-based Neoverse cloud instances, or a local Arm Neoverse Linux system with at least 16 CPUs and 32 GB of RAM. + - Completion of the [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) Learning Path. + - Basic familiarity with Docker. author: - Odin Shen From 03489bece5d2e78fbf54e1be8769b414fb5e4ad6 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Mon, 21 Jul 2025 20:01:35 +0000 Subject: [PATCH 04/63] Refining --- .../1_functional_safety.md | 22 +++++++++++-------- .../openadkit2_safetyisolation/_index.md | 7 +++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1_functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1_functional_safety.md index d08f796580..9c84c5a943 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1_functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1_functional_safety.md @@ -1,31 +1,35 @@ --- -title: Functional Safety for automotive software development +title: Functional safety for automotive software development weight: 2 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Why Functional Safety Matters in Automotive Software +## Why functional safety matters -Functional Safety refers to a system's ability to detect potential faults and respond appropriately to ensure that the system remains in a safe state, preventing harm to individuals or damage to equipment. +Functional safety refers to a system's ability to detect potential faults and respond appropriately to ensure that the system remains in a safe state, preventing harm to individuals or damage to equipment. This is particularly important in automotive, autonomous driving, medical devices, industrial control, robotics and aerospace applications, where system failures can lead to severe consequences. -In software development, Functional Safety focuses on minimizing risks through software design, testing, and validation to ensure that critical systems operate in a predictable, reliable, and verifiable manner. This means developers must consider: +In software development, functional safety focuses on minimizing risks through software design, testing, and validation to ensure that critical systems operate in a predictable, reliable, and verifiable manner. + +This means developers must consider: + - Error detection mechanisms - Exception handling - Redundancy design - Development processes compliant with safety standards -### Definition and Importance of Functional Safety +## Functional safety: purpose and risk management principles + The core of Functional Safety lies in risk management, which aims to reduce the impact of system failures. In autonomous vehicles, Functional Safety ensures that if sensor data is incorrect, the system can enter a safe state, preventing incorrect driving decisions. The three core objectives of Functional Safety are: -1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In the electric vehicle, the battery systems monitor temperature to prevent overheating. +1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In electric vehicles, battery systems monitor temperature to prevent overheating. 2. Detection: Quickly identifying errors using built-in diagnostic mechanisms, such as built-in self-test. 3. Mitigation: Controlling the impact of failures to ensure the overall safety of the system. @@ -46,7 +50,7 @@ Key Concepts of ISO 26262: Typical Application Scenarios: - Autonomous Driving Systems: - - Ensures that even if sensors (e.g., LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. + - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. - Powertrain Control: - Prevents braking system failures that could lead to loss of control. - Battery Management System (BMS): @@ -77,7 +81,7 @@ The table below compares the characteristics of a General ECU and a Safety Islan | Feature | General ECU | Safety Island | |------------------------|----------------------------|--------------------------------------| -| Purpose | Comfort / non-safety logic | Safety-critical decision making | +| Purpose | Comfort/non-safety logic | Safety-critical decision making | | OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | | Isolation | Soft partitioning | Hard isolation (hardware-enforced) | | Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | @@ -94,7 +98,7 @@ Key Capabilities of Safety Island - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. - Providing Essential Safety Functions - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: - - Autonomous Vehicles → Safe stopping (Fail-Safe Mode) + - Autonomous Vehicles → Safe stopping (fail-safe mode) - Industrial Equipment → Emergency power cutoff or speed reduction ### Why Safety Island Matters for Functional Safety diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 54dc4c5a23..af4122a877 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -10,10 +10,9 @@ minutes_to_complete: 60 who_is_this_for: This Learning Path targets advanced automotive software engineers developing safety-critical systems. It demonstrates how to use Arm Neoverse cloud infrastructure to accelerate ISO-26262 compliant software prototyping and testing workflows. learning_objectives: - - Apply Functional Safety principles, including risk prevention, fault detection, and ASIL compliance, to build robust, certifiable automotive systems. - - Use DDS for low-latency, scalable, and fault-tolerant communication in autonomous driving systems using a publish-subscribe architecture. - - Implement distributed development techniques by splitting the simulation platform into independent, safety-isolated components. - + - Apply functional safety principles, including risk prevention, fault detection, and ASIL compliance, to build robust, certifiable automotive systems. + - Use DDS and a publish-subscribe architecture for low-latency, scalable, and fault-tolerant communication in autonomous driving systems. + - Implement distributed development by separating the simulation platform into independent, safety-isolated components. prerequisites: - Access to two Arm-based Neoverse cloud instances, or a local Arm Neoverse Linux system with at least 16 CPUs and 32 GB of RAM. From 59f59c5cbb5bde1832b670458026810e9957f33e Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Tue, 22 Jul 2025 13:30:19 +0000 Subject: [PATCH 05/63] Fixed some review comments. --- .../3_container_spliting.md | 6 +- .../openadkit2_safetyisolation/_index.md | 2 +- tools/enhanced_style_check.py | 430 +++++++++++++ tools/style_rules.json | 577 ++++++++++++++++++ 4 files changed, 1011 insertions(+), 4 deletions(-) create mode 100644 tools/enhanced_style_check.py create mode 100644 tools/style_rules.json diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index 94c5d71714..75270ef229 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -55,7 +55,7 @@ To enable ROS 2 and DDS communication between the two nodes, configure network a If you are using AWS EC2, both instances should be assigned to the same Security Group. Within the EC2 Security Group settings: -- Add an inbound rule that allows all traffic from the same Security Group by setting he source to the security group itself. +- Add an inbound rule that allows all traffic from the same Security Group by setting the source to the security group itself. - Outbound traffic is typically allowed by default and usually does not require changes. ![img2 alt-text#center](security_group.jpg "Figure 2: AWS Security Group Setting") @@ -185,7 +185,7 @@ To ensure that each container uses your custom DDS configuration, mount the curr Add this to every container definition to ensure consistent behavior across the deployment. -Here is the complete XML file: +Here is the complete YAML file: ```YAML services: @@ -317,7 +317,7 @@ export TIMEOUT=300 docker compose -f docker-compose-2ins.yml run --rm planning-control bash ``` -Once inside the container shell, activate the ROS 2 environment and start publishing to the /hello topic: +Once inside the container shell, activate the ROS 2 environment and start listening to the /hello topic: ```bash # Inside the container: diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index af4122a877..4d5762b126 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -1,5 +1,5 @@ --- -title: Prototype safety-critical isolation for autonomous systems on Neoverse +title: Prototype safety-critical isolation for autonomous application on Neoverse draft: true cascade: diff --git a/tools/enhanced_style_check.py b/tools/enhanced_style_check.py new file mode 100644 index 0000000000..93de0209af --- /dev/null +++ b/tools/enhanced_style_check.py @@ -0,0 +1,430 @@ + +def extract_sentences_with_matches(text, pattern): + import re + sentences = re.split(r'(?<=[.!?])\s+', text) + matches = [] + for sentence in sentences: + if re.search(pattern, sentence): + matches.append(sentence.strip()) + return matches + +def apply_manual_review_rules(text, rules): + suggestions = [] + for rule in rules: + pattern = re.compile(rule["pattern"]) + matches = pattern.finditer(text) + for match in matches: + sentence = extract_sentences_with_matches(text, rule["pattern"]) + suggestions.append({ + "match": match.group(), + "replacement": rule["replacement"], + "reason": rule["reason"], + "sentence": sentence + }) + return suggestions + + +#!/usr/bin/env python3 +""" +Enhanced style checker for Arm Learning Paths content. +This script checks markdown files against writing style guidelines from a JSON file +and uses spaCy for passive voice detection. +""" + +import argparse +import json +import os +import re +import sys +from pathlib import Path + +# Import spaCy if available +try: + import spacy + SPACY_AVAILABLE = True + # Try to load the English model + try: + nlp = spacy.load("en_core_web_sm") + except: + print("Warning: spaCy model 'en_core_web_sm' not found. Will try to download it.") + try: + from spacy.cli import download + download("en_core_web_sm") + nlp = spacy.load("en_core_web_sm") + print("Successfully downloaded and loaded spaCy model.") + except: + print("Error: Could not download spaCy model. Passive voice detection will be limited.") + SPACY_AVAILABLE = False +except ImportError: + print("Warning: spaCy not installed. Using basic passive voice detection.") + SPACY_AVAILABLE = False + +def load_style_rules(rules_file): + """Load style rules from a JSON file.""" + try: + with open(rules_file, "r", encoding="utf-8") as f: + return json.load(f) + except Exception as e: + print(f"Error loading style rules: {e}") + return [] + +def is_in_code_block(lines, line_index): + """Check if the line is within a code block.""" + code_block_count = 0 + for i in range(line_index): + if re.match(r'^```', lines[i]): + code_block_count += 1 + + return code_block_count % 2 == 1 # Odd count means inside a code block + +def is_in_yaml_frontmatter(lines, line_index): + """Check if the line is within YAML frontmatter.""" + if line_index == 0 and lines[0].strip() == '---': + return True + + frontmatter_markers = 0 + for i in range(line_index): + if lines[i].strip() == '---': + frontmatter_markers += 1 + + # If we've seen an odd number of markers, we're in frontmatter + return frontmatter_markers % 2 == 1 + +def capitalize_if_at_start(original, replacement, match): + """Capitalize the replacement if it's at the start of a sentence.""" + # Check if the match is at the start of the string or after a period and space + start_of_sentence = match.start() == 0 or (match.start() > 1 and original[match.start()-2:match.start()] == '. ') + + if start_of_sentence and replacement and replacement[0].islower(): + return replacement[0].upper() + replacement[1:] + return replacement + +def detect_passive_voice_with_spacy(text): + """ + Detect passive voice using spaCy's dependency parsing. + Returns a list of (passive_text, suggested_active) tuples. + """ + if not SPACY_AVAILABLE: + return [] + + doc = nlp(text) + passive_constructions = [] + + for token in doc: + # Look for passive auxiliary verbs + if token.dep_ == "auxpass": + # Find the main verb + verb = token.head + + # Find the subject (usually nsubjpass) + subject = None + for child in verb.children: + if child.dep_ == "nsubjpass": + subject = child + break + + # Find the agent (usually introduced by "by") + agent = None + for child in verb.children: + if child.dep_ == "agent": + for agent_child in child.children: + if agent_child.dep_ == "pobj": + agent = agent_child + break + break + + # If we have both subject and agent, we can suggest an active voice alternative + if subject and agent: + # Extract the spans of text + passive_span = doc[max(0, subject.i - 1):min(len(doc), verb.i + 2)] + if agent.i > verb.i: + passive_span = doc[max(0, subject.i - 1):min(len(doc), agent.i + 1)] + + # Create active voice suggestion + active_suggestion = f"{agent.text} {verb.lemma_} {subject.text}" + + # Capitalize if at start of sentence + if passive_span.start == 0 or (passive_span.start > 1 and doc[passive_span.start-2].text == '.'): + active_suggestion = active_suggestion[0].upper() + active_suggestion[1:] + + passive_constructions.append((passive_span.text, active_suggestion)) + + return passive_constructions + +def fix_passive_voice(line): + """ + Fix passive voice constructions by swapping subject and object. + This is a more sophisticated approach than simple pattern replacement. + """ + # Common passive voice patterns with specific replacements + passive_patterns = [ + (r'The data is processed by the system', r'The system processes the data'), + (r'The code is handled by the compiler', r'The compiler handles the code'), + (r'The configuration was managed by the user', r'The user managed the configuration'), + (r'The documentation was created by the team', r'The team created the documentation'), + (r'The results are generated by the algorithm', r'The algorithm generates the results'), + (r'The API is provided by the service', r'The service provides the API') + ] + + # Try each specific pattern first + for pattern, replacement in passive_patterns: + if re.search(pattern, line, re.IGNORECASE): + return re.sub(pattern, replacement, line, flags=re.IGNORECASE) + + # Generic patterns as fallback + generic_patterns = [ + # Present tense passive + (r'(\w+) is (\w+ed) by (\w+)', r'\3 \2s \1'), + (r'(\w+) are (\w+ed) by (\w+)', r'\3 \2 \1'), + # Past tense passive + (r'(\w+) was (\w+ed) by (\w+)', r'\3 \2 \1'), + (r'(\w+) were (\w+ed) by (\w+)', r'\3 \2 \1') + ] + + for pattern, replacement in generic_patterns: + if re.search(pattern, line): + return re.sub(pattern, replacement, line) + + return line + +def check_style(content, file_path, style_rules): + """Check content against style rules and return suggestions.""" + suggestions = [] + lines = content.split("\n") + + # First, check for passive voice using spaCy if available + if SPACY_AVAILABLE: + # Process each paragraph separately to maintain context + paragraphs = [] + current_paragraph = [] + + for i, line in enumerate(lines): + # Skip code blocks, YAML frontmatter, headings, and links + if (is_in_code_block(lines, i) or + is_in_yaml_frontmatter(lines, i) or + re.match(r'^#+\s', line) or + re.search(r'^\s*\[.*\]:\s*', line)): + # End the current paragraph if any + if current_paragraph: + paragraphs.append((current_paragraph[0], " ".join(current_paragraph[1]))) + current_paragraph = [] + continue + + # Skip empty lines - they end paragraphs + if not line.strip(): + if current_paragraph: + paragraphs.append((current_paragraph[0], " ".join(current_paragraph[1]))) + current_paragraph = [] + continue + + # Add line to current paragraph + if not current_paragraph: + current_paragraph = [i, [line]] + else: + current_paragraph[1].append(line) + + # Add the last paragraph if any + if current_paragraph: + paragraphs.append((current_paragraph[0], " ".join(current_paragraph[1]))) + + # Check each paragraph for passive voice + for start_line, paragraph_text in paragraphs: + passive_constructions = detect_passive_voice_with_spacy(paragraph_text) + + for passive_text, active_suggestion in passive_constructions: + # Find which line contains this passive construction + line_offset = 0 + for j, line in enumerate(lines[start_line:start_line + 10]): # Look at next 10 lines max + if passive_text in line: + line_index = start_line + j + suggestions.append({ + "file": file_path, + "line": line_index + 1, # 1-based line numbers + "original": line, + "suggested": line.replace(passive_text, active_suggestion), + "reason": "Convert passive voice to active voice for clarity and directness (detected by spaCy)." + }) + break + + # Then check each line against style rules + for i, line in enumerate(lines): + # Skip code blocks and YAML frontmatter + if is_in_code_block(lines, i) or is_in_yaml_frontmatter(lines, i): + continue + + # Skip headings (lines starting with #) + if re.match(r'^#+\s', line): + continue + + # Skip links and image references + if re.search(r'^\s*\[.*\]:\s*', line): + continue + + # Check for passive voice using regex (as fallback) + if not SPACY_AVAILABLE: + passive_patterns = [ + r'\b(?:is|are|was|were)\s+\w+ed\s+by\b', + r'\b(?:is|are|was|were)\s+(?:handled|managed|created|generated|provided)\s+by\b' + ] + + for pattern in passive_patterns: + if re.search(pattern, line, re.IGNORECASE): + # Try to fix passive voice + fixed_line = fix_passive_voice(line) + if fixed_line != line: + suggestions.append({ + "file": file_path, + "line": i + 1, + "original": line, + "suggested": fixed_line, + "reason": "Convert passive voice to active voice for clarity and directness." + }) + # Only one suggestion per line to avoid conflicts + break + + # If we already have a suggestion for this line, skip further checks + if any(sugg["line"] == i + 1 for sugg in suggestions): + continue + + # Check against other style rules + for rule in style_rules: + matches = list(re.finditer(rule["pattern"], line, re.IGNORECASE)) + for match in matches: + # Create a suggestion + original = line + + # Get the matched text + matched_text = match.group(0) + + # Determine if replacement should be capitalized + replacement = rule["replacement"] + if match.start() == 0 or (match.start() >= 2 and line[match.start()-2:match.start()] == '. '): + if replacement and replacement[0].islower(): + replacement = replacement[0].upper() + replacement[1:] + + # Apply the replacement + suggested = line[:match.start()] + replacement + line[match.end():] + + if original != suggested: + suggestions.append({ + "file": file_path, + "line": i + 1, + "original": original, + "suggested": suggested, + "reason": rule["reason"], + }) + # Only one suggestion per line to avoid conflicts + break + + return suggestions + +def save_suggestions_to_file(suggestions, output_file="style_suggestions.json"): + """Save suggestions to a JSON file.""" + with open(output_file, "w") as f: + json.dump(suggestions, f, indent=2) + print(f"Saved suggestions to {output_file}") + +def print_suggestions(suggestions): + """Print suggestions in a readable format.""" + if not suggestions: + print("No style issues found.") + return + + print(f"\nFound {len(suggestions)} style issues:") + print("=" * 80) + + for i, sugg in enumerate(suggestions, 1): + print(f"Issue {i}:") + print(f"File: {sugg['file']}") + print(f"Line: {sugg['line']}") + print(f"Reason: {sugg['reason']}") + print(f"Original: {sugg['original']}") + print(f"Suggested: {sugg['suggested']}") + print("-" * 80) + +def main(): + parser = argparse.ArgumentParser(description="Check markdown files for style issues") + parser.add_argument("--file", help="Path to a specific markdown file to check") + parser.add_argument("--dir", help="Directory containing markdown files to check") + parser.add_argument("--rules", default="tools/style_rules.json", help="JSON file containing style rules") + parser.add_argument("--output", default="style_suggestions.json", help="Output file for suggestions") + parser.add_argument("--install-spacy", action="store_true", help="Install spaCy and download the English model") + args = parser.parse_args() + + # Install spaCy if requested + if args.install_spacy: + print("Installing spaCy and downloading the English model...") + import subprocess + subprocess.call([sys.executable, "-m", "pip", "install", "spacy"]) + subprocess.call([sys.executable, "-m", "spacy", "download", "en_core_web_sm"]) + print("Installation complete. Please run the script again without --install-spacy.") + sys.exit(0) + + if not args.file and not args.dir: + print("Error: Please provide either --file or --dir argument") + sys.exit(1) + + # Load style rules + style_rules = load_style_rules(args.rules) + if not style_rules: + print("Error: No style rules loaded. Check the rules file.") + sys.exit(1) + + print(f"Loaded {len(style_rules)} style rules from {args.rules}") + + all_suggestions = [] + + # Check a specific file + if args.file: + if not os.path.isfile(args.file): + print(f"Error: File not found: {args.file}") + sys.exit(1) + + if not args.file.endswith((".md", ".mdx")): + print(f"Warning: {args.file} is not a markdown file. Checking anyway.") + + with open(args.file, "r", encoding="utf-8") as f: + content = f.read() + + suggestions = check_style(content, args.file, style_rules) + all_suggestions.extend(suggestions) + print(f"Checked {args.file}: Found {len(suggestions)} style issues") + + # Check all markdown files in a directory + if args.dir: + if not os.path.isdir(args.dir): + print(f"Error: Directory not found: {args.dir}") + sys.exit(1) + + for root, _, files in os.walk(args.dir): + for file in files: + if file.endswith((".md", ".mdx")): + file_path = os.path.join(root, file) + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + + suggestions = check_style(content, file_path, style_rules) + all_suggestions.extend(suggestions) + print(f"Checked {file_path}: Found {len(suggestions)} style issues") + + # Print and save suggestions + print_suggestions(all_suggestions) + save_suggestions_to_file(all_suggestions, args.output) + +if __name__ == "__main__": + main() + + + +def run_manual_review_interactively(text, rules): + updated_text = text + manual_suggestions = apply_manual_review_rules(text, rules) + for suggestion in manual_suggestions: + for sentence in suggestion["sentence"]: + print(f"\nContext: {sentence}") + print(f"Suggestion: Replace '{suggestion['match']}' with '{suggestion['replacement']}'") + print(f"Reason: {suggestion['reason']}") + choice = input("Apply this change? (y/n): ").strip().lower() + if choice == 'y': + updated_text = updated_text.replace(suggestion["match"], suggestion["replacement"], 1) + return updated_text diff --git a/tools/style_rules.json b/tools/style_rules.json new file mode 100644 index 0000000000..c4967a956c --- /dev/null +++ b/tools/style_rules.json @@ -0,0 +1,577 @@ +[ + { + "pattern": "\\butilize\\b", + "replacement": "use", + "reason": "Use 'use' instead of 'utilize' for simplicity." + }, + { + "pattern": "\\butilizes\\b", + "replacement": "uses", + "reason": "Use 'uses' instead of 'utilizes' for simplicity." + }, + { + "pattern": "\\butilized\\b", + "replacement": "used", + "reason": "Use 'used' instead of 'utilized' for simplicity." + }, + { + "pattern": "\\butilizing\\b", + "replacement": "using", + "reason": "Use 'using' instead of 'utilizing' for simplicity." + }, + { + "pattern": "\\butilization\\b", + "replacement": "use", + "reason": "Use 'use' instead of 'utilization' for simplicity." + }, + { + "pattern": "\\boptimize\\b", + "replacement": "improve", + "reason": "Simplify language by replacing 'optimize' with 'improve'." + }, + { + "pattern": "\\boptimizes\\b", + "replacement": "improves", + "reason": "Simplify language by replacing 'optimizes' with 'improves'." + }, + { + "pattern": "\\boptimized\\b", + "replacement": "improved", + "reason": "Simplify language by replacing 'optimized' with 'improved'." + }, + { + "pattern": "\\boptimizing\\b", + "replacement": "improving", + "reason": "Simplify language by replacing 'optimizing' with 'improving'." + }, + { + "pattern": "\\boptimization\\b", + "replacement": "improvement", + "reason": "Simplify language by replacing 'optimization' with 'improvement'." + }, + { + "pattern": "\\boptimizations\\b", + "replacement": "improvements", + "reason": "Simplify language by replacing 'optimizations' with 'improvements'." + }, + { + "pattern": "\\bin order to\\b", + "replacement": "to", + "reason": "Use 'to' instead of 'in order to' for conciseness." + }, + { + "pattern": "\\bplease note that\\b", + "replacement": "", + "reason": "Remove 'please note that' for directness." + }, + { + "pattern": "\\byou should\\b", + "replacement": "", + "reason": "Be direct with instructions, avoid 'you should'." + }, + { + "pattern": "\\bis able to\\b", + "replacement": "can", + "reason": "Use 'can' instead of 'is able to' for simplicity." + }, + { + "pattern": "\\bare able to\\b", + "replacement": "can", + "reason": "Use 'can' instead of 'are able to' for simplicity." + }, + { + "pattern": "\\bwas able to\\b", + "replacement": "could", + "reason": "Use 'could' instead of 'was able to' for simplicity." + }, + { + "pattern": "\\bwere able to\\b", + "replacement": "could", + "reason": "Use 'could' instead of 'were able to' for simplicity." + }, + { + "pattern": "\\bdue to the fact that\\b", + "replacement": "because", + "reason": "Use 'because' instead of 'due to the fact that' for conciseness." + }, + { + "pattern": "\\bat this point in time\\b", + "replacement": "now", + "reason": "Use 'now' instead of 'at this point in time' for conciseness." + }, + { + "pattern": "\\bfor the purpose of\\b", + "replacement": "for", + "reason": "Use 'for' instead of 'for the purpose of' for conciseness." + }, + { + "pattern": "\\bprior to\\b", + "replacement": "before", + "reason": "Use 'before' instead of 'prior to' for simplicity." + }, + { + "pattern": "\\bsubsequent to\\b", + "replacement": "after", + "reason": "Use 'after' instead of 'subsequent to' for simplicity." + }, + { + "pattern": "\\ba large number of\\b", + "replacement": "many", + "reason": "Use 'many' instead of 'a large number of' for conciseness." + }, + { + "pattern": "\\ba majority of\\b", + "replacement": "most", + "reason": "Use 'most' instead of 'a majority of' for conciseness." + }, + { + "pattern": "\\bin spite of\\b", + "replacement": "despite", + "reason": "Use 'despite' instead of 'in spite of' for conciseness." + }, + { + "pattern": "\\bwith regard to\\b", + "replacement": "about", + "reason": "Use 'about' instead of 'with regard to' for conciseness." + }, + { + "pattern": "\\bwith respect to\\b", + "replacement": "about", + "reason": "Use 'about' instead of 'with respect to' for conciseness." + }, + { + "pattern": "\\bwe recommend\\b", + "replacement": "it is recommended", + "reason": "Use 'it is recommended' instead of 'we recommend' for a more neutral tone." + }, + { + "pattern": "\\bwe suggest\\b", + "replacement": "it is suggested", + "reason": "Use 'it is suggested' instead of 'we suggest' for a more neutral tone." + }, + { + "pattern": "\\bwe advise\\b", + "replacement": "it is advised", + "reason": "Use 'it is advised' instead of 'we advise' for a more neutral tone." + }, + { + "pattern": "\\bwe will\\b", + "replacement": "you will", + "reason": "Use 'you will' instead of 'we will' to address the reader directly." + }, + { + "pattern": "\\bwe can\\b", + "replacement": "you can", + "reason": "Use 'you can' instead of 'we can' to address the reader directly." + }, + { + "pattern": "\\bwe have\\b", + "replacement": "you have", + "reason": "Use 'you have' instead of 'we have' to address the reader directly." + }, + { + "pattern": "\\bwe are\\b", + "replacement": "you are", + "reason": "Use 'you are' instead of 'we are' to address the reader directly." + }, + { + "pattern": "\\bwe need to\\b", + "replacement": "you need to", + "reason": "Use 'you need to' instead of 'we need to' to address the reader directly." + }, + { + "pattern": "\\bwe must\\b", + "replacement": "you must", + "reason": "Use 'you must' instead of 'we must' to address the reader directly." + }, + { + "pattern": "\\bwe should\\b", + "replacement": "you should", + "reason": "Use 'you should' instead of 'we should' to address the reader directly." + }, + { + "pattern": "\\bis processed by\\b", + "replacement": "processes", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bare processed by\\b", + "replacement": "process", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwas processed by\\b", + "replacement": "processed", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwere processed by\\b", + "replacement": "processed", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bis handled by\\b", + "replacement": "handles", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bare handled by\\b", + "replacement": "handle", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwas handled by\\b", + "replacement": "handled", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwere handled by\\b", + "replacement": "handled", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bis managed by\\b", + "replacement": "manages", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bare managed by\\b", + "replacement": "manage", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwas managed by\\b", + "replacement": "managed", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwere managed by\\b", + "replacement": "managed", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bis created by\\b", + "replacement": "creates", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bare created by\\b", + "replacement": "create", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwas created by\\b", + "replacement": "created", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwere created by\\b", + "replacement": "created", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bis generated by\\b", + "replacement": "generates", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bare generated by\\b", + "replacement": "generate", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwas generated by\\b", + "replacement": "generated", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwere generated by\\b", + "replacement": "generated", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bis provided by\\b", + "replacement": "provides", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bare provided by\\b", + "replacement": "provide", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwas provided by\\b", + "replacement": "provided", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bwere provided by\\b", + "replacement": "provided", + "reason": "Use active voice instead of passive voice." + }, + { + "pattern": "\\bARM\\b", + "replacement": "Arm", + "reason": "Use 'Arm' instead of 'ARM' for clarity or consistency." + }, + { + "pattern": "\\bARM's\\b", + "replacement": "Arm's", + "reason": "Use 'Arm's' instead of 'ARM's' for clarity or consistency." + }, + { + "pattern": "\\badaptor\\b", + "replacement": "adapter", + "reason": "Use 'adapter' instead of 'adaptor' for clarity or consistency." + }, + { + "pattern": "\\banalyse\\b", + "replacement": "analyze", + "reason": "Use 'analyze' instead of 'analyse' for clarity or consistency." + }, + { + "pattern": "\\bback\\-end\\b", + "replacement": "backend", + "reason": "Use 'backend' instead of 'back-end' for clarity or consistency." + }, + { + "pattern": "\\bcustom\\-made\\b", + "replacement": "custom-built", + "reason": "Use 'custom-built' instead of 'custom-made' for clarity or consistency." + }, + { + "pattern": "\\bdouble\\-click\\b", + "replacement": "double-tap", + "reason": "Use 'double-tap' instead of 'double-click' for clarity or consistency." + }, + { + "pattern": "\\beasy\\ to\\ use\\b", + "replacement": "easy-to-use", + "reason": "Use 'easy-to-use' instead of 'easy to use' for clarity or consistency." + }, + { + "pattern": "\\beliminate\\b", + "replacement": "remove", + "reason": "Use 'remove' instead of 'eliminate' for clarity or consistency." + }, + { + "pattern": "\\bextract\\b", + "replacement": "remove", + "reason": "Use 'remove' instead of 'extract' for clarity or consistency." + }, + { + "pattern": "\\btake\\ away\\b", + "replacement": "remove", + "reason": "Use 'remove' instead of 'take away' for clarity or consistency." + }, + { + "pattern": "\\be\\.g\\.\\b", + "replacement": "for example", + "reason": "Use 'for example' instead of 'e.g.' for clarity or consistency." + }, + { + "pattern": "\\bi\\.e\\.\\b", + "replacement": "that is", + "reason": "Use 'that is' instead of 'i.e.' for clarity or consistency." + }, + { + "pattern": "\\bergo\\b", + "replacement": "therefore", + "reason": "Use 'therefore' instead of 'ergo' for clarity or consistency." + }, + { + "pattern": "\\bdo\\ not\\b", + "replacement": "don't", + "reason": "Use 'don't' instead of 'do not' for clarity or consistency." + }, + { + "pattern": "\\bit\\ is\\b", + "replacement": "it's", + "reason": "Use 'it's' instead of 'it is' for clarity or consistency." + }, + { + "pattern": "\\bis\\ not\\b", + "replacement": "isn't", + "reason": "Use 'isn't' instead of 'is not' for clarity or consistency." + }, + { + "pattern": "\\bthat\\ is\\b", + "replacement": "that's", + "reason": "Use 'that's' instead of 'that is' for clarity or consistency." + }, + { + "pattern": "\\bviz\\.\\b", + "replacement": "namely", + "reason": "Use 'namely' instead of 'viz.' for clarity or consistency." + }, + { + "pattern": "\\btry\\ not\\ to\\b", + "replacement": "avoid", + "reason": "Use 'avoid' instead of 'try not to' for clarity or consistency." + }, + { + "pattern": "\\brefer\\ to\\b", + "replacement": "see", + "reason": "Use 'see' instead of 'refer to' for clarity or consistency." + }, + { + "pattern": "\\bsub\\-optimal\\b", + "replacement": "suboptimal", + "reason": "Use 'suboptimal' instead of 'sub-optimal' for clarity or consistency." + }, + { + "pattern": "\\bserver\\-less\\b", + "replacement": "serverless", + "reason": "Use 'serverless' instead of 'server-less' for clarity or consistency." + }, + { + "pattern": "\\btouch\\ screen\\b", + "replacement": "touchscreen", + "reason": "Use 'touchscreen' instead of 'touch screen' for clarity or consistency." + }, + { + "pattern": "\\bctrl\\ key\\b", + "replacement": "Ctrl key", + "reason": "Use 'Ctrl key' instead of 'ctrl key' for clarity or consistency." + }, + { + "pattern": "\\bspot\\b", + "replacement": "identify", + "reason": "Use 'identify' instead of 'spot' for clarity or consistency." + }, + { + "pattern": "\\bleverage\\b", + "replacement": "take advantage of", + "reason": "Use 'take advantage of' instead of 'leverage' for clarity or consistency." + }, + { + "pattern": "\\blicence\\b", + "replacement": "license", + "reason": "Use 'license' instead of 'licence' for clarity or consistency." + }, + { + "pattern": "\\bmassive\\b", + "replacement": "significant", + "reason": "Use 'significant' instead of 'massive' for clarity or consistency." + }, + { + "pattern": "\\brespond\\ to\\ the\\ ask\\b", + "replacement": "respond to the request", + "reason": "Use 'respond to the request' instead of 'respond to the ask' for clarity or consistency." + }, + { + "pattern": "\\brevert\\ back\\ to\\b", + "replacement": "revert to", + "reason": "Use 'revert to' instead of 'revert back to' for clarity or consistency." + }, + { + "pattern": "\\bpower\\ off\\b", + "replacement": "turn off", + "reason": "Use 'turn off' instead of 'power off' for clarity or consistency." + }, + { + "pattern": "\\bpower\\ on\\b", + "replacement": "turn on", + "reason": "Use 'turn on' instead of 'power on' for clarity or consistency." + }, + { + "pattern": "\\bpress\\b", + "replacement": "select", + "reason": "Use 'select' instead of 'press' for clarity or consistency." + }, + { + "pattern": "\\bsmart\\ technology\\b", + "replacement": "intelligent technology", + "reason": "Use 'intelligent technology' instead of 'smart technology' for clarity or consistency." + }, + { + "pattern": "\\blearning\\ path\\b", + "replacement": "Learning Path", + "reason": "Use 'Learning Path' instead of 'learning path' for clarity or consistency." + }, + { + "pattern": "\\bwearable\\b", + "replacement": "wearable device", + "reason": "Use 'wearable device' instead of 'wearable' for clarity or consistency." + }, + { + "pattern": "\\bGB\\ per\\ second\\b", + "replacement": "Gbps", + "reason": "Use 'Gbps' instead of 'GB per second' for clarity or consistency." + }, + { + "pattern": "\\bkey\\ combination\\b", + "replacement": "keyboard shortcut", + "reason": "Use 'keyboard shortcut' instead of 'key combination' for clarity or consistency." + }, + { + "pattern": "\\blearn\\ how\\ to\\ use\\b", + "replacement": "use", + "reason": "Use 'use' instead of 'learn how to use' for clarity or consistency." + }, + { + "pattern": "\\brequire\\b", + "replacement": "need", + "reason": "Use 'need' instead of 'require' for clarity or consistency." + }, + { + "pattern": "\\bFollow\\ the\\ steps\\ below\\ to\\b", + "replacement": "To", + "reason": "Use 'To' instead of 'Follow the steps below to' for clarity or consistency." + }, + { + "pattern": "\\bwe\\ observe\\b", + "replacement": "you can see", + "reason": "Use 'you can see' instead of 'we observe' for clarity or consistency." + }, + { + "pattern": "\\bmay\\b", + "replacement": "can", + "reason": "Use 'can' instead of 'may' for clarity or consistency." + }, + { + "pattern": "\\bwould\\b", + "replacement": "does", + "reason": "Use 'does' instead of 'would' for clarity or consistency." + }, + { + "pattern": "\\bwe\\b", + "replacement": "you", + "reason": "Use 'you' instead of 'we' for clarity or consistency." + }, + { + "pattern": "\\byou\\ are\\b", + "replacement": "you're", + "reason": "Use 'you're' instead of 'you are' for clarity or consistency." + }, + { + "pattern": "\\byou\\ will\\b", + "replacement": "you'll", + "reason": "Use 'you'll' instead of 'you will' for clarity or consistency." + }, + { + "pattern": "\\bCloud\\ Native\\b", + "replacement": "cloud native", + "reason": "Use 'cloud native' instead of 'Cloud Native' for clarity or consistency." + }, + { + "pattern": "\\bseeking\\ to\\b", + "replacement": "looking to", + "reason": "Use 'looking to' instead of 'seeking to' for clarity or consistency." + }, + { + "pattern": "\\bsince\\b", + "replacement": "because", + "reason": "Use 'because' instead of 'since' for clarity or consistency." + }, + { + "pattern": "\\bin\\ addition\\b", + "replacement": "also", + "reason": "Use 'also' instead of 'in addition' for clarity or consistency." + }, + { + "pattern": "\\bimpact\\ performance\\b", + "replacement": "affect performance", + "reason": "Use 'affect performance' instead of 'impact performance' for clarity or consistency." + } +] \ No newline at end of file From 2e26b33f3afeaa90a84eaa1beece6ef60fa752a7 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Tue, 22 Jul 2025 09:18:54 -0500 Subject: [PATCH 06/63] Start review of Azure Linux VM --- .../servers-and-cloud-computing/azure-vm/_index.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md index ba544863a8..acb0494efb 100644 --- a/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md @@ -1,9 +1,13 @@ --- title: Create Azure Linux 3.0 custom Arm VM +draft: true +cascade: + draft: true + minutes_to_complete: 120 -who_is_this_for: This learning path helps developers create a custom Azure Linux 3.0 VM for Arm and utilize the default software stack provided by the Microsoft team. +who_is_this_for: This Learning Path helps developers create a custom Azure Linux 3.0 virtual machine for Arm and utilize the default software stack provided by Microsoft. learning_objectives: @@ -16,16 +20,15 @@ prerequisites: - A local Linux machine with [QEMU](https://www.qemu.org/download/) installed to emulate Aarch64. - An [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) installed and authenticated on your local machine. -author: Zach Lasiuk +author: Jason Andrews ### Tags skilllevels: Advanced subjects: Containers and Virtualization cloud_service_providers: Microsoft Azure - armips: - - Neoverse-N2 + - Neoverse tools_software_languages: - QEMU From d54fe144123e7ddc45e5515eebd112210e0e8083 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Tue, 22 Jul 2025 10:55:40 -0400 Subject: [PATCH 07/63] Update test-lp.yml --- .github/workflows/test-lp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-lp.yml b/.github/workflows/test-lp.yml index 47b3f60270..bdfc6f7f15 100644 --- a/.github/workflows/test-lp.yml +++ b/.github/workflows/test-lp.yml @@ -10,7 +10,7 @@ jobs: ref: ${{ steps.vars.outputs.branch-name }} - name: Run hugo command to test site builds run: | - sudo apt-get install -y hugo + sudo snap install hugo --channel=extended hugo - name: Get all changed markdown files id: changed-markdown-files From 74246d1ac8cf0ad1b72e59289413a046e36ffc68 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Tue, 22 Jul 2025 11:02:51 -0400 Subject: [PATCH 08/63] Update test-lp.yml --- .github/workflows/test-lp.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-lp.yml b/.github/workflows/test-lp.yml index bdfc6f7f15..7d07a3ac0b 100644 --- a/.github/workflows/test-lp.yml +++ b/.github/workflows/test-lp.yml @@ -1,5 +1,9 @@ name: Test Learning Path on: pull_request + +env: + HUGO_VERSION: 0.130.0 + jobs: Test-Pull-Request: runs-on: ubuntu-24.04-arm @@ -8,9 +12,13 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ steps.vars.outputs.branch-name }} + - name: Setup Hugo + uses: peaceiris/actions-hugo@v3 + with: + hugo-version: ${{ env.HUGO_VERSION }} + extended: true - name: Run hugo command to test site builds run: | - sudo snap install hugo --channel=extended hugo - name: Get all changed markdown files id: changed-markdown-files From 90ac18879c27370fcc066cea1ea28f98d09176aa Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Tue, 22 Jul 2025 11:05:37 -0400 Subject: [PATCH 09/63] Update test-lp.yml --- .github/workflows/test-lp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-lp.yml b/.github/workflows/test-lp.yml index 7d07a3ac0b..3ada43756c 100644 --- a/.github/workflows/test-lp.yml +++ b/.github/workflows/test-lp.yml @@ -1,6 +1,7 @@ name: Test Learning Path -on: pull_request +on: + workflow_dispatch: env: HUGO_VERSION: 0.130.0 From ca0cdcc59c8fa106a771940fe90de118b68ff87f Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Tue, 22 Jul 2025 11:12:38 -0400 Subject: [PATCH 10/63] Update test-lp.yml --- .github/workflows/test-lp.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-lp.yml b/.github/workflows/test-lp.yml index 3ada43756c..7685cd5c09 100644 --- a/.github/workflows/test-lp.yml +++ b/.github/workflows/test-lp.yml @@ -2,6 +2,7 @@ name: Test Learning Path on: workflow_dispatch: + env: HUGO_VERSION: 0.130.0 From 4eff356986f4e49a44efc7d2537d7ed419f56fae Mon Sep 17 00:00:00 2001 From: Odin Shen Coder Date: Tue, 22 Jul 2025 17:32:31 +0100 Subject: [PATCH 11/63] Update the latest infra RDN2 reference software stack --- .../refinfra-quick-start/build-2.md | 7 +- .../environment-setup-1.md | 80 +++++++++++-------- .../refinfra-quick-start/test-with-fvp-3.md | 3 +- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/build-2.md b/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/build-2.md index 94a5ae8661..12e48a2332 100644 --- a/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/build-2.md +++ b/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/build-2.md @@ -21,10 +21,11 @@ Perform a build inside the container: ``` During the build you will see that TF-A, UEFI and SCP firmware are built using their own build systems. The build finishes with the following output: + ```output -output/bin/grub-mkimage: info: kernel_img=0x7f366cf65010, kernel_size=0x1a000. -output/bin/grub-mkimage: info: the core size is 0xa2a98. -output/bin/grub-mkimage: info: writing 0xa5000 bytes. +output/bin/grub-mkimage: info: kernel_img=0xf0a19d2c2010, kernel_size=0x1a000. +output/bin/grub-mkimage: info: the core size is 0xa3040. +output/bin/grub-mkimage: info: writing 0xa6000 bytes. Execute build for build-grub.sh on rdn2[rdn2][busybox] done. ----------------------------------- *********************************** diff --git a/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/environment-setup-1.md b/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/environment-setup-1.md index 0228a2b61e..4be732c0ec 100644 --- a/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/environment-setup-1.md +++ b/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/environment-setup-1.md @@ -39,28 +39,30 @@ repo version The output looks like this: ```output +/usr/bin/repo:681: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + now = datetime.datetime.utcnow() -repo launcher version 2.17 +repo launcher version 2.36 (from /usr/bin/repo) -git 2.34.1 -Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] -OS Linux 6.2.0-1009-aws (#9~22.04.3-Ubuntu SMP Tue Aug 1 21:11:51 UTC 2023) -CPU x86_64 (x86_64) -Bug reports: https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue +git 2.43.0 +Python 3.12.3 (main, Jun 18 2025, 17:59:45) [GCC 13.3.0] +OS Linux 6.8.0-1031-aws (#33-Ubuntu SMP Fri Jun 20 17:58:11 UTC 2025) +CPU aarch64 (aarch64) +Bug reports: https://issues.gerritcodereview.com/issues/new?component=1370071 ``` ### Fetch source code Create a new directory in to which you can download the source code, build the stack, and then obtain the manifest file. -To obtain the manifest, choose a tag of the platform reference firmware. [RD-INFRA-2023.09.29](https://neoverse-reference-design.docs.arm.com/en/latest/releases/RD-INFRA-2023.09.29/release_note.html) is used here, although it is recommended to use the latest version available. See the [release notes](https://neoverse-reference-design.docs.arm.com/en/latest/) for more information. +To obtain the manifest, choose a tag of the platform reference firmware. [RD-INFRA-2025.07.03](https://neoverse-reference-design.docs.arm.com/en/latest/releases/RD-INFRA-2025.07.03/release_note.html) is used here, although it is recommended to use the latest version available. See the [release notes](https://neoverse-reference-design.docs.arm.com/en/latest/) for more information. Specify the platform you would like with the manifest. In the [manifest repo](https://git.gitlab.arm.com/infra-solutions/reference-design/infra-refdesign-manifests) there are a number of available platforms. In this case, select `pinned-rdn2.xml`. ```bash mkdir rd-infra cd rd-infra/ -repo init -u https://git.gitlab.arm.com/infra-solutions/reference-design/infra-refdesign-manifests.git -m pinned-rdn2.xml -b refs/tags/RD-INFRA-2023.12.22 +repo init -u https://git.gitlab.arm.com/infra-solutions/reference-design/infra-refdesign-manifests.git -m pinned-rdn2.xml -b refs/tags/RD-INFRA-2025.07.03 ``` Now look at what the configured manifest contains: @@ -104,24 +106,24 @@ The contents of `pinned-rdn2.xml` are shown below: - - - - - - - - - - + + + + + + + + + + - - - + + + - + ``` @@ -133,18 +135,26 @@ repo sync -c -j $(nproc) --fetch-submodules --force-sync --no-clone-bundle ``` The output from running this command looks like: ```output -... A new version of repo (2.40) is available. -... New version is available at: /home/ubuntu/rd-infra/.repo/repo/repo + +... A new version of repo (2.54) is available. +... New version is available at: /home/ubuntu/rdn2-infra/.repo/repo/repo ... The launcher is run from: /usr/bin/repo !!! The launcher is not writable. Please talk to your sysadmin or distro !!! to get an update installed. -Fetching: 100% (17/17), done in 2m23.399s -Fetching: 100% (16/16), done in 26.300s -Fetching: 100% (8/8), done in 11.914s -Fetching: 100% (1/1), done in 0.592s -Updating files: 100% (79368/79368), done.testsUpdating files: 26% (21084/79368) -Checking out: 100% (42/42), done in 13.164s +Fetching: 100% (17/17), done in 8m16.653s +Fetching: 100% (17/17), done in 17.218s +Fetching: 100% (17/17), done in 14.719s +Fetching: 100% (7/7), done in 12.526s +Fetching: 100% (1/1), done in 0.385s +Updating files: 100% (84978/84978), done.ting files: 17% (14646/84978) +Checking out: 27% (16/59), done in 8.804s +Checking out: 28% (17/59), done in 0.779s +Updating files: 100% (18459/18459), done.ptoPkg/Library/OpensslLib/openssl/pyca-cryptographyUpdating files: 42% (10441/24326) +Updating files: 100% (24326/24326), done.ptoPkg/Library/OpensslLib/openssl/fuzz/corporaUpdating files: 54% (13137/24326) +Checking out: 30% (18/59), done in 1.675s +Checking out: 11% (7/59), done in 0.874s +Checking out: 1% (1/59), done in 0.004s repo sync has finished successfully. ``` Now you should have all the code. @@ -186,13 +196,19 @@ docker image list The output from this command looks like: ```output REPOSITORY TAG IMAGE ID CREATED SIZE -rdinfra-builder latest 8729adb0b96c 8 minutes ago 3.07GB +rdinfra-builder latest e11c8e27a4c6 7 days ago 8.12GB ubuntu jammy-20230624 5a81c4b8502e 6 months ago 77.8MB ``` The appearance of the output is like a standard ubuntu container based on the latest release with the rdinfra-builder container built on top. Let's run and enter the container: ```bash -docker run -it rdinfra-builder:latest /bin/bash +docker run --rm \ + -v /home/ubuntu/rd-infra/:/home/ubuntu/rd-infra/ \ + -w /home/ubuntu/rd-infra/ \ + -e ARCADE_USER=$(id -un) \ + -e ARCADE_UID=$(id -u) \ + -e ARCADE_GID=$(id -g) \ + -it rdinfra-builder bash ``` This command puts you in the running container where you can run `ls` to list the contents: diff --git a/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/test-with-fvp-3.md b/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/test-with-fvp-3.md index f8c0ae9b2d..d8467f5081 100644 --- a/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/test-with-fvp-3.md +++ b/content/learning-paths/servers-and-cloud-computing/refinfra-quick-start/test-with-fvp-3.md @@ -15,7 +15,8 @@ The firmware build can be executed on the Neoverse N2 Reference Design FVP that Download the FVP from the previous page, or directly with: ```bash -wget https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/OSS/FVP/Neoverse-N2/Neoverse-N2-11-24-12/FVP_RD_N2_11.24_12_Linux64.tgz +wget https://developer.arm.com/-/cdn-downloads/permalink/FVPs-Neoverse-Infrastructure/RD-N2/FVP_RD_N2_11.25_23_Linux64.tgz + ``` Unpack the tarball and run the install script: From 7f7c26dcedc9626bbcb4db673dad33481771e200 Mon Sep 17 00:00:00 2001 From: armwaheed Date: Tue, 22 Jul 2025 12:26:20 -0500 Subject: [PATCH 12/63] Peer review changes --- .../openadkit2_safetyisolation/3_container_spliting.md | 6 +++--- .../openadkit2_safetyisolation/4_multiinstance_executing.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index 94c5d71714..18e44dc451 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -55,7 +55,7 @@ To enable ROS 2 and DDS communication between the two nodes, configure network a If you are using AWS EC2, both instances should be assigned to the same Security Group. Within the EC2 Security Group settings: -- Add an inbound rule that allows all traffic from the same Security Group by setting he source to the security group itself. +- Add an inbound rule that allows all traffic from the same Security Group by setting the source to the security group itself. - Outbound traffic is typically allowed by default and usually does not require changes. ![img2 alt-text#center](security_group.jpg "Figure 2: AWS Security Group Setting") @@ -185,7 +185,7 @@ To ensure that each container uses your custom DDS configuration, mount the curr Add this to every container definition to ensure consistent behavior across the deployment. -Here is the complete XML file: +Here is the complete YAML file: ```YAML services: @@ -353,7 +353,7 @@ export TIMEOUT=300 docker compose -f docker-compose-2ins.yml run --rm simulator bash ``` -Once inside the container shell, activate the ROS 2 environment and start publishing to the /hello topic: +Once inside the container shell, activate the ROS 2 environment and start listening to the /hello topic: ```bash # Inside the container: diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index 12d69659c5..def332f4e9 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -27,8 +27,8 @@ On each instance, copy the appropriate launch script into the `openadkit_demo.au !/bin/bash # Configure the environment variables export SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker - CONF_FILE_PASS=$SCRIPT_DIR/etc/simulation/config/pass_static_obstacle_avoidance.param.yaml - CONF_FILE_FAIL=$SCRIPT_DIR/etc/simulation/config/fail_static_obstacle_avoidance.param.yaml + export CONF_FILE_PASS=$SCRIPT_DIR/etc/simulation/config/pass_static_obstacle_avoidance.param.yaml + export CONF_FILE_FAIL=$SCRIPT_DIR/etc/simulation/config/fail_static_obstacle_avoidance.param.yaml export CONF_FILE=$CONF_FILE_FAIL export COMMON_FILE=$SCRIPT_DIR/etc/simulation/config/common.param.yaml @@ -42,7 +42,7 @@ On each instance, copy the appropriate launch script into the `openadkit_demo.au {{< tab header="Visualizer & Simulator" language="bash">}} #!/bin/bash - SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker + export SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker export CONF_FILE_FAIL=$SCRIPT_DIR/etc/simulation/config/fail_static_obstacle_avoidance.param.yaml export CONF_FILE=$CONF_FILE_FAIL From 3353fcaf3bf460dfb50dc6d933c39419319ded70 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Tue, 22 Jul 2025 13:40:49 -0400 Subject: [PATCH 13/63] Tekton CLI install guide --- content/install-guides/tkn.md | 195 ++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 content/install-guides/tkn.md diff --git a/content/install-guides/tkn.md b/content/install-guides/tkn.md new file mode 100644 index 0000000000..a8279280df --- /dev/null +++ b/content/install-guides/tkn.md @@ -0,0 +1,195 @@ +--- +title: Tekton CLI (tkn) + +draft: true + +author: Jason Andrews +official_docs: https://tekton.dev/docs/cli/ + +minutes_to_complete: 10 +additional_search_terms: +- tekton +- pipelines +- ci/cd +- kubernetes +- openshift +- devops + +layout: installtoolsall +multi_install: false +multitool_install_part: false +test_images: +- ubuntu:latest +test_maintenance: false +tool_install: true +weight: 1 +--- + +The Tekton CLI, `tkn`, is a command-line interface for Tekton Pipelines. It allows you to create, manage, and interact with Tekton resources such as tasks, pipelines, and pipeline runs from your terminal. + +Tekton CLI is available for macOS and Linux and supports the Arm architecture. + +## What should I consider before installing the Tekton CLI? + +This article provides a quick way to install the latest version of the Tekton CLI for Ubuntu on Arm and macOS with Apple Silicon. + +Confirm you are using an Arm computer by running: + +```bash { target="ubuntu:latest" } +uname -m +``` + +If you are on Arm Linux the output should be: + +```output +aarch64 +``` + +If you are on macOS with Apple Silicon the output should be: + +```output +arm64 +``` + +## How do I download and install the Tekton CLI? + +There are multiple ways to install the Tekton CLI. The methods below download the latest stable version directly from the GitHub releases. + +### Install on Arm Linux + +To install the Tekton CLI on Arm Linux: + +```bash { target="ubuntu:latest" } +TKN_VERSION=$(curl -s https://api.github.com/repos/tektoncd/cli/releases/latest | grep tag_name | cut -d '"' -f 4) +curl -LO https://github.com/tektoncd/cli/releases/download/${TKN_VERSION}/tektoncd-cli-${TKN_VERSION#v}_Linux-ARM64.deb +sudo apt install ./tektoncd-cli-${TKN_VERSION#v}_Linux-ARM64.deb +``` + +### Install on macOS + +To install the Tekton CLI on macOS with Apple Silicon: + +```console +TKN_VERSION=$(curl -s https://api.github.com/repos/tektoncd/cli/releases/latest | grep tag_name | cut -d '"' -f 4) +curl -LO https://github.com/tektoncd/cli/releases/download/${TKN_VERSION}/tkn_${TKN_VERSION#v}_Darwin_all.tar.gz +tar -xzf tkn_${TKN_VERSION#v}_Darwin_all.tar.gz +sudo mv tkn /usr/local/bin/ +rm tkn_${TKN_VERSION#v}_Darwin_all.tar.gz README.md LICENSE +``` + +Alternatively, you can install using Homebrew on macOS: + +```console +brew install tektoncd-cli +``` + +## How do I verify the Tekton CLI installation? + +Verify the Tekton CLI is installed by checking the version: + +```bash { target="ubuntu:latest" } +tkn version +``` + +The output shows the client version information: + +```output +Client version: 0.41.0 +``` + +You can also check that the command is working by displaying the help: + +```bash { target="ubuntu:latest" } +tkn help +``` + +This displays the main command groups and options: + +```output +CLI for tekton pipelines + +Usage: + tkn [flags] + tkn [command] + +Available Commands: + bundle Manage Tekton Bundles + chain Manage Chains + clustertask Manage ClusterTasks + clustertriggerbinding Manage ClusterTriggerBindings + completion Prints shell completion scripts + eventlistener Manage EventListeners + help Help about any command + hub Interact with tekton hub + pipeline Manage pipelines + pipelinerun Manage pipeline runs + resource Manage pipeline resources + task Manage Tasks + taskrun Manage TaskRuns + triggerbinding Manage TriggerBindings + triggertemplate Manage TriggerTemplates + version Prints version information + +Flags: + -h, --help help for tkn + +Use "tkn [command] --help" for more information about a command. +``` + +## How do I get started with the Tekton CLI? + +To use the Tekton CLI effectively, you need access to a Kubernetes cluster with Tekton Pipelines installed. You can check if Tekton is available in your cluster: + +```console +tkn pipeline list +``` + +If Tekton Pipelines is not installed, you might see an error message. In that case, you need to install Tekton Pipelines on your cluster first. + +### Common Tekton CLI commands + +Below are some common commands to get you started. + +List pipelines: + +```console +tkn pipeline list +``` + +List pipeline runs: + +```console +tkn pipelinerun list +``` + +List tasks: + +```console +tkn task list +``` + +List task runs: + +```console +tkn taskrun list +``` + +Start a pipeline: + +```console +tkn pipeline start +``` + +Show pipeline run logs: + +```console +tkn pipelinerun logs +``` + +Describe a pipeline: + +```console +tkn pipeline describe +``` + +You are now ready to use the Tekton CLI to manage your CI/CD pipelines with Tekton Pipelines on Kubernetes or OpenShift. From fe80cf7c24d36a6c1d2e95d351e63ef73c922f06 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Tue, 22 Jul 2025 14:15:18 -0400 Subject: [PATCH 14/63] OpenShift CLI install guide --- content/install-guides/oc.md | 230 +++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 content/install-guides/oc.md diff --git a/content/install-guides/oc.md b/content/install-guides/oc.md new file mode 100644 index 0000000000..edfe3ac0ae --- /dev/null +++ b/content/install-guides/oc.md @@ -0,0 +1,230 @@ +--- +title: OpenShift CLI (oc) + +draft: true + +author: Jason Andrews + +official_docs: https://docs.redhat.com/en/documentation/openshift_container_platform/4.18/html/cli_tools/openshift-cli-oc#cli-getting-started +minutes_to_complete: 10 + +additional_search_terms: +- OpenShift +- Kubernetes + +layout: installtoolsall +multi_install: false +multitool_install_part: false +test_images: +- ubuntu:latest +test_maintenance: false +tool_install: true +weight: 1 +--- + +The OpenShift command-line interface (CLI), `oc`, allows you to work with OpenShift Container Platform projects from a terminal. You can use `oc` to create applications, manage OpenShift Container Platform projects, and perform administrative tasks. + +The OpenShift CLI is a superset of the Kubernetes `kubectl` command. When you install `oc`, you get both the OpenShift-specific functionality and all standard Kubernetes `kubectl` commands in a single tool. This means you can use `oc` to manage both OpenShift and standard Kubernetes resources. + +The OpenShift CLI is available for macOS and Linux and supports the Arm architecture. + +## What should I consider before installing the OpenShift CLI? + +This article provides a quick solution to install the latest version of the OpenShift CLI for Ubuntu on Arm and macOS with Apple Silicon. + +Confirm you are using an Arm computer by running: + +```bash { target="ubuntu:latest" } +uname -m +``` + +If you are on Arm Linux the output should be: + +```output +aarch64 +``` + +If you are on macOS with Apple Silicon the output should be: + +```output +arm64 +``` + +## How do I download and install the OpenShift CLI? + +There are multiple ways to install the OpenShift CLI. The methods below download the latest stable version directly from the OpenShift mirror. + +### Install on Arm Linux + +To install the OpenShift CLI on Arm Linux: + +```bash { target="ubuntu:latest" } +curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable/openshift-client-linux-arm64.tar.gz +tar -xzf openshift-client-linux-arm64.tar.gz +sudo mv oc kubectl /usr/local/bin/ +rm openshift-client-linux-arm64.tar.gz README.md +``` + +### Install on macOS + +To install the OpenShift CLI on macOS with Apple Silicon: + +```console +curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable/openshift-client-mac-arm64.tar.gz +tar -xzf openshift-client-mac-arm64.tar.gz +sudo mv oc kubectl /usr/local/bin/ +rm openshift-client-mac-arm64.tar.gz README.md +``` + +Both installations include both `oc` and `kubectl` commands. The `oc` command provides the full OpenShift functionality, while the `kubectl` command gives you compatibility with standard Kubernetes clusters. Since `oc` is a superset of `kubectl`, you can use `oc` for all Kubernetes operations, but having both commands available gives you flexibility in your workflow. + +## Understanding oc and kubectl + +The OpenShift CLI (`oc`) is built as a superset of the Kubernetes CLI (`kubectl`). + +This means: + +- You can use `oc` anywhere you would use `kubectl` +- OpenShift-specific features such as `oc login`, `oc new-project`, `oc new-app`, are available to manageme OpenShift resources + +## How do I verify the OpenShift CLI installation? + +Verify the OpenShift CLI is installed by checking the version: + +```bash { target="ubuntu:latest" } +oc version --client +``` + +The output shows the client version information: + +```output +Client Version: 4.19.3 +Kustomize Version: v5.5.0 +``` + +You can also verify that `kubectl` is available and shows the same version (since it's the same binary): + +```bash { target="ubuntu:latest" } +kubectl version --client +``` + +The output shows the kubectl client version: + +```output +Client Version: v1.32.1 +Kustomize Version: v5.5.0 +``` + +Both commands are now available for managing Kubernetes and OpenShift resources. + +## How do I get started with the OpenShift CLI? + +To get help with available commands, run: + +```console +oc help +``` + +This displays the main command groups and options: + +```output +OpenShift Client + +This client helps you develop, build, deploy, and run your applications on any +OpenShift or Kubernetes cluster. It also includes the administrative +commands for managing a cluster under the 'adm' subcommand. + +Usage: + oc [flags] + +Basic Commands: + login Log in to a server + new-project Request a new project + new-app Create a new application + status Show an overview of the current project + project Switch to another project + projects Display existing projects + explain Get documentation for a resource + +Build and Deploy Commands: + rollout Manage the rollout of a resource + rollback Revert part of an application back to a previous deployment + new-build Create a new build configuration + start-build Start a new build + cancel-build Cancel running, pending, or new builds + import-image Import images from a Docker registry + tag Tag existing images into image streams + +Application Management Commands: + create Create a resource from a file or from stdin + apply Apply a configuration to a resource by file name or stdin + get Display one or many resources + describe Show details of a specific resource or group of resources + edit Edit a resource on the server + set Commands that help set specific features on objects + label Update the labels on a resource + annotate Update the annotations on a resource + expose Expose a replicated application as a service or route + delete Delete resources by file names, stdin, resources and names, or by resources and label selector + scale Set a new size for a deployment, replica set, or replication controller + autoscale Autoscale a deployment or replica set + secrets Manage secrets + serviceaccounts Manage service accounts in your project + +Troubleshooting and Debugging Commands: + logs Print the logs for a resource + rsh Start a shell session in a pod + rsync Copy files between a local file system and a pod + port-forward Forward one or more local ports to a pod + debug Launch a new instance of a pod for debugging + exec Execute a command in a container + proxy Run a proxy to the Kubernetes API server + attach Attach to a running container + run Run a particular image on the cluster + cp Copy files and directories to and from containers + wait Experimental: Wait for a specific condition on one or many resources + +Advanced Commands: + adm Tools for managing a cluster + create Create a resource from a file or from stdin + replace Replace a resource by file name or stdin + patch Update fields of a resource + process Process a template into list of resources + export Export resources so they can be used elsewhere + extract Extract secrets or config maps to disk + observe Observe changes to resources and react to them (experimental) + policy Manage authorization policy + auth Inspect authorization + image Useful commands for managing images + registry Commands for working with the registry + idle Idle scalable resources + api-versions Print the supported API versions on the server, in the form of "group/version" + api-resources Print the supported API resources on the server + cluster-info Display cluster information + diff Diff the live version against a would-be applied version + kustomize Build a kustomization target from a directory or URL + +Settings Commands: + logout End the current server session + config Modify kubeconfig files + whoami Return information about the current session + completion Output shell completion code for the specified shell (bash, zsh, fish, or powershell) + +Other Commands: + help Help about any command + plugin Provides utilities for interacting with plugins + version Print the client and server version information + +Use "oc --help" for more information about a given command. +Use "oc options" for a list of global command-line options (applies to all commands). +``` + +To connect to an OpenShift cluster, you need to log in using: + +```console +oc login +``` + +Replace `` with your OpenShift cluster's URL. You will be prompted for your username and password. + +You are now ready to use the OpenShift CLI to manage your OpenShift Container Platform projects and applications. From f0be3e29f41ccbd7d39e8cb58ba6551b7c8df38e Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Tue, 22 Jul 2025 14:17:23 -0400 Subject: [PATCH 15/63] Update test-lp.yml --- .github/workflows/test-lp.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/test-lp.yml b/.github/workflows/test-lp.yml index 7685cd5c09..fd187b6ef5 100644 --- a/.github/workflows/test-lp.yml +++ b/.github/workflows/test-lp.yml @@ -1,8 +1,5 @@ name: Test Learning Path - -on: - workflow_dispatch: - +on: pull_request env: HUGO_VERSION: 0.130.0 From e82ca28c2a294eb16d670a5421ca2a62e5851e68 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Tue, 22 Jul 2025 20:07:49 +0000 Subject: [PATCH 16/63] Split functional safety content into modular Learn steps - Created 5-step structure for "Functional safety for automotive software development" - Reorganized content to follow Microsoft Learn format - Aligned section titles with sentence case and clear instructional goals - Added consistent context-before-concept framing and bullet parallelism - Preserved technical depth while improving readability and flow --- ...onal_safety.md => 1a_functional_safety.md} | 0 .../openadkit2_safetyisolation/1b_purpose.md | 123 ++++++++++++++++++ .../openadkit2_safetyisolation/1c_ISO26262 | 109 ++++++++++++++++ .../1d_safety_island_arch.md | 104 +++++++++++++++ .../1e_implement functional_safety.md | 30 +++++ .../2_data_distribution_service.md | 2 +- .../3_container_spliting.md | 2 +- .../4_multiinstance_executing.md | 2 +- .../openadkit2_safetyisolation/_index.md | 17 +-- 9 files changed, 378 insertions(+), 11 deletions(-) rename content/learning-paths/automotive/openadkit2_safetyisolation/{1_functional_safety.md => 1a_functional_safety.md} (100%) create mode 100644 content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md create mode 100644 content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 create mode 100644 content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md create mode 100644 content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1_functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md similarity index 100% rename from content/learning-paths/automotive/openadkit2_safetyisolation/1_functional_safety.md rename to content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md new file mode 100644 index 0000000000..c1aa4264d2 --- /dev/null +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md @@ -0,0 +1,123 @@ +--- +title: Purpose and risk management principles +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Functional safety: purpose and risk management principles + + +The core of Functional Safety lies in risk management, which aims to reduce the impact of system failures. + +In autonomous vehicles, Functional Safety ensures that if sensor data is incorrect, the system can enter a safe state, preventing incorrect driving decisions. + +The three core objectives of Functional Safety are: +1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In electric vehicles, battery systems monitor temperature to prevent overheating. +2. Detection: Quickly identifying errors using built-in diagnostic mechanisms, such as built-in self-test. +3. Mitigation: Controlling the impact of failures to ensure the overall safety of the system. + +This approach is critical in applications such as autonomous driving, flight control, and medical implants, where failures can result in severe consequences. + +### ISO 26262: Automotive Functional Safety Standard + +ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. + +Key Concepts of ISO 26262: +- ASIL (Automotive Safety Integrity Level) + - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). + - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). +- HARA (Hazard Analysis and Risk Assessment) + - Analyzes hazards and assesses risks to determine necessary safety measures. +- Safety Mechanisms + - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. + +Typical Application Scenarios: +- Autonomous Driving Systems: + - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. +- Powertrain Control: + - Prevents braking system failures that could lead to loss of control. +- Battery Management System (BMS): + - Prevents battery overheating or excessive discharge in electric vehicles. + +### Common Use Cases of Functional Safety in Automotive + +- Autonomous Driving: + - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. + - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. + +- Powertrain Control: + - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. + - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. + +- Battery Management Systems (BMS): + - Protects EV batteries from overheating, overcharging, or deep discharge. + - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. + +These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. +A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. + +### Safety Island: Enabling Functional Safety in Autonomous Systems + +In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. + +The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. + +| Feature | General ECU | Safety Island | +|------------------------|----------------------------|--------------------------------------| +| Purpose | Comfort/non-safety logic | Safety-critical decision making | +| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | +| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | +| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | +| Fault Handling | Best-effort recovery | Deterministic safe-state response | + +This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. + +Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. + +Key Capabilities of Safety Island +- System Health Monitoring + - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. +- Fault Detection and Isolation + - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. +- Providing Essential Safety Functions + - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: + - Autonomous Vehicles → Safe stopping (fail-safe mode) + - Industrial Equipment → Emergency power cutoff or speed reduction + +### Why Safety Island Matters for Functional Safety + +Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. + +How Safety Island Enhances Functional Safety +1. Acts as an Independent Redundant Safety Layer + - Even if the main system fails, it can still operate independently. +2. Supports ASIL-D Safety Level + - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. +3. Provides Independent Fault Detection and Recovery Mechanisms + - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. + - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. + +### Functional Safety in the Software Development Lifecycle + +Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. +For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. + +### Functional Safety Requirements in Software Development + +These practices ensure the software development process meets industry safety standards and can withstand system-level failures: +- Requirement Specification + - Clearly defining safety-critical requirements and conducting risk assessments. +- Safety-Oriented Programming + - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. +- Fault Handling Mechanisms + - Implementing redundancy design and health monitoring to handle anomalies. +- Testing and Verification + - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. +- Version Management and Change Control + - Using Git, JIRA, Polarion to track changes for safety audits. + +By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. + +This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 new file mode 100644 index 0000000000..11d99083e7 --- /dev/null +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 @@ -0,0 +1,109 @@ +--- +title: Explore ISO 26262 and ASIL levels +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## ISO 26262: Automotive Functional Safety Standard + +ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. + +Key Concepts of ISO 26262: +- ASIL (Automotive Safety Integrity Level) + - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). + - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). +- HARA (Hazard Analysis and Risk Assessment) + - Analyzes hazards and assesses risks to determine necessary safety measures. +- Safety Mechanisms + - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. + +Typical Application Scenarios: +- Autonomous Driving Systems: + - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. +- Powertrain Control: + - Prevents braking system failures that could lead to loss of control. +- Battery Management System (BMS): + - Prevents battery overheating or excessive discharge in electric vehicles. + +### Common Use Cases of Functional Safety in Automotive + +- Autonomous Driving: + - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. + - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. + +- Powertrain Control: + - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. + - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. + +- Battery Management Systems (BMS): + - Protects EV batteries from overheating, overcharging, or deep discharge. + - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. + +These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. +A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. + +### Safety Island: Enabling Functional Safety in Autonomous Systems + +In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. + +The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. + +| Feature | General ECU | Safety Island | +|------------------------|----------------------------|--------------------------------------| +| Purpose | Comfort/non-safety logic | Safety-critical decision making | +| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | +| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | +| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | +| Fault Handling | Best-effort recovery | Deterministic safe-state response | + +This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. + +Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. + +Key Capabilities of Safety Island +- System Health Monitoring + - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. +- Fault Detection and Isolation + - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. +- Providing Essential Safety Functions + - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: + - Autonomous Vehicles → Safe stopping (fail-safe mode) + - Industrial Equipment → Emergency power cutoff or speed reduction + +### Why Safety Island Matters for Functional Safety + +Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. + +How Safety Island Enhances Functional Safety +1. Acts as an Independent Redundant Safety Layer + - Even if the main system fails, it can still operate independently. +2. Supports ASIL-D Safety Level + - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. +3. Provides Independent Fault Detection and Recovery Mechanisms + - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. + - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. + +### Functional Safety in the Software Development Lifecycle + +Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. +For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. + +### Functional Safety Requirements in Software Development + +These practices ensure the software development process meets industry safety standards and can withstand system-level failures: +- Requirement Specification + - Clearly defining safety-critical requirements and conducting risk assessments. +- Safety-Oriented Programming + - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. +- Fault Handling Mechanisms + - Implementing redundancy design and health monitoring to handle anomalies. +- Testing and Verification + - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. +- Version Management and Change Control + - Using Git, JIRA, Polarion to track changes for safety audits. + +By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. + +This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md new file mode 100644 index 0000000000..c32097ed7b --- /dev/null +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -0,0 +1,104 @@ +--- +title: Apply functional safety with Safety Island architecture +weight: 5 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + + + + +## Functional safety: purpose and risk management principles + + +The core of Functional Safety lies in risk management, which aims to reduce the impact of system failures. + +In autonomous vehicles, Functional Safety ensures that if sensor data is incorrect, the system can enter a safe state, preventing incorrect driving decisions. + +The three core objectives of Functional Safety are: +1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In electric vehicles, battery systems monitor temperature to prevent overheating. +2. Detection: Quickly identifying errors using built-in diagnostic mechanisms, such as built-in self-test. +3. Mitigation: Controlling the impact of failures to ensure the overall safety of the system. + +This approach is critical in applications such as autonomous driving, flight control, and medical implants, where failures can result in severe consequences. + +### ISO 26262: Automotive Functional Safety Standard + +ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. + +Key Concepts of ISO 26262: +- ASIL (Automotive Safety Integrity Level) + - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). + - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). +- HARA (Hazard Analysis and Risk Assessment) + - Analyzes hazards and assesses risks to determine necessary safety measures. +- Safety Mechanisms + - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. + +Typical Application Scenarios: +- Autonomous Driving Systems: + - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. +- Powertrain Control: + - Prevents braking system failures that could lead to loss of control. +- Battery Management System (BMS): + - Prevents battery overheating or excessive discharge in electric vehicles. + +### Common Use Cases of Functional Safety in Automotive + +- Autonomous Driving: + - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. + - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. + +- Powertrain Control: + - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. + - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. + +- Battery Management Systems (BMS): + - Protects EV batteries from overheating, overcharging, or deep discharge. + - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. + +These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. +A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. + +### Safety Island: Enabling Functional Safety in Autonomous Systems + +In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. + +The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. + +| Feature | General ECU | Safety Island | +|------------------------|----------------------------|--------------------------------------| +| Purpose | Comfort/non-safety logic | Safety-critical decision making | +| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | +| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | +| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | +| Fault Handling | Best-effort recovery | Deterministic safe-state response | + +This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. + +Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. + +Key Capabilities of Safety Island +- System Health Monitoring + - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. +- Fault Detection and Isolation + - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. +- Providing Essential Safety Functions + - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: + - Autonomous Vehicles → Safe stopping (fail-safe mode) + - Industrial Equipment → Emergency power cutoff or speed reduction + +### Why Safety Island Matters for Functional Safety + +Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. + +How Safety Island Enhances Functional Safety +1. Acts as an Independent Redundant Safety Layer + - Even if the main system fails, it can still operate independently. +2. Supports ASIL-D Safety Level + - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. +3. Provides Independent Fault Detection and Recovery Mechanisms + - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. + - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. + diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md new file mode 100644 index 0000000000..92fbcabb10 --- /dev/null +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md @@ -0,0 +1,30 @@ +--- +title: Functional safety for automotive software development +weight: 6 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Functional Safety in the Software Development Lifecycle + +Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. +For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. + +### Functional Safety Requirements in Software Development + +These practices ensure the software development process meets industry safety standards and can withstand system-level failures: +- Requirement Specification + - Clearly defining safety-critical requirements and conducting risk assessments. +- Safety-Oriented Programming + - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. +- Fault Handling Mechanisms + - Implementing redundancy design and health monitoring to handle anomalies. +- Testing and Verification + - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. +- Version Management and Change Control + - Using Git, JIRA, Polarion to track changes for safety audits. + +By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. + +This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md index 19a36ba606..4865aa88f0 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md @@ -1,6 +1,6 @@ --- title: How to Use Data Distribution Service (DDS) -weight: 3 +weight: 7 ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index 84cc3191ff..b65a553c4f 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -1,6 +1,6 @@ --- title: Split into multiple cloud container instances -weight: 4 +weight: 8 ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index def332f4e9..3357c153c1 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -1,7 +1,7 @@ --- title: Executing OpenAD Kit in a Distributed ROS 2 Instances -weight: 5 +weight: 9 ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 4d5762b126..495d420c98 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -1,5 +1,5 @@ --- -title: Prototype safety-critical isolation for autonomous application on Neoverse +title: Prototype safety-critical isolation for autonomous driving systems on Neoverse draft: true cascade: @@ -7,17 +7,17 @@ cascade: minutes_to_complete: 60 -who_is_this_for: This Learning Path targets advanced automotive software engineers developing safety-critical systems. It demonstrates how to use Arm Neoverse cloud infrastructure to accelerate ISO-26262 compliant software prototyping and testing workflows. +who_is_this_for: This Learning Path is for experienced automotive engineers developing safety-critical systems. You'll learn how to accelerate ISO 26262-compliant development workflows using Arm-based cloud compute, containerized simulation, and DDS-based communication. learning_objectives: - - Apply functional safety principles, including risk prevention, fault detection, and ASIL compliance, to build robust, certifiable automotive systems. - - Use DDS and a publish-subscribe architecture for low-latency, scalable, and fault-tolerant communication in autonomous driving systems. - - Implement distributed development by separating the simulation platform into independent, safety-isolated components. + - Apply functional safety principles, including risk prevention, fault detection, and ASIL compliance, to build robust, certifiable automotive systems + - Use DDS and a publish-subscribe architecture for low-latency, scalable, and fault-tolerant communication in autonomous driving systems + - Implement distributed development by separating the simulation platform into independent, safety-isolated components prerequisites: - - Access to two Arm-based Neoverse cloud instances, or a local Arm Neoverse Linux system with at least 16 CPUs and 32 GB of RAM. - - Completion of the [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) Learning Path. - - Basic familiarity with Docker. + - Access to two Arm-based Neoverse cloud instances, or a local Arm Neoverse Linux system with at least 16 CPUs and 32 GB of RAM + - Completion of the [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) Learning Path + - Basic familiarity with Docker author: - Odin Shen @@ -32,6 +32,7 @@ tools_software_languages: - Python - Docker - ROS2 + - DDS operatingsystems: - Linux From d694871607d6869535b2cf42a87143ea3a4ea18a Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Tue, 22 Jul 2025 14:40:06 -0700 Subject: [PATCH 17/63] fix: correct typo in OpenShift CLI install guide --- content/install-guides/oc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/install-guides/oc.md b/content/install-guides/oc.md index edfe3ac0ae..3aca0a2d55 100644 --- a/content/install-guides/oc.md +++ b/content/install-guides/oc.md @@ -85,7 +85,7 @@ The OpenShift CLI (`oc`) is built as a superset of the Kubernetes CLI (`kubectl` This means: - You can use `oc` anywhere you would use `kubectl` -- OpenShift-specific features such as `oc login`, `oc new-project`, `oc new-app`, are available to manageme OpenShift resources +- OpenShift-specific features such as `oc login`, `oc new-project`, `oc new-app`, are available to manage OpenShift resources ## How do I verify the OpenShift CLI installation? From 60a347d2128d92a66c049b41b2d5e0f73a2e9a4f Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Wed, 23 Jul 2025 09:09:37 +0000 Subject: [PATCH 18/63] Updates --- .../1a_functional_safety.md | 115 +----------------- .../openadkit2_safetyisolation/1b_purpose.md | 101 --------------- .../1d_safety_island_arch.md | 3 - .../openadkit2_safetyisolation/_index.md | 4 - 4 files changed, 1 insertion(+), 222 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md index 9c84c5a943..60b2e2eb60 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md @@ -21,118 +21,5 @@ This means developers must consider: - Redundancy design - Development processes compliant with safety standards -## Functional safety: purpose and risk management principles +In the following sections, you'll explore how to apply these principles throughout the software lifecycle, which ranges from risk assessment and architectural design to runtime isolation and compliance with ISO 26262. - -The core of Functional Safety lies in risk management, which aims to reduce the impact of system failures. - -In autonomous vehicles, Functional Safety ensures that if sensor data is incorrect, the system can enter a safe state, preventing incorrect driving decisions. - -The three core objectives of Functional Safety are: -1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In electric vehicles, battery systems monitor temperature to prevent overheating. -2. Detection: Quickly identifying errors using built-in diagnostic mechanisms, such as built-in self-test. -3. Mitigation: Controlling the impact of failures to ensure the overall safety of the system. - -This approach is critical in applications such as autonomous driving, flight control, and medical implants, where failures can result in severe consequences. - -### ISO 26262: Automotive Functional Safety Standard - -ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. - -Key Concepts of ISO 26262: -- ASIL (Automotive Safety Integrity Level) - - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). - - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). -- HARA (Hazard Analysis and Risk Assessment) - - Analyzes hazards and assesses risks to determine necessary safety measures. -- Safety Mechanisms - - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. - -Typical Application Scenarios: -- Autonomous Driving Systems: - - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. -- Powertrain Control: - - Prevents braking system failures that could lead to loss of control. -- Battery Management System (BMS): - - Prevents battery overheating or excessive discharge in electric vehicles. - -### Common Use Cases of Functional Safety in Automotive - -- Autonomous Driving: - - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. - - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. - -- Powertrain Control: - - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. - - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. - -- Battery Management Systems (BMS): - - Protects EV batteries from overheating, overcharging, or deep discharge. - - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. - -These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. -A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. - -### Safety Island: Enabling Functional Safety in Autonomous Systems - -In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. - -The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. - -| Feature | General ECU | Safety Island | -|------------------------|----------------------------|--------------------------------------| -| Purpose | Comfort/non-safety logic | Safety-critical decision making | -| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | -| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | -| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | -| Fault Handling | Best-effort recovery | Deterministic safe-state response | - -This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. - -Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. - -Key Capabilities of Safety Island -- System Health Monitoring - - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. -- Fault Detection and Isolation - - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. -- Providing Essential Safety Functions - - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: - - Autonomous Vehicles → Safe stopping (fail-safe mode) - - Industrial Equipment → Emergency power cutoff or speed reduction - -### Why Safety Island Matters for Functional Safety - -Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. - -How Safety Island Enhances Functional Safety -1. Acts as an Independent Redundant Safety Layer - - Even if the main system fails, it can still operate independently. -2. Supports ASIL-D Safety Level - - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. -3. Provides Independent Fault Detection and Recovery Mechanisms - - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. - - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. - -### Functional Safety in the Software Development Lifecycle - -Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. -For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. - -### Functional Safety Requirements in Software Development - -These practices ensure the software development process meets industry safety standards and can withstand system-level failures: -- Requirement Specification - - Clearly defining safety-critical requirements and conducting risk assessments. -- Safety-Oriented Programming - - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. -- Fault Handling Mechanisms - - Implementing redundancy design and health monitoring to handle anomalies. -- Testing and Verification - - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. -- Version Management and Change Control - - Using Git, JIRA, Polarion to track changes for safety audits. - -By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. - -This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md index c1aa4264d2..d47820b3e3 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md @@ -20,104 +20,3 @@ The three core objectives of Functional Safety are: This approach is critical in applications such as autonomous driving, flight control, and medical implants, where failures can result in severe consequences. -### ISO 26262: Automotive Functional Safety Standard - -ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. - -Key Concepts of ISO 26262: -- ASIL (Automotive Safety Integrity Level) - - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). - - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). -- HARA (Hazard Analysis and Risk Assessment) - - Analyzes hazards and assesses risks to determine necessary safety measures. -- Safety Mechanisms - - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. - -Typical Application Scenarios: -- Autonomous Driving Systems: - - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. -- Powertrain Control: - - Prevents braking system failures that could lead to loss of control. -- Battery Management System (BMS): - - Prevents battery overheating or excessive discharge in electric vehicles. - -### Common Use Cases of Functional Safety in Automotive - -- Autonomous Driving: - - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. - - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. - -- Powertrain Control: - - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. - - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. - -- Battery Management Systems (BMS): - - Protects EV batteries from overheating, overcharging, or deep discharge. - - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. - -These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. -A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. - -### Safety Island: Enabling Functional Safety in Autonomous Systems - -In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. - -The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. - -| Feature | General ECU | Safety Island | -|------------------------|----------------------------|--------------------------------------| -| Purpose | Comfort/non-safety logic | Safety-critical decision making | -| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | -| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | -| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | -| Fault Handling | Best-effort recovery | Deterministic safe-state response | - -This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. - -Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. - -Key Capabilities of Safety Island -- System Health Monitoring - - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. -- Fault Detection and Isolation - - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. -- Providing Essential Safety Functions - - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: - - Autonomous Vehicles → Safe stopping (fail-safe mode) - - Industrial Equipment → Emergency power cutoff or speed reduction - -### Why Safety Island Matters for Functional Safety - -Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. - -How Safety Island Enhances Functional Safety -1. Acts as an Independent Redundant Safety Layer - - Even if the main system fails, it can still operate independently. -2. Supports ASIL-D Safety Level - - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. -3. Provides Independent Fault Detection and Recovery Mechanisms - - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. - - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. - -### Functional Safety in the Software Development Lifecycle - -Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. -For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. - -### Functional Safety Requirements in Software Development - -These practices ensure the software development process meets industry safety standards and can withstand system-level failures: -- Requirement Specification - - Clearly defining safety-critical requirements and conducting risk assessments. -- Safety-Oriented Programming - - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. -- Fault Handling Mechanisms - - Implementing redundancy design and health monitoring to handle anomalies. -- Testing and Verification - - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. -- Version Management and Change Control - - Using Git, JIRA, Polarion to track changes for safety audits. - -By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. - -This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index c32097ed7b..d9befbe3bf 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -6,9 +6,6 @@ weight: 5 layout: learningpathall --- - - - ## Functional safety: purpose and risk management principles diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 495d420c98..8d265bafe6 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -1,10 +1,6 @@ --- title: Prototype safety-critical isolation for autonomous driving systems on Neoverse -draft: true -cascade: - draft: true - minutes_to_complete: 60 who_is_this_for: This Learning Path is for experienced automotive engineers developing safety-critical systems. You'll learn how to accelerate ISO 26262-compliant development workflows using Arm-based cloud compute, containerized simulation, and DDS-based communication. From 603e47ca6a564324295524cd071e784b0164267b Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Wed, 23 Jul 2025 10:36:53 +0000 Subject: [PATCH 19/63] Rewriting --- .../1a_functional_safety.md | 22 ++-- .../openadkit2_safetyisolation/1b_purpose.md | 32 +++-- .../openadkit2_safetyisolation/1c_ISO26262 | 109 ------------------ .../openadkit2_safetyisolation/1c_ISO26262.md | 37 ++++++ .../1d_safety_island_arch.md | 59 +--------- 5 files changed, 74 insertions(+), 185 deletions(-) delete mode 100644 content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 create mode 100644 content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md index 60b2e2eb60..9c7c387153 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md @@ -1,25 +1,25 @@ --- -title: Functional safety for automotive software development +title: Why functional safety matters in software systems weight: 2 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Why functional safety matters +## Understand the role of functional safety in software development -Functional safety refers to a system's ability to detect potential faults and respond appropriately to ensure that the system remains in a safe state, preventing harm to individuals or damage to equipment. +Functional safety ensures that systems can detect faults and respond in ways that keep people and equipment safe. It helps prevent harm by ensuring that systems remain in a known, safe state, even when errors occur. -This is particularly important in automotive, autonomous driving, medical devices, industrial control, robotics and aerospace applications, where system failures can lead to severe consequences. +This concept is especially critical in domains like automotive, autonomous driving, medical devices, industrial control, robotics, and aerospace. In these systems, failures can have severe real-world consequences. -In software development, functional safety focuses on minimizing risks through software design, testing, and validation to ensure that critical systems operate in a predictable, reliable, and verifiable manner. +In software development, functional safety focuses on minimizing risks through careful design, rigorous testing, and thorough validation. The goal is to make sure that critical systems behave predictably, reliably, and verifiably, even under fault conditions. -This means developers must consider: +To design for functional safety, developers must consider: -- Error detection mechanisms -- Exception handling -- Redundancy design -- Development processes compliant with safety standards +- Error detection mechanisms +- Exception handling strategies +- Redundant system design +- Development processes that align with safety standards -In the following sections, you'll explore how to apply these principles throughout the software lifecycle, which ranges from risk assessment and architectural design to runtime isolation and compliance with ISO 26262. +In the following sections, you'll explore how to apply these principles throughout the software lifecycle, from early risk assessment and architectural design to runtime isolation and ISO 26262 compliance. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md index d47820b3e3..d5f156b58d 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md @@ -1,22 +1,36 @@ --- -title: Purpose and risk management principles +title: Understand functional safety risks weight: 3 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Functional safety: purpose and risk management principles +## Manage risk with functional safety principles + +At its core, functional safety is about managing risk and reducing the impact of system failures. + +In autonomous vehicles, for example, functional safety ensures that if sensor data is incorrect, the system can enter a safe state and prevent dangerous driving decisions. + +The three core objectives of functional safety are: + +- **Prevention** reduces the likelihood of errors through rigorous software development processes and testing. For example, electric vehicles monitor battery temperature to prevent overheating. + +- **Detection** quickly identifies errors using built-in diagnostic mechanisms, such as built-in self-test routines. + +- **Mitigation** controls the impact of failures to ensure the system stays safe, even when things go wrong. + +These three principles form the foundation for building safer, more reliable software systems. + +This approach is critical in systems like autonomous vehicles and medical devices, where failures can have serious consequences. + + + + + -The core of Functional Safety lies in risk management, which aims to reduce the impact of system failures. -In autonomous vehicles, Functional Safety ensures that if sensor data is incorrect, the system can enter a safe state, preventing incorrect driving decisions. -The three core objectives of Functional Safety are: -1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In electric vehicles, battery systems monitor temperature to prevent overheating. -2. Detection: Quickly identifying errors using built-in diagnostic mechanisms, such as built-in self-test. -3. Mitigation: Controlling the impact of failures to ensure the overall safety of the system. -This approach is critical in applications such as autonomous driving, flight control, and medical implants, where failures can result in severe consequences. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 deleted file mode 100644 index 11d99083e7..0000000000 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262 +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Explore ISO 26262 and ASIL levels -weight: 4 - -### FIXED, DO NOT MODIFY -layout: learningpathall ---- - -## ISO 26262: Automotive Functional Safety Standard - -ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. - -Key Concepts of ISO 26262: -- ASIL (Automotive Safety Integrity Level) - - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). - - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). -- HARA (Hazard Analysis and Risk Assessment) - - Analyzes hazards and assesses risks to determine necessary safety measures. -- Safety Mechanisms - - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. - -Typical Application Scenarios: -- Autonomous Driving Systems: - - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. -- Powertrain Control: - - Prevents braking system failures that could lead to loss of control. -- Battery Management System (BMS): - - Prevents battery overheating or excessive discharge in electric vehicles. - -### Common Use Cases of Functional Safety in Automotive - -- Autonomous Driving: - - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. - - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. - -- Powertrain Control: - - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. - - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. - -- Battery Management Systems (BMS): - - Protects EV batteries from overheating, overcharging, or deep discharge. - - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. - -These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. -A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. - -### Safety Island: Enabling Functional Safety in Autonomous Systems - -In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. - -The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. - -| Feature | General ECU | Safety Island | -|------------------------|----------------------------|--------------------------------------| -| Purpose | Comfort/non-safety logic | Safety-critical decision making | -| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | -| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | -| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | -| Fault Handling | Best-effort recovery | Deterministic safe-state response | - -This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. - -Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. - -Key Capabilities of Safety Island -- System Health Monitoring - - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. -- Fault Detection and Isolation - - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. -- Providing Essential Safety Functions - - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: - - Autonomous Vehicles → Safe stopping (fail-safe mode) - - Industrial Equipment → Emergency power cutoff or speed reduction - -### Why Safety Island Matters for Functional Safety - -Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. - -How Safety Island Enhances Functional Safety -1. Acts as an Independent Redundant Safety Layer - - Even if the main system fails, it can still operate independently. -2. Supports ASIL-D Safety Level - - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. -3. Provides Independent Fault Detection and Recovery Mechanisms - - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. - - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. - -### Functional Safety in the Software Development Lifecycle - -Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. -For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. - -### Functional Safety Requirements in Software Development - -These practices ensure the software development process meets industry safety standards and can withstand system-level failures: -- Requirement Specification - - Clearly defining safety-critical requirements and conducting risk assessments. -- Safety-Oriented Programming - - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. -- Fault Handling Mechanisms - - Implementing redundancy design and health monitoring to handle anomalies. -- Testing and Verification - - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. -- Version Management and Change Control - - Using Git, JIRA, Polarion to track changes for safety audits. - -By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. - -This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md new file mode 100644 index 0000000000..740aa8ac57 --- /dev/null +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md @@ -0,0 +1,37 @@ +--- +title: Apply ISO 26262 and ASIL levels +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- +## Understand ISO 26262 and safety integrity levels + +ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive safety lifecycle aligned with the V-model, covering phases from requirements to maintenance. + +## Key concepts in ISO 26262 + +- **ASIL (Automotive Safety Integrity Level)** ranks the safety criticality of components on a scale from A (lowest) to D (highest). For example, ASIL A might apply to a dashboard indicator failure, while ASIL D applies to a brake system malfunction. + +{{% notice Note %}}In practice, many OEMs default to ASIL D for systems with any potential for passenger harm, even if the statistical likelihood of failure is low.{{% /notice %}} + +- **HARA (Hazard Analysis and Risk Assessment)** identifies potential hazards and evaluates their risks to define the required safety goals and ASIL levels. + +- **Safety mechanisms** include techniques such as real-time fault detection, redundancy, and fallback modes like fail-safe and fail-operational behavior. + +## Apply ISO 26262 in real-world systems + +ISO 26262 applies to many safety-critical vehicle systems: + +- **Autonomous driving systems** must respond safely to sensor errors (such as LiDAR, radar, or camera faults). Functional safety ensures the vehicle can enter a safe state and avoid unsafe decisions. + +- **Powertrain control** systems monitor throttle and braking inputs. Safety mechanisms such as redundancy, plausibility checks, and overrides prevent unintended acceleration or loss of braking function. + +- **Battery management systems (BMS)** protect electric vehicle batteries from overheating, overcharging, or deep discharge. Built-in safety functions monitor temperature, balance voltage, and isolate faulty circuits to prevent thermal runaway. + +These systems require dedicated hardware and software architectures that enforce functional safety guarantees. One common solution is the **Safety Island**—an isolated compute domain used to run safety-critical control logic independently from the main system. + + + + + diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index d9befbe3bf..70f35c53bb 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -1,64 +1,11 @@ --- -title: Apply functional safety with Safety Island architecture +title: Use Safety Island architecture to ensure functional safety weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall --- - -## Functional safety: purpose and risk management principles - - -The core of Functional Safety lies in risk management, which aims to reduce the impact of system failures. - -In autonomous vehicles, Functional Safety ensures that if sensor data is incorrect, the system can enter a safe state, preventing incorrect driving decisions. - -The three core objectives of Functional Safety are: -1. Prevention: Reducing the likelihood of errors through rigorous software development processes and testing. In electric vehicles, battery systems monitor temperature to prevent overheating. -2. Detection: Quickly identifying errors using built-in diagnostic mechanisms, such as built-in self-test. -3. Mitigation: Controlling the impact of failures to ensure the overall safety of the system. - -This approach is critical in applications such as autonomous driving, flight control, and medical implants, where failures can result in severe consequences. - -### ISO 26262: Automotive Functional Safety Standard - -ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive V-model aligned safety lifecycle, covering all phases from requirement analysis, design, development, testing, to maintenance. - -Key Concepts of ISO 26262: -- ASIL (Automotive Safety Integrity Level) - - Evaluates the risk level of different system components (A, B, C, D, where D represents the highest safety requirement). - - For example: ASIL A can be Dashboard light failure (low risk) and ASIL D is Brake system failure (high risk). -- HARA (Hazard Analysis and Risk Assessment) - - Analyzes hazards and assesses risks to determine necessary safety measures. -- Safety Mechanisms - - Includes real-time error detection, system-level fault tolerance, and defined fail-safe or fail-operational fallback states. - -Typical Application Scenarios: -- Autonomous Driving Systems: - - Ensures that even if sensors (for example LiDAR, radar, cameras) provide faulty data, the vehicle will not make dangerous decisions. -- Powertrain Control: - - Prevents braking system failures that could lead to loss of control. -- Battery Management System (BMS): - - Prevents battery overheating or excessive discharge in electric vehicles. - -### Common Use Cases of Functional Safety in Automotive - -- Autonomous Driving: - - Ensures the vehicle can operate safely or enter a fail-safe state when sensors like LiDAR, radar, or cameras malfunction. - - Functional Safety enables real-time fault detection and fallback logic to prevent unsafe driving decisions. - -- Powertrain Control: - - Monitors throttle and brake signals to prevent unintended acceleration or braking loss. - - Includes redundancy, plausibility checks, and emergency overrides to maintain control under failure conditions. - -- Battery Management Systems (BMS): - - Protects EV batteries from overheating, overcharging, or deep discharge. - - Safety functions include temperature monitoring, voltage balancing, and relay cut-off mechanisms to prevent thermal runaway. - -These use cases highlight the need for a dedicated architectural layer that can enforce Functional Safety principles with real-time guarantees. -A widely adopted approach in modern automotive platforms is the Safety Island—an isolated compute domain designed to execute critical control logic independently of the main system. - -### Safety Island: Enabling Functional Safety in Autonomous Systems +## Implement safety-critical isolation with Safety Island architecture In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. @@ -86,7 +33,7 @@ Key Capabilities of Safety Island - Autonomous Vehicles → Safe stopping (fail-safe mode) - Industrial Equipment → Emergency power cutoff or speed reduction -### Why Safety Island Matters for Functional Safety +## Why Safety Island Matters for Functional Safety Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. From 43d68a8fc556cd4c6dce2d2b863123addb6bf441 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Wed, 23 Jul 2025 11:07:31 +0000 Subject: [PATCH 20/63] Updates --- .../openadkit2_safetyisolation/1b_purpose.md | 13 ++++++++++--- .../1d_safety_island_arch.md | 4 ++-- .../4_multiinstance_executing.md | 10 +++++----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md index d5f156b58d..086dea784d 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md @@ -10,7 +10,7 @@ layout: learningpathall At its core, functional safety is about managing risk and reducing the impact of system failures. -In autonomous vehicles, for example, functional safety ensures that if sensor data is incorrect, the system can enter a safe state and prevent dangerous driving decisions. +In autonomous vehicles, for example, functional safety ensures that if sensor data is incorrect, the system can transition into a safe state and avoid unsafe driving behavior. The three core objectives of functional safety are: @@ -20,11 +20,18 @@ The three core objectives of functional safety are: - **Mitigation** controls the impact of failures to ensure the system stays safe, even when things go wrong. -These three principles form the foundation for building safer, more reliable software systems. +In practice, these principles might be implemented through: -This approach is critical in systems like autonomous vehicles and medical devices, where failures can have serious consequences. +- Redundant sensor fusion code paths +- Timeout mechanisms for control loops +- Watchdog timers that reset components on fault detection +- Safe-state logic baked into actuator control routines + +These three principles of prevention, detection, and mitigation form the foundation for building safer, more reliable software systems. +This approach is critical in systems like autonomous vehicles and medical devices, where failures can have serious consequences. +In the next step, you’ll explore how functional safety principles are formalized through safety standards like ISO 26262 and applied to real-world systems. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index 70f35c53bb..efe59e2938 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -7,7 +7,7 @@ layout: learningpathall --- ## Implement safety-critical isolation with Safety Island architecture -In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (e.g., braking, steering) with strong isolation, redundancy, and determinism. +In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. @@ -25,7 +25,7 @@ Safety Island is an independent safety subsystem separate from the main processo Key Capabilities of Safety Island - System Health Monitoring - - Continuously monitors the operational status of the main processor (e.g., ADAS control unit, ECU) and detects potential errors or anomalies. + - Continuously monitors the operational status of the main processor (for example, ADAS control unit, ECU) and detects potential errors or anomalies. - Fault Detection and Isolation - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. - Providing Essential Safety Functions diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index 3357c153c1..3ce8105ebd 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -1,5 +1,5 @@ --- -title: Executing OpenAD Kit in a Distributed ROS 2 Instances +title: Execute OpenAD Kit across distributed ROS 2 instances weight: 9 @@ -7,14 +7,14 @@ weight: 9 layout: learningpathall --- -### Demonstrating the Distributed OpenAD Kit in Action +## Run OpenAD Kit on distributed ROS 2 instances In this section, you’ll bring all the previous setup together and execute the full OpenAD Kit demo across two Arm-based instances. OpenAD Kit is an open-source reference design for autonomous driving workloads on Arm. It demonstrates how Autoware modules can be deployed on scalable infrastructure, whether on a single machine or split across multiple compute nodes. -#### Preparing the Execution Scripts +## Prepare the execution scripts This setup separates the simulation/visualization environment from the planning-control logic, allowing you to explore how ROS 2 nodes communicate over a distributed system using DDS (Data Distribution Service). @@ -71,7 +71,7 @@ You can also find the prepared launch scripts `opad_planning.sh` and `opad_sim_v These scripts encapsulate the required environment variables and container commands for each role. -#### Running the Distributed OpenAD Kit Demo +#### Run the distributed OpenAD Kit demo On the Planning-Control node, execute: @@ -92,7 +92,7 @@ http://[Visualizer public IP address]:6080/vnc.html You can open this link in a browser to observe the demo behavior, which will closely resemble the output from the [previous learning path](http://learn.arm.com/learning-paths/automotive/openadkit1_container/4_run_openadkit/). -![img3 alt-text#center](split_aws_run.gif "Figure 4: Simulation") +![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS](split_aws_run.gif "Figure 4: Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") The containers are now distributed across two separate instances, enabling real-time, cross-node communication. Behind the scenes, this architecture demonstrates how DDS manages low-latency, peer-to-peer data exchange in a distributed ROS 2 environment. From 40b4ae2bb5b0821084dabc055ff33b477f00150f Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Wed, 23 Jul 2025 16:57:54 +0000 Subject: [PATCH 21/63] Refinements, consistency checks, and rewriting. --- .../1a_functional_safety.md | 4 +- .../openadkit2_safetyisolation/1b_purpose.md | 6 +- .../openadkit2_safetyisolation/1c_ISO26262.md | 8 +-- .../1d_safety_island_arch.md | 61 ++++++++++--------- .../1e_implement functional_safety.md | 39 ++++++------ .../2_data_distribution_service.md | 22 ++++--- .../4_multiinstance_executing.md | 20 +++--- 7 files changed, 86 insertions(+), 74 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md index 9c7c387153..f40bbd93c2 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md @@ -8,7 +8,7 @@ layout: learningpathall ## Understand the role of functional safety in software development -Functional safety ensures that systems can detect faults and respond in ways that keep people and equipment safe. It helps prevent harm by ensuring that systems remain in a known, safe state, even when errors occur. +Functional safety helps systems detect faults and respond in ways that keep people and equipment safe. It helps prevent harm by ensuring that systems remain in a known, safe state, even when errors occur. This concept is especially critical in domains like automotive, autonomous driving, medical devices, industrial control, robotics, and aerospace. In these systems, failures can have severe real-world consequences. @@ -22,4 +22,4 @@ To design for functional safety, developers must consider: - Development processes that align with safety standards -In the following sections, you'll explore how to apply these principles throughout the software lifecycle, from early risk assessment and architectural design to runtime isolation and ISO 26262 compliance. +In the following sections, you'll learn how to apply these principles throughout the software lifecycle, from early risk assessment and architectural design to runtime isolation and ISO 26262 compliance. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md index 086dea784d..267c4679f1 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md @@ -15,9 +15,7 @@ In autonomous vehicles, for example, functional safety ensures that if sensor da The three core objectives of functional safety are: - **Prevention** reduces the likelihood of errors through rigorous software development processes and testing. For example, electric vehicles monitor battery temperature to prevent overheating. - - **Detection** quickly identifies errors using built-in diagnostic mechanisms, such as built-in self-test routines. - - **Mitigation** controls the impact of failures to ensure the system stays safe, even when things go wrong. In practice, these principles might be implemented through: @@ -25,9 +23,9 @@ In practice, these principles might be implemented through: - Redundant sensor fusion code paths - Timeout mechanisms for control loops - Watchdog timers that reset components on fault detection -- Safe-state logic baked into actuator control routines +- Safe-state logic embedded in actuator control routines -These three principles of prevention, detection, and mitigation form the foundation for building safer, more reliable software systems. +Together, prevention, detection, and mitigation form the foundation for building safer, more reliable software systems. This approach is critical in systems like autonomous vehicles and medical devices, where failures can have serious consequences. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md index 740aa8ac57..d1931f92bf 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md @@ -7,15 +7,15 @@ layout: learningpathall --- ## Understand ISO 26262 and safety integrity levels -ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive safety lifecycle aligned with the V-model, covering phases from requirements to maintenance. +ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive safety lifecycle aligned with the V-model, that covers everything from initial requirements to ongoing maintenance. ## Key concepts in ISO 26262 -- **ASIL (Automotive Safety Integrity Level)** ranks the safety criticality of components on a scale from A (lowest) to D (highest). For example, ASIL A might apply to a dashboard indicator failure, while ASIL D applies to a brake system malfunction. +- **Automotive Safety Integrity Level (ASIL)** ranks the safety criticality of components on a scale from A (lowest) to D (highest). For example, ASIL A might apply to a dashboard indicator failure, while ASIL D applies to a brake system malfunction. {{% notice Note %}}In practice, many OEMs default to ASIL D for systems with any potential for passenger harm, even if the statistical likelihood of failure is low.{{% /notice %}} -- **HARA (Hazard Analysis and Risk Assessment)** identifies potential hazards and evaluates their risks to define the required safety goals and ASIL levels. +- **Hazard Analysis and Risk Assessment (HARA)** identifies potential hazards and evaluates their risks to define the required safety goals and ASIL levels. - **Safety mechanisms** include techniques such as real-time fault detection, redundancy, and fallback modes like fail-safe and fail-operational behavior. @@ -29,7 +29,7 @@ ISO 26262 applies to many safety-critical vehicle systems: - **Battery management systems (BMS)** protect electric vehicle batteries from overheating, overcharging, or deep discharge. Built-in safety functions monitor temperature, balance voltage, and isolate faulty circuits to prevent thermal runaway. -These systems require dedicated hardware and software architectures that enforce functional safety guarantees. One common solution is the **Safety Island**—an isolated compute domain used to run safety-critical control logic independently from the main system. +These systems require dedicated hardware and software architectures that enforce functional safety guarantees. One common solution is the **Safety Island**, which is an isolated compute domain used to run safety-critical control logic independently from the main system. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index efe59e2938..e0267b9848 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -1,48 +1,53 @@ --- -title: Use Safety Island architecture to ensure functional safety +title: Implement safety-critical isolation with Safety Island architecture weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Implement safety-critical isolation with Safety Island architecture +## Isolate safety-critical logic using a Safety Island -In automotive systems, a General ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation, whereas a Safety Island is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. +In automotive systems, a general ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation. -The table below compares the characteristics of a General ECU and a Safety Island in terms of their role in supporting Functional Safety. +A Safety Island, by contrast, is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. + +The table below compares the characteristics of a general ECU and a Safety Island in terms of their role in supporting functional safety. | Feature | General ECU | Safety Island | |------------------------|----------------------------|--------------------------------------| | Purpose | Comfort/non-safety logic | Safety-critical decision making | -| OS/Runtime | Linux, Android | RTOS, Hypervisor, or bare-metal | -| Isolation | Soft partitioning | Hard isolation (hardware-enforced) | -| Functional Safety Req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | -| Fault Handling | Best-effort recovery | Deterministic safe-state response | +| OS/runtime | Linux, Android | RTOS, hypervisor, or bare-metal | +| Isolation | Soft partitioning | Hardware-enforced isolation | +| Functional safety req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | +| Fault handling | Best-effort recovery | Deterministic safe-state response | + +{{% notice Tip %}} +Safety Islands are often implemented as lockstep cores or separate MCUs that run on real-time operating systems (RTOS), offering guaranteed performance under fault conditions. +{{% /notice %}} This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. -Safety Island is an independent safety subsystem separate from the main processor. It is responsible for monitoring and managing system safety. If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. +If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. + +## Key capabilities of Safety Island +- **System health monitoring** + - Continuously monitors the operational status of the main processor (for example, the ADAS control unit) and detects potential errors or anomalies. +- **Fault detection and isolation** + - Independently detects failures and initiates emergency handling for overheating, execution faults, or unresponsiveness. +- **Provides essential safety functions**, even if the main system crashes, the Safety Island still executes minimal safety operations, such as: + - Autonomous Vehicles → safe stopping (fail-safe mode) + - Industrial Equipment → emergency power cutoff or speed reduction -Key Capabilities of Safety Island -- System Health Monitoring - - Continuously monitors the operational status of the main processor (for example, ADAS control unit, ECU) and detects potential errors or anomalies. -- Fault Detection and Isolation - - Independently evaluates and initiates emergency handling if the main processing unit encounters errors, overheating, computational failures, or unresponsiveness. -- Providing Essential Safety Functions - - Even if the main system crashes, Safety Island can still execute minimal safety operations, such as: - - Autonomous Vehicles → Safe stopping (fail-safe mode) - - Industrial Equipment → Emergency power cutoff or speed reduction +## Why Safety Island matters for functional safety -## Why Safety Island Matters for Functional Safety +Safety Island helps systems respond to high-risk scenarios and reduces the likelihood of catastrophic failures. -Safety Island plays a critical role in Functional Safety by ensuring that the system can handle high-risk scenarios and minimize catastrophic failures. +- **Acts as an independent redundant safety layer** + - Operates safety logic independently of the main processor -How Safety Island Enhances Functional Safety -1. Acts as an Independent Redundant Safety Layer - - Even if the main system fails, it can still operate independently. -2. Supports ASIL-D Safety Level - - Monitors ECU health status and executes emergency safety strategies, such as emergency braking. -3. Provides Independent Fault Detection and Recovery Mechanisms - - Fail-Safe: Activates a safe mode, such as limiting vehicle speed or switching to manual control. - - Fail-Operational: Ensures that high-safety applications, such as aerospace systems, can continue operating under certain conditions. +- **Supports ASIL-D safety level** + - Enables the system to meet the highest ISO 26262 requirements for critical operations +- **Provides independent fault detection and recovery mechanisms** + - *Fail-safe*: activates a minimal-risk mode, such as limiting vehicle speed or switching to manual control + - *Fail-operational*: allows high-integrity systems, such as those in aerospace or autonomous driving, to continue functioning under fault conditions diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md index 92fbcabb10..b12e9a66dc 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md @@ -6,25 +6,30 @@ weight: 6 layout: learningpathall --- -## Functional Safety in the Software Development Lifecycle +## The software development lifecycle -Functional Safety impacts both hardware and software development, particularly in areas such as requirement changes, version management, and testing validation. -For example, in ASIL-D level applications, every code modification requires a complete impact analysis and regression testing to ensure that new changes do not introduce additional risks. +Functional Safety affects both hardware and software development, particularly in areas such as requirement changes, version control, and test validation. For example, in ASIL-D level applications, every code change must go through a full impact analysis and regression testing to ensure it doesn't introduce new risks. -### Functional Safety Requirements in Software Development +## Software development practices for functional safety -These practices ensure the software development process meets industry safety standards and can withstand system-level failures: -- Requirement Specification - - Clearly defining safety-critical requirements and conducting risk assessments. -- Safety-Oriented Programming - - Following MISRA C, CERT C/C++ standards and using static analysis tools to detect errors. -- Fault Handling Mechanisms - - Implementing redundancy design and health monitoring to handle anomalies. -- Testing and Verification - - Using Hardware-in-the-Loop (HIL) testing to ensure software safety in real hardware environments. -- Version Management and Change Control - - Using Git, JIRA, Polarion to track changes for safety audits. +These practices ensure that software meets industry standards and can withstand system-level failures: +- **Define requirements clearly** + - Specify safety-critical requirements and conduct formal risk assessments. -By establishing an ASIL Partitioning software development environment and leveraging SOAFEE technologies, you can enhance software consistency and maintainability in Functional Safety applications. +- **Follow safety-oriented programming standards** + - Use MISRA C or CERT C/C++ and static analysis tools to detect unsafe behavior. -This Learning Path follows [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) and introduces Functional Safety design practices from the earliest development stages. \ No newline at end of file +- **Implement fault-handling mechanisms** + - Use redundancy, health monitoring, and fail-safe logic to manage faults gracefully. + +- **Test and verify rigorously** + - Use Hardware-in-the-Loop (HIL) testing to validate behavior under realistic conditions. + +- **Track changes with version control and audits** + - Use tools like Git, JIRA, or Polarion to manage revisions and maintain traceability for audits. + +By building an ASIL-partitioned development environment and adopting SOAFEE technologies, you can improve software maintainability and meet functional safety requirements more consistently. + +{{% notice Note %}} +This Learning Path builds on [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/). It introduces functional safety practices from the earliest stages of software development. +{{% /notice %}} diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md index 4865aa88f0..88864a4e20 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md @@ -1,12 +1,12 @@ --- -title: How to Use Data Distribution Service (DDS) +title: How to use Data Distribution Service (DDS) weight: 7 ### FIXED, DO NOT MODIFY layout: learningpathall --- -### Introduction to DDS +## Introduction to DDS Data Distribution Service (DDS) is a real-time, high-performance middleware designed for distributed systems. It is particularly valuable in automotive software development, including applications such as autonomous driving (AD) and advanced driver assistance systems (ADAS). @@ -16,7 +16,12 @@ In modern vehicles, multiple sensors such as LiDAR, radar, and cameras must cont DDS ensures these components share data seamlessly and in real time, both within the vehicle and across infrastructure such as V2X systems, including traffic lights and road sensors. -### Why Automotive Software Needs DDS +{{% notice Tip %}} +To get started with open-source DDS on Arm platforms, check out the [Installation Guide for CycloneDDS](https://learn.arm.com/install-guides/cyclonedds) on how to install open-source DDS on an Arm platform. +{{% /notice %}} + + +## Why automotive software needs DDS Next-generation automotive software architectures, such as SOAFEE, depend on deterministic, distributed communication. Traditional client-server models introduce latency and create single points of failure. In contrast, DDS uses a publish-subscribe model that enables direct, peer-to-peer communication across system components. @@ -26,7 +31,7 @@ Additionally, DDS provides a flexible Quality of Service (QoS) configuration, al These capabilities make DDS an essential backbone for autonomous vehicle stacks, where real-time sensor fusion and control coordination are critical for safety and performance. -### DDS Architecture and Operation +## DDS architecture and operation DDS uses a data-centric publish-subscribe (DCPS) model, allowing producers and consumers of data to communicate without direct dependencies. This modular approach enhances system flexibility and maintainability, making it well suited for complex automotive environments. @@ -41,7 +46,7 @@ Each domain contains multiple topics, representing specific data types such as v For example, in an autonomous vehicle, LiDAR, radar, and cameras continuously generate large amounts of sensor data. The perception module subscribes to these sensor topics, processes the data, and then publishes detected objects and road conditions to other components like path planning and motion control. Since DDS automatically handles participant discovery and message distribution, engineers do not need to manually configure communication paths, reducing development complexity. -### Real-World Use in Autonomous Driving +## Real-world use in autonomous driving DDS is widely used in autonomous driving systems, where real-time data exchange is crucial. A typical use case involves high-frequency sensor data transmission and decision-making coordination between vehicle subsystems. @@ -53,7 +58,7 @@ For example, Autoware, an open-source autonomous driving software stack, uses DD The Perception stack publishes detected objects from LiDAR and camera sensors to a shared topic, which is then consumed by the Planning module in real-time. Using DDS allows each subsystem to scale independently while preserving low-latency and deterministic communication. -### Publish-Subscribe Model and Data Transmission +## Publish-subscribe model and data transmission Let’s explore how DDS’s publish-subscribe model fundamentally differs from traditional communication methods in terms of scalability, latency, and reliability. @@ -68,7 +73,7 @@ DDS supports multiple transport mechanisms to optimize communication efficiency: * UDP or TCP/IP is used for inter-device communication, such as V2X applications where vehicles exchange safety-critical messages. * Automatic participant discovery eliminates the need for manual configuration, allowing DDS nodes to detect and establish connections dynamically. -#### Comparison of DDS and Traditional Communication Methods +## Compare DDS with traditional communication models The following table highlights how DDS improves upon traditional client-server communication patterns in the context of real-time automotive applications: @@ -84,7 +89,6 @@ These features make DDS a highly adaptable solution for automotive software engi In this section, you learned how DDS enables low-latency, scalable, and fault-tolerant communication for autonomous vehicle systems. -Its data-centric publish-subscribe architecture eliminates the limitations of traditional client-server models and forms the backbone of modern automotive software frameworks such as ROS 2 and SOAFEE. +Its data-centric publish-subscribe architecture removes the limitations of traditional client-server models and forms the backbone of modern automotive software frameworks like ROS 2 and SOAFEE. -To get started with open-source DDS on Arm platforms, refer to this [installation guide for Cyclonedds](https://learn.arm.com/install-guides/cyclonedds) on how to install open-source DDS on an Arm platform. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index 3ce8105ebd..3bbc8e8fe1 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -7,14 +7,13 @@ weight: 9 layout: learningpathall --- -## Run OpenAD Kit on distributed ROS 2 instances +## What this distributed demo shows you In this section, you’ll bring all the previous setup together and execute the full OpenAD Kit demo across two Arm-based instances. -OpenAD Kit is an open-source reference design for autonomous driving workloads on Arm. -It demonstrates how Autoware modules can be deployed on scalable infrastructure, whether on a single machine or split across multiple compute nodes. +OpenAD Kit is an open-source reference design for autonomous driving workloads on Arm. It demonstrates how Autoware modules can be deployed on scalable infrastructure, either on a single machine or distributed across multiple compute nodes. -## Prepare the execution scripts +## Prepare launch scripts on both instances This setup separates the simulation/visualization environment from the planning-control logic, allowing you to explore how ROS 2 nodes communicate over a distributed system using DDS (Data Distribution Service). @@ -24,7 +23,7 @@ On each instance, copy the appropriate launch script into the `openadkit_demo.au {{< tabpane code=true >}} {{< tab header="Planning-Control" language="bash">}} - !/bin/bash + #!/bin/bash # Configure the environment variables export SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker export CONF_FILE_PASS=$SCRIPT_DIR/etc/simulation/config/pass_static_obstacle_avoidance.param.yaml @@ -40,7 +39,7 @@ On each instance, copy the appropriate launch script into the `openadkit_demo.au TIMEOUT=120 CONF_FILE=$CONF_FILE_PASS docker compose -f "$SCRIPT_DIR/docker-compose-2ins.yml" up planning-control -d {{< /tab >}} - {{< tab header="Visualizer & Simulator" language="bash">}} + {{< tab header="Visualizer and simulator" language="bash">}} #!/bin/bash export SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker @@ -71,7 +70,7 @@ You can also find the prepared launch scripts `opad_planning.sh` and `opad_sim_v These scripts encapsulate the required environment variables and container commands for each role. -#### Run the distributed OpenAD Kit demo +## Run the distributed OpenAD Kit demo On the Planning-Control node, execute: @@ -94,9 +93,10 @@ You can open this link in a browser to observe the demo behavior, which will clo ![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS](split_aws_run.gif "Figure 4: Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") -The containers are now distributed across two separate instances, enabling real-time, cross-node communication. -Behind the scenes, this architecture demonstrates how DDS manages low-latency, peer-to-peer data exchange in a distributed ROS 2 environment. +You’ve now run the OpenAD Kit across two nodes with separated control and visualization roles. DDS enabled real-time communication between the ROS 2 nodes across the network, with synchronized behavior between the planning and simulation components. + +The containers are now distributed across two separate instances, enabling real-time, cross-node communication. Behind the scenes, this architecture demonstrates how DDS manages low-latency, peer-to-peer data exchange in a distributed ROS 2 environment. To support demonstration and validation, the simulator is configured to run three times sequentially, giving you multiple opportunities to observe how data flows between nodes and verify that communication remains stable across each cycle. -Now that you’ve seen the distributed system in action, consider exploring different QoS settings, network conditions, or even adding a third node to expand the architecture further. +Now that you've seen the distributed system in action, try adjusting QoS settings, simulating network delays, or adding a third node to expand the architecture. From aff240a03fb1a3a3ab314bf60d80d51ded4bc609 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Wed, 23 Jul 2025 21:47:55 +0000 Subject: [PATCH 22/63] Updates --- .../1a_functional_safety.md | 6 +-- .../openadkit2_safetyisolation/1b_purpose.md | 8 ++-- .../openadkit2_safetyisolation/1c_ISO26262.md | 10 +++-- .../1d_safety_island_arch.md | 40 +++++++++---------- .../1e_implement functional_safety.md | 2 +- .../2_data_distribution_service.md | 5 ++- .../4_multiinstance_executing.md | 6 +-- 7 files changed, 39 insertions(+), 38 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md index f40bbd93c2..9848838044 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1a_functional_safety.md @@ -6,11 +6,11 @@ weight: 2 layout: learningpathall --- -## Understand the role of functional safety in software development +## What functional safety means for developers -Functional safety helps systems detect faults and respond in ways that keep people and equipment safe. It helps prevent harm by ensuring that systems remain in a known, safe state, even when errors occur. +Functional safety helps systems detect faults and respond in ways that keep people and equipment safe. It ensures that even when errors occur, the system transitions into a known, safe state to prevent harm. -This concept is especially critical in domains like automotive, autonomous driving, medical devices, industrial control, robotics, and aerospace. In these systems, failures can have severe real-world consequences. +This concept is foundational in domains like automotive, autonomous driving, medical devices, industrial control, robotics, and aerospace. In these systems, failures can have severe real-world consequences. In software development, functional safety focuses on minimizing risks through careful design, rigorous testing, and thorough validation. The goal is to make sure that critical systems behave predictably, reliably, and verifiably, even under fault conditions. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md index 267c4679f1..7363e87f80 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1b_purpose.md @@ -10,13 +10,13 @@ layout: learningpathall At its core, functional safety is about managing risk and reducing the impact of system failures. -In autonomous vehicles, for example, functional safety ensures that if sensor data is incorrect, the system can transition into a safe state and avoid unsafe driving behavior. +In autonomous vehicles, for example, functional safety ensures that if sensors produce unreliable or conflicting input, the vehicle can fall back to a known-safe state and maintain control. The three core objectives of functional safety are: - **Prevention** reduces the likelihood of errors through rigorous software development processes and testing. For example, electric vehicles monitor battery temperature to prevent overheating. -- **Detection** quickly identifies errors using built-in diagnostic mechanisms, such as built-in self-test routines. -- **Mitigation** controls the impact of failures to ensure the system stays safe, even when things go wrong. +- **Detection** quickly identifies errors using built-in diagnostic mechanisms, such as self-test routines. +- **Mitigation** controls the impact of failures to ensure the system stays safe, even when something goes wrong. In practice, these principles might be implemented through: @@ -27,8 +27,6 @@ In practice, these principles might be implemented through: Together, prevention, detection, and mitigation form the foundation for building safer, more reliable software systems. -This approach is critical in systems like autonomous vehicles and medical devices, where failures can have serious consequences. - In the next step, you’ll explore how functional safety principles are formalized through safety standards like ISO 26262 and applied to real-world systems. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md index d1931f92bf..57d48a7d74 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md @@ -5,20 +5,22 @@ weight: 4 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Understand ISO 26262 and safety integrity levels +## What ISO 26262 and ASIL levels mean for developers -ISO 26262 is a functional safety standard specifically for automotive electronics and software systems. It defines a comprehensive safety lifecycle aligned with the V-model, that covers everything from initial requirements to ongoing maintenance. +ISO 26262 is a functional safety standard for automotive electronics and software systems. It defines a structured safety lifecycle aligned with the V-model, spanning everything from initial requirements to final validation and maintenance. + +The V-model is a development framework where each design phase is paired with a corresponding test phase. This structure makes it easier to trace safety requirements from early specifications through to system verification. ## Key concepts in ISO 26262 - **Automotive Safety Integrity Level (ASIL)** ranks the safety criticality of components on a scale from A (lowest) to D (highest). For example, ASIL A might apply to a dashboard indicator failure, while ASIL D applies to a brake system malfunction. -{{% notice Note %}}In practice, many OEMs default to ASIL D for systems with any potential for passenger harm, even if the statistical likelihood of failure is low.{{% /notice %}} - - **Hazard Analysis and Risk Assessment (HARA)** identifies potential hazards and evaluates their risks to define the required safety goals and ASIL levels. - **Safety mechanisms** include techniques such as real-time fault detection, redundancy, and fallback modes like fail-safe and fail-operational behavior. +{{% notice Note %}}In practice, many OEMs default to ASIL D for systems with any potential for passenger harm, even if the statistical likelihood of failure is low.{{% /notice %}} + ## Apply ISO 26262 in real-world systems ISO 26262 applies to many safety-critical vehicle systems: diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index e0267b9848..5f3be175ab 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -1,46 +1,44 @@ --- -title: Implement safety-critical isolation with Safety Island architecture +title: Implement safety-critical isolation using safety island architecture weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Isolate safety-critical logic using a Safety Island +## How safety islands support functional safety in software systems -In automotive systems, a general ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation. +In automotive systems, a non-safety ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation. -A Safety Island, by contrast, is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. +A safety island, by contrast, is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. -The table below compares the characteristics of a general ECU and a Safety Island in terms of their role in supporting functional safety. +The table below compares the characteristics of an ECU and a safety island in terms of their role in supporting functional safety. -| Feature | General ECU | Safety Island | +| Feature | ECU | Safety island | |------------------------|----------------------------|--------------------------------------| | Purpose | Comfort/non-safety logic | Safety-critical decision making | | OS/runtime | Linux, Android | RTOS, hypervisor, or bare-metal | | Isolation | Soft partitioning | Hardware-enforced isolation | -| Functional safety req | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | +| Functional safety requirement | None to moderate | ISO 26262 ASIL-B to ASIL-D compliant | | Fault handling | Best-effort recovery | Deterministic safe-state response | -{{% notice Tip %}} -Safety Islands are often implemented as lockstep cores or separate MCUs that run on real-time operating systems (RTOS), offering guaranteed performance under fault conditions. -{{% /notice %}} +This comparison shows why safety-critical software depends on dedicated hardware domains to meet functional safety goals. -This contrast highlights why safety-focused software needs a dedicated hardware domain with certified execution behavior. +If the main processor fails or becomes inoperable, a safety island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. -If the main processor fails or becomes inoperable, Safety Island can take over critical safety functions such as deceleration, stopping, and fault handling to prevent catastrophic system failures. +{{% notice Tip %}} +Safety islands are often implemented as lockstep cores or separate MCUs that run on real-time operating systems (RTOS), offering guaranteed performance under fault conditions. +{{% /notice %}} -## Key capabilities of Safety Island -- **System health monitoring** - - Continuously monitors the operational status of the main processor (for example, the ADAS control unit) and detects potential errors or anomalies. -- **Fault detection and isolation** - - Independently detects failures and initiates emergency handling for overheating, execution faults, or unresponsiveness. -- **Provides essential safety functions**, even if the main system crashes, the Safety Island still executes minimal safety operations, such as: +## Key capabilities of a safety island +- **System health monitoring** continuously monitors the operational status of the main processor (for example, the ADAS control unit) and detects potential errors or anomalies +- **Fault detection and isolation** independently detects failures and initiates emergency handling for overheating, execution faults, or unresponsiveness +- **Essential safety functions conitnue to operate**, even if the main system crashes. A safety island can execute fallback operations, such as: - Autonomous Vehicles → safe stopping (fail-safe mode) - Industrial Equipment → emergency power cutoff or speed reduction -## Why Safety Island matters for functional safety +## Why safety island matters for functional safety -Safety Island helps systems respond to high-risk scenarios and reduces the likelihood of catastrophic failures. +A safety island helps systems respond to high-risk scenarios and reduces the likelihood of catastrophic failures. - **Acts as an independent redundant safety layer** - Operates safety logic independently of the main processor @@ -51,3 +49,5 @@ Safety Island helps systems respond to high-risk scenarios and reduces the likel - **Provides independent fault detection and recovery mechanisms** - *Fail-safe*: activates a minimal-risk mode, such as limiting vehicle speed or switching to manual control - *Fail-operational*: allows high-integrity systems, such as those in aerospace or autonomous driving, to continue functioning under fault conditions + +Safety islands play a key role in enabling ISO 26262 compliance by isolating safety-critical logic from general-purpose processing. They're a proven solution for improving system determinism, fault tolerance, and fallback behavior. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md index b12e9a66dc..60b53a465b 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md @@ -28,7 +28,7 @@ These practices ensure that software meets industry standards and can withstand - **Track changes with version control and audits** - Use tools like Git, JIRA, or Polarion to manage revisions and maintain traceability for audits. -By building an ASIL-partitioned development environment and adopting SOAFEE technologies, you can improve software maintainability and meet functional safety requirements more consistently. +Building an ASIL-partitioned development environment and adopting SOAFEE technologies can help improve software maintainability and ensure consistent compliance with functional safety standards. {{% notice Note %}} This Learning Path builds on [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/). It introduces functional safety practices from the earliest stages of software development. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md index 88864a4e20..0f1b7145b7 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md @@ -10,7 +10,7 @@ layout: learningpathall Data Distribution Service (DDS) is a real-time, high-performance middleware designed for distributed systems. It is particularly valuable in automotive software development, including applications such as autonomous driving (AD) and advanced driver assistance systems (ADAS). -DDS offers a decentralized architecture that enables scalable, low-latency, and reliable data exchange, making it ideal for managing high-frequency sensor streams. +DDS uses a decentralized architecture that supports scalable, low-latency, and reliable data exchange, which is ideal for managing high-frequency sensor streams. In modern vehicles, multiple sensors such as LiDAR, radar, and cameras must continuously communicate with compute modules. @@ -87,8 +87,9 @@ The following table highlights how DDS improves upon traditional client-server c These features make DDS a highly adaptable solution for automotive software engineers seeking to develop scalable, real-time communication frameworks. -In this section, you learned how DDS enables low-latency, scalable, and fault-tolerant communication for autonomous vehicle systems. +DDS is a critical building block in distributed automotive systems. By enabling scalable, low-latency communication and fault tolerance, it powers real-time coordination in modern architectures like ROS 2, SOAFEE, and Autoware. Its data-centric publish-subscribe architecture removes the limitations of traditional client-server models and forms the backbone of modern automotive software frameworks like ROS 2 and SOAFEE. + diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index 3bbc8e8fe1..7bb1696fff 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -93,10 +93,10 @@ You can open this link in a browser to observe the demo behavior, which will clo ![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS](split_aws_run.gif "Figure 4: Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") -You’ve now run the OpenAD Kit across two nodes with separated control and visualization roles. DDS enabled real-time communication between the ROS 2 nodes across the network, with synchronized behavior between the planning and simulation components. +You’ve now run the OpenAD Kit across two nodes with separated control and visualization roles. DDS enabled real-time, peer-to-peer communication between the ROS 2 nodes, supporting synchronized behavior across the planning and simulation components deployed on two separate instances. The containers are now distributed across two separate instances, enabling real-time, cross-node communication. Behind the scenes, this architecture demonstrates how DDS manages low-latency, peer-to-peer data exchange in a distributed ROS 2 environment. -To support demonstration and validation, the simulator is configured to run three times sequentially, giving you multiple opportunities to observe how data flows between nodes and verify that communication remains stable across each cycle. +The simulator runs three times by default, giving you multiple chances to observe data flow and verify stable communication between nodes. -Now that you've seen the distributed system in action, try adjusting QoS settings, simulating network delays, or adding a third node to expand the architecture. +Now that you’ve seen the distributed system in action, try modifying QoS settings, simulating network conditions, or scaling to a third node to explore more complex configurations. From e5cd519b1aa463a38048d3068a0d4e55d53be1d1 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Wed, 23 Jul 2025 21:58:34 +0000 Subject: [PATCH 23/63] Updates --- .../3_container_spliting.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index b65a553c4f..1620062325 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -1,12 +1,12 @@ --- -title: Split into multiple cloud container instances +title: Deploy OpenAD Kit across multiple cloud instances weight: 8 ### FIXED, DO NOT MODIFY layout: learningpathall --- -### System Architecture and Component Design +## Refactor OpenAD Kit for distributed deployment Now that you’ve explored the concept of a Safety Island, a dedicated subsystem responsible for executing safety-critical control logic, and learned how DDS (Data Distribution Service) enables real-time, distributed communication, you’ll refactor the original OpenAD Kit architecture into a multi-instance deployment. @@ -19,7 +19,7 @@ In this session, you will split the simulation and visualization stack from the These nodes communicate using ROS 2 with DDS as the middleware layer, ensuring low-latency and fault-tolerant data exchange between components. -### Architectural Benefits +## Architectural Benefits This architecture brings several practical benefits: @@ -37,7 +37,7 @@ With containerized separation, you can build, test, and deploy each module indep ![img1 alt-text#center](aws_example.jpg "Figure 1: Split instance example in AWS") -### Networking Setting +## Configure networking for DDS communication To begin, launch two Arm-based VM instances. AWS EC2 is used, but you can use any Arm instances. @@ -58,19 +58,19 @@ Within the EC2 Security Group settings: - Add an inbound rule that allows all traffic from the same Security Group by setting the source to the security group itself. - Outbound traffic is typically allowed by default and usually does not require changes. -![img2 alt-text#center](security_group.jpg "Figure 2: AWS Security Group Setting") +![img2 alt-text#center](security_group.jpg "AWS Security Group Setting") This configuration allows automatic discovery and peer-to-peer communication between DDS participants across the two instances. Once both systems are operational, record the private IP addresses of each instance. You will need them when configuring CycloneDDS peer discovery in the next step. -### New Docker YAML Configuration Setting +## Update Docker and DDS configuration Before you begin, ensure that Docker is installed on both of your development instances. Review the [Docker install guide](/install-guides/docker/docker-engine/) if needed. First, clone the demo repo and create xml file called `cycloneDDS.xml` -#### Step 1: Clone the repository and prepare configuration files +## Clone the repository and prepare configuration files ```bash git clone https://github.com/odincodeshen/openadkit_demo.autoware.git @@ -104,7 +104,7 @@ This command will download all images defined in the docker-compose-2ins.yml fil - odinlmshen/autoware-planning-control:v1.0 - odinlmshen/autoware-visualizer:v1.0 -#### Step 2: Configure CycloneDDS for Peer-to-Peer Communication +## Configure CycloneDDS for peer-to-peer communication The cycloneDDS.xml file is used to customize how CycloneDDS (the middleware used by ROS 2) discovers and communicates between distributed nodes. @@ -146,12 +146,12 @@ Please copy the following configuration into docker/cycloneDDS.xml on both machi 3. You can find the more detail about CycloneDDS setting [Configuration](https://cyclonedds.io/docs/cyclonedds/latest/config/config_file_reference.html#cyclonedds-domain-internal-socketreceivebuffersize) {{% /notice %}} -#### Step 3: Update the Docker Compose Configuration for Multi-Host Deployment +## Update the Docker Compose Configuration for Multi-Host Deployment To support running containers across two separate hosts, you’ll need to modify the docker/docker-compose-2ins.yml file. This includes removing inter-container dependencies and updating the network and environment configuration. -##### Remove Cross-Container Dependency +## Remove cross-container dependency Since the planning-control and simulator containers will now run on different machines, you must remove any depends_on references between them to prevent Docker from attempting to start them on the same host. @@ -258,7 +258,7 @@ services: Before moving to the next step, make sure that `docker-compose-2ins.yml` and `cycloneDDS.xml` are already present on both instances. -#### Step 4: Optimize Network Settings for DDS Communication +## Optimize Network Settings for DDS Communication In a distributed DDS setup, `high-frequency UDP traffic` between nodes may lead to `IP packet fragmentation` or `buffer overflows`, especially under load. These issues can degrade performance or cause unexpected system behavior. @@ -295,7 +295,7 @@ Links to documentation: - [ROS2 documentation](https://docs.ros.org/en/humble/How-To-Guides/DDS-tuning.html#cyclone-dds-tuning) -#### Step 5: Verifying Cross-Instance DDS Communication with ROS 2 +## Verify DDS communication between instances using ROS 2 To confirm that ROS 2 nodes can exchange messages across two separate EC2 instances using DDS, this test will walk you through a minimal publisher–subscriber setup using a custom topic. From e11cd13b24baa4195f5429ff785e47c0e07492b4 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 09:29:00 +0000 Subject: [PATCH 24/63] Updates --- .../2_data_distribution_service.md | 2 +- .../4_multiinstance_executing.md | 20 +++++++++---------- .../openadkit2_safetyisolation/_index.md | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md index 0f1b7145b7..dbef040958 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md @@ -17,7 +17,7 @@ In modern vehicles, multiple sensors such as LiDAR, radar, and cameras must cont DDS ensures these components share data seamlessly and in real time, both within the vehicle and across infrastructure such as V2X systems, including traffic lights and road sensors. {{% notice Tip %}} -To get started with open-source DDS on Arm platforms, check out the [Installation Guide for CycloneDDS](https://learn.arm.com/install-guides/cyclonedds) on how to install open-source DDS on an Arm platform. +To get started with open-source DDS on Arm platforms, see the [Installation Guide for CycloneDDS](https://learn.arm.com/install-guides/cyclonedds). {{% /notice %}} diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index 7bb1696fff..8e10a4292b 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -1,5 +1,5 @@ --- -title: Execute OpenAD Kit across distributed ROS 2 instances +title: Run OpenAD Kit across distributed ROS 2 instances weight: 9 @@ -7,17 +7,17 @@ weight: 9 layout: learningpathall --- -## What this distributed demo shows you +## What you'll learn in this section -In this section, you’ll bring all the previous setup together and execute the full OpenAD Kit demo across two Arm-based instances. +In this section, you'll run the full OpenAD Kit demo across two Arm-based cloud instances using the setup from previous steps. -OpenAD Kit is an open-source reference design for autonomous driving workloads on Arm. It demonstrates how Autoware modules can be deployed on scalable infrastructure, either on a single machine or distributed across multiple compute nodes. +The OpenAD Kit is an open-source reference design for autonomous driving workloads on Arm. It demonstrates how Autoware modules can run on scalable infrastructure, whether on a single machine or distributed across multiple compute nodes using ROS 2 and DDS. -## Prepare launch scripts on both instances +## Set up launch scripts on both instances -This setup separates the simulation/visualization environment from the planning-control logic, allowing you to explore how ROS 2 nodes communicate over a distributed system using DDS (Data Distribution Service). +This setup separates the simulation and visualization environment from the planning and control logic, allowing you to explore how ROS 2 nodes communicate over a distributed system using DDS (Data Distribution Service). -To start the system, you need to configure and run separate launch commands on each machine. +To start the system, run separate launch scripts on each machine. On each instance, copy the appropriate launch script into the `openadkit_demo.autoware/docker` directory. @@ -66,7 +66,7 @@ On each instance, copy the appropriate launch script into the `openadkit_demo.au {{< /tab >}} {{< /tabpane >}} -You can also find the prepared launch scripts `opad_planning.sh` and `opad_sim_vis.sh` inside the `openadkit_demo.autoware/docker` directory on both instances. +You can also find these scripts `opad_planning.sh` and `opad_sim_vis.sh` inside the `openadkit_demo.autoware/docker` directory on both instances. These scripts encapsulate the required environment variables and container commands for each role. @@ -89,9 +89,9 @@ Once both machines are running their respective launch scripts, the Visualizer w http://[Visualizer public IP address]:6080/vnc.html -You can open this link in a browser to observe the demo behavior, which will closely resemble the output from the [previous learning path](http://learn.arm.com/learning-paths/automotive/openadkit1_container/4_run_openadkit/). +Open this link in your browser to watch the demo, which closely resembles the output in the [previous learning path](http://learn.arm.com/learning-paths/automotive/openadkit1_container/4_run_openadkit/). -![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS](split_aws_run.gif "Figure 4: Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") +![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS alt-text#center](split_aws_run.gif "Figure 4: Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") You’ve now run the OpenAD Kit across two nodes with separated control and visualization roles. DDS enabled real-time, peer-to-peer communication between the ROS 2 nodes, supporting synchronized behavior across the planning and simulation components deployed on two separate instances. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 8d265bafe6..55245d22ff 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -3,7 +3,7 @@ title: Prototype safety-critical isolation for autonomous driving systems on Neo minutes_to_complete: 60 -who_is_this_for: This Learning Path is for experienced automotive engineers developing safety-critical systems. You'll learn how to accelerate ISO 26262-compliant development workflows using Arm-based cloud compute, containerized simulation, and DDS-based communication. +who_is_this_for: This Learning Path is for automotive engineers developing safety-critical systems. You'll learn how to accelerate ISO 26262-compliant development workflows using Arm-based cloud compute, containerized simulation, and DDS-based communication. learning_objectives: - Apply functional safety principles, including risk prevention, fault detection, and ASIL compliance, to build robust, certifiable automotive systems From 1b982d676d4f759ccc5dc16e7dd855b4aa9746a9 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 10:36:40 +0000 Subject: [PATCH 25/63] Updates --- .../1d_safety_island_arch.md | 2 +- .../2_data_distribution_service.md | 2 +- .../3_container_spliting.md | 21 ++++++++++++------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index 5f3be175ab..a6aa9347b4 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -36,7 +36,7 @@ Safety islands are often implemented as lockstep cores or separate MCUs that run - Autonomous Vehicles → safe stopping (fail-safe mode) - Industrial Equipment → emergency power cutoff or speed reduction -## Why safety island matters for functional safety +## Why a safety island matters for functional safety A safety island helps systems respond to high-risk scenarios and reduces the likelihood of catastrophic failures. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md index dbef040958..eabd2f6d9b 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/2_data_distribution_service.md @@ -77,7 +77,7 @@ DDS supports multiple transport mechanisms to optimize communication efficiency: The following table highlights how DDS improves upon traditional client-server communication patterns in the context of real-time automotive applications: -| Feature | Traditional Client-Server Architecture | DDS Publish-Subscribe Model | +| Feature | Traditional client-server architecture | DDS publish-subscribe model | |----------------------|--------------------------------------------|--------------------------- | | Data Transmission | Relies on a central server | Direct peer-to-peer communication | | Latency | Higher latency | Low latency | diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index 1620062325..6710ace5e9 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -8,12 +8,12 @@ layout: learningpathall ## Refactor OpenAD Kit for distributed deployment -Now that you’ve explored the concept of a Safety Island, a dedicated subsystem responsible for executing safety-critical control logic, and learned how DDS (Data Distribution Service) enables real-time, distributed communication, you’ll refactor the original OpenAD Kit architecture into a multi-instance deployment. +Now that you’ve explored the concept of a safety island, a dedicated subsystem responsible for executing safety-critical control logic, and learned how DDS (Data Distribution Service) enables real-time, distributed communication, you’ll refactor the original OpenAD Kit architecture into a multi-instance deployment. In [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](http://learn.arm.com/learning-paths/automotive/openadkit1_container/), you deployed three container components on a single Arm-based instance, handling: - Simulation environment - Visualization -- Planning-Control +- Planning and control In this session, you will split the simulation and visualization stack from the planning-control logic and deploy them across two independent Arm-based instances. @@ -141,9 +141,9 @@ Please copy the following configuration into docker/cycloneDDS.xml on both machi ``` {{% notice Note %}} -1. Make sure the network interface name (ens5) matches the one on your EC2 instances. You can verify this using `ip -br a`. -2. This configuration disables multicast and enables static peer discovery between the two machines using unicast. -3. You can find the more detail about CycloneDDS setting [Configuration](https://cyclonedds.io/docs/cyclonedds/latest/config/config_file_reference.html#cyclonedds-domain-internal-socketreceivebuffersize) +- Make sure the network interface name (for example, `ens5`) matches the one used by your EC2 instances. You can verify the instance name by running `ip -br a`. +- This configuration disables multicast and enables static peer discovery between the two machines using unicast. +- For more information on CycloneDDS settings, see the [Cyclone DDS Configuration Guide](https://cyclonedds.io/docs/cyclonedds/latest/config/config_file_reference.html#cyclonedds-domain-internal-socketreceivebuffersize). {{% /notice %}} ## Update the Docker Compose Configuration for Multi-Host Deployment @@ -162,7 +162,7 @@ Since the planning-control and simulator containers will now run on different ma # - simulator ``` -##### Enable Host Networking +## Enable host networking All three containers (visualizer, simulator, planning-control) need access to the host’s network interfaces for DDS-based peer discovery. Replace Docker's default bridge network with host networking: @@ -172,7 +172,7 @@ Replace Docker's default bridge network with host networking: network_mode: host ``` -##### Use CycloneDDS Configuration via Environment Variable +## Apply the CycloneDDS configuration using an environment variable To ensure that each container uses your custom DDS configuration, mount the current working directory and set the CYCLONEDDS_URI environment variable: @@ -299,7 +299,7 @@ Links to documentation: To confirm that ROS 2 nodes can exchange messages across two separate EC2 instances using DDS, this test will walk you through a minimal publisher–subscriber setup using a custom topic. -##### On Planning-Control Node (Publisher) +## On the Planning-Control Node (Publisher) On the first EC2 instance, you will publish a custom message to the /hello topic using ROS 2. This will simulate outbound DDS traffic from the planning-control container. @@ -363,6 +363,11 @@ ros2 topic echo /hello ``` In the simulator container, you should see repeated outputs like: + +{{% notice tip %}} +If the subscriber shows a continuous stream of `/hello` messages, DDS discovery and ROS 2 communication between nodes are working as expected. +{{% /notice %}} + ``` root@ip-172-31-19-5:/autoware# ros2 topic echo /hello data: Hello From Planning From 6d307ca06e9854b41e2d948f7c425115fda1e815 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 12:37:42 +0000 Subject: [PATCH 26/63] Updates --- .../openadkit2_safetyisolation/1c_ISO26262.md | 4 +- .../1d_safety_island_arch.md | 18 +++--- .../1e_implement functional_safety.md | 24 ++++---- .../3_container_spliting.md | 55 +++++++++---------- .../4_multiinstance_executing.md | 13 +++-- 5 files changed, 55 insertions(+), 59 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md index 57d48a7d74..511c708777 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md @@ -21,7 +21,7 @@ The V-model is a development framework where each design phase is paired with a {{% notice Note %}}In practice, many OEMs default to ASIL D for systems with any potential for passenger harm, even if the statistical likelihood of failure is low.{{% /notice %}} -## Apply ISO 26262 in real-world systems +## Apply ISO 26262 to real-world systems ISO 26262 applies to many safety-critical vehicle systems: @@ -31,7 +31,7 @@ ISO 26262 applies to many safety-critical vehicle systems: - **Battery management systems (BMS)** protect electric vehicle batteries from overheating, overcharging, or deep discharge. Built-in safety functions monitor temperature, balance voltage, and isolate faulty circuits to prevent thermal runaway. -These systems require dedicated hardware and software architectures that enforce functional safety guarantees. One common solution is the **Safety Island**, which is an isolated compute domain used to run safety-critical control logic independently from the main system. +These systems require dedicated hardware and software architectures that enforce functional safety guarantees. One common solution is the *safety island*, which is an isolated compute domain used to run safety-critical control logic independently from the main system. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index a6aa9347b4..5f2f5798d6 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -5,11 +5,9 @@ weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## How safety islands support functional safety in software systems +## How safety islands support functional safety -In automotive systems, a non-safety ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation. - -A safety island, by contrast, is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. +In automotive systems, a non-safety ECU (Electronic Control Unit) typically runs non-critical tasks such as infotainment or navigation. A safety island, by contrast, is dedicated to executing safety-critical control logic (for example, braking and steering) with strong isolation, redundancy, and determinism. The table below compares the characteristics of an ECU and a safety island in terms of their role in supporting functional safety. @@ -38,16 +36,16 @@ Safety islands are often implemented as lockstep cores or separate MCUs that run ## Why a safety island matters for functional safety -A safety island helps systems respond to high-risk scenarios and reduces the likelihood of catastrophic failures. +A safety island provides a dedicated environment for executing critical safety functions. Its key characteristics include: -- **Acts as an independent redundant safety layer** +- **Acting as an independent redundant safety layer** - Operates safety logic independently of the main processor -- **Supports ASIL-D safety level** +- **Supporting the ASIL-D safety level** - Enables the system to meet the highest ISO 26262 requirements for critical operations -- **Provides independent fault detection and recovery mechanisms** - - *Fail-safe*: activates a minimal-risk mode, such as limiting vehicle speed or switching to manual control - - *Fail-operational*: allows high-integrity systems, such as those in aerospace or autonomous driving, to continue functioning under fault conditions +- **Providing independent fault detection and recovery mechanisms:** + - *Fail-safe*: activating a minimal-risk mode, such as limiting vehicle speed or switching to manual control + - *Fail-operational*: allowing high-integrity systems, such as those in aerospace or autonomous driving, to continue functioning under fault conditions Safety islands play a key role in enabling ISO 26262 compliance by isolating safety-critical logic from general-purpose processing. They're a proven solution for improving system determinism, fault tolerance, and fallback behavior. \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md index 60b53a465b..a83767f462 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md @@ -8,27 +8,27 @@ layout: learningpathall ## The software development lifecycle -Functional Safety affects both hardware and software development, particularly in areas such as requirement changes, version control, and test validation. For example, in ASIL-D level applications, every code change must go through a full impact analysis and regression testing to ensure it doesn't introduce new risks. +Functional safety affects both hardware and software development, particularly in areas such as requirement changes, version control, and test validation. For example, in ASIL-D level applications, every code change must go through a full impact analysis and regression testing to ensure it doesn't introduce new risks. ## Software development practices for functional safety These practices ensure that software meets industry standards and can withstand system-level failures: -- **Define requirements clearly** - - Specify safety-critical requirements and conduct formal risk assessments. +- **Defining requirements clearly** + - Specifying safety-critical requirements and conduct formal risk assessments. -- **Follow safety-oriented programming standards** - - Use MISRA C or CERT C/C++ and static analysis tools to detect unsafe behavior. +- **Following safety-oriented programming standards** + - Using MISRA C or CERT C/C++ and static analysis tools to detect unsafe behavior. -- **Implement fault-handling mechanisms** - - Use redundancy, health monitoring, and fail-safe logic to manage faults gracefully. +- **Implementing fault-handling mechanisms** + - Using redundancy, health monitoring, and fail-safe logic to manage faults gracefully. -- **Test and verify rigorously** - - Use Hardware-in-the-Loop (HIL) testing to validate behavior under realistic conditions. +- **Testing and verifying rigorously** + - Using Hardware-in-the-Loop (HIL) testing to validate behavior under realistic conditions. -- **Track changes with version control and audits** - - Use tools like Git, JIRA, or Polarion to manage revisions and maintain traceability for audits. +- **Tracking changes with version control and audits** + - Using tools like Git, JIRA, or Polarion to manage revisions and maintain traceability for audits. -Building an ASIL-partitioned development environment and adopting SOAFEE technologies can help improve software maintainability and ensure consistent compliance with functional safety standards. +- **Building an ASIL-partitioned development environment and adopting SOAFEE technologies** to help improve software maintainability and ensure consistent compliance with functional safety standards. {{% notice Note %}} This Learning Path builds on [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/). It introduces functional safety practices from the earliest stages of software development. diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index 6710ace5e9..6c5809f0cd 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -10,12 +10,12 @@ layout: learningpathall Now that you’ve explored the concept of a safety island, a dedicated subsystem responsible for executing safety-critical control logic, and learned how DDS (Data Distribution Service) enables real-time, distributed communication, you’ll refactor the original OpenAD Kit architecture into a multi-instance deployment. -In [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](http://learn.arm.com/learning-paths/automotive/openadkit1_container/), you deployed three container components on a single Arm-based instance, handling: -- Simulation environment +The predecessor Learning Path, [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](http://learn.arm.com/learning-paths/automotive/openadkit1_container/), showed how to deploying three container components on a single Arm-based instance, to handle: +- The simulation environment - Visualization - Planning and control -In this session, you will split the simulation and visualization stack from the planning-control logic and deploy them across two independent Arm-based instances. +In this Learning Path, you will split the simulation and visualization stack from the planning-control logic and deploy them across two independent Arm-based instances. These nodes communicate using ROS 2 with DDS as the middleware layer, ensuring low-latency and fault-tolerant data exchange between components. @@ -23,23 +23,19 @@ These nodes communicate using ROS 2 with DDS as the middleware layer, ensuring l This architecture brings several practical benefits: -- Enhanced System Stability: -Decoupling components prevents resource contention and ensures that safety-critical functions remain deterministic and responsive. +- **Enhanced System Stability**: decoupling components prevents resource contention and ensures that safety-critical functions remain deterministic and responsive. -- Real-Time, Scalable Communication: -DDS enables built-in peer discovery and configurable QoS, removing the need for a central broker or manual network setup. +- **Real-Time, Scalable Communication**: DDS enables built-in peer discovery and configurable QoS, removing the need for a central broker or manual network setup. -- Improved Scalability and Performance Tuning: -Each instance can be tuned based on its workload—for example, simulation tasks can use GPU-heavy hardware, while planning logic may benefit from CPU-optimized setups. +- **Improved Scalability and Performance Tuning**: each instance can be tuned based on its workload,for example, simulation tasks can use GPU-heavy hardware, while planning logic might benefit from CPU-optimized setups. -- Support for Modular CI/CD Workflows: -With containerized separation, you can build, test, and deploy each module independently—enabling agile development and faster iteration cycles. +- **Support for Modular CI/CD Workflows**: with containerized separation, you can build, test, and deploy each module independently, which enables agile development and faster iteration cycles. -![img1 alt-text#center](aws_example.jpg "Figure 1: Split instance example in AWS") +![img1 alt-text#center](aws_example.jpg "Split instance example in AWS") ## Configure networking for DDS communication -To begin, launch two Arm-based VM instances. AWS EC2 is used, but you can use any Arm instances. +To begin, launch two Arm-based VM instances. AWS EC2 is used, but you can use any Arm-based instances. These instances will independently host your simulation and control workloads. @@ -66,7 +62,7 @@ Once both systems are operational, record the private IP addresses of each insta ## Update Docker and DDS configuration -Before you begin, ensure that Docker is installed on both of your development instances. Review the [Docker install guide](/install-guides/docker/docker-engine/) if needed. +Before you begin, ensure that Docker is installed on both of your development instances. Review the [Docker Install Guide](/install-guides/docker/docker-engine/) if needed. First, clone the demo repo and create xml file called `cycloneDDS.xml` @@ -95,11 +91,11 @@ export COMMON_FILE=/home/ubuntu/openadkit_demo.autoware/docker/etc/simulation/co docker compose -f docker-compose.yml pull ``` -{{% notice info %}} -Each image is around 4–6 GB, so pulling them may vary depending on your network speed. +{{% notice Note %}} +Each image is around 4–6 GB, so the time to download them can vary depending on your network speed. {{% /notice %}} -This command will download all images defined in the docker-compose-2ins.yml file, including: +This command downloads all images defined in the docker-compose-2ins.yml file, including: - odinlmshen/autoware-simulator:v1.0 - odinlmshen/autoware-planning-control:v1.0 - odinlmshen/autoware-visualizer:v1.0 @@ -108,7 +104,7 @@ This command will download all images defined in the docker-compose-2ins.yml fil The cycloneDDS.xml file is used to customize how CycloneDDS (the middleware used by ROS 2) discovers and communicates between distributed nodes. -Please copy the following configuration into docker/cycloneDDS.xml on both machines, and replace the IP addresses with the private IPs of each EC2 instance. +Copy the following configuration into docker/cycloneDDS.xml on both machines, and replace the IP addresses with the private IPs of each EC2 instance: ```xml @@ -153,7 +149,7 @@ This includes removing inter-container dependencies and updating the network and ## Remove cross-container dependency -Since the planning-control and simulator containers will now run on different machines, you must remove any depends_on references between them to prevent Docker from attempting to start them on the same host. +Since the planning-control and simulator containers will run on separate machines, remove any `depends_on` references between them. This prevents Docker from treating them as interdependent services on a single host. ```YAML planning-control: @@ -164,7 +160,8 @@ Since the planning-control and simulator containers will now run on different ma ## Enable host networking -All three containers (visualizer, simulator, planning-control) need access to the host’s network interfaces for DDS-based peer discovery. +All three containers (visualizer, simulator, and planning-control) need access to the host’s network interfaces for DDS-based peer discovery. + Replace Docker's default bridge network with host networking: ```YAML @@ -270,10 +267,10 @@ sudo sysctl net.ipv4.ipfrag_high_thresh=134217728 sudo sysctl -w net.core.rmem_max=2147483647 ``` -Explanation of Parameters -- `net.ipv4.ipfrag_time=3`: Reduces the timeout for holding incomplete IP fragments, helping free up memory more quickly. -- `net.ipv4.ipfrag_high_thresh=134217728`: Increases the memory threshold for IP fragment buffers to 128 MB, preventing early drops under high load. -- `net.core.rmem_max=2147483647`: Expands the maximum socket receive buffer size to support high-throughput DDS traffic. +## Explanation of parameters +- `net.ipv4.ipfrag_time=3`: reduces the timeout for holding incomplete IP fragments, helping free up memory more quickly. +- `net.ipv4.ipfrag_high_thresh=134217728`: increases the memory threshold for IP fragment buffers to 128 MB, preventing early drops under high load. +- `net.core.rmem_max=2147483647`: expands the maximum socket receive buffer size to support high-throughput DDS traffic. To ensure these settings persist after reboot, create a configuration file under /etc/sysctl.d/: @@ -297,14 +294,14 @@ Links to documentation: ## Verify DDS communication between instances using ROS 2 -To confirm that ROS 2 nodes can exchange messages across two separate EC2 instances using DDS, this test will walk you through a minimal publisher–subscriber setup using a custom topic. +To confirm that ROS 2 nodes can exchange messages across two separate EC2 instances using DDS, this test walks you through a minimal publisher-subscriber setup using a custom topic. -## On the Planning-Control Node (Publisher) +## On the planning-control node (publisher) On the first EC2 instance, you will publish a custom message to the /hello topic using ROS 2. This will simulate outbound DDS traffic from the planning-control container. -Set the required environment variables and launch the planning-control container. +Set the required environment variables and launch the planning-control container: ```bash export SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker @@ -326,7 +323,7 @@ ros2 topic list ros2 topic pub /hello std_msgs/String "data: Hello From Planning" --rate 1 ``` -##### On Simulator Node (Subscriber) side +## On the simulator node (subscriber) On the second EC2 instance, you will listen for the /hello topic using ros2 topic echo. This confirms that DDS communication from the planning node is received on the simulation node. @@ -365,7 +362,7 @@ ros2 topic echo /hello In the simulator container, you should see repeated outputs like: {{% notice tip %}} -If the subscriber shows a continuous stream of `/hello` messages, DDS discovery and ROS 2 communication between nodes are working as expected. +If the subscriber shows a continuous stream of `/hello` messages, DDS discovery and ROS 2 communication between the nodes is working as expected. {{% /notice %}} ``` diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index 8e10a4292b..e9a5b691db 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -9,15 +9,15 @@ layout: learningpathall ## What you'll learn in this section -In this section, you'll run the full OpenAD Kit demo across two Arm-based cloud instances using the setup from previous steps. - The OpenAD Kit is an open-source reference design for autonomous driving workloads on Arm. It demonstrates how Autoware modules can run on scalable infrastructure, whether on a single machine or distributed across multiple compute nodes using ROS 2 and DDS. +In this section, you'll run the full OpenAD Kit demo across two Arm-based cloud instances using the setup from previous steps. + ## Set up launch scripts on both instances This setup separates the simulation and visualization environment from the planning and control logic, allowing you to explore how ROS 2 nodes communicate over a distributed system using DDS (Data Distribution Service). -To start the system, run separate launch scripts on each machine. +To start the system, run separate launch scripts on each machine: On each instance, copy the appropriate launch script into the `openadkit_demo.autoware/docker` directory. @@ -84,14 +84,15 @@ On the Simulation and Visualization node, execute: ./opad_sim_vis.sh ``` +Once both machines are running their launch scripts, the Visualizer container exposes a web-accessible interface at: +http://[Visualizer public IP address]:6080/vnc.html -Once both machines are running their respective launch scripts, the Visualizer will generate a web-accessible interface on: +Open this link in your browser to observe the simulation in real time. -http://[Visualizer public IP address]:6080/vnc.html Open this link in your browser to watch the demo, which closely resembles the output in the [previous learning path](http://learn.arm.com/learning-paths/automotive/openadkit1_container/4_run_openadkit/). -![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS alt-text#center](split_aws_run.gif "Figure 4: Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") +![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS alt-text#center](split_aws_run.gif "Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") You’ve now run the OpenAD Kit across two nodes with separated control and visualization roles. DDS enabled real-time, peer-to-peer communication between the ROS 2 nodes, supporting synchronized behavior across the planning and simulation components deployed on two separate instances. From 76df0f324a1216dd88f1a28ce37d6371a87cc1c5 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 12:46:37 +0000 Subject: [PATCH 27/63] Final --- .../4_multiinstance_executing.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md index e9a5b691db..142aa3e88f 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/4_multiinstance_executing.md @@ -84,13 +84,9 @@ On the Simulation and Visualization node, execute: ./opad_sim_vis.sh ``` -Once both machines are running their launch scripts, the Visualizer container exposes a web-accessible interface at: -http://[Visualizer public IP address]:6080/vnc.html +Once both machines are running their launch scripts, the Visualizer container exposes a web-accessible interface at: http://6080/vnc.html. -Open this link in your browser to observe the simulation in real time. - - -Open this link in your browser to watch the demo, which closely resembles the output in the [previous learning path](http://learn.arm.com/learning-paths/automotive/openadkit1_container/4_run_openadkit/). +Open this link in your browser to observe the simulation in real time. The demo closely resembles the output in the [previous Learning Path, Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](http://learn.arm.com/learning-paths/automotive/openadkit1_container/4_run_openadkit/). ![Distributed OpenAD Kit simulation running on two Arm-based instances with visualizer and simulator coordination over DDS alt-text#center](split_aws_run.gif "Visualizer output from a distributed OpenAD Kit simulation showing ROS 2 modules running across two cloud instances using DDS communication.") From 06456d25c0803410e88d8718b8a01bdfd7acfd65 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 12:50:51 +0000 Subject: [PATCH 28/63] removed clutter --- tools/enhanced_style_check.py | 430 --------------------------------- tools/stats_data_generate.py | 432 ---------------------------------- 2 files changed, 862 deletions(-) delete mode 100644 tools/enhanced_style_check.py delete mode 100644 tools/stats_data_generate.py diff --git a/tools/enhanced_style_check.py b/tools/enhanced_style_check.py deleted file mode 100644 index 93de0209af..0000000000 --- a/tools/enhanced_style_check.py +++ /dev/null @@ -1,430 +0,0 @@ - -def extract_sentences_with_matches(text, pattern): - import re - sentences = re.split(r'(?<=[.!?])\s+', text) - matches = [] - for sentence in sentences: - if re.search(pattern, sentence): - matches.append(sentence.strip()) - return matches - -def apply_manual_review_rules(text, rules): - suggestions = [] - for rule in rules: - pattern = re.compile(rule["pattern"]) - matches = pattern.finditer(text) - for match in matches: - sentence = extract_sentences_with_matches(text, rule["pattern"]) - suggestions.append({ - "match": match.group(), - "replacement": rule["replacement"], - "reason": rule["reason"], - "sentence": sentence - }) - return suggestions - - -#!/usr/bin/env python3 -""" -Enhanced style checker for Arm Learning Paths content. -This script checks markdown files against writing style guidelines from a JSON file -and uses spaCy for passive voice detection. -""" - -import argparse -import json -import os -import re -import sys -from pathlib import Path - -# Import spaCy if available -try: - import spacy - SPACY_AVAILABLE = True - # Try to load the English model - try: - nlp = spacy.load("en_core_web_sm") - except: - print("Warning: spaCy model 'en_core_web_sm' not found. Will try to download it.") - try: - from spacy.cli import download - download("en_core_web_sm") - nlp = spacy.load("en_core_web_sm") - print("Successfully downloaded and loaded spaCy model.") - except: - print("Error: Could not download spaCy model. Passive voice detection will be limited.") - SPACY_AVAILABLE = False -except ImportError: - print("Warning: spaCy not installed. Using basic passive voice detection.") - SPACY_AVAILABLE = False - -def load_style_rules(rules_file): - """Load style rules from a JSON file.""" - try: - with open(rules_file, "r", encoding="utf-8") as f: - return json.load(f) - except Exception as e: - print(f"Error loading style rules: {e}") - return [] - -def is_in_code_block(lines, line_index): - """Check if the line is within a code block.""" - code_block_count = 0 - for i in range(line_index): - if re.match(r'^```', lines[i]): - code_block_count += 1 - - return code_block_count % 2 == 1 # Odd count means inside a code block - -def is_in_yaml_frontmatter(lines, line_index): - """Check if the line is within YAML frontmatter.""" - if line_index == 0 and lines[0].strip() == '---': - return True - - frontmatter_markers = 0 - for i in range(line_index): - if lines[i].strip() == '---': - frontmatter_markers += 1 - - # If we've seen an odd number of markers, we're in frontmatter - return frontmatter_markers % 2 == 1 - -def capitalize_if_at_start(original, replacement, match): - """Capitalize the replacement if it's at the start of a sentence.""" - # Check if the match is at the start of the string or after a period and space - start_of_sentence = match.start() == 0 or (match.start() > 1 and original[match.start()-2:match.start()] == '. ') - - if start_of_sentence and replacement and replacement[0].islower(): - return replacement[0].upper() + replacement[1:] - return replacement - -def detect_passive_voice_with_spacy(text): - """ - Detect passive voice using spaCy's dependency parsing. - Returns a list of (passive_text, suggested_active) tuples. - """ - if not SPACY_AVAILABLE: - return [] - - doc = nlp(text) - passive_constructions = [] - - for token in doc: - # Look for passive auxiliary verbs - if token.dep_ == "auxpass": - # Find the main verb - verb = token.head - - # Find the subject (usually nsubjpass) - subject = None - for child in verb.children: - if child.dep_ == "nsubjpass": - subject = child - break - - # Find the agent (usually introduced by "by") - agent = None - for child in verb.children: - if child.dep_ == "agent": - for agent_child in child.children: - if agent_child.dep_ == "pobj": - agent = agent_child - break - break - - # If we have both subject and agent, we can suggest an active voice alternative - if subject and agent: - # Extract the spans of text - passive_span = doc[max(0, subject.i - 1):min(len(doc), verb.i + 2)] - if agent.i > verb.i: - passive_span = doc[max(0, subject.i - 1):min(len(doc), agent.i + 1)] - - # Create active voice suggestion - active_suggestion = f"{agent.text} {verb.lemma_} {subject.text}" - - # Capitalize if at start of sentence - if passive_span.start == 0 or (passive_span.start > 1 and doc[passive_span.start-2].text == '.'): - active_suggestion = active_suggestion[0].upper() + active_suggestion[1:] - - passive_constructions.append((passive_span.text, active_suggestion)) - - return passive_constructions - -def fix_passive_voice(line): - """ - Fix passive voice constructions by swapping subject and object. - This is a more sophisticated approach than simple pattern replacement. - """ - # Common passive voice patterns with specific replacements - passive_patterns = [ - (r'The data is processed by the system', r'The system processes the data'), - (r'The code is handled by the compiler', r'The compiler handles the code'), - (r'The configuration was managed by the user', r'The user managed the configuration'), - (r'The documentation was created by the team', r'The team created the documentation'), - (r'The results are generated by the algorithm', r'The algorithm generates the results'), - (r'The API is provided by the service', r'The service provides the API') - ] - - # Try each specific pattern first - for pattern, replacement in passive_patterns: - if re.search(pattern, line, re.IGNORECASE): - return re.sub(pattern, replacement, line, flags=re.IGNORECASE) - - # Generic patterns as fallback - generic_patterns = [ - # Present tense passive - (r'(\w+) is (\w+ed) by (\w+)', r'\3 \2s \1'), - (r'(\w+) are (\w+ed) by (\w+)', r'\3 \2 \1'), - # Past tense passive - (r'(\w+) was (\w+ed) by (\w+)', r'\3 \2 \1'), - (r'(\w+) were (\w+ed) by (\w+)', r'\3 \2 \1') - ] - - for pattern, replacement in generic_patterns: - if re.search(pattern, line): - return re.sub(pattern, replacement, line) - - return line - -def check_style(content, file_path, style_rules): - """Check content against style rules and return suggestions.""" - suggestions = [] - lines = content.split("\n") - - # First, check for passive voice using spaCy if available - if SPACY_AVAILABLE: - # Process each paragraph separately to maintain context - paragraphs = [] - current_paragraph = [] - - for i, line in enumerate(lines): - # Skip code blocks, YAML frontmatter, headings, and links - if (is_in_code_block(lines, i) or - is_in_yaml_frontmatter(lines, i) or - re.match(r'^#+\s', line) or - re.search(r'^\s*\[.*\]:\s*', line)): - # End the current paragraph if any - if current_paragraph: - paragraphs.append((current_paragraph[0], " ".join(current_paragraph[1]))) - current_paragraph = [] - continue - - # Skip empty lines - they end paragraphs - if not line.strip(): - if current_paragraph: - paragraphs.append((current_paragraph[0], " ".join(current_paragraph[1]))) - current_paragraph = [] - continue - - # Add line to current paragraph - if not current_paragraph: - current_paragraph = [i, [line]] - else: - current_paragraph[1].append(line) - - # Add the last paragraph if any - if current_paragraph: - paragraphs.append((current_paragraph[0], " ".join(current_paragraph[1]))) - - # Check each paragraph for passive voice - for start_line, paragraph_text in paragraphs: - passive_constructions = detect_passive_voice_with_spacy(paragraph_text) - - for passive_text, active_suggestion in passive_constructions: - # Find which line contains this passive construction - line_offset = 0 - for j, line in enumerate(lines[start_line:start_line + 10]): # Look at next 10 lines max - if passive_text in line: - line_index = start_line + j - suggestions.append({ - "file": file_path, - "line": line_index + 1, # 1-based line numbers - "original": line, - "suggested": line.replace(passive_text, active_suggestion), - "reason": "Convert passive voice to active voice for clarity and directness (detected by spaCy)." - }) - break - - # Then check each line against style rules - for i, line in enumerate(lines): - # Skip code blocks and YAML frontmatter - if is_in_code_block(lines, i) or is_in_yaml_frontmatter(lines, i): - continue - - # Skip headings (lines starting with #) - if re.match(r'^#+\s', line): - continue - - # Skip links and image references - if re.search(r'^\s*\[.*\]:\s*', line): - continue - - # Check for passive voice using regex (as fallback) - if not SPACY_AVAILABLE: - passive_patterns = [ - r'\b(?:is|are|was|were)\s+\w+ed\s+by\b', - r'\b(?:is|are|was|were)\s+(?:handled|managed|created|generated|provided)\s+by\b' - ] - - for pattern in passive_patterns: - if re.search(pattern, line, re.IGNORECASE): - # Try to fix passive voice - fixed_line = fix_passive_voice(line) - if fixed_line != line: - suggestions.append({ - "file": file_path, - "line": i + 1, - "original": line, - "suggested": fixed_line, - "reason": "Convert passive voice to active voice for clarity and directness." - }) - # Only one suggestion per line to avoid conflicts - break - - # If we already have a suggestion for this line, skip further checks - if any(sugg["line"] == i + 1 for sugg in suggestions): - continue - - # Check against other style rules - for rule in style_rules: - matches = list(re.finditer(rule["pattern"], line, re.IGNORECASE)) - for match in matches: - # Create a suggestion - original = line - - # Get the matched text - matched_text = match.group(0) - - # Determine if replacement should be capitalized - replacement = rule["replacement"] - if match.start() == 0 or (match.start() >= 2 and line[match.start()-2:match.start()] == '. '): - if replacement and replacement[0].islower(): - replacement = replacement[0].upper() + replacement[1:] - - # Apply the replacement - suggested = line[:match.start()] + replacement + line[match.end():] - - if original != suggested: - suggestions.append({ - "file": file_path, - "line": i + 1, - "original": original, - "suggested": suggested, - "reason": rule["reason"], - }) - # Only one suggestion per line to avoid conflicts - break - - return suggestions - -def save_suggestions_to_file(suggestions, output_file="style_suggestions.json"): - """Save suggestions to a JSON file.""" - with open(output_file, "w") as f: - json.dump(suggestions, f, indent=2) - print(f"Saved suggestions to {output_file}") - -def print_suggestions(suggestions): - """Print suggestions in a readable format.""" - if not suggestions: - print("No style issues found.") - return - - print(f"\nFound {len(suggestions)} style issues:") - print("=" * 80) - - for i, sugg in enumerate(suggestions, 1): - print(f"Issue {i}:") - print(f"File: {sugg['file']}") - print(f"Line: {sugg['line']}") - print(f"Reason: {sugg['reason']}") - print(f"Original: {sugg['original']}") - print(f"Suggested: {sugg['suggested']}") - print("-" * 80) - -def main(): - parser = argparse.ArgumentParser(description="Check markdown files for style issues") - parser.add_argument("--file", help="Path to a specific markdown file to check") - parser.add_argument("--dir", help="Directory containing markdown files to check") - parser.add_argument("--rules", default="tools/style_rules.json", help="JSON file containing style rules") - parser.add_argument("--output", default="style_suggestions.json", help="Output file for suggestions") - parser.add_argument("--install-spacy", action="store_true", help="Install spaCy and download the English model") - args = parser.parse_args() - - # Install spaCy if requested - if args.install_spacy: - print("Installing spaCy and downloading the English model...") - import subprocess - subprocess.call([sys.executable, "-m", "pip", "install", "spacy"]) - subprocess.call([sys.executable, "-m", "spacy", "download", "en_core_web_sm"]) - print("Installation complete. Please run the script again without --install-spacy.") - sys.exit(0) - - if not args.file and not args.dir: - print("Error: Please provide either --file or --dir argument") - sys.exit(1) - - # Load style rules - style_rules = load_style_rules(args.rules) - if not style_rules: - print("Error: No style rules loaded. Check the rules file.") - sys.exit(1) - - print(f"Loaded {len(style_rules)} style rules from {args.rules}") - - all_suggestions = [] - - # Check a specific file - if args.file: - if not os.path.isfile(args.file): - print(f"Error: File not found: {args.file}") - sys.exit(1) - - if not args.file.endswith((".md", ".mdx")): - print(f"Warning: {args.file} is not a markdown file. Checking anyway.") - - with open(args.file, "r", encoding="utf-8") as f: - content = f.read() - - suggestions = check_style(content, args.file, style_rules) - all_suggestions.extend(suggestions) - print(f"Checked {args.file}: Found {len(suggestions)} style issues") - - # Check all markdown files in a directory - if args.dir: - if not os.path.isdir(args.dir): - print(f"Error: Directory not found: {args.dir}") - sys.exit(1) - - for root, _, files in os.walk(args.dir): - for file in files: - if file.endswith((".md", ".mdx")): - file_path = os.path.join(root, file) - with open(file_path, "r", encoding="utf-8") as f: - content = f.read() - - suggestions = check_style(content, file_path, style_rules) - all_suggestions.extend(suggestions) - print(f"Checked {file_path}: Found {len(suggestions)} style issues") - - # Print and save suggestions - print_suggestions(all_suggestions) - save_suggestions_to_file(all_suggestions, args.output) - -if __name__ == "__main__": - main() - - - -def run_manual_review_interactively(text, rules): - updated_text = text - manual_suggestions = apply_manual_review_rules(text, rules) - for suggestion in manual_suggestions: - for sentence in suggestion["sentence"]: - print(f"\nContext: {sentence}") - print(f"Suggestion: Replace '{suggestion['match']}' with '{suggestion['replacement']}'") - print(f"Reason: {suggestion['reason']}") - choice = input("Apply this change? (y/n): ").strip().lower() - if choice == 'y': - updated_text = updated_text.replace(suggestion["match"], suggestion["replacement"], 1) - return updated_text diff --git a/tools/stats_data_generate.py b/tools/stats_data_generate.py deleted file mode 100644 index cb1dd571c0..0000000000 --- a/tools/stats_data_generate.py +++ /dev/null @@ -1,432 +0,0 @@ -# Next steps: -# Add 'cross platform' into category checking and addition -# Record same for install guides -# Verify test data & totals matches reality -# -------- move on to individual_authors&contributors -# -------- move on to GitHub API - - - -''' -Goal: Every week, update the stats_data.yml file automatically by reading the current state and GitHub API - -Steps: - 1) Read in stats_data.yml as a python dict - 2) Verify we can read in new stats, via a function for each datapoint to log - 2a) Directory structure read - 2b) GitHub API obtain data - 3) If we have new data, append to stats_data.yml. If not, fail script to notify GitHub folks -''' - -''' -weekly_in_YYYY_MMM_DD: - 2023-Mar-03: # Date, updated weekly, in YYYY-MMM-DD format - content: # Dict of content related stats. Source: # of LP in each directory - total: 33 # raw sum of all all below - ucontroller: 5 - embedded: 2 - desktop: 1 - server: 10 - mobile: 3 - cross: 2 # Number of learning paths in cross-platform area; for awareness - install_guides: 10 - individual_authors: # Dict of author stats. Source: Crawl over each LP and IG, urlize author name, and add totals - jason_andrews: 24 - pareena_verma: 22 - ronan_synnott: 15 - florent_lebeau: 9 - jane_doe: 2 - john_smith: 2 - contributions: # Dict of contribution stats. Source: Cross-match found author names in LPs and IGs with 'contributors.csv' to identify them as internal (with company Arm) or external (all others) - internal: 70 - external: 4 - issues: # Dict of GitHub issues raised in this repo. Source: GitHub API - avg_close_time_hrs: 42 - percent_closed_vs_total: 90.5 - num_issues: 66 - github_engagement: # Dict of GitHub repo webpage engagement numbers. Source: GitHub API - num_prs: 34 - num_forks: 20 -''' - - -''' ---- -summary: # Basic summary of tests in this site. Source: adding numbers when iterating over sw_categories below - content_total: 30 - content_with_tests_enabled: 10 # Will match the number of learning paths - content_with_all_tests_passing: 9 - - -sw_categories: # Dict of content test status. Source: Iterate over each LP category and IGs _index.md files to scrape data and store in this one place. - server: - intrinsics: - title: Integrate Intrinsics here - tests_and_status: - - amd64/ubuntu:latest: passed - - arm64v8/ubuntu:latest: passed - avh_cicd: - title: AVH Title - tests_and_status: - - RPi3:latest: passed -''' - - - -import os -import sys -import csv -import yaml -import argparse -import requests -from pathlib import Path -from datetime import datetime - - -# Set paths -data_weekly_file_path = Path('../data/stats_weekly_data.yml') -tests_status_file_path = Path('../data/stats_current_test_info.yml') -learning_path_dir = Path('../content/learning-paths/') -install_guide_dir = Path('../content/install-guides/') -lp_and_ig_content_dirs = ['embedded-and-microcontrollers','iot','laptops-and-desktops','servers-and-cloud-computing','mobile-graphics-and-gaming','automotive','cross-platform','install-guides'] - - -# Obtain today's date in YYYY-MM-DD -date_today = datetime.now().strftime("%Y-%m-%d") - -# Set global vars for processing ease -new_weekly_entry = {} -new_tests_entry = {} - -############################################################################# -############################################################################# - - -def pretty(d, indent=0): - for key, value in d.items(): - print('\t' * indent + str(key)) - if isinstance(value, dict): - pretty(value, indent+1) - else: - print('\t' * (indent+1) + str(value)) - -def printInfo(week,test): - print('============================================================================') - print('New weekly entry dict appended:') - pretty(week) - print('============================================================================') - print('New test entry dict overwriting:') - pretty(test) - print('============================================================================') - - -def urlize(in_str): - # Replacate Hugo urlize function to make it easier to process strings for consistent analysis. - # ' ' -> '-' - # capitals -> lowercase - return in_str.replace(' ','-').lower() - -def mdToMetadata(md_file_path): - metadata_text = "" - content_text = "" - inMetadata = False - - # Remove last '---' to propery read in yaml metadata component of .md file - with open(md_file_path, encoding="utf8") as f: - for line in (f.readlines()): - if ('---' in line) and inMetadata: - break # go on when needed to gather content text - elif ('---' in line) and (not inMetadata): - inMetadata = True - metadata_text += line - - # Load yaml - metadata_dic = yaml.safe_load(metadata_text) - return metadata_dic - -def authorAdd(author_names,tracking_dic): - ### Update 'individual_authors' area, raw number by each author. - - # Support multiple authors by iterating through a list. - # First, check if author_name is a list or not. If not, make it a list - if not isinstance(author_names, list): - author_names = [author_names] - for author_name in author_names: - - # Check if author already exists as key. If not, add new key - author_urlized = urlize(author_name) - if author_urlized in tracking_dic['individual_authors']: - # Update number for this author - tracking_dic['individual_authors'][author_urlized] = tracking_dic['individual_authors'][author_urlized] + 1 - else: - # Add key to dic with 1 to their name - tracking_dic['individual_authors'][author_urlized] = 1 - - ### Update 'contributions' area, internal vs external contributions - - # open the contributors CSV file - with open('../assets/contributors.csv', mode ='r')as file: - csvFile = csv.reader(file) - for line in csvFile: - company = line[1] - # If author in the line, check if they work at Arm or not, and increment contributions number for internal or external - if author_name in line: - if company == 'Arm': - tracking_dic['contributions']['internal'] = tracking_dic['contributions']['internal'] + 1 - else: - tracking_dic['contributions']['external'] = tracking_dic['contributions']['external'] + 1 - - return tracking_dic - -def iterateContentIndexMdFiles(): - # set variables to track as we iterate - # weekly -> content: - weekly_count_dic = {'total': 0, 'cross-platform': 0, 'install-guides': 0} - for category in lp_and_ig_content_dirs: - weekly_count_dic[category] = 0 - - # weekly -> authors AND contributions - weekly_authors_contributions_dic = {'individual_authors': {}, 'contributions':{'internal': 0, 'external': 0}} - - # tests -> summary: - content_total = 0 - content_with_tests_enabled = 0 - content_with_all_tests_passing = 0 - - # start iterating over all sw_categories including install guides - for category in lp_and_ig_content_dirs: - new_tests_entry['sw_categories'][category] = {} # Add new category key - - # Get list of content to iterate over. - content_in_dir = [] - if category != 'install-guides': # Learning Path processing - category_dir = learning_path_dir.parent / (learning_path_dir.name + '/' + category) - content_in_dir = [ Path(f.path+"/_index.md") for f in os.scandir(category_dir) if f.is_dir() ] - - else: # Install Guide Processing. ### Get array of install guide files (everything that IS NOT an _index.md file; so count docker_desktop.md seperate than docker_woa.md under docker dir) - for ig in os.scandir(install_guide_dir): - if not ig.is_dir(): - # Append normal .md files - if ig.name != '_index.md': # ignore top level file - content_in_dir.append(Path(ig)) - else: # iterate over multi-layer files - if ig.name != '_images': # ignore image directory - for ig_part in os.scandir(ig): #iterate over all files in multiparge ig dir - if ig_part.name != '_index.md': # ignore top level file - content_in_dir.append(Path(ig_part)) - - - - - # Iterate over all content files - for content_index_file in content_in_dir: - content_metadic = mdToMetadata(content_index_file) - - # If draft, ignore by continuing right away to the next file - try: - if content_metadic['draft']: - continue - except: - pass - # If the example learning path, continue - if '_example-learning-path' in str(content_index_file.parent): - continue - - - # Add to content total (both tests and weekly places for redundency sake) - weekly_count_dic['total'] = weekly_count_dic['total'] + 1 - content_total = content_total + 1 - # Add to category total - weekly_count_dic[category] = weekly_count_dic[category] + 1 - - ######### AUTHOR info - weekly_authors_contributions_dic = authorAdd(content_metadic['author'],weekly_authors_contributions_dic) - - - # Record entry in test file - try: - if content_metadic['test_maintenance']: # if actively being tested, record as such - # Record test - content_with_tests_enabled = content_with_tests_enabled + 1 - - # Add an entry for this dir, with title and test status keys - if category == 'install-guides': # Install Guides, shorthand name is the .md file name itself (for multi-part installs, still the individual file name; dir name is ignored) - content_dir_name = content_index_file.stem - else: # Learning Paths, shorthand name is the directory - content_dir_name = os.path.basename(os.path.dirname(content_index_file)) - - new_tests_entry['sw_categories'][category][content_dir_name] = {} - new_tests_entry['sw_categories'][category][content_dir_name]['readable_title'] = content_metadic['title'] - new_tests_entry['sw_categories'][category][content_dir_name]['tests_and_status'] = [] - all_tests_passing = True # Default to true, change if one is false - for i, item in enumerate(content_metadic['test_status']): - # Record test status (possibily multiple) - new_tests_entry['sw_categories'][category][content_dir_name]['tests_and_status'].append({ - content_metadic['test_images'][i]: content_metadic['test_status'][i] - }) - if item != 'passed': - all_tests_passing = False - # Add if tests are passing count if all tests under this content are passing - if all_tests_passing: - content_with_all_tests_passing = content_with_all_tests_passing + 1 - except: - pass - - # Update all totals for tests passing or not into the summary - new_tests_entry['summary']['content_total'] = content_total - new_tests_entry['summary']['content_with_tests_enabled'] = content_with_tests_enabled - new_tests_entry['summary']['content_with_all_tests_passing'] = content_with_all_tests_passing - - # Update stats - new_weekly_entry['content'] = weekly_count_dic - new_weekly_entry['individual_authors'] = weekly_authors_contributions_dic['individual_authors'] - new_weekly_entry['contributions'] = weekly_authors_contributions_dic['contributions'] - -def callGitHubAPI(GitHub_token,GitHub_repo_name): - - weekly_github_dic = {'issues': {}, 'github_engagement': {}} - - - headers = { - 'Authorization': f'token {GitHub_token}', - 'Accept': 'application/vnd.github.v3+json' - } - url_issues = f'{GitHub_repo_name}issues' - url_pulls = f'{GitHub_repo_name}pulls' - url_forks = f'{GitHub_repo_name}forks' - - # Get Number of Forks - response = requests.get(url_forks, headers=headers) - if response.ok: - forks = response.json() - weekly_github_dic['github_engagement']['num_forks'] = len(forks) - else: - print(f'ERROR: Failed to fetch GitHub API forks: {url_forks} {response.status_code} {response.reason}') - sys.exit(1) - - # Get Number of Pull Requests - response = requests.get(url_pulls, headers=headers) - if response.ok: - pulls = response.json() - weekly_github_dic['github_engagement']['num_prs'] = len(pulls) - else: - print(f'ERROR: Failed to fetch GitHub API forks: {url_pulls} {response.status_code} {response.reason}') - sys.exit(1) - - # Get Issues information - response = requests.get(url_issues, headers=headers) - if response.ok: - issues = response.json() - - # Iterate over each issue and read the state - closed_num = 0 - time_differences = [] - for issue in issues: - if issue['state'] == 'closed': - # Increment number of closed - closed_num = closed_num + 1 - - # Get average time - created_at = datetime.fromisoformat(issue['created_at'][:-1]) - closed_at = datetime.fromisoformat(issue['closed_at'][:-1]) - difference = closed_at - created_at - time_differences.append(difference.total_seconds() / 3600) # Convert to hours - - print(issue['title'],issue['state']) - - # Calculate average time to close - if time_differences: - avg_time_to_close = sum(time_differences) / len(time_differences) - else: - avg_time_to_close = 0 - - # Store all stats in github dic - weekly_github_dic['issues']['num_issues'] = len(issues) - weekly_github_dic['issues']['percent_closed_vs_total'] = round( (closed_num/len(issues)) * 100, 1) - weekly_github_dic['issues']['avg_close_time_hrs'] = round(avg_time_to_close,1) - - else: - print(f'ERROR: Failed to fetch GitHub API issues: {url_issues} {response.status_code} {response.reason}') - sys.exit(1) - - - # Assign to main file - new_weekly_entry['issues'] = weekly_github_dic['issues'] - new_weekly_entry['github_engagement'] = weekly_github_dic['github_engagement'] - - -def main(): - global data_weekly_file_path, tests_status_file_path, learning_path_dir, install_guide_dir, date_today, new_weekly_entry, new_tests_entry - - # Read in params needed for reading GitHub API - arg_parser = argparse.ArgumentParser(description='Update Stats') - arg_parser.add_argument('-t','--token', help='GitHub personal access token', required=True) - arg_parser.add_argument('-r','--repo', help='GitHub repository name', required=True) - args = arg_parser.parse_args() - - - - # Read in data file as python dict - existing_weekly_dic = yaml.safe_load(data_weekly_file_path.read_text()) - existing_tests_dic = yaml.safe_load(tests_status_file_path.read_text()) - - # Structure new data formats: - new_weekly_entry = { - "a_date": date_today, - "content": {}, - "individual_authors": {}, - "contributions": {}, - "issues": {}, - "github_engagement": {} - } - - new_tests_entry = { - "summary": {}, - "sw_categories":{} - } - - - # Get new stats, filling in new stat dictionaries: - iterateContentIndexMdFiles() - callGitHubAPI(args.token, args.repo) - - - - # Debug prints in flow - printInfo(new_weekly_entry,new_tests_entry) - - # Update/replace yaml files - - ### Weekly - # if weekly dict is empty, create key - if not existing_weekly_dic: - print('no existing dic, starting from scratch.') - existing_weekly_dic = [new_weekly_entry] - # Otherwise append it - else: - print('weekly data exists...checking to see if date exists.') - # Check if date already a key in there - exists=False - for dic in existing_weekly_dic: - if date_today == dic["a_date"]: - print('date today included, don"t save') - exists=True - break - if not exists: - print('date doesn"t exist, appending data') - existing_weekly_dic.append(new_weekly_entry) - - # Alter existing dic to be a list of dates for easier processing: - with open(data_weekly_file_path, 'w') as outfile: - print('printing weekly dict format, and dumping into this file: ') - print(outfile) - print(existing_weekly_dic) - yaml.dump(existing_weekly_dic, outfile, default_flow_style=False) - - ### Tests - existing_tests_dic = new_tests_entry - with open(tests_status_file_path, 'w') as outfile: - yaml.dump(existing_tests_dic, outfile, default_flow_style=False) - -if __name__ == "__main__": - main() From aa4e8bd6de75fbb33dda78b5a21bf4217b8ec8b4 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 12:54:27 +0000 Subject: [PATCH 29/63] fixed file name --- .../openadkit2_safetyisolation/{1c_ISO26262.md => 1c_iso26262.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/learning-paths/automotive/openadkit2_safetyisolation/{1c_ISO26262.md => 1c_iso26262.md} (100%) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1c_iso26262.md similarity index 100% rename from content/learning-paths/automotive/openadkit2_safetyisolation/1c_ISO26262.md rename to content/learning-paths/automotive/openadkit2_safetyisolation/1c_iso26262.md From 9e5e2f99982d2e7ddec12148b2607d2cbca5a133 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 12:59:55 +0000 Subject: [PATCH 30/63] Removed clutter --- tools/style_rules.json | 577 ----------------------------------------- 1 file changed, 577 deletions(-) delete mode 100644 tools/style_rules.json diff --git a/tools/style_rules.json b/tools/style_rules.json deleted file mode 100644 index c4967a956c..0000000000 --- a/tools/style_rules.json +++ /dev/null @@ -1,577 +0,0 @@ -[ - { - "pattern": "\\butilize\\b", - "replacement": "use", - "reason": "Use 'use' instead of 'utilize' for simplicity." - }, - { - "pattern": "\\butilizes\\b", - "replacement": "uses", - "reason": "Use 'uses' instead of 'utilizes' for simplicity." - }, - { - "pattern": "\\butilized\\b", - "replacement": "used", - "reason": "Use 'used' instead of 'utilized' for simplicity." - }, - { - "pattern": "\\butilizing\\b", - "replacement": "using", - "reason": "Use 'using' instead of 'utilizing' for simplicity." - }, - { - "pattern": "\\butilization\\b", - "replacement": "use", - "reason": "Use 'use' instead of 'utilization' for simplicity." - }, - { - "pattern": "\\boptimize\\b", - "replacement": "improve", - "reason": "Simplify language by replacing 'optimize' with 'improve'." - }, - { - "pattern": "\\boptimizes\\b", - "replacement": "improves", - "reason": "Simplify language by replacing 'optimizes' with 'improves'." - }, - { - "pattern": "\\boptimized\\b", - "replacement": "improved", - "reason": "Simplify language by replacing 'optimized' with 'improved'." - }, - { - "pattern": "\\boptimizing\\b", - "replacement": "improving", - "reason": "Simplify language by replacing 'optimizing' with 'improving'." - }, - { - "pattern": "\\boptimization\\b", - "replacement": "improvement", - "reason": "Simplify language by replacing 'optimization' with 'improvement'." - }, - { - "pattern": "\\boptimizations\\b", - "replacement": "improvements", - "reason": "Simplify language by replacing 'optimizations' with 'improvements'." - }, - { - "pattern": "\\bin order to\\b", - "replacement": "to", - "reason": "Use 'to' instead of 'in order to' for conciseness." - }, - { - "pattern": "\\bplease note that\\b", - "replacement": "", - "reason": "Remove 'please note that' for directness." - }, - { - "pattern": "\\byou should\\b", - "replacement": "", - "reason": "Be direct with instructions, avoid 'you should'." - }, - { - "pattern": "\\bis able to\\b", - "replacement": "can", - "reason": "Use 'can' instead of 'is able to' for simplicity." - }, - { - "pattern": "\\bare able to\\b", - "replacement": "can", - "reason": "Use 'can' instead of 'are able to' for simplicity." - }, - { - "pattern": "\\bwas able to\\b", - "replacement": "could", - "reason": "Use 'could' instead of 'was able to' for simplicity." - }, - { - "pattern": "\\bwere able to\\b", - "replacement": "could", - "reason": "Use 'could' instead of 'were able to' for simplicity." - }, - { - "pattern": "\\bdue to the fact that\\b", - "replacement": "because", - "reason": "Use 'because' instead of 'due to the fact that' for conciseness." - }, - { - "pattern": "\\bat this point in time\\b", - "replacement": "now", - "reason": "Use 'now' instead of 'at this point in time' for conciseness." - }, - { - "pattern": "\\bfor the purpose of\\b", - "replacement": "for", - "reason": "Use 'for' instead of 'for the purpose of' for conciseness." - }, - { - "pattern": "\\bprior to\\b", - "replacement": "before", - "reason": "Use 'before' instead of 'prior to' for simplicity." - }, - { - "pattern": "\\bsubsequent to\\b", - "replacement": "after", - "reason": "Use 'after' instead of 'subsequent to' for simplicity." - }, - { - "pattern": "\\ba large number of\\b", - "replacement": "many", - "reason": "Use 'many' instead of 'a large number of' for conciseness." - }, - { - "pattern": "\\ba majority of\\b", - "replacement": "most", - "reason": "Use 'most' instead of 'a majority of' for conciseness." - }, - { - "pattern": "\\bin spite of\\b", - "replacement": "despite", - "reason": "Use 'despite' instead of 'in spite of' for conciseness." - }, - { - "pattern": "\\bwith regard to\\b", - "replacement": "about", - "reason": "Use 'about' instead of 'with regard to' for conciseness." - }, - { - "pattern": "\\bwith respect to\\b", - "replacement": "about", - "reason": "Use 'about' instead of 'with respect to' for conciseness." - }, - { - "pattern": "\\bwe recommend\\b", - "replacement": "it is recommended", - "reason": "Use 'it is recommended' instead of 'we recommend' for a more neutral tone." - }, - { - "pattern": "\\bwe suggest\\b", - "replacement": "it is suggested", - "reason": "Use 'it is suggested' instead of 'we suggest' for a more neutral tone." - }, - { - "pattern": "\\bwe advise\\b", - "replacement": "it is advised", - "reason": "Use 'it is advised' instead of 'we advise' for a more neutral tone." - }, - { - "pattern": "\\bwe will\\b", - "replacement": "you will", - "reason": "Use 'you will' instead of 'we will' to address the reader directly." - }, - { - "pattern": "\\bwe can\\b", - "replacement": "you can", - "reason": "Use 'you can' instead of 'we can' to address the reader directly." - }, - { - "pattern": "\\bwe have\\b", - "replacement": "you have", - "reason": "Use 'you have' instead of 'we have' to address the reader directly." - }, - { - "pattern": "\\bwe are\\b", - "replacement": "you are", - "reason": "Use 'you are' instead of 'we are' to address the reader directly." - }, - { - "pattern": "\\bwe need to\\b", - "replacement": "you need to", - "reason": "Use 'you need to' instead of 'we need to' to address the reader directly." - }, - { - "pattern": "\\bwe must\\b", - "replacement": "you must", - "reason": "Use 'you must' instead of 'we must' to address the reader directly." - }, - { - "pattern": "\\bwe should\\b", - "replacement": "you should", - "reason": "Use 'you should' instead of 'we should' to address the reader directly." - }, - { - "pattern": "\\bis processed by\\b", - "replacement": "processes", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bare processed by\\b", - "replacement": "process", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwas processed by\\b", - "replacement": "processed", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwere processed by\\b", - "replacement": "processed", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bis handled by\\b", - "replacement": "handles", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bare handled by\\b", - "replacement": "handle", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwas handled by\\b", - "replacement": "handled", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwere handled by\\b", - "replacement": "handled", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bis managed by\\b", - "replacement": "manages", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bare managed by\\b", - "replacement": "manage", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwas managed by\\b", - "replacement": "managed", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwere managed by\\b", - "replacement": "managed", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bis created by\\b", - "replacement": "creates", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bare created by\\b", - "replacement": "create", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwas created by\\b", - "replacement": "created", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwere created by\\b", - "replacement": "created", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bis generated by\\b", - "replacement": "generates", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bare generated by\\b", - "replacement": "generate", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwas generated by\\b", - "replacement": "generated", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwere generated by\\b", - "replacement": "generated", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bis provided by\\b", - "replacement": "provides", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bare provided by\\b", - "replacement": "provide", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwas provided by\\b", - "replacement": "provided", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bwere provided by\\b", - "replacement": "provided", - "reason": "Use active voice instead of passive voice." - }, - { - "pattern": "\\bARM\\b", - "replacement": "Arm", - "reason": "Use 'Arm' instead of 'ARM' for clarity or consistency." - }, - { - "pattern": "\\bARM's\\b", - "replacement": "Arm's", - "reason": "Use 'Arm's' instead of 'ARM's' for clarity or consistency." - }, - { - "pattern": "\\badaptor\\b", - "replacement": "adapter", - "reason": "Use 'adapter' instead of 'adaptor' for clarity or consistency." - }, - { - "pattern": "\\banalyse\\b", - "replacement": "analyze", - "reason": "Use 'analyze' instead of 'analyse' for clarity or consistency." - }, - { - "pattern": "\\bback\\-end\\b", - "replacement": "backend", - "reason": "Use 'backend' instead of 'back-end' for clarity or consistency." - }, - { - "pattern": "\\bcustom\\-made\\b", - "replacement": "custom-built", - "reason": "Use 'custom-built' instead of 'custom-made' for clarity or consistency." - }, - { - "pattern": "\\bdouble\\-click\\b", - "replacement": "double-tap", - "reason": "Use 'double-tap' instead of 'double-click' for clarity or consistency." - }, - { - "pattern": "\\beasy\\ to\\ use\\b", - "replacement": "easy-to-use", - "reason": "Use 'easy-to-use' instead of 'easy to use' for clarity or consistency." - }, - { - "pattern": "\\beliminate\\b", - "replacement": "remove", - "reason": "Use 'remove' instead of 'eliminate' for clarity or consistency." - }, - { - "pattern": "\\bextract\\b", - "replacement": "remove", - "reason": "Use 'remove' instead of 'extract' for clarity or consistency." - }, - { - "pattern": "\\btake\\ away\\b", - "replacement": "remove", - "reason": "Use 'remove' instead of 'take away' for clarity or consistency." - }, - { - "pattern": "\\be\\.g\\.\\b", - "replacement": "for example", - "reason": "Use 'for example' instead of 'e.g.' for clarity or consistency." - }, - { - "pattern": "\\bi\\.e\\.\\b", - "replacement": "that is", - "reason": "Use 'that is' instead of 'i.e.' for clarity or consistency." - }, - { - "pattern": "\\bergo\\b", - "replacement": "therefore", - "reason": "Use 'therefore' instead of 'ergo' for clarity or consistency." - }, - { - "pattern": "\\bdo\\ not\\b", - "replacement": "don't", - "reason": "Use 'don't' instead of 'do not' for clarity or consistency." - }, - { - "pattern": "\\bit\\ is\\b", - "replacement": "it's", - "reason": "Use 'it's' instead of 'it is' for clarity or consistency." - }, - { - "pattern": "\\bis\\ not\\b", - "replacement": "isn't", - "reason": "Use 'isn't' instead of 'is not' for clarity or consistency." - }, - { - "pattern": "\\bthat\\ is\\b", - "replacement": "that's", - "reason": "Use 'that's' instead of 'that is' for clarity or consistency." - }, - { - "pattern": "\\bviz\\.\\b", - "replacement": "namely", - "reason": "Use 'namely' instead of 'viz.' for clarity or consistency." - }, - { - "pattern": "\\btry\\ not\\ to\\b", - "replacement": "avoid", - "reason": "Use 'avoid' instead of 'try not to' for clarity or consistency." - }, - { - "pattern": "\\brefer\\ to\\b", - "replacement": "see", - "reason": "Use 'see' instead of 'refer to' for clarity or consistency." - }, - { - "pattern": "\\bsub\\-optimal\\b", - "replacement": "suboptimal", - "reason": "Use 'suboptimal' instead of 'sub-optimal' for clarity or consistency." - }, - { - "pattern": "\\bserver\\-less\\b", - "replacement": "serverless", - "reason": "Use 'serverless' instead of 'server-less' for clarity or consistency." - }, - { - "pattern": "\\btouch\\ screen\\b", - "replacement": "touchscreen", - "reason": "Use 'touchscreen' instead of 'touch screen' for clarity or consistency." - }, - { - "pattern": "\\bctrl\\ key\\b", - "replacement": "Ctrl key", - "reason": "Use 'Ctrl key' instead of 'ctrl key' for clarity or consistency." - }, - { - "pattern": "\\bspot\\b", - "replacement": "identify", - "reason": "Use 'identify' instead of 'spot' for clarity or consistency." - }, - { - "pattern": "\\bleverage\\b", - "replacement": "take advantage of", - "reason": "Use 'take advantage of' instead of 'leverage' for clarity or consistency." - }, - { - "pattern": "\\blicence\\b", - "replacement": "license", - "reason": "Use 'license' instead of 'licence' for clarity or consistency." - }, - { - "pattern": "\\bmassive\\b", - "replacement": "significant", - "reason": "Use 'significant' instead of 'massive' for clarity or consistency." - }, - { - "pattern": "\\brespond\\ to\\ the\\ ask\\b", - "replacement": "respond to the request", - "reason": "Use 'respond to the request' instead of 'respond to the ask' for clarity or consistency." - }, - { - "pattern": "\\brevert\\ back\\ to\\b", - "replacement": "revert to", - "reason": "Use 'revert to' instead of 'revert back to' for clarity or consistency." - }, - { - "pattern": "\\bpower\\ off\\b", - "replacement": "turn off", - "reason": "Use 'turn off' instead of 'power off' for clarity or consistency." - }, - { - "pattern": "\\bpower\\ on\\b", - "replacement": "turn on", - "reason": "Use 'turn on' instead of 'power on' for clarity or consistency." - }, - { - "pattern": "\\bpress\\b", - "replacement": "select", - "reason": "Use 'select' instead of 'press' for clarity or consistency." - }, - { - "pattern": "\\bsmart\\ technology\\b", - "replacement": "intelligent technology", - "reason": "Use 'intelligent technology' instead of 'smart technology' for clarity or consistency." - }, - { - "pattern": "\\blearning\\ path\\b", - "replacement": "Learning Path", - "reason": "Use 'Learning Path' instead of 'learning path' for clarity or consistency." - }, - { - "pattern": "\\bwearable\\b", - "replacement": "wearable device", - "reason": "Use 'wearable device' instead of 'wearable' for clarity or consistency." - }, - { - "pattern": "\\bGB\\ per\\ second\\b", - "replacement": "Gbps", - "reason": "Use 'Gbps' instead of 'GB per second' for clarity or consistency." - }, - { - "pattern": "\\bkey\\ combination\\b", - "replacement": "keyboard shortcut", - "reason": "Use 'keyboard shortcut' instead of 'key combination' for clarity or consistency." - }, - { - "pattern": "\\blearn\\ how\\ to\\ use\\b", - "replacement": "use", - "reason": "Use 'use' instead of 'learn how to use' for clarity or consistency." - }, - { - "pattern": "\\brequire\\b", - "replacement": "need", - "reason": "Use 'need' instead of 'require' for clarity or consistency." - }, - { - "pattern": "\\bFollow\\ the\\ steps\\ below\\ to\\b", - "replacement": "To", - "reason": "Use 'To' instead of 'Follow the steps below to' for clarity or consistency." - }, - { - "pattern": "\\bwe\\ observe\\b", - "replacement": "you can see", - "reason": "Use 'you can see' instead of 'we observe' for clarity or consistency." - }, - { - "pattern": "\\bmay\\b", - "replacement": "can", - "reason": "Use 'can' instead of 'may' for clarity or consistency." - }, - { - "pattern": "\\bwould\\b", - "replacement": "does", - "reason": "Use 'does' instead of 'would' for clarity or consistency." - }, - { - "pattern": "\\bwe\\b", - "replacement": "you", - "reason": "Use 'you' instead of 'we' for clarity or consistency." - }, - { - "pattern": "\\byou\\ are\\b", - "replacement": "you're", - "reason": "Use 'you're' instead of 'you are' for clarity or consistency." - }, - { - "pattern": "\\byou\\ will\\b", - "replacement": "you'll", - "reason": "Use 'you'll' instead of 'you will' for clarity or consistency." - }, - { - "pattern": "\\bCloud\\ Native\\b", - "replacement": "cloud native", - "reason": "Use 'cloud native' instead of 'Cloud Native' for clarity or consistency." - }, - { - "pattern": "\\bseeking\\ to\\b", - "replacement": "looking to", - "reason": "Use 'looking to' instead of 'seeking to' for clarity or consistency." - }, - { - "pattern": "\\bsince\\b", - "replacement": "because", - "reason": "Use 'because' instead of 'since' for clarity or consistency." - }, - { - "pattern": "\\bin\\ addition\\b", - "replacement": "also", - "reason": "Use 'also' instead of 'in addition' for clarity or consistency." - }, - { - "pattern": "\\bimpact\\ performance\\b", - "replacement": "affect performance", - "reason": "Use 'affect performance' instead of 'impact performance' for clarity or consistency." - } -] \ No newline at end of file From 39d8ff7bf435d9c923632a8eabb9ed022a0d36ba Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 13:05:55 +0000 Subject: [PATCH 31/63] fixed file name --- ...nt functional_safety.md => 1e_implement_ functional_safety.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/learning-paths/automotive/openadkit2_safetyisolation/{1e_implement functional_safety.md => 1e_implement_ functional_safety.md} (100%) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement_ functional_safety.md similarity index 100% rename from content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement functional_safety.md rename to content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement_ functional_safety.md From 1511eb7f083dd7a76a9e9121e3a6947a6b2b49f8 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 13:12:46 +0000 Subject: [PATCH 32/63] final time lucky! --- ...nt_ functional_safety.md => 1e_implement_functional_safety.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/learning-paths/automotive/openadkit2_safetyisolation/{1e_implement_ functional_safety.md => 1e_implement_functional_safety.md} (100%) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement_ functional_safety.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement_functional_safety.md similarity index 100% rename from content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement_ functional_safety.md rename to content/learning-paths/automotive/openadkit2_safetyisolation/1e_implement_functional_safety.md From dc97eddd0bb5995daa253ca03a841b4bfd61dd1c Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 09:54:08 -0400 Subject: [PATCH 33/63] Update _index.md --- .../visualizing-ethos-u-performance/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/_index.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/_index.md index 71ce781eab..613a355ee5 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/_index.md @@ -7,11 +7,11 @@ cascade: minutes_to_complete: 120 -who_is_this_for: This is an introductory topic for developers and data scientists new to Tiny Machine Learning (TinyML), who want to visualize ExecuTorch performance on a virtual device. +who_is_this_for: This is an introductory topic for developers and data scientists new to Tiny Machine Learning (TinyML), who want to understand and visualize ExecuTorch performance on a virtual device. learning_objectives: - Identify suitable Arm-based devices for TinyML applications. - - Optionally, install Fixed Virtual Platforms (FVPs) on MacOS. + - Install Fixed Virtual Platforms (FVPs). - Deploy a TinyML ExecuTorch model to a Corstone-320 FVP. - Observe model execution on the FVP's graphical user interface (GUI). From 632ef245e538061d4a9cf03b058cba22942cf84b Mon Sep 17 00:00:00 2001 From: Maddy Underwood <167196745+madeline-underwood@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:13:50 +0100 Subject: [PATCH 34/63] Add files via upload --- tools/stats_data_generate.py | 432 +++++++++++++++++++++++++++++++++++ 1 file changed, 432 insertions(+) create mode 100644 tools/stats_data_generate.py diff --git a/tools/stats_data_generate.py b/tools/stats_data_generate.py new file mode 100644 index 0000000000..cb1dd571c0 --- /dev/null +++ b/tools/stats_data_generate.py @@ -0,0 +1,432 @@ +# Next steps: +# Add 'cross platform' into category checking and addition +# Record same for install guides +# Verify test data & totals matches reality +# -------- move on to individual_authors&contributors +# -------- move on to GitHub API + + + +''' +Goal: Every week, update the stats_data.yml file automatically by reading the current state and GitHub API + +Steps: + 1) Read in stats_data.yml as a python dict + 2) Verify we can read in new stats, via a function for each datapoint to log + 2a) Directory structure read + 2b) GitHub API obtain data + 3) If we have new data, append to stats_data.yml. If not, fail script to notify GitHub folks +''' + +''' +weekly_in_YYYY_MMM_DD: + 2023-Mar-03: # Date, updated weekly, in YYYY-MMM-DD format + content: # Dict of content related stats. Source: # of LP in each directory + total: 33 # raw sum of all all below + ucontroller: 5 + embedded: 2 + desktop: 1 + server: 10 + mobile: 3 + cross: 2 # Number of learning paths in cross-platform area; for awareness + install_guides: 10 + individual_authors: # Dict of author stats. Source: Crawl over each LP and IG, urlize author name, and add totals + jason_andrews: 24 + pareena_verma: 22 + ronan_synnott: 15 + florent_lebeau: 9 + jane_doe: 2 + john_smith: 2 + contributions: # Dict of contribution stats. Source: Cross-match found author names in LPs and IGs with 'contributors.csv' to identify them as internal (with company Arm) or external (all others) + internal: 70 + external: 4 + issues: # Dict of GitHub issues raised in this repo. Source: GitHub API + avg_close_time_hrs: 42 + percent_closed_vs_total: 90.5 + num_issues: 66 + github_engagement: # Dict of GitHub repo webpage engagement numbers. Source: GitHub API + num_prs: 34 + num_forks: 20 +''' + + +''' +--- +summary: # Basic summary of tests in this site. Source: adding numbers when iterating over sw_categories below + content_total: 30 + content_with_tests_enabled: 10 # Will match the number of learning paths + content_with_all_tests_passing: 9 + + +sw_categories: # Dict of content test status. Source: Iterate over each LP category and IGs _index.md files to scrape data and store in this one place. + server: + intrinsics: + title: Integrate Intrinsics here + tests_and_status: + - amd64/ubuntu:latest: passed + - arm64v8/ubuntu:latest: passed + avh_cicd: + title: AVH Title + tests_and_status: + - RPi3:latest: passed +''' + + + +import os +import sys +import csv +import yaml +import argparse +import requests +from pathlib import Path +from datetime import datetime + + +# Set paths +data_weekly_file_path = Path('../data/stats_weekly_data.yml') +tests_status_file_path = Path('../data/stats_current_test_info.yml') +learning_path_dir = Path('../content/learning-paths/') +install_guide_dir = Path('../content/install-guides/') +lp_and_ig_content_dirs = ['embedded-and-microcontrollers','iot','laptops-and-desktops','servers-and-cloud-computing','mobile-graphics-and-gaming','automotive','cross-platform','install-guides'] + + +# Obtain today's date in YYYY-MM-DD +date_today = datetime.now().strftime("%Y-%m-%d") + +# Set global vars for processing ease +new_weekly_entry = {} +new_tests_entry = {} + +############################################################################# +############################################################################# + + +def pretty(d, indent=0): + for key, value in d.items(): + print('\t' * indent + str(key)) + if isinstance(value, dict): + pretty(value, indent+1) + else: + print('\t' * (indent+1) + str(value)) + +def printInfo(week,test): + print('============================================================================') + print('New weekly entry dict appended:') + pretty(week) + print('============================================================================') + print('New test entry dict overwriting:') + pretty(test) + print('============================================================================') + + +def urlize(in_str): + # Replacate Hugo urlize function to make it easier to process strings for consistent analysis. + # ' ' -> '-' + # capitals -> lowercase + return in_str.replace(' ','-').lower() + +def mdToMetadata(md_file_path): + metadata_text = "" + content_text = "" + inMetadata = False + + # Remove last '---' to propery read in yaml metadata component of .md file + with open(md_file_path, encoding="utf8") as f: + for line in (f.readlines()): + if ('---' in line) and inMetadata: + break # go on when needed to gather content text + elif ('---' in line) and (not inMetadata): + inMetadata = True + metadata_text += line + + # Load yaml + metadata_dic = yaml.safe_load(metadata_text) + return metadata_dic + +def authorAdd(author_names,tracking_dic): + ### Update 'individual_authors' area, raw number by each author. + + # Support multiple authors by iterating through a list. + # First, check if author_name is a list or not. If not, make it a list + if not isinstance(author_names, list): + author_names = [author_names] + for author_name in author_names: + + # Check if author already exists as key. If not, add new key + author_urlized = urlize(author_name) + if author_urlized in tracking_dic['individual_authors']: + # Update number for this author + tracking_dic['individual_authors'][author_urlized] = tracking_dic['individual_authors'][author_urlized] + 1 + else: + # Add key to dic with 1 to their name + tracking_dic['individual_authors'][author_urlized] = 1 + + ### Update 'contributions' area, internal vs external contributions + + # open the contributors CSV file + with open('../assets/contributors.csv', mode ='r')as file: + csvFile = csv.reader(file) + for line in csvFile: + company = line[1] + # If author in the line, check if they work at Arm or not, and increment contributions number for internal or external + if author_name in line: + if company == 'Arm': + tracking_dic['contributions']['internal'] = tracking_dic['contributions']['internal'] + 1 + else: + tracking_dic['contributions']['external'] = tracking_dic['contributions']['external'] + 1 + + return tracking_dic + +def iterateContentIndexMdFiles(): + # set variables to track as we iterate + # weekly -> content: + weekly_count_dic = {'total': 0, 'cross-platform': 0, 'install-guides': 0} + for category in lp_and_ig_content_dirs: + weekly_count_dic[category] = 0 + + # weekly -> authors AND contributions + weekly_authors_contributions_dic = {'individual_authors': {}, 'contributions':{'internal': 0, 'external': 0}} + + # tests -> summary: + content_total = 0 + content_with_tests_enabled = 0 + content_with_all_tests_passing = 0 + + # start iterating over all sw_categories including install guides + for category in lp_and_ig_content_dirs: + new_tests_entry['sw_categories'][category] = {} # Add new category key + + # Get list of content to iterate over. + content_in_dir = [] + if category != 'install-guides': # Learning Path processing + category_dir = learning_path_dir.parent / (learning_path_dir.name + '/' + category) + content_in_dir = [ Path(f.path+"/_index.md") for f in os.scandir(category_dir) if f.is_dir() ] + + else: # Install Guide Processing. ### Get array of install guide files (everything that IS NOT an _index.md file; so count docker_desktop.md seperate than docker_woa.md under docker dir) + for ig in os.scandir(install_guide_dir): + if not ig.is_dir(): + # Append normal .md files + if ig.name != '_index.md': # ignore top level file + content_in_dir.append(Path(ig)) + else: # iterate over multi-layer files + if ig.name != '_images': # ignore image directory + for ig_part in os.scandir(ig): #iterate over all files in multiparge ig dir + if ig_part.name != '_index.md': # ignore top level file + content_in_dir.append(Path(ig_part)) + + + + + # Iterate over all content files + for content_index_file in content_in_dir: + content_metadic = mdToMetadata(content_index_file) + + # If draft, ignore by continuing right away to the next file + try: + if content_metadic['draft']: + continue + except: + pass + # If the example learning path, continue + if '_example-learning-path' in str(content_index_file.parent): + continue + + + # Add to content total (both tests and weekly places for redundency sake) + weekly_count_dic['total'] = weekly_count_dic['total'] + 1 + content_total = content_total + 1 + # Add to category total + weekly_count_dic[category] = weekly_count_dic[category] + 1 + + ######### AUTHOR info + weekly_authors_contributions_dic = authorAdd(content_metadic['author'],weekly_authors_contributions_dic) + + + # Record entry in test file + try: + if content_metadic['test_maintenance']: # if actively being tested, record as such + # Record test + content_with_tests_enabled = content_with_tests_enabled + 1 + + # Add an entry for this dir, with title and test status keys + if category == 'install-guides': # Install Guides, shorthand name is the .md file name itself (for multi-part installs, still the individual file name; dir name is ignored) + content_dir_name = content_index_file.stem + else: # Learning Paths, shorthand name is the directory + content_dir_name = os.path.basename(os.path.dirname(content_index_file)) + + new_tests_entry['sw_categories'][category][content_dir_name] = {} + new_tests_entry['sw_categories'][category][content_dir_name]['readable_title'] = content_metadic['title'] + new_tests_entry['sw_categories'][category][content_dir_name]['tests_and_status'] = [] + all_tests_passing = True # Default to true, change if one is false + for i, item in enumerate(content_metadic['test_status']): + # Record test status (possibily multiple) + new_tests_entry['sw_categories'][category][content_dir_name]['tests_and_status'].append({ + content_metadic['test_images'][i]: content_metadic['test_status'][i] + }) + if item != 'passed': + all_tests_passing = False + # Add if tests are passing count if all tests under this content are passing + if all_tests_passing: + content_with_all_tests_passing = content_with_all_tests_passing + 1 + except: + pass + + # Update all totals for tests passing or not into the summary + new_tests_entry['summary']['content_total'] = content_total + new_tests_entry['summary']['content_with_tests_enabled'] = content_with_tests_enabled + new_tests_entry['summary']['content_with_all_tests_passing'] = content_with_all_tests_passing + + # Update stats + new_weekly_entry['content'] = weekly_count_dic + new_weekly_entry['individual_authors'] = weekly_authors_contributions_dic['individual_authors'] + new_weekly_entry['contributions'] = weekly_authors_contributions_dic['contributions'] + +def callGitHubAPI(GitHub_token,GitHub_repo_name): + + weekly_github_dic = {'issues': {}, 'github_engagement': {}} + + + headers = { + 'Authorization': f'token {GitHub_token}', + 'Accept': 'application/vnd.github.v3+json' + } + url_issues = f'{GitHub_repo_name}issues' + url_pulls = f'{GitHub_repo_name}pulls' + url_forks = f'{GitHub_repo_name}forks' + + # Get Number of Forks + response = requests.get(url_forks, headers=headers) + if response.ok: + forks = response.json() + weekly_github_dic['github_engagement']['num_forks'] = len(forks) + else: + print(f'ERROR: Failed to fetch GitHub API forks: {url_forks} {response.status_code} {response.reason}') + sys.exit(1) + + # Get Number of Pull Requests + response = requests.get(url_pulls, headers=headers) + if response.ok: + pulls = response.json() + weekly_github_dic['github_engagement']['num_prs'] = len(pulls) + else: + print(f'ERROR: Failed to fetch GitHub API forks: {url_pulls} {response.status_code} {response.reason}') + sys.exit(1) + + # Get Issues information + response = requests.get(url_issues, headers=headers) + if response.ok: + issues = response.json() + + # Iterate over each issue and read the state + closed_num = 0 + time_differences = [] + for issue in issues: + if issue['state'] == 'closed': + # Increment number of closed + closed_num = closed_num + 1 + + # Get average time + created_at = datetime.fromisoformat(issue['created_at'][:-1]) + closed_at = datetime.fromisoformat(issue['closed_at'][:-1]) + difference = closed_at - created_at + time_differences.append(difference.total_seconds() / 3600) # Convert to hours + + print(issue['title'],issue['state']) + + # Calculate average time to close + if time_differences: + avg_time_to_close = sum(time_differences) / len(time_differences) + else: + avg_time_to_close = 0 + + # Store all stats in github dic + weekly_github_dic['issues']['num_issues'] = len(issues) + weekly_github_dic['issues']['percent_closed_vs_total'] = round( (closed_num/len(issues)) * 100, 1) + weekly_github_dic['issues']['avg_close_time_hrs'] = round(avg_time_to_close,1) + + else: + print(f'ERROR: Failed to fetch GitHub API issues: {url_issues} {response.status_code} {response.reason}') + sys.exit(1) + + + # Assign to main file + new_weekly_entry['issues'] = weekly_github_dic['issues'] + new_weekly_entry['github_engagement'] = weekly_github_dic['github_engagement'] + + +def main(): + global data_weekly_file_path, tests_status_file_path, learning_path_dir, install_guide_dir, date_today, new_weekly_entry, new_tests_entry + + # Read in params needed for reading GitHub API + arg_parser = argparse.ArgumentParser(description='Update Stats') + arg_parser.add_argument('-t','--token', help='GitHub personal access token', required=True) + arg_parser.add_argument('-r','--repo', help='GitHub repository name', required=True) + args = arg_parser.parse_args() + + + + # Read in data file as python dict + existing_weekly_dic = yaml.safe_load(data_weekly_file_path.read_text()) + existing_tests_dic = yaml.safe_load(tests_status_file_path.read_text()) + + # Structure new data formats: + new_weekly_entry = { + "a_date": date_today, + "content": {}, + "individual_authors": {}, + "contributions": {}, + "issues": {}, + "github_engagement": {} + } + + new_tests_entry = { + "summary": {}, + "sw_categories":{} + } + + + # Get new stats, filling in new stat dictionaries: + iterateContentIndexMdFiles() + callGitHubAPI(args.token, args.repo) + + + + # Debug prints in flow + printInfo(new_weekly_entry,new_tests_entry) + + # Update/replace yaml files + + ### Weekly + # if weekly dict is empty, create key + if not existing_weekly_dic: + print('no existing dic, starting from scratch.') + existing_weekly_dic = [new_weekly_entry] + # Otherwise append it + else: + print('weekly data exists...checking to see if date exists.') + # Check if date already a key in there + exists=False + for dic in existing_weekly_dic: + if date_today == dic["a_date"]: + print('date today included, don"t save') + exists=True + break + if not exists: + print('date doesn"t exist, appending data') + existing_weekly_dic.append(new_weekly_entry) + + # Alter existing dic to be a list of dates for easier processing: + with open(data_weekly_file_path, 'w') as outfile: + print('printing weekly dict format, and dumping into this file: ') + print(outfile) + print(existing_weekly_dic) + yaml.dump(existing_weekly_dic, outfile, default_flow_style=False) + + ### Tests + existing_tests_dic = new_tests_entry + with open(tests_status_file_path, 'w') as outfile: + yaml.dump(existing_tests_dic, outfile, default_flow_style=False) + +if __name__ == "__main__": + main() From 6ec8adbbb0c629e5ad82e8362c278182f926dda9 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 10:49:03 -0400 Subject: [PATCH 35/63] Update 2-env-setup.md --- .../visualizing-ethos-u-performance/2-env-setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-env-setup.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-env-setup.md index ed0a605229..2787107f19 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-env-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-env-setup.md @@ -50,7 +50,7 @@ Run the commands below to set up the ExecuTorch internal dependencies: ```bash git submodule sync -git submodule update --init +git submodule update --init --recursive ./install_executorch.sh ``` @@ -70,7 +70,7 @@ pip list | grep executorch ``` ```output -executorch 0.6.0a0+3eea1f1 +executorch 0.8.0a0+92fb0cc ``` ## Next Steps From bf39a134a0381ca9634e6e6177fae2846568b72a Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 15:44:51 +0000 Subject: [PATCH 36/63] Added commenting in code to address review comments. --- .../openadkit2_safetyisolation/3_container_spliting.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md index 6c5809f0cd..b4db0659d8 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/3_container_spliting.md @@ -124,7 +124,8 @@ Copy the following configuration into docker/cycloneDDS.xml on both machines, an 1000 auto - + + @@ -304,6 +305,7 @@ This will simulate outbound DDS traffic from the planning-control container. Set the required environment variables and launch the planning-control container: ```bash +# Replace this path with the location where you cloned the repository, if different export SCRIPT_DIR=/home/ubuntu/openadkit_demo.autoware/docker export CONF_FILE=$SCRIPT_DIR/etc/simulation/config/fail_static_obstacle_avoidance.param.yaml export COMMON_FILE=$SCRIPT_DIR/etc/simulation/config/common.param.yaml From 3fff2f4dbe5207c058e6604e5f3556306187c0a1 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 12:27:15 -0400 Subject: [PATCH 37/63] Update 3-env-setup-fvp.md --- .../visualizing-ethos-u-performance/3-env-setup-fvp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md index 43662d7525..cfcc80f291 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md @@ -18,7 +18,7 @@ The Corstone reference system is provided free of charge, although you will have {{% notice macOS %}} -Setting up FVPs on MacOS requires some extra steps, outlined in GitHub repo [VPs-on-Mac](https://github.com/Arm-Examples/FVPs-on-Mac/). macOS users must do this first, before setting up the Corestone-320 FVP. +Setting up FVPs on MacOS requires some extra steps, outlined in GitHub repo [FVPs-on-Mac](https://github.com/Arm-Examples/FVPs-on-Mac/). macOS users must do this first, before setting up the Corestone-320 FVP. {{% /notice %}} @@ -49,4 +49,4 @@ Test that the setup was successful by running the `run.sh` script for Ethos-U85, You will see a number of examples run on the FVP. -This confirms the installation, so you can now proceed to the Learning Path [Build a Simple PyTorch Model](/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model/). \ No newline at end of file +This confirms the installation, so you can now proceed to the Learning Path [Build a Simple PyTorch Model](/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model/). From 0e970bc24c8819b69b8208b67c9a23b25d7a2e76 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 12:27:37 -0400 Subject: [PATCH 38/63] Update 3-env-setup-fvp.md --- .../visualizing-ethos-u-performance/3-env-setup-fvp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md index cfcc80f291..5f5edb0c90 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md @@ -18,7 +18,7 @@ The Corstone reference system is provided free of charge, although you will have {{% notice macOS %}} -Setting up FVPs on MacOS requires some extra steps, outlined in GitHub repo [FVPs-on-Mac](https://github.com/Arm-Examples/FVPs-on-Mac/). macOS users must do this first, before setting up the Corestone-320 FVP. +Setting up FVPs on MacOS requires some extra steps, outlined in GitHub repo [FVPs-on-Mac](https://github.com/Arm-Examples/FVPs-on-Mac/). macOS users must do this first, before setting up the Corstone-320 FVP. {{% /notice %}} From fa0bb24db2c44336b312adee797c2f4709a5a602 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 13:39:25 -0400 Subject: [PATCH 39/63] Update 3-env-setup-fvp.md --- .../visualizing-ethos-u-performance/3-env-setup-fvp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md index 5f5edb0c90..bc80217465 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-env-setup-fvp.md @@ -49,4 +49,4 @@ Test that the setup was successful by running the `run.sh` script for Ethos-U85, You will see a number of examples run on the FVP. -This confirms the installation, so you can now proceed to the Learning Path [Build a Simple PyTorch Model](/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model/). +This confirms the installation, so you can now proceed to the next section. From 441c228a991600a28a9eb47a8ff5182006588cef Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 18:41:35 +0000 Subject: [PATCH 40/63] content review --- content/install-guides/tkn.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/install-guides/tkn.md b/content/install-guides/tkn.md index a8279280df..7329a6bd99 100644 --- a/content/install-guides/tkn.md +++ b/content/install-guides/tkn.md @@ -1,8 +1,6 @@ --- title: Tekton CLI (tkn) -draft: true - author: Jason Andrews official_docs: https://tekton.dev/docs/cli/ @@ -53,7 +51,7 @@ arm64 ## How do I download and install the Tekton CLI? -There are multiple ways to install the Tekton CLI. The methods below download the latest stable version directly from the GitHub releases. +You can install the Tekton CLI in multiple ways. The following methods download the latest stable release directly from GitHub. ### Install on Arm Linux @@ -65,6 +63,10 @@ curl -LO https://github.com/tektoncd/cli/releases/download/${TKN_VERSION}/tekton sudo apt install ./tektoncd-cli-${TKN_VERSION#v}_Linux-ARM64.deb ``` +{{% notice Tip %}} +If the version query fails, you can manually set `TKN_VERSION` to a known stable version like `v0.41.0`. +{{% /notice %}} + ### Install on macOS To install the Tekton CLI on macOS with Apple Silicon: From 0a5656ad23120c6020249feff4f539db07a7e019 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Thu, 24 Jul 2025 19:03:10 +0000 Subject: [PATCH 41/63] Content review --- content/install-guides/oc.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/install-guides/oc.md b/content/install-guides/oc.md index 3aca0a2d55..3088e105d6 100644 --- a/content/install-guides/oc.md +++ b/content/install-guides/oc.md @@ -1,8 +1,6 @@ --- title: OpenShift CLI (oc) -draft: true - author: Jason Andrews official_docs: https://docs.redhat.com/en/documentation/openshift_container_platform/4.18/html/cli_tools/openshift-cli-oc#cli-getting-started @@ -21,7 +19,6 @@ test_maintenance: false tool_install: true weight: 1 --- - The OpenShift command-line interface (CLI), `oc`, allows you to work with OpenShift Container Platform projects from a terminal. You can use `oc` to create applications, manage OpenShift Container Platform projects, and perform administrative tasks. The OpenShift CLI is a superset of the Kubernetes `kubectl` command. When you install `oc`, you get both the OpenShift-specific functionality and all standard Kubernetes `kubectl` commands in a single tool. This means you can use `oc` to manage both OpenShift and standard Kubernetes resources. @@ -32,7 +29,7 @@ The OpenShift CLI is available for macOS and Linux and supports the Arm architec This article provides a quick solution to install the latest version of the OpenShift CLI for Ubuntu on Arm and macOS with Apple Silicon. -Confirm you are using an Arm computer by running: +Confirm that you are using an Arm-based computer by running: ```bash { target="ubuntu:latest" } uname -m @@ -78,6 +75,11 @@ rm openshift-client-mac-arm64.tar.gz README.md Both installations include both `oc` and `kubectl` commands. The `oc` command provides the full OpenShift functionality, while the `kubectl` command gives you compatibility with standard Kubernetes clusters. Since `oc` is a superset of `kubectl`, you can use `oc` for all Kubernetes operations, but having both commands available gives you flexibility in your workflow. +{{% notice Tip %}} +You can use either `oc` or `kubectl` to manage standard Kubernetes resources. However, `oc` includes OpenShift-specific features and is preferred for working with OpenShift clusters. +{{% /notice %}} + + ## Understanding oc and kubectl The OpenShift CLI (`oc`) is built as a superset of the Kubernetes CLI (`kubectl`). From f382c01bfe6ba58dee871deae7a4b4bf66116e2b Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 15:35:45 -0400 Subject: [PATCH 42/63] Update 5-configure-fvp-gui.md --- .../visualizing-ethos-u-performance/5-configure-fvp-gui.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md index 7da0db60cf..55ddd7c856 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md @@ -12,7 +12,7 @@ layout: "learningpathall" Note down your computer's IP address: ```bash -ip addr show +ip addr show ``` To help you, here are some common WiFi interface names on Linux: |Interface Name|Meaning / Context| @@ -34,7 +34,7 @@ ipconfig getifaddr en0 # Returns your Mac's WiFi IP address ## Enable the FVP's GUI -Edit the following parameters in [run_fvp.sh](https://github.com/pytorch/executorch/blob/d5fe5faadb8a46375d925b18827493cd65ec84ce/backends/arm/scripts/run_fvp.sh#L97-L102), to enable the Mobilenet V2 output on the FVP's GUI: +Edit the following parameters in your local checked out [executorch/backends/arm/scripts/run_fvp.sh](https://github.com/pytorch/executorch/blob/d5fe5faadb8a46375d925b18827493cd65ec84ce/backends/arm/scripts/run_fvp.sh#L97-L102) file, to enable the Mobilenet V2 output on the FVP's GUI: ```bash -C mps4_board.subsystem.ethosu.num_macs=${num_macs} \ From b21b6bf7c87405f6df308cd98ad5230d76cf245a Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 15:51:30 -0400 Subject: [PATCH 43/63] Update 4-how-executorch-works.md --- .../visualizing-ethos-u-performance/4-how-executorch-works.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-how-executorch-works.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-how-executorch-works.md index e10107404d..e2061aa1e2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-how-executorch-works.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-how-executorch-works.md @@ -8,7 +8,8 @@ weight: 5 # 1 is first, 2 is second, etc. layout: "learningpathall" --- -Source: [How ExecuTorch Works](https://docs.pytorch.org/executorch/stable/intro-how-it-works.html) (official PyTorch Documentation) +To get a better understanding of [How ExecuTorch Works](https://docs.pytorch.org/executorch/stable/intro-how-it-works.html) refer to the official PyTorch Documentation. A summary is provided here for your reference: + 1. **Export the model:** * Generate a Graph * A graph is series of operators (ReLU, quantize, etc.) eligible for delegation to an accelerator From b5598b808d233ef2c5fbfd4e3dc523d3a6072d28 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 15:53:01 -0400 Subject: [PATCH 44/63] Update 5-configure-fvp-gui.md --- .../5-configure-fvp-gui.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md index 55ddd7c856..e3902cafd4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-configure-fvp-gui.md @@ -14,13 +14,7 @@ Note down your computer's IP address: ```bash ip addr show ``` -To help you, here are some common WiFi interface names on Linux: -|Interface Name|Meaning / Context| -|--------------|-----------------| -|wlan0|Legacy name (common on older systems)| -|wlp2s0, wlp3s0|Predictable network naming scheme (modern systems)| -|wlx|Some systems name interfaces after MAC addresses| -|wifi0, ath0|Very rare, specific to certain drivers (e.g., Atheros)| +Note down the IP address of your active network interface (inet) which you will use later to pass as an argument to the FVP. {{% notice macOS %}} @@ -34,7 +28,7 @@ ipconfig getifaddr en0 # Returns your Mac's WiFi IP address ## Enable the FVP's GUI -Edit the following parameters in your local checked out [executorch/backends/arm/scripts/run_fvp.sh](https://github.com/pytorch/executorch/blob/d5fe5faadb8a46375d925b18827493cd65ec84ce/backends/arm/scripts/run_fvp.sh#L97-L102) file, to enable the Mobilenet V2 output on the FVP's GUI: +Edit the following parameters in your locally checked out [executorch/backends/arm/scripts/run_fvp.sh](https://github.com/pytorch/executorch/blob/d5fe5faadb8a46375d925b18827493cd65ec84ce/backends/arm/scripts/run_fvp.sh#L97-L102) file, to enable the Mobilenet V2 output on the FVP's GUI: ```bash -C mps4_board.subsystem.ethosu.num_macs=${num_macs} \ From defc14d133f7e970e29b03a96288bc300af6b6b0 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Thu, 24 Jul 2025 15:55:08 -0400 Subject: [PATCH 45/63] Update 6-evaluate-output.md --- .../visualizing-ethos-u-performance/6-evaluate-output.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md index b6567d743f..5da5e9581a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md @@ -161,3 +161,5 @@ I [executorch:arm_perf_monitor.cpp:184] ethosu_pmu_cntr4 : 130 |ethosu_pmu_cntr2|External DRAM read beats(ETHOSU_PMU_EXT_RD_DATA_BEAT_RECEIVED)|Number of data beats read from off-chip memory (e.g., DRAM). Often 0 if Sram_Only is used.|If non-zero, may indicate cache misses or large model size.| |ethosu_pmu_cntr3|External DRAM write beats(ETHOSU_PMU_EXT_WR_DATA_BEAT_WRITTEN)|Number of write data beats to external memory.|Helps detect offloading or insufficient SRAM.| |ethosu_pmu_cntr4|Idle cycles(ETHOSU_PMU_NPU_IDLE)|Number of cycles where the NPU had no work scheduled (i.e., idle).|High idle count = possible pipeline stalls or bad scheduling.| + +In this learning path you have successfully learnt how to deploy a MobileNet V2 Model using ExecuTorch on Arm's Corstone-320 FVP. From 7f61f305937e322a81db1c44e59c3dfd2364581f Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Thu, 24 Jul 2025 14:41:32 -0700 Subject: [PATCH 46/63] First review of Azure Linux 3.0 on Cobalt 100 Learning Path --- content/install-guides/azure-cli.md | 4 +- .../azure-vm/_index.md | 15 +- .../azure-vm/azure-vm.md | 207 +++--------------- .../azure-vm/background.md | 40 +++- .../azure-vm/save-image.md | 128 +++++++++++ .../azure-vm/start-vm.md | 41 ++++ 6 files changed, 244 insertions(+), 191 deletions(-) create mode 100644 content/learning-paths/servers-and-cloud-computing/azure-vm/save-image.md create mode 100644 content/learning-paths/servers-and-cloud-computing/azure-vm/start-vm.md diff --git a/content/install-guides/azure-cli.md b/content/install-guides/azure-cli.md index d7dc3b14e0..d1625082c8 100644 --- a/content/install-guides/azure-cli.md +++ b/content/install-guides/azure-cli.md @@ -56,7 +56,7 @@ Execute the following command to verify the Azure CLI is installed correctly az version ``` -You should see an output similar to below +You should see an output similar to: ```output { @@ -94,7 +94,7 @@ The pip install updates $HOME/.profile with the path the `az` executable. Check source $HOME/.profile az version ``` -You should see an output similar to below +You should see an output similar to: ```output { diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md index acb0494efb..8a7c2f5afa 100644 --- a/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/_index.md @@ -1,5 +1,5 @@ --- -title: Create Azure Linux 3.0 custom Arm VM +title: Create an Azure Linux 3.0 virtual machine with Cobalt 100 processors draft: true cascade: @@ -7,18 +7,17 @@ cascade: minutes_to_complete: 120 -who_is_this_for: This Learning Path helps developers create a custom Azure Linux 3.0 virtual machine for Arm and utilize the default software stack provided by Microsoft. +who_is_this_for: This Learning Path explains how to create a virtual machine on Azure running Azure Linux 3.0 on Cobalt 100 processors. learning_objectives: - - Use the qemu-img utility to create a raw disk image, boot a VM with Aarch64 ISO to install the OS onto that disk, and convert the raw disk image into VHD - - Upload the VHD to Azure and use the Azure Shared Image Gallery to create a custom image. - - Use Azure CLI to create Azure Linux 3.0 VM for Arm, using the custom image from Azure SIG. + - Use QEMU to create a raw disk image, boot a VM using an Aarch64 ISO, install the OS, and convert the raw disk image to VHD format. + - Upload the VHD file to Azure and use the Azure Shared Image Gallery (SIG) to create a custom image. + - Use the Azure CLI to create an Azure Linux 3.0 VM for Arm, using the custom image from the Azure SIG. prerequisites: - - A [Microsoft Azure](https://azure.microsoft.com/) account with permission to create resources, including Cobalt 100 (Arm64) instances (Dpsv6). - - A local Linux machine with [QEMU](https://www.qemu.org/download/) installed to emulate Aarch64. - - An [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) installed and authenticated on your local machine. + - A [Microsoft Azure](https://azure.microsoft.com/) account with permission to create resources, including instances using Cobalt 100 processors. + - A local Linux machine with [QEMU](https://www.qemu.org/download/) and the [Azure CLI](/install-guides/azure-cli/) installed and authenticated. author: Jason Andrews diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md index a25512d2a7..f7c1a0e446 100644 --- a/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/azure-vm.md @@ -1,34 +1,39 @@ --- -title: Create custom Azure Linux 3.0 Arm image for the VM +title: Create an Azure Linux image for Arm weight: 3 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Roadmap to the Azure Linux 3.0 Arm VM image +You can view the Azure Linux 3.0 project on [GitHub](https://github.com/microsoft/azurelinux). There are links to the ISO downloads in the project README. -In this learning path, we will start by [downloading the Aarch64 ISO of Azure Linux 3.0](https://github.com/microsoft/azurelinux#iso). Using qemu-img, we’ll create a raw disk image and boot a virtual machine with the ISO to install the OS onto the disk. Once the installation is complete, we will convert the raw disk to a fixed-size VHD, upload it to Azure Blob Storage, and then use the Azure CLI to create a custom Arm image. This custom image will enable us to launch Azure Linux 3.0 virtual machines on Arm-based infrastructure, even though the Azure Marketplace currently provides this image only for x64 systems. +Using QEMU, you can create a raw disk image and boot a virtual machine with the ISO to install the OS onto the disk. -Next, switch to a Linux-based environment and proceed with the following steps. +Once the installation is complete, you can convert the raw disk to a fixed-size VHD, upload it to Azure Blob Storage, and then use the Azure CLI to create a custom Arm image. + +## Download and create a virtual disk file + +Use `wget` to download the Azure Linux ISO image file. -#### 1. Install the Dependencies -```bash -$ sudo apt update && sudo apt install qemu-system-arm qemu-system-aarch64 qemu-efi-aarch64 qemu-utils ovmf -y -``` -#### 2. Download the Azure Linux 3.0 ISO ```bash -$ wget https://aka.ms/azurelinux-3.0-aarch64.iso +wget https://aka.ms/azurelinux-3.0-aarch64.iso ``` -#### 3. Use qemu-img to create a 32 GB raw disk image + +Use `qemu-img` to create a 32 GB raw disk image. + +This step creates a 32 GB empty raw disk image to install the OS. You can increase the disk size by modifying the value passed to `qemu-img`. + ```bash -$ qemu-img create -f raw azurelinux-arm64.raw 34359738368 +qemu-img create -f raw azurelinux-arm64.raw 34359738368 ``` -This step creates a 32 GB empty raw disk image to install the OS. -#### 4. Boot the ISO and install the OS to the raw image +## Boot and install the OS + +Use QEMU to boot the operating system in an emulated Arm VM. + ```bash -$ qemu-system-aarch64 \ +qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -m 4096 \ @@ -41,177 +46,25 @@ $ qemu-system-aarch64 \ -device virtio-net-device,netdev=net0 ``` -This step boots the Azure Linux 3.0 ISO on an emulated Arm VM and installs the OS onto the raw disk. - -Once the OS boots successfully, install Azure Linux Agent required for VM provisioning, and poweroff the VM, as below: +Once the OS boots successfully, install the Azure Linux Agent for VM provisioning, and power off the VM. ```bash -$ sudo dnf install WALinuxAgent -y -$ sudo systemctl enable waagent -$ sudo systemctl start waagent -$ sudo poweroff +sudo dnf install WALinuxAgent -y +sudo systemctl enable waagent +sudo systemctl start waagent +sudo poweroff ``` -#### 5. Convert Raw Disk to VHD Format -Now that the raw disk image is all set to be used, convert the image to fixed-size VHD, campatible to Azure. -```bash -$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc azurelinux-arm64.raw azurelinux-arm64.vhd -``` - -{{% notice Note %}} -VHD files have 512 bytes of footer attached at the end. The “force_size” flag ensures that the exact virtual size specified is used for the final VHD file (in our case, 32 GiB). Without this, qemu-img may round the size or adjust for footer overhead (especially when converting from raw to VHD). “force_size” forces the final image to match the original size. This flag helps make the final VHD size a clean, whole number in MB or GiB, which Azure requires. -{{% /notice %}} +## Convert the raw disk to VHD Format -#### 6. Set environment variables -Below uploading the VHD file to Azure Blob storage, set the Environment Variables for the Azure CLI. +Now that the raw disk image is ready to be used, convert the image to fixed-size VHD, making it compatible with Azure. ```bash -RESOURCE_GROUP="MyCustomARM64Group" -LOCATION="centralindia" -STORAGE_ACCOUNT="mycustomarm64storage" -CONTAINER_NAME="mycustomarm64container" -VHD_NAME="azurelinux-arm64.vhd" -GALLERY_NAME="MyCustomARM64Gallery" -IMAGE_DEF_NAME="MyAzureLinuxARM64Def" -IMAGE_VERSION="1.0.0" -PUBLISHER="custom" -OFFER="custom-offer" -SKU="custom-sku" -OS_TYPE="Linux" -ARCHITECTURE="Arm64" -HYPERV_GEN="V2" -STORAGE_ACCOUNT_TYPE="Standard_LRS" -VM_NAME="MyAzureLinuxARMVM" -ADMIN_USER="azureuser" -VM_SIZE="Standard_D4ps_v6" +qemu-img convert -f raw -o subformat=fixed,force_size -O vpc azurelinux-arm64.raw azurelinux-arm64.vhd ``` {{% notice Note %}} -You can modify the values of these environment variables—such as RESOURCE_GROUP, VM_NAME, LOCATION, and others—based on your naming preferences, region, and resource requirements. +VHD files have 512 bytes of footer attached at the end. The `force_size` flag ensures that the exact virtual size specified is used for the final VHD file. Without this, QEMU may round the size or adjust for footer overhead (especially when converting from raw to VHD). The `force_size` flag forces the final image to match the original size. This flag helps make the final VHD size a clean, whole number in MB or GiB, which is required for Azure. {{% /notice %}} -#### 7. Create a Resource Group on Azure -After [installing the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest), create a new resource group. - -```bash -$ az group create --name "$RESOURCE_GROUP" --location "$LOCATION" -``` - -#### 8. Create Azure Blob Storage on Azure - -```bash -$ az storage account create \ - --name "$STORAGE_ACCOUNT" \ - --resource-group "$RESOURCE_GROUP" \ - --location "$LOCATION" \ - --sku Standard_LRS \ - --kind StorageV2 -``` - -#### 9. Create Blob Container in the Blob Storage Account - -```bash - $ az storage container create \ - --name "$CONTAINER_NAME" \ - --account-name "$STORAGE_ACCOUNT" -``` - -#### 10. Upload VHD to the Blob container created in step 9 - -```bash -$ az storage blob upload \ - --account-name "$STORAGE_ACCOUNT" \ - --container-name "$CONTAINER_NAME" \ - --name "$VHD_NAME" \ - --file ./azurelinux-arm64.vhd -``` - -This successfully uploads the VHD to the Azure Blob Storage account. Confirm the same after visiting the blob storage of your Azure account. - -Now, let’s create a custom VM image from this VHD, using Azure Shared Image Gallery. - -#### 11. Create Azure Shared Image Gallery -```bash -$ az sig create \ - --resource-group "$RESOURCE_GROUP" \ - --gallery-name "$GALLERY_NAME" \ - --location "$LOCATION" -``` - -#### 12. Create the Image Definition -```bash -$ az sig image-definition create - --resource-group "$RESOURCE_GROUP" - --gallery-name "$GALLERY_NAME" - --gallery-image-definition "$IMAGE_DEF_NAME" - --publisher "$PUBLISHER" - --offer "$OFFER" - --sku "$SKU" - --os-type "$OS_TYPE" - --architecture "$ARCHITECTURE" - --hyper-v-generation "$HYPERV_GEN" -``` - -#### 13. Create Image Version -```bash -$ az sig image-version create - --resource-group "$RESOURCE_GROUP" - --gallery-name "$GALLERY_NAME" - --gallery-image-definition "$IMAGE_DEF_NAME" - --gallery-image-version "$IMAGE_VERSION" - --location "$LOCATION" - --os-vhd-uri "[https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${VHD_NAME](https://${storage_account}.blob.core.windows.net/$%7BCONTAINER_NAME%7D/$%7BVHD_NAME)}" - --os-vhd-storage-account "$STORAGE_ACCOUNT" - --storage-account-type "$STORAGE_ACCOUNT_TYPE" -``` - -This registers the VHD as a version of your custom image. - -#### 14. Retrieve the Image ID -Once the image has been versioned, retrieve the unique ID for use in VM creation. - -```bash -$ IMAGE_ID=$(az sig image-version show - --resource-group "$RESOURCE_GROUP" - --gallery-name "$GALLERY_NAME" - --gallery-image-definition "$IMAGE_DEF_NAME" - --gallery-image-version "$IMAGE_VERSION" - --query "id" -o tsv) -``` - -#### 15. Create the VM Using the Custom Image -Finally, create the VM with this custom image. - -```bash -$ az vm create \ - --resource-group "$RESOURCE_GROUP" \ - --name "$VM_NAME" \ - --image "$IMAGE_ID" \ - --size "$VM_SIZE" \ - --admin-username "$ADMIN_USER" \ - --generate-ssh-keys \ - --public-ip-sku Standard -``` - -This deploys Azure Linux 3.0 Arm64 VM from the custom image. Confirm the same after visiting your Azure account “Virtual Machines” section. - -After the VM is successfully created, fetch the Public IP of the VM. - -```bash -$ az vm show \ - --resource-group "$RESOURCE_GROUP" \ - --name "$VM_NAME" \ - --show-details \ - --query "publicIps" \ - -o tsv -``` -With the Public IP retrieved, SSH into the VM. - -```bash -$ ssh azureuser@ -``` - -Replace **public-ip-address** with the IP returned in the previous command. - -You can now log into your custom Azure Linux 3.0 Arm64 VM and start using it! - +Next, you can save the image in your Azure account. diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md index 176d81ea1f..dda13eaf11 100644 --- a/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/background.md @@ -1,14 +1,46 @@ --- -title: "Background" +title: "About Azure Linux" weight: 2 layout: "learningpathall" --- -## Introduction to Azure Linux 3.0 +## What is Azure Linux 3.0? -Azure Linux 3.0 is Microsoft's in-house, lightweight Linux distribution optimized for running cloud-native workloads on Azure. Designed with performance, security, and reliability in mind, it is fully supported by Microsoft and tailored for containers, microservices, and Kubernetes. With native support for Arm64 (Aarch64) architecture, Azure Linux 3.0 enables efficient execution of workloads on energy-efficient ARM-based infrastructure, making it a powerful choice for scalable and cost-effective cloud deployments. +Azure Linux 3.0 is a Linux distribution developed and maintained by Microsoft, specifically designed for use on the Azure cloud platform. It is optimized for running cloud-native workloads, such as containers, microservices, and Kubernetes clusters, and emphasizes performance, security, and reliability. Azure Linux 3.0 provides native support for the Arm (AArch64) architecture, enabling efficient, scalable, and cost-effective deployments on Arm-based infrastructure within Azure. -As of now, the Azure Marketplace offers official VM images of Azure Linux 3.0 only for x64-based architectures, published by Ntegral Inc. However, native Arm64 (Aarch64) images are not yet officially available. This learning path bridges that gap by guiding developers through the process of building a custom Arm VM image using the Azure Linux 3.0 ISO. By the end of this path, you'll be able to deploy and run Azure Linux 3.0 VMs on Arm-based Azure infrastructure with confidence. +Currently, Azure Linux 3.0 is not available as a ready-made virtual machine image for Arm-based VMs in the Azure Marketplace. Only x86_64 images, published by Ntegral Inc., are offered. This means you cannot directly create an Azure Linux 3.0 VM for Arm from the Azure portal or CLI. +However, you can still run Azure Linux 3.0 on Arm-based Azure VMs by creating your own disk image. Using QEMU, an open-source machine emulator and virtualizer, you can build a custom Azure Linux 3.0 Arm image locally. After building the image, you can upload it to your Azure account as a managed disk or custom image. This process allows you to deploy and manage Azure Linux 3.0 VMs on Arm infrastructure, even before official images are available. + +This Learning Path guides you through the steps to build an Azure Linux 3.0 disk image with QEMU, upload it to Azure, and prepare it for use in creating virtual machines. + +Following this process, you'll be able to create and run Azure Linux 3.0 VMs on Arm-based Azure infrastructure. + +To get started install the dependencies on your local Linux machine. The instructions work for both Arm or x86 running Ubuntu. + +```bash +sudo apt update && sudo apt install qemu-system-arm qemu-system-aarch64 qemu-efi-aarch64 qemu-utils ovmf -y +``` + +You also need to install the Azure CLI. Refer to [How to install the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest). You can also use the [Azure CLI install guide](/install-guides/azure-cli/) for Arm Linux systems. + +Make sure the CLI is working by running the version command and confirm the version is printed. + +```bash +az version +``` + +You should see an output similar to: + +```output +{ + "azure-cli": "2.61.0", + "azure-cli-core": "2.61.0", + "azure-cli-telemetry": "1.1.0", + "extensions": {} +} +``` + +Continue to learn how to prepare the Azure Linux disk image. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/save-image.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/save-image.md new file mode 100644 index 0000000000..a9f52f461b --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/save-image.md @@ -0,0 +1,128 @@ +--- +title: Transfer the image to Azure +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +You can now use the Azure CLI to create a disk image in Azure and copy the local image to Azure. + +## Prepare Azure resources for the image + +Before uploading the VHD file to Azure storage, set the environment variables for the Azure CLI. + +```bash +RESOURCE_GROUP="MyCustomARM64Group" +LOCATION="centralindia" +STORAGE_ACCOUNT="mycustomarm64storage" +CONTAINER_NAME="mycustomarm64container" +VHD_NAME="azurelinux-arm64.vhd" +GALLERY_NAME="MyCustomARM64Gallery" +IMAGE_DEF_NAME="MyAzureLinuxARM64Def" +IMAGE_VERSION="1.0.0" +PUBLISHER="custom" +OFFER="custom-offer" +SKU="custom-sku" +OS_TYPE="Linux" +ARCHITECTURE="Arm64" +HYPERV_GEN="V2" +STORAGE_ACCOUNT_TYPE="Standard_LRS" +VM_NAME="MyAzureLinuxARMVM" +ADMIN_USER="azureuser" +VM_SIZE="Standard_D4ps_v6" +``` + +{{% notice Note %}} +You can modify the environment variables such as RESOURCE_GROUP, VM_NAME, and LOCATION based on your naming preferences, region, and resource requirements. +{{% /notice %}} + +Create a new resource group. If you are using an existing resource group for the RESOURCE_GROUP environment variable you can skip this step. + +```bash +az group create --name "$RESOURCE_GROUP" --location "$LOCATION" +``` + +Create Azure blob storage. + +```bash +az storage account create \ + --name "$STORAGE_ACCOUNT" \ + --resource-group "$RESOURCE_GROUP" \ + --location "$LOCATION" \ + --sku Standard_LRS \ + --kind StorageV2 +``` + +Create a blob container in the blob storage account. + +```bash +az storage container create \ + --name "$CONTAINER_NAME" \ + --account-name "$STORAGE_ACCOUNT" +``` + +## Upload and save the image in Azure + +Upload the VHD file to Azure. + +```bash +az storage blob upload \ + --account-name "$STORAGE_ACCOUNT" \ + --container-name "$CONTAINER_NAME" \ + --name "$VHD_NAME" \ + --file ./azurelinux-arm64.vhd +``` + +You can now use the Azure console to see the image in your Azure account. + +Next, create a custom VM image from this VHD, using Azure Shared Image Gallery (SIG). + +```bash +az sig create \ + --resource-group "$RESOURCE_GROUP" \ + --gallery-name "$GALLERY_NAME" \ + --location "$LOCATION" +``` + +Create the image definition. + +```bash +az sig image-definition create + --resource-group "$RESOURCE_GROUP" + --gallery-name "$GALLERY_NAME" + --gallery-image-definition "$IMAGE_DEF_NAME" + --publisher "$PUBLISHER" + --offer "$OFFER" + --sku "$SKU" + --os-type "$OS_TYPE" + --architecture "$ARCHITECTURE" + --hyper-v-generation "$HYPERV_GEN" +``` + +Create the image version to register the VHD as a version of the custom image. + +```bash +az sig image-version create + --resource-group "$RESOURCE_GROUP" + --gallery-name "$GALLERY_NAME" + --gallery-image-definition "$IMAGE_DEF_NAME" + --gallery-image-version "$IMAGE_VERSION" + --location "$LOCATION" + --os-vhd-uri "[https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${VHD_NAME](https://${storage_account}.blob.core.windows.net/$%7BCONTAINER_NAME%7D/$%7BVHD_NAME)}" + --os-vhd-storage-account "$STORAGE_ACCOUNT" + --storage-account-type "$STORAGE_ACCOUNT_TYPE" +``` + +Once the image has been versioned, you can retrieve the unique image ID for use in VM creation. + +```bash +IMAGE_ID=$(az sig image-version show + --resource-group "$RESOURCE_GROUP" + --gallery-name "$GALLERY_NAME" + --gallery-image-definition "$IMAGE_DEF_NAME" + --gallery-image-version "$IMAGE_VERSION" + --query "id" -o tsv) +``` + +Next, you can create a virtual machine with the new image using the image ID. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/azure-vm/start-vm.md b/content/learning-paths/servers-and-cloud-computing/azure-vm/start-vm.md new file mode 100644 index 0000000000..cb28839882 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/azure-vm/start-vm.md @@ -0,0 +1,41 @@ +--- +title: Start an Azure virtual machine with the new image +weight: 5 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Create a virtual machine using the new image + +You can now use the newly created Azure Linux image to create a virtual machine in Azure with Cobalt 100 processors. Confirm the VM is created by looking in your Azure account in the “Virtual Machines” section. + +```bash +az vm create \ + --resource-group "$RESOURCE_GROUP" \ + --name "$VM_NAME" \ + --image "$IMAGE_ID" \ + --size "$VM_SIZE" \ + --admin-username "$ADMIN_USER" \ + --generate-ssh-keys \ + --public-ip-sku Standard +``` + +After the VM is successfully created, retrieve the public IP address. + +```bash +az vm show \ + --resource-group "$RESOURCE_GROUP" \ + --name "$VM_NAME" \ + --show-details \ + --query "publicIps" \ + -o tsv +``` + +Use the public IP address to SSH to the VM. Replace `` with the IP returned by the previous command. + +```bash +ssh azureuser@ +``` + +You are ready to use your Azure Linux virtual machine. From 327a0dc754feddc9f37dd1341c01a090d7b985b5 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Thu, 24 Jul 2025 17:40:47 -0700 Subject: [PATCH 47/63] spelling fixes --- .wordlist.txt | 12 +++++++++++- .../1d_safety_island_arch.md | 2 +- .../6-evaluate-output.md | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.wordlist.txt b/.wordlist.txt index eb990b7b46..6db9d2c963 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -4459,4 +4459,14 @@ Arcee's commandlinetools ppl rollout -sdkmanager \ No newline at end of file +sdkmanager +Ntegral +OEMs +TKN +VHD +inet +tekton +tektoncd +tkn +verifiably +vhd \ No newline at end of file diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md index 5f2f5798d6..0b3f7c8588 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/1d_safety_island_arch.md @@ -30,7 +30,7 @@ Safety islands are often implemented as lockstep cores or separate MCUs that run ## Key capabilities of a safety island - **System health monitoring** continuously monitors the operational status of the main processor (for example, the ADAS control unit) and detects potential errors or anomalies - **Fault detection and isolation** independently detects failures and initiates emergency handling for overheating, execution faults, or unresponsiveness -- **Essential safety functions conitnue to operate**, even if the main system crashes. A safety island can execute fallback operations, such as: +- **Essential safety functions continue to operate**, even if the main system crashes. A safety island can execute fallback operations, such as: - Autonomous Vehicles → safe stopping (fail-safe mode) - Industrial Equipment → emergency power cutoff or speed reduction diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md index 5da5e9581a..2ab22dbdf2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-evaluate-output.md @@ -162,4 +162,4 @@ I [executorch:arm_perf_monitor.cpp:184] ethosu_pmu_cntr4 : 130 |ethosu_pmu_cntr3|External DRAM write beats(ETHOSU_PMU_EXT_WR_DATA_BEAT_WRITTEN)|Number of write data beats to external memory.|Helps detect offloading or insufficient SRAM.| |ethosu_pmu_cntr4|Idle cycles(ETHOSU_PMU_NPU_IDLE)|Number of cycles where the NPU had no work scheduled (i.e., idle).|High idle count = possible pipeline stalls or bad scheduling.| -In this learning path you have successfully learnt how to deploy a MobileNet V2 Model using ExecuTorch on Arm's Corstone-320 FVP. +In this learning path you have successfully learned how to deploy a MobileNet V2 Model using ExecuTorch on Arm's Corstone-320 FVP. From 0bdca050589be4d8f16271f997d7d024b9e26cb3 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 05:02:33 +0000 Subject: [PATCH 48/63] Starting content review --- .../zenoh-multinode-ros2/1_intro-zenoh.md | 13 ++++++------- .../cross-platform/zenoh-multinode-ros2/_index.md | 15 +++++++++------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md index 5e1595325a..d2f7d642a1 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md @@ -6,7 +6,7 @@ weight: 2 layout: learningpathall --- -## The Need for Scalable Communication in Robotics and Edge Computing +## The need for scalable communication in robotics and edge computing Modern robotics and industrial IoT systems are evolving rapidly, from indoor collaborative arms on assembly lines to fleets of outdoor autonomous delivery robots. These applications must operate in real-time, often across multiple compute nodes, over networks that may span factory LANs, 5G cellular links, or even cloud data centers. @@ -20,11 +20,9 @@ A modern protocol must be: * Decentralized: No reliance on central brokers or fixed infrastructure. * Flexible: Able to run on lightweight edge devices, across WANs, or inside cloud-native environments. -Traditional communication stacks such as Data Distribution Service (DDS) serve as the backbone for middleware like ROS 2. However, DDS struggles in multi-network or wireless environments where multicast is unavailable, or NAT traversal is needed. -These constraints can severely impact deployment and performance at the edge. +Traditional communication stacks such as Data Distribution Service (DDS) serve as the backbone for middleware like ROS 2. However, DDS struggles in multi-network or wireless environments where multicast is unavailable, or NAT traversal is needed. Zenoh was developed to address these challenges with a unified approach to data movement, storage, and interaction across heterogeneous, distributed systems. - -## Zenoh: an open-source pub/sub protocol for the Industrial Edge +## Zenoh: an open-source pub/sub protocol for the industrial edge [Eclipse Zenoh](https://zenoh.io/) is a modern, open-source, data-centric communication protocol that goes beyond traditional pub/sub. Designed specifically for edge computing, industrial IoT, robotics, and autonomous systems, Zenoh unifies: @@ -44,7 +42,8 @@ In this Learning Path, you’ll use Zenoh to build and validate a multi-node dis The examples use Raspberry Pi boards, but you’re free to substitute any Cortex-A or Neoverse devices that support network connectivity running Linux. -Upon completion, you will be able to: +By the end of this Learning Path, you'll be able to: - Understand the core architecture and data flow principles behind Eclipse Zenoh, including its support for pub/sub, querying, and queryable edge functions. - Build and run distributed Zenoh examples across multiple Arm-based nodes using Raspberry Pi or other Arm Linux devices. -- Rebuild and extend the Zenoh queryable example to simulate edge-side logic. +- Rebuild and extend a Zenoh queryable node to simulate edge-side logic. + diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/_index.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/_index.md index 833978a14d..bb213fe72f 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/_index.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/_index.md @@ -1,16 +1,13 @@ --- title: Scalable Networking for Industrial and Robotics with Zenoh on Raspberry Pi -draft: true -cascade: - draft: true - minutes_to_complete: 45 -who_is_this_for: This Learning Path is for robotics developers, industrial automation engineers, and IoT system architects building distributed, scalable, and low-latency applications. Whether you are using Robot Operating System (ROS), developing autonomous systems, or designing multi-node communication frameworks, you can use Eclipse Zenoh on Arm-based platforms, both in the cloud and on local devices like Raspberry Pi. +who_is_this_for: This Learning Path is for robotics developers, industrial automation engineers, and IoT system architects building distributed, scalable, and low-latency applications. Whether you're using the Robot Operating System (ROS), developing autonomous systems, or designing multi-node communication frameworks, you can use Eclipse Zenoh on Arm-based platforms, both in the cloud and on local devices like Raspberry Pi. + learning_objectives: - - Understand Zenoh's architecture and its integration of pub/sub, storage, querying, and computation models. + - Understand Zenoh's architecture and how it integrates pub/sub, storage, querying, and computation models. - Build and run Zenoh examples on both Arm servers and Raspberry Pi. - Set up and deploy a multi-node Zenoh system. @@ -32,6 +29,7 @@ tools_software_languages: - ROS2 - C - Raspberry Pi + - Zenoh operatingsystems: - Linux @@ -50,6 +48,11 @@ further_reading: title: Eclipse Zenoh Github link: https://github.com/eclipse-zenoh/zenoh type: documentation + - resource: + title: Zenoh and ROS 2 Integration Guide + link: https://github.com/eclipse-zenoh/zenoh-plugin-ros2 + type: documentation + ### FIXED, DO NOT MODIFY From 3fbe030d92b6ca226a1e6f9c9dc7e4c3e17c0f9e Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 07:18:22 +0000 Subject: [PATCH 49/63] Polished Zenoh setup section: revised title, clarified instructions, and improved build output explanation --- .../zenoh-multinode-ros2/1_intro-zenoh.md | 9 +++---- .../zenoh-multinode-ros2/2_zenoh-install.md | 12 +++++---- .../zenoh-multinode-ros2/3_zenoh-multinode.md | 27 ++++++++++--------- .../zenoh-multinode-ros2/_index.md | 15 ++++++----- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md index d2f7d642a1..a421923fb8 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md @@ -22,7 +22,7 @@ A modern protocol must be: Traditional communication stacks such as Data Distribution Service (DDS) serve as the backbone for middleware like ROS 2. However, DDS struggles in multi-network or wireless environments where multicast is unavailable, or NAT traversal is needed. Zenoh was developed to address these challenges with a unified approach to data movement, storage, and interaction across heterogeneous, distributed systems. -## Zenoh: an open-source pub/sub protocol for the industrial edge +## What is Zenoh? A scalable pub/sub protocol for the industrial edge [Eclipse Zenoh](https://zenoh.io/) is a modern, open-source, data-centric communication protocol that goes beyond traditional pub/sub. Designed specifically for edge computing, industrial IoT, robotics, and autonomous systems, Zenoh unifies: @@ -35,15 +35,14 @@ Unlike most traditional stacks, Zenoh is fully decentralized and designed to ope It supports heterogeneous platforms, is implemented in Rust for performance and safety, and also offers bindings for Python, enabling rapid prototyping. -Zenoh is particularly effective in wireless, 5G, or cross-network deployments where multicast and DDS fall short. -Its routing engine avoids excessive discovery traffic, conserves bandwidth, and supports seamless bridging between legacy ROS 2/DDS apps and modern, optimized Zenoh networks using Zenoh-Bridge-DDS, a bridge between DDS systems and Zenoh networks. +Zenoh excels in wireless, 5G, and cross-network deployments, which are environments where multicast is unavailable and DDS often struggles. Its routing engine avoids excessive discovery traffic, conserves bandwidth, and supports seamless bridging between legacy ROS 2/DDS apps and modern, optimized Zenoh networks using Zenoh-Bridge-DDS, a bridge between DDS systems and Zenoh networks. In this Learning Path, you’ll use Zenoh to build and validate a multi-node distributed communication system across multiple Arm-based platforms, gaining hands-on experience with data exchange and coordination between edge devices. -The examples use Raspberry Pi boards, but you’re free to substitute any Cortex-A or Neoverse devices that support network connectivity running Linux. +You can substitute Raspberry Pi with any Linux-based Arm device that supports networking, such as a Cortex-A or Neoverse board. By the end of this Learning Path, you'll be able to: -- Understand the core architecture and data flow principles behind Eclipse Zenoh, including its support for pub/sub, querying, and queryable edge functions. +- Explain the core architecture and data flow principles behind Eclipse Zenoh protocol, including its support for pub/sub, querying, and queryable edge functions. - Build and run distributed Zenoh examples across multiple Arm-based nodes using Raspberry Pi or other Arm Linux devices. - Rebuild and extend a Zenoh queryable node to simulate edge-side logic. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md index da1a28cbe4..f42cb6d7a9 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md @@ -1,14 +1,16 @@ --- -title: Setting Up Zenoh on Arm Devices +title: Install and build Zenoh on Arm devices + weight: 3 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Setting Up Zenoh on Arm Devices +## Set up Zenoh on Arm devices + -The following instructions have been verified on both Raspberry Pi 4 and 5 devices, but you can implement them on any Arm Linux device. +The following instructions have been verified on both Raspberry Pi 4 and 5 devices, but you can implement them on any Arm Linux device. These steps show how to install Zenoh on Raspberry Pi and other Arm-based Linux platforms. Before building Zenoh, make sure your system has the necessary development tools and runtime libraries. @@ -40,7 +42,7 @@ You can learn more using the [Rust install guide](/install-guides/rust/) for Arm [Robot Operating System](https://www.ros.org/) is a set of software libraries and tools that help you build robot applications. ROS provides everything from drivers to state-of-the-art algorithms, as well as developer tools. It is completely open-source. -Follow the [ROS2 installation guide](/install-guides/ros2/) to install ROS 2 on your Arm platforms. +If your use case involves ROS 2 integration, you should install ROS 2 before proceeding with Zenoh-related development. Follow the [ROS2 installation guide](/install-guides/ros2/) to install ROS 2 on your Arm platforms. ### Download and build the Zenoh source @@ -104,7 +106,7 @@ This may become a hard error in the future; see Date: Fri, 25 Jul 2025 10:39:40 +0000 Subject: [PATCH 50/63] Finalized Zenoh container deployment section and validated multi-node instructions --- .../zenoh-multinode-ros2/2_zenoh-install.md | 31 ++++++++++--------- .../zenoh-multinode-ros2/3_zenoh-multinode.md | 16 +++++++--- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md index f42cb6d7a9..50359df8be 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md @@ -1,5 +1,5 @@ --- -title: Install and build Zenoh on Arm devices +title: Get started with Zenoh on Raspberry Pi and Arm Linux weight: 3 @@ -9,14 +9,15 @@ layout: learningpathall ## Set up Zenoh on Arm devices +This section shows how to install and build the open-source Eclipse Zenoh protocol on Arm-based devices like Raspberry Pi. -The following instructions have been verified on both Raspberry Pi 4 and 5 devices, but you can implement them on any Arm Linux device. These steps show how to install Zenoh on Raspberry Pi and other Arm-based Linux platforms. +The following instructions have been verified on Raspberry Pi 4 and 5, but you can use any Arm Linux device. These steps apply to Raspberry Pi and other Arm-based Linux platforms. Before building Zenoh, make sure your system has the necessary development tools and runtime libraries. ### Install the Rust development environment -First, install the [Rust](https://www.rust-lang.org/) environment, since the core of Zenoh is developed using Rust to keep it safe and efficient. +First, install the [Rust](https://www.rust-lang.org/) environment. The core of Zenoh is developed in Rust for performance and safety. ```bash sudo apt update @@ -24,25 +25,24 @@ sudo apt install -y curl gcc curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ``` -Near the end of the installation you will see the success message: +Near the end of the installation, you should see the message: ```output Rust is installed now. Great! ``` - -Make sure to source the environment to add Rust to your shell environment: +Source your shell environment to activate Rust: ```bash source "$HOME/.cargo/env" ``` -You can learn more using the [Rust install guide](/install-guides/rust/) for Arm Linux. +For more information, see the [Rust Install Guide](/install-guides/rust/) for Arm Linux. ### Install ROS 2 [Robot Operating System](https://www.ros.org/) is a set of software libraries and tools that help you build robot applications. ROS provides everything from drivers to state-of-the-art algorithms, as well as developer tools. It is completely open-source. -If your use case involves ROS 2 integration, you should install ROS 2 before proceeding with Zenoh-related development. Follow the [ROS2 installation guide](/install-guides/ros2/) to install ROS 2 on your Arm platforms. +If you plan to use Zenoh alongside ROS 2, for example, to bridge DDS-based nodes, you should install ROS 2 before proceeding. See the [ROS2 Installation Guide](/install-guides/ros2/) to install ROS 2 on your Arm platforms. ### Download and build the Zenoh source @@ -52,15 +52,13 @@ Clone the Zenoh repository: cd $HOME git clone https://github.com/eclipse-zenoh/zenoh.git ``` - -After cloning, use cargo to build the source: +Build the source using Cargo: ```bash cd zenoh cargo build --release --all-targets -j $(nproc) ``` - -This process will take several minutes depending on your device. Once the installation is complete, you should see: +This process will take several minutes depending on your device. When complete, you should see output like: ```output Updating crates.io index @@ -103,13 +101,16 @@ This may become a hard error in the future; see plugins/zenoh-plugin-storage-manager/tests/operations.rs:91:55 @@ -122,7 +123,7 @@ Edit the file `./plugins/zenoh-plugin-storage-manager/tests/operations.rs` and c use crate::path::to::Plugin; ``` -Run the build again: +Then rebuild: ```bash cargo clean && cargo build diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md index 8c70d34d48..2655ab48d9 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md @@ -1,5 +1,5 @@ --- -title: Set up a multi-node environment +title: Containerize and deploy Zenoh across multiple Raspberry Pi devices weight: 4 @@ -15,7 +15,7 @@ If you’ve already installed Zenoh on an Arm Cortex-A or Neoverse platform as s However, to streamline deployment across multiple devices and ensure repeatability, this section demonstrates how to package Zenoh into a Docker image for batch rollout and scalable testing. -This containerized approach not only simplifies deployment on Raspberry Pi, but also integrates seamlessly with Arm cloud platforms such as AWS Graviton Arm Cortex-A Linux or Arm Virtual Hardware—enabling a consistent cloud-to-edge development and validation workflow. +This containerized approach not only simplifies deployment on Raspberry Pi, but also integrates seamlessly with Arm cloud platforms such as AWS Graviton Arm Cortex-A Linux or Arm Virtual Hardware, enabling a consistent cloud-to-edge development and validation workflow. In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. @@ -108,6 +108,9 @@ You can pull it directly using: ```bash docker pull odinlmshen/zenoh-node ``` +{{% notice Tip %}} +Once built, you can reuse this Docker image across multiple Arm-based nodes, including Raspberry Pi, AWS Graviton, and Arm Virtual Hardware. +{{% /notice %}} ### Transfer the Docker image to the other Raspberry Pi @@ -130,7 +133,10 @@ Option 2: Push the image to a container registry such as Docker Hub You can also push the image to Docker Hub or GitHub Container Registry and pull it on the second device. -### Run the Docker Image + + + +### Run the Docker image Once the image is successfully loaded on the second device, you can run the container to start the Zenoh environment. @@ -144,8 +150,8 @@ The Zenoh example binaries are now available within this container, allowing you You’re now ready to run and test Zenoh communication flows across distributed edge devices. -The following examples are written in Rust and precompiled in your container image. They're fully interoperable and can be used to demonstrate Zenoh's key capabilities across devices. The -Rust binaries are already available under: `$ZENOH_LOC/target/release/examples/` directory. +The following examples are written in Rust and precompiled in your container image. They're fully interoperable and can be used to demonstrate Zenoh's key capabilities across devices. The Rust binaries are available in the `$ZENOH_LOC/target/release/examples/` directory. If you haven't set `ZENOH_LOC`, they can be found under `~/zenoh/target/release/examples/`. + The following sections illustrate the procedures to run the Zenoh examples so as to demonstrate the primary capabilities of Zenoh: - Basic pub/sub – for real-time message distribution From 8ebd4f4d83baf4826b8e6359920057dace759a09 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 11:16:34 +0000 Subject: [PATCH 51/63] Finalized Zenoh pub/sub example: added tip for single-device testing and clarified peer discovery behavior --- .../4_zenoh-ex1-pubsub.md | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md index 6075c7cf3e..8d6f2bf388 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md @@ -1,18 +1,18 @@ --- -title: Zenoh Example-1 Simple Pub/Sub +title: Run a simple Zenoh pub/sub example weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Example 1: Simple pub/sub +## Test Zenoh pub/sub across two devices -This first test demonstrates the real-time publish/subscribe model using two Raspberry Pi devices. +This example demonstrates Zenoh's real-time publish/subscribe model across two Raspberry Pi devices. -The following command is to initiate a subscriber for a key expression `demo/example/**`, a set of topics starting with the path `demo/example`. +The subscriber listens for all data published under the key expression `demo/example/**`, which matches any topic beginning with `demo/example/`. -### Step 1: Run subscriber +## Start the subscriber node Run the subscriber example on one of the Raspberry Pi systems. @@ -21,7 +21,7 @@ cd ~/zenoh/target/release/examples ./z_sub ``` -### Step 2: Run publisher +## Start the publisher node Then, log in to the other Raspberry Pi and run the publisher. @@ -30,12 +30,19 @@ cd ~/zenoh/target/release/examples ./z_pub ``` +{{% notice Tip %}} +You can run both `z_sub` and `z_pub` on the same device for testing, but running them on separate Raspberry Pis demonstrates Zenoh’s distributed discovery and cross-node communication. +{{% /notice %}} + +## Observe the pub/sub data flow + The result is shown below: -![img1 alt-text#center](zenoh_ex1.gif "Figure 1: Simple Pub/Sub") +![img1 Zenoh subscriber receiving messages from a publisher in a two-terminal view#center](zenoh_ex1.gif "Simple Pub/Sub") The left-side window shows the `z_sub` program. It receives values with the key `demo/example/zenoh-rs-pub` continuously published by `z_pub` running in the right-side window. -This basic example shows Zenoh's zero-config discovery and low-latency pub/sub across physical nodes. +This example confirms that Zenoh’s zero-configuration peer discovery and real-time pub/sub communication are working correctly across physical nodes. + From ab1019c43eb7568944056e3f9ce2b3feab88b19c Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 11:34:47 +0000 Subject: [PATCH 52/63] Updates --- .../zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md | 6 ++++-- .../zenoh-multinode-ros2/6_zenoh-ex3-queryable.md | 8 +++++--- .../zenoh-multinode-ros2/7_zenoh-querycomp.md | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md index 4de6612a67..7976148a81 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md @@ -1,5 +1,6 @@ --- -title: Zenoh Example-2 Storage and Query +title: Run a Zenoh storage and query example + weight: 6 ### FIXED, DO NOT MODIFY @@ -12,7 +13,8 @@ The second example adds Zenoh's data storage and querying capabilities by enabli Building on the previous pub/sub example, you’ll now explore how Zenoh supports persistent data storage and on-demand querying, a powerful feature for robotics and IIoT applications. -In a typical warehouse or factory scenario, autonomous robots may periodically publish sensor data such as position, temperature, battery level, and a central system or another robot—may later need to query the latest state of each unit. +In a typical warehouse or factory scenario, autonomous robots can periodically publish sensor data,such as position, temperature, or battery level—that a central system or peer robot may later need to query. + Unlike Pub/Sub, which requires live, real-time message exchange, Zenoh's storage and query model enables asynchronous access to data that was published earlier, even if the original publisher is no longer online. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md index ed9d07ea5e..6928b25cef 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md @@ -1,5 +1,6 @@ --- -title: Zenoh Example-3 Computation on Query using Queryable +title: Run a Zenoh queryable example for edge computation + weight: 7 ### FIXED, DO NOT MODIFY @@ -56,9 +57,10 @@ Sending Query 'demo/example/zenoh-rs-queryable'... The result is shown below: -![img3 alt-text#center](zenoh_ex3.gif "Figure 3: Computation on Query using Queryable") +![img3 Zenoh queryable node responding to on-demand queries from a remote device#center](zenoh_ex3.gif "Figure 3: Computation on Query using Queryable") + +The value you receive is generated in real time by the function defined in the queryable handler, not from pre-stored data. -The value you receive comes not from storage, but from the computation inside the queryable handler. ### Real-world application: distributed inference and computation diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md index 1afd3c1103..ee2c54bec0 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md @@ -1,5 +1,5 @@ --- -title: Zenoh Example-4 Dynamic Queryable with Computation +title: Run a Zenoh queryable with parameterized computation weight: 8 ### FIXED, DO NOT MODIFY From 10ea8907695fba1d04972e9386b0a21c02aacbbe Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Fri, 25 Jul 2025 08:53:19 -0400 Subject: [PATCH 53/63] Update _index.md --- .../mobile-graphics-and-gaming/godot_packages/_index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md index a63388876b..cd83f8e7d1 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md @@ -1,6 +1,10 @@ --- title: Install and Use Arm integration extension in Godot +draft: true +cascade: + draft: true + minutes_to_complete: 15 who_is_this_for: This is an introductory topic for Godot developers who are targeting Android devices and want to get more insight into how their game performs on devices with Arm CPUs and GPUs. From 3fcc4f55382e9fc645653db077e7abacb795b056 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Fri, 25 Jul 2025 09:00:10 -0400 Subject: [PATCH 54/63] Update _index.md --- .../mobile-graphics-and-gaming/godot_packages/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md index cd83f8e7d1..9b272c76ab 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/_index.md @@ -1,5 +1,5 @@ --- -title: Install and Use Arm integration extension in Godot +title: Use the Arm Performance Studio Integration extension in Godot draft: true cascade: From 0a07fc63e25fc1ad6171eacc96f89e8ff44d42e5 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Fri, 25 Jul 2025 09:04:48 -0400 Subject: [PATCH 55/63] Update arm_mobile_studio_integrations.md --- .../godot_packages/arm_mobile_studio_integrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md index 5c6d2e37d6..0cec65bf3d 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md @@ -10,7 +10,7 @@ layout: learningpathall [Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a free suite of analysis tools to help you profile game performance on mobile devices with Arm CPUs and GPUs. Arm provides a Godot extension to make data from Godot games visible in the Arm Performance Studio tools, [Streamline](https://developer.arm.com/Tools%20and%20Software/Streamline%20Performance%20Analyzer) and [Performance Advisor](https://developer.arm.com/Tools%20and%20Software/Performance%20Advisor). -This package provides a simple way to incorporate annotations into your Godot project. These annotations enable you to mark the timeline with events or custom counters which provides valuable context alongside the performance data in Streamline, so you can see what was happening in the game when bottlenecks occur. For example, here we can see markers that highlight where a wave of enemies is spawning: +This package provides a simple way to incorporate annotations into your Godot project. These annotations enable you to mark the timeline with events or custom counters which provides valuable context alongside the performance data in Streamline, so you can see what was happening in the game when bottlenecks occur. For example, here you can see markers that highlight where a wave of enemies is spawning: ![Marker annotations in Streamline](sl_annotation.png "Figure 1. Marker annotations in Streamline") From 9e7bc1a6b7b685463dfd534836af507dcd03d50f Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Fri, 25 Jul 2025 09:09:18 -0400 Subject: [PATCH 56/63] Update arm_mobile_studio_integrations.md --- .../godot_packages/arm_mobile_studio_integrations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md index 0cec65bf3d..46694f3931 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md @@ -151,3 +151,5 @@ func _on_new_wave_started() -> void: func _on_wave_completed() -> void: wave_job.stop() ``` + +You can now annotate your Godot game and analyze the performance with markers that give context to a profile in Arm Performance Studio tools. From 59f1d1166d2cfe77253b99f1baaa10e2692faa58 Mon Sep 17 00:00:00 2001 From: pareenaverma Date: Fri, 25 Jul 2025 09:11:24 -0400 Subject: [PATCH 57/63] Update arm_mobile_studio_integrations.md --- .../godot_packages/arm_mobile_studio_integrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md index 46694f3931..f345ac8828 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md +++ b/content/learning-paths/mobile-graphics-and-gaming/godot_packages/arm_mobile_studio_integrations.md @@ -8,7 +8,7 @@ layout: learningpathall ## Arm Performance Studio Godot integrations -[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a free suite of analysis tools to help you profile game performance on mobile devices with Arm CPUs and GPUs. Arm provides a Godot extension to make data from Godot games visible in the Arm Performance Studio tools, [Streamline](https://developer.arm.com/Tools%20and%20Software/Streamline%20Performance%20Analyzer) and [Performance Advisor](https://developer.arm.com/Tools%20and%20Software/Performance%20Advisor). +[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a free suite of analysis tools to help you profile game performance on mobile devices with Arm CPUs and GPUs. Arm provides a Godot extension to make data from [Godot games](https://godotengine.org/) visible in the Arm Performance Studio tools, [Streamline](https://developer.arm.com/Tools%20and%20Software/Streamline%20Performance%20Analyzer) and [Performance Advisor](https://developer.arm.com/Tools%20and%20Software/Performance%20Advisor). This package provides a simple way to incorporate annotations into your Godot project. These annotations enable you to mark the timeline with events or custom counters which provides valuable context alongside the performance data in Streamline, so you can see what was happening in the game when bottlenecks occur. For example, here you can see markers that highlight where a wave of enemies is spawning: From b33c662d5f54ee399a1656c2cc46019b5f38cf81 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 15:51:12 +0000 Subject: [PATCH 58/63] Updated the Zenoh queryable example for clarity and consistency. Improved structure, simplified language, and clarified the battery health calculation. --- .../zenoh-multinode-ros2/1_intro-zenoh.md | 22 +++++++-------- .../zenoh-multinode-ros2/2_zenoh-install.md | 6 ++-- .../zenoh-multinode-ros2/3_zenoh-multinode.md | 19 +++++-------- .../4_zenoh-ex1-pubsub.md | 16 +++++------ .../5_zenoh-ex2-storagequery.md | 28 +++++++++++++------ .../6_zenoh-ex3-queryable.md | 19 +++++++------ .../zenoh-multinode-ros2/7_zenoh-querycomp.md | 27 ++++++++++-------- 7 files changed, 74 insertions(+), 63 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md index a421923fb8..9d77e9aca6 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md @@ -15,10 +15,10 @@ Such systems require fast, reliable, and scalable data communication between nod This includes not just broadcasting sensor updates or actuator commands (pub/sub), but also performing state queries, storing values for later use, and even distributed computation across nodes. A modern protocol must be: -* Low-latency: Immediate delivery of time-critical messages. -* High-throughput: Efficient data flow across many devices. -* Decentralized: No reliance on central brokers or fixed infrastructure. -* Flexible: Able to run on lightweight edge devices, across WANs, or inside cloud-native environments. +* Low-latency: immediate delivery of time-critical messages +* High-throughput: efficient data flow across many devices +* Decentralized: no reliance on central brokers or fixed infrastructure +* Flexible: able to run on lightweight edge devices, across WANs, or inside cloud-native environments Traditional communication stacks such as Data Distribution Service (DDS) serve as the backbone for middleware like ROS 2. However, DDS struggles in multi-network or wireless environments where multicast is unavailable, or NAT traversal is needed. Zenoh was developed to address these challenges with a unified approach to data movement, storage, and interaction across heterogeneous, distributed systems. @@ -26,10 +26,10 @@ Traditional communication stacks such as Data Distribution Service (DDS) serve a [Eclipse Zenoh](https://zenoh.io/) is a modern, open-source, data-centric communication protocol that goes beyond traditional pub/sub. Designed specifically for edge computing, industrial IoT, robotics, and autonomous systems, Zenoh unifies: -- Data in motion through a powerful and efficient pub/sub model. -- Data at rest via geo-distributed storage plugins. -- Data in use with direct query support. -- On-demand computation via queryable nodes that can generate data dynamically. +- Data in motion through a powerful and efficient pub/sub model +- Data at rest via geo-distributed storage plugins +- Data in use with direct query support +- On-demand computation via queryable nodes that can generate data dynamically Unlike most traditional stacks, Zenoh is fully decentralized and designed to operate across cloud-to-edge-to-thing topologies, making it ideal for industrial robotics, autonomous systems, and smart environments. @@ -42,7 +42,7 @@ In this Learning Path, you’ll use Zenoh to build and validate a multi-node dis You can substitute Raspberry Pi with any Linux-based Arm device that supports networking, such as a Cortex-A or Neoverse board. By the end of this Learning Path, you'll be able to: -- Explain the core architecture and data flow principles behind Eclipse Zenoh protocol, including its support for pub/sub, querying, and queryable edge functions. -- Build and run distributed Zenoh examples across multiple Arm-based nodes using Raspberry Pi or other Arm Linux devices. -- Rebuild and extend a Zenoh queryable node to simulate edge-side logic. +- Explain the core architecture and data flow principles behind Eclipse Zenoh protocol, including its support for pub/sub, querying, and queryable edge functions +- Build and run distributed Zenoh examples across multiple Arm-based nodes using Raspberry Pi or other Arm Linux devices +- Rebuild and extend a Zenoh queryable node to simulate edge-side logic diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md index 50359df8be..2fdac32559 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md @@ -9,11 +9,9 @@ layout: learningpathall ## Set up Zenoh on Arm devices -This section shows how to install and build the open-source Eclipse Zenoh protocol on Arm-based devices like Raspberry Pi. +This section shows you how to install and build the open-source Eclipse Zenoh protocol on Arm-based devices like Raspberry Pi. -The following instructions have been verified on Raspberry Pi 4 and 5, but you can use any Arm Linux device. These steps apply to Raspberry Pi and other Arm-based Linux platforms. - -Before building Zenoh, make sure your system has the necessary development tools and runtime libraries. +The following instructions have been verified on Raspberry Pi 4 and 5, but you can use any Arm Linux device. These steps apply to Raspberry Pi and other Arm-based Linux platforms. Before building Zenoh, make sure your system has the necessary development tools and runtime libraries. ### Install the Rust development environment diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md index 2655ab48d9..89eb8b05ca 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md @@ -11,21 +11,16 @@ layout: learningpathall After building Zenoh and its core examples, the next step is to deploy them across multiple Arm-based devices. -If you’ve already installed Zenoh on an Arm Cortex-A or Neoverse platform as shown in the previous section, you can simply copy the compiled binaries from `~/zenoh/target/release/` to each of your Raspberry Pi devices. +If you’ve already installed Zenoh on an Arm Cortex-A or Neoverse platform as shown in the previous section, you can copy the compiled binaries from `~/zenoh/target/release/` to each of your Raspberry Pi devices. -However, to streamline deployment across multiple devices and ensure repeatability, this section demonstrates how to package Zenoh into a Docker image for batch rollout and scalable testing. +To simplify and scale deployment across multiple devices, this section shows how to containerize Zenoh with Docker for streamlined distribution and consistent multi-node testing. This containerized approach enables repeatable rollouts and makes it easier to test distributed communication across Raspberry Pi, Arm cloud instances (like AWS Graviton), and Arm Virtual Hardware. -This containerized approach not only simplifies deployment on Raspberry Pi, but also integrates seamlessly with Arm cloud platforms such as AWS Graviton Arm Cortex-A Linux or Arm Virtual Hardware, enabling a consistent cloud-to-edge development and validation workflow. - -In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. - -This setup allows you to simulate real-world, cross-node communication scenarios, making it ideal for evaluating Zenoh’s performance in robotics and industrial IoT applications. +In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. This setup allows you to simulate real-world, cross-node communication scenarios, making it ideal for evaluating Zenoh’s performance in robotics and industrial IoT applications. Zenoh is ideal for robotics and industrial IoT systems that require fast, decentralized communication. It supports scalable data exchange across devices using pub/sub, storage, and query models. ### Install Docker on Raspberry Pi -To simplify this process and ensure consistency, you can use Docker to containerize your Zenoh and ROS 2 environment. -This lets you quickly replicate the same runtime on any device without needing to rebuild from source. +To simplify this process and ensure consistency, you can use Docker to containerize your Zenoh and ROS 2 environment. This lets you quickly replicate the same runtime on any device without needing to rebuild from source. -This enables multi-node testing and real-world distributed communication scenarios. +This enables scalable, multi-node testing in realistic distributed environments. First, install Docker on each Raspberry Pi device: @@ -146,9 +141,9 @@ docker run -it --network=host zenoh-node The Zenoh example binaries are now available within this container, allowing you to test pub/sub and query flows across devices. -## Run Zenoh in a multi-node environment +## Run Zenoh examples in a multi-node environment -You’re now ready to run and test Zenoh communication flows across distributed edge devices. +With Zenoh running inside containers across devices, you’re now ready to explore real-time communication using prebuilt examples. The following examples are written in Rust and precompiled in your container image. They're fully interoperable and can be used to demonstrate Zenoh's key capabilities across devices. The Rust binaries are available in the `$ZENOH_LOC/target/release/examples/` directory. If you haven't set `ZENOH_LOC`, they can be found under `~/zenoh/target/release/examples/`. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md index 8d6f2bf388..b1b5571c0e 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md @@ -12,18 +12,18 @@ This example demonstrates Zenoh's real-time publish/subscribe model across two R The subscriber listens for all data published under the key expression `demo/example/**`, which matches any topic beginning with `demo/example/`. -## Start the subscriber node +### Start the subscriber node -Run the subscriber example on one of the Raspberry Pi systems. +Run the subscriber example on one of the Raspberry Pi systems: ```bash cd ~/zenoh/target/release/examples ./z_sub ``` -## Start the publisher node +### Start the publisher node -Then, log in to the other Raspberry Pi and run the publisher. +Then, log in to the other Raspberry Pi and run the publisher: ```bash cd ~/zenoh/target/release/examples @@ -34,15 +34,13 @@ cd ~/zenoh/target/release/examples You can run both `z_sub` and `z_pub` on the same device for testing, but running them on separate Raspberry Pis demonstrates Zenoh’s distributed discovery and cross-node communication. {{% /notice %}} -## Observe the pub/sub data flow +### Observe the pub/sub data flow -The result is shown below: +The results are shown below: ![img1 Zenoh subscriber receiving messages from a publisher in a two-terminal view#center](zenoh_ex1.gif "Simple Pub/Sub") -The left-side window shows the `z_sub` program. - -It receives values with the key `demo/example/zenoh-rs-pub` continuously published by `z_pub` running in the right-side window. +The left-side window shows the `z_sub` program. It receives values with the key `demo/example/zenoh-rs-pub` continuously published by `z_pub` running in the right-side window. This example confirms that Zenoh’s zero-configuration peer discovery and real-time pub/sub communication are working correctly across physical nodes. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md index 7976148a81..ffed116367 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md @@ -7,14 +7,17 @@ weight: 6 layout: learningpathall --- -## Example 2: Storage and query +## Query historical data using Zenoh’s storage engine -The second example adds Zenoh's data storage and querying capabilities by enabling nodes to retrieve historical values on demand. +This example demonstrates Zenoh's data storage and query model which enables nodes to retrieve previously published values—even after the original publisher goes offline. -Building on the previous pub/sub example, you’ll now explore how Zenoh supports persistent data storage and on-demand querying, a powerful feature for robotics and IIoT applications. +Building on the previous pub/sub example, you’ll now run a lightweight Zenoh daemon that stores key–value pairs in memory. Then, you’ll publish data with `z_put` and retrieve it using `z_get`. -In a typical warehouse or factory scenario, autonomous robots can periodically publish sensor data,such as position, temperature, or battery level—that a central system or peer robot may later need to query. +This pattern is ideal for robotics and IIoT scenarios where devices intermittently connect or request snapshots of remote state. +For example, in a warehouse or factory: +- Robots can periodically publish position, temperature, or battery level +- A central system or peer node can later query these values on demand Unlike Pub/Sub, which requires live, real-time message exchange, Zenoh's storage and query model enables asynchronous access to data that was published earlier, even if the original publisher is no longer online. @@ -22,7 +25,7 @@ In this example, you’ll run the `zenohd` daemon with in-memory storage and use This is especially useful for distributed systems where nodes may intermittently connect or request snapshots of state from peers. -### Step 1: Start the Zenoh daemon with in-memory storage +### Start the Zenoh daemon with in-memory storage On one Raspberry Pi, launch the Zenoh daemon with a configuration that enables in-memory storage for keys in the `demo/example/**` directory. @@ -37,7 +40,7 @@ You should see log messages indicating that the storage_manager plugin is loaded If port 7447 is already in use, either stop any previous Zenoh processes or configure a custom port using the `listen.endpoints.router` setting. -### Step 2: Publish data +### Publish a value On 2nd Raspberry Pi device, use `z_put` to send a key-value pair that will be handled by the `zenohd` storage. @@ -48,7 +51,7 @@ cd ~/zenoh/target/release/examples This command stores the string `Hello from storage!` under the key demo/example/test1. -### Step 3: Query the data +### Query the stored value Back on first Raspberry Pi, you can now query the stored data from any Zenoh connected node. @@ -68,9 +71,18 @@ The result is shown below: ![img2 alt-text#center](zenoh_ex2.gif "Figure 2: Storage and Query") -{{% notice tip %}} +{{% notice Tip %}} If you have more than two Raspberry Pi devices, you can run the `z_get` command on a third device to validate that storage queries work seamlessly across a multi-node setup. {{% /notice %}} This example shows how Zenoh's storage with query model supports asynchronous data access and resilient state-sharing—critical capabilities in robotics and industrial IoT systems where network connectivity may be intermittent or system components loosely coupled. +## What's next + +Now that you've seen how Zenoh handles pub/sub and storage-based queries, you're ready to build reactive and intelligent edge nodes. + +In the next example, you’ll implement a **Zenoh queryable** that responds to runtime parameters,such as battery level and temperature, by computing and returning a real-time health score. This showcases how Zenoh supports on-demand edge computation without needing to pre-store data. + + + + diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md index 6928b25cef..acc348768c 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md @@ -1,5 +1,5 @@ --- -title: Run a Zenoh queryable example for edge computation +title: Run a Zenoh queryable node for on-demand edge computation weight: 7 @@ -7,19 +7,19 @@ weight: 7 layout: learningpathall --- -## Example 3: Computation on query +## Computation on query -Next, you’ll explore Zenoh's queryable capability, which lets a node dynamically respond to data queries by executing a custom computation or data generation function. +This example demonstrates Zenoh's queryable capability, which lets a node respond to incoming data requests by computing results in real time, rather than returning previously stored values. Unlike `zenohd` which simply returns stored data, a queryable node can register to handle a specific key expression and generate responses at runtime. This is ideal for distributed computing at the edge, where lightweight devices, such as Raspberry Pi nodes, can respond to requests with calculated values. This enables sensor fusion, AI inference results, and diagnostics. -### Use Case: On-Demand battery health estimation +### Use case: estimate battery health on demand Imagine a robot fleet management system where the central planner queries each robot for its latest battery health score, which is not published continuously but calculated only when queried. -This saves bandwidth and enables edge compute optimization using Zenoh's Queryable. +This reduces bandwidth usage and enables edge-side optimization using Zenoh's queryable feature. -### Step 1: Launch a queryable node +### Launch a queryable node On one Raspberry Pi device, run the `z_queryable` Zenoh example to register a queryable handler. @@ -38,7 +38,7 @@ Press CTRL-C to quit... The node is now ready to accept queries on the key `demo/example/zenoh-rs-queryable` and respond with a predefined message. -### Step 2: Trigger a query from another node +### Trigger a query from another node On the other Raspberry Pi device, run the `z_get` example. @@ -71,4 +71,7 @@ This model enables edge-based intelligence, such as: Queryable is a key feature for data-in-use scenarios, allowing fine-grained, on-demand compute inside your Zenoh-powered architecture. -Next, you’ll extend this Queryable pattern to perform parameterized computation, simulating edge diagnostics and adaptive inference. \ No newline at end of file +## What's next + +In the next example, you'll extend this queryable pattern to support **runtime parameters**, such as battery level and temperature, allowing each node to return a calculated health score on demand. + diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md index ee2c54bec0..5708a5f219 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md @@ -1,5 +1,5 @@ --- -title: Run a Zenoh queryable with parameterized computation +title: Run a Zenoh queryable with parameterized Rust computation weight: 8 ### FIXED, DO NOT MODIFY @@ -14,7 +14,7 @@ You’ll learn how to use Zenoh's Queryable API in Rust to build a parameterized This extends a previous example by supporting runtime query parameters like battery level and temperature. -## Use Case: Real-time battery health via computation +## Use case: real-time battery health through on-demand computation In robotic fleet management, a central controller may need to assess each robot’s battery health on demand. @@ -22,7 +22,7 @@ Instead of streaming data continuously, robots expose a queryable endpoint that This saves bandwidth and enables lightweight edge-side decision-making. -### Step 1: Create a new Zenoh rust project +### Create a new Zenoh rust project On any Raspberry Pi: @@ -40,7 +40,7 @@ tokio = { version = "1", features = ["full"] } url = "2" ``` -### Step 2: Implement the queryable node +### Implement the queryable node Next, log in to the other Raspberry Pi. @@ -103,8 +103,14 @@ Inside the callback: - A health score is computed from these inputs. - The result is sent back to the querying client using query.reply(). +{{% notice Tip %}} +You can extend this queryable pattern to respond to other real-time diagnostics, such as CPU load, camera snapshots, or local ML inference results. +{{% /notice %}} + This design pattern enables efficient, on-demand data exchange with minimal bandwidth usage. This is ideal for edge computing scenarios where resources and connectivity are constrained. +### Battery health estimation formula + The health score is calculated using the following logic: ```rust @@ -115,16 +121,15 @@ This formula estimates battery health as a percentage, considering both battery - battery: Current battery level (default 50%) - temp: Current temperature (default 25°C) -The health estimation logic begins with the battery level as the baseline score. -If the temperature rises above 25°C, the score is adjusted downward—specifically, for every 2°C above this threshold, the health is reduced by 1%. +This logic computes battery health as a percentage, adjusting for elevated temperatures. If temperature exceeds 25°C, the score is reduced by 1% for every 2°C increase. To ensure the calculation remains safe even when the temperature is below 25°C, the code uses saturating_sub(25), which prevents the result from becoming negative and avoids potential underflow errors. -For example, if battery = 88 and temp = 32, then: +For example, if `battery = 88` and `temp = 32`, then: - Temperature offset = (32 - 25) / 2 = 3 - Health = 88 - 3 = 85% -### Step 3: Build and run +### Build and run ```bash cd $HOME/zenoh/zenoh_battery_estimator @@ -138,7 +143,7 @@ After the build process, you will see: Finished `release` profile [optimized] target(s) in 1m 22s ``` -### Step 4: Query it with parameters +### Query it with parameters Run it on the Raspberry Pi you used for the build run: @@ -156,9 +161,9 @@ cd ~/zenoh/target/release/examples The result is shown below: -![img4 alt-text#center](zenoh_ex4.gif "Figure 4: Dynamic Queryable with Computation") +![img4 Estimated battery health query#center](zenoh_ex4.gif "Figure 4: Dynamic Queryable with Computation") -The excepted output is: +The expected output is: ```output >> Received ('robot/battery/estimate': 'Estimated battery health: 85%') From 008b4ec049a8ad0f6da12da1b6747ee3a9af32ae Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 16:24:39 +0000 Subject: [PATCH 59/63] updates --- .../cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md index 9d77e9aca6..3b46ee7423 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/1_intro-zenoh.md @@ -1,5 +1,5 @@ --- -title: Introduction to Zenoh +title: Build scalable communication systems with Eclipse Zenoh weight: 2 ### FIXED, DO NOT MODIFY From fd5f1561acf7e87b79c36c82a82b6e9b04b1d619 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 16:26:52 +0000 Subject: [PATCH 60/63] Updates --- .../zenoh-multinode-ros2/2_zenoh-install.md | 6 +++--- .../zenoh-multinode-ros2/3_zenoh-multinode.md | 19 +++++++++---------- .../4_zenoh-ex1-pubsub.md | 10 +++++----- .../5_zenoh-ex2-storagequery.md | 6 +++--- .../6_zenoh-ex3-queryable.md | 15 +++++++-------- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md index 2fdac32559..2c40074624 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/2_zenoh-install.md @@ -13,7 +13,7 @@ This section shows you how to install and build the open-source Eclipse Zenoh pr The following instructions have been verified on Raspberry Pi 4 and 5, but you can use any Arm Linux device. These steps apply to Raspberry Pi and other Arm-based Linux platforms. Before building Zenoh, make sure your system has the necessary development tools and runtime libraries. -### Install the Rust development environment +## Install the Rust development environment First, install the [Rust](https://www.rust-lang.org/) environment. The core of Zenoh is developed in Rust for performance and safety. @@ -36,13 +36,13 @@ source "$HOME/.cargo/env" For more information, see the [Rust Install Guide](/install-guides/rust/) for Arm Linux. -### Install ROS 2 +## Install ROS 2 [Robot Operating System](https://www.ros.org/) is a set of software libraries and tools that help you build robot applications. ROS provides everything from drivers to state-of-the-art algorithms, as well as developer tools. It is completely open-source. If you plan to use Zenoh alongside ROS 2, for example, to bridge DDS-based nodes, you should install ROS 2 before proceeding. See the [ROS2 Installation Guide](/install-guides/ros2/) to install ROS 2 on your Arm platforms. -### Download and build the Zenoh source +## Download and build the Zenoh source Clone the Zenoh repository: diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md index 89eb8b05ca..bc7f7ccaf7 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/3_zenoh-multinode.md @@ -15,9 +15,9 @@ If you’ve already installed Zenoh on an Arm Cortex-A or Neoverse platform as s To simplify and scale deployment across multiple devices, this section shows how to containerize Zenoh with Docker for streamlined distribution and consistent multi-node testing. This containerized approach enables repeatable rollouts and makes it easier to test distributed communication across Raspberry Pi, Arm cloud instances (like AWS Graviton), and Arm Virtual Hardware. -In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. This setup allows you to simulate real-world, cross-node communication scenarios, making it ideal for evaluating Zenoh’s performance in robotics and industrial IoT applications. Zenoh is ideal for robotics and industrial IoT systems that require fast, decentralized communication. It supports scalable data exchange across devices using pub/sub, storage, and query models. +In this session, you’ll use Raspberry Pi boards to simulate a scalable distributed environment. The same workflow applies to any Arm Linux system, including cloud instances and virtual hardware. This setup allows you to simulate real-world, cross-node communication scenarios, making it ideal for evaluating Zenoh’s performance in robotics and industrial IoT applications. This setup simulates real-world, cross-node communication scenarios, making it ideal for robotics and industrial IoT applications that require fast, decentralized messaging using pub/sub, storage, and query models. -### Install Docker on Raspberry Pi +## Install Docker on Raspberry Pi To simplify this process and ensure consistency, you can use Docker to containerize your Zenoh and ROS 2 environment. This lets you quickly replicate the same runtime on any device without needing to rebuild from source. This enables scalable, multi-node testing in realistic distributed environments. @@ -29,7 +29,7 @@ curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh sudo usermod -aG docker $USER ; newgrp docker ``` -### Create a ROS 2 + Zenoh Docker image +## Create a Docker image with ROS 2 and Zenoh To ensure compatibility with ROS-related tools, create a `Dockerfile` based on `ros:galactic `, and use the official Rust installation method to build Zenoh, as shown below. @@ -107,11 +107,12 @@ docker pull odinlmshen/zenoh-node Once built, you can reuse this Docker image across multiple Arm-based nodes, including Raspberry Pi, AWS Graviton, and Arm Virtual Hardware. {{% /notice %}} -### Transfer the Docker image to the other Raspberry Pi +## Transfer the Docker image to another Raspberry Pi + There are two options to transfer the Docker image to your second device. Choose one of the following methods. -Option 1: Save and copy via file +1. Save and copy using the file: ```bash docker save zenoh-node > zenoh-node.tar @@ -124,14 +125,11 @@ On the target device: docker load < zenoh-node.tar ``` -Option 2: Push the image to a container registry such as Docker Hub +2. Push the image to a container registry such as Docker Hub: You can also push the image to Docker Hub or GitHub Container Registry and pull it on the second device. - - - -### Run the Docker image +## Run the Docker image Once the image is successfully loaded on the second device, you can run the container to start the Zenoh environment. @@ -154,3 +152,4 @@ The following sections illustrate the procedures to run the Zenoh examples so as - Queryable – for enabling on-demand remote computation - Dynamic queryable with computation – for executing dynamic logic across nodes +With your Zenoh examples running across containers, you’re now ready to build and benchmark real-time communication flows across nodes, which is ideal for simulating robotic fleets or industrial systems. \ No newline at end of file diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md index b1b5571c0e..08c889a2ef 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/4_zenoh-ex1-pubsub.md @@ -8,11 +8,11 @@ layout: learningpathall ## Test Zenoh pub/sub across two devices -This example demonstrates Zenoh's real-time publish/subscribe model across two Raspberry Pi devices. +This example demonstrates how to use Zenoh’s real-time publish/subscribe model to exchange messages between two Raspberry Pi devices over a local network. -The subscriber listens for all data published under the key expression `demo/example/**`, which matches any topic beginning with `demo/example/`. +Pub/sub is a core Zenoh communication pattern where data producers (publishers) send values to a key, and data consumers (subscribers) receive updates for matching key expressions. In this case, the subscriber listens for all messages published under the key expression `demo/example/**`, which matches any topic that begins with `demo/example/`. This enables flexible topic filtering and lightweight data dissemination across distributed systems. -### Start the subscriber node +## Start the subscriber node Run the subscriber example on one of the Raspberry Pi systems: @@ -21,7 +21,7 @@ cd ~/zenoh/target/release/examples ./z_sub ``` -### Start the publisher node +## Start the publisher node Then, log in to the other Raspberry Pi and run the publisher: @@ -34,7 +34,7 @@ cd ~/zenoh/target/release/examples You can run both `z_sub` and `z_pub` on the same device for testing, but running them on separate Raspberry Pis demonstrates Zenoh’s distributed discovery and cross-node communication. {{% /notice %}} -### Observe the pub/sub data flow +## Observe the pub/sub data flow The results are shown below: diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md index ffed116367..f8f51f79e1 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md @@ -25,7 +25,7 @@ In this example, you’ll run the `zenohd` daemon with in-memory storage and use This is especially useful for distributed systems where nodes may intermittently connect or request snapshots of state from peers. -### Start the Zenoh daemon with in-memory storage +## Start the Zenoh daemon with in-memory storage On one Raspberry Pi, launch the Zenoh daemon with a configuration that enables in-memory storage for keys in the `demo/example/**` directory. @@ -40,7 +40,7 @@ You should see log messages indicating that the storage_manager plugin is loaded If port 7447 is already in use, either stop any previous Zenoh processes or configure a custom port using the `listen.endpoints.router` setting. -### Publish a value +## Publish a value On 2nd Raspberry Pi device, use `z_put` to send a key-value pair that will be handled by the `zenohd` storage. @@ -51,7 +51,7 @@ cd ~/zenoh/target/release/examples This command stores the string `Hello from storage!` under the key demo/example/test1. -### Query the stored value +## Query the stored value Back on first Raspberry Pi, you can now query the stored data from any Zenoh connected node. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md index acc348768c..5787eebfb2 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md @@ -9,17 +9,17 @@ layout: learningpathall ## Computation on query -This example demonstrates Zenoh's queryable capability, which lets a node respond to incoming data requests by computing results in real time, rather than returning previously stored values. +This example shows how to use Zenoh’s queryable feature to return computed results in real time, instead of serving pre-stored values. -Unlike `zenohd` which simply returns stored data, a queryable node can register to handle a specific key expression and generate responses at runtime. This is ideal for distributed computing at the edge, where lightweight devices, such as Raspberry Pi nodes, can respond to requests with calculated values. This enables sensor fusion, AI inference results, and diagnostics. +Unlike `zenohd` which simply returns stored data, a queryable node can register to handle a specific key expression and generate responses at runtime. This is ideal for distributed computing at the edge, where lightweight devices, such as Raspberry Pi nodes, can respond to requests with calculated values. This pattern is ideal for sensor fusion, lightweight AI inference, and dynamic system diagnostics on resource-constrained edge devices. -### Use case: estimate battery health on demand +## Use case: estimate battery health on demand Imagine a robot fleet management system where the central planner queries each robot for its latest battery health score, which is not published continuously but calculated only when queried. This reduces bandwidth usage and enables edge-side optimization using Zenoh's queryable feature. -### Launch a queryable node +## Launch a queryable node On one Raspberry Pi device, run the `z_queryable` Zenoh example to register a queryable handler. @@ -38,7 +38,7 @@ Press CTRL-C to quit... The node is now ready to accept queries on the key `demo/example/zenoh-rs-queryable` and respond with a predefined message. -### Trigger a query from another node +## Trigger a query from another node On the other Raspberry Pi device, run the `z_get` example. @@ -59,10 +59,9 @@ The result is shown below: ![img3 Zenoh queryable node responding to on-demand queries from a remote device#center](zenoh_ex3.gif "Figure 3: Computation on Query using Queryable") -The value you receive is generated in real time by the function defined in the queryable handler, not from pre-stored data. +The response is generated dynamically by the queryable handler, and not fetched from stored data. - -### Real-world application: distributed inference and computation +## Real-world use cases This model enables edge-based intelligence, such as: - Executing custom logic in response to a query such as “calculate load average” From bd15adce029bd50ea692cbd2e8f5c3103b94fe18 Mon Sep 17 00:00:00 2001 From: Maddy Underwood Date: Fri, 25 Jul 2025 16:37:35 +0000 Subject: [PATCH 61/63] final --- .../zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md | 6 +++--- .../zenoh-multinode-ros2/6_zenoh-ex3-queryable.md | 2 +- .../zenoh-multinode-ros2/7_zenoh-querycomp.md | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md index f8f51f79e1..c7bb8846ab 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/5_zenoh-ex2-storagequery.md @@ -16,8 +16,8 @@ Building on the previous pub/sub example, you’ll now run a lightweight Zenoh d This pattern is ideal for robotics and IIoT scenarios where devices intermittently connect or request snapshots of remote state. For example, in a warehouse or factory: -- Robots can periodically publish position, temperature, or battery level -- A central system or peer node can later query these values on demand +- Robots can periodically publish position, temperature, or battery level. +- A central system or peer node can later query these values on demand. Unlike Pub/Sub, which requires live, real-time message exchange, Zenoh's storage and query model enables asynchronous access to data that was published earlier, even if the original publisher is no longer online. @@ -77,7 +77,7 @@ If you have more than two Raspberry Pi devices, you can run the `z_get` command This example shows how Zenoh's storage with query model supports asynchronous data access and resilient state-sharing—critical capabilities in robotics and industrial IoT systems where network connectivity may be intermittent or system components loosely coupled. -## What's next +## What's next? Now that you've seen how Zenoh handles pub/sub and storage-based queries, you're ready to build reactive and intelligent edge nodes. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md index 5787eebfb2..8bd96ce9c0 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/6_zenoh-ex3-queryable.md @@ -70,7 +70,7 @@ This model enables edge-based intelligence, such as: Queryable is a key feature for data-in-use scenarios, allowing fine-grained, on-demand compute inside your Zenoh-powered architecture. -## What's next +## What's next? In the next example, you'll extend this queryable pattern to support **runtime parameters**, such as battery level and temperature, allowing each node to return a calculated health score on demand. diff --git a/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md b/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md index 5708a5f219..c017ec8ca1 100644 --- a/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md +++ b/content/learning-paths/cross-platform/zenoh-multinode-ros2/7_zenoh-querycomp.md @@ -22,7 +22,7 @@ Instead of streaming data continuously, robots expose a queryable endpoint that This saves bandwidth and enables lightweight edge-side decision-making. -### Create a new Zenoh rust project +## Create a new Zenoh rust project On any Raspberry Pi: @@ -40,7 +40,7 @@ tokio = { version = "1", features = ["full"] } url = "2" ``` -### Implement the queryable node +## Implement the queryable node Next, log in to the other Raspberry Pi. @@ -109,7 +109,7 @@ You can extend this queryable pattern to respond to other real-time diagnostics, This design pattern enables efficient, on-demand data exchange with minimal bandwidth usage. This is ideal for edge computing scenarios where resources and connectivity are constrained. -### Battery health estimation formula +## Battery health estimation formula The health score is calculated using the following logic: @@ -129,7 +129,7 @@ For example, if `battery = 88` and `temp = 32`, then: - Temperature offset = (32 - 25) / 2 = 3 - Health = 88 - 3 = 85% -### Build and run +## Build and run ```bash cd $HOME/zenoh/zenoh_battery_estimator @@ -143,7 +143,7 @@ After the build process, you will see: Finished `release` profile [optimized] target(s) in 1m 22s ``` -### Query it with parameters +## Query it with parameters Run it on the Raspberry Pi you used for the build run: From f26837d52e830fb24c4b42cf75a003c3878f68b1 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 25 Jul 2025 14:09:46 -0500 Subject: [PATCH 62/63] spelling --- .wordlist.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.wordlist.txt b/.wordlist.txt index 6db9d2c963..796f136e22 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -4469,4 +4469,9 @@ tekton tektoncd tkn verifiably -vhd \ No newline at end of file +vhd +AssetLib +PerformanceStudio +VkThread +precompiled +rollouts \ No newline at end of file From fd3c2d021e9b1005cb50711977fe358eda243545 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 25 Jul 2025 14:13:14 -0500 Subject: [PATCH 63/63] category updates --- content/learning-paths/automotive/_index.md | 3 +++ content/learning-paths/iot/_index.md | 2 ++ .../laptops-and-desktops/_index.md | 2 +- .../mobile-graphics-and-gaming/_index.md | 11 ++++++----- .../servers-and-cloud-computing/_index.md | 16 ++++++++-------- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/content/learning-paths/automotive/_index.md b/content/learning-paths/automotive/_index.md index 8a002e10db..d58b01c2eb 100644 --- a/content/learning-paths/automotive/_index.md +++ b/content/learning-paths/automotive/_index.md @@ -20,9 +20,12 @@ operatingsystems_filter: tools_software_languages_filter: - Automotive: 1 - C: 1 +- DDS: 1 - Docker: 2 - Python: 2 - Raspberry Pi: 1 - ROS 2: 1 - ROS2: 2 +- Rust: 1 +- Zenoh: 1 --- diff --git a/content/learning-paths/iot/_index.md b/content/learning-paths/iot/_index.md index 90e093d397..35b89dabc2 100644 --- a/content/learning-paths/iot/_index.md +++ b/content/learning-paths/iot/_index.md @@ -39,5 +39,7 @@ tools_software_languages_filter: - Raspberry Pi: 4 - Remote.It: 1 - ROS2: 1 +- Rust: 1 - VS Code: 1 +- Zenoh: 1 --- diff --git a/content/learning-paths/laptops-and-desktops/_index.md b/content/learning-paths/laptops-and-desktops/_index.md index 8f16771eb3..47c7b9b83f 100644 --- a/content/learning-paths/laptops-and-desktops/_index.md +++ b/content/learning-paths/laptops-and-desktops/_index.md @@ -34,8 +34,8 @@ tools_software_languages_filter: - C/C++: 4 - CCA: 1 - Clang: 11 -- CMake: 2 - cmake: 1 +- CMake: 2 - Coding: 16 - CSS: 1 - Daytona: 1 diff --git a/content/learning-paths/mobile-graphics-and-gaming/_index.md b/content/learning-paths/mobile-graphics-and-gaming/_index.md index 0ea7407037..2721c997a3 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/_index.md @@ -10,14 +10,14 @@ key_ip: maintopic: true operatingsystems_filter: - Android: 31 -- Linux: 27 -- macOS: 12 -- Windows: 11 +- Linux: 28 +- macOS: 13 +- Windows: 12 subjects_filter: - Gaming: 6 - Graphics: 6 - ML: 10 -- Performance and Architecture: 31 +- Performance and Architecture: 32 subtitle: Optimize Android apps and build faster games using cutting-edge Arm tech title: Mobile, Graphics, and Gaming tools_software_languages_filter: @@ -29,7 +29,7 @@ tools_software_languages_filter: - Android Studio: 10 - Arm Development Studio: 1 - Arm Mobile Studio: 1 -- Arm Performance Studio: 2 +- Arm Performance Studio: 3 - assembly: 1 - Bazel: 1 - C: 2 @@ -44,6 +44,7 @@ tools_software_languages_filter: - Frame Advisor: 1 - GCC: 10 - GenAI: 2 +- Godot: 1 - GoogleTest: 1 - Hugging Face: 5 - Java: 6 diff --git a/content/learning-paths/servers-and-cloud-computing/_index.md b/content/learning-paths/servers-and-cloud-computing/_index.md index 5176ae893e..2cf5628cc6 100644 --- a/content/learning-paths/servers-and-cloud-computing/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/_index.md @@ -8,7 +8,7 @@ key_ip: maintopic: true operatingsystems_filter: - Android: 2 -- Linux: 153 +- Linux: 154 - macOS: 10 - Windows: 14 pinned_modules: @@ -19,7 +19,7 @@ pinned_modules: - migration subjects_filter: - CI-CD: 6 -- Containers and Virtualization: 28 +- Containers and Virtualization: 29 - Databases: 15 - Libraries: 9 - ML: 28 @@ -53,10 +53,10 @@ tools_software_languages_filter: - AWS Elastic Container Service (ECS): 1 - AWS Elastic Kubernetes Service (EKS): 3 - AWS Graviton: 1 -- Azure CLI: 1 +- Azure CLI: 2 - Azure Portal: 1 -- bash: 2 - Bash: 1 +- bash: 2 - Bastion: 3 - BOLT: 2 - bpftool: 1 @@ -99,7 +99,7 @@ tools_software_languages_filter: - GoogleTest: 1 - HammerDB: 1 - Herd7: 1 -- Hugging Face: 9 +- Hugging Face: 10 - InnoDB: 1 - Intrinsics: 1 - iPerf3: 1 @@ -112,7 +112,6 @@ tools_software_languages_filter: - Libamath: 1 - libbpf: 1 - Linaro Forge: 1 -- Linux: 1 - Litmus7: 1 - Llama.cpp: 1 - LLM: 9 @@ -125,8 +124,8 @@ tools_software_languages_filter: - MongoDB: 2 - mpi: 1 - MySQL: 9 -- Neon: 3 - NEON: 4 +- Neon: 3 - Nexmark: 1 - Nginx: 3 - Node.js: 3 @@ -141,6 +140,7 @@ tools_software_languages_filter: - PostgreSQL: 4 - Python: 28 - PyTorch: 9 +- QEMU: 1 - RAG: 1 - Redis: 3 - Remote.It: 2 @@ -180,6 +180,6 @@ weight: 1 cloud_service_providers_filter: - AWS: 17 - Google Cloud: 13 -- Microsoft Azure: 9 +- Microsoft Azure: 10 - Oracle: 2 ---