• Build libzstd using cmake; add a non-cmake build profile?

    From Peter Pentchev@21:1/5 to All on Mon Dec 26 07:50:01 2022
    Hi,

    In #1020403 there is a request to install the CMake build glue for
    the zstd library in its -dev package. I think that this is a good
    idea, and I have a pretty much ready-for-uploading set of changes
    that do that. For the purposes of this discussion I have uploaded
    the proposed "switch to CMake and install the CMake build glue"
    commits to my own fork of the libzstd repository at
    https://salsa.debian.org/roam/libzstd

    The main thing that gave me a bit of a pause before running
    `dgit push-source` (and *thanks* for making it that easy!) is that
    right now libzstd is effectively an essential package (ObXThread:
    not in the Policy sense) since dpkg pre-depends on it to support
    e.g. recent Ubuntu debs that use zstd as the compression method for
    the data part of the package. So... if I introduce a build-time
    dependency on CMake, this will probably create a non-trivial dependency
    loop for people who try to bootstrap Debian onto new architectures.
    Does this mean that it would be best for me to include an e.g. stage1
    build profile that does not build-depend on cmake and falls back to
    the old/current way of building directly using `make`?

    Hm, but if I do that, it seems that it might be best to put the CMake
    build glue files into a separate package and make libzstd-dev depend on
    that new package in the <!stage1> case, since IIUC the stage1 build
    profile is not allowed to change the contents of a binary package, so
    I cannot simply drop all the files in the /usr/lib/<arch>/cmake/ directory. That's not a big hurdle; if people say that this is the way to go, then
    this is what will be done.

    Many thanks to all the people who keep working on all the tools and
    toolchains that make this message make sense at all!

    G'luck,
    Peter

    --
    Peter Pentchev roam@ringlet.net roam@debian.org pp@storpool.com
    PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
    Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEELuenpRf8EkzxFcNUZR7vsCUn3xMFAmOpQToACgkQZR7vsCUn 3xPObQ//WjD5FXEWI1QsMmW334pqQ6Id4dtmELfPNIXdRyyTap2XMdc/t2Fz0Cp3 oXnRPwcRPLTfEH6oFvyYMct5GAC9jwAyhveh0AMk8mJSM/QxvoZtaTPbj6ttQ0Pf VdlXzYFT/cVcDXZR0QyIApWfH73xv4k41pVJI+1zRE2M96AdavA9Nux73wiNzSVi 4uFyH5MYFJixiZz2bf21cgOttccM+aNbVvKisBQFSvPB8oDP1AECF8zxYi7B0MNF cMeu/FP9yC3T19ii47Qr2wxWVuy2ufEzGw/ArrrawnrcN2SEXD7KjXj4x6CxuJlT runaL18w0rqxdUDGSpX4ykCWm89fu3hpXxvRflhtvqwhSUx2Ug4x/SlucjoV05zx Edn1a1NePPLhtR343Jzr3UxKz9LTI6YKm9Sq2RZx6cRFgZiEM2PF2iahxar+lIKx a8wvxdOGJXLh7lNX5nFfgIuF8fbJ9AS7GABP1fLWZI0Ft1a1dMyOz/aGRRKDYH5f Xc3ur3vVju96WhKPQelGFqDfuhA+4qv1K8k+g6MiC0d814jQeSPDMXTL5qXiZ3An j0G7gbadmK2mTSXA4uk0yCawaufJ6HpbWIfHg3xKgllVhuhWV37cwpDCFS7w8Fhu +mm/fos2HvXiCQd2+VYplKg4jEOIKCnmb2oI8RPmfieHIGWu4RE=
    =tByc
    -
  • From Timo =?utf-8?Q?R=C3=B6hling?=@21:1/5 to All on Mon Dec 26 10:10:02 2022
    * Peter Pentchev <roam@ringlet.net> [2022-12-26 08:37]:
    Hi,

    In #1020403 there is a request to install the CMake build glue for
    the zstd library in its -dev package. I think that this is a good
    idea, and I have a pretty much ready-for-uploading set of changes
    that do that. For the purposes of this discussion I have uploaded
    the proposed "switch to CMake and install the CMake build glue"
    commits to my own fork of the libzstd repository at
    https://salsa.debian.org/roam/libzstd

    The main thing that gave me a bit of a pause before running
    `dgit push-source` (and *thanks* for making it that easy!) is that
    right now libzstd is effectively an essential package (ObXThread:
    not in the Policy sense) since dpkg pre-depends on it to support
    e.g. recent Ubuntu debs that use zstd as the compression method for
    the data part of the package. So... if I introduce a build-time
    dependency on CMake, this will probably create a non-trivial dependency
    loop for people who try to bootstrap Debian onto new architectures.
    Does this mean that it would be best for me to include an e.g. stage1
    build profile that does not build-depend on cmake and falls back to
    the old/current way of building directly using `make`?

    Hm, but if I do that, it seems that it might be best to put the CMake
    build glue files into a separate package and make libzstd-dev depend on
    that new package in the <!stage1> case, since IIUC the stage1 build
    profile is not allowed to change the contents of a binary package, so
    I cannot simply drop all the files in the /usr/lib/<arch>/cmake/ directory. >That's not a big hurdle; if people say that this is the way to go, then
    this is what will be done.

    Many thanks to all the people who keep working on all the tools and >toolchains that make this message make sense at all!

    I appreciate your concern for the implications for the Debian
    ecosystem as a whole; in this particular case, I believe I can put
    your mind at ease: cmake has a bootstrap profile already, because
    dependency loops have come up before (e.g. libjsoncpp).

    I am Cc'ing debian-cross in case I overlooked something important,
    but I am reasonably sure that you need not deal with this issue in
    libzstd.


    Cheers
    Timo

    --
    ⢀⣴⠾⠻⢶⣦⠀ ╭────────────────────────────────────────────────────╮
    ⣾⠁⢠⠒⠀⣿⡁ │ Timo Röhling │
    ⢿⡄⠘⠷⠚⠋⠀ │ 9B03 EBB9 8300 DF97 C2B1 23BF CC8C 6BDD 1403 F4CA │
    ⠈⠳⣄⠀⠀⠀⠀ ╰────────────────────────────────────────────────────╯

    -----BEGIN PGP SIGNATURE-----

    iQGzBAEBCgAdFiEEJvtDgpxjkjCIVtam+C8H+466LVkFAmOpZH8ACgkQ+C8H+466 LVmvbgv+N5zl+rGQkXrQhdOLCsYEOvukoaYWDOV4YjofJGqCYs6DZr+5AqaCQyQ9 dZjB//xyypQFx9PBUqtrJ3RWG7ZFlK4OI6XsgmPfsooAuaECWzJoyBls2sVzhQGS 3nFfNv94uX0Keqxx9bpOL+/wFYu9bzy+lDlCpoETLwZSGotKpIhIi3l1zwBvSISF dUzrHLyFDXXiIWKfr58NT/o6hjzZhbASuRUd0moNSIiyq/IFGNjYWFb/eIqZ6Cj0 oXuM5sRojLwg0B6s7LCut4Jnac2VfpRNoaWF0JWi0rpCT1GJzP62xNaph5cCn+9/ sHUoyP2cblraPVY485HRQX2Q9sQ7CLwlrQE5WIFqB9z
  • From Peter Pentchev@21:1/5 to Peter Pentchev on Mon Dec 26 09:40:01 2022
    On Mon, Dec 26, 2022 at 08:37:51AM +0200, Peter Pentchev wrote:
    Hi,

    In #1020403 there is a request to install the CMake build glue for
    the zstd library in its -dev package. I think that this is a good
    idea, and I have a pretty much ready-for-uploading set of changes
    that do that. For the purposes of this discussion I have uploaded
    the proposed "switch to CMake and install the CMake build glue"
    commits to my own fork of the libzstd repository at
    https://salsa.debian.org/roam/libzstd

    The main thing that gave me a bit of a pause before running
    `dgit push-source` (and *thanks* for making it that easy!) is that
    right now libzstd is effectively an essential package (ObXThread:
    not in the Policy sense) since dpkg pre-depends on it to support
    e.g. recent Ubuntu debs that use zstd as the compression method for
    the data part of the package. So... if I introduce a build-time
    dependency on CMake, this will probably create a non-trivial dependency
    loop for people who try to bootstrap Debian onto new architectures.
    Does this mean that it would be best for me to include an e.g. stage1
    build profile that does not build-depend on cmake and falls back to
    the old/current way of building directly using `make`?

    Hm, but if I do that, it seems that it might be best to put the CMake
    build glue files into a separate package and make libzstd-dev depend on
    that new package in the <!stage1> case, since IIUC the stage1 build
    profile is not allowed to change the contents of a binary package, so
    I cannot simply drop all the files in the /usr/lib/<arch>/cmake/ directory. That's not a big hurdle; if people say that this is the way to go, then
    this is what will be done.

    Many thanks to all the people who keep working on all the tools and toolchains that make this message make sense at all!

    Hm, I just thought of a hybrid solution, but I don't think it would be
    a really, really good idea: keep the non-cmake build, but also invoke
    cmake with a modified lists file so that it *only* generates the build
    glue; then still put that in a separate package, all of that governed
    by a !stage1 build profile. I'm not sure I like it a lot, since that
    would mean that the shipped library is not actually compiled using CMake,
    so one might say the cmake build glue is a lie... but it could be
    an option if people think it's best.

    G'luck,
    Peter

    --
    Peter Pentchev roam@ringlet.net roam@debian.org pp@storpool.com
    PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
    Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEELuenpRf8EkzxFcNUZR7vsCUn3xMFAmOpW9AACgkQZR7vsCUn 3xMMtA/9Hwgxb2SAMGAs0hD5DRK0oxwOPCb2lkw1Azaxndk7bZTvZrt9KUqgnWyT cW0Zos+WiJL+VV+VtIuL/dI1QyDCD3hm5oOCtJd+Gk5nAP09uNK+dknNlDdmpb7A bUZDqDEfmiFESCO8EU4lBYPpWYJ+qGqjCTyxt2GEFZuzguFsQBRloNyp7QkF10ip wys1P4uNtrlUb6IynFWoJtmo30tj8U/4OS/1tz/ZvVa90SPCbvkzJY4VUJ3A7Pz3 UJZ4nFvaVp7/CN7RwOYWIwxhsDgSjt2xJWpGjXaqByN/kruQrVwrJksvwtAErwAw 8KF9MMbReLvvdbZLVjq4GoBlhqQCDamzMcyuIU7tCEW7fRtFaV4VtkiatR7HRrRR afLsXvkQQZ7Dg+gUaDcJA9ER70LbeBnBzTMRvItevYzZtGZneKujQFNSnmFonJDx kpFNGZaytNI4T1G1l6HpVvt4YayMCKdES47z6U4RIhsPu4uLlizanJEEB0V7Qztk YfJljNDqO5tU07IJIOvG5S0DXxs6BTKXtmCSlM765U+wrwEFMcyoJ9kLeYjflCb8 c3dexbVPPy5E9GURqNZxdffTKNzSYlLM4AsdtF+v8SIkCW/bTK0CJt5fmus44e+g IeDXkKgqqNJtoaWvcnZwjjy0DtBS9NUz5l99bB6PgY0xGc9LPQ4=
    =UjT2
    -
  • From Andrea Pappacoda@21:1/5 to All on Mon Dec 26 14:20:02 2022
    Il giorno lun 26 dic 2022 alle 08:37:51 +02:00:00, Peter Pentchev <roam@ringlet.net> ha scritto:
    In #1020403 there is a request to install the CMake build glue for
    the zstd library in its -dev package. I think that this is a good
    idea, and I have a pretty much ready-for-uploading set of changes
    that do that. For the purposes of this discussion I have uploaded
    the proposed "switch to CMake and install the CMake build glue"
    commits to my own fork of the libzstd repository

    Hi Peter. Apart from your bootstrapping concerns, please keep in mind
    that upstream's CMake build script is not official; citing the README:

    make is the officially maintained build system of this project. All
    other build systems are "compatible" and 3rd-party maintained, they may
    feature small differences in advanced options. When your system allows
    it, prefer using make to build zstd and libzstd.

    Using CMake instead of make has caused some interesting issues in the
    past. The first that comes to my mind happened in Arch Linux, and got
    featured on the Phoronix news site: <https://www.phoronix.com/news/Arch-Linux-Bizarre-Zstd>

    Since the make build generates a pkg-config file, you could look into leveraging that instead. You could either send a patch to the CMake
    projects using libzstd adding a Find module which calls
    pkg_search_module(), as mentioned in #1020403, or patch zstd's
    makefiles to install a small Find module itself (this is not really a
    good practice, as ideally upstreams should install CMake Config files,
    but should work nonetheless). Alternatively, you could even submit a
    patch to CMake adding The Find module there; CMake already ships a lot
    of them.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Peter Pentchev@21:1/5 to Andrea Pappacoda on Mon Dec 26 15:30:01 2022
    On Mon, Dec 26, 2022 at 02:00:31PM +0100, Andrea Pappacoda wrote:
    Il giorno lun 26 dic 2022 alle 08:37:51 +02:00:00, Peter Pentchev <roam@ringlet.net> ha scritto:
    In #1020403 there is a request to install the CMake build glue for
    the zstd library in its -dev package. I think that this is a good
    idea, and I have a pretty much ready-for-uploading set of changes
    that do that. For the purposes of this discussion I have uploaded
    the proposed "switch to CMake and install the CMake build glue"
    commits to my own fork of the libzstd repository

    Hi Peter. Apart from your bootstrapping concerns, please keep in mind that upstream's CMake build script is not official; citing the README:

    make is the officially maintained build system of this project. All other
    build systems are "compatible" and 3rd-party maintained, they may feature small differences in advanced options. When your system allows it, prefer using make to build zstd and libzstd.

    Yes, I am aware of this, and I do take additional care to make sure that
    things work as expected. Still, thanks for mentioning this, and see below...

    Using CMake instead of make has caused some interesting issues in the past. The first that comes to my mind happened in Arch Linux, and got featured on the Phoronix news site: <https://www.phoronix.com/news/Arch-Linux-Bizarre-Zstd>

    Right... thanks for reminding me of that! I had indeed noticed a couple of days ago that the CMake build differed in a couple of minor ways from the Makefile one
    and I had made a mental note to fix that... and then I forgot. There were two main differences: legacy support and setting the C standard. The former is now handled via a CMake config option passed via `dh_auto_configure`, and the latter is
    disabled with a patch taken from the upstream development branch, although in my (limited) testing there was no effect on the compression speed, at least with
    the GCC version in Debian unstable as of now.

    G'luck,
    Peter

    --
    Peter Pentchev roam@ringlet.net roam@debian.org pp@storpool.com
    PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
    Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEELuenpRf8EkzxFcNUZR7vsCUn3xMFAmOprpUACgkQZR7vsCUn 3xNmNA//bsDW9lqWsHaXdQK0edIloIXfqJ8hAi8lvCfRZB+2FHDFv6IXtVgavxGz 0UaRceAlz/7myVNJkPIgV3V8OA8jtBd+f4N1bVy71M4RrupDYUOVhAOmhiq97+jF GfRV/u13U3uSCj3HHnx9reYwuzEnocsE806De+MtH00dWEj6YvxdjRERH2sQqD2Q nzl15eUlVsIXPWknlQSCNIUEpQCb7lrx+A9et2T1o97O7jF3+tgkl9wd8TqM0ZT6 cloEl6khWB5gpqQXF3kv9vcGjTIrTwZzgVNhsQwWRAm9QK4mKW027QvAj7zhZJwy S1HjPaJCLKFg0VBqYAA9TBNhvJqQC8XstZzZ4S347Jp9EgVd3QWRdjDJsvYo3h6U kxlNwbyb0KcnJn9w1QLfsih4SZQz4GVriEKiaBVxL+0ELKPC1SsIcS/1p/cT2j+D JesPd6bNvjami0HpAhITRZvq5/3zdpRbam9IPsbHy0ciVad27tAy3i5YLFMorvEG d0JECOZwXhaDopzdpo2VTmxKdzi8B3LkJuNVL442xcoPigVMM/9HG3cPtL9QExTg Z2ZbmjH72nUrCEFU6faXvz28gBqe3PXLlhlCXNL2kYh7MgXZXEHoA5ixO1fv4KWC 7Ar++aHwp5y/92znp9NsfGZAPgAoxVr4OsfLEBQtYTr+gkY/GWE=
    =YVZe
    -
  • From Simon McVittie@21:1/5 to Andrea Pappacoda on Mon Dec 26 17:40:01 2022
    On Mon, 26 Dec 2022 at 14:00:31 +0100, Andrea Pappacoda wrote:
    or patch zstd's makefiles to install a small Find
    module itself (this is not really a good practice, as ideally upstreams should install CMake Config files, but should work nonetheless).

    If you're considering patching zstd's makefiles, I believe the preferred
    route is to install CMake "config modules" containing an imported target,
    like dbus and libsdl2 do. The one in dbus is a reasonably simple example
    of wrapping a pkg-config module with a CMake config module, while the one
    in libsdl2 bypasses pkg-config and provides the equivalent information
    more directly. Either way, this is something that would make sense to contribute upstream.

    Both dbus and libsdl2 have optional-but-not-recommended CMake build
    systems, similar to zstd, which we don't use in Debian; we follow upstream recommendations to build dbus with Autotools (in older branches) or Meson
    (in the 1.15.x development branch), and libsdl2 with Autotools. The
    Autotools and Meson build systems for those projects also install a
    simplified CMake config module, which can be consumed by CMake projects
    in the same way as if dbus/libsdl2 had themselves been built with CMake.
    The CMake config module is generated from a template using @variable@ substitutions.

    In older versions of libsdl2 the config module is not completely compatible with what its CMake build system would have installed, but the one in
    bookworm should be reasonably feature-complete.

    If dependent projects are expected to call find_package(Foo), then the
    CMake config module should be installed as either ${libdir}/cmake/Foo/FooConfig{,Version}.cmake in mixed-case (like dbus
    does) or ${libdir}/cmake/Foo/foo-config{,-version}.cmake in lower-case
    (like libsdl2 does). I don't know whether one of those is preferred over
    the other.

    It is a good idea to have a test for each supported use-case in the
    package's autopkgtests. dbus and libsdl2 have some tests for this which
    might make useful inspiration.

    smcv

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Helmut Grohne@21:1/5 to All on Mon Dec 26 22:50:01 2022
    Hi Timo,

    On Mon, Dec 26, 2022 at 10:08:18AM +0100, Timo Rhling wrote:
    I appreciate your concern for the implications for the Debian
    ecosystem as a whole; in this particular case, I believe I can put
    your mind at ease: cmake has a bootstrap profile already, because
    dependency loops have come up before (e.g. libjsoncpp).

    I am Cc'ing debian-cross in case I overlooked something important,
    but I am reasonably sure that you need not deal with this issue in
    libzstd.

    I think you can drop debian-cross@l.d.o again.

    There are two major ways of bootstrapping. It's the cross bootstrap
    (which is what I work on) and the native bootstrap (mostly Daniel
    Schepler). On debian-cross we mostly care about cross bootstrap
    (surprise!). Since cmake is marked Multi-Arch: foreign, we can (almost)
    always B-D on it without negatively impacting cross builds.

    What probably is impacted by this dependency is native bootstrap. My understanding of native bootstrap is too limited to explain how (severe)
    it is impacted. Since apt Build-Depends: cmake, it already is entangled
    in some way. I'd hope that adding another cmake dependency is not ending
    the world.

    If you want to add a build profile, do not use stage1. This profile has
    become meaningless and is thus deprecated. We are moving to functional
    build profiles. Use pkg.libzstd.nocmake or something even more
    descriptive.

    Last but not least, I second the idea of improving cmake such that it
    can deal with pkg-config files.

    Helmut

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Peter Pentchev@21:1/5 to Simon McVittie on Tue Dec 27 22:20:01 2022
    On Mon, Dec 26, 2022 at 04:35:09PM +0000, Simon McVittie wrote:
    On Mon, 26 Dec 2022 at 14:00:31 +0100, Andrea Pappacoda wrote:
    or patch zstd's makefiles to install a small Find
    module itself (this is not really a good practice, as ideally upstreams should install CMake Config files, but should work nonetheless).

    Thanks to everyone for the great discussion and several pieces of very
    helpful advice! In the end I decided to go with the "small lie" approach that
    I mentioned in a previous message: run dh_auto_configure --buildsystem=cmake
    so that CMake can create the zstdConfig*.cmake and zstdTargets*.cmake files that it would install, then run the normal Makefile build, and in the end install the CMake build glue files generated at configure time. Yes, this is not perfect, inasmuch as the *.cmake files do not *really* correspond to
    the built libraries, but I think it will serve for now (and see below).

    If you're considering patching zstd's makefiles, I believe the preferred route is to install CMake "config modules" containing an imported target, like dbus and libsdl2 do. The one in dbus is a reasonably simple example
    of wrapping a pkg-config module with a CMake config module, while the one
    in libsdl2 bypasses pkg-config and provides the equivalent information
    more directly. Either way, this is something that would make sense to contribute upstream.

    Both dbus and libsdl2 have optional-but-not-recommended CMake build
    systems, similar to zstd, which we don't use in Debian; we follow upstream recommendations to build dbus with Autotools (in older branches) or Meson
    (in the 1.15.x development branch), and libsdl2 with Autotools. The
    Autotools and Meson build systems for those projects also install a simplified CMake config module, which can be consumed by CMake projects
    in the same way as if dbus/libsdl2 had themselves been built with CMake.
    The CMake config module is generated from a template using @variable@ substitutions.

    This - building a trivial zstdConfig.cmake file during the standard build -
    is a great idea that I will try to implement and pitch to the libzstd upstream developers. Thanks!

    In older versions of libsdl2 the config module is not completely compatible with what its CMake build system would have installed, but the one in bookworm should be reasonably feature-complete.

    If dependent projects are expected to call find_package(Foo), then the
    CMake config module should be installed as either ${libdir}/cmake/Foo/FooConfig{,Version}.cmake in mixed-case (like dbus
    does) or ${libdir}/cmake/Foo/foo-config{,-version}.cmake in lower-case
    (like libsdl2 does). I don't know whether one of those is preferred over
    the other.

    Yeah, I imagine that the fake zstdConfig.cmake file would be installed in
    the same place and under the same name as the one that the (not completely suppored) CMake build system for libzstd already installs.

    It is a good idea to have a test for each supported use-case in the
    package's autopkgtests. dbus and libsdl2 have some tests for this which
    might make useful inspiration.

    Right, I have autopkgtests that compile trivial programs for other
    library packages, I don't know why I didn't add one (and now, it seems,
    at least two) for libzstd when I adopted it. Thanks again for the idea!

    Once again, thanks to everyone for the relevant critique and helpful suggestions!

    G'luck,
    Peter

    --
    Peter Pentchev roam@ringlet.net roam@debian.org pp@storpool.com
    PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
    Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEELuenpRf8EkzxFcNUZR7vsCUn3xMFAmOrYHEACgkQZR7vsCUn 3xNlORAAsF7hmAdwzph6JHRj3/v2olYhcgr3lfP1zNLSqcy5xBXMUrwb+BtMum48 VfrUzQuDpPz6ga7EIlzn4U8zm4Yfrfeh532Zwjny8yLrC/8hD42yjnt8QJQklkw2 JS0veLji7j2SU5OQk8Hn0/nBQlu2XQ9tKHK1lh1lv1moQ/Ess365m27i/f+8Hfcu s7VkWL7gDcQLw5WOeNtn1xJS4YlgusGQavH0Vyg/Bf7k9pypHBVORNjDBx8d7vm/ RoNvT511e/zXHKOK4tk0GWSLcOxnIMEnAbvMT38cvBQwQEwCj0JymPYL9fr1g1YU f1NaDKW+eCUeEPXOmngdIPL/f2DDZYI4QKK7EIYYf4LO+VvlGwpE3T0zTXeWl4rv pfSC5V1K/oVmZ1tEfk0aIL1S9SjONI7rTEXm0YCHZRIuWKnovFcUKemLOPTh4/Ng PTjey8sWSrCS2Li4GYV+Ah6fj9Vwh4dRUtNFOSrxx4yc0roncyxGHf/9AHCY3rxx 762Nmsn6eSUL16Vw4EXGgseeIS0h//3V24EqIrMFUzjnuFDr1KPT6ilPSIVXv3MY eZuabz5cKDrDdkw4XZlDuqo5OUIr0YD8nddH/Bz+Fn3NC8WEWdDKofLAqExLzELK afUmgQUL92szttd3YI5g5xNXXIOTPNeIO2LMSAOrkj8GMnGMAcE=
    =k3Uo
    -