Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.92) (envelope-from ) id 1j9X1b-0002Y6-CZ for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Mar 2020 16:37:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1j9X1a-0000Kw-3y for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Mar 2020 16:37:34 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1j9X1Z-0000Kp-JQ for pgsql-hackers@lists.postgresql.org; Wed, 04 Mar 2020 16:37:33 +0000 Received: from out1-smtp.messagingengine.com ([66.111.4.25]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1j9X1V-0004o5-9V for pgsql-hackers@postgresql.org; Wed, 04 Mar 2020 16:37:32 +0000 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 1D9D822091; Wed, 4 Mar 2020 11:37:28 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Wed, 04 Mar 2020 11:37:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=eLCFq5 2NceEWSkWjujltkC+l2n4u0f9igwKg43QrLqc=; b=NZaVCJOnA0lVlTu9vbELgM RMkZn3gxI6fnlvHH36DxoyFCNak2HLaJTyS7MmHMJedLyBE5faBJ2j5rsVG/cz02 bL1ERrgN6YYlTcOBnQG7hfJHh+mut5R2kmtlJF0ac/7te1KKd7nOKCTDoQ9CXjN0 8KeqvtDUw5C8eWOorxRTvpN3ZyFBPw8FyTI0nzPca04MrwXr8hUKoJ6/5v8RIOqC WtxgdXkTupKkT/scHwAeaiQ4SlJgyPhWrVLBBKpdmZFKKIm8G/rNV4PSxm9nW4pA Mm7LwtLP+kB4BnGlcgBUOXjz13j6Ja0zyDRCpy9aCxD13kHXpTXuynjkB6ESglEA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedugedruddtkedgledtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepuffvfhfhohfkffgfgggjtgesmhdtreertdefjeenucfhrhhomheprfgvthgv rhcugfhishgvnhhtrhgruhhtuceophgvthgvrhdrvghishgvnhhtrhgruhhtsedvnhguqh hurggurhgrnhhtrdgtohhmqeenucffohhmrghinhepvdhnughquhgrughrrghnthdrtgho mhenucfkphepleefrddvgedvrdduleegrdduleeinecuvehluhhsthgvrhfuihiivgeptd enucfrrghrrghmpehmrghilhhfrhhomhepphgvthgvrhdrvghishgvnhhtrhgruhhtsedv nhguqhhurggurhgrnhhtrdgtohhm X-ME-Proxy: Received: from april.pezone.net (p5df2c2c4.dip0.t-ipconnect.de [93.242.194.196]) by mail.messagingengine.com (Postfix) with ESMTPA id BA5E03060BD1; Wed, 4 Mar 2020 11:37:25 -0500 (EST) Subject: Re: HAVE_WORKING_LINK still needed? To: Alvaro Herrera , Tom Lane References: <20200228184411.GA2963@alvherre.pgsql> Cc: pgsql-hackers From: Peter Eisentraut Organization: 2ndQuadrant Message-ID: <5473cecc-4d33-18ab-287d-6f8fb26d52db@2ndquadrant.com> Date: Wed, 4 Mar 2020 17:37:23 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20200228184411.GA2963@alvherre.pgsql> Content-Type: multipart/mixed; boundary="------------16B5CB6824DEA743537B8C34" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------16B5CB6824DEA743537B8C34 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 2020-02-28 19:44, Alvaro Herrera wrote: > On 2020-Feb-28, Tom Lane wrote: > >> Also +1 for s/durable_link_or_rename/durable_link/. > > Actually, it's not *that* either, because what the function does is link > followed by unlink. So it's more a variation of durable_rename with > slightly different semantics -- the difference is what happens if a file > with the target name already exists. Maybe call it durable_rename_no_overwrite. I have committed the first two patches. Here is the third patch again, we renaming durable_link_or_rename() to durable_rename_excl(). This seems to match existing Unix system call naming best (see open() flag O_EXCL, and macOS has a renamex_np() flag RENAME_EXCL). -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------16B5CB6824DEA743537B8C34 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="v2-0001-Remove-HAVE_WORKING_LINK.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v2-0001-Remove-HAVE_WORKING_LINK.patch" RnJvbSBlODkyMjM3NDM5ZTQ5NzcwY2M1MDEzODQ4ZjRiMWY4YjVjNmMwZmY0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogV2VkLCA0IE1hciAyMDIwIDE3OjMzOjEwICswMTAwClN1YmplY3Q6 IFtQQVRDSCB2Ml0gUmVtb3ZlIEhBVkVfV09SS0lOR19MSU5LCgpQcmV2aW91c2x5LCBoYXJk IGxpbmtzIHdlcmUgbm90IHVzZWQgb24gV2luZG93cyBhbmQgQ3lnd2luLCBidXQgdGhleQpz dXBwb3J0IHRoZW0ganVzdCBmaW5lIGluIGN1cnJlbnRseSBzdXBwb3J0ZWQgT1MgdmVyc2lv bnMsIHNvIHdlIGNhbgp1c2UgdGhlbSB0aGVyZSBhcyB3ZWxsLgoKU2luY2UgYWxsIHN1cHBv cnRlZCBwbGF0Zm9ybXMgbm93IHN1cHBvcnQgaGFyZCBsaW5rcywgd2UgY2FuIHJlbW92ZQp0 aGUgYWx0ZXJuYXRpdmUgY29kZSBwYXRocy4KClJlbmFtZSBkdXJhYmxlX2xpbmtfb3JfcmVu YW1lKCkgdG8gZHVyYWJsZV9yZW5hbWVfZXhjbCgpIHRvIG1ha2UgdGhlCnB1cnBvc2UgbW9y ZSBjbGVhciB3aXRob3V0IHJlZmVyZW5jaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxz LgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9m bGF0LzcyZmZmNzNmLWRjOWMtNGVmNC04M2U4LWQyZTYwYzk4ZGY0OCU0MDJuZHF1YWRyYW50 LmNvbQotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RpbWVsaW5lLmMgfCAgNCAr Ky0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgICAgIHwgIDQgKystLQog c3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2ZkLmMgICAgICAgICB8IDIxICsrKysrLS0tLS0t LS0tLS0tLS0tLQogc3JjL2luY2x1ZGUvcGdfY29uZmlnX21hbnVhbC5oICAgICAgICB8ICA3 IC0tLS0tLS0KIHNyYy9pbmNsdWRlL3N0b3JhZ2UvZmQuaCAgICAgICAgICAgICAgfCAgMiAr LQogNSBmaWxlcyBjaGFuZ2VkLCAxMCBpbnNlcnRpb25zKCspLCAyOCBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90aW1lbGluZS5jIGIv c3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdGltZWxpbmUuYwppbmRleCA1N2VlNGUwNDhi Li44NjBhOTk2NDE0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90 aW1lbGluZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RpbWVsaW5lLmMK QEAgLTQyOSw3ICs0MjksNyBAQCB3cml0ZVRpbWVMaW5lSGlzdG9yeShUaW1lTGluZUlEIG5l d1RMSSwgVGltZUxpbmVJRCBwYXJlbnRUTEksCiAJICogUGVyZm9ybSB0aGUgcmVuYW1lIHVz aW5nIGxpbmsgaWYgYXZhaWxhYmxlLCBwYXJhbm9pZGx5IHRyeWluZyB0byBhdm9pZAogCSAq IG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpbGUgKHRoZXJlIHNob3VsZG4ndCBiZSBvbmUp LgogCSAqLwotCWR1cmFibGVfbGlua19vcl9yZW5hbWUodG1wcGF0aCwgcGF0aCwgRVJST1Ip OworCWR1cmFibGVfcmVuYW1lX2V4Y2wodG1wcGF0aCwgcGF0aCwgRVJST1IpOwogCiAJLyog VGhlIGhpc3RvcnkgZmlsZSBjYW4gYmUgYXJjaGl2ZWQgaW1tZWRpYXRlbHkuICovCiAJaWYg KFhMb2dBcmNoaXZpbmdBY3RpdmUoKSkKQEAgLTUwNyw3ICs1MDcsNyBAQCB3cml0ZVRpbWVM aW5lSGlzdG9yeUZpbGUoVGltZUxpbmVJRCB0bGksIGNoYXIgKmNvbnRlbnQsIGludCBzaXpl KQogCSAqIFBlcmZvcm0gdGhlIHJlbmFtZSB1c2luZyBsaW5rIGlmIGF2YWlsYWJsZSwgcGFy YW5vaWRseSB0cnlpbmcgdG8gYXZvaWQKIAkgKiBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBm aWxlICh0aGVyZSBzaG91bGRuJ3QgYmUgb25lKS4KIAkgKi8KLQlkdXJhYmxlX2xpbmtfb3Jf cmVuYW1lKHRtcHBhdGgsIHBhdGgsIEVSUk9SKTsKKwlkdXJhYmxlX3JlbmFtZV9leGNsKHRt cHBhdGgsIHBhdGgsIEVSUk9SKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2FjY2Vzcy90cmFuc2FtL3hsb2cuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2cuYwppbmRleCA0MzYxNTY4ODgyLi4xMDgzNThkZjU3IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGxvZy5jCkBAIC0zNTkxLDExICszNTkxLDExIEBAIEluc3RhbGxYTG9nRmlsZVNl Z21lbnQoWExvZ1NlZ05vICpzZWdubywgY2hhciAqdG1wcGF0aCwKIAkgKiBQZXJmb3JtIHRo ZSByZW5hbWUgdXNpbmcgbGluayBpZiBhdmFpbGFibGUsIHBhcmFub2lkbHkgdHJ5aW5nIHRv IGF2b2lkCiAJICogb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZSAodGhlcmUgc2hvdWxk bid0IGJlIG9uZSkuCiAJICovCi0JaWYgKGR1cmFibGVfbGlua19vcl9yZW5hbWUodG1wcGF0 aCwgcGF0aCwgTE9HKSAhPSAwKQorCWlmIChkdXJhYmxlX3JlbmFtZV9leGNsKHRtcHBhdGgs IHBhdGgsIExPRykgIT0gMCkKIAl7CiAJCWlmICh1c2VfbG9jaykKIAkJCUxXTG9ja1JlbGVh c2UoQ29udHJvbEZpbGVMb2NrKTsKLQkJLyogZHVyYWJsZV9saW5rX29yX3JlbmFtZSBhbHJl YWR5IGVtaXR0ZWQgbG9nIG1lc3NhZ2UgKi8KKwkJLyogZHVyYWJsZV9yZW5hbWVfZXhjbCBh bHJlYWR5IGVtaXR0ZWQgbG9nIG1lc3NhZ2UgKi8KIAkJcmV0dXJuIGZhbHNlOwogCX0KIApk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2ZkLmMgYi9zcmMvYmFja2Vu ZC9zdG9yYWdlL2ZpbGUvZmQuYwppbmRleCAzNGY3NDQzMTEwLi43ZGM2ZGQyZjE1IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvZmQuYworKysgYi9zcmMvYmFja2Vu ZC9zdG9yYWdlL2ZpbGUvZmQuYwpAQCAtNzY1LDEwICs3NjUsMTEgQEAgZHVyYWJsZV91bmxp bmsoY29uc3QgY2hhciAqZm5hbWUsIGludCBlbGV2ZWwpCiB9CiAKIC8qCi0gKiBkdXJhYmxl X2xpbmtfb3JfcmVuYW1lIC0tIHJlbmFtZSBhIGZpbGUgaW4gYSBkdXJhYmxlIG1hbm5lci4K KyAqIGR1cmFibGVfcmVuYW1lX2V4Y2wgLS0gcmVuYW1lIGEgZmlsZSBpbiBhIGR1cmFibGUg bWFubmVyLCB3aXRob3V0CisgKiBvdmVyd3JpdGluZyBhbiBleGlzdGluZyB0YXJnZXQgZmls ZQogICoKLSAqIFNpbWlsYXIgdG8gZHVyYWJsZV9yZW5hbWUoKSwgZXhjZXB0IHRoYXQgdGhp cyByb3V0aW5lIHRyaWVzIChidXQgZG9lcyBub3QKLSAqIGd1YXJhbnRlZSkgbm90IHRvIG92 ZXJ3cml0ZSB0aGUgdGFyZ2V0IGZpbGUuCisgKiBTaW1pbGFyIHRvIGR1cmFibGVfcmVuYW1l KCksIGV4Y2VwdCB0aGF0IHRoaXMgcm91dGluZSB3aWxsIGZhaWwgaWYgdGhlCisgKiB0YXJn ZXQgZmlsZSBhbHJlYWR5IGV4aXN0cy4KICAqCiAgKiBOb3RlIHRoYXQgYSBjcmFzaCBpbiBh biB1bmZvcnR1bmF0ZSBtb21lbnQgY2FuIGxlYXZlIHlvdSB3aXRoIHR3byBsaW5rcyB0bwog ICogdGhlIHRhcmdldCBmaWxlLgpAQCAtNzc5LDcgKzc4MCw3IEBAIGR1cmFibGVfdW5saW5r KGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZWxldmVsKQogICogdmFsaWQgdXBvbiByZXR1cm4u CiAgKi8KIGludAotZHVyYWJsZV9saW5rX29yX3JlbmFtZShjb25zdCBjaGFyICpvbGRmaWxl LCBjb25zdCBjaGFyICpuZXdmaWxlLCBpbnQgZWxldmVsKQorZHVyYWJsZV9yZW5hbWVfZXhj bChjb25zdCBjaGFyICpvbGRmaWxlLCBjb25zdCBjaGFyICpuZXdmaWxlLCBpbnQgZWxldmVs KQogewogCS8qCiAJICogRW5zdXJlIHRoYXQsIGlmIHdlIGNyYXNoIGRpcmVjdGx5IGFmdGVy IHRoZSByZW5hbWUvbGluaywgYSBmaWxlIHdpdGgKQEAgLTc4OCw3ICs3ODksNiBAQCBkdXJh YmxlX2xpbmtfb3JfcmVuYW1lKGNvbnN0IGNoYXIgKm9sZGZpbGUsIGNvbnN0IGNoYXIgKm5l d2ZpbGUsIGludCBlbGV2ZWwpCiAJaWYgKGZzeW5jX2ZuYW1lX2V4dChvbGRmaWxlLCBmYWxz ZSwgZmFsc2UsIGVsZXZlbCkgIT0gMCkKIAkJcmV0dXJuIC0xOwogCi0jaWZkZWYgSEFWRV9X T1JLSU5HX0xJTksKIAlpZiAobGluayhvbGRmaWxlLCBuZXdmaWxlKSA8IDApCiAJewogCQll cmVwb3J0KGVsZXZlbCwKQEAgLTc5OCwxNyArNzk4LDYgQEAgZHVyYWJsZV9saW5rX29yX3Jl bmFtZShjb25zdCBjaGFyICpvbGRmaWxlLCBjb25zdCBjaGFyICpuZXdmaWxlLCBpbnQgZWxl dmVsKQogCQlyZXR1cm4gLTE7CiAJfQogCXVubGluayhvbGRmaWxlKTsKLSNlbHNlCi0JLyog WFhYOiBBZGQgcmFjeSBmaWxlIGV4aXN0ZW5jZSBjaGVjaz8gKi8KLQlpZiAocmVuYW1lKG9s ZGZpbGUsIG5ld2ZpbGUpIDwgMCkKLQl7Ci0JCWVyZXBvcnQoZWxldmVsLAotCQkJCShlcnJj b2RlX2Zvcl9maWxlX2FjY2VzcygpLAotCQkJCSBlcnJtc2coImNvdWxkIG5vdCByZW5hbWUg ZmlsZSBcIiVzXCIgdG8gXCIlc1wiOiAlbSIsCi0JCQkJCQlvbGRmaWxlLCBuZXdmaWxlKSkp OwotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmCiAKIAkvKgogCSAqIE1ha2UgY2hhbmdlIHBl cnNpc3RlbnQgaW4gY2FzZSBvZiBhbiBPUyBjcmFzaCwgYm90aCB0aGUgbmV3IGVudHJ5IGFu ZApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcGdfY29uZmlnX21hbnVhbC5oIGIvc3JjL2lu Y2x1ZGUvcGdfY29uZmlnX21hbnVhbC5oCmluZGV4IGI0Y2U1MzMwMGIuLmQ3NGE4ZGQ4MDgg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3BnX2NvbmZpZ19tYW51YWwuaAorKysgYi9zcmMv aW5jbHVkZS9wZ19jb25maWdfbWFudWFsLmgKQEAgLTEyOSwxMyArMTI5LDYgQEAKICN1bmRl ZiBIQVZFX1VOSVhfU09DS0VUUwogI2VuZGlmCiAKLS8qCi0gKiBEZWZpbmUgdGhpcyBpZiB5 b3VyIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMgbGluaygpCi0gKi8KLSNpZiAhZGVmaW5l ZChXSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSNkZWZpbmUgSEFWRV9XT1JLSU5H X0xJTksgMQotI2VuZGlmCi0KIC8qCiAgKiBVU0VfUE9TSVhfRkFEVklTRSBjb250cm9scyB3 aGV0aGVyIFBvc3RncmVzIHdpbGwgYXR0ZW1wdCB0byB1c2UgdGhlCiAgKiBwb3NpeF9mYWR2 aXNlKCkga2VybmVsIGNhbGwuICBVc3VhbGx5IHRoZSBhdXRvbWF0aWMgY29uZmlndXJlIHRl c3RzIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9mZC5oIGIvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9mZC5oCmluZGV4IDIwODVjNjJiNDEuLjhjZDEyNWQ3ZGYgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvZmQuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9y YWdlL2ZkLmgKQEAgLTE1Nyw3ICsxNTcsNyBAQCBleHRlcm4gdm9pZCBmc3luY19mbmFtZShj b25zdCBjaGFyICpmbmFtZSwgYm9vbCBpc2Rpcik7CiBleHRlcm4gaW50CWZzeW5jX2ZuYW1l X2V4dChjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBpc2RpciwgYm9vbCBpZ25vcmVfcGVybSwg aW50IGVsZXZlbCk7CiBleHRlcm4gaW50CWR1cmFibGVfcmVuYW1lKGNvbnN0IGNoYXIgKm9s ZGZpbGUsIGNvbnN0IGNoYXIgKm5ld2ZpbGUsIGludCBsb2dsZXZlbCk7CiBleHRlcm4gaW50 CWR1cmFibGVfdW5saW5rKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbG9nbGV2ZWwpOwotZXh0 ZXJuIGludAlkdXJhYmxlX2xpbmtfb3JfcmVuYW1lKGNvbnN0IGNoYXIgKm9sZGZpbGUsIGNv bnN0IGNoYXIgKm5ld2ZpbGUsIGludCBsb2dsZXZlbCk7CitleHRlcm4gaW50CWR1cmFibGVf cmVuYW1lX2V4Y2woY29uc3QgY2hhciAqb2xkZmlsZSwgY29uc3QgY2hhciAqbmV3ZmlsZSwg aW50IGxvZ2xldmVsKTsKIGV4dGVybiB2b2lkIFN5bmNEYXRhRGlyZWN0b3J5KHZvaWQpOwog ZXh0ZXJuIGludAlkYXRhX3N5bmNfZWxldmVsKGludCBlbGV2ZWwpOwogCi0tIAoyLjI1LjAK Cg== --------------16B5CB6824DEA743537B8C34--