From bde5e2e28f1b7da1a832e2795789de30f1f014c7 Mon Sep 17 00:00:00 2001 From: Sebastian Kehl Date: Mon, 16 Nov 2020 10:27:47 +0100 Subject: [PATCH] Add gapsys softcore function. Change nonbonded fep-kernel to allow to use both, standard beutler function as well as new gapsys function. Add new input name to choose one of these. --- docs/CMakeLists.txt | 1 + .../functions/free-energy-interactions.rst | 176 +- .../functions/plots/gapsys-sc.pdf | Bin 0 -> 113650 bytes .../functions/plots/gapsys-sc.svg | 2450 +++++++++++++++++ docs/reference-manual/references.rst | 13 + src/gromacs/fileio/tpxio.cpp | 9 + .../gmxlib/nonbonded/nb_free_energy.cpp | 168 +- src/gromacs/gmxlib/nonbonded/nb_softcore.h | 262 ++ .../gmxlib/nonbonded/tests/nb_free_energy.cpp | 37 +- ...action_NonbondedFepTest_testKernel_100.xml | 38 + ...action_NonbondedFepTest_testKernel_101.xml | 38 + ...action_NonbondedFepTest_testKernel_102.xml | 38 + ...action_NonbondedFepTest_testKernel_103.xml | 38 + ...action_NonbondedFepTest_testKernel_104.xml | 38 + ...action_NonbondedFepTest_testKernel_105.xml | 38 + ...action_NonbondedFepTest_testKernel_106.xml | 38 + ...action_NonbondedFepTest_testKernel_107.xml | 38 + ...raction_NonbondedFepTest_testKernel_36.xml | 38 + ...raction_NonbondedFepTest_testKernel_37.xml | 38 + ...raction_NonbondedFepTest_testKernel_38.xml | 38 + ...raction_NonbondedFepTest_testKernel_39.xml | 38 + ...raction_NonbondedFepTest_testKernel_40.xml | 38 + ...raction_NonbondedFepTest_testKernel_41.xml | 38 + ...raction_NonbondedFepTest_testKernel_42.xml | 38 + ...raction_NonbondedFepTest_testKernel_43.xml | 38 + ...raction_NonbondedFepTest_testKernel_44.xml | 38 + ...raction_NonbondedFepTest_testKernel_45.xml | 38 + ...raction_NonbondedFepTest_testKernel_46.xml | 38 + ...raction_NonbondedFepTest_testKernel_47.xml | 38 + ...raction_NonbondedFepTest_testKernel_48.xml | 38 + ...raction_NonbondedFepTest_testKernel_49.xml | 38 + ...raction_NonbondedFepTest_testKernel_50.xml | 38 + ...raction_NonbondedFepTest_testKernel_51.xml | 38 + ...raction_NonbondedFepTest_testKernel_52.xml | 38 + ...raction_NonbondedFepTest_testKernel_53.xml | 38 + ...raction_NonbondedFepTest_testKernel_54.xml | 38 + ...raction_NonbondedFepTest_testKernel_55.xml | 38 + ...raction_NonbondedFepTest_testKernel_56.xml | 38 + ...raction_NonbondedFepTest_testKernel_57.xml | 38 + ...raction_NonbondedFepTest_testKernel_58.xml | 38 + ...raction_NonbondedFepTest_testKernel_59.xml | 38 + ...raction_NonbondedFepTest_testKernel_60.xml | 38 + ...raction_NonbondedFepTest_testKernel_61.xml | 38 + ...raction_NonbondedFepTest_testKernel_62.xml | 38 + ...raction_NonbondedFepTest_testKernel_63.xml | 38 + ...raction_NonbondedFepTest_testKernel_64.xml | 38 + ...raction_NonbondedFepTest_testKernel_65.xml | 38 + ...raction_NonbondedFepTest_testKernel_66.xml | 38 + ...raction_NonbondedFepTest_testKernel_67.xml | 38 + ...raction_NonbondedFepTest_testKernel_68.xml | 38 + ...raction_NonbondedFepTest_testKernel_69.xml | 38 + ...raction_NonbondedFepTest_testKernel_70.xml | 38 + ...raction_NonbondedFepTest_testKernel_71.xml | 38 + ...raction_NonbondedFepTest_testKernel_72.xml | 38 + ...raction_NonbondedFepTest_testKernel_73.xml | 38 + ...raction_NonbondedFepTest_testKernel_74.xml | 38 + ...raction_NonbondedFepTest_testKernel_75.xml | 38 + ...raction_NonbondedFepTest_testKernel_76.xml | 38 + ...raction_NonbondedFepTest_testKernel_77.xml | 38 + ...raction_NonbondedFepTest_testKernel_78.xml | 38 + ...raction_NonbondedFepTest_testKernel_79.xml | 38 + ...raction_NonbondedFepTest_testKernel_80.xml | 38 + ...raction_NonbondedFepTest_testKernel_81.xml | 38 + ...raction_NonbondedFepTest_testKernel_82.xml | 38 + ...raction_NonbondedFepTest_testKernel_83.xml | 38 + ...raction_NonbondedFepTest_testKernel_84.xml | 38 + ...raction_NonbondedFepTest_testKernel_85.xml | 38 + ...raction_NonbondedFepTest_testKernel_86.xml | 38 + ...raction_NonbondedFepTest_testKernel_87.xml | 38 + ...raction_NonbondedFepTest_testKernel_88.xml | 38 + ...raction_NonbondedFepTest_testKernel_89.xml | 38 + ...raction_NonbondedFepTest_testKernel_90.xml | 38 + ...raction_NonbondedFepTest_testKernel_91.xml | 38 + ...raction_NonbondedFepTest_testKernel_92.xml | 38 + ...raction_NonbondedFepTest_testKernel_93.xml | 38 + ...raction_NonbondedFepTest_testKernel_94.xml | 38 + ...raction_NonbondedFepTest_testKernel_95.xml | 38 + ...raction_NonbondedFepTest_testKernel_96.xml | 38 + ...raction_NonbondedFepTest_testKernel_97.xml | 38 + ...raction_NonbondedFepTest_testKernel_98.xml | 38 + ...raction_NonbondedFepTest_testKernel_99.xml | 38 + src/gromacs/gmxpreprocess/readir.cpp | 21 + ...arametersWithValuesIncludingAssignment.xml | 1 + .../GetIrTest_AcceptsElectricField.xml | 1 + ...IrTest_AcceptsElectricFieldOscillating.xml | 1 + .../GetIrTest_AcceptsElectricFieldPulsed.xml | 1 + .../refdata/GetIrTest_AcceptsEmptyLines.xml | 1 + .../GetIrTest_AcceptsImplicitSolventNo.xml | 1 + .../GetIrTest_AcceptsKeyWithoutValue.xml | 1 + .../tests/refdata/GetIrTest_AcceptsMimic.xml | 1 + ...IrTest_HandlesDifferentKindsOfMdpLines.xml | 1 + src/gromacs/listed_forces/pairs.cpp | 393 ++- src/gromacs/listed_forces/tests/pairs.cpp | 28 +- ...eraction_ListedForcesPairsTest_Ifunc_0.xml | 366 ++- ...eraction_ListedForcesPairsTest_Ifunc_1.xml | 366 ++- ...eraction_ListedForcesPairsTest_Ifunc_2.xml | 366 ++- src/gromacs/mdtypes/inputrec.cpp | 2 + src/gromacs/mdtypes/inputrec.h | 2 + src/gromacs/mdtypes/interaction_const.cpp | 3 +- src/gromacs/mdtypes/interaction_const.h | 2 + src/gromacs/mdtypes/md_enums.cpp | 8 + src/gromacs/mdtypes/md_enums.h | 15 + 102 files changed, 6997 insertions(+), 436 deletions(-) create mode 100644 docs/reference-manual/functions/plots/gapsys-sc.pdf create mode 100644 docs/reference-manual/functions/plots/gapsys-sc.svg create mode 100644 src/gromacs/gmxlib/nonbonded/nb_softcore.h create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_100.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_101.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_102.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_103.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_104.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_105.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_106.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_107.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_36.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_37.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_38.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_39.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_40.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_41.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_42.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_43.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_44.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_45.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_46.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_47.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_48.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_49.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_50.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_51.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_52.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_53.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_54.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_55.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_56.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_57.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_58.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_59.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_60.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_61.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_62.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_63.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_64.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_65.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_66.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_67.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_68.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_69.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_70.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_71.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_72.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_73.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_74.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_75.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_76.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_77.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_78.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_79.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_80.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_81.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_82.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_83.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_84.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_85.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_86.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_87.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_88.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_89.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_90.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_91.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_92.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_93.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_94.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_95.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_96.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_97.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_98.xml create mode 100644 src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_99.xml diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 44de35856c..0122c6cf7e 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -290,6 +290,7 @@ if (SPHINX_FOUND) reference-manual/functions/plots/f-rbs.pdf reference-manual/functions/plots/ring-imp.pdf reference-manual/functions/plots/softcore.pdf + reference-manual/functions/plots/gapsys-sc.pdf reference-manual/functions/plots/subst-im.pdf reference-manual/functions/plots/tetra-im.pdf reference-manual/functions/plots/vcrf.pdf diff --git a/docs/reference-manual/functions/free-energy-interactions.rst b/docs/reference-manual/functions/free-energy-interactions.rst index 2f29ceac05..e5cf442058 100644 --- a/docs/reference-manual/functions/free-energy-interactions.rst +++ b/docs/reference-manual/functions/free-energy-interactions.rst @@ -198,8 +198,8 @@ with :math:`d_k` as before, so {\frac{\partial G}{\partial {\lambda}}} &=& -2 \sum^K_k \lambda_k \left(d_k^B-d_k^A\right)\end{aligned} :label: eqnfepshakeconstr2 -Soft-core interactions -~~~~~~~~~~~~~~~~~~~~~~ +Soft-core interactions: Beutler *et al.* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _fig-softcore: @@ -327,3 +327,175 @@ This “1-1-48” path is also implemented in |Gromacs|. Note that for this path the soft core :math:`\alpha` should satisfy :math:`0.001 < \alpha < 0.003`, rather than :math:`\alpha \approx 0.5`. + + +Soft-core interactions: Gapsys *et al.* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In this section we describe the functional form and parameters for +the soft-cored non-bonded interactions using the formalism by Gapsys *et al.*\ :ref:`185 `. + +The Gapsys *et al.* soft-core is formulated to act on the level of van der Waals and electrostatic forces: +the non-bonded interactions are linearized at a point defined as, :math:`r_{scLJ}` or :math:`r_{scQ}`, respectively. +The linearization point depends on the state of the system as controlled by the :math:`\lambda` parameter and +two parameters :math:`\alpha_Q` and :math:`\alpha_{LJ}`. +The dependence on :math:`\lambda` guarantees that the end-states are properly represented by their hard-core potentials. +:numref:`Fig. %s ` illustrates the behaviour of the linearization point, forces and integrated potential energies with respect +to the parameters :math:`\alpha_Q` and :math:`\alpha_{LJ}`. + +.. _fig-gapsyssc: + +.. figure:: plots/gapsys-sc.* + :width: 15.0cm + + Illustration of the soft-core parameter influence on the linearization point (top row), + forces (middle row) and energies (bottom row) + for van der Waals (left column) and electrostatic interactions (right column). + The case of two interacting atoms is considered. + In state A both atoms have charges of 0.5 and :math:`\sigma=0.3` nm, :math:`\epsilon=0.5` kJ/mol. + In state B all the non-bonded interactions are set to zero. + The parameter :math:`\lambda` is set to 0.5 and electrostatic interaction cutoff is 1 nm. + +The parameter :math:`\alpha_{LJ}` is a unitless scaling factor in the range :math:`[0,1)`. +It scales the position of the point from which the van der Waals force will be linearized. +The linearization of the force is allowed in the range :math:`[0,F_{min}^{LJ})`, +where setting :math:`\alpha_{LJ}=0` results in a standard hard-core interaction. +Setting :math:`\alpha_{LJ}` closer to 1 brings the force linearization point towards +the minimum in the Lennard-Jones force curve (:math:`F_{min}^{LJ}`). +This construct allows retaining the repulsion between two particles with non-zero C12 parameter at any :math:`\lambda` value. + +The parameter :math:`\alpha_{Q}` has a unit of :math:`\frac{nm}{e^2}` and is defined in the range :math:`[0,\inf)`. +It scales the position of the point from which the Coulombic force will be linearized. +Even though in theory :math:`\alpha_{Q}` can be set to an arbitrarily large value, +algorithmically the linearization point for the force is bound in the range :math:`[0,F_{rcoul}^{Q})`, +where setting :math:`\alpha_{Q}=0` results in a standard hard-core interaction. +Setting :math:`\alpha_{Q}` to a larger value softens the Coulombic force. + +In all the notations below, for simplicity, the distance between two atoms :math:`i` and :math:`j` is noted as :math:`r`, i.e. :math:`r=r_{ij}`. + +Forces: van der Waals interactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. math:: \begin{aligned} + \mathbf{F}_{ij}^{LJ}(\mathbf{r})=\begin{cases} + (\frac{12C_{ij}^{(12)}}{r^{13}} - \frac{6C_{ij}^{(6)}}{r^7})\frac{\mathbf{r}}{r}, & \mbox{if } \mbox{ $r \geq r_{scLJ}$} + \\ + \frac{d\mathbf{F}_{ij}^{LJ}}{dr}_{r=r_{scLJ}}r + \mathbf{F}_{ij}^{LJ}(r_{scLJ}), & \mbox{if } \mbox{ $r3)r9(-90hAg6Dd`3&X=y=n=Y8Bi@{%)28(0|GJ|kxbF3Dq%lan)v8JpP}SOcGCI<^KP26~qI1{nPO7&f-n20G># zj!>D-c1aPItEl5{iSUY=c6Q_N`z}H^HG&v5{4m#zo(fKfV7j?})543EmyGLiU5>@q z(*T2bji6NuVwdyLC9;E2Eh2mAd##-64nG(TYd&1-;pB8n=$XV~HK<4nQ2$Ul_L*L9 zP}5`okra*aW1PT}TjHKF@%2~f;ffhIrb(M@>tos9V2@%AUor^}xEuv}sw%#5Au)Zn zNRmA+SN)ye+Osz#tm?PuB^gcBnjRK)!q+lO4kY80)0CP^1>3~xKK)a<0~8Z?>0Jy13;pk-1->EdgfI@`6EF`eD<|SU;uq^rDS!yjU<=rcoR=4I0r+FmVFrGXGd&a{XCY_O(*gbmED78=`=9BFtgeZHo-MMCBL_JL zVh+fe93PNBKz;*S0sp>Bj+yq zlB)xkn8{gK9cpzAmBH`w7)qf*H5+n%`p*T&eZ#EOXQdo>~w9BCXz7!VIvh|eZb2( zxLA-49vK)LJ+md}VrEAEd}wKAX{}(TqX$^^Okr_r9ps>xBmnDJTUjF3!q2fW2^-tm z$Qf8av^2M}v_P01bZ&(#kGQyE_l*dwp_h{5J;u1;h5NkWqP1~ljb5K{ZsB+#t?+s} zo?HY5E^5YIjOVzLB`1O+z2sfk7f|U#KP$0cxl8URBJsjg; zZ3g++Ts}U0(|H)m=W=Lh2)Ac!a?uHK`zPO~Y|7HI?$7Tid+h__l6Qo_ zpYC23ro00tzX`u|@xSx&G8(5{E;Ee%?nq?ZFb2drZ4I76V4@TYMl-6=j_e~wDgs<7 zEa$1rqvVsexk)9C!2}L-z7!e5{(=K-Q}-qn)oo%}Ja%X7%U&#q_1#)X3!P#t#Fh*` zCGvby@pUqLXb*G$)AvfSTO_c_6Nv88sGuKZE##ALd_H;zmVHCKj1@HF1~#<8>!SE= zT&h*MOi<9g*@S@vTW>~$2$~Ung9I)NkQw_ixhX-p~==NMppMMvYZy7=m+Lhi;n3r$(FpBKZzFz3kp!r5L% zrj<G%p4{>i(<@)OVG$IM}bdC>ogc++3B_`ZCPxy zMY}ES$2d{ACEDSa4j6w5=rKI7dkP&|YOP2$K2+TjTXsR3B>St#uDfA>*h__#YT@mQ znK}ysJH2+becJlw*Pu_f$4M89+e${t6Q3=d1{kXF3dkBKq#oV^CYB&=EZZj9jdeam zE8cmF;KV-4)lgbv*)$dfwE?FkQ^J-LKK1C%u6Sbx%}4YwZs`FKEmdld!h$0ac+ z`IYQPt_th6-!7+lzW{OFP@!yzdeU|qKEKx}Ca19>pJ!iMC zt!a)R@LZKNuifaf(n}Dqb-%`6WgOWWy^RXLBxEHD-wVx>X}SVtR{e1GiN{g%wdIr|9m1qWK7Ku>yi#PsUH^p zL%<m0jc6 zZsD~{DsKKq4Wpv#!ceF`9hfuv`WFu&KIy6>uC42rIV{jNsMmo$jMWBLs3l8k*;z@rEV29M<{SvI0Ehgb-`$Y!E@$ zRl_$nCP_>C?+%Zv)^rg~U*b@;f3D2V2+o!b0!5o+s z*WgniV#tQyLjS3ki-k$HyBaW5SiqKHf?IkL92fAo^@e6Y=P9juF7AUN_(dnjWp%_- z08liApj72xF*^*-e#+*G@GAK?5R7&N`2GzWShah{AD8KT8(+8s@TGB7T9T)$zHxt` zN*S0`cxS`REH9_IJR8&NSaR^&Pysv`Ax(R?e~&iCI=H?$Z_noSYURQ_r?sIH@uN=*6~P=N&}_%feQ$LU9W$VG~yQpc_B_(w zt8pOKv?m&$VQJUq36I%22EABLG%B8a%*zM%i<>X}pHjNQB~1bVw@*uAS^MgLyB<9V zBC0#VSH&YUqxhjtN1C}F$A3eW!@*?*v<$$)l$J!<7CwVGlsJG6d^mf^w|4lc#C}RE z^ksuzxE`coz8Oo#E^#1ec(F^I)EmTws{%bR|JpCK>eTMZ8`eAbW#JNFk`g#&`80ew z)HYOEAcufaI?OP^G7!XtrvgoIwlT`1FK^vpbf+D6YJch@pOZm#ufDmo1U_|ZJ5K2I zVDF8|8)v`?^X9)LAHiR|c8T}l1Z%Zpp^%!0t;B1%7rv+lUpHg~(=Oa7@0eDgtZ#1q z6cFyLa+DBDcBlpX4;n02^;W1odyXu>zs>Z_8mCN&;p9xyWkF7t+Ov7 zxQ0;Sd<6L1q`G+pa?$I*^YQ6wpvn6_(=<1?{>c4|)8QVZ13DVZ-zY5WsWe|1M%l_5 zlZ!=OePY~wwUC>()&?s-ppgRH0qh92K57OQZwrx|303?%<(S1|9|vJ5@x2cqV_!9; zw$0G!?|TRP!z|hZWkZgQ(K@+IFqSeDxWKB}fqk$li40PJp|94hv_Ql7Pge7g7#k4Y zk?rW4s8M{mq6ry_(1C|gP|a_sjFRk;BEl6KK!}f8aOZo%56(ZfD4v|@WHb|rh}$Afk=KgJ>r z70XVsYwrN#j7sq}zK+~8CD_P2r3pX9dONWoH(jcBD;*x11P;t}s_%~QMn~&icTn;n zBA}rI$G&!z<(b z&sU6`wu{R~vmM{`rLDPsP468`5P~icc4n7I9xoHrr)Lw8QiF)}6j^CMp!R=Ta4v`I zD90rMSTxIg{~xC9&z17GNuYV`4V7SE?T9^K@^19+ifa#IfvDBA_ z%ODX=nmnzXsovIN9Y4tZS0EA9tE(dy%B1=p-0=1lH%S>^sFqhaWj94gPE%v;F|`YxWyL+w z&G8(}lu_d3F5vdc*JJOy(M6&0@}Q5VH=e_VE@{tQa6G418fKhX338Ev4Tan~+q^%~t*$eHKf~S)=%cGr<_6 zT0M$!3x#Ed6Rc6>4M8S5CRlyptvOL8JYwbWQIZLgEi}45^BsfH?t)`_XK&MqSWwIy zyE#YQh-s{e0wDE;$JcbDoSB>z4SrGhDt`ONPC0>o>9v0PRIq156Ep_EoSMTEzr6`Sy?1Tle*`E1#xvpG9o@%34d=CH`6pDshWH^y1D} z*;F}Yj8O%PhdE`Jf1!6d+dzW{7vKS)e#%?33yWmb{#&)Z)0d>Pls;{zjE-+>loBADwv8$vcV`^GTK|!xE!U$=a4{U1dX)0Qu z2zP3k8+L{1rvbC(F`^_7eNdxo*J(gShgpsPNhxmTTiYe6__Xu~eWpVOQr$1HseYt- zz^7GF3W_Kd-X>J~@)h$Tj=Zb~>+Xe@h*KtHH$UK_B& zB6nB^)ISZNGd|0jnT>F@i{DCYyF4_|A64&cfn~fwRunzcu`{xIXduynDesLgP`2Y# zE#8;-wea-DGBxdJzqXU^-XM{yz*9{fGs>b1jMyrP)UK1uEgxRA_!i`FfI4?Pd2gv{ z7dh_~xAYDB7re7=7&bd-O47@zR#)A_+&Osu3A9uA5(RS($mY1N@LT#GzRs1{U-z;Peb2upZ;nd((Ywyw6N zQ`07jJ7mvHPa>&B_r`Sh36HTEW$|UR9qQv&8=e=BR@Ko^=I-@VcH{O-Cy_3l7}|T} zZ{TFux8Qk|=dZ42XO%?o2?VTQ?4eh(fU=U!DD5f7`MJ}ILpQ6puuX4Q#^85UStmTo zA3RpXWuQ@O?sqILq>SfJc73N$bIdkQ_1@>HXP~-b*X{>`M=iU!$)v;XD{WD6CR&vP zMAti4I8A-zb=!}zcg$~gHmSwV&a`SK#I-D}_EZtCZMryD!_hmeP_qo%)ooK}9~g?x zBau1e+f_hr<*gi&N|4QpwNnlM;!3d{a@Z zKET|6*ncUs=V429E2r|jJL(>Ub(=)<{TO39uTyF7GrX?tgtZ9%Y~Er=@%B~%@j>%7 zP?lVyQJF8lN!yTCFpB%hx85Q~6*5NVRvNtyhw1QVO(@;uWztS2n+vfjFa>cM5vVRk zMcr{nGBjd79c?balgz_WmLx|&Lyl3~y6C8ep=&j&Gg2&GCBazXSwDY`XFn@7|0bhSWJ z+z-mr`RJ}}qd(p$T>u@&ThGul^3_$<-jRWMvyJY`3>QOpD6`&?KpF*51tBi3?I{WC z4FWDFg!fvOT7^z}0!G0^$%F52BzvEb|08M#73*^BH_I?l<(Y?Q1yQ=azpB_fcjSJk zd}|?e0mJ~)`rs7OUbZZ7&&A?3E9e{dCr&r=f(6j>9RtBaFS9q96~fc$5ZlDwi0;V4 zoUXzLS>(M`eGqPumVqahsWf4V?_3YHoS{Av=EmjL9<UJ1|!0-Dzipm`E%P^QaUWI+BAAGQY%&!S9c zYSNKLwv>i8!cwN>O(ZdhT301nV#1ern!^xu#df^Ds*p=s&bu5F*^kJ~$Pl1%G9{kg zSQ*odJ)OvjoJ|&Uo#ih4>Vg5X7gpY1=W>U6nvZb%F^7}c&mhA!KddV+Kwg6X=RcGu zd)MYIF*d5*S))cc-z=j+tVshQ0YlP z=-ryh!H;uVM3nLw*`Uk5wb%mS(OoH`c;S_5TYhCqS_OP`&5P4L^Y^KO;W$zoW04ah^)TZYYT3>UviH~K(7eD zab8r7j85X30IVASY$#x;#SV#Mm_e})G?wh0_a+{3TKlyiqeCGmRGbPtrpP-|da6Y-i2REo2!?|)^WuEl0-gk$bvd1V+)OlM4YEV)`Vd zQG4kbJe+$Q3eO91a>D(seZ7JM{&5q1Q4d238q#2-V@~C5$S#x{tLkF{bTZAj?$IdvF4+ zdc)$d?2fK*B*>ryCB3ds3=>_cZ5gBfenr2SeiN!cKb}o+9R+A}O$mB%nKh^fzl_a& zZ|{zo21^j#bq@L!o@3v}_+7!en0vlwW`1bqdjZ^P&Kf*Psaaf96Una@gKXTF}sB3#4H)e;<8(fq961z;%VNgM(Q6YPsNmW)Eh z&>taa34FKfNH#T4L5c$Wwh7+b?T0m&$6d${zr@X4$bRKTda4k)G{d!vIwr<9uP8`) z3%*e!y!5HJoBU>4)Mc;pP2M=)yi(WeEr_2+dg&AMHu+7TbTlt!X}&8jbQXljuPWTQ zh)R-HrTt20;TF}GPrHBz0jZ*V)4ZFJ7=AW=9$XMh zEpUJTmma$U<))o(hdxI_xtVji*I}X(d$}k$$0(?rIOPi7A>Uk_+HX+T0DdCZU>w#N zRnaU|jo(MD`dBfRSD^m;*qu%0YZT~fPXt-2>fY4O>>=}cdN9K>8Eo9<2&vzM=398M z!WS-gBpUn*li1m}4V;5vrhCf;*^<<u z^p+fA@H%&fK18g;L9#C1p-AhaenBf_`;B>lt2-28t z7n13ci=ND^7cu#MGJ>kr!r`UMf_C|f3ii}yuO+Z9 zms+YIfSPK6U!m=ydsek-v4)-u%nuMc(AXNb=!<3;z2?7n z$o2iG3_VlzHz{%W-)hyGKSK33E5NqH#Du73;TQ#gKVo4NAEMWy*c`N$C zDbR#}1-XD~A+ccZCv0!TD8OJ!5SVUWtzSchO`08;q34qY{@i&pw9e5SW&w#GgZ>dP zdXYS;Jn#*NQ&p4t0XS}cz#Ygkunx$O)CUTlP-|ki6g0c;pl&nQnaHhTO!VOl< z+iMa2U<94P5pMu+8r*56&kVRppzH26lmSN#JR{#`I`{;~9uyWm1L$4^AyY*QbL}g5 z`E9H~apd4d1tU$V=Si)Cbc7q@8iF2S?@M!*DK~4D&go-m7p3D?sMx>@m0TOH|F8iT zG%FiQ4(0VhkU@F#r6W&>^fa(ioLTu6OP8O7wJNx|R7Bve(Q)(`4JT4Iys}-m(Z)ZCE8s1Rx8k%UAp`9KB?op<5bU|`*3$ZgvkpYvEb$x7QDiyX|3eRl8%p%)U z8=3c3Lb|d`9K;>bj%y|D;@o12+06w4N5|Dl?t|}h%c!?o?Z&1JDFWo$1ev|cOvF}R z(Hw#zKMCogKfDTLLzkQzCAV4SPZ%`lv>OU-yU6U1D$}wb44B%`6Nc!E%7$eK~?@L}rF0`|E*?e2Eb>basK}?ndFj2ZU*SvE=z);`Trx9Dwn?Mne^w~rDN)gbQkfw_hCf7uAOdM zhgUwJ_j+Wtz2;Cf2MOoC-S_uWX&IIU4yKpv z3aA1a<^!LH8hOa(Hzi7FDQfh+tR$WtdOC3M36;6i@< z{Hh1QrFA=f5Q;-&!tuD|>hZ1l>|y=Y-X|r%rnOb8kY6%PO3S)1!y!-5*hkX!2(Mi?(^bCXL zlqM&Zu&p~IPDksX*jGo}r?c*kv#8H^h-8++fuc2)7m%%)X#q z033vfxb>~|`8LVykzsZN=;bg@^;O_dJP^{&BWI<&E9ix6!vbD!pi-BR*AA(BgKQZC z3YL{;WqRNQq7e$fDabhoaOBS$)*%=ZG=MKU zeOH+9&F63mUAPG3*2f?0e2F+ za_fkKL5*Me$Q;^bCa||SC4xK2{#-0?CXt<(%wDcl7pkn_(7%<0`W44l4R^92>b9y4 zQTumRCJ^HMy1z+MzOHkg$tVAq9DH4$1>7F`rFI|lde6+|M#QBKy=_6E)>75!>@D<` zHo42lYu=cO|DlHFccSMaX-did-%4%GnB0GK5 zf#?GZhBJK}xzjn_dJ9ROz{WO5B=~}XK>bG+4bU*a_m<)5@_afhfEclbvp?2~9XIB# zTD^X#OI6>j128ki64~5UoG{5z?48s%e&Ka|#35j@dR)A8Arrk?6k0=noI`3$R9)Ha zW;U@L4dh)u6P&8<>t6zFtea2ofS(HIGKq=q#@XD2T*O-A<3XP5_d=Y<#>(@3UsSSL zAb1hu>w1^1Pru%RT(npK*{wMktkSGR0+l|PNFJdcy=1!NH04B)57sM3+oDL7L#W182Y!Kd}$hr#< zcZZ21g|k&|4^IT!lx&f>dE)gvE?^{GxN%t&3KhkHN$>*&C%${S*zikg3+bsSvU$L` zFc9R5l@|t*!pi`)n`7{?Ntg(>Pi_p`DA>fSDDo$1 zq+WZ_bavj~;bHGRVju~9-m$KSEDE{>!-dTlXmv3Txk)hDAu3_euo7 z#*jT3Mo{Y?iD8CKDvw5iCw9(wbYd9irurdVpSS5o+8%^36CxQw7VZj=E@v_UxMK0` zNuqT9>J{*VHSmcJ)YjTW!N>)Ox^v8dMZ^bcTA2hg-7}J>nHn6IxH()P(Ow~9qPvAB zx#9Np2g}16(337EnQsfcefrW#RF)Kz*OJEJ_o26)H9JA97-G>DzLQc2m*i?pm3rq--BFj~@07loT>~zph?OwT|766W_m(egRhVLYj4*mlm?A1`7YurmG zCl3Htn1w%RaLT+C0|3n}IQD?vXF58zmXS9iDAE9D=K*uK&Fx-}njV&&bL zoapHzbITw}vpeJxe&GQ7z`oOIE{Y1!E~IT|==pbw5A35%O%_~_Ax9(zHKlKV5FUT> zBDj;btHDe5SIw_*AbAp39>^2yxHd|7L z1~3n7Vq9Q+h{?zBuhHDzviL8n0ak?%9L%5W@evo;W9zJ;gcfflT1b`x9$w3Y1pH2K z=t7fJzPOH!jQ>zgVXiHrIS5-9Nx{%J(xjFp@LhR;)T%@f^}k!2`hOJ%-6n%^-lVVdJ0?p};4bxP7j}$it@RlkD-A z^9-4T#h}nfR%d0X*@kbP0hH3Ertih4jHX|)1q=u-xOZF;uguCWrnC51CT9kH(35iv zPob#T`%&WJD{-g;llO4B3<=;}{$2}1vr&MCp(yrpd-5j-f-D*(;!(NCNa#RIrP|{B zt&-FVG8e6^QF5YIK5+3LPv3(i9Al9(I?mF_i9>H3ZMNmb{OmTBxF?zgl$y>#QR-P1 zEOf1QhKuB;eOWVxQ3=DYL@LX`38sD-r zQ2kcJF3MSv4zhfOyYIepRZmNn|Xd+yl=jXI?RG4k0}>dX{gMH)JJWZi%CFjUMc`prs@$iQsuU zxHul)PdZ*^P~wz|9*~h`{5s-gIpZYB{Ppe1)^*EZ4)sVI82i}nj4-Q!^jfdQED{Bj_WT4UjQ3KSQ03|5t zTA8Mw1eUVfXy*0IyW(46kB&%^Rd>!RPJ<#B3{sBNOO&euOy`pXmiAm^G|jVts-Zc} z_3Hwq7KJ5qE+*N+(}Prf^oLTG!eU*R${CxR5i_b~iI&q1D*-*9IGO8fXP}# z*5>pm(lJKd;HeH&zD*s>_Zo4qJk6{9mT^?lF>s{?QAtia?mv{C2YE{)4Z5p z(eB%i6?BVu6n@*!7L@>2}}O5$ei#aGM7`v0G1}Yo3dx8;c;DY(+_HMW*vx zUba=OR0;!*X_(eFpNT}eq|{-kJC_T|vcE3mAZdJZaI9x(-6#wXN5xKusj2kA*TO0* zAt}lYq9Zt%5LO_<##`KM%NB^mcSj;vHiG07ryPD@H@(gGT)g;Ypvc|j4VNtkXF20^ zzhjR9-(a)Xg1%p)7e>?Y_=>N!6w~J9Bpbfgdi?&zZImijPOlY3HTlcdOZC|kGH;cZ zPBLxrOhb%la+p#>ZfQ!rr@Cz%FqX_x#l-8xrpP7zF>`n!r#ILj^1Xk*>xFpV==-}~ENrZ-TtD8wLcE;y z$E!&!h?lGW^GkF8r`}Ea{xa47_Nz$oxBB@q-_i)0qT=k%?mDF; zC1*oDrAbgDr5Lln7#91^SC`ew`*)w@K3%OO!f{bqBEinpQNiZed5$V7dP|WWWa~I8 zPBk$t%V#vxHt2HWF#qGnl1Y%O4gQRS5%p}m1HN7mOXL6KKi2g=743c6BAZ$8w2Iiv z)@|_u=(8fG=!Z25*DEP69qmnq3bQypiqs~+VH_aqvQ8R&-g;-8##ih1MaQLAlh*OK z+Hp0mUy$Y63cFdO=Sv*D81$@Y-1>@R%e&|o|B&)bm1r1=vj5!;n@xF?Mw; zu1mbrU!;Wp2_>=C$Y%ThRr!CpRay;*uKLu}2<}^Aj+B&_mrq+jTYD-Xzt5qRep6FZ zd0E-eiFg$QQ`b?WxtSTg!=y&SOz`AyPNsTSonOmstrkrp(RRb!34IJSR^r2%z0dxH z?99btjfk#Z-aqYBa2;)y(yDfkfA#_j@eaRS4s!2aQCbs~Hd+Ifpq9Jot+pqqcVq8_sPao{h^Y!a)i)MoY*|2rw+El*6wfr~$ZL0acQ0+p@ApE3+$ zgO|}YZ~v(lff0r4-vU&f2RG11N+6Rr|3v_OyV?GWj^<|cS*$WjksBrB)(nC_0YzS4 zTvU`G@yk6*O2Ka{<9CdYdA|j&wReraF zAObeS(F&(MpsROwHQ|%in?gT?@XJG4*wl;6G|TN@hRFN&Uyu!HZASy$RXl?|X8fzo zos<@o#ht=1+WecsXuPO^oX@UbJ|TgVoSB(<`)jk*)btl)+MC?tG*+eif-~N@NDoJ2 z(yI8Jz~>Smd(GVtM)ccr>O*~*DkLN%Ja!8aN2c~0<|-;GbL@8SiPw5dhFv`=gi#TG zVZpV&zMgN?nZWC0ZD#giy_{vbaq#O`{OIe;mXZ=TPEZm^e;c#<=PdPNglq0B4Nl>u z?Q!v_y&_w?3Mll`Z*2Vi{R43s2-ys!6%`d11VrQFX@DK#H&E|CKHQCuj}IjiNEpSj zGNh}WKBz-(DoAUny_TI*&e7sC`er7=7UH+u2LuWcx9a=r)VcDOTAY6IJ-etzd0yGFLa zFXXXcWny9~wY6SVJZ4xk3qLOyU8~BK%WAwPn20lW&0*hjF%+0ZU^7JOZ9)RFdJEVw zl$4KkIcM|209kb0jUT&IBpd$KI^P@GrPc=<4dyYYNdUvC+GU>KN@E>2FR z<>jp&M5nOfl7sEV9JNBp%x|+O*#h4u5dl>jl#TgoUr%6`V^!hzWnwu@ql#wX6TjLZ zoQ{em!IE)4JB~rU2prFCe8_l-%<2lDam}rF&k;K_CoBHdjX{k7mz-h#_D;U0Go4=T zzkP|ki*fa;G@t#(ZKqP7RnfHzzBSV`C^0wGkdZ+$Vp=;B_!=ss69?}#At#@etN>|5 zcr{ygk;Mr2{=m}Ix9sd}waP$B*P87n;Bn$xw7}!7@ag8x5|bkf=~75hQBh-R&(0xp z@W;IiXtmQb-e>sK+AI5STcNagM8~t9lfS8UciIpsZpt(H)6Wj`53FT6N;2+b3XEU*HS-_J zhdVnvo12@D*s@JNm)!t?e|d~4Lug0{DW}Eob5u-ruE`9a58Ix4jlVi<*|3@Iuv;BH z2G)Y}4z+$H8Zj_u-=PZ{8QIj>2u$ntYV~PRz2!moi%1fy+W;th-xK;3-M1H%#KoIh zqnW(7sP$#gpcucNwu@+;h1krr#Q=yQEq(QA*zJBujq$`!tms*vAfQyTi+j8oxxl^K&=`Q|vWr%`+}^y%Y*2o``ruTFE9WYeiY&2;zAV<>DwE5V?AkRW)>vnyAz$7 z;$MG37VCHT*|44@P~kND`U-xDui2v`1a}IJ7v*;VdeeG?l=n?7feK5sk>~k<*($0P zW=0_v^dwJL^s7^@mOx8p8#~J%%07^abB5%n@;aC|1*&qgj4G@r!1e zt;DkSB__^m=cD!uQGo5Zjk_s(I!YwB-eCPo3|`TxFlsmO^6??l2$j~6kxKXDgU#7a z&V5`zQk$f~s-GzY09-xQyeuq`b$EkbV-U+`P^L&I*Lgwn8YknmC`LxJ$>O209twZo zS7uE70^s8fq6hSM?+S+#Q98HzpUWpYtfwz~-(hC{vR58UCg46??yw42#>DaPuf9~1 zh8=N9zn!u_`|=jphyWW7>{Q<5n>nA;82N8t&#Jhc9`7X-l$R*yK!DSv2r7J|T(_M5}0;-S!$(Mr0L!=KoyV8@N} z5;+gQ=XPw>yg&qdw6~t#SrU6RyF~9b$3k`9$-QdObXSyY1r=^ zz(9j$m#2deNI?#NcmW=c$0p^YIXl{m#MH z-bZg>zUPK&1uQBcT>v7%o+E{}X#xth^NvFfptN`>DG32V%&47J6rB))`}mE#pvLGd z3CPvBlQjKfAtC2|UbYW`u$jWYH~0KKwH&7bf(|Jl>PnN2Nm@H_Z0WlTi2fG+gE|4W zorEIuZ!-%E84E#~k6L5|fA0#QP267i`T{H2qbY>MMt;<|?v+ox-HvPfx#56x;zI6FAp@)i%t?ky{`s8eT zT=c6~Z~K-vS^nU8?z1JlY}yeZ;kLE1wY_@f%9owWwSQ>?1gMV;I}<7akBP0u`%N8W zklMk1*;|M|P71<2y<_aY!u8vIWSH8){sUQ=r;nOj3*E$B+kTQsUy126`^w2=w=lVb*z$ys1QL)ArlV&u~45iBB(qh|<&@ z5U4uFA|CQ4_1meAOj>wPI z1Ect!xAiVZnkK$Xqw(wv01vqXX zPUr}b`{Wz6M!~Cr6l>n+*$=%DFx$^<|E<{4!Om`ZFyCk+XRx_=`sEkng`3pY-}vC-MBp`X!nSCll_-YfW!Wtg!)N@-{&yy)?e(;YG&Hn z*ifr*%sb*#jO1D)+uTC*zTEnQ%~jrPW1M8m)@AI(KTi!W;`0DL=k4v?Q+{!1L;5`B z`U2)o98>?d1AD%)Jy;1f&D__*Ml;FoJh&BQHgijwB{e>SqA37gs>(C+NL`9~8VOnr*<>NARKsEXnbb$}?hCS+u?DHP$+ zcm0u^!OxusSQMyMOV`Qxmw>;yxi>$Eu4`j~xBd_W=py)=OZWHpBV1Z$RLc7Afqn5< zIyycEqW=VVP$rP5b=+PXrs{*A^NY8$z@jc$n3+ifvM$0;e_7nqLeGeIasluUnJQG9 z@lx50hI1zzg1&jku=Zb`Ol|6b0s-fhPB(dm^Nt=xRQ}?{3xG(CwE+-t;;&9?gc0sU zLPbTz1_1hEBuRuA>>j4;sDmgI>QV9Vj2^~avqpFa$HweS9n-reB4jblWO;@%IwD2TTNJXjWDhK%O5J50?me zU(V7jf55`>*!M=#{ePKR{Uu~9OgH$^00>rkC+c8-S`tW{^ttWNB8>IosU6joVVfw= z^P+(;;eU1p_dhwm`~S+b-THcZo58xM7}#>|2FJ}6#Dn=b)UULwj;n&(eNPXyHw2z9 zvSK1YcZc%_S+F)4DuB`8>gEQ}3L-tRkzisj%CYwf$wOoYQdF8D)x3PaAPV8JAIz2- zug+IL?YG?*3tb5jtzvp(%XPA`Wp(bjG52HMw>&3r1z+WjU?&Tks)M7Rl-BiVnD05X z_KXZ3iT_sIa-u=a!m|FgD>>0aKknaq3ujX~XtG=#snlb}=Raj`0$7Wn=t(Bo8|SwW zIwGEQ^>2pdMdneKuKUfW_RdSpT91-=W&Rk1<C6m|u zUz_i=-fX^`0!)kp>-KH>gF8JU8X6k@t5q17ZbvesOyZ%$cbG^1LUq@rq~zpSC7Mc$ z!Ha?Jp9{LPAtYlXqt~mk%|}yS*Vz8KJ$q*444P{!YPHs$EWEUdI(%hpF!c2n8&!z$ z(0ifg+m>3L^?z>-LzZ&ugGK40eciWmwA5CT)BG#75=i3u$hgd&)#g}ZO8>RNzb7fL zudmO`<`dht3$uK(f?`zF6iRxcJZCB!N}}z0B=9fe$8z7Qxp}KA!+B6sy%Z2K*L7R{NQgX@!|pM^hf(ip?AT z9!j%-VilwzDP%iSL|jyD91t>%Iqb8&xNTm=TX*@!zwB%}ELN)yvt4W25(Q3k zs!w7m#IH|!&+aULYp-|-F#g8!SIQ|U-|UyOoN_r;SfrCZe7Y)dxM|H$RoMxUDEVnkAysjd{ z_|H+kzP=7~UnXFQ?jH*a+Y<#m2C_91d7bVu?e6SE-H?0e^N)v$poqwe^?OY~a0S~- zUg*ngZ50o~*O^zByJ#!+?8_9kz?~apy@$uJeD|id(^tle9n0zl9*hw@v%VBQ*Iokh zy2P1( zi(D_?cS4@s0Yoyfndx?GC`&O?lLMg2*QC+g+h6={gMH0@J=iGi%{MmsFg>6P z={Qgq;Wn_?>rhm{m_5sVaWIC$Al_2(U!3fKJ-f*BB+=H?*bO-;gximl^4d#HOqaf}eoQhHOI*9`q zNXImuW^H17M@8A8L|*Gt7W0;{tAOYQFxl!#Ga*`m=I|aO`1e&8+H9~ri@VO^m#3C{ zlZfIM37cUDdtYK^PQf4iG<^Idpj!g`tPU6xZ_YyefcBZicRwvTS?{B@RS0-Oi_*43 z2|ZbxW?FHt_?CYB_Uoa+pM_@D8;1)PyLt0ws?M`FdnF>OkGcoUbSB2>42qIKKDGOh zj(T8g(P)5M%&KloPfz!zUjc?O_!fYj@8SYzmxK$c{ezhbv-~J7yXDz{OAZVVgO-2g znOZO=j@akkcU-N`yR#mQx6kgNTDhQ_>a)>%Wx%m~LSv7T^E3rbRJb%cH}t7%&*H+u z1`-K}1J11E3kU4`gQ6ppA@;zP{3_>8E46e6j#m(OCi>Qsu=>b(>+?Wk*zaNJ>M75wpcb&C^kM|y?L``pYrQ6J}EiAD)k-f zXmi)gR~s4Yv3+BX->7SShBCqv+eeGF_f(tfEArIeQ1PEGeDZDS7e6@M6)LS?^{S10 z+W-fQp`{5ss*8(*p$sI_j!{}#8jut1s_bS4>yux#ee~IGqoq-_?N4o%SS1l7DQJ0D z94O*XBwi5b7IYmvFr|#JyeMq z;bjinD`R87K9WaD61{hKB+)`D;4i{1RpV!30%#Z9g`N3e78+jNmv%AUQxg*&T~T+? zlt5Lfp#?}$97tr5I<8o&jBPjchhmi9((yA#b74wdVxNvHSr_DXr$gaBHY zhxBwaxkcwL(M}NafamOu7zT+u_|?cDcnHe`A|1V$)u0Vm@Qud2MPw0oxUOr58~(-O zoQ+`tx+bfUJg_(VLuhC(FwB(p+OzRUYc^czPirM(@!kShB!*&F^pYIzsgP02yDNTr zpu$My^B8z{_Po~oz3bHW$>J`K@Ge%juD(7yK$CRw;>Fx>4^QJ*7>`BtPc6br=Zy>i ze2fA~yCXbcgeYsfi!U>7hDyUKO(|@G&iw!kbK@u7{nFk8(0k|#)&v3i0y*0D@85wL z9~+Pp0GhDO+pu6-A$pZMtp|NW97_Os1n4#D5)O9G*xaQ|fwEQnaxV?N zO&}Nn8LBZaC2yvuRLM#DR)`d@F5?1i-`NF;S>LqoFoQR!I-`jtCrc3 zuF>8^-yW=1g}f!coq1`?TR2ztC*l2V4}F~Rz(6QBA8|%A5R!&vxVQcHm;AT~|MKOFtE(&e4HqXlQKDh{ z*NX0gOCqUI+g56g-!bNQ&9fumidGuDpF?0GCJQ*57a>2%vMkdvcG62klcg=A1BjbboJY^`pQPG<=rK=FS>z_H zc6*ueeyq^`u4vv5^wYP^#C+xCT9*-=UScQSm@4oeUhkJ_!;{OcF|`^a-Sj(B^I;|R z<5dRH1SGB0Y%%U1!~QeFAaw8ovs5+k=Ay0_Fe>e$>t0vmJd^=-6Z>BF&i`$Pf3%ke z;mKFF*Gw^-kVBi_gu1jtPzDWRuKXoX?@{cq8-Gm*x=Q=n-fv^%ApQWhJ z9HBJpdFgv-=C7BM#7@BPcw{FuVJ0$Y{t%9)wkv5@Ir}1lMvPy56@cVTe1fCJk_npN zJyhX3SB_cBk-s?Bp`@e?DJnD%Wht7s&0^2R$D$xbDy7v_sOMZqcI4RHxEwU)oe(#+ zn}1en5@us12j9)pC_hXX#OBN$S@bt!_GFN61`H(~7$iB2kBL;^1dDmRN}C41-0`ub zfSN~Y|A)Z^+yh|4Ea!L5Nlgltu88?ZbhSQYnL_k>ESE#zu-M9@dvM;EmX=|C{414Oe;^WS4B-(efI5zTseVkp&(*dHC%L2uLzx5;8`S|vHh~!izzTxCYtnY8Kk@2?9 zO{i#VJ!H!~rh0n`PHCl92_I1_uZKTL)>M}q~<5AKQ=!uSFGP?p`SUt$&^@8+k6Gy9m8D;O%wou^z)~x z7=QaJUX3DM991}zqG*Rwtv7Ka(dpPsO<`wYCP(It42 zA1<*1gS{KGz+|-%pAM84pPhjx0BjuDJZsgIR1!&gV>?-%`yx}mHHZ@E4_?E&u2Qxd zy1hHq^ON1~uX5@ZyZi*mBDviPB((7dmPUS33=bvB*xu}Y%wlg$St-Qv4C$RcZ_4&n z?%nY70&)P*=}QuWr>g+Wcc_7CwKon8=w|u&CMszc zK&G70zH%f~uQx#mE~D}jc(Y)%E37&xD6Vj9ZFjIpdzp=*RM-AN=XdHAhuZA`2LmSR zz#b1rvMU2r0H0p%($bQN_ZZr7h`9dZTMy{v)g@zg9E*fn@eb7JMtD!nmti=XBr}QV z#my0=oa}ykx=ZK`P!N|El>xmZP{JZuFuZ!T*H{uBf4cVNz}~~dW2D$XS~*2hSXdaq zpc_Nk;qh;CVl0hgvvO6l>BF0VIZiM2PwCrMc(S11+eFZkT(E5L4bM%k_NEIk&*vSg(Dwp-23QXlB(QN?EmY0<&yjBbubl6z(`?9?r z4YbJ1!Ofdz&)sh4gn0V-&H|U7Nb2meWryjsLt{*My?=9XQxyuJ|})lP=&5e1T`~N zCf7FmOoB`$0j@yXTO~tEhnF)qNBkO}sc?~iGY#-X=s@}t*;2Ha)ABWz*b^sCL>SZn zs2KQHZ^D7g+ElJ~#TtOr{(cM&hXBJ1731zUCo%As{`8H9#_Wo8o8sSdBhMj@$(KoT za>|D#BlZflGqlL}`91GbyCsl9F822A+XV&?Vx%(Yi-QQ&!ZIkt8&HDZ8bXck~x0mjGg=<$A4{(A+Gr?S-wUgC$^=%efg)LU&^bp zzTfb!GeD=jr3UREtQUuBN&xCl2}>U%g})Jc?D7~|&>6cqbDsGjyp|Q>xKxlG!8W7!?~(Y`l^Cv@1_nJsyu%Evj_!a51ba}KwTtxPq^FWbR{$q^P*Jq z+P4ReJ%8yxzQKTA{$-7Y=;-4NhtqM_KqVgc?aEw zF^g8%+*LbhV5N(q?K@mGV4AWT&Xkhu(B=8L1%c|ZUheKD(3F|xW+UWe1sXR8h)6%u z@EiavjqMCMe#X>2?B}VS`#>krjp!TZ)mnPc&%~!FdUsn?k%?*$>^T7mT8+@a)XAewC*nNY&dAFnU)7X8M@i?%OPb%>Y8NMgC`*9^Jz znTLr<2A~D^p8NRmW2tV$!~c7<=f?$qX!ln14&g z{n?E7-~J#n0Cl=SjI2Li)skqL1rLODjR19=!a1G-!w8CX6 zZ+XDaHUhw1X!RaI_Kb^uuX@#U?mZi;0MkahK7NwC2`$0zYJgYyfKJ>c{Tx znEl*wERH8J^HQO43ge&e?Y@zrPGLrv$k4EP_NfKE8p;0Z@c1dm4#{(We$H!S$)?8H z0%YIyG7t`kNL)P}dG!Qm2aUSENG!|!`MNX4>{1?#FCfnb0?W)f>xs&zF&YO1%@DTS zhud)sf0|+qV9+F%bTA@y>}lcAx;1(s?SU9yv(?+cDIKR@WbEHvo`1nz*TG}iyu3^a zT)0=$Bi*qZm}Nk*Nyn5ImFm^=;dklSXW4c;K$NeSIIP=XSQ)`JkjEe)N77V-Lu5@0S~f|K|Vmq?CQ8}BSaTLrA8aeb^v7e-v?b1P8OLu5L(Houj4ZNkF<*Z=#n}#G?!{bKFraM)|sp6D~piA)7RkX zwZ?iq(uQ6p zU^^+Yl^dnVR8&0u@*QBxIzmPEokcxId;eu`5i?-y_GKnTZ#{}>tWIG|ZyyE!ao-c$ z8I3U`jua?)LY3Dwi)~{0Vp;3%1tZGjeifR3&UVI;(#ZzCd|9XMwNfn^N5?PT(r*~v zOwZ2T*^C58H2A_tN~QG+w5Bu?<)$%}A$m z=sj+~pCCLtjQJTxIb?}c>PSZx;$lj5q&4r~3+^gTmL7uWos5mC;5`7}Mag8BeCk$a zoSsd!DakfU%O&M_jfDkbmdamhE+2h-uismF;Pg!~BBoDBUeOiFjGjxOW0B%9)dra_ z`~W3uckN$^g}86G@GAG=?8>-fV$Ml|6|Me^+=mceZnVq0!)Z%fP8uh-M9x{^Rlp3- zx&gYQPOxac@dwW?%T+$zt*V=|I$2y!NB2_JPh@#^c|cPdrRpCn8PReSPcoI17Mx1gn%brRHh zacl69CEE6m4xmgAl{k5IXPBNi`W1)*GDp5W8=bL|gw~xK4K2*46J2jDtLTG_K6jsu zwY%dx>(cwtG))Qd@rWa=czguE*W`}%9ik?-o^WH(zoal$hGC`+^>4c2o|ncD~H)s6Bxje7;#v7djT?z^~_2}Jc9ks@}; zw-q;o*n^sHqyH9}sY)=<&F}Lmy?NAY(>u%26xuUpXNF_!^&854X5>4;zI{pJoxm<` znM2E!x=$U6%46`1i+d%gDlcqbos5@M*b zm)>$RTI`4)9CO(C1f&B4Nf)(5>5sPhAU-y6ZOoL&y)?Y+ei_?UKZ&_Afz^oiihKaL z#Ap56BAPn-R$xem^rR`be1rM#zV-^R@}G;O9sEY>RLRm=P#B21Dh~ zjxs(^+m-5l;Qgc@zS)nXgI%nzUUN{NVi2kEu9^B|*SpS^eDcS9$3tnqMCH1F%L?x8 zeH_BVX2FLMmC?TOBECN`=E~)@T28(XznM?91F7XM5lZmFj<0$RvK+O*)Hq#de5CPM zk>fT~K5aKnfOMw!4mG96OB5EY#6rTp+mOE6qqAl%fr-3wl=X86OMY(HG-5QPEhdz= z;b#JgH~1k?h97^^K-o<|Z^*@Ydksj6;FdP~lBbrZQyq`Q(Xr){%l44ZZY^WkIs|gS zinDb-txHq<5bx3bc|vXZJ)*dEop+6u8i(yNCFi>%j(nX(B0X+prMDYV0c7`uJGTr# z)FSgVJ$!ynRH=_g#(3j@>epAbUKV4nAGQ4L_P!OZ@x_UB-6>6+%UDpf+$?kMXEr!? zbGis_=m&3+wuipmvIO8z52W|m(S-aC`1^J^=B>C0a-!g%=5lZ}iKnp3r_$a^KU3{{ zeym@mJr8(V_VHsY$1=JmhaN?lKSbn?05tNwf%+EyWK7(&1G`GkcqM14*y1I~?tbwX z-Y`Hy>$ssUSdc%`n??3dPxQAy9UzC``El9V*=R1ENjnzQxwoEG99ZDi$C-LJWY2yV zeT2Do~@t!R3<)O3}6MEP2UvhgDU=OSj&>j1+RONN?*uJD^ z81jTzd+nNPnT9Su7YpN6`|d|xJp#W53V$P_V}QE!&W#(*V@^&8`b;)z2XYSwzBaIx zehQ#S=r3s6sDyUg+QW_@4_6n!4Kio`T8}HzpgLdS`v4s;>DVJ_L4=#9Y1t zlx~PO!DC`UT5DnNbh2>@{hvtEapMzj^4|JTUZwS6&{!Y1L>E^&F_fUjX&Nhnctbek zetig>vvB;g0a*ZCT)Dr@e7zR1?ipuGx;>8ZOQ@T?yhTqEAG7-XFi*ow{~HiB2Z(++ zu%DA^+?Boq1r`+ezDQt_WKFcfV#dI|Zi$(=(98cVh6a?=->1-XbyXd8&PeU-4FD{d zrQGGHNI!Iot?D+%j%3r}3&567S)5i*ss0AeKD)H{?Y9Fi>?NEJs#YjV)a11|fNrIWaGCV*}Z)PaSvhBmY2J(bV+%x+{f5={Wu5{bNuZuI9Te|Nl6L( z8Q4$?^M%C)?t|xL@6K;VIxga=QBGEB9`046Z;osBdOtyr=0$yT+TRQL{P}`_eb?C| zg;oXR+U#bh#IPb+U|R^=mFHt#_q3WVdLIkrIhY?($-;Jy$E^U#v#M~X8-Gp)@WEGo zhn~A=+4zSZzE!05BnG*FBZ(_+>z>&Uf`peyVbVZxnds%IrezwWl^R?zZnPccs* zwiBV;x*W>o7SgfA)9W{$+bXw1{^piSw zq|T;xisS%P(<%MBm6B=O4FknwYofUMx1k&1l+cGPmODnn{*#9p)76&`8%TMYzRuxP z*prHM1%T)wViwM;K0b}=`F;eJ3zF=55Xuk3J#FJf3e3Z`A)%Xt7E=oldp%HW>MrW) z^X~FP6KA#IWmBgq{BxVm;elfP9O8*gC@=J0AiCU6W$2w-@~IR`(ywv<|eylvPt6eC+o2F~% ztCG-V7}Js6_n#jNl%k;gqQH(-DoU9K)%ZJ-RS;5Wdb?#pzZ$QIc`& z^tvV=-lriZjAi8oWaqQ6&=@q{9lo|JATA5o1|UkE-fqq?prj7>D*-$-4Wfp14r4pk)Lv}<0By4@O$GApk zt|DX=8PZ>c|4KRsbXjMdE!+t$6N1IxT;Zia^bF^!yyz^P7hC?bEAn3fHt0iGtvh-v zA>Q~*WzJyn>p*y9P>NK&2-@Y*$NW`YW)|8iukJ~pj+s%dU#3Cd-M#vlYSUnkOco+{ zex6_R{T~e0a0jm((67Fo5~&A(*kD;QkmdvqTwryU@I^AWP(Sh)%-iU;Qo6-SAi`T0 zCV8%>K2GUwwvq83FkLrI;=m2Nz{nf+tBKE7R8EE@# zv;@=r$~dL0CAhDxI`()?QDBrF*(H>9Q19Ak+dhq5t}4=h=Iha2JF*1ZMZ#DcAWt{r z*nbH){yt0Z?-H(eNsGAje5)C`ZbrGWtegJby@Mu&3o%1k9np*}w*Uq?u87*J$owb= z27$YHxtD|RUTe*0FT{AGdV*ib4u7!H-9OGjnQuhE!omcTq<#B++E zNsJS;(M0MF%XQQJGTF!{h29POKxEBr+%F}ot2UO$V zNmZaE8Z|#)pn-bOqwhmwiRBTiKIjpQxv!TbP3Y=a-6pDaYHUK#Z*A94sjaO|n^(?m zI#k?EX-VKvvA1s6%WEF8%A*;TYpTk$454ahIMKj(cOdCbC0v)Gl7YOrJz` zD>0T~rnDvCcyeVglb<)@K!+B8i(8nIO#lg^+uLeHjSBfu?|0Wc{_sJG$E{G`0oAUq zz?2w5V}) zqC(=lqI|fus>k+ch$M{?Xte>i8SNBwR+e3?f>8h!`8;S05r!*D5gx2qWjUFk9%283 zM8{;=&k0@GtLT;?+00L8d<3+MtPtoec6(%(>5;z6pB2!t-2f5g9Qv<9-ZnDC6oAF| zQOv!;LY!hHGNGoolH7QbUwfj$4v)tQ8GQU?=>m@G<^@k9b%hK-1Ch$urO3vUQ=>sr zo~fOo4ECgPn4aGVk4RUIPaqh=1MKUN_((*RS4MwQ<%<1wE`1_2Q7-gd(jZ8&h2 z$*l44J8_7KfztM+qx@JcS4Z`JL6XmAs^%7Qy=35d)=c%Km}=$5^M0P**s#F#gS|Xe zN0SauV9V=X&pX#IIAKk$i*s5Hy{HoQyJG#K(Y=NRt;Vq@GZ?#dwizRu`uizJ6=}~4 z43`Oa@80j52CTWX)H%;E+4LYR_3$0h@dBJ1L{-aFJR>5by#u17rS&3!RT&V9bg)Jx zR4s&$eh6w`jL1jKo541Q`af&kIuyb+IKXe>NB&l*9{zq|iECpN^5+*oJ zUF~fK?kLI>hzWH_882D>_L!CAYFBC3b$ymnffp>gbz79<1_)NpFop!-_8;^UdGgJ7 z))&+o_A{7m>!)dFAWVjR*zy9slJA-7$+c||Tq~$pHCvcIOPfBWB2k)bMO*d;K)%f>82r$ zNH`R(;R6emlA1;<81rcuCMqUcI@2Yq>@@brBD>rU-6bk>rsl>1Mtl!yt*4f0)<@3o zH?#>pD)XuNzw7CaVFc=)b!NNprM!cQdMyA+BGEiFWvXiChnZIR*pN*5OzuXSJU4KWuWro>!9y)Y&1#po()D>nOdx{M9^g!Fhvjey}qE#o9;0x(ddFK zKq;Z%Wg4G0g=(B^aU1rJv251tl;c&d^O?qn4^d=Y=I?7q*nV$RnDPntfJVg#8VY?l zL}2T=Skz!e(`x|vE`nUsXm(N}mkd9d_gfPTOeju3lVA2{?=HZ4%_>PU#IkC)q22Uk z*FHLrexE)%6y#sdSf?dmZKi5W4hH9E*vpGS1>77;kW&;TlVYd3EUIX8IBM%C$^}8yK z(GO|ICeJp&*3y!zlv&E{apjQ`8hW4wCg;_ivfu~&&ufXGo?-a1I|1!62SDrw5#-Ce zmIHG|#yXnx1LdD|z`}_{W)G98HGhGQl;FUZ3+L=#c-TDai5}_z0I+C=ODKr4iC>AN-+)fwN%mS> z_MRQYi%=TuX3yGCJmkx6g-6@IHJE({+bOx#bN(*ff2GlW41*eg)Agk&ecUmQO}TH) z8$_73CEQ}Ca(0cAVyf$XEX(!U+8Ppz7)A)Qv5y-@As&{3b6?r`Lf0I?Q92mOoiE-W z-Q3sn6a}9AVD~}i&W;O5(^3*uL3B~d=TN%Dj;*!8$;94jT~L{XPm}q?y9Yk>QB2c$ z2S8WEcgPYF8s>|k#k#9=9rPxm^zLXI-VZOzA_d2jLl^xye`7eV#72EEgDd54?Dgqq8VC0WSBB>5$PMUE*C?}n?~wL!CUteb zB@^b=leYa)kiruLRQ)uWU7+f_^2YmmqV~MT_#QLpn|t3P?}i`N`oQsfnPq^#4yKRV zI|c8FmO81rk1tBqN#G3cvbUz`oh>yBq=gRc3z;sbyV%S9hGT%?tAM26TEhfEeLVe|%)6_26`UVm zDACy4a@Y;t!z6H~m~M2J1QDEsxS(Sn+b2sM>?<{`(?T!p5^`;|nCZ4TS0-_)byc3c z38f}Ei~FwX!6HN-SCj@r7PUmV2Tq7|3;Hl1n$$o0fBp6+mKELgs<5jYI`qdvnvTQ7L9(W{Uyf~O_`R-GOI91uAqIiZjqCSe}_ z)YEe3LDOl92Eha~kMAMoReV74c52=8xJ*N}aj(|2?MrW0-};y@reNSnRoyHAJlZ1r zpM`q^{0p#OHu|CjXkJ^LTDiSur9)Z7>@){!LP6(hFK!Fo7Vf&gfY^Z53({|+6w+y_-I-_WouLbI zq(;F5^IpJ(m7Yhj>l=wZ`Av2 z?k`G=%{IDgZyKMe+S=J}?Nu;y+g~)V@nq_rs^Hl5i9|z^Bt6H=&EW8}zuh-%H~?I0 zq4mjEAcVSgQc&a4Qn8X+|QssbE3_9_!!s)(?cE%Bu6cb}0#oHVhM; z*7C(7W!0}flCp62<^z~sZheWv9a!)C>~Q1sn~HI=KAVxieo=Y=Np8g0iwFeB@@F87 z#YLX(4O-ZPPcMdZ`dSW`qeZfT3$nHnNM8W(Ym>z99j358AL_?4R@t?XHX})^C(e1@W~$xOo$;^Li=pl1pm9F-JVTFo6#6RJn85e zT@jOSyNOlGNXS|pG6|8WC0Xy>0-Jd2rsO<%uVAJYM5*bVU)q)1er7Cd>WM2lWpK(3 zwq?wfy>GAYFyMvUZB23OWAt=Kg0r!9vXT^`p<&-K>16G(k6C6sffY*EiI4yn9cTXO zqAHe;r^tc-C1p-2y#hiwm&QKEB4^T{-}ip$&=0>%<~_!z4@CcLUvH2ww^)gBFZ`C* zhPL=(4=DUlr0CHTB8f#iD!9+5d1Kl1V>zE@b^f+&-=M1#Th4whGa!rn{mM9CGFkKP z-TulL-)zsTxe>Bhr5R8SDi1a4l)|N41a@-o+;1o&Lnh6Yn_5g&@KO>J+svk(xafYVeqs1-l%7;tG@U+8@|;f^N=w61cf}#mTpS(N+O%mJC@MnS79v;ry!L9LPT+n&&#EAMC70m}SQkHU zoo1hyTmPYv;eDH)M1%H)GGnJQN9hV)y&Q!$5$JvbNk2#7EoXen^RulDZKrtu=|IohTvbeRGK__GO>lMW zq)cb_O{p>oxq`?2W+zVrJ#&Kt+5+Jjoe;}8TvDIR*eGo3YoR@9hxga#=eJBEQvVl7 z0LCCWqz;&ezwGNm%6&GGPQ_1;jTK%AvX!_Q-`dj$E-+ku@#r(#bT7%ZlY!h1Xjo_<-OFo8gG7FN zcZ;3x#52K&$h3hm?jm{~E?!SZ5urQcTf;XJZ)I6?FJ;?n-)*r&UgFEA zT&C}acVHt~h7>$>Su$TY#47CGFOxP;OkQFXr=gawpu5{~Tx_{o;o)%`YU3D)kN#)+ zM8A0p{dX?D{V@+ol(N2OScw5m>ZevU&aA5kuBC6K;YS`_BY*Ke;C<=)gO}1#&nwa% zQM@ZIrV_{jWg6T$Z|cu0Z&d>EO#>VGHnrpXnLPNtFbm2wQcrWZEtjmwHI^g1J(w!A zyklc`mqrNX*&>Um4%y6(eSHeYP;9w0qLj&$-z2ye6?C;DP)k<=lQA%uYRh?1*wdWK z=7CoI8Y+Sw9$FgbfqbRW-aCy5SE0#I=>6)xoFkeUh_g?b_H$0(>|e2i%p7!lS|Zk1 zIaf}d2|Q-qy3(q#OC9Qq)=zFb?GZj$#QN^=49mEWL+cu{G*Xz4(X{@)ywlpTP&tAi z8&;Lh;BZnZ7t|GE*4W*9Rfd^wX`^xc#4=tcOl&hk<(NHUgR{F!9&CQ)Hn>Z|=`LT- zJ?Z}PrrEPDg@VTdUtr&=1dUN=zP^?A2`>`0qQEJ$GY|`*&IJ3WL7qQIwS?u)cw{G2 zM7#|VP#vgR_IswGsS&e;X!QC}8h5Z{Hr-JDquc_#)O2e*#T5v^kWxLCS4GQpM!45V zF^&*sYjfN+J_=Z+c*|o_0cNzD*{kRbqkO1%{OdcC!?u1JkL7J?W`)7B1GyZ0y}h0q zsQw(iZ^-t=L`@0nzN#-w>#2h9_e3-{_;Ew>>EOr3!X6godxc>z7$n|ZZ0V7IWKH^} z{9;Y(d2{N4ME^Y$*fyHG2o}el*Rk(TI_|m&F|D4rbi5@6`v105|ZxcmY(J$)mzW^<_v05b9QUvZ|m98IKdivyj}QqJ43s% zycA{bqMOxBuN>R+EL zoSzBlX!8(z1*vbSt8hr0J&nBP!#a`ekQM-Ze{YIGJ4h|E@Sv|wC%*p%e=gTF)X68ZjyG5aG)rz_l1 zh4>IVkBeUDw^diq3@4`!7oNR>J7ucJ!H|@CepsfNXM2oqhc+cu5E|m@?H5qGGAkhv zVy>_LTpzz_yNP)cz^xC70=!tL>(Htx4RGu}#_>x==`8iOyK?E7%+{y1B#WfTO!>d- z@^rZp#A1=#DI6hB293Q@ZL**mI_#S7WL>PXJlY9J!U?!A6m=-9(RclY+N+$o{*@b% zBOQwBfx(ZFR{^hA-t4DgrdJHx*?m2kTV`okVN(g|<$bWc7LL6sv^#1DZ1HGIs&YWZS0@quek0ngl%{ z^(ToL(io-FmMg+D<}YC@1Ws$|vLow^WPecYa!9l~@h)$t?2QHJ4jB_RJ7lFA=tu_- zJoQH-2Ls$%xJRWBz*<4otdfGB%?b_{I~g^jMl+dvjYJ;g_Z>|2^>7^Sa@m3XJ_gC3{KrlG$1hTGVYfJFDNg| zN-PH_AjoVUrEzbQu%}F0xjeqoQ<|!>bDU1|_G49U3c}CX2Bg=~&VWD86`kjHF|D3Z==DtB=K&DxD!FR==@9#+a&C)DgXSt#of8| zDy2i|r|%!g`FwWXw9|F&T21A;vB_Te$@PcQB%46jt4@x5(-$$_87ky%yfhj8&W(oh zIRZZY33Psi2CPhUORdn$N>~0#E%!Ih28%c~pX-`Jpm~{Tb&W6A7hX4%`2umh4|%_{PuoUDu&OB}o%j=!8m{fqHn7;K}P1TIUr% zh<;gG_g;+~S@lV5Ep$Fn#oQ$ zVx-T;VZWm179(d*x4t{FLCiqn1MaccaQ#z|R_IHkSN1!ArarJ&>kEtJMd--E!$ zGbry+*uI_Td>t|kRip!|JjcGl$5eL3WWZ4`HU4W=^Gzd~@Zv~N0m!&`;Z(4?F;X+E z#6YZekNUvyQ}V`&6c@2lSKO+u=Y4O^Tc@Bkh4Are$E?JeFcB@NwUt$ldke$q9$YY^ z(==<^vG+{#-mv9>%TZ7}+S_CZfGw4%sJq@@-anhOc{M6PC1{1>A>HVYXh|^W0bP#H za3QxoxADdgcbOr|k6+!6SudKG6rgaA?T4t4WQR4Af7kVO}fN)sz-Xb??yF>k4bT z__!=QS819nob6M3VXOjD_nuYv*Dr}C?QxyGlh%2W5!ZtG-``c+|Igz6Jrq>Ffc4z5 zuZWqK1L~rJZTQaKy@S><@Crcta9G<5sdxpH0{i3b&gVRTPCiPrdAEqT{?VtLT*+d& zI=?|O1K%V^tc91x^is#tv;}Q{NMX-t1I%$N1MQ%>fni*U~(eBPV;O zDHb5O`7o*V7v-MgNir<@dx66Msd(o_VMZo@}blwlOfgX~Gi zop_so!t*nt<1o*q1G5c1rWGnBT^56I=seI+*+a2NE z(NA1Y`{JU8+-@GB>sxc15iv=|aQM0=2J6(zpU9L6ywS<%CdYB?)e}*}K7mtKu`w}h z$zf+FjW5*bf%+Z_&)C5)o3je;%3N-`Y0o1_hsQ3v*w_ng5rZTFm&vKA*`&9qfa*q} zQ0mXhVwFo{ASU@25v91k3IB-tDjw{~OZ!P7Xa54+7bIGaJEf$lC0h2>*Vp51c zk<9^@1MI$@V@tR(>Zb)iv^3MZKdUSp3ZpH1@Oa$-qpCUh-Vddu!jwm9%zjXdid?HI z%Bai>)VF?K_eHKUags}Ogf>_`MU?AS>r~jsJA34v!sO>F^Z6zUYv#&9Fdyvh-SCdw z4{fI}HPAUTEq$W-znJtFgR129s#p-0)kmXO<^-N_D<|AZDbe=nd;yx!=Izxd!t_t8 z<ROnx`eqd{DUTi_sVYRV)e?Rp_+{`g1HT@-xwK^)f#&Fa*MZx^u-TMUfCnQ#P z50hPtOu#AW>0)R5;sqYEKsAX#6P>_Ef}JyE2c^ga3aZ*zU15X0Z;i~}JDbr%Vtn9I zpL;(+@^#mDCzmBJ7tC&oYZ_b;ve|Ns2|$^vr+jl_fX*+*GARd&7JmB25~6lzyo^0DrO{=H&UmKX{DFn3j=I(q&EU zgNSy>{k}L8iX$Hg263^nvTi@NzW9SK(&n$cb=-;ZuX5gGv;iEDy=T~T?0?8|B1B=L6wttXJM{zG6ewigu?oG<+L z_3Oh0WV_VTC%MYMvWCAH)n8r8++9~8At3{w-4Wno&)YD&X_siRw^2KzKkQ+<0URAojEcJbKR$5Xb7OGm1@@(m5Txh* z#aqCIZ(Q51i_DJgw{@D5%sEEPni$Fcs{ikq>yFJvsFZPaAEq_DS|>J?)(8Z({+tg z-i)oim)p?H%*G7xcP_xCrdEx(I%Wog`OiY%bNNw6Bgh+)ya3lApPv>b9!;F7>O$^O4 zaE^R%a1gjG55G5Mf4H-1Y-OdbruMz7en7|}GZ-kAO?$3J>A{pW3GSJ>r-8HlW<7Du zZCQ)gIDHf8|6Yd9C3f~~zQ+9%$h$u;*cdbL13Z^>c~kP_$&;+QGD=ER>_P4l4^P_| zXO~;Gy{@#U<7{L3#ybkv2Hv9i0?yaM$+Pd)JYajvwD%}Q1 z2}nx|C@Ce~(#=7-Q5qza?v(Csj!1WRcQ+iG^DXqg_xiqf> z70^~m;B_k>u_WX_hDbC1xen|;7XT+voMmjrd_{343GJDuq@?7`o(-Payo;6ZubKee z4nnYqR{F!Fgy-^@e-E{p%^l9deCwAxC|Ls2y0^CnXdd8TXh6R*lahjBWBrNI(a{At zD1a(PwY`Uj#}EDhKyzlglL1~QPiz(w6H~TFP5Q|E)DpC?43dJrcA+PY0`wyCrPIWN zATPTTEqT6wWZMSuy~luNf5PUoeJFAd2$TR$VC7<*ckkY1W@hpQeoIMl+V5mt z`TFtW9|uRNV$q~_P0yb{Z}RmlEwz@W2FfXS8CC&(_qN{r`;zVk&JNZDmbJ+)!$v73jFgeCy06ZK~tK#ptMu~MMzlK={&>R`|bfH z(}l4b{~oh9U;Dvq5ue`(WqYeVA;;JN1BeN2ZEZo0;~!889P%Z8_8O*#T?H80lP|jE z)ty2kBNgFn@^W(6TT%F2!C2VXEH+yc@y@5K>v>Qx8dbTuwDRFwtR58=Y(aQD&gaeX z>=sM+P6u4zXVYP7ZWQlD?{axR;Gq6Y6wQjuQqlo|UW5Utd{R1(t$Fl5{x(?53Y*=} ztpRD{>$7;EH^NB5z5HY3Vy7M**wA5k9vEfD5<2L)`Cz8(<>h5TK>;>4_OuJ!X?v=M z;CU;}i=s2*`%kUwK3#rZ?ldrr)Ts9ay!qmLCe1VrTXoz>z#*l4zuv;1K^JFX--AC|ykcdF9>2*hYIA9Z~_)V@b00szi zYiqz2_xIdnu<%FQMYEXnTrPtxo3~tm9#?SIc@;eS5Qmt@*%8<#K~3;N2&HsX<;@uI zAY>F24;*iiJ$4QxVD>apUfuV=Ln0VV4?HaN2vh~+Z7e3%hTBpU!#=->~Z}24D3~DB9uA`LNtXT>AxT`J+z&mq+hU4LHbDHSdz5 zq9Tx%dKGB7Hh^^Dv@udpNv5T#+4B^z-jU>eD=sdU&5{GMC5BRi-@bjLGt8(e0t~%$ z9yX*?yL=^GZ3`@>*2_)(?UUPIa&Q14I$t;cX3F22 zVCU#~4ouv`n)k|_012ODQBQMJR1~n!6*pj~*oR382_G|@=&%l2fVL%%8j|6Y(~w~4 zdHC+q{g4;44%n7JXkd#A1pp_v3H;|3fNJi5a)9H(@S|$hsD&A-yKlU4s!*1@#EGVl zs|b!yP97Z7^8D6<#1miTL<01u8MAPsT3JV|qNyJeqWUakOqQx)Jv1cZDZp8?Te z0@omr79enBiyBJw(Ezd^FCFE}bzezrgBS!BYasg-P!Wq}0SnamJcbpkDs||4C^4wc zeY7ob*k7^&R^@JUZ15d0w|k-zGYhDbX1glgf+_WOcCm)4ZO=< z?=O_qv203=gTo4lC;?BURQWs~iJq?R-pml^0_XBoG}LVF>S(Y%3fLr}la`YDB&V#R z(oqLG^*1oOoQ?<&2{`~}u~{x6Dyl3l{JO=i>nee12#76P{&2D=im#dt6fptORH)_r z2jssY5InwPetsSb*dn>OYOwbn5ShpQtoRgYg`4j;?R;_~P|XHxy+B7W{J+2WXZquQ zbF2*FqNELUBGn;6m#mIe}CE zi97v0Jv;Md$v;s3?&M!>CG}C2v5h!5pd_KwH89A?$e>(pn#cTmApb&`LJzC-B;wC6 zMbp;S*6w_+sH_BJQXy`e%^>^!2Z9C<2MDC5(#q~&N5icV48=2vxc`}=-|o!e-Z3%y zm=|?=0lXn-3d9S8OgY6L{}b(fbT1gMY}H;ar9ma`XlXfK3|A+e{M~T=&Q*}Kmbd3? zRCIaW5G~BjK{jMGOR)FwI+#xCr`iTnj znyj2#Gf+1@0HSZgWh6FV7@v(^MbN99{m;z!)sKHN~tzh79j-YPGMhSxL0 zYh`r^m}LL`*}28V2jL{+n2xraivYyDefySl(s_dSujP0zq6`VK{{-v zoxH500hcR|v&idxz_!a$f(WQCmtF@o>-YFB6!80zFmqn+rJM$ijE-hxW{O;OduKXT z_m7{2tQ-5-^;1)|b*9qQBf#M8HUxn}k;N0AWa5xI;SDC)P*t>zEV#FqS2G9`WMg20 z{|lVXuC1|~j4=Ti>EZ$hOZY-?VuX^4sx*f5YCnR!fMaGMAtzA|{`Cs|#AExg5U1V0 z93Qy%Cs6J}0YUE!y&*vSrO#vv$})KXu`K*62rM9K{~V*F>C`*FT%)8>Ty!)w9Ub5j zhJ%n$3Uo^V&>9^bUD@5)F)Ma^vNphTs~{OqTr(U*AUd8>N*bCRhXoKWfO^yy%d-!N zDQ7qCbl7>RY)0Xyo~tstbT!{*g}xHK_&P&d4%jCE6Z470=1F!Uzt<(e{rn`|u^c!~ zh8+>~U{IaUU^F(}j}V0(avafV~a<>Vtku)&ekL3w;$gJNnx|ln80U#-Q!Kqz4E{S)!hWBPGz&3)*4vKtExvp#_Shd?RA?3fdEiP ziHir2N<<_jC3#oX`CyRymW%IdE^llAI* z->VxrS97^~SW5K5Z5SWu=FI~!r8x-j6E^5DN{|k>3|>}i0*XG9V))5gRvrT*BiIWC z!}dcpI3r`VS^YZnn(NN1{n@s_2$PzcdX{nLcvq{n@r8gpcDb)A-^60U)5}bF%R*~# zg*}qb!WRI{uad0=Ll?Dz@d^v_F?d4F?fqE`TEEFF>bK}2UxmteMm;+p{0?)_^ zzGAdYx;Y^OJZ4_PlZPVnZ{U?Qy$&7^=%{;tfcyoA{}ty;KO)WEq&NB|N%8c?cVe&- zZ|7<@4@?P?ZS_Hqqn)U zoPaCz8WkPwQXL1ReGUND=!NihAyA1G0EOA&QZPM2g%2MqF!CW1HknT1A6^8&tl%JD z+X2e94bx!N4m&4s|5|j#k!1$`cQ##Ufn4+eqm88{=2ke!ACz5Y!CEN;H0fXn<`3US zGAshvV|1YW#p08Q^gY}cf8>||lE$Fy*Fsmhi);Nz1u=ViDyjNWcSHm($VqouiPL&Y zNYc^&)0rRrvVbF5=aSxKckT_yJl)Sy{QUeX$$(1R1y~&E85zu#aX^8^YGdRpiJoWw z2*^W`Tt>cqBW-Oo!*YM}(r@x`A?xX#qr5ZnQ|KrN22U=5C$5CuI{a14O6+t59F6+$ z{xZlk0KSj*v$L~-EI@)F;B0ii6cEc$et1!a$E68@z;{KikVlCj(4-=rD(1oCSQrJ_ z^eL<8TL}rEh7Gmb*PVO{k`NH@dCqrkDTNjnGm&dvWv4$&RN10uBV@ za9gq;2gL^-W&rSP?w|wraw)O7j^GY|T?bZMCNzKNa6a9}DsZCw1AloDNS7}_DS{ag zb6z2^;})QpH(i6VFYAl?{XY5_D3Ez)%s0ny>~AxG0tlG$#0UTdSH{o>5P#NZJo)xP zVN5)d0pV~Cq>7jO-8@8ugb`zK()RXt7r>+my*$k_D*$3ba3*U_6tVT5hJ3&w?;qDb z{{=LbwFu>nRTgxoxqzRIe^398mva+~$yfpj49E#YaXGNGv3eav%u(Vp)thYGvl<>% zgrC7<{!IORgAC8;%b}m zyU9jC6_K<;LGe~RU>vu!vB9zUFGv_)VrOQy1F{8X$73@I2?-_=P9Vhn{nIT_UftZ@ z?he$D{<0r)b)3VDpz5G_fVT#oeU_G+yA?ph(J=8lK=~WlRu-wQ%y)FWC7y`#0;m`w znEr8mL{?7j5+?1H9Zu&CFD@woP{ZU>^!V>8W+a?-2_&$dq%AadB!WC*Ejm-9HZ~EdyDZLF4u&)E|K$ zpaOzZ>ZR+EhZ%8IOTKhbTCIz}o}3&Yp3gBPwSB6UdtFg(`6}x;%p)2D$pm8wEAsJD zG-RsQiTV;)@HNoVjF_XryY2!+F%J^JsTu5EW=8f;@b^lzL0npP)NcBW;23xcG71Wz znCqdhzRyoTkx4;*uJ8*Z|NDh06V>#^>U6WsfO~v)-^m@MDE}-OgK`oN4a4KdkCUEb z6A@h)HCxx#a<6E~R3c$K^S-1}0>^)mu4)xbwfad%;5@eRDlFi_M zs?7R{BZD=?oKK&+{Y!sQ8fmFG-yZkv1qD5PIQ1j+nugI}R&B6CDy@ylja7jDB{8S% zqpttTgZ={9#gZHM-|-`oJ!?ot7Xad-4<6Ln|Cf#b-EdlKd!?v=QkIolpp*-MWB%0d z7W@~){uuT-HgMPnivgwg3j6_JlnuP`H840~QS<0Pc!@-nU0zleRO2*U4sTqOi73%p zdnaDlg9+IMp$4q?8K-2DYpkVM{|X|aZ%uz@@Y3`OYBpd0fOOsMn5>BfRk7r01xY|H z3_P}A{Q7QS`%hl@`EgHHB}K*pR~Q>h)SlB!c1=>F-#e1nadp90qBYJ+2>;G*e;dJo$;ZnV_*A};k&z$>Hrnz&yRIkf)&?1rZuW3R zS=mDXB>>Tv>t?tG!u6L@Sa4Ndo*(xn1GNeuoLG2ae%%s%CEASk80zTLT#yWkRA^{u znvQJb*Ua5VuMr|{+gGwuU2Sb5s;a7fbj!D|nUkISKWk*GQ_Q5K+8~7d``rcy20#t| zDbrKR`%x{ucvk4Ln;IYZ3@JZdTvHtUhuI+EbeIEOs=p+H_u5Yhv z7)F(RUZL~)gc`8rA3yl2nT76NGj7K|M4IR6v(c)^(4=u3BmFUd3p>0BpYKB;1$|WSZA)9!+V=D@g7bd6fb*e0Xs1Z`!qu??kch!M z_C?!U|G5MCXli}Kl$2cf@a$r7Ur*B*bF}gESn1^@(EZSK%(<=yuQqT($2Ud_?LGW( zF^aVW(Jn@F+Ciau)H#v#nht}?R%mFLh{Tt@T}!PhsW={oQvl;Iv9SK_`k---6cq{L z!7_)Xr$a}Tgv{DA-LZBxPnoWs8JYYs+A164?SUb|!spSvTRND$M%;GvT^kc~8%=qVj6LqI@Ca`CzD5g)UTiWt?>67v$D zpE8pJzs6HyM1+e=acUEOontA6OkWna0G!Bl2>6!yno(D^3OZ#PWPym2HN0Zp{e#vU z_*PJlAKUED=<0<3*T$gNwv6+I;aqy{WIU%c>D<^*X4d7zte~^n$DaS}fp`AC=C#Y$R7+k_k&^DINrg!fIKgRAY06{O(>wG~^_B5; zV`Q>%KTlo9pP-MNol_iedele{68s|R2H7*2zq1T!dWEqz(-sS`a$_55RN-ohs zK~E~(Y_GAm1Tsx8vk!%;FRfGzgj>nOH!d7lM|DKs*xX0I=H37VWM*YCFN8#E}> ztIYRQ*RFd^FOcY%~9F`ULaann6sCjn8pVuFRbUeU1P&@stG}sC$1e0v#IQc6%ex6 zxr&#gT_D~aZH}L!Q&G2AZBBfuZ)dnJu)qc*8a+H%l>Jgt?!=&>f7K=cNXM9wUV+=j zUiia@NjFevh;=@8E^8DQ9#Xju*9sl?xh))viaraR$gW{0Kl2}nzABxH+J#n5^nva4 zO2pxu!Sj=55-@9xY9`kWz@wA(4d2hc#$_fU#DhE?(^b9UzMuIN4KmvH-i%S1TWuQx zzcpF{UdsH8<5TwIx*7kNg%dhmZU4r!>vc{j3dwZ$eTY^lCQf_1(7F-DaLvBz`;RVO zL(|XH#U4UD4zEKAUN(~8b&?}9>ln7|qsI>Ig?&xi&ZC@f-gp%5>l*hcO4}H;x%a+v zayX}L%EZ6!kWUu`2X-!;THEHk*e^h?TKlN!8FfpyGJ{cJWMb})_X^ni<0v&CI|-$_ z1`_D|IA|q_$D*Oc@#yZb+!CXwRj~_?t}Cs2MM=EAL0oiQ{r=v*x<4{jb_5 z@8Wm%8kd?za22ZOmm!YJcPv(ShQ%G1EtYovm_ps?Hv*m{d#LA+>m1ub74f%8A-Nb< ztHY#7gWYdS?_E`l0gJMMuS)I;0sG87}PS^alU-eg>wzGrH19pi%kxzUR zJY-eR3%#HcJ)rC8Y`t=2vr2;itv~fbv(mrVY(!aZy#HPZ|DVUK#?M9O+-W| zWTI(8s(${MyI3m#Xc;YpQ`1Hsv2dIPs=E-g=zqjL>bNF!`~lyV3Bb4EW_N5|_-ZfG zPCN;vZVQ)@k-^QDQe@FHTHiCY531o_qyGbD3`soc)F7M5^IJd6Jmq68c8(n zh(mxuGgo#^rR1aS@>N9cUFb51?)BZh#hO9GLo}!Sj$hS@6IrXOn}okcWbNFj7! zK7f9tb(6wiV^N-}L9S+ZoVJL>xx;HXV6ZF2UNpJ(z~10sM4meLKHEmIZXM|$o7Myo z4asyB4NSNO6xP24H!lYgX(l{z;8+xp{*1M-oRO`-w9u{20qNe3g`WqpJu>P`!rvZo6|%06V(gZx3V+!3sXt2rR{t&>8XecS!a(sEJC)#$ z_4c{NxZI~3mq8I2|8wB*Bes34s;ti9Vfj9q@=$vKiFS7RO2}}p3Jl`%k%IR50dPWG zh4DVAeKq5&{xd%UTBBkVB5p^-ET!nWWM6e} zpxX;<$Or&i0pK!oof=(ONhDyW1aE3aSY4 zw2K`pkET?IX&W%B+rK)lFI3wRZOvIFKG-vuOxv0gAvtKK<6?)u*VLChdUOr20VfI#KJ@OoiGT9i%o%FUiDc0(njo|> zDmqS|DO2nwn|QlzUYLAS+_*P{e{eiC%;qpS@QRU|9Sqhfx}NxO3j(>Q0e#sj>A*t&C#cRVQ;y$O>JpM z&Q6jYf~wOw;i_A!_tp2U+S2V)@u};bCZ@G(ju+%X>?T#MO~@S)_qrBmEQ;F16E;?i~JDUOr zQjdkb5RZy7QlqAIGIDuZ*r$fLNirdRwvaVIGErkvz-u$sL%g(JVmevfHBigibB-6> zid9`@Dj!SNRLGt*m z+*_XF`jxi{%fWuivWK*k4-i6n&&s5GG10{i!U75M$IUt;CE>c_o3bI{f?jvh=|bbq zj=uB5!frTopN>VP+tfIlmW?}7XF>dN%$=i0_%hgjKY%=?W-qCzxO*(FlpXKY&T=a` zC3v`tP&X&}zFEtq?!>68O+~ic;nL#18A+gt60)e^5wn!q+Xd$-MZvNiqetLvb=~DV?YUL)4ccvBt^UZdito<&F@hlzcQ0N4bfz?r1PcEtx_A) zXTwC#u>ypP6~_FvQ7~!@_#G(dqS&hCS$X#=;pX~qHTvR{PyaN)R~z*a>AY-;-4JrM zm)kZS&0WTMQ&dHb$z`+zF5e}4r$3yfyzlli+O-?aYiLo|P%~AUOOf6}jCsohwi)}Q zm?s3}d%H*Pbl$d5gPt!Si;DW@sd3J0mgsc43R9D#l`^Oi5Nu#9Y@gMYQM91LUlVmVvb&aEHx%MBe`^rw#D1ZKg)l@|KOh0czlo<_x2|Fl<@3g zfAcK&7Kf!w*!iTO#q76R*wM6a;_cY~^{h-H5Kk+)2cbv2pXHLA9!fdceoruMhj`=5XPCVb);&$eV@i{Ec`x(y?J~}Nq{SC;{m%x3T%b? zjBT7W4yoJzG=0la{eoUmO)e}7bGu@?NkLe*b-D(1ak+{^Ni7g6sq{`oN{!ftMb7#1 zfWF3=_)u`UZgNb5n3;+Gaok{c3(d8yM@#A4{=%=BuD8+4bz{gAyy#CDlDehHHuT2f z>k&)m&c!(0N%^-JB)gcXh_gM)EQd51S-EOE*zr)P#q!1EIbj*mi+2p+vBd^;Lds%z z=qPSNtZ57Vk0rLgVd6N?bv}?BQ{!|ZBSEBKt?Z?zLMALgh&1en;grUq7GfbPWNZ%x^Qwazf zUKu4T$VXGx5xYK3DuXQ4IG?mSWP&pql))RA;ber_ghXp3C%#*k}<;}w`LCpRAaOTE? z`1=Ldch08EgRnnl6)H?SA+ijJ7;e)wM{6`Q(t2`<`E)xwmQgH=$?7zc%e(q|R>BU3 zN)AvSAbo1q3{XH+$l=j_zFlnZ`JN&DvHvqq-qL4!6B|L|vE>*fXPi$+ zc4(^~wac2)tzgq%(|f|9HT^8-dp%5Evp#MLDlH`^r>Yuj2RHo|pEjwh3ebO8z!oqW z%+;?>O-HK?xx?L8E~HQ|T$Z5^eR~pPH&Pqn+PIaKo9)Mr6%re{%fvi8wdfsU)_oh2 zR)kpgMq&LVs{7XYE5^nauG3}oO(D(-I_AE0XO)5d;)a;CBhfvJC}>nl zb@6SnJ0xk(QsX$VmbdX23&$bhQ@w}OL?NkTEdf?TG1~^2_?pm@Y%eYI<5s^03p$bs zs*cWFgAKCf^pD$W&}tXPU6F4t;QiAxvItIV_Gl!N%86( zs{I?MwQ%;3Q104jXG+fRM;}XSzDDg9QW^#$8Y{6`Y(LBS$PYuJPn2LVt#Q75zRQ=r z>>N!KWlr6MuEJEfoc(w*?O>gupqq}uG5HLhSflh<)ZOOU!w1*m3;CGHC|tAr!c`l> z^lS<`$LPbQ*_;l7@U0m1iU(`h+XgoFP{k2b8mK?@l62oki;rCoSfMMDk0{n# zEO%2vkwSFaWQpU}wIN$L&JmT8=nJ+`J2R6bEw>IUPNqr$QKt4krccxLdXP+&{$7=vIz36@FI3Enwj8-Ho4P^59f6vD%F zX2H;VU{mlWkUaLYFVdcM!B`TvOP{L-R1|%cTkHLB#zmFi=HdQ`Gc+ql$)1|Vqcg(f z?mvy_kIyz#N5fe@^w{S`_y6<;K zT}@hAT1qJfetMGSkP!&p#AnB_rD-`VtP;!aZ|Wh!C-)Dl%!zb<>*RZ6ADNIt^|kcQ zGJ2%??i4lWyVHfH#bI>Q#Jo2~=`IuxomAdM94)Qh8sKFj@k4)!?=(WyGuGmi+~TRgIt?8u>OQx?p@9AiMbD8M^)JgT7Ohn{YViGJr%`%&LB~0!Rp87@% z6HBbg>`w8QN`wUr%5-J#>sr+I;cK*92W5(Gm5FxK<=oIN;{9;96om2U;xGH-4cH=` zl)t?omS2g_$nvCmM~!c4wEiS<$>Wm1_u`=arX{u8K_=f}R{cH6v)c%MEPTA$nydr5 zy+U6a@7713YukM^^?|Bg5%u(hRqHpq63k+qY;Wtiw#llgL>#S+W}Rh34%1E6 z+_#?(5p)fo2Xq?`SWZ7Fhg2WnBvm9q{y`_PklmE@YBBegpVdpt;<;}(HMn`D}OR|(}p_ZuvRjIuU5wcBTSKy zcCX=ib*?T7$D>j}(NbK#vzY96;9eB&%EgbSRADk)(63@lwSNRcTaN5)K_*B zj5)z(Or_7@>;>xbs~_sKJIWT8UFHrkuYnpgmWZKy6WOi{(%VTyd$&3zf5J#Ax5G?{ z)#M$dJ+CLYCg%|Bbup|gz5^;(ODO@Vw^Hx+`AU}?w=i_2dJ;hD(oIrRZE>N|7pa_f ztLNZFSG}BB{=mC&m*5z{*mOD$>CeocR7yLFRD+GUg(0!$uh)f+EUyYvczZz9Wy3EI#kifJfRWg@vVo&34cV3m2Efctyd>Mjw zc}B=|MzAx!A$6-5Q~u@XxcOzw{w=n%8*<w{ew_eyME z@D41s<5E&+9rEZr&*P|BDSJ%*{W^DzkRq^V1A9yfiJJsif}Ja}gvAVE|4er%yJ*H3Hr;OY^d0@8HgTeWa$rcNeLSNh_N{tk0hGTaOqKK6fmjH=$Lj@ zPHB}86tf&qTurDlTwXg_U-FZT9#A*YR0p(Ti_Hg0%$3XL8N>|r@Cc6LvkeWdF!2kA zW&t;#!>l!N{|R50^GB@T-=d}Pja`um3&qk)U23#je4~JKI|}=h0Q+PuWH?ssJl$^_ z{tF;7D9w2EIDPWshFN#D^IUxn(L z^T_fdo+aF+B{*FEG3(MnFs0Snpi$XYn0QG}O~rljPH-wgr<)Vg_q5!AB3cDoQ3 zt&Q42AXCUVi(=!E4AW7}ikp(MM~@2@F?;}NcN z6fYB^R^o9sBXFw4%w#j6&Kb~|KMZtsyl_%k{N{OvXYZnA;mahy^i0U>quKAL-0SV) zC}0^k>Fnn>w28%hXibaC7_nGj9d=}oXEXWchOWq`ahY3XStk(b{mG=c8mTF#i@kcK z{Ub_=l29U(GQ$|RJsI*rMYPN!o4lBOG2M_+*I8W@&&V#4(hpmb^KAT*_oYw~C}Soh zbR5+~ek{5iDY09BOgd=Dxf2!M)ga@%CSWqhyQ&X3IR2`B{ZTM~qpl<)qrgrNZOKFF zZf^Z9E5+_`7LVO|exSgQ`b-is^O~6sEt4k*&GHw+Sn&gG`vV=^nXrS8bE@N^K2>2& zQM536g$14RgND--VtWR`lBLS@&XKg2bsB@XXQ5iga(-8IG|O{ROAJp->F^5xWeyFB zCnWADymcZ`pa^lj8`s@6oxLD$uDsTK{*3x9QErJbEY9Q^YtX}nvkXcin%~#aBWvv^ zoSWWDfk!nRd;Fa!H{V_gYi|x_9;SVH04FWk4p7hRNTf(sQG9yWexzgfrGs}H+hgXcCR zPL#l6_pxn(mx?jPQcg(Obif}Kh3af&h<$)-neV^t;jUL`#m;>rUUM_GjmzquSbc28 z6*^7?O50DKkG}q(maiXjdGR${z4dhY$?b;h;bl^G85{-t2jYg7!6`lL!e5Sl*W8hAhSesk50S?|0=?i9j5%2wsibStn* zS5K#8qMwWnF5!tR^*7gy7wf+7`Noeboc+1#+hsTJGUK@Sb?;oPwv3@DBG5T!SA`wc zQ(NPAQFzd~-^=6LqAC~teiqJ;j8-$$MLkV4Y-=I&rQIRGoRtQ!k{3RD1!>~;px34N zy6=f6g3cO2u9I&YG`dFSP(~2Ty{P^L9uQCd=~JTXtry{he{z^eYS6x1Io&9IFJQNn zFmw6Gr&NT?Cc7ziGH3gg%gSwKyz@&dlEEK#DUZSh{9}@{)jKLjbrd!?3SmOV6;N@X zywdlsc8+3zMFjvSHxL&p%k^DkG-2IOYG@RXpt`)u~E&KuH5^BXm-+y z`=$EHY~6@wFD7x&MSipuqOQm4^Fvj6%XidpcijN5CP3wqh8ViN9SW_`lReMHDj1i) z4UxW=uSPPzd3xUKhFxhKN_`2xhh_ddp9nT)=NzJZFB2pDNAJdq=;dbA_zFYa3d8CT z(%oFSQZpr`$KT}YEuCLXGdWH-+aDU64=KX+P12nwZz#{6bdG728trp2PgiC@xie4C zzqBP^h}aNfz1vv8IHFK3l!X>gAFl~}b*$rveD)=U*J-5h{M~tQ(*H!Es_@&)dV+eMoMT4uGSYV2le*m^7tuXowH6-{CsNAN=v7DOUshfms^FerJEx4EpCkKjDp4~SQ@hOid{iqLfu--o*Yey%7zRO3HzNBjgw&7Edn@Vtk>IEoP^^s<>qM}9Lj zYwdGAl>|B!4|~F&bT*g{Cq|{n^2Q-^uymFD{_2_H%f8u7z*qLJ%bgP%F7-~OV>y_P zZQ-8zf3fp;>#8X#o~(@)g^1FJJE6tcOgT=eEhqVpVG%SMIbil}U@^pCl8{L975xYo zl!LORda|E&X`x2FKz_HLBkT9>vu@s@5q0&J5blJe8+z0kuQfr)k=rp#-}D`Yv@N>?se3fiRfBLm35DDKu?voyEn?wvk zWGz&FHXzwCDt5x3%e-~STt0hYj%JZgi7I9?hp_SuOOv6AUu@m#t>`YIQM*wG7xQo3 zu??T;NO+#p&@5^s5C0cA5?)m2Q$E-DNpX?D!>XnAkeSNEJ!iMu4mr1#2fuNN3>#xX z#;8)qsV6?XD~C!v5VK{B4VCg#BUJMb3Q<*FP_aP`p~B4O(+Kg9em`yXgBC@+Ye=+c z=DCSU>~yy`!R^Z2UJ|`Z-i-BW{>yr8)`wf@dl#T4C|Ir5ET#R%1?_)%di39`#lT^Q zZp!EnHQ&{91xc_sRc#(atv8-|B)ssQ-x2xH{)(QywwdgeatrhVI>64H2Y6`ajO0vm*hCmRO5M)-lz#ur$}vFuD2( zqG^as|Kib$M^`^Qdi02ig^`)*uRqZL`3FwUM|5v>O!X}FAJH>_&)!{KN+)1oY^h@o z{x{aJ)OoF=1<}^|`MHdpna(3R1qn?<9WBeBpGaG2TK@b{*hE9`*G2LM+Td=?Y%D)7 z5YjQw)3X`FGOw1srI;P-8$lTn>fA-QgW^>ZP5%cg6zAMp!AnE&r6&2g{)tfp3Wc4g; zw;^BGA?mqq0_>0{atN7ELhrtLZgcxVLDRzql=K7{k^8S*6K~xV)%B^S*54=(I`>G?1%-W zljP-urF2<8rM_zFlQA}hJbQUp>;@|n!bA_I8Nc**)c;$*glWE$$HCE!!__z|v>SJ! zoTM*8joNz_@a>dB3pdm%@8rB25vPXJuEMeyBWjP-^IMRsR*p&T2_OIBJpaM7tB+Ej zG`rt36v^rhA*W};VzV~snPdW;e#kHVRm=EHm09;k(0o_(dgB(rN08EUUPVh=}!u;LtM-zOe1G_yo&h)bl)O~jKEo70j3O*m)8eXW z`pD&plrx^G9|@vvn*RGQo>|`8y8|H=Ma@%IEK#m2_gFqO#_+|H?w_!5kKGpI#q{(o z*N)6P=P_`qw5d*CPGB`pIoA-@N4CVH`cY=}-AAV9(% zW=ltt#@F#^Bs4zh@13^TdI1qYQ5p)^tkFO)*}krXt((2)YD( z@S|rI?kctN?vM&Xl&e1Y9{g+wTZvDaSi9UeD1#-4Pg+g0+}CP5k@7`@85WnQOJM5v zyY;f)bWX!0#Do0>ezxJ8k}W!35`#)(33&pgcM~6pTzO68%p+jrZ!N!$EUv{NGa>Zi z=00&2k($}$CQRnH^vsHQVnV>R^Z3_Ocl*O$qtGN$qBE$xS=A;G2D1#hS&4oK4X>;$ zf3e>nWE5U=(An!tG%qeFJ*8cqVbo^7?vxeCKr5%XNm8A6loQMC#Nk9>4#&A#!{CBq zomwnurs-`_2s2Y*u6qbi^87KeJ)T5y_jBVgDX?07h8o+r!f-mVI9!_ z`n4ag%t=6B>zCnWU=2vcSti*fs@K45P3ONSC$h1zUHz#=lDWSd34R^`Xv={aucfjt z<9HCORa|wQU+hBRQf~V=N@9$ws^)aIXWOs_78@>)50fjpnpK7YnZBKPr$!@PKYQcj z&nQR7-%@bAoaE`;IuNFjC7mZ+32|Y=K#Bj zoitii>`sm6nx*j&MKVIk?Idvlsjs|F65?E3 zl&#gqE`S|JKn%OTk$yF>e)e|2p8q_10%eazA!VZ?D`!#l ziais;ST+;c`Wb4}O_MNJUy|nyQsATK%!57TuY*T;JX5P%m8644*?xApg6YnkE(vBP zr*(~A_w~P3+efEfyUps~i@Cz6(zr3c5ZGE4(B5%G#4nxDZH5&pZAg-O5bX_GJxf&^ zjd!NkgZafL)sygr4eSpwyRca*dm42k*i9U!MKRB;FOKh8UA-!snlFW!7C(4q*`6OB zk_9bLPoFQ%U#(CKfeFZ#^KP&ct`TYyW4vII46uKNm3ri>*0}$_xfI}R3NV9z*?oRe z&LwP@S1B;H+V?47mM>S(DJer2Nm+v@QEqDrQBl5ho?eQgE3RE)`jlGzIg#@4WwQBe z{k9_DKylIW#O(0+rIqGOlPS@)^bHXxlTB@s?8d}UJ6l`-_P4t z36>|WXQ~HniA{dXVx|I=TZ-o0I0oBPqx^L6Nso;;xl#3QxZ=g&c%G=jePWG!xA#$JX8 zntm1S=8vwToxD2CfR9tCzvn8(rQqvXG8~4Ja|Dtm{ES1)#C!IJloGoAjX&YRJO6R# zZ$goN2^>9Fq3O?{M|bRz$*HqM7@MGc0)>ixiS9u-bw}Ypyx!X-AI81$Zg=-R9+xt$t!xR zZzdyH6)Y@Cn^W%%PjuGK$o1QV5UJP&Z!Y?hFTo{}1T@s=P7#!JXMW(uA^gWFk2h?& z4rXnzR=For4hC^7%F@~!z$%9;a3)Sa78`5YKfY+(az*H!QvVVC^UDiYUq%<(brDi{ z{nUh3p+*}T*9VZ8jHq}A_rRODCUzt(`#P-^19&qm1#HtQct)G*^tW`4~saLcd z+6Ptk7PMLk#WKRGUmM!j0g2B5J@uWUI+rx=qAG30KfeHF)3>g>!T1DUOVJ!4OV_I| z?K>0GsORpgDsLgMc7}zC3DHfAbS=4J&5C`vxS8|WO5@(NE7mY^w}~;N0v~ij4X3#; z#IO}>P*$Q?|BT9{_~c>A6rP^r9OSS?i;&Lg!O!m%IcxZhBD8~`qMEwD&l1L&y2n@7 z7hJHQf}G)+%;9FxP5Yt(0rT%!xAxbZ-Y9z4wApk%wcx-SkEmRYi}Pu+|hmnyR! zBT=)^N@4G7SGWCj58j&cj@$u7F2*>|Nt`&j?5tq!jsptlyh#a8>loL$e9nIOCv49? ziw+dpmq~BqQmZy-6h0IZB`ZT;G;O%P+1r{g8&gh&1<{Fx(o;_?P?&S`De}tp28mo$%tYp?6v*vt{I=es{q1hF~eMJ;Ai}C^2+j>dPD46yL-^{sud|v=hVys z%}+J=pva+x8+eglKX@O87g}S# zsUX7#TmLRP^l0( z3qu~J9rBcZl{}Bwjp@&NUv(C~(3lsRSCij6Y2|8fdSmhJ8AJ!)$tv%D`z@FENA&H} zhOTp_$_4T0s>x@|QZrX($WA``_bTZ;lM-9TyAuoYjWFU3?VNpc|6D#4-WVhvCdB5Y5T5SLcTPzDF@j^p_eq<3-;ZvV&bACap z{o*)`jOPTdDiXRtaN8X%(2~&!pYC`25F5O(EN|uif7pBLuqeCk4fK6Qu?R)!vH$@o8A4J)K!gD)k(Tc6 zeiZ~I1VL&jsi8rTPU-IM?#^Kt;_ShK_xn!#&ULPHuIrrRKLYd2-uqd5t+m&E@BKV? zO{4FF5Gk3ym)94=U~u*hh0SRR5(@SQCN~;iQk1{tFTW6H02>r)WH2-NlBF(KNz=tO zv$6O6eTN`;>(ix@xOxeh!Wd{I5ndT~I=1oiSv1hFScYgH>PpsGI zX2h0Y%{Y-XTX_DYd`L|Wrn;zf**yJ?Wz zcOZ05>JKDb0Mm_dGQ(H<0;Sc9G77GHPLoN)jfY(Vqk=Zpq!kLms;K7w3Cj52TLE=4 zlRYF&Xdmq9Jc~VeHD{9r(0~yeettlnM0jC1!R5oD8nA$8^~lmO_--9*?l4&Qma05} zZBi&fvA@*KG{_bSBhX)RG-BIv&FMbQn&^ECFUpSPNE|59dSjm$C0-un&J81=#k<4X?|j-yXH9JA|%{iZyLdmmqt zc4~4B$h}sH3Y@~8ig_@_=gFJX)G)YX@hiv-Zys!)RGa!rhZ)$7~!r&JTl}+ zH~Qj=zUUDNv<6{k&^SDxxyHq9Bg+7vd-+n!PkNOp&GO{)6nI9c%zU60-&n24fN-=m z8pK_Ps$@6IA4TWzjc}`WTeg!HN*^)9Cv- z)%4;xTIS1rI2dS*o&)2utR9x+4@no0c^xGz(|2By`dI)j^o>0U)HvDUVd39OXy65b z(M30r-Gprt_`-Kf0Aqpa3m0B7PC2>*I~NCmc{wr^yN2We5HzbFDfSb2p_}mC4obH( z%mDNR_+{m|j7>=lcpqpjtT76-hUW|KE%iKU%^~=R0+1La(1hQ>3q2lbh7wOK0zHWJ z%4NMP%~fpnCwxK+9Ise;MCSUpAa@#$AhMzTw+Gh{+-o07_+N8+LT@{^STOtEJ zh#c3zYiSLl9pguOTCPYuzTqw`1HIBQL`(;K6n?$#po#M>3PiSJ;*9IR<03f;El5XHTjM@yA?OZywNpM zCc=A93HNW-&A*_}PTtbgx;cyKAQ&|~6OA6(-E3M~+d=Egm0#Rdv=_6{lrL6E%jB7fU8QOb_`XnQFzE`Tnce(y~jl>&W^o{d(|wdMEl?|A8O#v?_fOj;%* zaHKcFGINB_Q#&yeovHCdi`FkdpZp^%bCupy7Ves){15y)k1rgj9N&rgm>G6%3j#|a zqI6o9esuElVAk!u*Ht)ZSAwu9I?&Yc>mO(M=`(9VW*A7IRO$XH2-DWo;FrwUgCF4~ zLQ4m-!(Yik@e5;^nY+dqelmlB__8nykHCPbQ~1?oP==FWH|WFNcoHNFfW%ap_4pn>9f*zRqh&d--P(SMAWW~Hdwab~h~7o3@&TtNSZkt<98`kh#KsGttlf$ux~Fw%Pw0@FbC@ zl0MzOuO~XNuhp^Hzk$b&+V!7gb&|RYPIUM2EFY_OJnGCJ%Y3OA<;2mu(rxr{>L2*y z3sanbarjLAH5~hK%8b0${I9Kbj=1j(*~zwoE#VHhUDt!qCXtSezA}d@*zLsvVV;1KTX~CEN68Ce&gebHEfoC6-_KM z#3nDyxx2cEl;3F*>a<^#o_*R7P8=kUS+%+bS@8Ecp`gfmrErK(w++|}20>-th&)t)W*kiBQmazB-)#*ni6>ws+4%x5^y zceFF~$yVaQi0p12p4o=f_)1lp@=`i8; zftTD9mhokDwJVBTZ2x>w$Z!#f$k(1r7y*>lXFcdj*yno>A9)D?^QQmeFuupn*U7X{ zujzv$eM6iD3m|$6 z*4)^>?(g4`$sXeQS1r)N<^UyM4{||nI+yGFz`s8@+>-glUAzV<&mPyqCAiZRtTlnM zQyLAfm|eHuCEf!(7YthZ-S(~|SYUtG58)}vYpMkaU=XBt!ny8<@~H)x9`Hu8uwQx= z$2Dia%AilV5>!PuvR6A5ObXudq8w_E#=|RH^DP;qe6B<0OPX%m8~DvIxfeE**_!CM zx;aziF3gLmBu=OAx_}h0VjKaMPLilKpBJ>8Zs1Se?K!EgdPHSz%$wME`b9mKp^&A4 zIzJnkZkWlnO$6+LGz~QU){Mzvq+S$Hg|jCwTmq&jN-h8kI7uWWyMJ?##bIzni2Y?^ z-6?xQbLFa?@E6vsHpXf*rD2;C0Dmv)@l2~KPzi;NNI0#cYdhvz_Wvs>b|W_H0kJW% z^nR9AtC>LeIUBjF{1uuS9fNWSN|R;^S~?#+b~21Kb zu0~GF+{bmM@mj}q?45X!86hmF$`eWyKLy=O%o$Z-sF0?9@uqLYxsy*?{MFWAFY-1U z=)0j-39j^h{4w8vmk*dO4o(&NzIz6@Zq%Jh4k_>&1+}u^%FG9+v5CzHX8xIebwd-v z=s|jVRjrih5J@7u1L?VgJ4hUFV?ASI8Tqb*b~vP;exP@lkuO(7p2x%Ab)4_2(+nDA zZbE7eDVMk$w&Z0@<%iR3_+JiRvy*l7aq-}UI{Q%kT@G{D>Hf$bRD!Z=d6YCihj#}n zcPA}x)@CD_w`g)Ur#X35ev5Pek>p>Rz3p(8?7uf@epJ%Ao1@K&`%aZ}IrSsCZu@$s z>vp_iNB7KSO=gbt+175ar4F-lu?&{{^%qTay?K7k__CMaLi&RiGMgaZcZmd(@+iGG zJ%!Z^U(VqR9YShf1JGP7$S1iJ2n^@8)#MGjSC<+QwqVx}jiZjKR6NQE8tualM%d`G$ z#>GTkC-IR0+p5hk#we|s%pu4ZS$GJxtgu!odWJs?cox-nou_B@i%C4B915X$xY^B- ze^WvIq!nKDU|>q21NyBme1q7+_L~ADMX(M`x-pDt&&dzG3M<~osG-HQ^)pz#IDcD^ z)u1)viONjFYzn95)l0{vumRo0LJX``h;Jcu8KRq1yR9V2Fwu99I8wYt6r%Z#>m9bn>CM9sB}MkzrDmGkf^FnTN49Tm-If=L zhV>TtW|VQ!1&y`a!}&d`=XIv_ z<(Jv?gzW3_6dBFnX6ygf}v+GVK*V^n(V z*y*cW72~kFVHM32h94RlQ5gT+B~V2i;?Ux;TX_C1N*q1q1ds9yBWHd5>pPhS2bf~M$W?PrC3_lW#pA48K&`}kQ1CB$MVWe*~V(5}NiwJWtk>Q52 zK8tc zcuAj&WjiQ^BPS6!6ioZEgR}DaUhTuQ-&5de22=&hXsMOFG{|7h}d4*N!}YEY_yHXNv5|?~;t84DFtZi_4q-@r3`p&yRH9Dz!-y8d#m$aWl8je{a zGd_jKioD}od5k<#Ymy%?OL1}yEJP)}O^omK@NYX3N6^dA1s@~&WXc!>uB-$cuPf)QfU=4t%v7#jsjEx-hJfYuF{UCA3*zWD9fEec%+AC>k;J-s>$Q ztTK5%baZE9c&w^k7$?kM>FVe2hA$$~w$>hgE?<2RM(pV`GDPs0g=d%YKEGug#?pV% zJ_nVUAIdES2RaaKS9x%V;d~Q?D)=b)WF;#zwUz%KzszV3N7H6dc``OR+~sd$Sb=-l za|=_37{1HI_sX;zB#&G}q!ViHIMu_$7rN|jcVgj|Tz%2i{epy6@}+G4B}(`aMp5VS z*Nv>TVI`p?T?3fnV+3DQ(3#xguWb?g{`C~&BWrrX_}~#ucc|;i z2?dh}^RoAG!GvwzQi1|_&Y5D*Sn-1nO3`kpcqyQ4I3AIBvKu!hTYqaqK0{VvD;xA&I+&tG7B6bjb*EK}Vn6`t(ly z8(Nb8LKc0!2Z$j($jlJemxT{)4$X{?fQGqD0v*BIuwO!#{NImJzfK6~|6~L7AXFDx zp%;*#{s*8icLMzHHbpxQACs-)rY!q*7j~{|8&e84L*zS>PEinOv$Oxj~2Z! z2Z#od#N>BD9CTg$vW$;qUVoI3@f^Ft7wSp`ee;M5D(8dCXO~QN^7BgnHK(uY7XjR~ zf{`$k22Mujxc1eVZJ>#$NO-`@XFVv6IXN+UBF4?9094qz(3!mG?U)kbKb9dAlLq)} zeH6>=+kk9kVEFTo#?DV%-n01JdYqZeD$;zoZ8?ylCmNXtD+`4bBznRS3D2P2 zCN6X__?Q{JnHlt*Nce?VVlsoABsItTmw~a7rY0?dKI-S$tN5)j@t2N{TIR}vR}^u!j1wE0W&bSRhdSRPyjLx^&7z9>5-cHe z*IAo>6qfqFv)iul*6pJ9L^RjPg(lXlKL;BOKQ^roEIzpLbA(|Aw`f0oOp{pU;&c5%6k|3Aqro}Qg<~5`SYFu^)~uKHiU^Gt=>i8(bPw@jS`b{#K$%p^s_rW z2EA&~*5F50BJ&z{#NzOqh`J6tClh;AzLs{8;OI`!5h)rVwo+BA zaTwD83~A;97$&wIlO%hYHFeI|6PyT}ORPkenF2h^nGPR($CX+4YRpsbiVv#=&(0Cp zFRxvISPQMh)wvVN0hWm~68=${$cgz}pX3`+2iGB&TV^!LQk}YhN$k*1IefD=v`6C_ z@=#$E_5@H8wmvRTjy@7-1mw8S5df-K%<6coZzaT3EpT+M$fxnd2GL>#Mb#Y93mJf7 zkb%ISUsbf$!a5?j+T2Bg`{*E&7_e5ad9=no3{_5Ih6D=br#aZ--Uo+Ep2Q_nHjOQk zt8IxE>*mYzryYT-i$EJBN8d8-T70DZuwBh3D57(=HFo^K(SSsIo}hkHef9CDmAkH1 zTKBI&?Y&m_oK;Lp5P7NL3r-x(CxjL$QPW8-KXz67L1?|nI?4YlaM&@AX6CT$_U}K8 zj`lqT9Mbn!CltSljB`@v3&34{Jq1R)Xj*AyhkSBY%L+Kamue676vY0(S z)%6?F$&uWD3l$}6K|?P6S7_6Tl@(B{#6f3z8RG6YCWDn<~nwQjAP4o zsSr@qyhyUsls6zMhzL-ph>AF$QjRVJDdd7Mu^yev*K0OwcuQzJjRirUwzz@*yZ-ZR zVvuHn^`O{T5zz+qX2rLDc6;iiMQBVEp`g4%xoD=%SZ^LW*~ zAQ3o2mDSVzs*#dgm|6qt=O~HU#6IzVV0Q=R##3H8_kYVF#C$FTx*ume^%?^g;mLeu zZxy~>X)FQ+VoD%9U^gU+>FHc&3!1@+Pv(P&L>&Ygs2!ri^hG3u?agX1&EfoI$jlS# z&Th|cXq2+5BLWm6RN&Vui}xkDI(Y2w_^HcA-Iz@z<2GtpnUrzVuJK-sO%Ce59Z!qB z`#g^=-&=B}1Ai{YWySj+HE5~BVjwsu!{TuMz+kaQCK?M0j#WJ+GBDiu#Z2&!V7A$t zm^%uMcX#|aH!-yIccT9fa%oug>R*3Z-pO>m?)HryCn3M{5UIziw%f@eLT}^4J+dfs zbtBa|=lkMtOXBp)>CD2R&gOLZ+I{YVO=`g{K9*xwJhm&SfDg`a*ig4bmmL6bE!R_) z)TrBAMb|uhg$N8iC zhpgyR6DQc+01X5Whbx;UEZrCP34NskecN~-HOIHrrCz@_?XpDeeD)w720-w}H(cva ziI?}c=G%BYqQK6(nnQiP%-FEB*1JR1mSxr*G#_Gc!e$6sx2EV=A?{+jaB$I-WW*-~ zM=8EXAGjq#Hw4a9V6`MYvc$9wq6tr(^kKMlfH2UBPM*VIF6e^HvS$J0&Xr#lrPvra zV3qYQ3?t)<9|Ldhafs!Ef%#RbmeOCREb<{+C#Nh}w}(Idph9f_sfdKL9!V(j~;!sRUZ}N4o8}Jb`2LA&-!XB}q zl+L%4u#kNrhi0UnjVxu3LK4vssPN`PLzq}fz;wgYhXuQXb9g>Krv4|LA&}uJy8Pfc zq@fwf-P6oqnSxSqHF($IS}SL1o7QNu$p4g%QQt&;HV86!oYgYX7+l+1I*TxH0n-mC z8(B+wiHyE7|0Ol)`(j6xe;A1p4|d;A*k5&q2bls1 zX`#Y8T4b?EVq%5|E37?eXWTE;rcscg$#A`#p*cK${PN%cUV-qxt20XKWZag$+bs|} z0NinH;Dus9&(L5qVY%(PT?gSIc1t+^aN|v}-vr%li8AF-|O zX*Fjjx&TK(zO8hz7aZb9r>mK2}rBT!C2PQoE6qFRkCaVggMFoO&~uQA2JB{J`KlP0UXzGU;-r<0L3x!x~T7Qysgf@gB*_ibGtS&+w0i z-7^0Rms#P9y%@hH@O#%0KR=_$;eUBh1O4p9&j&SF9zr-C{(4Y@{l7e?!TSHma~jej z0{^4OG|a>OxaQ>Qx|H=RBHbCpe)T^~I zh(6BAz4v_AIP;b3@Y|ITPTIJ3mAk?Y<8LnB=Q7%q;uA1@t8Yg1?o!t^b&`nBQu7(t z@5Z2}!G%5o?)vYUv2jKcuNFx%in~?ae;Vp>scXF5x#-LPf5HD}?cfKbI)Q%Xw_{-> zXOUs`vw6Nk;3RRtd+vzG6&50ak^#_1H0LB+E?+jxyEiG)1>8*l(eUoKm!&P66fIC6 z@idp|h~064_+o1?T16{|VtPsecatKG7KTExxqG)9=yY}nH<76%?g#H-bEqo zvl}fr$)YB!P(1jjuYRZh6*lw@C^Ygp3x6b2c=2M~mONrC@%o>bNwSuV1Cm5QifL`& z+uQ+iio+afVh4?FB+tZWnPqkhkXfR8AQH zF6pKgR1;^rHVVYYB*nzSnbif%&9f3b1rQ6T8hq$XqPo^8{_NS_$eIh`K)Br5xb=zh z7*5Upg0gz@=gz~peSyZEAOBH5qIvs$X5-t{t_y$csx=7#??A5g1Mi`=U9(>5MXG+n zs&lSA{e3oHAU$2a)2jqTWedzE-s*m+{&ye5EWZ2u`;RPVfvj2JVTd!sXmw^IP{YHU zkyAK3LL)wG8z&B+`(%>_EKznV6&W=~__tLw<0+5h7O%=LRA%f8W>5l>;9zWOva<2i zm_?F=e`fsCsJ>lfSZf(06H_!0{xvXI1TtyBiDf;WoH1A@H+H6N$~|gozTJLJwB#Zl z=9$#@Yzi_R6-L1eMi9wmJ$N$`NV7jhUP{0G)9>QVNhqDSrGWNXNfahIP94zF$({c6 z@Cw6-Iv3d=BkPCNR=8aRdQT`I(M>}|WzUN}S&)f+DngPYgarkwO6<3Qb}@@#Z`$CX zVt|8=!}eM8bc@G*`SQB@{dMR4Z6I%!-!wDXMD=rge=HOmD&f|nEG#Sxbarb$k~;#K zzsISfk63vf&N`Kp#N8Lha`N($;p_}-Y}Ol-HC~ck-b7~%DOKII&dV^ewbaO}+loa3 zNpd|t8WZ)&Q+FB`l&(AzUefHMxgbHhFP60vWPyYVnJ6Q0I94p$hS3H2mef?_Iog`&i zhMWZozK)1hc1Nw@)Z1-zKMkcjE?7 ziQ53vG2fbSY>aq88%qkUI08u8FU@yqEz{+ynh z`xaN?a<~uFIG-uEW;RZmaVplyDa3mIu}N$mGj>Q*P*l`ts(dD5%(Way0k#{I%^`BN zPq`*Yiz+QxtE1Tq1TLL#fEgNO5Be>i1at!>CbRB+Vi&$22i zftJ zRVOJEFIHpA;J_pnwN*>*=_Qw!8>If7D35^rO-Q~vj{j79e(`{&6d=xC8pn6?qk>LgzkAe=jPmHJFUgsQ@fx zf}S`agwm=b3|^mYtp!ptnhav4$aam-a<&;H{tuVsD$h1GslUg|8p)7V)ns$M>fawt z16^XUq^#sQw2Avs#XFu$<1%jqPt^KMMEXuj{ zKZf)M{wXM^CsVB)^azGd_c8wZnK5(Pd}VjsHQMk`&&o0f`l_Hy5L~9@o)*DpEce!3 zESr-Ir;SSC%9Sf1Rd<031;}F-C^L@yz4QIFkuD%hgjiWvHj)#gimVm_R+V8tCe&)N zTVKZNW!kIjGk0^S(Y0urYUv;%$12aAp^qHOYD5aKk=_DM*F?b&ECghHgTd;PTNmac zNH$>rEuEc);E7teh;h=dgLKm zpJJiLq<+;{KZjp*7|Y=Ojohj9MB4BzK%blBl#;%!i{|Bey3 z-yIH)J_JVBT|U;4ZT)(H7JgYNqA)HgEiD3QzwsY!;Et_UnMdCQ6Z9*ohjDrZ(nyva z?hd(OVuOorit@6eQ!37>)-io!3k&U$n=>Hn4uC-1z?0~LVHsDTS|$}0X3`G1dFr-X z-%BYM+ZZ40ZGiHBG+SHjOV{>6)R=D2^{y9~r%+$GpT_agp=s$(@A^blTQq;>c;+`G zPmpc1{8!#i;JJBvZ^4<7^hk)jax6h*940GekoP3{DKKd z<-=vix_;^g97HB|2wH#|SM1yjSF3unJYB2sZ=VDn`z zH(A6QY+WoYvism4r}$8(%poyz-^<$@XrucF z2M0$*tv-TEPEskvfA>Ih3BO!LqUAmgIoEctl4o8}oV54=yz?CCX}+K!^kZyH zj5-j~2Aam9Y=$q5jg7zb#485~T`?j$?M|_j@5W|9bavK%x;tP#3{=xFRNggvd{sZq zMtJMoEYpQ^u(4@tX>G5LI0CpPpP~FIR0jKBjS;`=2s52TMe7ZcrZYd72_73NqO$ z{@A0n^ZrM&N1ZPs$ccv8kvV|H5;%0L45v1=4k_qBI=h5al@~Sqe8;pw-{4UDQ|GGv$!UNqFo(d)WA9Mu#NE>26rk7nvx5f(}&3VR}lc067#l^Sx zkz8ardCFoGzdHK4kWcXyT0y7AE8I#Qb~XVFMHf`)^!k%S?Iec-7AV1v1REQBYqmuU zcdDk6=)a?fvz$}hvER8)A42Xnf+yKB4&Q+c3F8t8=fC)s*gkhtIuv_?E)wOb!Q zIz;K}>WYL&(4Os1hzEO2EE~ek4hjJn`8+i2VM0lXvWdinlSKR5ukklPQ5w5o#))3s zu}RrEBP9wi2UVcc;h!OCfwEqdz&CML^d#r}zV(cHxcTO^=oqfJu5oBc2n}z{!?PpJ z=JKtqtdxoqPJqMFmFuCN*>E51^`B6nZ`LnR&H%+6I?1CG;ZgnE4qxf7)#Z;f-cGE* znSo12x8iIQFe>-=_t%FEEe1T0K3OP#M;3iO#KO|j6N?y~oPmP;3f-O{=*b%K+a0CXS-Z$_Jm;FN^5WCdj5enmK-e4hWw8CusJ}a| zT#BRvq$NOC^ZvI5!5FMXx-ik}KWSSlSN3gIDd~-#)0rRfmR| z&sF@MKwUW(m!tL=LBL8m&bQw#^9OYw8nFZ4Gc+U>Hv8jRmD5&S945n|!NKh6mF|GH zD_`2O7{ ztus?5qGA2%eFs0afEqVv6*aYTs|9JBFNg-3XdpSD-~a*T<8|RvE;t9uqw4BvPf8a% zfD-|$^Hu~r_KbHz2>)162kj8Z(tBc%#93m1=YQ>nfDCV3f&vTqgc)av4qgkD0w6|} ze{P3>G#A1?3}|QvtgPGf4WXcw~ju6>#V6I;BM54ZG4?n*St3a z9_T>t!cTXTh@zvX2T2G}k3~*Miwy{`i)b(q{heoO&}alD=%4MCoOi3-_M6i~3}9T> z^~lTT5JKONK=t{9WJlNCom@q2rj}V%95(OkaJKs=D7fck0;_SlzFz)gJ@18)IY%8X zB@2Mnz{n7bJ%%7reTsw=vMhK1;L=Z$bj|kamP6um3yaOWemoD2`oC_?wHY?JMZ!*P z_z;aayR?bxia}fg&e<6JWc$$r(Xc`QY@7vvyQ>rgI3F%I+o@S*$w2{f7C@y@yD8u5 z>Zkwxq6`$s`h3XgK#9`DaQAxoy?{Aa;}Cc`Gi>?fm+8XPb&a zIr$CZQ1T4}?m0%#Gm6)dz44+v)|uPu7;**+xw@wvu4Urj~5s_>=Y<+^>lg5GZw z&5WEGfz+6DVPPTIC0Omt90Ox?%B=k`RrV6&kEg_@p#T&e%r$fbP!u>70Of50#VSEm z|FZAfRZS>|erJ46P7dJq?LnoP{~x`5&_`%%Yws-enb!N?2K_#vsNj>={&054c-n}p zN*J$Wp1d&|J3FId&V9fqgQ-i8>!>_CT~CLdPioSNqa~#E%uG{AoeyzUS!;7MWFK9S zCeEIUp6j;JeM7QfpMb(;Z=xekgphzh_&5$ic*a_I3J9PdwigxkJvb+K%xwRRng1ud zr~mJ`_A8BNmAPp@KvH-|jVzmODyv6Fytc1OLrgbOYpdImDy!E+4!U^9)Gu(imc+{2=HfaCeB{m9YH@@OJ^D4PS_-beULXH*9*ff4>Eywg~`NSK`-Rw8R zJsZJ#HySm)--w)Vz-NW9-!8;L?+ngbQ-0I>3qSgs74F!yT)1vGIg~I&c8**JW1*k# z(V*RCzxH_VZFGOs_d=f7`VuwNuQo*p)v>=S@-*Fq@p>EDFcqmcyt`p^EB_vMtS^n9 z3Z@Bp0KJZ$k$?rURp0whKFejpDmh3&F~mBw6=y$%-Pxfkpi-IL|E7pQ&c<|B)Aw{i ziyACn=rcyQRT7qfPb2bj;#VC4zCAi{+@m(FA5zP*C@F|P8Wdu`CL&Pc?jG=8hNKx> z2JPFdQXAp0@0uCjykP1rM$+UxIlQ*@6e0T0v==c+xW6*y2%E+|nPSs9LMtQZy;Kyn zX~qM_!)40J0QjN>yT7}gRrL918KE&*mw#CHVJ>RZrVCCxk+~W^+%qiua0g#r219Mq zC`l7TpOBJ2Y<;k!Q?nVLq zhT|_!JOMp3rXPqJ$5)$%1jDI43p2n}D)FT@6-|&K_kzQo)l+{c#WcC_YgQon@58WG z%V3@BYMWc(!_N94DpzZ$=J^!-m01KeZv-@bDHLkfG6Szu!IY6w<)q(-s)m#fEOjz& zFwD@?! zhBv3J^R3uVfzLf7>T+T5*fc|kjeSqgtG1B%dwJfV@IN!}Q^lqT0#B>wb zLtHKOL&5{_rrMn!{w+t7A}Fk5BvQ#)!O< z#MbDS+1hc#3(r*x_Ye139ryC{#{%%ct^a*`rfY2}ziHf8c|`6M^td54-|408bal^d`LRz=<@My3=k>$J@5fOBmiz;MXG}t4(8}H zhIlg+0b40Rf$WhwD>y1T~YP5fa8`*l*Hb?t1L+cg+y&QbvtQ z>geb=jBJCmI$vi%E#kFv*IiKe9Z_nK)z~P~N=w^+2!qP@Wl*sAvFXvudk$5vpT0uq z*q5O)cDQOgu-coYS$C1rsa@t;IkLsHA1cYSQO%G)EUm1Z#(md#tSmA?V}OLT)HNMq z)X!{lV=40$zW^tM{e7XLC?b;k8R;l^PW{U?qpoFBg32P#7-RGXMR>y}=i(U}pZCre zDXs*FO2AH4!a&7mT|O1a)*p`Cy0fNv&6c(o6XZ-bIT1_ zO-;2ZpYH3vHotqTK@6O1P_`M^+L_UG91!Ot;gEKzeBW<79&@YkX`0>*^vA>X;O-!Chvc2st$%_vD=2Nv<_!N%I zEMwv54Nwz}y2J|2r^lBj-a{YdSft0JLW8OnHj^K7V2Y}i>FG@+1V&{pWkhJRiaM|0 zZcYhR_hR5)X`nLD96sHkm_Xm056+so{RnysLOtHbRW6 zy7Q3Gu}V-D71 z>G`7oOVDK;=a(P0Oqf9+d&u-w!_3lNAX_^-J6j*%?hb0WW&s5LjBL7Hcti|8^E1CK zPrbuEaI^LTsiRz}yX!j=rfK(eSnUr)TwESyzQd08ta6{m%gtWhIxw+3*jsX>r`)5@ zEU65}rQqo|JQSgH{(QJ}z$Xg=7rkX%ui>rD#h8Q zKIA)gWjk0UV3S5E-^9q?#wM>IyK6y9#D=N-AbV{JFbx3Vmmcjem2rHEM-*vkX;oiv z4w+?g+3+4e?w4tALDhk}QwE2sQ$#dPW%;NI4_&Eok5o}D;W zac1Eg_K#oQR&^YgOc$Gl_WEu)iuvn$z+(@x?GN|zji~c;C4-|G?)>icuz2k7Bk-%e z3S6*1-k$*G81{NN zuU@^%D?jD5DZ0i{lQq=^rqF=_ck`0bO=$rGqidEz79XpEZseFSv-LhlCO62ct++H~ zW{o0(Z?$2yEHw`eALnN?-~Q&p>Tuzf z>tUZOK$?xVv#$GH(fv2-RcuG_XYbZ~C4!>m=0xF&^-PY#UqMkJo34slgXQmW7`9YO zXy=dV84vHI7v{8Yv4wxQdz+7XAnhu}Q0vJuEz>?7!lb5yy2~B9S-JqQN(9O%~1CJw9#wR!ea7Ozipdl+>-!F1hTs z<{*Ty;kBL}o+if5#Uoi#B$ctI#?JjBt7b!m_4FKvp}Abo%xL{49X!8PZ<3RW!t1`h zv$Hc;7uD=0-o2W>9PO-=fwtaCZkiusLMf~E(akv9aeA(T?vo~LjyD&Zkst)cCylqR zyX+1WrU{%BO$32z;Jh9vYS4!|0F41w6O9l$vfZ#kQ1eUYjP$({S@P`EUYmLl$w-lq zt63U+VeI+RN7K|nPH+GkkUW_8=!|Od~fcXq2cr4zJiSVpSRq6 zMk}bSUS}2D+IzW}M$3fUHjQe+jzPu$t{7(tSORm}jQLB$9#R)dI(@~kY0uZmIl12A zkrBP@=f;x_FCA{M9J@jbHd^h~Oi4fPY#4f`5Q@h1D z;gFH~x3*So{9mX5jn%YlC@uHIxR_~DqGKOi3@MV_Mk&@$2N}}z%@t(&O@s3LESPE- z>3bn)cu}fjA<4yGTA6FM?0Zw60Ci^TUhHl=$*$1zSQG}8W;lbf&mDn76Es}5b6RrdfM?WCgvYW{I_ZX*bqnm`nC_5UgKONuF zRzPH+G|3g+#Z_JJ#2HkHEPD?P7W2P+I6F|O86DX~cj7fa?b5Ku2VYDj}jaDlkdg^CAHD9TIV8}sjM2l#Ac(l%%Y^Wbd$&S_fp#$K4rZ>^PVRO-q$n(&XmT(;pl@$ z93xgY94+kjCOmmL6rPu9HwDi{Ij(->UVSDix&T&}FHhW3Qd70xb%T@1UiOH>h|esa zBuulML=<}c61O}nMO7nNig(8i3wSo{r=M1>G61N3@`?MrK<2~CN5GhfXD`l5$b3y%cBElA@H)$l3k zvAZf>I(K4c;vgqb8<_VNue~EweT{HfNC>HZmna#n^R7NvS6f?%QXC-u=TZo^p00h{ zq;cx;K#2N$)y)72Dx@8{>7-Hzp;xDIHAFrwm|94kN!subHm zft|r332IuKl|i;VrxqBS5v7)=ViAUe_ZKwV%Tqql+}ylf^nqL=`vgbvh4$jG1jT~L zrHtDV9HB}Y^+0^g*yov6gw_x?&Thv5d#RK#NSJbLTyDVtx52mzDwZ@`n09vODdqgRQZzRNy$QsHmt>1E^p6T`%I05zRD%cfsyx z*`Wz=W=ht#tKlq~n8i(ph_N-tE`Xy4pejXHmyap&-`8TYgmkW^GQ{;9CNFEq;^Mub ze&x`#YeGAHinnmw@k+#&_TJB5EyEE;jZ8>U0S4K4U zkoZEOK=#y@nVr8fytl`hMk3-h3eb;_k8Kl1+U;)7`#{*6+7K$|ba!J(FUH+^ujDtVPpm(`e9MA!ByijyG7 z>CyX5gr{=4M#KBss{<>Fjgn7N{FnE5$SCfGBwJgL)qh$Qn>||A<==8z>T%8=buiRl zz@8HXrL`+Krw?{z%W!uF4Ks7WdAmY|js#ZpzGBiUAACCkC7^2^<5zjFQHA~8Zu8Yb z#hD`9MafmOdj(Br`-q;i4F>~9I5k~7YNXEui2ow)uHtcr2<731pX)Lr2AtD70>_C& z2=1N(cHLg+np$^=X3(GKo2{46IllS`7e5Nakf41t=C*w5C|~04_mm&3P{$LCFvUJc z6+k&O?lReQPa%6**TJSY018<%z=tLqB@zS42TBh%o67vU`ujsaf8O3-%0wM18EvYD z`1tq~d|BH%s9|!sK08L?-g<>4IBL}}Eg{!!VNvvvAAv{90_iZ}ZW;q_nc_-?T+fiM ztpY6n6PHqlBMXDR+|?U8x+Ey>lo3xtxVdU$P_b@+OuIQ`sW=8o zS>CbiX^^%S`?KQai2oP%zWg7`^^f~>N-A3_OWBf;gv!1rl@Kah*0Jwf_H9gsgi!W< zQY8B_))__-l6~I|*}@q63}(zc_f+Sc7T@O&cwWzsdUelrU)S~7-k;@t^YQX38TtTy zKn_y_1qNV_5ZS*G3qYa$*j2w9o<<2MBDV73?E(2I0rlRc67=r9<)T?W){HRN_Ot6aXL zq%9dTN*dg-c=O`K9rM7%JRp&hQeR=#7`CcQYdhb>5Yaj@R&JW~v6(uE8&x;gy6EG4 z7$o4<{-qU4oZiVM#i`u_q;`hZkQ)dVUJYr!y`y~lwh7{aippoQ38;QeB`vYr3L@4c zZ>y;6PSHWCTxV4}Kj(8{;7fvaQ5$bK_P+X|@W%PQr3X6=>gIN+xfmxl97AZ?h`WPz zVf>^84Tu^4_Td1asZ$m@{eE{3iN~17u??;ZCIF?h+edSXu2H{TuIilbJ3J!ColJEj zs3onYI&^O9RkDe*y4!$uod5cKr@TAFu4Q5RL;w>#_s&6G3c$YdV}Y590OAG|wris1 z1q_pEB#VR!04*7&;~#cs0e3oOU&`(?70l$%@tEye$)eA4`Jfq_sJy)Vr;T|aq0<;Q zTGknkuD2^SM>?YR6GVI!|Sy2rpBJR>5>9V>B!V!1+I z4d@N)z&#_3D&h`aRe6d+Ea^iIB*G*2MVs&Sli$*~Z(p?lUzcE=?-gRV?npHiCs+Ee z++hp@zylCEXIA4A?W@b?9PM6U>6-$KGy>e&mXlBVx0gyfi!vY(E4ms00>3>~{BP)Y zEP2cgi%W4vR^KW1Eyo{x%Os%x(P^aGExSH*0xj&;E?~y9H{Q&esuaTbapq;6r>xIC zb^)rj$S+}8Tr3?NmN7dD3C_(T_a)FUH@)C*8RREC9Ku%5S2W}2WpF@2Ei*F{4wnj6 zt{t|X`|S5dwD=~jU$;B?G3Ma=#On01;X50eIZ{KspL7dJ#l#@IdmlooBFZTJ^6F)s-dnf=l=CB`hIZ3k6%*-vOi_utFxKSU#IGn(`(Z` z+i6R!mNWYMPs4^SqEC)CUbwUU-xe?Na9lRI26(`9pSdJ3{<>lI^#cH|Bxkt=$D6eb z-)ir@lj7kRAgHashLvqDpS2%=e$F?XCz`|tZErs~U-I$a7yA)tmfpi%Y1Zv6)G&Jp zM~Sx-)y*)i##~_$V&?~;iJuC#z4sD4|A^Sp{a`hkGE)f#)_CH3@$)E=U{^0neOPto zD|EQA!__shs{Ev1a2dI#P=qlrOnv2{`0n1iL4xz`0EdIi)Z0f@I(CzzHHhfbkz>^K z|H%gsL2t%C%WxP3w;}an%Wq&5CtlQSvkIJMwowE8vfQ3QD{ti+{JD^SY6oP2k@f^R zR^tQ5TLo|Xe`1N2PO(+c$b~c7%$8O=m)rBnhaNch2ZR_d!6()%mu< zjCpB%*F@5N_7>^tUS$yWwF(JEiV-wGaa@ka-&3Kcuz!4dlFhOQrt} z>#KW(hEUi>34SF~5qI;K>O}=cZmx%ZIh!_S>?UOrttiAZ-5xN}mk28o+?oQdLR zkTqOO2GpVvkp<7!O$q0Ps;`CP@!*!C>N1yrC=hIlbz++I{_bf!+EC}0iVp@5NG3$l zL!*1l?dIFcnDv?&-5Eq_UWS-+TeyS79tj_3L+ttb$59=2=Wz3l!JmwLEiv8+SufCB z*rY`@rmG@~rwDj+lJJ+hd&mA*>^a6wtaq*?mSgqrKF%GD0JD?J+ifemmK(dJQ~q@u zZ1kjv`+r~_D|Ze}|M&sw%-!5im}PmNg`2y%MW_VA#rO!*hU$$0?8`lm(m$SR0^aW{ z0I9`G5xW`~*Pi+bt%r@c_}mB%*wk1w`Wd;)0%Bn^uLmcP`0Cr(_6eK|fj2E;8rjR&VtTo2YY4fxFAgI9GG9lxt^(9bH& zg@~&54I7|+{WSTqE?s;L`h>vxMl|TR|M|V_8#OGS5_##E+qg-K-jcwg;_SpAl}A}D z=;K0W@!aIR;tTdmn$zZ;gVX?37@VaDaHi(p!Jc+EgH=6h&rTbNaxLC^ANW1B z_}$FjUs{lxYh%Rm(bcaAR2N4>C)5q(8JWCqo#!_?gqB-<|L<0TtY3dFymR=DK~uGc zH;!IsJuGi?mPTl&aS553Jxu|=u8|KII>{43h`98QOaaXuFZo4ZYgV|>xnCCAl@U%phC9CtGT&~c2;B2Z3{k4we*do6F8ioG5rE#XQ&G1LD3 zGkoZ#7O#d4AgQnH*72$uWh{MZ*9uo4z!E(%7UcqKMy}cqIM!59HI{S z-QAz+$IBG4zgd2B0k3NJE}j63{Q?BTYmet+LN7UFS$p=((aD0~hU#LkY55|VDX3e1 z4@|ThklV?usMj0#Pdz&N9ubV2GeSEh^pYpOn4h|Q{`Vay zckF<wenN`+VO$c>vi?t6JcgrF!`8nq+5!!;Q7wiACGrlZwjHm9^E6 z)eABm8{U~fYia+YYs*rk%6H6?md`e4kpcO>Jr!eO`bVg89yFMRW?fFcMrnQ5QCUk~ zHFPo0rv3fi5|dt)D#mGq@OZw}Q(ws5>i6|p>fR>7LS4nX1~S~`dRHv7L_eX7%FSK? z2FNs5(AKA=vo=7*3;~RNc>F9eVL;ZOU#L5sugv+PHYj4onlGVMufmmiHq)T0wWo4n zL=RhsLY9MB;hj=HD{SMc{s6j)50Z!fYZc8%)ofT&;@5B$w-C_ZI5lBP?xc~$qq2$f z^356e{Ga=H?zaK|1b>Ew+(Gc(3nppAX*Z-1hEzsG1;%hwGs_ujnnR?Hxl;GHXZ0v>fFw|PIUc#fUG8;ic{tIyN@Iv!L~60&P|20h#hA$%}7%FN7nNkzPEO0!NqR5LTL4DZAl9Cl!_FdSxbm zxMLdVs4+-c$*MQC&@*8F;)Iy*=`KIIhQWp#Rh<1}g8F;fs#dJOql3{+cWP(>tFAu_Y9D7&^ z!`n=M#43jZ%`M^oT3vEXACB3$Age0f+?$c4rOUHdvIkx_A;+Qo&4J?uZ&T;CzPdIS z{PENqjCnH4!lph>Z8h0a zlb3wdr5vHGtGfB+3?eHL5^CAoe}u9?plv6~v@+(2J79vjh5KNV`GniLIWDECt9tx^ z?t`_+LQTRi_drH52rsCT+7-6#SkGFG*?BI%N5@;jH*DIk_kn8%iRCqz&iC2W-Xl z*NLl0QL?jrGY|i?(+Nl7tKhCu1W8MzDtC1}hDpjtQMAA(r7&#`m!K0Lu&pGPhmzlW zmsKa?yHEVt=W13z%Y_MlpZegs+7$Q%D6yq;C2R9uA9_W*F|J`KUn)}~|4`g}#)DBu ze)h_3OL9?9FMc+@HmY>5JJdyoj$hKgpN*p{hbF*j1o5c-qMY%TYQR3-c`{*o`#@3+J>>B1uBgx)PylI$1t8*a zh>w@vivRBO_;^+}%0P5L>H-;EI@beuj?|NwJui)HGy@t!+QJ(RbPMburZ^jVp#4Mj@np5SJG@)djv@{oyO&&Yku9Cw*Lxny5LC~h<@1}}RwoU^? zx2w?sxQ=sP2aP4q>~g9*KZLG#^?)Dd1}y&?@CeW=+DccBBPiux)o8m5NZ*oWzU1>T z5|4xGxsBCP(bNy$NkL`7lEk^Wfvm&zUxHnM!lioO;xDX5W4D^+vunA`x&t|*#ru16 z7%;f^hEm680$;p457nXDcGr>@tE?ju6G}@dOn-mh;n(;ZB?}*lqZ4L(J8)z33Vrd1 z4d+*{kI1LAx4(S#D$A>vdjOb z1OfO(HmL?)&w) zmE>N*^4=wGnP|WAd!UYScndQC#BRr+G0N4&ty)Dl(&P;SfRV2^8TV;oJ{de1NY4Y5 zXNadVWi{We_t3QFg`Ln3SkcqJf8yq57g}O<^|w~llN6W_0Eu%d5DJ3-N<@6v+Xjv9 zE}Rvs9d&a3q|E+kA2bu{g#NIYX0Avy7D*gAAtjOKsrIV0NWP`ETKPk{tlF9Fh+nLQ z9YSNqL8jR9sL_~8vvoJSr_45Invq&#^Sf>pI=G=$aVMB|5}+0xd(U`j&*nVK1sJTNE$A)h+?7YO8fB_Tr*NtVVvBW zJYt9oJ-4Lb`Ik3$_|;ooYmLxIbc2<*Tie9y@W^4OzZGLx{^{n<6dMPh%aa|tt2PYk z!QNwwW^;HhUxQO$NXqe`8!P1;sZ z)o~Eyl9JI1VXD@PFqy87szXeJy~cMtQ5Y8>LFit+7w?Dk*ch)YCv_Ao*Nt<|cF^(x zoy`6~A_E1N%rWl4p^Z1y7-&!&?gDSfV!4Uri`3XBLQ>1{JF zYf4M>*XL|GvRyl#*hlEQ7~Lp$d?#dyI5-c*;6FqBFH3kVJP!>K7K>%v!LKT4lLsi6 ze_X?NB0V(FSQIq#`M((fcWBzTKP123HxRl8VPL}KKlrWxoona@Jj zsH%=WT6$e=q2J>mNz<^@ZWHBPS1wEbDb{a41FBs0)=jm((M8;hLm3sOYA&~u?wByzXe@VL-;TQ@N4Lv2+9l0RO)=ZUx)TK{g z)jpOZMae9SJJB>TyI>r46o6=Aza&3mU&xx90FOoOx(x>l6GqvfQTT*HFCfF?@XG*G z$&#Ek*s-IEkk-skB+&=pg zjW?1N-s${e*?dV7=B_e@=~vK^sC}q_jdqUY*RU@1o5smU?X#L-_Qs|k#4b0dcsr&B zLuisjYrJ6SZ~{H_CLSU>P9WO@jdw-yN=CK5{q|~jhpc#JauD^Ohdb4aF<-YvYWuBa z_WSvq!WcKw?mfwOF$L`+leo4k=V@2GNh?C7kiMzC368%^p#^;>eshRs8#A&Gcc?ojq5(izw1fti@ySyMKPwyR&P7v9-@jBz_kNqojP`*zxn18 z405Di*g6|m0ldN7?ue11vAbl-!GgO!v-M3GkQr1wW2#Z#3dxf6Zi2L(^1ohU&=3?O zOpGd==Swyb}HayHtJFHL-LD_q^1(r*L$PvL&vZTnT*Qi>J7(o(FtOx{s`c_K zu-e$;KmPq-%+LTk9YC_?4zy!(b7#5DcNEoPff2XCp>z24<5;*vFTu)Dg&4`F|{~j*E02VnVpwP>@N>~ z0s38dwSm5_8GxlvN{X=4^a>bUI977bi7~vfzz%2~&J3Fwbg2sza=CN-q3H{7&ptPW#j63x3tC1y7r94_(kUAS=M=uu8?pks-XWK`v1`iNsBS356#9r$Xm zU*~8_(9@?Ul7OK=7n6QqxLvvbAf3$Rs#}vQlT?JiZT`k=u#6XxKAYnrS!l>1D$nE%H6D%pu?fPJedlV>6gT!NmtUzuG#l z>KMFq7b9)!%(uQ1g>a>vVY&LbAn90Lm%qYY$7^o6{tczh0O#$@S@7;c_H2UFFu-we zKH}E&2ywX*1@u>!4Lh)J>j+!5RZT}qJBSr25)U6q$AJS)W59DAZ^Jsrn-j1vQxI~C zxfg+@Qt17-9O5=C+ulaq&b}4JIyG=77-WMy`%dhYq&CuYn3n`_RVk7-1v}^n0Lvop zEYQU5X-@*CiC#?j_~!vbc$-S{yDuSUki~$)y?S3bKmnZXd!cKGo~mIb(G{f;MMJ)u z0r>`}h7^Hz*X!547j3(;x;dfganLv)tCQ>#92k zEAPxVQc!^KA%){kyw;uoQzFN<9Ah}Zwq*efr?HcSv@jmkzFT%(ue@yK0R0a1 z5?l3JrHDLwPSBw=>Mq#DNdsKM!LO4#+U>sgq;dpXN{DUekO1*uj8&vW&oRTIgl#&Q zAD02$p|@#!Vq=MruFrD-+e%E`OJM%jkfoK05|}f-x(Wv9QExLymaK0>GF*$oKbX8& zk)xT}LH-43^}G3c65ZuiWYdO0`3^DPm<5v0gDtMqcQo>;&lOJ-DtcOYF6|gCEuhm~ z;(`2R84^}H>$p>b1bS~j3x)as#J@8wF|*E@Jw5jao9OB3GcWV;*-qkLc%9Xjl$30+ z!vogykPk;(<20K@AIkLhc2LM9uprhxTmNL_c8QtWE%%+If(bjsXo{fFZs3OH;uKA$ z<_CpDaH@h^(~-=*6cphpYbKrS=3Rpnkz;!;F}%RQl*1R#YzN}tRwYEPQv31Wa-OJebcGOqW?8kznYbff%Be`T__LywUfd28D zv^@ZUi#$L}4RpG5w*qv(0O^l_-dQ1K&#zm1xWh7la-Ua|L3Tz#fXIgZA+*F&;%q2S zXZ`B?gLD$srio&XBLJ1%n7*LVMI*P<7tqUWGgrp`4$<&FLJLC+mk(%Ru)biULGED-*t+J?fu)gKLM5n z=8?DA5ZP_xztyh`49a<-z&J^RfO%<@&srlBCGz0TJO(f}*1$yZtwjHtI>M|__MN2b zW=lY4>qLDp70uy>_nl(~SRX%1eP2W28(N8$&~ZCKBN8v7T6ZCg$I*UnQTMRz@x2yj zKg6!m<4+OPRG6g%1C|ox>D2EhrBH5qcVlkO%JovrwbKu@jg8fF=5$XMgQ(NltiGG4|@1kODNHhNez0ZL2< zPFj-b_3PKKRxWbpzytQA6g9p2Hj*}I=oL(pz%5(W@Wpr0Gv~ZiB~BSO(kC`wm7WHz)3bUZio60*R`qf^!DXw z${JHzg!;<4OC zLqnfG->hA`cB0TwP!HD}G{l_6&l6IJgj?rSj;I>UHKX;og+LND_JqXlOpue~-y-wD zuSV7Y(N`#+?oK^iV}9fIgLE8yF1CHqG50Q9M->~_bCRXDpHYe9B78_*?!LJxc4n>T zs}Jz3`208D*Y-_Jzdg!q4Qd#UFsh7>E6n0+7aXd4Z{T?IOHK-JWoxT|WhExvUFo5#WD04qpn_-lK6XlUZv~{ePKS!W73yXG zCcRdR{=0D^yO}eqk@TFVsbF}0->#;8T%qLxMg>IlbKVFRoy)R7FGDGBj6T@g!xIIM zz@o$fBT6>nw(q5H1qD6CCXLwbG55!08t;~(^qxyal{<1v4pwx;Cu})JXb^hG0n1cF zwoHIYP(Mh%>gTXdr}9{*ZCJa77Tm1kZ6zWlPgcj)UiHLa4Yv?WIa}x6(!qV6in?1% zdXwICHOrm>ol?ZNA)}m?Q7-4%0-dqctR$B6a-82=#9%xf_uU*695FBEHGW46uCuVV zB{2MuJ@1aM<7N%9J0hQP<26&jwcWUwq`8q>vVJ+|02vjrjwDASB9nk9)XU)sDer4{ zdmh6-PP6AZ=xhY*)fF2Eba`32;5jlSUwJw0jBGsmMaD(453DfLpTG`h3#k{$XL$dO zdungZ&*kNl7m*gf1@Z1^A|QgS}mk`OIv1o>g=J7~gTU zkfsloaPc}>a_9aNE5p*xyXi(=4oN-b>lJlHMH>Xwh4z!9{3kS8TCcEJ#{{Us&7a#J z+(KuC9slMDp4bI0wx^_|G&D5GZ%+pDLj7IGsvgcDW>KU))a=EZbD^Q3b-VpVNMI%> z3SjU9$UcA(bypS$*KzVOxwOcs>Kg0}h}TA_Ek^*pP}(WmC;uYc<(0&4aSbbO=Xy`k zL(VtAF%h=cpZ;@9TFwA+WUO4dBVXza(A9nT@WEmn50KXaLpf|f&ply$6d1v}84Y&v zKR6i;KEL(3vc|OAJybuHu)|3ZVw*5D37f9*SPkl z00Rn>!`9F=c?c1p6VWX)X3Lbpm%?C5&zTiUomVDm*X6faSXf$8UR082=ic3RRj0o) z6%D|KH>xxY)t_}jsft2n(IvT3q8EAnYim+{y$>!7zI*whkVY%O-$(JEbHAPx5*$py z*NG&5$snIRtW?by9~bxX+WA>==Lu@V=g!ZL94kWGhte$HkuS1|n|uDXwAVmJM|9@A zCC1>KkTokxVfQ96X?En=tLavT?^5`>;?^6zQi~SAJv0N~dm!!MIuozFsjW?mRZ>!l zQA|v=TVr%@jzSAFQ?Co90$dGF+B5FaWYl%R&!X zk+J}HtN+Hk;Xc@om1+X3L3b!fd`zac

*RcQ#nIJ5ANT;d-wQ>6W3J$_De+~!ey%dFL{`Do{sD+%S!G1lEX-V1<1zc zg5E5^PRRPeWAp31`&&Siv^~M+Oh$jetBA#vxHmxAjMKGo&-4b9O1?m3CfIVFb81V` z+CJ5nryRcf44(5gUx;q2^6f1l0PNf8%-=#NcFOY7NC=_+?VZHq`5}0&y^^QCvn)~*a6d{dc8(?waL-BBzBSpWHHVNBIDZA$wbH1z&z%}UClX0&~sZ;imhyVu&st~1%Glpc^=uPHw%qF$2x81MPA;J z$FS#+X?V?QJ(a>lv&Wh@UDSPvtdJp>Ho5C+L%dD;6gV3XMr(#3-+)zKH&pb~)bpiX z>URA4=vbijrCXLshRHZW*NNJ}&& zKS{n!!8H)gCTHH*YE^4xqP-CJ>Eqe{ z9Hz8h=5b-YWaHs-ou8w_%kQcQo48a-w~p%L3=9-t-J{C=fL%PD41bf}nd%nyEc7)> z#=c=LiC;!WpZ$o6k{CbrhK!$|Ii~-4?Vd&>v3ES?$z^=ilOKo;1c0meMVEFYae6ST z;Gm#QEcU91hmtH*a${_p=hX$gQ`(r*Gffwt4yH354qXg}TeaYw;bpZ!A?i!c{4Hw3 z>lrnKA^8b5z}YZ}SOdAe$%N__i)1N}+~%c6m+k=@1|s$w_pn9?cb${Fg|DF(LNfP8 zS_Zs3VI_W zYznqc0iaVd$cdep&xv?oVte6jRsUv|o(Da@zcVTtoVB^V`*^mgBR(;>E+GN5Gi(lo z^@iWUz_E6wOAjss3%dLxrO`AW!dXp24FtKpe_>+YBxqoX|#VaaxUo~L*8 znJB2;04%whERz-Ke)?zAHT$}AM)tP04+nDhi9}O1i5?ePlNv3NDPSy#ejT=I#@Q-%ADzl+j7-DWuQT5aqWHo0Zb$1P1V=N3V;4(7UUZd=|_;ZN)1DAzzOv9N^&}~|PGOMQa zr|HT;(zAZ}Hf@NQtpQ~`Z=sKYCYMq8ov0U0L8NJCsFzO8K06|Ol5^8`8nmVG%BEHx zESPyJ%mQ|X)=euKMTF27YgR(W?k6fUmUg1KjQn;h zz>g}%#!(`qUB6(LwdvP@zStN0uVwB{$JVwvK!prf%&ja`6@oYkc5WLJyQct4J>)^sjE@>rdHVs90BewjdMqbr>_Ej*j!+J5+O+xfM8{mdXc5gN=eD|dq#viA&BYFG zBNl1jSeVMsrsW6l{NjZj7Kum>T=7Z0K2C?8o9Ll|@Q}80O8TQKX1GTmH7#52=!(~B zFplJg-5w+-boamVG%#(5qMt*0R!;1|9M?P$ts*0%(`u*G%wa)h*A2Cwo*PSr}awzcR;!Ig+^EWp|O7!iXb8 zyNi_jD1q|XVQbq<-R$_FfvSNpCoewf+APTi*$a+Vy<|W=>QMVsu&3OlO)lV-q&XRb zf5Xtx*Ge_c4DL?i%bLn{+!3mdgp$Qp(}S&V=7=K}UHSr6J>`>U+vJ>ndnT$Y?bJYw zN95-@P2eGWb;Fi5kAtm6m-b-DtjN@`&$VvxdB5qHzv7L%f49lGEf*9{hub(RxK3E- zZ!CBw6n;(-_kze2%K+)IH0_?tgRU#7v%lkR)N%UQzhIrFFuUuha@&*~hYwazXRign zk1PF;X9vC7>;-T0QhfmLvuvv7jXS`yPdEcW8cwI;1is>z1wB)=eLr^gP3xq4tis@J z{1%*5LWDmT1yT&r?_r&WalIbCl5qkT#xbR+1`|v6mWl27lB}kJ%cSjruuNeK(?eDq zx_WZhmaI_XRp&PV)HMbbOk3zU#hHsO+^{@hVEtXJ@C~0CEb0j z$f0!bAw_h@1mVF&mXh7~&2kf%`vF!4nsB^x!R*m&r}Qy(##`jf-O+EEyB{g0jA-!N z^*iHwbTP+v96pQVxM_g{PK!1G+I0(YEpR+|;rJbe=%VRiQze=9f z2w;bDX?#7iN%w%;9mW7AZ%eNaG&?f%`>BPv`^ZnV1QcrAd42+??D%g~(eEahNL}?ukcQ zEH8Tsp!+>;b>eCCwzK_^WC#8GnvW*N(*<;CJu}m>S(e{Hi;*f?ryCYu+R%HSLhoLwc}Be&_3_KgQA#Etw1qR=f~=2D6m~#miGhE-Y}hdG z9-2>fW`cdvQ^ZR|#{trsV0)mo)5%!{F{#5`Ne~5Vw&w}S{CPN6@JF8VBmCCQ{vLfk z=`z$>iL@Q4pdKz2T=U+_I_MOvD~=pA4shE+*F{g9rryJ~?Uy6^YQ<4dBD`D#a?cxT&l+BW2j-3~zm%j68Al25WweCZMNWuX zz;eHK?Pi`V8G2rMK@qh#)`-dD^_{Y2Hvfe4_k#AY- zvk?qUmk6~bu;5Lnwy*bGL-*TAVrf*DhgnIrl*Wz~A*>?vjbjUaU?r!u4_Ns0X(OtW zgEd(>e4Mo`lII=>-rMI^sX^GS8IagVj27~AUH#p7Z7+x67wxVUHNE4T<=LEt5V^`( z&%+Bws|gKyzdIpvIQ>)zk8TpQ6*Gu=`1P&v>e^9UeM9Rg)qNw?Qo4ddwYp1QcmG&- z`{}b+z`FFC_fmYRVi=s7itd$r>1demOgdf^!W3x8&FZ@@ZFZDaO@9Eh#j5@uuypX9 z<7r3+zb&O6AJ#r5K0Rm?Ig!;8cBV$HcZ+J)x)Ko|+r-WCzsXYL^pQviD zl>3f+L7El)DUca~$M+dVbx4+qS?N<1 z4{D>mtyf=`_>HhQS@|9joYMt!eK!3Xi5M^g=!l z4@azaZ$OKTZ%b8q&X#&Z+N-(VdCCB_KS~RS=fQ`JW_&ffwMhfz26uX14S=Aj z;}K1L8w~SaRq-DS5-09Qt4c}iK>{f4cA1j@sA}-w?_}9Nmiemd=bn>+ZaPaN6@Jx; zmR9MZI%eGf(VB>AUu**`@eHSCt`S6rc5?+j{jSvRVZoAq?&sjpJVPljci95=pOwvR5_tF$l$Na)_3pY7$#YMnjYb z4TEI45+hB|D@p#hn;&n@w_;0cfKG+a;6tLz{}m_5$dQ~uZv`ykiR%$b)_V`St**v9 z`Zr>(+GMjBX;bV-TT6l#lXIuz>juQb>8&^@e->1r6bKX3wV~}?Ux`deF5VgM7q9Kt zrykjy6_Q2`XAa(K2S1#7M&u*>ZVJBF=rrKdvmedev?Do|Dw;T)G$b(v@ilG(i@Ltj zDR|I`BY?pNhq}3dpv(Kw&p{WnHAhC}Sp^Q!kM3pcS7I&u*$kv^2R_-`5akBZkX(Jb zIWVm9Vn7{{@|QXy7`ug9d+n?Xe_hagw_>4RL2ySq71iy%oaf^jGf=xRUPsaaRFUqN z9pVAU$IB-27P@ZUNRGMqH){ID-lhx5g9~iy^vGKWA^rcTIsS?y6DFhO}LKrEsKpT*$F#U4JW&f=PwgHBD5d2g1Eq` zS0C2w;}V0+vBL<_G(6F6rJGMbud=$-br6-xv^DllL+TzwImozTlUXoelfS1KD0%HC zP^_>hlV{_@F<^!6i?oPZ|4~p|T6*@Ql`3%UWd~b`Y6zF_g!7Y3KEjjz!V`a3XOCf_ zq)4kN?4o|&8iCOf!w{w2G%$juah3w{6b6KEUXhTvy-%c8FOENAWG$z;TMW3Q!nM@- zd);Uq)!iOa1s2=6nqFbAa2ItdV87F%7|ynR=W<#!m~k#Fzc5C%#;9(iChTpN|5C~X zPvEEV-9lucmT^b;P~SJ*v;S8z$(g?==%wzY$bcgrJMNWdLN7aRv#Kh-d|jT4?O4na zT6>`F>TlE<@xZ5gyJrfi_xv*c!S}X}AHe0*-dqxk2eo?Jfj3VvPnTNi@}nklZQ=&D z6_<5oJFT^#?xpKyB*o*Rg8(abY`w-l`+mLc3&Pqy8>jY^ZltjmKP{Re>^NeD(p@No z>z%}gHeXaz*7-o(S$9>vH&Atae}fnL1r5{V^c5Wo%Rnr{HM!t1bUPEqXT}^h+{2M> zCUNA5d6t6>ypV67zdI200#LQNUsMf(+2|{Ozc$?U)?1=fp?E=B3ILqqo;ygDhJ`I7 z@spI~YDt?AuS?}7GjY)9B#;eF{N*4B{!JO@*g67^&9R52biOD?B?k21up?vq6Y1_% zV3T`Frc#@;lf9@qUcjJ8{%lY_cB0)R&T?z*YOXufPYwa$V8+Ub+AWSz1NaC~Q=M9? z-dU-`>E131m9!O9}US9A_U(vaUFN}T74l6AY>$PB@ zJ{}=Taj@0E?POR~L41PwV675-XK@9T`Q{Vj7OSDk_ax_!j)wygOFcT=M%%q&JtI$m zI9qLq64^OF5$|3maK+!m$4irp_-1Eoo~dP~M3Gtp%g*b)P7hS&`*}m>yRNi{otPw? z2xB6;&ktfJur8G0O3%xK`!n1Q$E$Ls2;kGovsrf8oq5M=NTV^fr%P|hQYPI0S1f_< z5an0Hyr6B>3B{#)Xjb7h7Gg=%8-o}tAT^pODsV7w-OK-79+CzeRT<-?4mYP}kZpQ5 zKY9Py&mmXF<@oX}rgI4j8S|kGvB0;UGrJ4I3wMW*3t#5bl9(vt6VfJnVg-$)9QZz; z8)p@^JHPL*2uCUE!rZ5dvYvnT6d9c8dD^+P)~5lAzUSxO@_xO^e*R*|@*`yPsIs`y zACVhvIY+0Ihz5I6?`H&(NDSoYD8kJ|pLYVt?W>8~$S2krQ z1aTrRSFpeC1?Yjwkc5zRM32t+E#v*5Y95fEdwQi_*qDt3?BS$VMLedE>?<9_qBFs7 z^vtnW$n}nYyCk~W5U&o0*n;ig$@%vGo@V7OD_-A1%@LL}MycWlViwK{juu7G82`3r^6VBRK35lkhFK_=u;~6 zfJ}qcSLT|e{&)PNGULlmo$)Ls+|7e8gXzuWzGQD7)CKw+|Lcab@P}w zzR3hHViW$j!d9xcms37MC_3#au50P+9dqe9(+0i#A4Z}f9URnjosT$@N6@RJ^D9zt zTa~r9pPg(6ayyIXbgJSd94el75>0wMWZY3kK%R{H7aMa4Xn~ER;FXJiT7ylPNGXBC z@>l~qV*A7^=9d`v1_Rh?zuC)?(xjs3jwU6gU4i!$f4swU;73xAWX~&B;$QX3eJR!} zZH zeO7%@H+l4v9eZX(h75wo0co#neeagS*ZQijRGBcZNR}lODVb?evMTm_8SIA#OtgYF z99U4|v|`)7tQDSJ&bAxQ5}`ML*xno#?~D)6sh!X>8?e8sQ^U&SCwcq55~1&R*}4p% z%5mBjKSID*U+Woh|`6b zEg|CbBSG*_dMV8{r|ns{PDi)-D|DA*8c6a_Uyf$ z_q$C7U-iW6E+@OXb!gzD*N(O!B=>om)qVg0+tC<}SrS*T^$S*TW{jDw>8UH>SKf^N zo{8@5l4aVTUHq`(snK)FwxX@hy|n;HmkwJ}jZqIj*XtZ$*Wt3qt*GZwdurw-zb2HB z>ySQYN}#Lj%k05y4jw`eKWPpB4Z5)i%LzKWpf8uh=sQ#QMY!z2Ysci85LSitA;@}d z>PTnwRaNx%87$B~#ls$MCrr_0Lfh%~qebYJFYCZwM;rB2kjC$E2Q68vU3u)GdJTUL z_bR_NiZxWxq-=ODpf--Z{`gdU;aAP&r&aXN_BN%%B_bIo!_pRC_X8Ws_v?fD<>?Ax z9AgajID00Ix#nD8aX{WYxTR^1`rNFBx66wqw|w-_7ocqMLS3CACTy>q;W%NBm zPIn)EPt5M2CSV$!%=>qyJ2mfXcZ-Z}mk-RlSJ;nd1zL?i>rMqFl)LaYl@H$dg8PHo z--|dk1Lr;CuobnyPG5rpHB72?36FHOA8*_QkXU$fx* z%ua#NK|6aOIlv=J(Ys?~eqiQ6ZQC&`S}tmh!#dibVnK`A=aPOGW&896m1@};b`L&6 z3|T?A8&9>s^mEWyPvOkZj4s!+&*!u=Y|K&xU#2Fz4jjbU=DHm_(cX{`{`o)v?(Ci( z5MW8NaL;RTL&`d2bqxiTrjz#HicgM+e`PG6&HSY}{tw7d-2>jP_dR}-Tf5YmODV(7)2rLU+Vp)o# z8l|+61am3fG?UHjI zcj%A4y;iUKRWPt5@BG15Lzg#ufFu59C~l!*^<&e6I zN<}y7`?&4;trNAFhmS5eNpGFyD@l;-eOBI^=YN@`*+?A?^e29qSr)>fj_e{eS#Lq> zW@U7HwePf!cPo`II&K3D%A=Vzh;^?&8Z)&-y+~0E&TwdY;M*ya%{U`Ai$tZ2+0TRo zb*=?j46wiFu;pLK3Zec({K~P&kz3|HeRHugv%Iumh&?VPc(><$hZEj#m3I zEqKsTp1jv35iLh)x_mcf`NkH7^thf&DY$U88j3nBya@3%b7|=h3YmwtKs8ux^F_ps zH=-M9WcF|x!h1rLpR?cWQ6B`xY_I*R#&|S9<#*Dm(5w>jMaNZ#7UGU>3fswXG)VOoTnDv0mo@)J}43yC;{` zZ}xv;+QQ6F@BG;PqG(rvRZOwI4|#G2Y#&YaWR0})q22GDhB}F~@2GrvV|SFvrRV-7Xzl{dlJK04 zq$_(@OO2~wgZNWkne?e%b5xHPw`>FPi=va?n$GzRDVX=nX7W_BjoMwKX4ae-)!Iw4 zS&Y7n`Z=q4f#{pk;)(r!9RI#Ns%93D`*MrKn%yCnp^BQ6M{4p=A=P5@m|B-Gqwa@A zQIQK`&$u-;k|`|&4cVzFdY7=C*We9Nd2Jzb(Q$tg{bQCyu`v5nudDC*66!-F>)fAm zQma~=Dfxz%%v+yy8gDu&cZ9p|6Jt+I4tfSXaSuC*AD^(_9drNUDITy(WOO;*oQ7(o z8NHeG>!}TStA~+z!t7G@F-Lk`#Qvc~_Oy1rS*&ZdA=7+=!0asl579ezY}FhbSZQLX znc|v4xNG4AiaQGNJpj&1DwYa#P`BCNx;bIO9R-*99N*9^rtvj!fPx)7+9M zSK&{0M4N{A^b#hgBbOu!j#DCs={#V89LxHo(P+!DxbG9T(jrVm;fI}8y!1=7QZ>kV zE{|xF;N-=96V%)NmX`}Zs0&j9vAmhtqRc(CXPwwG=}zk;$roo0R1IgfLhgS(qGz`~ zn%sk|hG^rOVsn*tH@6$V$G#m9Ky{;8wr`z;gFg>0p_L5xc6++E;c!dOv%3bnI97L2z*0P264({W_MNjp6iYIeUEP?rI+_zZ8PaO z8C5E!PLU@t6eDnSivw3jkWUuxk&Cnf3|~Q0!qlw>xS6r}h*!P7^mrsoX+owWu2k|X z!FcB4l@T{xb`rU4Jl=0YfOX4q{5=}S_X;27KC9=3%CHkz|C%)0oYRC6?VDcpf6V_+3a1Kyb`DeeA4McM6v34mBzZOQ;vF;Y-(2OaarOFCDST#&T)V_EUmKN!UFqC zN+_4q7;W^At|~pA-g&egH_J&y*`lkr)mA#WYHFI>N($+T!O8R)sW9w9@WQX&QQ|M!wc(9V#MevNfvtRTt_7G#oqbsxsm+$A3{%piP0na<|*| z6Q?KY>Kyb7Tl;sUJ(9=oy{}2}z42GCL{$a2SR*P0=NF)&sF6x2tA@+Djhb`;r_2-V zr57nl4VciY4aMONXa&~B5kCHw@Vq1D;cZmRM*PbBuc1uArKLU5;VZG>-0Y;hGw)IR zZ$CB`+ll`F@4tJ%h8ZqBOFsa@5j_0KBpepMc}H|R4}u{eT9C~f2n2%AgQH;oy!bcW zzyJcZ5B9@BpeL|iIRDLd(4#&c{*W^e6wt&L;_`!pAqEi05E#hF=pO;dpCn)aon#^j zqU?_KArT=kO_;VO9HQ(^Cj03_p+AUTB&?sekGsDnk>sVK@Ye%igpG0^2mz@k(R7WGUA)b&QG#Cu7r>6t? z@fJe(n+7}}kbtPo>nEBP4Cul(8Um)bjRr%)kboz*v_k>kn%dq@OAD#ZsY6FsYa1^h z4-O3K7I`{aD8zPNfTq3O4nQvw7`C5zH|<4jqb8KvXJX;Vv0X%GC<;OVqld&Z7k5K@Wz>#p!Z@-yZ9|8Rf%0y%> literal 0 HcmV?d00001 diff --git a/docs/reference-manual/functions/plots/gapsys-sc.svg b/docs/reference-manual/functions/plots/gapsys-sc.svg new file mode 100644 index 0000000000..d8dbc06558 --- /dev/null +++ b/docs/reference-manual/functions/plots/gapsys-sc.svg @@ -0,0 +1,2450 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/docs/reference-manual/references.rst b/docs/reference-manual/references.rst index 2f32912f79..772fb84579 100644 --- a/docs/reference-manual/references.rst +++ b/docs/reference-manual/references.rst @@ -2659,6 +2659,19 @@ structures into cryoelectron microscopy maps using biased molecular dynamics sim :sup:`189` Laino T., Mohamed F., Laio A. and Parrinello M., "An Efficient Real Space Multigrid QM/MM Electrostatic Coupling", *J. Chem. Theory Comput.*, **1**, 1176 (2005). +.. raw:: html + + + +.. raw:: html + +

+ +.. _refGapsys2012: + +:sup:`185` V. Gapsys, D. Seeliger, and B.L. de Groot, +"New Soft-Core Potential Function for Molecular Dynamics Based Alchemical Free Energy Calculations", *J. Chem. Theor. Comput.*, **8** 2373-2382 (2012). + .. raw:: html
diff --git a/src/gromacs/fileio/tpxio.cpp b/src/gromacs/fileio/tpxio.cpp index f5bf5874eb..33e63d4f11 100644 --- a/src/gromacs/fileio/tpxio.cpp +++ b/src/gromacs/fileio/tpxio.cpp @@ -138,6 +138,7 @@ enum tpxv tpxv_MTS, /**< Added multiple time stepping */ tpxv_RemovedConstantAcceleration, /**< Removed support for constant acceleration NEMD. */ tpxv_TransformationPullCoord, /**< Support for transformation pull coordinates */ + tpxv_SoftcoreGapsys, /**< Added gapsys softcore function */ tpxv_Count /**< the total number of tpxv versions */ }; @@ -622,6 +623,14 @@ static void do_fepvals(gmx::ISerializer* serializer, t_lambda* fepvals, int file { fepvals->edHdLPrintEnergy = FreeEnergyPrintEnergy::No; } + if (file_version >= tpxv_SoftcoreGapsys) + { + serializer->doInt(reinterpret_cast(&fepvals->softcoreFunction)); + } + else + { + fepvals->softcoreFunction = SoftcoreType::Beutler; + } /* handle lambda_neighbors */ if ((file_version >= 83 && file_version < 90) || file_version >= 92) diff --git a/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp b/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp index c8e46d15d3..d51dc4e8d1 100644 --- a/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp +++ b/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp @@ -63,6 +63,7 @@ #include "gromacs/utility/fatalerror.h" #include "gromacs/utility/arrayref.h" +#include "nb_softcore.h" //! Scalar (non-SIMD) data types. struct ScalarDataTypes @@ -257,7 +258,7 @@ static inline RealType potSwitchPotentialMod(const RealType potentialInp, const //! Templated free-energy non-bonded kernel -template +template static void nb_free_energy_kernel(const t_nblist& nlist, const gmx::ArrayRefWithPadding& coords, const int ntype, @@ -364,8 +365,9 @@ static void nb_free_energy_kernel(const t_nblist& icoul = NbkernelElecType::None; } - real rcutoff_max2 = std::max(ic.rcoulomb, ic.rvdw); - rcutoff_max2 = rcutoff_max2 * rcutoff_max2; + real rcutoff_max2 = std::max(ic.rcoulomb, ic.rvdw); + rcutoff_max2 = rcutoff_max2 * rcutoff_max2; + const real gmx_unused rCutoffCoul = ic.rcoulomb; real gmx_unused sh_ewald = 0; if constexpr (elecInteractionTypeIsEwald || vdwInteractionTypeIsEwald) @@ -526,7 +528,8 @@ static void nb_free_energy_kernel(const t_nblist& { preloadLjPmeC6Grid[i][s] = 0; } - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler + || softcoreType == SoftcoreType::Gapsys) { const real c6 = nbfp[2 * typeIndices[i][s]]; const real c12 = nbfp[2 * typeIndices[i][s] + 1]; @@ -546,7 +549,8 @@ static void nb_free_energy_kernel(const t_nblist& } } } - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler + || softcoreType == SoftcoreType::Gapsys) { /* only use softcore if one of the states has a zero endstate - softcore is for avoiding infinities!*/ const real c12A = nbfp[2 * typeIndices[STATE_A][s] + 1]; @@ -558,8 +562,16 @@ static void nb_free_energy_kernel(const t_nblist& } else { - preloadAlphaVdwEff[s] = alpha_vdw; - preloadAlphaCoulEff[s] = alpha_coul; + if constexpr (softcoreType == SoftcoreType::Beutler) + { + preloadAlphaVdwEff[s] = alpha_vdw; + preloadAlphaCoulEff[s] = alpha_coul; + } + else if constexpr (softcoreType == SoftcoreType::Gapsys) + { + preloadAlphaVdwEff[s] = alpha_vdw; + preloadAlphaCoulEff[s] = gmx::sixthroot(sigma6_def); + } } } } @@ -634,12 +646,12 @@ static void nb_free_energy_kernel(const t_nblist& gmx::gatherLoadTranspose<2>(nbfp.data(), typeIndices[i], &c6[i], &c12[i]); qq[i] = gmx::load(preloadQq[i]); ljPmeC6Grid[i] = gmx::load(preloadLjPmeC6Grid[i]); - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler || softcoreType == SoftcoreType::Gapsys) { sigma6[i] = gmx::load(preloadSigma6[i]); } } - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler || softcoreType == SoftcoreType::Gapsys) { alphaVdwEff = gmx::load(preloadAlphaVdwEff); alphaCoulEff = gmx::load(preloadAlphaCoulEff); @@ -651,7 +663,7 @@ static void nb_free_energy_kernel(const t_nblist& r = rSq * rInv; RealType gmx_unused rp, rpm2; - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler) { rpm2 = rSq * rSq; /* r4 */ rp = rpm2 * rSq; /* r6 */ @@ -689,7 +701,7 @@ static void nb_free_energy_kernel(const t_nblist& && bPairIncluded && withinCutoffMask); if (gmx::anyTrue(nonZeroState)) { - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler) { RealType divisor = (alphaCoulEff * lFacCoul[i] * sigma6[i] + rp); rPInvC = gmx::inv(divisor); @@ -742,6 +754,22 @@ static void nb_free_energy_kernel(const t_nblist& { fScalC[i] = ewaldScalarForce(qq[i], rInvC); } + + if constexpr (softcoreType == SoftcoreType::Gapsys) + { + ewaldQuadraticPotential(qq[i], + facel, + rC, + rCutoffCoul, + LFC[i], + DLF[i], + alphaCoulEff, + sh_ewald, + &fScalC[i], + &vCoul[i], + &dvdlCoul, + computeElecInteraction); + } } else { @@ -750,6 +778,23 @@ static void nb_free_energy_kernel(const t_nblist& { fScalC[i] = reactionFieldScalarForce(qq[i], rInvC, rC, krf, two); } + + if constexpr (softcoreType == SoftcoreType::Gapsys) + { + reactionFieldQuadraticPotential(qq[i], + facel, + rC, + rCutoffCoul, + LFC[i], + DLF[i], + alphaCoulEff, + krf, + crf, + &fScalC[i], + &vCoul[i], + &dvdlCoul, + computeElecInteraction); + } } vCoul[i] = gmx::selectByMask(vCoul[i], computeElecInteraction); @@ -777,7 +822,7 @@ static void nb_free_energy_kernel(const t_nblist& if (gmx::anyTrue(computeVdwInteraction)) { RealType rInv6; - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler) { rInv6 = rPInvV; } @@ -801,6 +846,24 @@ static void nb_free_energy_kernel(const t_nblist& fScalV[i] = lennardJonesScalarForce(vVdw6, vVdw12); } + if constexpr (softcoreType == SoftcoreType::Gapsys) + { + lennardJonesQuadraticPotential(c6[i], + c12[i], + r, + rSq, + LFV[i], + DLF[i], + sigma6[i], + alphaVdwEff, + repulsionShift, + dispersionShift, + &fScalV[i], + &vVdw[i], + &dvdlVdw, + computeVdwInteraction); + } + if constexpr (vdwInteractionTypeIsEwald) { /* Subtract the grid potential at the cut-off */ @@ -864,7 +927,7 @@ static void nb_free_energy_kernel(const t_nblist& fScal = fScal + LFV[i] * fScalV[i] * rpm2; } - if constexpr (useSoftCore) + if constexpr (softcoreType == SoftcoreType::Beutler) { dvdlCoul = dvdlCoul + vCoul[i] * DLF[i] + LFC[i] * alphaCoulEff * dlFacCoul[i] * fScalC[i] * sigma6[i]; @@ -1063,56 +1126,56 @@ typedef void (*KernelFunction)(const t_nblist& gmx::ArrayRef threadVv, gmx::ArrayRef threadDvdl); -template +template static KernelFunction dispatchKernelOnUseSimd(const bool useSimd) { if (useSimd) { #if GMX_SIMD_HAVE_REAL && GMX_SIMD_HAVE_INT32_ARITHMETICS && GMX_USE_SIMD_KERNELS - return (nb_free_energy_kernel); + return (nb_free_energy_kernel); #else - return (nb_free_energy_kernel); + return (nb_free_energy_kernel); #endif } else { - return (nb_free_energy_kernel); + return (nb_free_energy_kernel); } } -template +template static KernelFunction dispatchKernelOnComputeForces(const bool computeForces, const bool useSimd) { if (computeForces) { - return (dispatchKernelOnUseSimd( + return (dispatchKernelOnUseSimd( useSimd)); } else { - return (dispatchKernelOnUseSimd( + return (dispatchKernelOnUseSimd( useSimd)); } } -template +template static KernelFunction dispatchKernelOnVdwModifier(const bool vdwModifierIsPotSwitch, const bool computeForces, const bool useSimd) { if (vdwModifierIsPotSwitch) { - return (dispatchKernelOnComputeForces( + return (dispatchKernelOnComputeForces( computeForces, useSimd)); } else { - return (dispatchKernelOnComputeForces( + return (dispatchKernelOnComputeForces( computeForces, useSimd)); } } -template +template static KernelFunction dispatchKernelOnElecInteractionType(const bool elecInteractionTypeIsEwald, const bool vdwModifierIsPotSwitch, const bool computeForces, @@ -1120,17 +1183,17 @@ static KernelFunction dispatchKernelOnElecInteractionType(const bool elecInterac { if (elecInteractionTypeIsEwald) { - return (dispatchKernelOnVdwModifier( + return (dispatchKernelOnVdwModifier( vdwModifierIsPotSwitch, computeForces, useSimd)); } else { - return (dispatchKernelOnVdwModifier( + return (dispatchKernelOnVdwModifier( vdwModifierIsPotSwitch, computeForces, useSimd)); } } -template +template static KernelFunction dispatchKernelOnVdwInteractionType(const bool vdwInteractionTypeIsEwald, const bool elecInteractionTypeIsEwald, const bool vdwModifierIsPotSwitch, @@ -1139,17 +1202,17 @@ static KernelFunction dispatchKernelOnVdwInteractionType(const bool vdwInteracti { if (vdwInteractionTypeIsEwald) { - return (dispatchKernelOnElecInteractionType( + return (dispatchKernelOnElecInteractionType( elecInteractionTypeIsEwald, vdwModifierIsPotSwitch, computeForces, useSimd)); } else { - return (dispatchKernelOnElecInteractionType( + return (dispatchKernelOnElecInteractionType( elecInteractionTypeIsEwald, vdwModifierIsPotSwitch, computeForces, useSimd)); } } -template +template static KernelFunction dispatchKernelOnScLambdasOrAlphasDifference(const bool scLambdasOrAlphasDiffer, const bool vdwInteractionTypeIsEwald, const bool elecInteractionTypeIsEwald, @@ -1159,12 +1222,12 @@ static KernelFunction dispatchKernelOnScLambdasOrAlphasDifference(const bool scL { if (scLambdasOrAlphasDiffer) { - return (dispatchKernelOnVdwInteractionType( + return (dispatchKernelOnVdwInteractionType( vdwInteractionTypeIsEwald, elecInteractionTypeIsEwald, vdwModifierIsPotSwitch, computeForces, useSimd)); } else { - return (dispatchKernelOnVdwInteractionType( + return (dispatchKernelOnVdwInteractionType( vdwInteractionTypeIsEwald, elecInteractionTypeIsEwald, vdwModifierIsPotSwitch, computeForces, useSimd)); } } @@ -1177,23 +1240,38 @@ static KernelFunction dispatchKernel(const bool scLambdasOrAlpha const bool useSimd, const interaction_const_t& ic) { - if (ic.softCoreParameters->alphaCoulomb == 0 && ic.softCoreParameters->alphaVdw == 0) + if ((ic.softCoreParameters->alphaCoulomb == 0 && ic.softCoreParameters->alphaVdw == 0) + || ic.softCoreParameters->softcoreType == SoftcoreType::None) { - return (dispatchKernelOnScLambdasOrAlphasDifference(scLambdasOrAlphasDiffer, - vdwInteractionTypeIsEwald, - elecInteractionTypeIsEwald, - vdwModifierIsPotSwitch, - computeForces, - useSimd)); + return (dispatchKernelOnScLambdasOrAlphasDifference(scLambdasOrAlphasDiffer, + vdwInteractionTypeIsEwald, + elecInteractionTypeIsEwald, + vdwModifierIsPotSwitch, + computeForces, + useSimd)); } else { - return (dispatchKernelOnScLambdasOrAlphasDifference(scLambdasOrAlphasDiffer, - vdwInteractionTypeIsEwald, - elecInteractionTypeIsEwald, - vdwModifierIsPotSwitch, - computeForces, - useSimd)); + if (ic.softCoreParameters->softcoreType == SoftcoreType::Beutler) + { + return (dispatchKernelOnScLambdasOrAlphasDifference( + scLambdasOrAlphasDiffer, + vdwInteractionTypeIsEwald, + elecInteractionTypeIsEwald, + vdwModifierIsPotSwitch, + computeForces, + useSimd)); + } + else + { + return (dispatchKernelOnScLambdasOrAlphasDifference( + scLambdasOrAlphasDiffer, + vdwInteractionTypeIsEwald, + elecInteractionTypeIsEwald, + vdwModifierIsPotSwitch, + computeForces, + useSimd)); + } } } diff --git a/src/gromacs/gmxlib/nonbonded/nb_softcore.h b/src/gromacs/gmxlib/nonbonded/nb_softcore.h new file mode 100644 index 0000000000..c557c6ffb3 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/nb_softcore.h @@ -0,0 +1,262 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2012,2013,2014,2016,2017 by the GROMACS development team. + * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * GROMACS is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * GROMACS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GROMACS; if not, see + * http://www.gnu.org/licenses, or write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * If you want to redistribute modifications to GROMACS, please + * consider that scientific software is very special. Version + * control is crucial - bugs must be traceable. We will be happy to + * consider code for inclusion in the official distribution, but + * derived work must not be called official GROMACS. Details are found + * in the README & COPYING files - if they are missing, get the + * official version at http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ +#ifndef GMX_GMXLIB_NONBONDED_SOFTCORE_H +#define GMX_GMXLIB_NONBONDED_SOFTCORE_H + +#include "config.h" + +#include "gromacs/math/functions.h" +#include "gromacs/simd/simd.h" +#include "gromacs/simd/simd_math.h" + +/* linearized electrostatics */ +template +static inline void quadraticApproximationCoulomb(const RealType qq, + const RealType rInvQ, + const RealType r, + const real lambdaFac, + const real dLambdaFac, + RealType* force, + RealType* potential, + RealType* dvdl, + BoolType dvdlMask) +{ + RealType constFac = qq * rInvQ; + RealType linFac = constFac * r * rInvQ; + RealType quadrFac = linFac * r * rInvQ; + + /* Computing Coulomb force and potential energy */ + *force = -2. * quadrFac + 3. * linFac; + + *potential = quadrFac - 3. * (linFac - constFac); + + RealType lambdaFacRevInv = gmx::maskzInv(1.0 - lambdaFac, dvdlMask); + *dvdl = dLambdaFac * 0.5 * (lambdaFac * lambdaFacRevInv) * (quadrFac - 2. * linFac + constFac); +} + +/* reaction-field linearized electrostatics */ +template +static inline void reactionFieldQuadraticPotential(const RealType qq, + const real facel, + const RealType r, + const real rCutoff, + const real lambdaFac, + const real dLambdaFac, + const RealType alphaEff, + const real krf, + const real potentialShift, + RealType* force, + RealType* potential, + RealType* dvdl, + BoolType mask) +{ + /* check if we have to use the hardcore values */ + BoolType computeValues = mask && (lambdaFac < 1 && 0 < alphaEff); + if (gmx::anyTrue(computeValues)) + { + RealType lambdaFacRev = gmx::selectByMask(1.0 - lambdaFac, computeValues); + + RealType rQ = gmx::cbrt(lambdaFacRev); + rQ = gmx::sqrt(rQ) * (1.0 + gmx::abs(qq / facel)); + rQ = rQ * alphaEff; + + // ensure that the linearization point doesn't go beyond rCutoff + BoolType beyondCutoff = rCutoff < rQ; + BoolType withinCutoff = rQ <= rCutoff; + if (gmx::anyTrue(beyondCutoff)) + { + rQ = gmx::blend(rQ, rCutoff, beyondCutoff); + } + + computeValues = computeValues && (r < rQ); + if (gmx::anyTrue(computeValues)) + { + RealType rInvQ = gmx::maskzInv(rQ, computeValues); + + // Compute quadratic force, potential and dvdl + RealType forceQuad(0); + RealType potentialQuad(0); + RealType dvdlQuad(0); + quadraticApproximationCoulomb( + qq, rInvQ, r, lambdaFac, dLambdaFac, &forceQuad, &potentialQuad, &dvdlQuad, computeValues); + + // rf modification + forceQuad = forceQuad - qq * 2.0 * krf * r * r; + potentialQuad = potentialQuad + qq * (krf * r * r - potentialShift); + + // update + *force = gmx::blend(*force, forceQuad, computeValues); + *potential = gmx::blend(*potential, potentialQuad, computeValues); + *dvdl = *dvdl + gmx::selectByMask(dvdlQuad, computeValues && withinCutoff); + } + } +} + +/* ewald linearized electrostatics */ +template +static inline void ewaldQuadraticPotential(const RealType qq, + const real facel, + const RealType r, + const real rCutoff, + const real lambdaFac, + const real dLambdaFac, + const RealType alphaEff, + const real potentialShift, + RealType* force, + RealType* potential, + RealType* dvdl, + BoolType mask) +{ + + /* check if we have to use the hardcore values */ + BoolType computeValues = mask && (lambdaFac < 1 && 0 < alphaEff); + if (gmx::anyTrue(computeValues)) + { + RealType lambdaFacRev = gmx::selectByMask(1.0 - lambdaFac, computeValues); + + RealType rQ = gmx::cbrt(lambdaFacRev); + rQ = gmx::sqrt(rQ) * (1.0 + gmx::abs(qq / facel)); + rQ = rQ * alphaEff; + + // ensure that the linearization point doesn't go beyond rCutoff + BoolType beyondCutoff = rCutoff < rQ; + BoolType withinCutoff = rQ <= rCutoff; + if (gmx::anyTrue(beyondCutoff)) + { + rQ = gmx::blend(rQ, rCutoff, beyondCutoff); + } + + computeValues = computeValues && (r < rQ); + if (gmx::anyTrue(computeValues)) + { + RealType rInvQ = gmx::maskzInv(rQ, computeValues); + + // Compute quadratic force, potential and dvdl + RealType forceQuad(0); + RealType potentialQuad(0); + RealType dvdlQuad(0); + quadraticApproximationCoulomb( + qq, rInvQ, r, lambdaFac, dLambdaFac, &forceQuad, &potentialQuad, &dvdlQuad, computeValues); + + // ewald modification + potentialQuad = potentialQuad - qq * potentialShift; + + // update + *force = gmx::blend(*force, forceQuad, computeValues); + *potential = gmx::blend(*potential, potentialQuad, computeValues); + *dvdl = *dvdl + gmx::selectByMask(dvdlQuad, computeValues && withinCutoff); + } + } +} + +/* cutoff LJ with quadratic appximation of lj-potential */ +template +static inline void lennardJonesQuadraticPotential(const RealType c6, + const RealType c12, + const RealType r, + const RealType rsq, + const real lambdaFac, + const real dLambdaFac, + const RealType sigma6, + const RealType alphaEff, + const real repulsionShift, + const real dispersionShift, + RealType* force, + RealType* potential, + RealType* dvdl, + BoolType mask) +{ + constexpr real c_twentySixSeventh = 26.0 / 7.0; + constexpr real c_oneSixth = 1.0 / 6.0; + constexpr real c_oneTwelth = 1.0 / 12.0; + + /* check if we have to use the hardcore values */ + BoolType computeValues = mask && (lambdaFac < 1 && 0 < alphaEff); + if (gmx::anyTrue(computeValues)) + { + RealType lambdaFacRev = gmx::selectByMask(1.0 - lambdaFac, computeValues); + RealType lambdaFacRevInv = gmx::maskzInv(1.0 - lambdaFac, computeValues); + + RealType rQ = gmx::cbrt(c_twentySixSeventh * sigma6 * lambdaFacRev); + rQ = gmx::sqrt(rQ); + rQ = rQ * alphaEff; + + computeValues = (computeValues && r < rQ); + if (gmx::anyTrue(computeValues)) + { + /* scaled values for c6 and c12 */ + RealType c6s, c12s; + c6s = c_oneSixth * c6; + c12s = c_oneTwelth * c12; + /* Temporary variables for inverted values */ + RealType rInvQ = gmx::maskzInv(rQ, computeValues); + RealType rInv14C, rInv13C, rInv12C; + RealType rInv8C, rInv7C, rInv6C; + rInv6C = rInvQ * rInvQ * rInvQ; + rInv6C = rInv6C * rInv6C; + rInv7C = rInv6C * rInvQ; + rInv8C = rInv7C * rInvQ; + rInv14C = c12s * rInv7C * rInv7C * rsq; + rInv13C = c12s * rInv7C * rInv6C * r; + rInv12C = c12s * rInv6C * rInv6C; + rInv8C = rInv8C * c6s * rsq; + rInv7C = rInv7C * c6s * r; + rInv6C = rInv6C * c6s; + + /* Temporary variables for A and B */ + RealType quadrFac, linearFac, constFac; + quadrFac = 156. * rInv14C - 42. * rInv8C; + linearFac = 168. * rInv13C - 48. * rInv7C; + constFac = 91. * rInv12C - 28. * rInv6C; + + /* Computing LJ force and potential energy */ + RealType forceQuad = -quadrFac + linearFac; + RealType potentialQuad = 0.5 * quadrFac - linearFac + constFac; + RealType dvdlQuad = dLambdaFac * 28. * (lambdaFac * lambdaFacRevInv) + * ((6.5 * rInv14C - rInv8C) - (13. * rInv13C - 2. * rInv7C) + + (6.5 * rInv12C - rInv6C)); + + *potential = *potential + + gmx::selectByMask(((c12s * repulsionShift) - (c6s * dispersionShift)), + computeValues); + *force = gmx::blend(*force, forceQuad, computeValues); + *potential = gmx::blend(*potential, potentialQuad, computeValues); + *dvdl = *dvdl + gmx::selectByMask(dvdlQuad, computeValues); + } + } +} + +#endif diff --git a/src/gromacs/gmxlib/nonbonded/tests/nb_free_energy.cpp b/src/gromacs/gmxlib/nonbonded/tests/nb_free_energy.cpp index a4414ee716..6ced203827 100644 --- a/src/gromacs/gmxlib/nonbonded/tests/nb_free_energy.cpp +++ b/src/gromacs/gmxlib/nonbonded/tests/nb_free_energy.cpp @@ -229,12 +229,13 @@ class ForcerecHelper public: ForcerecHelper() { - fepVals_.sc_alpha = 0.3; - fepVals_.sc_power = 1; - fepVals_.sc_r_power = 6.0; - fepVals_.sc_sigma = 0.3; - fepVals_.sc_sigma_min = 0.3; - fepVals_.bScCoul = true; + fepVals_.sc_alpha = 0.3; + fepVals_.sc_power = 1; + fepVals_.sc_r_power = 6.0; + fepVals_.sc_sigma = 0.3; + fepVals_.sc_sigma_min = 0.3; + fepVals_.bScCoul = true; + fepVals_.softcoreFunction = SoftcoreType::Beutler; } //! initialize data structure to construct forcerec @@ -250,6 +251,11 @@ public: void setSoftcoreAlpha(const real scAlpha) { fepVals_.sc_alpha = scAlpha; } void setSoftcoreCoulomb(const bool scCoulomb) { fepVals_.bScCoul = scCoulomb; } + void setSoftcoreType(const SoftcoreType softcoreType) + { + fepVals_.softcoreFunction = softcoreType; + } + //! get forcerec data as wanted by the nonbonded kernel void getForcerec(t_forcerec* fr) @@ -392,7 +398,7 @@ public: }; class NonbondedFepTest : - public ::testing::TestWithParam, real, real, bool>> + public ::testing::TestWithParam, real, real, bool>> { protected: PaddedVector x_; @@ -400,16 +406,18 @@ protected: real lambda_; real softcoreAlpha_; bool softcoreCoulomb_; + SoftcoreType softcoreType_; TestReferenceData refData_; TestReferenceChecker checker_; NonbondedFepTest() : checker_(refData_.rootChecker()) { - input_ = std::get<0>(GetParam()); - x_ = std::get<1>(GetParam()); - lambda_ = std::get<2>(GetParam()); - softcoreAlpha_ = std::get<3>(GetParam()); - softcoreCoulomb_ = std::get<4>(GetParam()); + softcoreType_ = std::get<0>(GetParam()); + input_ = std::get<1>(GetParam()); + x_ = std::get<2>(GetParam()); + lambda_ = std::get<3>(GetParam()); + softcoreAlpha_ = std::get<4>(GetParam()); + softcoreCoulomb_ = std::get<5>(GetParam()); // Note that the reference data for Ewald type interactions has been generated // with accurate analytical approximations for the long-range corrections. @@ -424,6 +432,7 @@ protected: { input_.frHelper.setSoftcoreAlpha(softcoreAlpha_); input_.frHelper.setSoftcoreCoulomb(softcoreCoulomb_); + input_.frHelper.setSoftcoreType(softcoreType_); // get forcerec and interaction_const t_forcerec fr; @@ -495,6 +504,7 @@ std::vector c_interaction = { std::vector c_fepLambdas = { 0.0, 0.5, 1.0 }; std::vector c_softcoreAlphas = { 0.0, 0.3 }; std::vector c_softcoreCoulomb = { true, false }; +std::vector c_softcoreType = { SoftcoreType::Beutler, SoftcoreType::Gapsys, SoftcoreType::None }; //! Coordinates for testing std::vector> c_coordinates = { @@ -503,7 +513,8 @@ std::vector> c_coordinates = { INSTANTIATE_TEST_SUITE_P(NBInteraction, NonbondedFepTest, - ::testing::Combine(::testing::ValuesIn(c_interaction), + ::testing::Combine(::testing::ValuesIn(c_softcoreType), + ::testing::ValuesIn(c_interaction), ::testing::ValuesIn(c_coordinates), ::testing::ValuesIn(c_fepLambdas), ::testing::ValuesIn(c_softcoreAlphas), diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_100.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_100.xml new file mode 100644 index 0000000000..7fceee20e1 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_100.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -61.20791980865792 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -124.92756732472033 + -187.39135098708019 + 418.05399722550226 + + + -20.414068018344608 + -30.621102027516869 + -40.828136036689173 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 166.97728296873584 + 250.46592445310341 + -333.95456593747133 + + + + + -124.92756732472033 + -187.39135098708019 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_101.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_101.xml new file mode 100644 index 0000000000..7fceee20e1 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_101.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -61.20791980865792 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -124.92756732472033 + -187.39135098708019 + 418.05399722550226 + + + -20.414068018344608 + -30.621102027516869 + -40.828136036689173 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 166.97728296873584 + 250.46592445310341 + -333.95456593747133 + + + + + -124.92756732472033 + -187.39135098708019 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_102.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_102.xml new file mode 100644 index 0000000000..0223d66754 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_102.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -61.20791980865792 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -124.92756732472033 + -187.39135098708019 + 418.05399722550243 + + + -20.414068018344608 + -30.621102027516869 + -40.828136036689173 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 166.97728296873584 + 250.46592445310341 + -333.95456593747133 + + + + + -124.92756732472033 + -187.39135098708019 + 418.05399722550243 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_103.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_103.xml new file mode 100644 index 0000000000..7fceee20e1 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_103.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -61.20791980865792 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -124.92756732472033 + -187.39135098708019 + 418.05399722550226 + + + -20.414068018344608 + -30.621102027516869 + -40.828136036689173 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 166.97728296873584 + 250.46592445310341 + -333.95456593747133 + + + + + -124.92756732472033 + -187.39135098708019 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_104.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_104.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_104.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_105.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_105.xml new file mode 100644 index 0000000000..d2f265f2b8 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_105.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625468 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550243 + + + 0 + 0 + 0 + + + -84.099431288031028 + -126.14914693204661 + -168.19886257606206 + + + 124.92756732472033 + 187.39135098708022 + -249.85513464944037 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550243 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_106.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_106.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_106.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_107.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_107.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_107.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_36.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_36.xml new file mode 100644 index 0000000000..0f008000b9 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_36.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_37.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_37.xml new file mode 100644 index 0000000000..0f008000b9 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_37.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_38.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_38.xml new file mode 100644 index 0000000000..3956ccab6b --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_38.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 166.92179102684565 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_39.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_39.xml new file mode 100644 index 0000000000..3956ccab6b --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_39.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 166.92179102684565 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_40.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_40.xml new file mode 100644 index 0000000000..8ff39ee288 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_40.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -17.366932205547741 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + -47.449450973711002 + -71.1741764605664 + -94.898901947421891 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 219.44365377170627 + 329.16548065755893 + -438.88730754341202 + + + + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_41.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_41.xml new file mode 100644 index 0000000000..8ff39ee288 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_41.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -17.366932205547741 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + -47.449450973711002 + -71.1741764605664 + -94.898901947421891 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 219.44365377170627 + 329.16548065755893 + -438.88730754341202 + + + + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_42.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_42.xml new file mode 100644 index 0000000000..59cb56a152 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_42.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -25.250698539278318 + 180.76337086185185 + -6.2096985368142033 + + 4 + + -133.94299908103679 + -200.91449862155494 + 258.00271759748694 + + + -3.4637135578029787 + -5.1955703367044608 + -6.9274271156059495 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 131.4721789398902 + 197.20826840983503 + -262.94435787978011 + + + + + -133.94299908103679 + -200.91449862155494 + 258.00271759748694 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_43.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_43.xml new file mode 100644 index 0000000000..59cb56a152 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_43.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -25.250698539278318 + 180.76337086185185 + -6.2096985368142033 + + 4 + + -133.94299908103679 + -200.91449862155494 + 258.00271759748694 + + + -3.4637135578029787 + -5.1955703367044608 + -6.9274271156059495 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 131.4721789398902 + 197.20826840983503 + -262.94435787978011 + + + + + -133.94299908103679 + -200.91449862155494 + 258.00271759748694 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_44.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_44.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_44.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_45.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_45.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_45.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_46.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_46.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_46.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_47.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_47.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_47.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_48.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_48.xml new file mode 100644 index 0000000000..b5fed0eb0e --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_48.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_49.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_49.xml new file mode 100644 index 0000000000..b5fed0eb0e --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_49.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_50.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_50.xml new file mode 100644 index 0000000000..efd8456ee5 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_50.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 166.92179102684565 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_51.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_51.xml new file mode 100644 index 0000000000..efd8456ee5 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_51.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 166.92179102684565 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_52.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_52.xml new file mode 100644 index 0000000000..51292d93a7 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_52.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -17.366932205547741 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + -51.963391757537998 + -77.94508763630688 + -103.92678351507588 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 214.92971298787927 + 322.39456948181839 + -429.85942597575803 + + + + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_53.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_53.xml new file mode 100644 index 0000000000..51292d93a7 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_53.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -17.366932205547741 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + -51.963391757537998 + -77.94508763630688 + -103.92678351507588 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 214.92971298787927 + 322.39456948181839 + -429.85942597575803 + + + + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_54.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_54.xml new file mode 100644 index 0000000000..2e5feb0e29 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_54.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -25.250698539278318 + 180.76337086185185 + -5.4343542982235178 + + 4 + + -133.94299908103682 + -200.91449862155497 + 239.94695446217898 + + + -7.9776543416299788 + -11.96648151244495 + -15.95530868325994 + + + 14.962415266603525 + 22.443622899905296 + 29.92483053320705 + + + 126.95823815606323 + 190.43735723409455 + -253.91647631212618 + + + + + -133.94299908103682 + -200.91449862155497 + 239.94695446217898 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_55.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_55.xml new file mode 100644 index 0000000000..7a457919e6 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_55.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -25.250698539278318 + 180.76337086185185 + -5.4343542982235178 + + 4 + + -133.94299908103682 + -200.91449862155497 + 239.94695446217898 + + + -7.9776543416299788 + -11.96648151244495 + -15.95530868325994 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 126.95823815606323 + 190.43735723409455 + -253.91647631212618 + + + + + -133.94299908103682 + -200.91449862155497 + 239.94695446217898 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_56.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_56.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_56.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_57.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_57.xml new file mode 100644 index 0000000000..df3874b420 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_57.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762693 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762693 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_58.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_58.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_58.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_59.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_59.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_59.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_60.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_60.xml new file mode 100644 index 0000000000..47ea9c0230 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_60.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_61.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_61.xml new file mode 100644 index 0000000000..47ea9c0230 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_61.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_62.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_62.xml new file mode 100644 index 0000000000..af9e85beb5 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_62.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 38.840234756747122 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_63.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_63.xml new file mode 100644 index 0000000000..af9e85beb5 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_63.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 38.840234756747122 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_64.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_64.xml new file mode 100644 index 0000000000..4b877de28d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_64.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -61.20791980865792 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -124.92756732472033 + -187.39135098708019 + 418.05399722550231 + + + -20.414068018344608 + -30.621102027516869 + -40.828136036689173 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 166.97728296873584 + 250.46592445310341 + -333.95456593747133 + + + + + -124.92756732472033 + -187.39135098708019 + 418.05399722550231 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_65.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_65.xml new file mode 100644 index 0000000000..4b877de28d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_65.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -61.20791980865792 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -124.92756732472033 + -187.39135098708019 + 418.05399722550231 + + + -20.414068018344608 + -30.621102027516869 + -40.828136036689173 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 166.97728296873584 + 250.46592445310341 + -333.95456593747133 + + + + + -124.92756732472033 + -187.39135098708019 + 418.05399722550231 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_66.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_66.xml new file mode 100644 index 0000000000..ca44395c5b --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_66.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -69.091686142388497 + 52.681814591753323 + -7.1291612299081022 + + 4 + + -80.941829908812309 + -121.41274486321822 + 154.13957273005445 + + + 23.571669397563412 + 35.357504096345068 + 47.143338795126773 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 79.005808136919796 + 118.50871220537951 + -158.01161627383942 + + + + + -80.941829908812309 + -121.41274486321822 + 154.13957273005445 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_67.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_67.xml new file mode 100644 index 0000000000..ca44395c5b --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_67.xml @@ -0,0 +1,38 @@ + + + + 7.6802835669165956 + -69.091686142388497 + 52.681814591753323 + -7.1291612299081022 + + 4 + + -80.941829908812309 + -121.41274486321822 + 154.13957273005445 + + + 23.571669397563412 + 35.357504096345068 + 47.143338795126773 + + + -21.635647625670902 + -32.453471438506362 + -43.271295251341805 + + + 79.005808136919796 + 118.50871220537951 + -158.01161627383942 + + + + + -80.941829908812309 + -121.41274486321822 + 154.13957273005445 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_68.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_68.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_68.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_69.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_69.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_69.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_70.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_70.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_70.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_71.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_71.xml new file mode 100644 index 0000000000..60b2660c74 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_71.xml @@ -0,0 +1,38 @@ + + + + 4.1157029519625441 + -30.9842283945178 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + 0 + 0 + 0 + + + -84.099431288030971 + -126.14914693204652 + -168.19886257606194 + + + 124.92756732472027 + 187.39135098708013 + -249.85513464944029 + + + + + -40.828136036689301 + -61.242204055033611 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_72.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_72.xml new file mode 100644 index 0000000000..0f008000b9 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_72.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_73.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_73.xml new file mode 100644 index 0000000000..0f008000b9 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_73.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_74.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_74.xml new file mode 100644 index 0000000000..0f008000b9 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_74.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_75.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_75.xml new file mode 100644 index 0000000000..0f008000b9 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_75.xml @@ -0,0 +1,38 @@ + + + + 9.3145478052213058 + -111.63140175473714 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + -94.898901947422004 + -142.3483529211328 + -189.79780389484378 + + + 94.898901947421891 + 142.34835292113289 + 189.79780389484378 + + + 260.95857104646768 + 391.4378565697009 + -521.9171420929348 + + + + + -260.95857104646757 + -391.43785656970101 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_76.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_76.xml new file mode 100644 index 0000000000..8ff39ee288 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_76.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -17.366932205547741 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + -47.449450973711002 + -71.1741764605664 + -94.898901947421891 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 219.44365377170627 + 329.16548065755893 + -438.88730754341202 + + + + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_77.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_77.xml new file mode 100644 index 0000000000..8ff39ee288 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_77.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -17.366932205547741 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + -47.449450973711002 + -71.1741764605664 + -94.898901947421891 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 219.44365377170627 + 329.16548065755893 + -438.88730754341202 + + + + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_78.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_78.xml new file mode 100644 index 0000000000..8ff39ee288 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_78.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -17.366932205547741 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + -47.449450973711002 + -71.1741764605664 + -94.898901947421891 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 219.44365377170627 + 329.16548065755893 + -438.88730754341202 + + + + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_79.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_79.xml new file mode 100644 index 0000000000..8ff39ee288 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_79.xml @@ -0,0 +1,38 @@ + + + + 6.2096985368142033 + -17.366932205547741 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + -47.449450973711002 + -71.1741764605664 + -94.898901947421891 + + + 5.9345336989495747 + 8.9018005484243652 + 11.869067397899149 + + + 219.44365377170627 + 329.16548065755893 + -438.88730754341202 + + + + + -177.92873649694485 + -266.89310474541691 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_80.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_80.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_80.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_81.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_81.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_81.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_82.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_82.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_82.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_83.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_83.xml new file mode 100644 index 0000000000..b88870b03d --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_83.xml @@ -0,0 +1,38 @@ + + + + 3.1048492684071016 + 76.897537343641645 + 188.52893909837877 + -6.2096985368142033 + + 4 + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + 0 + 0 + 0 + + + -83.029834549522747 + -124.54475182428416 + -166.05966909904549 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -94.898901947422104 + -142.34835292113269 + 521.9171420929348 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_84.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_84.xml new file mode 100644 index 0000000000..b5fed0eb0e --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_84.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_85.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_85.xml new file mode 100644 index 0000000000..b5fed0eb0e --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_85.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_86.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_86.xml new file mode 100644 index 0000000000..b5fed0eb0e --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_86.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_87.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_87.xml new file mode 100644 index 0000000000..b5fed0eb0e --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_87.xml @@ -0,0 +1,38 @@ + + + + 8.1515314473352767 + -111.63140175473714 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + -103.926783515076 + -155.89017527261376 + -207.85356703015177 + + + 103.92678351507588 + 155.89017527261387 + 207.85356703015177 + + + 251.93068947881369 + 377.89603421822 + -503.86137895762681 + + + + + -251.93068947881358 + -377.89603421822011 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_88.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_88.xml new file mode 100644 index 0000000000..51292d93a7 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_88.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -17.366932205547741 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + -51.963391757537998 + -77.94508763630688 + -103.92678351507588 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 214.92971298787927 + 322.39456948181839 + -429.85942597575803 + + + + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_89.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_89.xml new file mode 100644 index 0000000000..51292d93a7 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_89.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -17.366932205547741 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + -51.963391757537998 + -77.94508763630688 + -103.92678351507588 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 214.92971298787927 + 322.39456948181839 + -429.85942597575803 + + + + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_90.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_90.xml new file mode 100644 index 0000000000..51292d93a7 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_90.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -17.366932205547741 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + -51.963391757537998 + -77.94508763630688 + -103.92678351507588 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 214.92971298787927 + 322.39456948181839 + -429.85942597575803 + + + + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_91.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_91.xml new file mode 100644 index 0000000000..51292d93a7 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_91.xml @@ -0,0 +1,38 @@ + + + + 5.4343542982235178 + -17.366932205547741 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + -51.963391757537998 + -77.94508763630688 + -103.92678351507588 + + + 14.962415266603566 + 22.443622899905357 + 29.924830533207132 + + + 214.92971298787927 + 322.39456948181839 + -429.85942597575803 + + + + + -177.92873649694485 + -266.89310474541685 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_92.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_92.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_92.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_93.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_93.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_93.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_94.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_94.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_94.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_95.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_95.xml new file mode 100644 index 0000000000..d050e9f1e2 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_95.xml @@ -0,0 +1,38 @@ + + + + 2.7171771491117589 + 76.897537343641645 + 188.52893909837877 + -5.4343542982235178 + + 4 + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + 0 + 0 + 0 + + + -74.001952981868754 + -111.00292947280317 + -148.00390596373751 + + + 177.92873649694485 + 266.89310474541685 + -355.8574729938893 + + + + + -103.9267835150761 + -155.89017527261367 + 503.86137895762681 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_96.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_96.xml new file mode 100644 index 0000000000..47ea9c0230 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_96.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_97.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_97.xml new file mode 100644 index 0000000000..47ea9c0230 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_97.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_98.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_98.xml new file mode 100644 index 0000000000..47ea9c0230 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_98.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_99.xml b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_99.xml new file mode 100644 index 0000000000..47ea9c0230 --- /dev/null +++ b/src/gromacs/gmxlib/nonbonded/tests/refdata/NBInteraction_NonbondedFepTest_testKernel_99.xml @@ -0,0 +1,38 @@ + + + + 11.244864181870648 + -91.43161122279804 + 60.44738282828024 + -7.1291612299081022 + + 4 + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + -40.828136036689216 + -61.242204055033739 + -81.656272073378346 + + + 40.828136036689173 + 61.242204055033781 + 81.656272073378346 + + + 209.02699861275138 + 313.54049791912661 + -418.05399722550226 + + + + + -209.02699861275136 + -313.54049791912666 + 418.05399722550226 + + + diff --git a/src/gromacs/gmxpreprocess/readir.cpp b/src/gromacs/gmxpreprocess/readir.cpp index 1286c79bf7..da337645e3 100644 --- a/src/gromacs/gmxpreprocess/readir.cpp +++ b/src/gromacs/gmxpreprocess/readir.cpp @@ -850,6 +850,26 @@ void check_ir(const char* mdparin, CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1)); } } + + if (fep->softcoreFunction == SoftcoreType::Gapsys) + { + if (fep->sc_alpha < 0.0) + { + sprintf(warn_buf, + "sc_alpha is equal %g but must be >= 0 when used with sc_function=gapsys.", + fep->sc_alpha); + warning_note(wi, warn_buf); + } + + if ((fep->sc_sigma < 0.0) || (fep->sc_sigma >= 1.0)) + { + sprintf(warn_buf, + "sc_sigma is equal %g but must be in [0,1) when used with " + "sc_function=gapsys.", + fep->sc_sigma); + warning_note(wi, warn_buf); + } + } } if ((ir->bSimTemp) || (ir->efep == FreeEnergyPerturbationType::Expanded)) @@ -2308,6 +2328,7 @@ void get_ir(const char* mdparin, fep->sc_r_power = get_ereal(&inp, "sc-r-power", 6.0, wi); fep->sc_sigma = get_ereal(&inp, "sc-sigma", 0.3, wi); fep->bScCoul = (getEnum(&inp, "sc-coul", wi) != Boolean::No); + fep->softcoreFunction = getEnum(&inp, "sc-function", wi); fep->dh_hist_size = get_eint(&inp, "dh_hist_size", 0, wi); fep->dh_hist_spacing = get_ereal(&inp, "dh_hist_spacing", 0.1, wi); fep->separate_dhdl_file = getEnum(&inp, "separate-dhdl-file", wi); diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsDefineParametersWithValuesIncludingAssignment.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsDefineParametersWithValuesIncludingAssignment.xml index c88c2aa792..62fa19cdb9 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsDefineParametersWithValuesIncludingAssignment.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsDefineParametersWithValuesIncludingAssignment.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricField.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricField.xml index 7b6968ea7c..469dd00cf9 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricField.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricField.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldOscillating.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldOscillating.xml index 4afc56f511..81a37d4db7 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldOscillating.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldOscillating.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldPulsed.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldPulsed.xml index 4aac61bfa2..932fdf5ba1 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldPulsed.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsElectricFieldPulsed.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsEmptyLines.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsEmptyLines.xml index 2f3bebf7c1..ce9b1c5e7b 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsEmptyLines.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsEmptyLines.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsImplicitSolventNo.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsImplicitSolventNo.xml index 2f3bebf7c1..ce9b1c5e7b 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsImplicitSolventNo.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsImplicitSolventNo.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsKeyWithoutValue.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsKeyWithoutValue.xml index 2f3bebf7c1..ce9b1c5e7b 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsKeyWithoutValue.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsKeyWithoutValue.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsMimic.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsMimic.xml index 54545d90e3..72691f18bc 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsMimic.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_AcceptsMimic.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_HandlesDifferentKindsOfMdpLines.xml b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_HandlesDifferentKindsOfMdpLines.xml index 136d8617e7..a7aa6c008c 100644 --- a/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_HandlesDifferentKindsOfMdpLines.xml +++ b/src/gromacs/gmxpreprocess/tests/refdata/GetIrTest_HandlesDifferentKindsOfMdpLines.xml @@ -254,6 +254,7 @@ sc-power = 1 sc-r-power = 6 sc-sigma = 0.3 sc-coul = no +sc-function = beutler separate-dhdl-file = yes dhdl-derivatives = yes dh_hist_size = 0 diff --git a/src/gromacs/listed_forces/pairs.cpp b/src/gromacs/listed_forces/pairs.cpp index c23c5f0a87..3bea5450e2 100644 --- a/src/gromacs/listed_forces/pairs.cpp +++ b/src/gromacs/listed_forces/pairs.cpp @@ -169,7 +169,9 @@ static inline real sixthRoot(const real r) } /*! \brief Compute the energy and force for a single pair interaction under FEP */ +template static real free_energy_evaluate_single(real r2, + real rCoulCutoff, const interaction_const_t::SoftCoreParameters& scParams, real tabscale, const real* vftab, @@ -180,6 +182,7 @@ static real free_energy_evaluate_single(real real qqB, real c6B, real c12B, + real facel, const real LFC[2], const real LFV[2], const real DLF[2], @@ -193,10 +196,13 @@ static real free_energy_evaluate_single(real { real rtab, eps, eps2, Y, F, Geps, Heps2, Fp, VV, FF, fscal; real qq[2], c6[2], c12[2], sigma6[2], sigma_pow[2]; - real alpha_coul_eff, alpha_vdw_eff, dvdl_coul, dvdl_vdw; + real alpha_coul_eff, alpha_vdw_eff, dvdl_coul_sum, dvdl_vdw_sum; real rpinv, r_coul, r_vdw, velecsum, vvdwsum; real fscal_vdw[2], fscal_elec[2]; real velec[2], vvdw[2]; + real dvdl_elec[2], dvdl_vdw[2]; + real rQ, rLJ; + real scaleDvdlRCoul; int i, ntab; const real half = 0.5_real; const real one = 1.0_real; @@ -211,38 +217,53 @@ static real free_energy_evaluate_single(real const real rpm2 = r2 * r2; /* r4 */ const real rp = rpm2 * r2; /* r6 */ + const real r = sqrt(r2); /* r1 */ /* Loop over state A(0) and B(1) */ for (i = 0; i < 2; i++) { - if ((c6[i] > 0) && (c12[i] > 0)) + if (softcoreType == SoftcoreType::Beutler || softcoreType == SoftcoreType::Gapsys) { - /* The c6 & c12 coefficients now contain the constants 6.0 and 12.0, respectively. - * Correct for this by multiplying with (1/12.0)/(1/6.0)=6.0/12.0=0.5. - */ - sigma6[i] = half * c12[i] / c6[i]; - if (sigma6[i] < scParams.sigma6Minimum) /* for disappearing coul and vdw with soft core at the same time */ + if ((c6[i] > 0) && (c12[i] > 0)) { - sigma6[i] = scParams.sigma6Minimum; + /* The c6 & c12 coefficients now contain the constants 6.0 and 12.0, respectively. + * Correct for this by multiplying with (1/12.0)/(1/6.0)=6.0/12.0=0.5. + */ + sigma6[i] = half * c12[i] / c6[i]; + if ((sigma6[i] < scParams.sigma6Minimum) && softcoreType == SoftcoreType::Beutler) /* for disappearing coul and vdw with soft core at the same time */ + { + sigma6[i] = scParams.sigma6Minimum; + } } + else + { + sigma6[i] = scParams.sigma6WithInvalidSigma; + } + sigma_pow[i] = sigma6[i]; } - else - { - sigma6[i] = scParams.sigma6WithInvalidSigma; - } - sigma_pow[i] = sigma6[i]; } - /* only use softcore if one of the states has a zero endstate - softcore is for avoiding infinities!*/ - if ((c12[0] > 0) && (c12[1] > 0)) - { - alpha_vdw_eff = 0; - alpha_coul_eff = 0; - } - else + if (softcoreType == SoftcoreType::Beutler || softcoreType == SoftcoreType::Gapsys) { - alpha_vdw_eff = scParams.alphaVdw; - alpha_coul_eff = scParams.alphaCoulomb; + /* only use softcore if one of the states has a zero endstate - softcore is for avoiding infinities!*/ + if ((c12[0] > 0) && (c12[1] > 0)) + { + alpha_vdw_eff = 0; + alpha_coul_eff = 0; + } + else + { + if (softcoreType == SoftcoreType::Beutler) + { + alpha_vdw_eff = scParams.alphaVdw; + alpha_coul_eff = scParams.alphaCoulomb; + } + else if (softcoreType == SoftcoreType::Gapsys) + { + alpha_vdw_eff = scParams.alphaVdw; + alpha_coul_eff = gmx::sixthroot(scParams.sigma6WithInvalidSigma); + } + } } /* Loop over A and B states again */ @@ -252,71 +273,172 @@ static real free_energy_evaluate_single(real fscal_vdw[i] = 0; velec[i] = 0; vvdw[i] = 0; + dvdl_elec[i] = 0; + dvdl_vdw[i] = 0; + rQ = 0; + rLJ = 0; /* Only spend time on A or B state if it is non-zero */ if ((qq[i] != 0) || (c6[i] != 0) || (c12[i] != 0)) { /* Coulomb */ - rpinv = one / (alpha_coul_eff * lfac_coul[i] * sigma_pow[i] + rp); - r_coul = sixthRoot(rpinv); - - /* Electrostatics table lookup data */ - rtab = r_coul * tabscale; - ntab = static_cast(rtab); - eps = rtab - ntab; - eps2 = eps * eps; - ntab = static_cast(tableStride * ntab); - /* Electrostatics */ - Y = vftab[ntab]; - F = vftab[ntab + 1]; - Geps = eps * vftab[ntab + 2]; - Heps2 = eps2 * vftab[ntab + 3]; - Fp = F + Geps + Heps2; - VV = Y + eps * Fp; - FF = Fp + Geps + two * Heps2; - velec[i] = qq[i] * VV; - fscal_elec[i] = -qq[i] * FF * r_coul * rpinv * tabscale; + if (softcoreType == SoftcoreType::Beutler) + { + rpinv = one / (alpha_coul_eff * lfac_coul[i] * sigma_pow[i] + rp); + r_coul = sixthRoot(rpinv); + } + else + { + rpinv = one / rp; + r_coul = r; + } + + if (softcoreType == SoftcoreType::Gapsys) + { + rQ = gmx::sixthroot(1. - LFC[i]) * (1. + std::fabs(qq[i] / facel)); + rQ *= alpha_coul_eff; + scaleDvdlRCoul = 1.0; + if (rQ > rCoulCutoff) + { + rQ = rCoulCutoff; + scaleDvdlRCoul = 0.0; + } + } + + if ((softcoreType == SoftcoreType::Gapsys) && (r < rQ)) + { + real rInvQ = 1.0 / rQ; + real constFac = qq[i] * rInvQ; + real linFac = constFac * r * rInvQ; + real quadrFac = linFac * r * rInvQ; + + /* Computing Coulomb force and potential energy */ + fscal_elec[i] = 2. * quadrFac - 3. * linFac; + fscal_elec[i] *= rpinv; + + velec[i] = quadrFac - 3. * (linFac - constFac); + + dvdl_elec[i] += scaleDvdlRCoul * DLF[i] * 0.5 * (LFC[i] / (1. - LFC[i])) + * (quadrFac - 2. * linFac + constFac); + } + else // Beutler, resp. hardcore + { + /* Electrostatics table lookup data */ + rtab = r_coul * tabscale; + ntab = static_cast(rtab); + eps = rtab - ntab; + eps2 = eps * eps; + ntab = static_cast(tableStride * ntab); + /* Electrostatics */ + Y = vftab[ntab]; + F = vftab[ntab + 1]; + Geps = eps * vftab[ntab + 2]; + Heps2 = eps2 * vftab[ntab + 3]; + Fp = F + Geps + Heps2; + VV = Y + eps * Fp; + FF = Fp + Geps + two * Heps2; + velec[i] = qq[i] * VV; + fscal_elec[i] = -qq[i] * FF * r_coul * rpinv * tabscale; + } /* Vdw */ - rpinv = one / (alpha_vdw_eff * lfac_vdw[i] * sigma_pow[i] + rp); - r_vdw = sixthRoot(rpinv); - /* Vdw table lookup data */ - rtab = r_vdw * tabscale; - ntab = static_cast(rtab); - eps = rtab - ntab; - eps2 = eps * eps; - ntab = 12 * ntab; - /* Dispersion */ - Y = vftab[ntab + 4]; - F = vftab[ntab + 5]; - Geps = eps * vftab[ntab + 6]; - Heps2 = eps2 * vftab[ntab + 7]; - Fp = F + Geps + Heps2; - VV = Y + eps * Fp; - FF = Fp + Geps + two * Heps2; - vvdw[i] = c6[i] * VV; - fscal_vdw[i] = -c6[i] * FF; - - /* Repulsion */ - Y = vftab[ntab + 8]; - F = vftab[ntab + 9]; - Geps = eps * vftab[ntab + 10]; - Heps2 = eps2 * vftab[ntab + 11]; - Fp = F + Geps + Heps2; - VV = Y + eps * Fp; - FF = Fp + Geps + two * Heps2; - vvdw[i] += c12[i] * VV; - fscal_vdw[i] -= c12[i] * FF; - fscal_vdw[i] *= r_vdw * rpinv * tabscale; + if (softcoreType == SoftcoreType::Beutler) + { + rpinv = one / (alpha_vdw_eff * lfac_vdw[i] * sigma_pow[i] + rp); + r_vdw = sixthRoot(rpinv); + } + else + { + rpinv = one / rp; + r_vdw = r; + } + + if (softcoreType == SoftcoreType::Gapsys) + { + constexpr real c_twentySixSeventh = 26.0 / 7.0; + + rLJ = gmx::sixthroot(c_twentySixSeventh * sigma6[i] * (1. - LFV[i])); + rLJ *= alpha_vdw_eff; + } + + if ((softcoreType == SoftcoreType::Gapsys) && (r < rLJ)) + { + // scaled values for c6 and c12 + real c6s, c12s; + c6s = c6[i] / 6.0; + c12s = c12[i] / 12.0; + + /* Temporary variables for inverted values */ + real rInvLJ = 1.0 / rLJ; + real rInv14, rInv13, rInv12; + real rInv8, rInv7, rInv6; + rInv6 = rInvLJ * rInvLJ * rInvLJ; + rInv6 *= rInv6; + rInv7 = rInv6 * rInvLJ; + rInv8 = rInv7 * rInvLJ; + rInv14 = c12s * rInv7 * rInv7 * r2; + rInv13 = c12s * rInv7 * rInv6 * r; + rInv12 = c12s * rInv6 * rInv6; + rInv8 *= c6s * r2; + rInv7 *= c6s * r; + rInv6 *= c6s; + + /* Temporary variables for A and B */ + real quadrFac, linearFac, constFac; + quadrFac = 156. * rInv14 - 42. * rInv8; + linearFac = 168. * rInv13 - 48. * rInv7; + constFac = 91. * rInv12 - 28. * rInv6; + + /* Computing LJ force and potential energy*/ + fscal_vdw[i] = quadrFac - linearFac; + fscal_vdw[i] *= rpinv; + + vvdw[i] = 0.5 * quadrFac - linearFac + constFac; + + dvdl_vdw[i] += DLF[i] * 28. * (LFV[i] / (1. - LFV[i])) + * ((6.5 * rInv14 - rInv8) - (13. * rInv13 - 2. * rInv7) + + (6.5 * rInv12 - rInv6)); + } + else // Beutler, resp. hardcore + { + /* Vdw table lookup data */ + rtab = r_vdw * tabscale; + ntab = static_cast(rtab); + eps = rtab - ntab; + eps2 = eps * eps; + ntab = 12 * ntab; + /* Dispersion */ + Y = vftab[ntab + 4]; + F = vftab[ntab + 5]; + Geps = eps * vftab[ntab + 6]; + Heps2 = eps2 * vftab[ntab + 7]; + Fp = F + Geps + Heps2; + VV = Y + eps * Fp; + FF = Fp + Geps + two * Heps2; + vvdw[i] = c6[i] * VV; + fscal_vdw[i] = -c6[i] * FF; + + /* Repulsion */ + Y = vftab[ntab + 8]; + F = vftab[ntab + 9]; + Geps = eps * vftab[ntab + 10]; + Heps2 = eps2 * vftab[ntab + 11]; + Fp = F + Geps + Heps2; + VV = Y + eps * Fp; + FF = Fp + Geps + two * Heps2; + vvdw[i] += c12[i] * VV; + fscal_vdw[i] -= c12[i] * FF; + fscal_vdw[i] *= r_vdw * rpinv * tabscale; + } } } /* Now we have velec[i], vvdw[i], and fscal[i] for both states */ /* Assemble A and B states */ - velecsum = 0; - vvdwsum = 0; - dvdl_coul = 0; - dvdl_vdw = 0; - fscal = 0; + velecsum = 0; + vvdwsum = 0; + dvdl_coul_sum = 0; + dvdl_vdw_sum = 0; + fscal = 0; for (i = 0; i < 2; i++) { velecsum += LFC[i] * velec[i]; @@ -324,14 +446,22 @@ static real free_energy_evaluate_single(real fscal += (LFC[i] * fscal_elec[i] + LFV[i] * fscal_vdw[i]) * rpm2; - dvdl_coul += velec[i] * DLF[i] - + LFC[i] * alpha_coul_eff * dlfac_coul[i] * fscal_elec[i] * sigma_pow[i]; - dvdl_vdw += vvdw[i] * DLF[i] - + LFV[i] * alpha_vdw_eff * dlfac_vdw[i] * fscal_vdw[i] * sigma_pow[i]; + if (softcoreType == SoftcoreType::Gapsys) + { + dvdl_coul_sum += dvdl_elec[i]; + dvdl_vdw_sum += dvdl_vdw[i]; + } + dvdl_coul_sum += velec[i] * DLF[i]; + dvdl_vdw_sum += vvdw[i] * DLF[i]; + if (softcoreType == SoftcoreType::Beutler) + { + dvdl_coul_sum += LFC[i] * alpha_coul_eff * dlfac_coul[i] * fscal_elec[i] * sigma_pow[i]; + dvdl_vdw_sum += LFV[i] * alpha_vdw_eff * dlfac_vdw[i] * fscal_vdw[i] * sigma_pow[i]; + } } - dvdl[static_cast(FreeEnergyPerturbationCouplingType::Coul)] += dvdl_coul; - dvdl[static_cast(FreeEnergyPerturbationCouplingType::Vdw)] += dvdl_vdw; + dvdl[static_cast(FreeEnergyPerturbationCouplingType::Coul)] += dvdl_coul_sum; + dvdl[static_cast(FreeEnergyPerturbationCouplingType::Vdw)] += dvdl_vdw_sum; *velectot = velecsum; *vvdwtot = vvdwsum; @@ -507,27 +637,84 @@ static real do_pairs_general(int ftype, c6B = iparams[itype].lj14.c6B * 6.0; c12B = iparams[itype].lj14.c12B * 12.0; - fscal = free_energy_evaluate_single(r2, - *fr->ic->softCoreParameters, - fr->pairsTable->scale, - fr->pairsTable->data.data(), - fr->pairsTable->stride, - qq, - c6, - c12, - qqB, - c6B, - c12B, - LFC, - LFV, - DLF, - lfac_coul, - lfac_vdw, - dlfac_coul, - dlfac_vdw, - &velec, - &vvdw, - dvdl); + if (fr->ic->softCoreParameters->softcoreType == SoftcoreType::Gapsys) + { + fscal = free_energy_evaluate_single(r2, + fr->ic->rcoulomb, + *fr->ic->softCoreParameters, + fr->pairsTable->scale, + fr->pairsTable->data.data(), + fr->pairsTable->stride, + qq, + c6, + c12, + qqB, + c6B, + c12B, + epsfac, + LFC, + LFV, + DLF, + lfac_coul, + lfac_vdw, + dlfac_coul, + dlfac_vdw, + &velec, + &vvdw, + dvdl); + } + else if (fr->ic->softCoreParameters->softcoreType == SoftcoreType::Beutler) + { + fscal = free_energy_evaluate_single(r2, + fr->ic->rcoulomb, + *fr->ic->softCoreParameters, + fr->pairsTable->scale, + fr->pairsTable->data.data(), + fr->pairsTable->stride, + qq, + c6, + c12, + qqB, + c6B, + c12B, + epsfac, + LFC, + LFV, + DLF, + lfac_coul, + lfac_vdw, + dlfac_coul, + dlfac_vdw, + &velec, + &vvdw, + dvdl); + } + else + { + fscal = free_energy_evaluate_single(r2, + fr->ic->rcoulomb, + *fr->ic->softCoreParameters, + fr->pairsTable->scale, + fr->pairsTable->data.data(), + fr->pairsTable->stride, + qq, + c6, + c12, + qqB, + c6B, + c12B, + epsfac, + LFC, + LFV, + DLF, + lfac_coul, + lfac_vdw, + dlfac_coul, + dlfac_vdw, + &velec, + &vvdw, + dvdl); + } } else { diff --git a/src/gromacs/listed_forces/tests/pairs.cpp b/src/gromacs/listed_forces/tests/pairs.cpp index 000aa958f9..c3a9416e90 100644 --- a/src/gromacs/listed_forces/tests/pairs.cpp +++ b/src/gromacs/listed_forces/tests/pairs.cpp @@ -163,12 +163,13 @@ class ForcerecHelper public: ForcerecHelper() { - fepVals_.sc_alpha = 0.3; - fepVals_.sc_power = 1; - fepVals_.sc_r_power = 6.0; - fepVals_.sc_sigma = 0.3; - fepVals_.sc_sigma_min = 0.3; - fepVals_.bScCoul = true; + fepVals_.sc_alpha = 0.3; + fepVals_.sc_power = 1; + fepVals_.sc_r_power = 6.0; + fepVals_.sc_sigma = 0.85; + fepVals_.sc_sigma_min = 0.3; + fepVals_.bScCoul = true; + fepVals_.softcoreFunction = SoftcoreType::Beutler; fr_.ic = std::make_unique(); // set data in ic @@ -314,7 +315,7 @@ protected: checker_.setDefaultTolerance(tolerance); } - void testOneIfunc(TestReferenceChecker* checker, const real lambda) + void testOneIfunc(TestReferenceChecker* checker, const real lambda, const SoftcoreType softcoreType) { SCOPED_TRACE(std::string("Testing PBC type: ") + c_pbcTypeNames[pbcType_]); @@ -338,6 +339,7 @@ protected: t_forcerec* fr = frHelper.get(); fr->efep = input_.fep ? FreeEnergyPerturbationType::Yes : FreeEnergyPerturbationType::No; + fr->ic->softCoreParameters->softcoreType = softcoreType; if (pbcType_ != PbcType::No) { fr->bMolPBC = true; @@ -418,14 +420,18 @@ protected: const int numLambdas = 3; for (int i = 0; i < numLambdas; ++i) { - const real lambda = i / (numLambdas - 1.0); - auto lambdaChecker = thisChecker.checkCompound("Lambda", toString(lambda)); - testOneIfunc(&lambdaChecker, lambda); + const real lambda = i / (numLambdas - 1.0); + for (SoftcoreType c : EnumerationWrapper{}) + { + auto lambdaChecker = thisChecker.checkCompound("Lambda", toString(lambda)); + auto softcoreChecker = lambdaChecker.checkCompound("Sofcore", enumValueToString(c)); + testOneIfunc(&softcoreChecker, lambda, c); + } } } else { - testOneIfunc(&thisChecker, 0.0); + testOneIfunc(&thisChecker, 0.0, SoftcoreType::None); } } }; diff --git a/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_0.xml b/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_0.xml index 9e4ad67034..c2b302ff50 100644 --- a/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_0.xml +++ b/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_0.xml @@ -4,97 +4,289 @@ - 0.21407271220614837 - -0.39771349695163671 - -0.21851037383566912 - 0.41875860652489377 - - 3 - - 0.030442842705220918 - 0.033210373860240998 - 0.035977905015261082 - - - 0.89301764058624677 - 1.7860352811724916 - 2.6790529217587382 - - - -0.92346048329146768 - -1.8192456550327325 - -2.7150308267739991 - - - - - 0 - 0 - 0 - - + + 0.21407271220614837 + -0.39771349695163671 + -0.21851037383566912 + 0.41875860652489377 + + 3 + + 0.030442842705220918 + 0.033210373860240998 + 0.035977905015261082 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -0.92346048329146768 + -1.8192456550327325 + -2.7150308267739991 + + + + + 0 + 0 + 0 + + + + + 0.21407271220614837 + -0.39771349695163671 + -0.21407271220614837 + 0.39771349695163671 + + 3 + + 0.030442842705220918 + 0.033210373860240998 + 0.035977905015261082 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -0.92346048329146768 + -1.8192456550327325 + -2.7150308267739991 + + + + + 0 + 0 + 0 + + + + + 0.21407271220614837 + -0.39771349695163671 + -0.21407271220614837 + 0.39771349695163671 + + 3 + + 0.030442842705220918 + 0.033210373860240998 + 0.035977905015261082 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -0.92346048329146768 + -1.8192456550327325 + -2.7150308267739991 + + + + + 0 + 0 + 0 + + + - 0.10595201107466379 - -0.19369895958475428 - -0.21402396676422034 - 0.39750692921973912 - - 3 - - 0.015221397582715825 - 0.016605160999326352 - 0.017988924415936882 - - - 0.42958890996342458 - 0.85917781992684816 - 1.2887667298902727 - - - -0.44481030754614043 - -0.87578298092617457 - -1.3067556543062095 - - - - - 0 - 0 - 0 - - + + 0.10595201107466379 + -0.19369895958475428 + -0.21402396676422034 + 0.39750692921973912 + + 3 + + 0.015221397582715825 + 0.016605160999326352 + 0.017988924415936882 + + + 0.42958890996342458 + 0.85917781992684816 + 1.2887667298902727 + + + -0.44481030754614043 + -0.87578298092617457 + -1.3067556543062095 + + + + + 0 + 0 + 0 + + + + + 0.07757616630348213 + -0.19885674847581836 + -0.17822475864411241 + 0.39771349695163671 + + 3 + + 0.015221421352610459 + 0.016605186930120499 + 0.017988952507630541 + + + 0.61465102353521561 + 1.2293020470704299 + 1.8439530706056453 + + + -0.62987244488782612 + -1.2459072340005504 + -1.8619420231132757 + + + + + 0 + 0 + 0 + + + + + 0.10703635610307419 + -0.19885674847581836 + -0.21407271220614837 + 0.39771349695163671 + + 3 + + 0.015221421352610459 + 0.016605186930120499 + 0.017988952507630541 + + + 0.44650882029312339 + 0.89301764058624578 + 1.3395264608793691 + + + -0.46173024164573384 + -0.90962282751636625 + -1.3575154133869995 + + + + + 0 + 0 + 0 + + + - 0 - 0 - -0.20983019696952224 - 0.37749364747323017 - - 3 - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - + + 0 + 0 + -0.20983019696952224 + 0.37749364747323017 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + -0.13872167738255298 + 0.39771349695163671 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + -0.21407271220614837 + 0.39771349695163671 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + diff --git a/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_1.xml b/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_1.xml index 1af29241e3..7ebc7e1a9e 100644 --- a/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_1.xml +++ b/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_1.xml @@ -4,97 +4,289 @@ - 0.1445520414957524 - -0.3979723893321509 - -0.14898844529427274 - 0.41901751034443802 - - 3 - - 0.010987624164811038 - 0.021975248329622051 - 0.14283911414254338 - - - 0.89301764058624677 - 1.7860352811724916 - 2.6790529217587382 - - - -0.9040052647510578 - -1.8080105295021136 - -2.8218920359012816 - - - - - -0.010987624164811038 - -0.021975248329622051 - -0.14283911414254338 - - + + 0.1445520414957524 + -0.3979723893321509 + -0.14898844529427274 + 0.41901751034443802 + + 3 + + 0.010987624164811038 + 0.021975248329622051 + 0.14283911414254338 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -0.9040052647510578 + -1.8080105295021136 + -2.8218920359012816 + + + + + -0.010987624164811038 + -0.021975248329622051 + -0.14283911414254338 + + + + + 0.1445520414957524 + -0.3979723893321509 + -0.1445520414957524 + 0.3979723893321509 + + 3 + + 0.010987624164811038 + 0.021975248329622051 + 0.14283911414254338 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -0.9040052647510578 + -1.8080105295021136 + -2.8218920359012816 + + + + + -0.010987624164811038 + -0.021975248329622051 + -0.14283911414254338 + + + + + 0.1445520414957524 + -0.3979723893321509 + -0.1445520414957524 + 0.3979723893321509 + + 3 + + 0.010987624164811038 + 0.021975248329622051 + 0.14283911414254338 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -0.9040052647510578 + -1.8080105295021136 + -2.8218920359012816 + + + + + -0.010987624164811038 + -0.021975248329622051 + -0.14283911414254338 + + + - 0.071191990173256878 - -0.19382840291531345 - -0.14450329606174245 - 0.39776582160013413 - - 3 - - 0.0054936782176173184 - 0.010987356435234625 - 0.07141781682902508 - - - 0.42958890996342458 - 0.85917781992684816 - 1.2887667298902727 - - - -0.4350825881810419 - -0.87016517636208279 - -1.3601845467192979 - - - - - -0.0054936782176173184 - -0.010987356435234625 - -0.07141781682902508 - - + + 0.071191990173256878 + -0.19382840291531345 + -0.14450329606174245 + 0.39776582160013413 + + 3 + + 0.0054936782176173184 + 0.010987356435234625 + 0.07141781682902508 + + + 0.42958890996342458 + 0.85917781992684816 + 1.2887667298902727 + + + -0.4350825881810419 + -0.87016517636208279 + -1.3601845467192979 + + + + + -0.0054936782176173184 + -0.010987356435234625 + -0.07141781682902508 + + + + + 0.042815830948284145 + -0.19898619466607545 + -0.10870408793371644 + 0.3979723893321509 + + 3 + + 0.0054938120824055189 + 0.010987624164811026 + 0.071419557071271692 + + + 0.61465102353521561 + 1.2293020470704299 + 1.8439530706056453 + + + -0.62014483561762113 + -1.2402896712352409 + -1.915372627676917 + + + + + -0.0054938120824055189 + -0.010987624164811026 + -0.071419557071271692 + + + + + 0.072276020747876202 + -0.19898619466607545 + -0.1445520414957524 + 0.3979723893321509 + + 3 + + 0.0054938120824055189 + 0.010987624164811026 + 0.071419557071271692 + + + 0.44650882029312339 + 0.89301764058624578 + 1.3395264608793691 + + + -0.4520026323755289 + -0.9040052647510568 + -1.4109460179506408 + + + + + -0.0054938120824055189 + -0.010987624164811026 + -0.071419557071271692 + + + - 0 - 0 - -0.14031078405845462 - 0.37775252841519097 - - 3 - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - + + 0 + 0 + -0.14031078405845462 + 0.37775252841519097 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + -0.069201006672157006 + 0.3979723893321509 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + -0.1445520414957524 + 0.3979723893321509 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + diff --git a/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_2.xml b/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_2.xml index c55987fc81..a5e1fff1ad 100644 --- a/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_2.xml +++ b/src/gromacs/listed_forces/tests/refdata/14Interaction_ListedForcesPairsTest_Ifunc_2.xml @@ -4,97 +4,289 @@ - -0.33407655239047818 - -0.79539132295421022 - 0.3385142675285866 - 0.83748154200529312 - - 3 - - 1.6088959673922179 - 3.2177919347844322 - 4.8266879021766504 - - - 0.89301764058624677 - 1.7860352811724916 - 2.6790529217587382 - - - -2.5019136079784645 - -5.0038272159569237 - -7.5057408239353887 - - - - - -1.6088959673922179 - -3.2177919347844322 - -4.8266879021766504 - - + + -0.33407655239047818 + -0.79539132295421022 + 0.3385142675285866 + 0.83748154200529312 + + 3 + + 1.6088959673922179 + 3.2177919347844322 + 4.8266879021766504 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -2.5019136079784645 + -5.0038272159569237 + -7.5057408239353887 + + + + + -1.6088959673922179 + -3.2177919347844322 + -4.8266879021766504 + + + + + -0.33407655239047818 + -0.79539132295421022 + 0.33407655239047818 + 0.79539132295421022 + + 3 + + 1.6088959673922179 + 3.2177919347844322 + 4.8266879021766504 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -2.5019136079784645 + -5.0038272159569237 + -7.5057408239353887 + + + + + -1.6088959673922179 + -3.2177919347844322 + -4.8266879021766504 + + + + + -0.33407655239047818 + -0.79539132295421022 + 0.33407655239047818 + 0.79539132295421022 + + 3 + + 1.6088959673922179 + 3.2177919347844322 + 4.8266879021766504 + + + 0.89301764058624677 + 1.7860352811724916 + 2.6790529217587382 + + + -2.5019136079784645 + -5.0038272159569237 + -7.5057408239353887 + + + + + -1.6088959673922179 + -3.2177919347844322 + -4.8266879021766504 + + + - -0.16595391778969223 - -0.38738008371883476 - 0.33402780694852929 - 0.79497818749041516 - - 3 - - 0.77157606087074149 - 1.5431521217414814 - 2.3147281826122228 - - - 0.42958890996342458 - 0.85917781992684816 - 1.2887667298902727 - - - -1.2011649708341661 - -2.4023299416683295 - -3.6034949125024953 - - - - - -0.77157606087074149 - -1.5431521217414814 - -2.3147281826122228 - - + + -0.16595391778969223 + -0.38738008371883476 + 0.33402780694852929 + 0.79497818749041516 + + 3 + + 0.77157606087074149 + 1.5431521217414814 + 2.3147281826122228 + + + 0.42958890996342458 + 0.85917781992684816 + 1.2887667298902727 + + + -1.2011649708341661 + -2.4023299416683295 + -3.6034949125024953 + + + + + -0.77157606087074149 + -1.5431521217414814 + -2.3147281826122228 + + + + + -0.12262214526217577 + -0.39769566147710511 + 0.27046205463933159 + 0.79539132295421022 + + 3 + + 0.48344354533118644 + 0.96688709066237177 + 1.4503306359935582 + + + 0.61465102353521561 + 1.2293020470704299 + 1.8439530706056453 + + + -1.0980945688664021 + -2.1961891377328016 + -3.2942837065992032 + + + + + -0.48344354533118644 + -0.96688709066237177 + -1.4503306359935582 + + + + + -0.16703827619523909 + -0.39769566147710511 + 0.33407655239047818 + 0.79539132295421022 + + 3 + + 0.80444798369610893 + 1.6088959673922161 + 2.4133439510883252 + + + 0.44650882029312339 + 0.89301764058624578 + 1.3395264608793691 + + + -1.2509568039892323 + -2.5019136079784619 + -3.7528704119676943 + + + + + -0.80444798369610893 + -1.6088959673922161 + -2.4133439510883252 + + + - 0 - 0 - 0.32983398364534788 - 0.75495162409282812 - - 3 - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - + + 0 + 0 + 0.32983398364534788 + 0.75495162409282812 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0.24565017842507153 + 0.79539132295421022 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0.33407655239047818 + 0.79539132295421022 + + 3 + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + diff --git a/src/gromacs/mdtypes/inputrec.cpp b/src/gromacs/mdtypes/inputrec.cpp index fa8a7804fa..87f03085e8 100644 --- a/src/gromacs/mdtypes/inputrec.cpp +++ b/src/gromacs/mdtypes/inputrec.cpp @@ -600,6 +600,7 @@ static void pr_fepvals(FILE* fp, int indent, const t_lambda* fep, gmx_bool bMDPf PD("dh-hist-spacing", fep->dh_hist_spacing); PS("separate-dhdl-file", enumValueToString(fep->separate_dhdl_file)); PS("dhdl-derivatives", enumValueToString(fep->dhdl_derivatives)); + PS("sc-function", enumValueToString(fep->softcoreFunction)); }; static void pr_pull(FILE* fp, int indent, const pull_params_t& pull) @@ -1346,6 +1347,7 @@ static void cmp_fepvals(FILE* fp, const t_lambda* fep1, const t_lambda* fep2, re cmp_bool(fp, "inputrec->fepvals->bScCoul", -1, fep1->bScCoul, fep1->bScCoul); cmpEnum(fp, "inputrec->separate_dhdl_file", fep1->separate_dhdl_file, fep2->separate_dhdl_file); cmpEnum(fp, "inputrec->dhdl_derivatives", fep1->dhdl_derivatives, fep2->dhdl_derivatives); + cmpEnum(fp, "inputrec->softcoreFunction", fep1->softcoreFunction, fep2->softcoreFunction); cmp_int(fp, "inputrec->dh_hist_size", -1, fep1->dh_hist_size, fep2->dh_hist_size); cmp_double(fp, "inputrec->dh_hist_spacing", -1, fep1->dh_hist_spacing, fep2->dh_hist_spacing, ftol, abstol); } diff --git a/src/gromacs/mdtypes/inputrec.h b/src/gromacs/mdtypes/inputrec.h index dd05d13952..aa40d516f0 100644 --- a/src/gromacs/mdtypes/inputrec.h +++ b/src/gromacs/mdtypes/inputrec.h @@ -143,6 +143,8 @@ struct t_lambda real sc_sigma_min = 0; //! Use softcore for the coulomb portion as well (default FALSE) bool bScCoul = false; + //! The specific soft-core function to use + SoftcoreType softcoreFunction = SoftcoreType::Beutler; //! Whether to print the dvdl term associated with this term; if it is not specified as separate, it is lumped with the FEP term gmx::EnumerationArray separate_dvdl; //! Whether to write a separate dhdl.xvg file note: NOT a gmx_bool, but an enum diff --git a/src/gromacs/mdtypes/interaction_const.cpp b/src/gromacs/mdtypes/interaction_const.cpp index 9353a24047..7463d3222b 100644 --- a/src/gromacs/mdtypes/interaction_const.cpp +++ b/src/gromacs/mdtypes/interaction_const.cpp @@ -53,7 +53,8 @@ interaction_const_t::SoftCoreParameters::SoftCoreParameters(const t_lambda& fepv alphaCoulomb(fepvals.bScCoul ? fepvals.sc_alpha : 0), lambdaPower(fepvals.sc_power), sigma6WithInvalidSigma(gmx::power6(fepvals.sc_sigma)), - sigma6Minimum(fepvals.bScCoul ? gmx::power6(fepvals.sc_sigma_min) : 0) + sigma6Minimum(fepvals.bScCoul ? gmx::power6(fepvals.sc_sigma_min) : 0), + softcoreType(fepvals.softcoreFunction) { // This is checked during tpr reading, so we can assert here GMX_RELEASE_ASSERT(fepvals.sc_r_power == 6.0, "We only support soft-core r-power 6"); diff --git a/src/gromacs/mdtypes/interaction_const.h b/src/gromacs/mdtypes/interaction_const.h index 0f377eb347..29c3255011 100644 --- a/src/gromacs/mdtypes/interaction_const.h +++ b/src/gromacs/mdtypes/interaction_const.h @@ -127,6 +127,8 @@ struct interaction_const_t real sigma6WithInvalidSigma; // Minimum value for sigma^6, used when soft-core is applied to Coulomb interactions real sigma6Minimum; + // soft-core function + SoftcoreType softcoreType; }; /* VdW */ diff --git a/src/gromacs/mdtypes/md_enums.cpp b/src/gromacs/mdtypes/md_enums.cpp index 38647e60b0..0c40e53857 100644 --- a/src/gromacs/mdtypes/md_enums.cpp +++ b/src/gromacs/mdtypes/md_enums.cpp @@ -288,6 +288,14 @@ const char* enumValueToString(SeparateDhdlFile enumValue) return separateDhdlFileNames[enumValue]; } +const char* enumValueToString(SoftcoreType enumValue) +{ + static constexpr gmx::EnumerationArray softcoreTypeNames = { + "beutler", "gapsys", "none" + }; + return softcoreTypeNames[enumValue]; +} + const char* enumValueToString(DhDlDerivativeCalculation enumValue) { static constexpr gmx::EnumerationArray dhdlDerivativeCalculationNames = { diff --git a/src/gromacs/mdtypes/md_enums.h b/src/gromacs/mdtypes/md_enums.h index a8ab709c5e..0bfb497cc4 100644 --- a/src/gromacs/mdtypes/md_enums.h +++ b/src/gromacs/mdtypes/md_enums.h @@ -605,6 +605,21 @@ enum class DhDlDerivativeCalculation : int //! String for DHDL derivatives const char* enumValueToString(DhDlDerivativeCalculation enumValue); +/*! \brief soft-core function \ + * + * Distinguishes between soft-core functions. + */ +enum class SoftcoreType : int +{ + Beutler, + Gapsys, + None, + Count, + Default = Beutler +}; +//! Strings for softcore function names +const char* enumValueToString(SoftcoreType enumValue); + /*! \brief Solvent model * * Distinguishes classical water types with 3 or 4 particles -- 2.22.0