From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: ozzloy Newsgroups: gmane.emacs.bugs Subject: bug#63941: [PATCH] ; always CRLF before non-first boundary in multipart form Date: Fri, 21 Jul 2023 02:04:27 -0700 Message-ID: References: <837csf4fp8.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000518c940600fb8eac" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="35406"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 63941@debbugs.gnu.org, Eli Zaretskii To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Jul 21 11:05:20 2023 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 1qMm4c-0008zn-VN for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 21 Jul 2023 11:05:19 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qMm4O-0000cr-E6; Fri, 21 Jul 2023 05:05:04 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qMm4M-0000cM-OV for bug-gnu-emacs@gnu.org; Fri, 21 Jul 2023 05:05:02 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qMm4M-0005Ca-F9 for bug-gnu-emacs@gnu.org; Fri, 21 Jul 2023 05:05:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qMm4L-0007zn-Tn for bug-gnu-emacs@gnu.org; Fri, 21 Jul 2023 05:05:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: ozzloy Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 21 Jul 2023 09:05:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 63941 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 63941-submit@debbugs.gnu.org id=B63941.168993029730720 (code B ref 63941); Fri, 21 Jul 2023 09:05:01 +0000 Original-Received: (at 63941) by debbugs.gnu.org; 21 Jul 2023 09:04:57 +0000 Original-Received: from localhost ([127.0.0.1]:60546 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qMm4F-0007zP-4L for submit@debbugs.gnu.org; Fri, 21 Jul 2023 05:04:56 -0400 Original-Received: from mail-ot1-x32a.google.com ([2607:f8b0:4864:20::32a]:52606) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qMm4A-0007z8-Ni for 63941@debbugs.gnu.org; Fri, 21 Jul 2023 05:04:54 -0400 Original-Received: by mail-ot1-x32a.google.com with SMTP id 46e09a7af769-6b9af1826b6so1423026a34.1 for <63941@debbugs.gnu.org>; Fri, 21 Jul 2023 02:04:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689930285; x=1690535085; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=rkERSSPZ+hZPK8Zv9ozKK1NOf2gcgJ9rei18ztjZ/O0=; b=f95+C+ItTRGutNba+ufNRcCHYDZFqMnM9kVLI22ptem3DzPaU3yK7rK5KkSRXWpWAA oX2pmp16cIQEmHyS9XxK1sR1MTfF331wijdgYmqs+eNsAw/Hk0atBnrESxnjowbagOw3 oDZvz+WJpCOdx2PfkQoGcLTUZU3fSexC/0ij+P9zr4nPJXeta0jQU82QY3sf4QpWTx3v AC9kp0CoVvXPvZYXOThy0OXOMoktmuIhjzTfw5fuvwjaa4+oMbsJjjQ0GFjgMnWbPiqW qF3TcyOK7Gfm7D5l/XUWNHHMlWKjecj/7SEXexdlwgc/q/f+DQEYzXVS6Ag5RqnvMGQC UoQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689930285; x=1690535085; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=rkERSSPZ+hZPK8Zv9ozKK1NOf2gcgJ9rei18ztjZ/O0=; b=jxvKOk3qDoLQXKH9oYVNdpE5Rly9Q0LM70JGrCt+VkIyZoQZIKdNYpmuCSoZ99naZ3 WqS1ZKd0708jEWqT62ZT/d5QQzhdGj0ZISlZYflijAQhQ5DbRKlF3G6zWFYBH1KClgXs DBJ/EEwrKXjWBRE4csVJ/9wlECSOO+1eXH1HfuqDT07L731UjSCHGh0n3vjaeI3oYFQ+ uIL/V7isXkMvuGfbSzsJNATotS5lMriqcdRKhaFsjt49IxJOT4i27V+eD/gBx9wfvBK7 ZWfwVXeJRrmj4DfhU2EgVvi0npKUjQ7c3JxWZZEJ/jo+Mb+oDA/4qMyMZ9kf9Z2YM6d4 FJxg== X-Gm-Message-State: ABy/qLZc4pRVPKxMb/JrsDAB1IhNi/XLkN3B4bbnnJ6xQFVOUk9UEbGZ /r0bbJTDvcVSToCe7vclQ8JonAaEMaVXg80Ot3g= X-Google-Smtp-Source: APBJJlFtQIfMAAk4IthgkFQv+deSHsvKWg9HlWeR3wL/eE8WZpJShccUGrtt6A6YHddk06LlSQYhq73Se+JVPjTMRnc= X-Received: by 2002:a05:6870:b487:b0:1b7:2931:1088 with SMTP id y7-20020a056870b48700b001b729311088mr1676371oap.33.1689930284757; Fri, 21 Jul 2023 02:04:44 -0700 (PDT) In-Reply-To: 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-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:265665 Archived-At: --000000000000518c940600fb8eac Content-Type: multipart/alternative; boundary="000000000000518c920600fb8eaa" --000000000000518c920600fb8eaa Content-Type: text/plain; charset="UTF-8" Thanks so much for taking the time to review this! > I'd rather not completely replace the old with a brand new code > because that makes it hard for me to see what's really changed. I thought this would be ok, since the existing version is a complete rewrite of the original (so there's precedent for complete rewrite of a function in a commit to fix a bug), and if there were tests showing the behavior to be the same as before, except where this bug is fixed. (Though I see the tests are currently broken). Based on your feedback, and some help from #emacs, I made a patch that is very minimal to the existing code, with better commit message, and attached it here. The patch removes the =(unless (bolp) ...)= guarding inserting CRLF. The RFC says the "boundary delimiter MUST occur at the beginning of a line, i.e., following a CRLF". =(bolp)= is not enough to guarantee the boundary is preceded by CRLF. It can be true when the point is after just "\n". Because CRLF is inserted unconditionally after the =cond=, the code does not include the boundary's CRLF in each branch of the =cond=. > when `filedata` is an empty string, this add an additional \r\n > compared to the current code. This seems right to me Me too, and all the other clients I tested. > I expect the decoding software will skip the \r\n at the of the > header and then look for \r\n, so it's important to have > two \r\n What you said is true. In addition, they also accept "HEADER\r\nfile content\n--BOUNDARY" as the content "file content", and consider the last "\n" as attached to the boundary. That's where the file's final "\n" gets lost if the file's content was initially "file content\n". > There remain some questions on this patch: While fixing this bug, I found a few more problems in addition to the two that you mention here. I was not addressing them yet, since I thought I should fix one bug per patch. > I suspect we can also simply this code by moving the first (insert > "--" boundary "\r\n") before the loop, and the second into the loop > so we can make it insert "\r\n--" boundary "\r\n" (and thus remove > \r\n from the end of each of the preceding branches). Almost, but not quite, or at least not without some awkward (to my eye) repositioning of inserting boundaries, "--", and "\r\n". The final boundary complicates things. It is different from all the others, it is "--BOUNDARY--" instead of "--BOUNDARY" Here's what I ended up with when I tried that, https://git.sr.ht/~ozzloy/emacs-bug-63941/tree/simplify-insert-boundaries-and---/item/mm-url.el#L397 This passes the tests in =emacs/tests/lisp/gnus/mm-url-tests.el=. --000000000000518c920600fb8eaa Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thanks so much for taking the time to rev= iew this!

> I'd rather not completely replace the old with a = brand new code
> because that makes it hard for me to see what's = really changed.

I thou= ght this would be ok, since the existing version is a complete
rewrite o= f the original (so there's precedent for complete rewrite of
a funct= ion in a commit to fix a bug), and if there were tests showing
the behav= ior to be the same as before, except where this bug is
fixed. (Though I = see the tests are currently broken).

Based on you= r feedback, and some help from #emacs, I made a patch
that is very minim= al to the existing code, with better commit
message, and attached it her= e.

The patch removes the =3D(unless (bolp) ...)=3D guarding insertin= g CRLF.
The RFC says the "boundary delimiter MUST occur at the begi= nning of a
line, i.e., following a CRLF". =C2=A0=3D(bolp)=3D is not= enough to guarantee
the boundary is preceded by CRLF.=C2=A0 It can be t= rue when the point
is after just "\n".

Because CRLF is = inserted unconditionally after the =3Dcond=3D, the code
does not include= the boundary's CRLF in each branch of the =3Dcond=3D.

> when= `filedata` is an empty string, this add an additional \r\n
> compare= d to the current code.=C2=A0 This seems right to me

Me too, and all = the other clients I tested.

> I expect the decoding software will= skip the \r\n at the of the
> header and then look for \r\n<BOUND= ARY>, so it's important to have
> two \r\n

=C2=A0What y= ou said is true.=C2=A0 In addition, they also accept

"HEADER\r\= nfile content\n--BOUNDARY"

as the content "file content&qu= ot;, and consider the last "\n" as attached
to the boundary.= =C2=A0 That's where the file's final "\n" gets lost if th= e
file's content was initially "file content\n".

&g= t; There remain some questions on this patch:

While fixing this bug,= I found a few more problems in addition to the
two that you mention her= e.=C2=A0 I was not addressing them yet, since I
thought I should fix one= bug per patch.

> I suspect we can also simply this code by movin= g the first (insert
> "--" boundary "\r\n") befor= e the loop, and the second into the loop
> so we can make it insert &= quot;\r\n--" boundary "\r\n" (and thus remove
> \r\n f= rom the end of each of the preceding branches).

Almost, but not quit= e, or at least not without some awkward (to my
eye) repositioning of ins= erting boundaries, "--", and "\r\n".=C2=A0 The
final= boundary complicates things.=C2=A0 It is different from all the
others,= it is "--BOUNDARY--" instead of "--BOUNDARY"

He= re's what I ended up with when I tried that,

https://git.sr.ht/~ozzloy/emacs-bug-63941/tree/simplify-= insert-boundaries-and---/item/mm-url.el#L397

This passes the tes= ts in =3Demacs/tests/lisp/gnus/mm-url-tests.el=3D.


--000000000000518c920600fb8eaa-- --000000000000518c940600fb8eac Content-Type: text/x-patch; charset="US-ASCII"; name="0001-allow-uploading-files-ending-in-newline-via-EWW.patch" Content-Disposition: attachment; filename="0001-allow-uploading-files-ending-in-newline-via-EWW.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lkc8xxb00 RnJvbSBiM2UyZjA3MzY3YzZlOTgzNmIzYTc2MzViODYzMzViZjcxMDRiMmI5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgV2F0c29uIDxvenpsb3lAZ21haWwuY29tPgpEYXRl OiBGcmksIDIxIEp1bCAyMDIzIDAwOjAzOjA2IC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gOyBhbGxv dyB1cGxvYWRpbmcgZmlsZXMgZW5kaW5nIGluIG5ld2xpbmUgdmlhIEVXVwoKOyBFbnN1cmUgdGhh dCBldmVyeSBib3VuZGFyeSBpbiBIVFRQIG1lc3NhZ2UgaXMgcHJlY2VkZWQgYnkgIlxyXG4iLgo7 IEFjY29yZGluZyB0byBSRkMgMjA0Niwgc2VjdGlvbiA1LCB0aGUgIlxyXG4iIHByZWNlZGluZyB0 aGUgYm91bmRhcnkKOyBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwcmVjZWRpbmcgY29u dGVudCwgYW5kIGlzIGluc3RlYWQKOyBhdHRhY2hlZCB0byB0aGUgYm91bmRhcnkgdGhhdCBmb2xs b3dzIGl0Lgo7CjsgQ29uc2lkZXIgYSBmaWxlIG5hbWVkICIxbmwiLCBjb25zaXN0aW5nIG9ubHkg b2YgdGhlIHNpbmdsZSBjaGFyYWN0ZXIKOyAnXG4nLgo7CjsgVGhlIG9sZCB2ZXJzaW9uIG9mID1t bS11cmwtZW5jb2RlLW11bHRpcGFydC1mb3JtLWRhdGE9IGNyZWF0ZXMgdGhlCjsgZm9sbG93aW5n IEhUVFAgbWVzc2FnZToKOwo7ICAgKGNvbmNhdAo7ICAgICItLUJPVU5EQVJZXHJcbiIKOyAgICAi Q29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiYVwiOyBmaWxlbmFtZT1cIjFu bFwiXHJcbiIKOyAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbiIKOyAg ICAiQ29udGVudC1UeXBlOiBjXHJcbiIKOyAgICAiXHJcbiIKOwo7ICAgIDs7IGZpbGUgY29udGVu dAo7ICAgICJcbiIKOwo7ICAgIDs7IE5PVEUgIlxyXG4iIGlzIGFic2VudCBiZWZvcmUgdGhlIGZv bGxvd2luZyBib3VuZGFyeQo7ICAgICItLUJPVU5EQVJZLS1cclxuIikKOwo7IHRoZSBuZXcgdmVy c2lvbiBvZiA9bW0tdXJsLWVuY29kZS1tdWx0aXBhcnQtZm9ybS1kYXRhPSBjcmVhdGVzIHRoaXMK OyBIVFRQIG1lc3NhZ2U6CjsKOyAgIChjb25jYXQKOyAgICAiLS1CT1VOREFSWVxyXG4iCjsgICAg IkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImFcIjsgZmlsZW5hbWU9XCIx bmxcIlxyXG4iCjsgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG4iCjsg ICAgIkNvbnRlbnQtVHlwZTogY1xyXG4iCjsgICAgIlxyXG4iCjsKOyAgICA7OyBmaWxlIGNvbnRl bnQKOyAgICAiXG4iCjsKOyAgICA7OyBOT1RFICJcclxuIiBwcmVjZWRlcyB0aGUgYm91bmRhcnkK OyAgICAiXHJcbiIKOyAgICAiLS1CT1VOREFSWS0tXHJcbiIpCjsKOyBUaGUgbmV3IGNvZGUgZW5z dXJlcyBhbGwgYm91bmRhcmllcyBhZnRlciB0aGUgb25lIGF0IHRoZSB2ZXJ5CjsgYmVnaW5uaW5n IGFyZSBwcmVjZWRlZCBieSAiXHJcbiIsIHdoZXRoZXIgdGhleSBhcmUgdGhlIGZpbmFsLCBvcgo7 IG90aGVyIGludGVybmFsIGJvdW5kYXJpZXMuCi0tLQogbGlzcC9nbnVzL21tLXVybC5lbCAgICAg ICAgICAgIHwgICA1ICstCiB0ZXN0L2xpc3AvZ251cy9tbS11cmwtdGVzdHMuZWwgfCAxNjAgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDE2MiBpbnNl cnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3QvbGlzcC9n bnVzL21tLXVybC10ZXN0cy5lbAoKZGlmZiAtLWdpdCBhL2xpc3AvZ251cy9tbS11cmwuZWwgYi9s aXNwL2dudXMvbW0tdXJsLmVsCmluZGV4IDExODQ3YTc5ZjE3Li41YjY4YjI1ZWMyZSAxMDA2NDQK LS0tIGEvbGlzcC9nbnVzL21tLXVybC5lbAorKysgYi9saXNwL2dudXMvbW0tdXJsLmVsCkBAIC00 MzMsMTMgKzQzMywxMiBAQCBtbS11cmwtZW5jb2RlLW11bHRpcGFydC1mb3JtLWRhdGEKIAkgICAg ICAoaW5zZXJ0IChudW1iZXItdG8tc3RyaW5nIGZpbGVkYXRhKSkpKSkpCiAJICgoZXF1YWwgbmFt ZSAic3VibWl0IikKIAkgIChpbnNlcnQKLQkgICAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1k YXRhOyBuYW1lPVwic3VibWl0XCJcclxuXHJcblN1Ym1pdFxyXG4iKSkKKwkgICAiQ29udGVudC1E aXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic3VibWl0XCJcclxuXHJcblN1Ym1pdCIpKQog CSAodAogCSAgKGluc2VydCAoZm9ybWF0ICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7 IG5hbWU9JVNcclxuXHJcbiIKIAkJCSAgbmFtZSkpCiAJICAoaW5zZXJ0IHZhbHVlKSkpCi0JKHVu bGVzcyAoYm9scCkKLQkgIChpbnNlcnQgIlxyXG4iKSkpKQorCShpbnNlcnQgIlxyXG4iKSkpCiAg ICAgKGluc2VydCAiLS0iIGJvdW5kYXJ5ICItLVxyXG4iKQogICAgIChidWZmZXItc3RyaW5nKSkp CiAKZGlmZiAtLWdpdCBhL3Rlc3QvbGlzcC9nbnVzL21tLXVybC10ZXN0cy5lbCBiL3Rlc3QvbGlz cC9nbnVzL21tLXVybC10ZXN0cy5lbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uN2I4ZDQ1YjYwNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpc3AvZ251cy9tbS11 cmwtdGVzdHMuZWwKQEAgLTAsMCArMSwxNjAgQEAKKzs7OyBtbS11cmwtdGVzdHMuZWwgLS0tICAt Ki0gbGV4aWNhbC1iaW5kaW5nOnQgLSotCisKKzs7IENvcHlyaWdodCAoQykgMjAyMS0yMDIzIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCis7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBH TlUgRW1hY3MuCisKKzs7IEdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKzs7 IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKzs7IEdOVSBFbWFjcyBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK Kzs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKKzs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CisKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCis7OyBhbG9uZyB3aXRoIEdOVSBFbWFjcy4gIElmIG5vdCwgc2VlIDxo dHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKzs7OyBDb21tZW50YXJ5OgorCis7Ozsg Q29kZToKKworKHJlcXVpcmUgJ2VydCkKKyhyZXF1aXJlICdtbS11cmwpCisKKworKGVydC1kZWZ0 ZXN0IHRlc3QtbW0tdXJsLWVuY29kZS1tdWx0aXBhcnQtZm9ybS1kYXRhOm5pbCAoKQorICAoc2hv dWxkCisgICAoc3RyaW5nPQorICAgIChtbS11cmwtZW5jb2RlLW11bHRpcGFydC1mb3JtLWRhdGEg JygpICJCT1VOREFSWSIpCisgICAgIi0tQk9VTkRBUlktLVxyXG4iKSkpCisKKyhlcnQtZGVmdGVz dCB0ZXN0LW1tLXVybC1lbmNvZGUtbXVsdGlwYXJ0LWZvcm0tZGF0YTpuYW1lLXZhbHVlICgpCisg IChzaG91bGQKKyAgIChzdHJpbmc9CisgICAgKG1tLXVybC1lbmNvZGUtbXVsdGlwYXJ0LWZvcm0t ZGF0YQorICAgICAnKCgia2V5IiAuICJ2YWx1ZSIpKSAiQk9VTkRBUlkiKQorICAgIChjb25jYXQg Ii0tQk9VTkRBUllcclxuIgorCSAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBu YW1lPVwia2V5XCJcclxuIgorCSAgICAiXHJcbiIKKwkgICAgInZhbHVlXHJcbiIKKwkgICAgIi0t Qk9VTkRBUlktLVxyXG4iKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC1tbS11cmwtZW5jb2RlLW11 bHRpcGFydC1mb3JtLWRhdGE6c3VibWl0ICgpCisgIChzaG91bGQKKyAgIChzdHJpbmc9CisgICAg KG1tLXVybC1lbmNvZGUtbXVsdGlwYXJ0LWZvcm0tZGF0YSAnKCgic3VibWl0IikpICJCT1VOREFS WSIpCisgICAgKGNvbmNhdCAiLS1CT1VOREFSWVxyXG4iCisJICAgICJDb250ZW50LURpc3Bvc2l0 aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJzdWJtaXRcIlxyXG4iCisJICAgICJcclxuIgorCSAgICAi U3VibWl0XHJcbiIKKwkgICAgIi0tQk9VTkRBUlktLVxyXG4iKSkpKQorCisoZXJ0LWRlZnRlc3Qg dGVzdC1tbS11cmwtZW5jb2RlLW11bHRpcGFydC1mb3JtLWRhdGE6ZmlsZSAoKQorICAoc2hvdWxk CisgICAoc3RyaW5nPQorICAgIChtbS11cmwtZW5jb2RlLW11bHRpcGFydC1mb3JtLWRhdGEKKyAg ICAgJygoImZpbGUiIC4gKCgibmFtZSIgICAgICAgICAuICJhIikKKwkJICAoImZpbGVuYW1lIiAg ICAgLiAiYiIpCisJCSAgKCJjb250ZW50LXR5cGUiIC4gImMiKQorCQkgICgiZmlsZWRhdGEiICAg ICAuICJkXG4iKSkpKQorICAgICAiQk9VTkRBUlkiKQorCisgICAgKGNvbmNhdAorICAgICAiLS1C T1VOREFSWVxyXG4iCisgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9 XCJhXCI7IGZpbGVuYW1lPVwiYlwiXHJcbiIKKyAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rp bmc6IGJpbmFyeVxyXG4iCisgICAgICJDb250ZW50LVR5cGU6IGNcclxuIgorICAgICAiXHJcbiIK KworICAgICA7OyBmaWxlIGNvbnRlbnQKKyAgICAgImRcbiIKKworICAgICA7OyByZmMgMjA0NiBz ZWN0aW9uIDUKKyAgICAgOzsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzIwNDYj c2VjdGlvbi01CisgICAgIDs7ICJUaGUgYm91bmRhcnkgZGVsaW1pdGVyIE1VU1Qgb2NjdXIgYXQg dGhlIGJlZ2lubmluZyBvZiBhCisgICAgIDs7IGxpbmUsIGkuZS4sIGZvbGxvd2luZyBhIENSTEYs IGFuZCB0aGUgaW5pdGlhbCBDUkxGIGlzCisgICAgIDs7IGNvbnNpZGVyZWQgdG8gYmUgYXR0YWNo ZWQgdG8gdGhlIGJvdW5kYXJ5IGRlbGltaXRlciBsaW5lCisgICAgIDs7IHJhdGhlciB0aGFuIHBh cnQgb2YgdGhlIHByZWNlZGluZyBwYXJ0LiIKKyAgICAgIlxyXG4iCisKKyAgICAgIi0tQk9VTkRB UlktLVxyXG4iKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC1tbS11cmwtZW5jb2RlLW11bHRpcGFy dC1mb3JtLWRhdGEtLWFsbC1wYXJ0cyAoKQorICAoc2hvdWxkCisgICAoc3RyaW5nPQorICAgICht bS11cmwtZW5jb2RlLW11bHRpcGFydC1mb3JtLWRhdGEKKyAgICAgJygoIm5hbWUiIC4gInZhbHVl IikKKyAgICAgICAoInN1Ym1pdCIpCisgICAgICAgKCJmaWxlIiAuICgoIm5hbWUiICAgICAgICAg LiAiYSIpCisJCSAgKCJmaWxlbmFtZSIgICAgIC4gImIiKQorCQkgICgiY29udGVudC10eXBlIiAu ICJjIikKKwkJICAoImZpbGVkYXRhIiAgICAgLiAiZCIpKSkpCisgICAgICJCT1VOREFSWSIpCisg ICAgKGNvbmNhdAorICAgICAiLS1CT1VOREFSWVxyXG4iCisgICAgICJDb250ZW50LURpc3Bvc2l0 aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJuYW1lXCJcclxuIgorICAgICAiXHJcbiIKKyAgICAgInZh bHVlXHJcbiIKKyAgICAgIi0tQk9VTkRBUllcclxuIgorICAgICAiQ29udGVudC1EaXNwb3NpdGlv bjogZm9ybS1kYXRhOyBuYW1lPVwic3VibWl0XCJcclxuIgorICAgICAiXHJcbiIKKyAgICAgIlN1 Ym1pdFxyXG4iCisgICAgICItLUJPVU5EQVJZXHJcbiIKKyAgICAgIkNvbnRlbnQtRGlzcG9zaXRp b246IGZvcm0tZGF0YTsgbmFtZT1cImFcIjsgZmlsZW5hbWU9XCJiXCJcclxuIgorICAgICAiQ29u dGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbiIKKyAgICAgIkNvbnRlbnQtVHlwZTog Y1xyXG4iCisgICAgICJcclxuIgorCisgICAgIDs7IGZpbGUgY29udGVudAorICAgICAiZCIKKwor ICAgICA7OyByZmMgMjA0NiBzZWN0aW9uIDUKKyAgICAgOzsgdGhlIFxyXG4gaXMgYXR0YWNoZWQg dG8gdGhlIGJvdW5kYXJ5IGJlbG93IGl0CisgICAgICJcclxuIgorICAgICAiLS1CT1VOREFSWS0t XHJcbiIpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LW1tLXVybC1lbmNvZGUtbXVsdGlwYXJ0LWZv cm0tZGF0YS10d28tZmlsZXMgKCkKKyAgKHNob3VsZAorICAgKHN0cmluZz0KKyAgICAobW0tdXJs LWVuY29kZS1tdWx0aXBhcnQtZm9ybS1kYXRhCisgICAgICcoKCJmaWxlIiAuICgoIm5hbWUiICAg ICAgICAgLiAiYSIpCisJCSAgKCJmaWxlbmFtZSIgICAgIC4gImIiKQorCQkgICgiY29udGVudC10 eXBlIiAuICJjIikKKwkJICAoImZpbGVkYXRhIiAgICAgLiAiZFxuIikpKQorICAgICAgICgiZmls ZSIgLiAoKCJuYW1lIiAgICAgICAgIC4gImUiKQorCQkgICgiZmlsZW5hbWUiICAgICAuICJmIikK KwkJICAoImNvbnRlbnQtdHlwZSIgLiAiZyIpCisJCSAgKCJmaWxlZGF0YSIgICAgIC4gImhcbiIp KSkpCisgICAgICJCT1VOREFSWSIpCisgICAgKGNvbmNhdAorICAgICAiLS1CT1VOREFSWVxyXG4i CisgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJhXCI7IGZpbGVu YW1lPVwiYlwiXHJcbiIKKyAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxy XG4iCisgICAgICJDb250ZW50LVR5cGU6IGNcclxuIgorICAgICAiXHJcbiIKKworICAgICA7OyBm aWxlIGNvbnRlbnQKKyAgICAgImRcbiIKKworICAgICA7OyByZmMyMDQ2IHNlY3Rpb24gNQorICAg ICA7OyB0aGUgXHJcbiBpcyBhdHRhY2hlZCB0byB0aGUgYm91bmRhcnkgYmVsb3cgaXQKKyAgICAg IlxyXG4iCisgICAgICItLUJPVU5EQVJZXHJcbiIKKyAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246 IGZvcm0tZGF0YTsgbmFtZT1cImVcIjsgZmlsZW5hbWU9XCJmXCJcclxuIgorICAgICAiQ29udGVu dC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbiIKKyAgICAgIkNvbnRlbnQtVHlwZTogZ1xy XG4iCisgICAgICJcclxuIgorCisgICAgIDs7IGZpbGUgY29udGVudAorICAgICAiaFxuIgorCisg ICAgIDs7IHJmYyAyMDQ2IHNlY3Rpb24gNQorICAgICA7OyB0aGUgXHJcbiBpcyBhdHRhY2hlZCB0 byB0aGUgYm91bmRhcnkgYmVsb3cgaXQKKyAgICAgIlxyXG4iCisgICAgICItLUJPVU5EQVJZLS1c clxuIikpKSkKKworCis7OzsgbW0tdXJsLXRlc3RzLmVsIGVuZHMgaGVyZQotLSAKMi4zOS4yCgo= --000000000000518c940600fb8eac--