From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 4E8863858C54 for ; Fri, 4 Nov 2022 14:28:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4E8863858C54 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1667572079; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=r2Udd+wu9h8n6+ifg8O21oXHOGaiUTuSfTVn7K14pGE=; b=MuQ7oppLuOUTW9mkKf+H9IAd0cllzafy3cye+1ddYMnYwEZ62DIM8VvxOie4v6EZ20l/J8 /2S5lKSodzATC6Qbvg3s32Nu7njUh9wh+z9xSCYft6Dvl3SZt/nxNsE9sJisgF5RTpmyGx V6gYS/YfGk3RnSlWVxnOeHbg/35BkYk= Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-237-3o-WWfgUO9-RonUba7gJBg-1; Fri, 04 Nov 2022 10:27:58 -0400 X-MC-Unique: 3o-WWfgUO9-RonUba7gJBg-1 Received: by mail-qt1-f199.google.com with SMTP id ff5-20020a05622a4d8500b003a526107477so3853515qtb.9 for ; Fri, 04 Nov 2022 07:27:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:references:to:content-language:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=J438TXFhnvEkg4zrveQ40iNyfhRD251vcHUx5gCguJk=; b=VCQlKWt6E+TRP7iRw33PYuvoR6YrIBtJpjjkB0pxY2Xxm4g4NcXlpbQHImKB+UpPd/ O40ujKfwxh6HREue41UK/tnykIJLML5Y1yVal8u0aVsI4m3yH1kQwXgctxMDiMGUFrz5 oVlOMfdIyw8UaI07A+qopJg6bS5C2JDM+hPx86oRq5B1z3m72GXBQ+Ri6izOh5MWZrvn OjUnypc/QL36ewrGJx2r79iftkbaCvEr3rsu4KMJDdaOec0b5OeP3Kw4TSAovPSCOdJw VP4uui4NG/6ZcSqg6JyJMnBO2lZxCuxpZOFr4PbKRd759kTZtaexTpuPmW6m4r1gH+B2 z+Ag== X-Gm-Message-State: ACrzQf2kN9vhSl6qmFE8/D90EsG5EYSSOMDt6++OjsYeU02ub5mP6Co4 yIk2i19zGZWiEFCl39fdmxYrCJM9p08YIN+qIjUxs1Yg/R2lpvZAk+A5P0WJHJrlfX33m4DHs9M ASJ+/sxokdH+rqXZzGQ== X-Received: by 2002:a05:6214:5f8e:b0:4b4:4f9:b026 with SMTP id ls14-20020a0562145f8e00b004b404f9b026mr305764qvb.4.1667572078026; Fri, 04 Nov 2022 07:27:58 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6mwdwlalK64ZVwgv+WCBT0RgPfXKQDmTeFPLC1AeoLEBPcaIcy+vq2aQUH5/nDuAgWo3c/8A== X-Received: by 2002:a05:6214:5f8e:b0:4b4:4f9:b026 with SMTP id ls14-20020a0562145f8e00b004b404f9b026mr305763qvb.4.1667572077605; Fri, 04 Nov 2022 07:27:57 -0700 (PDT) Received: from [192.168.1.101] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id cn6-20020a05622a248600b0035cd6a4ba3csm2546067qtb.39.2022.11.04.07.27.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 04 Nov 2022 07:27:56 -0700 (PDT) Message-ID: <22136833-3ba8-686b-4eae-a709f2c1780d@redhat.com> Date: Fri, 4 Nov 2022 10:27:56 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH RFA] input: add get_source_text_between To: David Malcolm , gcc-patches@gcc.gnu.org References: <20221103195902.2114479-1-jason@redhat.com> <906b1326bd95c094331f7a5ff46723986215e3cf.camel@redhat.com> From: Jason Merrill In-Reply-To: <906b1326bd95c094331f7a5ff46723986215e3cf.camel@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------H83PwRoTBnRrA7Y62SCwL1h1" Content-Language: en-US X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,BODY_8BITS,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------H83PwRoTBnRrA7Y62SCwL1h1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/3/22 19:06, David Malcolm wrote: > On Thu, 2022-11-03 at 15:59 -0400, Jason Merrill via Gcc-patches wrote: >> Tested x86_64-pc-linux-gnu, OK for trunk? >> >> -- >8 -- >> >> The c++-contracts branch uses this to retrieve the source form of the >> contract predicate, to be returned by contract_violation::comment(). >> >> gcc/ChangeLog: >> >>         * input.cc (get_source_text_between): New fn. >>         * input.h (get_source_text_between): Declare. >> --- >>  gcc/input.h  |  1 + >>  gcc/input.cc | 76 >> ++++++++++++++++++++++++++++++++++++++++++++++++++++ >>  2 files changed, 77 insertions(+) >> >> diff --git a/gcc/input.h b/gcc/input.h >> index 11c571d076f..f18769950b5 100644 >> --- a/gcc/input.h >> +++ b/gcc/input.h >> @@ -111,6 +111,7 @@ class char_span >>  }; >> >>  extern char_span location_get_source_line (const char *file_path, >> int line); >> +extern char *get_source_text_between (location_t, location_t); >> >>  extern bool location_missing_trailing_newline (const char >> *file_path); >> >> diff --git a/gcc/input.cc b/gcc/input.cc >> index a28abfac5ac..9b36356338a 100644 >> --- a/gcc/input.cc >> +++ b/gcc/input.cc >> @@ -949,6 +949,82 @@ location_get_source_line (const char *file_path, >> int line) >>    return char_span (buffer, len); >>  } >> >> +/* Return a copy of the source text between two locations.  The >> caller is >> +   responsible for freeing the return value.  */ >> + >> +char * >> +get_source_text_between (location_t start, location_t end) >> +{ >> +  expanded_location expstart = >> +    expand_location_to_spelling_point (start, >> LOCATION_ASPECT_START); >> +  expanded_location expend = >> +    expand_location_to_spelling_point (end, LOCATION_ASPECT_FINISH); >> + >> +  /* If the locations are in different files or the end comes before >> the >> +     start, abort and return nothing.  */ > > I don't like the use of the term "abort" here, as it suggests to me the > use of abort(3). Maybe "bail out" instead? I went with "give up". >> +  if (!expstart.file || !expend.file) >> +    return NULL; >> +  if (strcmp (expstart.file, expend.file) != 0) >> +    return NULL; >> +  if (expstart.line > expend.line) >> +    return NULL; >> +  if (expstart.line == expend.line >> +      && expstart.column > expend.column) >> +    return NULL; > > We occasionally use the convention that > (column == 0) > means "the whole line". Probably should detect that case and bail out > early for it. Done. >> + >> +  /* For a single line we need to trim both edges.  */ >> +  if (expstart.line == expend.line) >> +    { >> +      char_span line = location_get_source_line (expstart.file, >> expstart.line); >> +      if (line.length () < 1) >> +       return NULL; >> +      int s = expstart.column - 1; >> +      int l = expend.column - s; > > Can we please avoid lower-case L "ell" for variable names, as it looks > so similar to the numeral for one. "len" would be more descriptive > here. Done. >> +      if (line.length () < (size_t)expend.column) >> +       return NULL; >> +      return line.subspan (s, l).xstrdup (); >> +    } >> + >> +  struct obstack buf_obstack; >> +  obstack_init (&buf_obstack); >> + >> +  /* Loop through all lines in the range and append each to buf; may >> trim >> +     parts of the start and end lines off depending on column >> values.  */ >> +  for (int l = expstart.line; l <= expend.line; ++l) > > Again, please let's not have a var named "l". Maybe "iter_line" as > that's what is being done? > >> +    { >> +      char_span line = location_get_source_line (expstart.file, l); >> +      if (line.length () < 1 && (l != expstart.line && l != >> expend.line)) > > ...especially as I *think* the first comparison is against numeral one, > whereas comparisons two and three are against lower-case ell, but I'm > having to squint at the font in my email client to be sure :-/ Done. But also allow me to recommend https://nodnod.net/posts/inconsolata-dz/ >> +       continue; >> + >> +      /* For the first line in the range, only start at >> expstart.column */ >> +      if (l == expstart.line) >> +       { >> +         if (expstart.column == 0) >> +           return NULL; >> +         if (line.length () < (size_t)expstart.column - 1) >> +           return NULL; >> +         line = line.subspan (expstart.column - 1, >> +                              line.length() - expstart.column + 1); >> +       } >> +      /* For the last line, don't go past expend.column */ >> +      else if (l == expend.line) >> +       { >> +         if (line.length () < (size_t)expend.column) >> +           return NULL; >> +         line = line.subspan (0, expend.column); >> +       } >> + >> +      obstack_grow (&buf_obstack, line.get_buffer (), line.length >> ()); > > Is this accumulating the trailing newline characters into the > buf_obstack? I *think* it is, but it seems worth a comment for each of > the three cases (first line, intermediate line, last line). It is not; I've added a comment to that effect, and also implemented the TODO of collapsing a series of whitespace. >> +    } >> + >> +  /* NUL-terminate and finish the buf obstack.  */ >> +  obstack_1grow (&buf_obstack, 0); >> +  const char *buf = (const char *) obstack_finish (&buf_obstack); >> + >> +  /* TODO should we collapse/trim newlines and runs of spaces?  */ >> +  return xstrdup (buf); >> +} >> + > > Do you have test coverage for this from the DejaGnu side? If not, you > could add selftest coverage for this; see input.cc's > test_reading_source_line for something similar. There is test coverage for the output of the the contract violation handler, which involves printing the result of this function. --------------H83PwRoTBnRrA7Y62SCwL1h1 Content-Type: text/x-patch; charset=UTF-8; name="0001-input-add-get_source_text_between.patch" Content-Disposition: attachment; filename="0001-input-add-get_source_text_between.patch" Content-Transfer-Encoding: base64 RnJvbSA0ZDhhMjQ1NzRjODA4Zjg4MTQzOGQ2NWU4ZjMzM2Y3ZTE1MmZiMjE3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIENoYXBtYW4gSUkgPGpjaGFwbWFuQGxvY2szc29mdHdh cmUuY29tPgpEYXRlOiBUaHUsIDMgTm92IDIwMjIgMTU6NDc6NDcgLTA0MDAKU3ViamVjdDogW1BB VENIXSBpbnB1dDogYWRkIGdldF9zb3VyY2VfdGV4dF9iZXR3ZWVuClRvOiBnY2MtcGF0Y2hlc0Bn Y2MuZ251Lm9yZwoKVGhlIGMrKy1jb250cmFjdHMgYnJhbmNoIHVzZXMgdGhpcyB0byByZXRyaWV2 ZSB0aGUgc291cmNlIGZvcm0gb2YgdGhlCmNvbnRyYWN0IHByZWRpY2F0ZSwgdG8gYmUgcmV0dXJu ZWQgYnkgY29udHJhY3RfdmlvbGF0aW9uOjpjb21tZW50KCkuCgpDby1hdXRob3JlZC1ieTogSmFz b24gTWVycmlsbCAgPGphc29uQHJlZGhhdC5jb20+CgpnY2MvQ2hhbmdlTG9nOgoKCSogaW5wdXQu Y2MgKGdldF9zb3VyY2VfdGV4dF9iZXR3ZWVuKTogTmV3IGZuLgoJKiBpbnB1dC5oIChnZXRfc291 cmNlX3RleHRfYmV0d2Vlbik6IERlY2xhcmUuCi0tLQogZ2NjL2lucHV0LmggIHwgIDEgKwogZ2Nj L2lucHV0LmNjIHwgOTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA5MiBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0 IGEvZ2NjL2lucHV0LmggYi9nY2MvaW5wdXQuaAppbmRleCAxMWM1NzFkMDc2Zi4uZjE4NzY5OTUw YjUgMTAwNjQ0Ci0tLSBhL2djYy9pbnB1dC5oCisrKyBiL2djYy9pbnB1dC5oCkBAIC0xMTEsNiAr MTExLDcgQEAgY2xhc3MgY2hhcl9zcGFuCiB9OwogCiBleHRlcm4gY2hhcl9zcGFuIGxvY2F0aW9u X2dldF9zb3VyY2VfbGluZSAoY29uc3QgY2hhciAqZmlsZV9wYXRoLCBpbnQgbGluZSk7CitleHRl cm4gY2hhciAqZ2V0X3NvdXJjZV90ZXh0X2JldHdlZW4gKGxvY2F0aW9uX3QsIGxvY2F0aW9uX3Qp OwogCiBleHRlcm4gYm9vbCBsb2NhdGlvbl9taXNzaW5nX3RyYWlsaW5nX25ld2xpbmUgKGNvbnN0 IGNoYXIgKmZpbGVfcGF0aCk7CiAKZGlmZiAtLWdpdCBhL2djYy9pbnB1dC5jYyBiL2djYy9pbnB1 dC5jYwppbmRleCBhMjhhYmZhYzVhYy4uMDRkMDgwOWJmZGYgMTAwNjQ0Ci0tLSBhL2djYy9pbnB1 dC5jYworKysgYi9nY2MvaW5wdXQuY2MKQEAgLTk0OSw2ICs5NDksOTcgQEAgbG9jYXRpb25fZ2V0 X3NvdXJjZV9saW5lIChjb25zdCBjaGFyICpmaWxlX3BhdGgsIGludCBsaW5lKQogICByZXR1cm4g Y2hhcl9zcGFuIChidWZmZXIsIGxlbik7CiB9CiAKKy8qIFJldHVybiBhIGNvcHkgb2YgdGhlIHNv dXJjZSB0ZXh0IGJldHdlZW4gdHdvIGxvY2F0aW9ucy4gIFRoZSBjYWxsZXIgaXMKKyAgIHJlc3Bv bnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm4gdmFsdWUuICAqLworCitjaGFyICoKK2dldF9z b3VyY2VfdGV4dF9iZXR3ZWVuIChsb2NhdGlvbl90IHN0YXJ0LCBsb2NhdGlvbl90IGVuZCkKK3sK KyAgZXhwYW5kZWRfbG9jYXRpb24gZXhwc3RhcnQgPQorICAgIGV4cGFuZF9sb2NhdGlvbl90b19z cGVsbGluZ19wb2ludCAoc3RhcnQsIExPQ0FUSU9OX0FTUEVDVF9TVEFSVCk7CisgIGV4cGFuZGVk X2xvY2F0aW9uIGV4cGVuZCA9CisgICAgZXhwYW5kX2xvY2F0aW9uX3RvX3NwZWxsaW5nX3BvaW50 IChlbmQsIExPQ0FUSU9OX0FTUEVDVF9GSU5JU0gpOworCisgIC8qIElmIHRoZSBsb2NhdGlvbnMg YXJlIGluIGRpZmZlcmVudCBmaWxlcyBvciB0aGUgZW5kIGNvbWVzIGJlZm9yZSB0aGUKKyAgICAg c3RhcnQsIGdpdmUgdXAgYW5kIHJldHVybiBub3RoaW5nLiAgKi8KKyAgaWYgKCFleHBzdGFydC5m aWxlIHx8ICFleHBlbmQuZmlsZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHN0cmNtcCAoZXhw c3RhcnQuZmlsZSwgZXhwZW5kLmZpbGUpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChl eHBzdGFydC5saW5lID4gZXhwZW5kLmxpbmUpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChleHBz dGFydC5saW5lID09IGV4cGVuZC5saW5lCisgICAgICAmJiBleHBzdGFydC5jb2x1bW4gPiBleHBl bmQuY29sdW1uKQorICAgIHJldHVybiBOVUxMOworICAvKiBUaGVzZSBhcmVuJ3QgcmVhbCBjb2x1 bW4gbnVtYmVycywgZ2l2ZSB1cC4gICovCisgIGlmIChleHBzdGFydC5jb2x1bW4gPT0gMCB8fCBl eHBlbmQuY29sdW1uID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRm9yIGEgc2luZ2xl IGxpbmUgd2UgbmVlZCB0byB0cmltIGJvdGggZWRnZXMuICAqLworICBpZiAoZXhwc3RhcnQubGlu ZSA9PSBleHBlbmQubGluZSkKKyAgICB7CisgICAgICBjaGFyX3NwYW4gbGluZSA9IGxvY2F0aW9u X2dldF9zb3VyY2VfbGluZSAoZXhwc3RhcnQuZmlsZSwgZXhwc3RhcnQubGluZSk7CisgICAgICBp ZiAobGluZS5sZW5ndGggKCkgPCAxKQorCXJldHVybiBOVUxMOworICAgICAgaW50IHMgPSBleHBz dGFydC5jb2x1bW4gLSAxOworICAgICAgaW50IGxlbiA9IGV4cGVuZC5jb2x1bW4gLSBzOworICAg ICAgaWYgKGxpbmUubGVuZ3RoICgpIDwgKHNpemVfdClleHBlbmQuY29sdW1uKQorCXJldHVybiBO VUxMOworICAgICAgcmV0dXJuIGxpbmUuc3Vic3BhbiAocywgbGVuKS54c3RyZHVwICgpOworICAg IH0KKworICBzdHJ1Y3Qgb2JzdGFjayBidWZfb2JzdGFjazsKKyAgb2JzdGFja19pbml0ICgmYnVm X29ic3RhY2spOworCisgIC8qIExvb3AgdGhyb3VnaCBhbGwgbGluZXMgaW4gdGhlIHJhbmdlIGFu ZCBhcHBlbmQgZWFjaCB0byBidWY7IG1heSB0cmltCisgICAgIHBhcnRzIG9mIHRoZSBzdGFydCBh bmQgZW5kIGxpbmVzIG9mZiBkZXBlbmRpbmcgb24gY29sdW1uIHZhbHVlcy4gICovCisgIGZvciAo aW50IGxudW0gPSBleHBzdGFydC5saW5lOyBsbnVtIDw9IGV4cGVuZC5saW5lOyArK2xudW0pCisg ICAgeworICAgICAgY2hhcl9zcGFuIGxpbmUgPSBsb2NhdGlvbl9nZXRfc291cmNlX2xpbmUgKGV4 cHN0YXJ0LmZpbGUsIGxudW0pOworICAgICAgaWYgKGxpbmUubGVuZ3RoICgpIDwgMSAmJiAobG51 bSAhPSBleHBzdGFydC5saW5lICYmIGxudW0gIT0gZXhwZW5kLmxpbmUpKQorCWNvbnRpbnVlOwor CisgICAgICAvKiBGb3IgdGhlIGZpcnN0IGxpbmUgaW4gdGhlIHJhbmdlLCBvbmx5IHN0YXJ0IGF0 IGV4cHN0YXJ0LmNvbHVtbiAqLworICAgICAgaWYgKGxudW0gPT0gZXhwc3RhcnQubGluZSkKKwl7 CisJICB1bnNpZ25lZCBvZmYgPSBleHBzdGFydC5jb2x1bW4gLSAxOworCSAgaWYgKGxpbmUubGVu Z3RoICgpIDwgb2ZmKQorCSAgICByZXR1cm4gTlVMTDsKKwkgIGxpbmUgPSBsaW5lLnN1YnNwYW4g KG9mZiwgbGluZS5sZW5ndGgoKSAtIG9mZik7CisJfQorICAgICAgLyogRm9yIHRoZSBsYXN0IGxp bmUsIGRvbid0IGdvIHBhc3QgZXhwZW5kLmNvbHVtbiAqLworICAgICAgZWxzZSBpZiAobG51bSA9 PSBleHBlbmQubGluZSkKKwl7CisJICBpZiAobGluZS5sZW5ndGggKCkgPCAoc2l6ZV90KWV4cGVu ZC5jb2x1bW4pCisJICAgIHJldHVybiBOVUxMOworCSAgbGluZSA9IGxpbmUuc3Vic3BhbiAoMCwg ZXhwZW5kLmNvbHVtbik7CisJfQorCisgICAgICAvKiBDb21iaW5lIHNwYWNlcyBhdCB0aGUgYmVn aW5uaW5nIG9mIGxhdGVyIGxpbmVzLiAgKi8KKyAgICAgIGlmIChsbnVtID4gZXhwc3RhcnQubGlu ZSkKKwl7CisJICB1bnNpZ25lZCBvZmY7CisJICBmb3IgKG9mZiA9IDA7IG9mZiA8IGxpbmUubGVu Z3RoKCk7ICsrb2ZmKQorCSAgICBpZiAobGluZVtvZmZdICE9ICcgJyAmJiBsaW5lW29mZl0gIT0g J1x0JykKKwkgICAgICBicmVhazsKKwkgIGlmIChvZmYgPiAwKQorCSAgICB7CisJICAgICAgb2Jz dGFja18xZ3JvdyAoJmJ1Zl9vYnN0YWNrLCAnICcpOworCSAgICAgIGxpbmUgPSBsaW5lLnN1YnNw YW4gKG9mZiwgbGluZS5sZW5ndGgoKSAtIG9mZik7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFRo aXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgdHJhaWxpbmcgbmV3bGluZXMuICAqLworICAgICAgb2Jz dGFja19ncm93ICgmYnVmX29ic3RhY2ssIGxpbmUuZ2V0X2J1ZmZlciAoKSwgbGluZS5sZW5ndGgg KCkpOworICAgIH0KKworICAvKiBOVUwtdGVybWluYXRlIGFuZCBmaW5pc2ggdGhlIGJ1ZiBvYnN0 YWNrLiAgKi8KKyAgb2JzdGFja18xZ3JvdyAoJmJ1Zl9vYnN0YWNrLCAwKTsKKyAgY29uc3QgY2hh ciAqYnVmID0gKGNvbnN0IGNoYXIgKikgb2JzdGFja19maW5pc2ggKCZidWZfb2JzdGFjayk7CisK KyAgcmV0dXJuIHhzdHJkdXAgKGJ1Zik7Cit9CisKIC8qIERldGVybWluZSBpZiBGSUxFX1BBVEgg bWlzc2luZyBhIHRyYWlsaW5nIG5ld2xpbmUgb24gaXRzIGZpbmFsIGxpbmUuCiAgICBPbmx5IHZh bGlkIHRvIGNhbGwgb25jZSBhbGwgb2YgdGhlIGZpbGUgaGFzIGJlZW4gbG9hZGVkLCBieQogICAg cmVxdWVzdGluZyBhIGxpbmUgbnVtYmVyIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgKi8K LS0gCjIuMzEuMQoK --------------H83PwRoTBnRrA7Y62SCwL1h1--