unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
@ 2020-10-29 23:01 Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-10-30  0:36 ` Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-10-30  8:06 ` Eli Zaretskii
  0 siblings, 2 replies; 30+ messages in thread
From: Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2020-10-29 23:01 UTC (permalink / raw)
  To: larsi, eliz, 44320

[-- Attachment #1: Type: text/html, Size: 1473 bytes --]

[-- Attachment #2: 0001-Make-sure-send-string-to-terminal-send-all-contents.patch --]
[-- Type: application/octet-stream, Size: 1523 bytes --]

From 72ae35b1fdc7bc3d87e0b829079f61fc961a860d Mon Sep 17 00:00:00 2001
From: Lin Sun <lin.sun@zoom.us>
Date: Fri, 30 Oct 2020 06:25:56 +0800
Subject: [PATCH] Make sure send-string-to-terminal send all contents

* src/dispnew.c: send-string-to-terminal: the 'fwrite' return the
number of items written, loop it to make sure all contents are writed.
---
 src/dispnew.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/dispnew.c b/src/dispnew.c
index 1ae59e3..df5e0c9 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -5881,6 +5881,8 @@ DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
 {
   struct terminal *t = decode_live_terminal (terminal);
   FILE *out;
+  const unsigned char *buf;
+  ptrdiff_t nbytes;
 
   /* ??? Perhaps we should do something special for multibyte strings here.  */
   CHECK_STRING (string);
@@ -5904,7 +5906,24 @@ DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
 	}
       out = tty->output;
     }
-  fwrite (SDATA (string), 1, SBYTES (string), out);
+  buf = SDATA (string);
+  nbytes = SBYTES (string) + 1;
+  do
+    {
+      size_t ret = fwrite (buf, 1, nbytes, out);
+      if (ret > 0)
+        {
+          buf += ret;
+          nbytes -= ret;
+        }
+      else
+        {
+          error ("failed to write %" pD "d bytes to terminal: %s", nbytes,
+                 emacs_strerror (errno));
+          break;
+        }
+    }
+  while (nbytes > 0);
   fflush (out);
   unblock_input ();
   return Qnil;
-- 
2.2.0


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-10-29 23:01 bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2020-10-30  0:36 ` Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-10-30  8:06 ` Eli Zaretskii
  1 sibling, 0 replies; 30+ messages in thread
From: Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2020-10-30  0:36 UTC (permalink / raw)
  To: 44320@debbugs.gnu.org, Lars Ingebrigtsen

[-- Attachment #1: Type: text/plain, Size: 245 bytes --]

(Resend with plain text mail)

Hi Lars,


I got a bug that `send-string-to-termina` may send part of contents to
terminal, calling `fwrite` in loop to make sure all contents are written.
Please review the patch. Thank you.

Best Regards
Lin Sun

[-- Attachment #2: 0001-Make-sure-send-string-to-terminal-send-all-contents.patch --]
[-- Type: application/octet-stream, Size: 1523 bytes --]

From 72ae35b1fdc7bc3d87e0b829079f61fc961a860d Mon Sep 17 00:00:00 2001
From: Lin Sun <lin.sun@zoom.us>
Date: Fri, 30 Oct 2020 06:25:56 +0800
Subject: [PATCH] Make sure send-string-to-terminal send all contents

* src/dispnew.c: send-string-to-terminal: the 'fwrite' return the
number of items written, loop it to make sure all contents are writed.
---
 src/dispnew.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/dispnew.c b/src/dispnew.c
index 1ae59e3..df5e0c9 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -5881,6 +5881,8 @@ DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
 {
   struct terminal *t = decode_live_terminal (terminal);
   FILE *out;
+  const unsigned char *buf;
+  ptrdiff_t nbytes;
 
   /* ??? Perhaps we should do something special for multibyte strings here.  */
   CHECK_STRING (string);
@@ -5904,7 +5906,24 @@ DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
 	}
       out = tty->output;
     }
-  fwrite (SDATA (string), 1, SBYTES (string), out);
+  buf = SDATA (string);
+  nbytes = SBYTES (string) + 1;
+  do
+    {
+      size_t ret = fwrite (buf, 1, nbytes, out);
+      if (ret > 0)
+        {
+          buf += ret;
+          nbytes -= ret;
+        }
+      else
+        {
+          error ("failed to write %" pD "d bytes to terminal: %s", nbytes,
+                 emacs_strerror (errno));
+          break;
+        }
+    }
+  while (nbytes > 0);
   fflush (out);
   unblock_input ();
   return Qnil;
-- 
2.2.0


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-10-29 23:01 bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-10-30  0:36 ` Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2020-10-30  8:06 ` Eli Zaretskii
  2020-10-30 12:38   ` Lars Ingebrigtsen
  1 sibling, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-10-30  8:06 UTC (permalink / raw)
  To: Lin Sun; +Cc: larsi, 44320

> Date: Fri, 30 Oct 2020 07:01:53 +0800
> From: Lin Sun <lin.sun@zoom.us>
> 
> I got a bug that `send-string-to-termina` maybe send part of contents to
> terminal, calling `fwrite` in loop to make sure all contents are written.

Any idea why does it not write the entire string in the single call,
or how to reproduce this?  What is the size of the string in the case
where it fails to write everything?

Thanks.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-10-30  8:06 ` Eli Zaretskii
@ 2020-10-30 12:38   ` Lars Ingebrigtsen
  2020-10-30 13:25     ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-30 12:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 44320, Lin Sun

Eli Zaretskii <eliz@gnu.org> writes:

>> I got a bug that `send-string-to-termina` maybe send part of contents to
>> terminal, calling `fwrite` in loop to make sure all contents are written.
>
> Any idea why does it not write the entire string in the single call,
> or how to reproduce this?  What is the size of the string in the case
> where it fails to write everything?

fwrite isn't guaranteed to write the entire string in one go, is it?  So
I'm surprised that this doesn't lead to more problems, but I guess it
doesn't show up more in practice because one usually sends less than one
block at a time to the terminal?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-10-30 12:38   ` Lars Ingebrigtsen
@ 2020-10-30 13:25     ` Eli Zaretskii
  2020-11-02  2:58       ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-10-30 13:25 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 44320, lin.sun

> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: Lin Sun <lin.sun@zoom.us>,  44320@debbugs.gnu.org
> Date: Fri, 30 Oct 2020 13:38:24 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> I got a bug that `send-string-to-termina` maybe send part of contents to
> >> terminal, calling `fwrite` in loop to make sure all contents are written.
> >
> > Any idea why does it not write the entire string in the single call,
> > or how to reproduce this?  What is the size of the string in the case
> > where it fails to write everything?
> 
> fwrite isn't guaranteed to write the entire string in one go, is it?  So
> I'm surprised that this doesn't lead to more problems, but I guess it
> doesn't show up more in practice because one usually sends less than one
> block at a time to the terminal?

I understand the basics, I'd just would like to know the details in
this case.  fwrite could be interrupted by something, or it could
write only part of the buffer, or something else.

This is very old code, so it is surprising this only comes up now.
I'd rather we understood the issue completely before we decide how to
fix it.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-10-30 13:25     ` Eli Zaretskii
@ 2020-11-02  2:58       ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-11-02  3:11         ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-11-02 15:22         ` Lars Ingebrigtsen
  0 siblings, 2 replies; 30+ messages in thread
From: LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2020-11-02  2:58 UTC (permalink / raw)
  To: Eli Zaretskii, Lars Ingebrigtsen; +Cc: 44320@debbugs.gnu.org

[-- Attachment #1: Type: text/html, Size: 2592 bytes --]

[-- Attachment #2: testing.el --]
[-- Type: application/octet-stream, Size: 292 bytes --]

;; testing the sixel image with emacs,
;; only tested on mintty, according https://github.com/saitoha/libsixel
;; it should work on xterm/VT240/VT241/VT330/VT340/VT282/VT284/VT286/VT382.
(send-string-to-terminal
 (with-temp-buffer
   (insert-file-contents "testing.six")
   (buffer-string)))

[-- Attachment #3: testing.six --]
[-- Type: application/octet-stream, Size: 21122 bytes --]

[-- Attachment #4: testing-strace.log --]
[-- Type: application/octet-stream, Size: 48865 bytes --]

...
write(6, "\33Pq\"1;1;136;114#0;2;50;47;28#1;2;44;47;28#2;2;53;56;25#3;2;53;60;28#4;2;44;56;28#5;2;53;50;38#6;2;60;50;41#7;2;66;50;22#8;2;50;47;35#9;2;50;44;28#10;2;47;63;41#11;2;63;53;53#12;2;44;63;50#13;2;72;75;53#14;2;44;63;72#15;2;60;72;78#16;2;82;72;78#17;2;25;41;31#18;2;41;44;3#19;2;22;22;0#20;2;66;66;41#21;2;66;72;19#22;2;25;38;19#23;2;19;22;13#24;2;41;38;22#25;2;44;50;44#26;2;38;56;44#27;2;16;85;72#28;2;25;35;3#29;2;28;50;35#30;2;9;9;3#31;2;38;35;16#32;2;44;56;53#33;2;0;25;19#34;2;41;50;22#35;2;53;50;41#36;2;16;16;0#37;2;44;50;16#38;2;63;50;44#39;2;38;28;19#40;2;41;50;44#41;2;3;16;3#42;2;28;22;9#43;2;44;41;13#44;2;38;28;6#45;2;16;16;9#46;2;3;3;3#47;2;41;38;28#48;2;38;35;3#49;2;28;53;41#50;2;44;35;6#51;2;47;41;22#52;2;31;25;0#53;2;22;47;35#54;2;25;22;0#55;2;25;19;0#56;2;35;25;0#57;2;53;44;16#58;2;44;44;28#59;2;38;31;0#60;2;41;53;50#61;2;53;56;6#62;2;47;38;22#63;2;41;35;19#64;2;44;38;22#65;2;16;3;6#66;2;6;3;3#67;2;19;13;0#68;2;47;41;3#69;2;53;44;0#70;2;53;38;6#71;2;50;44;41#0@ICPIAOBQCB?@Q?G?O?o?_GoKOGOkA\\IQU?ExAI@B?A#29O#14_?OaW?PA#27G?C#16??_O@SA~#12W??E_G??_???Og_Y_]_IDg#20_?OQO!4?@gZC`?gQcOK{CqC!7?J_GAG_??C?AOB?Q?AH?d$#3scwecXeSGJ[f]DnDuLvMiXEK`@@GATAC@GDO??S?W?C#40_#32CG#15??C_K_cRhQ|FlIbl?B???H?LDDADG@?@#10!4?OgOE{bK@!4?SQcPOjOcPmq?ZCxE!4?AzcJdWc!4?B@FCHdi@ADQ$#2GO@GO_G_co_W_gOqG_G?PCOAQKQd???_?_?_CG__C#10_?KH#13OcXa\\a\\RkQlAWAsGO?c??@UdQiQ|IviV]`^`^dQFXBK`MB!7?ICD@I@?B?HA@!9?@O#19@?_#37O_?_$#1A@A?@C@G#4@#5!7?@!4?A?@?A??@#4???C???A??A#25??_A#20A#12eJC@A#17!14?@#10|w#14?O?O??o!4?C#4!10?_C?OH#35g#12??IC?AG#21??@#3?_??G??cYwCOSQ!5?B?CGWuGT{syG$#9!17?A??C#1?_??__??_???@I??C@S?NX@#38O#11@#23!18?I#26A#27??A_?G???C#28!14?OG#1gO#11???_?O#34!9?O?_O#35cC!4?_#29A#36CW#34C_G$#6!19?@#7??@#8???CA???@!5?@??_#33!23?S#23!25?_#19E@#3eAD#28!13?_cA#4@@!9?A?CO?_$#34!28?OG_Og?oG?o?G?O#41!22?_#37!25?G#22OA!17?JC!8?@G#24@G#2GOg$#9!35?@#34!55?_C#39!17?O#23@#1I#8?@#11!4?C#30?A#23c#0@$#18!91?@#24!19?W#40!9?O#31A#28O-#3~~{~wnwu||y}|y}|y~tsx_t_Gq!10?AOEG#15[C???CHOeO}CzlqNoL_NOEO!8?@??C#35???_!7?E!4?G?g?sHAGQk@Qc#2_#4?O?A???gI??_?_???W!6?@DC?O?O$#2??B?FOFHAAD@AD@A??GACY?YoGowoxcxaX_WD#4_G?@#14_???_?_@#16!8?AO???N#10C?@K[wpWo_Goc?g??R?GM?FGA!4?gAtHaXF?RC@I@??D!6?CBUDHA?B!9?@A??A$#0!16?D?AH?DIC?DHAD!5?F_g@?@#16_@#12Q[QJSA#27G?@#12!12?j??ABECE?JSBGITA\\_Sb???_#22?OAA#8?AO#5A!8?O#1!4?C??_#25??O_#1!7?C?_!6?G__#35C$#4!20?A#1??@A?A@??@A\\_O?OC?C#26??G@#22!20?G?_#24_#20?G??O_G?o?S_KAS`So@|B!8?C?@?A?@?@?A!6?@?@!5?EG#23@#43AC?GO#18_#5???C$#34!24?C?CCIEYC?EGF?I@A#23!24?`_#1O#14!4?C???@#11!5?G??I?O#28?_C@#4?C#24!15?w?C#0Q?_!8?`!9?O??_$#8!24?@#10!13?_OA?cA@#28!19?CO#38!15?_#32?O_#3G!4?oUPDGAS_ok?wk?]}nw@???BTiWGOUx~w?Oo!5?AADNZH$#25!38?O#13_?Y@_kOaLOn?zCQLoNoNonx_O??@?@A@ICB?QDAHA?@??@#34???G?G#19!18?A#22G#34DS#35??C?i?C?C#34?_?@???KO?_$#33!64?A#4A!4?_#25!17?C#1`?`#23!17?@#28a#37G#19!11?@CCgO_#44_$#41!64?O#29K#24!23?OC#36!18?{#42@#22!12?A#24G#36GO_$#23!89?G#43!20?O#30!13?A#42O#37BEF?Go$#2!127?@?A?G$#31!127?GO-#3FHFVND|N]~~~v|ztbFqJ@P@U??@?E?_SGEgWC#13_Wa?OaE?Uk@iTyCjdYulIfYDZE@?CCG??O#8A#3P?a__?AE?CKG?G???@]C@i?wli]uDIBDIPDFo!6?D?@@o?B??BCC?G#28C??O#54O#31GG$#2_?_?_GA_@!7?G!4?C??@@G@@BFBDHVB#10wM@??BCHUGOo???_OO???O??O_??Gw?OG_?P?!4@?@?@@?@CAA???@??@!4?@#5@#2isgwciYoG!9?SAlgUKs_G#37_!6?A#55O$#4GC!6?_#20???GACISgHSsIsHsIs_WcOg?o?_!8?G#27???@G?A#14!8?I#28?_!8?G???G!6?_#47?_??@#8???G!4?O#34!5?O?O???E???CW?_?_?@??`P?WAO_?O?A@?D$#0OOG?O#5A#21!11?OC_I_I_Io?]_OG?o#1??C@#14OC#16?K#49G?_!5?_!5?G!7?a#1E!4?@!5?C!4?W?O?W!4?C!8?_#24!9?@?@[g#25?@#8?@#35!8?@#39@#43A?_?@`#42?O$#1?_?G?_?O#7!17?CA??G#0??A#4???A#35@#15_\\r_!4?@ICADPCID@QDOD??@#34O!6?G?AO??C_C!7?COcA_#31!18?_?_#1BF{O??GCOCG!4?C#36@!5?__$#8?A#34O_?O#11!32?A#12??C@?@@ACO??G??_??_G__CG#17C@#45@???AC?GG#23G??O?_!5?_G?@#19!20?MO#37@#43O_#30!13?@#51CG__??CA$#29!42?O??_#53!16?O#23G#20o?g_OO?___!5?@?A??A?@#22A#36!21?@#23C#47A#19!16?ABCG?G$#53!42?G#28O#41_#40!20?A#35OC?G_!6?@!5?A!7?AASJDAT???@#44!7?O#28i#9!17?O#44?I??_$#22!66?A?@???C#2A?AAE?G!8?G#48!41?@A?C$#46!66?@#36A???C#24?CC?G!6?_?O#43?_#50!43?OCA$#41!67?@#47C?A#44???O#51??G#0G??G?O!4?Og?`??_!4?GO?CA??_G!7?AkOaGAO?aG?o??O!4?@$#25!68?_#19C!5?OO???__!4?oC#52!43?CG$#30!68?A#4?@", 4096) = 4096
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 4096
write(6, "!9?C?AC!5?O?O{?SA!8?@C!8?AGQM!7?A?G$#31!78?o!8?GA$#39!79?O#38A!4?C$#37!81?O#11@??@$#25!84?@-#2}waWCi?I?DGEGgSWap__O_G??G#7??O???@#12O_C??CDoMa_OgSO#22A!4?G?OO!4?g#1o??_!4?C#5G#2!4?@?AA@#24@!4?JLG#1Vu_D`_??I#57!9?_#24?@???@IGGO#51K?_PG?GC@??A???C#41G#30F$#0@C@a@?D?A?@?O#20???@?@@AHEPn@mPmp}tKN@??O?_#27??OG#26@#23@A?C?G?G???!4_gS#4KO#25O#11?A?@#21!8?@#19!4?@??O_#0_???CQ?U@?@SHA_C?A?O?GO!7?B?@G?A?A??D#50O#3_??_#36_@G$#34?BCDQPgo{yOo_O?_#21??CA?APIOEPm@M@IA#16_#10WB??yW!5?A?`h?rAFEMKE\\!5?@jUc^Ai`CQG_CoGc?G#8??A!7?G?G#5?G#2ISIcWMz~|~nZvio!4?A?GA?BAC@O@??_#20?_?W#22A#46o$#37??W?g#1C?D???G??_#32!17?_???@#17_!8?@#1C???O#36?O?_#35??O!5?CHW_[OA`?AO#36!8?@@K#51?O#34vg!6?C???@#37!9?G_@AC_???GO_@QCGE_CP@#18G#44@#24G#55A$#4!6?A???C?C#13!22?GID?AIoGTgCgGOP?@?@@AHACH@#53@#40A#20!5?_D?A?O?`G_?S?_CW#22G?SA#4??HPgQGO@???C#31!9?EGAG#34@CTCPAC#57K_C@???@#61?O#21o#42?@$#51!6?O???_#49!24?_#15C???C@DAEO#41?A?C?G#19??O#49@!4?C#13!22?C#23CA#35!9?C#9_#56!13?@#43OC?OO!4_??Og?QGIA?A@$#3!8?@?A@BFJF[MY[lS_c?o!6?O?E#60O#14OI@?@#3!8?_???_!9?m!6?WOldNYEUXhu]y__!6?A?C@aO_`Q_P!5?C?C#28?BG_#50_#1@A??C#59!4?_!5?G$#22!36?_#4!12?A?C#31??_#12???JEA!5?@#37!17?O#28_#44!25?C#48oO#7!5?O#56!5?_??G?C$#58!49?G#28C?O!8?A@#39!21?A#30@#22!27?C#28!12?_??G?E?O$#20!51?__#29!6?O#30O#48!65?O??C??C$#19!127?O!4?A?Co-#2FJVI\\QCG?_!4?@??A@IBD^]kY#21E?@#12_g[pKA???C?CxU{niP#20@!6?@@AAG?_!7?AOdOdY_Sg?HAC??C@#48@#31AO?_#0?@?[@UQDHcP_C?I?D??C@#24?C!4?O#3_??_GScG?D?O#4A?B#41`B#19P$#21gS__?_#34@?CIDJTBSkIl]S{G?_O#20@??KD#32O#11_#14??_G!7?@#3!4?OMj{rhSW__!9?[W_??A?DJBVqlP^~jq{o!6?@A??G!6?@#43?OO?OGG?A???BBA?D#18?A?@#10oGoCW_#23o?K#31C$#7O_?O#57??g?G?_#0!5?@!4?_#3?@BcwNAA@#35@#49??O#16??A#35!10?C!8?Ga?O!5?@?CH?CG_Q??_?O#4A??O#2KA?_!6?_?h_URmNRNSFAJD@??A!4?_Oo?WC???@A#61??@#13C#22G#46]_$#61??GC_GO__#24?A??Gg?o?_#4@?A#7!4?@#10o?GEA!6?`^rCH?ODk}JPC??AACWSOg!5?@EB@EYjODG_SGC?g#5_#43!4?C?KW#1?AFA?@??_#37??Og?_W_COI?B!8?@#36!13?O$#37???@ADAVOSO_gS?R?O???O_#13!5?OO??KqGsX|Y_GA_A?OA#2?_??@CO__#1C!5?AHGO#2__#28!18?@EO#51AC_#4!4?CA?G#51???_?_??I!4?C!5?@#20O?_?OCI?AH_Q$#51!8?A@??A?A?C#1??_#15!8?_???A@DBe#4!12?_OAGCG!8?EEKO?_#37!17?G#24@@?O?_#57!10?O??G???AC#23O???O#21???_?OgGqCoLaCH$#1!8?@#43?GS?_#25!41?A!5?_#24C?__#5G#19!20?G#34ADj[W_[g?O#64!9?_#50_!4?@??A$#17!56?@#23@???CO#31O#40@#56!23?_#28!20?_?o??A`?CGGAA@?@!7?C??i$#36!58?@@CG?_#34!46?C?G???_???G???A$#13!58?CO#30B#28Ag#19!47?_???_?C?CCC$#8!59?C!5?A#63!44?O???C#56A!7?@$#22!59?AG@#34@?O#62!47?@#36O?WGG$#19!61?O#65!50?_#22G#59@!7?A$#30!113?_#39G#44C#48@$#46!114?O-#21|zm|YuksOO_#37BDTGOhoGO#1@#0A#47O#8_#4I@!5?G!8?_C??_???@AD?@!9?_!6?@??GG?G#37!5?_!4?_W`CO??A??_?_?OO?G??C#59A#13_#20W!8?A?@#2?oWoSa?GP#1_#31G???q$#7ACOAdGPAg_#34!4?FiE?fhU|n[D#10C@???UDyuo?wcgTB@EKCGdYCwoO???G?@G@?IG!9?AA@?CA#8!6?A#43?O_O_G???Ca???P??G?@C#18??A#17_#23G?O#22GA#21???GAKBC@A@??A?@#23O?_A$#2??@!5?DISGqg??O!6?B#12o?A??GGODHIt?@!4?@BBB??_#20??_???O??@??@A??GO!4?@???@A#57!11?GO#28a?sO?OOWGGGKCAC@A?@???_C#42@#34!13?_?OE#46{B#22G@$#61!5?@AHACJoG?_#24@?NOEg#13!4?GC@?@_a??DIDA@#2??WO_!7?BM@!5?_?_??O_??@A?C?O???O?gO??OkOFEA!6?@!6?O@GGGK#46??_[E#36!18?_?O@$#57!9?@?C?AO#43C#15!9?ow{|Q#27!6?A#20W?A#3??gO?_???@IKo}Vfn]u]}SS}CO?__?BAC@CAGDLFLNAF@B#44???BDG?K!4?O?C?A!6?@#41O_#65@#41!19?@#30K#28oK$#3!25?A#16?AA#14c@#21!7?Ug[a#25??GSYcW#21!5?g?O_#35??@#0?@???_!7?GO?G_O??[??C?@CG#56?_?_O!8?CAA@@#31??@#36AGB#66!18?A#19?C$#1!44?O#35??@AC#43!13?@?@???_OG?_#6A#50!16?O!9?A#0@#10_?___O!8?wCKACAC@A@?D?A@$#34!64?_?@?ACC???O_?_!4?_??G#31!5?B??g?G??C#3?__?oOO?GC!5?CQDp`oWHAKGK^?CC$#5!64?G!8?C#19!17?C#42G#63?A???C#4__??O???O??A??_wYlA?O?_?_?_O_OiG$#19!64?@ACKGO_#18O_#24!22?CBC??@!8?A#58C#19@$#24!64?AC??C#31G?_#35@??C@?A?A?@#18!12?G#34?_@?A@!6?C!4?OC`$#1!66?G!9?O?O??O?G!8?@???C?A$#28!66?A#51A!4?O???_???_??_O_G!5?A@@??B?A$#8!67?O#44O#57?G???_$#37!67?@-#21zE^VtnZ}R|USloGw_O?_#10??CP!6?_?@b?AABBA??C??O?@@?AB@#61WSS[[K[?CG#43?OO!4?HK??@?AA?A??G?HD???A??@#0??@#20!4?C?A@??AA#41_ECG#37B???G!4?AoSAK?B#23O???GIGO$#3Co_#2!6?A@AADFDML[QK#12?_AG_gB_xSBKO@@#37OOO?O_??A!4?OO?O!7?G?SCA?ACG!9?A!8?C!5?@??_?_#1!6?_O#12@#45O??@#28g#24_!5?_?_??O?G???@#30Q@#44?A$#20?G?gAOc?g?g?O?O??_??_oG!9?A???C??G?E!5?A??@??A#59_!8?_!5?O??@#19GcOCKC?C!7?@#18?A#22!15?_?G???S??_!9?OOC?K!4?CC$#7?@??G??@C??h??_?O?_#57G#4??@#13C?C??GAAkO???@!5?A#35?O?@#22?G#32@#0G#28_#50_#18_?_?__??_#31??_???_#44?_?AC#30W#23_O??G#31GAAC!7?@#29!15?O#11@#23@?A#2!5?AGECC#28?__!5?A???@J$#3!13?G!6?OG#25A#15GeBBSR?GO#3?CEC?CKCFGHk?_A??EC?E#21@?J?A?@#57?G?G?K??AC!5?@!6?@#3_?o_O_?wC{qKWEGF@BGCC?B#35?G#26A#46wZ#36S#3!7?@#21?@#61?@?@#19__?OC?q_O_$#61!13?A?A#37@A?DA#35?O#11_#32OWO#27?C#35!4?G#4W!8?QG@?o???C??@#48?_??_??_!4?_!5?@#54?C#67G#22?O??G??C??A#2C!5?`?@?O#39!8?_#58C#30?_#42_!13?_??_!4?T$#34!18?A?@F#16??@#14?Cg?C@?_#25?_#34W?_!4?_?DAC?cg#68!8?O?o#69O?O#50?_OO!7?A#4!6?_Oo?O?GGC?A?A_WrGwWoOGGKG!7?@BFDF?B?@?DA#31?O#17G#51A#55__??_$#51!18?@#29!16?_#2GG??GOO@!7?GGCI?B@BAFBBBLALA@B#56?P#24_!5?_?Q??@??C#10_Oo?w?KOE?C?E?FHAF?DC#43!20?C#54_#36O@C$#1!36?_!7?_GG#0!18?@#28_?O_O_?A??_O?C?C?!4A??@#45!40?G#66K$#43!38?_!9?O?_O#34!15?@C?A!6?`?p_pOG?GGG?C?A!8?_?_ooO!7?^}[owoWwWMIG?FGB@$#21!39?@?@#24???C?K#51!19?G?GCA!4?@?@?@#48!5?@@A?@$#18!39?__#40!5?o?A#42!23?O?A???G???C$#61!39?O#39!32?G#36o?G$#63!72?C-#21DODJSHUHVUtJuJuLWDF#15OgtEgP~o_#40GO!5?A?@C#2???D?O_?aC_??A???A??C?I???gO!4?A#22A?OYB@?_#10?DCJEDALADA?A#22C??AA?AA??@@@!7?@@!4?@#48@!4?__??_???O?D$#3IkyshQ@S?G#7!6?@#13?gcUI@!4?@?E?A#24GW??__#57!6?AGC#51C#48G??C#22??gO#29??_#4?C_SsKOGO??G!7?C?N?J?GW!6?@B@#23C!7?C???@!5?A??A#44?CC#56?AAA?@!8?@$#2OA!4?_?_#11!10?G#16??wVm#12?DUv_a@@#37_!5?@?@?EKSOO_?aiGFUE??A???AAA?B?@?A#51_#19O#23GE#29?GK!5?O#31??_?_OOG#2_??O@O?OOWOO?OWOCG#57O?G?O??G!9?A!7?A$#4_#20@??AcGaG`IsHsHqeyOB@#14!5?A??@#1OO???_W?OC?c??@???A#24A!7?O!7?A?@?@??@?_?O__?__??__??O?g#37_?_Oa_`q`G``!5_?o?GoGG#31@?@??C!7?O?@O_CwG$#26!26?GG#10?GDCA@A??A#18!8?GG??O?c?@@@?@?@@#28?@?@!6?g?H@#49??O#40K?G#3?C@AD?HI@B#19GG?G#36C??C??CA?A?AA?C?ACC#50!4?_?_o_oGOt?WshSG?o$#35!30?G?CA#34g[??@_lYyx?Aa@?D???_?gsm[yiSG?oCCMMM@@???C_OJP?O__O??O!6?A@??@?@#3?GGG??CG#18?__??_O_?_?gS?W?UKG_C???_$#3!31?G#22_???C#29WiGO#0!5?@#68?O?G#1!9?O?_???_??OSW!4?CA??O?O???O!5?C#67?G!9?A#20GC#21G#66@A#46A#68O?o??G!7?C???C#37A#44??@$#47!31?_#28O#4CC??C?QA???_@??@#43ODPPW??G??@!4?@!8?_?_#26???A#25?A#8!4?G#28_?_?O??C?GG???A#41A#63?C#19?A!8?EC?A?A#42??@!9?@$#60!34?@?@#50!12?G!7?@!4?@#3G???_o??C#39C#36F#20!13?A#35C?CC#63OO#57_#51?O#30CC?CC!7?@@AC#54?A??E#59!6?A$#43!34?O#25@#49A#0!32?__#42??O#48!24?G#43G!5?C??_!6?gOoWWOGKCG?A?J@IEIAE$#61!100?_???O???O?G#45D#28@???@?@A?@@?@?@$#42!106?@??C-#10CGWcOk_W?_?_O_O?]!6?_??_O#27O#40??@??_!4?_#43E???_C??_?C?`JMSeaecSSS?A?I??CBB?B@EEC!5?K?qq?@?BgOoOSOocSLQYO]UNUMJEH??D?@C!9?C?C__c_a`$#3BTBRMRTEi[Y?IG?G#12?SG!5?o[H?c??I#34@DAO@COBOBbBB`A#57C?CA#59G!5?O?G#34???@?@__@OO?o_#44???A?E?A#50G#42A#59A#0C#34?ACGCF?CIAG#28?O_?G?_??OG?S?OG$#25o_#35_G_#20?I_TAcJ?FiU@A#14@!6?_C???OC#1AgWdYg_?_#28GO?O?O?O!7?G?G?G_??G!9?A!5?ACA@?@#22!4?_?_?_?_!8?G#48?_??_???Ws[ySOKIUDc_@`$#8G#4AC#2?@!4?@?C??C#13__hQD_G??G??_?oCO#29CQ#4DI_O#37?O??C?CAdBF``p?_o??@?BBABAoQOQGgccAOc?g?_gg??OGGKwAF??@B@@@FJBAD@D@@?@#44_!4?S$#21!7?@??@OdO@@#15??cy^v{^FBQNJNj_#26g#0???C#22@?G???_???_!7?@@?@#44O???G#51???@_#57@!5?GOO?O!4?S??C!8?A#18???O!7?@??ADBA@A?IgQ?H?A??A??@?@?O$#16!22?B#49!9?O#24!4?AN?@o?O#18?G?G?OOAK???OC!5?CCKCGA#0??O#22!5?@@#31@??@???@@_???G??_!4?___G___?O_WCAG?I??@A???A??AOHP?H?@G$!39?CGC??GO#50G??G??AC#24@!5?_@_O?_!9?@@???@@!6?WoOOAGCGCG?G??CA#68!6?@#50_o__?_@_D`t_wX^{Gui]UY]D]$#44!42?G#48G???OG?GC???G?GO??GG!4?CCA??@!5?C???C#63!7?G#1?C$#62!43?C#2!5?A??OO?_!8?@?@?O?GGKKWo?gG#56?C#18OO?_$#63!55?A#47!7?_#19!14?A!5?@$#61!78?O?O#68g__-#10sj[j~czTitkOl!5?C?CCA??ACIKWWOOW#29D#34TAD?_?__!8?@#18??GOG?S_OGWo??_!4?_?G?G?GCEOAKGEAA?kG_OWOw?gOO?O???@!4?@!6?_??Oo?@O?OAGO?G?OGG$#35ASbS?HC#3?D?Q@A#13{MBPiPaG?@?C!4?A?@E#26A#22??O?`?_??O@AcQCGA#68!4?CCAG?_???__#34@?@@A???@A#68?C?@A?B?@!5?GG?G?GO?G?G?KO?GCGSGCG_?SgCOGGC?G?C#57??C??_#62???_$#25H#20!4?Q?iOI@mOB@#12???GKABCBBLbDADEKHC#43???OMCA?S?A`??ACDKK]AI?HBABAECDAIKIMCCKECDA?`_?_oowccSPoP@?@?@??@?@#59!8?O#43!12?_???_O@dBPhrQv$#15!14?O?iTaO`goOgo??@?@#14A#40?@#28!5?WCGGAKCOC?_G_O_??_?_?C!5?O#51@#44O#2!4?@#57!7?@!4?O#44!8?A???@!7?@??@#70!16?_#64A#31?CAA?D$#16!14?_{C???OOGkO#25?G!4?_??W#31!5?OS?K?OIGgOOO_?O_!5?C@A?G!4?G!15?@B?@?_@!9?@@$#14!19?@#49!6?O#1oO_??!4_`#56???G#37A!5?@@A?AB@D@BC?@?o!8?@BB?A?DBA?@!4?WGG#28!9?@???@$#24!28?_!5?AIKiOB@@B`_?@??@#50!9?C!4?O!9?G?G_??cO???@?_ACC?c_D_@?C_??A???G?`_aAG_??QgvaJ}EdqjSBkYOkCC?G$#4!30?_#63!13?O#39G#48?_!6?_?Oo?W???GGO???OoWOOoooOWWGK?F!5?AAEAEASEma]e}om}vruIEWtV^jVHF?D?@OIHCH$#44!48?O?_#59!9?G!6?O__??__$#24!61?@??A@?A$#57!62?_#22@?C??C$#63!66?C#56_-#10lRkRlYdJuhVS#15wA|_UHDID]J^n^EO#32A??O!4?G#25O#28?O??_?O??__W@W@G`s?k?W?g_???_!13?A?AA#18!20?c!9?@CA?C?OH#62???_#64?_???EAD@@$#4OC#25@#20???A?GAgB#16???J!5?@#29!5?@!9?A#31??__O??_o@?FA?CuCBG?O??O?O??OG!7?@!7?@?@??@#59!20?A#68@CA#57!15?@#44?O!4?O$#8A#3_QgOcWo@S#13?gF|AShEyDy?s?O?xCG?C?G?G#47?@??a#43G??WCXI[W??Cg???C?MCIC??WCG?C!7?@@@B@@@?@?@#31!24?O?O?_!9?O?W_?AgOGGg$#35?G?CA@?C#12!9?o?_!7?ASMAA?UOKO#63!4?OG#44?_???@!4?@OG_O#52_#56__!6?_#44!13?A!7?C!6?@OKOKO?G???OW#43???_?_!4?GC_cafBdBCmkPKaCA$#14!19?O???_?_?g??GCCG#11CO#35_#37!5?CA#50??@?C#48_gAO???O???O??_!4?OOOWoGYK?AECGCKcEmKcGgniN}lryfrnrmuuZ^znfXEJCGCA?A@A??G?G???A#63!5?AC$#27!21?_#10!6?_oOGo_aa#18!14?S_!4?@B@BCAVMCQCSIC??GAcqgggw?_!6?A$#4!28?@#34@!7?@A?C!4?A?A#39???@#68!8?@@?@?@@A@AEFED??OOO?oOoW_OoO_OOOo?O$#24!30?@???@??COK@AA@HC#50!16?G??G???GH?@?@??C??CG??O?AJO@?@?@A?CG???@H@?_C??cw_XfYX||ytjUR\\OKYCWP@?`Oo$#1!30?_?@??@AG_@??@#59!21?__??!4_?o??E!7?G???CA?C???K$#22!31?@?@!4?L?QL?cA?C?A???A?I?A#37!7?A?A@?@$#3!31?_!5?_#61!26?@$#40!32?A???C-#10IxEhUxUzkN!8?CK_KcCGE???@A??_???@#22CB@AAQkQcPS?SGAG#48O@@OOOUu{M?G?O?_`bc_CGKM\\Su[{k}|]x~}~`nm{budvojwYPIHDJE@AE#31!5?_!8?O_OCAA@G#70OC$#3dAXAHC@C@#12oJ!6?FBRE@BAP?B!4?GO#29GO??G_GoO_#39@Q_#44??_o??G!5?_???A??A?AHKG?GGG!6?_!4?_#50!4?WO??SGWGKSCccpsg_X_T@rArDF@F_AA!6?_WsOmfBA$#20OC_S_Ag?Q#13?sBSaT?BGO?@??@ahcP`?O_#24A?GC!4?A?CG???GAK#18?C!4?CICG?G???_!7?@?@A@A?@@A@@A@!6?O?G!10?OO??GG?CCA???C#24_???OG#44_#22G#48?_?g??__$#15!11?kj\\itKo__!5?OWm]yG#49A#40G?_?O?GOG#17?G#63??C?A#50@??O?O??GCAAG!5?O__?A?@AAA@??I#43!28?_O_oGxGwwYWP@\\EvMvLVFBHDOOC#18@$#14!11?O!6?G#20?GA?_#16!5?C#14cO_#34A?IGA??C#43!8?AHB@BHIA??C!4?o!9?@#68!4?@!7?A?@?A?@A?@A?B?B@ACA?C?M??C!4?C#64_?O_G???A#57!7?G#37G$#16!15?Io#25???O#34O#1O!8?@??E?b_P??g#37!10?C?A#42_#56?@@??@@??@???O???OOO_O#63!41?G???G_???G#68!6?O$#40!21?_#4GWC!7?@@@`?O#47A??CO_#19!15?@#52@???@!6?O#57!47?A??@$#3!30?@#60C#58CC!5?_#59!23?OI?H!7?__?___GA@Q???C???C??@!8?G??A#62!13?K???@$#25!33?O#8?O#43C#28C!4?@?@@???@a___cCo_?__??@??AHSBS?QC?CO#51!45?o$#31!39?C?@?C?GZcG???OC?O??G!4?_CScCA??K-#20C@UGbGQ?B#15o_?_@EPFZM^UgY@#4?OWGWWG!6?_#22?CGIP?O?p?_S?WC?cCOE?E?GA#59?_!8?CC??_@?h@?OPAM?o?BR[W__GOo#31AC@?D?H?HIOSGUIO@OK@A!5?@#68!4?_{{wKD$#10juhVKvl~#12OA?GCM__!7?CA!4@?CAA#25C#35@OG#24ACgAPE@b??_O#42?@?@@Ag`???O??_#18A?DA@?@?@@!4?C??G#68!6?G#56!5_#44?@A?B@@A#43A???CQCDIEHDJGDBA?C@A?B#69!8?CA#3O$OG?_#35O#13???kGS@Q_XEWcP_HUcG@A?A?@?@#14@#29!6?O`#43C?ECC!4?O__!9?@@D@#18!34?A?G?GO!4?_#63!4?CA???@A?B#56GOGC#59!5?@#57OI$#14!9?CHA@O?G_?_?_@#20@?S!5?A??ACG#28!6?G?G?GAK@??AGP@G`HOh?oS?A?O?O?O?__O_?O_!23?A#68??_#44!10?_wwg{kocgSJO?G?@#34?_#6_$#32!9?@?C#10!11?QgcESEE?CC@IA#31!7?W?ZCO@GiEGo?AA!4?ECI?CA@!6?O#64!44?@??@#28G!4?A$#11!10?A?G#16!10?_#3?G!7?GOCU#50!9?A?A?C!9?A!6?C?B?@!6?AC!5?WOO?WOK?COOo`C__KOOUEJCPI@p_ocqG?CC???C?EB__OQAA$#16!11?o#1!14?_?_?O??O?@@PP@??_#44!4?H?A???E??COEhCp??OOW?o___oO?_??_#51!41?A$#2!27?_#37?!7_!4?C!8?_#52?@#39O?GO?GO#48???G?GG?GMKMMMIJN^^GZUu~nmd`nFFK?BBNMDMG[Wodg`_O___!6?_O!4?O?O?_OLnD@?A@$#27!30?@#34OW???_KiAO_?_?_#48?C#23!10?_#56!6?___??O#59!49?O$#40!31?G-#10Zi\\tJt~i!7?CWKKYKGWO?PKGC#26GC?GG#3???o#2oo#22@A`@bGBi@b!6?@Q!4?G?G#48CC?CG??OG!6?RrRpappxUky{iWSGyVQ?GFA@??@!7?a?Oo_oGOKAEDEAq_YG#51_?o#1G$#3cO??SA#12??g???_??ZabA!4?CKMA#1@??aA??OCW#28!4?OGOKOcOOGXsGo?o?G_NPNcaDq?L?_!5?A?@#50!12?C?SciODGhwVWkMEFAQDR`HCe@OdGRCoGqKoIxxHG?_#43G#34O?o$#20?DA!4?T!8?C!6?GO#25?O?GC#34?_?A@adGH?a#31GOK?cWCACEAc?O?[?C?_??C??G#52?@#31!26?_?_??_??O_GOKWG[SB@C#59!6?_?oGo??C#62???O#0CI#3A$#35??_I_G#13??A|AsISj?@?@C@FCBB#8?@#32C#24@?@?B?A@AFABS?E?O@?@C!5?G#39???WOGO#59A@A?A_ACMOlAsx{}}~kGkM\\MEEHR?A?A@B???D#43?_O_WOk?aCAA#68!15?C?VdVF#37_@#5@$#14!8?T?o???S!4?@A#29!7?A?OG_ogO#47!5?@#37?A!8?@@#42!5?_A_@???_!4?@#68!23?C??CA??@?@#44_?_?_?_wWWnIFKJFF@@@#57!8?J#2C#58C$#15!9?ALITj?_!6?B#40!5?O?G?C?C#63!6?C#48!6?G!5?c#56!10?@PA_BPeAtHCA!4?C!8?!4@#18!13?@$#16!11?@#35!5?Oo_?O#37!7?@?@#43?@!4?CKG_?_?A!5?@?ABH$#4!20?_??___?q_q?O?C?G#50!12?_?_#59G#18AC?A$#3!20?O__???_#49!4?CO#56!16?O??O#44G?CadB?C?OWoG?OWO_G??A?@?@!7?G?_-#10@ADA@?@^?O??CC!4?__O??CG_#37O?gOGAC!4?AAC?D??C@???A?@#48_?CCIE!4?W[wwo_?wow?__k}]]nEAA??oopRINn^VM{IOQ_aOo]o??gWHejUIc?B@@A!5?bPE@@#57S!4?C$#34_???_oG!5?_#26G#20O!9?_#2@#24G?OK!5?C@!4?_?P@?E?A?@#44_?o_O_WO`_P!5?KC#50!12?gCOCG?Gc?OO?g_At`kK[kK_IKAEEE??@??@??_?_@I@?OEG?C@#34_HQHA$#4[_O[[MO#25?o_W#15???DUFMA?K#4@@???_#22G???CHEHA!6?FKQMHUD?E?Q#56???@?@GSI@@BBD?@@AB@?@!5?@?@???@#68??O??_?O#18??G?O!6?G#68!19?_pMI#18A#51YulUX$#8A#1Gi_???_!4?O#16??G#35???@???AO#40O#43?O?__W_GsgKWOXKQGa?O?H?G?A@#52!7?A!6?@#44!17?@???@!7?A?A?AA???_?_O@?gPG?_A#43!10?_Og@??__$#3?T?@A#35@#40E???_WGO#3!6?@#1??@?G#28!4?O_?_??O_??_?o???_?g?gOCKPiS@mUHc??C?I?WE#31!24?@@?C@?@@?@@AD@!6?@#70!13?O#62_#37?C$#29!6?_!4?_#34!12?BEFfFBD@?@A@?DG?B#50!6?_#63?@#18?C?B?@#59!6?ea?C??A?LC}^]R@``OwTwnzEMEGc_#43!8?@??@?C#59o???_WC??QqWwYs\\}t}fCG$#32!8?NG#8!14?C#29!5?A?A#31??O_???OG??g_O?OsOGG?I??_!9?O_#28!36?@??@$#12!9?CCFAbg__oHW_?uw#18!8?OO#51??A#44?__#42!27?A#56!38?OO???O?c?KCCCHA???WG$#13!9?@A?@?A@W@SA?UG#57!15?CA$#14!9?A@!8?CAg#2!16?@-#22_G_kQkw#10C@@??@???|A@BA?B@#2GGKF#22?O`]OmYOkOaG#18HC!7?_#42???O!4?A#18?G_O_#50??_!14?O?HoQCoM[mUFYEJJMBGE??C!8?C?gS_?_HoGS?ECFG@G??G?C#37@$#34FALBLBD#3A#12}?A!5?A!4?@#57???O?O#29??C#28?`?@_@_O_UhUlUha?TAsh]gLy?ZC@A!6?A?@#44!11?_?_?_G?__?!4_ooOOQWQuy^FeRE?e@_!4?G#48!7?B?AW?ow_o_W$#37G!4?O#29A???@@#16?G#1???OO??CCG!8?C#31@???@?@_A_?@!5?@??@_#54C#68!7?CG#31!21?o?O?OGWCWCC?KC?K#42G??G#56?c?_OgA?@g!4?C@__og_#68D?OG?OGO_$#24OCO#4!4?w#11?a!5?A#20?@??@???BA@#48!14?OGA??Ww!4?_?O?__wwoKCWv~P@@ADE!7?BwE{SLLBN@B@@??@??`_```@@_oXGGD@#43!17?EAECEFAE$?o?O_#26??@#15?[{w{u]|#35?_!7?@#44!17?O_A?@A@?Q@AA@\\?@?C!7?EC#59!38?pYGUX~UB^v^uJuJ^HOWo__#51@???@$#1?@A#13!8?CA@`#25??C!5?A#56!20?GSC??CGC!4?AC??@B!8?GG!4?_#57!52?@?@#18??G$#32!11?A#40!5?G#34GOW?GO!4?BG!4?CK#50!10?@#59EgWA!8?E?OjB??M{wwqp!4~^~~{FHBAA!8?@#64!35?C#24?A@$#3!18?A??A??CCA#52!26?C$#4!18?cKCG?C$#24!19?_??O!6?F?_G??AA?C$#37!20?_O??o_oGC?Q?A!4?EGA$#43!21?___???_w_G@?O_@OG@S??@-#22C@?A@A@W#1w!6?_??OQ[???O#37_#48??_#44_O_?__OoOG_CKYGCCAG???CPASJOOgC_!8?__!9?@!6?@_?`_`@`@??ggOkWkP?QSPO@K@@#54!5?__w{o#19G#42O#44???O#68@??@A$#42w_Ww_Wg#24E#40E!5?_!4?G#24@c?G_?O#39!4?G!4?C#56?_???_?oYWCoo!6?_??O?_??_!6?C#68!7?C?CAS?COC?C#56!8?O?cO_Qg\\kiMeSpkSO_oGGKCB@??HFN{_ww[o_W$#44AC??A#34??@#12@E??GMDA#2_#51_?_#22?AscG[gO@OJ@K?P???A??A#52?_??_#48?NFN?K?G?CBA@BBK`FB!4?H_!4?_AEamixJLZNIL@UDSsSck~?VB@@@?a?@??G!5?A??@!12?@?@@$#31@?E#39?C#32!4?Go?O???CBC#43??@B!4@h?@??@???@?@#59?O!5?@_?GOo!4_??C_[Sr]W{z}n^UX~v|nTXpH?@C_?_?_OW?W?G?GO?C?GAE?E?@?_@_?Qgn^LSFAA!7?AMCE_M[C$#28?Y_DWcU_#13?@CQD?A?B#20C#34_@a?GO#31CACA[C?Q?^CIGCOI@@?A!12?G#50!9?C@O??A?GAOIcGOOO??q?_OAaGAIAIQB?B#42!10?G#52AA!5?_oOWCANvewo!7?_$#43??@??@#25???o!5?O#38?G#29???G#28?AA?ACAIcCq?IdAjCTiODTI`CB??_JA\\BSBkPI?G#50!51?A???B??@!7?@@A@A??A$#11!10?G_?O#10GCG?I#47??O#42!19?_??@??O$#15!10?BH_@#3O?OO$#14!11?CA??@$#35!13?_?G??@C-#31___?_SOO!9?_???AK{GjCj?l@#56??___OA__Q_???_@_@??@odY?FATG}TyXEGQaA#50???G@KoCmHm@?B@A@#28?O#56G??G?_CA?qsQ}iDo~ysq\\]NEBBB@@#19??C!6?CA?GOg?G?C$#39OOOG??GIO#1H_!4?g?G#22aOiOA@FS@?C#42?GqDYCOA`CQLOEOaO_?O#48?CC!5?@???ADA_???C?E?QeABB@A@?@??`_`@_oaPCA@???G#59???YM?DJDA@?@#55??ooww{ynU{#42??A??A#55!4?_oo$#28@AG@A@AD#24G!7?RAGD#18C#28?_?O?iCzAuLYDRM`KRK_MpITIQTiDIoHO!4?G#31!17?G?S?CKCCC#59!4?G#42!4?_?oG@?@!7?_!4?C#56!14?@???J@$#42M@FALAD#40?@EO???OEG#34DC??@#44??_?O!5?_?G@KOG???GCGCKG?Go!8?A!4?WoKWw[w|cWoKoO_OqqwyW]]mVF\\ez\\Y\\NDAl?T_@???G#54?_o_owGMEFB@OhB~}wwwoo??oOGI$#44?K?S?G#47??Ao#25FoGwG#58P#37_?OI??@#39!4?O?O#19!9?@!9?_#39!30?G#52!14?_!15?WK?C!9?@DBDKFnVCEF@$#64???_#22O#63!4_#32?GBqC#8_#29?CO#43@_PkOA#59!17?@!5?ACQ@IEId~w{at@g?c@F`D@b@A@?@$#17!8?C#60??KC?C#52!28?`?@$#11!12?@#13A#10@$#14!13?@#35A-#57GGOGO?GW!8?G#43qUMC_#39C#42CWCWgHg\\gIoTSG_C@!4?AIOA?H?G?CG#48!7?_@_!4?@?@FEA?AA??B@@?@@#42??GOIC?jAEOF?I?IC?A?@!4?@#52!8?ACG#67???__OOG?CA?@$#62ESECE]VCE#0_?A_O_#34OE#24H??@#44OG_`ACRC???", 16384) = 4096
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 4096
write(6, "O??@#19GcOCKC?C!7?@#18?A#22!15?_?G???S??_!9?OOC?K!4?CC$#7?@??G??@C??h??_?O?_#57G#4??@#13C?C??GAAkO???@!5?A#35?O?@#22?G#32@#0G#28_#50_#18_?_?__??_#31??_???_#44?_?AC#30W#23_O??G#31GAAC!7?@#29!15?O#11@#23@?A#2!5?AGECC#28?__!5?A???@J$#3!13?G!6?OG#25A#15GeBBSR?GO#3?CEC?CKCFGHk?_A??EC?E#21@?J?A?@#57?G?G?K??AC!5?@!6?@#3_?o_O_?wC{qKWEGF@BGCC?B#35?G#26A#46wZ#36S#3!7?@#21?@#61?@?@#19__?OC?q_O_$#61!13?A?A#37@A?DA#35?O#11_#32OWO#27?C#35!4?G#4W!8?QG@?o???C??@#48?_??_??_!4?_!5?@#54?C#67G#22?O??G??C??A#2C!5?`?@?O#39!8?_#58C#30?_#42_!13?_??_!4?T$#34!18?A?@F#16??@#14?Cg?C@?_#25?_#34W?_!4?_?DAC?cg#68!8?O?o#69O?O#50?_OO!7?A#4!6?_Oo?O?GGC?A?A_WrGwWoOGGKG!7?@BFDF?B?@?DA#31?O#17G#51A#55__??_$#51!18?@#29!16?_#2GG??GOO@!7?GGCI?B@BAFBBBLALA@B#56?P#24_!5?_?Q??@??C#10_Oo?w?KOE?C?E?FHAF?DC#43!20?C#54_#36O@C$#1!36?_!7?_GG#0!18?@#28_?O_O_?A??_O?C?C?!4A??@#45!40?G#66K$#43!38?_!9?O?_O#34!15?@C?A!6?`?p_pOG?GGG?C?A!8?_?_ooO!7?^}[owoWwWMIG?FGB@$#21!39?@?@#24???C?K#51!19?G?GCA!4?@?@?@#48!5?@@A?@$#18!39?__#40!5?o?A#42!23?O?A???G???C$#61!39?O#39!32?G#36o?G$#63!72?C-#21DODJSHUHVUtJuJuLWDF#15OgtEgP~o_#40GO!5?A?@C#2???D?O_?aC_??A???A??C?I???gO!4?A#22A?OYB@?_#10?DCJEDALADA?A#22C??AA?AA??@@@!7?@@!4?@#48@!4?__??_???O?D$#3IkyshQ@S?G#7!6?@#13?gcUI@!4?@?E?A#24GW??__#57!6?AGC#51C#48G??C#22??gO#29??_#4?C_SsKOGO??G!7?C?N?J?GW!6?@B@#23C!7?C???@!5?A??A#44?CC#56?AAA?@!8?@$#2OA!4?_?_#11!10?G#16??wVm#12?DUv_a@@#37_!5?@?@?EKSOO_?aiGFUE??A???AAA?B?@?A#51_#19O#23GE#29?GK!5?O#31??_?_OOG#2_??O@O?OOWOO?OWOCG#57O?G?O??G!9?A!7?A$#4_#20@??AcGaG`IsHsHqeyOB@#14!5?A??@#1OO???_W?OC?c??@???A#24A!7?O!7?A?@?@??@?_?O__?__??__??O?g#37_?_Oa_`q`G``!5_?o?GoGG#31@?@??C!7?O?@O_CwG$#26!26?GG#10?GDCA@A??A#18!8?GG??O?c?@@@?@?@@#28?@?@!6?g?H@#49??O#40K?G#3?C@AD?HI@B#19GG?G#36C??C??CA?A?AA?C?ACC#50!4?_?_o_oGOt?WshSG?o$#35!30?G?CA#34g[??@_lYyx?Aa@?D???_?gsm[yiSG?oCCMMM@@???C_OJP?O__O??O!6?A@??@?@#3?GGG??CG#18?__??_O_?_?gS?W?UKG_C???_$#3!31?G#22_???C#29WiGO#0!5?@#68?O?G#1!9?O?_???_??OSW!4?CA??O?O???O!5?C#67?G!9?A#20GC#21G#66@A#46A#68O?o??G!7?C???C#37A#44??@$#47!31?_#28O#4CC??C?QA???_@??@#43ODPPW??G??@!4?@!8?_?_#26???A#25?A#8!4?G#28_?_?O??C?GG???A#41A#63?C#19?A!8?EC?A?A#42??@!9?@$#60!34?@?@#50!12?G!7?@!4?@#3G???_o??C#39C#36F#20!13?A#35C?CC#63OO#57_#51?O#30CC?CC!7?@@AC#54?A??E#59!6?A$#43!34?O#25@#49A#0!32?__#42??O#48!24?G#43G!5?C??_!6?gOoWWOGKCG?A?J@IEIAE$#61!100?_???O???O?G#45D#28@???@?@A?@@?@?@$#42!106?@??C-#10CGWcOk_W?_?_O_O?]!6?_??_O#27O#40??@??_!4?_#43E???_C??_?C?`JMSeaecSSS?A?I??CBB?B@EEC!5?K?qq?@?BgOoOSOocSLQYO]UNUMJEH??D?@C!9?C?C__c_a`$#3BTBRMRTEi[Y?IG?G#12?SG!5?o[H?c??I#34@DAO@COBOBbBB`A#57C?CA#59G!5?O?G#34???@?@__@OO?o_#44???A?E?A#50G#42A#59A#0C#34?ACGCF?CIAG#28?O_?G?_??OG?S?OG$#25o_#35_G_#20?I_TAcJ?FiU@A#14@!6?_C???OC#1AgWdYg_?_#28GO?O?O?O!7?G?G?G_??G!9?A!5?ACA@?@#22!4?_?_?_?_!8?G#48?_??_???Ws[ySOKIUDc_@`$#8G#4AC#2?@!4?@?C??C#13__hQD_G??G??_?oCO#29CQ#4DI_O#37?O??C?CAdBF``p?_o??@?BBABAoQOQGgccAOc?g?_gg??OGGKwAF??@B@@@FJBAD@D@@?@#44_!4?S$#21!7?@??@OdO@@#15??cy^v{^FBQNJNj_#26g#0???C#22@?G???_???_!7?@@?@#44O???G#51???@_#57@!5?GOO?O!4?S??C!8?A#18???O!7?@??ADBA@A?IgQ?H?A??A??@?@?O$#16!22?B#49!9?O#24!4?AN?@o?O#18?G?G?OOAK???OC!5?CCKCGA#0??O#22!5?@@#31@??@???@@_???G??_!4?___G___?O_WCAG?I??@A???A??AOHP?H?@G$!39?CGC??GO#50G??G??AC#24@!5?_@_O?_!9?@@???@@!6?WoOOAGCGCG?G??CA#68!6?@#50_o__?_@_D`t_wX^{Gui]UY]D]$#44!42?G#48G???OG?GC???G?GO??GG!4?CCA??@!5?C???C#63!7?G#1?C$#62!43?C#2!5?A??OO?_!8?@?@?O?GGKKWo?gG#56?C#18OO?_$#63!55?A#47!7?_#19!14?A!5?@$#61!78?O?O#68g__-#10sj[j~czTitkOl!5?C?CCA??ACIKWWOOW#29D#34TAD?_?__!8?@#18??GOG?S_OGWo??_!4?_?G?G?GCEOAKGEAA?kG_OWOw?gOO?O???@!4?@!6?_??Oo?@O?OAGO?G?OGG$#35ASbS?HC#3?D?Q@A#13{MBPiPaG?@?C!4?A?@E#26A#22??O?`?_??O@AcQCGA#68!4?CCAG?_???__#34@?@@A???@A#68?C?@A?B?@!5?GG?G?GO?G?G?KO?GCGSGCG_?SgCOGGC?G?C#57??C??_#62???_$#25H#20!4?Q?iOI@mOB@#12???GKABCBBLbDADEKHC#43???OMCA?S?A`??ACDKK]AI?HBABAECDAIKIMCCKECDA?`_?_oowccSPoP@?@?@??@?@#59!8?O#43!12?_???_O@dBPhrQv$#15!14?O?iTaO`goOgo??@?@#14A#40?@#28!5?WCGGAKCOC?_G_O_??_?_?C!5?O#51@#44O#2!4?@#57!7?@!4?O#44!8?A???@!7?@??@#70!16?_#64A#31?CAA?D$#16!14?_{C???OOGkO#25?G!4?_??W#31!5?OS?K?OIGgOOO_?O_!5?C@A?G!4?G!15?@B?@?_@!9?@@$#14!19?@#49!6?O#1oO_??!4_`#56???G#37A!5?@@A?AB@D@BC?@?o!8?@BB?A?DBA?@!4?WGG#28!9?@???@$#24!28?_!5?AIKiOB@@B`_?@??@#50!9?C!4?O!9?G?G_??cO???@?_ACC?c_D_@?C_??A???G?`_aAG_??QgvaJ}EdqjSBkYOkCC?G$#4!30?_#63!13?O#39G#48?_!6?_?Oo?W???GGO???OoWOOoooOWWGK?F!5?AAEAEASEma]e}om}vruIEWtV^jVHF?D?@OIHCH$#44!48?O?_#59!9?G!6?O__??__$#24!61?@??A@?A$#57!62?_#22@?C??C$#63!66?C#56_-#10lRkRlYdJuhVS#15wA|_UHDID]J^n^EO#32A??O!4?G#25O#28?O??_?O??__W@W@G`s?k?W?g_???_!13?A?AA#18!20?c!9?@CA?C?OH#62???_#64?_???EAD@@$#4OC#25@#20???A?GAgB#16???J!5?@#29!5?@!9?A#31??__O??_o@?FA?CuCBG?O??O?O??OG!7?@!7?@?@??@#59!20?A#68@CA#57!15?@#44?O!4?O$#8A#3_QgOcWo@S#13?gF|AShEyDy?s?O?xCG?C?G?G#47?@??a#43G??WCXI[W??Cg???C?MCIC??WCG?C!7?@@@B@@@?@?@#31!24?O?O?_!9?O?W_?AgOGGg$#35?G?CA@?C#12!9?o?_!7?ASMAA?UOKO#63!4?OG#44?_???@!4?@OG_O#52_#56__!6?_#44!13?A!7?C!6?@OKOKO?G???OW#43???_?_!4?GC_cafBdBCmkPKaCA$#14!19?O???_?_?g??GCCG#11CO#35_#37!5?CA#50??@?C#48_gAO???O???O??_!4?OOOWoGYK?AECGCKcEmKcGgniN}lryfrnrmuuZ^znfXEJCGCA?A@A??G?G???A#63!5?AC$#27!21?_#10!6?_oOGo_aa#18!14?S_!4?@B@BCAVMCQCSIC??GAcqgggw?_!6?A$#4!28?@#34@!7?@A?C!4?A?A#39???@#68!8?@@?@?@@A@AEFED??OOO?oOoW_OoO_OOOo?O$#24!30?@???@??COK@AA@HC#50!16?G??G???GH?@?@??C??CG??O?AJO@?@?@A?CG???@H@?_C??cw_XfYX||ytjUR\\OKYCWP@?`Oo$#1!30?_?@??@AG_@??@#59!21?__??!4_?o??E!7?G???CA?C???K$#22!31?@?@!4?L?QL?cA?C?A???A?I?A#37!7?A?A@?@$#3!31?_!5?_#61!26?@$#40!32?A???C-#10IxEhUxUzkN!8?CK_KcCGE???@A??_???@#22CB@AAQkQcPS?SGAG#48O@@OOOUu{M?G?O?_`bc_CGKM\\Su[{k}|]x~}~`nm{budvojwYPIHDJE@AE#31!5?_!8?O_OCAA@G#70OC$#3dAXAHC@C@#12oJ!6?FBRE@BAP?B!4?GO#29GO??G_GoO_#39@Q_#44??_o??G!5?_???A??A?AHKG?GGG!6?_!4?_#50!4?WO??SGWGKSCccpsg_X_T@rArDF@F_AA!6?_WsOmfBA$#20OC_S_Ag?Q#13?sBSaT?BGO?@??@ahcP`?O_#24A?GC!4?A?CG???GAK#18?C!4?CICG?G???_!7?@?@A@A?@@A@@A@!6?O?G!10?OO??GG?CCA???C#24_???OG#44_#22G#48?_?g??__$#15!11?kj\\itKo__!5?OWm]yG#49A#40G?_?O?GOG#17?G#63??C?A#50@??O?O??GCAAG!5?O__?A?@AAA@??I#43!28?_O_oGxGwwYWP@\\EvMvLVFBHDOOC#18@$#14!11?O!6?G#20?GA?_#16!5?C#14cO_#34A?IGA??C#43!8?AHB@BHIA??C!4?o!9?@#68!4?@!7?A?@?A?@A?@A?B?B@ACA?C?M??C!4?C#64_?O_G???A#57!7?G#37G$#16!15?Io#25???O#34O#1O!8?@??E?b_P??g#37!10?C?A#42_#56?@@??@@??@???O???OOO_O#63!41?G???G_???G#68!6?O$#40!21?_#4GWC!7?@@@`?O#47A??CO_#19!15?@#52@???@!6?O#57!47?A??@$#3!30?@#60C#58CC!5?_#59!23?OI?H!7?__?___GA@Q???C???C??@!8?G??A#62!13?K???@$#25!33?O#8?O#43C#28C!4?@?@@???@a___cCo_?__??@??AHSBS?QC?CO#51!45?o$#31!39?C?@?C?GZcG???OC?O??G!4?_CScCA??K-#20C@UGbGQ?B#15o_?_@EPFZM^UgY@#4?OWGWWG!6?_#22?CGIP?O?p?_S?WC?cCOE?E?GA#59?_!8?CC??_@?h@?OPAM?o?BR[W__GOo#31AC@?D?H?HIOSGUIO@OK@A!5?@#68!4?_{{wKD$#10juhVKvl~#12OA?GCM__!7?CA!4@?CAA#25C#35@OG#24ACgAPE@b??_O#42?@?@@Ag`???O??_#18A?DA@?@?@@!4?C??G#68!6?G#56!5_#44?@A?B@@A#43A???CQCDIEHDJGDBA?C@A?B#69!8?CA#3O$OG?_#35O#13???kGS@Q_XEWcP_HUcG@A?A?@?@#14@#29!6?O`#43C?ECC!4?O__!9?@@D@#18!34?A?G?GO!4?_#63!4?CA???@A?B#56GOGC#59!5?@#57OI$#14!9?CHA@O?G_?_?_@#20@?S!5?A??ACG#28!6?G?G?GAK@??AGP@G`HOh?oS?A?O?O?O?__O_?O_!23?A#68??_#44!10?_wwg{kocgSJO?G?@#34?_#6_$#32!9?@?C#10!11?QgcESEE?CC@IA#31!7?W?ZCO@GiEGo?AA!4?ECI?CA@!6?O#64!44?@??@#28G!4?A$#11!10?A?G#16!10?_#3?G!7?GOCU#50!9?A?A?C!9?A!6?C?B?@!6?AC!5?WOO?WOK?COOo`C__KOOUEJCPI@p_ocqG?CC???C?EB__OQAA$#16!11?o#1!14?_?_?O??O?@@PP@??_#44!4?H?A???E??COEhCp??OOW?o___oO?_??_#51!41?A$#2!27?_#37?!7_!4?C!8?_#52?@#39O?GO?GO#48???G?GG?GMKMMMIJN^^GZUu~nmd`nFFK?BBNMDMG[Wodg`_O___!6?_O!4?O?O?_OLnD@?A@$#27!30?@#34OW???_KiAO_?_?_#48?C#23!10?_#56!6?___??O#59!49?O$#40!31?G-#10Zi\\tJt~i!7?CWKKYKGWO?PKGC#26GC?GG#3???o#2oo#22@A`@bGBi@b!6?@Q!4?G?G#48CC?CG??OG!6?RrRpappxUky{iWSGyVQ?GFA@??@!7?a?Oo_oGOKAEDEAq_YG#51_?o#1G$#3cO??SA#12??g???_??ZabA!4?CKMA#1@??aA??OCW#28!4?OGOKOcOOGXsGo?o?G_NPNcaDq?L?_!5?A?@#50!12?C?SciODGhwVWkMEFAQDR`HCe@OdGRCoGqKoIxxHG?_#43G#34O?o$#20?DA!4?T!8?C!6?GO#25?O?GC#34?_?A@adGH?a#31GOK?cWCACEAc?O?[?C?_??C??G#52?@#31!26?_?_??_??O_GOKWG[SB@C#59!6?_?oGo??C#62???O#0CI#3A$#35??_I_G#13??A|AsISj?@?@C@FCBB#8?@#32C#24@?@?B?A@AFABS?E?O@?@C!5?G#39???WOGO#59A@A?A_ACMOlAsx{}}~kGkM\\MEEHR?A?A@B???D#43?_O_WOk?aCAA#68!15?C?VdVF#37_@#5@$#14!8?T?o???S!4?@A#29!7?A?OG_ogO#47!5?@#37?A!8?@@#42!5?_A_@???_!4?@#68!23?C??CA??@?@#44_?_?_?_wWWnIFKJFF@@@#57!8?J#2C#58C$#15!9?ALITj?_!6?B#40!5?O?G?C?C#63!6?C#48!6?G!5?c#56!10?@PA_BPeAtHCA!4?C!8?!4@#18!13?@$#16!11?@#35!5?Oo_?O#37!7?@?@#43?@!4?CKG_?_?A!5?@?ABH$#4!20?_??___?q_q?O?C?G#50!12?_?_#59G#18AC?A$#3!20?O__???_#49!4?CO#56!16?O??O#44G?CadB?C?OWoG?OWO_G??A?@?@!7?G?_-#10@ADA@?@^?O??CC!4?__O??CG_#37O?gOGAC!4?AAC?D??C@???A?@#48_?CCIE!4?W[wwo_?wow?__k}]]nEAA??oopRINn^VM{IOQ_aOo]o??gWHejUIc?B@@A!5?bPE@@#57S!4?C$#34_???_oG!5?_#26G#20O!9?_#2@#24G?OK!5?C@!4?_?P@?E?A?@#44_?o_O_WO`_P!5?KC#50!12?gCOCG?Gc?OO?g_At`kK[kK_IKAEEE??@??@??_?_@I@?OEG?C@#34_HQHA$#4[_O[[MO#25?o_W#15???DUFMA?K#4@@???_#22G???CHEHA!6?FKQMHUD?E?Q#56???@?@GSI@@BBD?@@AB@?@!5?@?@???@#68??O??_?O#18??G?O!6?G#68!19?_pMI#18A#51YulUX$#8A#1Gi_???_!4?O#16??G#35???@???AO#40O#43?O?__W_GsgKWOXKQGa?O?H?G?A@#52!7?A!6?@#44!17?@???@!7?A?A?AA???_?_O@?gPG?_A#43!10?_Og@??__$#3?T?@A#35@#40E???_WGO#3!6?@#1??@?G#28!4?O_?_??O_??_?o???_?g?gOCKPiS@mUHc??C?I?WE#31!24?@@?C@?@@?@@AD@!6?@#70!13?O#62_#37?C$#29!6?_!4?_#34!12?BEFfFBD@?@A@?DG?B#50!6?_#63?@#18?C?B?@#59!6?ea?C??A?LC}^]R@``OwTwnzEMEGc_#43!8?@??@?C#59o???_WC??QqWwYs\\}t}fCG$#32!8?NG#8!14?C#29!5?A?A#31??O_???OG??g_O?OsOGG?I??_!9?O_#28!36?@??@$#12!9?CCFAbg__oHW_?uw#18!8?OO#51??A#44?__#42!27?A#56!38?OO???O?c?KCCCHA???WG$#13!9?@A?@?A@W@SA?UG#57!15?CA$#14!9?A@!8?CAg#2!16?@-#22_G_kQkw#10C@@??@???|A@BA?B@#2GGKF#22?O`]OmYOkOaG#18HC!7?_#42???O!4?A#18?G_O_#50??_!14?O?HoQCoM[mUFYEJJMBGE??C!8?C?gS_?_HoGS?ECFG@G??G?C#37@$#34FALBLBD#3A#12}?A!5?A!4?@#57???O?O#29??C#28?`?@_@_O_UhUlUha?TAsh]gLy?ZC@A!6?A?@#44!11?_?_?_G?__?!4_ooOOQWQuy^FeRE?e@_!4?G#48!7?B?AW?ow_o_W$#37G!4?O#29A???@@#16?G#1???OO??CCG!8?C#31@???@?@_A_?@!5?@??@_#54C#68!7?CG#31!21?o?O?OGWCWCC?KC?K#42G??G#56?c?_OgA?@g!4?C@__og_#68D?OG?OGO_$#24OCO#4!4?w#11?a!5?A#20?@??@???BA@#48!14?OGA??Ww!4?_?O?__wwoKCWv~P@@ADE!7?BwE{SLLBN@B@@??@??`_```@@_oXGGD@#43!17?EAECEFAE$?o?O_#26??@#15?[{w{u]|#35?_!7?@#44!17?O_A?@A@?Q@AA@\\?@?C!7?EC#59!38?pYGUX~UB^v^uJuJ^HOWo__#51@???@$#1?@A#13!8?CA@`#25??C!5?A#56!20?GSC??CGC!4?AC??@B!8?GG!4?_#57!52?@?@#18??G$#32!11?A#40!5?G#34GOW?GO!4?BG!4?CK#50!10?@#59EgWA!8?E?OjB??M{wwqp!4~^~~{FHBAA!8?@#64!35?C#24?A@$#3!18?A??A??CCA#52!26?C$#4!18?cKCG?C$#24!19?_??O!6?F?_G??AA?C$#37!20?_O??o_oGC?Q?A!4?EGA$#43!21?___???_w_G@?O_@OG@S??@-#22C@?A@A@W#1w!6?_??OQ[???O#37_#48??_#44_O_?__OoOG_CKYGCCAG???CPASJOOgC_!8?__!9?@!6?@_?`_`@`@??ggOkWkP?QSPO@K@@#54!5?__w{o#19G#42O#44???O#68@??@A$#42w_Ww_Wg#24E#40E!5?_!4?G#24@c?G_?O#39!4?G!4?C#56?_???_?oYWCoo!6?_??O?_??_!6?C#68!7?C?CAS?COC?C#56!8?O?cO_Qg\\kiMeSpkSO_oGGKCB@??HFN{_ww[o_W$#44AC??A#34??@#12@E??GMDA#2_#51_?_#22?AscG[gO@OJ@K?P???A??A#52?_??_#48?NFN?K?G?CBA@BBK`FB!4?H_!4?_AEamixJLZNIL@UDSsSck~?VB@@@?a?@??G!5?A??@!12?@?@@$#31@?E#39?C#32!4?Go?O???CBC#43??@B!4@h?@??@???@?@#59?O!5?@_?GOo!4_??C_[Sr]W{z}n^UX~v|nTXpH?@C_?_?_OW?W?G?GO?C?GAE?E?@?_@_?Qgn^LSFAA!7?AMCE_M[C$#28?Y_DWcU_#13?@CQD?A?B#20C#34_@a?GO#31CACA[C?Q?^CIGCOI@@?A!12?G#50!9?C@O??A?GAOIcGOOO??q?_OAaGAIAIQB?B#42!10?G#52AA!5?_oOWCANvewo!7?_$#43??@??@#25???o!5?O#38?G#29???G#28?AA?ACAIcCq?IdAjCTiODTI`CB??_JA\\BSBkPI?G#50!51?A???B??@!7?@@A@A??A$#11!10?G_?O#10GCG?I#47??O#42!19?_??@??O$#15!10?BH_@#3O?OO$#14!11?CA??@$#35!13?_?G??@C-#31___?_SOO!9?_???AK{GjCj?l@#56??___OA__Q_???_@_@??@odY?FATG}TyXEGQaA#50???G@KoCmHm@?B@A@#28?O#56G??G?_CA?qsQ}iDo~ysq\\]NEBBB@@#19??C!6?CA?GOg?G?C$#39OOOG??GIO#1H_!4?g?G#22aOiOA@FS@?C#42?GqDYCOA`CQLOEOaO_?O#48?CC!5?@???ADA_???C?E?QeABB@A@?@??`_`@_oaPCA@???G#59???YM?DJDA@?@#55??ooww{ynU{#42??A??A#55!4?_oo$#28@AG@A@AD#24G!7?RAGD#18C#28?_?O?iCzAuLYDRM`KRK_MpITIQTiDIoHO!4?G#31!17?G?S?CKCCC#59!4?G#42!4?_?oG@?@!7?_!4?C#56!14?@???J@$#42M@FALAD#40?@EO???OEG#34DC??@#44??_?O!5?_?G@KOG???GCGCKG?Go!8?A!4?WoKWw[w|cWoKoO_OqqwyW]]mVF\\ez\\Y\\NDAl?T_@???G#54?_o_owGMEFB@OhB~}wwwoo??oOGI$#44?K?S?G#47??Ao#25FoGwG#58P#37_?OI??@#39!4?O?O#19!9?@!9?_#39!30?G#52!14?_!15?WK?C!9?@DBDKFnVCEF@$#64???_#22O#63!4_#32?GBqC#8_#29?CO#43@_PkOA#59!17?@!5?ACQ@IEId~w{at@g?c@F`D@b@A@?@$#17!8?C#60??KC?C#52!28?`?@$#11!12?@#13A#10@$#14!13?@#35A-#57GGOGO?GW!8?G#43qUMC_#39C#42CWCWgHg\\gIoTSG_C@!4?AIOA?H?G?CG#48!7?_@_!4?@?@FEA?AA??B@@?@@#42??GOIC?jAEOF?I?IC?A?@!4?@#52!8?ACG#67???__OOG?CA?@$#62ESECE]VCE#0_?A_O_#34OE#24H??@#44OG_`ACRC???", 12288) = 4096
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 4096
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 4096
write(6, "49!6?O#1oO_??!4_`#56???G#37A!5?@@A?AB@D@BC?@?o!8?@BB?A?DBA?@!4?WGG#28!9?@???@$#24!28?_!5?AIKiOB@@B`_?@??@#50!9?C!4?O!9?G?G_??cO???@?_ACC?c_D_@?C_??A???G?`_aAG_??QgvaJ}EdqjSBkYOkCC?G$#4!30?_#63!13?O#39G#48?_!6?_?Oo?W???GGO???OoWOOoooOWWGK?F!5?AAEAEASEma]e}om}vruIEWtV^jVHF?D?@OIHCH$#44!48?O?_#59!9?G!6?O__??__$#24!61?@??A@?A$#57!62?_#22@?C??C$#63!66?C#56_-#10lRkRlYdJuhVS#15wA|_UHDID]J^n^EO#32A??O!4?G#25O#28?O??_?O??__W@W@G`s?k?W?g_???_!13?A?AA#18!20?c!9?@CA?C?OH#62???_#64?_???EAD@@$#4OC#25@#20???A?GAgB#16???J!5?@#29!5?@!9?A#31??__O??_o@?FA?CuCBG?O??O?O??OG!7?@!7?@?@??@#59!20?A#68@CA#57!15?@#44?O!4?O$#8A#3_QgOcWo@S#13?gF|AShEyDy?s?O?xCG?C?G?G#47?@??a#43G??WCXI[W??Cg???C?MCIC??WCG?C!7?@@@B@@@?@?@#31!24?O?O?_!9?O?W_?AgOGGg$#35?G?CA@?C#12!9?o?_!7?ASMAA?UOKO#63!4?OG#44?_???@!4?@OG_O#52_#56__!6?_#44!13?A!7?C!6?@OKOKO?G???OW#43???_?_!4?GC_cafBdBCmkPKaCA$#14!19?O???_?_?g??GCCG#11CO#35_#37!5?CA#50??@?C#48_gAO???O???O??_!4?OOOWoGYK?AECGCKcEmKcGgniN}lryfrnrmuuZ^znfXEJCGCA?A@A??G?G???A#63!5?AC$#27!21?_#10!6?_oOGo_aa#18!14?S_!4?@B@BCAVMCQCSIC??GAcqgggw?_!6?A$#4!28?@#34@!7?@A?C!4?A?A#39???@#68!8?@@?@?@@A@AEFED??OOO?oOoW_OoO_OOOo?O$#24!30?@???@??COK@AA@HC#50!16?G??G???GH?@?@??C??CG??O?AJO@?@?@A?CG???@H@?_C??cw_XfYX||ytjUR\\OKYCWP@?`Oo$#1!30?_?@??@AG_@??@#59!21?__??!4_?o??E!7?G???CA?C???K$#22!31?@?@!4?L?QL?cA?C?A???A?I?A#37!7?A?A@?@$#3!31?_!5?_#61!26?@$#40!32?A???C-#10IxEhUxUzkN!8?CK_KcCGE???@A??_???@#22CB@AAQkQcPS?SGAG#48O@@OOOUu{M?G?O?_`bc_CGKM\\Su[{k}|]x~}~`nm{budvojwYPIHDJE@AE#31!5?_!8?O_OCAA@G#70OC$#3dAXAHC@C@#12oJ!6?FBRE@BAP?B!4?GO#29GO??G_GoO_#39@Q_#44??_o??G!5?_???A??A?AHKG?GGG!6?_!4?_#50!4?WO??SGWGKSCccpsg_X_T@rArDF@F_AA!6?_WsOmfBA$#20OC_S_Ag?Q#13?sBSaT?BGO?@??@ahcP`?O_#24A?GC!4?A?CG???GAK#18?C!4?CICG?G???_!7?@?@A@A?@@A@@A@!6?O?G!10?OO??GG?CCA???C#24_???OG#44_#22G#48?_?g??__$#15!11?kj\\itKo__!5?OWm]yG#49A#40G?_?O?GOG#17?G#63??C?A#50@??O?O??GCAAG!5?O__?A?@AAA@??I#43!28?_O_oGxGwwYWP@\\EvMvLVFBHDOOC#18@$#14!11?O!6?G#20?GA?_#16!5?C#14cO_#34A?IGA??C#43!8?AHB@BHIA??C!4?o!9?@#68!4?@!7?A?@?A?@A?@A?B?B@ACA?C?M??C!4?C#64_?O_G???A#57!7?G#37G$#16!15?Io#25???O#34O#1O!8?@??E?b_P??g#37!10?C?A#42_#56?@@??@@??@???O???OOO_O#63!41?G???G_???G#68!6?O$#40!21?_#4GWC!7?@@@`?O#47A??CO_#19!15?@#52@???@!6?O#57!47?A??@$#3!30?@#60C#58CC!5?_#59!23?OI?H!7?__?___GA@Q???C???C??@!8?G??A#62!13?K???@$#25!33?O#8?O#43C#28C!4?@?@@???@a___cCo_?__??@??AHSBS?QC?CO#51!45?o$#31!39?C?@?C?GZcG???OC?O??G!4?_CScCA??K-#20C@UGbGQ?B#15o_?_@EPFZM^UgY@#4?OWGWWG!6?_#22?CGIP?O?p?_S?WC?cCOE?E?GA#59?_!8?CC??_@?h@?OPAM?o?BR[W__GOo#31AC@?D?H?HIOSGUIO@OK@A!5?@#68!4?_{{wKD$#10juhVKvl~#12OA?GCM__!7?CA!4@?CAA#25C#35@OG#24ACgAPE@b??_O#42?@?@@Ag`???O??_#18A?DA@?@?@@!4?C??G#68!6?G#56!5_#44?@A?B@@A#43A???CQCDIEHDJGDBA?C@A?B#69!8?CA#3O$OG?_#35O#13???kGS@Q_XEWcP_HUcG@A?A?@?@#14@#29!6?O`#43C?ECC!4?O__!9?@@D@#18!34?A?G?GO!4?_#63!4?CA???@A?B#56GOGC#59!5?@#57OI$#14!9?CHA@O?G_?_?_@#20@?S!5?A??ACG#28!6?G?G?GAK@??AGP@G`HOh?oS?A?O?O?O?__O_?O_!23?A#68??_#44!10?_wwg{kocgSJO?G?@#34?_#6_$#32!9?@?C#10!11?QgcESEE?CC@IA#31!7?W?ZCO@GiEGo?AA!4?ECI?CA@!6?O#64!44?@??@#28G!4?A$#11!10?A?G#16!10?_#3?G!7?GOCU#50!9?A?A?C!9?A!6?C?B?@!6?AC!5?WOO?WOK?COOo`C__KOOUEJCPI@p_ocqG?CC???C?EB__OQAA$#16!11?o#1!14?_?_?O??O?@@PP@??_#44!4?H?A???E??COEhCp??OOW?o___oO?_??_#51!41?A$#2!27?_#37?!7_!4?C!8?_#52?@#39O?GO?GO#48???G?GG?GMKMMMIJN^^GZUu~nmd`nFFK?BBNMDMG[Wodg`_O___!6?_O!4?O?O?_OLnD@?A@$#27!30?@#34OW???_KiAO_?_?_#48?C#23!10?_#56!6?___??O#59!49?O$#40!31?G-#10Zi\\tJt~i!7?CWKKYKGWO?PKGC#26GC?GG#3???o#2oo#22@A`@bGBi@b!6?@Q!4?G?G#48CC?CG??OG!6?RrRpappxUky{iWSGyVQ?GFA@??@!7?a?Oo_oGOKAEDEAq_YG#51_?o#1G$#3cO??SA#12??g???_??ZabA!4?CKMA#1@??aA??OCW#28!4?OGOKOcOOGXsGo?o?G_NPNcaDq?L?_!5?A?@#50!12?C?SciODGhwVWkMEFAQDR`HCe@OdGRCoGqKoIxxHG?_#43G#34O?o$#20?DA!4?T!8?C!6?GO#25?O?GC#34?_?A@adGH?a#31GOK?cWCACEAc?O?[?C?_??C??G#52?@#31!26?_?_??_??O_GOKWG[SB@C#59!6?_?oGo??C#62???O#0CI#3A$#35??_I_G#13??A|AsISj?@?@C@FCBB#8?@#32C#24@?@?B?A@AFABS?E?O@?@C!5?G#39???WOGO#59A@A?A_ACMOlAsx{}}~kGkM\\MEEHR?A?A@B???D#43?_O_WOk?aCAA#68!15?C?VdVF#37_@#5@$#14!8?T?o???S!4?@A#29!7?A?OG_ogO#47!5?@#37?A!8?@@#42!5?_A_@???_!4?@#68!23?C??CA??@?@#44_?_?_?_wWWnIFKJFF@@@#57!8?J#2C#58C$#15!9?ALITj?_!6?B#40!5?O?G?C?C#63!6?C#48!6?G!5?c#56!10?@PA_BPeAtHCA!4?C!8?!4@#18!13?@$#16!11?@#35!5?Oo_?O#37!7?@?@#43?@!4?CKG_?_?A!5?@?ABH$#4!20?_??___?q_q?O?C?G#50!12?_?_#59G#18AC?A$#3!20?O__???_#49!4?CO#56!16?O??O#44G?CadB?C?OWoG?OWO_G??A?@?@!7?G?_-#10@ADA@?@^?O??CC!4?__O??CG_#37O?gOGAC!4?AAC?D??C@???A?@#48_?CCIE!4?W[wwo_?wow?__k}]]nEAA??oopRINn^VM{IOQ_aOo]o??gWHejUIc?B@@A!5?bPE@@#57S!4?C$#34_???_oG!5?_#26G#20O!9?_#2@#24G?OK!5?C@!4?_?P@?E?A?@#44_?o_O_WO`_P!5?KC#50!12?gCOCG?Gc?OO?g_At`kK[kK_IKAEEE??@??@??_?_@I@?OEG?C@#34_HQHA$#4[_O[[MO#25?o_W#15???DUFMA?K#4@@???_#22G???CHEHA!6?FKQMHUD?E?Q#56???@?@GSI@@BBD?@@AB@?@!5?@?@???@#68??O??_?O#18??G?O!6?G#68!19?_pMI#18A#51YulUX$#8A#1Gi_???_!4?O#16??G#35???@???AO#40O#43?O?__W_GsgKWOXKQGa?O?H?G?A@#52!7?A!6?@#44!17?@???@!7?A?A?AA???_?_O@?gPG?_A#43!10?_Og@??__$#3?T?@A#35@#40E???_WGO#3!6?@#1??@?G#28!4?O_?_??O_??_?o???_?g?gOCKPiS@mUHc??C?I?WE#31!24?@@?C@?@@?@@AD@!6?@#70!13?O#62_#37?C$#29!6?_!4?_#34!12?BEFfFBD@?@A@?DG?B#50!6?_#63?@#18?C?B?@#59!6?ea?C??A?LC}^]R@``OwTwnzEMEGc_#43!8?@??@?C#59o???_WC??QqWwYs\\}t}fCG$#32!8?NG#8!14?C#29!5?A?A#31??O_???OG??g_O?OsOGG?I??_!9?O_#28!36?@??@$#12!9?CCFAbg__oHW_?uw#18!8?OO#51??A#44?__#42!27?A#56!38?OO???O?c?KCCCHA???WG$#13!9?@A?@?A@W@SA?UG#57!15?CA$#14!9?A@!8?CAg#2!16?@-#22_G_kQkw#10C@@??@???|A@BA?B@#2GGKF#22?O`]OmYOkOaG#18HC!7?_#42???O!4?A#18?G_O_#50??_!14?O?HoQCoM[mUFYEJJMBGE??C!8?C?gS_?_HoGS?ECFG@G??G?C#37@$#34FALBLBD#3A#12}?A!5?A!4?@#57???O?O#29??C#28?`?@_@_O_UhUlUha?TAsh]gLy?ZC@A!6?A?@#44!11?_?_?_G?__?!4_ooOOQWQuy^FeRE?e@_!4?G#48!7?B?AW?ow_o_W$#37G!4?O#29A???@@#16?G#1???OO??CCG!8?C#31@???@?@_A_?@!5?@??@_#54C#68!7?CG#31!21?o?O?OGWCWCC?KC?K#42G??G#56?c?_OgA?@g!4?C@__og_#68D?OG?OGO_$#24OCO#4!4?w#11?a!5?A#20?@??@???BA@#48!14?OGA??Ww!4?_?O?__wwoKCWv~P@@ADE!7?BwE{SLLBN@B@@??@??`_```@@_oXGGD@#43!17?EAECEFAE$?o?O_#26??@#15?[{w{u]|#35?_!7?@#44!17?O_A?@A@?Q@AA@\\?@?C!7?EC#59!38?pYGUX~UB^v^uJuJ^HOWo__#51@???@$#1?@A#13!8?CA@`#25??C!5?A#56!20?GSC??CGC!4?AC??@B!8?GG!4?_#57!52?@?@#18??G$#32!11?A#40!5?G#34GOW?GO!4?BG!4?CK#50!10?@#59EgWA!8?E?OjB??M{wwqp!4~^~~{FHBAA!8?@#64!35?C#24?A@$#3!18?A??A??CCA#52!26?C$#4!18?cKCG?C$#24!19?_??O!6?F?_G??AA?C$#37!20?_O??o_oGC?Q?A!4?EGA$#43!21?___???_w_G@?O_@OG@S??@-#22C@?A@A@W#1w!6?_??OQ[???O#37_#48??_#44_O_?__OoOG_CKYGCCAG???CPASJOOgC_!8?__!9?@!6?@_?`_`@`@??ggOkWkP?QSPO@K@@#54!5?__w{o#19G#42O#44???O#68@??@A$#42w_Ww_Wg#24E#40E!5?_!4?G#24@c?G_?O#39!4?G!4?C#56?_???_?oYWCoo!6?_??O?_??_!6?C#68!7?C?CAS?COC?C#56!8?O?cO_Qg\\kiMeSpkSO_oGGKCB@??HFN{_ww[o_W$#44AC??A#34??@#12@E??GMDA#2_#51_?_#22?AscG[gO@OJ@K?P???A??A#52?_??_#48?NFN?K?G?CBA@BBK`FB!4?H_!4?_AEamixJLZNIL@UDSsSck~?VB@@@?a?@??G!5?A??@!12?@?@@$#31@?E#39?C#32!4?Go?O???CBC#43??@B!4@h?@??@???@?@#59?O!5?@_?GOo!4_??C_[Sr]W{z}n^UX~v|nTXpH?@C_?_?_OW?W?G?GO?C?GAE?E?@?_@_?Qgn^LSFAA!7?AMCE_M[C$#28?Y_DWcU_#13?@CQD?A?B#20C#34_@a?GO#31CACA[C?Q?^CIGCOI@@?A!12?G#50!9?C@O??A?GAOIcGOOO??q?_OAaGAIAIQB?B#42!10?G#52AA!5?_oOWCANvewo!7?_$#43??@??@#25???o!5?O#38?G#29???G#28?AA?ACAIcCq?IdAjCTiODTI`CB??_JA\\BSBkPI?G#50!51?A???B??@!7?@@A@A??A$#11!10?G_?O#10GCG?I#47??O#42!19?_??@??O$#15!10?BH_@#3O?OO$#14!11?CA??@$#35!13?_?G??@C-#31___?_SOO!9?_???AK{GjCj?l@#56??___OA__Q_???_@_@??@odY?FATG}TyXEGQaA#50???G@KoCmHm@?B@A@#28?O#56G??G?_CA?qsQ}iDo~ysq\\]NEBBB@@#19??C!6?CA?GOg?G?C$#39OOOG??GIO#1H_!4?g?G#22aOiOA@FS@?C#42?GqDYCOA`CQLOEOaO_?O#48?CC!5?@???ADA_???C?E?QeABB@A@?@??`_`@_oaPCA@???G#59???YM?DJDA@?@#55??ooww{ynU{#42??A??A#55!4?_oo$#28@AG@A@AD#24G!7?RAGD#18C#28?_?O?iCzAuLYDRM`KRK_MpITIQTiDIoHO!4?G#31!17?G?S?CKCCC#59!4?G#42!4?_?oG@?@!7?_!4?C#56!14?@???J@$#42M@FALAD#40?@EO???OEG#34DC??@#44??_?O!5?_?G@KOG???GCGCKG?Go!8?A!4?WoKWw[w|cWoKoO_OqqwyW]]mVF\\ez\\Y\\NDAl?T_@???G#54?_o_owGMEFB@OhB~}wwwoo??oOGI$#44?K?S?G#47??Ao#25FoGwG#58P#37_?OI??@#39!4?O?O#19!9?@!9?_#39!30?G#52!14?_!15?WK?C!9?@DBDKFnVCEF@$#64???_#22O#63!4_#32?GBqC#8_#29?CO#43@_PkOA#59!17?@!5?ACQ@IEId~w{at@g?c@F`D@b@A@?@$#17!8?C#60??KC?C#52!28?`?@$#11!12?@#13A#10@$#14!13?@#35A-#57GGOGO?GW!8?G#43qUMC_#39C#42CWCWgHg\\gIoTSG_C@!4?AIOA?H?G?CG#48!7?_@_!4?@?@FEA?AA??B@@?@@#42??GOIC?jAEOF?I?IC?A?@!4?@#52!8?ACG#67???__OOG?CA?@$#62ESECE]VCE#0_?A_O_#34OE#24H??@#44OG_`ACRC???", 8192) = 4096
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 4096
write(6, "15!9?ALITj?_!6?B#40!5?O?G?C?C#63!6?C#48!6?G!5?c#56!10?@PA_BPeAtHCA!4?C!8?!4@#18!13?@$#16!11?@#35!5?Oo_?O#37!7?@?@#43?@!4?CKG_?_?A!5?@?ABH$#4!20?_??___?q_q?O?C?G#50!12?_?_#59G#18AC?A$#3!20?O__???_#49!4?CO#56!16?O??O#44G?CadB?C?OWoG?OWO_G??A?@?@!7?G?_-#10@ADA@?@^?O??CC!4?__O??CG_#37O?gOGAC!4?AAC?D??C@???A?@#48_?CCIE!4?W[wwo_?wow?__k}]]nEAA??oopRINn^VM{IOQ_aOo]o??gWHejUIc?B@@A!5?bPE@@#57S!4?C$#34_???_oG!5?_#26G#20O!9?_#2@#24G?OK!5?C@!4?_?P@?E?A?@#44_?o_O_WO`_P!5?KC#50!12?gCOCG?Gc?OO?g_At`kK[kK_IKAEEE??@??@??_?_@I@?OEG?C@#34_HQHA$#4[_O[[MO#25?o_W#15???DUFMA?K#4@@???_#22G???CHEHA!6?FKQMHUD?E?Q#56???@?@GSI@@BBD?@@AB@?@!5?@?@???@#68??O??_?O#18??G?O!6?G#68!19?_pMI#18A#51YulUX$#8A#1Gi_???_!4?O#16??G#35???@???AO#40O#43?O?__W_GsgKWOXKQGa?O?H?G?A@#52!7?A!6?@#44!17?@???@!7?A?A?AA???_?_O@?gPG?_A#43!10?_Og@??__$#3?T?@A#35@#40E???_WGO#3!6?@#1??@?G#28!4?O_?_??O_??_?o???_?g?gOCKPiS@mUHc??C?I?WE#31!24?@@?C@?@@?@@AD@!6?@#70!13?O#62_#37?C$#29!6?_!4?_#34!12?BEFfFBD@?@A@?DG?B#50!6?_#63?@#18?C?B?@#59!6?ea?C??A?LC}^]R@``OwTwnzEMEGc_#43!8?@??@?C#59o???_WC??QqWwYs\\}t}fCG$#32!8?NG#8!14?C#29!5?A?A#31??O_???OG??g_O?OsOGG?I??_!9?O_#28!36?@??@$#12!9?CCFAbg__oHW_?uw#18!8?OO#51??A#44?__#42!27?A#56!38?OO???O?c?KCCCHA???WG$#13!9?@A?@?A@W@SA?UG#57!15?CA$#14!9?A@!8?CAg#2!16?@-#22_G_kQkw#10C@@??@???|A@BA?B@#2GGKF#22?O`]OmYOkOaG#18HC!7?_#42???O!4?A#18?G_O_#50??_!14?O?HoQCoM[mUFYEJJMBGE??C!8?C?gS_?_HoGS?ECFG@G??G?C#37@$#34FALBLBD#3A#12}?A!5?A!4?@#57???O?O#29??C#28?`?@_@_O_UhUlUha?TAsh]gLy?ZC@A!6?A?@#44!11?_?_?_G?__?!4_ooOOQWQuy^FeRE?e@_!4?G#48!7?B?AW?ow_o_W$#37G!4?O#29A???@@#16?G#1???OO??CCG!8?C#31@???@?@_A_?@!5?@??@_#54C#68!7?CG#31!21?o?O?OGWCWCC?KC?K#42G??G#56?c?_OgA?@g!4?C@__og_#68D?OG?OGO_$#24OCO#4!4?w#11?a!5?A#20?@??@???BA@#48!14?OGA??Ww!4?_?O?__wwoKCWv~P@@ADE!7?BwE{SLLBN@B@@??@??`_```@@_oXGGD@#43!17?EAECEFAE$?o?O_#26??@#15?[{w{u]|#35?_!7?@#44!17?O_A?@A@?Q@AA@\\?@?C!7?EC#59!38?pYGUX~UB^v^uJuJ^HOWo__#51@???@$#1?@A#13!8?CA@`#25??C!5?A#56!20?GSC??CGC!4?AC??@B!8?GG!4?_#57!52?@?@#18??G$#32!11?A#40!5?G#34GOW?GO!4?BG!4?CK#50!10?@#59EgWA!8?E?OjB??M{wwqp!4~^~~{FHBAA!8?@#64!35?C#24?A@$#3!18?A??A??CCA#52!26?C$#4!18?cKCG?C$#24!19?_??O!6?F?_G??AA?C$#37!20?_O??o_oGC?Q?A!4?EGA$#43!21?___???_w_G@?O_@OG@S??@-#22C@?A@A@W#1w!6?_??OQ[???O#37_#48??_#44_O_?__OoOG_CKYGCCAG???CPASJOOgC_!8?__!9?@!6?@_?`_`@`@??ggOkWkP?QSPO@K@@#54!5?__w{o#19G#42O#44???O#68@??@A$#42w_Ww_Wg#24E#40E!5?_!4?G#24@c?G_?O#39!4?G!4?C#56?_???_?oYWCoo!6?_??O?_??_!6?C#68!7?C?CAS?COC?C#56!8?O?cO_Qg\\kiMeSpkSO_oGGKCB@??HFN{_ww[o_W$#44AC??A#34??@#12@E??GMDA#2_#51_?_#22?AscG[gO@OJ@K?P???A??A#52?_??_#48?NFN?K?G?CBA@BBK`FB!4?H_!4?_AEamixJLZNIL@UDSsSck~?VB@@@?a?@??G!5?A??@!12?@?@@$#31@?E#39?C#32!4?Go?O???CBC#43??@B!4@h?@??@???@?@#59?O!5?@_?GOo!4_??C_[Sr]W{z}n^UX~v|nTXpH?@C_?_?_OW?W?G?GO?C?GAE?E?@?_@_?Qgn^LSFAA!7?AMCE_M[C$#28?Y_DWcU_#13?@CQD?A?B#20C#34_@a?GO#31CACA[C?Q?^CIGCOI@@?A!12?G#50!9?C@O??A?GAOIcGOOO??q?_OAaGAIAIQB?B#42!10?G#52AA!5?_oOWCANvewo!7?_$#43??@??@#25???o!5?O#38?G#29???G#28?AA?ACAIcCq?IdAjCTiODTI`CB??_JA\\BSBkPI?G#50!51?A???B??@!7?@@A@A??A$#11!10?G_?O#10GCG?I#47??O#42!19?_??@??O$#15!10?BH_@#3O?OO$#14!11?CA??@$#35!13?_?G??@C-#31___?_SOO!9?_???AK{GjCj?l@#56??___OA__Q_???_@_@??@odY?FATG}TyXEGQaA#50???G@KoCmHm@?B@A@#28?O#56G??G?_CA?qsQ}iDo~ysq\\]NEBBB@@#19??C!6?CA?GOg?G?C$#39OOOG??GIO#1H_!4?g?G#22aOiOA@FS@?C#42?GqDYCOA`CQLOEOaO_?O#48?CC!5?@???ADA_???C?E?QeABB@A@?@??`_`@_oaPCA@???G#59???YM?DJDA@?@#55??ooww{ynU{#42??A??A#55!4?_oo$#28@AG@A@AD#24G!7?RAGD#18C#28?_?O?iCzAuLYDRM`KRK_MpITIQTiDIoHO!4?G#31!17?G?S?CKCCC#59!4?G#42!4?_?oG@?@!7?_!4?C#56!14?@???J@$#42M@FALAD#40?@EO???OEG#34DC??@#44??_?O!5?_?G@KOG???GCGCKG?Go!8?A!4?WoKWw[w|cWoKoO_OqqwyW]]mVF\\ez\\Y\\NDAl?T_@???G#54?_o_owGMEFB@OhB~}wwwoo??oOGI$#44?K?S?G#47??Ao#25FoGwG#58P#37_?OI??@#39!4?O?O#19!9?@!9?_#39!30?G#52!14?_!15?WK?C!9?@DBDKFnVCEF@$#64???_#22O#63!4_#32?GBqC#8_#29?CO#43@_PkOA#59!17?@!5?ACQ@IEId~w{at@g?c@F`D@b@A@?@$#17!8?C#60??KC?C#52!28?`?@$#11!12?@#13A#10@$#14!13?@#35A-#57GGOGO?GW!8?G#43qUMC_#39C#42CWCWgHg\\gIoTSG_C@!4?AIOA?H?G?CG#48!7?_@_!4?@?@FEA?AA??B@@?@@#42??GOIC?jAEOF?I?IC?A?@!4?@#52!8?ACG#67???__OOG?CA?@$#62ESECE]VCE#0_?A_O_#34OE#24H??@#44OG_`ACRC???", 4096) = 2048
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 2048
write(6, "~~{FHBAA!8?@#64!35?C#24?A@$#3!18?A??A??CCA#52!26?C$#4!18?cKCG?C$#24!19?_??O!6?F?_G??AA?C$#37!20?_O??o_oGC?Q?A!4?EGA$#43!21?___???_w_G@?O_@OG@S??@-#22C@?A@A@W#1w!6?_??OQ[???O#37_#48??_#44_O_?__OoOG_CKYGCCAG???CPASJOOgC_!8?__!9?@!6?@_?`_`@`@??ggOkWkP?QSPO@K@@#54!5?__w{o#19G#42O#44???O#68@??@A$#42w_Ww_Wg#24E#40E!5?_!4?G#24@c?G_?O#39!4?G!4?C#56?_???_?oYWCoo!6?_??O?_??_!6?C#68!7?C?CAS?COC?C#56!8?O?cO_Qg\\kiMeSpkSO_oGGKCB@??HFN{_ww[o_W$#44AC??A#34??@#12@E??GMDA#2_#51_?_#22?AscG[gO@OJ@K?P???A??A#52?_??_#48?NFN?K?G?CBA@BBK`FB!4?H_!4?_AEamixJLZNIL@UDSsSck~?VB@@@?a?@??G!5?A??@!12?@?@@$#31@?E#39?C#32!4?Go?O???CBC#43??@B!4@h?@??@???@?@#59?O!5?@_?GOo!4_??C_[Sr]W{z}n^UX~v|nTXpH?@C_?_?_OW?W?G?GO?C?GAE?E?@?_@_?Qgn^LSFAA!7?AMCE_M[C$#28?Y_DWcU_#13?@CQD?A?B#20C#34_@a?GO#31CACA[C?Q?^CIGCOI@@?A!12?G#50!9?C@O??A?GAOIcGOOO??q?_OAaGAIAIQB?B#42!10?G#52AA!5?_oOWCANvewo!7?_$#43??@??@#25???o!5?O#38?G#29???G#28?AA?ACAIcCq?IdAjCTiODTI`CB??_JA\\BSBkPI?G#50!51?A???B??@!7?@@A@A??A$#11!10?G_?O#10GCG?I#47??O#42!19?_??@??O$#15!10?BH_@#3O?OO$#14!11?CA??@$#35!13?_?G??@C-#31___?_SOO!9?_???AK{GjCj?l@#56??___OA__Q_???_@_@??@odY?FATG}TyXEGQaA#50???G@KoCmHm@?B@A@#28?O#56G??G?_CA?qsQ}iDo~ysq\\]NEBBB@@#19??C!6?CA?GOg?G?C$#39OOOG??GIO#1H_!4?g?G#22aOiOA@FS@?C#42?GqDYCOA`CQLOEOaO_?O#48?CC!5?@???ADA_???C?E?QeABB@A@?@??`_`@_oaPCA@???G#59???YM?DJDA@?@#55??ooww{ynU{#42??A??A#55!4?_oo$#28@AG@A@AD#24G!7?RAGD#18C#28?_?O?iCzAuLYDRM`KRK_MpITIQTiDIoHO!4?G#31!17?G?S?CKCCC#59!4?G#42!4?_?oG@?@!7?_!4?C#56!14?@???J@$#42M@FALAD#40?@EO???OEG#34DC??@#44??_?O!5?_?G@KOG???GCGCKG?Go!8?A!4?WoKWw[w|cWoKoO_OqqwyW]]mVF\\ez\\Y\\NDAl?T_@???G#54?_o_owGMEFB@OhB~}wwwoo??oOGI$#44?K?S?G#47??Ao#25FoGwG#58P#37_?OI??@#39!4?O?O#19!9?@!9?_#39!30?G#52!14?_!15?WK?C!9?@DBDKFnVCEF@$#64???_#22O#63!4_#32?GBqC#8_#29?CO#43@_PkOA#59!17?@!5?ACQ@IEId~w{at@g?c@F`D@b@A@?@$#17!8?C#60??KC?C#52!28?`?@$#11!12?@#13A#10@$#14!13?@#35A-#57GGOGO?GW!8?G#43qUMC_#39C#42CWCWgHg\\gIoTSG_C@!4?AIOA?H?G?CG#48!7?_@_!4?@?@FEA?AA??B@@?@@#42??GOIC?jAEOF?I?IC?A?@!4?@#52!8?ACG#67???__OOG?CA?@$#62ESECE]VCE#0_?A_O_#34OE#24H??@#44OG_`ACRC???", 2048) = 1792
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = 1792
write(6, "D@b@A@?@$#17!8?C#60??KC?C#52!28?`?@$#11!12?@#13A#10@$#14!13?@#35A-#57GGOGO?GW!8?G#43qUMC_#39C#42CWCWgHg\\gIoTSG_C@!4?AIOA?H?G?CG#48!7?_@_!4?@?@FEA?AA??B@@?@@#42??GOIC?jAEOF?I?IC?A?@!4?@#52!8?ACG#67???__OOG?CA?@$#62ESECE]VCE#0_?A_O_#34OE#24H??@#44OG_`ACRC???", 256) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
ioctl(6, FIONREAD, [0])                 = 0
rt_sigprocmask(SIG_BLOCK, [INT ALRM], [], 8) = 0
timerfd_settime(4, TFD_TIMER_ABSTIME, {it_interval={0, 0}, it_value={1604284155, 209917306}}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT ALRM], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [WINCH IO], NULL, 8) = 0
...

^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02  2:58       ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2020-11-02  3:11         ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-11-02 15:31           ` Eli Zaretskii
  2020-11-02 15:22         ` Lars Ingebrigtsen
  1 sibling, 1 reply; 30+ messages in thread
From: LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2020-11-02  3:11 UTC (permalink / raw)
  To: Eli Zaretskii, Lars Ingebrigtsen, sunlin7@yahoo.com; +Cc: 44320@debbugs.gnu.org

[-- Attachment #1: Type: text/html, Size: 1332 bytes --]

[-- Attachment #2: testing-strace-2.log.gz --]
[-- Type: application/x-gzip, Size: 12562 bytes --]

^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02  2:58       ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-11-02  3:11         ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2020-11-02 15:22         ` Lars Ingebrigtsen
  2020-11-02 16:07           ` Eli Zaretskii
  1 sibling, 1 reply; 30+ messages in thread
From: Lars Ingebrigtsen @ 2020-11-02 15:22 UTC (permalink / raw)
  To: LinSun; +Cc: 44320@debbugs.gnu.org

LinSun <lin.sun@zoom.us> writes:

>> This is very old code, so it is surprising this only comes up now.
>>I'd rather we understood the issue completely before we decide how to
>>fix it.

[...]

> I had attached all the testing files, the testing.el will read the six image and
>
> send to terminal.
> (send-string-to-terminal
> (with-temp-buffer
>    (insert-file-contents "testing.six")
>    (buffer-string)))

Thanks; the testing.six file is more than 4096 bytes long, so it's not
surprising that this use case triggers the bug.  My guess is that we
haven't had reports about this before just because it's a pretty unusual
use case, and your proposed patch seems like the correct solution here.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02  3:11         ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2020-11-02 15:31           ` Eli Zaretskii
  2020-11-02 15:49             ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 15:31 UTC (permalink / raw)
  To: LinSun; +Cc: larsi, sunlin7, 44320

> Date: Mon, 2 Nov 2020 11:11:22 +0800
> From: LinSun <lin.sun@zoom.us>
> Cc: "44320@debbugs.gnu.org" <44320@debbugs.gnu.org>
> 
> Attach the log file ` testing-strace-2.log.gz` with a line more which may be a import hints.
> 
> write(6, "…", 256) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)

Thanks.

I don't think I know how to interpret this trace, or understand the
significance of ERESTARTSYS.  Was this trace collected with or without
your change in send-string-to-terminal? did fwrite succeed to write
the entire string or did it write only part of it, and if the latter,
which part was successfully written?

All I see in the trace is a series of calls to 'write' syscall,
progressively writing a large string in chunks of 4K bytes, which
seems normal.  'fwrite' is documented to return an error indication if
it doesn't succeed to write the entire buffer, but you didn't show the
return value of 'fwrite' nor what 'fflush' after it returned, so it is
hard to know what exactly happened.

I think we must understand what happens here and why, because we call
'fwrite' in 2 dozen other places, and it makes little sense to fix
only one of them.  The function where you propose the change calls
'fwrite' twice, but you suggested to fix only one of these two calls,
which also sounds strange to me.  Moreover, I don't think I see any
documentation saying that 'fwrite' can, let alone should be expected
to, fail to write the entire buffer without returning some error
indication.  On what OS do you see the problem?





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 15:31           ` Eli Zaretskii
@ 2020-11-02 15:49             ` Andreas Schwab
  2020-11-02 16:14               ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 15:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, LinSun

On Nov 02 2020, Eli Zaretskii wrote:

>> Date: Mon, 2 Nov 2020 11:11:22 +0800
>> From: LinSun <lin.sun@zoom.us>
>> Cc: "44320@debbugs.gnu.org" <44320@debbugs.gnu.org>
>> 
>> Attach the log file ` testing-strace-2.log.gz` with a line more which may be a import hints.
>> 
>> write(6, "…", 256) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
>
> Thanks.
>
> I don't think I know how to interpret this trace, or understand the
> significance of ERESTARTSYS.

It is translated to EINTR on signal handler return:

rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)

Outside of strace, ERESTARTSYS is never observed by user-space.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 15:22         ` Lars Ingebrigtsen
@ 2020-11-02 16:07           ` Eli Zaretskii
  2020-11-02 16:30             ` Lars Ingebrigtsen
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 16:07 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 44320, lin.sun

> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: Eli Zaretskii <eliz@gnu.org>,  "44320@debbugs.gnu.org"
>  <44320@debbugs.gnu.org>
> Date: Mon, 02 Nov 2020 16:22:20 +0100
> 
> > send to terminal.
> > (send-string-to-terminal
> > (with-temp-buffer
> >    (insert-file-contents "testing.six")
> >    (buffer-string)))
> 
> Thanks; the testing.six file is more than 4096 bytes long, so it's not
> surprising that this use case triggers the bug.  My guess is that we
> haven't had reports about this before just because it's a pretty unusual
> use case, and your proposed patch seems like the correct solution here.

What is the significance of 4K bytes in this case?  Is 'fwrite'
documented not to write more than that?  I couldn't find such
documentation.

And if 4KB is a limitation, then what does ERESTARTSYS have to do with
this?

Anyway, if we need to fix calls to 'fwrite', we should provide
something similar to emacs_write, and use it everywhere we use
'fwrite' now.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 15:49             ` Andreas Schwab
@ 2020-11-02 16:14               ` Eli Zaretskii
  2020-11-02 16:41                 ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 16:14 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: LinSun <lin.sun@zoom.us>,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 16:49:49 +0100
> 
> >> write(6, "…", 256) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
> >
> > Thanks.
> >
> > I don't think I know how to interpret this trace, or understand the
> > significance of ERESTARTSYS.
> 
> It is translated to EINTR on signal handler return:
> 
> rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
> 
> Outside of strace, ERESTARTSYS is never observed by user-space.

So you are saying that the call to 'write' issued by 'fwrite' or
'fflush' was interrupted by SIGIO, and that is why it didn't write all
of its data?  IOW, the size of the string passed to 'fwrite' has no
real significance here, and instead the problem is the signal?

If so, is it normal for 'fwrite'/'fflush' to punt instead of
continuing its 'write' loop upon receiving EINTR?  I can understand
why we need a loop when we call 'write' directly, but I'd expect
'fwrite' to do that internally.  Am I naïve?

Thanks.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 16:07           ` Eli Zaretskii
@ 2020-11-02 16:30             ` Lars Ingebrigtsen
  0 siblings, 0 replies; 30+ messages in thread
From: Lars Ingebrigtsen @ 2020-11-02 16:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 44320, lin.sun

Eli Zaretskii <eliz@gnu.org> writes:

> What is the significance of 4K bytes in this case?  Is 'fwrite'
> documented not to write more than that?  I couldn't find such
> documentation.

writes that are less than a system block size are unlikely to be chopped
into parts.

> Anyway, if we need to fix calls to 'fwrite', we should provide
> something similar to emacs_write, and use it everywhere we use
> 'fwrite' now.

I can't see anything in the fwrite man page that guarantees that it'll
write all that we tell it to write:

RETURN VALUE
       On success, fread() and fwrite() return the number of items read or writ‐
       ten.  This number equals the number of bytes transferred only  when  size
       is  1.  If an error occurs, or the end of the file is reached, the return
       value is a short item count (or zero).


-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 16:14               ` Eli Zaretskii
@ 2020-11-02 16:41                 ` Andreas Schwab
  2020-11-02 17:10                   ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 16:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 02 2020, Eli Zaretskii wrote:

> So you are saying that the call to 'write' issued by 'fwrite' or
> 'fflush' was interrupted by SIGIO, and that is why it didn't write all
> of its data?

It wrote none of it.

> If so, is it normal for 'fwrite'/'fflush' to punt instead of
> continuing its 'write' loop upon receiving EINTR?

Yes.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 16:41                 ` Andreas Schwab
@ 2020-11-02 17:10                   ` Eli Zaretskii
  2020-11-02 17:36                     ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 17:10 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 17:41:56 +0100
> 
> On Nov 02 2020, Eli Zaretskii wrote:
> 
> > So you are saying that the call to 'write' issued by 'fwrite' or
> > 'fflush' was interrupted by SIGIO, and that is why it didn't write all
> > of its data?
> 
> It wrote none of it.

I see in the trace a series of 'write' calls that write chunks of up
to 4K bytes:

  write(6, "!9?C...", 16384) = 4096
  write(6, "O??@...", 12288) = 4096
  write(6, "49!6...", 8192) = 4096
  write(6, "15!9...", 4096) = 2048
  write(6, "~~{F...", 2048) = 1792
  write(6, "D@b@...", 256) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)

So it looks like only the last call didn't write anything?  Or is my
interpretation wrong?





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 17:10                   ` Eli Zaretskii
@ 2020-11-02 17:36                     ` Andreas Schwab
  2020-11-02 17:59                       ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 17:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 02 2020, Eli Zaretskii wrote:

> So it looks like only the last call didn't write anything?

Correct.  A partial write never reports an error.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 17:36                     ` Andreas Schwab
@ 2020-11-02 17:59                       ` Eli Zaretskii
  2020-11-02 18:02                         ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 17:59 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 18:36:09 +0100
> 
> On Nov 02 2020, Eli Zaretskii wrote:
> 
> > So it looks like only the last call didn't write anything?
> 
> Correct.  A partial write never reports an error.

Not sure I understand the last sentence: in this case 'fwrite' should
have returned a value less than the amount it was asked to write, and
errno should have been set to EINTR, correct?





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 17:59                       ` Eli Zaretskii
@ 2020-11-02 18:02                         ` Andreas Schwab
  2020-11-02 18:12                           ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 18:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 02 2020, Eli Zaretskii wrote:

>> From: Andreas Schwab <schwab@linux-m68k.org>
>> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>>   44320@debbugs.gnu.org
>> Date: Mon, 02 Nov 2020 18:36:09 +0100
>> 
>> On Nov 02 2020, Eli Zaretskii wrote:
>> 
>> > So it looks like only the last call didn't write anything?
>> 
>> Correct.  A partial write never reports an error.
>
> Not sure I understand the last sentence: in this case 'fwrite' should
> have returned a value less than the amount it was asked to write, and
> errno should have been set to EINTR, correct?

Only when it actually writes the data.  Without fflush, you will never
know when that happens.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 18:02                         ` Andreas Schwab
@ 2020-11-02 18:12                           ` Eli Zaretskii
  2020-11-02 18:22                             ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 18:12 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 19:02:32 +0100
> 
> >> Correct.  A partial write never reports an error.
> >
> > Not sure I understand the last sentence: in this case 'fwrite' should
> > have returned a value less than the amount it was asked to write, and
> > errno should have been set to EINTR, correct?
> 
> Only when it actually writes the data.  Without fflush, you will never
> know when that happens.

But that means 'fwrite' could return zero, if its very first call to
'write' got interrupted, no?  In which case the proposed patch would
not DTRT.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 18:12                           ` Eli Zaretskii
@ 2020-11-02 18:22                             ` Andreas Schwab
  2020-11-02 18:35                               ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 18:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 02 2020, Eli Zaretskii wrote:

> But that means 'fwrite' could return zero, if its very first call to
> 'write' got interrupted, no?

No.  When an error occurs, it returns EOF.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 18:22                             ` Andreas Schwab
@ 2020-11-02 18:35                               ` Eli Zaretskii
  2020-11-02 18:58                                 ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 18:35 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 19:22:21 +0100
> 
> On Nov 02 2020, Eli Zaretskii wrote:
> 
> > But that means 'fwrite' could return zero, if its very first call to
> > 'write' got interrupted, no?
> 
> No.  When an error occurs, it returns EOF.

Is EINTR considered an error for this purpose?  If not, what exactly
is considered an error?  I don't see this clearly documented, so it
could be something we cannot rely on.  In fact, I don't even see in
portable documentation that it will return EOF upon errors, I only see
that the error indication for the stream shall be set and errno shall
be set.

In short, it sounds like calling fwrite in a loop will only work by
sheer luck.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 18:35                               ` Eli Zaretskii
@ 2020-11-02 18:58                                 ` Andreas Schwab
  2020-11-02 19:31                                   ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 18:58 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 02 2020, Eli Zaretskii wrote:

> Is EINTR considered an error for this purpose?

Sure.

> If not, what exactly is considered an error?  I don't see this clearly
> documented, so it could be something we cannot rely on.

https://pubs.opengroup.org/onlinepubs/9699919799/functions/fputc.html

> In short, it sounds like calling fwrite in a loop will only work by
> sheer luck.

I don't see why.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 18:58                                 ` Andreas Schwab
@ 2020-11-02 19:31                                   ` Eli Zaretskii
  2020-11-02 20:26                                     ` Andreas Schwab
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-02 19:31 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 19:58:17 +0100
> 
> On Nov 02 2020, Eli Zaretskii wrote:
> 
> > Is EINTR considered an error for this purpose?
> 
> Sure.

So if the call to 'write' made by 'fwrite' is interrupted by a signal,
and 'fwrite' didn't succeed to write anything, 'fwrite' will return
EOF and errno will be set to EINTR?  The proposed patch didn't handle
that case.

And if 'fwrite' was interrupted by a signal, but it succeeded to write
something, it will return a smaller count without setting errno?  Then
how to distinguish between a partial write due to a signal and a
partial write due to, say, disk full?

> > If not, what exactly is considered an error?  I don't see this clearly
> > documented, so it could be something we cannot rely on.
> 
> https://pubs.opengroup.org/onlinepubs/9699919799/functions/fputc.html

Thanks.

> > In short, it sounds like calling fwrite in a loop will only work by
> > sheer luck.
> 
> I don't see why.

Too many subtle assumptions for my palate.  In general, stdio is not
safe in the presence of signals.

Would it be better to suspend SIGIO by calling unrequest_sigio instead
(and resume it once 'fwrite' returns)?





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 19:31                                   ` Eli Zaretskii
@ 2020-11-02 20:26                                     ` Andreas Schwab
       [not found]                                       ` <4BD75783-F561-4DB8-A733-13A3D924C8C1@hxcore.ol>
  2020-11-05 15:59                                       ` Eli Zaretskii
  0 siblings, 2 replies; 30+ messages in thread
From: Andreas Schwab @ 2020-11-02 20:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 02 2020, Eli Zaretskii wrote:

> Too many subtle assumptions for my palate.  In general, stdio is not
> safe in the presence of signals.

That is true, at least if the stream is conntected to a blocking device
(file I/O is not affected by signals).

> Would it be better to suspend SIGIO by calling unrequest_sigio instead
> (and resume it once 'fwrite' returns)?

It might be even better to use POSIX I/O.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
       [not found]                                       ` <4BD75783-F561-4DB8-A733-13A3D924C8C1@hxcore.ol>
@ 2020-11-03 15:29                                         ` Eli Zaretskii
  2020-11-05  0:14                                           ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-03 15:29 UTC (permalink / raw)
  To: LinSun; +Cc: larsi, schwab, sunlin7, 44320

> Date: Tue, 3 Nov 2020 08:56:29 +0800
> From: LinSun <lin.sun@zoom.us>
> Cc: "larsi@gnus.org" <larsi@gnus.org>, 
> 	"sunlin7@yahoo.com" <sunlin7@yahoo.com>, 
> 	"44320@debbugs.gnu.org" <44320@debbugs.gnu.org>
> 
> > On what OS do you see the problem?
> 
> It’s CentOS 7 (kernel 3.10.0, x86_64), I ssh from Cygwin, testing the testing.el with emacs 27, some times
> successful to show the *.six image some times failed, while cat *.six always success.

Does the below fix the problem, if applied to the unpatched tree in
Git?

diff --git a/src/dispnew.c b/src/dispnew.c
index 3f2ae3e..a5e50b3 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -5904,8 +5904,10 @@ DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
 	}
       out = tty->output;
     }
+  unrequest_sigio ();
   fwrite (SDATA (string), 1, SBYTES (string), out);
   fflush (out);
+  request_sigio ();
   unblock_input ();
   return Qnil;
 }





^ permalink raw reply related	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-03 15:29                                         ` Eli Zaretskii
@ 2020-11-05  0:14                                           ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2020-11-07  9:28                                             ` Eli Zaretskii
  0 siblings, 1 reply; 30+ messages in thread
From: LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2020-11-05  0:14 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: larsi@gnus.org, schwab@linux-m68k.org, sunlin7@yahoo.com,
	44320@debbugs.gnu.org

[-- Attachment #1: Type: text/html, Size: 1568 bytes --]

^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-02 20:26                                     ` Andreas Schwab
       [not found]                                       ` <4BD75783-F561-4DB8-A733-13A3D924C8C1@hxcore.ol>
@ 2020-11-05 15:59                                       ` Eli Zaretskii
  2020-11-05 16:07                                         ` Andreas Schwab
  1 sibling, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-05 15:59 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: larsi, sunlin7, 44320, lin.sun

> From: Andreas Schwab <schwab@linux-m68k.org>
> Cc: lin.sun@zoom.us,  larsi@gnus.org,  sunlin7@yahoo.com,
>   44320@debbugs.gnu.org
> Date: Mon, 02 Nov 2020 21:26:18 +0100
> 
> On Nov 02 2020, Eli Zaretskii wrote:
> 
> > Too many subtle assumptions for my palate.  In general, stdio is not
> > safe in the presence of signals.
> 
> That is true, at least if the stream is conntected to a blocking device
> (file I/O is not affected by signals).

So you are saying only console and PTY I/O needs this special
handling, and file I/O doesn't?

> > Would it be better to suspend SIGIO by calling unrequest_sigio instead
> > (and resume it once 'fwrite' returns)?
> 
> It might be even better to use POSIX I/O.

Maybe so, but that sounds like a too large change for such a rare and
subtle use case.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-05 15:59                                       ` Eli Zaretskii
@ 2020-11-05 16:07                                         ` Andreas Schwab
  0 siblings, 0 replies; 30+ messages in thread
From: Andreas Schwab @ 2020-11-05 16:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, sunlin7, 44320, lin.sun

On Nov 05 2020, Eli Zaretskii wrote:

> So you are saying only console and PTY I/O needs this special
> handling, and file I/O doesn't?

Yes, file I/O doesn't block.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-05  0:14                                           ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2020-11-07  9:28                                             ` Eli Zaretskii
  2020-11-09  2:27                                               ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 30+ messages in thread
From: Eli Zaretskii @ 2020-11-07  9:28 UTC (permalink / raw)
  To: LinSun; +Cc: larsi, schwab, sunlin7, 44320-done

> Date: Thu, 5 Nov 2020 08:14:12 +0800
> From: LinSun <lin.sun@zoom.us>
> Cc: "schwab@linux-m68k.org" <schwab@linux-m68k.org>, 
> 	"larsi@gnus.org" <larsi@gnus.org>, "sunlin7@yahoo.com" <sunlin7@yahoo.com>, 
> 	"44320@debbugs.gnu.org" <44320@debbugs.gnu.org>
> 
> With your patch unrequest_sigio ()…request_sigio (), it work like charm, it always success display the *.six
> image.
> 
> Look forward you apply your patch or wrap a new function like `full_fwrite(…)` in the tree.

Thanks for testing.  I installed the change on the release branch.

As for other uses of fwrite, they are either to disk files or write
short strings, so are not in danger of hitting this problem.

With that, I'm closing this bug report.





^ permalink raw reply	[flat|nested] 30+ messages in thread

* bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents
  2020-11-07  9:28                                             ` Eli Zaretskii
@ 2020-11-09  2:27                                               ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 30+ messages in thread
From: LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2020-11-09  2:27 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: larsi@gnus.org, schwab@linux-m68k.org, sunlin7@yahoo.com,
	44320-done@debbugs.gnu.org

[-- Attachment #1: Type: text/html, Size: 1345 bytes --]

^ permalink raw reply	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2020-11-09  2:27 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-29 23:01 bug#44320: [PATH] [27.1] Make sure send-string-to-terminal send all contents Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-10-30  0:36 ` Lin Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-10-30  8:06 ` Eli Zaretskii
2020-10-30 12:38   ` Lars Ingebrigtsen
2020-10-30 13:25     ` Eli Zaretskii
2020-11-02  2:58       ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-11-02  3:11         ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-11-02 15:31           ` Eli Zaretskii
2020-11-02 15:49             ` Andreas Schwab
2020-11-02 16:14               ` Eli Zaretskii
2020-11-02 16:41                 ` Andreas Schwab
2020-11-02 17:10                   ` Eli Zaretskii
2020-11-02 17:36                     ` Andreas Schwab
2020-11-02 17:59                       ` Eli Zaretskii
2020-11-02 18:02                         ` Andreas Schwab
2020-11-02 18:12                           ` Eli Zaretskii
2020-11-02 18:22                             ` Andreas Schwab
2020-11-02 18:35                               ` Eli Zaretskii
2020-11-02 18:58                                 ` Andreas Schwab
2020-11-02 19:31                                   ` Eli Zaretskii
2020-11-02 20:26                                     ` Andreas Schwab
     [not found]                                       ` <4BD75783-F561-4DB8-A733-13A3D924C8C1@hxcore.ol>
2020-11-03 15:29                                         ` Eli Zaretskii
2020-11-05  0:14                                           ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-11-07  9:28                                             ` Eli Zaretskii
2020-11-09  2:27                                               ` LinSun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-11-05 15:59                                       ` Eli Zaretskii
2020-11-05 16:07                                         ` Andreas Schwab
2020-11-02 15:22         ` Lars Ingebrigtsen
2020-11-02 16:07           ` Eli Zaretskii
2020-11-02 16:30             ` Lars Ingebrigtsen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).