summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/changelog8
-rw-r--r--debian/libapr1t64.lintian-overrides1
-rw-r--r--debian/patches/debug_testpoll_failure.patch6
-rw-r--r--debian/patches/fix-atomics-some-more.patch190
-rw-r--r--debian/patches/fix-atomics.patch34
-rw-r--r--debian/patches/fix_doxygen.patch6
-rw-r--r--debian/patches/hurd_path_max.patch2
-rw-r--r--debian/patches/hurd_shm_flock.patch6
-rw-r--r--debian/patches/series1
-rw-r--r--debian/upstream/signing-key.asc250
10 files changed, 279 insertions, 225 deletions
diff --git a/debian/changelog b/debian/changelog
index 644540a..716ac83 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+apr (1.7.5-1) unstable; urgency=medium
+
+ * New usptream version
+ - CVE-2023-49582: Unexpected lax shared memory permissions
+ Closes: #1080375
+
+ -- Stefan Fritsch <sf@debian.org> Sat, 07 Sep 2024 11:01:36 +0200
+
apr (1.7.2-3.2~progress7.99u1) graograman-backports; urgency=medium
* Uploading to graograman-updates, remaining changes:
diff --git a/debian/libapr1t64.lintian-overrides b/debian/libapr1t64.lintian-overrides
new file mode 100644
index 0000000..d6c7183
--- /dev/null
+++ b/debian/libapr1t64.lintian-overrides
@@ -0,0 +1 @@
+libapr1t64: package-name-doesnt-match-sonames libapr-1-0
diff --git a/debian/patches/debug_testpoll_failure.patch b/debian/patches/debug_testpoll_failure.patch
index 721e030..a555063 100644
--- a/debian/patches/debug_testpoll_failure.patch
+++ b/debian/patches/debug_testpoll_failure.patch
@@ -4,8 +4,8 @@
# add some debug output
--- apr.orig/test/testpoll.c
+++ apr/test/testpoll.c
-@@ -908,6 +908,9 @@ static void justsleep(abts_case *tc, voi
- rv = apr_pollcb_poll(pollcb, apr_time_from_msec(200), NULL, NULL);
+@@ -924,6 +924,9 @@ static void justsleep(abts_case *tc, voi
+ rv = apr_pollcb_poll(pollcb, JUSTSLEEP_DELAY, NULL, NULL);
t2 = apr_time_now();
ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));
+ if ((t2 - t1) <= apr_time_from_msec(100))
@@ -13,4 +13,4 @@
+ i, (long)t1, (long)t2, rv);
ABTS_ASSERT(tc,
"apr_pollcb_poll() didn't sleep",
- (t2 - t1) > apr_time_from_msec(100));
+ JUSTSLEEP_ENOUGH(t1, t2));
diff --git a/debian/patches/fix-atomics-some-more.patch b/debian/patches/fix-atomics-some-more.patch
deleted file mode 100644
index 786a9c3..0000000
--- a/debian/patches/fix-atomics-some-more.patch
+++ /dev/null
@@ -1,190 +0,0 @@
-# upstream trunk r1907541, r1907637, r1907642, r1907677, r1907678
---- apr.orig/atomic/unix/mutex64.c
-+++ apr/atomic/unix/mutex64.c
-@@ -96,7 +96,14 @@ apr_status_t apr__atomic_generic64_init(
-
- APR_DECLARE(apr_uint64_t) apr_atomic_read64(volatile apr_uint64_t *mem)
- {
-- return *mem;
-+ apr_uint64_t cur_value;
-+ DECLARE_MUTEX_LOCKED(mutex, mem);
-+
-+ cur_value = *mem;
-+
-+ MUTEX_UNLOCK(mutex);
-+
-+ return cur_value;
- }
-
- APR_DECLARE(void) apr_atomic_set64(volatile apr_uint64_t *mem, apr_uint64_t val)
---- apr.orig/atomic/unix/builtins.c
-+++ apr/atomic/unix/builtins.c
-@@ -18,10 +18,11 @@
-
- #ifdef USE_ATOMICS_BUILTINS
-
--#if defined(__arm__) || defined(__powerpc__) || defined(__powerpc64__)
--#define WEAK_MEMORY_ORDERING 1
--#else
-+#if defined(__i386__) || defined(__x86_64__) \
-+ || defined(__s390__) || defined(__s390x__)
- #define WEAK_MEMORY_ORDERING 0
-+#else
-+#define WEAK_MEMORY_ORDERING 1
- #endif
-
- APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p)
---- apr.orig/atomic/unix/builtins64.c
-+++ apr/atomic/unix/builtins64.c
-@@ -18,17 +18,18 @@
-
- #ifdef USE_ATOMICS_BUILTINS64
-
--#if defined(__arm__) || defined(__powerpc__) || defined(__powerpc64__)
--#define WEAK_MEMORY_ORDERING 1
--#else
-+#if defined(__i386__) || defined(__x86_64__) \
-+ || defined(__s390__) || defined(__s390x__)
- #define WEAK_MEMORY_ORDERING 0
-+#else
-+#define WEAK_MEMORY_ORDERING 1
- #endif
-
- APR_DECLARE(apr_uint64_t) apr_atomic_read64(volatile apr_uint64_t *mem)
- {
- #if HAVE__ATOMIC_BUILTINS64
- return __atomic_load_n(mem, __ATOMIC_SEQ_CST);
--#elif WEAK_MEMORY_ORDERING
-+#elif WEAK_MEMORY_ORDERING || APR_SIZEOF_VOIDP < 8
- /* No __sync_load() available => apr_atomic_add64(mem, 0) */
- return __sync_fetch_and_add(mem, 0);
- #else
-@@ -40,7 +41,7 @@ APR_DECLARE(void) apr_atomic_set64(volat
- {
- #if HAVE__ATOMIC_BUILTINS64
- __atomic_store_n(mem, val, __ATOMIC_SEQ_CST);
--#elif WEAK_MEMORY_ORDERING
-+#elif WEAK_MEMORY_ORDERING || APR_SIZEOF_VOIDP < 8
- /* No __sync_store() available => apr_atomic_xchg64(mem, val) */
- __sync_synchronize();
- __sync_lock_test_and_set(mem, val);
---- apr.orig/configure.in
-+++ apr/configure.in
-@@ -552,31 +552,35 @@ AC_CACHE_CHECK([whether the compiler pro
- [AC_TRY_RUN([
- #if HAVE_STDINT_H
- #include <stdint.h>
-+typedef uint64_t u64_t;
-+#else
-+typedef unsigned long long u64_t;
- #endif
- int main(int argc, const char *const *argv)
- {
--#if HAVE_STDINT_H
-- uint64_t val = 1010, tmp, *mem = &val;
--#else
-- unsigned long long val = 1010, tmp, *mem = &val;
--#endif
-+ struct {
-+ char pad0;
-+ u64_t val;
-+ } s;
-+ u64_t *mem = &s.val, tmp;
-
-- if (__sync_fetch_and_add(&val, 1010) != 1010 || val != 2020)
-+ s.val = 1010;
-+ if (__sync_fetch_and_add(&s.val, 1010) != 1010 || s.val != 2020)
- return 1;
-
-- tmp = val;
-- if (__sync_fetch_and_sub(mem, 1010) != tmp || val != 1010)
-+ tmp = s.val;
-+ if (__sync_fetch_and_sub(mem, 1010) != tmp || s.val != 1010)
- return 1;
-
-- if (__sync_sub_and_fetch(&val, 1010) != 0 || val != 0)
-+ if (__sync_sub_and_fetch(&s.val, 1010) != 0 || s.val != 0)
- return 1;
-
- tmp = 3030;
-- if (__sync_val_compare_and_swap(mem, 0, tmp) != 0 || val != tmp)
-+ if (__sync_val_compare_and_swap(mem, 0, tmp) != 0 || s.val != tmp)
- return 1;
-
- __sync_synchronize();
-- if (__sync_lock_test_and_set(&val, 4040) != 3030)
-+ if (__sync_lock_test_and_set(&s.val, 4040) != 3030)
- return 1;
-
- return 0;
-@@ -586,31 +590,45 @@ AC_CACHE_CHECK([whether the compiler pro
- [AC_TRY_RUN([
- #if HAVE_STDINT_H
- #include <stdint.h>
-+typedef uint64_t u64_t;
-+#else
-+typedef unsigned long long u64_t;
- #endif
-+static int test_always_lock_free(volatile u64_t *val)
-+{
-+ return __atomic_always_lock_free(sizeof(*val), val);
-+}
- int main(int argc, const char *const *argv)
- {
--#if HAVE_STDINT_H
-- uint64_t val = 1010, tmp, *mem = &val;
--#else
-- unsigned long long val = 1010, tmp, *mem = &val;
--#endif
-+ struct {
-+ char pad0;
-+ u64_t val;
-+ char pad1;
-+ u64_t tmp;
-+ } s;
-+ u64_t *mem = &s.val;
-+
-+ /* check if alignment matters (no fallback to libatomic) */
-+ if (!test_always_lock_free(&s.val))
-+ return 1;
-
-- if (__atomic_fetch_add(&val, 1010, __ATOMIC_SEQ_CST) != 1010 || val != 2020)
-+ s.val = 1010;
-+ if (__atomic_fetch_add(&s.val, 1010, __ATOMIC_SEQ_CST) != 1010 || s.val != 2020)
- return 1;
-
-- tmp = val;
-- if (__atomic_fetch_sub(mem, 1010, __ATOMIC_SEQ_CST) != tmp || val != 1010)
-+ s.tmp = s.val;
-+ if (__atomic_fetch_sub(mem, 1010, __ATOMIC_SEQ_CST) != s.tmp || s.val != 1010)
- return 1;
-
-- if (__atomic_sub_fetch(&val, 1010, __ATOMIC_SEQ_CST) != 0 || val != 0)
-+ if (__atomic_sub_fetch(&s.val, 1010, __ATOMIC_SEQ_CST) != 0 || s.val != 0)
- return 1;
-
-- tmp = val;
-- if (!__atomic_compare_exchange_n(mem, &tmp, 3030, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
-- || tmp != 0)
-+ s.tmp = s.val;
-+ if (!__atomic_compare_exchange_n(mem, &s.tmp, 3030, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
-+ || s.tmp != 0)
- return 1;
-
-- if (__atomic_exchange_n(&val, 4040, __ATOMIC_SEQ_CST) != 3030)
-+ if (__atomic_exchange_n(&s.val, 4040, __ATOMIC_SEQ_CST) != 3030)
- return 1;
-
- return 0;
---- apr.orig/test/testatomic.c
-+++ apr/test/testatomic.c
-@@ -662,6 +662,9 @@ static void test_atomics_threaded64(abts
- pthread_setconcurrency(8);
- #endif
-
-+ mutex_locks64 = 0;
-+ apr_atomic_set64(&atomic_ops64, 0);
-+
- rv = apr_thread_mutex_create(&thread_lock64, APR_THREAD_MUTEX_DEFAULT, p);
- APR_ASSERT_SUCCESS(tc, "Could not create lock", rv);
-
diff --git a/debian/patches/fix-atomics.patch b/debian/patches/fix-atomics.patch
index 2c519e7..81813ba 100644
--- a/debian/patches/fix-atomics.patch
+++ b/debian/patches/fix-atomics.patch
@@ -1,39 +1,25 @@
# upstream trunk commits r1907442, r1907441
---- apr.orig/atomic/unix/builtins.c
-+++ apr/atomic/unix/builtins.c
-@@ -26,7 +26,11 @@
-
- APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p)
- {
-+#if defined (NEED_ATOMICS_GENERIC64)
-+ return apr__atomic_generic64_init(p);
-+#else
- return APR_SUCCESS;
-+#endif
- }
-
- APR_DECLARE(apr_uint32_t) apr_atomic_read32(volatile apr_uint32_t *mem)
--- apr.orig/atomic/unix/builtins64.c
+++ apr/atomic/unix/builtins64.c
-@@ -26,7 +26,7 @@
+@@ -27,7 +27,7 @@
APR_DECLARE(apr_uint64_t) apr_atomic_read64(volatile apr_uint64_t *mem)
{
-#if HAVE__ATOMIC_BUILTINS
+#if HAVE__ATOMIC_BUILTINS64
return __atomic_load_n(mem, __ATOMIC_SEQ_CST);
- #elif WEAK_MEMORY_ORDERING
+ #elif WEAK_MEMORY_ORDERING || APR_SIZEOF_VOIDP < 8
/* No __sync_load() available => apr_atomic_add64(mem, 0) */
-@@ -38,7 +38,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_rea
+@@ -39,7 +39,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_rea
APR_DECLARE(void) apr_atomic_set64(volatile apr_uint64_t *mem, apr_uint64_t val)
{
-#if HAVE__ATOMIC_BUILTINS
+#if HAVE__ATOMIC_BUILTINS64
__atomic_store_n(mem, val, __ATOMIC_SEQ_CST);
- #elif WEAK_MEMORY_ORDERING
+ #elif WEAK_MEMORY_ORDERING || APR_SIZEOF_VOIDP < 8
/* No __sync_store() available => apr_atomic_xchg64(mem, val) */
-@@ -51,7 +51,7 @@ APR_DECLARE(void) apr_atomic_set64(volat
+@@ -52,7 +52,7 @@ APR_DECLARE(void) apr_atomic_set64(volat
APR_DECLARE(apr_uint64_t) apr_atomic_add64(volatile apr_uint64_t *mem, apr_uint64_t val)
{
@@ -42,7 +28,7 @@
return __atomic_fetch_add(mem, val, __ATOMIC_SEQ_CST);
#else
return __sync_fetch_and_add(mem, val);
-@@ -60,7 +60,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_add
+@@ -61,7 +61,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_add
APR_DECLARE(void) apr_atomic_sub64(volatile apr_uint64_t *mem, apr_uint64_t val)
{
@@ -51,7 +37,7 @@
__atomic_fetch_sub(mem, val, __ATOMIC_SEQ_CST);
#else
__sync_fetch_and_sub(mem, val);
-@@ -69,7 +69,7 @@ APR_DECLARE(void) apr_atomic_sub64(volat
+@@ -70,7 +70,7 @@ APR_DECLARE(void) apr_atomic_sub64(volat
APR_DECLARE(apr_uint64_t) apr_atomic_inc64(volatile apr_uint64_t *mem)
{
@@ -60,7 +46,7 @@
return __atomic_fetch_add(mem, 1, __ATOMIC_SEQ_CST);
#else
return __sync_fetch_and_add(mem, 1);
-@@ -78,7 +78,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_inc
+@@ -79,7 +79,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_inc
APR_DECLARE(int) apr_atomic_dec64(volatile apr_uint64_t *mem)
{
@@ -69,7 +55,7 @@
return __atomic_sub_fetch(mem, 1, __ATOMIC_SEQ_CST);
#else
return __sync_sub_and_fetch(mem, 1);
-@@ -88,7 +88,7 @@ APR_DECLARE(int) apr_atomic_dec64(volati
+@@ -89,7 +89,7 @@ APR_DECLARE(int) apr_atomic_dec64(volati
APR_DECLARE(apr_uint64_t) apr_atomic_cas64(volatile apr_uint64_t *mem, apr_uint64_t val,
apr_uint64_t cmp)
{
@@ -78,7 +64,7 @@
__atomic_compare_exchange_n(mem, &cmp, val, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
return cmp;
#else
-@@ -98,7 +98,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_cas
+@@ -99,7 +99,7 @@ APR_DECLARE(apr_uint64_t) apr_atomic_cas
APR_DECLARE(apr_uint64_t) apr_atomic_xchg64(volatile apr_uint64_t *mem, apr_uint64_t val)
{
diff --git a/debian/patches/fix_doxygen.patch b/debian/patches/fix_doxygen.patch
index cba7489..35606a9 100644
--- a/debian/patches/fix_doxygen.patch
+++ b/debian/patches/fix_doxygen.patch
@@ -18,7 +18,7 @@ Subject: Fix generation of docs for out-of-tree builds and newer doxygen version
FILE_PATTERNS=*.h
--- apr.orig/include/apr.h.in
+++ apr/include/apr.h.in
-@@ -464,11 +464,11 @@ typedef apr_uint32_t apr_uin
+@@ -473,11 +473,11 @@ typedef apr_uint32_t apr_uin
/**
* Thread callbacks from APR functions must be declared with APR_THREAD_FUNC,
* so that they follow the platform's calling convention.
@@ -34,7 +34,7 @@ Subject: Fix generation of docs for out-of-tree builds and newer doxygen version
*/
#define APR_THREAD_FUNC @apr_thread_func@
-@@ -502,11 +502,11 @@ typedef apr_uint32_t apr_uin
+@@ -511,11 +511,11 @@ typedef apr_uint32_t apr_uin
* APR_DECLARE_NONSTD(), as they must follow the C language calling convention.
* @see APR_DECLARE @see APR_DECLARE_DATA
* @remark Both the declaration and implementations must use the same macro.
@@ -50,7 +50,7 @@ Subject: Fix generation of docs for out-of-tree builds and newer doxygen version
*/
#define APR_DECLARE_NONSTD(type) type
-@@ -517,12 +517,12 @@ typedef apr_uint32_t apr_uin
+@@ -526,12 +526,12 @@ typedef apr_uint32_t apr_uin
* @remark Note that the declaration and implementations use different forms,
* but both must include the macro.
*
diff --git a/debian/patches/hurd_path_max.patch b/debian/patches/hurd_path_max.patch
index b333eb6..d5f8015 100644
--- a/debian/patches/hurd_path_max.patch
+++ b/debian/patches/hurd_path_max.patch
@@ -7,7 +7,7 @@ Subject: #349418
--- apr.orig/include/apr.h.in
+++ apr/include/apr.h.in
-@@ -629,7 +629,8 @@ typedef int apr_wait_t;
+@@ -638,7 +638,8 @@ typedef int apr_wait_t;
#elif defined(_POSIX_PATH_MAX)
#define APR_PATH_MAX _POSIX_PATH_MAX
#else
diff --git a/debian/patches/hurd_shm_flock.patch b/debian/patches/hurd_shm_flock.patch
index 5f1919f..bd5ea16 100644
--- a/debian/patches/hurd_shm_flock.patch
+++ b/debian/patches/hurd_shm_flock.patch
@@ -10,7 +10,7 @@ Bug: #656880
--- apr.orig/configure.in
+++ apr/configure.in
-@@ -1375,6 +1375,13 @@ case $host in
+@@ -1464,6 +1464,13 @@ case $host in
APR_DECISION_OVERRIDE(USE_SHMEM_SHMGET_ANON)
;;
esac
@@ -24,7 +24,7 @@ Bug: #656880
APR_END_DECISION
AC_DEFINE_UNQUOTED($ac_decision)
-@@ -1452,6 +1459,13 @@ case $host in
+@@ -1548,6 +1555,13 @@ case $host in
APR_DECISION_OVERRIDE(USE_SHMEM_SHMGET)
;;
esac
@@ -38,7 +38,7 @@ Bug: #656880
APR_END_DECISION
AC_DEFINE_UNQUOTED($ac_decision)
-@@ -2511,6 +2525,12 @@ esac
+@@ -2608,6 +2622,12 @@ esac
if test "x$apr_lock_method" != "x"; then
APR_DECISION_FORCE($apr_lock_method)
fi
diff --git a/debian/patches/series b/debian/patches/series
index a8badec..8abedf9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -11,4 +11,3 @@ debug_testpoll_failure.patch
use_fcntl_locking.patch
python3-hashbang.patch
fix-atomics.patch
-fix-atomics-some-more.patch
diff --git a/debian/upstream/signing-key.asc b/debian/upstream/signing-key.asc
index ead11cc..55d1933 100644
--- a/debian/upstream/signing-key.asc
+++ b/debian/upstream/signing-key.asc
@@ -753,3 +753,253 @@ ftgVGFvrwm/4EWpVIYZRWC511IIBF9p48/ijXJLKC7mzsPQX4KdtuTyORo9EnK8Y
Tk+1Bg==
=9S3w
-----END PGP PUBLIC KEY BLOCK-----
+ASF ID: covener
+LDAP PGP key: 65B2 D44F E74B D5E3 DE3A C3F0 8278 1DE4 6D59 54FA
+
+65B2 D44F E74B D5E3 DE3A C3F0 8278 1DE4 6D59 54FA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBEsCKnYBEACb/ldlhkVPPopZa4HvQhckhpQCQBE105N6Q7IPpzq9djl4K9QH
+TVSOvnhTd0s3J+7bB08jsYbaN2xMLLLZxjGW+EsQppXIsrY6K0m/aJfAb7MtdgoM
+a/r9G5r04hQtRcc4ivMVHnFemM0A2sls56wUwVI9OHC2BPwBSoacTwSFOwwV4mSB
+XivBkRPfIFVk8iaH3G4Zc8/KxgoPXJxX6rQ3AZxx0ad7hh6FKGgNxgOKNTwkQoZn
+hj7edM0KlSkzQ8O9asRx27H/8Vv5oRP8tsy0VYSR/FPzny3cJfOhyw3px/mZSOhq
+loAOLtTqBkvyTC+888rfMJDlozWEKqNeallzTTBQ38Y6iSskNMihpp6RXAiStrYO
+oO/OlqBuSxXvplI3EWilIvEkzpzyWt/uiQnmclGSU6uhLMKby96QpfWOQaa9CIJQ
+liMth7eisGKci4z7lom0q//fPQpbKIqk0bhFZeQeld01Ozy+s0rhZA1CD0P/e4yk
+0nQVPPMih9wiYKvdr8lO+cLSt7Ugme1JX0l5jP3JyomiLPNEfyeWGpwO8d4YSSoF
+UVJctLKBw1UR3rCwladOcf1iriqtwOfpy3wPtrxByxU4jBIR0stcpIhkMs1Qfde0
+RT6POBpPlNrGBoiOXwAAQv8zqy/z7yiTDhYTvWqSx/J5rpkKdxvvg6l/KwARAQAB
+tCFFcmljIENvdmVuZXIgPGNvdmVuZXJAYXBhY2hlLm9yZz6IRgQQEQoABgUCTNIc
+xwAKCRCR0+t4+K6606etAJ9JUdInQThMRW5CcBH8/Pacwgda5ACgr8gvuQf1EkBg
+K58SwrOt0lx2sLqIdQQQEQIANQUCTOJSoi4cSmVhbi1TZWJhc3RpZW4gRGVsZmlu
+byA8anNkZWxmaW5vQGFwYWNoZS5vcmc+AAoJEKR9Hi3QHg4YtswAoIj238Jwspzp
+1VJ6jdF03OTym+uTAJ4+G5xZO8b00Yjnfx0YSyjFvOiCzIjKBBARAgCKBQJM0rRD
+HxxKaW0gSmFnaWVsc2tpIDxqaW1AYXBhY2hlLm9yZz4gHEppbSBKYWdpZWxza2kg
+PGppbUBqYWd1TkVULmNvbT4fHEppbSBKYWdpZWxza2kgPGppbUBqaW1qYWcuY29t
+PiIcSmltIEphZ2llbHNraSA8amltakBjb3ZhbGVudC5uZXQ+AAoJEIs6YB8IyXXl
+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
+kUB1vVNJvIL29/HjPSFbCZWPGFlBulwSw1YNRIxa/msV95WdvygbauaR40Rpy3Ve
+OZKUm7JR+wPbbq5XHK1SK0rQmCllPwM7FqSgk3Lqs5/DrNFlXtUuk/3ZP3fTJ4MR
+GgRWktjmwb342imeqi740bA4i8oBuQcTpHWmHfEBnQvvYVTqHNbXLL5lmA2TbR7a
+SQWCiXmw8wk79MNWmwbTU/8RTzaRdDFwDkAhhbk3ETqe2mh9oZgaZk+ZdmpakJ4j
+CN71NcKKrar3G8tyI5/aRRmJAqkEEAECAJMFAkzS47EgHFNhbmRlciBUZW1tZSA8
+c2FuZGVyQHRlbW1lLm5ldD4iHFNhbmRlciBUZW1tZSA8c2N0ZW1tZUBhcGFjaGUu
+b3JnPh0cU2FuZGVyIFRlbW1lIDxzYW5kZXJAbWUuY29tPiocU2FuZGVyIFRlbW1l
+IDxzY3RlbW1lQGtleXNpbnRoZWNsb3VkLmNvbT4ACgkQm7hjsPUbuIobZA//c9PV
+F5LXRY1WtK7R9lM3e2nSdr7z/A5Cj4REWOTjPRMXo515XNmb0od3reGRv2yDtXfy
+vyjoYA6FU7y64INBWyLWPZMW5glKEwn9ILVxdD4z3XIJFy+XNPVIRZ1QJRrcMh7B
+7P4eTPQDPRKdh6xyitYsfYhqUKX/YQ2lrxqmwEPd1KMGW77rjctHJxF93YNiqvr0
+O9fYF1jeKHa4w+wjcNbCuiejAQoV6LbeggUtyk3xZWobPLQt1Lr3JG58le5TUjAX
+yWPdakTGwRRx8NXUmJ7ciwLAXUaq3jNMkunQ49JHgY89d3if4yhUyko4Im8I0FE1
+eV6YFK1aaPv+e4OUCgyGeexwMTyNl/b6fnllbtupBM8sTE/a/6LbOrcnieSD+qe2
+WLptU+E+HO8S4NUUahChtvtGbgQOv8Z9xqCQUvFTxUl6P7i2u+goXSnmhT8Ajoaq
+cysTPGFPHY14C6hJFIGZ3Pt7hOpcX6/weF1bF79GLbn48SVpEzafMnxIjwNfxbJ/
+MWKZtsubwfEORycasiqx6PfTR46ILZlQVWK16w3rzkz+wZAsIof48vdT4/6dYHh+
+fPxlb3hKQoXQv4x/QPPIaH6v2N6HH2GYnt5j6lg/+Sm/DaGZ1YQAmo8UVDwrkSWD
+K7OfLd4A5IE7dMsk9CvXD3NZqHk1jGlPs7/Oi6iJBBwEEAEIAAYFAkzS9KQACgkQ
+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
+WwGXxqlWuvNdPjMVTG17+d0Rh8SR8ykGuA==
+=PPe9
+-----END PGP PUBLIC KEY BLOCK-----
+