From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 42F2443BE4; Fri, 1 Mar 2024 19:55:32 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2FDD342D68; Fri, 1 Mar 2024 19:55:32 +0100 (CET) Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) by mails.dpdk.org (Postfix) with ESMTP id 2D504402B8 for ; Fri, 1 Mar 2024 19:55:31 +0100 (CET) Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-5ce9555d42eso1942553a12.2 for ; Fri, 01 Mar 2024 10:55:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1709319330; x=1709924130; darn=dpdk.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Zvxbf4CaEokcoKikB5GmULUEs05B5bFQ5BpT1g0Q30E=; b=aafmrVEYmjo5ck3JHjc6bS0aZETsbI2D5fVJH6mP2zxsQ0lZ18tIfV1lmk56dF8b7s dL9ippfwEL09R3GvNPpVMu2pZqSx/f2hUpMlGocLGIN3xkEjVD62uHwXQK9F2QR7/add a5bKjQbMLt9ISJGdmWuhmu5OB0Oc1NHOVv60I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709319330; x=1709924130; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Zvxbf4CaEokcoKikB5GmULUEs05B5bFQ5BpT1g0Q30E=; b=ktMUzfkyY8HdCjuuIDoGDKF8BV+Hko+ahCIjTABu+tnyf86YNZtfgbjvvpHMAh2Spy GYy4sw3p8YeIUmQjaoADB1vGAnOVbL33kaYe0v2F7EbTFBNWL5+1x0Q5Zu8exdxdIWVz bJIewEdmAQMqyqLm1A4tajqWqel2vzHWIYvwTf2f1fCUYvGorZx6x4TFKHDK9GF4oYlq XZsOwwKOHRvD5ogqlvTMuo3wsc4XS0HkreXvgZxWf9lUMwxNXS/JKxVzDeSIrHzwxy58 ZzGBOucZB+9guTLT+b2CWoGuRrBPPxchx0A0wZBNT3jMijrrwe3gQFaHHCuYhl37MRvr /xqQ== X-Forwarded-Encrypted: i=1; AJvYcCVXbz3DMO5JlcZzph1o9RPfB1FgJ2G5Ftghs0P3oseHMbMhKT6iLDAHRgxAsta2uTXCJh3AIXxYEPkHod0= X-Gm-Message-State: AOJu0YytC+7I0H2+YYXvLaR3rR4IG/OMrJ8am8fYHQWcKMKZ7yP4UZnp XbMDc95O37RaarjvqXIUeoHesPmnHoZDjhNoofi8EigQ+aBdDEDDwok+YLQdTLhds29Y8zic9Fl HZn72w35OYTewJzkvZ/JXlrCM5UpgC5hkNNfN X-Google-Smtp-Source: AGHT+IHzCgPbcDjUE5kxgorePtnMaiS9tXzcrTGRi9qX6UiiuY49DuVxcxxQSRaiRMZNk3NgXd51v38KxzghRu1PRvk= X-Received: by 2002:a17:90a:e384:b0:299:48ec:1e83 with SMTP id b4-20020a17090ae38400b0029948ec1e83mr2340010pjz.49.1709319330126; Fri, 01 Mar 2024 10:55:30 -0800 (PST) MIME-Version: 1.0 References: <20240229225936.483472-1-stephen@networkplumber.org> In-Reply-To: From: Ajit Khaparde Date: Fri, 1 Mar 2024 10:55:12 -0800 Message-ID: Subject: Re: [PATCH 00/71] replace use of fixed size rte_memcpy To: Konstantin Ananyev Cc: Stephen Hemminger , "dev@dpdk.org" Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="00000000000082b98b06129debb6" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --00000000000082b98b06129debb6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Mar 1, 2024 at 4:55=E2=80=AFAM Konstantin Ananyev wrote: > > > > > The DPDK has a lot of "cargo cult" usage of rte_memcpy. > > This patch set replaces cases where rte_memcpy is used with a fixed > > size constant size. > > > > Typical example is: > > rte_memcpy(mac_addrs, mac.addr_bytes, RTE_ETHER_ADDR_LEN); > > which can be replaced with: > > memcpy(mac_addrs, mac.addr_bytes, RTE_ETHER_ADDR_LEN); > > > > This has two benefits. Gcc (and clang) are smart enough that for > > all small fixed size values, they just generate the necessary instructi= ons > > to do it inline. It also means that fortify, Coverity, and ASAN > > analyzers can check these memcpy's. > > > > So faster, better, safer. > > > > The first patch is a simple coccinelle script to do the replacement > > and the rest are the results broken out by module. > > > > The coccinelle script can be used again to make sure more bad > > usage doesn't creep in with new drivers. > > > > Stephen Hemminger (71): > > cocci/rte_memcpy: add script to eliminate fixed size rte_memcpy > > eal: replace use of fixed size rte_memcpy > > ethdev: replace use of fixed size rte_memcpy > > eventdev: replace use of fixed size rte_memcpy > > cryptodev: replace use of fixed size rte_memcpy > > ip_frag: replace use of fixed size rte_memcpy > > net: replace use of fixed size rte_memcpy > > lpm: replace use of fixed size rte_memcpy > > node: replace use of fixed size rte_memcpy > > pdcp: replace use of fixed size rte_memcpy > > pipeline: replace use of fixed size rte_memcpy > > rib: replace use of fixed size rte_memcpy > > security: replace use of fixed size rte_memcpy > > net/mlx5: replace use of fixed size rte_memcpy > > net/nfp: replace use of fixed size rte_memcpy > > net/ngbe: replace use of fixed size rte_memcpy > > net/null: replace use of fixed size rte_memcpy > > net/pcap: replace use of fixed size rte_memcpy > > net/sfc: replace use of fixed size rte_memcpy > > net/tap: replace use of fixed size rte_memcpy > > net/txgbe: replace use of fixed size rte_memcpy > > raw/ifpga: replace use of fixed size rte_memcpy > > raw/skeleton: replace use of fixed size rte_memcpy > > net/hns3: replace use of fixed size rte_memcpy > > net/i40e: replace use of fixed size rte_memcpy > > net/iavf: replace use of fixed size rte_memcpy > > net/ice: replace use of fixed size rte_memcpy > > net/idpf: replace use of fixed size rte_memcpy > > net/ipn3ke: replace use of fixed size rte_memcpy > > net/ixgbe: replace use of fixed size rte_memcpy > > net/memif: replace use of fixed size rte_memcpy > > net/qede: replace use of fixed size rte_memcpy > > baseband/acc: replace use of fixed size rte_memcpy > > baseband/la12xx: replace use of fixed size rte_memcpy > > common/idpf: replace use of fixed size rte_memcpy > > common/qat: replace use of fixed size rte_memcpy > > compress/qat: replace use of fixed size rte_memcpy > > crypto/ccp: replace use of fixed size rte_memcpy > > crypto/cnxk: replace use of fixed size rte_memcpy > > crypto/dpaa_sec: replace use of fixed size rte_memcpy > > crypto/ipsec_mb: replace use of fixed size rte_memcpy > > crypto/qat: replace use of fixed size rte_memcpy > > crypto/scheduler: replace use of fixed size rte_memcpy > > event/cnxk: replace use of fixed size rte_memcpy > > event/dlb2: replace use of fixed size rte_memcpy > > event/dpaa2: replace use of fixed size rte_memcpy > > event/octeontx: replace use of fixed size rte_memcpy > > mempool/dpaa: replace use of fixed size rte_memcpy > > mempool/dpaa2: replace use of fixed size rte_memcpy > > ml/cnxk: replace use of fixed size rte_memcpy > > net/af_xdp: replace use of fixed size rte_memcpy > > net/avp: replace use of fixed size rte_memcpy > > net/axgbe: replace use of fixed size rte_memcpy > > net/bnx2x: replace use of fixed size rte_memcpy > > net/bnxt: replace use of fixed size rte_memcpy > > net/bonding: replace use of fixed size rte_memcpy > > net/cnxk: replace use of fixed size rte_memcpy > > net/cpfl: replace use of fixed size rte_memcpy > > net/cxgbe: replace use of fixed size rte_memcpy > > net/dpaa2: replace use of fixed size rte_memcpy > > net/e1000: replace use of fixed size rte_memcpy > > net/enic: replace use of fixed size rte_memcpy > > net/failsafe: replace use of fixed size rte_memcpy > > net/gve/base: replace use of fixed size rte_memcpy > > net/hinic: replace use of fixed size rte_memcpy > > net/mvpp2: replace use of fixed size rte_memcpy > > app/test-pmd: replace use of fixed size rte_memcpy > > app/graph: replace use of fixed size rte_memcpy > > app/test-eventdev: replace use of fixed size rte_memcpy > > app/test: replace use of fixed size rte_memcpy > > examples: replace use of fixed size rte_memcpy > > > > app/graph/neigh.c | 8 +- > > app/test-eventdev/test_pipeline_common.c | 19 ++- > > app/test-pmd/cmdline.c | 48 ++++---- > > app/test-pmd/cmdline_flow.c | 24 ++-- > > app/test-pmd/config.c | 8 +- > > app/test/packet_burst_generator.c | 4 +- > > app/test/test_crc.c | 4 +- > > app/test/test_cryptodev.c | 18 ++- > > app/test/test_event_crypto_adapter.c | 12 +- > > app/test/test_event_dma_adapter.c | 4 +- > > app/test/test_ipsec.c | 6 +- > > app/test/test_link_bonding_mode4.c | 8 +- > > app/test/test_security_inline_proto.c | 36 +++--- > > app/test/virtual_pmd.c | 2 +- > > devtools/cocci/rte_memcpy.cocci | 11 ++ > > drivers/baseband/acc/rte_acc100_pmd.c | 19 ++- > > drivers/baseband/acc/rte_vrb_pmd.c | 21 ++-- > > drivers/baseband/la12xx/bbdev_la12xx.c | 4 +- > > drivers/common/idpf/idpf_common_device.c | 4 +- > > drivers/common/idpf/idpf_common_virtchnl.c | 8 +- > > drivers/common/qat/qat_qp.c | 10 +- > > drivers/compress/qat/qat_comp.c | 8 +- > > drivers/crypto/ccp/ccp_crypto.c | 14 +-- > > drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 2 +- > > drivers/crypto/cnxk/cnxk_se.h | 2 +- > > drivers/crypto/dpaa_sec/dpaa_sec.c | 2 +- > > drivers/crypto/ipsec_mb/pmd_snow3g.c | 4 +- > > drivers/crypto/qat/qat_sym_session.c | 52 ++++----- > > .../scheduler/rte_cryptodev_scheduler.c | 6 +- > > drivers/crypto/scheduler/scheduler_failover.c | 12 +- > > drivers/event/cnxk/cnxk_tim_evdev.c | 4 +- > > drivers/event/dlb2/dlb2.c | 6 +- > > drivers/event/dpaa2/dpaa2_eventdev.c | 6 +- > > drivers/event/octeontx/timvf_evdev.c | 4 +- > > drivers/mempool/dpaa/dpaa_mempool.c | 4 +- > > drivers/mempool/dpaa2/dpaa2_hw_mempool.c | 4 +- > > drivers/ml/cnxk/cn10k_ml_model.c | 8 +- > > drivers/ml/cnxk/cn10k_ml_ops.c | 11 +- > > drivers/ml/cnxk/cnxk_ml_ops.c | 2 +- > > drivers/ml/cnxk/mvtvm_ml_model.c | 8 +- > > drivers/ml/cnxk/mvtvm_ml_ops.c | 8 +- > > drivers/net/af_xdp/rte_eth_af_xdp.c | 2 +- > > drivers/net/avp/avp_ethdev.c | 4 +- > > drivers/net/axgbe/axgbe_ethdev.c | 4 +- > > drivers/net/bnx2x/bnx2x.c | 32 +++--- > > drivers/net/bnx2x/bnx2x_stats.c | 10 +- > > drivers/net/bnx2x/bnx2x_vfpf.c | 19 +-- > > drivers/net/bnxt/bnxt_flow.c | 34 +++--- > > drivers/net/bonding/rte_eth_bond_8023ad.c | 4 +- > > drivers/net/bonding/rte_eth_bond_flow.c | 2 +- > > drivers/net/cnxk/cnxk_ethdev_ops.c | 2 +- > > drivers/net/cnxk/cnxk_tm.c | 5 +- > > drivers/net/cpfl/cpfl_ethdev.c | 3 +- > > drivers/net/cpfl/cpfl_vchnl.c | 4 +- > > drivers/net/cxgbe/clip_tbl.c | 2 +- > > drivers/net/cxgbe/cxgbe_filter.c | 8 +- > > drivers/net/cxgbe/l2t.c | 4 +- > > drivers/net/cxgbe/smt.c | 20 ++-- > > drivers/net/dpaa2/dpaa2_tm.c | 2 +- > > drivers/net/e1000/igb_flow.c | 22 ++-- > > drivers/net/e1000/igb_pf.c | 6 +- > > drivers/net/enic/enic_main.c | 8 +- > > drivers/net/failsafe/failsafe_ops.c | 6 +- > > drivers/net/gve/base/gve_adminq.c | 2 +- > > drivers/net/hinic/hinic_pmd_flow.c | 40 +++---- > > drivers/net/hns3/hns3_fdir.c | 2 +- > > drivers/net/hns3/hns3_flow.c | 4 +- > > drivers/net/i40e/i40e_ethdev.c | 108 ++++++++---------- > > drivers/net/i40e/i40e_fdir.c | 28 +++-- > > drivers/net/i40e/i40e_flow.c | 56 +++++---- > > drivers/net/i40e/i40e_pf.c | 2 +- > > drivers/net/i40e/i40e_tm.c | 11 +- > > drivers/net/i40e/rte_pmd_i40e.c | 34 +++--- > > drivers/net/iavf/iavf_fdir.c | 93 +++++++-------- > > drivers/net/iavf/iavf_fsub.c | 50 ++++---- > > drivers/net/iavf/iavf_generic_flow.c | 2 +- > > drivers/net/iavf/iavf_tm.c | 11 +- > > drivers/net/iavf/iavf_vchnl.c | 9 +- > > drivers/net/ice/ice_dcf.c | 5 +- > > drivers/net/ice/ice_dcf_parent.c | 2 +- > > drivers/net/ice/ice_dcf_sched.c | 11 +- > > drivers/net/ice/ice_diagnose.c | 4 +- > > drivers/net/ice/ice_ethdev.c | 14 +-- > > drivers/net/ice/ice_fdir_filter.c | 37 +++--- > > drivers/net/ice/ice_generic_flow.c | 2 +- > > drivers/net/ice/ice_hash.c | 2 +- > > drivers/net/ice/ice_tm.c | 11 +- > > drivers/net/idpf/idpf_ethdev.c | 7 +- > > drivers/net/idpf/idpf_rxtx.c | 10 +- > > drivers/net/ipn3ke/ipn3ke_flow.c | 32 +++--- > > drivers/net/ipn3ke/ipn3ke_representor.c | 16 +-- > > drivers/net/ipn3ke/ipn3ke_tm.c | 6 +- > > drivers/net/ixgbe/ixgbe_ethdev.c | 9 +- > > drivers/net/ixgbe/ixgbe_fdir.c | 7 +- > > drivers/net/ixgbe/ixgbe_flow.c | 65 +++++------ > > drivers/net/ixgbe/ixgbe_ipsec.c | 8 +- > > drivers/net/ixgbe/ixgbe_pf.c | 4 +- > > drivers/net/ixgbe/ixgbe_tm.c | 11 +- > > drivers/net/ixgbe/rte_pmd_ixgbe.c | 4 +- > > drivers/net/memif/memif_socket.c | 4 +- > > drivers/net/mlx5/mlx5_devx.c | 4 +- > > drivers/net/mlx5/mlx5_flow.c | 38 +++--- > > drivers/net/mlx5/mlx5_flow_aso.c | 6 +- > > drivers/net/mlx5/mlx5_flow_hw.c | 16 +-- > > drivers/net/mlx5/mlx5_rx.c | 6 +- > > drivers/net/mlx5/mlx5_rxtx_vec.c | 8 +- > > drivers/net/mvpp2/mrvl_tm.c | 2 +- > > drivers/net/nfp/flower/nfp_conntrack.c | 2 +- > > drivers/net/nfp/flower/nfp_flower_flow.c | 16 +-- > > .../net/nfp/flower/nfp_flower_representor.c | 2 +- > > drivers/net/nfp/nfp_mtr.c | 10 +- > > drivers/net/ngbe/ngbe_pf.c | 4 +- > > drivers/net/null/rte_eth_null.c | 6 +- > > drivers/net/pcap/pcap_ethdev.c | 2 +- > > drivers/net/pcap/pcap_osdep_freebsd.c | 2 +- > > drivers/net/pcap/pcap_osdep_linux.c | 2 +- > > drivers/net/qede/qede_main.c | 2 +- > > drivers/net/sfc/sfc.c | 2 +- > > drivers/net/sfc/sfc_ef10_tx.c | 2 +- > > drivers/net/sfc/sfc_ethdev.c | 11 +- > > drivers/net/sfc/sfc_flow.c | 20 ++-- > > drivers/net/sfc/sfc_flow_rss.c | 2 +- > > drivers/net/sfc/sfc_mae.c | 2 +- > > drivers/net/sfc/sfc_rx.c | 2 +- > > drivers/net/sfc/sfc_tso.c | 2 +- > > drivers/net/sfc/sfc_tso.h | 9 +- > > drivers/net/tap/rte_eth_tap.c | 14 +-- > > drivers/net/txgbe/txgbe_ethdev.c | 9 +- > > drivers/net/txgbe/txgbe_fdir.c | 6 +- > > drivers/net/txgbe/txgbe_flow.c | 65 +++++------ > > drivers/net/txgbe/txgbe_ipsec.c | 8 +- > > drivers/net/txgbe/txgbe_pf.c | 4 +- > > drivers/net/txgbe/txgbe_tm.c | 11 +- > > drivers/raw/ifpga/afu_pmd_he_hssi.c | 2 +- > > drivers/raw/ifpga/afu_pmd_he_lpbk.c | 2 +- > > drivers/raw/ifpga/afu_pmd_he_mem.c | 2 +- > > drivers/raw/ifpga/afu_pmd_n3000.c | 8 +- > > drivers/raw/ifpga/ifpga_rawdev.c | 10 +- > > drivers/raw/skeleton/skeleton_rawdev.c | 7 +- > > examples/bbdev_app/main.c | 2 +- > > examples/l2fwd-cat/cat.c | 3 +- > > examples/ptpclient/ptpclient.c | 11 +- > > examples/vhost/main.c | 5 +- > > examples/vmdq/main.c | 5 +- > > examples/vmdq_dcb/main.c | 14 +-- > > lib/cryptodev/rte_cryptodev.c | 2 +- > > lib/eal/common/eal_common_options.c | 7 +- > > lib/ethdev/rte_ethdev.c | 3 +- > > lib/ethdev/rte_flow.c | 5 +- > > lib/eventdev/rte_event_crypto_adapter.c | 2 +- > > lib/eventdev/rte_event_dma_adapter.c | 4 +- > > lib/eventdev/rte_event_timer_adapter.c | 2 +- > > lib/fib/trie.c | 2 +- > > lib/ip_frag/rte_ipv6_fragmentation.c | 4 +- > > lib/ip_frag/rte_ipv6_reassembly.c | 6 +- > > lib/lpm/rte_lpm6.c | 3 +- > > lib/net/rte_ether.c | 2 +- > > lib/node/ip6_lookup.c | 8 +- > > lib/pdcp/pdcp_process.c | 36 +++--- > > lib/pipeline/rte_table_action.c | 8 +- > > lib/rib/rte_rib6.h | 3 +- > > lib/security/rte_security.c | 4 +- > > 162 files changed, 880 insertions(+), 960 deletions(-) > > create mode 100644 devtools/cocci/rte_memcpy.cocci > > > > -- > > Series-Acked-by: Konstantin Ananyev For bnxt PMD and the series - Acked-by: Ajit Khaparde > > > 2.43.0 > --00000000000082b98b06129debb6 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIIQdgYJKoZIhvcNAQcCoIIQZzCCEGMCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg gg3NMIIFDTCCA/WgAwIBAgIQeEqpED+lv77edQixNJMdADANBgkqhkiG9w0BAQsFADBMMSAwHgYD VQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UE AxMKR2xvYmFsU2lnbjAeFw0yMDA5MTYwMDAwMDBaFw0yODA5MTYwMDAwMDBaMFsxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYDVQQDEyhHbG9iYWxTaWduIEdDQyBS MyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA vbCmXCcsbZ/a0fRIQMBxp4gJnnyeneFYpEtNydrZZ+GeKSMdHiDgXD1UnRSIudKo+moQ6YlCOu4t rVWO/EiXfYnK7zeop26ry1RpKtogB7/O115zultAz64ydQYLe+a1e/czkALg3sgTcOOcFZTXk38e aqsXsipoX1vsNurqPtnC27TWsA7pk4uKXscFjkeUE8JZu9BDKaswZygxBOPBQBwrA5+20Wxlk6k1 e6EKaaNaNZUy30q3ArEf30ZDpXyfCtiXnupjSK8WU2cK4qsEtj09JS4+mhi0CTCrCnXAzum3tgcH cHRg0prcSzzEUDQWoFxyuqwiwhHu3sPQNmFOMwIDAQABo4IB2jCCAdYwDgYDVR0PAQH/BAQDAgGG MGAGA1UdJQRZMFcGCCsGAQUFBwMCBggrBgEFBQcDBAYKKwYBBAGCNxQCAgYKKwYBBAGCNwoDBAYJ KwYBBAGCNxUGBgorBgEEAYI3CgMMBggrBgEFBQcDBwYIKwYBBQUHAxEwEgYDVR0TAQH/BAgwBgEB /wIBADAdBgNVHQ4EFgQUljPR5lgXWzR1ioFWZNW+SN6hj88wHwYDVR0jBBgwFoAUj/BLf6guRSSu TVD6Y5qL3uLdG7wwegYIKwYBBQUHAQEEbjBsMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9i YWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j b20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFs c2lnbi5jb20vcm9vdC1yMy5jcmwwWgYDVR0gBFMwUTALBgkrBgEEAaAyASgwQgYKKwYBBAGgMgEo CjA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAN BgkqhkiG9w0BAQsFAAOCAQEAdAXk/XCnDeAOd9nNEUvWPxblOQ/5o/q6OIeTYvoEvUUi2qHUOtbf jBGdTptFsXXe4RgjVF9b6DuizgYfy+cILmvi5hfk3Iq8MAZsgtW+A/otQsJvK2wRatLE61RbzkX8 9/OXEZ1zT7t/q2RiJqzpvV8NChxIj+P7WTtepPm9AIj0Keue+gS2qvzAZAY34ZZeRHgA7g5O4TPJ /oTd+4rgiU++wLDlcZYd/slFkaT3xg4qWDepEMjT4T1qFOQIL+ijUArYS4owpPg9NISTKa1qqKWJ jFoyms0d0GwOniIIbBvhI2MJ7BSY9MYtWVT5jJO3tsVHwj4cp92CSFuGwunFMzCCA18wggJHoAMC AQICCwQAAAAAASFYUwiiMA0GCSqGSIb3DQEBCwUAMEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9v dCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTA5 MDMxODEwMDAwMFoXDTI5MDMxODEwMDAwMFowTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENB IC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMJXaQeQZ4Ihb1wIO2hMoonv0FdhHFrYhy/EYCQ8eyip0E XyTLLkvhYIJG4VKrDIFHcGzdZNHr9SyjD4I9DCuul9e2FIYQebs7E4B3jAjhSdJqYi8fXvqWaN+J J5U4nwbXPsnLJlkNc96wyOkmDoMVxu9bi9IEYMpJpij2aTv2y8gokeWdimFXN6x0FNx04Druci8u nPvQu7/1PQDhBjPogiuuU6Y6FnOM3UEOIDrAtKeh6bJPkC4yYOlXy7kEkmho5TgmYHWyn3f/kRTv riBJ/K1AFUjRAjFhGV64l++td7dkmnq/X8ET75ti+w1s4FRpFqkD2m7pg5NxdsZphYIXAgMBAAGj QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSP8Et/qC5FJK5N UPpjmove4t0bvDANBgkqhkiG9w0BAQsFAAOCAQEAS0DbwFCq/sgM7/eWVEVJu5YACUGssxOGhigH M8pr5nS5ugAtrqQK0/Xx8Q+Kv3NnSoPHRHt44K9ubG8DKY4zOUXDjuS5V2yq/BKW7FPGLeQkbLmU Y/vcU2hnVj6DuM81IcPJaP7O2sJTqsyQiunwXUaMld16WCgaLx3ezQA3QY/tRG3XUyiXfvNnBB4V 14qWtNPeTCekTBtzc3b0F5nCH3oO4y0IrQocLP88q1UOD5F+NuvDV0m+4S4tfGCLw0FREyOdzvcy a5QBqJnnLDMfOjsl0oZAzjsshnjJYS8Uuu7bVW/fhO4FCU29KNhyztNiUGUe65KXgzHZs7XKR1g/ XzCCBVUwggQ9oAMCAQICDAzZWuPidkrRZaiw2zANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJC RTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTExMC8GA1UEAxMoR2xvYmFsU2lnbiBHQ0MgUjMg UGVyc29uYWxTaWduIDIgQ0EgMjAyMDAeFw0yMjA5MTAwODE4NDVaFw0yNTA5MTAwODE4NDVaMIGW MQswCQYDVQQGEwJJTjESMBAGA1UECBMJS2FybmF0YWthMRIwEAYDVQQHEwlCYW5nYWxvcmUxFjAU BgNVBAoTDUJyb2FkY29tIEluYy4xHDAaBgNVBAMTE0FqaXQgS3VtYXIgS2hhcGFyZGUxKTAnBgkq hkiG9w0BCQEWGmFqaXQua2hhcGFyZGVAYnJvYWRjb20uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEArZ/Aqg34lMOo2BabvAa+dRThl9OeUUJMob125dz+jvS78k4NZn1mYrHu53Dn YycqjtuSMlJ6vJuwN2W6QpgTaA2SDt5xTB7CwA2urpcm7vWxxLOszkr5cxMB1QBbTd77bXFuyTqW jrer3VIWqOujJ1n+n+1SigMwEr7PKQR64YKq2aRYn74ukY3DlQdKUrm2yUkcA7aExLcAwHWUna/u pZEyqKnwS1lKCzjX7mV5W955rFsFxChdAKfw0HilwtqdY24mhy62+GeaEkD0gYIj1tCmw9gnQToc K+0s7xEunfR9pBrzmOwS3OQbcP0nJ8SmQ8R+reroH6LYuFpaqK1rgQIDAQABo4IB2zCCAdcwDgYD VR0PAQH/BAQDAgWgMIGjBggrBgEFBQcBAQSBljCBkzBOBggrBgEFBQcwAoZCaHR0cDovL3NlY3Vy ZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3NnY2NyM3BlcnNvbmFsc2lnbjJjYTIwMjAuY3J0MEEG CCsGAQUFBzABhjVodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9nc2djY3IzcGVyc29uYWxzaWdu MmNhMjAyMDBNBgNVHSAERjBEMEIGCisGAQQBoDIBKAowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93 d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADBJBgNVHR8EQjBAMD6gPKA6 hjhodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjNwZXJzb25hbHNpZ24yY2EyMDIwLmNy bDAlBgNVHREEHjAcgRphaml0LmtoYXBhcmRlQGJyb2FkY29tLmNvbTATBgNVHSUEDDAKBggrBgEF BQcDBDAfBgNVHSMEGDAWgBSWM9HmWBdbNHWKgVZk1b5I3qGPzzAdBgNVHQ4EFgQUbrcTuh0mr2qP xYdtyDgFeRIiE/gwDQYJKoZIhvcNAQELBQADggEBALrc1TljKrDhXicOaZlzIQyqOEkKAZ324i8X OwzA0n2EcPGmMZvgARurvanSLD3mLeeuyq1feCcjfGM1CJFh4+EY7EkbFbpVPOIdstSBhbnAJnOl aC/q0wTndKoC/xXBhXOZB8YL/Zq4ZclQLMUO6xi/fFRyHviI5/IrosdrpniXFJ9ukJoOXtvdrEF+ KlMYg/Deg9xo3wddCqQIsztHSkR4XaANdn+dbLRQpctZ13BY1lim4uz5bYn3M0IxyZWkQ1JuPHCK aRJv0SfR88PoI4RB7NCEHqFwARTj1KvFPQi8pK/YISFydZYbZrxQdyWDidqm4wSuJfpE6i0cWvCd u50xggJtMIICaQIBATBrMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNh MTEwLwYDVQQDEyhHbG9iYWxTaWduIEdDQyBSMyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwAgwM2Vrj 4nZK0WWosNswDQYJYIZIAWUDBAIBBQCggdQwLwYJKoZIhvcNAQkEMSIEII0HgPw1eGU0XrIqOmr2 PShVm5ljag4lhAV+U7fPIqzzMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF MQ8XDTI0MDMwMTE4NTUzMFowaQYJKoZIhvcNAQkPMVwwWjALBglghkgBZQMEASowCwYJYIZIAWUD BAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzALBgkqhkiG9w0BAQowCwYJKoZIhvcNAQEHMAsG CWCGSAFlAwQCATANBgkqhkiG9w0BAQEFAASCAQAHkKb4yT4YNzpKaTjl1+fD8Kmiqf0+4AZ6FZfl ACFM+m/cR6JBhm6H7rsCmSKbesOqmI0VG07qANjhBC43krRxhOP5rKqfQutTNFQesIhL1CohRE0l sR7utkxsDcHL0KGomaeQDycgvwnwfb+QFMQPXsJZJpkqO/G9Lw8DfFNW9QysxmcWQTzyjCvr3ttT LmQ9Ia3ayOZtVMoM2L7LwqKw7jUKfdyrzc9fWtydizdPBcDC5FDpRcTx9Thqtl5wjZ6AJmTWZyAU jjPsKuEeqUBiHLzBlTy4PhSe4Jm6HaXgkUNIaM/wd07q8ONc4C48PL7ARC0KkvmnLLBxTDNzqcjD --00000000000082b98b06129debb6--