From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: =?UTF-8?Q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9_?= =?UTF-8?Q?=D0=91=D0=BE=D0=B9=D0=BA=D0=BE=D0=B2?= via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#63757: 29.0.91 order of package paths changed: random old versions of packages in load-path Date: Sun, 4 Jun 2023 14:46:14 +1000 Message-ID: References: <83y1l7gzqw.fsf@gnu.org> <87ilcb2p1l.fsf@posteo.net> <87sfb8g85v.fsf@posteo.net> Reply-To: =?UTF-8?Q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9_?= =?UTF-8?Q?=D0=91=D0=BE=D0=B9=D0=BA=D0=BE=D0=B2?= Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="000000000000f8b4da05fd4677de" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="1884"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Philip Kaludercic , 63757@debbugs.gnu.org, Eli Zaretskii To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Jun 04 10:10:37 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 1q5iov-0000Ff-OW for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 04 Jun 2023 10:10:37 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1q5ioS-0005WH-37; Sun, 04 Jun 2023 04:10:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1q5ioP-0005VC-Nd for bug-gnu-emacs@gnu.org; Sun, 04 Jun 2023 04:10:06 -0400 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 1q5ioP-0007uj-Ey for bug-gnu-emacs@gnu.org; Sun, 04 Jun 2023 04:10:05 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1q5ioP-0001cG-9p for bug-gnu-emacs@gnu.org; Sun, 04 Jun 2023 04:10:05 -0400 X-Loop: help-debbugs@gnu.org Resent-From: =?UTF-8?Q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9_?= =?UTF-8?Q?=D0=91=D0=BE=D0=B9=D0=BA=D0=BE=D0=B2?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 04 Jun 2023 08:10:05 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 63757 X-GNU-PR-Package: emacs Original-Received: via spool by 63757-submit@debbugs.gnu.org id=B63757.16858661746028 (code B ref 63757); Sun, 04 Jun 2023 08:10:05 +0000 Original-Received: (at 63757) by debbugs.gnu.org; 4 Jun 2023 08:09:34 +0000 Original-Received: from localhost ([127.0.0.1]:44850 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1q5int-0001Z3-2z for submit@debbugs.gnu.org; Sun, 04 Jun 2023 04:09:34 -0400 Original-Received: from smtp42.i.mail.ru ([95.163.41.65]:54224) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1q5fdR-0001VE-Mk for 63757@debbugs.gnu.org; Sun, 04 Jun 2023 00:46:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=list.ru; s=mail4; h=Content-Type:Cc:To:Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version:From:Subject:Content-Type:Content-Transfer-Encoding:To:Cc; bh=I124rxUP/WiIgH374sFmaMYDECdWd+1kg4mIkuKuCHk=; t=1685853993;x=1685943993; b=IDyxggVeixMZgDgSxgWh80BSna+r4yunNKeEXG18Gq57VnAQchiFBDyGvc23s/g0RV5INIVrKpsoSOemjEApUqzKOvEpLQTZWHw11QJIs7zHBPQ1MZHxB+LmzoLvPCSaxxsg54cQ6B0BiIJKbJdVz5QcDMosR6bM8deUHOqmpHKPB2EBMZQMdI+s775+7+tAfIMkimt2/Ld0ZbWP+dMsl8Hq9B+TLKwDyTF1qtu+aZxtKcTcnNVTjLam+w9gXh6WjhzWmfODFTToeVqw7yfEgUt9KiXlKS7FYFCZ3EkahlOLSmdoHuVXx+ks4FPyZNs0+q+G+LaRPs9+BnS5nVSEFg==; Original-Received: by smtp42.i.mail.ru with esmtpa (envelope-from ) id 1q5fdK-00CYR4-K7 for 63757@debbugs.gnu.org; Sun, 04 Jun 2023 07:46:27 +0300 Original-Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-3f6dbe3c230so36558475e9.3 for <63757@debbugs.gnu.org>; Sat, 03 Jun 2023 21:46:26 -0700 (PDT) X-Gm-Message-State: AC+VfDyOONLlVAbm4utAlPIgLGfZne97qvCbw3AB0u94o9gOSdnTKDGJ jWBGQ3U8KJJFfwpZ9qtfpZKpkAzIv6SoYugXALg= X-Google-Smtp-Source: ACHHUZ6tYmSifnY+9BsuhnF4qTqD2KWhjtbTcwp2iHKlrhujXQbEJpCpVoGoZR2PsjxX9r8G+ou+mlh5x62Uddim3dM= X-Received: by 2002:a05:600c:210e:b0:3f4:2e13:ccdc with SMTP id u14-20020a05600c210e00b003f42e13ccdcmr5312519wml.0.1685853985877; Sat, 03 Jun 2023 21:46:25 -0700 (PDT) In-Reply-To: X-Gmail-Original-Message-ID: Authentication-Results: smtp42.i.mail.ru; auth=pass smtp.auth=artscan@list.ru smtp.mailfrom=artscan@list.ru X-Mailru-Src: smtp X-7564579A: 78E4E2B564C1792B X-77F55803: 4F1203BC0FB41BD988F25420CCA9469AC4C4DE6D3AF0D4F65E8FFE5E098C4BB3182A05F53808504012B779D81EAFE70C61844D8139D98281D569723B55CB084532FA8D2258B62DA8 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7D77100FFB2844417EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F79006375FE8AD9F0D2764EB8638F802B75D45FF36EB9D2243A4F8B5A6FCA7DBDB1FC311F39EFFDF887939037866D6147AF826D8B5A3BC299D7AC1FC788FF3A3951EAA206F9789CCF6C18C3F8528715B7D10C86878DA827A17800CE7ECE82AE7387CF2AD9FA2833FD35BB23D27C277FBC8AE2E8B63AA6E1FE3717D94A471835C12D1D977C4224003CC836476EB9C4185024447017B076A6E789B0E975F5C1EE8F4F765FCCB8D2DC5E147DA1D3AA81AA40904B5D9CF19DD082D7633A078D18283394535A93AA81AA40904B5D98AA50765F79006371C1957EAA1B0C2A1D81D268191BDAD3D3666184CF4C3C14F3FC91FA280E0CE3D1A620F70A64A45A98AA50765F79006372E808ACE2090B5E1725E5C173C3A84C3C5EA940A35A165FF2DBA43225CD8A89F83C798A30B85E16B5E1C53F199C2BB95B5C8C57E37DE458BEDA766A37F9254B7 X-C1DE0DAB: 0D63561A33F958A5843B2E66060AF7916CB5AEAC9867DAFA26586A4E413ECAC1F87CCE6106E1FC07E67D4AC08A07B9B0735DFC8FA7AC1207CB5012B2E24CD356 X-C8649E89: 1C3962B70DF3F0ADE00A9FD3E00BEEDF77DD89D51EBB7742D3581295AF09D3DF87807E0823442EA2ED31085941D9CD0AF7F820E7B07EA4CF84E3467679AB183966C6D967A74617C8437A0214CB167398426A19456A465B83A7F6D8DEE3A50DD4F4BC53521BD43B01EACF8F4822649131797E08891781A90BCAACD699CDC6F98202C26D483E81D6BE1362B2BFE906F14DEF4373B74A18CF49CC2E138FFB4ACBED X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojZIfw4O47JkJJQ2O014zhfA== X-Mailru-Sender: 4C235FE2E5D2D89056C959CA05ACF41DD5E166599E5F1E2D0286056D391CEDC2CEEC192FA4CC42DAA3C36B4D8423ABA5C77752E0C033A69EC36ED9D1848BBC3A06988B367FA93C37B4A721A3011E896F X-Mras: Ok X-Mailman-Approved-At: Sun, 04 Jun 2023 04:09:27 -0400 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:262910 Archived-At: --000000000000f8b4da05fd4677de Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable move "Prefer VC packages" to `package-process-define-package` drop `package-disabled-p` and "Prefer builtin packages" comment diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ba0e3618f28..65ec07b945a 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -686,7 +686,7 @@ Convert EXP into a `package-desc' object using the If there already exists a package by the same name in `package-alist', insert this object there such that the packages -are sorted with the highest version first." +are sorted with VC packages first and the highest version second." (when (eq (car-safe exp) 'define-package) (let* ((new-pkg-desc (apply #'package-desc-from-define (cdr exp))) (name (package-desc-name new-pkg-desc)) @@ -696,13 +696,30 @@ are sorted with the highest version first." ;; If there's no old package, just add this to `package-alist'. (push (list name new-pkg-desc) package-alist) ;; If there is, insert the new package at the right place in the list. - (while - (if (and (cdr old-pkgs) - (version-list-< version - (package-desc-version (cadr old-pkgs)))) - (setq old-pkgs (cdr old-pkgs)) - (push new-pkg-desc (cdr old-pkgs)) - nil))) + (progn + ;; Prefer newer packages + (while + (if (and (cdr old-pkgs) + (version-list-< version + (package-desc-version (cadr old-pkgs)))) + (setq old-pkgs (cdr old-pkgs)) + (push new-pkg-desc (cdr old-pkgs)) + nil)) + ;; Prefer VC packages + (let* ((pkg-desc0 (cdr (assq name package-alist))) + (pkg-desc + (apply 'append + (cl-reduce + (lambda (p1 p2) + (if (package-vc-p p1) + (push p1 (cl-first p2)) + (push p1 (cl-second p2))) + p2) + pkg-desc0 + :initial-value (list nil nil) + :from-end t)))) + (setf pkg-desc0 pkg-desc) + (setq new-pkg-desc (car pkg-desc))))) new-pkg-desc))) (declare-function package-vc-commit "package-vc" (pkg)) @@ -916,17 +933,7 @@ correspond to previously loaded files." (defun package--get-activatable-pkg (pkg-name) ;; Is "activatable" a word? - (let ((pkg-descs (sort (cdr (assq pkg-name package-alist)) - (lambda (p1 p2) - (let ((v1 (package-desc-version p1)) - (v2 (package-desc-version p2))) - (or - ;; Prefer VC packages. - (package-vc-p p1) - (package-vc-p p2) - ;; Prefer builtin packages. - (package-disabled-p p1 v1) - (not (package-disabled-p p2 v2)))))))) + (let ((pkg-descs (cdr (assq pkg-name package-alist)))) ;; Check if PACKAGE is available in `package-alist'. (while (when pkg-descs On Sun, Jun 4, 2023 at 12:06=E2=80=AFAM Stefan Monnier wrote: > >> Won't this work: > >> > >> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el > >> index 01826da273d..7eb185e7042 100644 > >> --- a/lisp/emacs-lisp/package.el > >> +++ b/lisp/emacs-lisp/package.el > >> @@ -927,7 +927,9 @@ package--get-activatable-pkg > >> (package-vc-p p2) > >> ;; Prefer builtin packages. > >> (package-disabled-p p1 v1) > >> - (not (package-disabled-p p2 v2)))))))) > >> + (not (package-disabled-p p2 v2)) > >> + ;; Prever newer packages > >> + (version-list-< v2 v1))))))) > >> ;; Check if PACKAGE is available in `package-alist'. > >> (while > >> (when pkg-descs > > > > Ping? > > The packages should already be sorted by version in `package-alist`, so > at best this will paper over the problem. This said, the `sort` call's > predicate looks weird indeed: > > (lambda (p1 p2) > (let ((v1 (package-desc-version p1)) > (v2 (package-desc-version p2))) > (or > ;; Prefer VC packages. > (package-vc-p p1) > (package-vc-p p2) > ;; Prefer builtin packages. > (package-disabled-p p1 v1) > (not (package-disabled-p p2 v2)))))))) > > - If both p1 and p2 are VC, then it will return non-nil, so > they're both "strictly less than" the other :-( > - If neither is VC nor disabled, we return non-nil, which again means > they're > both "strictly less than" the other. > - The comment says "Prefer builtin packages" but the code checks > `package-disabled-p`. > > And now that I look more carefully, maybe this `sort` is the culprit > after all, because it operates directly on the list contained in > `packages-alist`, modifying it in-place :-( > > I think we should *not* sort here: we should instead sort when we > populate `package-alist` (like we already do). So the "Prefer VC" part > of the sorting should be moved to `package-process-define-package` > (and the `package-disabled-p` can be dropped because it's already taken > care of by the loop that follows the above code). > > > Stefan > > --=20 __________________________ =D0=A1 =D1=83=D0=B2=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC, =D0=91=D0=BE=D0=B9=D0=BA=D0=BE=D0=B2 =D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8= =D0=B9 =D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B5=D0=B2=D0=B8=D1=87 =D1=81=D0=BE=D1=82. 8-924-202-25-65 e-mail: artscan@list.ru --000000000000f8b4da05fd4677de Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+bW92ZSAmcXVvdDtQcmVmZXIgVkMgcGFja2FnZXMmcXVvdDsgdG8gYHBh Y2thZ2UtcHJvY2Vzcy1kZWZpbmUtcGFja2FnZWA8YnI+ZHJvcCBgcGFja2FnZS1kaXNhYmxlZC1w YCBhbmQgJnF1b3Q7UHJlZmVyIGJ1aWx0aW4gcGFja2FnZXMmcXVvdDsgY29tbWVudDxicj48YnI+ PGJyPmRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxpc3AvcGFja2FnZS5lbCBiL2xpc3AvZW1hY3Mt bGlzcC9wYWNrYWdlLmVsPGJyPmluZGV4IGJhMGUzNjE4ZjI4Li42NWVjMDdiOTQ1YSAxMDA2NDQ8 YnI+LS0tIGEvbGlzcC9lbWFjcy1saXNwL3BhY2thZ2UuZWw8YnI+KysrIGIvbGlzcC9lbWFjcy1s aXNwL3BhY2thZ2UuZWw8YnI+QEAgLTY4Niw3ICs2ODYsNyBAQCBDb252ZXJ0IEVYUCBpbnRvIGEg YHBhY2thZ2UtZGVzYyYjMzk7IG9iamVjdCB1c2luZyB0aGU8YnI+wqA8YnI+wqBJZiB0aGVyZSBh bHJlYWR5IGV4aXN0cyBhIHBhY2thZ2UgYnkgdGhlIHNhbWUgbmFtZSBpbjxicj7CoGBwYWNrYWdl LWFsaXN0JiMzOTssIGluc2VydCB0aGlzIG9iamVjdCB0aGVyZSBzdWNoIHRoYXQgdGhlIHBhY2th Z2VzPGJyPi1hcmUgc29ydGVkIHdpdGggdGhlIGhpZ2hlc3QgdmVyc2lvbiBmaXJzdC4mcXVvdDs8 YnI+K2FyZSBzb3J0ZWQgd2l0aCBWQyBwYWNrYWdlcyBmaXJzdCBhbmQgdGhlIGhpZ2hlc3QgdmVy c2lvbiBzZWNvbmQuJnF1b3Q7PGJyPsKgIMKgKHdoZW4gKGVxIChjYXItc2FmZSBleHApICYjMzk7 ZGVmaW5lLXBhY2thZ2UpPGJyPsKgIMKgIMKgKGxldCogKChuZXctcGtnLWRlc2MgKGFwcGx5ICMm IzM5O3BhY2thZ2UtZGVzYy1mcm9tLWRlZmluZSAoY2RyIGV4cCkpKTxicj7CoCDCoCDCoCDCoCDC oCDCoCAobmFtZSAocGFja2FnZS1kZXNjLW5hbWUgbmV3LXBrZy1kZXNjKSk8YnI+QEAgLTY5Niwx MyArNjk2LDMwIEBAIGFyZSBzb3J0ZWQgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uIGZpcnN0LiZx dW90Ozxicj7CoCDCoCDCoCDCoCDCoCDCoDs7IElmIHRoZXJlJiMzOTtzIG5vIG9sZCBwYWNrYWdl LCBqdXN0IGFkZCB0aGlzIHRvIGBwYWNrYWdlLWFsaXN0JiMzOTsuPGJyPsKgIMKgIMKgIMKgIMKg IMKgKHB1c2ggKGxpc3QgbmFtZSBuZXctcGtnLWRlc2MpIHBhY2thZ2UtYWxpc3QpPGJyPsKgIMKg IMKgIMKgIMKgOzsgSWYgdGhlcmUgaXMsIGluc2VydCB0aGUgbmV3IHBhY2thZ2UgYXQgdGhlIHJp Z2h0IHBsYWNlIGluIHRoZSBsaXN0Ljxicj4tIMKgIMKgIMKgIMKgKHdoaWxlPGJyPi0gwqAgwqAg wqAgwqAgwqAgwqAoaWYgKGFuZCAoY2RyIG9sZC1wa2dzKTxicj4tIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICh2ZXJzaW9uLWxpc3QtJmx0OyB2ZXJzaW9uPGJyPi0gwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKHBhY2thZ2UtZGVzYy12 ZXJzaW9uIChjYWRyIG9sZC1wa2dzKSkpKTxicj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHNl dHEgb2xkLXBrZ3MgKGNkciBvbGQtcGtncykpPGJyPi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAocHVz aCBuZXctcGtnLWRlc2MgKGNkciBvbGQtcGtncykpPGJyPi0gwqAgwqAgwqAgwqAgwqAgwqAgwqBu aWwpKSk8YnI+KyDCoCDCoCDCoCDCoChwcm9nbjxicj4rIMKgIMKgIMKgIMKgIMKgOzsgUHJlZmVy IG5ld2VyIHBhY2thZ2VzPGJyPisgwqAgwqAgwqAgwqAgwqAod2hpbGU8YnI+KyDCoCDCoCDCoCDC oCDCoCDCoCDCoChpZiAoYW5kIChjZHIgb2xkLXBrZ3MpPGJyPisgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgKHZlcnNpb24tbGlzdC0mbHQ7IHZlcnNpb248YnI+KyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAocGFja2FnZS1k ZXNjLXZlcnNpb24gKGNhZHIgb2xkLXBrZ3MpKSkpPGJyPisgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAoc2V0cSBvbGQtcGtncyAoY2RyIG9sZC1wa2dzKSk8YnI+KyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoChwdXNoIG5ldy1wa2ctZGVzYyAoY2RyIG9sZC1wa2dzKSk8YnI+KyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoG5pbCkpPGJyPisgwqAgwqAgwqAgwqAgwqA7OyBQcmVmZXIgVkMgcGFja2Fn ZXM8YnI+KyDCoCDCoCDCoCDCoCDCoChsZXQqICgocGtnLWRlc2MwIChjZHIgKGFzc3EgbmFtZSBw YWNrYWdlLWFsaXN0KSkpPGJyPisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKHBrZy1kZXNjPGJy PisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoYXBwbHkgJiMzOTthcHBlbmQ8YnI+KyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoY2wtcmVkdWNlPGJyPisgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAobGFtYmRhIChwMSBwMik8YnI+KyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChpZiAocGFja2FnZS12Yy1wIHAxKTxi cj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHB1c2gg cDEgKGNsLWZpcnN0IHAyKSk8YnI+KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoChwdXNoIHAxIChjbC1zZWNvbmQgcDIpKSk8YnI+KyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHAyKTxicj4rIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgcGtnLWRlc2MwPGJyPisgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqA6aW5pdGlhbC12YWx1ZSAobGlzdCBuaWwgbmlsKTxicj4rIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOmZyb20tZW5kIHQpKSkpPGJyPisgwqAgwqAgwqAg wqAgwqAgwqAoc2V0ZiBwa2ctZGVzYzAgcGtnLWRlc2MpPGJyPisgwqAgwqAgwqAgwqAgwqAgwqAo c2V0cSBuZXctcGtnLWRlc2MgKGNhciBwa2ctZGVzYykpKSkpPGJyPsKgIMKgIMKgIMKgbmV3LXBr Zy1kZXNjKSkpPGJyPsKgPGJyPsKgKGRlY2xhcmUtZnVuY3Rpb24gcGFja2FnZS12Yy1jb21taXQg JnF1b3Q7cGFja2FnZS12YyZxdW90OyAocGtnKSk8YnI+QEAgLTkxNiwxNyArOTMzLDcgQEAgY29y cmVzcG9uZCB0byBwcmV2aW91c2x5IGxvYWRlZCBmaWxlcy4mcXVvdDs8YnI+wqA8YnI+wqAoZGVm dW4gcGFja2FnZS0tZ2V0LWFjdGl2YXRhYmxlLXBrZyAocGtnLW5hbWUpPGJyPsKgIMKgOzsgSXMg JnF1b3Q7YWN0aXZhdGFibGUmcXVvdDsgYSB3b3JkPzxicj4tIMKgKGxldCAoKHBrZy1kZXNjcyAo c29ydCAoY2RyIChhc3NxIHBrZy1uYW1lIHBhY2thZ2UtYWxpc3QpKTxicj4tIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChsYW1iZGEgKHAxIHAyKTxicj4tIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChsZXQgKCh2MSAocGFja2FnZS1kZXNjLXZlcnNp b24gcDEpKTxicj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgICh2MiAocGFja2FnZS1kZXNjLXZlcnNpb24gcDIpKSk8YnI+LSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAob3I8YnI+LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoDs7IFByZWZlciBWQyBwYWNrYWdlcy48YnI+LSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChwYWNrYWdlLXZjLXAgcDEpPGJy Pi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAocGFja2FnZS12 Yy1wIHAyKTxicj4tIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg OzsgUHJlZmVyIGJ1aWx0aW4gcGFja2FnZXMuPGJyPi0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAocGFja2FnZS1kaXNhYmxlZC1wIHAxIHYxKTxicj4tIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKG5vdCAocGFja2FnZS1kaXNh YmxlZC1wIHAyIHYyKSkpKSkpKSk8YnI+KyDCoChsZXQgKChwa2ctZGVzY3MgKGNkciAoYXNzcSBw a2ctbmFtZSBwYWNrYWdlLWFsaXN0KSkpKTxicj7CoCDCoCDCoDs7IENoZWNrIGlmIFBBQ0tBR0Ug aXMgYXZhaWxhYmxlIGluIGBwYWNrYWdlLWFsaXN0JiMzOTsuPGJyPsKgIMKgIMKgKHdoaWxlPGJy PsKgIMKgIMKgIMKgIMKgKHdoZW4gcGtnLWRlc2NzPGJyPjxicj48L2Rpdj48YnI+PGRpdiBjbGFz cz0iZ21haWxfcXVvdGUiPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBTdW4s IEp1biA0LCAyMDIzIGF0IDEyOjA24oCvQU0gU3RlZmFuIE1vbm5pZXIgJmx0OzxhIGhyZWY9Im1h aWx0bzptb25uaWVyQGlyby51bW9udHJlYWwuY2EiPm1vbm5pZXJAaXJvLnVtb250cmVhbC5jYTwv YT4mZ3Q7IHdyb3RlOjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0 eWxlPSJtYXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigy MDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+Jmd0OyZndDsgV29uJiMzOTt0IHRoaXMgd29y azo8YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IGRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxp c3AvcGFja2FnZS5lbCBiL2xpc3AvZW1hY3MtbGlzcC9wYWNrYWdlLmVsPGJyPg0KJmd0OyZndDsg aW5kZXggMDE4MjZkYTI3M2QuLjdlYjE4NWU3MDQyIDEwMDY0NDxicj4NCiZndDsmZ3Q7IC0tLSBh L2xpc3AvZW1hY3MtbGlzcC9wYWNrYWdlLmVsPGJyPg0KJmd0OyZndDsgKysrIGIvbGlzcC9lbWFj cy1saXNwL3BhY2thZ2UuZWw8YnI+DQomZ3Q7Jmd0OyBAQCAtOTI3LDcgKzkyNyw5IEBAIHBhY2th Z2UtLWdldC1hY3RpdmF0YWJsZS1wa2c8YnI+DQomZ3Q7Jmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChwYWNrYWdlLXZjLXAgcDIpPGJyPg0KJmd0OyZn dDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7OyBQcmVm ZXIgYnVpbHRpbiBwYWNrYWdlcy48YnI+DQomZ3Q7Jmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChwYWNrYWdlLWRpc2FibGVkLXAgcDEgdjEpPGJyPg0K Jmd0OyZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChu b3QgKHBhY2thZ2UtZGlzYWJsZWQtcCBwMiB2MikpKSkpKSkpPGJyPg0KJmd0OyZndDsgK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChub3QgKHBhY2thZ2UtZGlz YWJsZWQtcCBwMiB2MikpPGJyPg0KJmd0OyZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIDs7IFByZXZlciBuZXdlciBwYWNrYWdlczxicj4NCiZndDsmZ3Q7 ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAodmVyc2lvbi1s aXN0LSZsdDsgdjIgdjEpKSkpKSkpPGJyPg0KJmd0OyZndDvCoCDCoCDCoCA7OyBDaGVjayBpZiBQ QUNLQUdFIGlzIGF2YWlsYWJsZSBpbiBgcGFja2FnZS1hbGlzdCYjMzk7Ljxicj4NCiZndDsmZ3Q7 wqAgwqAgwqAgKHdoaWxlPGJyPg0KJmd0OyZndDvCoCDCoCDCoCDCoCDCoCAod2hlbiBwa2ctZGVz Y3M8YnI+DQomZ3Q7PGJyPg0KJmd0OyBQaW5nPzxicj4NCjxicj4NClRoZSBwYWNrYWdlcyBzaG91 bGQgYWxyZWFkeSBiZSBzb3J0ZWQgYnkgdmVyc2lvbiBpbiBgcGFja2FnZS1hbGlzdGAsIHNvPGJy Pg0KYXQgYmVzdCB0aGlzIHdpbGwgcGFwZXIgb3ZlciB0aGUgcHJvYmxlbS7CoCBUaGlzIHNhaWQs IHRoZSBgc29ydGAgY2FsbCYjMzk7czxicj4NCnByZWRpY2F0ZSBsb29rcyB3ZWlyZCBpbmRlZWQ6 PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAobGFtYmRh IChwMSBwMik8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChs ZXQgKCh2MSAocGFja2FnZS1kZXNjLXZlcnNpb24gcDEpKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHYyIChwYWNrYWdlLWRlc2MtdmVyc2lv biBwMikpKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg KG9yPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgOzsg UHJlZmVyIFZDIHBhY2thZ2VzLjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIChwYWNrYWdlLXZjLXAgcDEpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKHBhY2thZ2UtdmMtcCBwMik8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7OyBQcmVmZXIgYnVpbHRpbiBwYWNr YWdlcy48YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAo cGFja2FnZS1kaXNhYmxlZC1wIHAxIHYxKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIChub3QgKHBhY2thZ2UtZGlzYWJsZWQtcCBwMiB2MikpKSkpKSkp PGJyPg0KPGJyPg0KLSBJZiBib3RoIHAxIGFuZCBwMiBhcmUgVkMsIHRoZW4gaXQgd2lsbCByZXR1 cm4gbm9uLW5pbCwgc288YnI+DQrCoCB0aGV5JiMzOTtyZSBib3RoICZxdW90O3N0cmljdGx5IGxl c3MgdGhhbiZxdW90OyB0aGUgb3RoZXIgOi0oPGJyPg0KLSBJZiBuZWl0aGVyIGlzIFZDIG5vciBk aXNhYmxlZCwgd2UgcmV0dXJuIG5vbi1uaWwsIHdoaWNoIGFnYWluIG1lYW5zIHRoZXkmIzM5O3Jl PGJyPg0KwqAgwqBib3RoICZxdW90O3N0cmljdGx5IGxlc3MgdGhhbiZxdW90OyB0aGUgb3RoZXIu PGJyPg0KLSBUaGUgY29tbWVudCBzYXlzICZxdW90O1ByZWZlciBidWlsdGluIHBhY2thZ2VzJnF1 b3Q7IGJ1dCB0aGUgY29kZSBjaGVja3M8YnI+DQrCoCBgcGFja2FnZS1kaXNhYmxlZC1wYC48YnI+ DQo8YnI+DQpBbmQgbm93IHRoYXQgSSBsb29rIG1vcmUgY2FyZWZ1bGx5LCBtYXliZSB0aGlzIGBz b3J0YCBpcyB0aGUgY3VscHJpdDxicj4NCmFmdGVyIGFsbCwgYmVjYXVzZSBpdCBvcGVyYXRlcyBk aXJlY3RseSBvbiB0aGUgbGlzdCBjb250YWluZWQgaW48YnI+DQpgcGFja2FnZXMtYWxpc3RgLCBt b2RpZnlpbmcgaXQgaW4tcGxhY2UgOi0oPGJyPg0KPGJyPg0KSSB0aGluayB3ZSBzaG91bGQgKm5v dCogc29ydCBoZXJlOiB3ZSBzaG91bGQgaW5zdGVhZCBzb3J0IHdoZW4gd2U8YnI+DQpwb3B1bGF0 ZSBgcGFja2FnZS1hbGlzdGAgKGxpa2Ugd2UgYWxyZWFkeSBkbykuwqAgU28gdGhlICZxdW90O1By ZWZlciBWQyZxdW90OyBwYXJ0PGJyPg0Kb2YgdGhlIHNvcnRpbmcgc2hvdWxkIGJlIG1vdmVkIHRv IGBwYWNrYWdlLXByb2Nlc3MtZGVmaW5lLXBhY2thZ2VgPGJyPg0KKGFuZCB0aGUgYHBhY2thZ2Ut ZGlzYWJsZWQtcGAgY2FuIGJlIGRyb3BwZWQgYmVjYXVzZSBpdCYjMzk7cyBhbHJlYWR5IHRha2Vu PGJyPg0KY2FyZSBvZiBieSB0aGUgbG9vcCB0aGF0IGZvbGxvd3MgdGhlIGFib3ZlIGNvZGUpLjxi cj4NCjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIFN0ZWZhbjxicj4NCjxicj4NCjwvYmxvY2txdW90 ZT48L2Rpdj48YnIgY2xlYXI9ImFsbCI+PGJyPjxzcGFuIGNsYXNzPSJnbWFpbF9zaWduYXR1cmVf cHJlZml4Ij4tLSA8L3NwYW4+PGJyPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9zaWduYXR1 cmUiPjxmb250IGNvbG9yPSIjODg4ODg4Ij5fX19fX19fX19fX19fX19fX19fX19fX19fXzxicj4N Cjxicj4NCtChINGD0LLQsNC20LXQvdC40LXQvCw8YnI+DQrQkdC+0LnQutC+0LIg0JXQstCz0LXQ vdC40Lkg0JDQu9C10LrRgdC10LXQstC40Yc8YnI+DQrRgdC+0YIuIDgtOTI0LTIwMi0yNS02NTxi cj4NCmUtbWFpbDogPGEgaHJlZj0ibWFpbHRvOmFydHNjYW5AbGlzdC5ydSIgdGFyZ2V0PSJfYmxh bmsiPmFydHNjYW5AbGlzdC5ydTwvYT48L2ZvbnQ+PC9kaXY+DQo= --000000000000f8b4da05fd4677de--