From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id 8M84FlDAuWa5BQEAe85BDQ:P1 (envelope-from ) for ; Mon, 12 Aug 2024 07:57:04 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2.migadu.com with LMTPS id 8M84FlDAuWa5BQEAe85BDQ (envelope-from ) for ; Mon, 12 Aug 2024 09:57:04 +0200 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=uni-muenster.de header.s=uniout header.b=eSK3+ZCf; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1723449424; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=O3b0b9NINbJZMkmDpO+azmCvj6oLsJtN3xrQ+Mct1no=; b=dkSIz/yX7GCCI+S0N6nflVkRzePzlP1hWpS6uSe1Z277T2hyltr+KYt98Losa5puITUPCE 4hcTom5rcloxDmx/g+KNiA7FufH8iyMtyqI90NTos4/IfBHgpWqBjfIoULXCxBrvSjsQUM /p1F4COP7U7V8+tLWxcj1Jo2uUfUgtXcIPDU8B2d75msAJDeLAXLxYAeFmKlAWq8htwPY/ ix11/xre7e78SAXMPfxuBAGMFpfxHlI3jxEV0WjxOicH7dBx+WCYlJQDonPCtYlrVKDiYz XClHpyfE0pApRv9S5SEH61u/ATvKDy4c47QliV8d7blsklp3Y30G1JzHkk7GJw== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1723449424; a=rsa-sha256; cv=none; b=fzqSABruHYaKFO2asV2zIwAUCmdnO2/BZB9tN5jfjI+8dtbeuI25lkCB+rDCBF4/dqqoVd fRqr2aEzLztaptRQMG5xY7t2A0mZZYhg8lbRq6rkrnRUjPfQZ8Nf+vVGvhpM515Gt2uMh1 Y+w/Z7jK+bydb665SBcrSya25ZjOgKtD1ECAp2N8J1/YGt/Axu2/pf1SxcmClTJO21qpDH 5VBcdqFaK3GkRHAmi69dqLqqxqTyU/HpSiau0HONvihZd8aU16ewTUe6WBz6zM3z+5Iw2E 9ch/l8GM/VcgRA/PPEGt5tjirw7EfGNROLO+ZdGIMIPlTiC0kwMGHhyZSLty0w== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=uni-muenster.de header.s=uniout header.b=eSK3+ZCf; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id F0FDD1CBC7 for ; Mon, 12 Aug 2024 09:57:02 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sdPuV-0000Y2-NQ; Mon, 12 Aug 2024 03:56:12 -0400 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 1sdPuT-0000Xd-Ni for emacs-orgmode@gnu.org; Mon, 12 Aug 2024 03:56:09 -0400 Received: from udcm-wwu4.uni-muenster.de ([128.176.118.31]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sdPuN-0007qk-Qe; Mon, 12 Aug 2024 03:56:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uni-muenster.de; i=@uni-muenster.de; q=dns/txt; s=uniout; t=1723449363; x=1754985363; h=from:to:cc:subject:in-reply-to:references:date: message-id:mime-version; bh=O3b0b9NINbJZMkmDpO+azmCvj6oLsJtN3xrQ+Mct1no=; b=eSK3+ZCfgziYzO55sVtzDBUWVRDdzhe8ER/J7LeSztF/qqvs2Wgbpo3q 81dLHqJzu8KU/eKUa0so2dpWIm+zpmbEk+ONQ48buXd/mds5zVeniKelB vhzE/ugECLuGwxSZYFnfuHkMynkO7GZymAAU0sBckZQT5CPAgmUyFEPQh piCEav16CTVhx8rNjAze2JN2NclzOo2fXm17fJFbm2NZIBOtSW0X/u+rX ft0EUSR1xivvAJlhwmTEaWRz1/yQdh3LLk15U8LbEUdteLQFWXK81LVbG VVtlTfEGxnttB3p7lPwl/nfONmFSCqAgmqLWyRmeCOXHzxFqXNKWei4wl g==; X-CSE-ConnectionGUID: JS4PgbStSWGe8AIn6hSzIA== X-CSE-MsgGUID: CfzlVM8SQ1elpwIp23cFUw== X-IronPort-AV: E=Sophos;i="6.09,282,1716242400"; d="p7s'346?scan'346,208,346,223";a="5087405" Received: from wiwi-ex-1.wiwi.uni-muenster.de (HELO mail.wiwi.uni-muenster.de) ([10.2.21.33]) by udcm-relay4.uni-muenster.de with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 12 Aug 2024 09:55:56 +0200 Received: from D-3170L03 (128.176.63.9) by WIWI-EX-1.WIWI.UNI-MUENSTER.DE (10.2.21.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Mon, 12 Aug 2024 09:55:56 +0200 From: Jens Lechtenboerger To: Ihor Radchenko CC: Eli Zaretskii , Subject: Proposal: Change publication timestamps (was: Publishing cache) In-Reply-To: <87a5jnk347.fsf@localhost> (Ihor Radchenko's message of "Fri, 14 Jun 2024 14:31:20 +0000") References: <86ed921oxu.fsf@gnu.org> <874j9vllbp.fsf@localhost> <87y177pqzm.fsf@wi.uni-muenster.de> <87a5jnk347.fsf@localhost> Mail-Followup-To: Ihor Radchenko , Eli Zaretskii , emacs-orgmode@gnu.org Date: Mon, 12 Aug 2024 09:55:55 +0200 Message-ID: <87bk1yxjhw.fsf_-_@wi.uni-muenster.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="==-=-="; micalg=sha384; protocol="application/pkcs7-signature" X-Originating-IP: [128.176.63.9] X-ClientProxiedBy: WIWI-EX-1.WIWI.UNI-MUENSTER.DE (10.2.21.33) To WIWI-EX-1.WIWI.UNI-MUENSTER.DE (10.2.21.33) Received-SPF: pass client-ip=128.176.118.31; envelope-from=Jens.Lechtenboerger@wi.uni-muenster.de; helo=udcm-wwu4.uni-muenster.de X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Queue-Id: F0FDD1CBC7 X-Migadu-Scanner: mx12.migadu.com X-Migadu-Spam-Score: -13.45 X-Spam-Score: -13.45 X-TUID: AkjKNHOTBdju --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 2024-06-14, Ihor Radchenko wrote: > Jens Lechtenboerger writes: > >> Jumping in here, I do not understand the publishing cache. Some of >> my org documents are re-published every time, while others are only >> re-published after changes. What is checked where? > > See "14.4 Triggering Publication" section of Org mode manual: > > Org uses timestamps to track when a file has changed. The above > functions normally only publish changed files. You can override this > [...] I propose to change caching and checking of timestamps as in the attached path. Currently, org-publish-cache-file-needs-publishing checks whether the source file was modified after the cached modification time, which is fine. However, for each included file B, it checks whether that was modified more recently than the source file A. If so, the source is file A is considered to need publishing. This does not make sense. File A will be published again and again, even if neither A nor B changed since the last publishing. In the patch, I store the current time in the publish cache, not the source file=E2=80=99s modification time. Also, for included files, I do not check their timestamp against the one of the source file but against the cached publish timestamp. What do you think? As an aside, recursive inclusions are currently not checked. Maybe code to collect all included files is available elsewhere in the code base? Also, in my case, it would be useful to have a new keyword like =E2=80=9C#+PUBLISH_DEPENDENCY: some-file=E2=80=9D to record timestamps for additional dependencies, whose changes should also trigger publishing. Currently, that could be added as alternative to the regexp for INCLUDE. However, maybe you prefer to refactor that code to deal with recursive inclusions? Best wishes, Jens --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-lisp-ox-publish.el-Use-publish-time-in-publish-cache.patch Content-Transfer-Encoding: quoted-printable From=205f1c5d4e56afd91db85884df6018960f3639230b Mon Sep 17 00:00:00 2001 From: =3D?UTF-8?q?Jens=3D20Lechtenb=3DC3=3DB6rger?=3D Date: Mon, 12 Aug 2024 09:40:13 +0200 Subject: [PATCH] lisp/ox-publish.el: Use publish time in publish cache * lisp/ox-publish.el (org-publish-update-timestamp): Store current time in publish cache, instead of modification time of source file. (org-publish-cache-file-needs-publishing): Return t, if source or an included file was modified more recently. Previously, a source file including a newer file was published again and again. Now, publishing only happens if either source or an included file changed since the last publishing. =2D-- lisp/ox-publish.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lisp/ox-publish.el b/lisp/ox-publish.el index 9f943cedc..e26e2ca37 100644 =2D-- a/lisp/ox-publish.el +++ b/lisp/ox-publish.el @@ -389,7 +389,7 @@ still decide about that independently." "Update publishing timestamp for file FILENAME. If there is no timestamp, create one." (let ((key (org-publish-timestamp-filename filename pub-dir pub-func)) =2D (stamp (org-publish-cache-mtime-of-src filename))) + (stamp (current-time))) (org-publish-cache-set key stamp))) =20 (defun org-publish-remove-all-timestamps () @@ -1286,9 +1286,10 @@ If FREE-CACHE, empty the cache." (defun org-publish-cache-file-needs-publishing (filename &optional pub-dir pub-func _base-dir) "Check the timestamp of the last publishing of FILENAME. =2DReturn non-nil if the file needs publishing. Also check if =2Dany included files have been more recently published, so that =2Dthe file including them will be republished as well." +Return non-nil if the file needs publishing. This is the case +if either FILENAME does not occur in the publication cache or +if FILENAME, or any file included by it, was modified after the +most recent publication." (unless org-publish-cache (error "`org-publish-cache-file-needs-publishing' called, but no cache prese= nt")) @@ -1322,7 +1323,7 @@ the file including them will be republished as well." (or (null pstamp) (let ((mtime (org-publish-cache-mtime-of-src filename))) (or (time-less-p pstamp mtime) =2D (cl-some (lambda (ct) (time-less-p mtime ct)) + (cl-some (lambda (ct) (time-less-p pstamp ct)) included-files-mtime)))))) =20 (defun org-publish-cache-set-file-property =2D-=20 2.25.1 --=-=-=-- --==-=-= Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgIFADCABgkqhkiG9w0BBwEAAKCCFL0w ggWBMIIEaaADAgECAhA5ckQ6+SK3UdfTbBDdMTWVMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYT AkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNV BAoMEUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2VydmljZXMw HhcNMTkwMzEyMDAwMDAwWhcNMjgxMjMxMjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNU IE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2Hi qiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwW IJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2VN3I5xI6Ta5M irdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq/nROacdrjGCT3sTHDN/h Mq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303 p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugT ncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9Jnn V4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeEHg9j1uli utZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo4HyMIHvMB8GA1UdIwQYMBaAFKAR CiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBRTeb9aqitKz1SA4dibwJ3ysgNmyzAOBgNVHQ8B Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAIMAYGBFUdIAAwQwYDVR0fBDwwOjA4 oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJ KoZIhvcNAQEMBQADggEBABiHUdx0IT2ciuAntzPQLszs8ObLXhHeIm+bdY6ecv7k1v6qH5yWLe8D Sn6u9I1vcjxDO8A/67jfXKqpxq7y/Njuo3tD9oY2fBTgzfT3P/7euLSK8JGW/v1DZH79zNIBoX19 +BkZyUIrE79Yi7qkomYEdoiRTgyJFM6iTckys7roFBq8cfFb8EELmAAKIgMQ5Qyx+c2SNxntO/Hk Orb5RRMmda+7qu8/e3c70sQCkT0ZANMXXDnbP3sYDUXNk4WWL13fWRZPP1G91UUYP+1KjugGYXQj FrUNUHMnREd/EF2JKmuFMRTE6KlqTIC8anjPuH+OdnKZDJ3+15EIFqGjX5UwggbmMIIEzqADAgEC AhAxAnDUNb6bJJr4VtDh4oVJMA0GCSqGSIb3DQEBDAUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE CBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJV U1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTAeFw0yMDAyMTgwMDAwMDBaFw0zMzA1MDEyMzU5NTlaMEYxCzAJBgNVBAYTAk5MMRkwFwYDVQQK ExBHRUFOVCBWZXJlbmlnaW5nMRwwGgYDVQQDExNHRUFOVCBQZXJzb25hbCBDQSA0MIICIjANBgkq hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs0riIl4nW+kEWxQENTIgFK600jFAxs1QwB6hRMqvnkph fy2Q3mKbM2otpELKlgE8/3AQPYBo7p7yeORuPMnAuA+oMGRb2wbeSaLcZbpwXgfCvnKxmq97/kQk OFX706F9O7/h0yehHhDjUdyMyT0zMs4AMBDRrAFn/b2vR3j0BSYgoQs16oSqadM3p+d0vvH/YrRM tOhkvGpLuzL8m+LTAQWvQJ92NwCyKiHspoP4mLPJvVpEpDMnpDbRUQdftSpZzVKTNORvPrGPRLnJ 0EEVCHR82LL6oz915WkrgeCY9ImuulBn4uVsd9ZpubCgM/EXvVBlViKqusChSsZEn7juIsGIiDya IhhLsd3amm8BS3bgK6AxdSMROND6hiHT182Lmf8C+gRHxQG9McvG35uUvRu8v7bPZiJRaT7ZC2f5 0P4lTlnbLvWpXv5yv7hheO8bMXltiyLweLB+VNvg+GnfL6TW3Aq1yF1yrZAZzR4MbpjTWdEdSLKv z8+0wCwscQ81nbDOwDt9vyZ+0eJXbRkWZiqScnwAg5/B1NUD4TrYlrI4n6zFp2pyYUOiuzP+as/A Znz63GvjFK69WODR2W/TK4D7VikEMhg18vhuRf4hxnWZOy0vhfDR/g3aJbdsGac+diahjEwzyB+U KJOCyzvecG8bZ/u/U8PsEMZg07iIPi8CAwEAAaOCAYswggGHMB8GA1UdIwQYMBaAFFN5v1qqK0rP VIDh2JvAnfKyA2bLMB0GA1UdDgQWBBRpAKHHIVj44MUbILAK3adRvxPZ5DAOBgNVHQ8BAf8EBAMC AYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwOAYD VR0gBDEwLzAtBgRVHSAAMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMFAG A1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0 aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6 Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcw AYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEACgVOew2PHxM5 AP1v7GLGw+3tF6rjAcx43D9Hl110Q+BABABglkrPkES/VyMZsfuds8fcDGvGE3o5UfjSno4sij0x dKut8zMazv8/4VMKPCA3EUS0tDUoL01ugDdqwlyXuYizeXyH2ICAQfXMtS+raz7mf741CZvO50Ox MUMxqljeRfVPDJQJNHOYi2pxuxgjKDYx4hdZ9G2o+oLlHhu5+anMDkE8g0tffjRKn8I1D1BmrDdW R/IdbBOj6870abYvqys1qYlPotv5N5dm+XxQ8vlrvY7+kfQaAYeO3rP1DM8BGdpEqyFVa+I0rpJP haZkeWW7cImDQFerHW9bKzBrCC815a3WrEhNpxh72ZJZNs1HYJ+29NTB6uu4NJjaMxpk+g2puNSm 4b9uVjBbPO9V6sFSG+IBqE9ckX/1XjzJtY8Grqoo4SiRb6zcHhp3mxj3oqWi8SKNohAOKnUc7RIP 6ss1hqIFyv0xXZor4N9tnzD0Fo0JDIURjDPEgo5WTdti/MdGTmKFQNqxyZuT9uSI2Xvhz8p+4pCY kiZqpahZlHqMFxdw9XRZQgrP+cgtOkWEaiNkRBbvtvLdp7MCL2OsQhQEdEbUvDM9slzZXdI7NjJo kVBq3O4pls3VD2z3L/bHVBe0rBERjyM2C/HSIh84rfmAqBgklzIOqXhd+4RzadUwgghKMIIGMqAD AgECAhEAqkvi71CAEFxqZ4YPA1N9LTANBgkqhkiG9w0BAQwFADBGMQswCQYDVQQGEwJOTDEZMBcG A1UEChMQR0VBTlQgVmVyZW5pZ2luZzEcMBoGA1UEAxMTR0VBTlQgUGVyc29uYWwgQ0EgNDAeFw0y MjA1MTcwMDAwMDBaFw0yNTA1MTYyMzU5NTlaMIHwMQ4wDAYDVQQREwU0ODE0OTE1MDMGA1UEChMs V2VzdGZhZWxpc2NoZSBXaWxoZWxtcy1Vbml2ZXJzaXRhZXQgTXVlbnN0ZXIxFzAVBgNVBAkTDlNj aGxvc3NwbGF0eiAyMRwwGgYDVQQIExNOb3JkcmhlaW4tV2VzdGZhbGVuMREwDwYDVQQHDAhNw7xu c3RlcjELMAkGA1UEBhMCREUxHDAaBgNVBAMME0plbnMgTGVjaHRlbmLDtnJnZXIxMjAwBgkqhkiG 9w0BCQEWI2plbnMubGVjaHRlbmJvZXJnZXJAdW5pLW11ZW5zdGVyLmRlMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4yLo33Fy6yODnDt0cuQvfxDd3lnsuNenB614hQB3kjb3cgHa1pA/ gNxGX4s1X4f9DeUbOuz0S0dHEYFcDByTpXDTOLsrA/I9vZ33GadnOwwFPevEn+ZegP92IT4vabIr fX9onRap8lcdV2MAMAnIUkvTykJmT31NFPzikecZAj8yRfSVdOYXYtqnBkCPsohTuo1R/xgo5hZA thHzENZ/0awwUocqydgxiiVr4bY47NzsHyB3s5aMAgmxszZ72Ya0SiyuQNomHvfqx/LccgcLRVeL bMniWy0zKUPfMsIHYLxKuz88og/hThCGylkZUxZ9ftDcI0yTuAKPgFgG1LME6SurW66XDOKUPOlZ 2qM7quHxDzfnhWyrXq4jK+KF54zWtVwrD4rqGvGP8RtoNaqGmUlJ9t1NycE2+w0UNTy60aOscthN s7nEMqU0MWJXymRxWB3svNOc3AfgCygNppmzMs+r/ZQVo9IvLlDZqmf+58IEDZgscVVWKvHqcsDR nZMdiURrOeEyFS0vUE04xZqlB8mCCd1bbwZ30JNJOZczRw7Uf142qbQvYtH/eIYcLeubNREzzvXc ZQrK1KcZdICk/w0MbUY94qcNEJFz46CRZapVRGyp0IW4G4t79Tcd+YEcqmVC2p9BDF+tpPBUTRAG TXh0VtCrRCMHAkZd6bArdd0CAwEAAaOCAoYwggKCMB8GA1UdIwQYMBaAFGkAocchWPjgxRsgsArd p1G/E9nkMB0GA1UdDgQWBBToJ4jbFf9An5mspQ0MDfjOqaWItjAOBgNVHQ8BAf8EBAMCBaAwDAYD VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwPwYDVR0gBDgwNjA0Bgsr BgEEAbIxAQICTzAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzBCBgNVHR8E OzA5MDegNaAzhjFodHRwOi8vR0VBTlQuY3JsLnNlY3RpZ28uY29tL0dFQU5UUGVyc29uYWxDQTQu Y3JsMHgGCCsGAQUFBwEBBGwwajA9BggrBgEFBQcwAoYxaHR0cDovL0dFQU5ULmNydC5zZWN0aWdv LmNvbS9HRUFOVFBlcnNvbmFsQ0E0LmNydDApBggrBgEFBQcwAYYdaHR0cDovL0dFQU5ULm9jc3Au c2VjdGlnby5jb20wggECBgNVHREEgfowgfeBGmxlY2h0ZW5Ad2kudW5pLW11ZW5zdGVyLmRlgQ5s ZWNodGVqQHd3dS5kZYEXbGVjaHRlakB1bmktbXVlbnN0ZXIuZGWBKWplbnMubGVjaHRlbmJvZXJn ZXJAZXJjaXMudW5pLW11ZW5zdGVyLmRlgRxsZWNodGVqK3tJRH1AdW5pLW11ZW5zdGVyLmRlgSZq ZW5zLmxlY2h0ZW5ib2VyZ2VyQHdpLnVuaS1tdWVuc3Rlci5kZYEaamVucy5sZWNodGVuYm9lcmdl ckB3d3UuZGWBI2plbnMubGVjaHRlbmJvZXJnZXJAdW5pLW11ZW5zdGVyLmRlMA0GCSqGSIb3DQEB DAUAA4ICAQAr3vuH36/HktCaRQa41rdgEEep3WbnlgjjN+Sl1CA/WGns2iwgTaS+WRKLTW9O3Y2N i4S9xFT5XezUAAkU7Z6GJjWyRiF2JS+Pb6XHmqXAjKxQqDpTT6/m3E+Vv8rBI0eEL5wiVSOQvZlt BU055MLEIYaWlDErzl5OCviWM2O+m88S4hIkRXIoUkyl2DSiDwihwLjZCX9Y4gRUPUuLiuJKStar wbknlvskOa2ugD3qKUxQh2QhpEKyEOSY7Tax30C6mXI+iINZVGETQNn8ZYZKEojOqzTvuWcD9XyA t/q9x/EiDlCaEdk4mwGcV/fW1bPfu7xFIz7GFrpS4fzVb3TSR91cyh0lEVK0mc5fNZN4wwaRP/hY PVywTRwOzWTCCVdjEZo33wbl6YXoCDsqudtbmqbhqrgYtKUnqSIooYMg8eX7NrSNi7NGi62Yt6gC 819l5Bw1rzWD0CkJ4mClaS3Byh7V9TaItJa5IEbx+l+z1esROAkkc0UD3Gqji3WPeSgUHr5aKlM7 fM46RSB8CD2ko3IdH3Lyu43sFyK2ujpx+814ASePaEIgqeyerMf+rPs5IhoOvzsrV8pvuvADWEZt pMRrfyQnQnUQlTGSNxQsZwTjpIPv/WewvujgWIwU0jC2yR7MQ4GtCtsjmzfBsGx/9L+C49R+U8Xq sP3AY0BXDzGCAywwggMoAgEBMFswRjELMAkGA1UEBhMCTkwxGTAXBgNVBAoTEEdFQU5UIFZlcmVu aWdpbmcxHDAaBgNVBAMTE0dFQU5UIFBlcnNvbmFsIENBIDQCEQCqS+LvUIAQXGpnhg8DU30tMA0G CWCGSAFlAwQCAgUAoIGjMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8X DTI0MDgxMjA3NTU1NVowKAYJKoZIhvcNAQkPMRswGTALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcw PwYJKoZIhvcNAQkEMTIEMOHLQEqp+aSMyLaf+DtPCN6Xj6yKY/+O+PS9i/yLd+QwCabivFsbhuob A56CMJmBDDANBgkqhkiG9w0BAQEFAASCAgCr3PXpGB+hAJKcoOAcEm1SgcvAOwbyjX0f9xwLoUhr 5uLGDrZLn1tikzUPkLxl+nvey5gWqKxnaelMuEMSLopD1goeXtrnYu6FGk9uWL2GuWaunQ0fX2Y7 iD8nCERvhgY5eowOBp9O4Yelde2dZnuG0v3mcMJ7rsflXeRXa+Q297NY/rh5TEDbbyTT44cBb/nh K30eT/CN7u+w4zpQP3nnBWu2Q0EOdi/IP708hF/AeY7oXhjw89yiyVIt0XxZpRWHiqHNnafBagoM e2xfdvFit0+eFZGCHnlad2tBUAvYQL2P16Sw9kXMosGs6qie9zZC7c0q5pvDcSH6URw89Xovu9Rs 8QbMA/sxg4+biSi25bGl1munIyfdZ1QiWp0wY7R978Z8J80JCbRph3qHJl9HvMOMEyIIcWueJJkd 1gvmRuaBmMaWJ2fFXHMzYZzd4lst1yyCDSFDnAUTvTN9sVeXXvfSk8+ysUuMT2nhCaVnEJYy8NP8 fIKVyAi3SrmJzAL0o+eE10448FLwQDiYMaduhW0Y9hY8fqA/KvO9wBuBuYYc0KEcEA+lvVZqdVwE HlV+L8O/Cz4eAj29ZDkU0YDar0yjqauibGdCBOIi+gd9KYt/+MgiuRuVjRIwY9/tCQ5qc8LBl9Dk 6G5kshMt8XbqusnXK7/l9T7lCSr6j8LPxwAAAAAAAA== --==-=-=--