* [PATCH] libstdc++: use new built-in trait __is_reference @ 2023-03-19 4:21 Ken Matsui 2023-03-20 7:25 ` Xi Ruoyao 0 siblings, 1 reply; 12+ messages in thread From: Ken Matsui @ 2023-03-19 4:21 UTC (permalink / raw) To: gcc-patches; +Cc: Patrick Palka libstdc++-v3/ChangeLog: * include/std/type_traits (is_reference): Use __is_reference built-in trait. --- diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 2bd607a8b8f..18408d8ceb6 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Composite type categories. /// is_reference +#if __has_builtin(__is_reference) + template<typename _Tp> + struct is_reference + : public integral_constant<bool, __is_reference(_Tp)> + { }; +#else template<typename _Tp> struct is_reference : public false_type @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct is_reference<_Tp&&> : public true_type { }; +#endif /// is_arithmetic template<typename _Tp> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-19 4:21 [PATCH] libstdc++: use new built-in trait __is_reference Ken Matsui @ 2023-03-20 7:25 ` Xi Ruoyao 2023-03-20 7:30 ` Ken Matsui 0 siblings, 1 reply; 12+ messages in thread From: Xi Ruoyao @ 2023-03-20 7:25 UTC (permalink / raw) To: Ken Matsui, gcc-patches; +Cc: Patrick Palka, libstdc++ You need to CC libstdc++@gcc.gnu.org for any patches touching libstdc++. On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote: > libstdc++-v3/ChangeLog: > > * include/std/type_traits (is_reference): Use __is_reference built-in > trait. Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor nothing) to indent the ChangeLog content. Is there any benefit to use a builtin, instead of the existing implementation? I can see no but maybe I'm stupid. > --- > diff --git a/libstdc++-v3/include/std/type_traits > b/libstdc++-v3/include/std/type_traits The patch fails to apply. It seems because your mail client inserted an additional newline before "b/". Try to use git-send-email or configure the mail client properly. > index 2bd607a8b8f..18408d8ceb6 100644 > --- a/libstdc++-v3/include/std/type_traits > +++ b/libstdc++-v3/include/std/type_traits > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > // Composite type categories. > > /// is_reference > +#if __has_builtin(__is_reference) > + template<typename _Tp> > + struct is_reference > + : public integral_constant<bool, __is_reference(_Tp)> If a patch depends on another patch not applied yet, sent them in a series. Or people are puzzled because when this patch is applied alone, the code fails to build. > + { }; > +#else > template<typename _Tp> > struct is_reference > : public false_type > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct is_reference<_Tp&&> > : public true_type > { }; > +#endif > > /// is_arithmetic > template<typename _Tp> -- Xi Ruoyao <xry111@xry111.site> School of Aerospace Science and Technology, Xidian University ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 7:25 ` Xi Ruoyao @ 2023-03-20 7:30 ` Ken Matsui 2023-03-20 7:51 ` Xi Ruoyao 0 siblings, 1 reply; 12+ messages in thread From: Ken Matsui @ 2023-03-20 7:30 UTC (permalink / raw) To: Xi Ruoyao; +Cc: gcc-patches, Patrick Palka, libstdc++ I see. Thank you! On Mon, Mar 20, 2023 at 12:26 AM Xi Ruoyao <xry111@xry111.site> wrote: > > You need to CC libstdc++@gcc.gnu.org for any patches touching libstdc++. > > On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote: > > libstdc++-v3/ChangeLog: > > > > * include/std/type_traits (is_reference): Use __is_reference built-in > > trait. > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > nothing) to indent the ChangeLog content. > > Is there any benefit to use a builtin, instead of the existing > implementation? I can see no but maybe I'm stupid. > > > --- > > diff --git a/libstdc++-v3/include/std/type_traits > > b/libstdc++-v3/include/std/type_traits > > The patch fails to apply. It seems because your mail client inserted an > additional newline before "b/". Try to use git-send-email or configure > the mail client properly. > > > index 2bd607a8b8f..18408d8ceb6 100644 > > --- a/libstdc++-v3/include/std/type_traits > > +++ b/libstdc++-v3/include/std/type_traits > > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > // Composite type categories. > > > > /// is_reference > > +#if __has_builtin(__is_reference) > > + template<typename _Tp> > > + struct is_reference > > + : public integral_constant<bool, __is_reference(_Tp)> > > If a patch depends on another patch not applied yet, sent them in a > series. Or people are puzzled because when this patch is applied alone, > the code fails to build. > > > + { }; > > +#else > > template<typename _Tp> > > struct is_reference > > : public false_type > > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > struct is_reference<_Tp&&> > > : public true_type > > { }; > > +#endif > > > > /// is_arithmetic > > template<typename _Tp> > > -- > Xi Ruoyao <xry111@xry111.site> > School of Aerospace Science and Technology, Xidian University ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 7:30 ` Ken Matsui @ 2023-03-20 7:51 ` Xi Ruoyao 2023-03-20 8:03 ` Ken Matsui 0 siblings, 1 reply; 12+ messages in thread From: Xi Ruoyao @ 2023-03-20 7:51 UTC (permalink / raw) To: Ken Matsui; +Cc: gcc-patches, Patrick Palka, libstdc++ On Mon, 2023-03-20 at 00:30 -0700, Ken Matsui wrote: > I see. Thank you! Please continue to read. I guess you missed some inline comments from me... > > On Mon, Mar 20, 2023 at 12:26 AM Xi Ruoyao <xry111@xry111.site> wrote: > > > > You need to CC libstdc++@gcc.gnu.org for any patches touching > > libstdc++. > > > > On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote: > > > libstdc++-v3/ChangeLog: > > > > > > * include/std/type_traits (is_reference): Use __is_reference > > > built-in > > > trait. > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > nothing) to indent the ChangeLog content. > > > > Is there any benefit to use a builtin, instead of the existing > > implementation? I can see no but maybe I'm stupid. > > > > > --- > > > diff --git a/libstdc++-v3/include/std/type_traits > > > b/libstdc++-v3/include/std/type_traits > > > > The patch fails to apply. It seems because your mail client > > inserted an > > additional newline before "b/". Try to use git-send-email or > > configure > > the mail client properly. > > > > > index 2bd607a8b8f..18408d8ceb6 100644 > > > --- a/libstdc++-v3/include/std/type_traits > > > +++ b/libstdc++-v3/include/std/type_traits > > > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > // Composite type categories. > > > > > > /// is_reference > > > +#if __has_builtin(__is_reference) > > > + template<typename _Tp> > > > + struct is_reference > > > + : public integral_constant<bool, __is_reference(_Tp)> > > > > If a patch depends on another patch not applied yet, sent them in a > > series. Or people are puzzled because when this patch is applied > > alone, > > the code fails to build. > > > > > + { }; > > > +#else > > > template<typename _Tp> > > > struct is_reference > > > : public false_type > > > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > struct is_reference<_Tp&&> > > > : public true_type > > > { }; > > > +#endif > > > > > > /// is_arithmetic > > > template<typename _Tp> > > > > -- > > Xi Ruoyao <xry111@xry111.site> > > School of Aerospace Science and Technology, Xidian University -- Xi Ruoyao <xry111@xry111.site> School of Aerospace Science and Technology, Xidian University ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 7:51 ` Xi Ruoyao @ 2023-03-20 8:03 ` Ken Matsui 2023-03-20 8:07 ` Xi Ruoyao 0 siblings, 1 reply; 12+ messages in thread From: Ken Matsui @ 2023-03-20 8:03 UTC (permalink / raw) To: Xi Ruoyao; +Cc: gcc-patches, Patrick Palka, libstdc++ Oops, I assumed those were my email... Thank you for your heads up and your comments! > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > nothing) to indent the ChangeLog content. Do you mean like the following? ``` libstdc++-v3/ChangeLog: [TAB]* include/std/type_traits (is_reference): Use __is_reference built-in trait. ``` > Is there any benefit to use a builtin, instead of the existing > implementation? I can see no but maybe I'm stupid. My patches are based on the GSoC project "C++: Implement compiler built-in traits for the standard library traits". These built-in traits basically make the compilation faster. https://gcc.gnu.org/wiki/SummerOfCode > The patch fails to apply. It seems because your mail client inserted an > additional newline before "b/". Try to use git-send-email or configure > the mail client properly. Let me try to use git-send-email instead. I stupidly don't understand how to use them, so I was making my patches manually... > If a patch depends on another patch not applied yet, sent them in a > series. Or people are puzzled because when this patch is applied alone, > the code fails to build. Oooh, this one! [PATCH 3/7] - the third patch in a series of seven patches I totally missed that. Thank you! On Mon, Mar 20, 2023 at 12:51 AM Xi Ruoyao <xry111@xry111.site> wrote: > > On Mon, 2023-03-20 at 00:30 -0700, Ken Matsui wrote: > > I see. Thank you! > > Please continue to read. I guess you missed some inline comments from > me... > > > > > On Mon, Mar 20, 2023 at 12:26 AM Xi Ruoyao <xry111@xry111.site> wrote: > > > > > > You need to CC libstdc++@gcc.gnu.org for any patches touching > > > libstdc++. > > > > > > On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote: > > > > libstdc++-v3/ChangeLog: > > > > > > > > * include/std/type_traits (is_reference): Use __is_reference > > > > built-in > > > > trait. > > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > > nothing) to indent the ChangeLog content. > > > > > > Is there any benefit to use a builtin, instead of the existing > > > implementation? I can see no but maybe I'm stupid. > > > > > > > --- > > > > diff --git a/libstdc++-v3/include/std/type_traits > > > > b/libstdc++-v3/include/std/type_traits > > > > > > The patch fails to apply. It seems because your mail client > > > inserted an > > > additional newline before "b/". Try to use git-send-email or > > > configure > > > the mail client properly. > > > > > > > index 2bd607a8b8f..18408d8ceb6 100644 > > > > --- a/libstdc++-v3/include/std/type_traits > > > > +++ b/libstdc++-v3/include/std/type_traits > > > > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > > // Composite type categories. > > > > > > > > /// is_reference > > > > +#if __has_builtin(__is_reference) > > > > + template<typename _Tp> > > > > + struct is_reference > > > > + : public integral_constant<bool, __is_reference(_Tp)> > > > > > > If a patch depends on another patch not applied yet, sent them in a > > > series. Or people are puzzled because when this patch is applied > > > alone, > > > the code fails to build. > > > > > > > + { }; > > > > +#else > > > > template<typename _Tp> > > > > struct is_reference > > > > : public false_type > > > > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > > > struct is_reference<_Tp&&> > > > > : public true_type > > > > { }; > > > > +#endif > > > > > > > > /// is_arithmetic > > > > template<typename _Tp> > > > > > > -- > > > Xi Ruoyao <xry111@xry111.site> > > > School of Aerospace Science and Technology, Xidian University > > -- > Xi Ruoyao <xry111@xry111.site> > School of Aerospace Science and Technology, Xidian University ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 8:03 ` Ken Matsui @ 2023-03-20 8:07 ` Xi Ruoyao 2023-03-20 8:32 ` Ken Matsui 2023-03-20 9:14 ` Jonathan Wakely 0 siblings, 2 replies; 12+ messages in thread From: Xi Ruoyao @ 2023-03-20 8:07 UTC (permalink / raw) To: Ken Matsui; +Cc: gcc-patches, Patrick Palka, libstdc++ On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > Oops, I assumed those were my email... Thank you for your heads up and > your comments! > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > nothing) to indent the ChangeLog content. > > Do you mean like the following? > > ``` > libstdc++-v3/ChangeLog: > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > built-in > trait. > ``` Yep. > > Is there any benefit to use a builtin, instead of the existing > > implementation? I can see no but maybe I'm stupid. > > My patches are based on the GSoC project "C++: Implement compiler > built-in traits for the standard library traits". These built-in > traits basically make the compilation faster. > > https://gcc.gnu.org/wiki/SummerOfCode Ok, to me making compilation faster is a valid reason. > > The patch fails to apply. It seems because your mail client inserted an > > additional newline before "b/". Try to use git-send-email or configure > > the mail client properly. > > Let me try to use git-send-email instead. I stupidly don't understand > how to use them, so I was making my patches manually... Or adjust the mail client correctly. You can send the patch to yourself first and see if it's not "mangled" by the mail client when you debug such an issue... But when you finally end up sending 10 patches in a series you'll find git send-email much easier :). -- Xi Ruoyao <xry111@xry111.site> School of Aerospace Science and Technology, Xidian University ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 8:07 ` Xi Ruoyao @ 2023-03-20 8:32 ` Ken Matsui 2023-03-20 9:14 ` Jonathan Wakely 1 sibling, 0 replies; 12+ messages in thread From: Ken Matsui @ 2023-03-20 8:32 UTC (permalink / raw) To: Xi Ruoyao; +Cc: gcc-patches, Patrick Palka, libstdc++ Thank you! On Mon, Mar 20, 2023 at 1:07 AM Xi Ruoyao <xry111@xry111.site> wrote: > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > > Oops, I assumed those were my email... Thank you for your heads up and > > your comments! > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > > nothing) to indent the ChangeLog content. > > > > Do you mean like the following? > > > > ``` > > libstdc++-v3/ChangeLog: > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > > built-in > > trait. > > ``` > > Yep. > > > > Is there any benefit to use a builtin, instead of the existing > > > implementation? I can see no but maybe I'm stupid. > > > > My patches are based on the GSoC project "C++: Implement compiler > > built-in traits for the standard library traits". These built-in > > traits basically make the compilation faster. > > > > https://gcc.gnu.org/wiki/SummerOfCode > > Ok, to me making compilation faster is a valid reason. > > > > The patch fails to apply. It seems because your mail client inserted an > > > additional newline before "b/". Try to use git-send-email or configure > > > the mail client properly. > > > > Let me try to use git-send-email instead. I stupidly don't understand > > how to use them, so I was making my patches manually... > > Or adjust the mail client correctly. You can send the patch to yourself > first and see if it's not "mangled" by the mail client when you debug > such an issue... > > But when you finally end up sending 10 patches in a series you'll find > git send-email much easier :). > > -- > Xi Ruoyao <xry111@xry111.site> > School of Aerospace Science and Technology, Xidian University ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 8:07 ` Xi Ruoyao 2023-03-20 8:32 ` Ken Matsui @ 2023-03-20 9:14 ` Jonathan Wakely 2023-03-20 9:56 ` Ken Matsui 1 sibling, 1 reply; 12+ messages in thread From: Jonathan Wakely @ 2023-03-20 9:14 UTC (permalink / raw) To: Xi Ruoyao; +Cc: Ken Matsui, gcc-patches, Patrick Palka, libstdc++ On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++ <libstdc++@gcc.gnu.org> wrote: > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > > Oops, I assumed those were my email... Thank you for your heads up and > > your comments! > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > > nothing) to indent the ChangeLog content. > > > > Do you mean like the following? > > > > ``` > > libstdc++-v3/ChangeLog: > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > > built-in > > trait. > > ``` > > Yep. > > > > Is there any benefit to use a builtin, instead of the existing > > > implementation? I can see no but maybe I'm stupid. > > > > My patches are based on the GSoC project "C++: Implement compiler > > built-in traits for the standard library traits". These built-in > > traits basically make the compilation faster. > > > > https://gcc.gnu.org/wiki/SummerOfCode > > Ok, to me making compilation faster is a valid reason. Does it actually make compilation faster though? Has it been measured? > > > The patch fails to apply. It seems because your mail client inserted an > > > additional newline before "b/". Try to use git-send-email or configure > > > the mail client properly. > > > > Let me try to use git-send-email instead. I stupidly don't understand > > how to use them, so I was making my patches manually... > > Or adjust the mail client correctly. You can send the patch to yourself > first and see if it's not "mangled" by the mail client when you debug > such an issue... > > But when you finally end up sending 10 patches in a series you'll find > git send-email much easier :). Figuring out how to generate proper patches is an important part of contributing to GCC, so part of any GSoC project. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 9:14 ` Jonathan Wakely @ 2023-03-20 9:56 ` Ken Matsui 2023-03-20 13:22 ` Ken Matsui 2023-03-20 15:23 ` Patrick Palka 0 siblings, 2 replies; 12+ messages in thread From: Ken Matsui @ 2023-03-20 9:56 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Xi Ruoyao, gcc-patches, Patrick Palka, libstdc++ > Does it actually make compilation faster though? > > Has it been measured? In my understanding, what I have implemented so far is so simple that it does not affect the speed. These traits are what Partick kindly recommended to get started. As explained on the GSoC page, some traits might involve expensive instantiation of multiple class templates. So IMHO, implementing built-in traits for those traits can make compilation cheaper. I have not measured it, but Patrick might have done? On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote: > > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++ > <libstdc++@gcc.gnu.org> wrote: > > > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > > > Oops, I assumed those were my email... Thank you for your heads up and > > > your comments! > > > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > > > nothing) to indent the ChangeLog content. > > > > > > Do you mean like the following? > > > > > > ``` > > > libstdc++-v3/ChangeLog: > > > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > > > built-in > > > trait. > > > ``` > > > > Yep. > > > > > > Is there any benefit to use a builtin, instead of the existing > > > > implementation? I can see no but maybe I'm stupid. > > > > > > My patches are based on the GSoC project "C++: Implement compiler > > > built-in traits for the standard library traits". These built-in > > > traits basically make the compilation faster. > > > > > > https://gcc.gnu.org/wiki/SummerOfCode > > > > Ok, to me making compilation faster is a valid reason. > > Does it actually make compilation faster though? > > Has it been measured? > > > > > The patch fails to apply. It seems because your mail client inserted an > > > > additional newline before "b/". Try to use git-send-email or configure > > > > the mail client properly. > > > > > > Let me try to use git-send-email instead. I stupidly don't understand > > > how to use them, so I was making my patches manually... > > > > Or adjust the mail client correctly. You can send the patch to yourself > > first and see if it's not "mangled" by the mail client when you debug > > such an issue... > > > > But when you finally end up sending 10 patches in a series you'll find > > git send-email much easier :). > > Figuring out how to generate proper patches is an important part of > contributing to GCC, so part of any GSoC project. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 9:56 ` Ken Matsui @ 2023-03-20 13:22 ` Ken Matsui 2023-03-20 15:23 ` Patrick Palka 1 sibling, 0 replies; 12+ messages in thread From: Ken Matsui @ 2023-03-20 13:22 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Xi Ruoyao, gcc-patches, Patrick Palka, libstdc++ It looks like I was able to use git send-email. The new patches became a series, so I couldn't figure out how to associate them with this email and another email. Please disregard this email. On Mon, Mar 20, 2023 at 2:56 AM Ken Matsui <kmatsui@cs.washington.edu> wrote: > > > Does it actually make compilation faster though? > > > > Has it been measured? > > In my understanding, what I have implemented so far is so simple that > it does not affect the speed. These traits are what Partick kindly > recommended to get started. As explained on the GSoC page, some traits > might involve expensive instantiation of multiple class templates. So > IMHO, implementing built-in traits for those traits can make > compilation cheaper. > > I have not measured it, but Patrick might have done? > > On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote: > > > > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++ > > <libstdc++@gcc.gnu.org> wrote: > > > > > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > > > > Oops, I assumed those were my email... Thank you for your heads up and > > > > your comments! > > > > > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > > > > nothing) to indent the ChangeLog content. > > > > > > > > Do you mean like the following? > > > > > > > > ``` > > > > libstdc++-v3/ChangeLog: > > > > > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > > > > built-in > > > > trait. > > > > ``` > > > > > > Yep. > > > > > > > > Is there any benefit to use a builtin, instead of the existing > > > > > implementation? I can see no but maybe I'm stupid. > > > > > > > > My patches are based on the GSoC project "C++: Implement compiler > > > > built-in traits for the standard library traits". These built-in > > > > traits basically make the compilation faster. > > > > > > > > https://gcc.gnu.org/wiki/SummerOfCode > > > > > > Ok, to me making compilation faster is a valid reason. > > > > Does it actually make compilation faster though? > > > > Has it been measured? > > > > > > > The patch fails to apply. It seems because your mail client inserted an > > > > > additional newline before "b/". Try to use git-send-email or configure > > > > > the mail client properly. > > > > > > > > Let me try to use git-send-email instead. I stupidly don't understand > > > > how to use them, so I was making my patches manually... > > > > > > Or adjust the mail client correctly. You can send the patch to yourself > > > first and see if it's not "mangled" by the mail client when you debug > > > such an issue... > > > > > > But when you finally end up sending 10 patches in a series you'll find > > > git send-email much easier :). > > > > Figuring out how to generate proper patches is an important part of > > contributing to GCC, so part of any GSoC project. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 9:56 ` Ken Matsui 2023-03-20 13:22 ` Ken Matsui @ 2023-03-20 15:23 ` Patrick Palka 2023-03-20 20:24 ` Ken Matsui 1 sibling, 1 reply; 12+ messages in thread From: Patrick Palka @ 2023-03-20 15:23 UTC (permalink / raw) To: Ken Matsui; +Cc: Jonathan Wakely, Xi Ruoyao, gcc-patches, libstdc++ [-- Attachment #1: Type: text/plain, Size: 3515 bytes --] On Mon, Mar 20, 2023 at 5:56 AM Ken Matsui <kmatsui@cs.washington.edu> wrote: > > > Does it actually make compilation faster though? > > > > Has it been measured? > > In my understanding, what I have implemented so far is so simple that > it does not affect the speed. These traits are what Partick kindly > recommended to get started. As explained on the GSoC page, some traits > might involve expensive instantiation of multiple class templates. So > IMHO, implementing built-in traits for those traits can make > compilation cheaper. > > I have not measured it, but Patrick might have done? Although the native implementation of using two partial specializations is very efficient, I'd suspect using a built-in would be even better because it'd avoid the work of having to figure out which of the two partial specializations to instantiate. I contrived the attached benchmark to measure this, which instantiates ~160k specializations of is_reference_v (it was simpler to write a benchmark for the variable template version). On my machine gcc trunk (release build) as well as Clang 15 use between 10-15% less time/memory with -DUSE_BUILTIN than without for this benchmark, so this suggests the built-in improves compile time/memory usage for this trait by at least 10-15%. For more complicated traits the improvement should be even better. > > On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote: > > > > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++ > > <libstdc++@gcc.gnu.org> wrote: > > > > > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > > > > Oops, I assumed those were my email... Thank you for your heads up and > > > > your comments! > > > > > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, nor > > > > > nothing) to indent the ChangeLog content. > > > > > > > > Do you mean like the following? > > > > > > > > ``` > > > > libstdc++-v3/ChangeLog: > > > > > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > > > > built-in > > > > trait. > > > > ``` > > > > > > Yep. > > > > > > > > Is there any benefit to use a builtin, instead of the existing > > > > > implementation? I can see no but maybe I'm stupid. > > > > > > > > My patches are based on the GSoC project "C++: Implement compiler > > > > built-in traits for the standard library traits". These built-in > > > > traits basically make the compilation faster. > > > > > > > > https://gcc.gnu.org/wiki/SummerOfCode > > > > > > Ok, to me making compilation faster is a valid reason. > > > > Does it actually make compilation faster though? > > > > Has it been measured? > > > > > > > The patch fails to apply. It seems because your mail client inserted an > > > > > additional newline before "b/". Try to use git-send-email or configure > > > > > the mail client properly. > > > > > > > > Let me try to use git-send-email instead. I stupidly don't understand > > > > how to use them, so I was making my patches manually... > > > > > > Or adjust the mail client correctly. You can send the patch to yourself > > > first and see if it's not "mangled" by the mail client when you debug > > > such an issue... > > > > > > But when you finally end up sending 10 patches in a series you'll find > > > git send-email much easier :). > > > > Figuring out how to generate proper patches is an important part of > > contributing to GCC, so part of any GSoC project. > [-- Attachment #2: is_reference_benchmark.C --] [-- Type: text/x-c++src, Size: 89639 bytes --] #if USE_BUILTIN template<class T> inline constexpr bool is_reference_v = __is_reference(T); #else template<class T> inline constexpr bool is_reference_v = false; template<class T> inline constexpr bool is_reference_v<T&> = true; template<class T> inline constexpr bool is_reference_v<T&&> = true; #endif template<int N> struct A; #define Y(N) \ static_assert(!is_reference_v<A<N>>); \ static_assert(!is_reference_v<A<N>*>);\ static_assert(is_reference_v<A<N>&>); \ static_assert(is_reference_v<A<N>&&>); \ static_assert(is_reference_v<const A<N>&>); \ static_assert(is_reference_v<const A<N>&&>); \ static_assert(is_reference_v<A<N>*&>); \ static_assert(is_reference_v<A<N>*&&>); \ #define X(N) Y(N) Y(-N) int main() { X(1); X(2); X(3); X(4); X(5); X(6); X(7); X(8); X(9); X(10); X(11); X(12); X(13); X(14); X(15); X(16); X(17); X(18); X(19); X(20); X(21); X(22); X(23); X(24); X(25); X(26); X(27); X(28); X(29); X(30); X(31); X(32); X(33); X(34); X(35); X(36); X(37); X(38); X(39); X(40); X(41); X(42); X(43); X(44); X(45); X(46); X(47); X(48); X(49); X(50); X(51); X(52); X(53); X(54); X(55); X(56); X(57); X(58); X(59); X(60); X(61); X(62); X(63); X(64); X(65); X(66); X(67); X(68); X(69); X(70); X(71); X(72); X(73); X(74); X(75); X(76); X(77); X(78); X(79); X(80); X(81); X(82); X(83); X(84); X(85); X(86); X(87); X(88); X(89); X(90); X(91); X(92); X(93); X(94); X(95); X(96); X(97); X(98); X(99); X(100); X(101); X(102); X(103); X(104); X(105); X(106); X(107); X(108); X(109); X(110); X(111); X(112); X(113); X(114); X(115); X(116); X(117); X(118); X(119); X(120); X(121); X(122); X(123); X(124); X(125); X(126); X(127); X(128); X(129); X(130); X(131); X(132); X(133); X(134); X(135); X(136); X(137); X(138); X(139); X(140); X(141); X(142); X(143); X(144); X(145); X(146); X(147); X(148); X(149); X(150); X(151); X(152); X(153); X(154); X(155); X(156); X(157); X(158); X(159); X(160); X(161); X(162); X(163); X(164); X(165); X(166); X(167); X(168); X(169); X(170); X(171); X(172); X(173); X(174); X(175); X(176); X(177); X(178); X(179); X(180); X(181); X(182); X(183); X(184); X(185); X(186); X(187); X(188); X(189); X(190); X(191); X(192); X(193); X(194); X(195); X(196); X(197); X(198); X(199); X(200); X(201); X(202); X(203); X(204); X(205); X(206); X(207); X(208); X(209); X(210); X(211); X(212); X(213); X(214); X(215); X(216); X(217); X(218); X(219); X(220); X(221); X(222); X(223); X(224); X(225); X(226); X(227); X(228); X(229); X(230); X(231); X(232); X(233); X(234); X(235); X(236); X(237); X(238); X(239); X(240); X(241); X(242); X(243); X(244); X(245); X(246); X(247); X(248); X(249); X(250); X(251); X(252); X(253); X(254); X(255); X(256); X(257); X(258); X(259); X(260); X(261); X(262); X(263); X(264); X(265); X(266); X(267); X(268); X(269); X(270); X(271); X(272); X(273); X(274); X(275); X(276); X(277); X(278); X(279); X(280); X(281); X(282); X(283); X(284); X(285); X(286); X(287); X(288); X(289); X(290); X(291); X(292); X(293); X(294); X(295); X(296); X(297); X(298); X(299); X(300); X(301); X(302); X(303); X(304); X(305); X(306); X(307); X(308); X(309); X(310); X(311); X(312); X(313); X(314); X(315); X(316); X(317); X(318); X(319); X(320); X(321); X(322); X(323); X(324); X(325); X(326); X(327); X(328); X(329); X(330); X(331); X(332); X(333); X(334); X(335); X(336); X(337); X(338); X(339); X(340); X(341); X(342); X(343); X(344); X(345); X(346); X(347); X(348); X(349); X(350); X(351); X(352); X(353); X(354); X(355); X(356); X(357); X(358); X(359); X(360); X(361); X(362); X(363); X(364); X(365); X(366); X(367); X(368); X(369); X(370); X(371); X(372); X(373); X(374); X(375); X(376); X(377); X(378); X(379); X(380); X(381); X(382); X(383); X(384); X(385); X(386); X(387); X(388); X(389); X(390); X(391); X(392); X(393); X(394); X(395); X(396); X(397); X(398); X(399); X(400); X(401); X(402); X(403); X(404); X(405); X(406); X(407); X(408); X(409); X(410); X(411); X(412); X(413); X(414); X(415); X(416); X(417); X(418); X(419); X(420); X(421); X(422); X(423); X(424); X(425); X(426); X(427); X(428); X(429); X(430); X(431); X(432); X(433); X(434); X(435); X(436); X(437); X(438); X(439); X(440); X(441); X(442); X(443); X(444); X(445); X(446); X(447); X(448); X(449); X(450); X(451); X(452); X(453); X(454); X(455); X(456); X(457); X(458); X(459); X(460); X(461); X(462); X(463); X(464); X(465); X(466); X(467); X(468); X(469); X(470); X(471); X(472); X(473); X(474); X(475); X(476); X(477); X(478); X(479); X(480); X(481); X(482); X(483); X(484); X(485); X(486); X(487); X(488); X(489); X(490); X(491); X(492); X(493); X(494); X(495); X(496); X(497); X(498); X(499); X(500); X(501); X(502); X(503); X(504); X(505); X(506); X(507); X(508); X(509); X(510); X(511); X(512); X(513); X(514); X(515); X(516); X(517); X(518); X(519); X(520); X(521); X(522); X(523); X(524); X(525); X(526); X(527); X(528); X(529); X(530); X(531); X(532); X(533); X(534); X(535); X(536); X(537); X(538); X(539); X(540); X(541); X(542); X(543); X(544); X(545); X(546); X(547); X(548); X(549); X(550); X(551); X(552); X(553); X(554); X(555); X(556); X(557); X(558); X(559); X(560); X(561); X(562); X(563); X(564); X(565); X(566); X(567); X(568); X(569); X(570); X(571); X(572); X(573); X(574); X(575); X(576); X(577); X(578); X(579); X(580); X(581); X(582); X(583); X(584); X(585); X(586); X(587); X(588); X(589); X(590); X(591); X(592); X(593); X(594); X(595); X(596); X(597); X(598); X(599); X(600); X(601); X(602); X(603); X(604); X(605); X(606); X(607); X(608); X(609); X(610); X(611); X(612); X(613); X(614); X(615); X(616); X(617); X(618); X(619); X(620); X(621); X(622); X(623); X(624); X(625); X(626); X(627); X(628); X(629); X(630); X(631); X(632); X(633); X(634); X(635); X(636); X(637); X(638); X(639); X(640); X(641); X(642); X(643); X(644); X(645); X(646); X(647); X(648); X(649); X(650); X(651); X(652); X(653); X(654); X(655); X(656); X(657); X(658); X(659); X(660); X(661); X(662); X(663); X(664); X(665); X(666); X(667); X(668); X(669); X(670); X(671); X(672); X(673); X(674); X(675); X(676); X(677); X(678); X(679); X(680); X(681); X(682); X(683); X(684); X(685); X(686); X(687); X(688); X(689); X(690); X(691); X(692); X(693); X(694); X(695); X(696); X(697); X(698); X(699); X(700); X(701); X(702); X(703); X(704); X(705); X(706); X(707); X(708); X(709); X(710); X(711); X(712); X(713); X(714); X(715); X(716); X(717); X(718); X(719); X(720); X(721); X(722); X(723); X(724); X(725); X(726); X(727); X(728); X(729); X(730); X(731); X(732); X(733); X(734); X(735); X(736); X(737); X(738); X(739); X(740); X(741); X(742); X(743); X(744); X(745); X(746); X(747); X(748); X(749); X(750); X(751); X(752); X(753); X(754); X(755); X(756); X(757); X(758); X(759); X(760); X(761); X(762); X(763); X(764); X(765); X(766); X(767); X(768); X(769); X(770); X(771); X(772); X(773); X(774); X(775); X(776); X(777); X(778); X(779); X(780); X(781); X(782); X(783); X(784); X(785); X(786); X(787); X(788); X(789); X(790); X(791); X(792); X(793); X(794); X(795); X(796); X(797); X(798); X(799); X(800); X(801); X(802); X(803); X(804); X(805); X(806); X(807); X(808); X(809); X(810); X(811); X(812); X(813); X(814); X(815); X(816); X(817); X(818); X(819); X(820); X(821); X(822); X(823); X(824); X(825); X(826); X(827); X(828); X(829); X(830); X(831); X(832); X(833); X(834); X(835); X(836); X(837); X(838); X(839); X(840); X(841); X(842); X(843); X(844); X(845); X(846); X(847); X(848); X(849); X(850); X(851); X(852); X(853); X(854); X(855); X(856); X(857); X(858); X(859); X(860); X(861); X(862); X(863); X(864); X(865); X(866); X(867); X(868); X(869); X(870); X(871); X(872); X(873); X(874); X(875); X(876); X(877); X(878); X(879); X(880); X(881); X(882); X(883); X(884); X(885); X(886); X(887); X(888); X(889); X(890); X(891); X(892); X(893); X(894); X(895); X(896); X(897); X(898); X(899); X(900); X(901); X(902); X(903); X(904); X(905); X(906); X(907); X(908); X(909); X(910); X(911); X(912); X(913); X(914); X(915); X(916); X(917); X(918); X(919); X(920); X(921); X(922); X(923); X(924); X(925); X(926); X(927); X(928); X(929); X(930); X(931); X(932); X(933); X(934); X(935); X(936); X(937); X(938); X(939); X(940); X(941); X(942); X(943); X(944); X(945); X(946); X(947); X(948); X(949); X(950); X(951); X(952); X(953); X(954); X(955); X(956); X(957); X(958); X(959); X(960); X(961); X(962); X(963); X(964); X(965); X(966); X(967); X(968); X(969); X(970); X(971); X(972); X(973); X(974); X(975); X(976); X(977); X(978); X(979); X(980); X(981); X(982); X(983); X(984); X(985); X(986); X(987); X(988); X(989); X(990); X(991); X(992); X(993); X(994); X(995); X(996); X(997); X(998); X(999); X(1000); X(1001); X(1002); X(1003); X(1004); X(1005); X(1006); X(1007); X(1008); X(1009); X(1010); X(1011); X(1012); X(1013); X(1014); X(1015); X(1016); X(1017); X(1018); X(1019); X(1020); X(1021); X(1022); X(1023); X(1024); X(1025); X(1026); X(1027); X(1028); X(1029); X(1030); X(1031); X(1032); X(1033); X(1034); X(1035); X(1036); X(1037); X(1038); X(1039); X(1040); X(1041); X(1042); X(1043); X(1044); X(1045); X(1046); X(1047); X(1048); X(1049); X(1050); X(1051); X(1052); X(1053); X(1054); X(1055); X(1056); X(1057); X(1058); X(1059); X(1060); X(1061); X(1062); X(1063); X(1064); X(1065); X(1066); X(1067); X(1068); X(1069); X(1070); X(1071); X(1072); X(1073); X(1074); X(1075); X(1076); X(1077); X(1078); X(1079); X(1080); X(1081); X(1082); X(1083); X(1084); X(1085); X(1086); X(1087); X(1088); X(1089); X(1090); X(1091); X(1092); X(1093); X(1094); X(1095); X(1096); X(1097); X(1098); X(1099); X(1100); X(1101); X(1102); X(1103); X(1104); X(1105); X(1106); X(1107); X(1108); X(1109); X(1110); X(1111); X(1112); X(1113); X(1114); X(1115); X(1116); X(1117); X(1118); X(1119); X(1120); X(1121); X(1122); X(1123); X(1124); X(1125); X(1126); X(1127); X(1128); X(1129); X(1130); X(1131); X(1132); X(1133); X(1134); X(1135); X(1136); X(1137); X(1138); X(1139); X(1140); X(1141); X(1142); X(1143); X(1144); X(1145); X(1146); X(1147); X(1148); X(1149); X(1150); X(1151); X(1152); X(1153); X(1154); X(1155); X(1156); X(1157); X(1158); X(1159); X(1160); X(1161); X(1162); X(1163); X(1164); X(1165); X(1166); X(1167); X(1168); X(1169); X(1170); X(1171); X(1172); X(1173); X(1174); X(1175); X(1176); X(1177); X(1178); X(1179); X(1180); X(1181); X(1182); X(1183); X(1184); X(1185); X(1186); X(1187); X(1188); X(1189); X(1190); X(1191); X(1192); X(1193); X(1194); X(1195); X(1196); X(1197); X(1198); X(1199); X(1200); X(1201); X(1202); X(1203); X(1204); X(1205); X(1206); X(1207); X(1208); X(1209); X(1210); X(1211); X(1212); X(1213); X(1214); X(1215); X(1216); X(1217); X(1218); X(1219); X(1220); X(1221); X(1222); X(1223); X(1224); X(1225); X(1226); X(1227); X(1228); X(1229); X(1230); X(1231); X(1232); X(1233); X(1234); X(1235); X(1236); X(1237); X(1238); X(1239); X(1240); X(1241); X(1242); X(1243); X(1244); X(1245); X(1246); X(1247); X(1248); X(1249); X(1250); X(1251); X(1252); X(1253); X(1254); X(1255); X(1256); X(1257); X(1258); X(1259); X(1260); X(1261); X(1262); X(1263); X(1264); X(1265); X(1266); X(1267); X(1268); X(1269); X(1270); X(1271); X(1272); X(1273); X(1274); X(1275); X(1276); X(1277); X(1278); X(1279); X(1280); X(1281); X(1282); X(1283); X(1284); X(1285); X(1286); X(1287); X(1288); X(1289); X(1290); X(1291); X(1292); X(1293); X(1294); X(1295); X(1296); X(1297); X(1298); X(1299); X(1300); X(1301); X(1302); X(1303); X(1304); X(1305); X(1306); X(1307); X(1308); X(1309); X(1310); X(1311); X(1312); X(1313); X(1314); X(1315); X(1316); X(1317); X(1318); X(1319); X(1320); X(1321); X(1322); X(1323); X(1324); X(1325); X(1326); X(1327); X(1328); X(1329); X(1330); X(1331); X(1332); X(1333); X(1334); X(1335); X(1336); X(1337); X(1338); X(1339); X(1340); X(1341); X(1342); X(1343); X(1344); X(1345); X(1346); X(1347); X(1348); X(1349); X(1350); X(1351); X(1352); X(1353); X(1354); X(1355); X(1356); X(1357); X(1358); X(1359); X(1360); X(1361); X(1362); X(1363); X(1364); X(1365); X(1366); X(1367); X(1368); X(1369); X(1370); X(1371); X(1372); X(1373); X(1374); X(1375); X(1376); X(1377); X(1378); X(1379); X(1380); X(1381); X(1382); X(1383); X(1384); X(1385); X(1386); X(1387); X(1388); X(1389); X(1390); X(1391); X(1392); X(1393); X(1394); X(1395); X(1396); X(1397); X(1398); X(1399); X(1400); X(1401); X(1402); X(1403); X(1404); X(1405); X(1406); X(1407); X(1408); X(1409); X(1410); X(1411); X(1412); X(1413); X(1414); X(1415); X(1416); X(1417); X(1418); X(1419); X(1420); X(1421); X(1422); X(1423); X(1424); X(1425); X(1426); X(1427); X(1428); X(1429); X(1430); X(1431); X(1432); X(1433); X(1434); X(1435); X(1436); X(1437); X(1438); X(1439); X(1440); X(1441); X(1442); X(1443); X(1444); X(1445); X(1446); X(1447); X(1448); X(1449); X(1450); X(1451); X(1452); X(1453); X(1454); X(1455); X(1456); X(1457); X(1458); X(1459); X(1460); X(1461); X(1462); X(1463); X(1464); X(1465); X(1466); X(1467); X(1468); X(1469); X(1470); X(1471); X(1472); X(1473); X(1474); X(1475); X(1476); X(1477); X(1478); X(1479); X(1480); X(1481); X(1482); X(1483); X(1484); X(1485); X(1486); X(1487); X(1488); X(1489); X(1490); X(1491); X(1492); X(1493); X(1494); X(1495); X(1496); X(1497); X(1498); X(1499); X(1500); X(1501); X(1502); X(1503); X(1504); X(1505); X(1506); X(1507); X(1508); X(1509); X(1510); X(1511); X(1512); X(1513); X(1514); X(1515); X(1516); X(1517); X(1518); X(1519); X(1520); X(1521); X(1522); X(1523); X(1524); X(1525); X(1526); X(1527); X(1528); X(1529); X(1530); X(1531); X(1532); X(1533); X(1534); X(1535); X(1536); X(1537); X(1538); X(1539); X(1540); X(1541); X(1542); X(1543); X(1544); X(1545); X(1546); X(1547); X(1548); X(1549); X(1550); X(1551); X(1552); X(1553); X(1554); X(1555); X(1556); X(1557); X(1558); X(1559); X(1560); X(1561); X(1562); X(1563); X(1564); X(1565); X(1566); X(1567); X(1568); X(1569); X(1570); X(1571); X(1572); X(1573); X(1574); X(1575); X(1576); X(1577); X(1578); X(1579); X(1580); X(1581); X(1582); X(1583); X(1584); X(1585); X(1586); X(1587); X(1588); X(1589); X(1590); X(1591); X(1592); X(1593); X(1594); X(1595); X(1596); X(1597); X(1598); X(1599); X(1600); X(1601); X(1602); X(1603); X(1604); X(1605); X(1606); X(1607); X(1608); X(1609); X(1610); X(1611); X(1612); X(1613); X(1614); X(1615); X(1616); X(1617); X(1618); X(1619); X(1620); X(1621); X(1622); X(1623); X(1624); X(1625); X(1626); X(1627); X(1628); X(1629); X(1630); X(1631); X(1632); X(1633); X(1634); X(1635); X(1636); X(1637); X(1638); X(1639); X(1640); X(1641); X(1642); X(1643); X(1644); X(1645); X(1646); X(1647); X(1648); X(1649); X(1650); X(1651); X(1652); X(1653); X(1654); X(1655); X(1656); X(1657); X(1658); X(1659); X(1660); X(1661); X(1662); X(1663); X(1664); X(1665); X(1666); X(1667); X(1668); X(1669); X(1670); X(1671); X(1672); X(1673); X(1674); X(1675); X(1676); X(1677); X(1678); X(1679); X(1680); X(1681); X(1682); X(1683); X(1684); X(1685); X(1686); X(1687); X(1688); X(1689); X(1690); X(1691); X(1692); X(1693); X(1694); X(1695); X(1696); X(1697); X(1698); X(1699); X(1700); X(1701); X(1702); X(1703); X(1704); X(1705); X(1706); X(1707); X(1708); X(1709); X(1710); X(1711); X(1712); X(1713); X(1714); X(1715); X(1716); X(1717); X(1718); X(1719); X(1720); X(1721); X(1722); X(1723); X(1724); X(1725); X(1726); X(1727); X(1728); X(1729); X(1730); X(1731); X(1732); X(1733); X(1734); X(1735); X(1736); X(1737); X(1738); X(1739); X(1740); X(1741); X(1742); X(1743); X(1744); X(1745); X(1746); X(1747); X(1748); X(1749); X(1750); X(1751); X(1752); X(1753); X(1754); X(1755); X(1756); X(1757); X(1758); X(1759); X(1760); X(1761); X(1762); X(1763); X(1764); X(1765); X(1766); X(1767); X(1768); X(1769); X(1770); X(1771); X(1772); X(1773); X(1774); X(1775); X(1776); X(1777); X(1778); X(1779); X(1780); X(1781); X(1782); X(1783); X(1784); X(1785); X(1786); X(1787); X(1788); X(1789); X(1790); X(1791); X(1792); X(1793); X(1794); X(1795); X(1796); X(1797); X(1798); X(1799); X(1800); X(1801); X(1802); X(1803); X(1804); X(1805); X(1806); X(1807); X(1808); X(1809); X(1810); X(1811); X(1812); X(1813); X(1814); X(1815); X(1816); X(1817); X(1818); X(1819); X(1820); X(1821); X(1822); X(1823); X(1824); X(1825); X(1826); X(1827); X(1828); X(1829); X(1830); X(1831); X(1832); X(1833); X(1834); X(1835); X(1836); X(1837); X(1838); X(1839); X(1840); X(1841); X(1842); X(1843); X(1844); X(1845); X(1846); X(1847); X(1848); X(1849); X(1850); X(1851); X(1852); X(1853); X(1854); X(1855); X(1856); X(1857); X(1858); X(1859); X(1860); X(1861); X(1862); X(1863); X(1864); X(1865); X(1866); X(1867); X(1868); X(1869); X(1870); X(1871); X(1872); X(1873); X(1874); X(1875); X(1876); X(1877); X(1878); X(1879); X(1880); X(1881); X(1882); X(1883); X(1884); X(1885); X(1886); X(1887); X(1888); X(1889); X(1890); X(1891); X(1892); X(1893); X(1894); X(1895); X(1896); X(1897); X(1898); X(1899); X(1900); X(1901); X(1902); X(1903); X(1904); X(1905); X(1906); X(1907); X(1908); X(1909); X(1910); X(1911); X(1912); X(1913); X(1914); X(1915); X(1916); X(1917); X(1918); X(1919); X(1920); X(1921); X(1922); X(1923); X(1924); X(1925); X(1926); X(1927); X(1928); X(1929); X(1930); X(1931); X(1932); X(1933); X(1934); X(1935); X(1936); X(1937); X(1938); X(1939); X(1940); X(1941); X(1942); X(1943); X(1944); X(1945); X(1946); X(1947); X(1948); X(1949); X(1950); X(1951); X(1952); X(1953); X(1954); X(1955); X(1956); X(1957); X(1958); X(1959); X(1960); X(1961); X(1962); X(1963); X(1964); X(1965); X(1966); X(1967); X(1968); X(1969); X(1970); X(1971); X(1972); X(1973); X(1974); X(1975); X(1976); X(1977); X(1978); X(1979); X(1980); X(1981); X(1982); X(1983); X(1984); X(1985); X(1986); X(1987); X(1988); X(1989); X(1990); X(1991); X(1992); X(1993); X(1994); X(1995); X(1996); X(1997); X(1998); X(1999); X(2000); X(2001); X(2002); X(2003); X(2004); X(2005); X(2006); X(2007); X(2008); X(2009); X(2010); X(2011); X(2012); X(2013); X(2014); X(2015); X(2016); X(2017); X(2018); X(2019); X(2020); X(2021); X(2022); X(2023); X(2024); X(2025); X(2026); X(2027); X(2028); X(2029); X(2030); X(2031); X(2032); X(2033); X(2034); X(2035); X(2036); X(2037); X(2038); X(2039); X(2040); X(2041); X(2042); X(2043); X(2044); X(2045); X(2046); X(2047); X(2048); X(2049); X(2050); X(2051); X(2052); X(2053); X(2054); X(2055); X(2056); X(2057); X(2058); X(2059); X(2060); X(2061); X(2062); X(2063); X(2064); X(2065); X(2066); X(2067); X(2068); X(2069); X(2070); X(2071); X(2072); X(2073); X(2074); X(2075); X(2076); X(2077); X(2078); X(2079); X(2080); X(2081); X(2082); X(2083); X(2084); X(2085); X(2086); X(2087); X(2088); X(2089); X(2090); X(2091); X(2092); X(2093); X(2094); X(2095); X(2096); X(2097); X(2098); X(2099); X(2100); X(2101); X(2102); X(2103); X(2104); X(2105); X(2106); X(2107); X(2108); X(2109); X(2110); X(2111); X(2112); X(2113); X(2114); X(2115); X(2116); X(2117); X(2118); X(2119); X(2120); X(2121); X(2122); X(2123); X(2124); X(2125); X(2126); X(2127); X(2128); X(2129); X(2130); X(2131); X(2132); X(2133); X(2134); X(2135); X(2136); X(2137); X(2138); X(2139); X(2140); X(2141); X(2142); X(2143); X(2144); X(2145); X(2146); X(2147); X(2148); X(2149); X(2150); X(2151); X(2152); X(2153); X(2154); X(2155); X(2156); X(2157); X(2158); X(2159); X(2160); X(2161); X(2162); X(2163); X(2164); X(2165); X(2166); X(2167); X(2168); X(2169); X(2170); X(2171); X(2172); X(2173); X(2174); X(2175); X(2176); X(2177); X(2178); X(2179); X(2180); X(2181); X(2182); X(2183); X(2184); X(2185); X(2186); X(2187); X(2188); X(2189); X(2190); X(2191); X(2192); X(2193); X(2194); X(2195); X(2196); X(2197); X(2198); X(2199); X(2200); X(2201); X(2202); X(2203); X(2204); X(2205); X(2206); X(2207); X(2208); X(2209); X(2210); X(2211); X(2212); X(2213); X(2214); X(2215); X(2216); X(2217); X(2218); X(2219); X(2220); X(2221); X(2222); X(2223); X(2224); X(2225); X(2226); X(2227); X(2228); X(2229); X(2230); X(2231); X(2232); X(2233); X(2234); X(2235); X(2236); X(2237); X(2238); X(2239); X(2240); X(2241); X(2242); X(2243); X(2244); X(2245); X(2246); X(2247); X(2248); X(2249); X(2250); X(2251); X(2252); X(2253); X(2254); X(2255); X(2256); X(2257); X(2258); X(2259); X(2260); X(2261); X(2262); X(2263); X(2264); X(2265); X(2266); X(2267); X(2268); X(2269); X(2270); X(2271); X(2272); X(2273); X(2274); X(2275); X(2276); X(2277); X(2278); X(2279); X(2280); X(2281); X(2282); X(2283); X(2284); X(2285); X(2286); X(2287); X(2288); X(2289); X(2290); X(2291); X(2292); X(2293); X(2294); X(2295); X(2296); X(2297); X(2298); X(2299); X(2300); X(2301); X(2302); X(2303); X(2304); X(2305); X(2306); X(2307); X(2308); X(2309); X(2310); X(2311); X(2312); X(2313); X(2314); X(2315); X(2316); X(2317); X(2318); X(2319); X(2320); X(2321); X(2322); X(2323); X(2324); X(2325); X(2326); X(2327); X(2328); X(2329); X(2330); X(2331); X(2332); X(2333); X(2334); X(2335); X(2336); X(2337); X(2338); X(2339); X(2340); X(2341); X(2342); X(2343); X(2344); X(2345); X(2346); X(2347); X(2348); X(2349); X(2350); X(2351); X(2352); X(2353); X(2354); X(2355); X(2356); X(2357); X(2358); X(2359); X(2360); X(2361); X(2362); X(2363); X(2364); X(2365); X(2366); X(2367); X(2368); X(2369); X(2370); X(2371); X(2372); X(2373); X(2374); X(2375); X(2376); X(2377); X(2378); X(2379); X(2380); X(2381); X(2382); X(2383); X(2384); X(2385); X(2386); X(2387); X(2388); X(2389); X(2390); X(2391); X(2392); X(2393); X(2394); X(2395); X(2396); X(2397); X(2398); X(2399); X(2400); X(2401); X(2402); X(2403); X(2404); X(2405); X(2406); X(2407); X(2408); X(2409); X(2410); X(2411); X(2412); X(2413); X(2414); X(2415); X(2416); X(2417); X(2418); X(2419); X(2420); X(2421); X(2422); X(2423); X(2424); X(2425); X(2426); X(2427); X(2428); X(2429); X(2430); X(2431); X(2432); X(2433); X(2434); X(2435); X(2436); X(2437); X(2438); X(2439); X(2440); X(2441); X(2442); X(2443); X(2444); X(2445); X(2446); X(2447); X(2448); X(2449); X(2450); X(2451); X(2452); X(2453); X(2454); X(2455); X(2456); X(2457); X(2458); X(2459); X(2460); X(2461); X(2462); X(2463); X(2464); X(2465); X(2466); X(2467); X(2468); X(2469); X(2470); X(2471); X(2472); X(2473); X(2474); X(2475); X(2476); X(2477); X(2478); X(2479); X(2480); X(2481); X(2482); X(2483); X(2484); X(2485); X(2486); X(2487); X(2488); X(2489); X(2490); X(2491); X(2492); X(2493); X(2494); X(2495); X(2496); X(2497); X(2498); X(2499); X(2500); X(2501); X(2502); X(2503); X(2504); X(2505); X(2506); X(2507); X(2508); X(2509); X(2510); X(2511); X(2512); X(2513); X(2514); X(2515); X(2516); X(2517); X(2518); X(2519); X(2520); X(2521); X(2522); X(2523); X(2524); X(2525); X(2526); X(2527); X(2528); X(2529); X(2530); X(2531); X(2532); X(2533); X(2534); X(2535); X(2536); X(2537); X(2538); X(2539); X(2540); X(2541); X(2542); X(2543); X(2544); X(2545); X(2546); X(2547); X(2548); X(2549); X(2550); X(2551); X(2552); X(2553); X(2554); X(2555); X(2556); X(2557); X(2558); X(2559); X(2560); X(2561); X(2562); X(2563); X(2564); X(2565); X(2566); X(2567); X(2568); X(2569); X(2570); X(2571); X(2572); X(2573); X(2574); X(2575); X(2576); X(2577); X(2578); X(2579); X(2580); X(2581); X(2582); X(2583); X(2584); X(2585); X(2586); X(2587); X(2588); X(2589); X(2590); X(2591); X(2592); X(2593); X(2594); X(2595); X(2596); X(2597); X(2598); X(2599); X(2600); X(2601); X(2602); X(2603); X(2604); X(2605); X(2606); X(2607); X(2608); X(2609); X(2610); X(2611); X(2612); X(2613); X(2614); X(2615); X(2616); X(2617); X(2618); X(2619); X(2620); X(2621); X(2622); X(2623); X(2624); X(2625); X(2626); X(2627); X(2628); X(2629); X(2630); X(2631); X(2632); X(2633); X(2634); X(2635); X(2636); X(2637); X(2638); X(2639); X(2640); X(2641); X(2642); X(2643); X(2644); X(2645); X(2646); X(2647); X(2648); X(2649); X(2650); X(2651); X(2652); X(2653); X(2654); X(2655); X(2656); X(2657); X(2658); X(2659); X(2660); X(2661); X(2662); X(2663); X(2664); X(2665); X(2666); X(2667); X(2668); X(2669); X(2670); X(2671); X(2672); X(2673); X(2674); X(2675); X(2676); X(2677); X(2678); X(2679); X(2680); X(2681); X(2682); X(2683); X(2684); X(2685); X(2686); X(2687); X(2688); X(2689); X(2690); X(2691); X(2692); X(2693); X(2694); X(2695); X(2696); X(2697); X(2698); X(2699); X(2700); X(2701); X(2702); X(2703); X(2704); X(2705); X(2706); X(2707); X(2708); X(2709); X(2710); X(2711); X(2712); X(2713); X(2714); X(2715); X(2716); X(2717); X(2718); X(2719); X(2720); X(2721); X(2722); X(2723); X(2724); X(2725); X(2726); X(2727); X(2728); X(2729); X(2730); X(2731); X(2732); X(2733); X(2734); X(2735); X(2736); X(2737); X(2738); X(2739); X(2740); X(2741); X(2742); X(2743); X(2744); X(2745); X(2746); X(2747); X(2748); X(2749); X(2750); X(2751); X(2752); X(2753); X(2754); X(2755); X(2756); X(2757); X(2758); X(2759); X(2760); X(2761); X(2762); X(2763); X(2764); X(2765); X(2766); X(2767); X(2768); X(2769); X(2770); X(2771); X(2772); X(2773); X(2774); X(2775); X(2776); X(2777); X(2778); X(2779); X(2780); X(2781); X(2782); X(2783); X(2784); X(2785); X(2786); X(2787); X(2788); X(2789); X(2790); X(2791); X(2792); X(2793); X(2794); X(2795); X(2796); X(2797); X(2798); X(2799); X(2800); X(2801); X(2802); X(2803); X(2804); X(2805); X(2806); X(2807); X(2808); X(2809); X(2810); X(2811); X(2812); X(2813); X(2814); X(2815); X(2816); X(2817); X(2818); X(2819); X(2820); X(2821); X(2822); X(2823); X(2824); X(2825); X(2826); X(2827); X(2828); X(2829); X(2830); X(2831); X(2832); X(2833); X(2834); X(2835); X(2836); X(2837); X(2838); X(2839); X(2840); X(2841); X(2842); X(2843); X(2844); X(2845); X(2846); X(2847); X(2848); X(2849); X(2850); X(2851); X(2852); X(2853); X(2854); X(2855); X(2856); X(2857); X(2858); X(2859); X(2860); X(2861); X(2862); X(2863); X(2864); X(2865); X(2866); X(2867); X(2868); X(2869); X(2870); X(2871); X(2872); X(2873); X(2874); X(2875); X(2876); X(2877); X(2878); X(2879); X(2880); X(2881); X(2882); X(2883); X(2884); X(2885); X(2886); X(2887); X(2888); X(2889); X(2890); X(2891); X(2892); X(2893); X(2894); X(2895); X(2896); X(2897); X(2898); X(2899); X(2900); X(2901); X(2902); X(2903); X(2904); X(2905); X(2906); X(2907); X(2908); X(2909); X(2910); X(2911); X(2912); X(2913); X(2914); X(2915); X(2916); X(2917); X(2918); X(2919); X(2920); X(2921); X(2922); X(2923); X(2924); X(2925); X(2926); X(2927); X(2928); X(2929); X(2930); X(2931); X(2932); X(2933); X(2934); X(2935); X(2936); X(2937); X(2938); X(2939); X(2940); X(2941); X(2942); X(2943); X(2944); X(2945); X(2946); X(2947); X(2948); X(2949); X(2950); X(2951); X(2952); X(2953); X(2954); X(2955); X(2956); X(2957); X(2958); X(2959); X(2960); X(2961); X(2962); X(2963); X(2964); X(2965); X(2966); X(2967); X(2968); X(2969); X(2970); X(2971); X(2972); X(2973); X(2974); X(2975); X(2976); X(2977); X(2978); X(2979); X(2980); X(2981); X(2982); X(2983); X(2984); X(2985); X(2986); X(2987); X(2988); X(2989); X(2990); X(2991); X(2992); X(2993); X(2994); X(2995); X(2996); X(2997); X(2998); X(2999); X(3000); X(3001); X(3002); X(3003); X(3004); X(3005); X(3006); X(3007); X(3008); X(3009); X(3010); X(3011); X(3012); X(3013); X(3014); X(3015); X(3016); X(3017); X(3018); X(3019); X(3020); X(3021); X(3022); X(3023); X(3024); X(3025); X(3026); X(3027); X(3028); X(3029); X(3030); X(3031); X(3032); X(3033); X(3034); X(3035); X(3036); X(3037); X(3038); X(3039); X(3040); X(3041); X(3042); X(3043); X(3044); X(3045); X(3046); X(3047); X(3048); X(3049); X(3050); X(3051); X(3052); X(3053); X(3054); X(3055); X(3056); X(3057); X(3058); X(3059); X(3060); X(3061); X(3062); X(3063); X(3064); X(3065); X(3066); X(3067); X(3068); X(3069); X(3070); X(3071); X(3072); X(3073); X(3074); X(3075); X(3076); X(3077); X(3078); X(3079); X(3080); X(3081); X(3082); X(3083); X(3084); X(3085); X(3086); X(3087); X(3088); X(3089); X(3090); X(3091); X(3092); X(3093); X(3094); X(3095); X(3096); X(3097); X(3098); X(3099); X(3100); X(3101); X(3102); X(3103); X(3104); X(3105); X(3106); X(3107); X(3108); X(3109); X(3110); X(3111); X(3112); X(3113); X(3114); X(3115); X(3116); X(3117); X(3118); X(3119); X(3120); X(3121); X(3122); X(3123); X(3124); X(3125); X(3126); X(3127); X(3128); X(3129); X(3130); X(3131); X(3132); X(3133); X(3134); X(3135); X(3136); X(3137); X(3138); X(3139); X(3140); X(3141); X(3142); X(3143); X(3144); X(3145); X(3146); X(3147); X(3148); X(3149); X(3150); X(3151); X(3152); X(3153); X(3154); X(3155); X(3156); X(3157); X(3158); X(3159); X(3160); X(3161); X(3162); X(3163); X(3164); X(3165); X(3166); X(3167); X(3168); X(3169); X(3170); X(3171); X(3172); X(3173); X(3174); X(3175); X(3176); X(3177); X(3178); X(3179); X(3180); X(3181); X(3182); X(3183); X(3184); X(3185); X(3186); X(3187); X(3188); X(3189); X(3190); X(3191); X(3192); X(3193); X(3194); X(3195); X(3196); X(3197); X(3198); X(3199); X(3200); X(3201); X(3202); X(3203); X(3204); X(3205); X(3206); X(3207); X(3208); X(3209); X(3210); X(3211); X(3212); X(3213); X(3214); X(3215); X(3216); X(3217); X(3218); X(3219); X(3220); X(3221); X(3222); X(3223); X(3224); X(3225); X(3226); X(3227); X(3228); X(3229); X(3230); X(3231); X(3232); X(3233); X(3234); X(3235); X(3236); X(3237); X(3238); X(3239); X(3240); X(3241); X(3242); X(3243); X(3244); X(3245); X(3246); X(3247); X(3248); X(3249); X(3250); X(3251); X(3252); X(3253); X(3254); X(3255); X(3256); X(3257); X(3258); X(3259); X(3260); X(3261); X(3262); X(3263); X(3264); X(3265); X(3266); X(3267); X(3268); X(3269); X(3270); X(3271); X(3272); X(3273); X(3274); X(3275); X(3276); X(3277); X(3278); X(3279); X(3280); X(3281); X(3282); X(3283); X(3284); X(3285); X(3286); X(3287); X(3288); X(3289); X(3290); X(3291); X(3292); X(3293); X(3294); X(3295); X(3296); X(3297); X(3298); X(3299); X(3300); X(3301); X(3302); X(3303); X(3304); X(3305); X(3306); X(3307); X(3308); X(3309); X(3310); X(3311); X(3312); X(3313); X(3314); X(3315); X(3316); X(3317); X(3318); X(3319); X(3320); X(3321); X(3322); X(3323); X(3324); X(3325); X(3326); X(3327); X(3328); X(3329); X(3330); X(3331); X(3332); X(3333); X(3334); X(3335); X(3336); X(3337); X(3338); X(3339); X(3340); X(3341); X(3342); X(3343); X(3344); X(3345); X(3346); X(3347); X(3348); X(3349); X(3350); X(3351); X(3352); X(3353); X(3354); X(3355); X(3356); X(3357); X(3358); X(3359); X(3360); X(3361); X(3362); X(3363); X(3364); X(3365); X(3366); X(3367); X(3368); X(3369); X(3370); X(3371); X(3372); X(3373); X(3374); X(3375); X(3376); X(3377); X(3378); X(3379); X(3380); X(3381); X(3382); X(3383); X(3384); X(3385); X(3386); X(3387); X(3388); X(3389); X(3390); X(3391); X(3392); X(3393); X(3394); X(3395); X(3396); X(3397); X(3398); X(3399); X(3400); X(3401); X(3402); X(3403); X(3404); X(3405); X(3406); X(3407); X(3408); X(3409); X(3410); X(3411); X(3412); X(3413); X(3414); X(3415); X(3416); X(3417); X(3418); X(3419); X(3420); X(3421); X(3422); X(3423); X(3424); X(3425); X(3426); X(3427); X(3428); X(3429); X(3430); X(3431); X(3432); X(3433); X(3434); X(3435); X(3436); X(3437); X(3438); X(3439); X(3440); X(3441); X(3442); X(3443); X(3444); X(3445); X(3446); X(3447); X(3448); X(3449); X(3450); X(3451); X(3452); X(3453); X(3454); X(3455); X(3456); X(3457); X(3458); X(3459); X(3460); X(3461); X(3462); X(3463); X(3464); X(3465); X(3466); X(3467); X(3468); X(3469); X(3470); X(3471); X(3472); X(3473); X(3474); X(3475); X(3476); X(3477); X(3478); X(3479); X(3480); X(3481); X(3482); X(3483); X(3484); X(3485); X(3486); X(3487); X(3488); X(3489); X(3490); X(3491); X(3492); X(3493); X(3494); X(3495); X(3496); X(3497); X(3498); X(3499); X(3500); X(3501); X(3502); X(3503); X(3504); X(3505); X(3506); X(3507); X(3508); X(3509); X(3510); X(3511); X(3512); X(3513); X(3514); X(3515); X(3516); X(3517); X(3518); X(3519); X(3520); X(3521); X(3522); X(3523); X(3524); X(3525); X(3526); X(3527); X(3528); X(3529); X(3530); X(3531); X(3532); X(3533); X(3534); X(3535); X(3536); X(3537); X(3538); X(3539); X(3540); X(3541); X(3542); X(3543); X(3544); X(3545); X(3546); X(3547); X(3548); X(3549); X(3550); X(3551); X(3552); X(3553); X(3554); X(3555); X(3556); X(3557); X(3558); X(3559); X(3560); X(3561); X(3562); X(3563); X(3564); X(3565); X(3566); X(3567); X(3568); X(3569); X(3570); X(3571); X(3572); X(3573); X(3574); X(3575); X(3576); X(3577); X(3578); X(3579); X(3580); X(3581); X(3582); X(3583); X(3584); X(3585); X(3586); X(3587); X(3588); X(3589); X(3590); X(3591); X(3592); X(3593); X(3594); X(3595); X(3596); X(3597); X(3598); X(3599); X(3600); X(3601); X(3602); X(3603); X(3604); X(3605); X(3606); X(3607); X(3608); X(3609); X(3610); X(3611); X(3612); X(3613); X(3614); X(3615); X(3616); X(3617); X(3618); X(3619); X(3620); X(3621); X(3622); X(3623); X(3624); X(3625); X(3626); X(3627); X(3628); X(3629); X(3630); X(3631); X(3632); X(3633); X(3634); X(3635); X(3636); X(3637); X(3638); X(3639); X(3640); X(3641); X(3642); X(3643); X(3644); X(3645); X(3646); X(3647); X(3648); X(3649); X(3650); X(3651); X(3652); X(3653); X(3654); X(3655); X(3656); X(3657); X(3658); X(3659); X(3660); X(3661); X(3662); X(3663); X(3664); X(3665); X(3666); X(3667); X(3668); X(3669); X(3670); X(3671); X(3672); X(3673); X(3674); X(3675); X(3676); X(3677); X(3678); X(3679); X(3680); X(3681); X(3682); X(3683); X(3684); X(3685); X(3686); X(3687); X(3688); X(3689); X(3690); X(3691); X(3692); X(3693); X(3694); X(3695); X(3696); X(3697); X(3698); X(3699); X(3700); X(3701); X(3702); X(3703); X(3704); X(3705); X(3706); X(3707); X(3708); X(3709); X(3710); X(3711); X(3712); X(3713); X(3714); X(3715); X(3716); X(3717); X(3718); X(3719); X(3720); X(3721); X(3722); X(3723); X(3724); X(3725); X(3726); X(3727); X(3728); X(3729); X(3730); X(3731); X(3732); X(3733); X(3734); X(3735); X(3736); X(3737); X(3738); X(3739); X(3740); X(3741); X(3742); X(3743); X(3744); X(3745); X(3746); X(3747); X(3748); X(3749); X(3750); X(3751); X(3752); X(3753); X(3754); X(3755); X(3756); X(3757); X(3758); X(3759); X(3760); X(3761); X(3762); X(3763); X(3764); X(3765); X(3766); X(3767); X(3768); X(3769); X(3770); X(3771); X(3772); X(3773); X(3774); X(3775); X(3776); X(3777); X(3778); X(3779); X(3780); X(3781); X(3782); X(3783); X(3784); X(3785); X(3786); X(3787); X(3788); X(3789); X(3790); X(3791); X(3792); X(3793); X(3794); X(3795); X(3796); X(3797); X(3798); X(3799); X(3800); X(3801); X(3802); X(3803); X(3804); X(3805); X(3806); X(3807); X(3808); X(3809); X(3810); X(3811); X(3812); X(3813); X(3814); X(3815); X(3816); X(3817); X(3818); X(3819); X(3820); X(3821); X(3822); X(3823); X(3824); X(3825); X(3826); X(3827); X(3828); X(3829); X(3830); X(3831); X(3832); X(3833); X(3834); X(3835); X(3836); X(3837); X(3838); X(3839); X(3840); X(3841); X(3842); X(3843); X(3844); X(3845); X(3846); X(3847); X(3848); X(3849); X(3850); X(3851); X(3852); X(3853); X(3854); X(3855); X(3856); X(3857); X(3858); X(3859); X(3860); X(3861); X(3862); X(3863); X(3864); X(3865); X(3866); X(3867); X(3868); X(3869); X(3870); X(3871); X(3872); X(3873); X(3874); X(3875); X(3876); X(3877); X(3878); X(3879); X(3880); X(3881); X(3882); X(3883); X(3884); X(3885); X(3886); X(3887); X(3888); X(3889); X(3890); X(3891); X(3892); X(3893); X(3894); X(3895); X(3896); X(3897); X(3898); X(3899); X(3900); X(3901); X(3902); X(3903); X(3904); X(3905); X(3906); X(3907); X(3908); X(3909); X(3910); X(3911); X(3912); X(3913); X(3914); X(3915); X(3916); X(3917); X(3918); X(3919); X(3920); X(3921); X(3922); X(3923); X(3924); X(3925); X(3926); X(3927); X(3928); X(3929); X(3930); X(3931); X(3932); X(3933); X(3934); X(3935); X(3936); X(3937); X(3938); X(3939); X(3940); X(3941); X(3942); X(3943); X(3944); X(3945); X(3946); X(3947); X(3948); X(3949); X(3950); X(3951); X(3952); X(3953); X(3954); X(3955); X(3956); X(3957); X(3958); X(3959); X(3960); X(3961); X(3962); X(3963); X(3964); X(3965); X(3966); X(3967); X(3968); X(3969); X(3970); X(3971); X(3972); X(3973); X(3974); X(3975); X(3976); X(3977); X(3978); X(3979); X(3980); X(3981); X(3982); X(3983); X(3984); X(3985); X(3986); X(3987); X(3988); X(3989); X(3990); X(3991); X(3992); X(3993); X(3994); X(3995); X(3996); X(3997); X(3998); X(3999); X(4000); X(4001); X(4002); X(4003); X(4004); X(4005); X(4006); X(4007); X(4008); X(4009); X(4010); X(4011); X(4012); X(4013); X(4014); X(4015); X(4016); X(4017); X(4018); X(4019); X(4020); X(4021); X(4022); X(4023); X(4024); X(4025); X(4026); X(4027); X(4028); X(4029); X(4030); X(4031); X(4032); X(4033); X(4034); X(4035); X(4036); X(4037); X(4038); X(4039); X(4040); X(4041); X(4042); X(4043); X(4044); X(4045); X(4046); X(4047); X(4048); X(4049); X(4050); X(4051); X(4052); X(4053); X(4054); X(4055); X(4056); X(4057); X(4058); X(4059); X(4060); X(4061); X(4062); X(4063); X(4064); X(4065); X(4066); X(4067); X(4068); X(4069); X(4070); X(4071); X(4072); X(4073); X(4074); X(4075); X(4076); X(4077); X(4078); X(4079); X(4080); X(4081); X(4082); X(4083); X(4084); X(4085); X(4086); X(4087); X(4088); X(4089); X(4090); X(4091); X(4092); X(4093); X(4094); X(4095); X(4096); X(4097); X(4098); X(4099); X(4100); X(4101); X(4102); X(4103); X(4104); X(4105); X(4106); X(4107); X(4108); X(4109); X(4110); X(4111); X(4112); X(4113); X(4114); X(4115); X(4116); X(4117); X(4118); X(4119); X(4120); X(4121); X(4122); X(4123); X(4124); X(4125); X(4126); X(4127); X(4128); X(4129); X(4130); X(4131); X(4132); X(4133); X(4134); X(4135); X(4136); X(4137); X(4138); X(4139); X(4140); X(4141); X(4142); X(4143); X(4144); X(4145); X(4146); X(4147); X(4148); X(4149); X(4150); X(4151); X(4152); X(4153); X(4154); X(4155); X(4156); X(4157); X(4158); X(4159); X(4160); X(4161); X(4162); X(4163); X(4164); X(4165); X(4166); X(4167); X(4168); X(4169); X(4170); X(4171); X(4172); X(4173); X(4174); X(4175); X(4176); X(4177); X(4178); X(4179); X(4180); X(4181); X(4182); X(4183); X(4184); X(4185); X(4186); X(4187); X(4188); X(4189); X(4190); X(4191); X(4192); X(4193); X(4194); X(4195); X(4196); X(4197); X(4198); X(4199); X(4200); X(4201); X(4202); X(4203); X(4204); X(4205); X(4206); X(4207); X(4208); X(4209); X(4210); X(4211); X(4212); X(4213); X(4214); X(4215); X(4216); X(4217); X(4218); X(4219); X(4220); X(4221); X(4222); X(4223); X(4224); X(4225); X(4226); X(4227); X(4228); X(4229); X(4230); X(4231); X(4232); X(4233); X(4234); X(4235); X(4236); X(4237); X(4238); X(4239); X(4240); X(4241); X(4242); X(4243); X(4244); X(4245); X(4246); X(4247); X(4248); X(4249); X(4250); X(4251); X(4252); X(4253); X(4254); X(4255); X(4256); X(4257); X(4258); X(4259); X(4260); X(4261); X(4262); X(4263); X(4264); X(4265); X(4266); X(4267); X(4268); X(4269); X(4270); X(4271); X(4272); X(4273); X(4274); X(4275); X(4276); X(4277); X(4278); X(4279); X(4280); X(4281); X(4282); X(4283); X(4284); X(4285); X(4286); X(4287); X(4288); X(4289); X(4290); X(4291); X(4292); X(4293); X(4294); X(4295); X(4296); X(4297); X(4298); X(4299); X(4300); X(4301); X(4302); X(4303); X(4304); X(4305); X(4306); X(4307); X(4308); X(4309); X(4310); X(4311); X(4312); X(4313); X(4314); X(4315); X(4316); X(4317); X(4318); X(4319); X(4320); X(4321); X(4322); X(4323); X(4324); X(4325); X(4326); X(4327); X(4328); X(4329); X(4330); X(4331); X(4332); X(4333); X(4334); X(4335); X(4336); X(4337); X(4338); X(4339); X(4340); X(4341); X(4342); X(4343); X(4344); X(4345); X(4346); X(4347); X(4348); X(4349); X(4350); X(4351); X(4352); X(4353); X(4354); X(4355); X(4356); X(4357); X(4358); X(4359); X(4360); X(4361); X(4362); X(4363); X(4364); X(4365); X(4366); X(4367); X(4368); X(4369); X(4370); X(4371); X(4372); X(4373); X(4374); X(4375); X(4376); X(4377); X(4378); X(4379); X(4380); X(4381); X(4382); X(4383); X(4384); X(4385); X(4386); X(4387); X(4388); X(4389); X(4390); X(4391); X(4392); X(4393); X(4394); X(4395); X(4396); X(4397); X(4398); X(4399); X(4400); X(4401); X(4402); X(4403); X(4404); X(4405); X(4406); X(4407); X(4408); X(4409); X(4410); X(4411); X(4412); X(4413); X(4414); X(4415); X(4416); X(4417); X(4418); X(4419); X(4420); X(4421); X(4422); X(4423); X(4424); X(4425); X(4426); X(4427); X(4428); X(4429); X(4430); X(4431); X(4432); X(4433); X(4434); X(4435); X(4436); X(4437); X(4438); X(4439); X(4440); X(4441); X(4442); X(4443); X(4444); X(4445); X(4446); X(4447); X(4448); X(4449); X(4450); X(4451); X(4452); X(4453); X(4454); X(4455); X(4456); X(4457); X(4458); X(4459); X(4460); X(4461); X(4462); X(4463); X(4464); X(4465); X(4466); X(4467); X(4468); X(4469); X(4470); X(4471); X(4472); X(4473); X(4474); X(4475); X(4476); X(4477); X(4478); X(4479); X(4480); X(4481); X(4482); X(4483); X(4484); X(4485); X(4486); X(4487); X(4488); X(4489); X(4490); X(4491); X(4492); X(4493); X(4494); X(4495); X(4496); X(4497); X(4498); X(4499); X(4500); X(4501); X(4502); X(4503); X(4504); X(4505); X(4506); X(4507); X(4508); X(4509); X(4510); X(4511); X(4512); X(4513); X(4514); X(4515); X(4516); X(4517); X(4518); X(4519); X(4520); X(4521); X(4522); X(4523); X(4524); X(4525); X(4526); X(4527); X(4528); X(4529); X(4530); X(4531); X(4532); X(4533); X(4534); X(4535); X(4536); X(4537); X(4538); X(4539); X(4540); X(4541); X(4542); X(4543); X(4544); X(4545); X(4546); X(4547); X(4548); X(4549); X(4550); X(4551); X(4552); X(4553); X(4554); X(4555); X(4556); X(4557); X(4558); X(4559); X(4560); X(4561); X(4562); X(4563); X(4564); X(4565); X(4566); X(4567); X(4568); X(4569); X(4570); X(4571); X(4572); X(4573); X(4574); X(4575); X(4576); X(4577); X(4578); X(4579); X(4580); X(4581); X(4582); X(4583); X(4584); X(4585); X(4586); X(4587); X(4588); X(4589); X(4590); X(4591); X(4592); X(4593); X(4594); X(4595); X(4596); X(4597); X(4598); X(4599); X(4600); X(4601); X(4602); X(4603); X(4604); X(4605); X(4606); X(4607); X(4608); X(4609); X(4610); X(4611); X(4612); X(4613); X(4614); X(4615); X(4616); X(4617); X(4618); X(4619); X(4620); X(4621); X(4622); X(4623); X(4624); X(4625); X(4626); X(4627); X(4628); X(4629); X(4630); X(4631); X(4632); X(4633); X(4634); X(4635); X(4636); X(4637); X(4638); X(4639); X(4640); X(4641); X(4642); X(4643); X(4644); X(4645); X(4646); X(4647); X(4648); X(4649); X(4650); X(4651); X(4652); X(4653); X(4654); X(4655); X(4656); X(4657); X(4658); X(4659); X(4660); X(4661); X(4662); X(4663); X(4664); X(4665); X(4666); X(4667); X(4668); X(4669); X(4670); X(4671); X(4672); X(4673); X(4674); X(4675); X(4676); X(4677); X(4678); X(4679); X(4680); X(4681); X(4682); X(4683); X(4684); X(4685); X(4686); X(4687); X(4688); X(4689); X(4690); X(4691); X(4692); X(4693); X(4694); X(4695); X(4696); X(4697); X(4698); X(4699); X(4700); X(4701); X(4702); X(4703); X(4704); X(4705); X(4706); X(4707); X(4708); X(4709); X(4710); X(4711); X(4712); X(4713); X(4714); X(4715); X(4716); X(4717); X(4718); X(4719); X(4720); X(4721); X(4722); X(4723); X(4724); X(4725); X(4726); X(4727); X(4728); X(4729); X(4730); X(4731); X(4732); X(4733); X(4734); X(4735); X(4736); X(4737); X(4738); X(4739); X(4740); X(4741); X(4742); X(4743); X(4744); X(4745); X(4746); X(4747); X(4748); X(4749); X(4750); X(4751); X(4752); X(4753); X(4754); X(4755); X(4756); X(4757); X(4758); X(4759); X(4760); X(4761); X(4762); X(4763); X(4764); X(4765); X(4766); X(4767); X(4768); X(4769); X(4770); X(4771); X(4772); X(4773); X(4774); X(4775); X(4776); X(4777); X(4778); X(4779); X(4780); X(4781); X(4782); X(4783); X(4784); X(4785); X(4786); X(4787); X(4788); X(4789); X(4790); X(4791); X(4792); X(4793); X(4794); X(4795); X(4796); X(4797); X(4798); X(4799); X(4800); X(4801); X(4802); X(4803); X(4804); X(4805); X(4806); X(4807); X(4808); X(4809); X(4810); X(4811); X(4812); X(4813); X(4814); X(4815); X(4816); X(4817); X(4818); X(4819); X(4820); X(4821); X(4822); X(4823); X(4824); X(4825); X(4826); X(4827); X(4828); X(4829); X(4830); X(4831); X(4832); X(4833); X(4834); X(4835); X(4836); X(4837); X(4838); X(4839); X(4840); X(4841); X(4842); X(4843); X(4844); X(4845); X(4846); X(4847); X(4848); X(4849); X(4850); X(4851); X(4852); X(4853); X(4854); X(4855); X(4856); X(4857); X(4858); X(4859); X(4860); X(4861); X(4862); X(4863); X(4864); X(4865); X(4866); X(4867); X(4868); X(4869); X(4870); X(4871); X(4872); X(4873); X(4874); X(4875); X(4876); X(4877); X(4878); X(4879); X(4880); X(4881); X(4882); X(4883); X(4884); X(4885); X(4886); X(4887); X(4888); X(4889); X(4890); X(4891); X(4892); X(4893); X(4894); X(4895); X(4896); X(4897); X(4898); X(4899); X(4900); X(4901); X(4902); X(4903); X(4904); X(4905); X(4906); X(4907); X(4908); X(4909); X(4910); X(4911); X(4912); X(4913); X(4914); X(4915); X(4916); X(4917); X(4918); X(4919); X(4920); X(4921); X(4922); X(4923); X(4924); X(4925); X(4926); X(4927); X(4928); X(4929); X(4930); X(4931); X(4932); X(4933); X(4934); X(4935); X(4936); X(4937); X(4938); X(4939); X(4940); X(4941); X(4942); X(4943); X(4944); X(4945); X(4946); X(4947); X(4948); X(4949); X(4950); X(4951); X(4952); X(4953); X(4954); X(4955); X(4956); X(4957); X(4958); X(4959); X(4960); X(4961); X(4962); X(4963); X(4964); X(4965); X(4966); X(4967); X(4968); X(4969); X(4970); X(4971); X(4972); X(4973); X(4974); X(4975); X(4976); X(4977); X(4978); X(4979); X(4980); X(4981); X(4982); X(4983); X(4984); X(4985); X(4986); X(4987); X(4988); X(4989); X(4990); X(4991); X(4992); X(4993); X(4994); X(4995); X(4996); X(4997); X(4998); X(4999); X(5000); X(5001); X(5002); X(5003); X(5004); X(5005); X(5006); X(5007); X(5008); X(5009); X(5010); X(5011); X(5012); X(5013); X(5014); X(5015); X(5016); X(5017); X(5018); X(5019); X(5020); X(5021); X(5022); X(5023); X(5024); X(5025); X(5026); X(5027); X(5028); X(5029); X(5030); X(5031); X(5032); X(5033); X(5034); X(5035); X(5036); X(5037); X(5038); X(5039); X(5040); X(5041); X(5042); X(5043); X(5044); X(5045); X(5046); X(5047); X(5048); X(5049); X(5050); X(5051); X(5052); X(5053); X(5054); X(5055); X(5056); X(5057); X(5058); X(5059); X(5060); X(5061); X(5062); X(5063); X(5064); X(5065); X(5066); X(5067); X(5068); X(5069); X(5070); X(5071); X(5072); X(5073); X(5074); X(5075); X(5076); X(5077); X(5078); X(5079); X(5080); X(5081); X(5082); X(5083); X(5084); X(5085); X(5086); X(5087); X(5088); X(5089); X(5090); X(5091); X(5092); X(5093); X(5094); X(5095); X(5096); X(5097); X(5098); X(5099); X(5100); X(5101); X(5102); X(5103); X(5104); X(5105); X(5106); X(5107); X(5108); X(5109); X(5110); X(5111); X(5112); X(5113); X(5114); X(5115); X(5116); X(5117); X(5118); X(5119); X(5120); X(5121); X(5122); X(5123); X(5124); X(5125); X(5126); X(5127); X(5128); X(5129); X(5130); X(5131); X(5132); X(5133); X(5134); X(5135); X(5136); X(5137); X(5138); X(5139); X(5140); X(5141); X(5142); X(5143); X(5144); X(5145); X(5146); X(5147); X(5148); X(5149); X(5150); X(5151); X(5152); X(5153); X(5154); X(5155); X(5156); X(5157); X(5158); X(5159); X(5160); X(5161); X(5162); X(5163); X(5164); X(5165); X(5166); X(5167); X(5168); X(5169); X(5170); X(5171); X(5172); X(5173); X(5174); X(5175); X(5176); X(5177); X(5178); X(5179); X(5180); X(5181); X(5182); X(5183); X(5184); X(5185); X(5186); X(5187); X(5188); X(5189); X(5190); X(5191); X(5192); X(5193); X(5194); X(5195); X(5196); X(5197); X(5198); X(5199); X(5200); X(5201); X(5202); X(5203); X(5204); X(5205); X(5206); X(5207); X(5208); X(5209); X(5210); X(5211); X(5212); X(5213); X(5214); X(5215); X(5216); X(5217); X(5218); X(5219); X(5220); X(5221); X(5222); X(5223); X(5224); X(5225); X(5226); X(5227); X(5228); X(5229); X(5230); X(5231); X(5232); X(5233); X(5234); X(5235); X(5236); X(5237); X(5238); X(5239); X(5240); X(5241); X(5242); X(5243); X(5244); X(5245); X(5246); X(5247); X(5248); X(5249); X(5250); X(5251); X(5252); X(5253); X(5254); X(5255); X(5256); X(5257); X(5258); X(5259); X(5260); X(5261); X(5262); X(5263); X(5264); X(5265); X(5266); X(5267); X(5268); X(5269); X(5270); X(5271); X(5272); X(5273); X(5274); X(5275); X(5276); X(5277); X(5278); X(5279); X(5280); X(5281); X(5282); X(5283); X(5284); X(5285); X(5286); X(5287); X(5288); X(5289); X(5290); X(5291); X(5292); X(5293); X(5294); X(5295); X(5296); X(5297); X(5298); X(5299); X(5300); X(5301); X(5302); X(5303); X(5304); X(5305); X(5306); X(5307); X(5308); X(5309); X(5310); X(5311); X(5312); X(5313); X(5314); X(5315); X(5316); X(5317); X(5318); X(5319); X(5320); X(5321); X(5322); X(5323); X(5324); X(5325); X(5326); X(5327); X(5328); X(5329); X(5330); X(5331); X(5332); X(5333); X(5334); X(5335); X(5336); X(5337); X(5338); X(5339); X(5340); X(5341); X(5342); X(5343); X(5344); X(5345); X(5346); X(5347); X(5348); X(5349); X(5350); X(5351); X(5352); X(5353); X(5354); X(5355); X(5356); X(5357); X(5358); X(5359); X(5360); X(5361); X(5362); X(5363); X(5364); X(5365); X(5366); X(5367); X(5368); X(5369); X(5370); X(5371); X(5372); X(5373); X(5374); X(5375); X(5376); X(5377); X(5378); X(5379); X(5380); X(5381); X(5382); X(5383); X(5384); X(5385); X(5386); X(5387); X(5388); X(5389); X(5390); X(5391); X(5392); X(5393); X(5394); X(5395); X(5396); X(5397); X(5398); X(5399); X(5400); X(5401); X(5402); X(5403); X(5404); X(5405); X(5406); X(5407); X(5408); X(5409); X(5410); X(5411); X(5412); X(5413); X(5414); X(5415); X(5416); X(5417); X(5418); X(5419); X(5420); X(5421); X(5422); X(5423); X(5424); X(5425); X(5426); X(5427); X(5428); X(5429); X(5430); X(5431); X(5432); X(5433); X(5434); X(5435); X(5436); X(5437); X(5438); X(5439); X(5440); X(5441); X(5442); X(5443); X(5444); X(5445); X(5446); X(5447); X(5448); X(5449); X(5450); X(5451); X(5452); X(5453); X(5454); X(5455); X(5456); X(5457); X(5458); X(5459); X(5460); X(5461); X(5462); X(5463); X(5464); X(5465); X(5466); X(5467); X(5468); X(5469); X(5470); X(5471); X(5472); X(5473); X(5474); X(5475); X(5476); X(5477); X(5478); X(5479); X(5480); X(5481); X(5482); X(5483); X(5484); X(5485); X(5486); X(5487); X(5488); X(5489); X(5490); X(5491); X(5492); X(5493); X(5494); X(5495); X(5496); X(5497); X(5498); X(5499); X(5500); X(5501); X(5502); X(5503); X(5504); X(5505); X(5506); X(5507); X(5508); X(5509); X(5510); X(5511); X(5512); X(5513); X(5514); X(5515); X(5516); X(5517); X(5518); X(5519); X(5520); X(5521); X(5522); X(5523); X(5524); X(5525); X(5526); X(5527); X(5528); X(5529); X(5530); X(5531); X(5532); X(5533); X(5534); X(5535); X(5536); X(5537); X(5538); X(5539); X(5540); X(5541); X(5542); X(5543); X(5544); X(5545); X(5546); X(5547); X(5548); X(5549); X(5550); X(5551); X(5552); X(5553); X(5554); X(5555); X(5556); X(5557); X(5558); X(5559); X(5560); X(5561); X(5562); X(5563); X(5564); X(5565); X(5566); X(5567); X(5568); X(5569); X(5570); X(5571); X(5572); X(5573); X(5574); X(5575); X(5576); X(5577); X(5578); X(5579); X(5580); X(5581); X(5582); X(5583); X(5584); X(5585); X(5586); X(5587); X(5588); X(5589); X(5590); X(5591); X(5592); X(5593); X(5594); X(5595); X(5596); X(5597); X(5598); X(5599); X(5600); X(5601); X(5602); X(5603); X(5604); X(5605); X(5606); X(5607); X(5608); X(5609); X(5610); X(5611); X(5612); X(5613); X(5614); X(5615); X(5616); X(5617); X(5618); X(5619); X(5620); X(5621); X(5622); X(5623); X(5624); X(5625); X(5626); X(5627); X(5628); X(5629); X(5630); X(5631); X(5632); X(5633); X(5634); X(5635); X(5636); X(5637); X(5638); X(5639); X(5640); X(5641); X(5642); X(5643); X(5644); X(5645); X(5646); X(5647); X(5648); X(5649); X(5650); X(5651); X(5652); X(5653); X(5654); X(5655); X(5656); X(5657); X(5658); X(5659); X(5660); X(5661); X(5662); X(5663); X(5664); X(5665); X(5666); X(5667); X(5668); X(5669); X(5670); X(5671); X(5672); X(5673); X(5674); X(5675); X(5676); X(5677); X(5678); X(5679); X(5680); X(5681); X(5682); X(5683); X(5684); X(5685); X(5686); X(5687); X(5688); X(5689); X(5690); X(5691); X(5692); X(5693); X(5694); X(5695); X(5696); X(5697); X(5698); X(5699); X(5700); X(5701); X(5702); X(5703); X(5704); X(5705); X(5706); X(5707); X(5708); X(5709); X(5710); X(5711); X(5712); X(5713); X(5714); X(5715); X(5716); X(5717); X(5718); X(5719); X(5720); X(5721); X(5722); X(5723); X(5724); X(5725); X(5726); X(5727); X(5728); X(5729); X(5730); X(5731); X(5732); X(5733); X(5734); X(5735); X(5736); X(5737); X(5738); X(5739); X(5740); X(5741); X(5742); X(5743); X(5744); X(5745); X(5746); X(5747); X(5748); X(5749); X(5750); X(5751); X(5752); X(5753); X(5754); X(5755); X(5756); X(5757); X(5758); X(5759); X(5760); X(5761); X(5762); X(5763); X(5764); X(5765); X(5766); X(5767); X(5768); X(5769); X(5770); X(5771); X(5772); X(5773); X(5774); X(5775); X(5776); X(5777); X(5778); X(5779); X(5780); X(5781); X(5782); X(5783); X(5784); X(5785); X(5786); X(5787); X(5788); X(5789); X(5790); X(5791); X(5792); X(5793); X(5794); X(5795); X(5796); X(5797); X(5798); X(5799); X(5800); X(5801); X(5802); X(5803); X(5804); X(5805); X(5806); X(5807); X(5808); X(5809); X(5810); X(5811); X(5812); X(5813); X(5814); X(5815); X(5816); X(5817); X(5818); X(5819); X(5820); X(5821); X(5822); X(5823); X(5824); X(5825); X(5826); X(5827); X(5828); X(5829); X(5830); X(5831); X(5832); X(5833); X(5834); X(5835); X(5836); X(5837); X(5838); X(5839); X(5840); X(5841); X(5842); X(5843); X(5844); X(5845); X(5846); X(5847); X(5848); X(5849); X(5850); X(5851); X(5852); X(5853); X(5854); X(5855); X(5856); X(5857); X(5858); X(5859); X(5860); X(5861); X(5862); X(5863); X(5864); X(5865); X(5866); X(5867); X(5868); X(5869); X(5870); X(5871); X(5872); X(5873); X(5874); X(5875); X(5876); X(5877); X(5878); X(5879); X(5880); X(5881); X(5882); X(5883); X(5884); X(5885); X(5886); X(5887); X(5888); X(5889); X(5890); X(5891); X(5892); X(5893); X(5894); X(5895); X(5896); X(5897); X(5898); X(5899); X(5900); X(5901); X(5902); X(5903); X(5904); X(5905); X(5906); X(5907); X(5908); X(5909); X(5910); X(5911); X(5912); X(5913); X(5914); X(5915); X(5916); X(5917); X(5918); X(5919); X(5920); X(5921); X(5922); X(5923); X(5924); X(5925); X(5926); X(5927); X(5928); X(5929); X(5930); X(5931); X(5932); X(5933); X(5934); X(5935); X(5936); X(5937); X(5938); X(5939); X(5940); X(5941); X(5942); X(5943); X(5944); X(5945); X(5946); X(5947); X(5948); X(5949); X(5950); X(5951); X(5952); X(5953); X(5954); X(5955); X(5956); X(5957); X(5958); X(5959); X(5960); X(5961); X(5962); X(5963); X(5964); X(5965); X(5966); X(5967); X(5968); X(5969); X(5970); X(5971); X(5972); X(5973); X(5974); X(5975); X(5976); X(5977); X(5978); X(5979); X(5980); X(5981); X(5982); X(5983); X(5984); X(5985); X(5986); X(5987); X(5988); X(5989); X(5990); X(5991); X(5992); X(5993); X(5994); X(5995); X(5996); X(5997); X(5998); X(5999); X(6000); X(6001); X(6002); X(6003); X(6004); X(6005); X(6006); X(6007); X(6008); X(6009); X(6010); X(6011); X(6012); X(6013); X(6014); X(6015); X(6016); X(6017); X(6018); X(6019); X(6020); X(6021); X(6022); X(6023); X(6024); X(6025); X(6026); X(6027); X(6028); X(6029); X(6030); X(6031); X(6032); X(6033); X(6034); X(6035); X(6036); X(6037); X(6038); X(6039); X(6040); X(6041); X(6042); X(6043); X(6044); X(6045); X(6046); X(6047); X(6048); X(6049); X(6050); X(6051); X(6052); X(6053); X(6054); X(6055); X(6056); X(6057); X(6058); X(6059); X(6060); X(6061); X(6062); X(6063); X(6064); X(6065); X(6066); X(6067); X(6068); X(6069); X(6070); X(6071); X(6072); X(6073); X(6074); X(6075); X(6076); X(6077); X(6078); X(6079); X(6080); X(6081); X(6082); X(6083); X(6084); X(6085); X(6086); X(6087); X(6088); X(6089); X(6090); X(6091); X(6092); X(6093); X(6094); X(6095); X(6096); X(6097); X(6098); X(6099); X(6100); X(6101); X(6102); X(6103); X(6104); X(6105); X(6106); X(6107); X(6108); X(6109); X(6110); X(6111); X(6112); X(6113); X(6114); X(6115); X(6116); X(6117); X(6118); X(6119); X(6120); X(6121); X(6122); X(6123); X(6124); X(6125); X(6126); X(6127); X(6128); X(6129); X(6130); X(6131); X(6132); X(6133); X(6134); X(6135); X(6136); X(6137); X(6138); X(6139); X(6140); X(6141); X(6142); X(6143); X(6144); X(6145); X(6146); X(6147); X(6148); X(6149); X(6150); X(6151); X(6152); X(6153); X(6154); X(6155); X(6156); X(6157); X(6158); X(6159); X(6160); X(6161); X(6162); X(6163); X(6164); X(6165); X(6166); X(6167); X(6168); X(6169); X(6170); X(6171); X(6172); X(6173); X(6174); X(6175); X(6176); X(6177); X(6178); X(6179); X(6180); X(6181); X(6182); X(6183); X(6184); X(6185); X(6186); X(6187); X(6188); X(6189); X(6190); X(6191); X(6192); X(6193); X(6194); X(6195); X(6196); X(6197); X(6198); X(6199); X(6200); X(6201); X(6202); X(6203); X(6204); X(6205); X(6206); X(6207); X(6208); X(6209); X(6210); X(6211); X(6212); X(6213); X(6214); X(6215); X(6216); X(6217); X(6218); X(6219); X(6220); X(6221); X(6222); X(6223); X(6224); X(6225); X(6226); X(6227); X(6228); X(6229); X(6230); X(6231); X(6232); X(6233); X(6234); X(6235); X(6236); X(6237); X(6238); X(6239); X(6240); X(6241); X(6242); X(6243); X(6244); X(6245); X(6246); X(6247); X(6248); X(6249); X(6250); X(6251); X(6252); X(6253); X(6254); X(6255); X(6256); X(6257); X(6258); X(6259); X(6260); X(6261); X(6262); X(6263); X(6264); X(6265); X(6266); X(6267); X(6268); X(6269); X(6270); X(6271); X(6272); X(6273); X(6274); X(6275); X(6276); X(6277); X(6278); X(6279); X(6280); X(6281); X(6282); X(6283); X(6284); X(6285); X(6286); X(6287); X(6288); X(6289); X(6290); X(6291); X(6292); X(6293); X(6294); X(6295); X(6296); X(6297); X(6298); X(6299); X(6300); X(6301); X(6302); X(6303); X(6304); X(6305); X(6306); X(6307); X(6308); X(6309); X(6310); X(6311); X(6312); X(6313); X(6314); X(6315); X(6316); X(6317); X(6318); X(6319); X(6320); X(6321); X(6322); X(6323); X(6324); X(6325); X(6326); X(6327); X(6328); X(6329); X(6330); X(6331); X(6332); X(6333); X(6334); X(6335); X(6336); X(6337); X(6338); X(6339); X(6340); X(6341); X(6342); X(6343); X(6344); X(6345); X(6346); X(6347); X(6348); X(6349); X(6350); X(6351); X(6352); X(6353); X(6354); X(6355); X(6356); X(6357); X(6358); X(6359); X(6360); X(6361); X(6362); X(6363); X(6364); X(6365); X(6366); X(6367); X(6368); X(6369); X(6370); X(6371); X(6372); X(6373); X(6374); X(6375); X(6376); X(6377); X(6378); X(6379); X(6380); X(6381); X(6382); X(6383); X(6384); X(6385); X(6386); X(6387); X(6388); X(6389); X(6390); X(6391); X(6392); X(6393); X(6394); X(6395); X(6396); X(6397); X(6398); X(6399); X(6400); X(6401); X(6402); X(6403); X(6404); X(6405); X(6406); X(6407); X(6408); X(6409); X(6410); X(6411); X(6412); X(6413); X(6414); X(6415); X(6416); X(6417); X(6418); X(6419); X(6420); X(6421); X(6422); X(6423); X(6424); X(6425); X(6426); X(6427); X(6428); X(6429); X(6430); X(6431); X(6432); X(6433); X(6434); X(6435); X(6436); X(6437); X(6438); X(6439); X(6440); X(6441); X(6442); X(6443); X(6444); X(6445); X(6446); X(6447); X(6448); X(6449); X(6450); X(6451); X(6452); X(6453); X(6454); X(6455); X(6456); X(6457); X(6458); X(6459); X(6460); X(6461); X(6462); X(6463); X(6464); X(6465); X(6466); X(6467); X(6468); X(6469); X(6470); X(6471); X(6472); X(6473); X(6474); X(6475); X(6476); X(6477); X(6478); X(6479); X(6480); X(6481); X(6482); X(6483); X(6484); X(6485); X(6486); X(6487); X(6488); X(6489); X(6490); X(6491); X(6492); X(6493); X(6494); X(6495); X(6496); X(6497); X(6498); X(6499); X(6500); X(6501); X(6502); X(6503); X(6504); X(6505); X(6506); X(6507); X(6508); X(6509); X(6510); X(6511); X(6512); X(6513); X(6514); X(6515); X(6516); X(6517); X(6518); X(6519); X(6520); X(6521); X(6522); X(6523); X(6524); X(6525); X(6526); X(6527); X(6528); X(6529); X(6530); X(6531); X(6532); X(6533); X(6534); X(6535); X(6536); X(6537); X(6538); X(6539); X(6540); X(6541); X(6542); X(6543); X(6544); X(6545); X(6546); X(6547); X(6548); X(6549); X(6550); X(6551); X(6552); X(6553); X(6554); X(6555); X(6556); X(6557); X(6558); X(6559); X(6560); X(6561); X(6562); X(6563); X(6564); X(6565); X(6566); X(6567); X(6568); X(6569); X(6570); X(6571); X(6572); X(6573); X(6574); X(6575); X(6576); X(6577); X(6578); X(6579); X(6580); X(6581); X(6582); X(6583); X(6584); X(6585); X(6586); X(6587); X(6588); X(6589); X(6590); X(6591); X(6592); X(6593); X(6594); X(6595); X(6596); X(6597); X(6598); X(6599); X(6600); X(6601); X(6602); X(6603); X(6604); X(6605); X(6606); X(6607); X(6608); X(6609); X(6610); X(6611); X(6612); X(6613); X(6614); X(6615); X(6616); X(6617); X(6618); X(6619); X(6620); X(6621); X(6622); X(6623); X(6624); X(6625); X(6626); X(6627); X(6628); X(6629); X(6630); X(6631); X(6632); X(6633); X(6634); X(6635); X(6636); X(6637); X(6638); X(6639); X(6640); X(6641); X(6642); X(6643); X(6644); X(6645); X(6646); X(6647); X(6648); X(6649); X(6650); X(6651); X(6652); X(6653); X(6654); X(6655); X(6656); X(6657); X(6658); X(6659); X(6660); X(6661); X(6662); X(6663); X(6664); X(6665); X(6666); X(6667); X(6668); X(6669); X(6670); X(6671); X(6672); X(6673); X(6674); X(6675); X(6676); X(6677); X(6678); X(6679); X(6680); X(6681); X(6682); X(6683); X(6684); X(6685); X(6686); X(6687); X(6688); X(6689); X(6690); X(6691); X(6692); X(6693); X(6694); X(6695); X(6696); X(6697); X(6698); X(6699); X(6700); X(6701); X(6702); X(6703); X(6704); X(6705); X(6706); X(6707); X(6708); X(6709); X(6710); X(6711); X(6712); X(6713); X(6714); X(6715); X(6716); X(6717); X(6718); X(6719); X(6720); X(6721); X(6722); X(6723); X(6724); X(6725); X(6726); X(6727); X(6728); X(6729); X(6730); X(6731); X(6732); X(6733); X(6734); X(6735); X(6736); X(6737); X(6738); X(6739); X(6740); X(6741); X(6742); X(6743); X(6744); X(6745); X(6746); X(6747); X(6748); X(6749); X(6750); X(6751); X(6752); X(6753); X(6754); X(6755); X(6756); X(6757); X(6758); X(6759); X(6760); X(6761); X(6762); X(6763); X(6764); X(6765); X(6766); X(6767); X(6768); X(6769); X(6770); X(6771); X(6772); X(6773); X(6774); X(6775); X(6776); X(6777); X(6778); X(6779); X(6780); X(6781); X(6782); X(6783); X(6784); X(6785); X(6786); X(6787); X(6788); X(6789); X(6790); X(6791); X(6792); X(6793); X(6794); X(6795); X(6796); X(6797); X(6798); X(6799); X(6800); X(6801); X(6802); X(6803); X(6804); X(6805); X(6806); X(6807); X(6808); X(6809); X(6810); X(6811); X(6812); X(6813); X(6814); X(6815); X(6816); X(6817); X(6818); X(6819); X(6820); X(6821); X(6822); X(6823); X(6824); X(6825); X(6826); X(6827); X(6828); X(6829); X(6830); X(6831); X(6832); X(6833); X(6834); X(6835); X(6836); X(6837); X(6838); X(6839); X(6840); X(6841); X(6842); X(6843); X(6844); X(6845); X(6846); X(6847); X(6848); X(6849); X(6850); X(6851); X(6852); X(6853); X(6854); X(6855); X(6856); X(6857); X(6858); X(6859); X(6860); X(6861); X(6862); X(6863); X(6864); X(6865); X(6866); X(6867); X(6868); X(6869); X(6870); X(6871); X(6872); X(6873); X(6874); X(6875); X(6876); X(6877); X(6878); X(6879); X(6880); X(6881); X(6882); X(6883); X(6884); X(6885); X(6886); X(6887); X(6888); X(6889); X(6890); X(6891); X(6892); X(6893); X(6894); X(6895); X(6896); X(6897); X(6898); X(6899); X(6900); X(6901); X(6902); X(6903); X(6904); X(6905); X(6906); X(6907); X(6908); X(6909); X(6910); X(6911); X(6912); X(6913); X(6914); X(6915); X(6916); X(6917); X(6918); X(6919); X(6920); X(6921); X(6922); X(6923); X(6924); X(6925); X(6926); X(6927); X(6928); X(6929); X(6930); X(6931); X(6932); X(6933); X(6934); X(6935); X(6936); X(6937); X(6938); X(6939); X(6940); X(6941); X(6942); X(6943); X(6944); X(6945); X(6946); X(6947); X(6948); X(6949); X(6950); X(6951); X(6952); X(6953); X(6954); X(6955); X(6956); X(6957); X(6958); X(6959); X(6960); X(6961); X(6962); X(6963); X(6964); X(6965); X(6966); X(6967); X(6968); X(6969); X(6970); X(6971); X(6972); X(6973); X(6974); X(6975); X(6976); X(6977); X(6978); X(6979); X(6980); X(6981); X(6982); X(6983); X(6984); X(6985); X(6986); X(6987); X(6988); X(6989); X(6990); X(6991); X(6992); X(6993); X(6994); X(6995); X(6996); X(6997); X(6998); X(6999); X(7000); X(7001); X(7002); X(7003); X(7004); X(7005); X(7006); X(7007); X(7008); X(7009); X(7010); X(7011); X(7012); X(7013); X(7014); X(7015); X(7016); X(7017); X(7018); X(7019); X(7020); X(7021); X(7022); X(7023); X(7024); X(7025); X(7026); X(7027); X(7028); X(7029); X(7030); X(7031); X(7032); X(7033); X(7034); X(7035); X(7036); X(7037); X(7038); X(7039); X(7040); X(7041); X(7042); X(7043); X(7044); X(7045); X(7046); X(7047); X(7048); X(7049); X(7050); X(7051); X(7052); X(7053); X(7054); X(7055); X(7056); X(7057); X(7058); X(7059); X(7060); X(7061); X(7062); X(7063); X(7064); X(7065); X(7066); X(7067); X(7068); X(7069); X(7070); X(7071); X(7072); X(7073); X(7074); X(7075); X(7076); X(7077); X(7078); X(7079); X(7080); X(7081); X(7082); X(7083); X(7084); X(7085); X(7086); X(7087); X(7088); X(7089); X(7090); X(7091); X(7092); X(7093); X(7094); X(7095); X(7096); X(7097); X(7098); X(7099); X(7100); X(7101); X(7102); X(7103); X(7104); X(7105); X(7106); X(7107); X(7108); X(7109); X(7110); X(7111); X(7112); X(7113); X(7114); X(7115); X(7116); X(7117); X(7118); X(7119); X(7120); X(7121); X(7122); X(7123); X(7124); X(7125); X(7126); X(7127); X(7128); X(7129); X(7130); X(7131); X(7132); X(7133); X(7134); X(7135); X(7136); X(7137); X(7138); X(7139); X(7140); X(7141); X(7142); X(7143); X(7144); X(7145); X(7146); X(7147); X(7148); X(7149); X(7150); X(7151); X(7152); X(7153); X(7154); X(7155); X(7156); X(7157); X(7158); X(7159); X(7160); X(7161); X(7162); X(7163); X(7164); X(7165); X(7166); X(7167); X(7168); X(7169); X(7170); X(7171); X(7172); X(7173); X(7174); X(7175); X(7176); X(7177); X(7178); X(7179); X(7180); X(7181); X(7182); X(7183); X(7184); X(7185); X(7186); X(7187); X(7188); X(7189); X(7190); X(7191); X(7192); X(7193); X(7194); X(7195); X(7196); X(7197); X(7198); X(7199); X(7200); X(7201); X(7202); X(7203); X(7204); X(7205); X(7206); X(7207); X(7208); X(7209); X(7210); X(7211); X(7212); X(7213); X(7214); X(7215); X(7216); X(7217); X(7218); X(7219); X(7220); X(7221); X(7222); X(7223); X(7224); X(7225); X(7226); X(7227); X(7228); X(7229); X(7230); X(7231); X(7232); X(7233); X(7234); X(7235); X(7236); X(7237); X(7238); X(7239); X(7240); X(7241); X(7242); X(7243); X(7244); X(7245); X(7246); X(7247); X(7248); X(7249); X(7250); X(7251); X(7252); X(7253); X(7254); X(7255); X(7256); X(7257); X(7258); X(7259); X(7260); X(7261); X(7262); X(7263); X(7264); X(7265); X(7266); X(7267); X(7268); X(7269); X(7270); X(7271); X(7272); X(7273); X(7274); X(7275); X(7276); X(7277); X(7278); X(7279); X(7280); X(7281); X(7282); X(7283); X(7284); X(7285); X(7286); X(7287); X(7288); X(7289); X(7290); X(7291); X(7292); X(7293); X(7294); X(7295); X(7296); X(7297); X(7298); X(7299); X(7300); X(7301); X(7302); X(7303); X(7304); X(7305); X(7306); X(7307); X(7308); X(7309); X(7310); X(7311); X(7312); X(7313); X(7314); X(7315); X(7316); X(7317); X(7318); X(7319); X(7320); X(7321); X(7322); X(7323); X(7324); X(7325); X(7326); X(7327); X(7328); X(7329); X(7330); X(7331); X(7332); X(7333); X(7334); X(7335); X(7336); X(7337); X(7338); X(7339); X(7340); X(7341); X(7342); X(7343); X(7344); X(7345); X(7346); X(7347); X(7348); X(7349); X(7350); X(7351); X(7352); X(7353); X(7354); X(7355); X(7356); X(7357); X(7358); X(7359); X(7360); X(7361); X(7362); X(7363); X(7364); X(7365); X(7366); X(7367); X(7368); X(7369); X(7370); X(7371); X(7372); X(7373); X(7374); X(7375); X(7376); X(7377); X(7378); X(7379); X(7380); X(7381); X(7382); X(7383); X(7384); X(7385); X(7386); X(7387); X(7388); X(7389); X(7390); X(7391); X(7392); X(7393); X(7394); X(7395); X(7396); X(7397); X(7398); X(7399); X(7400); X(7401); X(7402); X(7403); X(7404); X(7405); X(7406); X(7407); X(7408); X(7409); X(7410); X(7411); X(7412); X(7413); X(7414); X(7415); X(7416); X(7417); X(7418); X(7419); X(7420); X(7421); X(7422); X(7423); X(7424); X(7425); X(7426); X(7427); X(7428); X(7429); X(7430); X(7431); X(7432); X(7433); X(7434); X(7435); X(7436); X(7437); X(7438); X(7439); X(7440); X(7441); X(7442); X(7443); X(7444); X(7445); X(7446); X(7447); X(7448); X(7449); X(7450); X(7451); X(7452); X(7453); X(7454); X(7455); X(7456); X(7457); X(7458); X(7459); X(7460); X(7461); X(7462); X(7463); X(7464); X(7465); X(7466); X(7467); X(7468); X(7469); X(7470); X(7471); X(7472); X(7473); X(7474); X(7475); X(7476); X(7477); X(7478); X(7479); X(7480); X(7481); X(7482); X(7483); X(7484); X(7485); X(7486); X(7487); X(7488); X(7489); X(7490); X(7491); X(7492); X(7493); X(7494); X(7495); X(7496); X(7497); X(7498); X(7499); X(7500); X(7501); X(7502); X(7503); X(7504); X(7505); X(7506); X(7507); X(7508); X(7509); X(7510); X(7511); X(7512); X(7513); X(7514); X(7515); X(7516); X(7517); X(7518); X(7519); X(7520); X(7521); X(7522); X(7523); X(7524); X(7525); X(7526); X(7527); X(7528); X(7529); X(7530); X(7531); X(7532); X(7533); X(7534); X(7535); X(7536); X(7537); X(7538); X(7539); X(7540); X(7541); X(7542); X(7543); X(7544); X(7545); X(7546); X(7547); X(7548); X(7549); X(7550); X(7551); X(7552); X(7553); X(7554); X(7555); X(7556); X(7557); X(7558); X(7559); X(7560); X(7561); X(7562); X(7563); X(7564); X(7565); X(7566); X(7567); X(7568); X(7569); X(7570); X(7571); X(7572); X(7573); X(7574); X(7575); X(7576); X(7577); X(7578); X(7579); X(7580); X(7581); X(7582); X(7583); X(7584); X(7585); X(7586); X(7587); X(7588); X(7589); X(7590); X(7591); X(7592); X(7593); X(7594); X(7595); X(7596); X(7597); X(7598); X(7599); X(7600); X(7601); X(7602); X(7603); X(7604); X(7605); X(7606); X(7607); X(7608); X(7609); X(7610); X(7611); X(7612); X(7613); X(7614); X(7615); X(7616); X(7617); X(7618); X(7619); X(7620); X(7621); X(7622); X(7623); X(7624); X(7625); X(7626); X(7627); X(7628); X(7629); X(7630); X(7631); X(7632); X(7633); X(7634); X(7635); X(7636); X(7637); X(7638); X(7639); X(7640); X(7641); X(7642); X(7643); X(7644); X(7645); X(7646); X(7647); X(7648); X(7649); X(7650); X(7651); X(7652); X(7653); X(7654); X(7655); X(7656); X(7657); X(7658); X(7659); X(7660); X(7661); X(7662); X(7663); X(7664); X(7665); X(7666); X(7667); X(7668); X(7669); X(7670); X(7671); X(7672); X(7673); X(7674); X(7675); X(7676); X(7677); X(7678); X(7679); X(7680); X(7681); X(7682); X(7683); X(7684); X(7685); X(7686); X(7687); X(7688); X(7689); X(7690); X(7691); X(7692); X(7693); X(7694); X(7695); X(7696); X(7697); X(7698); X(7699); X(7700); X(7701); X(7702); X(7703); X(7704); X(7705); X(7706); X(7707); X(7708); X(7709); X(7710); X(7711); X(7712); X(7713); X(7714); X(7715); X(7716); X(7717); X(7718); X(7719); X(7720); X(7721); X(7722); X(7723); X(7724); X(7725); X(7726); X(7727); X(7728); X(7729); X(7730); X(7731); X(7732); X(7733); X(7734); X(7735); X(7736); X(7737); X(7738); X(7739); X(7740); X(7741); X(7742); X(7743); X(7744); X(7745); X(7746); X(7747); X(7748); X(7749); X(7750); X(7751); X(7752); X(7753); X(7754); X(7755); X(7756); X(7757); X(7758); X(7759); X(7760); X(7761); X(7762); X(7763); X(7764); X(7765); X(7766); X(7767); X(7768); X(7769); X(7770); X(7771); X(7772); X(7773); X(7774); X(7775); X(7776); X(7777); X(7778); X(7779); X(7780); X(7781); X(7782); X(7783); X(7784); X(7785); X(7786); X(7787); X(7788); X(7789); X(7790); X(7791); X(7792); X(7793); X(7794); X(7795); X(7796); X(7797); X(7798); X(7799); X(7800); X(7801); X(7802); X(7803); X(7804); X(7805); X(7806); X(7807); X(7808); X(7809); X(7810); X(7811); X(7812); X(7813); X(7814); X(7815); X(7816); X(7817); X(7818); X(7819); X(7820); X(7821); X(7822); X(7823); X(7824); X(7825); X(7826); X(7827); X(7828); X(7829); X(7830); X(7831); X(7832); X(7833); X(7834); X(7835); X(7836); X(7837); X(7838); X(7839); X(7840); X(7841); X(7842); X(7843); X(7844); X(7845); X(7846); X(7847); X(7848); X(7849); X(7850); X(7851); X(7852); X(7853); X(7854); X(7855); X(7856); X(7857); X(7858); X(7859); X(7860); X(7861); X(7862); X(7863); X(7864); X(7865); X(7866); X(7867); X(7868); X(7869); X(7870); X(7871); X(7872); X(7873); X(7874); X(7875); X(7876); X(7877); X(7878); X(7879); X(7880); X(7881); X(7882); X(7883); X(7884); X(7885); X(7886); X(7887); X(7888); X(7889); X(7890); X(7891); X(7892); X(7893); X(7894); X(7895); X(7896); X(7897); X(7898); X(7899); X(7900); X(7901); X(7902); X(7903); X(7904); X(7905); X(7906); X(7907); X(7908); X(7909); X(7910); X(7911); X(7912); X(7913); X(7914); X(7915); X(7916); X(7917); X(7918); X(7919); X(7920); X(7921); X(7922); X(7923); X(7924); X(7925); X(7926); X(7927); X(7928); X(7929); X(7930); X(7931); X(7932); X(7933); X(7934); X(7935); X(7936); X(7937); X(7938); X(7939); X(7940); X(7941); X(7942); X(7943); X(7944); X(7945); X(7946); X(7947); X(7948); X(7949); X(7950); X(7951); X(7952); X(7953); X(7954); X(7955); X(7956); X(7957); X(7958); X(7959); X(7960); X(7961); X(7962); X(7963); X(7964); X(7965); X(7966); X(7967); X(7968); X(7969); X(7970); X(7971); X(7972); X(7973); X(7974); X(7975); X(7976); X(7977); X(7978); X(7979); X(7980); X(7981); X(7982); X(7983); X(7984); X(7985); X(7986); X(7987); X(7988); X(7989); X(7990); X(7991); X(7992); X(7993); X(7994); X(7995); X(7996); X(7997); X(7998); X(7999); X(8000); X(8001); X(8002); X(8003); X(8004); X(8005); X(8006); X(8007); X(8008); X(8009); X(8010); X(8011); X(8012); X(8013); X(8014); X(8015); X(8016); X(8017); X(8018); X(8019); X(8020); X(8021); X(8022); X(8023); X(8024); X(8025); X(8026); X(8027); X(8028); X(8029); X(8030); X(8031); X(8032); X(8033); X(8034); X(8035); X(8036); X(8037); X(8038); X(8039); X(8040); X(8041); X(8042); X(8043); X(8044); X(8045); X(8046); X(8047); X(8048); X(8049); X(8050); X(8051); X(8052); X(8053); X(8054); X(8055); X(8056); X(8057); X(8058); X(8059); X(8060); X(8061); X(8062); X(8063); X(8064); X(8065); X(8066); X(8067); X(8068); X(8069); X(8070); X(8071); X(8072); X(8073); X(8074); X(8075); X(8076); X(8077); X(8078); X(8079); X(8080); X(8081); X(8082); X(8083); X(8084); X(8085); X(8086); X(8087); X(8088); X(8089); X(8090); X(8091); X(8092); X(8093); X(8094); X(8095); X(8096); X(8097); X(8098); X(8099); X(8100); X(8101); X(8102); X(8103); X(8104); X(8105); X(8106); X(8107); X(8108); X(8109); X(8110); X(8111); X(8112); X(8113); X(8114); X(8115); X(8116); X(8117); X(8118); X(8119); X(8120); X(8121); X(8122); X(8123); X(8124); X(8125); X(8126); X(8127); X(8128); X(8129); X(8130); X(8131); X(8132); X(8133); X(8134); X(8135); X(8136); X(8137); X(8138); X(8139); X(8140); X(8141); X(8142); X(8143); X(8144); X(8145); X(8146); X(8147); X(8148); X(8149); X(8150); X(8151); X(8152); X(8153); X(8154); X(8155); X(8156); X(8157); X(8158); X(8159); X(8160); X(8161); X(8162); X(8163); X(8164); X(8165); X(8166); X(8167); X(8168); X(8169); X(8170); X(8171); X(8172); X(8173); X(8174); X(8175); X(8176); X(8177); X(8178); X(8179); X(8180); X(8181); X(8182); X(8183); X(8184); X(8185); X(8186); X(8187); X(8188); X(8189); X(8190); X(8191); X(8192); X(8193); X(8194); X(8195); X(8196); X(8197); X(8198); X(8199); X(8200); X(8201); X(8202); X(8203); X(8204); X(8205); X(8206); X(8207); X(8208); X(8209); X(8210); X(8211); X(8212); X(8213); X(8214); X(8215); X(8216); X(8217); X(8218); X(8219); X(8220); X(8221); X(8222); X(8223); X(8224); X(8225); X(8226); X(8227); X(8228); X(8229); X(8230); X(8231); X(8232); X(8233); X(8234); X(8235); X(8236); X(8237); X(8238); X(8239); X(8240); X(8241); X(8242); X(8243); X(8244); X(8245); X(8246); X(8247); X(8248); X(8249); X(8250); X(8251); X(8252); X(8253); X(8254); X(8255); X(8256); X(8257); X(8258); X(8259); X(8260); X(8261); X(8262); X(8263); X(8264); X(8265); X(8266); X(8267); X(8268); X(8269); X(8270); X(8271); X(8272); X(8273); X(8274); X(8275); X(8276); X(8277); X(8278); X(8279); X(8280); X(8281); X(8282); X(8283); X(8284); X(8285); X(8286); X(8287); X(8288); X(8289); X(8290); X(8291); X(8292); X(8293); X(8294); X(8295); X(8296); X(8297); X(8298); X(8299); X(8300); X(8301); X(8302); X(8303); X(8304); X(8305); X(8306); X(8307); X(8308); X(8309); X(8310); X(8311); X(8312); X(8313); X(8314); X(8315); X(8316); X(8317); X(8318); X(8319); X(8320); X(8321); X(8322); X(8323); X(8324); X(8325); X(8326); X(8327); X(8328); X(8329); X(8330); X(8331); X(8332); X(8333); X(8334); X(8335); X(8336); X(8337); X(8338); X(8339); X(8340); X(8341); X(8342); X(8343); X(8344); X(8345); X(8346); X(8347); X(8348); X(8349); X(8350); X(8351); X(8352); X(8353); X(8354); X(8355); X(8356); X(8357); X(8358); X(8359); X(8360); X(8361); X(8362); X(8363); X(8364); X(8365); X(8366); X(8367); X(8368); X(8369); X(8370); X(8371); X(8372); X(8373); X(8374); X(8375); X(8376); X(8377); X(8378); X(8379); X(8380); X(8381); X(8382); X(8383); X(8384); X(8385); X(8386); X(8387); X(8388); X(8389); X(8390); X(8391); X(8392); X(8393); X(8394); X(8395); X(8396); X(8397); X(8398); X(8399); X(8400); X(8401); X(8402); X(8403); X(8404); X(8405); X(8406); X(8407); X(8408); X(8409); X(8410); X(8411); X(8412); X(8413); X(8414); X(8415); X(8416); X(8417); X(8418); X(8419); X(8420); X(8421); X(8422); X(8423); X(8424); X(8425); X(8426); X(8427); X(8428); X(8429); X(8430); X(8431); X(8432); X(8433); X(8434); X(8435); X(8436); X(8437); X(8438); X(8439); X(8440); X(8441); X(8442); X(8443); X(8444); X(8445); X(8446); X(8447); X(8448); X(8449); X(8450); X(8451); X(8452); X(8453); X(8454); X(8455); X(8456); X(8457); X(8458); X(8459); X(8460); X(8461); X(8462); X(8463); X(8464); X(8465); X(8466); X(8467); X(8468); X(8469); X(8470); X(8471); X(8472); X(8473); X(8474); X(8475); X(8476); X(8477); X(8478); X(8479); X(8480); X(8481); X(8482); X(8483); X(8484); X(8485); X(8486); X(8487); X(8488); X(8489); X(8490); X(8491); X(8492); X(8493); X(8494); X(8495); X(8496); X(8497); X(8498); X(8499); X(8500); X(8501); X(8502); X(8503); X(8504); X(8505); X(8506); X(8507); X(8508); X(8509); X(8510); X(8511); X(8512); X(8513); X(8514); X(8515); X(8516); X(8517); X(8518); X(8519); X(8520); X(8521); X(8522); X(8523); X(8524); X(8525); X(8526); X(8527); X(8528); X(8529); X(8530); X(8531); X(8532); X(8533); X(8534); X(8535); X(8536); X(8537); X(8538); X(8539); X(8540); X(8541); X(8542); X(8543); X(8544); X(8545); X(8546); X(8547); X(8548); X(8549); X(8550); X(8551); X(8552); X(8553); X(8554); X(8555); X(8556); X(8557); X(8558); X(8559); X(8560); X(8561); X(8562); X(8563); X(8564); X(8565); X(8566); X(8567); X(8568); X(8569); X(8570); X(8571); X(8572); X(8573); X(8574); X(8575); X(8576); X(8577); X(8578); X(8579); X(8580); X(8581); X(8582); X(8583); X(8584); X(8585); X(8586); X(8587); X(8588); X(8589); X(8590); X(8591); X(8592); X(8593); X(8594); X(8595); X(8596); X(8597); X(8598); X(8599); X(8600); X(8601); X(8602); X(8603); X(8604); X(8605); X(8606); X(8607); X(8608); X(8609); X(8610); X(8611); X(8612); X(8613); X(8614); X(8615); X(8616); X(8617); X(8618); X(8619); X(8620); X(8621); X(8622); X(8623); X(8624); X(8625); X(8626); X(8627); X(8628); X(8629); X(8630); X(8631); X(8632); X(8633); X(8634); X(8635); X(8636); X(8637); X(8638); X(8639); X(8640); X(8641); X(8642); X(8643); X(8644); X(8645); X(8646); X(8647); X(8648); X(8649); X(8650); X(8651); X(8652); X(8653); X(8654); X(8655); X(8656); X(8657); X(8658); X(8659); X(8660); X(8661); X(8662); X(8663); X(8664); X(8665); X(8666); X(8667); X(8668); X(8669); X(8670); X(8671); X(8672); X(8673); X(8674); X(8675); X(8676); X(8677); X(8678); X(8679); X(8680); X(8681); X(8682); X(8683); X(8684); X(8685); X(8686); X(8687); X(8688); X(8689); X(8690); X(8691); X(8692); X(8693); X(8694); X(8695); X(8696); X(8697); X(8698); X(8699); X(8700); X(8701); X(8702); X(8703); X(8704); X(8705); X(8706); X(8707); X(8708); X(8709); X(8710); X(8711); X(8712); X(8713); X(8714); X(8715); X(8716); X(8717); X(8718); X(8719); X(8720); X(8721); X(8722); X(8723); X(8724); X(8725); X(8726); X(8727); X(8728); X(8729); X(8730); X(8731); X(8732); X(8733); X(8734); X(8735); X(8736); X(8737); X(8738); X(8739); X(8740); X(8741); X(8742); X(8743); X(8744); X(8745); X(8746); X(8747); X(8748); X(8749); X(8750); X(8751); X(8752); X(8753); X(8754); X(8755); X(8756); X(8757); X(8758); X(8759); X(8760); X(8761); X(8762); X(8763); X(8764); X(8765); X(8766); X(8767); X(8768); X(8769); X(8770); X(8771); X(8772); X(8773); X(8774); X(8775); X(8776); X(8777); X(8778); X(8779); X(8780); X(8781); X(8782); X(8783); X(8784); X(8785); X(8786); X(8787); X(8788); X(8789); X(8790); X(8791); X(8792); X(8793); X(8794); X(8795); X(8796); X(8797); X(8798); X(8799); X(8800); X(8801); X(8802); X(8803); X(8804); X(8805); X(8806); X(8807); X(8808); X(8809); X(8810); X(8811); X(8812); X(8813); X(8814); X(8815); X(8816); X(8817); X(8818); X(8819); X(8820); X(8821); X(8822); X(8823); X(8824); X(8825); X(8826); X(8827); X(8828); X(8829); X(8830); X(8831); X(8832); X(8833); X(8834); X(8835); X(8836); X(8837); X(8838); X(8839); X(8840); X(8841); X(8842); X(8843); X(8844); X(8845); X(8846); X(8847); X(8848); X(8849); X(8850); X(8851); X(8852); X(8853); X(8854); X(8855); X(8856); X(8857); X(8858); X(8859); X(8860); X(8861); X(8862); X(8863); X(8864); X(8865); X(8866); X(8867); X(8868); X(8869); X(8870); X(8871); X(8872); X(8873); X(8874); X(8875); X(8876); X(8877); X(8878); X(8879); X(8880); X(8881); X(8882); X(8883); X(8884); X(8885); X(8886); X(8887); X(8888); X(8889); X(8890); X(8891); X(8892); X(8893); X(8894); X(8895); X(8896); X(8897); X(8898); X(8899); X(8900); X(8901); X(8902); X(8903); X(8904); X(8905); X(8906); X(8907); X(8908); X(8909); X(8910); X(8911); X(8912); X(8913); X(8914); X(8915); X(8916); X(8917); X(8918); X(8919); X(8920); X(8921); X(8922); X(8923); X(8924); X(8925); X(8926); X(8927); X(8928); X(8929); X(8930); X(8931); X(8932); X(8933); X(8934); X(8935); X(8936); X(8937); X(8938); X(8939); X(8940); X(8941); X(8942); X(8943); X(8944); X(8945); X(8946); X(8947); X(8948); X(8949); X(8950); X(8951); X(8952); X(8953); X(8954); X(8955); X(8956); X(8957); X(8958); X(8959); X(8960); X(8961); X(8962); X(8963); X(8964); X(8965); X(8966); X(8967); X(8968); X(8969); X(8970); X(8971); X(8972); X(8973); X(8974); X(8975); X(8976); X(8977); X(8978); X(8979); X(8980); X(8981); X(8982); X(8983); X(8984); X(8985); X(8986); X(8987); X(8988); X(8989); X(8990); X(8991); X(8992); X(8993); X(8994); X(8995); X(8996); X(8997); X(8998); X(8999); X(9000); X(9001); X(9002); X(9003); X(9004); X(9005); X(9006); X(9007); X(9008); X(9009); X(9010); X(9011); X(9012); X(9013); X(9014); X(9015); X(9016); X(9017); X(9018); X(9019); X(9020); X(9021); X(9022); X(9023); X(9024); X(9025); X(9026); X(9027); X(9028); X(9029); X(9030); X(9031); X(9032); X(9033); X(9034); X(9035); X(9036); X(9037); X(9038); X(9039); X(9040); X(9041); X(9042); X(9043); X(9044); X(9045); X(9046); X(9047); X(9048); X(9049); X(9050); X(9051); X(9052); X(9053); X(9054); X(9055); X(9056); X(9057); X(9058); X(9059); X(9060); X(9061); X(9062); X(9063); X(9064); X(9065); X(9066); X(9067); X(9068); X(9069); X(9070); X(9071); X(9072); X(9073); X(9074); X(9075); X(9076); X(9077); X(9078); X(9079); X(9080); X(9081); X(9082); X(9083); X(9084); X(9085); X(9086); X(9087); X(9088); X(9089); X(9090); X(9091); X(9092); X(9093); X(9094); X(9095); X(9096); X(9097); X(9098); X(9099); X(9100); X(9101); X(9102); X(9103); X(9104); X(9105); X(9106); X(9107); X(9108); X(9109); X(9110); X(9111); X(9112); X(9113); X(9114); X(9115); X(9116); X(9117); X(9118); X(9119); X(9120); X(9121); X(9122); X(9123); X(9124); X(9125); X(9126); X(9127); X(9128); X(9129); X(9130); X(9131); X(9132); X(9133); X(9134); X(9135); X(9136); X(9137); X(9138); X(9139); X(9140); X(9141); X(9142); X(9143); X(9144); X(9145); X(9146); X(9147); X(9148); X(9149); X(9150); X(9151); X(9152); X(9153); X(9154); X(9155); X(9156); X(9157); X(9158); X(9159); X(9160); X(9161); X(9162); X(9163); X(9164); X(9165); X(9166); X(9167); X(9168); X(9169); X(9170); X(9171); X(9172); X(9173); X(9174); X(9175); X(9176); X(9177); X(9178); X(9179); X(9180); X(9181); X(9182); X(9183); X(9184); X(9185); X(9186); X(9187); X(9188); X(9189); X(9190); X(9191); X(9192); X(9193); X(9194); X(9195); X(9196); X(9197); X(9198); X(9199); X(9200); X(9201); X(9202); X(9203); X(9204); X(9205); X(9206); X(9207); X(9208); X(9209); X(9210); X(9211); X(9212); X(9213); X(9214); X(9215); X(9216); X(9217); X(9218); X(9219); X(9220); X(9221); X(9222); X(9223); X(9224); X(9225); X(9226); X(9227); X(9228); X(9229); X(9230); X(9231); X(9232); X(9233); X(9234); X(9235); X(9236); X(9237); X(9238); X(9239); X(9240); X(9241); X(9242); X(9243); X(9244); X(9245); X(9246); X(9247); X(9248); X(9249); X(9250); X(9251); X(9252); X(9253); X(9254); X(9255); X(9256); X(9257); X(9258); X(9259); X(9260); X(9261); X(9262); X(9263); X(9264); X(9265); X(9266); X(9267); X(9268); X(9269); X(9270); X(9271); X(9272); X(9273); X(9274); X(9275); X(9276); X(9277); X(9278); X(9279); X(9280); X(9281); X(9282); X(9283); X(9284); X(9285); X(9286); X(9287); X(9288); X(9289); X(9290); X(9291); X(9292); X(9293); X(9294); X(9295); X(9296); X(9297); X(9298); X(9299); X(9300); X(9301); X(9302); X(9303); X(9304); X(9305); X(9306); X(9307); X(9308); X(9309); X(9310); X(9311); X(9312); X(9313); X(9314); X(9315); X(9316); X(9317); X(9318); X(9319); X(9320); X(9321); X(9322); X(9323); X(9324); X(9325); X(9326); X(9327); X(9328); X(9329); X(9330); X(9331); X(9332); X(9333); X(9334); X(9335); X(9336); X(9337); X(9338); X(9339); X(9340); X(9341); X(9342); X(9343); X(9344); X(9345); X(9346); X(9347); X(9348); X(9349); X(9350); X(9351); X(9352); X(9353); X(9354); X(9355); X(9356); X(9357); X(9358); X(9359); X(9360); X(9361); X(9362); X(9363); X(9364); X(9365); X(9366); X(9367); X(9368); X(9369); X(9370); X(9371); X(9372); X(9373); X(9374); X(9375); X(9376); X(9377); X(9378); X(9379); X(9380); X(9381); X(9382); X(9383); X(9384); X(9385); X(9386); X(9387); X(9388); X(9389); X(9390); X(9391); X(9392); X(9393); X(9394); X(9395); X(9396); X(9397); X(9398); X(9399); X(9400); X(9401); X(9402); X(9403); X(9404); X(9405); X(9406); X(9407); X(9408); X(9409); X(9410); X(9411); X(9412); X(9413); X(9414); X(9415); X(9416); X(9417); X(9418); X(9419); X(9420); X(9421); X(9422); X(9423); X(9424); X(9425); X(9426); X(9427); X(9428); X(9429); X(9430); X(9431); X(9432); X(9433); X(9434); X(9435); X(9436); X(9437); X(9438); X(9439); X(9440); X(9441); X(9442); X(9443); X(9444); X(9445); X(9446); X(9447); X(9448); X(9449); X(9450); X(9451); X(9452); X(9453); X(9454); X(9455); X(9456); X(9457); X(9458); X(9459); X(9460); X(9461); X(9462); X(9463); X(9464); X(9465); X(9466); X(9467); X(9468); X(9469); X(9470); X(9471); X(9472); X(9473); X(9474); X(9475); X(9476); X(9477); X(9478); X(9479); X(9480); X(9481); X(9482); X(9483); X(9484); X(9485); X(9486); X(9487); X(9488); X(9489); X(9490); X(9491); X(9492); X(9493); X(9494); X(9495); X(9496); X(9497); X(9498); X(9499); X(9500); X(9501); X(9502); X(9503); X(9504); X(9505); X(9506); X(9507); X(9508); X(9509); X(9510); X(9511); X(9512); X(9513); X(9514); X(9515); X(9516); X(9517); X(9518); X(9519); X(9520); X(9521); X(9522); X(9523); X(9524); X(9525); X(9526); X(9527); X(9528); X(9529); X(9530); X(9531); X(9532); X(9533); X(9534); X(9535); X(9536); X(9537); X(9538); X(9539); X(9540); X(9541); X(9542); X(9543); X(9544); X(9545); X(9546); X(9547); X(9548); X(9549); X(9550); X(9551); X(9552); X(9553); X(9554); X(9555); X(9556); X(9557); X(9558); X(9559); X(9560); X(9561); X(9562); X(9563); X(9564); X(9565); X(9566); X(9567); X(9568); X(9569); X(9570); X(9571); X(9572); X(9573); X(9574); X(9575); X(9576); X(9577); X(9578); X(9579); X(9580); X(9581); X(9582); X(9583); X(9584); X(9585); X(9586); X(9587); X(9588); X(9589); X(9590); X(9591); X(9592); X(9593); X(9594); X(9595); X(9596); X(9597); X(9598); X(9599); X(9600); X(9601); X(9602); X(9603); X(9604); X(9605); X(9606); X(9607); X(9608); X(9609); X(9610); X(9611); X(9612); X(9613); X(9614); X(9615); X(9616); X(9617); X(9618); X(9619); X(9620); X(9621); X(9622); X(9623); X(9624); X(9625); X(9626); X(9627); X(9628); X(9629); X(9630); X(9631); X(9632); X(9633); X(9634); X(9635); X(9636); X(9637); X(9638); X(9639); X(9640); X(9641); X(9642); X(9643); X(9644); X(9645); X(9646); X(9647); X(9648); X(9649); X(9650); X(9651); X(9652); X(9653); X(9654); X(9655); X(9656); X(9657); X(9658); X(9659); X(9660); X(9661); X(9662); X(9663); X(9664); X(9665); X(9666); X(9667); X(9668); X(9669); X(9670); X(9671); X(9672); X(9673); X(9674); X(9675); X(9676); X(9677); X(9678); X(9679); X(9680); X(9681); X(9682); X(9683); X(9684); X(9685); X(9686); X(9687); X(9688); X(9689); X(9690); X(9691); X(9692); X(9693); X(9694); X(9695); X(9696); X(9697); X(9698); X(9699); X(9700); X(9701); X(9702); X(9703); X(9704); X(9705); X(9706); X(9707); X(9708); X(9709); X(9710); X(9711); X(9712); X(9713); X(9714); X(9715); X(9716); X(9717); X(9718); X(9719); X(9720); X(9721); X(9722); X(9723); X(9724); X(9725); X(9726); X(9727); X(9728); X(9729); X(9730); X(9731); X(9732); X(9733); X(9734); X(9735); X(9736); X(9737); X(9738); X(9739); X(9740); X(9741); X(9742); X(9743); X(9744); X(9745); X(9746); X(9747); X(9748); X(9749); X(9750); X(9751); X(9752); X(9753); X(9754); X(9755); X(9756); X(9757); X(9758); X(9759); X(9760); X(9761); X(9762); X(9763); X(9764); X(9765); X(9766); X(9767); X(9768); X(9769); X(9770); X(9771); X(9772); X(9773); X(9774); X(9775); X(9776); X(9777); X(9778); X(9779); X(9780); X(9781); X(9782); X(9783); X(9784); X(9785); X(9786); X(9787); X(9788); X(9789); X(9790); X(9791); X(9792); X(9793); X(9794); X(9795); X(9796); X(9797); X(9798); X(9799); X(9800); X(9801); X(9802); X(9803); X(9804); X(9805); X(9806); X(9807); X(9808); X(9809); X(9810); X(9811); X(9812); X(9813); X(9814); X(9815); X(9816); X(9817); X(9818); X(9819); X(9820); X(9821); X(9822); X(9823); X(9824); X(9825); X(9826); X(9827); X(9828); X(9829); X(9830); X(9831); X(9832); X(9833); X(9834); X(9835); X(9836); X(9837); X(9838); X(9839); X(9840); X(9841); X(9842); X(9843); X(9844); X(9845); X(9846); X(9847); X(9848); X(9849); X(9850); X(9851); X(9852); X(9853); X(9854); X(9855); X(9856); X(9857); X(9858); X(9859); X(9860); X(9861); X(9862); X(9863); X(9864); X(9865); X(9866); X(9867); X(9868); X(9869); X(9870); X(9871); X(9872); X(9873); X(9874); X(9875); X(9876); X(9877); X(9878); X(9879); X(9880); X(9881); X(9882); X(9883); X(9884); X(9885); X(9886); X(9887); X(9888); X(9889); X(9890); X(9891); X(9892); X(9893); X(9894); X(9895); X(9896); X(9897); X(9898); X(9899); X(9900); X(9901); X(9902); X(9903); X(9904); X(9905); X(9906); X(9907); X(9908); X(9909); X(9910); X(9911); X(9912); X(9913); X(9914); X(9915); X(9916); X(9917); X(9918); X(9919); X(9920); X(9921); X(9922); X(9923); X(9924); X(9925); X(9926); X(9927); X(9928); X(9929); X(9930); X(9931); X(9932); X(9933); X(9934); X(9935); X(9936); X(9937); X(9938); X(9939); X(9940); X(9941); X(9942); X(9943); X(9944); X(9945); X(9946); X(9947); X(9948); X(9949); X(9950); X(9951); X(9952); X(9953); X(9954); X(9955); X(9956); X(9957); X(9958); X(9959); X(9960); X(9961); X(9962); X(9963); X(9964); X(9965); X(9966); X(9967); X(9968); X(9969); X(9970); X(9971); X(9972); X(9973); X(9974); X(9975); X(9976); X(9977); X(9978); X(9979); X(9980); X(9981); X(9982); X(9983); X(9984); X(9985); X(9986); X(9987); X(9988); X(9989); X(9990); X(9991); X(9992); X(9993); X(9994); X(9995); X(9996); X(9997); X(9998); X(9999); X(10000); } ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] libstdc++: use new built-in trait __is_reference 2023-03-20 15:23 ` Patrick Palka @ 2023-03-20 20:24 ` Ken Matsui 0 siblings, 0 replies; 12+ messages in thread From: Ken Matsui @ 2023-03-20 20:24 UTC (permalink / raw) To: Patrick Palka; +Cc: Jonathan Wakely, Xi Ruoyao, gcc-patches, libstdc++ [-- Attachment #1: Type: text/plain, Size: 3980 bytes --] Thank you so much for taking the benchmark! This is a great improvement than I thought. In GCC contributions, do I need to benchmark (and report) every built-in trait I implement? On Mon, Mar 20, 2023 at 8:24 AM Patrick Palka <ppalka@redhat.com> wrote: > On Mon, Mar 20, 2023 at 5:56 AM Ken Matsui <kmatsui@cs.washington.edu> > wrote: > > > > > Does it actually make compilation faster though? > > > > > > Has it been measured? > > > > In my understanding, what I have implemented so far is so simple that > > it does not affect the speed. These traits are what Partick kindly > > recommended to get started. As explained on the GSoC page, some traits > > might involve expensive instantiation of multiple class templates. So > > IMHO, implementing built-in traits for those traits can make > > compilation cheaper. > > > > I have not measured it, but Patrick might have done? > > Although the native implementation of using two partial > specializations is very efficient, I'd suspect using a built-in would > be even better because it'd avoid the work of having to figure out > which of the two partial specializations to instantiate. > > I contrived the attached benchmark to measure this, which instantiates > ~160k specializations of is_reference_v (it was simpler to write a > benchmark for the variable template version). On my machine gcc trunk > (release build) as well as Clang 15 use between 10-15% less > time/memory with -DUSE_BUILTIN than without for this benchmark, so > this suggests the built-in improves compile time/memory usage for this > trait by at least 10-15%. For more complicated traits the improvement > should be even better. > > > > > On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> > wrote: > > > > > > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++ > > > <libstdc++@gcc.gnu.org> wrote: > > > > > > > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote: > > > > > Oops, I assumed those were my email... Thank you for your heads up > and > > > > > your comments! > > > > > > > > > > > Bad ChangeLog format. You should have a tab (not 4 or 8 spaces, > nor > > > > > > nothing) to indent the ChangeLog content. > > > > > > > > > > Do you mean like the following? > > > > > > > > > > ``` > > > > > libstdc++-v3/ChangeLog: > > > > > > > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference > > > > > built-in > > > > > trait. > > > > > ``` > > > > > > > > Yep. > > > > > > > > > > Is there any benefit to use a builtin, instead of the existing > > > > > > implementation? I can see no but maybe I'm stupid. > > > > > > > > > > My patches are based on the GSoC project "C++: Implement compiler > > > > > built-in traits for the standard library traits". These built-in > > > > > traits basically make the compilation faster. > > > > > > > > > > https://gcc.gnu.org/wiki/SummerOfCode > > > > > > > > Ok, to me making compilation faster is a valid reason. > > > > > > Does it actually make compilation faster though? > > > > > > Has it been measured? > > > > > > > > > The patch fails to apply. It seems because your mail client > inserted an > > > > > > additional newline before "b/". Try to use git-send-email or > configure > > > > > > the mail client properly. > > > > > > > > > > Let me try to use git-send-email instead. I stupidly don't > understand > > > > > how to use them, so I was making my patches manually... > > > > > > > > Or adjust the mail client correctly. You can send the patch to > yourself > > > > first and see if it's not "mangled" by the mail client when you debug > > > > such an issue... > > > > > > > > But when you finally end up sending 10 patches in a series you'll > find > > > > git send-email much easier :). > > > > > > Figuring out how to generate proper patches is an important part of > > > contributing to GCC, so part of any GSoC project. > > > ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2023-03-20 20:24 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-03-19 4:21 [PATCH] libstdc++: use new built-in trait __is_reference Ken Matsui 2023-03-20 7:25 ` Xi Ruoyao 2023-03-20 7:30 ` Ken Matsui 2023-03-20 7:51 ` Xi Ruoyao 2023-03-20 8:03 ` Ken Matsui 2023-03-20 8:07 ` Xi Ruoyao 2023-03-20 8:32 ` Ken Matsui 2023-03-20 9:14 ` Jonathan Wakely 2023-03-20 9:56 ` Ken Matsui 2023-03-20 13:22 ` Ken Matsui 2023-03-20 15:23 ` Patrick Palka 2023-03-20 20:24 ` Ken Matsui
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).