From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 122586 invoked by alias); 12 Sep 2019 20:30:51 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 122578 invoked by uid 89); 12 Sep 2019 20:30:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mail-qk1-f181.google.com Received: from mail-qk1-f181.google.com (HELO mail-qk1-f181.google.com) (209.85.222.181) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Sep 2019 20:30:49 +0000 Received: by mail-qk1-f181.google.com with SMTP id p10so7867299qkg.8 for ; Thu, 12 Sep 2019 13:30:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=ZP5lPpy2HzUYh5mFnYdgaml3YpHm8Xwlp6l+306lBBI=; b=Z11oFnQ0VY55P7ypEez249NUOnQAB8bDvMXqwr92l4vwZzCsIVQeW/k6brHNzc6z0M eCVPsMfyKSiB+ZYOhnYRd2Fi9z3qdXgTLLQBurEgtrWZ9yrOWPYOdP/k6zx4Yqp8D+qM VBH0jx0qGstEfaI04x+Y/fcsYwXJbYEkcKJ6emqA3FCaEX0ODnyF9eCZh8Q+3aY2WYRO PJBNVLXF+TfgPLuT6r0OL50cxGBrUYU8jh+vea68dhk+JY7ixYeHY4rAfGfE1BWAeBwV kBHsCAG/vDacO/O9gxzjlsJPDGP/gK4blAf2rdcI1Gp/DMHlLbKNEcdNyeab5LOsFLnD u9wA== Return-Path: Received: from ldh.local (944c6a92.cst.lightpath.net. [148.76.106.146]) by smtp.gmail.com with ESMTPSA id a3sm11593966qtn.97.2019.09.12.13.30.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Sep 2019 13:30:45 -0700 (PDT) Date: Thu, 12 Sep 2019 20:30:00 -0000 From: Lewis Hyatt To: Joseph Myers Cc: gcc-patches@gcc.gnu.org Subject: Re: Patch to support extended characters in C/C++ identifiers Message-ID: <20190912203043.GB17354@ldh.local> References: <20190812220121.GA9251@ldh.local> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="JP+T4n/bALQSJXh8" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.1 (2019-06-15) X-IsSubscribed: yes X-SW-Source: 2019-09/txt/msg00861.txt.bz2 --JP+T4n/bALQSJXh8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1904 On Tue, Sep 10, 2019 at 11:47:22PM +0000, Joseph Myers wrote: > On Mon, 12 Aug 2019, Lewis Hyatt wrote: > > > Hello- > > > > The attached patch for libcpp adds support for extended characters (e.g. UTF-8) > > in identifiers. A preliminary version of the patch was posted on PR c/67224 as > > Comment 26 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67224#c26) and > > discussed with Joseph Myers. Here is an updated patch incorporating all > > feedback received so far. I hope it is suitable now; please let me know if I > > can do anything else to make it ready for you to apply. I am happy to work on > > it further, whatever is needed. I can't easily test on anything other than > > x86_64-linux though. I did bootstrap all languages and run all tests on that > > platform, everything was good. > > > > The (relatively short) changes to libcpp are included inline here. I attached > > the test cases as a gzipped patch to avoid any problems with the encoding (the > > test cases contain some invalid UTF-8 and also other encodings such as latin-1 > > as part of the testing). > > > > Thanks for taking a look at it! > > Thanks, I think this is OK with a few updates to the documentation. Attached is a single patch relative to current trunk that incorporates all of your feedback. I gzipped it like last time just in case the invalid UTF-8 in the tests presents a problem. The code changes are the same as before other than comments. The documentation is now updated... there were a couple other places that also seemed reasonable to me to update, hope it sounds OK. I also created the PR about UCN conversion (PR 91755) and added a reference in the comments for those tests. Bootstrap was done on Linux x86-64, testing results: before patch: 36 XPASS 72 FAIL 1452 XFAIL 9624 UNSUPPORTED 359529 PASS after patch: 36 XPASS 72 FAIL 1452 XFAIL 9624 UNSUPPORTED 359633 PASS Thank you. -Lewis --JP+T4n/bALQSJXh8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="ChangeLog.txt" Content-length: 2082 libcpp/ChangeLog 2019-09-12 Lewis Hyatt PR c/67224 * charset.c (_cpp_valid_utf8): New function to help lex UTF-8 tokens. * internal.h (_cpp_valid_utf8): Declare. * lex.c (forms_identifier_p): Use it to recognize UTF-8 identifiers. (_cpp_lex_direct): Handle UTF-8 in identifiers and CPP_OTHER tokens. Do all work in "default" case to avoid slowing down typical code paths. Also handle $ and UCN in the default case for consistency. gcc/Changelog 2019-09-12 Lewis Hyatt PR c/67224 * doc/cpp.texi: Document support for extended characters in identifiers. * doc/cppopts.texi: Likewise. gcc/testsuite/ChangeLog 2019-09-12 Lewis Hyatt PR c/67224 * c-c++-common/cpp/ucnid-2011-1-utf8.c: New test. * g++.dg/cpp/ucnid-1-utf8.C: New test. * g++.dg/cpp/ucnid-2-utf8.C: New test. * g++.dg/cpp/ucnid-3-utf8.C: New test. * g++.dg/cpp/ucnid-4-utf8.C: New test. * g++.dg/other/ucnid-1-utf8.C: New test. * gcc.dg/cpp/ucnid-1-utf8.c: New test. * gcc.dg/cpp/ucnid-10-utf8.c: New test. * gcc.dg/cpp/ucnid-11-utf8.c: New test. * gcc.dg/cpp/ucnid-12-utf8.c: New test. * gcc.dg/cpp/ucnid-13-utf8.c: New test. * gcc.dg/cpp/ucnid-14-utf8.c: New test. * gcc.dg/cpp/ucnid-15-utf8.c: New test. * gcc.dg/cpp/ucnid-2-utf8.c: New test. * gcc.dg/cpp/ucnid-3-utf8.c: New test. * gcc.dg/cpp/ucnid-4-utf8.c: New test. * gcc.dg/cpp/ucnid-6-utf8.c: New test. * gcc.dg/cpp/ucnid-7-utf8.c: New test. * gcc.dg/cpp/ucnid-9-utf8.c: New test. * gcc.dg/ucnid-1-utf8.c: New test. * gcc.dg/ucnid-10-utf8.c: New test. * gcc.dg/ucnid-11-utf8.c: New test. * gcc.dg/ucnid-12-utf8.c: New test. * gcc.dg/ucnid-13-utf8.c: New test. * gcc.dg/ucnid-14-utf8.c: New test. * gcc.dg/ucnid-15-utf8.c: New test. * gcc.dg/ucnid-16-utf8.c: New test. * gcc.dg/ucnid-2-utf8.c: New test. * gcc.dg/ucnid-3-utf8.c: New test. * gcc.dg/ucnid-4-utf8.c: New test. * gcc.dg/ucnid-5-utf8.c: New test. * gcc.dg/ucnid-6-utf8.c: New test. * gcc.dg/ucnid-7-utf8.c: New test. * gcc.dg/ucnid-8-utf8.c: New test. * gcc.dg/ucnid-9-utf8.c: New test. --JP+T4n/bALQSJXh8 Content-Type: application/x-gunzip Content-Disposition: attachment; filename="utf8-identifiers-v2.patch.gz" Content-Transfer-Encoding: base64 Content-length: 11684 H4sICLGcel0AA3V0ZjgtaWRlbnRpZmllcnMtdjIucGF0Y2gA7F1bk9zGdX42 fkV76Wh3OIMlMMDcyFBFZlV0WLIpVyTZD6Jq1QAaM/BiAAiXvYi1VUtasp27 c3MlT7JiJzblxIllxZWkKqUq4tVlVarykrck/gOqyh/IOd24zQxmFxiSluyI EmcXQKP79DnfuXWfHlqObRNZnjoxoVempnnF8s0rZhDsxuzYIcbKLcnxLHZM WH+k2gN1rFjj3V27bzFtQvsjxSSqogx1XZJluaY/qdvt1vV54waR+yO9p6qk m/2EW/GMEXNGQ2rGLCSOx29EfhKa1fsRi+EBxQ92QkIWhCxiXtzDa08ipu8d sjBmFol93gE7ZmYSO7632EePfDWJYuI6B4wkHotMGjBLKttEuxKR5NsecSzo 3bEduNWrPCZ+EkfwjI9x88W927dJSL0pUEo94nvuCTGYJEcBM/Fdixw58Yy3 vRHReXDvbnJKqGflVy+fEkECjOH5MUkiIEa2nJCZsXuyS8htm0Rx6Jgxuf3i C2RvouBEbT+cUw+440RkaSQkIsBZS90N52Cwsk+p25R84oeceJLTnsvR8YIk lrrMM33L8aaPNSUSJSZcR+SGuHFPjmLrujlRTns4fnHX9nyZHccMEGzJFR6c Qu+SjGQK1MCHH7FiCjRkXAgBC+dOjFByFli4K3VX3gXSYTKJGTd5nUjkhucD 3297TuxQlwShb7IoAr7Akwj4hnCteYh6M1C03ph08ccItea24K86mUzIHnAU xEJDIK4yIpnTE6QwpkCJy2Iu+6OZg0wUxEokoGFMfJv39dprBo0cs1b3trd7 RCgfceaBy+YwCkV6tyMJhB6ZIePU7+QyoqYJTYALX4BmxfA98vmQsYPyEuS2 N3NAEZmEpPvTkM6jDsDkpZkjJgCAtHyPFWDIJbus19ATUCfJ5yMV2r6eABpZ BGN8fm9P6CwSG4AMkXhJrmhKhuJ1fSJsEReNx0QM3IyKaUTAsh4nIw4ZBQLE q5875RzMuJQzA/6H8dDUzQPgqeG4Tnwi2BL5cxjlJIrZHHiai+DLX3yxB/Jm ISv7hU7g/TnOWsBqDGZ4ALgaa/gTbn0p8cw4obEfXiX8z417+HEKH6/A31fh 7yW8fekSgBYkQaI5dV12TBEWHOOm8B0+cA5k4h/APCX5pneS3UFIuwsmP+J6 BOIPQayvvcabbW+jrYjxYUAjNC2ArtiXZJRHgPafq4cfbnN7BlYG7Pncdxkw weIsY6AXyCvHhTGOHNcl1J37UQwCBk8BOuGiH/kqqF2BeFTOTGGAyJKUbBZI kScsZk+AjaNHTKuCGlpw/MYNsE058/PfXoPfECc4Uui7UneFN8ZJzNaxhb9a ZQmnpLuOJUAWmPbzOUIKhkjdx+MIVyepWzbbnCsLDktACaZC7rz8BbIDgCOG A/ryBgt9tBY7d/yYifigAnVJ9tCvuO5JlZOFXnUIuQkdVcYp3N3Mmc5wBDQt krzjJXMGLitzk8rx6JYsK8e3bnX4pKgb+RXOZDYjC1AkedFe5trM2S+Egzrq ob0PEAFJEPhgk0HVoSegyuOvUbdil5Aqbg+oZYmIB0zIDbBDTaaL2Fo30+45 M+XMPWKZlwMbA1izE5e7eugepovWnkYAxcyn1BvramBA8righo9Sd5GRS36H m1IEA7JBxAzgNE0KTtlgJgVPnbs1PkPgrkEzk8lnAuiRCA0CBnRlgQd4Ae49 qSuQmPcDzMkckeMdOpFjgIZmUSY8Drkd1dXRBBxzF36Oe6qChtRgOZZdYECC qi2cSRGnYIzKpQq8565DypQUR9+DGDp360Cb6/pHC84dKOAjzAOfmwI7Q/7+ qcTfx6GoGwDCMpFWYlzCe+f85h1HYCgciJ8jWlEHiXh0zv3kHsQY2KVLUYB7 FbJEsEMMkFltFzLvgr+8KD7ZYja4fWsh8u62ac0tDx+45NcczFXUk7roUXOf vhiFASIpj0+z2G8FnxGHh9Q1/RBwF/ge16+auQnuVMI94yRLZaBjiL9zJnGg coIEp8t4AmzUglpUyaSLQYLw/NxWxzScgvpXogIIQBl4sikMBu4vynGf4wyD 5FMSgcabs55krUkEoXFUkwwWt7OEcKiyft+0JhplkBDqhqnZA31oj9cmhGUH K0lh+YgnhgMdA1z8MUH1ucnlVzHnNdG0AwEPQT1aDfYlnL+guf65nA2wXrRL I2YMF1zl3oV51HCF5AGgNHGF2UZ12anTF4IDwctRJ0csYP5CMrBpHU4dANl5 9JGG5JVQraOvwmZIqyBD9D3HpK4sok15xqi1xO3zmq2gD3xRHCUwwBWwhN2u LIJTRMeVxPQcS+4rqiqrchLb410zw0+7lySPHREbYh5uHnKgCmKV8s/urtI3 B7apjO2xwPEVix1e8cDFVaDbcmgEttJTSFcV0bXUvXKZ3CPWVLb8ShRLTsnl K+UzIcKIbIkEV1WJHDCLgqTNLWghLAAx4a1z3+t2170J08nflbqPfoCfv/Wz M/zxszOS98bCENCyhd7+kLqOled/gJbCv5f42yr6u1np44iGPG7kvYA+3bm1 Vzb86FtnMOZHb3/wb1L3f9/55vvnoWMKWLSmFT5nLN5bkcvalo1xMNYmhjoe q4bdBAfrx6sKf7Sh8Kde0u1OxlUxFnJ7d72ogNW10nn0ww3e+ekG7/xr+3dS AEP6ban78zdxdv/5sH0PNzd5SdmEVmWTkf7rX/4KaMTPNkDvNwZ6vy3QFW2s 6oO+NZ6MNwF6vwbofT0H+kvwIl/p86bOGzyKQ5tRjXF4DlLn2Y788AD9mcA5 9IXZ3VUeG0NMBn4MwziI+LNFNjBKEMpxQnkecYTxPUZcZgIxnBdjRiry4ahH jCRbQs7X62JmzrivgqAwd4RytiRZrFhib+Dxu1k2nScxdhInIU8GQJetxGS5 gVzuJcvHs9XqboyOGgkWaaBNHZd73GjmJy4mHpDZ4Tq1SO7MGTMPuOt+ee9O viaVTwkytTI5fvmlW/IYKH6RMfKl3yETdTQY8BfnPpBpMUjj3QXG5tYoTLzC rlxyPNNNADi/CQbIdYzd2bOLN1Gk/CbcFoE5me1AzHApKm9AK7yF97EdpIhS d47rkDtwfU/qEuLYZAdamfOA/8w+0vudTo9s3d1K79/d2up0sCUh1MCUeKdz 7TFePG2ldVpjrdPaat3A1BRdp+pItTbROq1O67QFrQtoFHPQfapvv6b6Zu5E ao9E/Q6JVHLpEvz2FHTRRK3qEdSsXLWejHLpjZVLb6tcFusP+mw8UoeDTZRL fwqx21YZsP0yA7D6gOqF5/EVXCvJAiYeAPGAhgcoNW2aBSx81a5hbF7XtrmE qaGrg742mLSQcO2IVQM6XpZxqaErwt1aenCM9kQGHdrCHCvwj1gYmLJjzGXq HF9eydKiAycoWn+WAFFFk1LrTWELns0UlqRnO4e+Y3XglZCBEfSIeo2cZs/u Lz/rl88eLD/TimdHs/SD5ad68ZSmbxr/fv/n77PlJgPeRDQSZoQ3yExJbk6A 4A757HWirnPhQDVv0F/b4IFooK1rwOnnTfR1TcpJ8HaDunb4N5uacqEpM83a ZG91ZWJty8ZAn8AjYzJWJkOlCdDXjleF+bAFzLPd9QmRp1oOeZR0zj0u9WtV r5SeEbVydZ9UvFL6gGjlFYqO6OV1IScyaAKtC4B1AawuBFUzSD0lQCnNEaW0 hdSIMUPpDw06MjeClFKDqfFC6MkjIr6ZgqvdInIr3SVGZl4yN8RyZRV1AMVs Z/IiOJYLIAV4do47xICP8hZeEaW8DkhHoMok16G9kp7tBiCsVoJpoeqtdX0w NMZje2ywobqRYOqUXVMWU/GAuS4KACfNQl6PgNLhMS4G52IDEqJyy6FTj28q 8VCWmqHPUR4yzk2HC2RVfk2XM9Gi5KtZIqCJSpnCO89l9FVIhkQGyERqIQ+h fEckGz8X8FwldxNFMdUiVJoDIXTKYNSrQNmh4ycRKenPR6y8D3ZjKcySr2ZT ZtYq6uaqfwDv1Ny4eBY0nCa4ucVX+Jdn0t8RM+lsOpU+JsPt5tL3D/Clujt8 Ni/SOSsnsjwDnuRZqxPm+9q8LAz3KgBBa6WnFXN+PCmW/bSVpgbzLd8958E5 0sVklKuL4IoTR8y10Ri+8PzyhHX/QHS6eA8GaGWT+s1tUr91/GEM9L4+MYdU 28gm9es2QbTmNgl+CmZWrA7ksrxuwk8wiUXHKzZUI87vIgsqDdcK5No7nHOs Van6hTAdGzhpwx0OIgE9TNcy5OE9D2a7qH1LAENH5YCjmvfJjtLWTWnNIaG1 hQS1bW1iDLWBZWwECa0GEsW22JdZ6NgnQmwR16CsAlTEFOiisiUYQIZsPZdf iTaAmMdzSdZzy3kdCIe68GtkUk/m7FmchkO27sKflwV3THWrzOPKEFhtJz29 ufT0ttIbMqrqzDAo7W8kPb1GesM66S1obFMRcnXmJWShM+Wcz63DL02ueiHX 9P6qMClpa50HzYU5aCtM0+73xxM6VijdSJiDxxXmchAQLYqXi3NZSz9e8Q4K 8RYivXsXgpy7dzvk+Gp6/+oJfrxRI3keUFWatIJBcx/d2kUzbaQp9nioqxuB oNZDb7JEsLWyftV8KRtXp+MOuRSvT/x5lT3fsCDRK6+CY+TL07948J5Yflha v+6RLXi0xRd8lCeenzd3r629q25OmNUfGIPJRgs+dc51Zel64yQb95TYznGP nIAm4JbDSS4v8eTRuz3yHz/ugHA0FEobljb3ea1dnmmaI6oypT8ZbsLSOo+3 8XbAAlvLvQAMDunSGokIG/P60yNGXJiYg2Y19jGtIP6RJyqwKxsET6KjNbsG j1EPVL/F8DgdXrQfsSzEYWN4DdvCy9AtS5noQ1XfKKIanhcOt9LY8WQ5FabE 2FlaD3s9W9h/9G7LnGLUmIOjthzs9yGnGDHKrEa7OWvHqy5yq49t9KDJV3Dt ArehQ0atSMQ8Mi9X58sZIsjJlCir03dFKzxDkdWs87KXHiqc5UOAxDU0CPDA kXdC4hASU37wjRfHZBXlFo0pLz/n9e9YSu+YiQuej1ehH/BeQFFiNg9ifOdQ hGr50ciyot6JhFZJ3XyX+redKIboi2+999BnIhWe78niDGC1IADL/G1Isq3i rCDFMtGQL3SE/AhRfvjyRLTmB5j4AQD0zvQkOyDCt9kt0G08bdb1GBomGjrA gnwHH8uc0RD0CNuFWNCxe9gH33TPNu2zYSwnEvX61ZMBxZkXmN8d/0jwobII Hfn5iYqVA3k9rAsA1RBn3vgpPiwu4Os4eOooM+kzKgSXlSJc46Dgh0jFmS2k RpivLMnh5xFKFuR1ubz8gEvLYVEpr1khFKlrsBk9dHx+Iqp6cud2tfqBSw5p 4GzPGvVIREGmsS91OS00FqURgiQsB/aKcghSqYbg5Q8AKNeHXtBRSF3gcegH oQNdFJULF5kVXM+B0Vx+j+FJhezMEAqywpysQ26FPmxphCaNjdCkrRFSB4Mx uMixYW0UeE1qjNDKfvImq+OlQfqft74DH19/IHV/cfYN/HgHPx42YGCzbcoN tyhHfVUbjrSRMWzh/87Znlxxfs22J8/fnazPKcSmOoSr6rXi8j5c9svLB1kw Ky75xuB1ohc3yo3A62Rw7dd8g7Lh5uSmG5Pj4VhTjLHR7zeqRK0frBqkq0tL GdmeFigVP0VblsFVC+RCZvMTq2L9eSfzMnucg64PJprxk8loOS8FIZ3OIdym 5kG1881WmadeUoYfeZOQvZ44IZNpZDqOLMZfLT5ZqCZZW3sCJrtC8E6QRLPO 8j0/6JH0J53V2n3+pLLSaWu7l7GHpZtFBFrtNf1+TYeJd+Bh4kHFifftSjds tF1YvcaobGjdWps3c0jHE4Oy0ajRQYD6wc7LxlfN25OrJVppItsYW8rZ9wxE 2THOLDbC9++RWRDQy/JleRYkfLBnnuHdusFQ5/1eaIqXhihNc2UZaGtxuWKr uZwvWknbdKfLtC3bNujYHrYoizhnl+vjlrONR/jx2OTTlfXqMOfJW28v74vW 2jbdxtLVgTY0NTpqk7afs4WlLu9hPUFv80UnMpnrUo/xre8n4mmI/BU0zuU+ +NNxOTxIIvv7kK2GjpHEbH9/B2KjTufaqkuo+gBT2SbFO9k3yjiHjDgw9bC6 eY9shRiGh30QVGWFiksDWpiMm5ibdjD64Y2npChqxPeAoNMLSFK3MSkr+yqJ EJkjRov3xBK1ib0tESHYffHM+6X3E5TOSkppNCc7W7/xSvq1V7fIVfhvgexs MS3x8qPSYgMVS3owBV8YRctHaayJFy3RbrolyUZjlVlDQ2eNzkLUD7b+IMR8 QXmSiPHD0cX+VVUbc+VBZqG5fuH5HtdEvm9lMSPBshfbzw/Vrmpfu1RlEbxL OUv1ETsG4YBxiItkJi/er2YzOQjPYGSRyiA2jq8tPrt8AqnKM+Luifwsz3fU Im843hWJSW3eMvXBUKUf4O/pB1cJv8e8ZE4Y6hBmSuA1llKY2gxFzEe5+NDA gqwv2knddBeV9TVtOJ6ohtIef3U7qNpiNSSAynDEF3gsIu+QhryUCdf3oqVz Ok2gtRg+bC0b4a1NAohz1kPPwaow8x+eZbmyuHj0HlxOistAzRJnvIyPfN56 mF3bfhLuB24S7X94tg/3R9n9j97+y7P0LL2fPki/lr6ZvpW+nX4nfSf96/S7 6fdo+jdG+rfp99MfpA/Td830h+nfpX8/TX+U/kP6j6P0x5P9/fS99Cfp+3r6 T+lP069r6TfSb6a/m/5e+vvUMNM/SP8w/aP0j9NvpX+S/mn6Z+mfp3+RfhuG exP+vvXR29/7Lvx8sM+z/X4xh7uJou0p2bTKRYUdsMw56j88yxP3z1QgXz4F rsDzydrnwKZMa+qeC75Bg+GaBouMhIajakNSafkJYG39AoggEFghZoosa3vW aEFFL9r6WWrWvFzXgh9UGQ3GLfbdlwerK7xoXZo2JVjvECRx/j0y1138vjW1 cVFERg50+ui9rUrwxpd08dv4EoggIjN0glh8p0S+A0LEQNcWdiCOWFahh18z UFg7XvbBy0AqC8DHmY1oKsxmyV/r3G+k2BN9qA+1cevcry71a3KQ6Mnnfu0X RSPcmzIXV0Gr9/Kl0Oq9fD20cq+yKFq5u7wy+v/wQEezYpENC0Xs8UCZ0KGu 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 h9iBOj272aIJucQ5U/t/PysSGB6HAAA= --JP+T4n/bALQSJXh8--