From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: handa Newsgroups: gmane.emacs.bugs Subject: bug#49066: 26.3; Segmentation fault on specific utf8 string Date: Sat, 03 Jul 2021 11:05:05 +0900 Message-ID: <87zgv4cfu6.fsf@gnu.org> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="5811"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 49066@debbugs.gnu.org, rpluim@gmail.com, eggert@cs.ucla.edu, larsi@gnus.org, mvsfrasson@gmail.com To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Jul 03 04:06:10 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lzV2o-0001JZ-5G for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 03 Jul 2021 04:06:10 +0200 Original-Received: from localhost ([::1]:45004 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lzV2m-0005g1-LP for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 02 Jul 2021 22:06:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:50864) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lzV2g-0005fg-9p for bug-gnu-emacs@gnu.org; Fri, 02 Jul 2021 22:06:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:54096) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lzV2g-0006XR-02 for bug-gnu-emacs@gnu.org; Fri, 02 Jul 2021 22:06:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lzV2f-0000Qt-QG for bug-gnu-emacs@gnu.org; Fri, 02 Jul 2021 22:06:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: handa Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 03 Jul 2021 02:06:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 49066 X-GNU-PR-Package: emacs Original-Received: via spool by 49066-submit@debbugs.gnu.org id=B49066.16252779261623 (code B ref 49066); Sat, 03 Jul 2021 02:06:01 +0000 Original-Received: (at 49066) by debbugs.gnu.org; 3 Jul 2021 02:05:26 +0000 Original-Received: from localhost ([127.0.0.1]:37409 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lzV26-0000Q7-Bl for submit@debbugs.gnu.org; Fri, 02 Jul 2021 22:05:26 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:52876) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lzV22-0000Ps-Sp for 49066@debbugs.gnu.org; Fri, 02 Jul 2021 22:05:25 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]:55392) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lzV1w-0005xj-Tm; Fri, 02 Jul 2021 22:05:16 -0400 Original-Received: from fl1-122-134-93-72.iba.mesh.ad.jp ([122.134.93.72]:50725 helo=shatin) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lzV1r-0000qM-VD; Fri, 02 Jul 2021 22:05:14 -0400 Original-Received: from handa by shatin with local (Exim 4.93) (envelope-from ) id 1lzV1l-000sHn-Ic; Sat, 03 Jul 2021 11:05:05 +0900 In-Reply-To: <83bl7qp52q.fsf@gnu.org> (message from Eli Zaretskii on Mon, 28 Jun 2021 15:05:33 +0300) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:209340 Archived-At: --=-=-= Content-Type: text/plain In article <83bl7qp52q.fsf@gnu.org>, Eli Zaretskii writes: > > With the patch it still crashes for me in emacs-master with harfbuzz disabled: > Too bad. > Kenichi, any suggestions? I checked the code again, and found that it was a fault of m17n-lib which was not robust enough to handle an OTF table that is different from what the library expects. Here is a revised patch to handle such a case. Could you please try it? ------------------------------------------------------------ diff --git a/src/ftfont.c b/src/ftfont.c index 0603dd9ce6..12d0d72d27 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -2798,10 +2798,31 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font, if (gstring.used > LGSTRING_GLYPH_LEN (lgstring)) return Qnil; + + /* mflt_run may fail to set g->g.to (which must be a valid index + into lgstring) correctly if the font has an OTF table that is + different from what the m17n library expects. */ for (i = 0; i < gstring.used; i++) { MFLTGlyphFT *g = (MFLTGlyphFT *) (gstring.glyphs) + i; + if (g->g.to >= len) + { + /* Invalid g->g.to. */ + g->g.to = len - 1; + int from = g->g.from; + /* Fix remaining glyphs. */ + for (++i; i < gstring.used; i++) + { + g = (MFLTGlyphFT *) (gstring.glyphs) + i; + g->g.from = from; + g->g.to = len - 1; + } + } + } + for (i = 0; i < gstring.used; i++) + { + MFLTGlyphFT *g = (MFLTGlyphFT *) (gstring.glyphs) + i; g->g.from = LGLYPH_FROM (LGSTRING_GLYPH (lgstring, g->g.from)); g->g.to = LGLYPH_TO (LGSTRING_GLYPH (lgstring, g->g.to)); } ------------------------------------------------------------ > Btw, I think there's a bug in those patterns: ZWJ and ZWNJ shouldn't > compose unless they are followed by a character. See section 12.2 in > the Unicode Standard. Even if they should not be composed with, we must include them in the string to shape because their existence may change the glyph of the previous character. A shaper (m17n-lib or harfbuzz) must return a glyph string that has an independent grapheme cluster for the last ZWJ/ZWNJ. At the time of developing m17n-lib, the above rule was not clear. To conform to that rule, please to put the attached BNG2-OTF.flt under the directory ~/.m17n.d/. --- K. Handa handa@gnu.org --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=BNG2-OTF.flt Content-Transfer-Encoding: base64 OzsgQk5HMi1PVEYuZmx0IC0tIEZvbnQgTGF5b3V0IFRhYmxlIGZvciBibmcyIE9wZW5UeXBlIGZv bnRzCjs7IENvcHlyaWdodCAoQykgMjAxMCBBSVNUIChIMTVQUk8xMTIpCjs7IFNlZSB0aGUgZW5k IGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuCgooZm9udCBsYXlvdXRlciBibmcyLW90ZiBuaWwKICAg ICAgKHZlcnNpb24gIjEuNi4wIikKICAgICAgKGZvbnQgKG5pbCBuaWwgdW5pY29kZS1ibXAgOm90 Zj1ibmcyKSkpCgo7OzsgPGxpPiBCTkcyLU9URi5mbHQKOzs7Cjs7OyBGb3IgYm5nMiBPcGVuVHlw ZSBmb250cyB0byBkcmF3IHRoZSBCZW5nYWxpIHNjcmlwdC4gIAoKOzsgSXQgc2VlbXMgdGhhdCAi U2hvcm5hciBCYW5nbGEudHRmIiBpcyBkZXNpZ25lZCB0byByZW5kZXIgdGhlIGJuZzIKOzsgc2Ny aXB0IHdpdGggdGhlIGZvbGxvd2luZyBnbHlwaCBzZXF1ZW5jZS4KOzsgMS4gcHJlIG1hdHJhCjs7 IDIuIGhhbGYgZm9ybXMgYW5kIGJlbG93IGZvcm1zCjs7IDMuIGJhc2UgZ2x5cGgKOzsgNC4gYmVs b3cgZm9ybXMKOzsgNS4gYmVsb3cgbWF0cmEgKDA5QzEuLjA5QzQpCjs7IDYuIHJlcGgKOzsgNy4g cG9zdCBmb3Jtcwo7OyA4LiBwb3N0IG1hdHJhICgwOUMwLCAwOUQ3KQo7OyA5LiBjYW5kcmFiaW5k dSAoMDk4MSkKOzsgMTAuIGFudXN2YXJhICgwOTgyKSBvciB2aXNhcmdhICgwOTgzKQoKKGNhdGVn b3J5CiA7OyBYOiBnZW5lcmljCiA7OyBWOiBpbmRlcGVuZGVudCB2b3dlbAogOzsgQzogY29uc29u YW50CiA7OyBSOiBSQQogOzsgVDogS0hBTkRBIFRBCiA7OyBuOiBOVUtUQQogOzsgSDogSEFMQU5U CiA7OyBtOiB2b3dlbCBzaWduIChwcmUpCiA7OyBiOiB2b3dlbCBzaWduIChiZWxvdykKIDs7IHA6 IHZvd2VsIHNpZ24gKHBvc3QpCiA7OyBhOiB2b3dlbCBtb2RpZmllciAoYWJvdmUpCiA7OyBBOiB2 b3dlbCBtb2RpZmllciAocG9zdCkKIDs7IE46IFpXTkoKIDs7IEo6IFpXSgogKDB4MDk4MCAweDA5 RkYJP1gpCQkJOyBnZW5lcmljCiAoMHgwOTgxCT9hKQkJCTsgU0lHTiBDQU5EUkFCSU5EVQogKDB4 MDk4MiAweDA5ODMJP0EpCQkJOyBTSUdOIEFOVVNWQVJBIC4uIFZJU0FSR0EKICgweDA5ODUgMHgw OTk0CT9WKQkJCTsgTEVUVEVSIEEgLi4gQVUKICgweDA5OTUgMHgwOUI5CT9DKQkJCTsgTEVUVEVS IEtBIC4uIEhBCiAoMHgwOUIwCT9SKQkJCTsgTEVUVEVSIFJBCiAoMHgwOUJDCT9uKQkJCTsgU0lH TiBOVUtUQQogKDB4MDlCRQk/cCkJCQk7IFZPV0VMIFNJR04gQUEKICgweDA5QkYJP20pCQkJOyBW T1dFTCBTSUdOIEkKICgweDA5QzAJP3ApCQkJOyBWT1dFTCBTSUdOIElJCiAoMHgwOUMxIDB4MDlD NAk/YikJCQk7IFZPV0VMIFNJR04gVSAuLiBSUgogKDB4MDlDNyAweDA5QzgJP20pCQkJOyBWT1dF TCBTSUdOIEUgLi4gQUkKICgweDA5Q0QJP0gpCQkJOyBTSUdOIFZJUkFNQQogKDB4MDlDRQk/VCkJ CQk7IExFVFRFUiBLSEFOREEgVEEKICgweDA5RDcJP3ApCQkJOyBBVSBMRU5HVEggTUFSSwogKDB4 MDlEQyAweDA5REYJP0MpCQkJOyBMRVRURVIgUlJBIC4uIFlZQQogKDB4MDlFMCAweDA5RTEJP1Yp CQkJOyBMRVRURVIgVk9DQUxJQyBSUiwgTEwKICgweDA5RTIgMHgwOUUzCT9iKQkJCTsgVk9XRUwg U0lHTiBMIC4uIExMCiAoMHgwOUYwCT9SKQkJCTsgTEVUVEVSIFJBIFdJVEggTUlERExFIERJQUdP TkFMCiAoMHgwOUYxCT9DKQkJCTsgTEVUVEVSIFJBIFdJVEggTE9XRVIgRElBR09OQUwKCiAoMHgy MDBDCT9OKQkJCTsgWldOSgogKDB4MjAwRAk/SikJCQk7IFpXSgogKDB4MjVDQwk/WCkJCQk7IERP VFRFRCBDSVJDTEUKCiAocnBoZgkJP3IpCiAocHN0ZgkJP1ApCiApCgo7OyBTdGFnZSAwCjs7IFBy ZXByb2Nlc3NpbmcKKGdlbmVyYXRvcgogKDAKICAoY29uZAogICA7OyBEZWNvbXBvc2UgdHdvLXBh cnQgdm93ZWwgc2lnbnMuCiAgICgoMHgwOUNCKQogICAgMHgwOUM3IDB4MDlCRSkKICAgKCgweDA5 Q0MpCiAgICAweDA5QzcgMHgwOUQ3KQoKICAgOzsgVEEgKyBIQUxBTlQgKyBaV0ogLT4gS0hBTkRB LVRBCiAgICgoMHgwOUE0IDB4MDlDRCAweDIwMEQpCiAgICAweDA5Q0UpCgogICA7OyBjb25zb25h bnQgKyBOVUtUQQogICAoKDB4MDlBMSAweDA5QkMpCiAgICAweDA5REMpCiAgICgoMHgwOUEyIDB4 MDlCQykKICAgIDB4MDlERCkKICAgKCgweDA5QUYgMHgwOUJDKQogICAgMHgwOURGKQoKICAgKCIu IiA9KSkKICAqKSkKCjs7IFN0YWdlIDEKOzsgU3lsbGFibGUgaWRlbnRpZmljYXRpb24KKGdlbmVy YXRvcgogKDAKICAoY29uZAogICA7OyBTeWxsYWJsZXMgd2l0aCBhbiBpbmRlcGVuZGVudCB2b3dl bAogICAoIihSSCk/Vm4/KEo/SFtDUl0pP20/Yj9wP24/YT9BPyIKICAgIDwgfCA9ICogfCA+KQoK ICAgOzsgS0hBTkRBLVRBIGNvbWJpbmVzIG9ubHkgd2l0aCByZXBoLgogICAoIihSSCk/KFQpIgog ICAgPCAoMiA9KSAoMSA6b3RmPWJuZzI9cnBoZispID4pCgogICA7OyBDb25zb25hbnQtYmFzZWQg c3lsbGFibGVzCiAgICgiKFtDUl1uP0o/SEo/KSpbQ1Jdbj8oSFtOSl0/fG0/KFtOSl0/Yik/cD9u PylhP0E/IgogICAgPCB8ID0gKiB8ID4pCgogICA7OyBUd28tcGFydCB2b3dlbCBzaWducwogICAo KDB4MDlDNyAweDA5QkUpCiAgICAoY29uZAogICAgICgoZm9udC1mYWNpbGl0eSAweDI1Q0MpIDwg MHgwOUM3IDB4MjVDQyAweDA5QkUgPikKICAgICAoIi4rIiA8IDB4MDlDQiA+KSkpCiAgICgoMHgw OUM3IDB4MDlENykKICAgIChjb25kCiAgICAgKChmb250LWZhY2lsaXR5IDB4MjVDQykgPCAweDA5 QzcgMHgyNUNDIDB4MDlENyA+KQogICAgICgiLisiIDwgMHgwOUNDID4pKSkKCiAgIDs7IENvbWJp bmluZyBtYXJrcyBhcmUgZGlzcGxheWVkIHdpdGggYSBET1RURUQgQ0lSQ0xFLgogICAoIm0iCiAg ICAoY29uZAogICAgICgoZm9udC1mYWNpbGl0eSAweDI1Q0MpIDwgPSAweDI1Q0MgPikKICAgICAo Ii4iIFsgPSBdKSkpCiAgICgiW25IYnBhQV0iCiAgICAoY29uZAogICAgICgoZm9udC1mYWNpbGl0 eSAweDI1Q0MpIDwgMHgyNUNDID0gPikKICAgICAoIi4iIFsgPSBdKSkpCiAgICgiSkhbQ1JdIgog ICAgKGNvbmQKICAgICAoKGZvbnQtZmFjaWxpdHkgMHgyNUNDKSA8IDB4MjVDQyA6b3RmPWJuZzI9 Ymx3Zixwc3RmKyA+KQogICAgICgiLisiIFsgOm90Zj1ibmcyPWJsd2YscHN0ZisgXSkpKQoKICAg KCIuIiA9KSkKICAqKSkKCjs7IFN0YWdlIDIKOzsgQmFzaWMgc2hhcGluZyBmb3JtcyBhbmQgbWF0 cmEgcmVvcmRlcmluZwooZ2VuZXJhdG9yCiAoMAogIChjb25kCiAgIDs7IEV4cGxpY2l0IGhhbGFu dCBmb3JtIHN0YXJ0aW5nIHdpdGggUkEgKyBIICsgWldKCiAgICgiIChSSEpbQ1JuSEpdKykoSE4/ YT9BPykgIgogICAgKDEgOm90Zj9ibmcyPWxvY2wsbnVrdCxha2huLGJsd2YscHN0ZispCiAgICB8 ICgxIGI0cG9zdCkgKDEgcG9zdCkgKDIgPSAqKSB8KQoKICAgOzsgRXhwbGljaXQgaGFsYW50IGZv cm0gc3RhcnRpbmcgd2l0aCBhIHJlcGgKICAgKCIgKFJIKShbQ1JuSEpdKykoSE4/YT9BPykgIgog ICAgKDIgOm90Zj9ibmcyPWxvY2wsbnVrdCxha2huLGJsd2YscHN0ZispCiAgICB8ICgxIDpvdGY9 Ym5nMj1ycGhmKykgKDIgYjRwb3N0KSAoMiBwb3N0KSAoMyA9ICopIHwpCgogICA7OyBPdGhlciBl eHBsaWNpdCBoYWxhbnQgZm9ybXMKICAgKCIgKFtDUm5ISl0rKShITj9hP0E/KSAiCiAgICAoMSA6 b3RmP2JuZzI9bG9jbCxudWt0LGFraG4sYmx3Zixwc3RmKykKICAgIHwgKDEgYjRwb3N0KSAoMSBw b3N0KSAoMiA9ICopIHwpCgogICA7OyBPcmRpbmFyeSBzeWxsYWJsZXMgc3RhcnRpbmcgd2l0aCBS QSArIEggKyBaV0oKICAgOzsgMSAgICAgICAgICAgICAyICAgICAzICAgICA0NQogICAoIiAoUkhK W0NSbkhKTl0qKShtbj8pPyhibj8pPygocG4/KT9hP0E/KSAiCiAgICA7OyAgICAgICAgICAgIHwK ICAgIDs7IFRoaXMgaXMgYW4gYXN0ZXJpc2suICAoU2VlIERFVjItT1RGLmZsdCkKICAgICgxIDpv dGY/Ym5nMj1sb2NsLG51a3QsYWtobixibHdmLHBzdGYrKQogICAgfCAoMiA9ICopICgxIGI0cG9z dCkgKDMgPSAqKSAoMSBwb3N0KSAoNCA9ICopIHwpCgogICA7OyBPcmRpbmFyeSBzeWxsYWJsZXMg c3RhcnRpbmcgd2l0aCBhIHJlcGgKICAgOzsgMSAgIDIgICAgICAgICAgIDMgICAgIDQgICAgIDU2 CiAgICgiIChSSCkoW0NSbkhKVk5dKykobW4/KT8oYm4/KT8oKHBuPyk/YT9BPykgIgogICAgKDIg Om90Zj9ibmcyPWxvY2wsbnVrdCxha2huLGJsd2YscHN0ZispCiAgICB8ICgzID0gKikgKDEgOm90 Zj1ibmcyPXJwaGYrKSAoMiBiNHBvc3QpICg0ID0gKikgKDIgcG9zdCkgKDUgPSAqKSB8KQoKICAg OzsgT3RoZXIgb3JkaW5hcnkgc3lsbGFibGVzCiAgIDs7IDEgICAgICAgICAgIDIgICAgIDMgICAg IDQ1CiAgICgiIChbQ1JuSEpWTl0rKShtbj8pPyhibj8pPygocG4/KT9hP0E/KSAiCiAgICAoMSA6 b3RmP2JuZzI9bG9jbCxudWt0LGFraG4sYmx3Zixwc3RmKykKICAgIHwgKDIgPSAqKSAoMSBiNHBv c3QpICgzID0gKikgKDEgcG9zdCkgKDQgPSAqKSB8KQoKICAgKCIuIiA9KSkKICAqKQoKIChiNHBv c3QKICAoY29uZAogICA7OzEgICAgICAgICAgICAgICAgIDIzICAgICAgIDQKICAgKCIoW0NSbkhK UF0qW0NSVl1uPykoKEo/UFApKykoW05KXSk/JCIKICAgICgxIDpvdGY9Ym5nMj1sb2NsLG51a3Qs YWtobixibHdmLGhhbGYsdmF0dSxjamN0KykgKDQgPSkpCiAgICgiLisiCiAgICAoMCA6b3RmPWJu ZzI9bG9jbCxudWt0LGFraG4sYmx3ZixoYWxmLHZhdHUsY2pjdCspICg0ID0pKSkpCgogKHBvc3QK ICAoY29uZAogICAoIltDUm5ISlBdKltDUlZdbj8oKEo/UFApKykoW05KXSk/JCIKICAgICgxIDpv dGY9Ym5nMj1wc3RmKykpKSkKICkKCjs7IFN0YWdlIDMKOzsgRmluYWwgcmVvcmRlcmluZyAjMSAo TW92ZSBwcmUtYmFzZSBtYXRyYSBhZnRlciB0aGUgbGFzdCBoYWxhbnQpCihnZW5lcmF0b3IKICgw CiAgKGNvbmQKICAgOzsgMSAgICAyICAgICAgICAgMwogICAoIiAobW4/KShbXiBdK0hKPykoW15I IF0rKSAiCiAgICB8ICgyID0gKikgKDEgPSAqKSAoMyA9ICopIHwpCgogICAoIi4iID0pKQogICop KQoKOzsgU3RhZ2UgNAo7OyBGaW5hbCByZW9yZGVyaW5nICMyIChNb3ZlIHJlcGggYWZ0ZXIgdGhl IGZpcnN0IGhhbGFudCkKKGdlbmVyYXRvcgogKDAKICAoY29uZAogICA7OyBTeWxsYWJsZXMgd2l0 aCBhIHJlcGggYW5kIGFuIGV4cGxpY2l0IGhhbGFudAogICA7OyAxICAgICAyICAzICAgICAgICAg ICA0CiAgICgiIChtbj8pPyhyKShbXkhQIF0rSEo/KShbXiBdKikgIgogICAgfCAoMSA9ICopICgz ID0gKikgKDIgPSkgKDQgPSAqKSB8KQoKICAgOzsgQSByZXBoIHdpdGhvdXQgZXhwbGljaXQgaGFs YW50CiAgIDs7IDEgICAgIDIgIDMgICAgICAgICAgNAogICAoIiAobW4/KT8ocikoW15QcGFBIF0r KShQKkg/cD9uP2E/QT8pICIKICAgIHwgKDEgPSAqKSAoMyA9ICopICgyID0pICg0ID0gKikgfCkK CiAgICgiLiIgPSkpCiAgKikpCgo7OyBTdGFnZSA1Cjs7IE51a3RhIGZvciBtYXRyYSBhbmQgUHJl c2VudGF0aW9uIGZvcm1zCihnZW5lcmF0b3IKICgwCiAgKGNvbmQKICAgKCIgKG1uPyk/KFteIF0r KSAiCiAgICB8ICgxIDpvdGY9Ym5nMj1udWt0LGluaXQrKQogICAgKDIgOm90Zj1ibmcyPW51a3Qs cHJlcyxhYnZzLGJsd3MscHN0cyxoYWxuLGNhbHQrKSB8KQoKICAgKCIuIiA9KSkKICAqKSkKCjs7 IFN0YWdlIDYKOzsgUmVtb3ZlIFpXTkovWldKCihnZW5lcmF0b3IKICgwCiAgKGNvbmQKICAgKCIo IC4rICkoW05KXSkkIgogICAgKDEgPSAqKSAoMiA8ID0gPiApKQoKICAgKCJbTkpdIikKCiAgICgi LiIgPSkpCiAgKikpCgo7OyBTdGFnZSA3Cjs7IEdQT1MgcHJvY2Vzc2luZwooZ2VuZXJhdG9yCiAo MAogIChjb25kCiAgICgiIChbXiBdKykgIgogICAgKDEgOm90Zj1ibmcyPStrZXJuLGRpc3QsYWJ2 bSxibHdtKSkKCiAgICgiLiIgPSkpCiAgKikpCgo7OyBDb3B5cmlnaHQgKEMpIDIwMTAKOzsgICBO YXRpb25hbCBJbnN0aXR1dGUgb2YgQWR2YW5jZWQgSW5kdXN0cmlhbCBTY2llbmNlIGFuZCBUZWNo bm9sb2d5IChBSVNUKQo7OyAgIFJlZ2lzdHJhdGlvbiBOdW1iZXIgSDE1UFJPMTEyCgo7OyBUaGlz IGZpbGUgaXMgcGFydCBvZiB0aGUgbTE3biBkYXRhYmFzZTsgYSBzdWItcGFydCBvZiB0aGUgbTE3 bgo7OyBsaWJyYXJ5LgoKOzsgVGhlIG0xN24gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCjs7IGFzIHB1Ymxpc2hlZCBi eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKOzsg dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgo7OyBU aGUgbTE3biBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCjs7IExlc3NlciBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCjs7IExpY2Vuc2UgYWxvbmcgd2l0 aCB0aGUgbTE3biBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCjs7IFNvZnR3YXJl IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCjs7IEJv c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgoKOzsgTG9jYWwgVmFyaWFibGVzOgo7OyBtb2RlOiBl bWFjcy1saXNwCjs7IEVuZDoK --=-=-=--