From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7166 invoked by alias); 8 Apr 2013 07:20:21 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 7155 invoked by uid 89); 8 Apr 2013 07:20:20 -0000 X-Spam-SWARE-Status: No, score=-4.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_DB,TW_FW autolearn=ham version=3.3.1 Received: from mail-bk0-f52.google.com (HELO mail-bk0-f52.google.com) (209.85.214.52) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Mon, 08 Apr 2013 07:20:17 +0000 Received: by mail-bk0-f52.google.com with SMTP id it16so2878161bkc.39 for ; Mon, 08 Apr 2013 00:20:14 -0700 (PDT) X-Received: by 10.205.39.194 with SMTP id tn2mr10476428bkb.80.1365405614760; Mon, 08 Apr 2013 00:20:14 -0700 (PDT) MIME-Version: 1.0 Received: by 10.204.201.3 with HTTP; Mon, 8 Apr 2013 00:19:34 -0700 (PDT) In-Reply-To: References: <514BF736.3070706@mentor.com> <514C3C85.4000704@codesourcery.com> <514EEBFF.8090705@redhat.com> <5154378D.60302@redhat.com> <515B1DF7.3090705@redhat.com> <515EF6A3.2080704@redhat.com> From: Hui Zhu Date: Mon, 08 Apr 2013 14:35:00 -0000 Message-ID: Subject: Re: [PATCH] Fix dprintf work not right if it is pending To: Pedro Alves Cc: Keith Seitz , Hui Zhu , gdb-patches ml Content-Type: multipart/mixed; boundary=bcaec52befb7a4a97d04d9d44494 X-Virus-Found: No X-SW-Source: 2013-04/txt/msg00178.txt.bz2 --bcaec52befb7a4a97d04d9d44494 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 7733 Hi, I removed "#include " from test code dprintf-pendshr.c and dprintf-pending.c according to the remind from Yao in IRC. The attachments is the new version. Thanks, Hui On Sun, Apr 7, 2013 at 10:27 PM, Hui Zhu wrote: > Hi Pedro, > > Thanks for your help. > > On Sat, Apr 6, 2013 at 12:06 AM, Pedro Alves wrote: >> Hello, >> >> Thanks for the help Keith. Much appreciated. >> >> On 04/02/2013 07:05 PM, Keith Seitz wrote: >>> On 03/29/2013 12:42 AM, Hui Zhu wrote: >>> >>>>>> + breakpoint_re_set_default (b); >>>>>> + >>>>>> + if (b->extra_string != NULL) >>>>>> + update_dprintf_command_list (b); >> >> You shouldn't be able to create a dprintf without an >> extra string, right? But, we can't get to the extra string >> until the breakpoint's location is pending, so we couldn't >> check when the breakpoint was created. >> >> $ ./gdb -q -nx >> (gdb) dprintf pendfunc >> No symbol table is loaded. Use the "file" command. >> Make dprintf pending on future shared library load? (y or [n]) y >> Dprintf 1 (pendfunc) pending. >> (gdb) info breakpoints >> Num Type Disp Enb Address What >> 1 dprintf keep y pendfunc >> (gdb) >> >> Ok, now let's load symbols. >> >> (gdb) file ./testsuite/gdb.base/dprintf-pending >> Reading symbols from /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.base/dprintf-pending...done. >> >> and: >> >> (gdb) info breakpoints >> Num Type Disp Enb Address What >> 1 dprintf keep y 0x0000000000400560 >> >> the location resolved. But, notice no commands attached... >> >> (gdb) start >> Temporary breakpoint 2 at 0x400690: file ../../../src/gdb/testsuite/gdb.base/dprintf-pending.c, line 26. >> Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.base/dprintf-pending >> Temporary breakpoint 2, main () at ../../../src/gdb/testsuite/gdb.base/dprintf-pending.c:26 >> 26 pendfunc (3); /* break main here */ >> (gdb) n >> (gdb) info breakpoints >> Num Type Disp Enb Address What >> 1 dprintf keep y 0x00007ffff7dfc69d in pendfunc at ../../../src/gdb/testsuite/gdb.base/dprintf-pendshr.c:27 >> breakpoint already hit 1 time >> (gdb) >> >> I think we want this: >> >> static void >> dprintf_re_set (struct breakpoint *b) >> { >> breakpoint_re_set_default (b); >> >> /* This breakpoint could have been pending, and be resolved now, and >> if so, we should now have the extra string. If we don't, the >> dprintf was malformed when created, but we couldn't tell because >> we can't extract the extra string until the location is >> resolved. */ >> if (b->loc != NULL && b->extra_string == NULL) >> error (_("Format string required")); >> >> if (b->extra_string != NULL) >> update_dprintf_command_list (b); >> } >> >> Please add a test for this. > > Fixed and updated test for it. > >> >>>>>> +} >>>>>> + >>>>> >>>>> >>>>> This will update the command list every time breakpoints are reset and could >>>>> be limited to only those needing updating. Is there perhaps a reason to >>>>> always do this? >> >> You mean, only update the command list if there isn't one before >> (because the breakpoint was pending before) ? >> >>>> >>>> I think it need, because it need to generate different commands with >>>> different status for example: >>>> if (target_can_run_breakpoint_commands ()) >>>> printf_line = xstrprintf ("agent-printf %s", dprintf_args); >>>> >>> >>> I'm not understanding this example. How is this likely to change whenever breakpoints are reset? Is there perhaps a way to add a test to demonstrate this requirement? >> >> I think what he's saying is, even independently of issues with >> pending dprintf breakpoints, if you, in the same gdb run: >> >> 1 - connect to target 1, that can run breakpoint commands. >> 2 - create a dprintf, which resolves fine. >> 3 - disconnect from target 2 >> 4 - connect to target 2, that can NOT run breakpoint commands. >> >> After steps #3/#4, you'll want the dprintf command list to >> be updated, because target 1 and 2 may well return different >> answers for target_can_run_breakpoint_commands(). >> Given absence of finer grained resetting, we get to do >> it all the time. > > Thanks. This part is so clear that I added it as comments of this part of code. > >> >> On 04/04/2013 02:29 PM, Hui Zhu wrote: >>> +# Restart with a fresh gdb. >>> + >>> +gdb_exit >>> +gdb_start >>> +gdb_reinitialize_dir $srcdir/$subdir >>> + >>> +gdb_load ${binfile} >> >> Use clean_restart here. >> >>> +gdb_test_multiple "dprintf pendfunc1, \"x=%d\\n\", x" "set pending dprintf" { >>> + -re ".*Make dprintf pending.*y or \\\[n\\\]. $" { >>> + gdb_test "y" "Dprintf.*pendfunc1.*pending." "set pending dprintf" >>> + } >>> +} >>> + >> >> gdb_test has built-in support for questions. Write these sorts >> of things as: >> >> gdb_test \ >> "dprintf pendfunc1, \"x=%d\\n\", x" \ >> "Dprintf.*pendfunc1.*pending." \ >> "set pending dprintf (without symbols)" \ >> ".*Make dprintf pending.*y or \\\[n\\\]. $" \ >> "y" >> >> There's at least one more instance. >> >>> +if { [skip_gdbserver_tests] } { >>> + return 0 >>> +} >>> + >>> +# Get warning or no output is OK. >>> +gdb_test "set dprintf-style agent" ".*" "Set dprintf style to agent" >>> + >>> +gdbserver_run "" >> >> I'd much prefer remove this skip_gdbserver_tests check, and this >> gdbserver_run. IOW, keep running the test against the target >> the current board is set up with. There are remote servers other >> than GDBserver out there. > > The code after skip_gdbserver_tests check is to test: > if (b->extra_string != NULL) > update_dprintf_command_list (b); > My thought is change the target to show "printf" is changed to "agent-printf". > Now I removed all this part of code. > > >> >>> +# Get warning or no output is OK. >>> +gdb_test "set dprintf-style agent" ".*" "Set dprintf style to agent" >> >> What warning would that be? This here?: >> >> else if (strcmp (dprintf_style, dprintf_style_agent) == 0) >> { >> if (target_can_run_breakpoint_commands ()) >> printf_line = xstrprintf ("agent-printf %s", dprintf_args); >> else >> { >> warning (_("Target cannot run dprintf commands, falling back to GDB printf")); >> printf_line = xstrprintf ("printf %s", dprintf_args); >> } >> } >> >>> + >>> +gdbserver_run "" >>> + >>> +gdb_test "info break" ".*agent-printf \"x=%d\\\\n\", x" \ >> >> If that warning triggers, then this will fail... In fact, >> you should see that when you remove the gdbserver bits. >> >> Please make the "set" test check explicitly either no output, or the >> warning, and then the "info break" test check the corresponding expected >> output. Then please make sure the test passes with native, and >> also the native-gdbserver and native-extended-gdbserver boards. >> It fails with the native-gdbserver board, because the program >> exists and gdbserver exits before the "set dprintf-style agent". >> You'll need to add something to prevent that. >> >> -- >> Pedro Alves >> > > I post new patches accord to your commnets. Please help me review them. > > Best, > Hui > > 2013-04-07 Pedro Alves > Hui Zhu > > * breakpoint.c (dprintf_re_set): New. > (initialize_breakpoint_ops): Set dprintf_breakpoint_ops re_set > to dprintf_re_set. > > 2013-04-07 Hui Zhu > > * gdb.base/Makefile.in (EXECUTABLES): Add dprintf-pending. > (MISCELLANEOUS): Add dprintf-pendshr.sl. > * gdb.base/dprintf-pending.c, gdb.base/dprintf-pending.exp: New. --bcaec52befb7a4a97d04d9d44494 Content-Type: text/plain; charset=US-ASCII; name="dprintf-pending.txt" Content-Disposition: attachment; filename="dprintf-pending.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hf9b7uuy2 Content-length: 2196 LS0tIGEvZ2RiL2JyZWFrcG9pbnQuYworKysgYi9nZGIvYnJlYWtwb2ludC5j CkBAIC0xMjk2Myw2ICsxMjk2MywzNSBAQCBia3B0X3JlX3NldCAoc3RydWN0 IGJyZWFrcG9pbnQgKmIpCiAgIGJyZWFrcG9pbnRfcmVfc2V0X2RlZmF1bHQg KGIpOwogfQogCisvKiBEcHJpbnRmIGJyZWFrcG9pbnRfb3BzIG1ldGhvZHMu ICAqLworCitzdGF0aWMgdm9pZAorZHByaW50Zl9yZV9zZXQgKHN0cnVjdCBi cmVha3BvaW50ICpiKQoreworICBicmVha3BvaW50X3JlX3NldF9kZWZhdWx0 IChiKTsKKworICAvKiBUaGlzIGJyZWFrcG9pbnQgY291bGQgaGF2ZSBiZWVu IHBlbmRpbmcsIGFuZCBiZSByZXNvbHZlZCBub3csIGFuZAorICAgICBpZiBz bywgd2Ugc2hvdWxkIG5vdyBoYXZlIHRoZSBleHRyYSBzdHJpbmcuICBJZiB3 ZSBkb24ndCwgdGhlCisgICAgIGRwcmludGYgd2FzIG1hbGZvcm1lZCB3aGVu IGNyZWF0ZWQsIGJ1dCB3ZSBjb3VsZG4ndCB0ZWxsIGJlY2F1c2UKKyAgICAg d2UgY2FuJ3QgZXh0cmFjdCB0aGUgZXh0cmEgc3RyaW5nIHVudGlsIHRoZSBs b2NhdGlvbiBpcworICAgICByZXNvbHZlZC4gICovCisgIGlmIChiLT5sb2Mg IT0gTlVMTCAmJiBiLT5leHRyYV9zdHJpbmcgPT0gTlVMTCkKKyAgICBlcnJv ciAoXygiRm9ybWF0IHN0cmluZyByZXF1aXJlZCIpKTsKKworICAvKiAxIC0g Y29ubmVjdCB0byB0YXJnZXQgMSwgdGhhdCBjYW4gcnVuIGJyZWFrcG9pbnQg Y29tbWFuZHMuCisgICAgIDIgLSBjcmVhdGUgYSBkcHJpbnRmLCB3aGljaCBy ZXNvbHZlcyBmaW5lLgorICAgICAzIC0gZGlzY29ubmVjdCBmcm9tIHRhcmdl dCAyCisgICAgIDQgLSBjb25uZWN0IHRvIHRhcmdldCAyLCB0aGF0IGNhbiBO T1QgcnVuIGJyZWFrcG9pbnQgY29tbWFuZHMuCisKKyAgICAgQWZ0ZXIgc3Rl cHMgIzMvIzQsIHlvdSdsbCB3YW50IHRoZSBkcHJpbnRmIGNvbW1hbmQgbGlz dCB0bworICAgICBiZSB1cGRhdGVkLCBiZWNhdXNlIHRhcmdldCAxIGFuZCAy IG1heSB3ZWxsIHJldHVybiBkaWZmZXJlbnQKKyAgICAgYW5zd2VycyBmb3Ig dGFyZ2V0X2Nhbl9ydW5fYnJlYWtwb2ludF9jb21tYW5kcygpLgorICAgICBH aXZlbiBhYnNlbmNlIG9mIGZpbmVyIGdyYWluZWQgcmVzZXR0aW5nLCB3ZSBn ZXQgdG8gZG8KKyAgICAgaXQgYWxsIHRoZSB0aW1lLiAgKi8KKyAgaWYgKGIt PmV4dHJhX3N0cmluZyAhPSBOVUxMKQorICAgIHVwZGF0ZV9kcHJpbnRmX2Nv bW1hbmRfbGlzdCAoYik7Cit9CisKIHN0YXRpYyBpbnQKIGJrcHRfaW5zZXJ0 X2xvY2F0aW9uIChzdHJ1Y3QgYnBfbG9jYXRpb24gKmJsKQogewpAQCAtMTYw MDEsNyArMTYwMzAsNyBAQCBpbml0aWFsaXplX2JyZWFrcG9pbnRfb3BzICh2 b2lkKQogCiAgIG9wcyA9ICZkcHJpbnRmX2JyZWFrcG9pbnRfb3BzOwogICAq b3BzID0gYmtwdF9iYXNlX2JyZWFrcG9pbnRfb3BzOwotICBvcHMtPnJlX3Nl dCA9IGJrcHRfcmVfc2V0OworICBvcHMtPnJlX3NldCA9IGRwcmludGZfcmVf c2V0OwogICBvcHMtPnJlc291cmNlc19uZWVkZWQgPSBia3B0X3Jlc291cmNl c19uZWVkZWQ7CiAgIG9wcy0+cHJpbnRfaXQgPSBia3B0X3ByaW50X2l0Owog ICBvcHMtPnByaW50X21lbnRpb24gPSBia3B0X3ByaW50X21lbnRpb247Cg== --bcaec52befb7a4a97d04d9d44494 Content-Type: text/plain; charset=US-ASCII; name="dprintf-pending-test.txt" Content-Disposition: attachment; filename="dprintf-pending-test.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hf9b7uvi3 Content-length: 8081 LS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9NYWtlZmlsZS5pbgorKysg Yi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL01ha2VmaWxlLmluCkBAIC0xMCw3 ICsxMCw4IEBAIEVYRUNVVEFCTEVTID0gYTItcnVuIGFkdmFuY2UgYWxsLXR5 cGVzIGEKIAljYWxsLXN0cnMgY2FsbGV4aXQgY2FsbGZ1bmNzIGNhbGxmd21h bGwgY2hhcnNldCBjaGVja3BvaW50IFwKIAljaG5nLXN5bXMgY29kZV9lbGlt MSBjb2RlX2VsaW0yIGNvbW1hbmRzIGNvbXBpbGVyIGNvbXBsZXggXAogCWNv bmRicmVhayBjb25zZWN1dGl2ZSBjb25zdHZhcnMgY29yZW1ha2VyIGN1cnNh bCBjdmV4cHIgXAotCWRieC10ZXN0IGRlbCBkaXNhc20tZW5kLWN1IGRpc3Bs YXkgZHVtcCBkdXAtc2VjdCBkdXAtc2VjdC5kZWJ1ZyBcCisJZGJ4LXRlc3Qg ZGVsIGRpc2FzbS1lbmQtY3UgZGlzcGxheSBkcHJpbnRmLXBlbmRpbmcgZHVt cCBkdXAtc2VjdCBcCisJZHVwLXNlY3QuZGVidWcgXAogCWR1cC1zZWN0LnN0 cmlwcGVkIGVuZGluZy1ydW4gZXhlY2QtcHJvZyBleHBhbmQtcHN5bXRhYnMg ZXhwcnMgXAogCWZpbGVpbyBmaW5kIGZpbmlzaCBmaXhzZWN0aW9uIGZsb2F0 IGZvbGwtZXhlYyBmb2xsLWZvcmsgZm9sbC12Zm9yayBcCiAJZnJhbWUtYXJn cyBmcmVlYnBjbWQgZnVsbG5hbWUgZnVuY2FyZ3MgZ2NvcmUgXApAQCAtNDQs NyArNDUsNyBAQCBFWEVDVVRBQkxFUyA9IGEyLXJ1biBhZHZhbmNlIGFsbC10 eXBlcyBhCiAJd2NoYXIgd2hhdGlzIHdoYXRpcy1leHAgY2F0Y2gtc3lzY2Fs bCBcCiAJcHIxMDE3OSBnbnVfdmVjdG9yCiAKLU1JU0NFTExBTkVPVVMgPSBj b3JlbW1hcC5kYXRhIC4uL2Zvb2Jhci5iYXogZml4c2VjdHNoci5zbCBcCitN SVNDRUxMQU5FT1VTID0gY29yZW1tYXAuZGF0YSBkcHJpbnRmLXBlbmRzaHIu c2wgLi4vZm9vYmFyLmJheiBmaXhzZWN0c2hyLnNsIFwKIAlwZW5kc2hyLnNs IHNocmVsb2MxLnNsIHNocmVsb2MyLnNsIHR3aWNlLXRtcC5jIFwKIAlzaHIx LnNsIHNocjIuc2wgc29saWJfc2wuc2wgc29saWIxLnNsIHNvbGliMi5zbCBc CiAJdW5sb2Fkc2hyLnNsIHVubG9hZHNocjIuc2wgd2F0Y2hwb2ludC1zb2xp Yi1zaHIuc2wgXAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUv Z2RiLmJhc2UvZHByaW50Zi1wZW5kaW5nLmMKQEAgLTAsMCArMSwyOSBAQAor LyogVGhpcyB0ZXN0Y2FzZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1 Z2dlci4KKworICAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5z ZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5v dCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisK K2ludCBrID0gMDsKKworZXh0ZXJuIHZvaWQgcGVuZGZ1bmMgKGludCB4KTsK KworaW50IG1haW4oKQoreworICBwZW5kZnVuYyAoMyk7IC8qIGJyZWFrIG1h aW4gaGVyZSAqLworICBwZW5kZnVuYyAoNCk7CisgIGsgPSAxOworICBwZW5k ZnVuYyAoMyk7CisgIHJldHVybiAwOworfQotLS0gL2Rldi9udWxsCisrKyBi L2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZHByaW50Zi1wZW5kaW5nLmV4cApA QCAtMCwwICsxLDk5IEBACisjICAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUg TGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy c2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3Vs ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBu b3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2xv YWRfbGliIGdkYnNlcnZlci1zdXBwb3J0LmV4cAorCitpZiB7W3NraXBfc2hs aWJfdGVzdHNdfSB7CisgICAgcmV0dXJuIDAKK30KKworc2V0IHRlc3RmaWxl ICJkcHJpbnRmLXBlbmRpbmciCitzZXQgbGliZmlsZSAiZHByaW50Zi1wZW5k c2hyIgorc2V0IHNyY2ZpbGUgJHRlc3RmaWxlLmMKK3NldCBsaWJzcmMgICRz cmNkaXIvJHN1YmRpci8kbGliZmlsZS5jCitzZXQgYmluZmlsZSAkb2JqZGly LyRzdWJkaXIvJHRlc3RmaWxlCitzZXQgbGliX3NsICAkb2JqZGlyLyRzdWJk aXIvJGxpYmZpbGUuc2wKKworc2V0IGxpYl9vcHRzICBkZWJ1Zworc2V0IGV4 ZWNfb3B0cyBbbGlzdCBkZWJ1ZyBzaGxpYj0kbGliX3NsXQorCitpZiB7IFtn ZXRfY29tcGlsZXJfaW5mb10gfSB7CisgICAgcmV0dXJuIC0xCit9CisKK2lm IHsgW2dkYl9jb21waWxlX3NobGliICRsaWJzcmMgJGxpYl9zbCAkbGliX29w dHNdICE9ICIiCisgICAgIHx8IFtnZGJfY29tcGlsZSAkc3JjZGlyLyRzdWJk aXIvJHNyY2ZpbGUgJGJpbmZpbGUgZXhlY3V0YWJsZSAkZXhlY19vcHRzXSAh PSAiIn0geworICAgIHVudGVzdGVkICJDb3VsZCBub3QgY29tcGlsZSBlaXRo ZXIgJGxpYnNyYyBvciAkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUuIgorICAg IHJldHVybiAtMQorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVp bml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgXAor ICAgICJkcHJpbnRmIHBlbmRmdW5jIiBcCisgICAgIkRwcmludGYuKnBlbmRm dW5jLipwZW5kaW5nLiIgXAorICAgICJzZXQgcGVuZGluZyBkcHJpbnRmICh3 aXRob3V0IGZvcm1hdCkiIFwKKyAgICAiLipNYWtlIGRwcmludGYgcGVuZGlu Zy4qeSBvciBcXFxbblxcXF0uICQiIFwKKyAgICAieSIKKworZ2RiX3Rlc3Qg ImZpbGUgJHtiaW5maWxlfSIgIi4qRXJyb3IgaW4gcmUtc2V0dGluZyBicmVh a3BvaW50LioiICJsb2FkIHN5bWJvbHMgZ2V0IHdpdGhvdXQgZm9ybWF0IGVy cm9yIgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXpl X2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgXAorICAgICJkcHJp bnRmIHBlbmRmdW5jMSwgXCJ4PSVkXFxuXCIsIHgiIFwKKyAgICAiRHByaW50 Zi4qcGVuZGZ1bmMxLipwZW5kaW5nLiIgXAorICAgICJzZXQgcGVuZGluZyBk cHJpbnRmICh3aXRob3V0IHN5bWJvbHMpIiBcCisgICAgIi4qTWFrZSBkcHJp bnRmIHBlbmRpbmcuKnkgb3IgXFxcW25cXFxdLiAkIiBcCisgICAgInkiCisK K2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSAgICAgVHlwZVxb IFxdK0Rpc3AgRW5iIEFkZHJlc3NcWyBcXStXaGF0LioKK1xbMC05XF0rXFtc dCBcXStkcHJpbnRmLiprZWVwIHkuKlBFTkRJTkcuKnBlbmRmdW5jMS4qIiBc Cisic2luZ2xlIHBlbmRpbmcgZHByaW50ZiBpbmZvICh3aXRob3V0IHN5bWJv bHMpIgorCitnZGJfbG9hZCAke2JpbmZpbGV9CitnZGJfbG9hZF9zaGxpYnMg JGxpYl9zbAorCitnZGJfcnVuX2NtZAorCitnZGJfdGVzdCAiIiAiLip4PTMu Kng9NC4qeD0zLioiICJydW4gdG8gcmVzb2x2ZWQgZHByaW50ZiAod2l0aG91 dCBzeW1ib2xzKSIKKworY2xlYW5fcmVzdGFydCAke2JpbmZpbGV9CitnZGJf bG9hZF9zaGxpYnMgJGxpYl9zbAorCisjCisjIFRlc3Qgc2V0dGluZywgcXVl cnlpbmcsIGFuZCBtb2RpZnlpbmcgcGVuZGluZyBicmVha3BvaW50cworIwor CitnZGJfdGVzdCBcCisgICAgImRwcmludGYgcGVuZGZ1bmMxLCBcIng9JWRc XG5cIiwgeCIgXAorICAgICJEcHJpbnRmLipwZW5kZnVuYzEuKnBlbmRpbmcu IiBcCisgICAgInNldCBwZW5kaW5nIGRwcmludGYiIFwKKyAgICAiLipNYWtl IGRwcmludGYgcGVuZGluZy4qeSBvciBcXFxbblxcXF0uICQiIFwKKyAgICAi eSIKKworZ2RiX3Rlc3QgImluZm8gYnJlYWsiIFwKKyAgICAiTnVtICAgICBU eXBlXFsgXF0rRGlzcCBFbmIgQWRkcmVzc1xbIFxdK1doYXQuKgorXFswLTlc XStcW1x0IFxdK2RwcmludGYuKmtlZXAgeS4qUEVORElORy4qcGVuZGZ1bmMx LioiIFwKKyJzaW5nbGUgcGVuZGluZyBkcHJpbnRmIGluZm8iCisKK2dkYl9y dW5fY21kCisKK2dkYl90ZXN0ICIiICIuKng9My4qeD00Lip4PTMuKiIgInJ1 biB0byByZXNvbHZlZCBkcHJpbnRmIgotLS0gL2Rldi9udWxsCisrKyBiL2dk Yi90ZXN0c3VpdGUvZ2RiLmJhc2UvZHByaW50Zi1wZW5kc2hyLmMKQEAgLTAs MCArMSwyNiBAQAorLyogVGhpcyB0ZXN0Y2FzZSBpcyBwYXJ0IG9mIEdEQiwg dGhlIEdOVSBkZWJ1Z2dlci4KKworICAgQ29weXJpZ2h0IDIwMTMgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBv ZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxh dGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAg IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJv Z3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5z ZXMvPi4gICovCisKK3ZvaWQgcGVuZGZ1bmMxIChpbnQgeCkKK3sKKyAgaW50 IHkgPSB4ICsgNDsKK30KKwordm9pZCBwZW5kZnVuYyAoaW50IHgpCit7Cisg IHBlbmRmdW5jMSAoeCk7Cit9Cg== --bcaec52befb7a4a97d04d9d44494--