From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Andrew Kensler Newsgroups: gmane.emacs.bugs Subject: bug#61028: 30.0.50; [PATCH] [FEATURE] Balanced fill mode Date: Mon, 23 Jan 2023 01:40:40 -0800 Message-ID: <9ec521a6-b324-3f09-7495-c55638b890f8@eastfarthing.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------U6U1i80qvZoNZsVAvkQDbBAD" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="39855"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 To: 61028@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Jan 23 15:27:28 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 1pJxnC-000A87-9H for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 23 Jan 2023 15:27:26 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pJxmv-0008CF-1B; Mon, 23 Jan 2023 09:27:10 -0500 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 1pJxmo-0008BV-Uc for bug-gnu-emacs@gnu.org; Mon, 23 Jan 2023 09:27:02 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pJxmo-0005nT-KU for bug-gnu-emacs@gnu.org; Mon, 23 Jan 2023 09:27:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pJxmo-0002Hu-1c for bug-gnu-emacs@gnu.org; Mon, 23 Jan 2023 09:27:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Andrew Kensler Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 23 Jan 2023 14:27:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 61028 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.16744840148778 (code B ref -1); Mon, 23 Jan 2023 14:27:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 23 Jan 2023 14:26:54 +0000 Original-Received: from localhost ([127.0.0.1]:53744 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pJxme-0002HT-Mv for submit@debbugs.gnu.org; Mon, 23 Jan 2023 09:26:54 -0500 Original-Received: from lists.gnu.org ([209.51.188.17]:53692) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pJtK2-0006Sv-I4 for submit@debbugs.gnu.org; Mon, 23 Jan 2023 04:41:06 -0500 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 1pJtJz-0003XL-LB for bug-gnu-emacs@gnu.org; Mon, 23 Jan 2023 04:40:59 -0500 Original-Received: from smtp1.phpwebhosting.com ([184.154.71.7]) by eggs.gnu.org with smtp (Exim 4.90_1) (envelope-from ) id 1pJtJv-0002Ff-OE for bug-gnu-emacs@gnu.org; Mon, 23 Jan 2023 04:40:59 -0500 Original-Received: (qmail 13649 invoked from network); 23 Jan 2023 09:40:43 -0000 Original-Received: from unknown (HELO [10.0.0.107]) (andrew@eastfarthing.com@76.121.228.80) by smtp1.phpwebhosting.com with (AES128-SHA encrypted) SMTP; Mon, 23 Jan 2023 04:40:43 -0500 Content-Language: en-US Received-SPF: pass client-ip=184.154.71.7; envelope-from=andrew@eastfarthing.com; helo=smtp1.phpwebhosting.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, HTML_MESSAGE=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Mon, 23 Jan 2023 09:26:51 -0500 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:253999 Archived-At: This is a multi-part message in MIME format. --------------U6U1i80qvZoNZsVAvkQDbBAD Content-Type: multipart/alternative; boundary="------------DMMHH5AewF0FsJS0qvME5UwC" --------------DMMHH5AewF0FsJS0qvME5UwC Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Greetings all, The proposed patch attached adds a new minor balanced-fill-mode with an alternate line breaking algorithm for paragraph filling.  When enabled, it will try to neatly balance line lengths to reduce raggedness, avoid widows, avoid starting a new sentence on the last word of a line, avoid ending a sentence on the first word of a line, and so forth.  It is heavily inspired by the Knuth-Plass line breaking algorithm and uses dynamic programming to try to choose line breaks to minimize a cost function. For example, consider the following mock paragraph as filled by the current greedy algorithm with the fill-column set to 15: Ccc ccc a bb dddd bb bb a ccc a jjjjjjjjjj a eeeee a hhhhhhhh bb dddd. With the new minor mode enabled, it would instead be filled much more nicely as: Ccc ccc a bb dddd bb bb a ccc a jjjjjjjjjj a eeeee a hhhhhhhh bb dddd. Often, the result is similar to simply having used a particular slightly narrower fill-column with the current greedy algorithm.  The advantage, however, is that it figures out the correct column automatically and per-paragraph. The main piece of implementation is in the new (balanced-fill-break-lines) function in fill.el, with a modification to (fill-region-as-paragraph) to optionally call this before its current line breaking loop.  If it runs successfully, then point will be set to the end of the paragraph and that loop skipped. Note that (fill-region-as-paragraph) has no hooks and is too monolithic to advise for this kind of thing, hence my hoping to upstream this change. This is my first time contributing anything significant to Emacs or writing here.  I believe that the proposed patch covers all the major needs: the code itself, commit message, info documentation, announcement in NEWS, and a basic ERT test.  If there's anything I've missed or suggestions for improvements, please let me know. (And I hope this is the correct mailing list and message format, too.)  I'll be happy to sign the copyright assignment paperwork if this looks like something you'd like to accept. Cheers, - Andrew --------------DMMHH5AewF0FsJS0qvME5UwC Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Greetings all,

The proposed patch attached adds a new minor balanced-fill-mode with an alternate line breaking algorithm for paragraph filling.  When enabled, it will try to neatly balance line lengths to reduce raggedness, avoid widows, avoid starting a new sentence on the last word of a line, avoid ending a sentence on the first word of a line, and so forth.  It is heavily inspired by the Knuth-Plass line breaking algorithm and uses dynamic programming to try to choose line breaks to minimize a cost function.

For example, consider the following mock paragraph as filled by the current greedy algorithm with the fill-column set to 15:

Ccc ccc a bb
dddd bb bb a
ccc a
jjjjjjjjjj a
eeeee a
hhhhhhhh bb
dddd.

With the new minor mode enabled, it would instead be filled much more nicely as:

Ccc ccc a
bb dddd bb
bb a ccc a
jjjjjjjjjj
a eeeee a
hhhhhhhh
bb dddd.

Often, the result is similar to simply having used a particular slightly narrower fill-column with the current greedy algorithm.  The advantage, however, is that it figures out the correct column automatically and per-paragraph.

The main piece of implementation is in the new (balanced-fill-break-lines) function in fill.el, with a modification to (fill-region-as-paragraph) to optionally call this before its current line breaking loop.  If it runs successfully, then point will be set to the end of the paragraph and that loop skipped.

Note that (fill-region-as-paragraph) has no hooks and is too monolithic to advise for this kind of thing, hence my hoping to upstream this change.

This is my first time contributing anything significant to Emacs or writing here.  I believe that the proposed patch covers all the major needs: the code itself, commit message, info documentation, announcement in NEWS, and a basic ERT test.  If there's anything I've missed or suggestions for improvements, please let me know.  (And I hope this is the correct mailing list and message format, too.)  I'll be happy to sign the copyright assignment paperwork if this looks like something you'd like to accept.

Cheers,
- Andrew

--------------DMMHH5AewF0FsJS0qvME5UwC-- --------------U6U1i80qvZoNZsVAvkQDbBAD Content-Type: text/x-patch; charset=UTF-8; name="0001-Add-new-minor-balanced-fill-mode-to-filling.patch" Content-Disposition: attachment; filename="0001-Add-new-minor-balanced-fill-mode-to-filling.patch" Content-Transfer-Encoding: base64 RnJvbSAyMGY4MzdhMTE5N2JkZjNjYzExODk2ZjIxNGIwZjMwMzI3YjY4MzdjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXcgS2Vuc2xlciA8YW5kcmV3QGVhc3RmYXJ0 aGluZy5jb20+CkRhdGU6IEZyaSwgMjAgSmFuIDIwMjMgMTg6MTc6NDEgLTA4MDAKU3ViamVj dDogW1BBVENIXSBBZGQgbmV3IG1pbm9yIGBiYWxhbmNlZC1maWxsLW1vZGVgIHRvIGZpbGxp bmcKCldoZW4gZW5hYmxlZCwgZmlsbGluZyB3aWxsIGNvbnNpZGVyIHRoZSBlbnRpcmUgcGFy YWdyYXBoIGF0IGEKdGltZSBhbmQgdHJ5IHRvIHBsYWNlIGxpbmUgYnJlYWtzIG9wdGltYWxs eSB0byBsb29rIG1vcmUgbmVhdAphbmQgZXZlbiwgYWNjb3JkaW5nIHRvIGEgY29zdCBmdW5j dGlvbi4gIFRoaXMgaXMgaW5zcGlyZWQgYnkgdGhlCktudXRoLVBsYXNzIGFsZ29yaXRobS4K CiogbGlzcC90ZXh0bW9kZXMvZmlsbC5lbAooYmFsYW5jZWQtZmlsbC1tb2RlKQooYmFsYW5j ZWQtZmlsbC1tYXhpbXVtLXdvcmRzKQooYmFsYW5jZWQtZmlsbC1tYXJnaW4pCihiYWxhbmNl ZC1maWxsLXdpZG93cykKKGJhbGFuY2VkLWZpbGwtbGVuZ3RoLWV4cG9uZW50KQooYmFsYW5j ZWQtZmlsbC1yYWdnZWRuZXNzLXBlbmFsdHkpCihiYWxhbmNlZC1maWxsLXNpbmdsZS1wZW5h bHR5KQooYmFsYW5jZWQtZmlsbC1icmVhay1wZW5hbHR5KTogTmV3IHZhcmlhYmxlcy4KKGJh bGFuY2VkLWZpbGwtYnJlYWstbGluZXMpOiBOZXcgbGluZSBicmVha2luZyBmdW5jdGlvbi4K KGZpbGwtcmVnaW9uLWFzLXBhcmFncmFwaCk6IFVzZSBpdCB0byBmaWxsIHBhcmFncmFwaHMu CgoqIHRlc3QvbGlzcC90ZXh0bW9kZXMvZmlsbC10ZXN0cy5lbDogQWRkIHNtb2tlIHRlc3Qg Zm9yIGl0LgoKKiBkb2MvZW1hY3MvZW1hY3MudGV4aSAoVG9wKToKKiBkb2MvZW1hY3MvdGV4 dC50ZXhpIChGaWxsaW5nIFRleHQpOiBEb2N1bWVudCBpdC4KCiogZXRjL05FV1M6IEFubm91 bmNlIGl0LgotLS0KIGRvYy9lbWFjcy9lbWFjcy50ZXhpICAgICAgICAgICAgICB8ICAgMSAr CiBkb2MvZW1hY3MvdGV4dC50ZXhpICAgICAgICAgICAgICAgfCAgOTEgKysrKysrKysrKysr KwogZXRjL05FV1MgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA2ICsKIGxpc3AvdGV4 dG1vZGVzL2ZpbGwuZWwgICAgICAgICAgICB8IDIxNCArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIHRlc3QvbGlzcC90ZXh0bW9kZXMvZmlsbC10ZXN0cy5lbCB8ICAxNSArKysK IDUgZmlsZXMgY2hhbmdlZCwgMzI3IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kb2Mv ZW1hY3MvZW1hY3MudGV4aSBiL2RvYy9lbWFjcy9lbWFjcy50ZXhpCmluZGV4IGI2ZDE0OWVi M2UuLmJhYmQ0ODdmYmQgMTAwNjQ0Ci0tLSBhL2RvYy9lbWFjcy9lbWFjcy50ZXhpCisrKyBi L2RvYy9lbWFjcy9lbWFjcy50ZXhpCkBAIC02MTYsNiArNjE2LDcgQEAgVG9wCiAqIEZpbGwg UHJlZml4OjogICAgICAgICBGaWxsaW5nIHBhcmFncmFwaHMgdGhhdCBhcmUgaW5kZW50ZWQK ICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gYSBjb21tZW50LCBldGMuCiAqIEFk YXB0aXZlIEZpbGw6OiAgICAgICBIb3cgRW1hY3MgY2FuIGRldGVybWluZSB0aGUgZmlsbCBw cmVmaXggYXV0b21hdGljYWxseS4KKyogQmFsYW5jZWQgRmlsbDo6ICAgICAgIEJyZWFraW5n IGxpbmVzIHRvIGxvb2sgbW9yZSBldmVuIGFuZCBuZWF0LgogCiBPdXRsaW5lIE1vZGUKIApk aWZmIC0tZ2l0IGEvZG9jL2VtYWNzL3RleHQudGV4aSBiL2RvYy9lbWFjcy90ZXh0LnRleGkK aW5kZXggNmUxNmU3NDNhNS4uMjUxNDUyZGYxNyAxMDA2NDQKLS0tIGEvZG9jL2VtYWNzL3Rl eHQudGV4aQorKysgYi9kb2MvZW1hY3MvdGV4dC50ZXhpCkBAIC00OTcsNiArNDk3LDcgQEAg RmlsbGluZwogKiBGaWxsIENvbW1hbmRzOjogIENvbW1hbmRzIHRvIHJlZmlsbCBwYXJhZ3Jh cGhzIGFuZCBjZW50ZXIgbGluZXMuCiAqIEZpbGwgUHJlZml4OjogICAgRmlsbGluZyBwYXJh Z3JhcGhzIHRoYXQgYXJlIGluZGVudGVkIG9yIGluIGEgY29tbWVudCwgZXRjLgogKiBBZGFw dGl2ZSBGaWxsOjogIEhvdyBFbWFjcyBjYW4gZGV0ZXJtaW5lIHRoZSBmaWxsIHByZWZpeCBh dXRvbWF0aWNhbGx5LgorKiBCYWxhbmNlZCBGaWxsOjogIEJyZWFraW5nIGxpbmVzIHRvIGxv b2sgbW9yZSBldmVuIGFuZCBuZWF0LgogQGVuZCBtZW51CiAKIEBub2RlIEF1dG8gRmlsbApA QCAtODI4LDYgKzgyOSw5NiBAQCBBZGFwdGl2ZSBGaWxsCiBsaW5lLiAgSWYgaXQgcmV0dXJu cyBAY29kZXtuaWx9LCBAY29kZXthZGFwdGl2ZS1maWxsLXJlZ2V4cH0gZ2V0cwogYSBjaGFu Y2UgdG8gZmluZCBhIHByZWZpeC4KIAorQG5vZGUgQmFsYW5jZWQgRmlsbAorQHN1YnNlY3Rp b24gQmFsYW5jZWQgRmlsbGluZworCitAY2luZGV4IGJhbGFuY2VkIGZpbGxpbmcKKyAgRmls bGluZyBjYW4gY29uc2lkZXIgYW4gZW50aXJlIHBhcmFncmFwaCBhdCBhIHRpbWUgd2hlbiBk ZXRlcm1pbmluZword2hlcmUgdG8gcGxhY2UgbGluZSBicmVha3MsIGFzIGFuIGFsdGVybmF0 aXZlIHRvIGp1c3QgZ3JlZWRpbHkKK2luc2VydGluZyBhIGJyZWFrIGFmdGVyIHRoZSBsYXN0 IHdvcmQgdGhhdCBmaXRzIG9uIGVhY2ggbGluZS4KKworICBJbiB0aGlzIG1vZGUsIGl0IHdp bGwgdHJ5IHRvIG9wdGltYWxseSBjaG9vc2UgdGhlIHNldCBvZiBsaW5lCiticmVha3MgdG8g bWluaW1pemUgYSBjb3N0IGZ1bmN0aW9uIHRoYXQgcGVuYWxpemVzIHVudGlkeSBwYXJhZ3Jh cGhzLgorVGhpcyBtYXkgcGxhY2UgbGluZSBicmVha3Mgc29vbmVyIHRoYW4gbmVjZXNzYXJ5 IGlmIGl0IGltcHJvdmVzCitsYXRlciBsaW5lcy4KKworICBGb3IgZXhhbXBsZSwgaWYgQGNv ZGV7ZmlsbC1jb2x1bW59IGlzIDYwIGFuZCBiYWxhbmNlZCBmaWxsaW5nIGlzCitkaXNhYmxl ZCB0aGVuIHRoZSBncmVlZHkgYWxnb3JpdGhtIHdpbGwgZmlsbCB0aGUgZm9sbG93aW5nIHBh cmFncmFwaAorbGlrZSBzbzoKKworQHNtYWxsZXhhbXBsZQorIkl0J3Mgbm90IHRvbyBmYXIt ZmV0Y2hlZCB0byBzYXkgdGhhdCB0aGUgYmVzdCBwcm9ncmFtcyBhcmUKK3RoZSBvbmVzIHdy aXR0ZW4gd2hlbiB0aGUgcHJvZ3JhbW1lciBpcyBzdXBwb3NlZCB0byBiZQord29ya2luZyBv biBzb21ldGhpbmcgZWxzZS4uLiAgVmVyeSBnb29kIHRoaW5ncyBoYXBwZW4gd2hlbgorbWFu YWdlbWVudCBpcyBlbmxpZ2h0ZW5lZCBlbm91Z2ggdG8gYXBwcmVjaWF0ZSB0aGUKK2ltcG9y dGFuY2Ugb2YgYWxsb3dpbmcgcHJvZ3JhbW1lcnMgc29tZSBmcmVlIHRpbWUgZm9yCitwcm9q ZWN0cyBvZiB0aGlzIHNvcnQuIiAgLS1NZWxpbmRhIFZhcmlhbgorQGVuZCBzbWFsbGV4YW1w bGUKKworQG5vaW5kZW50Cit3aGlsZSBlbmFibGluZyB0aGUgYmFsYW5jZWQgZmlsbGluZyB3 aWxsIGluc3RlYWQgcHJvZHVjZSB0aGUgZm9sbG93aW5nCit3aXRoIHNsaWdodGx5IHNob3J0 ZXIgYnV0IG1vcmUgZXZlbiBsaW5lIGxlbmd0aHM6CisKK0BzbWFsbGV4YW1wbGUKKyJJdCdz IG5vdCB0b28gZmFyLWZldGNoZWQgdG8gc2F5IHRoYXQgdGhlIGJlc3QgcHJvZ3JhbXMKK2Fy ZSB0aGUgb25lcyB3cml0dGVuIHdoZW4gdGhlIHByb2dyYW1tZXIgaXMgc3VwcG9zZWQgdG8K K2JlIHdvcmtpbmcgb24gc29tZXRoaW5nIGVsc2UuLi4gIFZlcnkgZ29vZCB0aGluZ3MgaGFw cGVuCit3aGVuIG1hbmFnZW1lbnQgaXMgZW5saWdodGVuZWQgZW5vdWdoIHRvIGFwcHJlY2lh dGUgdGhlCitpbXBvcnRhbmNlIG9mIGFsbG93aW5nIHByb2dyYW1tZXJzIHNvbWUgZnJlZSB0 aW1lIGZvcgorcHJvamVjdHMgb2YgdGhpcyBzb3J0LiIgIC0tIE1lbGluZGEgVmFyaWFuCitA ZW5kIHNtYWxsZXhhbXBsZQorCitAZmluZGV4IGJhbGFuY2VkLWZpbGwtbW9kZQorQHZpbmRl eCBiYWxhbmNlZC1maWxsLW1vZGUKKyAgQmFsYW5jZWQgRmlsbCBtb2RlIGlzIGRpc2FibGVk IGJ5IGRlZmF1bHQuICBUbyB0b2dnbGUgaXQgZ2xvYmFsbHksCit0eXBlIEBrYmR7TS14IGJh bGFuY2VkLWZpbGwtbW9kZX0uCisKK0B2aW5kZXggYmFsYW5jZWQtZmlsbC1tYXhpbXVtLXdv cmRzCisgIEZvciBzcGVlZCwgdGhlIG1heGltdW0gbGltaXQgb24gdGhlIG51bWJlciBvZiB3 b3JkcyB0aGF0IHRoZQorYmFsYW5jZWQgZmlsbCBhbGdvcml0aG0gd2lsbCBhdHRlbXB0IHRv IHByb2Nlc3MgaW4gYSBzaW5nbGUgcGFyYWdyYXBoCitpcyBjb250cm9sbGVkIGJ5IEBjb2Rl e2JhbGFuY2VkLWZpbGwtbWF4aW11bS13b3Jkc30uICBJZiB0aGUgbnVtYmVyCitvZiB3b3Jk cyBpbiB0aGUgcGFyYWdyYXBoIGV4Y2VlZHMgdGhpcyBsaW1pdCwgdGhlbiBmaWxsaW5nIHdp bGwgZmFsbAorYmFjayB0byB0aGUgZmFzdGVyIGdyZWVkeSBhbGdvcml0aG0uCisKKyAgVGhl IGNvc3QgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcGxhY2UgdGhlIGxp bmUgYnJlYWtzCitjYW4gYmUgdHVuZWQgdGhyb3VnaCBzZXZlcmFsIHZhcmlhYmxlcy4KKwor QHZpbmRleCBiYWxhbmNlZC1maWxsLW1hcmdpbgorICBTZXQgQGNvZGV7YmFsYW5jZWQtZmls bC1tYXJnaW59IHRvIHRoZSBudW1iZXIgb2YgY29sdW1ucyBiZWZvcmUKK3RoZSBmaWxsLWNv bHVtbiB0aGF0IHRoZSBiYWxhbmNlZCBmaWxsIGFsZ29yaXRobSBzaG91bGQgYXR0ZW1wdAor dG8gYnJlYWsgbGluZXMgYXQuICBBdHRlbXB0aW5nIHRvIGJyZWFrIGxpbmVzIHNsaWdodGx5 IHNob3J0CitvZiB0aGUgQGNvZGV7ZmlsbC1jb2x1bW59IGJ1dCBiZWluZyBhbGxvd2VkIHRv IGdvIHVwIHRvIHRoZQorQGNvZGV7ZmlsbC1jb2x1bW59IGNhbiBoZWxwIHRvIG1ha2UgdGhl IGxpbmVzIG1vcmUgZXZlbiBpbiBsZW5ndGguCisKK0B2aW5kZXggYmFsYW5jZWQtZmlsbC13 aWRvd3MKKyAgU2V0IEBjb2Rle2JhbGFuY2VkLWZpbGwtd2lkb3dzfSB0byB0aGUgbWluaW11 bSBudW1iZXIgb2Ygd29yZHMgdGhhdAordGhlIGFsZ29yaXRobSBzaG91bGQgYXR0ZW1wdCB0 byBsZWF2ZSBvbiB0aGUgbGFzdCBsaW5lIG9mIGEgcGFyYWdyYXBoLgorSWYgdGhpcyBpcyBz ZXQgdG8gYW4gZXh0cmVtZWx5IGhpZ2ggbnVtYmVyLCB0aGVuIHRoZSBiYWxhbmNlZCBmaWxs aW5nCit3aWxsIGdlbmVyYWxseSB0cnkgdG8gbWFrZSB0aGUgbGFzdCBsaW5lIGFzIGZ1bGwg YXMgYWxsIHRoZSBvdGhlcnMuCisKK0B2aW5kZXggYmFsYW5jZWQtZmlsbC1sZW5ndGgtZXhw b25lbnQKKyAgVGhlIEBjb2Rle2JhbGFuY2VkLWZpbGwtbGVuZ3RoLWV4cG9uZW50fSBpcyB0 aGUgbWFpbiBjb250cm9sIG9uIHRoZQorY29zdCBmdW5jdGlvbi4gIEl0IGFmZmVjdHMgdGhl IHBlbmFsdHkgZm9yIGxpbmVzIHRoYXQgYXJlIHNob3J0ZXIgb3IKK2xvbmdlciB0aGFuIHRo ZSB0YXJnZXQgbGVuZ3RoIHRvIHRoZSBtYXJnaW4uICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVu Cit0aGUgdHdvIGxlbmd0aHMgd2lsbCBiZSByYWlzZWQgdG8gdGhpcyBwb3dlciB3aGVuIGNh bGN1bGF0aW5nIHRoZQorY29zdCBvZiBhIHBvdGVudGlhbCBsaW5lIGJyZWFrLgorCitAdmlu ZGV4IGJhbGFuY2VkLWZpbGwtcmFnZ2VkbmVzcy1wZW5hbHR5CitAdmluZGV4IGJhbGFuY2Vk LWZpbGwtc2luZ2xlLXBlbmFsdHkKK0B2aW5kZXggYmFsYW5jZWQtZmlsbC1icmVhay1wZW5h bHR5CisgIFRoZXJlIGFyZSBhbHNvIHNldmVyYWwgbWlub3IgYWRkaXRpdmUgcGVuYWx0aWVz IHRvIGhlbHAgaW1wcm92ZQordGhlIGFwcGVhcmFuY2UuICBUaGUgQGNvZGV7YmFsYW5jZWQt ZmlsbC1yYWdnZWRuZXNzLXBlbmFsdHl9IGFwcGxpZXMKK2ZvciBlYWNoIGNvbHVtbiBvZiBk aWZmZXJlbmNlIGluIGxlbmd0aCBmb3IgYSBsaW5lIHJlbGF0aXZlIHRvIHRoZQorcHJldmlv dXMgbGluZSwgdW5sZXNzIHRoaXMgaXMgdGhlIGxhc3QgbGluZSBhbmQgbG9uZ2VyIHRoYW4g c2Vjb25kCit0byBsYXN0LiAgSGlnaGVyIG51bWJlcnMgbWFrZSBpdCB0cnkgaGFyZGVyIHRv IGtlZXAgYWxsIGxpbmVzIGFzCitldmVuIGFzIHBvc3NpYmxlIGluIGxlbmd0aCBhdCB0aGUg ZXhwZW5zZSBvZiBvdGhlciBmYWN0b3JzLiAgVGhlCitAY29kZXtiYWxhbmNlZC1maWxsLXNp bmdsZS1wZW5hbHR5fSBpcyBhZGRlZCBlaXRoZXIgZm9yIHN0YXJ0aW5nIGEKK25ldyBzZW50 ZW5jZSB3aXRoIGEgc2luZ2xlIHdvcmQgcmlnaHQgYXQgdGhlIGVuZCBvZiBhIGxpbmUsIG9y IGVsc2UKK2ZvciBlbmRpbmcgYSBzZW50ZW5jZSB3aXRoIGEgc2luZ2xlIHdvcmQgbGVmdCBh dCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorRmluYWxseSwgdGhlcmUgaXMgYSBAY29kZXtiYWxh bmNlZC1maWxsLWJyZWFrLXBlbmFsdHl9IGZvciBlYWNoIGxpbmUKK2JyZWFrIGFkZGVkLiAg VGhlIGxhcmdlciB0aGlzIGlzLCB0aGUgbW9yZSB0aGUgYWxnb3JpdGhtIHdpbGwgdHJ5IHRv CittaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGxpbmVzIGRlc3BpdGUgdGhlIG90aGVyIHBlbmFs dGllcy4KKwogQG5vZGUgQ2FzZQogQHNlY3Rpb24gQ2FzZSBDb252ZXJzaW9uIENvbW1hbmRz CiBAY2luZGV4IGNhc2UgY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvZXRjL05FV1MgYi9ldGMv TkVXUwppbmRleCAxMGU5MWVjNGFiLi4xMzc5YjJkOTBhIDEwMDY0NAotLS0gYS9ldGMvTkVX UworKysgYi9ldGMvTkVXUwpAQCAtNTMsNiArNTMsMTIgQEAgdHJhc2ggd2hlbiBkZWxldGlu Zy4gIERlZmF1bHQgaXMgbmlsLgogDAogKiBFZGl0aW5nIENoYW5nZXMgaW4gRW1hY3MgMzAu MQogCisqKiBGaWxsaW5nIGNhbiBub3cgdHJ5IHRvIGJyZWFrIGxpbmVzIGV2ZW5seS4KK1Ro ZSBuZXcgdXNlciBvcHRpb24gJ2JhbGFuY2VkLWZpbGwtbW9kZScgY2FuIGJlIHNldCB0byBu b24tbmlsIHRvCittYWtlIGZpbGxpbmcgY29uc2lkZXIgdGhlIGVudGlyZSBwYXJhZ3JhcGgg YXQgYSB0aW1lIGFuZCB0cnkgdG8KK3BsYWNlIGxpbmUgYnJlYWtzIG9wdGltYWxseSB0byBs b29rIG1vcmUgbmVhdCBhbmQgZXZlbiwgYWNjb3JkaW5nCit0byBhIGNvc3QgZnVuY3Rpb24u ICBUaGlzIGlzIGluc3BpcmVkIGJ5IHRoZSBLbnV0aC1QbGFzcyBhbGdvcml0aG0uCisKIC0t LQogKiogTmV3IGNvbW1hbmQgJ2tpbGwtbWF0Y2hpbmctYnVmZmVycy1uby1hc2snLgogVGhp cyB3b3JrcyBsaWtlICdraWxsLW1hdGNoaW5nLWJ1ZmZlcnMnLCBidXQgd2l0aG91dCBhc2tp bmcgZm9yCmRpZmYgLS1naXQgYS9saXNwL3RleHRtb2Rlcy9maWxsLmVsIGIvbGlzcC90ZXh0 bW9kZXMvZmlsbC5lbAppbmRleCAyZmRlMmZmNmM0Li5jODdiMGFmZDNhIDEwMDY0NAotLS0g YS9saXNwL3RleHRtb2Rlcy9maWxsLmVsCisrKyBiL2xpc3AvdGV4dG1vZGVzL2ZpbGwuZWwK QEAgLTEzMiw2ICsxMzIsODYgQEAgYWRhcHRpdmUtZmlsbC1mdW5jdGlvbgogICA6dmVyc2lv biAiMjcuMSIKICAgOnR5cGUgJ2Z1bmN0aW9uKQogCisoZGVmaW5lLW1pbm9yLW1vZGUgYmFs YW5jZWQtZmlsbC1tb2RlCisgICJUb2dnbGUgd2hldGhlciBmaWxsaW5nIHNob3VsZCB0cnkg dG8gbmVhdGx5IGJhbGFuY2UgbGluZSBsZW5ndGhzLgorCitXaGVuIGVuYWJsZWQsIGZpbGxp bmcgd2lsbCBjb25zaWRlciB0aGUgZW50aXJlIHBhcmFncmFwaCBhbmQKK3RyeSB0byBvcHRp bWFsbHkgY2hvb3NlIGEgc2V0IG9mIGxpbmUgYnJlYWtzIHRvIG1pbmltaXplIGEKK2Nvc3Qg ZnVuY3Rpb24gdGhhdCBwZW5hbGl6ZXMgdW50aWR5IHBhcmFncmFwaHMuICBUaGlzIG1heQor cGxhY2UgbGluZSBicmVha3Mgc29vbmVyIHRoYW4gbmVjZXNzYXJ5IGlmIGl0IGltcHJvdmVz IGxhdGVyCitsaW5lcy4gIFdoZW4gZGlzYWJsZWQsIGZpbGxpbmcgdXNlcyB0aGUgdHJhZGl0 aW9uYWwgZ3JlZWR5IGxpbmUKK2JyZWFraW5nIGFsZ29yaXRobS4KKworU2VlIEluZm8gbm9k ZSBgKGVtYWNzKSBCYWxhbmNlZCBGaWxsJyBmb3IgbW9yZSBkZXRhaWxzLiIKKyAgOmdsb2Jh bCB0CisgIDp2ZXJzaW9uICIzMC4xIgorICA6dHlwZSAnYm9vbGVhbgorICA6Z3JvdXAgJ2Zp bGwpCisKKyhkZWZjdXN0b20gYmFsYW5jZWQtZmlsbC1tYXhpbXVtLXdvcmRzIDUwMAorICAi TWF4aW11bSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHdvcmRzIHRoYXQgdGhlIGJhbGFuY2Vk IGZpbGwKK2FsZ29yaXRobSB3aWxsIGF0dGVtcHQgdG8gcHJvY2VzcyBpbiBhIHNpbmdsZSBw YXJhZ3JhcGguICBJZgordGhlIHBhcmFncmFwaCBleGNlZWRzIHRoaXMgbGltaXQsIGZpbGxp bmcgd2lsbCBmYWxsIGJhY2sgdG8KK3RoZSBzdGFuZGFyZCBncmVlZHkgYWxnb3JpdGhtLiIK KyAgOnZlcnNpb24gIjMwLjEiCisgIDp0eXBlICdpbnRlZ2VyCisgIDpncm91cCAnZmlsbCkK KworKGRlZmN1c3RvbSBiYWxhbmNlZC1maWxsLW1hcmdpbiAzCisgICJOdW1iZXIgb2YgY29s dW1ucyBiZWZvcmUgdGhlIGZpbGwtY29sdW1uIHRoYXQgdGhlIGJhbGFuY2VkIGZpbGwKK2Fs Z29yaXRobSB3aWxsIGF0dGVtcHQgdG8gYnJlYWsgbGluZXMgYXQuICBBdHRlbXB0aW5nIHRv IGJyZWFrCitsaW5lcyBzbGlnaHRseSBzaG9ydCBvZiB0aGUgZmlsbC1jb2x1bW4gYnV0IGJl aW5nIGFsbG93ZWQgdG8KK2dvIHVwIHRvIHRoZSBmaWxsLWNvbHVtbiBjYW4gaGVscCB0byBt YWtlIHRoZSBsaW5lcyBtb3JlIGV2ZW4KK2luIGxlbmd0aC4iCisgIDp2ZXJzaW9uICIzMC4x IgorICA6dHlwZSAnaW50ZWdlcgorICA6Z3JvdXAgJ2ZpbGwpCisKKyhkZWZjdXN0b20gYmFs YW5jZWQtZmlsbC13aWRvd3MgMgorICAiTWluaW11bSBudW1iZXIgb2Ygd29yZHMgdGhhdCB0 aGUgYWxnb3JpdGhtIHdpbGwgYXR0ZW1wdCB0byBsZWF2ZQorb24gdGhlIGxhc3QgbGluZSBv ZiBhIHBhcmFncmFwaC4gIElmIHRoaXMgaXMgc2V0IHRvIGFuIGV4dHJlbWVseQoraGlnaCBu dW1iZXIsIHRoZW4gdGhlIGJhbGFuY2VkIGZpbGxpbmcgd2lsbCBnZW5lcmFsbHkgdHJ5IHRv IG1ha2UKK3RoZSBsYXN0IGxpbmUgYXMgZnVsbCBhcyBhbGwgdGhlIG90aGVycy4iCisgIDp2 ZXJzaW9uICIzMC4xIgorICA6dHlwZSAnaW50ZWdlcgorICA6Z3JvdXAgJ2ZpbGwpCisKKyhk ZWZjdXN0b20gYmFsYW5jZWQtZmlsbC1sZW5ndGgtZXhwb25lbnQgMworICAiQ29udHJvbHMg dGhlIHBlbmFsdHkgZm9yIGxpbmVzIHRoYXQgYXJlIHNob3J0ZXIgb3IgbG9uZ2VyIHRoYW4K K3RoZSB0YXJnZXQgbGVuZ3RoIHRvIHRoZSBtYXJnaW4uICBUaGUgZGlmZmVyZW5jZSBiZXR3 ZWVuIHRoZQorYWN0dWFsIGFuZCB0YXJnZXQgbGVuZ3RoIHdpbGwgYmUgcmFpc2VkIHRvIHRo aXMgcG93ZXIgd2hlbgorY2FsY3VsYXRpbmcgdGhlIGNvc3Qgb2YgYSBwb3RlbnRpYWwgbGlu ZSBicmVhay4gIFRoaXMgaXMgdGhlCittYWluIGNvbnRyb2wgZm9yIHRoZSBjb3N0IGZ1bmN0 aW9uLiIKKyAgOnZlcnNpb24gIjMwLjEiCisgIDp0eXBlICdpbnRlZ2VyCisgIDpncm91cCAn ZmlsbCkKKworKGRlZmN1c3RvbSBiYWxhbmNlZC1maWxsLXJhZ2dlZG5lc3MtcGVuYWx0eSA0 MAorICAiQWRkaXRpb25hbCBwZW5hbHR5IGZvciBlYWNoIGNvbHVtbiBvZiBkaWZmZXJlbmNl IGluIGxlbmd0aAorcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIGxpbmUsIHVubGVzcyB0aGlz IGlzIHRoZSBsYXN0IGxpbmUKK2FuZCBsb25nZXIgdGhhbiBzZWNvbmQgdG8gbGFzdC4gIEhp Z2hlciBudW1iZXJzIG1ha2UgaXQgdHJ5CitoYXJkZXIgdG8ga2VlcCBhbGwgbGluZXMgYXMg ZXZlbiBhcyBwb3NzaWJsZSBpbiBsZW5ndGggYXQgdGhlCitleHBlbnNlIG9mIG90aGVyIGZh Y3RvcnMuIgorICA6dmVyc2lvbiAiMzAuMSIKKyAgOnR5cGUgJ2ludGVnZXIKKyAgOmdyb3Vw ICdmaWxsKQorCisoZGVmY3VzdG9tIGJhbGFuY2VkLWZpbGwtc2luZ2xlLXBlbmFsdHkgMTUw CisgICJBZGRpdGlvbmFsIHBlbmFsdHkgZWl0aGVyIGZvciBzdGFydGluZyBhIG5ldyBzZW50 ZW5jZSB3aXRoIGEKK3NpbmdsZSB3b3JkIHJpZ2h0IGF0IHRoZSBlbmQgb2YgYSBsaW5lLCBv ciBlbHNlIGZvciBlbmRpbmcgYQorc2VudGVuY2Ugd2l0aCBhIHNpbmdsZSB3b3JkIGxlZnQg YXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4iCisgIDp2ZXJzaW9uICIzMC4xIgorICA6dHlwZSAn aW50ZWdlcgorICA6Z3JvdXAgJ2ZpbGwpCisKKyhkZWZjdXN0b20gYmFsYW5jZWQtZmlsbC1i cmVhay1wZW5hbHR5IDUwCisgICJBZGRpdGlvbmFsIHBlbmFsdHkgZm9yIGVhY2ggbGluZSBi cmVhayBhZGRlZC4gIFRoZSBsYXJnZXIgdGhpcworaXMsIHRoZSBtb3JlIHRoZSBhbGdvcml0 aG0gd2lsbCB0cnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZgorbGluZXMgZGVzcGl0ZSB0 aGUgb3RoZXIgcGVuYWx0aWVzLiIKKyAgOnZlcnNpb24gIjMwLjEiCisgIDp0eXBlICdpbnRl Z2VyCisgIDpncm91cCAnZmlsbCkKKwogKGRlZnZhciBmaWxsLWluZGVudC1hY2NvcmRpbmct dG8tbW9kZSBuaWwgO1NjcmV3cyB1cCBDQy1tb2RlJ3MgZmlsbGluZyB0cmlja3MuCiAgICJX aGV0aGVyIG9yIG5vdCBmaWxsaW5nIHNob3VsZCB0cnkgdG8gdXNlIHRoZSBtYWpvciBtb2Rl J3MgaW5kZW50YXRpb24uIikKIApAQCAtNjQ0LDYgKzcyNCwxMzUgQEAgZmlsbC1pbmRlbnQt dG8tbGVmdC1tYXJnaW4KICAgICAoaW5kZW50LWxpbmUtdG8gKGN1cnJlbnQtbGVmdC1tYXJn aW4pKQogICAgIChwdXQtdGV4dC1wcm9wZXJ0eSBiZWcgKHBvaW50KSAnZmFjZSAnZGVmYXVs dCkpKQogCisoZGVmdW4gYmFsYW5jZWQtZmlsbC1icmVhay1saW5lcyAoZnJvbSB0byBqdXN0 aWZ5KQorICA7OyBCdWlsZCBhIHRhYmxlIG9mIHZpc2libGUgd29yZCB3aWR0aHMsIHdpdGgg YW5kIHdpdGhvdXQgYW55IHByZWNlZGluZworICA7OyBzcGFjZXMsIGFsb25nIHdpdGggd2hl dGhlciB0aGUgd29yZCBzdGFydHMgYSBuZXcgc2VudGVuY2UuICBXZSBnbyBieQorICA7OyBj b2x1bW5zIGFuZCBub3QgY2hhcnMgdG8gaGFuZGxlIGludmlzaWJsZSB0ZXh0IChlc3BlY2lh bGx5IGludmlzaWJsZQorICA7OyBzcGFjZXMpLCBldGMuCisgIChsZXQgKCh3b3JkcyAnKCkp CisgICAgICAgIChjb3VudCAwKQorICAgICAgICAoc2VudGVuY2UtcmVnZXhwIChzZW50ZW5j ZS1lbmQpKSkKKyAgICAoZ290by1jaGFyIHRvKQorICAgICh3aGlsZSAoPiAocG9pbnQpIGZy b20pCisgICAgICAobGV0KiAoKHByZXZpb3VzIChwb2ludCkpCisgICAgICAgICAgICAgKGVu ZCAoY3VycmVudC1jb2x1bW4pKQorICAgICAgICAgICAgIChuZXh0IChwcm9nbiAoZmlsbC1t b3ZlLXRvLWJyZWFrLXBvaW50IGZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgIDs7 IE5lZWRlZCBmb3IgbW92aW5nIHBhc3Qgc29tZSBPcmctbW9kZSBsaW5rcworICAgICAgICAg ICAgICAgICAgICAgICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgKHBvaW50KSkpCisgICAgICAgICAgICAgKHdpdGgtc3BhY2Ug KGN1cnJlbnQtY29sdW1uKSkKKyAgICAgICAgICAgICAod2l0aG91dC1zcGFjZSAocHJvZ24g KHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGN1cnJlbnQtY29sdW1uKSkpCisgICAgICAgICAgICAgKG5ldy1zZW50ZW5j ZSAobG9va2luZy1iYWNrIHNlbnRlbmNlLXJlZ2V4cCBmcm9tKSkpCisgICAgICAgIChnb3Rv LWNoYXIgbmV4dCkKKyAgICAgICAgOzsgSWYgcG9pbnQgZGlkbid0IG1vdmUsIHdlJ3JlIGFm dGVyIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLgorICAgICAgICAod2hlbiAoPD0gcHJl dmlvdXMgbmV4dCkKKyAgICAgICAgICAoZ290by1jaGFyIGZyb20pCisgICAgICAgICAgKHNl dHEgd2l0aC1zcGFjZSAoY3VycmVudC1jb2x1bW4pCisgICAgICAgICAgICAgICAgd2l0aG91 dC1zcGFjZSAoY3VycmVudC1jb2x1bW4pKSkKKyAgICAgICAgOzsgTWVyZ2UgaW50byBwcmV2 aW91cyBlbnRyeSB3aGVuIG1vdmluZyBwYXN0IGludmlzaWJsZSB0ZXh0LgorICAgICAgICAo aWYgKD0gZW5kIHdpdGhvdXQtc3BhY2UpCisgICAgICAgICAgICAoc2V0cSBlbmQgKCsgZW5k IChvciAoY2FyIChwb3Agd29yZHMpKSAwKSkpKQorICAgICAgICAocHVzaCAobGlzdCAoLSBl bmQgd2l0aC1zcGFjZSkgKC0gZW5kIHdpdGhvdXQtc3BhY2UpIG5ldy1zZW50ZW5jZSkKKyAg ICAgICAgICAgICAgd29yZHMpKSkKKyAgICAoc2V0cSB3b3JkcyAodmNvbmNhdCB3b3Jkcykp CisgICAgKHNldHEgY291bnQgKGxlbmd0aCB3b3JkcykpCisKKyAgICA7OyBBYm9ydCAoYW5k IGZhbGwgYmFjayB0byBncmVlZHkgYWxnb3JpdGhtKSBpZiB3ZSBoYXZlIHRvbyBtYW55IHdv cmRzLgorICAgIDs7IFRoZSBhbGdvcml0aG0gYmVsb3cgaXMgd29yc3QtY2FzZSBxdWFkcmF0 aWMgKHRob3VnaCB1c3VhbGx5IG5vdCkuCisgICAgOzsgQXN5bXB0b3RpY2FsbHkgZmFzdGVy IGFsZ29yaXRobXMgZXhpc3QsIGJ1dCBhcmUgbW9yZSBjb21wbGljYXRlZC4KKyAgICAoaWYg KD4gY291bnQgYmFsYW5jZWQtZmlsbC1tYXhpbXVtLXdvcmRzKQorICAgICAgICBuaWwKKwor ICAgICAgOzsgQ29uc2lkZXIgZWFjaCB3b3JkIGFzIGEgY2FuZGlkYXRlIHRvIHN0YXJ0IGEg bGluZSwgYW5kIGJ1aWxkIGEKKyAgICAgIDs7IHRhYmxlIG9mIHdoaWNoIHdvcmQgdGhlIHBy ZXZpb3VzIGxpbmUgd291bGQgYmUgYmVzdCB0byBzdGFydCBvbgorICAgICAgOzsgYW5kIHRo ZSB3aWR0aCBvZiB0aGUgcHJldmlvdXMgbGluZS4gIFVzZSBkeW5hbWljIHByb2dyYW1taW5n IHRvCisgICAgICA7OyBtaW5pbWl6ZSBhIGNvc3QgZnVuY3Rpb24uCisgICAgICAobGV0ICgo c3RhcnRzIChtYWtlLXZlY3RvciAoMSsgY291bnQpIDApKQorICAgICAgICAgICAgKHdpZHRo cyAobWFrZS12ZWN0b3IgKDErIGNvdW50KSAwKSkpCisgICAgICAgIChsZXQqICgoc3RhcnQg MCkKKyAgICAgICAgICAgICAgIChyb29tICgtIGZpbGwtY29sdW1uIChjdXJyZW50LWNvbHVt bikpKQorICAgICAgICAgICAgICAgKGNvc3RzIChtYWtlLXZlY3RvciAoMSsgY291bnQpIG1v c3QtcG9zaXRpdmUtZml4bnVtKSkKKyAgICAgICAgICAgICAgIChyYWdzIChtYWtlLXZlY3Rv ciAoMSsgY291bnQpIGJhbGFuY2VkLWZpbGwtbWFyZ2luKSkpCisgICAgICAgICAgKGFzZXQg Y29zdHMgMCAwKQorICAgICAgICAgICh3aGlsZSAoPCBzdGFydCBjb3VudCkKKyAgICAgICAg ICAgIDs7IFRoZSByb29tIGZvciB0aGUgZmlyc3QgbGluZSBtYXkgYmUgZGlmZmVyZW50IHRo YW4gdGhlIHJlc3QuCisgICAgICAgICAgICAoaWYgKD0gc3RhcnQgMSkKKyAgICAgICAgICAg ICAgICAoc2V0cSByb29tICgtIGZpbGwtY29sdW1uCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoc3RyaW5nLXdpZHRoIChvciBmaWxsLXByZWZpeCAiIikpKSkpCisgICAgICAg ICAgICA7OyBDb25zaWRlciBlYWNoIHdvcmQgdGhpcyBuZXcgbGluZSBtaWdodCBlbmQgb24u ICBEb24ndCB0ZXN0CisgICAgICAgICAgICA7OyB3aWR0aCBhZ2FpbnN0IHJvb20geWV0OyB3 ZSB3YW50IGF0IGxlYXN0IG9uZSB3b3JkIHBlciBsaW5lLAorICAgICAgICAgICAgOzsgc28g d2UgbmVlZCBhdCBsZWFzdCBvbmUgaXRlcmF0aW9uLgorICAgICAgICAgICAgKGxldCAoKGVu ZCBzdGFydCkKKyAgICAgICAgICAgICAgICAgICh3aWR0aCAwKSkKKyAgICAgICAgICAgICAg KHdoaWxlICg8IGVuZCBjb3VudCkKKyAgICAgICAgICAgICAgICA7OyBEb24ndCBhZGQgdGhl IHNwYWNlIGJlZm9yZSB0aGUgZmlyc3Qgd29yZCB0byB0aGUgd2lkdGguCisgICAgICAgICAg ICAgICAgKHNldHEgd2lkdGggKCsgd2lkdGggKG50aCAoaWYgKD0gZW5kIHN0YXJ0KSAxIDAp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJlZiB3b3Jk cyBlbmQpKSkpCisgICAgICAgICAgICAgICAgOzsgT3VyIGNvc3QgZnVuY3Rpb24gaXMgdGhl IHN1bSBvZiB0aGUgYmVzdCB0b3RhbCBjb3N0CisgICAgICAgICAgICAgICAgOzsgZm9yIGFs bCB0aGUgbGluZXMgcHJlY2VkaW5nIHRoZSBzdGFydCBvZiB0aGlzIG9uZSwKKyAgICAgICAg ICAgICAgICAobGV0ICgoY29zdCAoKyAoYXJlZiBjb3N0cyBzdGFydCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7OyBwbHVzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBtYXJn aW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwdCAoYWJzICgtIHJvb20g YmFsYW5jZWQtZmlsbC1tYXJnaW4gd2lkdGgpKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDs7IGV4cG9uZW50aWF0ZWQgaWYgbm90IHRoZSBsYXN0IGxpbmUKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKG9yICgvPSAoMSsgZW5k KSBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDs7IG9yIGlmIHdlJ2QgbGVhdmUgYSB3aWRvdywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICg8ICgtICgxKyBlbmQpIHN0YXJ0KQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZWQtZmlsbC13 aWRvd3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxh bmNlZC1maWxsLWxlbmd0aC1leHBvbmVudCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA7OyBwbHVzIGEgcGVuYWx0eSBmb3IgYW4gdW5ldmVuIHJpZ2h0IHNpZGUKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAoYWJzICgtIHJvb20gd2lkdGgKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcmVmIHJhZ3Mgc3Rh cnQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBpZiBub3QgdGhl IGxhc3QgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAob3Ig KC89ICgxKyBlbmQpIGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOzsgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbG9uZ2VyLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDwgKC0gcm9vbSB3aWR0aCkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcmVmIHJhZ3Mg c3RhcnQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5j ZWQtZmlsbC1yYWdnZWRuZXNzLXBlbmFsdHkgMCkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOzsgcGx1cyBhIHBlbmFsdHkgaWYgZW5kaW5nIG9uIHRoZQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDs7IHN0YXJ0IG9mIGEgbmV3IHNlbnRlbmNlLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAobnRoIDIgKGFyZWYgd29yZHMgZW5k KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZWQtZmlsbC1z aW5nbGUtcGVuYWx0eSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGFu ZCBhIHBlbmFsdHkgaWYgc3RhcnRpbmcgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDs7IGEgc2luZ2xlIHdvcmQgYW5kIHRoZW4gYSBuZXcgc2VudGVuY2UsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgKDwgKDErIHN0YXJ0KSBjb3Vu dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIDIgKGFy ZWYgd29yZHMgKDErIHN0YXJ0KSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBiYWxhbmNlZC1maWxsLXNpbmdsZS1wZW5hbHR5IDApCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOzsgYW5kIGEgcGVuYWx0eSBmb3IgZWFjaCBicmVhay4KKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlZC1maWxsLWJyZWFrLXBlbmFsdHkp KSkKKyAgICAgICAgICAgICAgICAgIDs7IEZvciBlbmRpbmcgYWZ0ZXIgaGVyZSwgaXMgdGhp cyBhIGJldHRlciBzdGFydGluZyBwbGFjZT8KKyAgICAgICAgICAgICAgICAgICh3aGVuIChh bmQgKDw9IGNvc3QgKGFyZWYgY29zdHMgKDErIGVuZCkpKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAob3IgKDw9IHdpZHRoIHJvb20pICg9IGVuZCBzdGFydCkpKQorICAgICAg ICAgICAgICAgICAgICAoYXNldCBjb3N0cyAoMSsgZW5kKSBjb3N0KQorICAgICAgICAgICAg ICAgICAgICAoYXNldCBzdGFydHMgKDErIGVuZCkgc3RhcnQpCisgICAgICAgICAgICAgICAg ICAgIChhc2V0IHdpZHRocyAoMSsgZW5kKSB3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAg KGFzZXQgcmFncyAoMSsgZW5kKSAoLSByb29tIHdpZHRoKSkpKQorICAgICAgICAgICAgICAg IDs7IEJyZWFrIHRoZSBpbm5lciAoZW5kKSBsb29wIGlmIHdlJ3JlIG91dCBvZiByb29tIG5v dy4KKyAgICAgICAgICAgICAgICAoaWYgKD49IHdpZHRoIHJvb20pCisgICAgICAgICAgICAg ICAgICAgIChzZXRxIGVuZCBjb3VudCkpCisgICAgICAgICAgICAgICAgKHNldHEgZW5kICgx KyBlbmQpKSkpCisgICAgICAgICAgICAoc2V0cSBzdGFydCAoMSsgc3RhcnQpKSkpCisKKyAg ICAgICAgOzsgV2FsayBiYWNrd2FyZHMgZnJvbSB0aGUgZW5kIG9mIHRoZSB0YWJsZSB0byBy ZWNvbnN0cnVjdCBhIGxpc3QKKyAgICAgICAgOzsgb2YgdGhlIG9wdGltYWwgd2lkdGhzIGZv ciBlYWNoIGxpbmUuCisgICAgICAgIChsZXQgKGNob3NlbikKKyAgICAgICAgICAobGV0ICgo ZW5kIGNvdW50KSkKKyAgICAgICAgICAgICh3aGlsZSAoPiBlbmQgMCkKKyAgICAgICAgICAg ICAgKGlmICg8IGVuZCBjb3VudCkKKyAgICAgICAgICAgICAgICAgIChwdXNoIChhcmVmIHdp ZHRocyBlbmQpIGNob3NlbikpCisgICAgICAgICAgICAgIChzZXRxIGVuZCAoYXJlZiBzdGFy dHMgZW5kKSkpKQorCisgICAgICAgICAgOzsgVGhlbiBpbnNlcnQgdGhvc2UgbGluZSBicmVh a3MgYW5kIGp1c3RpZnkgZWFjaCBsaW5lLgorICAgICAgICAgIChtYXBjIChsYW1iZGEgKHdp ZHRoKQorICAgICAgICAgICAgICAgICAgKG1vdmUtdG8tY29sdW1uICgrIChjdXJyZW50LWNv bHVtbikgd2lkdGgpKQorICAgICAgICAgICAgICAgICAgKGZpbGwtbmV3bGluZSkKKwkJICAo aWYganVzdGlmeQorCQkgICAgICAoc2F2ZS1leGN1cnNpb24KKwkJICAgICAgICAoZm9yd2Fy ZC1saW5lIC0xKQorCQkgICAgICAgIChqdXN0aWZ5LWN1cnJlbnQtbGluZSBqdXN0aWZ5IG5p bCB0KSkpKQorICAgICAgICAgICAgICAgIGNob3NlbikKKyAgICAgICAgICAoaWYganVzdGlm eSAoanVzdGlmeS1jdXJyZW50LWxpbmUganVzdGlmeSB0IHQpKSkpKSkpCisKIChkZWZ1biBm aWxsLXJlZ2lvbi1hcy1wYXJhZ3JhcGggKGZyb20gdG8gJm9wdGlvbmFsIGp1c3RpZnkKIAkJ CQkgICAgICBub3NxdWVlemUgc3F1ZWV6ZS1hZnRlcikKICAgIkZpbGwgdGhlIHJlZ2lvbiBh cyBpZiBpdCB3ZXJlIGEgc2luZ2xlIHBhcmFncmFwaC4KQEAgLTc2Miw2ICs5NzEsMTEgQEAg ZmlsbC1yZWdpb24tYXMtcGFyYWdyYXBoCiAKIAk7OyBUaGlzIGlzIHRoZSBhY3R1YWwgZmls bGluZyBsb29wLgogCShnb3RvLWNoYXIgZnJvbSkKKyAgICAgICAgOzsgQXR0ZW1wdCB0byBi cmVhayBpbnRvIGJhbGFuY2VkIGxpbmVzIGlmIGRlc2lyZWQuCisgICAgICAgICh3aGVuIGJh bGFuY2VkLWZpbGwtbW9kZQorICAgICAgICAgIChiYWxhbmNlZC1maWxsLWJyZWFrLWxpbmVz IGZyb20gdG8ganVzdGlmeSkpCisgICAgICAgIDs7IE90aGVyd2lzZSAoaWYgcG9pbnQgaXMg c3RpbGwgYXQgZnJvbSksCisgICAgICAgIDs7IGZhbGwgYmFjayB0byB0aGUgc3RhbmRhcmQg Z3JlZWR5IGxpbmUgYnJlYWtpbmcgbG9vcC4KIAkobGV0IChsaW5lYmVnKQogICAgICAgICAg ICh3aGlsZSAoPCAocG9pbnQpIHRvKQogCSAgICAoc2V0cSBsaW5lYmVnIChwb2ludCkpCmRp ZmYgLS1naXQgYS90ZXN0L2xpc3AvdGV4dG1vZGVzL2ZpbGwtdGVzdHMuZWwgYi90ZXN0L2xp c3AvdGV4dG1vZGVzL2ZpbGwtdGVzdHMuZWwKaW5kZXggZWY4MjJiYTgwNS4uMTFkYjZhNDk5 ZiAxMDA2NDQKLS0tIGEvdGVzdC9saXNwL3RleHRtb2Rlcy9maWxsLXRlc3RzLmVsCisrKyBi L3Rlc3QvbGlzcC90ZXh0bW9kZXMvZmlsbC10ZXN0cy5lbApAQCAtMTIxLDYgKzEyMSwyMSBA QCB0ZXN0LWZpbGwtaGFza2VsbAogICA7OyB3CiAiKSkpCiAKKyhlcnQtZGVmdGVzdCBmaWxs LXRlc3QtYmFsYW5jZWQtZmlsbC1tb2RlIG5pbAorICAiQmFzaWMgdGVzdCBvZiB0aGUgYGJh bGFuY2VkLWZpbGwtbW9kZScgb3B0aW9uLiIKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAo aW5zZXJ0ICJDY2MgY2NjIGEgYmIgZGRkZCBiYiBiYiBhIGNjYyBhIGpqampqampqamogYSBl ZWVlZSBhIGhoaGhoaGhoIGJiIGRkZGQuIikKKyAgICAoc2V0cSBmaWxsLWNvbHVtbiAxNSkK KyAgICAoc2V0cS1sb2NhbCBiYWxhbmNlZC1maWxsLW1vZGUgbmlsKQorICAgIChmaWxsLXBh cmFncmFwaCkKKyAgICAoc2hvdWxkIChzdHJpbmc9IChidWZmZXItc3RyaW5nKSAiQ2NjIGNj YyBhIGJiXG5kZGRkIGJiIGJiIGFcbmNjYyBhXG5qampqampqampqIGFcbmVlZWVlIGFcbmho aGhoaGhoIGJiXG5kZGRkLiIpKSkKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAoaW5zZXJ0 ICJDY2MgY2NjIGEgYmIgZGRkZCBiYiBiYiBhIGNjYyBhIGpqampqampqamogYSBlZWVlZSBh IGhoaGhoaGhoIGJiIGRkZGQuIikKKyAgICAoc2V0cSBmaWxsLWNvbHVtbiAxNSkKKyAgICAo c2V0cS1sb2NhbCBiYWxhbmNlZC1maWxsLW1vZGUgdCkKKyAgICAoZmlsbC1wYXJhZ3JhcGgp CisgICAgKHNob3VsZCAoc3RyaW5nPSAoYnVmZmVyLXN0cmluZykgIkNjYyBjY2MgYVxuYmIg ZGRkZCBiYlxuYmIgYSBjY2MgYVxuampqampqampqalxuYSBlZWVlZSBhXG5oaGhoaGhoaFxu YmIgZGRkZC4iKSkpKQorCiAocHJvdmlkZSAnZmlsbC10ZXN0cykKIAogOzs7IGZpbGwtdGVz dHMuZWwgZW5kcyBoZXJlCi0tIAoyLjE3LjEKCg== --------------U6U1i80qvZoNZsVAvkQDbBAD--