From patchwork Thu Nov 17 03:43:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guillermo E. Martinez" X-Patchwork-Id: 60732 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0D3B43887F76 for ; Thu, 17 Nov 2022 03:43:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0D3B43887F76 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1668656626; bh=p0CJsi6bAnyUnbMI9zUIKQhtSvC7ajHpznM63x7+fZ8=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Help:List-Subscribe:From: Reply-To:From; b=Q3z1MY/9dMhXU+4GFCJ6tYbnH2hzo+X4a5SHDi/G1aXYCbuXmqqhchpxMPHQuhX8k GKGYdVFkz/p3vKzSFRlr43QtKP0QHKdBgq3+JZqdI0YzcmECOu+FBzQSukWC4QZN3A iRcL176JSQeoKeNLM19wCdZ6uAGuWF4cXDRbjnws= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id 6130A395445C for ; Thu, 17 Nov 2022 03:43:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6130A395445C Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2AH1uM3m010282 for ; Thu, 17 Nov 2022 03:43:39 GMT Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3kv8ykq9qd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 17 Nov 2022 03:43:39 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 2AH30PMi000376 for ; Thu, 17 Nov 2022 03:43:37 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2172.outbound.protection.outlook.com [104.47.56.172]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3ku3k99tcx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 17 Nov 2022 03:43:37 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YgFFY3MaeS9PLjJ6qUWX7T3yVG4ENTH+2NExTPwt6LLx1AakZ5kn/s3jEC9nqNvvYouVz49LssHhSID1qeGsy9FphH9z/RWvA557QvINWczEASTw2U8/DIxrbRfGfA/5Z0k3Ty22vZ9APUj4LQP1HjNvfBxIqYUtJeYshf+KsI5s4MEQibNUJDtRVdrjcu73RqYinOPIgQUnOikpg9Cnst08WdEuJp9T26SN6vpKskl+SfnWCqr+FJCUj7kY1lQ1/oS+eOKyeBkgag8D5bLAMQ+Endg/rATc4rjRRLQ+far5s75iURddPE1U/xeDpw95Mn/TbZToniQ2bb9YBzZTxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=p0CJsi6bAnyUnbMI9zUIKQhtSvC7ajHpznM63x7+fZ8=; b=ocljxUrJqe33iiifgkMN8mHc2vLYEMeNPD+1dOZfNxr2H3ROf0ZfbovBkouI9wNDa6d31rYd+K27r9nuQFPP+eUFiwNX7ejj5itvIeNQu/jIduquKCdA9dOv1dMs42Ul10OQJ9zyjv+MckuRY5SwG3gl1HdFdo6B1R4q/MVR22b0dJB8mG1OKIfjKqS349xmQOq2wwdUZ1mpVEdYqBA0nZORMS30QhVTvsa9onM7oNpvudU+VnDYSL5yNqTNnZnsKoPgdtuJ5Ve40Iq7m1uR/ySyy/kRr8bn7KxWMI1mmg+KTfNjDb/PtovqbH8xzK8b588F4qJ31z0dr+UpLMZrqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by CH0PR10MB4843.namprd10.prod.outlook.com (2603:10b6:610:cb::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.20; Thu, 17 Nov 2022 03:43:35 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::1800:88c1:fae8:13b4]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::1800:88c1:fae8:13b4%10]) with mapi id 15.20.5813.020; Thu, 17 Nov 2022 03:43:34 +0000 To: libabigail@sourceware.org Cc: "Guillermo E. Martinez" Subject: [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type Date: Wed, 16 Nov 2022 21:43:03 -0600 Message-Id: <20221117034305.184864-4-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20221117034305.184864-1-guillermo.e.martinez@oracle.com> References: <20221117034305.184864-1-guillermo.e.martinez@oracle.com> X-ClientProxiedBy: SN4PR0501CA0059.namprd05.prod.outlook.com (2603:10b6:803:41::36) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR10MB1407:EE_|CH0PR10MB4843:EE_ X-MS-Office365-Filtering-Correlation-Id: dd3a94cf-3cb5-43bd-709d-08dac84de54a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: UN2UrOjmUKXDgFaomT7NuY1o8CsHFMvHGYgTxHo1nS8RpCzKixp3uKA7i5qnXxJYMKUHxrCtc+sJADEcKrr0dLVl/JLPg6X1L7RMk5xVfGzMXVpCaI43JOaKIlsjyVhJyKz2wnTWl/XMsOOiOQ6n2TXgndM6Ed1xVAOLieBtxjS0vaLJJwb7PnsBPwV0EOrwhC5tNmBbTksR95U6mkKS5sQjU+mIEEhOe2BDP7TjPUx8jIO1mtRDatQ5JHsQkLr5WMjhSxkhd89Fj97Ay8zJ7cd/S9KaJ/aRfd1Q1mA2PlIWUYolAbF6wbwYkpBBPtVOV0CFpGEb0B9T4uniXFoz+duL0n3lhWMghxxWZD8nhRKZQHNehfh9g9WIQiLye37oF8wcOPcBS8z1Hif9BlVisoJwbAMXbhNEbVpUpnLe0fz7Nfwd87P6RIpxKuLLdoFxPdYnoZtFwJB/bELwutC6bCGUi66fmqQ0X5yqdct3Q7/7E9ImQjp7oLZgE8RfwKCOqeFD0IYyjjtIVSXHC2zI2myDGIz+EXPKRvypuUbH2/hKlRTYk4xzQHREBsKD7aU3buvoLeBOqPAApbaLcXvYP0Ho9OFgNY6K8coWRbOjwUdN9hhjJ+/7vRvbWhf/E3eV9m8H2tRVHURoyy127IEo9tXw8qiWgPinGlDDan7p2g4gYgViI5Pz/GHIS/vscrTs X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MWHPR10MB1407.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230022)(136003)(346002)(39860400002)(376002)(396003)(366004)(451199015)(86362001)(36756003)(103116003)(41300700001)(2616005)(66946007)(66476007)(66556008)(4326008)(8676002)(1076003)(186003)(8936002)(5660300002)(107886003)(6666004)(478600001)(6486002)(316002)(6512007)(6506007)(6916009)(38100700002)(83380400001)(2906002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: iRoa/FkNgkaphh/3wEyvrpundzz5RV3P3uRgI6SeAbjJmZ4XqMNtscgVDgk3YATKN6YkYWkmwqiVYDWMDgb3oWsLN06TdF/hUuCN/4DPvxAkvOntaCAePh5daSgWnsqTYir8aldicSR+We9K+JTj6eYA/w7gqwebqf8oM4GyTpN9AcWnm6ivsXxhHMPOppLwPfhFahVFsdT7DcDj9JTy90ilIPYvoFxQMW/iHlkOG7dGhKXaMtqBty0+x7Vl8gB/DQEB1Io5GCQ0Ks12HFsCM5VBQvwqXuxPLUVHKRm8qKbvz+A5rUakaiQlXMY7v/Onq4MZrZXb9nAnCMhplxUMgY3EMUXraVqROYsp8FrfmQHmvjAjUH0DHywOIc1Yqmhw3m0tTOu3hd7P4rlDZFPxoJes0exdBK1LT2VZyaKTQokbskRt1tuVZBfGrbaMMDGfPYW+5++hBVvVEODnak84R5AOE6OdTeHEUQLqftko4cNICcAdqti1lPoo6wN8467Tg5LKgLbNg1ER1Ez1dlNKgRpRLw/L4MQDCRjxbcx487J87X6zM54E1XEsXA+WX2l3aEMsZXpiqE0gmuffLvY+Y3+dZ70VC72DlnTynzU7PqQQ409r2MnsMyjq5paXBwlMGuitzYV+sPVoCg7rwPlNQM9m2uAlQ7B9Mwpy3xF0syLpnN6IOpWKszwXBkYspMLzNB/KGMmBnswO11HpsylNaMhVpU5HO9xBC48PXYOUfmVgJVS2gmuU6IyqGeaUSQMeebH2u+lhGUr0+QIaP3JeovdhMGnldatCuFzxhnqbR8FykPeKbquTXMbzfbikKqV/UjxP5YUd18YaAVKdkNGBbUps+Tc/Ssv1ajqUQQ5ymeIv1HaEFF7Y+46t8a2GQ0nlZ99aBEFlU2PqNu5JHmzer9NP0TGpirmjz+5OnP7dJXagEjMughShUpFnGILQxQ6TR4CE+N+OimdtTT7/Pvh/rUJwzyJVjCg8XCtUVsNRppGe1nsI8aheZJkAVSn4U6vYl4vcexfPV5zMiWmVV0XoVUd/8ZO/Wkyyj19u6y2/dhjGzz9cUe4xjNSZ6vHUfyC0NroQcYZeq90JjXgtO2eN2qAZwNKREx3ww7QZsrnyKmkQ9jcw/oF9oOp6p38wYDCSrnXkl0pNaio7rSASqynmK4XErJtSbCmaj6KhMCFkiGw1YJsoUrHst4bw8phVbCJEG5KZJ0ZuHCcVbiUTRmpu9TLJ/ce1IShYaJlKEEw91iKkcx34aeTOB/DxOWCr0j7bYhDpOIekpWJBumpmX/Ptc2/WDBhDLNhWENf6JUYonqoXnKMGjfHXEr616mMOmZW4Zqs4F7NMct551GDhdgVFebbgIiQHJi1JOIJIddp1cs9RlePY6aHcrQ/ykJy5013U4iK7DH+1/b2QhNPMFQmkBD4A65K91Q+RYh7ZRrk9YQ2hiOE+CpQJvywNiiKc7yYN8y4gxEQ4JVvChorcus94TDlECfsjZaSTEhsZgIy8ZTaLCTPqkh7BVWQW7z0A1o0VXfbteYK5Gq+eH3knhmZt5g0sCnrAVZaxPHqMo2uDyy1i37504ewi8AFRDZ0a3r33urW0CrRs1RCEZEDI+rqXHV0qhzWUwHU6HMsYdHujYDbNmM1xe0u7TJedkPU/XLtvnaR9goBuSXCeObQnC72lqZ5BaByhTA3ryDbpixcHqLc= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: xtr9fAHcSLS5QKgzMIZFnwY6dtMRyhbFlJVKiuPnINibSYxVd+x/LMw94q4+sEWHG7sxr01RXBfJJRTB4VXhYzH+9lUtuwNdsf9RvI0yLBRb58pOLOJGgt6sPiNfdPwIhwYgcxe3BToI5el82F1ZhqsWX9weED+AQF/3A5QFStxE+UwuHAsFeU483rgg7lGb2ZWeTYyCvK699xaRIbwfZ+KHt+2Il6B6bTsYSn87Ln6BtuD5MC2mvudm5NzGHcAu2NpILVCjtPBTCzg8K5TsorMzT9/CB07CIJwZeRhK/yUq9sf+M/TuC1hcNT8b4ul3Uy5wBs2to4HU4Zmk38CEukkmRzD538m35js1ABpeq5AEyVSSuFJ4O+28HMqNexdUAAnq71dapqRICoPlcMBuEG/13toD4xejrJPELnED5B8s4nozjcdnNiXj6IE+KgE+nnTO0uAuqgt/r6O+o28RREuMk2dxnwIiPH1l+/YmrApwnQI0z7OHdB5wosu6dRzdAwlC32JVy37vh82JR1tLaZFzhtjYO8nGNiFC1qxvTApktDtLw6VMBhtBtkva6ZqqGfdGj43UdLp8/wjHeI9lY2ksbdZmSpgtyAu/kWrmRdEfo4hHw+Qdi/LBDMH4qvCvp7yIKxbd/ZJRNRWqH20rAOcNTMAWo+BLrL3+mNqKcxeODYqQNaDpZGvXNtDPBwqTz5i48sXR3Q2Mw9bJjT91mquL+mon412yCBwvLPSO7bL15Sxw4GAnfaRSk1z1DAP1ORjAks4KbVNC+Fn86PNF0Q== X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: dd3a94cf-3cb5-43bd-709d-08dac84de54a X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Nov 2022 03:43:34.0304 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5R9Qxk8DPCyDLROFVl47vmzUGsSx0wLtU5Rx1gS8UBOcZEJFMYGnnQ/ZsSnufDtN/hSURoR0y6TYNzvqy4yLWFMN5hspSUli4zRNlYWtEjs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB4843 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.895,Hydra:6.0.545,FMLib:17.11.122.1 definitions=2022-11-16_03,2022-11-16_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 adultscore=0 phishscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2210170000 definitions=main-2211170024 X-Proofpoint-GUID: mqDtJz1ZgTj1yJ7lJD8_bynop61Dag2I X-Proofpoint-ORIG-GUID: mqDtJz1ZgTj1yJ7lJD8_bynop61Dag2I X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: "Guillermo E. Martinez via Libabigail" From: "Guillermo E. Martinez" Reply-To: "Guillermo E. Martinez" Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" Redundant qualifier is emitted by CTF frond-end building IR for array definitions: const char a[32]; Thus the diff reports: [C] 'const char[32] const a' So, It strips the qualifiers from the array types. * src/abg-ctf-reader.cc (maybe_strip_qualification): New definition. (process_ctf_qualified_type): Strip redundant qualifiers. * tests/data/test-read-ctf/test-const-array.abi: New test. * tests/data/test-read-ctf/test-const-array.c: Likewise. * tests/data/test-read-ctf/test-const-array.o: Likewise. Signed-off-by: Guillermo E. Martinez Signed-off-by: Guillermo E. Martinez Signed-off-by: Dodji Seketeli --- src/abg-ctf-reader.cc | 57 +++++++++++++++++- tests/data/Makefile.am | 3 + tests/data/test-read-ctf/test-const-array.abi | 14 +++++ tests/data/test-read-ctf/test-const-array.c | 2 + tests/data/test-read-ctf/test-const-array.o | Bin 0 -> 1416 bytes tests/test-read-ctf.cc | 9 +++ 6 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 tests/data/test-read-ctf/test-const-array.abi create mode 100644 tests/data/test-read-ctf/test-const-array.c create mode 100644 tests/data/test-read-ctf/test-const-array.o index 5d0e7435..61a5682c 100644 diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc index feafc91d..7c267bb1 100644 --- a/src/abg-ctf-reader.cc +++ b/src/abg-ctf-reader.cc @@ -1261,6 +1261,51 @@ process_ctf_array_type(reader *rdr, return result; } +/// Strip qualification from a qualified type, when it makes sense. +/// +/// CTF constructs "const const char [N]" for "const char foo[N]" +/// definition; This redundant types then causes bad diagnostics +/// when it is compared with an DWARF IR. +/// +/// This function thus strips the const qualifier from the type in +/// that case. It might contain code to strip other cases like this +/// in the future. +/// +/// @param t the type to strip const qualification from. +/// +/// @param rdr the @ref reader to use. +/// +/// @return the stripped type or just return @p t. +static decl_base_sptr +maybe_strip_qualification(const qualified_type_def_sptr t, + reader *rdr) +{ + if (!t) + return t; + + decl_base_sptr result = t; + type_base_sptr u = t->get_underlying_type(); + + if (is_array_type(u) || is_typedef_of_array(u)) + { + array_type_def_sptr array = is_array_type(u); + ABG_ASSERT(array); + // We should not be editing types that are already canonicalized. + ABG_ASSERT(!array->get_canonical_type()); + type_base_sptr element_type = array->get_element_type(); + + if (qualified_type_def_sptr qualified = is_qualified_type(element_type)) + { + qualified_type_def::CV quals = qualified->get_cv_quals(); + quals |= t->get_cv_quals(); + qualified->set_cv_quals(quals); + result = is_decl(u); + } + } + + return result; +} + /// Build and return a qualified type libabigail IR. /// /// @param rdr the read context. @@ -1304,8 +1349,16 @@ process_ctf_qualified_type(reader *rdr, result.reset(new qualified_type_def(utype, qualifiers, location())); if (result) { - decl_base_sptr qualified_type_decl = get_type_declaration(result); - add_decl_to_scope(qualified_type_decl, tunit->get_global_scope()); + // Strip some potentially redundant type qualifiers from + // the qualified type we just built. + decl_base_sptr d = maybe_strip_qualification(is_qualified_type(result), + rdr); + if (!d) + d = get_type_declaration(result); + ABG_ASSERT(d); + + add_decl_to_scope(d, tunit->get_global_scope()); + result = is_type(d); rdr->add_type(ctf_dictionary, ctf_type, result); } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index b89a4dd8..8d4a2b8f 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -710,6 +710,9 @@ test-read-ctf/test-bitfield.o \ test-read-ctf/test-bitfield-enum.abi \ test-read-ctf/test-bitfield-enum.c \ test-read-ctf/test-bitfield-enum.o \ +test-read-ctf/test-const-array.abi \ +test-read-ctf/test-const-array.c \ +test-read-ctf/test-const-array.o \ \ test-annotate/test0.abi \ test-annotate/test1.abi \ diff --git a/tests/data/test-read-ctf/test-const-array.abi b/tests/data/test-read-ctf/test-const-array.abi new file mode 100644 index 00000000..bd60b098 --- /dev/null +++ b/tests/data/test-read-ctf/test-const-array.abi @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/data/test-read-ctf/test-const-array.c b/tests/data/test-read-ctf/test-const-array.c new file mode 100644 index 00000000..4ffecf87 --- /dev/null +++ b/tests/data/test-read-ctf/test-const-array.c @@ -0,0 +1,2 @@ +/* gcc -gctf -c test-const-array.c -o test-const-array.o */ +const char a[32]; diff --git a/tests/data/test-read-ctf/test-const-array.o b/tests/data/test-read-ctf/test-const-array.o new file mode 100644 index 0000000000000000000000000000000000000000..b50e2fe5a7f7c86b3220c08782ee1d72035cc4d3 GIT binary patch literal 1416 zcmbtU&2H2%5T3NlQhpA!LRAG4GACL=oNPFi1B$4i91sU2?sc+eH)__YY*#cVu1LM` zNPQEY0bT%R5__|?Rz1K- z(X#SrfWQcS(k-VC(4L^4qTWK?b4tG3Z%h{Pn`lTfipQM`W9pOlKCL^n(8dI2s7^B4 z6Uw>JP&aDE&XuWVN={j&EC@*E%|a$cTeL}|MOn+l=rXCRLKM|ZRCTQ6*ThO=O)?c$ zbZ)Grn8v03(nn>ZjE#lXqUELE_6B==bo7etAAkIOz$Pzw%2Sr5SvHxZhiqS7oJn0R zq_Uzu=zGxl87kcil5oc8s+$R8lE}q$H#Z5@NAT-UhIZhHAE6P(B&(t|T(+y5rQxoPq9on|M)yQ_fB9#{xhu88~s=Q3*?49Y0I1zl<-4_*a>1N zxBM{@2_<(x)T|2m%XP^$*iV?djT)Z+hvSFm zqPt!df`weFUpfAJ2fpiYo=^WnBzI85Z%6qp*L0VH6$!`M#@agm6UUb;TyjJHU(J