From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C0A05C433F5 for ; Fri, 5 Nov 2021 19:54:48 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DD12061053 for ; Fri, 5 Nov 2021 19:54:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org DD12061053 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 51CFC83726; Fri, 5 Nov 2021 20:54:45 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="TpMx4SLf"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id F304283728; Fri, 5 Nov 2021 20:54:43 +0100 (CET) Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 7268B83724 for ; Fri, 5 Nov 2021 20:54:38 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: phobos.denx.de; spf=fail smtp.mailfrom=roman.bacik@broadcom.com Received: by mail-lf1-x12a.google.com with SMTP id bq11so20861543lfb.10 for ; Fri, 05 Nov 2021 12:54:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:references:in-reply-to:mime-version:thread-index:date :message-id:subject:to:cc; bh=I4pBYwWSM2nRh+zF7l+BnGcZo/Sez+CXLEjEB/boMZo=; b=TpMx4SLfNoITAcTAAiUUb12xNDotmcifY4UHmt0OZACmC5qqUtPo4kzgJvMLfkc6DK fdqhUdbIMXe946AzcpoM5KWeWG0SJznDYEhQjm+tBXKo6uDugB9Abxh/Mz/K5WGmcMoA 4gJ3u2qO2hHrFu9ShbWbA8ErK2VQMqzcGJ9As= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:references:in-reply-to:mime-version :thread-index:date:message-id:subject:to:cc; bh=I4pBYwWSM2nRh+zF7l+BnGcZo/Sez+CXLEjEB/boMZo=; b=Bbttaaj1wOtwF0jxuCs4S2Gia0pproazZzoQhKtObw2FgPVbM5+4GvPxyBmQ9buzNQ kQ9Ks2DBufY2iNSXkJWETx8N6zvxPl9aupjUSDU1I2lufdFUvS9mMhckIbio7NRO138f vmioq6ptZo2WGAf6Tl/S2U26JPUxBgLgrtqQP73d5FmyueDMfGnKvbtFjhQejYaLxx+N oA4WLwD/HHCFywqbis1EYtvpEdbgV7vAZYMY5DRD0f+OaKiGSVbT4tMlhH4Gkm7a+mVa 8euPzmKcs9nJEe/W5AKWu9oA4JKRpjrErEohNpeou2KrqbgjGI8P+syQBuCdnwbp2dvX fVKQ== X-Gm-Message-State: AOAM532z1LuGQF+zD2FX3esI7KIo7+7/6D3VtA/PZZb6a53SIsJZFXTj 0rEY0CsasFHaPXf2x7OgWZeZ0vWEE7+d1HaKFVdYULkKCCcMWVDh5bTADSeavDfz8isE4yewRS/ 3avOxxOc0Qfhi+AMCUWYh X-Google-Smtp-Source: ABdhPJxU4R7GS/jINDTrQUwoOfeL6qH+hrKiHlJ+GQMt+JjE5L9Y2ZyJr/SPDE4ZcQO2lOXMRumK/liCYL+lmv3gakU= X-Received: by 2002:a05:6512:150a:: with SMTP id bq10mr56162535lfb.68.1636142077485; Fri, 05 Nov 2021 12:54:37 -0700 (PDT) From: Roman Bacik References: <20211102111711.v6.1.I1edaad77041c1300213c307eef6741499504047@changeid> <20211103231353.yaopd44tnzlrftfk@pali> In-Reply-To: <20211103231353.yaopd44tnzlrftfk@pali> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQGYUbJpFwgWzIazgb3w//tk+hSQmgIlh2AKrGMaKKA= Date: Fri, 5 Nov 2021 12:54:24 -0700 Message-ID: <97d675031c7eccc4b8c5de4855538af6@mail.gmail.com> Subject: RE: [PATCH v6 1/2] net: brcm: netXtreme driver To: =?UTF-8?Q?Pali_Roh=C3=A1r?= Cc: U-Boot Mailing List , Bharat Gooty , Joe Hershberger , Ramon Fried Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="0000000000005a028705d01003df" X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean --0000000000005a028705d01003df Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Pali, > -----Original Message----- > From: Pali Roh=C3=A1r > Sent: Wednesday, November 3, 2021 4:14 PM > To: Roman Bacik > Cc: U-Boot Mailing List ; Bharat Gooty > ; Joe Hershberger > ; Ramon Fried > Subject: Re: [PATCH v6 1/2] net: brcm: netXtreme driver > > Hello! See inline comments below. > > On Tuesday 02 November 2021 11:18:10 Roman Bacik wrote: > > From: Bharat Gooty > > > > Broadcom bnxt L2 driver support. Used by the Broadcom > > iproc platforms. > > > > Signed-off-by: Bharat Gooty > > Reviewed-by: Ramon Fried > > > > Signed-off-by: Roman Bacik > > --- > > > > Changes in v6: > > - remove bnxt_eth_* env variables > > - clean up include headers > > > > Changes in v5: > > - remove bnxt_env_set_ethaddr/bnxt_env_del_ethaddr methods > > - add .read_rom_hwaddr =3D bnxt_read_rom_hwaddr > > - move bnxt_bring_pci/bnxt_bring_chip to bnxt_read_rom_hwddr > > - move mac copy from priv to plat to bnxt_read_rom_hwaddr > > > > Changes in v4: > > - remove static num_cards and use dev_seq(dev) instead > > - add .probe > > - merged probe/remove methods > > - select PCI_INIT_R when BNXT_ETH is selected > > > > Changes in v3: > > - change printf to debug in display_banner > > - remove get/set/print mac/speed > > - remove bnxt_hwrm_set_nvmem > > > > Changes in v2: > > - rebase and remove DM_PCI dependency from BNXT_ETH > > - remove tautology assignment from debug_resp() > > > > drivers/net/Kconfig | 1 + > > drivers/net/Makefile | 1 + > > drivers/net/bnxt/Kconfig | 7 + > > drivers/net/bnxt/Makefile | 5 + > > drivers/net/bnxt/bnxt.c | 1727 > +++++++++++++++++++++++++++++++++++ > > drivers/net/bnxt/bnxt_dbg.h | 537 +++++++++++ > > drivers/net/bnxt/pci_ids.h | 17 + > > include/broadcom/bnxt.h | 395 ++++++++ > > include/broadcom/bnxt_hsi.h | 889 ++++++++++++++++++ > > include/broadcom/bnxt_ver.h | 22 + > > These 3 include files looks like that contain only private definitions > for bnxt driver. So should not they be in the drivers/net/bnxt directory? We will move these files to drivers/net/bnxt/. > > > 10 files changed, 3601 insertions(+) > > create mode 100644 drivers/net/bnxt/Kconfig > > create mode 100644 drivers/net/bnxt/Makefile > > create mode 100644 drivers/net/bnxt/bnxt.c > > create mode 100644 drivers/net/bnxt/bnxt_dbg.h > > create mode 100644 drivers/net/bnxt/pci_ids.h > > create mode 100644 include/broadcom/bnxt.h > > create mode 100644 include/broadcom/bnxt_hsi.h > > create mode 100644 include/broadcom/bnxt_ver.h > > > > diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig > > index 6c12959f3794..8dc81a3d6cf9 100644 > > --- a/drivers/net/Kconfig > > +++ b/drivers/net/Kconfig > > @@ -1,6 +1,7 @@ > > source "drivers/net/phy/Kconfig" > > source "drivers/net/pfe_eth/Kconfig" > > source "drivers/net/fsl-mc/Kconfig" > > +source "drivers/net/bnxt/Kconfig" > > > > config ETH > > def_bool y > > diff --git a/drivers/net/Makefile b/drivers/net/Makefile > > index e4078d15a99f..1d9fbd6693cc 100644 > > --- a/drivers/net/Makefile > > +++ b/drivers/net/Makefile > > @@ -101,3 +101,4 @@ obj-$(CONFIG_HIGMACV300_ETH) +=3D higmacv300.o > > obj-$(CONFIG_MDIO_SANDBOX) +=3D mdio_sandbox.o > > obj-$(CONFIG_FSL_ENETC) +=3D fsl_enetc.o fsl_enetc_mdio.o > > obj-$(CONFIG_FSL_LS_MDIO) +=3D fsl_ls_mdio.o > > +obj-$(CONFIG_BNXT_ETH) +=3D bnxt/ > > diff --git a/drivers/net/bnxt/Kconfig b/drivers/net/bnxt/Kconfig > > new file mode 100644 > > index 000000000000..412ecd430335 > > --- /dev/null > > +++ b/drivers/net/bnxt/Kconfig > > @@ -0,0 +1,7 @@ > > +config BNXT_ETH > > + bool "BNXT PCI support" > > + depends on DM_ETH > > + select PCI_INIT_R > > + help > > + This driver implements support for bnxt pci controller > > + driver of ethernet class. > > diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile > > new file mode 100644 > > index 000000000000..a9d6ce00d5e0 > > --- /dev/null > > +++ b/drivers/net/bnxt/Makefile > > @@ -0,0 +1,5 @@ > > +# SPDX-License-Identifier: GPL-2.0+ > > +# Copyright 2019-2021 Broadcom. > > + > > +# Broadcom nxe Ethernet driver > > +obj-y +=3D bnxt.o > > diff --git a/drivers/net/bnxt/bnxt.c b/drivers/net/bnxt/bnxt.c > > new file mode 100644 > > index 000000000000..60a65b20a8f1 > > --- /dev/null > > +++ b/drivers/net/bnxt/bnxt.c > > @@ -0,0 +1,1727 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * Copyright 2019-2021 Broadcom. > > + */ > > + > > +#include > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "bnxt_dbg.h" > > +#include "pci_ids.h" > > + > > +#define bnxt_down_chip(bp) bnxt_hwrm_run(down_chip, bp, 0) > > +#define bnxt_bring_chip(bp) bnxt_hwrm_run(bring_chip, bp, 1) > > + > > +static const char banner[] =3D DRV_MODULE_DESC " v" > UBOOT_MODULE_VER ","; > > You do not need banner with custom version number. U-Boot version is > printed automatically and specify also which version of driver includes. We will remove display_banner(). > > > +static const char fw_ver[] =3D " FW v"; > > + > > +static void display_banner(struct bnxt *bp) > > +{ > > + int i; > > + > > + debug(banner); > > + debug(fw_ver); > > + debug("%d.%d.", bp->fw_maj, bp->fw_min); > > + debug("%d.%d\n", bp->fw_bld, bp->fw_rsvd); > > + debug("ETH MAC: "); > > + for (i =3D 0; i < ETH_ALEN; i++) { > > + debug("%02x", bp->mac_set[i]); > > + if (i !=3D (ETH_ALEN - 1)) > > + debug(":"); > > + } > > + > > + debug(", Port(%d), PF(%d)\n", bp->port_idx, bp->ordinal_value); > > +} > > + > > +/* Broadcom ethernet driver PCI APIs. */ > > +static void bnxt_bring_pci(struct bnxt *bp) > > +{ > > + u16 cmd_reg =3D 0; > > + > > + pci_read_word16(bp->pdev, PCI_VENDOR_ID, &bp->vendor_id); > > + pci_read_word16(bp->pdev, PCI_DEVICE_ID, &bp->device_id); > > Do you really need to read device and vendor ids? Driver already knows > them as it finds to device based on ids. We find this helpful when debugging. > > > + pci_read_word16(bp->pdev, > > + PCI_SUBSYSTEM_VENDOR_ID, > > + &bp->subsystem_vendor); > > + pci_read_word16(bp->pdev, PCI_SUBSYSTEM_ID, &bp- > >subsystem_device); > > + pci_read_word16(bp->pdev, PCI_COMMAND, &bp->cmd_reg); > > + pci_read_byte(bp->pdev, PCICFG_ME_REGISTER, &bp->pf_num); > > PCICFG_ME_REGISTER looks like an error as there is no such PCI config > space macro. What you are trying to read into pf_num? Currently I do not > know what "pf" abbreviation could mean. PF stands for physical function and pf_num is the number of physical functions configured. The macro is defined in bnxt.h: #define PCICFG_ME_REGISTER 0x98 > > > + pci_read_byte(bp->pdev, PCI_INTERRUPT_LINE, &bp->irq); > > + bp->bar0 =3D pci_map_bar(bp->pdev, PCI_BASE_ADDRESS_0, > PCI_REGION_MEM); > > + bp->bar1 =3D pci_map_bar(bp->pdev, PCI_BASE_ADDRESS_2, > PCI_REGION_MEM); > > + bp->bar2 =3D pci_map_bar(bp->pdev, PCI_BASE_ADDRESS_4, > PCI_REGION_MEM); > > pci_map_bar() is obsolete and should not be used in a new code. Please > switch to DM and use new DM API. We will replace with dm_pci_map_bar(). > > Check that you can compile driver without CONFIG_DM_PCI_COMPAT > option. > I think it should throw compile error on usage of this function. We do not enable CONFIG_DM_PCI_COMPAT. > > > + cmd_reg =3D bp->cmd_reg | PCI_COMMAND_MEMORY | > PCI_COMMAND_MASTER; > > + cmd_reg |=3D PCI_COMMAND_INTX_DISABLE; /* disable intr */ > > + pci_write_word(bp->pdev, PCI_COMMAND, cmd_reg); > > + pci_read_word16(bp->pdev, PCI_COMMAND, &cmd_reg); > > + dbg_pci(bp, __func__, cmd_reg); > > +} > ... > > +static int bnxt_read_rom_hwaddr(struct udevice *dev) > > +{ > > + struct eth_pdata *plat =3D dev_get_plat(dev); > > + struct bnxt *bp =3D dev_get_priv(dev); > > + > > + bnxt_bring_pci(bp); > > + > > + if (bnxt_bring_chip(bp)) > > It looks suspicious if read_rom_hwaddr() function is doing > initialization of PCIe device. Is there any reason for it in this place? > > Opposite of bnxt_bring_pci+bnxt_bring_chip is bnxt_down_chip and it is > called in bnxt_eth_remove() function. The method bnxt_bring_pci() fills priv data bp and needs to be called before bnxt_bring_chip(). The data does not need to be cleaned in bnxt_eth_remove(). We were asked by another reviewer to use bnxt_read_rom_hwaddr() to set up hw address (instead of doing it in probe) but bnxt_bring_chip() has to be called to get the hw addr. So both methods bnxt_bring_pci and bnxt_bring_chip were moved there. > > > + printf("*** warning: bnxt_bring_chip failed! ***\n"); > > It is only warning? I guess that failed initialization is fatal error > and should be propagated via return value... but that is not easily > possible if initialization is called from read_rom_hwaddr(). It is only warning, since there is usually another 1G eth available, besides this 100G bnxt eth. Originally, we had it probed via bnxt commands on demand. But another reviewer asked to remove bnxt commands so we bring up bnxt each boot. But it is not necessarily an error causing the boot to fail. > > > + else > > + memcpy(plat->enetaddr, bp->mac_set, ETH_ALEN); > > + > > + return 0; > > +} > > + > > +static const struct eth_ops bnxt_eth_ops =3D { > > + .start =3D bnxt_start, > > + .send =3D bnxt_send, > > + .recv =3D bnxt_recv, > > + .stop =3D bnxt_stop, > > + .free_pkt =3D bnxt_free_pkt, > > + .read_rom_hwaddr =3D bnxt_read_rom_hwaddr, > > +}; > > + > > +static const struct udevice_id bnxt_eth_ids[] =3D { > > + { .compatible =3D "broadcom,nxe" }, > > + { } > > +}; > > + > > +static int bnxt_eth_bind(struct udevice *dev) > > +{ > > + char name[20]; > > + > > + sprintf(name, "bnxt_eth%u", dev_seq(dev)); > > + > > + return device_set_name(dev, name); > > +} > > + > > +static int bnxt_eth_probe(struct udevice *dev) > > +{ > > + struct bnxt *bp =3D dev_get_priv(dev); > > + int err; > > + > > + bp->name =3D dev->name; > > + bp->pdev =3D (struct udevice *)dev; > > + bp->cardnum =3D dev_seq(dev); > > + err =3D bnxt_alloc_mem(bp); > > + if (err) > > + return err; > > + > > + display_banner(bp); > > + dev->flags_ =3D DM_FLAG_ACTIVATED; > > include/dm/device.h says: > > * @flags_: Flags for this device DM_FLAG_... (do not access outside driver > * model) > > Really, you should not touch flags_ member in driver code. We will remove the line with DM_FLAG_ACTIVATED. > > > + return 0; > > +} > > + > > +static int bnxt_eth_remove(struct udevice *dev) > > +{ > > + struct bnxt *bp =3D dev_get_priv(dev); > > + > > + bnxt_down_chip(bp); /* Down chip */ > > + dev->flags_ &=3D ~DM_FLAG_ACTIVATED; > > Here too. We will remove the line with ~DM_FLAG_ACTIVATED. > > > + bnxt_free_mem(bp); > > + > > + return 0; > > +} > > + > > +U_BOOT_DRIVER(eth_bnxt) =3D { > > + .name =3D "eth_bnxt", > > + .id =3D UCLASS_ETH, > > + .of_match =3D bnxt_eth_ids, > > + .bind =3D bnxt_eth_bind, > > + .probe =3D bnxt_eth_probe, > > + .remove =3D bnxt_eth_remove, > > + .ops =3D &bnxt_eth_ops, > > + .priv_auto =3D sizeof(struct bnxt), > > + .plat_auto =3D sizeof(struct eth_pdata), > > + .flags =3D DM_FLAG_ACTIVE_DMA, > > +}; > > + > > +U_BOOT_PCI_DEVICE(eth_bnxt, bnxt_nics); > ... > > diff --git a/drivers/net/bnxt/pci_ids.h b/drivers/net/bnxt/pci_ids.h > > new file mode 100644 > > index 000000000000..e9312be5acb4 > > --- /dev/null > > +++ b/drivers/net/bnxt/pci_ids.h > > @@ -0,0 +1,17 @@ > > +/* SPDX-License-Identifier: GPL-2.0+ */ > > +/* > > + * Copyright 2019-2021 Broadcom. > > + */ > > + > > +#ifndef _PCI_IDS_H_ > > +#define _PCI_IDS_H_ > > + > > +#define PCI_VID_BROADCOM 0x14e4 > > +#define PCI_DID_NXT_57320_1 0x16F0 > > These definitions should go into the include/pci_ids.h file. We will add them to include/pci_ids.h. > > > + > > +static struct pci_device_id bnxt_nics[] =3D { > > + {PCI_DEVICE(PCI_VID_BROADCOM, PCI_DID_NXT_57320_1)}, > > + {} > > +}; > > bnxt_nics[] array is used only in bnxt.c. You can put PCI ids directly > to that file. Defining + declaring variables in include file is strange > as if you include such header file two or more times then you either get > linker error (for non-static symbols) or you get multiple private > declaration of one variable. Which is not probably intended behavior. > We will add bnxt_nics[] to bnxt.c. > > + > > +#endif /* _PCI_IDS_H_ */ Thank you very much for your review, Roman --=20 This electronic communication and the information and any files transmitted= =20 with it, or attached to it, are confidential and are intended solely for=20 the use of the individual or entity to whom it is addressed and may contain= =20 information that is confidential, legally privileged, protected by privacy= =20 laws, or otherwise restricted from disclosure to anyone else. If you are=20 not the intended recipient or the person responsible for delivering the=20 e-mail to the intended recipient, you are hereby notified that any use,=20 copying, distributing, dissemination, forwarding, printing, or copying of= =20 this e-mail is strictly prohibited. If you received this e-mail in error,= =20 please return the e-mail to the sender, delete it from your computer, and= =20 destroy any printed copy of it. --0000000000005a028705d01003df Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature 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 6kRRYRlzjF1rVR3PZvtVpwKTcWvwqez9YnB5W7zFh0J6WXsQJsLKZoRNvv4VXAk2vycIsWR+aeNb l0x6vipMzcE90s2JZ/wqJlxX8dutql3gueCzZ2SxAgMBAAGjggHZMIIB1TAOBgNVHQ8BAf8EBAMC BaAwgaMGCCsGAQUFBwEBBIGWMIGTME4GCCsGAQUFBzAChkJodHRwOi8vc2VjdXJlLmdsb2JhbHNp Z24uY29tL2NhY2VydC9nc2djY3IzcGVyc29uYWxzaWduMmNhMjAyMC5jcnQwQQYIKwYBBQUHMAGG NWh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjNwZXJzb25hbHNpZ24yY2EyMDIwME0G A1UdIARGMEQwQgYKKwYBBAGgMgEoCjA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxz aWduLmNvbS9yZXBvc2l0b3J5LzAJBgNVHRMEAjAAMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9j cmwuZ2xvYmFsc2lnbi5jb20vZ3NnY2NyM3BlcnNvbmFsc2lnbjJjYTIwMjAuY3JsMCMGA1UdEQQc MBqBGHJvbWFuLmJhY2lrQGJyb2FkY29tLmNvbTATBgNVHSUEDDAKBggrBgEFBQcDBDAfBgNVHSME GDAWgBSWM9HmWBdbNHWKgVZk1b5I3qGPzzAdBgNVHQ4EFgQUFIRMHHEZDi127CpeMcPLPgCva8Aw DQYJKoZIhvcNAQELBQADggEBAJ3AlGS8SnTzvdaHc1sGWw7/pdUpzU59NLy5p827v5YbcxopZQPL v2q6YbcQTpQnxVa++htLqp+WyOb3PTzydNsHb5B++mR/jz9/+mJsa7yvtLkcDDcQrOfrZus6usQs oGwMj7g7D2OvJHuBtBRpqnKDRO4Wi7MHuGDfW6Wm+YJ3iibIl8OPWiqXlfOlkYxAaZcAAW84IeeM umNUQbWNMoBfa5qSHxe3ZWGNFZWnpTN7vp4rmu8Z1qrZGrSVc9IO3z+3/AD9GdYdelj8miFNczvR 0iiTaHiP8f5hiC8LUlKosTub10tap8TP0SCcuXM5RgS1q9QJ/zmwbg1zPbTTGkgxggJtMIICaQIB ATBrMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYDVQQDEyhH bG9iYWxTaWduIEdDQyBSMyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwAgwhRMMZKMaVhUl0DO8wDQYJ YIZIAWUDBAIBBQCggdQwLwYJKoZIhvcNAQkEMSIEIHi+YoXqzA3P+M4aJrF5inNBGFQLJi1XktkO iL8xwxU3MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIxMTEwNTE5 NTQzN1owaQYJKoZIhvcNAQkPMVwwWjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFl AwQBAjAKBggqhkiG9w0DBzALBgkqhkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFlAwQCATAN BgkqhkiG9w0BAQEFAASCAQAN/ljaWocvOYcgjgzWfWbZZHQpikwirzewlAeAG/u+Ghsdrj2xogKL BdoZOPKSC7u96TTO7He4g4XMCKhPKcfWJDibh2w8TUN0P8X1rfdHvXmo0GxsTs3v3QHMqB5RFoeM V47NjT3pkXwLuV60OQD11KN7P2SHPOtCxGJWbae20CMTIAWexzoJ9W8Q9KsGV69VMzuoGrJ14KDT B//9tN522bjSo2b/mIahvRgsymqLJZds/fsP9OT6TxiOtQkID+oW4ymsa+R5ipCeW59ZujDt3HMn QRZ77WJaLQHFxCjfYCrM+8Ib1YF8r1RuWKFe2yXPMMve6i4fVHXWR8HOO++R --0000000000005a028705d01003df--