From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Aaron S. Hawley" Newsgroups: gmane.emacs.bugs Subject: bug#13271: primitive-undo in Lisp Date: Mon, 24 Dec 2012 13:44:07 -0500 Message-ID: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=14dae93408831720c804d19d9556 X-Trace: ger.gmane.org 1356374678 10996 80.91.229.3 (24 Dec 2012 18:44:38 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 24 Dec 2012 18:44:38 +0000 (UTC) To: 13271@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Dec 24 19:44:52 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1TnD18-00048V-Gs for geb-bug-gnu-emacs@m.gmane.org; Mon, 24 Dec 2012 19:44:50 +0100 Original-Received: from localhost ([::1]:42321 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TnD0u-00058M-CX for geb-bug-gnu-emacs@m.gmane.org; Mon, 24 Dec 2012 13:44:36 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:39858) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TnD0q-000589-TB for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:44:34 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TnD0p-0002o1-Mm for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:44:32 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:48183) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TnD0p-0002nv-IE for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:44:31 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1TnD1K-0001y6-CA for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:45:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: "Aaron S. Hawley" Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 24 Dec 2012 18:45:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 13271 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs Original-Received: via spool by submit@debbugs.gnu.org id=B.13563746877529 (code B ref -1); Mon, 24 Dec 2012 18:45:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 24 Dec 2012 18:44:47 +0000 Original-Received: from localhost ([127.0.0.1]:58434 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TnD15-0001xN-4h for submit@debbugs.gnu.org; Mon, 24 Dec 2012 13:44:47 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:56691) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TnD12-0001xG-Pn for submit@debbugs.gnu.org; Mon, 24 Dec 2012 13:44:46 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TnD0W-0002Vm-13 for submit@debbugs.gnu.org; Mon, 24 Dec 2012 13:44:13 -0500 Original-Received: from lists.gnu.org ([208.118.235.17]:51855) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TnD0V-0002Vh-TJ for submit@debbugs.gnu.org; Mon, 24 Dec 2012 13:44:11 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:39819) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TnD0U-00055d-QC for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:44:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TnD0T-0002VC-JA for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:44:10 -0500 Original-Received: from mail-ia0-f177.google.com ([209.85.210.177]:42193) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TnD0T-0002V3-8t for bug-gnu-emacs@gnu.org; Mon, 24 Dec 2012 13:44:09 -0500 Original-Received: by mail-ia0-f177.google.com with SMTP id u21so6079580ial.22 for ; Mon, 24 Dec 2012 10:44:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=QzYdm5EwYgjD46ZdUN+KVVSOObEGh2bjCgD+Gt3mBxo=; b=st6UArXzu/ia82XEdEM6o71f6EnzNG5XhoD0k7pP5SrwjrkK09G5zu2Ac8ouZ0RAPb PVLGVX0ha7PCnIePAFhbNKVj0ykAjYUgkYKZ7umRAm2eRMBlqhc+l0rdo63oL/570waf LkJI5e2Kep5qoALlqAyywLtX/oV0wOC2syXjWfs0iXdkI1Rheh5lnPno1DR9CqDXFhAn lT1TerG2D+guXO9P0qNb6Vasq3UrTBpAAdQcrsdbMPutVscp68jHB6VMqTeODC/5NXiE b3aicYv66G0UTr765hgFATwPdWWh4LeiTVq+EbV6o7r6DbqKWPoeUPzLEdwKnCr0R/ng B4zg== Original-Received: by 10.50.57.138 with SMTP id i10mr20259223igq.68.1356374648233; Mon, 24 Dec 2012 10:44:08 -0800 (PST) Original-Received: by 10.64.38.129 with HTTP; Mon, 24 Dec 2012 10:44:07 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 140.186.70.43 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.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:69014 Archived-At: --14dae93408831720c804d19d9556 Content-Type: text/plain; charset=ISO-8859-1 At Stefan's request, I'm submitting a patch to convert `primitive-undo' from C to Lisp. I had originally submitted a version of this code to gnu-emacs-sources. http://lists.gnu.org/archive/html/gnu-emacs-sources/2012-11/msg00026.html This function is the engine behind the `undo' command in Emacs -- C-/, C-x u and so on. I've purposely cargo-culted the original C version, including carrying over the comments and the parts that I believe are vestigial. I've been using and maintaining this code since 2010 and haven't had any issues. In the while-loop over buffer-undo-list, Stefan suggested adding a new error condition for unrecognized entries. I've added such an error. Using this code daily I have not reached the error condition. Only with the unit tests that purposely fubar the contents of buffer-undo-list is the error reached. This patch is against trunk. I did not compile and test the C changes. And I've only tested the it in a pretest release for 24.2, not what is in trunk. I'm confident it should work given there are no differences in undo.c. To make up for these sins, I'm submitting unit tests. I wrote 6 tests that cover most of the execution paths and behavior. These tests call `primitive-undo' 27 times. I've benchmarked the Lisp and C versions using benchmark.el end `elp-instrument-function' by running the tests 100 times. The elapsed time of these tests on my computer for both versions of `primitive-undo' is approximately 300 seconds. (benchmark 100 '(let ((undo-test5-error nil)) (undo-test-all))) => Elapsed time: 305.218000s (104.841000s in 14804 GCs) (benchmark 100 '(undo-test-all)) ;; Lisp `primitive-undo' => Elapsed time: 295.974000s (104.582000s in 14704 GCs) Out of those 3 minutes, less than 4 seconds is attributable to `primitive-undo'. They average 1/700th (0.0014) of a second per call of `primitive-undo' for both versions. Function Name Call Count Elapsed Time Average Time ============= ========== ============ ============ primitive-undo C 2600 3.4889999999 0.0013419230 primitive-undo Lisp 2700 3.6869999999 0.0013655555 I've added these results to the unit tests source file for posterity. aaron -- In general, we reserve the right to have a poor memory--the computer, however, is supposed to remember! Poor computer. -- Guy Lewis Steele Jr. --14dae93408831720c804d19d9556 Content-Type: application/octet-stream; name="primundo.diff" Content-Disposition: attachment; filename="primundo.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hb3ycmxb0 LS0tIGxpc3AvQ2hhbmdlTG9nCTIwMTItMTItMjQgMTI6MTQ6MDQgKzAwMDAKKysrIGxpc3AvQ2hh bmdlTG9nCTIwMTItMTItMjQgMTg6MTI6MjQgKzAwMDAKQEAgLTEsMyArMSw4IEBACisyMDEyLTEy LTI0ICBBYXJvbiBTLiBIYXdsZXkgIDxhYXJvbi5zLmhhd2xleUBnbWFpbC5jb20+CisKKwkqIHNp bXBsZS5lbCAocHJpbWl0aXZlLXVuZG8pOiBUcmFuc2xhdGUgRnByaW1pdGl2ZV91bmRvIGluIHVu ZG8uYworCXRvIExpc3AuCisKIDIwMTItMTItMjQgIExhcnMgSW5nZWJyaWd0c2VuICA8bGFyc2lA Z251cy5vcmc+CiAKIAkqIG1haWwvc210cG1haWwuZWwgKHNtdHBtYWlsLXRyeS1hdXRoLW1ldGhv ZCk6IFJlZmFjdG9yZWQgb3V0IGludG8KCi0tLSBsaXNwL3NpbXBsZS5lbAkyMDEyLTEyLTIxIDA4 OjEwOjI2ICswMDAwCisrKyBsaXNwL3NpbXBsZS5lbAkyMDEyLTEyLTI0IDE3OjU0OjIwICswMDAw CkBAIC0xOTc5LDYgKzE5NzksMTQ0IEBACiAgICAgKGlmIChudWxsIHBlbmRpbmctdW5kby1saXN0 KQogCShzZXRxIHBlbmRpbmctdW5kby1saXN0IHQpKSkpCiAKKyhkZWZ1biBwcmltaXRpdmUtdW5k byAobiBsaXN0KQorICAiVW5kbyBOIHJlY29yZHMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qg TElTVC4KK1JldHVybiB3aGF0IHJlbWFpbnMgb2YgdGhlIGxpc3QuIgorCisgIDs7IFRoaXMgaXMg YSBnb29kIGZlYXR1cmUsIGJ1dCB3b3VsZCBtYWtlIHVuZG8tc3RhcnQKKyAgOzsgdW5hYmxlIHRv IGRvIHdoYXQgaXMgZXhwZWN0ZWQuCisgICh3aGVuIChub3QgJ2V2ZXIpCisgICAgOzsgSWYgdGhl IGhlYWQgb2YgdGhlIGxpc3QgaXMgYSBib3VuZGFyeSwgaXQgaXMgdGhlIGJvdW5kYXJ5CisgICAg OzsgcHJlY2VkaW5nIHRoaXMgY29tbWFuZC4gIEdldCByaWQgb2YgaXQgYW5kIGRvbid0IGNvdW50 IGl0LgorICAgICh3aGVuIChudWxsIChjYXIgKGxpc3QpKSkKKyAgICAgIChzZXRxIGxpc3QgKGNk ciBsaXN0KSkpKQorCisgICh3aGVuIChub3QgKG51bWJlcnAgbikpCisgICAgKHNpZ25hbCAnd3Jv bmctdHlwZS1hcmd1bWVudCAobGlzdCAnaW50ZWdlcnAgbikpKQorICAobGV0ICgoYXJnIG4pCisg ICAgICAgIDs7IEluIGEgd3JpdGFibGUgYnVmZmVyLCBlbmFibGUgdW5kb2luZyByZWFkLW9ubHkg dGV4dCB0aGF0IGlzCisgICAgICAgIDs7IHNvIGJlY2F1c2Ugb2YgdGV4dCBwcm9wZXJ0aWVzLgor ICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkKKyAgICAgICAgOzsgRG9uJ3QgbGV0IGBpbnRh bmdpYmxlJyBwcm9wZXJ0aWVzIGludGVyZmVyZSB3aXRoIHVuZG8uCisgICAgICAgIChpbmhpYml0 LXBvaW50LW1vdGlvbi1ob29rcyB0KQorICAgICAgICA7OyBXZSB1c2Ugb2xkbGlzdCBvbmx5IHRv IGNoZWNrIGZvciBFUS4gICsra2ZzCisgICAgICAgIChvbGRsaXN0IGJ1ZmZlci11bmRvLWxpc3Qp CisgICAgICAgIChkaWQtYXBwbHkgbmlsKQorICAgICAgICAobmV4dCBuaWwpKQorICAgICh3aGls ZSAoPiBhcmcgMCkKKyAgICAgICh3aGlsZSAoYW5kIChjb25zcCBsaXN0KQorICAgICAgICAgICAg ICAgICAgKHByb2duCisgICAgICAgICAgICAgICAgICAgIChzZXRxIG5leHQgKGNhciBsaXN0KSkK KyAgICAgICAgICAgICAgICAgICAgKHNldHEgbGlzdCAoY2RyIGxpc3QpKQorICAgICAgICAgICAg ICAgICAgICA7OyBFeGl0IGlubmVyIGxvb3AgYXQgdW5kbyBib3VuZGFyeS4KKyAgICAgICAgICAg ICAgICAgICAgKG5vdCAobnVsbCBuZXh0KSkpKQorICAgICAgICA7OyBIYW5kbGUgYW4gaW50ZWdl ciBieSBzZXR0aW5nIHBvaW50IHRvIHRoYXQgdmFsdWUuCisgICAgICAgIChjb25kCisgICAgICAg ICAoKGludGVnZXJwIG5leHQpIChnb3RvLWNoYXIgbmV4dCkpCisgICAgICAgICAoKGNvbnNwIG5l eHQpCisgICAgICAgICAgKGxldCAoKGNhciAoY2FyIG5leHQpKQorICAgICAgICAgICAgICAgIChj ZHIgKGNkciBuZXh0KSkpCisgICAgICAgICAgICAoY29uZAorICAgICAgICAgICAgIDs7IEVsZW1l bnQgKHQgLiBUSU1FKSByZWNvcmRzIHByZXZpb3VzIG1vZHRpbWUuCisgICAgICAgICAgICAgOzsg UHJlc2VydmUgYW55IGZsYWcgb2YgTk9ORVhJU1RFTlRfTU9EVElNRV9OU0VDUyBvcgorICAgICAg ICAgICAgIDs7IFVOS05PV05fTU9EVElNRV9OU0VDUy4KKyAgICAgICAgICAgICAoKGVxIHQgY2Fy KQorICAgICAgICAgICAgICA7OyBJZiB0aGlzIHJlY29yZHMgYW4gb2Jzb2xldGUgc2F2ZQorICAg ICAgICAgICAgICA7OyAobm90IG1hdGNoaW5nIHRoZSBhY3R1YWwgZGlzayBmaWxlKQorICAgICAg ICAgICAgICA7OyB0aGVuIGRvbid0IG1hcmsgdW5tb2RpZmllZC4KKyAgICAgICAgICAgICAgKHdo ZW4gKG9yIChlcXVhbCBjZHIgKHZpc2l0ZWQtZmlsZS1tb2R0aW1lKSkKKyAgICAgICAgICAgICAg ICAgICAgICAgIChhbmQgKGNvbnNwIGNkcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGVxdWFsIChsaXN0IChjYXIgY2RyKSAoY2RyIGNkcikpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAodmlzaXRlZC1maWxlLW1vZHRpbWUpKSkpCisgICAgICAgICAgICAgICAg KHdoZW4gKGZib3VuZHAgJ3VubG9jay1idWZmZXIpCisgICAgICAgICAgICAgICAgICAodW5sb2Nr LWJ1ZmZlcikpCisgICAgICAgICAgICAgICAgKHNldC1idWZmZXItbW9kaWZpZWQtcCBuaWwpKSkK KyAgICAgICAgICAgICA7OyBFbGVtZW50IChuaWwgUFJPUCBWQUwgQkVHIC4gRU5EKSBpcyBwcm9w ZXJ0eSBjaGFuZ2UuCisgICAgICAgICAgICAgKChlcSBuaWwgY2FyKQorICAgICAgICAgICAgICAo bGV0ICgoYmVnIChudGggMiBjZHIpKQorICAgICAgICAgICAgICAgICAgICAoZW5kIChudGhjZHIg MyBjZHIpKQorICAgICAgICAgICAgICAgICAgICAocHJvcCAoY2FyIGNkcikpCisgICAgICAgICAg ICAgICAgICAgICh2YWwgKGNhZHIgY2RyKSkpCisgICAgICAgICAgICAgICAgKHdoZW4gKG9yICg+ IChwb2ludC1taW4pIGJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDwgKHBvaW50LW1h eCkgZW5kKSkKKyAgICAgICAgICAgICAgICAgIChlcnJvciAiQ2hhbmdlcyB0byBiZSB1bmRvbmUg YXJlIG91dHNpZGUgdmlzaWJsZSBwb3J0aW9uIG9mIGJ1ZmZlciIpKQorICAgICAgICAgICAgICAg IChwdXQtdGV4dC1wcm9wZXJ0eSBiZWcgZW5kIHByb3AgdmFsKSkpCisgICAgICAgICAgICAgKChh bmQgKGludGVnZXJwIGNhcikgKGludGVnZXJwIGNkcikpCisgICAgICAgICAgICAgIDs7IEVsZW1l bnQgKEJFRyAuIEVORCkgbWVhbnMgcmFuZ2Ugd2FzIGluc2VydGVkLgorICAgICAgICAgICAgICAo d2hlbiAob3IgKDwgY2FyIChwb2ludC1taW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgKD4g Y2RyIChwb2ludC1tYXgpKSkKKyAgICAgICAgICAgICAgICAoZXJyb3IgIkNoYW5nZXMgdG8gYmUg dW5kb25lIGFyZSBvdXRzaWRlIHZpc2libGUgcG9ydGlvbiBvZiBidWZmZXIiKSkKKyAgICAgICAg ICAgICAgOzsgU2V0IHBvaW50IGZpcnN0IHRoaW5nLCBzbyB0aGF0IHVuZG9pbmcgdGhpcyB1bmRv CisgICAgICAgICAgICAgIDs7IGRvZXMgbm90IHNlbmQgcG9pbnQgYmFjayB0byB3aGVyZSBpdCBp cyBub3cuCisgICAgICAgICAgICAgIChnb3RvLWNoYXIgY2FyKQorICAgICAgICAgICAgICAoZGVs ZXRlLXJlZ2lvbiBjYXIgY2RyKSkKKyAgICAgICAgICAgICAoKGVxIGNhciAnYXBwbHkpCisgICAg ICAgICAgICAgIDs7IEVsZW1lbnQgKGFwcGx5IEZVTiAuIEFSR1MpIG1lYW5zIGNhbGwgRlVOIHRv IHVuZG8uCisgICAgICAgICAgICAgIChsZXQgKChjdXJyYnVmZiAoY3VycmVudC1idWZmZXIpKQor ICAgICAgICAgICAgICAgICAgICAoY2FyIChjYXIgY2RyKSkKKyAgICAgICAgICAgICAgICAgICAg KGNkciAoY2RyIGNkcikpKQorICAgICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgY2FyKQorICAg ICAgICAgICAgICAgICAgICA7OyBMb25nIGZvcm1hdDogKGFwcGx5IERFTFRBIFNUQVJUIEVORCBG VU4gLiBBUkdTKS4KKyAgICAgICAgICAgICAgICAgICAgKGxldCogKChkZWx0YSBjYXIpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnQgKGNhciBjZHIpKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGVuZCAoY2FkciBjZHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg KHN0YXJ0LW1hcmsgKGNvcHktbWFya2VyIHN0YXJ0IG5pbCkpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAoZW5kLW1hcmsgKGNvcHktbWFya2VyIGVuZCB0KSkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgIChjZHIgKGNkZHIgY2RyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChm dW4gKGNhciBjZHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MgKGNkciBjZHIp KSkKKyAgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgZnVuIGFyZ3MpIDs7IFVzZSBgc2F2ZS1j dXJyZW50LWJ1ZmZlcic/CisgICAgICAgICAgICAgICAgICAgICAgOzsgQ2hlY2sgdGhhdCB0aGUg ZnVuY3Rpb24gZGlkIHdoYXQgdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgOzsgc2Fp ZCBpdCB3b3VsZCBkby4KKyAgICAgICAgICAgICAgICAgICAgICAodW5sZXNzIChhbmQgKGVxIHN0 YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFya2VyLXBvc2l0 aW9uIHN0YXJ0LW1hcmspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEg KCsgZGVsdGEgZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1h cmtlci1wb3NpdGlvbiBlbmQtbWFyaykpKQorICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9y ICJDaGFuZ2VzIHRvIGJlIHVuZG9uZSBieSBmdW5jdGlvbiBkaWZmZXJlbnQgdGhhbiBhbm5vdW5j ZWQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAoc2V0LW1hcmtlciBzdGFydC1tYXJrIG5pbCkK KyAgICAgICAgICAgICAgICAgICAgICAoc2V0LW1hcmtlciBlbmQtbWFyayBuaWwpKQorICAgICAg ICAgICAgICAgICAgKGFwcGx5IGNhciBjZHIpKQorICAgICAgICAgICAgICAgICh1bmxlc3MgKGVx IGN1cnJidWZmIChjdXJyZW50LWJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAoZXJyb3IgIlVu ZG8gZnVuY3Rpb24gc3dpdGNoZWQgYnVmZmVyIikpCisgICAgICAgICAgICAgICAgKHNldHEgZGlk LWFwcGx5IHQpKSkKKyAgICAgICAgICAgICAoKGFuZCAoc3RyaW5ncCBjYXIpIChpbnRlZ2VycCBj ZHIpKQorICAgICAgICAgICAgICA7OyBFbGVtZW50IChTVFJJTkcgLiBQT1MpIG1lYW5zIFNUUklO RyB3YXMgZGVsZXRlZC4KKyAgICAgICAgICAgICAgKGxldCAoKG1lbWJ1ZiBjYXIpCisgICAgICAg ICAgICAgICAgICAgIChwb3MgY2RyKSkKKyAgICAgICAgICAgICAgICAod2hlbiAob3IgKDwgKGFi cyBwb3MpIChwb2ludC1taW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoPiAoYWJzIHBv cykgKHBvaW50LW1heCkpKQorICAgICAgICAgICAgICAgICAgKGVycm9yICJDaGFuZ2VzIHRvIGJl IHVuZG9uZSBhcmUgb3V0c2lkZSB2aXNpYmxlIHBvcnRpb24gb2YgYnVmZmVyIikpCisgICAgICAg ICAgICAgICAgKGlmICg8IHBvcyAwKQorICAgICAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAg ICAgICAgICAgICAgICAgICAoZ290by1jaGFyICgtIHBvcykpCisgICAgICAgICAgICAgICAgICAg ICAgKGluc2VydCBtZW1idWYpKQorICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciBwb3MpCisg ICAgICAgICAgICAgICAgICA7OyBOb3cgdGhhdCB3ZSByZWNvcmQgbWFya2VyIGFkanVzdG1lbnRz CisgICAgICAgICAgICAgICAgICA7OyAoY2F1c2VkIGJ5IGRlbGV0aW9uKSBmb3IgdW5kbywKKyAg ICAgICAgICAgICAgICAgIDs7IHdlIHNob3VsZCBhbHdheXMgaW5zZXJ0IGFmdGVyIG1hcmtlcnMs CisgICAgICAgICAgICAgICAgICA7OyBzbyB0aGF0IHVuZG9pbmcgdGhlIG1hcmtlciBhZGp1c3Rt ZW50cworICAgICAgICAgICAgICAgICAgOzsgcHV0IHRoZSBtYXJrZXJzIGJhY2sgaW4gdGhlIHJp Z2h0IHBsYWNlLgorICAgICAgICAgICAgICAgICAgKGluc2VydCBtZW1idWYpCisgICAgICAgICAg ICAgICAgICAoZ290by1jaGFyIHBvcykpKSkKKyAgICAgICAgICAgICAoKGFuZCAobWFya2VycCBj YXIpIChpbnRlZ2VycCBjZHIpKQorICAgICAgICAgICAgICA7OyAoTUFSS0VSIC4gSU5URUdFUikg bWVhbnMgYSBtYXJrZXIgTUFSS0VSCisgICAgICAgICAgICAgIDs7IHdhcyBhZGp1c3RlZCBieSBJ TlRFR0VSLgorICAgICAgICAgICAgICAod2hlbiAobWFya2VyLWJ1ZmZlciBjYXIpCisgICAgICAg ICAgICAgICAgKHNldC1tYXJrZXIgY2FyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0g KG1hcmtlci1wb3NpdGlvbiBjYXIpIGNkcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bWFya2VyLWJ1ZmZlciBjYXIpKSkpCisgICAgICAgICAgICAgKHQgKGVycm9yICJVbnJlY29nbml6 ZWQgZW50cnkgaW4gdW5kbyBsaXN0ICVTIiBuZXh0KSkpKSkKKyAgICAgICAgICh0IChlcnJvciAi VW5yZWNvZ25pemVkIGVudHJ5IGluIHVuZG8gbGlzdCAlUyIgbmV4dCkpKSkKKyAgICAgIChzZXRx IGFyZyAoMS0gYXJnKSkpCisgICAgOzsgTWFrZSBzdXJlIGFuIGFwcGx5IGVudHJ5IHByb2R1Y2Vz IGF0IGxlYXN0IG9uZSB1bmRvIGVudHJ5LAorICAgIDs7IHNvIHRoZSB0ZXN0IGluIGB1bmRvJyBm b3IgY29udGludWluZyBhbiB1bmRvIHNlcmllcworICAgIDs7IHdpbGwgd29yayByaWdodC4KKyAg ICAoaWYgKGFuZCBkaWQtYXBwbHkKKyAgICAgICAgICAgICAoZXEgb2xkbGlzdCBidWZmZXItdW5k by1saXN0KSkKKyAgICAgICAgKHNldHEgYnVmZmVyLXVuZG8tbGlzdAorICAgICAgICAgICAgICAo Y29ucyAobGlzdCAnYXBwbHkgJ2NkciBuaWwpIGJ1ZmZlci11bmRvLWxpc3QpKSkpCisgIGxpc3Qp CisKIDs7IERlZXAgY29weSBvZiBhIGxpc3QKIChkZWZ1biB1bmRvLWNvcHktbGlzdCAobGlzdCkK ICAgIk1ha2UgYSBjb3B5IG9mIHVuZG8gbGlzdCBMSVNULiIKCi0tLSBzcmMvQ2hhbmdlTG9nCTIw MTItMTItMjQgMTI6MjE6NDIgKzAwMDAKKysrIHNyYy9DaGFuZ2VMb2cJMjAxMi0xMi0yNCAxODox MjoxMSArMDAwMApAQCAtMSwzICsxLDEwIEBACisyMDEyLTEyLTI0ICBBYXJvbiBTLiBIYXdsZXkg IDxhYXJvbi5zLmhhd2xleUBnbWFpbC5jb20+CisKKwkqIHVuZG8uYyAoRnByaW1pdGl2ZV91bmRv KTogUmVtb3ZlIGFuZCB0cmFuc2xhdGVkIHRvIExpc3AgYXMKKwlwcmltaXRpdmUtdW5kby4KKwko c3ltc19vZl91bmRvKTogUmVtb3ZlIGRlY2xhcmF0YXRpb25zIGZvciBTcHJpbWl0aXZlX3VuZG8s CisJUWluaGliaXRfcmVhZF9vbmx5LCBhbmQgUWFwcGx5LgorCiAyMDEyLTEyLTI0ICBEbWl0cnkg QW50aXBvdiAgPGRtYW50aXBvdkB5YW5kZXgucnU+CiAKIAkqIGJ1ZmZlci5oIChCVUZfQ09NUEFD VCk6IE5ldyBtYWNybyB0byBmb2xsb3cgdGhlIGNvbW1vbiBzdHlsZS4KCi0tLSBzcmMvdW5kby5j CTIwMTItMDktMTUgMDc6MDY6NTYgKzAwMDAKKysrIHNyYy91bmRvLmMJMjAxMi0xMi0yNCAxNzo1 Mjo0MSArMDAwMApAQCAtNDUxLDIzMCArNDUxLDE1IEBACiB9CiAKIAwKLURFRlVOICgicHJpbWl0 aXZlLXVuZG8iLCBGcHJpbWl0aXZlX3VuZG8sIFNwcmltaXRpdmVfdW5kbywgMiwgMiwgMCwKLSAg ICAgICBkb2M6IC8qIFVuZG8gTiByZWNvcmRzIGZyb20gdGhlIGZyb250IG9mIHRoZSBsaXN0IExJ U1QuCi1SZXR1cm4gd2hhdCByZW1haW5zIG9mIHRoZSBsaXN0LiAgKi8pCi0gIChMaXNwX09iamVj dCBuLCBMaXNwX09iamVjdCBsaXN0KQotewotICBzdHJ1Y3QgZ2Nwcm8gZ2Nwcm8xLCBnY3BybzI7 Ci0gIExpc3BfT2JqZWN0IG5leHQ7Ci0gIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQRExfSU5ERVgg KCk7Ci0gIHJlZ2lzdGVyIEVNQUNTX0lOVCBhcmc7Ci0gIExpc3BfT2JqZWN0IG9sZGxpc3Q7Ci0g IGludCBkaWRfYXBwbHkgPSAwOwotCi0jaWYgMCAgLyogVGhpcyBpcyBhIGdvb2QgZmVhdHVyZSwg YnV0IHdvdWxkIG1ha2UgdW5kby1zdGFydAotCSAgdW5hYmxlIHRvIGRvIHdoYXQgaXMgZXhwZWN0 ZWQuICAqLwotICBMaXNwX09iamVjdCB0ZW07Ci0KLSAgLyogSWYgdGhlIGhlYWQgb2YgdGhlIGxp c3QgaXMgYSBib3VuZGFyeSwgaXQgaXMgdGhlIGJvdW5kYXJ5Ci0gICAgIHByZWNlZGluZyB0aGlz IGNvbW1hbmQuICBHZXQgcmlkIG9mIGl0IGFuZCBkb24ndCBjb3VudCBpdC4gICovCi0gIHRlbSA9 IEZjYXIgKGxpc3QpOwotICBpZiAoTklMUCAodGVtKSkKLSAgICBsaXN0ID0gRmNkciAobGlzdCk7 Ci0jZW5kaWYKLQotICBDSEVDS19OVU1CRVIgKG4pOwotICBhcmcgPSBYSU5UIChuKTsKLSAgbmV4 dCA9IFFuaWw7Ci0gIEdDUFJPMiAobmV4dCwgbGlzdCk7Ci0gIC8qIEkgZG9uJ3QgdGhpbmsgd2Ug bmVlZCB0byBnY3BybyBvbGRsaXN0LCBhcyB3ZSB1c2UgaXQgb25seQotICAgICB0byBjaGVjayBm b3IgRVEuICArK2tmcyAgKi8KLQotICAvKiBJbiBhIHdyaXRhYmxlIGJ1ZmZlciwgZW5hYmxlIHVu ZG9pbmcgcmVhZC1vbmx5IHRleHQgdGhhdCBpcyBzbwotICAgICBiZWNhdXNlIG9mIHRleHQgcHJv cGVydGllcy4gICovCi0gIGlmIChOSUxQIChCVkFSIChjdXJyZW50X2J1ZmZlciwgcmVhZF9vbmx5 KSkpCi0gICAgc3BlY2JpbmQgKFFpbmhpYml0X3JlYWRfb25seSwgUXQpOwotCi0gIC8qIERvbid0 IGxldCBgaW50YW5naWJsZScgcHJvcGVydGllcyBpbnRlcmZlcmUgd2l0aCB1bmRvLiAgKi8KLSAg c3BlY2JpbmQgKFFpbmhpYml0X3BvaW50X21vdGlvbl9ob29rcywgUXQpOwotCi0gIG9sZGxpc3Qg PSBCVkFSIChjdXJyZW50X2J1ZmZlciwgdW5kb19saXN0KTsKLQotICB3aGlsZSAoYXJnID4gMCkK LSAgICB7Ci0gICAgICB3aGlsZSAoQ09OU1AgKGxpc3QpKQotCXsKLQkgIG5leHQgPSBYQ0FSIChs aXN0KTsKLQkgIGxpc3QgPSBYQ0RSIChsaXN0KTsKLQkgIC8qIEV4aXQgaW5uZXIgbG9vcCBhdCB1 bmRvIGJvdW5kYXJ5LiAgKi8KLQkgIGlmIChOSUxQIChuZXh0KSkKLQkgICAgYnJlYWs7Ci0JICAv KiBIYW5kbGUgYW4gaW50ZWdlciBieSBzZXR0aW5nIHBvaW50IHRvIHRoYXQgdmFsdWUuICAqLwot CSAgaWYgKElOVEVHRVJQIChuZXh0KSkKLQkgICAgU0VUX1BUIChjbGlwX3RvX2JvdW5kcyAoQkVH ViwgWElOVCAobmV4dCksIFpWKSk7Ci0JICBlbHNlIGlmIChDT05TUCAobmV4dCkpCi0JICAgIHsK LQkgICAgICBMaXNwX09iamVjdCBjYXIsIGNkcjsKLQotCSAgICAgIGNhciA9IFhDQVIgKG5leHQp OwotCSAgICAgIGNkciA9IFhDRFIgKG5leHQpOwotCSAgICAgIGlmIChFUSAoY2FyLCBRdCkpCi0J CXsKLQkJICAvKiBFbGVtZW50ICh0IC4gVElNRSkgcmVjb3JkcyBwcmV2aW91cyBtb2R0aW1lLgot CQkgICAgIFByZXNlcnZlIGFueSBmbGFnIG9mIE5PTkVYSVNURU5UX01PRFRJTUVfTlNFQ1Mgb3IK LQkJICAgICBVTktOT1dOX01PRFRJTUVfTlNFQ1MuICAqLwotCQkgIHN0cnVjdCBidWZmZXIgKmJh c2VfYnVmZmVyID0gY3VycmVudF9idWZmZXI7Ci0JCSAgRU1BQ1NfVElNRSBtb2RfdGltZTsKLQot CQkgIGlmIChDT05TUCAoY2RyKQotCQkgICAgICAmJiBDT05TUCAoWENEUiAoY2RyKSkKLQkJICAg ICAgJiYgQ09OU1AgKFhDRFIgKFhDRFIgKGNkcikpKQotCQkgICAgICAmJiBDT05TUCAoWENEUiAo WENEUiAoWENEUiAoY2RyKSkpKQotCQkgICAgICAmJiBJTlRFR0VSUCAoWENBUiAoWENEUiAoWENE UiAoWENEUiAoY2RyKSkpKSkKLQkJICAgICAgJiYgWElOVCAoWENBUiAoWENEUiAoWENEUiAoWENE UiAoY2RyKSkpKSkgPCAwKQotCQkgICAgbW9kX3RpbWUgPQotCQkgICAgICAobWFrZV9lbWFjc190 aW1lCi0JCSAgICAgICAoMCwgWElOVCAoWENBUiAoWENEUiAoWENEUiAoWENEUiAoY2RyKSkpKSkg LyAxMDAwKSk7Ci0JCSAgZWxzZQotCQkgICAgbW9kX3RpbWUgPSBsaXNwX3RpbWVfYXJndW1lbnQg KGNkcik7Ci0KLQkJICBpZiAoY3VycmVudF9idWZmZXItPmJhc2VfYnVmZmVyKQotCQkgICAgYmFz ZV9idWZmZXIgPSBjdXJyZW50X2J1ZmZlci0+YmFzZV9idWZmZXI7Ci0KLQkJICAvKiBJZiB0aGlz IHJlY29yZHMgYW4gb2Jzb2xldGUgc2F2ZQotCQkgICAgIChub3QgbWF0Y2hpbmcgdGhlIGFjdHVh bCBkaXNrIGZpbGUpCi0JCSAgICAgdGhlbiBkb24ndCBtYXJrIHVubW9kaWZpZWQuICAqLwotCQkg IGlmIChFTUFDU19USU1FX05FIChtb2RfdGltZSwgYmFzZV9idWZmZXItPm1vZHRpbWUpKQotCQkg ICAgY29udGludWU7Ci0jaWZkZWYgQ0xBU0hfREVURUNUSU9OCi0JCSAgRnVubG9ja19idWZmZXIg KCk7Ci0jZW5kaWYgLyogQ0xBU0hfREVURUNUSU9OICovCi0JCSAgRnNldF9idWZmZXJfbW9kaWZp ZWRfcCAoUW5pbCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChFUSAoY2FyLCBRbmlsKSkKLQkJewot CQkgIC8qIEVsZW1lbnQgKG5pbCBQUk9QIFZBTCBCRUcgLiBFTkQpIGlzIHByb3BlcnR5IGNoYW5n ZS4gICovCi0JCSAgTGlzcF9PYmplY3QgYmVnLCBlbmQsIHByb3AsIHZhbDsKLQotCQkgIHByb3Ag PSBGY2FyIChjZHIpOwotCQkgIGNkciA9IEZjZHIgKGNkcik7Ci0JCSAgdmFsID0gRmNhciAoY2Ry KTsKLQkJICBjZHIgPSBGY2RyIChjZHIpOwotCQkgIGJlZyA9IEZjYXIgKGNkcik7Ci0JCSAgZW5k ID0gRmNkciAoY2RyKTsKLQotCQkgIGlmIChYSU5UIChiZWcpIDwgQkVHViB8fCBYSU5UIChlbmQp ID4gWlYpCi0JCSAgICB1c2VyX2Vycm9yICgiQ2hhbmdlcyB0byBiZSB1bmRvbmUgYXJlIG91dHNp ZGUgdmlzaWJsZSBwb3J0aW9uIG9mIGJ1ZmZlciIpOwotCQkgIEZwdXRfdGV4dF9wcm9wZXJ0eSAo YmVnLCBlbmQsIHByb3AsIHZhbCwgUW5pbCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChJTlRFR0VS UCAoY2FyKSAmJiBJTlRFR0VSUCAoY2RyKSkKLQkJewotCQkgIC8qIEVsZW1lbnQgKEJFRyAuIEVO RCkgbWVhbnMgcmFuZ2Ugd2FzIGluc2VydGVkLiAgKi8KLQotCQkgIGlmIChYSU5UIChjYXIpIDwg QkVHVgotCQkgICAgICB8fCBYSU5UIChjZHIpID4gWlYpCi0JCSAgICB1c2VyX2Vycm9yICgiQ2hh bmdlcyB0byBiZSB1bmRvbmUgYXJlIG91dHNpZGUgdmlzaWJsZSBwb3J0aW9uIG9mIGJ1ZmZlciIp OwotCQkgIC8qIFNldCBwb2ludCBmaXJzdCB0aGluZywgc28gdGhhdCB1bmRvaW5nIHRoaXMgdW5k bwotCQkgICAgIGRvZXMgbm90IHNlbmQgcG9pbnQgYmFjayB0byB3aGVyZSBpdCBpcyBub3cuICAq LwotCQkgIEZnb3RvX2NoYXIgKGNhcik7Ci0JCSAgRmRlbGV0ZV9yZWdpb24gKGNhciwgY2RyKTsK LQkJfQotCSAgICAgIGVsc2UgaWYgKEVRIChjYXIsIFFhcHBseSkpCi0JCXsKLQkJICAvKiBFbGVt ZW50IChhcHBseSBGVU4gLiBBUkdTKSBtZWFucyBjYWxsIEZVTiB0byB1bmRvLiAgKi8KLQkJICBz dHJ1Y3QgYnVmZmVyICpzYXZlX2J1ZmZlciA9IGN1cnJlbnRfYnVmZmVyOwotCi0JCSAgY2FyID0g RmNhciAoY2RyKTsKLQkJICBjZHIgPSBGY2RyIChjZHIpOwotCQkgIGlmIChJTlRFR0VSUCAoY2Fy KSkKLQkJICAgIHsKLQkJICAgICAgLyogTG9uZyBmb3JtYXQ6IChhcHBseSBERUxUQSBTVEFSVCBF TkQgRlVOIC4gQVJHUykuICAqLwotCQkgICAgICBMaXNwX09iamVjdCBkZWx0YSA9IGNhcjsKLQkJ ICAgICAgTGlzcF9PYmplY3Qgc3RhcnQgPSBGY2FyIChjZHIpOwotCQkgICAgICBMaXNwX09iamVj dCBlbmQgICA9IEZjYXIgKEZjZHIgKGNkcikpOwotCQkgICAgICBMaXNwX09iamVjdCBzdGFydF9t YXJrID0gRmNvcHlfbWFya2VyIChzdGFydCwgUW5pbCk7Ci0JCSAgICAgIExpc3BfT2JqZWN0IGVu ZF9tYXJrICAgPSBGY29weV9tYXJrZXIgKGVuZCwgUXQpOwotCi0JCSAgICAgIGNkciA9IEZjZHIg KEZjZHIgKGNkcikpOwotCQkgICAgICBhcHBseTEgKEZjYXIgKGNkciksIEZjZHIgKGNkcikpOwot Ci0JCSAgICAgIC8qIENoZWNrIHRoYXQgdGhlIGZ1bmN0aW9uIGRpZCB3aGF0IHRoZSBlbnRyeSBz YWlkIGl0Ci0JCQkgd291bGQgZG8uICAqLwotCQkgICAgICBpZiAoIUVRIChzdGFydCwgRm1hcmtl cl9wb3NpdGlvbiAoc3RhcnRfbWFyaykpCi0JCQkgIHx8IChYSU5UIChkZWx0YSkgKyBYSU5UIChl bmQpCi0JCQkgICAgICAhPSBtYXJrZXJfcG9zaXRpb24gKGVuZF9tYXJrKSkpCi0JCQllcnJvciAo IkNoYW5nZXMgdG8gYmUgdW5kb25lIGJ5IGZ1bmN0aW9uIGRpZmZlcmVudCB0aGFuIGFubm91bmNl ZCIpOwotCQkgICAgICBGc2V0X21hcmtlciAoc3RhcnRfbWFyaywgUW5pbCwgUW5pbCk7Ci0JCSAg ICAgIEZzZXRfbWFya2VyIChlbmRfbWFyaywgUW5pbCwgUW5pbCk7Ci0JCSAgICB9Ci0JCSAgZWxz ZQotCQkgICAgYXBwbHkxIChjYXIsIGNkcik7Ci0KLQkJICBpZiAoc2F2ZV9idWZmZXIgIT0gY3Vy cmVudF9idWZmZXIpCi0JCSAgICBlcnJvciAoIlVuZG8gZnVuY3Rpb24gc3dpdGNoZWQgYnVmZmVy Iik7Ci0JCSAgZGlkX2FwcGx5ID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKFNUUklOR1AgKGNh cikgJiYgSU5URUdFUlAgKGNkcikpCi0JCXsKLQkJICAvKiBFbGVtZW50IChTVFJJTkcgLiBQT1Mp IG1lYW5zIFNUUklORyB3YXMgZGVsZXRlZC4gICovCi0JCSAgTGlzcF9PYmplY3QgbWVtYnVmOwot CQkgIEVNQUNTX0lOVCBwb3MgPSBYSU5UIChjZHIpOwotCi0JCSAgbWVtYnVmID0gY2FyOwotCQkg IGlmIChwb3MgPCAwKQotCQkgICAgewotCQkgICAgICBpZiAoLXBvcyA8IEJFR1YgfHwgLXBvcyA+ IFpWKQotCQkJdXNlcl9lcnJvciAoIkNoYW5nZXMgdG8gYmUgdW5kb25lIGFyZSBvdXRzaWRlIHZp c2libGUgcG9ydGlvbiBvZiBidWZmZXIiKTsKLQkJICAgICAgU0VUX1BUICgtcG9zKTsKLQkJICAg ICAgRmluc2VydCAoMSwgJm1lbWJ1Zik7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkg ICAgICBpZiAocG9zIDwgQkVHViB8fCBwb3MgPiBaVikKLQkJCXVzZXJfZXJyb3IgKCJDaGFuZ2Vz IHRvIGJlIHVuZG9uZSBhcmUgb3V0c2lkZSB2aXNpYmxlIHBvcnRpb24gb2YgYnVmZmVyIik7Ci0J CSAgICAgIFNFVF9QVCAocG9zKTsKLQotCQkgICAgICAvKiBOb3cgdGhhdCB3ZSByZWNvcmQgbWFy a2VyIGFkanVzdG1lbnRzCi0JCQkgKGNhdXNlZCBieSBkZWxldGlvbikgZm9yIHVuZG8sCi0JCQkg d2Ugc2hvdWxkIGFsd2F5cyBpbnNlcnQgYWZ0ZXIgbWFya2VycywKLQkJCSBzbyB0aGF0IHVuZG9p bmcgdGhlIG1hcmtlciBhZGp1c3RtZW50cwotCQkJIHB1dCB0aGUgbWFya2VycyBiYWNrIGluIHRo ZSByaWdodCBwbGFjZS4gICovCi0JCSAgICAgIEZpbnNlcnQgKDEsICZtZW1idWYpOwotCQkgICAg ICBTRVRfUFQgKHBvcyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChNQVJLRVJQIChj YXIpICYmIElOVEVHRVJQIChjZHIpKQotCQl7Ci0JCSAgLyogKE1BUktFUiAuIElOVEVHRVIpIG1l YW5zIGEgbWFya2VyIE1BUktFUgotCQkgICAgIHdhcyBhZGp1c3RlZCBieSBJTlRFR0VSLiAgKi8K LQkJICBpZiAoWE1BUktFUiAoY2FyKS0+YnVmZmVyKQotCQkgICAgRnNldF9tYXJrZXIgKGNhciwK LQkJCQkgbWFrZV9udW1iZXIgKG1hcmtlcl9wb3NpdGlvbiAoY2FyKSAtIFhJTlQgKGNkcikpLAot CQkJCSBGbWFya2VyX2J1ZmZlciAoY2FyKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGFyZy0t OwotICAgIH0KLQotCi0gIC8qIE1ha2Ugc3VyZSBhbiBhcHBseSBlbnRyeSBwcm9kdWNlcyBhdCBs ZWFzdCBvbmUgdW5kbyBlbnRyeSwKLSAgICAgc28gdGhlIHRlc3QgaW4gYHVuZG8nIGZvciBjb250 aW51aW5nIGFuIHVuZG8gc2VyaWVzCi0gICAgIHdpbGwgd29yayByaWdodC4gICovCi0gIGlmIChk aWRfYXBwbHkKLSAgICAgICYmIEVRIChvbGRsaXN0LCBCVkFSIChjdXJyZW50X2J1ZmZlciwgdW5k b19saXN0KSkpCi0gICAgYnNldF91bmRvX2xpc3QKLSAgICAgIChjdXJyZW50X2J1ZmZlciwKLSAg ICAgICBGY29ucyAobGlzdDMgKFFhcHBseSwgUWNkciwgUW5pbCksIEJWQVIgKGN1cnJlbnRfYnVm ZmVyLCB1bmRvX2xpc3QpKSk7Ci0KLSAgVU5HQ1BSTzsKLSAgcmV0dXJuIHVuYmluZF90byAoY291 bnQsIGxpc3QpOwotfQotDAogdm9pZAogc3ltc19vZl91bmRvICh2b2lkKQogewotICBERUZTWU0g KFFpbmhpYml0X3JlYWRfb25seSwgImluaGliaXQtcmVhZC1vbmx5Iik7Ci0gIERFRlNZTSAoUWFw cGx5LCAiYXBwbHkiKTsKLQogICBwZW5kaW5nX2JvdW5kYXJ5ID0gUW5pbDsKICAgc3RhdGljcHJv ICgmcGVuZGluZ19ib3VuZGFyeSk7CiAKICAgbGFzdF91bmRvX2J1ZmZlciA9IE5VTEw7CiAgIGxh c3RfYm91bmRhcnlfYnVmZmVyID0gTlVMTDsKIAotICBkZWZzdWJyICgmU3ByaW1pdGl2ZV91bmRv KTsKICAgZGVmc3ViciAoJlN1bmRvX2JvdW5kYXJ5KTsKIAogICBERUZWQVJfSU5UICgidW5kby1s aW1pdCIsIHVuZG9fbGltaXQsCgotLS0gdGVzdC9DaGFuZ2VMb2cJMjAxMi0xMi0xNCAwNjo1ODox NSArMDAwMAorKysgdGVzdC9DaGFuZ2VMb2cJMjAxMi0xMi0yNCAxODoxMjowMyArMDAwMApAQCAt MSwzICsxLDcgQEAKKzIwMTItMTItMjQgIEFhcm9uIFMuIEhhd2xleSAgPGFhcm9uLnMuaGF3bGV5 QGdtYWlsLmNvbT4KKworCSogYXV0b21hdGVkL3VuZG8tdGVzdHMuZWw6IE5ldyBmaWxlLgorCiAy MDEyLTEyLTE0ICBEbWl0cnkgR3V0b3YgIDxkZ3V0b3ZAeWFuZGV4LnJ1PgogCiAJKiBhdXRvbWF0 ZWQvcnVieS1tb2RlLXRlc3RzLmVsCgotLS0gdGVzdC9hdXRvbWF0ZWQvdW5kby10ZXN0cy5lbAkx OTcwLTAxLTAxIDAwOjAwOjAwICswMDAwCisrKyB0ZXN0L2F1dG9tYXRlZC91bmRvLXRlc3RzLmVs CTIwMTItMTItMjQgMTg6MDA6MDEgKzAwMDAKQEAgLTAsMCArMSwyMzEgQEAKKzs7OyB1bmRvLXRl c3RzLmVsIC0tLSBUZXN0cyBvZiBwcmltaXRpdmUtdW5kbworCis7OyBDb3B5cmlnaHQgKEMpIDIw MTIgIEFhcm9uIFMuIEhhd2xleQorCis7OyBBdXRob3I6IEFhcm9uIFMuIEhhd2xleSA8YWFyb24u cy5oYXdsZXlAZ21haWwuY29tPgorCis7OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTog eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7OyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworOzsgcHVibGlzaGVkIGJ5 IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlCis7 OyBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzsKKzs7 IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLCBidXQKKzs7IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YKKzs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7OyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKzs7IGFsb25nIHdpdGggdGhpcyBw cm9ncmFtLiAgSWYgbm90LCBzZWUgYGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8nLgorCis7 OzsgQ29tbWVudGFyeToKKworOzsgUHJvZmlsaW5nIHdoZW4gdGhlIGNvZGUgd2FzIHRyYW5zbGF0 ZSBmcm9tIEMgdG8gTGlzcCBvbiAyMDEyLTEyLTI0LgorCis7OzsgQworCis7OyAoZWxwLWluc3Ry dW1lbnQtZnVuY3Rpb24gJ3ByaW1pdGl2ZS11bmRvKQorOzsgKGxvYWQtZmlsZSAidW5kby10ZXN0 LmVsYyIpCis7OyAoYmVuY2htYXJrIDEwMCAnKGxldCAoKHVuZG8tdGVzdDUtZXJyb3IgbmlsKSkg KHVuZG8tdGVzdC1hbGwpKSkKKzs7IEVsYXBzZWQgdGltZTogMzA1LjIxODAwMHMgKDEwNC44NDEw MDBzIGluIDE0ODA0IEdDcykKKzs7IE0teCBlbHAtcmVzdWx0cworOzsgRnVuY3Rpb24gTmFtZSAg IENhbGwgQ291bnQgIEVsYXBzZWQgVGltZSAgQXZlcmFnZSBUaW1lCis7OyBwcmltaXRpdmUtdW5k byAgMjYwMCAgICAgICAgMy40ODg5OTk5OTk5ICAwLjAwMTM0MTkyMzAKKworOzs7IExpc3AKKwor OzsgKGxvYWQtZmlsZSAicHJpbXVuZG8uZWxjIikKKzs7IChlbHAtaW5zdHJ1bWVudC1mdW5jdGlv biAncHJpbWl0aXZlLXVuZG8pCis7OyAoYmVuY2htYXJrIDEwMCAnKHVuZG8tdGVzdC1hbGwpKQor OzsgRWxhcHNlZCB0aW1lOiAyOTUuOTc0MDAwcyAoMTA0LjU4MjAwMHMgaW4gMTQ3MDQgR0NzKQor OzsgTS14IGVscC1yZXN1bHRzCis7OyBGdW5jdGlvbiBOYW1lICAgQ2FsbCBDb3VudCAgRWxhcHNl ZCBUaW1lICBBdmVyYWdlIFRpbWUKKzs7IHByaW1pdGl2ZS11bmRvICAyNzAwICAgICAgICAzLjY4 Njk5OTk5OTkgIDAuMDAxMzY1NTU1NQorCis7OzsgQ29kZToKKworKHJlcXVpcmUgJ2VydCkKKwor KGVydC1kZWZ0ZXN0IHVuZG8tdGVzdDAgKCkKKyAgIlRlc3QgYmFzaWNzIG9mIFxcW3VuZG9dLiIK KyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAoYnVmZmVyLWVuYWJsZS11bmRvKQorICAgIChjb25k aXRpb24tY2FzZSBlcnIKKyAgICAgICh1bmRvKQorICAgICAgKGVycm9yCisgICAgICAgKHVubGVz cyAoc3RyaW5nPSAiTm8gZnVydGhlciB1bmRvIGluZm9ybWF0aW9uIgorICAgICAgICAgICAgICAg ICAgICAgICAgKGNhZHIgZXJyKSkKKyAgICAgICAgIChlcnJvciBlcnIpKSkpCisgICAgKHVuZG8t Ym91bmRhcnkpCisgICAgKGluc2VydCAiVGhpcyIpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAg KGVyYXNlLWJ1ZmZlcikKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoaW5zZXJ0ICJUaGF0IikK KyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoZm9yd2FyZC13b3JkIC0xKQorICAgICh1bmRvLWJv dW5kYXJ5KQorICAgIChpbnNlcnQgIldpdGggIikKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAo Zm9yd2FyZC13b3JkIC0xKQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChraWxsLXdvcmQgMSkK KyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAocHV0LXRleHQtcHJvcGVydHkgKHBvaW50LW1pbikg KHBvaW50LW1heCkgJ2ZhY2UgJ2JvbGQpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKHJlbW92 ZS10ZXh0LXByb3BlcnRpZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkgJyhmYWNlIGRlZmF1bHQp KQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChzZXQtYnVmZmVyLW11bHRpYnl0ZSAobm90IGVu YWJsZS1tdWx0aWJ5dGUtY2hhcmFjdGVycykpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKHVu ZG8pCisgICAgKHNob3VsZAorICAgICAoZXF1YWwgKHNob3VsZC1lcnJvciAodW5kby1tb3JlIG5p bCkpCisgICAgICAgICAgICAnKHdyb25nLXR5cGUtYXJndW1lbnQgaW50ZWdlcnAgbmlsKSkpCisg ICAgKHVuZG8tbW9yZSA3KQorICAgIChzaG91bGQgKHN0cmluZy1lcXVhbCAiIiAoYnVmZmVyLXN0 cmluZykpKSkpCisKKyhlcnQtZGVmdGVzdCB1bmRvLXRlc3QxICgpCisgICJUZXN0IHVuZG8gb2Yg XFxbdW5kb10gY29tbWFuZCAocmVkbykuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChidWZm ZXItZW5hYmxlLXVuZG8pCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKGluc2VydCAiVGhpcyIp CisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAodW5kby1ib3Vu ZGFyeSkKKyAgICAoaW5zZXJ0ICJUaGF0IikKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoZm9y d2FyZC13b3JkIC0xKQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChpbnNlcnQgIldpdGggIikK KyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoZm9yd2FyZC13b3JkIC0xKQorICAgICh1bmRvLWJv dW5kYXJ5KQorICAgIChraWxsLXdvcmQgMSkKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoZmFj ZW1lbnUtYWRkLWZhY2UgJ2JvbGQgKHBvaW50LW1pbikgKHBvaW50LW1heCkpCisgICAgKHVuZG8t Ym91bmRhcnkpCisgICAgKHNldC1idWZmZXItbXVsdGlieXRlIChub3QgZW5hYmxlLW11bHRpYnl0 ZS1jaGFyYWN0ZXJzKSkKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoc2hvdWxkCisgICAgIChz dHJpbmctZXF1YWwgKGJ1ZmZlci1zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgKHByb2duCisg ICAgICAgICAgICAgICAgICAgICAodW5kbykKKyAgICAgICAgICAgICAgICAgICAgICh1bmRvLW1v cmUgNCkKKyAgICAgICAgICAgICAgICAgICAgICh1bmRvKQorICAgICAgICAgICAgICAgICAgICAg Oyh1bmRvLW1vcmUgLTQpCisgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN0cmluZykpKSkp KQorCisoZXJ0LWRlZnRlc3QgdW5kby10ZXN0MiAoKQorICAiVGVzdCBiYXNpYyByZWRvaW5nIHdp dGggXFxbdW5kb10gY29tbWFuZC4iCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGJ1ZmZlci1l bmFibGUtdW5kbykKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoaW5zZXJ0ICJPbmUiKQorICAg ICh1bmRvLWJvdW5kYXJ5KQorICAgIChpbnNlcnQgIiBaZXJvIikKKyAgICAodW5kby1ib3VuZGFy eSkKKyAgICAocHVzaC1tYXJrKQorICAgIChkZWxldGUtcmVnaW9uIChzYXZlLWV4Y3Vyc2lvbgor ICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQtd29yZCAtMSkKKyAgICAgICAgICAgICAgICAg ICAgIChwb2ludCkpIChwb2ludCkpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKGJlZ2lubmlu Zy1vZi1saW5lKQorICAgIChpbnNlcnQgIlplcm8iKQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAg ICh1bmRvKQorICAgIChzaG91bGQKKyAgICAgKHN0cmluZy1lcXVhbCAoYnVmZmVyLXN0cmluZykK KyAgICAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgICAgICAgICh1bmRvLW1v cmUgMikKKyAgICAgICAgICAgICAgICAgICAgICh1bmRvKQorICAgICAgICAgICAgICAgICAgICAg KGJ1ZmZlci1zdHJpbmcpKSkpKSkKKworKGVydC1kZWZ0ZXN0IHVuZG8tdGVzdDMgKCkKKyAgIlRl c3QgbW9kdGltZSB3aXRoIFxcW3VuZG9dIGNvbW1hbmQuIgorICAobGV0ICgodG1wZmlsZSAobWFr ZS10ZW1wLWZpbGUgInVuZG8tdGVzdDMiKSkpCisgICAgKHdpdGgtdGVtcC1maWxlIHRtcGZpbGUK KyAgICAgIChsZXQgKChidWZmZXItZmlsZS1uYW1lIHRtcGZpbGUpKQorICAgICAgICAoYnVmZmVy LWVuYWJsZS11bmRvKQorICAgICAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdtYWtlLWJh Y2t1cC1maWxlcykgbmlsKQorICAgICAgICAodW5kby1ib3VuZGFyeSkKKyAgICAgICAgKGluc2Vy dCA/XHMpCisgICAgICAgICh1bmRvLWJvdW5kYXJ5KQorICAgICAgICAoYmFzaWMtc2F2ZS1idWZm ZXIpCisgICAgICAgIChpbnNlcnQgP1x0KQorICAgICAgICAodW5kbykKKyAgICAgICAgKHNob3Vs ZAorICAgICAgICAgKHN0cmluZy1lcXVhbCAoYnVmZmVyLXN0cmluZykKKyAgICAgICAgICAgICAg ICAgICAgICAgKHByb2duCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuZG8pCisgICAgICAg ICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdHJpbmcpKSkpKQorICAgICAgKGRlbGV0ZS1maWxl IHRtcGZpbGUpKSkpCisKKyhlcnQtZGVmdGVzdCB1bmRvLXRlc3Q0ICgpCisgICJUZXN0IFxcW3Vu ZG9dIG9mIFxcW2ZsdXNoLWxpbmVzXS4iCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGJ1ZmZl ci1lbmFibGUtdW5kbykKKyAgICAoZG90aW1lcyAoaSAxMDQ4NTc2KQorICAgICAgKGlmICh6ZXJv cCAoJSBpIDIpKQorICAgICAgICAgIChpbnNlcnQgIkV2ZW5zZXMiKQorICAgICAgICAoaW5zZXJ0 ICJPZGRzZXMiKSkpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKHNob3VsZAorICAgICA7OyBB dm9pZCBzdHJpbmctZXF1YWwgYmVjYXVzZSBFUlQgd2lsbCBzYXZlIHRoZSBgYnVmZmVyLXN0cmlu ZycKKyAgICAgOzsgdG8gdGhlIGV4cGxhbmF0aW9uLiAgVXNpbmcgYG5vdCcgd2lsbCByZWNvcmQg bmlsIG9yIG5vbi1uaWwuCisgICAgIChub3QKKyAgICAgIChudWxsCisgICAgICAgKHN0cmluZy1l cXVhbCAoYnVmZmVyLXN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgIChwcm9nbgorICAgICAg ICAgICAgICAgICAgICAgICAoZmx1c2gtbGluZXMgIm9kZHNlcyIgKHBvaW50LW1pbikgKHBvaW50 LW1heCkpCisgICAgICAgICAgICAgICAgICAgICAgICh1bmRvLWJvdW5kYXJ5KQorICAgICAgICAg ICAgICAgICAgICAgICAodW5kbykKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuZG8pCisgICAg ICAgICAgICAgICAgICAgICAgIChidWZmZXItc3RyaW5nKSkpKSkpKSkKKworKGVydC1kZWZ0ZXN0 IHVuZG8tdGVzdDUgKCkKKyAgIlRlc3QgYmFzaWMgcmVkb2luZyB3aXRoIFxcW3VuZG9dIGNvbW1h bmQuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChidWZmZXItZW5hYmxlLXVuZG8pCisgICAg KHVuZG8tYm91bmRhcnkpCisgICAgKGluc2VydCAiQVlFIikKKyAgICAodW5kby1ib3VuZGFyeSkK KyAgICAoaW5zZXJ0ICIgQkVFIikKKyAgICAodW5kby1ib3VuZGFyeSkKKyAgICAoc2V0cSBidWZm ZXItdW5kby1saXN0IChjb25zICcoMC4wIGJvZ3VzKSBidWZmZXItdW5kby1saXN0KSkKKyAgICAo cHVzaC1tYXJrKQorICAgIChkZWxldGUtcmVnaW9uIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgICAg ICAgICAgICAgICAgKGZvcndhcmQtd29yZCAtMSkKKyAgICAgICAgICAgICAgICAgICAgIChwb2lu dCkpIChwb2ludCkpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKGJlZ2lubmluZy1vZi1saW5l KQorICAgIChpbnNlcnQgIkNFRSIpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKHVuZG8pCisg ICAgKHNldHEgYnVmZmVyLXVuZG8tbGlzdCAoY29ucyAiYm9ndXMiIGJ1ZmZlci11bmRvLWxpc3Qp KQorICAgIChzaG91bGQKKyAgICAgKHN0cmluZy1lcXVhbAorICAgICAgKGJ1ZmZlci1zdHJpbmcp CisgICAgICAocHJvZ24KKyAgICAgICAgKGlmIChhbmQgKGJvdW5kcCAndW5kby10ZXN0NS1lcnJv cikgKG5vdCB1bmRvLXRlc3Q1LWVycm9yKSkKKyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAg ICAgICAoc2hvdWxkIChudWxsICh1bmRvLW1vcmUgMikpKQorICAgICAgICAgICAgICAoc2hvdWxk ICh1bmRvKSkpCisgICAgICAgICAgOzsgRXJyb3JzIGFyZSBnZW5lcmF0ZWQgYnkgbmV3IExpc3Ag dmVyc2lvbiBvZgorICAgICAgICAgIDs7IGBwcmltaXRpdmUtdW5kbycgbm90IGJ5IGJ1aWx0LWlu IEMgdmVyc2lvbi4KKyAgICAgICAgICAoc2hvdWxkCisgICAgICAgICAgIChlcXVhbCAoc2hvdWxk LWVycm9yICh1bmRvLW1vcmUgMikpCisgICAgICAgICAgICAgICAgICAnKGVycm9yICJVbnJlY29n bml6ZWQgZW50cnkgaW4gdW5kbyBsaXN0ICgwLjAgYm9ndXMpIikpKQorICAgICAgICAgIChzaG91 bGQKKyAgICAgICAgICAgKGVxdWFsIChzaG91bGQtZXJyb3IgKHVuZG8pKQorICAgICAgICAgICAg ICAgICAgJyhlcnJvciAiVW5yZWNvZ25pemVkIGVudHJ5IGluIHVuZG8gbGlzdCBcImJvZ3VzXCIi KSkpKQorICAgICAgICAoYnVmZmVyLXN0cmluZykpKSkpKQorCisoZGVmdW4gdW5kby10ZXN0LWFs bCAoJm9wdGlvbmFsIGludGVyYWN0aXZlKQorICAiUnVuIGFsbCB0ZXN0cyBmb3IgXFxbdW5kb10u IgorICAoaW50ZXJhY3RpdmUgInAiKQorICAoaWYgaW50ZXJhY3RpdmUKKyAgICAgIChlcnQtcnVu LXRlc3RzLWludGVyYWN0aXZlbHkgIl51bmRvLSIpCisgICAgKGVydC1ydW4tdGVzdHMtYmF0Y2gg Il51bmRvLSIpKSkKKworKHByb3ZpZGUgJ3VuZG8tdGVzdHMpCis7OzsgdW5kby10ZXN0cy5lbCBl bmRzIGhlcmUKCg== --14dae93408831720c804d19d9556--