Date: Sun, 23 Jun 2024 17:45:27 -0600 From: Warner Losh <imp@bsdimp.com> To: Pedro Giffuni <pfg@freebsd.org> Cc: "src-committers@freebsd.org" <src-committers@freebsd.org>, "dev-commits-src-all@freebsd.org" <dev-commits-src-all@freebsd.org>, "dev-commits-src-main@freebsd.org" <dev-commits-src-main@freebsd.org>, Warner Losh <imp@freebsd.org> Subject: Re: git: d5c01e1124ff - main - cdefs.h: Remove pre gcc 5.0 support Message-ID: <CANCZdfornovuQ4zJMxBqbgdEO7rZu9pF1LyoyKRiuadCyKi02w@mail.gmail.com> In-Reply-To: <111875645.165697.1719082066518@mail.yahoo.com> References: <202406210241.45L2fQZA057110@gitrepo.freebsd.org> <111875645.165697.1719082066518@mail.yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--000000000000fd48f8061b97429d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Indeed. But none of the ones that I removed are affected by this quirk since they are true for clang all versions. Warner On Sat, Jun 22, 2024 at 12:47=E2=80=AFPM Pedro Giffuni <pfg@freebsd.org> wr= ote: > It was long ago when I last touched this but FWIW ... > > clang used to report itself as GCC 4.2 and kept it's GCC extension suppor= t > level consistent with that version so these version numbers were relevant= . > > Pedro. > > On Thursday, June 20, 2024 at 09:41:34 PM GMT-5, Warner Losh < > imp@freebsd.org> wrote: > > > The branch main has been updated by imp: > > URL: > https://cgit.FreeBSD.org/src/commit/?id=3Dd5c01e1124ffa4adb2513e7e8d708d7= 072dbfc75 > > commit d5c01e1124ffa4adb2513e7e8d708d7072dbfc75 > Author: Warner Losh <imp@FreeBSD.org> > AuthorDate: 2024-06-20 23:03:15 +0000 > Commit: Warner Losh <imp@FreeBSD.org> > CommitDate: 2024-06-21 02:41:09 +0000 > > cdefs.h: Remove pre gcc 5.0 support > > Reviewed by: brooks > Differential Revision: https://reviews.freebsd.org/D45656 > Sponsored by: Netflix > --- > sys/sys/cdefs.h | 54 ----------------------------------------------------= -- > 1 file changed, 54 deletions(-) > > diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h > index a6ecdca5d8b9..43d179b82020 100644 > --- a/sys/sys/cdefs.h > +++ b/sys/sys/cdefs.h > @@ -164,18 +164,9 @@ > #define __aligned(x) __attribute__((__aligned__(x))) > #define __section(x) __attribute__((__section__(x))) > #define __writeonly __unused > -#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__) > #define __alloc_size(x) __attribute__((__alloc_size__(x))) > #define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x))) > -#else > -#define __alloc_size(x) > -#define __alloc_size2(n, x) > -#endif > -#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__) > #define __alloc_align(x) __attribute__((__alloc_align__(x))) > -#else > -#define __alloc_align(x) > -#endif > > /* > * Keywords added in C11. > @@ -199,15 +190,6 @@ > #define _Alignof(x) __alignof(x) > #endif > > -#if !defined(__cplusplus) && !__has_extension(c_atomic) && \ > - !__has_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7) > -/* > - * No native support for _Atomic(). Place object in structure to prevent > - * most forms of direct non-atomic access. > - */ > -#define _Atomic(T) struct { T volatile __val; } > -#endif > - > #if defined(__cplusplus) && __cplusplus >=3D 201103L > #define _Noreturn [[noreturn]] > #else > @@ -218,15 +200,6 @@ > #if (defined(__cplusplus) && __cplusplus >=3D 201103L) || \ > __has_extension(cxx_static_assert) > #define _Static_assert(x, y) static_assert(x, y) > -#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus) > -/* Nothing, gcc 4.6 and higher has _Static_assert built-in */ > -#elif defined(__COUNTER__) > -#define _Static_assert(x, y) __Static_assert(x, __COUNTER__) > -#define __Static_assert(x, y) ___Static_assert(x, y) > -#define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 > : -1] \ > - __unused > -#else > -#define _Static_assert(x, y) struct __hack > #endif > #endif > > @@ -276,7 +249,6 @@ > * void bar(int myArray[__min_size(10)]); > */ > #if !defined(__cplusplus) && \ > - (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \ > (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >=3D 199901)) > #define __min_size(x) static (x) > #else > @@ -302,17 +274,9 @@ > #define __result_use_or_ignore_check > #endif /* !__clang__ */ > > -#if __GNUC_PREREQ__(4, 1) > #define __returns_twice __attribute__((__returns_twice__)) > -#else > -#define __returns_twice > -#endif > > -#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable) > #define __unreachable() __builtin_unreachable() > -#else > -#define __unreachable() ((void)0) > -#endif > > #if !defined(__STRICT_ANSI__) || __STDC_VERSION__ >=3D 199901 > #define __LONG_LONG_SUPPORTED > @@ -353,33 +317,15 @@ > #define __predict_true(exp) __builtin_expect((exp), 1) > #define __predict_false(exp) __builtin_expect((exp), 0) > > -#if __GNUC_PREREQ__(4, 0) > #define __null_sentinel __attribute__((__sentinel__)) > #define __exported __attribute__((__visibility__("default"))) > #define __hidden __attribute__((__visibility__("hidden"))) > -#else > -#define __null_sentinel > -#define __exported > -#define __hidden > -#endif > > /* > * We define this here since <stddef.h>, <sys/queue.h>, and <sys/types.h= > > * require it. > */ > -#if __GNUC_PREREQ__(4, 1) > #define __offsetof(type, field) __builtin_offsetof(type, field) > -#else > -#ifndef __cplusplus > -#define __offsetof(type, field) \ > - ((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field)= ) > -#else > -#define __offsetof(type, field) \ > - (__offsetof__ (reinterpret_cast <__size_t> \ > - (&reinterpret_cast <const volatile char &> \ > - (static_cast<type *> (0)->field)))) > -#endif > -#endif > #define __rangeof(type, start, end) \ > (__offsetof(type, end) - __offsetof(type, start)) > > --000000000000fd48f8061b97429d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Indeed. But none of the ones that I removed are affected b= y this quirk since they are true for clang all versions.<div><br></div><div= >Warner</div></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D= "gmail_attr">On Sat, Jun 22, 2024 at 12:47=E2=80=AFPM Pedro Giffuni <<a = href=3D"mailto:pfg@freebsd.org">pfg@freebsd.org</a>> wrote:<br></div><bl= ockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-lef= t:1px solid rgb(204,204,204);padding-left:1ex"><div><div style=3D"font-fami= ly:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px"><d= iv></div> <div dir=3D"ltr">It was long ago when I last touched this but FWIW = ...<br></div><div dir=3D"ltr"><br></div><div dir=3D"ltr">clang used to repo= rt itself as GCC 4.2 and kept it's GCC extension support level consiste= nt with that version so these version numbers were relevant.</div><div dir= =3D"ltr"><br></div><div dir=3D"ltr">Pedro.</div><div><br></div> =20 </div><div id=3D"m_160829819354664847ydp3058622eyahoo_quoted_970812= 1018"> <div style=3D"font-family:"Helvetica Neue",Helvetica,= Arial,sans-serif;font-size:13px;color:rgb(38,40,42)"> =20 <div> On Thursday, June 20, 2024 at 09:41:34 PM GMT-5, Wa= rner Losh <<a href=3D"mailto:imp@freebsd.org" target=3D"_blank">imp@free= bsd.org</a>> wrote: </div> <div><br></div> <div><br></div> =20 =20 <div><div dir=3D"ltr">The branch main has been updated by i= mp:<br></div><div dir=3D"ltr"><br></div><div dir=3D"ltr">URL: <a href=3D"ht= tps://cgit.FreeBSD.org/src/commit/?id=3Dd5c01e1124ffa4adb2513e7e8d708d7072d= bfc75" rel=3D"nofollow" target=3D"_blank">https://cgit.FreeBSD.org/src/comm= it/?id=3Dd5c01e1124ffa4adb2513e7e8d708d7072dbfc75</a><br></div><div dir=3D"= ltr"><br></div><div dir=3D"ltr">commit d5c01e1124ffa4adb2513e7e8d708d7072db= fc75<br></div><div dir=3D"ltr">Author:=C2=A0 =C2=A0 Warner Losh <<a hre= f=3D"mailto:imp@FreeBSD.org" rel=3D"nofollow" target=3D"_blank">imp@FreeBSD= .org</a>><br></div><div dir=3D"ltr">AuthorDate: 2024-06-20 23:03:15 +000= 0<br></div><div dir=3D"ltr">Commit:=C2=A0 =C2=A0 Warner Losh <<a href= =3D"mailto:imp@FreeBSD.org" rel=3D"nofollow" target=3D"_blank">imp@FreeBSD.= org</a>><br></div><div dir=3D"ltr">CommitDate: 2024-06-21 02:41:09 +0000= <br></div><div dir=3D"ltr"><br></div><div dir=3D"ltr">=C2=A0 =C2=A0 cdefs.h= : Remove pre gcc 5.0 support<br></div><div dir=3D"ltr">=C2=A0 =C2=A0 <br></= div><div dir=3D"ltr">=C2=A0 =C2=A0 Reviewed by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 brooks<br></div><div dir=3D"ltr">=C2=A0 =C2=A0 Differential R= evision:=C2=A0 <a href=3D"https://reviews.freebsd.org/D45656" rel=3D"nofoll= ow" target=3D"_blank">https://reviews.freebsd.org/D45656</a><br></div><div = dir=3D"ltr">=C2=A0 =C2=A0 Sponsored by:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = Netflix<br></div><div dir=3D"ltr">---<br></div><div dir=3D"ltr"> sys/sys/cd= efs.h | 54 ------------------------------------------------------<br></div>= <div dir=3D"ltr"> 1 file changed, 54 deletions(-)<br></div><div dir=3D"ltr"= ><br></div><div dir=3D"ltr">diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h<= br></div><div dir=3D"ltr">index a6ecdca5d8b9..43d179b82020 100644<br></div>= <div dir=3D"ltr">--- a/sys/sys/cdefs.h<br></div><div dir=3D"ltr">+++ b/sys/= sys/cdefs.h<br></div><div dir=3D"ltr">@@ -164,18 +164,9 @@<br></div><div di= r=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __aligned(x)=C2=A0=C2=A0=C2=A0 __attri= bute__((__aligned__(x)))<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2= =A0 __section(x)=C2=A0=C2=A0=C2=A0 __attribute__((__section__(x)))<br></div= ><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __writeonly=C2=A0=C2=A0=C2=A0 = __unused<br></div><div dir=3D"ltr">-#if __GNUC_PREREQ__(4, 3) || __has_attr= ibute(__alloc_size__)<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 = __alloc_size(x)=C2=A0=C2=A0=C2=A0 __attribute__((__alloc_size__(x)))<br></d= iv><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __alloc_size2(n, x)=C2=A0=C2= =A0=C2=A0 __attribute__((__alloc_size__(n, x)))<br></div><div dir=3D"ltr">-= #else<br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __alloc_size(x)<= br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __alloc_size2(n, x)<br= ></div><div dir=3D"ltr">-#endif<br></div><div dir=3D"ltr">-#if __GNUC_PRERE= Q__(4, 9) || __has_attribute(__alloc_align__)<br></div><div dir=3D"ltr"> #d= efine=C2=A0=C2=A0=C2=A0 __alloc_align(x)=C2=A0=C2=A0=C2=A0 __attribute__((_= _alloc_align__(x)))<br></div><div dir=3D"ltr">-#else<br></div><div dir=3D"l= tr">-#define=C2=A0=C2=A0=C2=A0 __alloc_align(x)<br></div><div dir=3D"ltr">-= #endif<br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr"> /*<br></div><= div dir=3D"ltr">=C2=A0 * Keywords added in C11.<br></div><div dir=3D"ltr">@= @ -199,15 +190,6 @@<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 _A= lignof(x)=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 __alignof(x)<br></div><div d= ir=3D"ltr"> #endif<br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr">-#= if !defined(__cplusplus) && !__has_extension(c_atomic) && \= <br></div><div dir=3D"ltr">-=C2=A0=C2=A0=C2=A0 !__has_extension(cxx_atomic)= && !__GNUC_PREREQ__(4, 7)<br></div><div dir=3D"ltr">-/*<br></div><= div dir=3D"ltr">- * No native support for _Atomic(). Place object in struct= ure to prevent<br></div><div dir=3D"ltr">- * most forms of direct non-atomi= c access.<br></div><div dir=3D"ltr">- */<br></div><div dir=3D"ltr">-#define= =C2=A0=C2=A0=C2=A0 _Atomic(T)=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 struct {= T volatile __val; }<br></div><div dir=3D"ltr">-#endif<br></div><div dir=3D= "ltr">-<br></div><div dir=3D"ltr"> #if defined(__cplusplus) && __cp= lusplus >=3D 201103L<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2= =A0 _Noreturn=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 [[noreturn]]<br></div><d= iv dir=3D"ltr"> #else<br></div><div dir=3D"ltr">@@ -218,15 +200,6 @@<br></d= iv><div dir=3D"ltr"> #if (defined(__cplusplus) && __cplusplus >= =3D 201103L) || \<br></div><div dir=3D"ltr">=C2=A0 =C2=A0 __has_extension(= cxx_static_assert)<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 _St= atic_assert(x, y)=C2=A0=C2=A0=C2=A0 static_assert(x, y)<br></div><div dir= =3D"ltr">-#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus)<br></= div><div dir=3D"ltr">-/* Nothing, gcc 4.6 and higher has _Static_assert bui= lt-in */<br></div><div dir=3D"ltr">-#elif defined(__COUNTER__)<br></div><di= v dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 _Static_assert(x, y)=C2=A0=C2=A0= =C2=A0 __Static_assert(x, __COUNTER__)<br></div><div dir=3D"ltr">-#define= =C2=A0=C2=A0=C2=A0 __Static_assert(x, y)=C2=A0=C2=A0=C2=A0 ___Static_assert= (x, y)<br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 ___Static_asser= t(x, y)=C2=A0=C2=A0=C2=A0 typedef char __assert_ ## y[(x) ? 1 : -1] \<br></= div><div dir=3D"ltr">-=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2= =A0 =C2=A0=C2=A0=C2=A0 __unused<br></div><div dir=3D"ltr">-#else<br></div><= div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 _Static_assert(x, y)=C2=A0=C2=A0= =C2=A0 struct __hack<br></div><div dir=3D"ltr"> #endif<br></div><div dir=3D= "ltr"> #endif<br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr">@@ -276= ,7 +249,6 @@<br></div><div dir=3D"ltr">=C2=A0 * void bar(int myArray[__min_= size(10)]);<br></div><div dir=3D"ltr">=C2=A0 */<br></div><div dir=3D"ltr"> = #if !defined(__cplusplus) && \<br></div><div dir=3D"ltr">-=C2=A0 = =C2=A0 (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \<br></div>= <div dir=3D"ltr">=C2=A0 =C2=A0 (!defined(__STDC_VERSION__) || (__STDC_VERS= ION__ >=3D 199901))<br></div><div dir=3D"ltr"> #define __min_size(x)=C2= =A0=C2=A0=C2=A0 static (x)<br></div><div dir=3D"ltr"> #else<br></div><div d= ir=3D"ltr">@@ -302,17 +274,9 @@<br></div><div dir=3D"ltr"> #define=C2=A0=C2= =A0=C2=A0 __result_use_or_ignore_check<br></div><div dir=3D"ltr"> #endif /*= !__clang__ */<br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr">-#if _= _GNUC_PREREQ__(4, 1)<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 _= _returns_twice=C2=A0=C2=A0=C2=A0 __attribute__((__returns_twice__))<br></di= v><div dir=3D"ltr">-#else<br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2= =A0 __returns_twice<br></div><div dir=3D"ltr">-#endif<br></div><div dir=3D"= ltr"> <br></div><div dir=3D"ltr">-#if __GNUC_PREREQ__(4, 6) || __has_builti= n(__builtin_unreachable)<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2= =A0 __unreachable()=C2=A0=C2=A0=C2=A0 __builtin_unreachable()<br></div><div= dir=3D"ltr">-#else<br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __= unreachable()=C2=A0=C2=A0=C2=A0 ((void)0)<br></div><div dir=3D"ltr">-#endif= <br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr"> #if !defined(__STRI= CT_ANSI__) || __STDC_VERSION__ >=3D 199901<br></div><div dir=3D"ltr"> #d= efine=C2=A0=C2=A0=C2=A0 __LONG_LONG_SUPPORTED<br></div><div dir=3D"ltr">@@ = -353,33 +317,15 @@<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __p= redict_true(exp)=C2=A0 =C2=A0 __builtin_expect((exp), 1)<br></div><div dir= =3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __predict_false(exp)=C2=A0 =C2=A0 __bui= ltin_expect((exp), 0)<br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr"= >-#if __GNUC_PREREQ__(4, 0)<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0= =C2=A0 __null_sentinel=C2=A0=C2=A0=C2=A0 __attribute__((__sentinel__))<br><= /div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __exported=C2=A0=C2=A0=C2= =A0 __attribute__((__visibility__("default")))<br></div><div dir= =3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __hidden=C2=A0=C2=A0=C2=A0 __attribute_= _((__visibility__("hidden")))<br></div><div dir=3D"ltr">-#else<br= ></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __null_sentinel<br></div= ><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __exported<br></div><div dir= =3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __hidden<br></div><div dir=3D"ltr">-#en= dif<br></div><div dir=3D"ltr"> <br></div><div dir=3D"ltr"> /*<br></div><div= dir=3D"ltr">=C2=A0 * We define this here since <stddef.h>, <sys/q= ueue.h>, and <sys/types.h><br></div><div dir=3D"ltr">=C2=A0 * requ= ire it.<br></div><div dir=3D"ltr">=C2=A0 */<br></div><div dir=3D"ltr">-#if = __GNUC_PREREQ__(4, 1)<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 = __offsetof(type, field)=C2=A0=C2=A0=C2=A0 __builtin_offsetof(type, field)<= br></div><div dir=3D"ltr">-#else<br></div><div dir=3D"ltr">-#ifndef __cplus= plus<br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __offsetof(type, = field) \<br></div><div dir=3D"ltr">-=C2=A0=C2=A0=C2=A0 ((__size_t)(__uintpt= r_t)((const volatile void *)&((type *)0)->field))<br></div><div dir= =3D"ltr">-#else<br></div><div dir=3D"ltr">-#define=C2=A0=C2=A0=C2=A0 __offs= etof(type, field)=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 = =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 \<br></div><div dir=3D"ltr">-=C2=A0 (= __offsetof__ (reinterpret_cast <__size_t>=C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0 =C2=A0=C2=A0=C2=A0 \<br></div><div dir=3D"ltr">-=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (&reinterpret_cast <const vo= latile char &>=C2=A0=C2=A0=C2=A0 \<br></div><div dir=3D"ltr">-=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (static_cast<ty= pe *> (0)->field))))<br></div><div dir=3D"ltr">-#endif<br></div><div = dir=3D"ltr">-#endif<br></div><div dir=3D"ltr"> #define=C2=A0=C2=A0=C2=A0 __= rangeof(type, start, end) \<br></div><div dir=3D"ltr"> =C2=A0=C2=A0=C2=A0 (= __offsetof(type, end) - __offsetof(type, start))<br></div><div dir=3D"ltr">= <br></div></div> </div> </div></div></blockquote></div> --000000000000fd48f8061b97429d--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfornovuQ4zJMxBqbgdEO7rZu9pF1LyoyKRiuadCyKi02w>