From f12cd6e722e963a97776eaf4ef2e93c444f4f5bf Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Sun, 5 Sep 2021 09:27:36 +0200 Subject: [PATCH] Update to v6.0.1-v132 --- README.md | 16 +++-- common/propsconf_conf | 15 +++- common/propsconf_late | 8 ++- common/util_functions.sh | 147 +++++++++++++++++++++++++++++---------- module.prop | 4 +- service.sh | 17 ++--- system/binpath/props | Bin 104572 -> 115045 bytes 7 files changed, 155 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 5f8b2ad..b41c3f6 100644 --- a/README.md +++ b/README.md @@ -400,7 +400,9 @@ There are a couple of persistent options that you can set for the `props` script ### Boot stage It's possible to move the execution of the boot script from the default system.prop file to either post-fs-data or late_start service. If there are any kind of issues during boot or that props don't set properly, try changing the boot stage to either post-fs-data or late_start service instead. Just keep in mind that this might cause other issues like the fingerprint not setting properly (if set during late_start service) or that post-fs-data will be interupted by having too many props causing the script to run too slow. -It is also possible to set individual props, like fingerprint, security patch date and custom props individualy. There'll be an option under the corresponding menu. +It is also possible to set individual props, like fingerprint, security patch date and custom props individualy. There'll be an option under the corresponding menu + +If boot stage is set to late_start service, general execution or for specific prop types, it is also possible to enable a soft reboot after these props are changed. This can sometimes be needed for a prop to properly be set to memory at such a late stage in the boot process, so if a prop doesn't appear to be set properly during the late_start service boot stage, try enabling this option. This feature is disabled by default since it has the possibility to cause issues on some devices. Note: post-fs-data runs earlier than system.prop and late_start service runs after, right at the end of the boot process. Having to many props set in post-fs-data may have an adverse effect on the boot process and may result in props not being set properly. Using the default system.prop file or late_start service is prefered if possible. @@ -432,7 +434,7 @@ If you have a lot of different props set it can be handy to have a [configuratio ## Configuration file You can use a configuration file to set your desired options, rather than running the `props` command. This is particularly useful if you have a large amount of custom props you want to set. Download the [settings file](https://raw.githubusercontent.com/Magisk-Modules-Repo/MagiskHide-Props-Config/master/common/propsconf_conf), extract it from the module zip (in the /common folder) or copy it from the module directory under /data/adb (in the /common folder), fill in the desired options (follow the instructions in the file), place it in the root of your internal storage (/sdcard), in /data or in /cache (or /data/cache if you're using an A/B device) and reboot. You can also use the configuration file when first installing the module. Just place the file in the root of your internal storage (or one of the other previously mentioned locations) before flashing the module and the installation script will set everything up. -**NOTE!** If a configuration file is used during boot there will be a reboot during the late_start service boot mode, to load the newly set up values. This can cause issues for devices that have to boot through recovery for Magisk to be active (A-only SAR devices), so a manual reboot after the automatic one will be necessary (or just use the configuration file at install instead). +**NOTE!** If a configuration file is used during boot there will be a reboot during the late_start service boot stage, to load the newly set up values. This can cause issues for devices that have to boot through recovery for Magisk to be active (A-only SAR devices), so a manual reboot after the automatic one will be necessary (or just use the configuration file at install instead). If you edit the configuration file in Windows, make sure that you use a text editor that can handle [Unix file endings](https://en.m.wikipedia.org/wiki/Newline), such as Notepad++ and similar editors (not regular Windows Notepad). @@ -522,6 +524,8 @@ This module can usually only really help with the ctsProfile check, by spoofing ### Props don't seem to set properly If it seems like props you're trying to set with the module don't get set properly (ctsProfile still doesn't pass, custom props don't work, etc), go into the script options and change the boot stage at which the props are being set, or change the boot stage for that particular prop, to late_start service. See ["Boot stage"](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config#boot-stage) or ["Custom prop values"](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config/blob/master/README.md#changeset-custom-prop-values) above. This might happen because the particular prop you're trying to set get assigned it's value late in the boot process and by setting the boot stage for the prop to the last one available (late_start service) you optimise the chances of the module setting the prop after the system. +If the boot stage already is set to the late_start service stage you might need to activate the soft reboot option for that particular setting. Sometimes a soft reboot is required after setting a prop for the value to be properly loaded into memory. + This may also be caused by the post-fs-data.sh script being set to run in the background because of the execution taking to long. Try disabling this option in the [script settings](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config/blob/master/README.md#prop-script-settings) and see if that changes anything. There is also a possibility that the prop value you are trying to set is too long. This is only an issue on Magisk releases up until build 22006, where the prop value is limited to 91 characters. Builds after that should not have this issue. @@ -556,11 +560,11 @@ If boot takes longer than usual after setting a new fingerprint or a custom prop ### There's a reboot during boot -This happens when any prop is set during the late_start service boot stage. A soft reboot is necessary to properly load the new prop values. +This happens when any prop is set during the late_start service boot stage and the soft reboot option is enabled. A soft reboot can sometime be necessary to properly load the new prop values, but also has the potential for causing issues on some devices. ### The screen goes black momentarily at boot -See the section directly above. +See the section directly above about an additional reboot. Same thing. ### The Play Store is "uncertified" @@ -610,6 +614,10 @@ Releases from v5.4.0 will only install on Magisk v20.4+. ## Changelog +### v6.0.1 +- Quickfix update to make the soft reboot when setting props in the late_start service boot stage an option. It has the potential for causing issues it seems (mainly on Samsung devices apparently). See the documentation for details. +- Minor UI fixes and optimisations. + ### v6.0.0 - Updated the "Edit MagiskHide props" feature to include all the sensitive prop values that MagiskHide changed, up to and including Magisk v23. All props will now be set by default. See the documentation for details. - Alter the permissions for SELinux files if SELinux is permissive (was included in MagiskHide up to Magisk v23). diff --git a/common/propsconf_conf b/common/propsconf_conf index d89938d..e448d8d 100644 --- a/common/propsconf_conf +++ b/common/propsconf_conf @@ -9,7 +9,7 @@ # ================================================================= # Required module version (or newer). Do not edit this value! -CONFTRANSF=600 +CONFTRANSF=601 # Device fingerprint CONFFINGERPRINT="" @@ -69,6 +69,14 @@ PROPOPTION=replace CONFDELPROPS="" DELPROPOPTION=replace +# Soft reboot options +CONFOPTIONSOFTBOOT=false +CONFPRINTSOFTBOOT=false +CONFPATCHSOFTBOOT=false +CONFSIMSOFTBOOT=false +CONFCUSTOMSOFTBOOT=false +CONFPROPSOFTBOOT=false + # Module settings CONFBOOT=default CONFCOLOUR=true @@ -220,6 +228,11 @@ CONFBACK=false # This option supersedes the preserve option described above, but only # for the CONFDELPROPS variable. +# The soft rebooot options can be set to true if you need a soft reboot at the +# end of the boot process when props are set during the late_start service boot stage. +# CONFOPTIONSOFTBOOT, CONFPRINTSOFTBOOT, CONFPATCHSOFTBOOT, CONFSIMSOFTBOOT, +# CONFCUSTOMSOFTBOOT and CONFPROPSOFTBOOT can be set to "true" or "false". + # CONFBOOT is by default set to using the module system.prop file for most props. # If the setting is changed to "post" or "late", the props will be set during either # post-fs-data or late_start service mode. This is useful if props don't seem to set diff --git a/common/propsconf_late b/common/propsconf_late index 96e3e41..1d78f84 100644 --- a/common/propsconf_late +++ b/common/propsconf_late @@ -8,7 +8,7 @@ # In that case, feel free to delete it. # Script version -SCRIPTV=38 +SCRIPTV=39 SETTRANSF=4 NOTTRANSF="PROPCOUNT;PROPEDIT;REDEBUGGABLE;RESECURE;RETYPE;RETAGS;REBOOTMODE;REMODE" @@ -52,6 +52,12 @@ DELEDIT=0 PRINTSTAGE=0 PATCHSTAGE=2 SIMSTAGE=0 +OPTIONSOFTBOOT=0 +PRINTSOFTBOOT=0 +PATCHSOFTBOOT=0 +SIMSOFTBOOT=0 +CUSTOMSOFTBOOT=0 +PROPSOFTBOOT=0 # Script settings OPTIONBOOT=0 diff --git a/common/util_functions.sh b/common/util_functions.sh index 05d5e97..1ba7138 100644 --- a/common/util_functions.sh +++ b/common/util_functions.sh @@ -78,6 +78,12 @@ if [ "$INSTFN" ]; then PRINTSTAGE PATCHSTAGE SIMSTAGE + OPTIONSOFTBOOT + PRINTSOFTBOOT + PATCHSOFTBOOT + SIMSOFTBOOT + CUSTOMSOFTBOOT + PROPSOFTBOOT OPTIONBOOT OPTIONCOLOUR OPTIONWEBP @@ -898,6 +904,62 @@ config_file() { fi fi + # Updates soft boot options + if [ "$CONFOPTIONSOFTBOOT" == true ]; then + OPTLCHNG=1 + TMPTXT="enabled" + else + OPTLCHNG=0 + TMPTXT="disabled" + fi + replace_fn OPTIONSOFTBOOT $OPTIONSOFTBOOT $OPTLCHNG $LATEFILE + log_handler "Soft reboot option for late_start service boot stage $TMPTXT." + if [ "$CONFPRINTSOFTBOOT" == true ]; then + OPTLCHNG=1 + TMPTXT="enabled" + else + OPTLCHNG=0 + TMPTXT="disabled" + fi + replace_fn PRINTSOFTBOOT $PRINTSOFTBOOT $OPTLCHNG $LATEFILE + log_handler "Soft reboot option for device fingerprint $TMPTXT." + if [ "$CONFPATCHSOFTBOOT" == true ]; then + OPTLCHNG=1 + TMPTXT="enabled" + else + OPTLCHNG=0 + TMPTXT="disabled" + fi + replace_fn PATCHSOFTBOOT $PATCHSOFTBOOT $OPTLCHNG $LATEFILE + log_handler "Soft reboot option for security patch date $TMPTXT." + if [ "$CONFSIMSOFTBOOT" == true ]; then + OPTLCHNG=1 + TMPTXT="enabled" + else + OPTLCHNG=0 + TMPTXT="disabled" + fi + replace_fn SIMSOFTBOOT $SIMSOFTBOOT $OPTLCHNG $LATEFILE + log_handler "Soft reboot option for device simulation $TMPTXT." + if [ "$CONFCUSTOMSOFTBOOT" == true ]; then + OPTLCHNG=1 + TMPTXT="enabled" + else + OPTLCHNG=0 + TMPTXT="disabled" + fi + replace_fn CUSTOMSOFTBOOT $CUSTOMSOFTBOOT $OPTLCHNG $LATEFILE + log_handler "Soft reboot option for custom props $TMPTXT." + if [ "$CONFPROPSOFTBOOT" == true ]; then + OPTLCHNG=1 + TMPTXT="enabled" + else + OPTLCHNG=0 + TMPTXT="disabled" + fi + replace_fn PROPSOFTBOOT $PROPSOFTBOOT $OPTLCHNG $LATEFILE + log_handler "Soft reboot option for sensitive props $TMPTXT." + # Updates options # Boot stage if [ "$CONFBOOT" == "default" ]; then @@ -1346,7 +1408,7 @@ print_edit() { echo "ro.build.fingerprint=${PRINTCHNG}" >> $1 else resetprop -nv ro.build.fingerprint "$PRINTCHNG" >> $LOGFILE 2>&1 - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$PRINTSOFTBOOT" = 1 ]; then PROPLATE=true fi fi @@ -1362,7 +1424,7 @@ print_edit() { echo "ro.build.description=${SIMDESCRIPTION}" >> $1 else resetprop -nv ro.build.description "$SIMDESCRIPTION" >> $LOGFILE 2>&1 - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$PRINTSOFTBOOT" = 1 ]; then PROPLATE=true fi fi @@ -1388,7 +1450,7 @@ patch_edit() { echo "ro.build.version.security_patch=${SECPATCH}" >> $1 else resetprop -nv ro.build.version.security_patch "$SECPATCH" >> $LOGFILE 2>&1 - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$PATCHSOFTBOOT" = 1 ]; then PROPLATE=true fi fi @@ -1785,7 +1847,7 @@ forced_basic() { fi resetprop -nv ro.product.model "$TMPVAL" >> $LOGFILE 2>&1 set_partition_props "none" "ro.product.model" "$TMPVAL" - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$OPTIONSOFTBOOT" = 1 ]; then PROPLATE=true fi fi @@ -1850,7 +1912,7 @@ dev_sim_edit() { echo "${ITEM}=${TMPVALUE}" >> $1 else resetprop -nv $ITEM "$TMPVALUE" >> $LOGFILE 2>&1 - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$SIMSOFTBOOT" = 1 ]; then PROPLATE=true fi fi @@ -1957,39 +2019,45 @@ change_sim_partprops() { # ======================== MagiskHide Props functions ======================== # Populate menu, $1=List of props to go through (with safe values), $2=type of list, $3=check if menu items should be printed or only counted magiskhide_props_menu() { - ACTIVE="${G} (active)${N}" - for ITEM in $1; do - PROP=$(get_prop_type $(get_eq_left "$ITEM")) - ORIGVALUE=$(eval "echo \$$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')") - if [ "$ORIGVALUE" ] && [ "$(get_eq_right "$ITEM")" != "$ORIGVALUE" ]; then - CTRLTRIGG=false; - if [ "$2" == "trigger" ]; then - magiskhide_trigger "$ITEM" - fi - if [ "$CTRLTRIGG" == "false" ]; then - if [ "$ITEMCOUNT" == 0 ]; then - ITEMCOUNT=1 + CHKCOUNT=true + if [ "$3" == "count" ] && [ "$PROPEDIT" == 0 ]; then + CHKCOUNT=false + fi + if [ "$CHKCOUNT" == "true" ]; then + ACTIVE="${G} (active)${N}" + for ITEM in $1; do + PROP=$(get_prop_type $(get_eq_left "$ITEM")) + ORIGVALUE=$(eval "echo \$$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')") + if [ "$ORIGVALUE" ] && [ "$(get_eq_right "$ITEM")" != "$ORIGVALUE" ]; then + CTRLTRIGG=false; + if [ "$2" == "trigger" ]; then + magiskhide_trigger "$ITEM" fi - TMPTXT="" - if [ "$2" == "late" ]; then - TMPTXT=" ${C}(Late prop)${N}" - elif [ "$2" == "trigger" ]; then - TMPTXT=" ${C}(Trigger prop)${N}" - fi - if [ "$(eval "echo \$$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')")" == "true" ]; then - if [ "$TMPTXT" ]; then - TMPTXT=$TMPTXT$ACTIVE - else - TMPTXT=$ACTIVE + if [ "$CTRLTRIGG" == "false" ]; then + if [ "$ITEMCOUNT" == 0 ]; then + ITEMCOUNT=1 fi + TMPTXT="" + if [ "$2" == "late" ]; then + TMPTXT=" ${C}(Late prop)${N}" + elif [ "$2" == "trigger" ]; then + TMPTXT=" ${C}(Trigger prop)${N}" + fi + if [ "$(eval "echo \$$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')")" == "true" ]; then + if [ "$TMPTXT" ]; then + TMPTXT=$TMPTXT$ACTIVE + else + TMPTXT=$ACTIVE + fi + fi + if [ "$3" != "count" ]; then + echo -e "${G}$ITEMCOUNT${N} - $(get_eq_left "$ITEM")$TMPTXT" + fi + ITEMCOUNT=$(($ITEMCOUNT+1)) fi - if [ "$3" != "count" ]; then - echo -e "${G}$ITEMCOUNT${N} - $(get_eq_left "$ITEM")$TMPTXT" - fi - ITEMCOUNT=$(($ITEMCOUNT+1)) fi - fi - done + done + fi } # Set sensitive props, $1=List to get props from, $2=List of safe values, $3=Set to "late" if set in late stage, or file name if saving values to a prop file @@ -2021,7 +2089,7 @@ sensitive_props() { echo "${ITEM}=$MODULEVALUE" >> $3 else resetprop -nv $ITEM "$MODULEVALUE" >> $LOGFILE 2>&1 - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$PROPSOFTBOOT" = 1 ]; then PROPLATE=true fi fi @@ -2206,7 +2274,7 @@ custom_edit() { echo "$(get_eq_left "$ITEM")=${TMPITEM}" >> $2 else resetprop -nv $(get_eq_left "$ITEM") "${TMPITEM}" >> $LOGFILE 2>&1 - if [ "$BOOTSTAGE" == "late" ]; then + if [ "$BOOTSTAGE" == "late" ] && [ "$1" = "CUSTOMPROPSLATE" ]; then PROPLATE=true fi fi @@ -2471,6 +2539,13 @@ export_settings() { replace_fn CONFPROPSDELAY "\"\"" "\"$CUSTOMPROPSDELAY\"" $EXPORTFILE # Delete props replace_fn CONFDELPROPS "\"\"" "\"$DELETEPROPS\"" $EXPORTFILE + # Soft reboot + replace_fn CONFOPTIONSOFTBOOT false $([ $OPTIONSOFTBOOT == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFPRINTSOFTBOOT false $([ $PRINTSOFTBOOT == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFPATCHSOFTBOOT false $([ $PATCHSOFTBOOT == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFSIMSOFTBOOT false $([ $SIMSOFTBOOT == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFCUSTOMSOFTBOOT false $([ $CUSTOMSOFTBOOT == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFPROPSOFTBOOT false $([ $PROPSOFTBOOT == 0 ] && echo "false" || echo "true") $EXPORTFILE # Module settings replace_fn CONFBOOT default $([ $OPTIONBOOT == 0 ] && echo "default" || $([ $PRINTSTAGE == 1 ] && echo "post" || echo "late")) $EXPORTFILE replace_fn CONFCOLOUR true $([ $OPTIONCOLOUR == 0 ] && echo "false" || echo "true") $EXPORTFILE diff --git a/module.prop b/module.prop index 43a90c9..42eb011 100644 --- a/module.prop +++ b/module.prop @@ -1,6 +1,6 @@ id=MagiskHidePropsConf name=MagiskHide Props Config -version=v6.0.0-v132 -versionCode=70 +version=v6.0.1-v132 +versionCode=71 author=Didgeridoohan description=Change your device's fingerprint, to pass SafetyNet's CTS Profile check. Set/reset MagiskHide sensitive prop values. Change any prop values easily, and set your own custom props. diff --git a/service.sh b/service.sh index 2b09fa1..0c89666 100644 --- a/service.sh +++ b/service.sh @@ -116,11 +116,9 @@ if [ "$PROPEDIT" == 1 ]; then sensitive_props "$LATEPROPS" "$LATESAFELIST" "late" fi -# Do a soft restart if a prop has been set in service.sh -if [ "$PROPLATE" == "true" ]; then - stop - start -fi +# Edit custom props set for late_start service +custom_edit "CUSTOMPROPSLATE" +custom_edit "CUSTOMPROPSDELAY" # SELinux if [ "$(getenforce)" == "Permissive" ] || [ "$(getenforce)" == "0" ]; then @@ -129,9 +127,12 @@ if [ "$(getenforce)" == "Permissive" ] || [ "$(getenforce)" == "0" ]; then chmod 440 /sys/fs/selinux/policy >> $LOGFILE 2>&1 fi -# Edit custom props set for late_start service -custom_edit "CUSTOMPROPSLATE" -custom_edit "CUSTOMPROPSDELAY" +# Do a soft restart if a prop has been set in service.sh +if [ "$PROPLATE" == "true" ]; then + log_handler "Soft rebooting." + stop + start +fi echo -e "\n----------------------------------------" >> $LOGFILE 2>&1 diff --git a/system/binpath/props b/system/binpath/props index 77dba5770f0ffb9044386e48c1c04595cda56981..510031b2f0212a8f7d8825c90fda7704b7a1bcbb 100644 GIT binary patch delta 5710 zcmdT|Uu;{|8P}m{Q-?ZnW5;fqraj!4(sqqW)BO|7gvO+4M;aU3Ep(A(ZtUau66apW z_c~FQxJBCp(u4-nr|AeDpzX_)X_O!{A`QC2q-igcsOSSwR-g|U-e81oK`_4a>HvHjx%}c!xq5!UgTY`_!hS#QV;>h5;LU)`WgT}Q8aTwq!MP7T za5iack0@$_;5jXi)A9_#Mw-yGQFO-?Nu)L0ORzMqX$IB}d4gb_7<57P|s?CGC<(K51jB~vSl=K-5q)71BHxikT?rA zXYkEfqTxvJ0XoUeCluWWNMgCZ!@8dAJFn&pB{VQ71^w z9BVlehVVXrn#f6#V~_oQV=hZtR#_juqYlt>W2hDWJnZ~t^mvFLiC;<*4g*eA7dK<( z147|o$S>8TB$cDc4e>+m_f}TWNg|(9j5(Z@jYN9I>~f-tgyzAg6!`t{)=1+-koHL; z6$Byr1qmc`Z3|ComgPKQv*5}hH(aL9^)_4dNC;k|otteV!C^Db(y`I2V+ezNu^pbH zu3j-veD}_WEd(&5D99-sbPH8z#C4*syy(K)vOp`Z?DhL91f80&~zKH>U zezC1Na5Nm|TzKO>553=xny5X7TpQ=ve%adsIDV!;VgL5^a|_3Jx4=th+$S^IL_964 z$qdP1DayE4{v~Wl0z510jKk)J3qEuEJvhRYK*uVX#Zy``pCNcg&g6;6z#PeDB(bA!1$gkD{+^BoN4nHw?EiViRP z-40fpSJ#TZ<$(?B^o0oc4|=w1 zS(d_;SWGOc?uR}eMjn_uw`hOBtO*0G+Rl+;->)LBZIu$r?ag$a=ps{CII=zo-+%kN zT-)e4|aF z2A+!!`fDGnso%Qjq{n)Yr}*f_)9c`cq62<(`F7Yg*j?Q9&S$p?ujqN#?zBiLm+Z2Z zZZW}cU;-aAzg98$UpYYAyIt;8A}DETxMVo3)Lm&fuWRpC^LG3Ht+!*dD!H{rV;9@i zKuCGotyEHY^3rd>^M2c=vd72!a3B5WaYW(4BMzXK?C|OPFE$wQ+^85qmE*_{Coa#d z81_@P5aK%hl{M%zz2IQY$w$M@kbS4gQQntnyKaf6`kM8;O;1(Up;8!MyinKLs(P{b zA{4yLPVReG8Y}vF47D~8^=lu@?%BYK3_FTt)rRhD;^gO!c2GDf+Ikdi?d{cAi%@xI zp4PZ#q`7r2^^$?3k!Y~uw(eO~Arg7r(56cDf)zw2^cFGa>Rf6hyH4V&eAEr$O=rVS zQkVtH1nI^)NppsY0&i24ZnNzY?@2~UiSD2RfB>a$O`zOd0~fQ34o_+mX$ue>Trlzi4U};){`43v*T5yc_rMy(_xiLq`7b~}+&F*S? za*EtSy;;%2)sw)?F@A3%-B1s=sw=!s7Z<1@o#ig0nkOYj{x@x%72n%}(W;GX+{i7T zaG=+RY~^lr0PfH|!tGGkQPffCfLND!I5^4^=}UC`#BVM-L>wJufvm=HbG6`RUoOS= zH1Hr=R@hhT&64Qnmd_tU_w$C%wLd6^++a&*uE)DNcMW#8lD&NvK@&GH{64aJ-Dlx$ z>57kjvI%vrdiSy_Z!O*2BQT37e>lr@`AkO1%`TDb zaZst)&9iqUK!r;VTQN?yK6*hmFEuqqiHj2mQj;_C6_iTy6_QdFk~0$X(o<8W-wtDx zne2V6M=3uqRUtnOMPWv2u8smwd7?sDVoqu5M5DUiAg!B5QS-}i6x~)srC@Vq0Z0<0h+Oy{e(T+WWQj} z$t>rEC+A%do_-*Rk!A9pb4`<3&xuYBuQQpfkizaJNf^I z0+8Tzuz=mC%@7rS!F-b!?2CrPK+BJEt?lf}jPfkg4`?!eoj%Kwk#~B42xBoQrlvFL zFun(RF>A7Xz3}upaYnZ721bmFTqoCfi^FW*9#hTez%qG)z3}w>Oh(S_EG>+QwgBmz B%Gm$_