diff options
220 files changed, 22654 insertions, 18662 deletions
diff --git a/Documentation/networking/ieee802154.txt b/Documentation/networking/ieee802154.txt index 1c0c82c..23c995e 100644 --- a/Documentation/networking/ieee802154.txt +++ b/Documentation/networking/ieee802154.txt @@ -56,8 +56,12 @@ HardMAC See the header include/net/ieee802154_netdev.h. You have to implement Linux net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family -code via plain sk_buffs. The control block of sk_buffs will contain additional -info as described in the struct ieee802154_mac_cb. +code via plain sk_buffs. On skb reception skb->cb must contain additional +info as described in the struct ieee802154_mac_cb. During packet transmission +the skb->cb is used to provide additional data to device's header_ops->create +function. Be aware, that this data can be overriden later (when socket code +submits skb to qdisc), so if you need something from that cb later, you should +store info in the skb->data on your own. To hook the MLME interface you have to populate the ml_priv field of your net_device with a pointer to struct ieee802154_mlme_ops instance. All fields are @@ -73,3 +77,4 @@ We are going to provide intermediate layer implementing IEEE 802.15.4 MAC in software. This is currently WIP. See header include/net/mac802154.h and several drivers in drivers/ieee802154/. + diff --git a/MAINTAINERS b/MAINTAINERS index 9b55c66..0ab47e7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2653,25 +2653,21 @@ F: drivers/net/ixgbe/ INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT M: Zhu Yi <yi.zhu@intel.com> -M: James Ketrenos <jketreno@linux.intel.com> M: Reinette Chatre <reinette.chatre@intel.com> +M: Intel Linux Wireless <ilw@linux.intel.com> L: linux-wireless@vger.kernel.org -L: ipw2100-devel@lists.sourceforge.net -W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2100.sourceforge.net -S: Supported +S: Odd Fixes F: Documentation/networking/README.ipw2100 F: drivers/net/wireless/ipw2x00/ipw2100.* INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT M: Zhu Yi <yi.zhu@intel.com> -M: James Ketrenos <jketreno@linux.intel.com> M: Reinette Chatre <reinette.chatre@intel.com> +M: Intel Linux Wireless <ilw@linux.intel.com> L: linux-wireless@vger.kernel.org -L: ipw2100-devel@lists.sourceforge.net -W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2200.sourceforge.net -S: Supported +S: Odd Fixes F: Documentation/networking/README.ipw2200 F: drivers/net/wireless/ipw2x00/ipw2200.* @@ -2688,8 +2684,8 @@ F: include/linux/wimax/i2400m.h INTEL WIRELESS WIFI LINK (iwlwifi) M: Zhu Yi <yi.zhu@intel.com> M: Reinette Chatre <reinette.chatre@intel.com> +M: Intel Linux Wireless <ilw@linux.intel.com> L: linux-wireless@vger.kernel.org -L: ipw3945-devel@lists.sourceforge.net W: http://intellinuxwireless.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6.git S: Supported @@ -4527,9 +4523,10 @@ S: Supported F: drivers/net/benet/ SFC NETWORK DRIVER -P: Steve Hodgson -P: Ben Hutchings -M: Robert Stonehouse <linux-net-drivers@solarflare.com> +M: Solarflare linux maintainers <linux-net-drivers@solarflare.com> +M: Steve Hodgson <shodgson@solarflare.com> +M: Ben Hutchings <bhutchings@solarflare.com> +L: netdev@vger.kernel.org S: Supported F: drivers/net/sfc/ diff --git a/arch/sh/include/asm/sh_eth.h b/arch/sh/include/asm/sh_eth.h index bb83258..acf9970 100644 --- a/arch/sh/include/asm/sh_eth.h +++ b/arch/sh/include/asm/sh_eth.h @@ -6,6 +6,9 @@ enum {EDMAC_LITTLE_ENDIAN, EDMAC_BIG_ENDIAN}; struct sh_eth_plat_data { int phy; int edmac_endian; + + unsigned no_ether_link:1; + unsigned ether_link_active_low:1; }; #endif diff --git a/drivers/ieee802154/fakehard.c b/drivers/ieee802154/fakehard.c index 262536f..c1c9697 100644 --- a/drivers/ieee802154/fakehard.c +++ b/drivers/ieee802154/fakehard.c @@ -30,6 +30,12 @@ #include <net/ieee802154_netdev.h> #include <net/ieee802154.h> #include <net/nl802154.h> +#include <net/wpan-phy.h> + +struct wpan_phy *net_to_phy(struct net_device *dev) +{ + return container_of(dev->dev.parent, struct wpan_phy, dev); +} /** * fake_get_pan_id - Retrieve the PAN ID of the device. @@ -113,8 +119,15 @@ static u8 fake_get_bsn(struct net_device *dev) * 802.15.4-2006 document. */ static int fake_assoc_req(struct net_device *dev, - struct ieee802154_addr *addr, u8 channel, u8 cap) + struct ieee802154_addr *addr, u8 channel, u8 page, u8 cap) { + struct wpan_phy *phy = net_to_phy(dev); + + mutex_lock(&phy->pib_lock); + phy->current_channel = channel; + phy->current_page = page; + mutex_unlock(&phy->pib_lock); + /* We simply emulate it here */ return ieee802154_nl_assoc_confirm(dev, fake_get_short_addr(dev), IEEE802154_SUCCESS); @@ -179,10 +192,17 @@ static int fake_disassoc_req(struct net_device *dev, * document, with 7.3.8 describing coordinator realignment. */ static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr, - u8 channel, + u8 channel, u8 page, u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, u8 coord_realign) { + struct wpan_phy *phy = net_to_phy(dev); + + mutex_lock(&phy->pib_lock); + phy->current_channel = channel; + phy->current_page = page; + mutex_unlock(&phy->pib_lock); + /* We don't emulate beacons here at all, so START should fail */ ieee802154_nl_start_confirm(dev, IEEE802154_INVALID_PARAMETER); return 0; @@ -204,11 +224,11 @@ static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr, * Note: This is in section 7.5.2.1 of the IEEE 802.15.4-2006 document. */ static int fake_scan_req(struct net_device *dev, u8 type, u32 channels, - u8 duration) + u8 page, u8 duration) { u8 edl[27] = {}; return ieee802154_nl_scan_confirm(dev, IEEE802154_SUCCESS, type, - channels, + channels, page, type == IEEE802154_MAC_SCAN_ED ? edl : NULL); } @@ -290,6 +310,14 @@ static const struct net_device_ops fake_ops = { .ndo_set_mac_address = ieee802154_fake_mac_addr, }; +static void ieee802154_fake_destruct(struct net_device *dev) +{ + struct wpan_phy *phy = net_to_phy(dev); + + wpan_phy_unregister(phy); + free_netdev(dev); + wpan_phy_free(phy); +} static void ieee802154_fake_setup(struct net_device *dev) { @@ -302,22 +330,34 @@ static void ieee802154_fake_setup(struct net_device *dev) dev->type = ARPHRD_IEEE802154; dev->flags = IFF_NOARP | IFF_BROADCAST; dev->watchdog_timeo = 0; + dev->destructor = ieee802154_fake_destruct; } static int __devinit ieee802154fake_probe(struct platform_device *pdev) { - struct net_device *dev = - alloc_netdev(0, "hardwpan%d", ieee802154_fake_setup); + struct net_device *dev; + struct wpan_phy *phy = wpan_phy_alloc(0); int err; - if (!dev) + if (!phy) + return -ENOMEM; + + dev = alloc_netdev(0, "hardwpan%d", ieee802154_fake_setup); + if (!dev) { + wpan_phy_free(phy); return -ENOMEM; + } + + phy->dev.platform_data = dev; memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef", dev->addr_len); memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); + phy->channels_supported = (1 << 27) - 1; + phy->transmit_power = 0xbf; + dev->netdev_ops = &fake_ops; dev->ml_priv = &fake_mlme; @@ -331,15 +371,18 @@ static int __devinit ieee802154fake_probe(struct platform_device *pdev) goto out; } - SET_NETDEV_DEV(dev, &pdev->dev); + SET_NETDEV_DEV(dev, &phy->dev); platform_set_drvdata(pdev, dev); + err = wpan_phy_register(&pdev->dev, phy); + if (err) + goto out; + err = register_netdev(dev); if (err < 0) goto out; - dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n"); return 0; @@ -352,7 +395,6 @@ static int __devexit ieee802154fake_remove(struct platform_device *pdev) { struct net_device *dev = platform_get_drvdata(pdev); unregister_netdev(dev); - free_netdev(dev); return 0; } diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 756d4b4..c4e85f6 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -59,12 +59,13 @@ #define DRV_MODULE_NAME "bnx2" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "2.0.1" -#define DRV_MODULE_RELDATE "May 6, 2009" -#define FW_MIPS_FILE_06 "bnx2/bnx2-mips-06-4.6.16.fw" -#define FW_RV2P_FILE_06 "bnx2/bnx2-rv2p-06-4.6.16.fw" -#define FW_MIPS_FILE_09 "bnx2/bnx2-mips-09-4.6.17.fw" -#define FW_RV2P_FILE_09 "bnx2/bnx2-rv2p-09-4.6.15.fw" +#define DRV_MODULE_VERSION "2.0.2" +#define DRV_MODULE_RELDATE "Aug 21, 2009" +#define FW_MIPS_FILE_06 "bnx2/bnx2-mips-06-5.0.0.j3.fw" +#define FW_RV2P_FILE_06 "bnx2/bnx2-rv2p-06-5.0.0.j3.fw" +#define FW_MIPS_FILE_09 "bnx2/bnx2-mips-09-5.0.0.j3.fw" +#define FW_RV2P_FILE_09_Ax "bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw" +#define FW_RV2P_FILE_09 "bnx2/bnx2-rv2p-09-5.0.0.j3.fw" #define RUN_AT(x) (jiffies + (x)) @@ -82,6 +83,7 @@ MODULE_FIRMWARE(FW_MIPS_FILE_06); MODULE_FIRMWARE(FW_RV2P_FILE_06); MODULE_FIRMWARE(FW_MIPS_FILE_09); MODULE_FIRMWARE(FW_RV2P_FILE_09); +MODULE_FIRMWARE(FW_RV2P_FILE_09_Ax); static int disable_msi = 0; @@ -145,7 +147,7 @@ static DEFINE_PCI_DEVICE_TABLE(bnx2_pci_tbl) = { { 0, } }; -static struct flash_spec flash_table[] = +static const struct flash_spec flash_table[] = { #define BUFFERED_FLAGS (BNX2_NV_BUFFERED | BNX2_NV_TRANSLATE) #define NONBUFFERED_FLAGS (BNX2_NV_WREN) @@ -234,7 +236,7 @@ static struct flash_spec flash_table[] = "Buffered flash (256kB)"}, }; -static struct flash_spec flash_5709 = { +static const struct flash_spec flash_5709 = { .flags = BNX2_NV_BUFFERED, .page_bits = BCM5709_FLASH_PAGE_BITS, .page_size = BCM5709_FLASH_PAGE_SIZE, @@ -619,6 +621,9 @@ bnx2_disable_int_sync(struct bnx2 *bp) int i; atomic_inc(&bp->intr_sem); + if (!netif_running(bp->dev)) + return; + bnx2_disable_int(bp); for (i = 0; i < bp->irq_nvecs; i++) synchronize_irq(bp->irq_tbl[i].vector); @@ -3618,7 +3623,11 @@ bnx2_request_firmware(struct bnx2 *bp) if (CHIP_NUM(bp) == CHIP_NUM_5709) { mips_fw_file = FW_MIPS_FILE_09; - rv2p_fw_file = FW_RV2P_FILE_09; + if ((CHIP_ID(bp) == CHIP_ID_5709_A0) || + (CHIP_ID(bp) == CHIP_ID_5709_A1)) + rv2p_fw_file = FW_RV2P_FILE_09_Ax; + else + rv2p_fw_file = FW_RV2P_FILE_09; } else { mips_fw_file = FW_MIPS_FILE_06; rv2p_fw_file = FW_RV2P_FILE_06; @@ -4224,7 +4233,7 @@ bnx2_init_nvram(struct bnx2 *bp) { u32 val; int j, entry_count, rc = 0; - struct flash_spec *flash; + const struct flash_spec *flash; if (CHIP_NUM(bp) == CHIP_NUM_5709) { bp->flash_info = &flash_5709; @@ -4858,6 +4867,7 @@ bnx2_init_chip(struct bnx2 *bp) bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG2, BNX2_RBUF_CONFIG2_VAL(mtu)); bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG3, BNX2_RBUF_CONFIG3_VAL(mtu)); + memset(bp->bnx2_napi[0].status_blk.msi, 0, bp->status_stats_size); for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) bp->bnx2_napi[i].last_status_idx = 0; @@ -4896,7 +4906,7 @@ bnx2_init_chip(struct bnx2 *bp) REG_WR(bp, BNX2_HC_CMD_TICKS, (bp->cmd_ticks_int << 16) | bp->cmd_ticks); - if (CHIP_NUM(bp) == CHIP_NUM_5708) + if (bp->flags & BNX2_FLAG_BROKEN_STATS) REG_WR(bp, BNX2_HC_STATS_TICKS, 0); else REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks); @@ -4917,7 +4927,7 @@ bnx2_init_chip(struct bnx2 *bp) } if (bp->flags & BNX2_FLAG_ONE_SHOT_MSI) - val |= BNX2_HC_CONFIG_ONE_SHOT; + val |= BNX2_HC_CONFIG_ONE_SHOT | BNX2_HC_CONFIG_USE_INT_PARAM; REG_WR(bp, BNX2_HC_CONFIG, val); @@ -6021,7 +6031,7 @@ bnx2_timer(unsigned long data) bnx2_reg_rd_ind(bp, BNX2_FW_RX_DROP_COUNT); /* workaround occasional corrupted counters */ - if (CHIP_NUM(bp) == CHIP_NUM_5708 && bp->stats_ticks) + if ((bp->flags & BNX2_FLAG_BROKEN_STATS) && bp->stats_ticks) REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_STATS_NOW); @@ -6253,9 +6263,14 @@ bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp) { struct bnx2 *bp = netdev_priv(dev); - bnx2_netif_stop(bp); + if (netif_running(dev)) + bnx2_netif_stop(bp); bp->vlgrp = vlgrp; + + if (!netif_running(dev)) + return; + bnx2_set_rx_mode(dev); if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); @@ -6476,7 +6491,8 @@ bnx2_get_stats(struct net_device *dev) stats_blk->stat_EtherStatsOverrsizePkts); net_stats->rx_over_errors = - (unsigned long) stats_blk->stat_IfInMBUFDiscards; + (unsigned long) (stats_blk->stat_IfInFTQDiscards + + stats_blk->stat_IfInMBUFDiscards); net_stats->rx_frame_errors = (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors; @@ -6509,8 +6525,8 @@ bnx2_get_stats(struct net_device *dev) net_stats->tx_carrier_errors; net_stats->rx_missed_errors = - (unsigned long) (stats_blk->stat_IfInMBUFDiscards + - stats_blk->stat_FwRxDrop); + (unsigned long) (stats_blk->stat_IfInFTQDiscards + + stats_blk->stat_IfInMBUFDiscards + stats_blk->stat_FwRxDrop); return net_stats; } @@ -6932,7 +6948,7 @@ bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal) 0xff; bp->stats_ticks = coal->stats_block_coalesce_usecs; - if (CHIP_NUM(bp) == CHIP_NUM_5708) { + if (bp->flags & BNX2_FLAG_BROKEN_STATS) { if (bp->stats_ticks != 0 && bp->stats_ticks != USEC_PER_SEC) bp->stats_ticks = USEC_PER_SEC; } @@ -6983,9 +6999,14 @@ bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx) int rc; rc = bnx2_alloc_mem(bp); - if (rc) + if (!rc) + rc = bnx2_init_nic(bp, 0); + + if (rc) { + bnx2_napi_enable(bp); + dev_close(bp->dev); return rc; - bnx2_init_nic(bp, 0); + } bnx2_netif_start(bp); } return 0; @@ -7076,11 +7097,9 @@ bnx2_set_tso(struct net_device *dev, u32 data) return 0; } -#define BNX2_NUM_STATS 46 - static struct { char string[ETH_GSTRING_LEN]; -} bnx2_stats_str_arr[BNX2_NUM_STATS] = { +} bnx2_stats_str_arr[] = { { "rx_bytes" }, { "rx_error_bytes" }, { "tx_bytes" }, @@ -7125,10 +7144,14 @@ static struct { { "tx_xoff_frames" }, { "rx_mac_ctrl_frames" }, { "rx_filtered_packets" }, + { "rx_ftq_discards" }, { "rx_discards" }, { "rx_fw_discards" }, }; +#define BNX2_NUM_STATS (sizeof(bnx2_stats_str_arr)/\ + sizeof(bnx2_stats_str_arr[0])) + #define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4) static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { @@ -7176,6 +7199,7 @@ static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { STATS_OFFSET32(stat_OutXoffSent), STATS_OFFSET32(stat_MacControlFramesReceived), STATS_OFFSET32(stat_IfInFramesL2FilterDiscards), + STATS_OFFSET32(stat_IfInFTQDiscards), STATS_OFFSET32(stat_IfInMBUFDiscards), STATS_OFFSET32(stat_FwRxDrop), }; @@ -7188,7 +7212,7 @@ static u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = { 4,0,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4, + 4,4,4,4,4,4,4, }; static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = { @@ -7196,7 +7220,7 @@ static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = { 4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4, + 4,4,4,4,4,4,4, }; #define BNX2_NUM_TESTS 6 @@ -7708,6 +7732,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) rc = -EIO; goto err_out_unmap; } + bp->flags |= BNX2_FLAG_BROKEN_STATS; } if (CHIP_NUM(bp) == CHIP_NUM_5709 && CHIP_REV(bp) != CHIP_REV_Ax) { @@ -7839,13 +7864,13 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) bp->rx_csum = 1; - bp->tx_quick_cons_trip_int = 20; + bp->tx_quick_cons_trip_int = 2; bp->tx_quick_cons_trip = 20; - bp->tx_ticks_int = 80; + bp->tx_ticks_int = 18; bp->tx_ticks = 80; - bp->rx_quick_cons_trip_int = 6; - bp->rx_quick_cons_trip = 6; + bp->rx_quick_cons_trip_int = 2; + bp->rx_quick_cons_trip = 12; bp->rx_ticks_int = 18; bp->rx_ticks = 18; diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index f1edfaa..7544188 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h @@ -6718,6 +6718,7 @@ struct bnx2 { BNX2_FLAG_USING_MSIX) #define BNX2_FLAG_JUMBO_BROKEN 0x00000800 #define BNX2_FLAG_CAN_KEEP_VLAN 0x00001000 +#define BNX2_FLAG_BROKEN_STATS 0x00002000 struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; @@ -6888,7 +6889,7 @@ struct bnx2 { int pm_cap; int pcix_cap; - struct flash_spec *flash_info; + const struct flash_spec *flash_info; u32 flash_size; int status_stats_size; diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 4798d30..7c0e0bd 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -695,6 +695,9 @@ static int bond_check_dev_link(struct bonding *bond, struct ifreq ifr; struct mii_ioctl_data *mii; + if (!reporting && !netif_running(slave_dev)) + return 0; + if (bond->params.use_carrier) return netif_carrier_ok(slave_dev) ? BMSR_LSTATUS : 0; @@ -1331,6 +1334,7 @@ static int bond_compute_features(struct bonding *bond) struct slave *slave; struct net_device *bond_dev = bond->dev; unsigned long features = bond_dev->features; + unsigned long vlan_features = 0; unsigned short max_hard_header_len = max((u16)ETH_HLEN, bond_dev->hard_header_len); int i; @@ -1343,10 +1347,14 @@ static int bond_compute_features(struct bonding *bond) features &= ~NETIF_F_ONE_FOR_ALL; + vlan_features = bond->first_slave->dev->vlan_features; bond_for_each_slave(bond, slave, i) { features = netdev_increment_features(features, slave->dev->features, NETIF_F_ONE_FOR_ALL); + vlan_features = netdev_increment_features(vlan_features, + slave->dev->vlan_features, + NETIF_F_ONE_FOR_ALL); if (slave->dev->hard_header_len > max_hard_header_len) max_hard_header_len = slave->dev->hard_header_len; } @@ -1354,6 +1362,7 @@ static int bond_compute_features(struct bonding *bond) done: features |= (bond_dev->features & BOND_VLAN_FEATURES); bond_dev->features = netdev_fix_features(features, NULL); + bond_dev->vlan_features = netdev_fix_features(vlan_features, NULL); bond_dev->hard_header_len = max_hard_header_len; return 0; @@ -1790,7 +1799,6 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) struct bonding *bond = netdev_priv(bond_dev); struct slave *slave, *oldcurrent; struct sockaddr addr; - int mac_addr_differ; /* slave is not a slave or master is not master of this slave */ if (!(slave_dev->flags & IFF_SLAVE) || @@ -1814,9 +1822,8 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) } if (!bond->params.fail_over_mac) { - mac_addr_differ = memcmp(bond_dev->dev_addr, slave->perm_hwaddr, - ETH_ALEN); - if (!mac_addr_differ && (bond->slave_cnt > 1)) + if (!compare_ether_addr(bond_dev->dev_addr, slave->perm_hwaddr) + && bond->slave_cnt > 1) pr_warning(DRV_NAME ": %s: Warning: the permanent HWaddr of %s - " "%pM - is still in use by %s. " @@ -4755,7 +4762,7 @@ static int bond_check_params(struct bond_params *params) params->ad_select = BOND_AD_STABLE; } - if (max_bonds < 0 || max_bonds > INT_MAX) { + if (max_bonds < 0) { pr_warning(DRV_NAME ": Warning: max_bonds (%d) not in range %d-%d, so it " "was reset to BOND_DEFAULT_MAX_BONDS (%d)\n", diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 4869d77..f8a0923 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c @@ -742,42 +742,34 @@ static int cnic_alloc_context(struct cnic_dev *dev) return 0; } -static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) +static int cnic_alloc_l2_rings(struct cnic_dev *dev, int pages) { struct cnic_local *cp = dev->cnic_priv; - struct uio_info *uinfo; - int ret; - - ret = cnic_alloc_dma(dev, &cp->kwq_info, KWQ_PAGE_CNT, 1); - if (ret) - goto error; - cp->kwq = (struct kwqe **) cp->kwq_info.pg_arr; - - ret = cnic_alloc_dma(dev, &cp->kcq_info, KCQ_PAGE_CNT, 1); - if (ret) - goto error; - cp->kcq = (struct kcqe **) cp->kcq_info.pg_arr; - - ret = cnic_alloc_context(dev); - if (ret) - goto error; - cp->l2_ring_size = 2 * BCM_PAGE_SIZE; + cp->l2_ring_size = pages * BCM_PAGE_SIZE; cp->l2_ring = pci_alloc_consistent(dev->pcidev, cp->l2_ring_size, &cp->l2_ring_map); if (!cp->l2_ring) - goto error; + return -ENOMEM; cp->l2_buf_size = (cp->l2_rx_ring_size + 1) * cp->l2_single_buf_size; cp->l2_buf_size = PAGE_ALIGN(cp->l2_buf_size); cp->l2_buf = pci_alloc_consistent(dev->pcidev, cp->l2_buf_size, &cp->l2_buf_map); if (!cp->l2_buf) - goto error; + return -ENOMEM; + + return 0; +} + +static int cnic_alloc_uio(struct cnic_dev *dev) { + struct cnic_local *cp = dev->cnic_priv; + struct uio_info *uinfo; + int ret; uinfo = kzalloc(sizeof(*uinfo), GFP_ATOMIC); if (!uinfo) - goto error; + return -ENOMEM; uinfo->mem[0].addr = dev->netdev->base_addr; uinfo->mem[0].internal_addr = dev->regview; @@ -785,10 +777,15 @@ static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) uinfo->mem[0].memtype = UIO_MEM_PHYS; uinfo->mem[1].addr = (unsigned long) cp->status_blk & PAGE_MASK; - if (cp->ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) - uinfo->mem[1].size = BNX2_SBLK_MSIX_ALIGN_SIZE * 9; - else - uinfo->mem[1].size = BNX2_SBLK_MSIX_ALIGN_SIZE; + if (test_bit(CNIC_F_BNX2_CLASS, &dev->flags)) { + if (cp->ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) + uinfo->mem[1].size = BNX2_SBLK_MSIX_ALIGN_SIZE * 9; + else + uinfo->mem[1].size = BNX2_SBLK_MSIX_ALIGN_SIZE; + + uinfo->name = "bnx2_cnic"; + } + uinfo->mem[1].memtype = UIO_MEM_LOGICAL; uinfo->mem[2].addr = (unsigned long) cp->l2_ring; @@ -799,7 +796,6 @@ static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) uinfo->mem[3].size = cp->l2_buf_size; uinfo->mem[3].memtype = UIO_MEM_LOGICAL; - uinfo->name = "bnx2_cnic"; uinfo->version = CNIC_MODULE_VERSION; uinfo->irq = UIO_IRQ_CUSTOM; @@ -811,10 +807,39 @@ static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) ret = uio_register_device(&dev->pcidev->dev, uinfo); if (ret) { kfree(uinfo); - goto error; + return ret; } cp->cnic_uinfo = uinfo; + return 0; +} + +static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int ret; + + ret = cnic_alloc_dma(dev, &cp->kwq_info, KWQ_PAGE_CNT, 1); + if (ret) + goto error; + cp->kwq = (struct kwqe **) cp->kwq_info.pg_arr; + + ret = cnic_alloc_dma(dev, &cp->kcq_info, KCQ_PAGE_CNT, 1); + if (ret) + goto error; + cp->kcq = (struct kcqe **) cp->kcq_info.pg_arr; + + ret = cnic_alloc_context(dev); + if (ret) + goto error; + + ret = cnic_alloc_l2_rings(dev, 2); + if (ret) + goto error; + + ret = cnic_alloc_uio(dev); + if (ret) + goto error; return 0; diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 12fd446..5e6652b 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c @@ -2817,7 +2817,7 @@ static int __init davinci_emac_init(void) { return platform_driver_register(&davinci_emac_driver); } -module_init(davinci_emac_init); +late_initcall(davinci_emac_init); /** * davinci_emac_exit: EMAC driver module exit diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 1e5ae11..cda6b39 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c @@ -5759,52 +5759,6 @@ u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) } /****************************************************************************** - * Sets the bit in the multicast table corresponding to the hash value. - * - * hw - Struct containing variables accessed by shared code - * hash_value - Multicast address hash value - *****************************************************************************/ -void e1000_mta_set(struct e1000_hw *hw, u32 hash_value) -{ - u32 hash_bit, hash_reg; - u32 mta; - u32 temp; - - /* The MTA is a register array of 128 32-bit registers. - * It is treated like an array of 4096 bits. We want to set - * bit BitArray[hash_value]. So we figure out what register - * the bit is in, read it, OR in the new bit, then write - * back the new value. The register is determined by the - * upper 7 bits of the hash value and the bit within that - * register are determined by the lower 5 bits of the value. - */ - hash_reg = (hash_value >> 5) & 0x7F; - if (hw->mac_type == e1000_ich8lan) - hash_reg &= 0x1F; - - hash_bit = hash_value & 0x1F; - - mta = E1000_READ_REG_ARRAY(hw, MTA, hash_reg); - - mta |= (1 << hash_bit); - - /* If we are on an 82544 and we are trying to write an odd offset - * in the MTA, save off the previous entry before writing and - * restore the old value after writing. - */ - if ((hw->mac_type == e1000_82544) && ((hash_reg & 0x1) == 1)) { - temp = E1000_READ_REG_ARRAY(hw, MTA, (hash_reg - 1)); - E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta); - E1000_WRITE_FLUSH(); - E1000_WRITE_REG_ARRAY(hw, MTA, (hash_reg - 1), temp); - E1000_WRITE_FLUSH(); - } else { - E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta); - E1000_WRITE_FLUSH(); - } -} - -/****************************************************************************** * Puts an ethernet address into a receive address register. * * hw - Struct containing variables accessed by shared code diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index fb32735..cef4289 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c @@ -1380,6 +1380,7 @@ static int __devinit igb_probe(struct pci_dev *pdev, netdev->vlan_features |= NETIF_F_TSO; netdev->vlan_features |= NETIF_F_TSO6; netdev->vlan_features |= NETIF_F_IP_CSUM; + netdev->vlan_features |= NETIF_F_IPV6_CSUM; netdev->vlan_features |= NETIF_F_SG; if (pci_using_dac) diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 8f1f8ba..c983c89 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h @@ -424,55 +424,20 @@ extern s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc); extern s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, struct ixgbe_atr_input *input, u8 queue); -extern s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, - struct ixgbe_atr_input *input, - u16 soft_id, - u8 queue); -extern u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *input, u32 key); extern s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, u16 vlan_id); extern s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, u32 src_addr); extern s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 dst_addr); -extern s32 ixgbe_atr_set_src_ipv6_82599(struct ixgbe_atr_input *input, - u32 src_addr_1, u32 src_addr_2, - u32 src_addr_3, u32 src_addr_4); -extern s32 ixgbe_atr_set_dst_ipv6_82599(struct ixgbe_atr_input *input, - u32 dst_addr_1, u32 dst_addr_2, - u32 dst_addr_3, u32 dst_addr_4); extern s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, u16 src_port); extern s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, u16 dst_port); extern s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte); -extern s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, - u8 vm_pool); extern s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type); -extern s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, - u16 *vlan_id); -extern s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, - u32 *src_addr); -extern s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, - u32 *dst_addr); -extern s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, - u32 *src_addr_1, u32 *src_addr_2, - u32 *src_addr_3, u32 *src_addr_4); -extern s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, - u32 *dst_addr_1, u32 *dst_addr_2, - u32 *dst_addr_3, u32 *dst_addr_4); -extern s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, - u16 *src_port); -extern s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, - u16 *dst_port); -extern s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, - u16 *flex_byte); -extern s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, - u8 *vm_pool); -extern s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, - u8 *l4type); #ifdef IXGBE_FCOE extern void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter); extern int ixgbe_fso(struct ixgbe_adapter *adapter, diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c index 1c227b0..916430f2 100644 --- a/drivers/net/ixgbe/ixgbe_82598.c +++ b/drivers/net/ixgbe/ixgbe_82598.c @@ -59,7 +59,7 @@ static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, * increase the value to either 10ms to 250ms for capability version 1 config, * or 16ms to 55ms for version 2. **/ -void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw) +static void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw) { struct ixgbe_adapter *adapter = hw->back; u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR); @@ -143,7 +143,7 @@ static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) * not known. Perform the SFP init if necessary. * **/ -s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw) +static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw) { struct ixgbe_mac_info *mac = &hw->mac; struct ixgbe_phy_info *phy = &hw->phy; @@ -204,7 +204,7 @@ out: * Starts the hardware using the generic start_hw function. * Then set pcie completion timeout **/ -s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) +static s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) { s32 ret_val = 0; diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index 1984cab..364b6d2 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c @@ -38,22 +38,15 @@ #define IXGBE_82599_MC_TBL_SIZE 128 #define IXGBE_82599_VFT_TBL_SIZE 128 -s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, - ixgbe_link_speed *speed, - bool *autoneg); -enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw); -s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw); -s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, +static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw); +static s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); -s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw); -s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, - ixgbe_link_speed *speed, - bool *link_up, bool link_up_wait_to_complete); -s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, - ixgbe_link_speed speed, - bool autoneg, - bool autoneg_wait_to_complete); +static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw); +static s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, + ixgbe_link_speed speed, + bool autoneg, + bool autoneg_wait_to_complete); static s32 ixgbe_get_copper_link_capabilities_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *autoneg); @@ -62,21 +55,9 @@ static s32 ixgbe_setup_copper_link_speed_82599(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); -s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw); -s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq); -s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq); -s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, - u32 vind, bool vlan_on); -s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw); -s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw); -s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val); -s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val); -s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw); -s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw); -u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw); static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw); -void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) +static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) { struct ixgbe_mac_info *mac = &hw->mac; if (hw->phy.multispeed_fiber) { @@ -93,7 +74,7 @@ void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) } } -s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw) +static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw) { s32 ret_val = 0; u16 list_offset, data_offset, data_value; @@ -143,7 +124,7 @@ setup_sfp_out: * Read PCIe configuration space, and get the MSI-X vector count from * the capabilities table. **/ -u32 ixgbe_get_pcie_msix_count_82599(struct ixgbe_hw *hw) +static u32 ixgbe_get_pcie_msix_count_82599(struct ixgbe_hw *hw) { struct ixgbe_adapter *adapter = hw->back; u16 msix_count; @@ -182,7 +163,7 @@ static s32 ixgbe_get_invariants_82599(struct ixgbe_hw *hw) * not known. Perform the SFP init if necessary. * **/ -s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) +static s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) { struct ixgbe_mac_info *mac = &hw->mac; struct ixgbe_phy_info *phy = &hw->phy; @@ -225,9 +206,9 @@ s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) * * Determines the link capabilities by reading the AUTOC register. **/ -s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, - ixgbe_link_speed *speed, - bool *negotiation) +static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, + ixgbe_link_speed *speed, + bool *negotiation) { s32 status = 0; u32 autoc = 0; @@ -344,7 +325,7 @@ static s32 ixgbe_get_copper_link_capabilities_82599(struct ixgbe_hw *hw, * * Returns the media type (fiber, copper, backplane) **/ -enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) +static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) { enum ixgbe_media_type media_type; @@ -379,7 +360,7 @@ out: * Configures link settings based on values in the ixgbe_hw struct. * Restarts the link. Performs autonegotiation if needed. **/ -s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) +static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) { u32 autoc_reg; u32 links_reg; @@ -428,7 +409,7 @@ s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) * fails at 10G. * Performs autonegotiation if needed. **/ -s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw) +static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw) { s32 status = 0; ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_82599_AUTONEG; @@ -446,7 +427,7 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw) * * Set the link speed in the AUTOC register and restarts link. **/ -s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, +static s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) @@ -613,8 +594,10 @@ out: * * Reads the links register to determine if link is up and the current speed **/ -s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, - bool *link_up, bool link_up_wait_to_complete) +static s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, + ixgbe_link_speed *speed, + bool *link_up, + bool link_up_wait_to_complete) { u32 links_reg; u32 i; @@ -665,9 +648,10 @@ s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, * * Set the link speed in the AUTOC register and restarts link. **/ -s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, - ixgbe_link_speed speed, bool autoneg, - bool autoneg_wait_to_complete) +static s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, + ixgbe_link_speed speed, + bool autoneg, + bool autoneg_wait_to_complete) { s32 status = 0; u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); @@ -818,7 +802,7 @@ static s32 ixgbe_setup_copper_link_speed_82599(struct ixgbe_hw *hw, * and clears all interrupts, perform a PHY reset, and perform a link (MAC) * reset. **/ -s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) +static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) { s32 status = 0; u32 ctrl, ctrl_ext; @@ -943,7 +927,7 @@ reset_hw_out: * @rar: receive address register index to disassociate * @vmdq: VMDq pool index to remove from the rar **/ -s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) +static s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) { u32 mpsar_lo, mpsar_hi; u32 rar_entries = hw->mac.num_rar_entries; @@ -989,7 +973,7 @@ done: * @rar: receive address register index to associate with a VMDq index * @vmdq: VMDq pool index **/ -s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) +static s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) { u32 mpsar; u32 rar_entries = hw->mac.num_rar_entries; @@ -1019,8 +1003,8 @@ s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) * * Turn on/off specified VLAN in the VLAN filter table. **/ -s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, u32 vind, - bool vlan_on) +static s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, u32 vind, + bool vlan_on) { u32 regindex; u32 bitindex; @@ -1133,7 +1117,7 @@ out: * * Clears the VLAN filer table, and the VMDq index associated with the filter **/ -s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw) +static s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw) { u32 offset; @@ -1153,7 +1137,7 @@ s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw) * ixgbe_init_uta_tables_82599 - Initialize the Unicast Table Array * @hw: pointer to hardware structure **/ -s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw) +static s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw) { int i; hw_dbg(hw, " Clearing UTA\n"); @@ -1430,7 +1414,8 @@ s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc) * @stream: input bitstream to compute the hash on * @key: 32-bit hash key **/ -u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, u32 key) +static u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, + u32 key) { /* * The algorithm is as follows: @@ -1602,8 +1587,8 @@ s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 dst_addr) * @src_addr_4: the fourth 4 bytes of the IP address to load **/ s32 ixgbe_atr_set_src_ipv6_82599(struct ixgbe_atr_input *input, - u32 src_addr_1, u32 src_addr_2, - u32 src_addr_3, u32 src_addr_4) + u32 src_addr_1, u32 src_addr_2, + u32 src_addr_3, u32 src_addr_4) { input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET] = src_addr_4 & 0xff; input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 1] = @@ -1645,8 +1630,8 @@ s32 ixgbe_atr_set_src_ipv6_82599(struct ixgbe_atr_input *input, * @dst_addr_4: the fourth 4 bytes of the IP address to load **/ s32 ixgbe_atr_set_dst_ipv6_82599(struct ixgbe_atr_input *input, - u32 dst_addr_1, u32 dst_addr_2, - u32 dst_addr_3, u32 dst_addr_4) + u32 dst_addr_1, u32 dst_addr_2, + u32 dst_addr_3, u32 dst_addr_4) { input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET] = dst_addr_4 & 0xff; input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 1] = @@ -1723,7 +1708,8 @@ s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte) * @input: input stream to modify * @vm_pool: the Virtual Machine pool to load **/ -s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, u8 vm_pool) +s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, + u8 vm_pool) { input->byte_stream[IXGBE_ATR_VM_POOL_OFFSET] = vm_pool; @@ -1747,7 +1733,8 @@ s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type) * @input: input stream to search * @vlan: the VLAN id to load **/ -s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan) +static s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, + u16 *vlan) { *vlan = input->byte_stream[IXGBE_ATR_VLAN_OFFSET]; *vlan |= input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] << 8; @@ -1760,7 +1747,8 @@ s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan) * @input: input stream to search * @src_addr: the IP address to load **/ -s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, u32 *src_addr) +static s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, + u32 *src_addr) { *src_addr = input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET]; *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 1] << 8; @@ -1775,7 +1763,8 @@ s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, u32 *src_addr) * @input: input stream to search * @dst_addr: the IP address to load **/ -s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 *dst_addr) +static s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, + u32 *dst_addr) { *dst_addr = input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET]; *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 1] << 8; @@ -1793,9 +1782,9 @@ s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 *dst_addr) * @src_addr_3: the third 4 bytes of the IP address to load * @src_addr_4: the fourth 4 bytes of the IP address to load **/ -s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, - u32 *src_addr_1, u32 *src_addr_2, - u32 *src_addr_3, u32 *src_addr_4) +static s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, + u32 *src_addr_1, u32 *src_addr_2, + u32 *src_addr_3, u32 *src_addr_4) { *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 12]; *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 13] << 8; @@ -1829,8 +1818,8 @@ s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, * @dst_addr_4: the fourth 4 bytes of the IP address to load **/ s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, - u32 *dst_addr_1, u32 *dst_addr_2, - u32 *dst_addr_3, u32 *dst_addr_4) + u32 *dst_addr_1, u32 *dst_addr_2, + u32 *dst_addr_3, u32 *dst_addr_4) { *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 12]; *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 13] << 8; @@ -1865,7 +1854,8 @@ s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, * endianness when retrieving the data. This can be confusing since the * internal hash engine expects it to be big-endian. **/ -s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, u16 *src_port) +static s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, + u16 *src_port) { *src_port = input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] << 8; *src_port |= input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1]; @@ -1883,7 +1873,8 @@ s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, u16 *src_port) * endianness when retrieving the data. This can be confusing since the * internal hash engine expects it to be big-endian. **/ -s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, u16 *dst_port) +static s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, + u16 *dst_port) { *dst_port = input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] << 8; *dst_port |= input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1]; @@ -1896,7 +1887,8 @@ s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, u16 *dst_port) * @input: input stream to modify * @flex_bytes: the flexible bytes to load **/ -s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, u16 *flex_byte) +static s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, + u16 *flex_byte) { *flex_byte = input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET]; *flex_byte |= input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] << 8; @@ -1909,7 +1901,8 @@ s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, u16 *flex_byte) * @input: input stream to modify * @vm_pool: the Virtual Machine pool to load **/ -s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, u8 *vm_pool) +s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, + u8 *vm_pool) { *vm_pool = input->byte_stream[IXGBE_ATR_VM_POOL_OFFSET]; @@ -1921,7 +1914,8 @@ s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, u8 *vm_pool) * @input: input stream to modify * @l4type: the layer 4 type value to load **/ -s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, u8 *l4type) +static s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, + u8 *l4type) { *l4type = input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET]; @@ -2002,9 +1996,9 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, * hardware writes must be protected from one another. **/ s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, - struct ixgbe_atr_input *input, - u16 soft_id, - u8 queue) + struct ixgbe_atr_input *input, + u16 soft_id, + u8 queue) { u32 fdircmd = 0; u32 fdirhash; @@ -2097,7 +2091,7 @@ s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, * * Performs read operation to Omer analog register specified. **/ -s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val) +static s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val) { u32 core_ctl; @@ -2119,7 +2113,7 @@ s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val) * * Performs write operation to Omer analog register specified. **/ -s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) +static s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) { u32 core_ctl; @@ -2139,7 +2133,7 @@ s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) * Then performs device-specific: * Clears the rate limiter registers. **/ -s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw) +static s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw) { u32 q_num; s32 ret_val; @@ -2168,7 +2162,7 @@ s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw) * * Determines the physical layer module found on the current adapter. **/ -s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw) +static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw) { s32 status = IXGBE_ERR_PHY_ADDR_INVALID; status = ixgbe_identify_phy_generic(hw); @@ -2183,7 +2177,7 @@ s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw) * * Determines physical layer capabilities of the current configuration. **/ -u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw) +static u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw) { u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); @@ -2290,7 +2284,7 @@ out: * * Enables the Rx DMA unit for 82599 **/ -s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) +static s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) { #define IXGBE_MAX_SECRX_POLL 30 int i; @@ -2335,7 +2329,7 @@ s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) * This function will read the EEPROM location for the device capabilities, * and return the word through device_caps. **/ -s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps) +static s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps) { hw->eeprom.ops.read(hw, IXGBE_DEVICE_CAPS, device_caps); @@ -2351,8 +2345,8 @@ s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps) * pointer, and returns the value at that location. This is used in both * get and set mac_addr routines. **/ -s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, - u16 *san_mac_offset) +static s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, + u16 *san_mac_offset) { /* * First read the EEPROM pointer to see if the MAC addresses are @@ -2373,7 +2367,7 @@ s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, * set_lan_id() is called by identify_sfp(), but this cannot be relied * upon for non-SFP connections, so we must call it here. **/ -s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr) +static s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr) { u16 san_mac_data, san_mac_offset; u8 i; diff --git a/drivers/net/ixgbe/ixgbe_common.c b/drivers/net/ixgbe/ixgbe_common.c index 96a1859..6621e17 100644 --- a/drivers/net/ixgbe/ixgbe_common.c +++ b/drivers/net/ixgbe/ixgbe_common.c @@ -53,6 +53,7 @@ static void ixgbe_enable_rar(struct ixgbe_hw *hw, u32 index); static void ixgbe_disable_rar(struct ixgbe_hw *hw, u32 index); static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr); static void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); +static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num); /** * ixgbe_start_hw_generic - Prepare hardware for Tx/Rx @@ -1815,7 +1816,7 @@ out: * * Called at init time to set up flow control. **/ -s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) +static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) { s32 ret_val = 0; u32 reg; diff --git a/drivers/net/ixgbe/ixgbe_common.h b/drivers/net/ixgbe/ixgbe_common.h index 0d34d4d..27f3214 100644 --- a/drivers/net/ixgbe/ixgbe_common.h +++ b/drivers/net/ixgbe/ixgbe_common.h @@ -64,7 +64,6 @@ s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw); s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw); s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval); -s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num); s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packtetbuf_num); s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw); diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index dd221bb..1444ec5 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c @@ -169,23 +169,20 @@ static int ixgbe_get_settings(struct net_device *netdev, } } else if (hw->phy.media_type == ixgbe_media_type_backplane) { /* Set as FIBRE until SERDES defined in kernel */ - switch (hw->device_id) { - case IXGBE_DEV_ID_82598: - ecmd->supported |= (SUPPORTED_1000baseT_Full | - SUPPORTED_FIBRE); - ecmd->advertising = (ADVERTISED_10000baseT_Full | - ADVERTISED_1000baseT_Full | - ADVERTISED_FIBRE); - ecmd->port = PORT_FIBRE; - break; - case IXGBE_DEV_ID_82598_BX: + if (hw->device_id == IXGBE_DEV_ID_82598_BX) { ecmd->supported = (SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE); ecmd->advertising = (ADVERTISED_1000baseT_Full | ADVERTISED_FIBRE); ecmd->port = PORT_FIBRE; ecmd->autoneg = AUTONEG_DISABLE; - break; + } else { + ecmd->supported |= (SUPPORTED_1000baseT_Full | + SUPPORTED_FIBRE); + ecmd->advertising = (ADVERTISED_10000baseT_Full | + ADVERTISED_1000baseT_Full | + ADVERTISED_FIBRE); + ecmd->port = PORT_FIBRE; } } else { ecmd->supported |= SUPPORTED_FIBRE; diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index d69d277..0bea096 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c @@ -3615,7 +3615,7 @@ static void ixgbe_free_q_vectors(struct ixgbe_adapter *adapter) } } -void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) +static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) { if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; @@ -5575,6 +5575,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, netdev->vlan_features |= NETIF_F_TSO; netdev->vlan_features |= NETIF_F_TSO6; netdev->vlan_features |= NETIF_F_IP_CSUM; + netdev->vlan_features |= NETIF_F_IPV6_CSUM; netdev->vlan_features |= NETIF_F_SG; if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) diff --git a/drivers/net/mdio.c b/drivers/net/mdio.c index 6851bdb..7d2e610 100644 --- a/drivers/net/mdio.c +++ b/drivers/net/mdio.c @@ -109,13 +109,20 @@ int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmd_mask) if (mmd_mask & (1 << devad)) { mmd_mask &= ~(1 << devad); - /* Read twice because link state is latched and a - * read moves the current state into the register */ + /* Reset the latched status and fault flags */ mdio->mdio_read(mdio->dev, mdio->prtad, devad, MDIO_STAT1); + if (devad == MDIO_MMD_PMAPMD || devad == MDIO_MMD_PCS || + devad == MDIO_MMD_PHYXS || devad == MDIO_MMD_DTEXS) + mdio->mdio_read(mdio->dev, mdio->prtad, + devad, MDIO_STAT2); + + /* Check the current status and fault flags */ reg = mdio->mdio_read(mdio->dev, mdio->prtad, devad, MDIO_STAT1); - if (reg < 0 || !(reg & MDIO_STAT1_LSTATUS)) + if (reg < 0 || + (reg & (MDIO_STAT1_FAULT | MDIO_STAT1_LSTATUS)) != + MDIO_STAT1_LSTATUS) return false; } } diff --git a/drivers/net/netxen/Makefile b/drivers/net/netxen/Makefile index cf01a91..a70b682 100644 --- a/drivers/net/netxen/Makefile +++ b/drivers/net/netxen/Makefile @@ -31,4 +31,4 @@ obj-$(CONFIG_NETXEN_NIC) := netxen_nic.o netxen_nic-y := netxen_nic_hw.o netxen_nic_main.o netxen_nic_init.o \ - netxen_nic_ethtool.o netxen_nic_niu.o netxen_nic_ctx.o + netxen_nic_ethtool.o netxen_nic_ctx.o diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 5abb41e..449d351 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h @@ -53,6 +53,7 @@ #include <asm/io.h> #include <asm/byteorder.h> +#include "netxen_nic_hdr.h" #include "netxen_nic_hw.h" #define _NETXEN_NIC_LINUX_MAJOR 4 @@ -227,8 +228,6 @@ #define MPORT_SINGLE_FUNCTION_MODE 0x1111 #define MPORT_MULTI_FUNCTION_MODE 0x2222 -#include "netxen_nic_phan_reg.h" - /* * NetXen host-peg signal message structure * @@ -503,17 +502,11 @@ struct netxen_skb_frag { u64 length; }; -#define _netxen_set_bits(config_word, start, bits, val) {\ - unsigned long long __tmask = (((1ULL << (bits)) - 1) << (start));\ - unsigned long long __tvalue = (val); \ - (config_word) &= ~__tmask; \ - (config_word) |= (((__tvalue) << (start)) & __tmask); \ -} - -#define _netxen_clear_bits(config_word, start, bits) {\ - unsigned long long __tmask = (((1ULL << (bits)) - 1) << (start)); \ - (config_word) &= ~__tmask; \ -} +struct netxen_recv_crb { + u32 crb_rcv_producer[NUM_RCV_DESC_RINGS]; + u32 crb_sts_consumer[NUM_STS_DESC_RINGS]; + u32 sw_int_mask[NUM_STS_DESC_RINGS]; +}; /* Following defines are for the state of the buffers */ #define NETXEN_BUFFER_FREE 0 @@ -576,7 +569,8 @@ struct netxen_adapter_stats { u64 rxdropped; u64 txdropped; u64 csummed; - u64 no_rcv; + u64 rx_pkts; + u64 lro_pkts; u64 rxbytes; u64 txbytes; }; @@ -690,7 +684,19 @@ struct netxen_recv_context { #define NX_CDRP_CMD_GET_STATISTICS 0x0000000f #define NX_CDRP_CMD_DELETE_STATISTICS 0x00000010 #define NX_CDRP_CMD_SET_MTU 0x00000012 -#define NX_CDRP_CMD_MAX 0x00000013 +#define NX_CDRP_CMD_READ_PHY 0x00000013 +#define NX_CDRP_CMD_WRITE_PHY 0x00000014 +#define NX_CDRP_CMD_READ_HW_REG 0x00000015 +#define NX_CDRP_CMD_GET_FLOW_CTL 0x00000016 +#define NX_CDRP_CMD_SET_FLOW_CTL 0x00000017 +#define NX_CDRP_CMD_READ_MAX_MTU 0x00000018 +#define NX_CDRP_CMD_READ_MAX_LRO 0x00000019 +#define NX_CDRP_CMD_CONFIGURE_TOE 0x0000001a +#define NX_CDRP_CMD_FUNC_ATTRIB 0x0000001b +#define NX_CDRP_CMD_READ_PEXQ_PARAMETERS 0x0000001c +#define NX_CDRP_CMD_GET_LIC_CAPABILITIES 0x0000001d +#define NX_CDRP_CMD_READ_MAX_LRO_PER_BOARD 0x0000001e +#define NX_CDRP_CMD_MAX 0x0000001f #define NX_RCODE_SUCCESS 0 #define NX_RCODE_NO_HOST_MEM 1 @@ -958,7 +964,9 @@ typedef struct { #define NX_NIC_H2C_OPCODE_PROXY_STOP_DONE 20 #define NX_NIC_H2C_OPCODE_GET_LINKEVENT 21 #define NX_NIC_C2C_OPCODE 22 -#define NX_NIC_H2C_OPCODE_LAST 23 +#define NX_NIC_H2C_OPCODE_CONFIG_BRIDGING 23 +#define NX_NIC_H2C_OPCODE_CONFIG_HW_LRO 24 +#define NX_NIC_H2C_OPCODE_LAST 25 /* * Firmware --> Driver @@ -984,6 +992,19 @@ typedef struct { #define VPORT_MISS_MODE_ACCEPT_ALL 1 /* accept all packets */ #define VPORT_MISS_MODE_ACCEPT_MULTI 2 /* accept unmatched multicast */ +#define NX_NIC_LRO_REQUEST_FIRST 0 +#define NX_NIC_LRO_REQUEST_ADD_FLOW 1 +#define NX_NIC_LRO_REQUEST_DELETE_FLOW 2 +#define NX_NIC_LRO_REQUEST_TIMER 3 +#define NX_NIC_LRO_REQUEST_CLEANUP 4 +#define NX_NIC_LRO_REQUEST_ADD_FLOW_SCHEDULED 5 +#define NX_TOE_LRO_REQUEST_ADD_FLOW 6 +#define NX_TOE_LRO_REQUEST_ADD_FLOW_RESPONSE 7 +#define NX_TOE_LRO_REQUEST_DELETE_FLOW 8 +#define NX_TOE_LRO_REQUEST_DELETE_FLOW_RESPONSE 9 +#define NX_TOE_LRO_REQUEST_TIMER 10 +#define NX_NIC_LRO_REQUEST_LAST 11 + #define NX_FW_CAPABILITY_LINK_NOTIFICATION (1 << 5) #define NX_FW_CAPABILITY_SWITCHING (1 << 6) #define NX_FW_CAPABILITY_PEXQ (1 << 7) @@ -1064,6 +1085,8 @@ typedef struct { #define NETXEN_NIC_MSI_ENABLED 0x02 #define NETXEN_NIC_MSIX_ENABLED 0x04 +#define NETXEN_NIC_LRO_ENABLED 0x08 +#define NETXEN_NIC_BRIDGE_ENABLED 0X10 #define NETXEN_IS_MSI_FAMILY(adapter) \ ((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED)) @@ -1139,14 +1162,12 @@ struct netxen_adapter { struct netxen_recv_context recv_ctx; struct nx_host_tx_ring *tx_ring; - int (*enable_phy_interrupts) (struct netxen_adapter *); - int (*disable_phy_interrupts) (struct netxen_adapter *); int (*macaddr_set) (struct netxen_adapter *, u8 *); int (*set_mtu) (struct netxen_adapter *, int); int (*set_promisc) (struct netxen_adapter *, u32); void (*set_multi) (struct net_device *); - int (*phy_read) (struct netxen_adapter *, long reg, u32 *); - int (*phy_write) (struct netxen_adapter *, long reg, u32 val); + int (*phy_read) (struct netxen_adapter *, u32 reg, u32 *); + int (*phy_write) (struct netxen_adapter *, u32 reg, u32 val); int (*init_port) (struct netxen_adapter *, int); int (*stop_port) (struct netxen_adapter *); @@ -1178,14 +1199,11 @@ struct netxen_adapter { const struct firmware *fw; }; -int netxen_niu_xgbe_enable_phy_interrupts(struct netxen_adapter *adapter); -int netxen_niu_gbe_enable_phy_interrupts(struct netxen_adapter *adapter); -int netxen_niu_xgbe_disable_phy_interrupts(struct netxen_adapter *adapter); -int netxen_niu_gbe_disable_phy_interrupts(struct netxen_adapter *adapter); -int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg, - __u32 * readval); -int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, - long reg, __u32 val); +int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port); +int netxen_niu_disable_xg_port(struct netxen_adapter *adapter); + +int nx_fw_cmd_query_phy(struct netxen_adapter *adapter, u32 reg, u32 *val); +int nx_fw_cmd_set_phy(struct netxen_adapter *adapter, u32 reg, u32 val); /* Functions available from netxen_nic_hw.c */ int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu); @@ -1199,6 +1217,30 @@ int netxen_p3_nic_set_mac_addr(struct netxen_adapter *adapter, u8 *addr); #define NXWR32(adapter, off, val) \ (adapter->hw_write_wx(adapter, off, val)) +int netxen_pcie_sem_lock(struct netxen_adapter *, int, u32); +void netxen_pcie_sem_unlock(struct netxen_adapter *, int); + +#define netxen_rom_lock(a) \ + netxen_pcie_sem_lock((a), 2, NETXEN_ROM_LOCK_ID) +#define netxen_rom_unlock(a) \ + netxen_pcie_sem_unlock((a), 2) +#define netxen_phy_lock(a) \ + netxen_pcie_sem_lock((a), 3, NETXEN_PHY_LOCK_ID) +#define netxen_phy_unlock(a) \ + netxen_pcie_sem_unlock((a), 3) +#define netxen_api_lock(a) \ + netxen_pcie_sem_lock((a), 5, 0) +#define netxen_api_unlock(a) \ + netxen_pcie_sem_unlock((a), 5) +#define netxen_sw_lock(a) \ + netxen_pcie_sem_lock((a), 6, 0) +#define netxen_sw_unlock(a) \ + netxen_pcie_sem_unlock((a), 6) +#define crb_win_lock(a) \ + netxen_pcie_sem_lock((a), 7, NETXEN_CRB_WIN_LOCK_ID) +#define crb_win_unlock(a) \ + netxen_pcie_sem_unlock((a), 7) + int netxen_nic_get_board_info(struct netxen_adapter *adapter); void netxen_nic_get_firmware_info(struct netxen_adapter *adapter); int netxen_nic_wol_supported(struct netxen_adapter *adapter); @@ -1281,6 +1323,7 @@ int netxen_process_rcv_ring(struct nx_host_sds_ring *sds_ring, int max); void netxen_p2_nic_set_multi(struct net_device *netdev); void netxen_p3_nic_set_multi(struct net_device *netdev); void netxen_p3_free_mac_list(struct netxen_adapter *adapter); +int netxen_p2_nic_set_promisc(struct netxen_adapter *adapter, u32 mode); int netxen_p3_nic_set_promisc(struct netxen_adapter *adapter, u32); int netxen_config_intr_coalesce(struct netxen_adapter *adapter); int netxen_config_rss(struct netxen_adapter *adapter, int enable); @@ -1290,6 +1333,9 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup); int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu); int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu); +int netxen_config_hw_lro(struct netxen_adapter *adapter, int enable); +int netxen_config_bridged_mode(struct netxen_adapter *adapter, int enable); +int netxen_send_lro_cleanup(struct netxen_adapter *adapter); int netxen_nic_set_mac(struct net_device *netdev, void *p); struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev); diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c index 412d658..0f42ab9 100644 --- a/drivers/net/netxen/netxen_nic_ctx.c +++ b/drivers/net/netxen/netxen_nic_ctx.c @@ -30,45 +30,9 @@ #include "netxen_nic_hw.h" #include "netxen_nic.h" -#include "netxen_nic_phan_reg.h" #define NXHAL_VERSION 1 -static int -netxen_api_lock(struct netxen_adapter *adapter) -{ - u32 done = 0, timeout = 0; - - for (;;) { - /* Acquire PCIE HW semaphore5 */ - done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM5_LOCK)); - - if (done == 1) - break; - - if (++timeout >= NX_OS_CRB_RETRY_COUNT) { - printk(KERN_ERR "%s: lock timeout.\n", __func__); - return -1; - } - - msleep(1); - } - -#if 0 - NXWR32(adapter, - NETXEN_API_LOCK_ID, NX_OS_API_LOCK_DRIVER); -#endif - return 0; -} - -static int -netxen_api_unlock(struct netxen_adapter *adapter) -{ - /* Release PCIE HW semaphore5 */ - NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM5_UNLOCK)); - return 0; -} - static u32 netxen_poll_rsp(struct netxen_adapter *adapter) { @@ -203,8 +167,6 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter) cap = (NX_CAP0_LEGACY_CONTEXT | NX_CAP0_LEGACY_MN); cap |= (NX_CAP0_JUMBO_CONTIGUOUS | NX_CAP0_LRO_CONTIGUOUS); - if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO) - cap |= NX_CAP0_HW_LRO; prq->capabilities[0] = cpu_to_le32(cap); prq->host_int_crb_mode = @@ -418,6 +380,44 @@ nx_fw_cmd_destroy_tx_ctx(struct netxen_adapter *adapter) } } +int +nx_fw_cmd_query_phy(struct netxen_adapter *adapter, u32 reg, u32 *val) +{ + u32 rcode; + + rcode = netxen_issue_cmd(adapter, + adapter->ahw.pci_func, + NXHAL_VERSION, + reg, + 0, + 0, + NX_CDRP_CMD_READ_PHY); + + if (rcode != NX_RCODE_SUCCESS) + return -EIO; + + return NXRD32(adapter, NX_ARG1_CRB_OFFSET); +} + +int +nx_fw_cmd_set_phy(struct netxen_adapter *adapter, u32 reg, u32 val) +{ + u32 rcode; + + rcode = netxen_issue_cmd(adapter, + adapter->ahw.pci_func, + NXHAL_VERSION, + reg, + val, + 0, + NX_CDRP_CMD_WRITE_PHY); + + if (rcode != NX_RCODE_SUCCESS) + return -EIO; + + return 0; +} + static u64 ctx_addr_sig_regs[][3] = { {NETXEN_NIC_REG(0x188), NETXEN_NIC_REG(0x18c), NETXEN_NIC_REG(0x1c0)}, {NETXEN_NIC_REG(0x190), NETXEN_NIC_REG(0x194), NETXEN_NIC_REG(0x1c4)}, diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 39a308c..3886135 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c @@ -37,7 +37,6 @@ #include "netxen_nic.h" #include "netxen_nic_hw.h" -#include "netxen_nic_phan_reg.h" struct netxen_nic_stats { char stat_string[ETH_GSTRING_LEN]; @@ -57,7 +56,8 @@ static const struct netxen_nic_stats netxen_nic_gstrings_stats[] = { {"rx_dropped", NETXEN_NIC_STAT(stats.rxdropped)}, {"tx_dropped", NETXEN_NIC_STAT(stats.txdropped)}, {"csummed", NETXEN_NIC_STAT(stats.csummed)}, - {"no_rcv", NETXEN_NIC_STAT(stats.no_rcv)}, + {"rx_pkts", NETXEN_NIC_STAT(stats.rx_pkts)}, + {"lro_pkts", NETXEN_NIC_STAT(stats.lro_pkts)}, {"rx_bytes", NETXEN_NIC_STAT(stats.rxbytes)}, {"tx_bytes", NETXEN_NIC_STAT(stats.txbytes)}, }; @@ -941,6 +941,28 @@ static int netxen_get_intr_coalesce(struct net_device *netdev, return 0; } +static int netxen_nic_set_flags(struct net_device *netdev, u32 data) +{ + struct netxen_adapter *adapter = netdev_priv(netdev); + int hw_lro; + + if (!(adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)) + return -EINVAL; + + ethtool_op_set_flags(netdev, data); + + hw_lro = (data & ETH_FLAG_LRO) ? NETXEN_NIC_LRO_ENABLED : 0; + + if (netxen_config_hw_lro(adapter, hw_lro)) + return -EIO; + + if ((hw_lro == 0) && netxen_send_lro_cleanup(adapter)) + return -EIO; + + + return 0; +} + struct ethtool_ops netxen_nic_ethtool_ops = { .get_settings = netxen_nic_get_settings, .set_settings = netxen_nic_set_settings, @@ -968,4 +990,6 @@ struct ethtool_ops netxen_nic_ethtool_ops = { .set_rx_csum = netxen_nic_set_rx_csum, .get_coalesce = netxen_get_intr_coalesce, .set_coalesce = netxen_set_intr_coalesce, + .get_flags = ethtool_op_get_flags, + .set_flags = netxen_nic_set_flags, }; diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index a732858..92f5970 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h @@ -723,9 +723,92 @@ enum { #define NETXEN_FW_VERSION_MINOR (NETXEN_CAM_RAM(0x154)) #define NETXEN_FW_VERSION_SUB (NETXEN_CAM_RAM(0x158)) #define NETXEN_ROM_LOCK_ID (NETXEN_CAM_RAM(0x100)) +#define NETXEN_PHY_LOCK_ID (NETXEN_CAM_RAM(0x120)) #define NETXEN_CRB_WIN_LOCK_ID (NETXEN_CAM_RAM(0x124)) -#define NETXEN_PHY_LOCK_ID (NETXEN_CAM_RAM(0x120)) +#define NIC_CRB_BASE (NETXEN_CAM_RAM(0x200)) +#define NIC_CRB_BASE_2 (NETXEN_CAM_RAM(0x700)) +#define NETXEN_NIC_REG(X) (NIC_CRB_BASE+(X)) +#define NETXEN_NIC_REG_2(X) (NIC_CRB_BASE_2+(X)) + +#define NX_CDRP_CRB_OFFSET (NETXEN_NIC_REG(0x18)) +#define NX_ARG1_CRB_OFFSET (NETXEN_NIC_REG(0x1c)) +#define NX_ARG2_CRB_OFFSET (NETXEN_NIC_REG(0x20)) +#define NX_ARG3_CRB_OFFSET (NETXEN_NIC_REG(0x24)) +#define NX_SIGN_CRB_OFFSET (NETXEN_NIC_REG(0x28)) + +#define CRB_HOST_DUMMY_BUF_ADDR_HI (NETXEN_NIC_REG(0x3c)) +#define CRB_HOST_DUMMY_BUF_ADDR_LO (NETXEN_NIC_REG(0x40)) + +#define CRB_CMDPEG_STATE (NETXEN_NIC_REG(0x50)) +#define CRB_RCVPEG_STATE (NETXEN_NIC_REG(0x13c)) + +#define CRB_XG_STATE (NETXEN_NIC_REG(0x94)) +#define CRB_XG_STATE_P3 (NETXEN_NIC_REG(0x98)) +#define CRB_PF_LINK_SPEED_1 (NETXEN_NIC_REG(0xe8)) +#define CRB_PF_LINK_SPEED_2 (NETXEN_NIC_REG(0xec)) + +#define CRB_MPORT_MODE (NETXEN_NIC_REG(0xc4)) +#define CRB_DMA_SHIFT (NETXEN_NIC_REG(0xcc)) +#define CRB_INT_VECTOR (NETXEN_NIC_REG(0xd4)) + +#define CRB_CMD_PRODUCER_OFFSET (NETXEN_NIC_REG(0x08)) +#define CRB_CMD_CONSUMER_OFFSET (NETXEN_NIC_REG(0x0c)) +#define CRB_CMD_PRODUCER_OFFSET_1 (NETXEN_NIC_REG(0x1ac)) +#define CRB_CMD_CONSUMER_OFFSET_1 (NETXEN_NIC_REG(0x1b0)) +#define CRB_CMD_PRODUCER_OFFSET_2 (NETXEN_NIC_REG(0x1b8)) +#define CRB_CMD_CONSUMER_OFFSET_2 (NETXEN_NIC_REG(0x1bc)) +#define CRB_CMD_PRODUCER_OFFSET_3 (NETXEN_NIC_REG(0x1d0)) +#define CRB_CMD_CONSUMER_OFFSET_3 (NETXEN_NIC_REG(0x1d4)) +#define CRB_TEMP_STATE (NETXEN_NIC_REG(0x1b4)) + +#define CRB_V2P_0 (NETXEN_NIC_REG(0x290)) +#define CRB_V2P(port) (CRB_V2P_0+((port)*4)) +#define CRB_DRIVER_VERSION (NETXEN_NIC_REG(0x2a0)) + +#define CRB_SW_INT_MASK_0 (NETXEN_NIC_REG(0x1d8)) +#define CRB_SW_INT_MASK_1 (NETXEN_NIC_REG(0x1e0)) +#define CRB_SW_INT_MASK_2 (NETXEN_NIC_REG(0x1e4)) +#define CRB_SW_INT_MASK_3 (NETXEN_NIC_REG(0x1e8)) + +#define CRB_FW_CAPABILITIES_1 (NETXEN_CAM_RAM(0x128)) +#define CRB_MAC_BLOCK_START (NETXEN_CAM_RAM(0x1c0)) + +/* + * capabilities register, can be used to selectively enable/disable features + * for backward compability + */ +#define CRB_NIC_CAPABILITIES_HOST NETXEN_NIC_REG(0x1a8) +#define CRB_NIC_CAPABILITIES_FW NETXEN_NIC_REG(0x1dc) +#define CRB_NIC_MSI_MODE_HOST NETXEN_NIC_REG(0x270) +#define CRB_NIC_MSI_MODE_FW NETXEN_NIC_REG(0x274) + +#define INTR_SCHEME_PERPORT 0x1 +#define MSI_MODE_MULTIFUNC 0x1 + +/* used for ethtool tests */ +#define CRB_SCRATCHPAD_TEST NETXEN_NIC_REG(0x280) + +/* + * CrbPortPhanCntrHi/Lo is used to pass the address of HostPhantomIndex address + * which can be read by the Phantom host to get producer/consumer indexes from + * Phantom/Casper. If it is not HOST_SHARED_MEMORY, then the following + * registers will be used for the addresses of the ring's shared memory + * on the Phantom. + */ + +#define nx_get_temp_val(x) ((x) >> 16) +#define nx_get_temp_state(x) ((x) & 0xffff) +#define nx_encode_temp(val, state) (((val) << 16) | (state)) + +/* + * Temperature control. + */ +enum { + NX_TEMP_NORMAL = 0x1, /* Normal operating range */ + NX_TEMP_WARN, /* Sound alert, temperature getting high */ + NX_TEMP_PANIC /* Fatal error, hardware has shut down. */ +}; /* Lock IDs for PHY lock */ #define PHY_LOCK_DRIVER 0x44524956 @@ -816,16 +899,24 @@ enum { #define PCIE_DCR 0x00d8 +#define PCIE_SEM0_LOCK (0x1c000) +#define PCIE_SEM0_UNLOCK (0x1c004) +#define PCIE_SEM1_LOCK (0x1c008) +#define PCIE_SEM1_UNLOCK (0x1c00c) #define PCIE_SEM2_LOCK (0x1c010) /* Flash lock */ #define PCIE_SEM2_UNLOCK (0x1c014) /* Flash unlock */ #define PCIE_SEM3_LOCK (0x1c018) /* Phy lock */ #define PCIE_SEM3_UNLOCK (0x1c01c) /* Phy unlock */ +#define PCIE_SEM4_LOCK (0x1c020) +#define PCIE_SEM4_UNLOCK (0x1c024) #define PCIE_SEM5_LOCK (0x1c028) /* API lock */ #define PCIE_SEM5_UNLOCK (0x1c02c) /* API unlock */ #define PCIE_SEM6_LOCK (0x1c030) /* sw lock */ #define PCIE_SEM6_UNLOCK (0x1c034) /* sw unlock */ #define PCIE_SEM7_LOCK (0x1c038) /* crb win lock */ #define PCIE_SEM7_UNLOCK (0x1c03c) /* crbwin unlock*/ +#define PCIE_SEM_LOCK(N) (PCIE_SEM0_LOCK + 8*(N)) +#define PCIE_SEM_UNLOCK(N) (PCIE_SEM0_UNLOCK + 8*(N)) #define PCIE_SETUP_FUNCTION (0x12040) #define PCIE_SETUP_FUNCTION2 (0x12048) diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 673dcf5..db510ce 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c @@ -30,7 +30,6 @@ #include "netxen_nic.h" #include "netxen_nic_hw.h" -#include "netxen_nic_phan_reg.h" #include <net/ip.h> @@ -87,7 +86,6 @@ static void __iomem *pci_base_offset(struct netxen_adapter *adapter, return NULL; } -#define CRB_WIN_LOCK_TIMEOUT 100000000 static crb_128M_2M_block_map_t crb_128M_2M_map[64] __cacheline_aligned_in_smp = { {{{0, 0, 0, 0} } }, /* 0: PCI */ @@ -321,6 +319,64 @@ static unsigned crb_hub_agt[64] = #define NETXEN_WINDOW_ONE 0x2000000 /*CRB Window: bit 25 of CRB address */ +#define NETXEN_PCIE_SEM_TIMEOUT 10000 + +int +netxen_pcie_sem_lock(struct netxen_adapter *adapter, int sem, u32 id_reg) +{ + int done = 0, timeout = 0; + + while (!done) { + done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM_LOCK(sem))); + if (done == 1) + break; + if (++timeout >= NETXEN_PCIE_SEM_TIMEOUT) + return -1; + msleep(1); + } + + if (id_reg) + NXWR32(adapter, id_reg, adapter->portnum); + + return 0; +} + +void +netxen_pcie_sem_unlock(struct netxen_adapter *adapter, int sem) +{ + int val; + val = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM_UNLOCK(sem))); +} + +int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) +{ + if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { + NXWR32(adapter, NETXEN_NIU_XGE_CONFIG_1+(0x10000*port), 0x1447); + NXWR32(adapter, NETXEN_NIU_XGE_CONFIG_0+(0x10000*port), 0x5); + } + + return 0; +} + +/* Disable an XG interface */ +int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) +{ + __u32 mac_cfg; + u32 port = adapter->physical_port; + + if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) + return 0; + + if (port > NETXEN_NIU_MAX_XG_PORTS) + return -EINVAL; + + mac_cfg = 0; + if (NXWR32(adapter, + NETXEN_NIU_XGE_CONFIG_0 + (0x10000 * port), mac_cfg)) + return -EIO; + return 0; +} + #define NETXEN_UNICAST_ADDR(port, index) \ (NETXEN_UNICAST_ADDR_BASE+(port*32)+(index*8)) #define NETXEN_MCAST_ADDR(port, index) \ @@ -330,6 +386,56 @@ static unsigned crb_hub_agt[64] = #define MAC_LO(addr) \ ((addr[5] << 16) | (addr[4] << 8) | (addr[3])) +int netxen_p2_nic_set_promisc(struct netxen_adapter *adapter, u32 mode) +{ + __u32 reg; + u32 port = adapter->physical_port; + + if (port > NETXEN_NIU_MAX_XG_PORTS) + return -EINVAL; + + reg = NXRD32(adapter, NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port)); + if (mode == NETXEN_NIU_PROMISC_MODE) + reg = (reg | 0x2000UL); + else + reg = (reg & ~0x2000UL); + + if (mode == NETXEN_NIU_ALLMULTI_MODE) + reg = (reg | 0x1000UL); + else + reg = (reg & ~0x1000UL); + + NXWR32(adapter, NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), reg); + + return 0; +} + +int netxen_p2_nic_set_mac_addr(struct netxen_adapter *adapter, u8 *addr) +{ + u32 mac_hi, mac_lo; + u32 reg_hi, reg_lo; + + u8 phy = adapter->physical_port; + + if (phy >= NETXEN_NIU_MAX_XG_PORTS) + return -EINVAL; + + mac_lo = ((u32)addr[0] << 16) | ((u32)addr[1] << 24); + mac_hi = addr[2] | ((u32)addr[3] << 8) | + ((u32)addr[4] << 16) | ((u32)addr[5] << 24); + + reg_lo = NETXEN_NIU_XGE_STATION_ADDR_0_1 + (0x10000 * phy); + reg_hi = NETXEN_NIU_XGE_STATION_ADDR_0_HI + (0x10000 * phy); + + /* write twice to flush */ + if (NXWR32(adapter, reg_lo, mac_lo) || NXWR32(adapter, reg_hi, mac_hi)) + return -EIO; + if (NXWR32(adapter, reg_lo, mac_lo) || NXWR32(adapter, reg_hi, mac_hi)) + return -EIO; + + return 0; +} + static int netxen_nic_enable_mcast_filter(struct netxen_adapter *adapter) { @@ -643,7 +749,7 @@ int netxen_config_intr_coalesce(struct netxen_adapter *adapter) memset(&req, 0, sizeof(nx_nic_req_t)); - req.qhdr = cpu_to_le64(NX_NIC_REQUEST << 23); + req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23); word = NETXEN_CONFIG_INTR_COALESCE | ((u64)adapter->portnum << 16); req.req_hdr = cpu_to_le64(word); @@ -659,6 +765,66 @@ int netxen_config_intr_coalesce(struct netxen_adapter *adapter) return rv; } +int netxen_config_hw_lro(struct netxen_adapter *adapter, int enable) +{ + nx_nic_req_t req; + u64 word; + int rv = 0; + + if ((adapter->flags & NETXEN_NIC_LRO_ENABLED) == enable) + return 0; + + memset(&req, 0, sizeof(nx_nic_req_t)); + + req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23); + + word = NX_NIC_H2C_OPCODE_CONFIG_HW_LRO | ((u64)adapter->portnum << 16); + req.req_hdr = cpu_to_le64(word); + + req.words[0] = cpu_to_le64(enable); + + rv = netxen_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); + if (rv != 0) { + printk(KERN_ERR "ERROR. Could not send " + "configure hw lro request\n"); + } + + adapter->flags ^= NETXEN_NIC_LRO_ENABLED; + + return rv; +} + +int netxen_config_bridged_mode(struct netxen_adapter *adapter, int enable) +{ + nx_nic_req_t req; + u64 word; + int rv = 0; + + if (!!(adapter->flags & NETXEN_NIC_BRIDGE_ENABLED) == enable) + return rv; + + memset(&req, 0, sizeof(nx_nic_req_t)); + + req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23); + + word = NX_NIC_H2C_OPCODE_CONFIG_BRIDGING | + ((u64)adapter->portnum << 16); + req.req_hdr = cpu_to_le64(word); + + req.words[0] = cpu_to_le64(enable); + + rv = netxen_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); + if (rv != 0) { + printk(KERN_ERR "ERROR. Could not send " + "configure bridge mode request\n"); + } + + adapter->flags ^= NETXEN_NIC_BRIDGE_ENABLED; + + return rv; +} + + #define RSS_HASHTYPE_IP_TCP 0x3 int netxen_config_rss(struct netxen_adapter *adapter, int enable) @@ -752,6 +918,29 @@ int netxen_linkevent_request(struct netxen_adapter *adapter, int enable) return rv; } +int netxen_send_lro_cleanup(struct netxen_adapter *adapter) +{ + nx_nic_req_t req; + u64 word; + int rv; + + memset(&req, 0, sizeof(nx_nic_req_t)); + req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23); + + word = NX_NIC_H2C_OPCODE_LRO_REQUEST | + ((u64)adapter->portnum << 16) | + ((u64)NX_NIC_LRO_REQUEST_CLEANUP << 56) ; + + req.req_hdr = cpu_to_le64(word); + + rv = netxen_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); + if (rv != 0) { + printk(KERN_ERR "%s: could not cleanup lro flows\n", + adapter->netdev->name); + } + return rv; +} + /* * netxen_nic_change_mtu - Change the Maximum Transfer Unit * @returns 0 on success, negative on failure @@ -855,33 +1044,6 @@ int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac) return 0; } -#define CRB_WIN_LOCK_TIMEOUT 100000000 - -static int crb_win_lock(struct netxen_adapter *adapter) -{ - int done = 0, timeout = 0; - - while (!done) { - /* acquire semaphore3 from PCI HW block */ - done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM7_LOCK)); - if (done == 1) - break; - if (timeout >= CRB_WIN_LOCK_TIMEOUT) - return -1; - timeout++; - udelay(1); - } - NXWR32(adapter, NETXEN_CRB_WIN_LOCK_ID, adapter->portnum); - return 0; -} - -static void crb_win_unlock(struct netxen_adapter *adapter) -{ - int val; - - val = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM7_UNLOCK)); -} - /* * Changes the CRB window to the specified window. */ @@ -2066,6 +2228,8 @@ void netxen_nic_get_firmware_info(struct netxen_adapter *adapter) if (adapter->fw_version >= NETXEN_VERSION_CODE(4, 0, 222)) adapter->capabilities = NXRD32(adapter, CRB_FW_CAPABILITIES_1); + + adapter->flags &= ~NETXEN_NIC_LRO_ENABLED; } int diff --git a/drivers/net/netxen/netxen_nic_hw.h b/drivers/net/netxen/netxen_nic_hw.h index d4e8333..98e4b95 100644 --- a/drivers/net/netxen/netxen_nic_hw.h +++ b/drivers/net/netxen/netxen_nic_hw.h @@ -31,8 +31,6 @@ #ifndef __NETXEN_NIC_HW_H_ #define __NETXEN_NIC_HW_H_ -#include "netxen_nic_hdr.h" - /* Hardware memory size of 128 meg */ #define NETXEN_MEMADDR_MAX (128 * 1024 * 1024) @@ -63,10 +61,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); * Bit 31: soft_reset => 1:reset the MAC and the SERDES, 0:no-op */ -#define netxen_gb_enable_tx(config_word) \ - ((config_word) |= 1 << 0) -#define netxen_gb_enable_rx(config_word) \ - ((config_word) |= 1 << 2) #define netxen_gb_tx_flowctl(config_word) \ ((config_word) |= 1 << 4) #define netxen_gb_rx_flowctl(config_word) \ @@ -79,8 +73,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); ((config_word) |= 1 << 18) #define netxen_gb_rx_reset_mac(config_word) \ ((config_word) |= 1 << 19) -#define netxen_gb_soft_reset(config_word) \ - ((config_word) |= 1 << 31) #define netxen_gb_unset_tx_flowctl(config_word) \ ((config_word) &= ~(1 << 4)) @@ -242,7 +234,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); * Bits 14-15 : speed => 0:10Mb/s, 1:100Mb/s, 2:1000Mb/s, 3:rsvd */ -#define netxen_get_phy_cablelen(config_word) (((config_word) >> 7) & 0x07) #define netxen_get_phy_speed(config_word) (((config_word) >> 14) & 0x03) #define netxen_set_phy_speed(config_word, val) \ @@ -252,85 +243,12 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); #define netxen_clear_phy_duplex(config_word) \ ((config_word) &= ~(1 << 13)) -#define netxen_get_phy_jabber(config_word) \ - _netxen_crb_get_bit(config_word, 0) -#define netxen_get_phy_polarity(config_word) \ - _netxen_crb_get_bit(config_word, 1) -#define netxen_get_phy_recvpause(config_word) \ - _netxen_crb_get_bit(config_word, 2) -#define netxen_get_phy_xmitpause(config_word) \ - _netxen_crb_get_bit(config_word, 3) -#define netxen_get_phy_energydetect(config_word) \ - _netxen_crb_get_bit(config_word, 4) -#define netxen_get_phy_downshift(config_word) \ - _netxen_crb_get_bit(config_word, 5) -#define netxen_get_phy_crossover(config_word) \ - _netxen_crb_get_bit(config_word, 6) #define netxen_get_phy_link(config_word) \ _netxen_crb_get_bit(config_word, 10) -#define netxen_get_phy_resolved(config_word) \ - _netxen_crb_get_bit(config_word, 11) -#define netxen_get_phy_pagercvd(config_word) \ - _netxen_crb_get_bit(config_word, 12) #define netxen_get_phy_duplex(config_word) \ _netxen_crb_get_bit(config_word, 13) /* - * Interrupt Register definition - * This definition applies to registers 18 and 19 (int enable and int status). - * Bit 0 : jabber - * Bit 1 : polarity_changed - * Bit 4 : energy_detect - * Bit 5 : downshift - * Bit 6 : mdi_xover_changed - * Bit 7 : fifo_over_underflow - * Bit 8 : false_carrier - * Bit 9 : symbol_error - * Bit 10: link_status_changed - * Bit 11: autoneg_completed - * Bit 12: page_received - * Bit 13: duplex_changed - * Bit 14: speed_changed - * Bit 15: autoneg_error - */ - -#define netxen_get_phy_int_jabber(config_word) \ - _netxen_crb_get_bit(config_word, 0) -#define netxen_get_phy_int_polarity_changed(config_word) \ - _netxen_crb_get_bit(config_word, 1) -#define netxen_get_phy_int_energy_detect(config_word) \ - _netxen_crb_get_bit(config_word, 4) -#define netxen_get_phy_int_downshift(config_word) \ - _netxen_crb_get_bit(config_word, 5) -#define netxen_get_phy_int_mdi_xover_changed(config_word) \ - _netxen_crb_get_bit(config_word, 6) -#define netxen_get_phy_int_fifo_over_underflow(config_word) \ - _netxen_crb_get_bit(config_word, 7) -#define netxen_get_phy_int_false_carrier(config_word) \ - _netxen_crb_get_bit(config_word, 8) -#define netxen_get_phy_int_symbol_error(config_word) \ - _netxen_crb_get_bit(config_word, 9) -#define netxen_get_phy_int_link_status_changed(config_word) \ - _netxen_crb_get_bit(config_word, 10) -#define netxen_get_phy_int_autoneg_completed(config_word) \ - _netxen_crb_get_bit(config_word, 11) -#define netxen_get_phy_int_page_received(config_word) \ - _netxen_crb_get_bit(config_word, 12) -#define netxen_get_phy_int_duplex_changed(config_word) \ - _netxen_crb_get_bit(config_word, 13) -#define netxen_get_phy_int_speed_changed(config_word) \ - _netxen_crb_get_bit(config_word, 14) -#define netxen_get_phy_int_autoneg_error(config_word) \ - _netxen_crb_get_bit(config_word, 15) - -#define netxen_set_phy_int_link_status_changed(config_word) \ - ((config_word) |= 1 << 10) -#define netxen_set_phy_int_autoneg_completed(config_word) \ - ((config_word) |= 1 << 11) -#define netxen_set_phy_int_speed_changed(config_word) \ - ((config_word) |= 1 << 14) - -/* * NIU Mode Register. * Bit 0 : enable FibreChannel * Bit 1 : enable 10/100/1000 Ethernet @@ -345,33 +263,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); #define NETXEN_NIU_ALLMULTI_MODE 2 /* - * NIU GB Drop CRC Register - * - * Bit 0 : drop_gb0 => 1:drop pkts with bad CRCs, 0:pass them on - * Bit 1 : drop_gb1 => 1:drop pkts with bad CRCs, 0:pass them on - * Bit 2 : drop_gb2 => 1:drop pkts with bad CRCs, 0:pass them on - * Bit 3 : drop_gb3 => 1:drop pkts with bad CRCs, 0:pass them on - */ - -#define netxen_set_gb_drop_gb0(config_word) \ - ((config_word) |= 1 << 0) -#define netxen_set_gb_drop_gb1(config_word) \ - ((config_word) |= 1 << 1) -#define netxen_set_gb_drop_gb2(config_word) \ - ((config_word) |= 1 << 2) -#define netxen_set_gb_drop_gb3(config_word) \ - ((config_word) |= 1 << 3) - -#define netxen_clear_gb_drop_gb0(config_word) \ - ((config_word) &= ~(1 << 0)) -#define netxen_clear_gb_drop_gb1(config_word) \ - ((config_word) &= ~(1 << 1)) -#define netxen_clear_gb_drop_gb2(config_word) \ - ((config_word) &= ~(1 << 2)) -#define netxen_clear_gb_drop_gb3(config_word) \ - ((config_word) &= ~(1 << 3)) - -/* * NIU XG MAC Config Register * * Bit 0 : tx_enable => 1:enable frame xmit, 0:disable @@ -387,22 +278,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); #define netxen_xg_soft_reset(config_word) \ ((config_word) |= 1 << 4) -/* Set promiscuous mode for a GbE interface */ -int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, - u32 mode); -int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, - u32 mode); - -/* Generic enable for GbE ports. Will detect the speed of the link. */ -int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port); - -int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port); - -/* Disable a GbE interface */ -int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter); - -int netxen_niu_disable_xg_port(struct netxen_adapter *adapter); - typedef struct { unsigned valid; unsigned start_128M; diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index e8bdbf9..8d4aa6f 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c @@ -32,7 +32,6 @@ #include <linux/delay.h> #include "netxen_nic.h" #include "netxen_nic_hw.h" -#include "netxen_nic_phan_reg.h" struct crb_addr_pair { u32 addr; @@ -322,43 +321,24 @@ err_out: void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) { - adapter->macaddr_set = netxen_p2_nic_set_mac_addr; - adapter->set_multi = netxen_p2_nic_set_multi; - - switch (adapter->ahw.port_type) { - case NETXEN_NIC_GBE: - adapter->enable_phy_interrupts = - netxen_niu_gbe_enable_phy_interrupts; - adapter->disable_phy_interrupts = - netxen_niu_gbe_disable_phy_interrupts; - adapter->set_mtu = netxen_nic_set_mtu_gb; - adapter->set_promisc = netxen_niu_set_promiscuous_mode; - adapter->phy_read = netxen_niu_gbe_phy_read; - adapter->phy_write = netxen_niu_gbe_phy_write; - adapter->init_port = netxen_niu_gbe_init_port; - adapter->stop_port = netxen_niu_disable_gbe_port; - break; + adapter->init_port = netxen_niu_xg_init_port; + adapter->stop_port = netxen_niu_disable_xg_port; - case NETXEN_NIC_XGBE: - adapter->enable_phy_interrupts = - netxen_niu_xgbe_enable_phy_interrupts; - adapter->disable_phy_interrupts = - netxen_niu_xgbe_disable_phy_interrupts; + if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { + adapter->macaddr_set = netxen_p2_nic_set_mac_addr; + adapter->set_multi = netxen_p2_nic_set_multi; adapter->set_mtu = netxen_nic_set_mtu_xgb; - adapter->init_port = netxen_niu_xg_init_port; - adapter->set_promisc = netxen_niu_xg_set_promiscuous_mode; - adapter->stop_port = netxen_niu_disable_xg_port; - break; - - default: - break; - } - - if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { + adapter->set_promisc = netxen_p2_nic_set_promisc; + } else { adapter->set_mtu = nx_fw_cmd_set_mtu; adapter->set_promisc = netxen_p3_nic_set_promisc; adapter->macaddr_set = netxen_p3_nic_set_mac_addr; adapter->set_multi = netxen_p3_nic_set_multi; + + if (adapter->ahw.port_type == NETXEN_NIC_GBE) { + adapter->phy_read = nx_fw_cmd_query_phy; + adapter->phy_write = nx_fw_cmd_set_phy; + } } } @@ -389,37 +369,7 @@ static u32 netxen_decode_crb_addr(u32 addr) return (pci_base + offset); } -static long rom_max_timeout = 100; -static long rom_lock_timeout = 10000; - -static int rom_lock(struct netxen_adapter *adapter) -{ - int iter; - u32 done = 0; - int timeout = 0; - - while (!done) { - /* acquire semaphore2 from PCI HW block */ - done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM2_LOCK)); - if (done == 1) - break; - if (timeout >= rom_lock_timeout) - return -EIO; - - timeout++; - /* - * Yield CPU - */ - if (!in_atomic()) - schedule(); - else { - for (iter = 0; iter < 20; iter++) - cpu_relax(); /*This a nop instr on i386 */ - } - } - NXWR32(adapter, NETXEN_ROM_LOCK_ID, ROM_LOCK_DRIVER); - return 0; -} +#define NETXEN_MAX_ROM_WAIT_USEC 100 static int netxen_wait_rom_done(struct netxen_adapter *adapter) { @@ -431,22 +381,16 @@ static int netxen_wait_rom_done(struct netxen_adapter *adapter) while (done == 0) { done = NXRD32(adapter, NETXEN_ROMUSB_GLB_STATUS); done &= 2; - timeout++; - if (timeout >= rom_max_timeout) { - printk("Timeout reached waiting for rom done"); + if (++timeout >= NETXEN_MAX_ROM_WAIT_USEC) { + dev_err(&adapter->pdev->dev, + "Timeout reached waiting for rom done"); return -EIO; } + udelay(1); } return 0; } -static void netxen_rom_unlock(struct netxen_adapter *adapter) -{ - /* release semaphore2 */ - NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM2_UNLOCK)); - -} - static int do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) { @@ -491,7 +435,7 @@ netxen_rom_fast_read_words(struct netxen_adapter *adapter, int addr, { int ret; - ret = rom_lock(adapter); + ret = netxen_rom_lock(adapter); if (ret < 0) return ret; @@ -505,7 +449,7 @@ int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) { int ret; - if (rom_lock(adapter) != 0) + if (netxen_rom_lock(adapter) != 0) return -EIO; ret = do_rom_fast_read(adapter, addr, valp); @@ -526,7 +470,7 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) u32 off; /* resetall */ - rom_lock(adapter); + netxen_rom_lock(adapter); NXWR32(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 0xffffffff); netxen_rom_unlock(adapter); @@ -1277,7 +1221,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, napi_gro_receive(&sds_ring->napi, skb); - adapter->stats.no_rcv++; + adapter->stats.rx_pkts++; adapter->stats.rxbytes += length; return buffer; @@ -1350,8 +1294,13 @@ netxen_process_lro(struct netxen_adapter *adapter, th->psh = push; th->seq = htonl(seq_number); + length = skb->len; + netif_receive_skb(skb); + adapter->stats.lro_pkts++; + adapter->stats.rxbytes += length; + return buffer; } diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 4e3fb30..fab51d1 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c @@ -33,7 +33,6 @@ #include "netxen_nic_hw.h" #include "netxen_nic.h" -#include "netxen_nic_phan_reg.h" #include <linux/dma-mapping.h> #include <linux/if_vlan.h> @@ -72,6 +71,10 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget); #ifdef CONFIG_NET_POLL_CONTROLLER static void netxen_nic_poll_controller(struct net_device *netdev); #endif + +static void netxen_create_sysfs_entries(struct netxen_adapter *adapter); +static void netxen_remove_sysfs_entries(struct netxen_adapter *adapter); + static irqreturn_t netxen_intr(int irq, void *data); static irqreturn_t netxen_msi_intr(int irq, void *data); static irqreturn_t netxen_msix_intr(int irq, void *data); @@ -95,8 +98,6 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = { MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); -static void netxen_watchdog(unsigned long); - static uint32_t crb_cmd_producer[4] = { CRB_CMD_PRODUCER_OFFSET, CRB_CMD_PRODUCER_OFFSET_1, CRB_CMD_PRODUCER_OFFSET_2, CRB_CMD_PRODUCER_OFFSET_3 @@ -754,8 +755,10 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) netxen_request_firmware(adapter); err = netxen_need_fw_reset(adapter); - if (err <= 0) + if (err < 0) return err; + if (err == 0) + goto wait_init; if (first_boot != 0x55555555) { NXWR32(adapter, CRB_CMDPEG_STATE, 0); @@ -892,6 +895,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) netxen_config_intr_coalesce(adapter); + if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO) + netxen_config_hw_lro(adapter, NETXEN_NIC_LRO_ENABLED); + netxen_napi_enable(adapter); if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION) @@ -917,6 +923,8 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) netxen_p3_free_mac_list(adapter); + adapter->set_promisc(adapter, NETXEN_NIU_NON_PROMISC_MODE); + netxen_napi_disable(adapter); netxen_release_tx_buffers(adapter); @@ -989,6 +997,8 @@ netxen_nic_attach(struct netxen_adapter *adapter) if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) netxen_nic_init_coalesce_defaults(adapter); + netxen_create_sysfs_entries(adapter); + adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; return 0; @@ -1006,6 +1016,8 @@ netxen_nic_detach(struct netxen_adapter *adapter) if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) return; + netxen_remove_sysfs_entries(adapter); + netxen_free_hw_resources(adapter); netxen_release_rx_buffers(adapter); netxen_nic_free_irq(adapter); @@ -1077,6 +1089,9 @@ netxen_setup_netdev(struct netxen_adapter *adapter, if (adapter->capabilities & NX_FW_CAPABILITY_FVLANTX) netdev->features |= (NETIF_F_HW_VLAN_TX); + if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO) + netdev->features |= NETIF_F_LRO; + netdev->irq = adapter->msix_entries[0].vector; err = netxen_napi_add(adapter, netdev); @@ -1280,14 +1295,11 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) free_netdev(netdev); } - -#ifdef CONFIG_PM -static int -netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state) +static int __netxen_nic_shutdown(struct pci_dev *pdev) { - struct netxen_adapter *adapter = pci_get_drvdata(pdev); struct net_device *netdev = adapter->netdev; + int retval; netif_device_detach(netdev); @@ -1299,7 +1311,12 @@ netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state) netxen_nic_detach(adapter); - pci_save_state(pdev); + if (adapter->portnum == 0) + netxen_free_dummy_dma(adapter); + + retval = pci_save_state(pdev); + if (retval) + return retval; if (netxen_nic_wol_supported(adapter)) { pci_enable_wake(pdev, PCI_D3cold, 1); @@ -1307,10 +1324,27 @@ netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state) } pci_disable_device(pdev); - pci_set_power_state(pdev, pci_choose_state(pdev, state)); return 0; } +static void netxen_nic_shutdown(struct pci_dev *pdev) +{ + if (__netxen_nic_shutdown(pdev)) + return; +} +#ifdef CONFIG_PM +static int +netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state) +{ + int retval; + + retval = __netxen_nic_shutdown(pdev); + if (retval) + return retval; + + pci_set_power_state(pdev, pci_choose_state(pdev, state)); + return 0; +} static int netxen_nic_resume(struct pci_dev *pdev) @@ -1510,22 +1544,52 @@ netxen_tso_check(struct net_device *netdev, barrier(); } -static void -netxen_clean_tx_dma_mapping(struct pci_dev *pdev, - struct netxen_cmd_buffer *pbuf, int last) +static int +netxen_map_tx_skb(struct pci_dev *pdev, + struct sk_buff *skb, struct netxen_cmd_buffer *pbuf) { - int k; - struct netxen_skb_frag *buffrag; + struct netxen_skb_frag *nf; + struct skb_frag_struct *frag; + int i, nr_frags; + dma_addr_t map; - buffrag = &pbuf->frag_array[0]; - pci_unmap_single(pdev, buffrag->dma, - buffrag->length, PCI_DMA_TODEVICE); + nr_frags = skb_shinfo(skb)->nr_frags; + nf = &pbuf->frag_array[0]; - for (k = 1; k < last; k++) { - buffrag = &pbuf->frag_array[k]; - pci_unmap_page(pdev, buffrag->dma, - buffrag->length, PCI_DMA_TODEVICE); + map = pci_map_single(pdev, skb->data, + skb_headlen(skb), PCI_DMA_TODEVICE); + if (pci_dma_mapping_error(pdev, map)) + goto out_err; + + nf->dma = map; + nf->length = skb_headlen(skb); + + for (i = 0; i < nr_frags; i++) { + frag = &skb_shinfo(skb)->frags[i]; + nf = &pbuf->frag_array[i+1]; + + map = pci_map_page(pdev, frag->page, frag->page_offset, + frag->size, PCI_DMA_TODEVICE); + if (pci_dma_mapping_error(pdev, map)) + goto unwind; + + nf->dma = map; + nf->length = frag->size; } + + return 0; + +unwind: + while (i > 0) { + nf = &pbuf->frag_array[i]; + pci_unmap_page(pdev, nf->dma, nf->length, PCI_DMA_TODEVICE); + } + + nf = &pbuf->frag_array[0]; + pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE); + +out_err: + return -ENOMEM; } static inline void @@ -1540,17 +1604,14 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) { struct netxen_adapter *adapter = netdev_priv(netdev); struct nx_host_tx_ring *tx_ring = adapter->tx_ring; - struct skb_frag_struct *frag; struct netxen_cmd_buffer *pbuf; struct netxen_skb_frag *buffrag; struct cmd_desc_type0 *hwdesc, *first_desc; struct pci_dev *pdev; - dma_addr_t temp_dma; int i, k; - unsigned long offset; u32 producer; - int len, frag_count, no_of_desc; + int frag_count, no_of_desc; u32 num_txd = tx_ring->num_desc; frag_count = skb_shinfo(skb)->nr_frags + 1; @@ -1564,72 +1625,53 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) } producer = tx_ring->producer; + pbuf = &tx_ring->cmd_buf_arr[producer]; pdev = adapter->pdev; - len = skb->len - skb->data_len; - temp_dma = pci_map_single(pdev, skb->data, len, PCI_DMA_TODEVICE); - if (pci_dma_mapping_error(pdev, temp_dma)) + if (netxen_map_tx_skb(pdev, skb, pbuf)) goto drop_packet; - pbuf = &tx_ring->cmd_buf_arr[producer]; pbuf->skb = skb; pbuf->frag_count = frag_count; - buffrag = &pbuf->frag_array[0]; - buffrag->dma = temp_dma; - buffrag->length = len; - first_desc = hwdesc = &tx_ring->desc_head[producer]; netxen_clear_cmddesc((u64 *)hwdesc); - netxen_set_tx_frags_len(hwdesc, frag_count, skb->len); - netxen_set_tx_port(hwdesc, adapter->portnum); - hwdesc->buffer_length[0] = cpu_to_le16(len); - hwdesc->addr_buffer1 = cpu_to_le64(temp_dma); + netxen_set_tx_frags_len(first_desc, frag_count, skb->len); + netxen_set_tx_port(first_desc, adapter->portnum); - for (i = 1, k = 1; i < frag_count; i++, k++) { + for (i = 0; i < frag_count; i++) { - /* move to next desc. if there is a need */ - if ((i & 0x3) == 0) { - k = 0; + k = i % 4; + + if ((k == 0) && (i > 0)) { + /* move to next desc.*/ producer = get_next_index(producer, num_txd); hwdesc = &tx_ring->desc_head[producer]; netxen_clear_cmddesc((u64 *)hwdesc); - pbuf = &tx_ring->cmd_buf_arr[producer]; - pbuf->skb = NULL; - } - buffrag = &pbuf->frag_array[i]; - frag = &skb_shinfo(skb)->frags[i - 1]; - len = frag->size; - offset = frag->page_offset; - - temp_dma = pci_map_page(pdev, frag->page, offset, - len, PCI_DMA_TODEVICE); - if (pci_dma_mapping_error(pdev, temp_dma)) { - netxen_clean_tx_dma_mapping(pdev, pbuf, i); - goto drop_packet; + tx_ring->cmd_buf_arr[producer].skb = NULL; } - buffrag->dma = temp_dma; - buffrag->length = len; + buffrag = &pbuf->frag_array[i]; - hwdesc->buffer_length[k] = cpu_to_le16(len); + hwdesc->buffer_length[k] = cpu_to_le16(buffrag->length); switch (k) { case 0: - hwdesc->addr_buffer1 = cpu_to_le64(temp_dma); + hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma); break; case 1: - hwdesc->addr_buffer2 = cpu_to_le64(temp_dma); + hwdesc->addr_buffer2 = cpu_to_le64(buffrag->dma); break; case 2: - hwdesc->addr_buffer3 = cpu_to_le64(temp_dma); + hwdesc->addr_buffer3 = cpu_to_le64(buffrag->dma); break; case 3: - hwdesc->addr_buffer4 = cpu_to_le64(temp_dma); + hwdesc->addr_buffer4 = cpu_to_le64(buffrag->dma); break; } } + tx_ring->producer = get_next_index(producer, num_txd); netxen_tso_check(netdev, tx_ring, first_desc, skb); @@ -1812,7 +1854,7 @@ struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) memset(stats, 0, sizeof(*stats)); - stats->rx_packets = adapter->stats.no_rcv; + stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts; stats->tx_packets = adapter->stats.xmitfinished; stats->rx_bytes = adapter->stats.rxbytes; stats->tx_bytes = adapter->stats.txbytes; @@ -1923,6 +1965,80 @@ static void netxen_nic_poll_controller(struct net_device *netdev) } #endif +static ssize_t +netxen_store_bridged_mode(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) +{ + struct net_device *net = to_net_dev(dev); + struct netxen_adapter *adapter = netdev_priv(net); + unsigned long new; + int ret = -EINVAL; + + if (!(adapter->capabilities & NX_FW_CAPABILITY_BDG)) + goto err_out; + + if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) + goto err_out; + + if (strict_strtoul(buf, 2, &new)) + goto err_out; + + if (!netxen_config_bridged_mode(adapter, !!new)) + ret = len; + +err_out: + return ret; +} + +static ssize_t +netxen_show_bridged_mode(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct net_device *net = to_net_dev(dev); + struct netxen_adapter *adapter; + int bridged_mode = 0; + + adapter = netdev_priv(net); + + if (adapter->capabilities & NX_FW_CAPABILITY_BDG) + bridged_mode = !!(adapter->flags & NETXEN_NIC_BRIDGE_ENABLED); + + return sprintf(buf, "%d\n", bridged_mode); +} + +static struct device_attribute dev_attr_bridged_mode = { + .attr = {.name = "bridged_mode", .mode = (S_IRUGO | S_IWUSR)}, + .show = netxen_show_bridged_mode, + .store = netxen_store_bridged_mode, +}; + +static void +netxen_create_sysfs_entries(struct netxen_adapter *adapter) +{ + struct net_device *netdev = adapter->netdev; + struct device *dev = &netdev->dev; + + if (adapter->capabilities & NX_FW_CAPABILITY_BDG) { + /* bridged_mode control */ + if (device_create_file(dev, &dev_attr_bridged_mode)) { + dev_warn(&netdev->dev, + "failed to create bridged_mode sysfs entry\n"); + } + } +} + +static void +netxen_remove_sysfs_entries(struct netxen_adapter *adapter) +{ + struct net_device *netdev = adapter->netdev; + struct device *dev = &netdev->dev; + + if (adapter->capabilities & NX_FW_CAPABILITY_BDG) + device_remove_file(dev, &dev_attr_bridged_mode); +} + +static void netxen_watchdog(unsigned long); + #ifdef CONFIG_INET #define is_netxen_netdev(dev) (dev->netdev_ops == &netxen_netdev_ops) @@ -2052,8 +2168,9 @@ static struct pci_driver netxen_driver = { .remove = __devexit_p(netxen_nic_remove), #ifdef CONFIG_PM .suspend = netxen_nic_suspend, - .resume = netxen_nic_resume + .resume = netxen_nic_resume, #endif + .shutdown = netxen_nic_shutdown }; static int __init netxen_init_module(void) diff --git a/drivers/net/netxen/netxen_nic_niu.c b/drivers/net/netxen/netxen_nic_niu.c deleted file mode 100644 index 5941c79..0000000 --- a/drivers/net/netxen/netxen_nic_niu.c +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright (C) 2003 - 2009 NetXen, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. - * - * The full GNU General Public License is included in this distribution - * in the file called LICENSE. - * - * Contact Information: - * info@netxen.com - * NetXen Inc, - * 18922 Forge Drive - * Cupertino, CA 95014-0701 - * - */ - -#include "netxen_nic.h" - -#define NETXEN_GB_MAC_SOFT_RESET 0x80000000 -#define NETXEN_GB_MAC_RESET_PROT_BLK 0x000F0000 -#define NETXEN_GB_MAC_ENABLE_TX_RX 0x00000005 -#define NETXEN_GB_MAC_PAUSED_FRMS 0x00000020 - -static long phy_lock_timeout = 100000000; - -static int phy_lock(struct netxen_adapter *adapter) -{ - int i; - int done = 0, timeout = 0; - - while (!done) { - done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM3_LOCK)); - if (done == 1) - break; - if (timeout >= phy_lock_timeout) { - return -1; - } - timeout++; - if (!in_atomic()) - schedule(); - else { - for (i = 0; i < 20; i++) - cpu_relax(); - } - } - - NXWR32(adapter, NETXEN_PHY_LOCK_ID, PHY_LOCK_DRIVER); - return 0; -} - -static int phy_unlock(struct netxen_adapter *adapter) -{ - adapter->pci_read_immediate(adapter, NETXEN_PCIE_REG(PCIE_SEM3_UNLOCK)); - - return 0; -} - -/* - * netxen_niu_gbe_phy_read - read a register from the GbE PHY via - * mii management interface. - * - * Note: The MII management interface goes through port 0. - * Individual phys are addressed as follows: - * @param phy [15:8] phy id - * @param reg [7:0] register number - * - * @returns 0 on success - * -1 on error - * - */ -int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg, - __u32 * readval) -{ - long timeout = 0; - long result = 0; - long restore = 0; - long phy = adapter->physical_port; - __u32 address; - __u32 command; - __u32 status; - __u32 mac_cfg0; - - if (phy_lock(adapter) != 0) { - return -1; - } - - /* - * MII mgmt all goes through port 0 MAC interface, - * so it cannot be in reset - */ - - mac_cfg0 = NXRD32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0)); - if (netxen_gb_get_soft_reset(mac_cfg0)) { - __u32 temp; - temp = 0; - netxen_gb_tx_reset_pb(temp); - netxen_gb_rx_reset_pb(temp); - netxen_gb_tx_reset_mac(temp); - netxen_gb_rx_reset_mac(temp); - if (NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), temp)) - return -EIO; - restore = 1; - } - - address = 0; - netxen_gb_mii_mgmt_reg_addr(address, reg); - netxen_gb_mii_mgmt_phy_addr(address, phy); - if (NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0), address)) - return -EIO; - command = 0; /* turn off any prior activity */ - if (NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), command)) - return -EIO; - /* send read command */ - netxen_gb_mii_mgmt_set_read_cycle(command); - if (NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), command)) - return -EIO; - - status = 0; - do { - status = NXRD32(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(0)); - timeout++; - } while ((netxen_get_gb_mii_mgmt_busy(status) - || netxen_get_gb_mii_mgmt_notvalid(status)) - && (timeout++ < NETXEN_NIU_PHY_WAITMAX)); - - if (timeout < NETXEN_NIU_PHY_WAITMAX) { - *readval = NXRD32(adapter, NETXEN_NIU_GB_MII_MGMT_STATUS(0)); - result = 0; - } else - result = -1; - - if (restore) - if (NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), mac_cfg0)) - return -EIO; - phy_unlock(adapter); - return result; -} - -/* - * netxen_niu_gbe_phy_write - write a register to the GbE PHY via - * mii management interface. - * - * Note: The MII management interface goes through port 0. - * Individual phys are addressed as follows: - * @param phy [15:8] phy id - * @param reg [7:0] register number - * - * @returns 0 on success - * -1 on error - * - */ -int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg, - __u32 val) -{ - long timeout = 0; - long result = 0; - long restore = 0; - long phy = adapter->physical_port; - __u32 address; - __u32 command; - __u32 status; - __u32 mac_cfg0; - - /* - * MII mgmt all goes through port 0 MAC interface, so it - * cannot be in reset - */ - - mac_cfg0 = NXRD32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0)); - if (netxen_gb_get_soft_reset(mac_cfg0)) { - __u32 temp; - temp = 0; - netxen_gb_tx_reset_pb(temp); - netxen_gb_rx_reset_pb(temp); - netxen_gb_tx_reset_mac(temp); - netxen_gb_rx_reset_mac(temp); - - if (NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), temp)) - return -EIO; - restore = 1; - } - - command = 0; /* turn off any prior activity */ - if (NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), command)) - return -EIO; - - address = 0; - netxen_gb_mii_mgmt_reg_addr(address, reg); - netxen_gb_mii_mgmt_phy_addr(address, phy); - if (NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0), address)) - return -EIO; - - if (NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_CTRL(0), val)) - return -EIO; - - status = 0; - do { - status = NXRD32(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(0)); - timeout++; - } while ((netxen_get_gb_mii_mgmt_busy(status)) - && (timeout++ < NETXEN_NIU_PHY_WAITMAX)); - - if (timeout < NETXEN_NIU_PHY_WAITMAX) - result = 0; - else - result = -EIO; - - /* restore the state of port 0 MAC in case we tampered with it */ - if (restore) - if (NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), mac_cfg0)) - return -EIO; - - return result; -} - -int netxen_niu_xgbe_enable_phy_interrupts(struct netxen_adapter *adapter) -{ - NXWR32(adapter, NETXEN_NIU_INT_MASK, 0x3f); - return 0; -} - -int netxen_niu_gbe_enable_phy_interrupts(struct netxen_adapter *adapter) -{ - int result = 0; - __u32 enable = 0; - netxen_set_phy_int_link_status_changed(enable); - netxen_set_phy_int_autoneg_completed(enable); - netxen_set_phy_int_speed_changed(enable); - - if (0 != - netxen_niu_gbe_phy_write(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_INT_ENABLE, - enable)) - result = -EIO; - - return result; -} - -int netxen_niu_xgbe_disable_phy_interrupts(struct netxen_adapter *adapter) -{ - NXWR32(adapter, NETXEN_NIU_INT_MASK, 0x7f); - return 0; -} - -int netxen_niu_gbe_disable_phy_interrupts(struct netxen_adapter *adapter) -{ - int result = 0; - if (0 != - netxen_niu_gbe_phy_write(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_INT_ENABLE, 0)) - result = -EIO; - - return result; -} - -static int netxen_niu_gbe_clear_phy_interrupts(struct netxen_adapter *adapter) -{ - int result = 0; - if (0 != - netxen_niu_gbe_phy_write(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_INT_STATUS, - -EIO)) - result = -EIO; - - return result; -} - -/* - * netxen_niu_gbe_set_mii_mode- Set 10/100 Mbit Mode for GbE MAC - * - */ -static void netxen_niu_gbe_set_mii_mode(struct netxen_adapter *adapter, - int port, long enable) -{ - NXWR32(adapter, NETXEN_NIU_MODE, 0x2); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 0x80000000); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 0x0000f0025); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_1(port), 0xf1ff); - NXWR32(adapter, NETXEN_NIU_GB0_GMII_MODE + (port << 3), 0); - NXWR32(adapter, NETXEN_NIU_GB0_MII_MODE + (port << 3), 1); - NXWR32(adapter, (NETXEN_NIU_GB0_HALF_DUPLEX + port * 4), 0); - NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(port), 0x7); - - if (enable) { - /* - * Do NOT enable flow control until a suitable solution for - * shutting down pause frames is found. - */ - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 0x5); - } - - if (netxen_niu_gbe_enable_phy_interrupts(adapter)) - printk(KERN_ERR "ERROR enabling PHY interrupts\n"); - if (netxen_niu_gbe_clear_phy_interrupts(adapter)) - printk(KERN_ERR "ERROR clearing PHY interrupts\n"); -} - -/* - * netxen_niu_gbe_set_gmii_mode- Set GbE Mode for GbE MAC - */ -static void netxen_niu_gbe_set_gmii_mode(struct netxen_adapter *adapter, - int port, long enable) -{ - NXWR32(adapter, NETXEN_NIU_MODE, 0x2); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 0x80000000); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 0x0000f0025); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_1(port), 0xf2ff); - NXWR32(adapter, NETXEN_NIU_GB0_MII_MODE + (port << 3), 0); - NXWR32(adapter, NETXEN_NIU_GB0_GMII_MODE + (port << 3), 1); - NXWR32(adapter, (NETXEN_NIU_GB0_HALF_DUPLEX + port * 4), 0); - NXWR32(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(port), 0x7); - - if (enable) { - /* - * Do NOT enable flow control until a suitable solution for - * shutting down pause frames is found. - */ - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), 0x5); - } - - if (netxen_niu_gbe_enable_phy_interrupts(adapter)) - printk(KERN_ERR "ERROR enabling PHY interrupts\n"); - if (netxen_niu_gbe_clear_phy_interrupts(adapter)) - printk(KERN_ERR "ERROR clearing PHY interrupts\n"); -} - -int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port) -{ - int result = 0; - __u32 status; - - if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) - return 0; - - if (adapter->disable_phy_interrupts) - adapter->disable_phy_interrupts(adapter); - mdelay(2); - - if (0 == netxen_niu_gbe_phy_read(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, &status)) { - if (netxen_get_phy_link(status)) { - if (netxen_get_phy_speed(status) == 2) { - netxen_niu_gbe_set_gmii_mode(adapter, port, 1); - } else if ((netxen_get_phy_speed(status) == 1) - || (netxen_get_phy_speed(status) == 0)) { - netxen_niu_gbe_set_mii_mode(adapter, port, 1); - } else { - result = -1; - } - - } else { - /* - * We don't have link. Cable must be unconnected. - * Enable phy interrupts so we take action when - * plugged in. - */ - - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), - NETXEN_GB_MAC_SOFT_RESET); - NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), - NETXEN_GB_MAC_RESET_PROT_BLK | - NETXEN_GB_MAC_ENABLE_TX_RX | - NETXEN_GB_MAC_PAUSED_FRMS); - if (netxen_niu_gbe_clear_phy_interrupts(adapter)) - printk(KERN_ERR - "ERROR clearing PHY interrupts\n"); - if (netxen_niu_gbe_enable_phy_interrupts(adapter)) - printk(KERN_ERR - "ERROR enabling PHY interrupts\n"); - if (netxen_niu_gbe_clear_phy_interrupts(adapter)) - printk(KERN_ERR - "ERROR clearing PHY interrupts\n"); - result = -1; - } - } else { - result = -EIO; - } - return result; -} - -int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) -{ - if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { - NXWR32(adapter, NETXEN_NIU_XGE_CONFIG_1+(0x10000*port), 0x1447); - NXWR32(adapter, NETXEN_NIU_XGE_CONFIG_0+(0x10000*port), 0x5); - } - - return 0; -} - -/* Disable a GbE interface */ -int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) -{ - __u32 mac_cfg0; - u32 port = adapter->physical_port; - - if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) - return 0; - - if (port > NETXEN_NIU_MAX_GBE_PORTS) - return -EINVAL; - mac_cfg0 = 0; - netxen_gb_soft_reset(mac_cfg0); - if (NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), mac_cfg0)) - return -EIO; - return 0; -} - -/* Disable an XG interface */ -int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) -{ - __u32 mac_cfg; - u32 port = adapter->physical_port; - - if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) - return 0; - - if (port > NETXEN_NIU_MAX_XG_PORTS) - return -EINVAL; - - mac_cfg = 0; - if (NXWR32(adapter, - NETXEN_NIU_XGE_CONFIG_0 + (0x10000 * port), mac_cfg)) - return -EIO; - return 0; -} - -/* Set promiscuous mode for a GbE interface */ -int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, - u32 mode) -{ - __u32 reg; - u32 port = adapter->physical_port; - - if (port > NETXEN_NIU_MAX_GBE_PORTS) - return -EINVAL; - - /* save previous contents */ - reg = NXRD32(adapter, NETXEN_NIU_GB_DROP_WRONGADDR); - if (mode == NETXEN_NIU_PROMISC_MODE) { - switch (port) { - case 0: - netxen_clear_gb_drop_gb0(reg); - break; - case 1: - netxen_clear_gb_drop_gb1(reg); - break; - case 2: - netxen_clear_gb_drop_gb2(reg); - break; - case 3: - netxen_clear_gb_drop_gb3(reg); - break; - default: - return -EIO; - } - } else { - switch (port) { - case 0: - netxen_set_gb_drop_gb0(reg); - break; - case 1: - netxen_set_gb_drop_gb1(reg); - break; - case 2: - netxen_set_gb_drop_gb2(reg); - break; - case 3: - netxen_set_gb_drop_gb3(reg); - break; - default: - return -EIO; - } - } - if (NXWR32(adapter, NETXEN_NIU_GB_DROP_WRONGADDR, reg)) - return -EIO; - return 0; -} - -int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, - u32 mode) -{ - __u32 reg; - u32 port = adapter->physical_port; - - if (port > NETXEN_NIU_MAX_XG_PORTS) - return -EINVAL; - - reg = NXRD32(adapter, NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port)); - if (mode == NETXEN_NIU_PROMISC_MODE) - reg = (reg | 0x2000UL); - else - reg = (reg & ~0x2000UL); - - if (mode == NETXEN_NIU_ALLMULTI_MODE) - reg = (reg | 0x1000UL); - else - reg = (reg & ~0x1000UL); - - NXWR32(adapter, NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), reg); - - return 0; -} - -int netxen_p2_nic_set_mac_addr(struct netxen_adapter *adapter, u8 *addr) -{ - u32 mac_hi, mac_lo; - u32 reg_hi, reg_lo; - - u8 phy = adapter->physical_port; - u8 phy_count = (adapter->ahw.port_type == NETXEN_NIC_XGBE) ? - NETXEN_NIU_MAX_XG_PORTS : NETXEN_NIU_MAX_GBE_PORTS; - - if (phy >= phy_count) - return -EINVAL; - - mac_lo = ((u32)addr[0] << 16) | ((u32)addr[1] << 24); - mac_hi = addr[2] | ((u32)addr[3] << 8) | - ((u32)addr[4] << 16) | ((u32)addr[5] << 24); - - if (adapter->ahw.port_type == NETXEN_NIC_XGBE) { - reg_lo = NETXEN_NIU_XGE_STATION_ADDR_0_1 + (0x10000 * phy); - reg_hi = NETXEN_NIU_XGE_STATION_ADDR_0_HI + (0x10000 * phy); - } else { - reg_lo = NETXEN_NIU_GB_STATION_ADDR_1(phy); - reg_hi = NETXEN_NIU_GB_STATION_ADDR_0(phy); - } - - /* write twice to flush */ - if (NXWR32(adapter, reg_lo, mac_lo) || NXWR32(adapter, reg_hi, mac_hi)) - return -EIO; - if (NXWR32(adapter, reg_lo, mac_lo) || NXWR32(adapter, reg_hi, mac_hi)) - return -EIO; - - return 0; -} diff --git a/drivers/net/netxen/netxen_nic_phan_reg.h b/drivers/net/netxen/netxen_nic_phan_reg.h deleted file mode 100644 index b73a62c..0000000 --- a/drivers/net/netxen/netxen_nic_phan_reg.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (C) 2003 - 2009 NetXen, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. - * - * The full GNU General Public License is included in this distribution - * in the file called LICENSE. - * - * Contact Information: - * info@netxen.com - * NetXen Inc, - * 18922 Forge Drive - * Cupertino, CA 95014-0701 - * - */ - -#ifndef __NIC_PHAN_REG_H_ -#define __NIC_PHAN_REG_H_ - -/* - * CRB Registers or queue message done only at initialization time. - */ -#define NIC_CRB_BASE NETXEN_CAM_RAM(0x200) -#define NETXEN_NIC_REG(X) (NIC_CRB_BASE+(X)) -#define NIC_CRB_BASE_2 NETXEN_CAM_RAM(0x700) -#define NETXEN_NIC_REG_2(X) (NIC_CRB_BASE_2+(X)) - -#define CRB_PHAN_CNTRL_LO_OFFSET NETXEN_NIC_REG(0x00) -#define CRB_PHAN_CNTRL_HI_OFFSET NETXEN_NIC_REG(0x04) -#define CRB_CMD_PRODUCER_OFFSET NETXEN_NIC_REG(0x08) -#define CRB_CMD_CONSUMER_OFFSET NETXEN_NIC_REG(0x0c) -#define CRB_PAUSE_ADDR_LO NETXEN_NIC_REG(0x10) -#define CRB_PAUSE_ADDR_HI NETXEN_NIC_REG(0x14) -#define NX_CDRP_CRB_OFFSET NETXEN_NIC_REG(0x18) -#define NX_ARG1_CRB_OFFSET NETXEN_NIC_REG(0x1c) -#define NX_ARG2_CRB_OFFSET NETXEN_NIC_REG(0x20) -#define NX_ARG3_CRB_OFFSET NETXEN_NIC_REG(0x24) -#define NX_SIGN_CRB_OFFSET NETXEN_NIC_REG(0x28) -#define CRB_CMD_INTR_LOOP NETXEN_NIC_REG(0x20) -#define CRB_CMD_DMA_LOOP NETXEN_NIC_REG(0x24) -#define CRB_RCV_INTR_LOOP NETXEN_NIC_REG(0x28) -#define CRB_RCV_DMA_LOOP NETXEN_NIC_REG(0x2c) -#define CRB_ENABLE_TX_INTR NETXEN_NIC_REG(0x30) -#define CRB_MMAP_ADDR_3 NETXEN_NIC_REG(0x34) -#define CRB_CMDPEG_CMDRING NETXEN_NIC_REG(0x38) -#define CRB_HOST_DUMMY_BUF_ADDR_HI NETXEN_NIC_REG(0x3c) -#define CRB_HOST_DUMMY_BUF_ADDR_LO NETXEN_NIC_REG(0x40) -#define CRB_MMAP_ADDR_0 NETXEN_NIC_REG(0x44) -#define CRB_MMAP_ADDR_1 NETXEN_NIC_REG(0x48) -#define CRB_MMAP_ADDR_2 NETXEN_NIC_REG(0x4c) -#define CRB_CMDPEG_STATE NETXEN_NIC_REG(0x50) -#define CRB_MMAP_SIZE_0 NETXEN_NIC_REG(0x54) -#define CRB_MMAP_SIZE_1 NETXEN_NIC_REG(0x58) -#define CRB_MMAP_SIZE_2 NETXEN_NIC_REG(0x5c) -#define CRB_MMAP_SIZE_3 NETXEN_NIC_REG(0x60) -#define CRB_GLOBAL_INT_COAL NETXEN_NIC_REG(0x64) -#define CRB_INT_COAL_MODE NETXEN_NIC_REG(0x68) -#define CRB_MAX_RCV_BUFS NETXEN_NIC_REG(0x6c) -#define CRB_TX_INT_THRESHOLD NETXEN_NIC_REG(0x70) -#define CRB_RX_PKT_TIMER NETXEN_NIC_REG(0x74) -#define CRB_TX_PKT_TIMER NETXEN_NIC_REG(0x78) -#define CRB_RX_PKT_CNT NETXEN_NIC_REG(0x7c) -#define CRB_RX_TMR_CNT NETXEN_NIC_REG(0x80) -#define CRB_RX_LRO_TIMER NETXEN_NIC_REG(0x84) -#define CRB_RX_LRO_MID_TIMER NETXEN_NIC_REG(0x88) -#define CRB_DMA_MAX_RCV_BUFS NETXEN_NIC_REG(0x8c) -#define CRB_MAX_DMA_ENTRIES NETXEN_NIC_REG(0x90) -#define CRB_XG_STATE NETXEN_NIC_REG(0x94) /* XG Link status */ -#define CRB_XG_STATE_P3 NETXEN_NIC_REG(0x98) /* XG PF Link status */ -#define CRB_AGENT_TX_SIZE NETXEN_NIC_REG(0x9c) -#define CRB_AGENT_TX_TYPE NETXEN_NIC_REG(0xa0) -#define CRB_AGENT_TX_ADDR NETXEN_NIC_REG(0xa4) -#define CRB_AGENT_TX_MSS NETXEN_NIC_REG(0xa8) -#define CRB_TX_STATE NETXEN_NIC_REG(0xac) -#define CRB_TX_COUNT NETXEN_NIC_REG(0xb0) -#define CRB_RX_STATE NETXEN_NIC_REG(0xb4) -#define CRB_RX_PERF_DEBUG_1 NETXEN_NIC_REG(0xb8) -#define CRB_RX_LRO_CONTROL NETXEN_NIC_REG(0xbc) -#define CRB_RX_LRO_START_NUM NETXEN_NIC_REG(0xc0) -#define CRB_MPORT_MODE NETXEN_NIC_REG(0xc4) -#define CRB_CMD_RING_SIZE NETXEN_NIC_REG(0xc8) -#define CRB_DMA_SHIFT NETXEN_NIC_REG(0xcc) -#define CRB_INT_VECTOR NETXEN_NIC_REG(0xd4) -#define CRB_CTX_RESET NETXEN_NIC_REG(0xd8) -#define CRB_HOST_STS_PROD NETXEN_NIC_REG(0xdc) -#define CRB_HOST_STS_CONS NETXEN_NIC_REG(0xe0) -#define CRB_PEG_CMD_PROD NETXEN_NIC_REG(0xe4) -#define CRB_PF_LINK_SPEED_1 NETXEN_NIC_REG(0xe8) -#define CRB_PF_LINK_SPEED_2 NETXEN_NIC_REG(0xec) -#define CRB_HOST_BUFFER_CONS NETXEN_NIC_REG(0xf0) -#define CRB_JUMBO_BUFFER_PROD NETXEN_NIC_REG(0xf4) -#define CRB_JUMBO_BUFFER_CONS NETXEN_NIC_REG(0xf8) -#define CRB_HOST_DUMMY_BUF NETXEN_NIC_REG(0xfc) - -#define CRB_RCVPEG_STATE NETXEN_NIC_REG(0x13c) -#define CRB_CMD_PRODUCER_OFFSET_1 NETXEN_NIC_REG(0x1ac) -#define CRB_CMD_CONSUMER_OFFSET_1 NETXEN_NIC_REG(0x1b0) -#define CRB_CMD_PRODUCER_OFFSET_2 NETXEN_NIC_REG(0x1b8) -#define CRB_CMD_CONSUMER_OFFSET_2 NETXEN_NIC_REG(0x1bc) -#define CRB_CMD_PRODUCER_OFFSET_3 NETXEN_NIC_REG(0x1d0) -#define CRB_CMD_CONSUMER_OFFSET_3 NETXEN_NIC_REG(0x1d4) -#define CRB_TEMP_STATE NETXEN_NIC_REG(0x1b4) - -#define CRB_V2P_0 NETXEN_NIC_REG(0x290) -#define CRB_V2P_1 NETXEN_NIC_REG(0x294) -#define CRB_V2P_2 NETXEN_NIC_REG(0x298) -#define CRB_V2P_3 NETXEN_NIC_REG(0x29c) -#define CRB_V2P(port) (CRB_V2P_0+((port)*4)) -#define CRB_DRIVER_VERSION NETXEN_NIC_REG(0x2a0) -#define CRB_SW_INT_MASK_0 NETXEN_NIC_REG(0x1d8) -#define CRB_SW_INT_MASK_1 NETXEN_NIC_REG(0x1e0) -#define CRB_SW_INT_MASK_2 NETXEN_NIC_REG(0x1e4) -#define CRB_SW_INT_MASK_3 NETXEN_NIC_REG(0x1e8) - -#define CRB_FW_CAPABILITIES_1 NETXEN_CAM_RAM(0x128) -#define CRB_MAC_BLOCK_START NETXEN_CAM_RAM(0x1c0) - -/* - * capabilities register, can be used to selectively enable/disable features - * for backward compability - */ -#define CRB_NIC_CAPABILITIES_HOST NETXEN_NIC_REG(0x1a8) -#define CRB_NIC_CAPABILITIES_FW NETXEN_NIC_REG(0x1dc) -#define CRB_NIC_MSI_MODE_HOST NETXEN_NIC_REG(0x270) -#define CRB_NIC_MSI_MODE_FW NETXEN_NIC_REG(0x274) - -#define INTR_SCHEME_PERPORT 0x1 -#define MSI_MODE_MULTIFUNC 0x1 - -/* used for ethtool tests */ -#define CRB_SCRATCHPAD_TEST NETXEN_NIC_REG(0x280) - -/* - * CrbPortPhanCntrHi/Lo is used to pass the address of HostPhantomIndex address - * which can be read by the Phantom host to get producer/consumer indexes from - * Phantom/Casper. If it is not HOST_SHARED_MEMORY, then the following - * registers will be used for the addresses of the ring's shared memory - * on the Phantom. - */ - -#define nx_get_temp_val(x) ((x) >> 16) -#define nx_get_temp_state(x) ((x) & 0xffff) -#define nx_encode_temp(val, state) (((val) << 16) | (state)) - -/* - * CRB registers used by the receive peg logic. - */ - -struct netxen_recv_crb { - u32 crb_rcv_producer[NUM_RCV_DESC_RINGS]; - u32 crb_sts_consumer[NUM_STS_DESC_RINGS]; - u32 sw_int_mask[NUM_STS_DESC_RINGS]; -}; - -/* - * Temperature control. - */ -enum { - NX_TEMP_NORMAL = 0x1, /* Normal operating range */ - NX_TEMP_WARN, /* Sound alert, temperature getting high */ - NX_TEMP_PANIC /* Fatal error, hardware has shut down. */ -}; - -#endif /* __NIC_PHAN_REG_H_ */ diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c index 190efc3..f81e532 100644 --- a/drivers/net/phy/broadcom.c +++ b/drivers/net/phy/broadcom.c @@ -18,6 +18,12 @@ #include <linux/phy.h> #define PHY_ID_BCM50610 0x0143bd60 +#define PHY_ID_BCM50610M 0x0143bd70 +#define PHY_ID_BCM57780 0x03625d90 + +#define BRCM_PHY_MODEL(phydev) \ + ((phydev)->drv->phy_id & (phydev)->drv->phy_id_mask) + #define MII_BCM54XX_ECR 0x10 /* BCM54xx extended control register */ #define MII_BCM54XX_ECR_IM 0x1000 /* Interrupt mask */ @@ -117,6 +123,7 @@ #define MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE 0x0200 #define MII_BCM54XX_EXP_EXP75 0x0f75 #define MII_BCM54XX_EXP_EXP75_VDACCTRL 0x003c +#define MII_BCM54XX_EXP_EXP75_CM_OSC 0x0001 #define MII_BCM54XX_EXP_EXP96 0x0f96 #define MII_BCM54XX_EXP_EXP96_MYST 0x0010 #define MII_BCM54XX_EXP_EXP97 0x0f97 @@ -141,6 +148,35 @@ #define PHY_BCM_FLAGS_MODE_1000BX 0x00000002 #define PHY_BCM_FLAGS_MODE_COPPER 0x00000001 + +/*****************************************************************************/ +/* Fast Ethernet Transceiver definitions. */ +/*****************************************************************************/ + +#define MII_BRCM_FET_INTREG 0x1a /* Interrupt register */ +#define MII_BRCM_FET_IR_MASK 0x0100 /* Mask all interrupts */ +#define MII_BRCM_FET_IR_LINK_EN 0x0200 /* Link status change enable */ +#define MII_BRCM_FET_IR_SPEED_EN 0x0400 /* Link speed change enable */ +#define MII_BRCM_FET_IR_DUPLEX_EN 0x0800 /* Duplex mode change enable */ +#define MII_BRCM_FET_IR_ENABLE 0x4000 /* Interrupt enable */ + +#define MII_BRCM_FET_BRCMTEST 0x1f /* Brcm test register */ +#define MII_BRCM_FET_BT_SRE 0x0080 /* Shadow register enable */ + + +/*** Shadow register definitions ***/ + +#define MII_BRCM_FET_SHDW_MISCCTRL 0x10 /* Shadow misc ctrl */ +#define MII_BRCM_FET_SHDW_MC_FAME 0x4000 /* Force Auto MDIX enable */ + +#define MII_BRCM_FET_SHDW_AUXMODE4 0x1a /* Auxiliary mode 4 */ +#define MII_BRCM_FET_SHDW_AM4_LED_MASK 0x0003 +#define MII_BRCM_FET_SHDW_AM4_LED_MODE1 0x0001 + +#define MII_BRCM_FET_SHDW_AUXSTAT2 0x1b /* Auxiliary status 2 */ +#define MII_BRCM_FET_SHDW_AS2_APDE 0x0020 /* Auto power down enable */ + + MODULE_DESCRIPTION("Broadcom PHY driver"); MODULE_AUTHOR("Maciej W. Rozycki"); MODULE_LICENSE("GPL"); @@ -164,7 +200,7 @@ static int bcm54xx_shadow_write(struct phy_device *phydev, u16 shadow, u16 val) } /* Indirect register access functions for the Expansion Registers */ -static int bcm54xx_exp_read(struct phy_device *phydev, u8 regnum) +static int bcm54xx_exp_read(struct phy_device *phydev, u16 regnum) { int val; @@ -278,6 +314,33 @@ static int bcm54xx_config_init(struct phy_device *phydev) return err; } + if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM57780) { + int err2; + + err = bcm54xx_auxctl_write(phydev, + MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL, + MII_BCM54XX_AUXCTL_ACTL_SMDSP_ENA | + MII_BCM54XX_AUXCTL_ACTL_TX_6DB); + if (err < 0) + return err; + + reg = bcm54xx_exp_read(phydev, MII_BCM54XX_EXP_EXP75); + if (reg < 0) + goto error; + + reg |= MII_BCM54XX_EXP_EXP75_CM_OSC; + err = bcm54xx_exp_write(phydev, MII_BCM54XX_EXP_EXP75, reg); + +error: + err2 = bcm54xx_auxctl_write(phydev, + MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL, + MII_BCM54XX_AUXCTL_ACTL_TX_6DB); + if (err) + return err; + if (err2) + return err2; + } + return 0; } @@ -435,6 +498,114 @@ static int bcm5481_config_aneg(struct phy_device *phydev) return ret; } +static int brcm_phy_setbits(struct phy_device *phydev, int reg, int set) +{ + int val; + + val = phy_read(phydev, reg); + if (val < 0) + return val; + + return phy_write(phydev, reg, val | set); +} + +static int brcm_fet_config_init(struct phy_device *phydev) +{ + int reg, err, err2, brcmtest; + + /* Reset the PHY to bring it to a known state. */ + err = phy_write(phydev, MII_BMCR, BMCR_RESET); + if (err < 0) + return err; + + reg = phy_read(phydev, MII_BRCM_FET_INTREG); + if (reg < 0) + return reg; + + /* Unmask events we are interested in and mask interrupts globally. */ + reg = MII_BRCM_FET_IR_DUPLEX_EN | + MII_BRCM_FET_IR_SPEED_EN | + MII_BRCM_FET_IR_LINK_EN | + MII_BRCM_FET_IR_ENABLE | + MII_BRCM_FET_IR_MASK; + + err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); + if (err < 0) + return err; + + /* Enable shadow register access */ + brcmtest = phy_read(phydev, MII_BRCM_FET_BRCMTEST); + if (brcmtest < 0) + return brcmtest; + + reg = brcmtest | MII_BRCM_FET_BT_SRE; + + err = phy_write(phydev, MII_BRCM_FET_BRCMTEST, reg); + if (err < 0) + return err; + + /* Set the LED mode */ + reg = phy_read(phydev, MII_BRCM_FET_SHDW_AUXMODE4); + if (reg < 0) { + err = reg; + goto done; + } + + reg &= ~MII_BRCM_FET_SHDW_AM4_LED_MASK; + reg |= MII_BRCM_FET_SHDW_AM4_LED_MODE1; + + err = phy_write(phydev, MII_BRCM_FET_SHDW_AUXMODE4, reg); + if (err < 0) + goto done; + + /* Enable auto MDIX */ + err = brcm_phy_setbits(phydev, MII_BRCM_FET_SHDW_MISCCTRL, + MII_BRCM_FET_SHDW_MC_FAME); + if (err < 0) + goto done; + + /* Enable auto power down */ + err = brcm_phy_setbits(phydev, MII_BRCM_FET_SHDW_AUXSTAT2, + MII_BRCM_FET_SHDW_AS2_APDE); + +done: + /* Disable shadow register access */ + err2 = phy_write(phydev, MII_BRCM_FET_BRCMTEST, brcmtest); + if (!err) + err = err2; + + return err; +} + +static int brcm_fet_ack_interrupt(struct phy_device *phydev) +{ + int reg; + + /* Clear pending interrupts. */ + reg = phy_read(phydev, MII_BRCM_FET_INTREG); + if (reg < 0) + return reg; + + return 0; +} + +static int brcm_fet_config_intr(struct phy_device *phydev) +{ + int reg, err; + + reg = phy_read(phydev, MII_BRCM_FET_INTREG); + if (reg < 0) + return reg; + + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) + reg &= ~MII_BRCM_FET_IR_MASK; + else + reg |= MII_BRCM_FET_IR_MASK; + + err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); + return err; +} + static struct phy_driver bcm5411_driver = { .phy_id = 0x00206070, .phy_id_mask = 0xfffffff0, @@ -447,7 +618,7 @@ static struct phy_driver bcm5411_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm5421_driver = { @@ -462,7 +633,7 @@ static struct phy_driver bcm5421_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm5461_driver = { @@ -477,7 +648,7 @@ static struct phy_driver bcm5461_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm5464_driver = { @@ -492,7 +663,7 @@ static struct phy_driver bcm5464_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm5481_driver = { @@ -507,7 +678,7 @@ static struct phy_driver bcm5481_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm5482_driver = { @@ -522,7 +693,7 @@ static struct phy_driver bcm5482_driver = { .read_status = bcm5482_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm50610_driver = { @@ -537,11 +708,26 @@ static struct phy_driver bcm50610_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, +}; + +static struct phy_driver bcm50610m_driver = { + .phy_id = PHY_ID_BCM50610M, + .phy_id_mask = 0xfffffff0, + .name = "Broadcom BCM50610M", + .features = PHY_GBIT_FEATURES | + SUPPORTED_Pause | SUPPORTED_Asym_Pause, + .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, + .config_init = bcm54xx_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = bcm54xx_ack_interrupt, + .config_intr = bcm54xx_config_intr, + .driver = { .owner = THIS_MODULE }, }; static struct phy_driver bcm57780_driver = { - .phy_id = 0x03625d90, + .phy_id = PHY_ID_BCM57780, .phy_id_mask = 0xfffffff0, .name = "Broadcom BCM57780", .features = PHY_GBIT_FEATURES | @@ -552,7 +738,22 @@ static struct phy_driver bcm57780_driver = { .read_status = genphy_read_status, .ack_interrupt = bcm54xx_ack_interrupt, .config_intr = bcm54xx_config_intr, - .driver = { .owner = THIS_MODULE }, + .driver = { .owner = THIS_MODULE }, +}; + +static struct phy_driver bcmac131_driver = { + .phy_id = 0x0143bc70, + .phy_id_mask = 0xfffffff0, + .name = "Broadcom BCMAC131", + .features = PHY_BASIC_FEATURES | + SUPPORTED_Pause | SUPPORTED_Asym_Pause, + .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, + .config_init = brcm_fet_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = brcm_fet_ack_interrupt, + .config_intr = brcm_fet_config_intr, + .driver = { .owner = THIS_MODULE }, }; static int __init broadcom_init(void) @@ -580,12 +781,22 @@ static int __init broadcom_init(void) ret = phy_driver_register(&bcm50610_driver); if (ret) goto out_50610; + ret = phy_driver_register(&bcm50610m_driver); + if (ret) + goto out_50610m; ret = phy_driver_register(&bcm57780_driver); if (ret) goto out_57780; + ret = phy_driver_register(&bcmac131_driver); + if (ret) + goto out_ac131; return ret; +out_ac131: + phy_driver_unregister(&bcm57780_driver); out_57780: + phy_driver_unregister(&bcm50610m_driver); +out_50610m: phy_driver_unregister(&bcm50610_driver); out_50610: phy_driver_unregister(&bcm5482_driver); @@ -605,7 +816,9 @@ out_5411: static void __exit broadcom_exit(void) { + phy_driver_unregister(&bcmac131_driver); phy_driver_unregister(&bcm57780_driver); + phy_driver_unregister(&bcm50610m_driver); phy_driver_unregister(&bcm50610_driver); phy_driver_unregister(&bcm5482_driver); phy_driver_unregister(&bcm5481_driver); diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 6ed5317..a9845a2 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h @@ -1287,12 +1287,11 @@ struct rx_ring { u32 sbq_free_cnt; /* free buffer desc cnt */ /* Misc. handler elements. */ - u32 type; /* Type of queue, tx, rx, or default. */ + u32 type; /* Type of queue, tx, rx. */ u32 irq; /* Which vector this ring is assigned. */ u32 cpu; /* Which CPU this should run on. */ char name[IFNAMSIZ + 5]; struct napi_struct napi; - struct delayed_work rx_work; u8 reserved; struct ql_adapter *qdev; }; @@ -1366,6 +1365,7 @@ struct nic_stats { struct intr_context { struct ql_adapter *qdev; u32 intr; + u32 irq_mask; /* Mask of which rings the vector services. */ u32 hooked; u32 intr_en_mask; /* value/mask used to enable this intr */ u32 intr_dis_mask; /* value/mask used to disable this intr */ @@ -1486,13 +1486,11 @@ struct ql_adapter { struct intr_context intr_context[MAX_RX_RINGS]; int tx_ring_count; /* One per online CPU. */ - u32 rss_ring_first_cq_id;/* index of first inbound (rss) rx_ring */ - u32 rss_ring_count; /* One per online CPU. */ + u32 rss_ring_count; /* One per irq vector. */ /* * rx_ring_count = - * one default queue + * (CPU count * outbound completion rx_ring) + - * (CPU count * inbound (RSS) completion rx_ring) + * (irq_vector_cnt * inbound (RSS) completion rx_ring) */ int rx_ring_count; int ring_mem_size; @@ -1519,7 +1517,6 @@ struct ql_adapter { union flash_params flash; struct net_device_stats stats; - struct workqueue_struct *q_workqueue; struct workqueue_struct *workqueue; struct delayed_work asic_reset_work; struct delayed_work mpi_reset_work; diff --git a/drivers/net/qlge/qlge_dbg.c b/drivers/net/qlge/qlge_dbg.c index 40a70c3..aa88cb3 100644 --- a/drivers/net/qlge/qlge_dbg.c +++ b/drivers/net/qlge/qlge_dbg.c @@ -418,8 +418,6 @@ void ql_dump_qdev(struct ql_adapter *qdev) printk(KERN_ERR PFX "qdev->intr_count = %d.\n", qdev->intr_count); printk(KERN_ERR PFX "qdev->tx_ring = %p.\n", qdev->tx_ring); - printk(KERN_ERR PFX "qdev->rss_ring_first_cq_id = %d.\n", - qdev->rss_ring_first_cq_id); printk(KERN_ERR PFX "qdev->rss_ring_count = %d.\n", qdev->rss_ring_count); printk(KERN_ERR PFX "qdev->rx_ring = %p.\n", qdev->rx_ring); diff --git a/drivers/net/qlge/qlge_ethtool.c b/drivers/net/qlge/qlge_ethtool.c index eb6a9ee..68f9bd2 100644 --- a/drivers/net/qlge/qlge_ethtool.c +++ b/drivers/net/qlge/qlge_ethtool.c @@ -49,10 +49,11 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) /* Skip the default queue, and update the outbound handler * queues if they changed. */ - cqicb = (struct cqicb *)&qdev->rx_ring[1]; + cqicb = (struct cqicb *)&qdev->rx_ring[qdev->rss_ring_count]; if (le16_to_cpu(cqicb->irq_delay) != qdev->tx_coalesce_usecs || - le16_to_cpu(cqicb->pkt_delay) != qdev->tx_max_coalesced_frames) { - for (i = 1; i < qdev->rss_ring_first_cq_id; i++, rx_ring++) { + le16_to_cpu(cqicb->pkt_delay) != + qdev->tx_max_coalesced_frames) { + for (i = qdev->rss_ring_count; i < qdev->rx_ring_count; i++) { rx_ring = &qdev->rx_ring[i]; cqicb = (struct cqicb *)rx_ring; cqicb->irq_delay = cpu_to_le16(qdev->tx_coalesce_usecs); @@ -70,12 +71,11 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) } /* Update the inbound (RSS) handler queues if they changed. */ - cqicb = (struct cqicb *)&qdev->rx_ring[qdev->rss_ring_first_cq_id]; + cqicb = (struct cqicb *)&qdev->rx_ring[0]; if (le16_to_cpu(cqicb->irq_delay) != qdev->rx_coalesce_usecs || - le16_to_cpu(cqicb->pkt_delay) != qdev->rx_max_coalesced_frames) { - for (i = qdev->rss_ring_first_cq_id; - i <= qdev->rss_ring_first_cq_id + qdev->rss_ring_count; - i++) { + le16_to_cpu(cqicb->pkt_delay) != + qdev->rx_max_coalesced_frames) { + for (i = 0; i < qdev->rss_ring_count; i++, rx_ring++) { rx_ring = &qdev->rx_ring[i]; cqicb = (struct cqicb *)rx_ring; cqicb->irq_delay = cpu_to_le16(qdev->rx_coalesce_usecs); diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 3a271af..8dd266b 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -370,9 +370,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, cam_output = (CAM_OUT_ROUTE_NIC | (qdev-> func << CAM_OUT_FUNC_SHIFT) | - (qdev-> - rss_ring_first_cq_id << - CAM_OUT_CQ_ID_SHIFT)); + (0 << CAM_OUT_CQ_ID_SHIFT)); if (qdev->vlgrp) cam_output |= CAM_OUT_RV; /* route to NIC core */ @@ -1649,8 +1647,7 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev, qdev->stats.rx_packets++; qdev->stats.rx_bytes += skb->len; - skb_record_rx_queue(skb, - rx_ring->cq_id - qdev->rss_ring_first_cq_id); + skb_record_rx_queue(skb, rx_ring->cq_id); if (skb->ip_summed == CHECKSUM_UNNECESSARY) { if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) && @@ -1862,11 +1859,41 @@ static int ql_napi_poll_msix(struct napi_struct *napi, int budget) { struct rx_ring *rx_ring = container_of(napi, struct rx_ring, napi); struct ql_adapter *qdev = rx_ring->qdev; - int work_done = ql_clean_inbound_rx_ring(rx_ring, budget); + struct rx_ring *trx_ring; + int i, work_done = 0; + struct intr_context *ctx = &qdev->intr_context[rx_ring->cq_id]; QPRINTK(qdev, RX_STATUS, DEBUG, "Enter, NAPI POLL cq_id = %d.\n", rx_ring->cq_id); + /* Service the TX rings first. They start + * right after the RSS rings. */ + for (i = qdev->rss_ring_count; i < qdev->rx_ring_count; i++) { + trx_ring = &qdev->rx_ring[i]; + /* If this TX completion ring belongs to this vector and + * it's not empty then service it. + */ + if ((ctx->irq_mask & (1 << trx_ring->cq_id)) && + (ql_read_sh_reg(trx_ring->prod_idx_sh_reg) != + trx_ring->cnsmr_idx)) { + QPRINTK(qdev, INTR, DEBUG, + "%s: Servicing TX completion ring %d.\n", + __func__, trx_ring->cq_id); + ql_clean_outbound_rx_ring(trx_ring); + } + } + + /* + * Now service the RSS ring if it's active. + */ + if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) != + rx_ring->cnsmr_idx) { + QPRINTK(qdev, INTR, DEBUG, + "%s: Servicing RX completion ring %d.\n", + __func__, rx_ring->cq_id); + work_done = ql_clean_inbound_rx_ring(rx_ring, budget); + } + if (work_done < budget) { napi_complete(napi); ql_enable_completion_interrupt(qdev, rx_ring->irq); @@ -1928,38 +1955,6 @@ static void ql_vlan_rx_kill_vid(struct net_device *ndev, u16 vid) } -/* Worker thread to process a given rx_ring that is dedicated - * to outbound completions. - */ -static void ql_tx_clean(struct work_struct *work) -{ - struct rx_ring *rx_ring = - container_of(work, struct rx_ring, rx_work.work); - ql_clean_outbound_rx_ring(rx_ring); - ql_enable_completion_interrupt(rx_ring->qdev, rx_ring->irq); - -} - -/* Worker thread to process a given rx_ring that is dedicated - * to inbound completions. - */ -static void ql_rx_clean(struct work_struct *work) -{ - struct rx_ring *rx_ring = - container_of(work, struct rx_ring, rx_work.work); - ql_clean_inbound_rx_ring(rx_ring, 64); - ql_enable_completion_interrupt(rx_ring->qdev, rx_ring->irq); -} - -/* MSI-X Multiple Vector Interrupt Handler for outbound completions. */ -static irqreturn_t qlge_msix_tx_isr(int irq, void *dev_id) -{ - struct rx_ring *rx_ring = dev_id; - queue_delayed_work_on(rx_ring->cpu, rx_ring->qdev->q_workqueue, - &rx_ring->rx_work, 0); - return IRQ_HANDLED; -} - /* MSI-X Multiple Vector Interrupt Handler for inbound completions. */ static irqreturn_t qlge_msix_rx_isr(int irq, void *dev_id) { @@ -1979,7 +1974,6 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) struct ql_adapter *qdev = rx_ring->qdev; struct intr_context *intr_context = &qdev->intr_context[0]; u32 var; - int i; int work_done = 0; spin_lock(&qdev->hw_lock); @@ -2020,41 +2014,18 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) } /* - * Check the default queue and wake handler if active. + * Get the bit-mask that shows the active queues for this + * pass. Compare it to the queues that this irq services + * and call napi if there's a match. */ - rx_ring = &qdev->rx_ring[0]; - if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) != rx_ring->cnsmr_idx) { - QPRINTK(qdev, INTR, INFO, "Waking handler for rx_ring[0].\n"); - ql_disable_completion_interrupt(qdev, intr_context->intr); - queue_delayed_work_on(smp_processor_id(), qdev->q_workqueue, - &rx_ring->rx_work, 0); - work_done++; - } - - if (!test_bit(QL_MSIX_ENABLED, &qdev->flags)) { - /* - * Start the DPC for each active queue. - */ - for (i = 1; i < qdev->rx_ring_count; i++) { - rx_ring = &qdev->rx_ring[i]; - if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) != - rx_ring->cnsmr_idx) { + var = ql_read32(qdev, ISR1); + if (var & intr_context->irq_mask) { QPRINTK(qdev, INTR, INFO, - "Waking handler for rx_ring[%d].\n", i); - ql_disable_completion_interrupt(qdev, - intr_context-> - intr); - if (i < qdev->rss_ring_first_cq_id) - queue_delayed_work_on(rx_ring->cpu, - qdev->q_workqueue, - &rx_ring->rx_work, - 0); - else + "Waking handler for rx_ring[0].\n"); + ql_disable_completion_interrupt(qdev, intr_context->intr); napi_schedule(&rx_ring->napi); work_done++; } - } - } ql_enable_completion_interrupt(qdev, intr_context->intr); return work_done ? IRQ_HANDLED : IRQ_NONE; } @@ -2706,35 +2677,9 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring) } switch (rx_ring->type) { case TX_Q: - /* If there's only one interrupt, then we use - * worker threads to process the outbound - * completion handling rx_rings. We do this so - * they can be run on multiple CPUs. There is - * room to play with this more where we would only - * run in a worker if there are more than x number - * of outbound completions on the queue and more - * than one queue active. Some threshold that - * would indicate a benefit in spite of the cost - * of a context switch. - * If there's more than one interrupt, then the - * outbound completions are processed in the ISR. - */ - if (!test_bit(QL_MSIX_ENABLED, &qdev->flags)) - INIT_DELAYED_WORK(&rx_ring->rx_work, ql_tx_clean); - else { - /* With all debug warnings on we see a WARN_ON message - * when we free the skb in the interrupt context. - */ - INIT_DELAYED_WORK(&rx_ring->rx_work, ql_tx_clean); - } cqicb->irq_delay = cpu_to_le16(qdev->tx_coalesce_usecs); cqicb->pkt_delay = cpu_to_le16(qdev->tx_max_coalesced_frames); break; - case DEFAULT_Q: - INIT_DELAYED_WORK(&rx_ring->rx_work, ql_rx_clean); - cqicb->irq_delay = 0; - cqicb->pkt_delay = 0; - break; case RX_Q: /* Inbound completion handling rx_rings run in * separate NAPI contexts. @@ -2818,17 +2763,20 @@ static void ql_disable_msix(struct ql_adapter *qdev) } } +/* We start by trying to get the number of vectors + * stored in qdev->intr_count. If we don't get that + * many then we reduce the count and try again. + */ static void ql_enable_msix(struct ql_adapter *qdev) { - int i; + int i, err; - qdev->intr_count = 1; /* Get the MSIX vectors. */ if (irq_type == MSIX_IRQ) { /* Try to alloc space for the msix struct, * if it fails then go to MSI/legacy. */ - qdev->msi_x_entry = kcalloc(qdev->rx_ring_count, + qdev->msi_x_entry = kcalloc(qdev->intr_count, sizeof(struct msix_entry), GFP_KERNEL); if (!qdev->msi_x_entry) { @@ -2836,26 +2784,36 @@ static void ql_enable_msix(struct ql_adapter *qdev) goto msi; } - for (i = 0; i < qdev->rx_ring_count; i++) + for (i = 0; i < qdev->intr_count; i++) qdev->msi_x_entry[i].entry = i; - if (!pci_enable_msix - (qdev->pdev, qdev->msi_x_entry, qdev->rx_ring_count)) { - set_bit(QL_MSIX_ENABLED, &qdev->flags); - qdev->intr_count = qdev->rx_ring_count; - QPRINTK(qdev, IFUP, DEBUG, - "MSI-X Enabled, got %d vectors.\n", - qdev->intr_count); - return; - } else { + /* Loop to get our vectors. We start with + * what we want and settle for what we get. + */ + do { + err = pci_enable_msix(qdev->pdev, + qdev->msi_x_entry, qdev->intr_count); + if (err > 0) + qdev->intr_count = err; + } while (err > 0); + + if (err < 0) { kfree(qdev->msi_x_entry); qdev->msi_x_entry = NULL; QPRINTK(qdev, IFUP, WARNING, "MSI-X Enable failed, trying MSI.\n"); + qdev->intr_count = 1; irq_type = MSI_IRQ; + } else if (err == 0) { + set_bit(QL_MSIX_ENABLED, &qdev->flags); + QPRINTK(qdev, IFUP, INFO, + "MSI-X Enabled, got %d vectors.\n", + qdev->intr_count); + return; } } msi: + qdev->intr_count = 1; if (irq_type == MSI_IRQ) { if (!pci_enable_msi(qdev->pdev)) { set_bit(QL_MSI_ENABLED, &qdev->flags); @@ -2868,6 +2826,71 @@ msi: QPRINTK(qdev, IFUP, DEBUG, "Running with legacy interrupts.\n"); } +/* Each vector services 1 RSS ring and and 1 or more + * TX completion rings. This function loops through + * the TX completion rings and assigns the vector that + * will service it. An example would be if there are + * 2 vectors (so 2 RSS rings) and 8 TX completion rings. + * This would mean that vector 0 would service RSS ring 0 + * and TX competion rings 0,1,2 and 3. Vector 1 would + * service RSS ring 1 and TX completion rings 4,5,6 and 7. + */ +static void ql_set_tx_vect(struct ql_adapter *qdev) +{ + int i, j, vect; + u32 tx_rings_per_vector = qdev->tx_ring_count / qdev->intr_count; + + if (likely(test_bit(QL_MSIX_ENABLED, &qdev->flags))) { + /* Assign irq vectors to TX rx_rings.*/ + for (vect = 0, j = 0, i = qdev->rss_ring_count; + i < qdev->rx_ring_count; i++) { + if (j == tx_rings_per_vector) { + vect++; + j = 0; + } + qdev->rx_ring[i].irq = vect; + j++; + } + } else { + /* For single vector all rings have an irq + * of zero. + */ + for (i = 0; i < qdev->rx_ring_count; i++) + qdev->rx_ring[i].irq = 0; + } +} + +/* Set the interrupt mask for this vector. Each vector + * will service 1 RSS ring and 1 or more TX completion + * rings. This function sets up a bit mask per vector + * that indicates which rings it services. + */ +static void ql_set_irq_mask(struct ql_adapter *qdev, struct intr_context *ctx) +{ + int j, vect = ctx->intr; + u32 tx_rings_per_vector = qdev->tx_ring_count / qdev->intr_count; + + if (likely(test_bit(QL_MSIX_ENABLED, &qdev->flags))) { + /* Add the RSS ring serviced by this vector + * to the mask. + */ + ctx->irq_mask = (1 << qdev->rx_ring[vect].cq_id); + /* Add the TX ring(s) serviced by this vector + * to the mask. */ + for (j = 0; j < tx_rings_per_vector; j++) { + ctx->irq_mask |= + (1 << qdev->rx_ring[qdev->rss_ring_count + + (vect * tx_rings_per_vector) + j].cq_id); + } + } else { + /* For single vector we just shift each queue's + * ID into the mask. + */ + for (j = 0; j < qdev->rx_ring_count; j++) + ctx->irq_mask |= (1 << qdev->rx_ring[j].cq_id); + } +} + /* * Here we build the intr_context structures based on * our rx_ring count and intr vector count. @@ -2879,18 +2902,19 @@ static void ql_resolve_queues_to_irqs(struct ql_adapter *qdev) int i = 0; struct intr_context *intr_context = &qdev->intr_context[0]; - ql_enable_msix(qdev); - if (likely(test_bit(QL_MSIX_ENABLED, &qdev->flags))) { /* Each rx_ring has it's * own intr_context since we have separate * vectors for each queue. - * This only true when MSI-X is enabled. */ for (i = 0; i < qdev->intr_count; i++, intr_context++) { qdev->rx_ring[i].irq = i; intr_context->intr = i; intr_context->qdev = qdev; + /* Set up this vector's bit-mask that indicates + * which queues it services. + */ + ql_set_irq_mask(qdev, intr_context); /* * We set up each vectors enable/disable/read bits so * there's no bit/mask calculations in the critical path. @@ -2907,21 +2931,14 @@ static void ql_resolve_queues_to_irqs(struct ql_adapter *qdev) INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK | INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD | i; - if (i == 0) { - /* - * Default queue handles bcast/mcast plus - * async events. Needs buffers. + /* The first vector/queue handles + * broadcast/multicast, fatal errors, + * and firmware events. This in addition + * to normal inbound NAPI processing. */ intr_context->handler = qlge_isr; - sprintf(intr_context->name, "%s-default-queue", - qdev->ndev->name); - } else if (i < qdev->rss_ring_first_cq_id) { - /* - * Outbound queue is for outbound completions only. - */ - intr_context->handler = qlge_msix_tx_isr; - sprintf(intr_context->name, "%s-tx-%d", + sprintf(intr_context->name, "%s-rx-%d", qdev->ndev->name, i); } else { /* @@ -2955,9 +2972,17 @@ static void ql_resolve_queues_to_irqs(struct ql_adapter *qdev) */ intr_context->handler = qlge_isr; sprintf(intr_context->name, "%s-single_irq", qdev->ndev->name); - for (i = 0; i < qdev->rx_ring_count; i++) - qdev->rx_ring[i].irq = 0; + /* Set up this vector's bit-mask that indicates + * which queues it services. In this case there is + * a single vector so it will service all RSS and + * TX completion rings. + */ + ql_set_irq_mask(qdev, intr_context); } + /* Tell the TX completion rings which MSIx vector + * they will be using. + */ + ql_set_tx_vect(qdev); } static void ql_free_irq(struct ql_adapter *qdev) @@ -3062,7 +3087,7 @@ static int ql_start_rss(struct ql_adapter *qdev) memset((void *)ricb, 0, sizeof(*ricb)); - ricb->base_cq = qdev->rss_ring_first_cq_id | RSS_L4K; + ricb->base_cq = RSS_L4K; ricb->flags = (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RI4 | RSS_RI6 | RSS_RT4 | RSS_RT6); @@ -3264,7 +3289,7 @@ static int ql_adapter_initialize(struct ql_adapter *qdev) } /* Start NAPI for the RSS queues. */ - for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++) { + for (i = 0; i < qdev->rss_ring_count; i++) { QPRINTK(qdev, IFUP, DEBUG, "Enabling NAPI for rx_ring[%d].\n", i); napi_enable(&qdev->rx_ring[i].napi); @@ -3326,7 +3351,6 @@ static void ql_display_dev_info(struct net_device *ndev) static int ql_adapter_down(struct ql_adapter *qdev) { int i, status = 0; - struct rx_ring *rx_ring; ql_link_off(qdev); @@ -3340,27 +3364,8 @@ static int ql_adapter_down(struct ql_adapter *qdev) cancel_delayed_work_sync(&qdev->mpi_idc_work); cancel_delayed_work_sync(&qdev->mpi_port_cfg_work); - /* The default queue at index 0 is always processed in - * a workqueue. - */ - cancel_delayed_work_sync(&qdev->rx_ring[0].rx_work); - - /* The rest of the rx_rings are processed in - * a workqueue only if it's a single interrupt - * environment (MSI/Legacy). - */ - for (i = 1; i < qdev->rx_ring_count; i++) { - rx_ring = &qdev->rx_ring[i]; - /* Only the RSS rings use NAPI on multi irq - * environment. Outbound completion processing - * is done in interrupt context. - */ - if (i >= qdev->rss_ring_first_cq_id) { - napi_disable(&rx_ring->napi); - } else { - cancel_delayed_work_sync(&rx_ring->rx_work); - } - } + for (i = 0; i < qdev->rss_ring_count; i++) + napi_disable(&qdev->rx_ring[i].napi); clear_bit(QL_ADAPTER_UP, &qdev->flags); @@ -3370,7 +3375,7 @@ static int ql_adapter_down(struct ql_adapter *qdev) /* Call netif_napi_del() from common point. */ - for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++) + for (i = 0; i < qdev->rss_ring_count; i++) netif_napi_del(&qdev->rx_ring[i].napi); ql_free_rx_buffers(qdev); @@ -3449,43 +3454,21 @@ static int ql_configure_rings(struct ql_adapter *qdev) int i; struct rx_ring *rx_ring; struct tx_ring *tx_ring; - int cpu_cnt = num_online_cpus(); - - /* - * For each processor present we allocate one - * rx_ring for outbound completions, and one - * rx_ring for inbound completions. Plus there is - * always the one default queue. For the CPU - * counts we end up with the following rx_rings: - * rx_ring count = - * one default queue + - * (CPU count * outbound completion rx_ring) + - * (CPU count * inbound (RSS) completion rx_ring) - * To keep it simple we limit the total number of - * queues to < 32, so we truncate CPU to 8. - * This limitation can be removed when requested. - */ - - if (cpu_cnt > MAX_CPUS) - cpu_cnt = MAX_CPUS; - - /* - * rx_ring[0] is always the default queue. + int cpu_cnt = min(MAX_CPUS, (int)num_online_cpus()); + + /* In a perfect world we have one RSS ring for each CPU + * and each has it's own vector. To do that we ask for + * cpu_cnt vectors. ql_enable_msix() will adjust the + * vector count to what we actually get. We then + * allocate an RSS ring for each. + * Essentially, we are doing min(cpu_count, msix_vector_count). */ - /* Allocate outbound completion ring for each CPU. */ + qdev->intr_count = cpu_cnt; + ql_enable_msix(qdev); + /* Adjust the RSS ring count to the actual vector count. */ + qdev->rss_ring_count = qdev->intr_count; qdev->tx_ring_count = cpu_cnt; - /* Allocate inbound completion (RSS) ring for each CPU. */ - qdev->rss_ring_count = cpu_cnt; - /* cq_id for the first inbound ring handler. */ - qdev->rss_ring_first_cq_id = cpu_cnt + 1; - /* - * qdev->rx_ring_count: - * Total number of rx_rings. This includes the one - * default queue, a number of outbound completion - * handler rx_rings, and the number of inbound - * completion handler rx_rings. - */ - qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count + 1; + qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count; for (i = 0; i < qdev->tx_ring_count; i++) { tx_ring = &qdev->tx_ring[i]; @@ -3498,9 +3481,9 @@ static int ql_configure_rings(struct ql_adapter *qdev) /* * The completion queue ID for the tx rings start - * immediately after the default Q ID, which is zero. + * immediately after the rss rings. */ - tx_ring->cq_id = i + 1; + tx_ring->cq_id = qdev->rss_ring_count + i; } for (i = 0; i < qdev->rx_ring_count; i++) { @@ -3509,10 +3492,9 @@ static int ql_configure_rings(struct ql_adapter *qdev) rx_ring->qdev = qdev; rx_ring->cq_id = i; rx_ring->cpu = i % cpu_cnt; /* CPU to run handler on. */ - if (i == 0) { /* Default queue at index 0. */ + if (i < qdev->rss_ring_count) { /* - * Default queue handles bcast/mcast plus - * async events. Needs buffers. + * Inbound (RSS) queues. */ rx_ring->cq_len = qdev->rx_ring_size; rx_ring->cq_size = @@ -3525,8 +3507,8 @@ static int ql_configure_rings(struct ql_adapter *qdev) rx_ring->sbq_size = rx_ring->sbq_len * sizeof(__le64); rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2; - rx_ring->type = DEFAULT_Q; - } else if (i < qdev->rss_ring_first_cq_id) { + rx_ring->type = RX_Q; + } else { /* * Outbound queue handles outbound completions only. */ @@ -3541,22 +3523,6 @@ static int ql_configure_rings(struct ql_adapter *qdev) rx_ring->sbq_size = 0; rx_ring->sbq_buf_size = 0; rx_ring->type = TX_Q; - } else { /* Inbound completions (RSS) queues */ - /* - * Inbound queues handle unicast frames only. - */ - rx_ring->cq_len = qdev->rx_ring_size; - rx_ring->cq_size = - rx_ring->cq_len * sizeof(struct ql_net_rsp_iocb); - rx_ring->lbq_len = NUM_LARGE_BUFFERS; - rx_ring->lbq_size = - rx_ring->lbq_len * sizeof(__le64); - rx_ring->lbq_buf_size = LARGE_BUFFER_SIZE; - rx_ring->sbq_len = NUM_SMALL_BUFFERS; - rx_ring->sbq_size = - rx_ring->sbq_len * sizeof(__le64); - rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2; - rx_ring->type = RX_Q; } } return 0; @@ -3845,10 +3811,7 @@ static void ql_release_all(struct pci_dev *pdev) destroy_workqueue(qdev->workqueue); qdev->workqueue = NULL; } - if (qdev->q_workqueue) { - destroy_workqueue(qdev->q_workqueue); - qdev->q_workqueue = NULL; - } + if (qdev->reg_base) iounmap(qdev->reg_base); if (qdev->doorbell_area) @@ -3961,8 +3924,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev, * Set up the operating parameters. */ qdev->rx_csum = 1; - - qdev->q_workqueue = create_workqueue(ndev->name); qdev->workqueue = create_singlethread_workqueue(ndev->name); INIT_DELAYED_WORK(&qdev->asic_reset_work, ql_asic_reset_work); INIT_DELAYED_WORK(&qdev->mpi_reset_work, ql_mpi_reset_work); diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 840677f..8068a07 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c @@ -49,8 +49,8 @@ #include <asm/processor.h> #define DRV_NAME "r6040" -#define DRV_VERSION "0.24" -#define DRV_RELDATE "08Jul2009" +#define DRV_VERSION "0.25" +#define DRV_RELDATE "20Aug2009" /* PHY CHIP Address */ #define PHY1_ADDR 1 /* For MAC1 */ @@ -750,14 +750,6 @@ static int r6040_up(struct net_device *dev) struct r6040_private *lp = netdev_priv(dev); void __iomem *ioaddr = lp->base; int ret; - u16 val; - - /* Check presence of a second PHY */ - val = r6040_phy_read(ioaddr, lp->phy_addr, 2); - if (val == 0xFFFF) { - printk(KERN_ERR DRV_NAME " no second PHY attached\n"); - return -EIO; - } /* Initialise and alloc RX/TX buffers */ r6040_init_txbufs(dev); @@ -1091,7 +1083,6 @@ static int __devinit r6040_init_one(struct pci_dev *pdev, int err, io_size = R6040_IO_SIZE; static int card_idx = -1; int bar = 0; - long pioaddr; u16 *adrp; printk(KERN_INFO "%s\n", version); @@ -1121,7 +1112,6 @@ static int __devinit r6040_init_one(struct pci_dev *pdev, goto err_out; } - pioaddr = pci_resource_start(pdev, bar); /* IO map base address */ pci_set_master(pdev); dev = alloc_etherdev(sizeof(struct r6040_private)); @@ -1196,6 +1186,13 @@ static int __devinit r6040_init_one(struct pci_dev *pdev, lp->mii_if.phy_id_mask = 0x1f; lp->mii_if.reg_num_mask = 0x1f; + /* Check the vendor ID on the PHY, if 0xffff assume none attached */ + if (r6040_phy_read(ioaddr, lp->phy_addr, 2) == 0xffff) { + printk(KERN_ERR DRV_NAME ": Failed to detect an attached PHY\n"); + err = -ENODEV; + goto err_out_unmap; + } + /* Register net device. After this dev->name assign */ err = register_netdev(dev); if (err) { diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index 343e8da1..07a7e4b 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c @@ -1179,6 +1179,8 @@ static void efx_stop_all(struct efx_nic *efx) /* Isolate the MAC from the TX and RX engines, so that queue * flushes will complete in a timely fashion. */ + falcon_deconfigure_mac_wrapper(efx); + msleep(10); /* Let the Rx FIFO drain */ falcon_drain_tx_fifo(efx); /* Stop the kernel transmit interface late, so the watchdog @@ -1614,21 +1616,24 @@ static int efx_register_netdev(struct efx_nic *efx) SET_NETDEV_DEV(net_dev, &efx->pci_dev->dev); SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops); - /* Always start with carrier off; PHY events will detect the link */ - netif_carrier_off(efx->net_dev); - /* Clear MAC statistics */ efx->mac_op->update_stats(efx); memset(&efx->mac_stats, 0, sizeof(efx->mac_stats)); - rc = register_netdev(net_dev); - if (rc) { - EFX_ERR(efx, "could not register net dev\n"); - return rc; - } - rtnl_lock(); + + rc = dev_alloc_name(net_dev, net_dev->name); + if (rc < 0) + goto fail_locked; efx_update_name(efx); + + rc = register_netdevice(net_dev); + if (rc) + goto fail_locked; + + /* Always start with carrier off; PHY events will detect the link */ + netif_carrier_off(efx->net_dev); + rtnl_unlock(); rc = device_create_file(&efx->pci_dev->dev, &dev_attr_phy_type); @@ -1639,6 +1644,11 @@ static int efx_register_netdev(struct efx_nic *efx) return 0; +fail_locked: + rtnl_unlock(); + EFX_ERR(efx, "could not register net dev\n"); + return rc; + fail_registered: unregister_netdev(net_dev); return rc; diff --git a/drivers/net/sfc/falcon_hwdefs.h b/drivers/net/sfc/falcon_hwdefs.h index 375e2a5..2d22611 100644 --- a/drivers/net/sfc/falcon_hwdefs.h +++ b/drivers/net/sfc/falcon_hwdefs.h @@ -700,6 +700,8 @@ /* XGXS/XAUI powerdown/reset register */ #define XX_PWR_RST_REG 0x1300 +#define XX_SD_RST_ACT_LBN 16 +#define XX_SD_RST_ACT_WIDTH 1 #define XX_PWRDND_EN_LBN 15 #define XX_PWRDND_EN_WIDTH 1 #define XX_PWRDNC_EN_LBN 14 diff --git a/drivers/net/sfc/falcon_xmac.c b/drivers/net/sfc/falcon_xmac.c index 2b3269c..bec52ca 100644 --- a/drivers/net/sfc/falcon_xmac.c +++ b/drivers/net/sfc/falcon_xmac.c @@ -64,13 +64,15 @@ int falcon_reset_xaui(struct efx_nic *efx) efx_oword_t reg; int count; + /* Start reset sequence */ EFX_POPULATE_DWORD_1(reg, XX_RST_XX_EN, 1); falcon_write(efx, ®, XX_PWR_RST_REG); - /* Give some time for the link to establish */ - for (count = 0; count < 1000; count++) { /* wait upto 10ms */ + /* Wait up to 10 ms for completion, then reinitialise */ + for (count = 0; count < 1000; count++) { falcon_read(efx, ®, XX_PWR_RST_REG); - if (EFX_OWORD_FIELD(reg, XX_RST_XX_EN) == 0) { + if (EFX_OWORD_FIELD(reg, XX_RST_XX_EN) == 0 && + EFX_OWORD_FIELD(reg, XX_SD_RST_ACT) == 0) { falcon_setup_xaui(efx); return 0; } diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h index 5eabede..298566d 100644 --- a/drivers/net/sfc/net_driver.h +++ b/drivers/net/sfc/net_driver.h @@ -984,9 +984,14 @@ static inline void clear_bit_le(unsigned nr, unsigned char *addr) * * The 10G MAC used in Falcon requires 8-byte alignment on the frame * length, so we round up to the nearest 8. + * + * Re-clocking by the XGXS on RX can reduce an IPG to 32 bits (half an + * XGMII cycle). If the frame length reaches the maximum value in the + * same cycle, the XMAC can miss the IPG altogether. We work around + * this by adding a further 16 bytes. */ #define EFX_MAX_FRAME_LEN(mtu) \ - ((((mtu) + ETH_HLEN + VLAN_HLEN + 4/* FCS */) + 7) & ~7) + ((((mtu) + ETH_HLEN + VLAN_HLEN + 4/* FCS */ + 7) & ~7) + 16) #endif /* EFX_NET_DRIVER_H */ diff --git a/drivers/net/sfc/xfp_phy.c b/drivers/net/sfc/xfp_phy.c index bb2e6af..e6b3d5e 100644 --- a/drivers/net/sfc/xfp_phy.c +++ b/drivers/net/sfc/xfp_phy.c @@ -97,23 +97,24 @@ static int qt2025c_wait_reset(struct efx_nic *efx) return 0; } -/* Reset the PHYXS MMD. This is documented (for the Quake PHYs) as doing - * a complete soft reset. - */ static int xfp_reset_phy(struct efx_nic *efx) { int rc; - rc = efx_mdio_reset_mmd(efx, MDIO_MMD_PHYXS, - XFP_MAX_RESET_TIME / XFP_RESET_WAIT, - XFP_RESET_WAIT); - if (rc < 0) - goto fail; - if (efx->phy_type == PHY_TYPE_QT2025C) { + /* Wait for the reset triggered by falcon_reset_hw() + * to complete */ rc = qt2025c_wait_reset(efx); if (rc < 0) goto fail; + } else { + /* Reset the PHYXS MMD. This is documented as doing + * a complete soft reset. */ + rc = efx_mdio_reset_mmd(efx, MDIO_MMD_PHYXS, + XFP_MAX_RESET_TIME / XFP_RESET_WAIT, + XFP_RESET_WAIT); + if (rc < 0) + goto fail; } /* Wait 250ms for the PHY to complete bootup */ diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 4c4dcbf..f49d0800 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c @@ -772,13 +772,15 @@ static void sh_eth_error(struct net_device *ndev, int intr_status) mdp->stats.tx_carrier_errors++; if (felic_stat & ECSR_LCHNG) { /* Link Changed */ - if (mdp->cd->no_psr) { + if (mdp->cd->no_psr || mdp->no_ether_link) { if (mdp->link == PHY_DOWN) link_stat = 0; else link_stat = PHY_ST_LINK; } else { link_stat = (ctrl_inl(ioaddr + PSR)); + if (mdp->ether_link_active_low) + link_stat = ~link_stat; } if (!(link_stat & PHY_ST_LINK)) { /* Link Down : disable tx and rx */ @@ -1410,6 +1412,8 @@ static int sh_eth_drv_probe(struct platform_device *pdev) mdp->phy_id = pd->phy; /* EDMAC endian */ mdp->edmac_endian = pd->edmac_endian; + mdp->no_ether_link = pd->no_ether_link; + mdp->ether_link_active_low = pd->ether_link_active_low; /* set cpu data */ mdp->cd = &sh_eth_my_cpu_data; diff --git a/drivers/net/sh_eth.h b/drivers/net/sh_eth.h index 9afe5b4..ba151f8 100644 --- a/drivers/net/sh_eth.h +++ b/drivers/net/sh_eth.h @@ -729,6 +729,9 @@ struct sh_eth_private { char post_rx; /* POST receive */ char post_fw; /* POST forward */ struct net_device_stats tsu_stats; /* TSU forward status */ + + unsigned no_ether_link:1; + unsigned ether_link_active_low:1; }; static inline void sh_eth_soft_swap(char *src, int len) diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 46a3f86..a7d14aae 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -68,8 +68,8 @@ #define DRV_MODULE_NAME "tg3" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "3.99" -#define DRV_MODULE_RELDATE "April 20, 2009" +#define DRV_MODULE_VERSION "3.101" +#define DRV_MODULE_RELDATE "August 28, 2009" #define TG3_DEF_MAC_MODE 0 #define TG3_DEF_RX_MODE 0 @@ -92,7 +92,7 @@ /* hardware minimum and maximum for a single frame's data payload */ #define TG3_MIN_MTU 60 #define TG3_MAX_MTU(tp) \ - ((tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) ? 9000 : 1500) + ((tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) ? 9000 : 1500) /* These numbers seem to be hard coded in the NIC firmware somehow. * You can't change the ring sizes, but you can change where you place @@ -117,19 +117,26 @@ #define TG3_RX_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \ TG3_RX_RING_SIZE) -#define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \ - TG3_RX_JUMBO_RING_SIZE) +#define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_ext_rx_buffer_desc) * \ + TG3_RX_JUMBO_RING_SIZE) #define TG3_RX_RCB_RING_BYTES(tp) (sizeof(struct tg3_rx_buffer_desc) * \ - TG3_RX_RCB_RING_SIZE(tp)) + TG3_RX_RCB_RING_SIZE(tp)) #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ TG3_TX_RING_SIZE) #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) -#define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64) -#define RX_JUMBO_PKT_BUF_SZ (9046 + tp->rx_offset + 64) +#define TG3_DMA_BYTE_ENAB 64 + +#define TG3_RX_STD_DMA_SZ 1536 +#define TG3_RX_JMB_DMA_SZ 9046 + +#define TG3_RX_DMA_TO_MAP_SZ(x) ((x) + TG3_DMA_BYTE_ENAB) + +#define TG3_RX_STD_MAP_SZ TG3_RX_DMA_TO_MAP_SZ(TG3_RX_STD_DMA_SZ) +#define TG3_RX_JMB_MAP_SZ TG3_RX_DMA_TO_MAP_SZ(TG3_RX_JMB_DMA_SZ) /* minimum number of free TX descriptors required to wake up TX process */ -#define TG3_TX_WAKEUP_THRESH(tp) ((tp)->tx_pending / 4) +#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4) #define TG3_RAW_IP_ALIGN 2 @@ -219,11 +226,12 @@ static struct pci_device_id tg3_pci_tbl[] = { {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761E)}, {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761S)}, {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761SE)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5785)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_G)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_F)}, {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780)}, {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57760)}, {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57790)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57720)}, + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57788)}, {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, @@ -607,13 +615,13 @@ static void tg3_disable_ints(struct tg3 *tp) { tw32(TG3PCI_MISC_HOST_CTRL, (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT)); - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); + tw32_mailbox_f(tp->napi[0].int_mbox, 0x00000001); } static inline void tg3_cond_int(struct tg3 *tp) { if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) && - (tp->hw_status->status & SD_STATUS_UPDATED)) + (tp->napi[0].hw_status->status & SD_STATUS_UPDATED)) tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT); else tw32(HOSTCC_MODE, tp->coalesce_mode | @@ -622,22 +630,22 @@ static inline void tg3_cond_int(struct tg3 *tp) static void tg3_enable_ints(struct tg3 *tp) { + struct tg3_napi *tnapi = &tp->napi[0]; tp->irq_sync = 0; wmb(); tw32(TG3PCI_MISC_HOST_CTRL, (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT)); - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, - (tp->last_tag << 24)); + tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24); if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, - (tp->last_tag << 24)); + tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24); tg3_cond_int(tp); } -static inline unsigned int tg3_has_work(struct tg3 *tp) +static inline unsigned int tg3_has_work(struct tg3_napi *tnapi) { - struct tg3_hw_status *sblk = tp->hw_status; + struct tg3 *tp = tnapi->tp; + struct tg3_hw_status *sblk = tnapi->hw_status; unsigned int work_exists = 0; /* check for phy events */ @@ -648,22 +656,23 @@ static inline unsigned int tg3_has_work(struct tg3 *tp) work_exists = 1; } /* check for RX/TX work to do */ - if (sblk->idx[0].tx_consumer != tp->tx_cons || - sblk->idx[0].rx_producer != tp->rx_rcb_ptr) + if (sblk->idx[0].tx_consumer != tnapi->tx_cons || + sblk->idx[0].rx_producer != tnapi->rx_rcb_ptr) work_exists = 1; return work_exists; } -/* tg3_restart_ints +/* tg3_int_reenable * similar to tg3_enable_ints, but it accurately determines whether there * is new work pending and can return without flushing the PIO write * which reenables interrupts */ -static void tg3_restart_ints(struct tg3 *tp) +static void tg3_int_reenable(struct tg3_napi *tnapi) { - tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, - tp->last_tag << 24); + struct tg3 *tp = tnapi->tp; + + tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24); mmiowb(); /* When doing tagged status, this work check is unnecessary. @@ -671,7 +680,7 @@ static void tg3_restart_ints(struct tg3 *tp) * work we've completed. */ if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) && - tg3_has_work(tp)) + tg3_has_work(tnapi)) tw32(HOSTCC_MODE, tp->coalesce_mode | (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW)); } @@ -679,19 +688,20 @@ static void tg3_restart_ints(struct tg3 *tp) static inline void tg3_netif_stop(struct tg3 *tp) { tp->dev->trans_start = jiffies; /* prevent tx timeout */ - napi_disable(&tp->napi); + napi_disable(&tp->napi[0].napi); netif_tx_disable(tp->dev); } static inline void tg3_netif_start(struct tg3 *tp) { + struct tg3_napi *tnapi = &tp->napi[0]; netif_wake_queue(tp->dev); /* NOTE: unconditional netif_wake_queue is only appropriate * so long as all callers are assured to have free tx slots * (such as after tg3_init_hw) */ - napi_enable(&tp->napi); - tp->hw_status->status |= SD_STATUS_UPDATED; + napi_enable(&tnapi->napi); + tnapi->hw_status->status |= SD_STATUS_UPDATED; tg3_enable_ints(tp); } @@ -784,7 +794,7 @@ static int tg3_writephy(struct tg3 *tp, int reg, u32 val) unsigned int loops; int ret; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 && + if ((tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) && (reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL)) return 0; @@ -917,7 +927,9 @@ static void tg3_mdio_config_5785(struct tg3 *tp) tw32(MAC_PHYCFG2, val); val = tr32(MAC_PHYCFG1); - val &= ~MAC_PHYCFG1_RGMII_INT; + val &= ~(MAC_PHYCFG1_RGMII_INT | + MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK); + val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT; tw32(MAC_PHYCFG1, val); return; @@ -933,15 +945,18 @@ static void tg3_mdio_config_5785(struct tg3 *tp) tw32(MAC_PHYCFG2, val); - val = tr32(MAC_PHYCFG1) & ~(MAC_PHYCFG1_RGMII_EXT_RX_DEC | - MAC_PHYCFG1_RGMII_SND_STAT_EN); - if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE) { + val = tr32(MAC_PHYCFG1); + val &= ~(MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK | + MAC_PHYCFG1_RGMII_EXT_RX_DEC | MAC_PHYCFG1_RGMII_SND_STAT_EN); + if (!(tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE)) { if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_RX_EN) val |= MAC_PHYCFG1_RGMII_EXT_RX_DEC; if (tp->tg3_flags3 & TG3_FLG3_RGMII_EXT_IBND_TX_EN) val |= MAC_PHYCFG1_RGMII_SND_STAT_EN; } - tw32(MAC_PHYCFG1, val | MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV); + val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT | + MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV; + tw32(MAC_PHYCFG1, val); val = tr32(MAC_EXT_RGMII_MODE); val &= ~(MAC_RGMII_MODE_RX_INT_B | @@ -1064,6 +1079,7 @@ static int tg3_mdio_init(struct tg3 *tp) case TG3_PHY_ID_RTL8201E: case TG3_PHY_ID_BCMAC131: phydev->interface = PHY_INTERFACE_MODE_MII; + tp->tg3_flags3 |= TG3_FLG3_PHY_IS_FET; break; } @@ -1469,14 +1485,38 @@ static void tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val) tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val); } +static void tg3_phy_fet_toggle_apd(struct tg3 *tp, bool enable) +{ + u32 phytest; + + if (!tg3_readphy(tp, MII_TG3_FET_TEST, &phytest)) { + u32 phy; + + tg3_writephy(tp, MII_TG3_FET_TEST, + phytest | MII_TG3_FET_SHADOW_EN); + if (!tg3_readphy(tp, MII_TG3_FET_SHDW_AUXSTAT2, &phy)) { + if (enable) + phy |= MII_TG3_FET_SHDW_AUXSTAT2_APD; + else + phy &= ~MII_TG3_FET_SHDW_AUXSTAT2_APD; + tg3_writephy(tp, MII_TG3_FET_SHDW_AUXSTAT2, phy); + } + tg3_writephy(tp, MII_TG3_FET_TEST, phytest); + } +} + static void tg3_phy_toggle_apd(struct tg3 *tp, bool enable) { u32 reg; - if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) return; + if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { + tg3_phy_fet_toggle_apd(tp, enable); + return; + } + reg = MII_TG3_MISC_SHDW_WREN | MII_TG3_MISC_SHDW_SCR5_SEL | MII_TG3_MISC_SHDW_SCR5_LPED | @@ -1506,20 +1546,22 @@ static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable) (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) return; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { + if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { u32 ephy; - if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &ephy)) { - tg3_writephy(tp, MII_TG3_EPHY_TEST, - ephy | MII_TG3_EPHY_SHADOW_EN); - if (!tg3_readphy(tp, MII_TG3_EPHYTST_MISCCTRL, &phy)) { + if (!tg3_readphy(tp, MII_TG3_FET_TEST, &ephy)) { + u32 reg = MII_TG3_FET_SHDW_MISCCTRL; + + tg3_writephy(tp, MII_TG3_FET_TEST, + ephy | MII_TG3_FET_SHADOW_EN); + if (!tg3_readphy(tp, reg, &phy)) { if (enable) - phy |= MII_TG3_EPHYTST_MISCCTRL_MDIX; + phy |= MII_TG3_FET_SHDW_MISCCTRL_MDIX; else - phy &= ~MII_TG3_EPHYTST_MISCCTRL_MDIX; - tg3_writephy(tp, MII_TG3_EPHYTST_MISCCTRL, phy); + phy &= ~MII_TG3_FET_SHDW_MISCCTRL_MDIX; + tg3_writephy(tp, reg, phy); } - tg3_writephy(tp, MII_TG3_EPHY_TEST, ephy); + tg3_writephy(tp, MII_TG3_FET_TEST, ephy); } } else { phy = MII_TG3_AUXCTL_MISC_RDSEL_MISC | @@ -1888,7 +1930,7 @@ out: if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { /* Cannot do read-modify-write on 5401 */ tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20); - } else if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) { + } else if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { u32 phy_reg; /* Set bit 14 with read-modify-write to preserve other bits */ @@ -1900,7 +1942,7 @@ out: /* Set phy register 0x10 bit 0 to high fifo elasticity to support * jumbo frames transmission. */ - if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) { + if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { u32 phy_reg; if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg)) @@ -1910,7 +1952,7 @@ out: if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { /* adjust output voltage */ - tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x12); + tg3_writephy(tp, MII_TG3_FET_PTEST, 0x12); } tg3_phy_toggle_automdix(tp, 1); @@ -2655,7 +2697,7 @@ static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 break; default: - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { + if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 : SPEED_10; *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL : @@ -2990,7 +3032,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset) if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG); - else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) + else if (!(tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET)) tg3_writephy(tp, MII_TG3_IMASK, ~0); if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || @@ -3100,7 +3142,9 @@ relink: tp->mac_mode |= MAC_MODE_PORT_MODE_MII; else tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - } else + } else if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) + tp->mac_mode |= MAC_MODE_PORT_MODE_MII; + else tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX; @@ -3167,6 +3211,15 @@ relink: pci_write_config_word(tp->pdev, tp->pcie_cap + PCI_EXP_LNKCTL, newlnkctl); + } else if (tp->tg3_flags3 & TG3_FLG3_TOGGLE_10_100_L1PLLPD) { + u32 newreg, oldreg = tr32(TG3_PCIE_LNKCTL); + if (tp->link_config.active_speed == SPEED_100 || + tp->link_config.active_speed == SPEED_10) + newreg = oldreg & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN; + else + newreg = oldreg | TG3_PCIE_LNKCTL_L1_PLL_PD_EN; + if (newreg != oldreg) + tw32(TG3_PCIE_LNKCTL, newreg); } if (current_link_up != netif_carrier_ok(tp->dev)) { @@ -3848,9 +3901,9 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset) else current_link_up = tg3_setup_fiber_by_hand(tp, mac_status); - tp->hw_status->status = + tp->napi[0].hw_status->status = (SD_STATUS_UPDATED | - (tp->hw_status->status & ~SD_STATUS_LINK_CHG)); + (tp->napi[0].hw_status->status & ~SD_STATUS_LINK_CHG)); for (i = 0; i < 100; i++) { tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED | @@ -4216,24 +4269,25 @@ static void tg3_tx_recover(struct tg3 *tp) spin_unlock(&tp->lock); } -static inline u32 tg3_tx_avail(struct tg3 *tp) +static inline u32 tg3_tx_avail(struct tg3_napi *tnapi) { smp_mb(); - return (tp->tx_pending - - ((tp->tx_prod - tp->tx_cons) & (TG3_TX_RING_SIZE - 1))); + return tnapi->tx_pending - + ((tnapi->tx_prod - tnapi->tx_cons) & (TG3_TX_RING_SIZE - 1)); } /* Tigon3 never reports partial packet sends. So we do not * need special logic to handle SKBs that have not had all * of their frags sent yet, like SunGEM does. */ -static void tg3_tx(struct tg3 *tp) +static void tg3_tx(struct tg3_napi *tnapi) { - u32 hw_idx = tp->hw_status->idx[0].tx_consumer; - u32 sw_idx = tp->tx_cons; + struct tg3 *tp = tnapi->tp; + u32 hw_idx = tnapi->hw_status->idx[0].tx_consumer; + u32 sw_idx = tnapi->tx_cons; while (sw_idx != hw_idx) { - struct tx_ring_info *ri = &tp->tx_buffers[sw_idx]; + struct tx_ring_info *ri = &tnapi->tx_buffers[sw_idx]; struct sk_buff *skb = ri->skb; int i, tx_bug = 0; @@ -4249,7 +4303,7 @@ static void tg3_tx(struct tg3 *tp) sw_idx = NEXT_TX(sw_idx); for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - ri = &tp->tx_buffers[sw_idx]; + ri = &tnapi->tx_buffers[sw_idx]; if (unlikely(ri->skb != NULL || sw_idx == hw_idx)) tx_bug = 1; sw_idx = NEXT_TX(sw_idx); @@ -4263,7 +4317,7 @@ static void tg3_tx(struct tg3 *tp) } } - tp->tx_cons = sw_idx; + tnapi->tx_cons = sw_idx; /* Need to make the tx_cons update visible to tg3_start_xmit() * before checking for netif_queue_stopped(). Without the @@ -4273,10 +4327,10 @@ static void tg3_tx(struct tg3 *tp) smp_mb(); if (unlikely(netif_queue_stopped(tp->dev) && - (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp)))) { + (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)))) { netif_tx_lock(tp->dev); if (netif_queue_stopped(tp->dev) && - (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp))) + (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi))) netif_wake_queue(tp->dev); netif_tx_unlock(tp->dev); } @@ -4293,33 +4347,35 @@ static void tg3_tx(struct tg3 *tp) * buffers the cpu only reads the last cacheline of the RX descriptor * (to fetch the error flags, vlan tag, checksum, and opaque cookie). */ -static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, +static int tg3_alloc_rx_skb(struct tg3_napi *tnapi, u32 opaque_key, int src_idx, u32 dest_idx_unmasked) { + struct tg3 *tp = tnapi->tp; struct tg3_rx_buffer_desc *desc; struct ring_info *map, *src_map; struct sk_buff *skb; dma_addr_t mapping; int skb_size, dest_idx; + struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; src_map = NULL; switch (opaque_key) { case RXD_OPAQUE_RING_STD: dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE; - desc = &tp->rx_std[dest_idx]; - map = &tp->rx_std_buffers[dest_idx]; + desc = &tpr->rx_std[dest_idx]; + map = &tpr->rx_std_buffers[dest_idx]; if (src_idx >= 0) - src_map = &tp->rx_std_buffers[src_idx]; - skb_size = tp->rx_pkt_buf_sz; + src_map = &tpr->rx_std_buffers[src_idx]; + skb_size = tp->rx_pkt_map_sz; break; case RXD_OPAQUE_RING_JUMBO: dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE; - desc = &tp->rx_jumbo[dest_idx]; - map = &tp->rx_jumbo_buffers[dest_idx]; + desc = &tpr->rx_jmb[dest_idx].std; + map = &tpr->rx_jmb_buffers[dest_idx]; if (src_idx >= 0) - src_map = &tp->rx_jumbo_buffers[src_idx]; - skb_size = RX_JUMBO_PKT_BUF_SZ; + src_map = &tpr->rx_jmb_buffers[src_idx]; + skb_size = TG3_RX_JMB_MAP_SZ; break; default: @@ -4332,14 +4388,13 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, * Callers depend upon this behavior and assume that * we leave everything unchanged if we fail. */ - skb = netdev_alloc_skb(tp->dev, skb_size); + skb = netdev_alloc_skb(tp->dev, skb_size + tp->rx_offset); if (skb == NULL) return -ENOMEM; skb_reserve(skb, tp->rx_offset); - mapping = pci_map_single(tp->pdev, skb->data, - skb_size - tp->rx_offset, + mapping = pci_map_single(tp->pdev, skb->data, skb_size, PCI_DMA_FROMDEVICE); map->skb = skb; @@ -4358,28 +4413,30 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, * members of the RX descriptor are invariant. See notes above * tg3_alloc_rx_skb for full details. */ -static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key, +static void tg3_recycle_rx(struct tg3_napi *tnapi, u32 opaque_key, int src_idx, u32 dest_idx_unmasked) { + struct tg3 *tp = tnapi->tp; struct tg3_rx_buffer_desc *src_desc, *dest_desc; struct ring_info *src_map, *dest_map; int dest_idx; + struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; switch (opaque_key) { case RXD_OPAQUE_RING_STD: dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE; - dest_desc = &tp->rx_std[dest_idx]; - dest_map = &tp->rx_std_buffers[dest_idx]; - src_desc = &tp->rx_std[src_idx]; - src_map = &tp->rx_std_buffers[src_idx]; + dest_desc = &tpr->rx_std[dest_idx]; + dest_map = &tpr->rx_std_buffers[dest_idx]; + src_desc = &tpr->rx_std[src_idx]; + src_map = &tpr->rx_std_buffers[src_idx]; break; case RXD_OPAQUE_RING_JUMBO: dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE; - dest_desc = &tp->rx_jumbo[dest_idx]; - dest_map = &tp->rx_jumbo_buffers[dest_idx]; - src_desc = &tp->rx_jumbo[src_idx]; - src_map = &tp->rx_jumbo_buffers[src_idx]; + dest_desc = &tpr->rx_jmb[dest_idx].std; + dest_map = &tpr->rx_jmb_buffers[dest_idx]; + src_desc = &tpr->rx_jmb[src_idx].std; + src_map = &tpr->rx_jmb_buffers[src_idx]; break; default: @@ -4395,13 +4452,6 @@ static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key, src_map->skb = NULL; } -#if TG3_VLAN_TAG_USED -static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag) -{ - return vlan_gro_receive(&tp->napi, tp->vlgrp, vlan_tag, skb); -} -#endif - /* The RX ring scheme is composed of multiple rings which post fresh * buffers to the chip, and one special ring the chip uses to report * status back to the host. @@ -4426,14 +4476,16 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag) * If both the host and chip were to write into the same ring, cache line * eviction could occur since both entities want it in an exclusive state. */ -static int tg3_rx(struct tg3 *tp, int budget) +static int tg3_rx(struct tg3_napi *tnapi, int budget) { + struct tg3 *tp = tnapi->tp; u32 work_mask, rx_std_posted = 0; - u32 sw_idx = tp->rx_rcb_ptr; + u32 sw_idx = tnapi->rx_rcb_ptr; u16 hw_idx; int received; + struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; - hw_idx = tp->hw_status->idx[0].rx_producer; + hw_idx = tnapi->hw_status->idx[0].rx_producer; /* * We need to order the read of hw_idx and the read of * the opaque cookie. @@ -4442,7 +4494,7 @@ static int tg3_rx(struct tg3 *tp, int budget) work_mask = 0; received = 0; while (sw_idx != hw_idx && budget > 0) { - struct tg3_rx_buffer_desc *desc = &tp->rx_rcb[sw_idx]; + struct tg3_rx_buffer_desc *desc = &tnapi->rx_rcb[sw_idx]; unsigned int len; struct sk_buff *skb; dma_addr_t dma_addr; @@ -4451,27 +4503,25 @@ static int tg3_rx(struct tg3 *tp, int budget) desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK; opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; if (opaque_key == RXD_OPAQUE_RING_STD) { - dma_addr = pci_unmap_addr(&tp->rx_std_buffers[desc_idx], - mapping); - skb = tp->rx_std_buffers[desc_idx].skb; - post_ptr = &tp->rx_std_ptr; + struct ring_info *ri = &tpr->rx_std_buffers[desc_idx]; + dma_addr = pci_unmap_addr(ri, mapping); + skb = ri->skb; + post_ptr = &tpr->rx_std_ptr; rx_std_posted++; } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) { - dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx], - mapping); - skb = tp->rx_jumbo_buffers[desc_idx].skb; - post_ptr = &tp->rx_jumbo_ptr; - } - else { + struct ring_info *ri = &tpr->rx_jmb_buffers[desc_idx]; + dma_addr = pci_unmap_addr(ri, mapping); + skb = ri->skb; + post_ptr = &tpr->rx_jmb_ptr; + } else goto next_pkt_nopost; - } work_mask |= opaque_key; if ((desc->err_vlan & RXD_ERR_MASK) != 0 && (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) { drop_it: - tg3_recycle_rx(tp, opaque_key, + tg3_recycle_rx(tnapi, opaque_key, desc_idx, *post_ptr); drop_it_no_recycle: /* Other statistics kept track of by card. */ @@ -4491,20 +4541,19 @@ static int tg3_rx(struct tg3 *tp, int budget) ) { int skb_size; - skb_size = tg3_alloc_rx_skb(tp, opaque_key, + skb_size = tg3_alloc_rx_skb(tnapi, opaque_key, desc_idx, *post_ptr); if (skb_size < 0) goto drop_it; - pci_unmap_single(tp->pdev, dma_addr, - skb_size - tp->rx_offset, + pci_unmap_single(tp->pdev, dma_addr, skb_size, PCI_DMA_FROMDEVICE); skb_put(skb, len); } else { struct sk_buff *copy_skb; - tg3_recycle_rx(tp, opaque_key, + tg3_recycle_rx(tnapi, opaque_key, desc_idx, *post_ptr); copy_skb = netdev_alloc_skb(tp->dev, @@ -4541,11 +4590,11 @@ static int tg3_rx(struct tg3 *tp, int budget) #if TG3_VLAN_TAG_USED if (tp->vlgrp != NULL && desc->type_flags & RXD_FLAG_VLAN) { - tg3_vlan_rx(tp, skb, - desc->err_vlan & RXD_VLAN_MASK); + vlan_gro_receive(&tnapi->napi, tp->vlgrp, + desc->err_vlan & RXD_VLAN_MASK, skb); } else #endif - napi_gro_receive(&tp->napi, skb); + napi_gro_receive(&tnapi->napi, skb); received++; budget--; @@ -4567,23 +4616,23 @@ next_pkt_nopost: /* Refresh hw_idx to see if there is new work */ if (sw_idx == hw_idx) { - hw_idx = tp->hw_status->idx[0].rx_producer; + hw_idx = tnapi->hw_status->idx[0].rx_producer; rmb(); } } /* ACK the status ring. */ - tp->rx_rcb_ptr = sw_idx; - tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, sw_idx); + tnapi->rx_rcb_ptr = sw_idx; + tw32_rx_mbox(tnapi->consmbox, sw_idx); /* Refill RX ring(s). */ if (work_mask & RXD_OPAQUE_RING_STD) { - sw_idx = tp->rx_std_ptr % TG3_RX_RING_SIZE; + sw_idx = tpr->rx_std_ptr % TG3_RX_RING_SIZE; tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW, sw_idx); } if (work_mask & RXD_OPAQUE_RING_JUMBO) { - sw_idx = tp->rx_jumbo_ptr % TG3_RX_JUMBO_RING_SIZE; + sw_idx = tpr->rx_jmb_ptr % TG3_RX_JUMBO_RING_SIZE; tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW, sw_idx); } @@ -4592,9 +4641,10 @@ next_pkt_nopost: return received; } -static int tg3_poll_work(struct tg3 *tp, int work_done, int budget) +static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget) { - struct tg3_hw_status *sblk = tp->hw_status; + struct tg3 *tp = tnapi->tp; + struct tg3_hw_status *sblk = tnapi->hw_status; /* handle link change and other phy events */ if (!(tp->tg3_flags & @@ -4618,8 +4668,8 @@ static int tg3_poll_work(struct tg3 *tp, int work_done, int budget) } /* run TX completion thread */ - if (sblk->idx[0].tx_consumer != tp->tx_cons) { - tg3_tx(tp); + if (tnapi->hw_status->idx[0].tx_consumer != tnapi->tx_cons) { + tg3_tx(tnapi); if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) return work_done; } @@ -4628,20 +4678,21 @@ static int tg3_poll_work(struct tg3 *tp, int work_done, int budget) * All RX "locking" is done by ensuring outside * code synchronizes with tg3->napi.poll() */ - if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) - work_done += tg3_rx(tp, budget - work_done); + if (sblk->idx[0].rx_producer != tnapi->rx_rcb_ptr) + work_done += tg3_rx(tnapi, budget - work_done); return work_done; } static int tg3_poll(struct napi_struct *napi, int budget) { - struct tg3 *tp = container_of(napi, struct tg3, napi); + struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi); + struct tg3 *tp = tnapi->tp; int work_done = 0; - struct tg3_hw_status *sblk = tp->hw_status; + struct tg3_hw_status *sblk = tnapi->hw_status; while (1) { - work_done = tg3_poll_work(tp, work_done, budget); + work_done = tg3_poll_work(tnapi, work_done, budget); if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) goto tx_recovery; @@ -4650,19 +4701,19 @@ static int tg3_poll(struct napi_struct *napi, int budget) break; if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) { - /* tp->last_tag is used in tg3_restart_ints() below + /* tp->last_tag is used in tg3_int_reenable() below * to tell the hw how much work has been processed, * so we must read it before checking for more work. */ - tp->last_tag = sblk->status_tag; - tp->last_irq_tag = tp->last_tag; + tnapi->last_tag = sblk->status_tag; + tnapi->last_irq_tag = tnapi->last_tag; rmb(); } else sblk->status &= ~SD_STATUS_UPDATED; - if (likely(!tg3_has_work(tp))) { + if (likely(!tg3_has_work(tnapi))) { napi_complete(napi); - tg3_restart_ints(tp); + tg3_int_reenable(tnapi); break; } } @@ -4713,14 +4764,14 @@ static inline void tg3_full_unlock(struct tg3 *tp) */ static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) { - struct net_device *dev = dev_id; - struct tg3 *tp = netdev_priv(dev); + struct tg3_napi *tnapi = dev_id; + struct tg3 *tp = tnapi->tp; - prefetch(tp->hw_status); - prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); + prefetch(tnapi->hw_status); + prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); if (likely(!tg3_irq_sync(tp))) - napi_schedule(&tp->napi); + napi_schedule(&tnapi->napi); return IRQ_HANDLED; } @@ -4731,11 +4782,11 @@ static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) */ static irqreturn_t tg3_msi(int irq, void *dev_id) { - struct net_device *dev = dev_id; - struct tg3 *tp = netdev_priv(dev); + struct tg3_napi *tnapi = dev_id; + struct tg3 *tp = tnapi->tp; - prefetch(tp->hw_status); - prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); + prefetch(tnapi->hw_status); + prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); /* * Writing any value to intr-mbox-0 clears PCI INTA# and * chip-internal interrupt pending events. @@ -4745,16 +4796,16 @@ static irqreturn_t tg3_msi(int irq, void *dev_id) */ tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); if (likely(!tg3_irq_sync(tp))) - napi_schedule(&tp->napi); + napi_schedule(&tnapi->napi); return IRQ_RETVAL(1); } static irqreturn_t tg3_interrupt(int irq, void *dev_id) { - struct net_device *dev = dev_id; - struct tg3 *tp = netdev_priv(dev); - struct tg3_hw_status *sblk = tp->hw_status; + struct tg3_napi *tnapi = dev_id; + struct tg3 *tp = tnapi->tp; + struct tg3_hw_status *sblk = tnapi->hw_status; unsigned int handled = 1; /* In INTx mode, it is possible for the interrupt to arrive at @@ -4785,9 +4836,9 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id) if (tg3_irq_sync(tp)) goto out; sblk->status &= ~SD_STATUS_UPDATED; - if (likely(tg3_has_work(tp))) { - prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); - napi_schedule(&tp->napi); + if (likely(tg3_has_work(tnapi))) { + prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); + napi_schedule(&tnapi->napi); } else { /* No work, shared interrupt perhaps? re-enable * interrupts, and flush that PCI write @@ -4801,9 +4852,9 @@ out: static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) { - struct net_device *dev = dev_id; - struct tg3 *tp = netdev_priv(dev); - struct tg3_hw_status *sblk = tp->hw_status; + struct tg3_napi *tnapi = dev_id; + struct tg3 *tp = tnapi->tp; + struct tg3_hw_status *sblk = tnapi->hw_status; unsigned int handled = 1; /* In INTx mode, it is possible for the interrupt to arrive at @@ -4811,7 +4862,7 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) * Reading the PCI State register will confirm whether the * interrupt is ours and will flush the status block. */ - if (unlikely(sblk->status_tag == tp->last_irq_tag)) { + if (unlikely(sblk->status_tag == tnapi->last_irq_tag)) { if ((tp->tg3_flags & TG3_FLAG_CHIP_RESETTING) || (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { handled = 0; @@ -4838,14 +4889,14 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) * so that the above check can report that the screaming interrupts * are unhandled. Eventually they will be silenced. */ - tp->last_irq_tag = sblk->status_tag; + tnapi->last_irq_tag = sblk->status_tag; if (tg3_irq_sync(tp)) goto out; - prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); + prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); - napi_schedule(&tp->napi); + napi_schedule(&tnapi->napi); out: return IRQ_RETVAL(handled); @@ -4854,9 +4905,9 @@ out: /* ISR for interrupt test */ static irqreturn_t tg3_test_isr(int irq, void *dev_id) { - struct net_device *dev = dev_id; - struct tg3 *tp = netdev_priv(dev); - struct tg3_hw_status *sblk = tp->hw_status; + struct tg3_napi *tnapi = dev_id; + struct tg3 *tp = tnapi->tp; + struct tg3_hw_status *sblk = tnapi->hw_status; if ((sblk->status & SD_STATUS_UPDATED) || !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { @@ -4886,7 +4937,7 @@ static int tg3_restart_hw(struct tg3 *tp, int reset_phy) tg3_full_unlock(tp); del_timer_sync(&tp->timer); tp->irq_sync = 0; - napi_enable(&tp->napi); + napi_enable(&tp->napi[0].napi); dev_close(tp->dev); tg3_full_lock(tp, 0); } @@ -4993,13 +5044,14 @@ static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping, #endif } -static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32); +static void tg3_set_txd(struct tg3_napi *, int, dma_addr_t, int, u32, u32); /* Workaround 4GB and 40-bit hardware DMA bugs. */ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, u32 last_plus_one, u32 *start, u32 base_flags, u32 mss) { + struct tg3_napi *tnapi = &tp->napi[0]; struct sk_buff *new_skb; dma_addr_t new_addr = 0; u32 entry = *start; @@ -5034,7 +5086,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, dev_kfree_skb(new_skb); new_skb = NULL; } else { - tg3_set_txd(tp, entry, new_addr, new_skb->len, + tg3_set_txd(tnapi, entry, new_addr, new_skb->len, base_flags, 1 | (mss << 1)); *start = NEXT_TX(entry); } @@ -5043,11 +5095,10 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, /* Now clean up the sw ring entries. */ i = 0; while (entry != last_plus_one) { - if (i == 0) { - tp->tx_buffers[entry].skb = new_skb; - } else { - tp->tx_buffers[entry].skb = NULL; - } + if (i == 0) + tnapi->tx_buffers[entry].skb = new_skb; + else + tnapi->tx_buffers[entry].skb = NULL; entry = NEXT_TX(entry); i++; } @@ -5058,11 +5109,11 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, return ret; } -static void tg3_set_txd(struct tg3 *tp, int entry, +static void tg3_set_txd(struct tg3_napi *tnapi, int entry, dma_addr_t mapping, int len, u32 flags, u32 mss_and_is_end) { - struct tg3_tx_buffer_desc *txd = &tp->tx_ring[entry]; + struct tg3_tx_buffer_desc *txd = &tnapi->tx_ring[entry]; int is_end = (mss_and_is_end & 0x1); u32 mss = (mss_and_is_end >> 1); u32 vlan_tag = 0; @@ -5090,6 +5141,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) u32 len, entry, base_flags, mss; struct skb_shared_info *sp; dma_addr_t mapping; + struct tg3_napi *tnapi = &tp->napi[0]; len = skb_headlen(skb); @@ -5098,7 +5150,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) * interrupt. Furthermore, IRQ processing runs lockless so we have * no IRQ context deadlocks to worry about either. Rejoice! */ - if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { + if (unlikely(tg3_tx_avail(tnapi) <= (skb_shinfo(skb)->nr_frags + 1))) { if (!netif_queue_stopped(dev)) { netif_stop_queue(dev); @@ -5109,7 +5161,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_BUSY; } - entry = tp->tx_prod; + entry = tnapi->tx_prod; base_flags = 0; mss = 0; if ((mss = skb_shinfo(skb)->gso_size) != 0) { @@ -5157,9 +5209,9 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) mapping = sp->dma_head; - tp->tx_buffers[entry].skb = skb; + tnapi->tx_buffers[entry].skb = skb; - tg3_set_txd(tp, entry, mapping, len, base_flags, + tg3_set_txd(tnapi, entry, mapping, len, base_flags, (skb_shinfo(skb)->nr_frags == 0) | (mss << 1)); entry = NEXT_TX(entry); @@ -5174,9 +5226,9 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) len = frag->size; mapping = sp->dma_maps[i]; - tp->tx_buffers[entry].skb = NULL; + tnapi->tx_buffers[entry].skb = NULL; - tg3_set_txd(tp, entry, mapping, len, + tg3_set_txd(tnapi, entry, mapping, len, base_flags, (i == last) | (mss << 1)); entry = NEXT_TX(entry); @@ -5184,12 +5236,12 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) } /* Packets are ready, update Tx producer idx local and on card. */ - tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); + tw32_tx_mbox(tnapi->prodmbox, entry); - tp->tx_prod = entry; - if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { + tnapi->tx_prod = entry; + if (unlikely(tg3_tx_avail(tnapi) <= (MAX_SKB_FRAGS + 1))) { netif_stop_queue(dev); - if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp)) + if (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)) netif_wake_queue(tp->dev); } @@ -5207,11 +5259,12 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *); static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb) { struct sk_buff *segs, *nskb; + u32 frag_cnt_est = skb_shinfo(skb)->gso_segs * 3; /* Estimate the number of fragments in the worst case */ - if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))) { + if (unlikely(tg3_tx_avail(&tp->napi[0]) <= frag_cnt_est)) { netif_stop_queue(tp->dev); - if (tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3)) + if (tg3_tx_avail(&tp->napi[0]) <= frag_cnt_est) return NETDEV_TX_BUSY; netif_wake_queue(tp->dev); @@ -5244,6 +5297,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) struct skb_shared_info *sp; int would_hit_hwbug; dma_addr_t mapping; + struct tg3_napi *tnapi = &tp->napi[0]; len = skb_headlen(skb); @@ -5252,7 +5306,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) * interrupt. Furthermore, IRQ processing runs lockless so we have * no IRQ context deadlocks to worry about either. Rejoice! */ - if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { + if (unlikely(tg3_tx_avail(tnapi) <= (skb_shinfo(skb)->nr_frags + 1))) { if (!netif_queue_stopped(dev)) { netif_stop_queue(dev); @@ -5263,7 +5317,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_BUSY; } - entry = tp->tx_prod; + entry = tnapi->tx_prod; base_flags = 0; if (skb->ip_summed == CHECKSUM_PARTIAL) base_flags |= TXD_FLAG_TCPUDP_CSUM; @@ -5333,7 +5387,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) mapping = sp->dma_head; - tp->tx_buffers[entry].skb = skb; + tnapi->tx_buffers[entry].skb = skb; would_hit_hwbug = 0; @@ -5342,7 +5396,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) else if (tg3_4g_overflow_test(mapping, len)) would_hit_hwbug = 1; - tg3_set_txd(tp, entry, mapping, len, base_flags, + tg3_set_txd(tnapi, entry, mapping, len, base_flags, (skb_shinfo(skb)->nr_frags == 0) | (mss << 1)); entry = NEXT_TX(entry); @@ -5358,7 +5412,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) len = frag->size; mapping = sp->dma_maps[i]; - tp->tx_buffers[entry].skb = NULL; + tnapi->tx_buffers[entry].skb = NULL; if (tg3_4g_overflow_test(mapping, len)) would_hit_hwbug = 1; @@ -5367,10 +5421,10 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) would_hit_hwbug = 1; if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) - tg3_set_txd(tp, entry, mapping, len, + tg3_set_txd(tnapi, entry, mapping, len, base_flags, (i == last)|(mss << 1)); else - tg3_set_txd(tp, entry, mapping, len, + tg3_set_txd(tnapi, entry, mapping, len, base_flags, (i == last)); entry = NEXT_TX(entry); @@ -5395,12 +5449,12 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) } /* Packets are ready, update Tx producer idx local and on card. */ - tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); + tw32_tx_mbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, entry); - tp->tx_prod = entry; - if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { + tnapi->tx_prod = entry; + if (unlikely(tg3_tx_avail(tnapi) <= (MAX_SKB_FRAGS + 1))) { netif_stop_queue(dev); - if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp)) + if (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)) netif_wake_queue(tp->dev); } @@ -5468,63 +5522,40 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) return err; } -/* Free up pending packets in all rx/tx rings. - * - * The chip has been shut down and the driver detached from - * the networking, so no interrupts or new tx packets will - * end up in the driver. tp->{tx,}lock is not held and we are not - * in an interrupt context and thus may sleep. - */ -static void tg3_free_rings(struct tg3 *tp) +static void tg3_rx_prodring_free(struct tg3 *tp, + struct tg3_rx_prodring_set *tpr) { - struct ring_info *rxp; int i; + struct ring_info *rxp; for (i = 0; i < TG3_RX_RING_SIZE; i++) { - rxp = &tp->rx_std_buffers[i]; + rxp = &tpr->rx_std_buffers[i]; if (rxp->skb == NULL) continue; - pci_unmap_single(tp->pdev, - pci_unmap_addr(rxp, mapping), - tp->rx_pkt_buf_sz - tp->rx_offset, - PCI_DMA_FROMDEVICE); - dev_kfree_skb_any(rxp->skb); - rxp->skb = NULL; - } - for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) { - rxp = &tp->rx_jumbo_buffers[i]; - - if (rxp->skb == NULL) - continue; pci_unmap_single(tp->pdev, pci_unmap_addr(rxp, mapping), - RX_JUMBO_PKT_BUF_SZ - tp->rx_offset, + tp->rx_pkt_map_sz, PCI_DMA_FROMDEVICE); dev_kfree_skb_any(rxp->skb); rxp->skb = NULL; } - for (i = 0; i < TG3_TX_RING_SIZE; ) { - struct tx_ring_info *txp; - struct sk_buff *skb; + if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { + for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) { + rxp = &tpr->rx_jmb_buffers[i]; - txp = &tp->tx_buffers[i]; - skb = txp->skb; + if (rxp->skb == NULL) + continue; - if (skb == NULL) { - i++; - continue; + pci_unmap_single(tp->pdev, + pci_unmap_addr(rxp, mapping), + TG3_RX_JMB_MAP_SZ, + PCI_DMA_FROMDEVICE); + dev_kfree_skb_any(rxp->skb); + rxp->skb = NULL; } - - skb_dma_unmap(&tp->pdev->dev, skb, DMA_TO_DEVICE); - - txp->skb = NULL; - - i += skb_shinfo(skb)->nr_frags + 1; - - dev_kfree_skb_any(skb); } } @@ -5535,23 +5566,20 @@ static void tg3_free_rings(struct tg3 *tp) * end up in the driver. tp->{tx,}lock are held and thus * we may not sleep. */ -static int tg3_init_rings(struct tg3 *tp) +static int tg3_rx_prodring_alloc(struct tg3 *tp, + struct tg3_rx_prodring_set *tpr) { - u32 i; - - /* Free up all the SKBs. */ - tg3_free_rings(tp); + u32 i, rx_pkt_dma_sz; + struct tg3_napi *tnapi = &tp->napi[0]; /* Zero out all descriptors. */ - memset(tp->rx_std, 0, TG3_RX_RING_BYTES); - memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES); - memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); - memset(tp->tx_ring, 0, TG3_TX_RING_BYTES); + memset(tpr->rx_std, 0, TG3_RX_RING_BYTES); - tp->rx_pkt_buf_sz = RX_PKT_BUF_SZ; + rx_pkt_dma_sz = TG3_RX_STD_DMA_SZ; if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) && - (tp->dev->mtu > ETH_DATA_LEN)) - tp->rx_pkt_buf_sz = RX_JUMBO_PKT_BUF_SZ; + tp->dev->mtu > ETH_DATA_LEN) + rx_pkt_dma_sz = TG3_RX_JMB_DMA_SZ; + tp->rx_pkt_map_sz = TG3_RX_DMA_TO_MAP_SZ(rx_pkt_dma_sz); /* Initialize invariants of the rings, we only set this * stuff once. This works because the card does not @@ -5560,62 +5588,179 @@ static int tg3_init_rings(struct tg3 *tp) for (i = 0; i < TG3_RX_RING_SIZE; i++) { struct tg3_rx_buffer_desc *rxd; - rxd = &tp->rx_std[i]; - rxd->idx_len = (tp->rx_pkt_buf_sz - tp->rx_offset - 64) - << RXD_LEN_SHIFT; + rxd = &tpr->rx_std[i]; + rxd->idx_len = rx_pkt_dma_sz << RXD_LEN_SHIFT; rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT); rxd->opaque = (RXD_OPAQUE_RING_STD | (i << RXD_OPAQUE_INDEX_SHIFT)); } - if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { - for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) { - struct tg3_rx_buffer_desc *rxd; - - rxd = &tp->rx_jumbo[i]; - rxd->idx_len = (RX_JUMBO_PKT_BUF_SZ - tp->rx_offset - 64) - << RXD_LEN_SHIFT; - rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) | - RXD_FLAG_JUMBO; - rxd->opaque = (RXD_OPAQUE_RING_JUMBO | - (i << RXD_OPAQUE_INDEX_SHIFT)); - } - } - /* Now allocate fresh SKBs for each rx ring. */ for (i = 0; i < tp->rx_pending; i++) { - if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) { + if (tg3_alloc_rx_skb(tnapi, RXD_OPAQUE_RING_STD, -1, i) < 0) { printk(KERN_WARNING PFX "%s: Using a smaller RX standard ring, " "only %d out of %d buffers were allocated " "successfully.\n", tp->dev->name, i, tp->rx_pending); if (i == 0) - return -ENOMEM; + goto initfail; tp->rx_pending = i; break; } } + if (!(tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE)) + goto done; + + memset(tpr->rx_jmb, 0, TG3_RX_JUMBO_RING_BYTES); + if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { + for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) { + struct tg3_rx_buffer_desc *rxd; + + rxd = &tpr->rx_jmb[i].std; + rxd->idx_len = TG3_RX_JMB_DMA_SZ << RXD_LEN_SHIFT; + rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) | + RXD_FLAG_JUMBO; + rxd->opaque = (RXD_OPAQUE_RING_JUMBO | + (i << RXD_OPAQUE_INDEX_SHIFT)); + } + for (i = 0; i < tp->rx_jumbo_pending; i++) { - if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO, + if (tg3_alloc_rx_skb(tnapi, RXD_OPAQUE_RING_JUMBO, -1, i) < 0) { printk(KERN_WARNING PFX "%s: Using a smaller RX jumbo ring, " "only %d out of %d buffers were " "allocated successfully.\n", tp->dev->name, i, tp->rx_jumbo_pending); - if (i == 0) { - tg3_free_rings(tp); - return -ENOMEM; - } + if (i == 0) + goto initfail; tp->rx_jumbo_pending = i; break; } } } + +done: + return 0; + +initfail: + tg3_rx_prodring_free(tp, tpr); + return -ENOMEM; +} + +static void tg3_rx_prodring_fini(struct tg3 *tp, + struct tg3_rx_prodring_set *tpr) +{ + kfree(tpr->rx_std_buffers); + tpr->rx_std_buffers = NULL; + kfree(tpr->rx_jmb_buffers); + tpr->rx_jmb_buffers = NULL; + if (tpr->rx_std) { + pci_free_consistent(tp->pdev, TG3_RX_RING_BYTES, + tpr->rx_std, tpr->rx_std_mapping); + tpr->rx_std = NULL; + } + if (tpr->rx_jmb) { + pci_free_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES, + tpr->rx_jmb, tpr->rx_jmb_mapping); + tpr->rx_jmb = NULL; + } +} + +static int tg3_rx_prodring_init(struct tg3 *tp, + struct tg3_rx_prodring_set *tpr) +{ + tpr->rx_std_buffers = kzalloc(sizeof(struct ring_info) * + TG3_RX_RING_SIZE, GFP_KERNEL); + if (!tpr->rx_std_buffers) + return -ENOMEM; + + tpr->rx_std = pci_alloc_consistent(tp->pdev, TG3_RX_RING_BYTES, + &tpr->rx_std_mapping); + if (!tpr->rx_std) + goto err_out; + + if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { + tpr->rx_jmb_buffers = kzalloc(sizeof(struct ring_info) * + TG3_RX_JUMBO_RING_SIZE, + GFP_KERNEL); + if (!tpr->rx_jmb_buffers) + goto err_out; + + tpr->rx_jmb = pci_alloc_consistent(tp->pdev, + TG3_RX_JUMBO_RING_BYTES, + &tpr->rx_jmb_mapping); + if (!tpr->rx_jmb) + goto err_out; + } + return 0; + +err_out: + tg3_rx_prodring_fini(tp, tpr); + return -ENOMEM; +} + +/* Free up pending packets in all rx/tx rings. + * + * The chip has been shut down and the driver detached from + * the networking, so no interrupts or new tx packets will + * end up in the driver. tp->{tx,}lock is not held and we are not + * in an interrupt context and thus may sleep. + */ +static void tg3_free_rings(struct tg3 *tp) +{ + struct tg3_napi *tnapi = &tp->napi[0]; + int i; + + for (i = 0; i < TG3_TX_RING_SIZE; ) { + struct tx_ring_info *txp; + struct sk_buff *skb; + + txp = &tnapi->tx_buffers[i]; + skb = txp->skb; + + if (skb == NULL) { + i++; + continue; + } + + skb_dma_unmap(&tp->pdev->dev, skb, DMA_TO_DEVICE); + + txp->skb = NULL; + + i += skb_shinfo(skb)->nr_frags + 1; + + dev_kfree_skb_any(skb); + } + + tg3_rx_prodring_free(tp, &tp->prodring[0]); +} + +/* Initialize tx/rx rings for packet processing. + * + * The chip has been shut down and the driver detached from + * the networking, so no interrupts or new tx packets will + * end up in the driver. tp->{tx,}lock are held and thus + * we may not sleep. + */ +static int tg3_init_rings(struct tg3 *tp) +{ + struct tg3_napi *tnapi = &tp->napi[0]; + + /* Free up all the SKBs. */ + tg3_free_rings(tp); + + /* Zero out all descriptors. */ + memset(tnapi->tx_ring, 0, TG3_TX_RING_BYTES); + + tnapi->rx_rcb_ptr = 0; + memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); + + return tg3_rx_prodring_alloc(tp, &tp->prodring[0]); } /* @@ -5624,38 +5769,32 @@ static int tg3_init_rings(struct tg3 *tp) */ static void tg3_free_consistent(struct tg3 *tp) { - kfree(tp->rx_std_buffers); - tp->rx_std_buffers = NULL; - if (tp->rx_std) { - pci_free_consistent(tp->pdev, TG3_RX_RING_BYTES, - tp->rx_std, tp->rx_std_mapping); - tp->rx_std = NULL; - } - if (tp->rx_jumbo) { - pci_free_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES, - tp->rx_jumbo, tp->rx_jumbo_mapping); - tp->rx_jumbo = NULL; + struct tg3_napi *tnapi = &tp->napi[0]; + + kfree(tnapi->tx_buffers); + tnapi->tx_buffers = NULL; + if (tnapi->tx_ring) { + pci_free_consistent(tp->pdev, TG3_TX_RING_BYTES, + tnapi->tx_ring, tnapi->tx_desc_mapping); + tnapi->tx_ring = NULL; } - if (tp->rx_rcb) { + if (tnapi->rx_rcb) { pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp), - tp->rx_rcb, tp->rx_rcb_mapping); - tp->rx_rcb = NULL; - } - if (tp->tx_ring) { - pci_free_consistent(tp->pdev, TG3_TX_RING_BYTES, - tp->tx_ring, tp->tx_desc_mapping); - tp->tx_ring = NULL; + tnapi->rx_rcb, tnapi->rx_rcb_mapping); + tnapi->rx_rcb = NULL; } - if (tp->hw_status) { + if (tnapi->hw_status) { pci_free_consistent(tp->pdev, TG3_HW_STATUS_SIZE, - tp->hw_status, tp->status_mapping); - tp->hw_status = NULL; + tnapi->hw_status, + tnapi->status_mapping); + tnapi->hw_status = NULL; } if (tp->hw_stats) { pci_free_consistent(tp->pdev, sizeof(struct tg3_hw_stats), tp->hw_stats, tp->stats_mapping); tp->hw_stats = NULL; } + tg3_rx_prodring_fini(tp, &tp->prodring[0]); } /* @@ -5664,53 +5803,43 @@ static void tg3_free_consistent(struct tg3 *tp) */ static int tg3_alloc_consistent(struct tg3 *tp) { - tp->rx_std_buffers = kzalloc((sizeof(struct ring_info) * - (TG3_RX_RING_SIZE + - TG3_RX_JUMBO_RING_SIZE)) + - (sizeof(struct tx_ring_info) * - TG3_TX_RING_SIZE), - GFP_KERNEL); - if (!tp->rx_std_buffers) - return -ENOMEM; + struct tg3_napi *tnapi = &tp->napi[0]; - tp->rx_jumbo_buffers = &tp->rx_std_buffers[TG3_RX_RING_SIZE]; - tp->tx_buffers = (struct tx_ring_info *) - &tp->rx_jumbo_buffers[TG3_RX_JUMBO_RING_SIZE]; + if (tg3_rx_prodring_init(tp, &tp->prodring[0])) + return -ENOMEM; - tp->rx_std = pci_alloc_consistent(tp->pdev, TG3_RX_RING_BYTES, - &tp->rx_std_mapping); - if (!tp->rx_std) + tnapi->tx_buffers = kzalloc(sizeof(struct tx_ring_info) * + TG3_TX_RING_SIZE, GFP_KERNEL); + if (!tnapi->tx_buffers) goto err_out; - tp->rx_jumbo = pci_alloc_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES, - &tp->rx_jumbo_mapping); - - if (!tp->rx_jumbo) + tnapi->tx_ring = pci_alloc_consistent(tp->pdev, TG3_TX_RING_BYTES, + &tnapi->tx_desc_mapping); + if (!tnapi->tx_ring) goto err_out; - tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp), - &tp->rx_rcb_mapping); - if (!tp->rx_rcb) + tnapi->hw_status = pci_alloc_consistent(tp->pdev, + TG3_HW_STATUS_SIZE, + &tnapi->status_mapping); + if (!tnapi->hw_status) goto err_out; - tp->tx_ring = pci_alloc_consistent(tp->pdev, TG3_TX_RING_BYTES, - &tp->tx_desc_mapping); - if (!tp->tx_ring) - goto err_out; + memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); - tp->hw_status = pci_alloc_consistent(tp->pdev, - TG3_HW_STATUS_SIZE, - &tp->status_mapping); - if (!tp->hw_status) + tnapi->rx_rcb = pci_alloc_consistent(tp->pdev, + TG3_RX_RCB_RING_BYTES(tp), + &tnapi->rx_rcb_mapping); + if (!tnapi->rx_rcb) goto err_out; + memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); + tp->hw_stats = pci_alloc_consistent(tp->pdev, sizeof(struct tg3_hw_stats), &tp->stats_mapping); if (!tp->hw_stats) goto err_out; - memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats)); return 0; @@ -5772,6 +5901,7 @@ static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit, int static int tg3_abort_hw(struct tg3 *tp, int silent) { int i, err; + struct tg3_napi *tnapi = &tp->napi[0]; tg3_disable_ints(tp); @@ -5823,8 +5953,8 @@ static int tg3_abort_hw(struct tg3 *tp, int silent) err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE, silent); err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE, silent); - if (tp->hw_status) - memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); + if (tnapi->hw_status) + memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); if (tp->hw_stats) memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats)); @@ -6151,15 +6281,20 @@ static int tg3_chip_reset(struct tg3 *tp) * sharing or irqpoll. */ tp->tg3_flags |= TG3_FLAG_CHIP_RESETTING; - if (tp->hw_status) { - tp->hw_status->status = 0; - tp->hw_status->status_tag = 0; + if (tp->napi[0].hw_status) { + tp->napi[0].hw_status->status = 0; + tp->napi[0].hw_status->status_tag = 0; } - tp->last_tag = 0; - tp->last_irq_tag = 0; + tp->napi[0].last_tag = 0; + tp->napi[0].last_irq_tag = 0; smp_mb(); synchronize_irq(tp->pdev->irq); + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) { + val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN; + tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS); + } + /* do the reset */ val = GRC_MISC_CFG_CORECLK_RESET; @@ -6212,6 +6347,8 @@ static int tg3_chip_reset(struct tg3 *tp) udelay(120); if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) && tp->pcie_cap) { + u16 val16; + if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A0) { int i; u32 cfg_val; @@ -6225,12 +6362,22 @@ static int tg3_chip_reset(struct tg3 *tp) cfg_val | (1 << 15)); } - /* Set PCIE max payload size to 128 bytes and - * clear the "no snoop" and "relaxed ordering" bits. + /* Clear the "no snoop" and "relaxed ordering" bits. */ + pci_read_config_word(tp->pdev, + tp->pcie_cap + PCI_EXP_DEVCTL, + &val16); + val16 &= ~(PCI_EXP_DEVCTL_RELAX_EN | + PCI_EXP_DEVCTL_NOSNOOP_EN); + /* + * Older PCIe devices only support the 128 byte + * MPS setting. Enforce the restriction. */ + if (!(tp->tg3_flags & TG3_FLAG_CPMU_PRESENT) || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784)) + val16 &= ~PCI_EXP_DEVCTL_PAYLOAD; pci_write_config_word(tp->pdev, tp->pcie_cap + PCI_EXP_DEVCTL, - 0); + val16); pcie_set_readrq(tp->pdev, 4096); @@ -6288,14 +6435,14 @@ static int tg3_chip_reset(struct tg3 *tp) tw32_f(MAC_MODE, 0); udelay(40); - tg3_mdio_start(tp); - tg3_ape_unlock(tp, TG3_APE_LOCK_GRC); err = tg3_poll_fw(tp); if (err) return err; + tg3_mdio_start(tp); + if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) && tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) { val = tr32(0x7c00); @@ -6672,6 +6819,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) { u32 val, rdmac_mode; int i, err, limit; + struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; tg3_disable_ints(tp); @@ -6719,6 +6867,20 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) val |= PCIE_PWR_MGMT_EXT_ASPM_TMR_EN | PCIE_PWR_MGMT_L1_THRESH_4MS; tw32(PCIE_PWR_MGMT_THRESH, val); + + val = tr32(TG3_PCIE_EIDLE_DELAY) & ~TG3_PCIE_EIDLE_DELAY_MASK; + tw32(TG3_PCIE_EIDLE_DELAY, val | TG3_PCIE_EIDLE_DELAY_13_CLKS); + + tw32(TG3_CORR_ERR_STAT, TG3_CORR_ERR_STAT_CLEAR); + } + + if (tp->tg3_flags3 & TG3_FLG3_TOGGLE_10_100_L1PLLPD) { + val = tr32(TG3_PCIE_LNKCTL); + if (tp->tg3_flags3 & TG3_FLG3_CLKREQ_BUG) + val |= TG3_PCIE_LNKCTL_L1_PLL_PD_DIS; + else + val &= ~TG3_PCIE_LNKCTL_L1_PLL_PD_DIS; + tw32(TG3_PCIE_LNKCTL, val); } /* This works around an issue with Athlon chipsets on @@ -6886,35 +7048,33 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) * configurable. */ tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tp->rx_std_mapping >> 32)); + ((u64) tpr->rx_std_mapping >> 32)); tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tp->rx_std_mapping & 0xffffffff)); + ((u64) tpr->rx_std_mapping & 0xffffffff)); tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR, NIC_SRAM_RX_BUFFER_DESC); - /* Don't even try to program the JUMBO/MINI buffer descriptor - * configs on 5705. - */ - if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { - tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, - RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT); - } else { - tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, - RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); - + /* Disable the mini ring */ + if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS, BDINFO_FLAGS_DISABLED); + /* Program the jumbo buffer descriptor ring control + * blocks on those devices that have them. + */ + if ((tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) && + !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { /* Setup replenish threshold. */ tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tp->rx_jumbo_mapping >> 32)); + ((u64) tpr->rx_jmb_mapping >> 32)); tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tp->rx_jumbo_mapping & 0xffffffff)); + ((u64) tpr->rx_jmb_mapping & 0xffffffff)); tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, - RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); + (RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT) | + BDINFO_FLAGS_USE_EXT_RECV); tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR, NIC_SRAM_RX_JUMBO_BUFFER_DESC); } else { @@ -6922,7 +7082,11 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) BDINFO_FLAGS_DISABLED); } - } + val = RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT; + } else + val = RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT; + + tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, val); /* There is only one send ring on 5705/5750, no need to explicitly * disable the others. @@ -6934,13 +7098,15 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) BDINFO_FLAGS_DISABLED); } - tp->tx_prod = 0; - tp->tx_cons = 0; - tw32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0); + tp->napi[0].tx_prod = 0; + tp->napi[0].tx_cons = 0; tw32_tx_mbox(MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0); + val = MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW; + tw32_mailbox(val, 0); + tg3_set_bdinfo(tp, NIC_SRAM_SEND_RCB, - tp->tx_desc_mapping, + tp->napi[0].tx_desc_mapping, (TG3_TX_RING_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT), NIC_SRAM_TX_BUFFER_DESC); @@ -6956,23 +7122,22 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) } } - tp->rx_rcb_ptr = 0; - tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, 0); + tw32_rx_mbox(tp->napi[0].consmbox, 0); tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB, - tp->rx_rcb_mapping, + tp->napi[0].rx_rcb_mapping, (TG3_RX_RCB_RING_SIZE(tp) << BDINFO_FLAGS_MAXLEN_SHIFT), 0); - tp->rx_std_ptr = tp->rx_pending; + tpr->rx_std_ptr = tp->rx_pending; tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW, - tp->rx_std_ptr); + tpr->rx_std_ptr); - tp->rx_jumbo_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) ? - tp->rx_jumbo_pending : 0; + tpr->rx_jmb_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) ? + tp->rx_jumbo_pending : 0; tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW, - tp->rx_jumbo_ptr); + tpr->rx_jmb_ptr); /* Initialize MAC address and backoff seed. */ __tg3_set_mac_addr(tp, 0); @@ -7063,9 +7228,9 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) /* set status block DMA address */ tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tp->status_mapping >> 32)); + ((u64) tp->napi[0].status_mapping >> 32)); tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tp->status_mapping & 0xffffffff)); + ((u64) tp->napi[0].status_mapping & 0xffffffff)); if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { /* Status/statistics block address. See tg3_timer, @@ -7094,7 +7259,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) tg3_write_mem(tp, i, 0); udelay(40); } - memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); + memset(tp->napi[0].hw_status, 0, TG3_HW_STATUS_SIZE); if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; @@ -7147,7 +7312,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl); udelay(100); - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0); + tw32_mailbox_f(tp->napi[0].int_mbox, 0); if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { tw32_f(DMAC_MODE, DMAC_MODE_ENABLE); @@ -7164,7 +7329,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) || GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) { - if ((tp->tg3_flags & TG3_FLG2_TSO_CAPABLE) && + if ((tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) && (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 || tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) { /* nothing */ @@ -7302,7 +7467,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) return err; if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) && - GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) { + !(tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET)) { u32 tmp; /* Clear CRC stats. */ @@ -7449,7 +7614,7 @@ static void tg3_timer(unsigned long __opaque) * IRQ status the mailbox/status_block protocol the chip * uses with the cpu is race prone. */ - if (tp->hw_status->status & SD_STATUS_UPDATED) { + if (tp->napi[0].hw_status->status & SD_STATUS_UPDATED) { tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT); } else { @@ -7559,7 +7724,7 @@ static int tg3_request_irq(struct tg3 *tp) { irq_handler_t fn; unsigned long flags; - struct net_device *dev = tp->dev; + char *name = tp->dev->name; if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { fn = tg3_msi; @@ -7572,11 +7737,12 @@ static int tg3_request_irq(struct tg3 *tp) fn = tg3_interrupt_tagged; flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM; } - return (request_irq(tp->pdev->irq, fn, flags, dev->name, dev)); + return request_irq(tp->pdev->irq, fn, flags, name, &tp->napi[0]); } static int tg3_test_interrupt(struct tg3 *tp) { + struct tg3_napi *tnapi = &tp->napi[0]; struct net_device *dev = tp->dev; int err, i, intr_ok = 0; @@ -7585,14 +7751,14 @@ static int tg3_test_interrupt(struct tg3 *tp) tg3_disable_ints(tp); - free_irq(tp->pdev->irq, dev); + free_irq(tp->pdev->irq, tnapi); err = request_irq(tp->pdev->irq, tg3_test_isr, - IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); + IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, tnapi); if (err) return err; - tp->hw_status->status &= ~SD_STATUS_UPDATED; + tnapi->hw_status->status &= ~SD_STATUS_UPDATED; tg3_enable_ints(tp); tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE | @@ -7601,8 +7767,7 @@ static int tg3_test_interrupt(struct tg3 *tp) for (i = 0; i < 5; i++) { u32 int_mbox, misc_host_ctrl; - int_mbox = tr32_mailbox(MAILBOX_INTERRUPT_0 + - TG3_64BIT_REG_LOW); + int_mbox = tr32_mailbox(tnapi->int_mbox); misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL); if ((int_mbox != 0) || @@ -7616,7 +7781,7 @@ static int tg3_test_interrupt(struct tg3 *tp) tg3_disable_ints(tp); - free_irq(tp->pdev->irq, dev); + free_irq(tp->pdev->irq, tnapi); err = tg3_request_irq(tp); @@ -7634,7 +7799,6 @@ static int tg3_test_interrupt(struct tg3 *tp) */ static int tg3_test_msi(struct tg3 *tp) { - struct net_device *dev = tp->dev; int err; u16 pci_cmd; @@ -7665,7 +7829,8 @@ static int tg3_test_msi(struct tg3 *tp) "the PCI maintainer and include system chipset information.\n", tp->dev->name); - free_irq(tp->pdev->irq, dev); + free_irq(tp->pdev->irq, &tp->napi[0]); + pci_disable_msi(tp->pdev); tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; @@ -7685,7 +7850,7 @@ static int tg3_test_msi(struct tg3 *tp) tg3_full_unlock(tp); if (err) - free_irq(tp->pdev->irq, dev); + free_irq(tp->pdev->irq, &tp->napi[0]); return err; } @@ -7721,6 +7886,33 @@ static int tg3_request_firmware(struct tg3 *tp) return 0; } +static void tg3_ints_init(struct tg3 *tp) +{ + if (tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) { + /* All MSI supporting chips should support tagged + * status. Assert that this is the case. + */ + if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { + printk(KERN_WARNING PFX "%s: MSI without TAGGED? " + "Not using MSI.\n", tp->dev->name); + } else if (pci_enable_msi(tp->pdev) == 0) { + u32 msi_mode; + + msi_mode = tr32(MSGINT_MODE); + tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); + tp->tg3_flags2 |= TG3_FLG2_USING_MSI; + } + } +} + +static void tg3_ints_fini(struct tg3 *tp) +{ + if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { + pci_disable_msi(tp->pdev); + tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; + } +} + static int tg3_open(struct net_device *dev) { struct tg3 *tp = netdev_priv(dev); @@ -7762,33 +7954,14 @@ static int tg3_open(struct net_device *dev) if (err) return err; - if (tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) { - /* All MSI supporting chips should support tagged - * status. Assert that this is the case. - */ - if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { - printk(KERN_WARNING PFX "%s: MSI without TAGGED? " - "Not using MSI.\n", tp->dev->name); - } else if (pci_enable_msi(tp->pdev) == 0) { - u32 msi_mode; + tg3_ints_init(tp); - msi_mode = tr32(MSGINT_MODE); - tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); - tp->tg3_flags2 |= TG3_FLG2_USING_MSI; - } - } - err = tg3_request_irq(tp); + napi_enable(&tp->napi[0].napi); - if (err) { - if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { - pci_disable_msi(tp->pdev); - tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; - } - tg3_free_consistent(tp); - return err; - } + err = tg3_request_irq(tp); - napi_enable(&tp->napi); + if (err) + goto err_out1; tg3_full_lock(tp, 0); @@ -7816,36 +7989,19 @@ static int tg3_open(struct net_device *dev) tg3_full_unlock(tp); - if (err) { - napi_disable(&tp->napi); - free_irq(tp->pdev->irq, dev); - if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { - pci_disable_msi(tp->pdev); - tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; - } - tg3_free_consistent(tp); - return err; - } + if (err) + goto err_out2; if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { err = tg3_test_msi(tp); if (err) { tg3_full_lock(tp, 0); - - if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { - pci_disable_msi(tp->pdev); - tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; - } tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); tg3_free_rings(tp); - tg3_free_consistent(tp); - tg3_full_unlock(tp); - napi_disable(&tp->napi); - - return err; + goto err_out1; } if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { @@ -7871,6 +8027,15 @@ static int tg3_open(struct net_device *dev) netif_start_queue(dev); return 0; + +err_out2: + free_irq(tp->pdev->irq, &tp->napi[0]); + +err_out1: + napi_disable(&tp->napi[0].napi); + tg3_ints_fini(tp); + tg3_free_consistent(tp); + return err; } #if 0 @@ -7879,6 +8044,7 @@ static int tg3_open(struct net_device *dev) u32 val32, val32_2, val32_3, val32_4, val32_5; u16 val16; int i; + struct tg3_hw_status *sblk = tp->napi[0]->hw_status; pci_read_config_word(tp->pdev, PCI_STATUS, &val16); pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, &val32); @@ -8031,14 +8197,15 @@ static int tg3_open(struct net_device *dev) val32, val32_2, val32_3, val32_4, val32_5); /* SW status block */ - printk("DEBUG: Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n", - tp->hw_status->status, - tp->hw_status->status_tag, - tp->hw_status->rx_jumbo_consumer, - tp->hw_status->rx_consumer, - tp->hw_status->rx_mini_consumer, - tp->hw_status->idx[0].rx_producer, - tp->hw_status->idx[0].tx_consumer); + printk(KERN_DEBUG + "Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n", + sblk->status, + sblk->status_tag, + sblk->rx_jumbo_consumer, + sblk->rx_consumer, + sblk->rx_mini_consumer, + sblk->idx[0].rx_producer, + sblk->idx[0].tx_consumer); /* SW statistics block */ printk("DEBUG: Host statistics block [%08x:%08x:%08x:%08x]\n", @@ -8108,7 +8275,7 @@ static int tg3_close(struct net_device *dev) { struct tg3 *tp = netdev_priv(dev); - napi_disable(&tp->napi); + napi_disable(&tp->napi[0].napi); cancel_work_sync(&tp->reset_task); netif_stop_queue(dev); @@ -8128,11 +8295,9 @@ static int tg3_close(struct net_device *dev) tg3_full_unlock(tp); - free_irq(tp->pdev->irq, dev); - if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { - pci_disable_msi(tp->pdev); - tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; - } + free_irq(tp->pdev->irq, &tp->napi[0]); + + tg3_ints_fini(tp); memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev), sizeof(tp->net_stats_prev)); @@ -8934,7 +9099,7 @@ static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam * else ering->rx_jumbo_pending = 0; - ering->tx_pending = tp->tx_pending; + ering->tx_pending = tp->napi[0].tx_pending; } static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) @@ -8964,7 +9129,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e tp->rx_pending > 63) tp->rx_pending = 63; tp->rx_jumbo_pending = ering->rx_jumbo_pending; - tp->tx_pending = ering->tx_pending; + tp->napi[0].tx_pending = ering->tx_pending; if (netif_running(dev)) { tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); @@ -9678,6 +9843,11 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) dma_addr_t map; int num_pkts, tx_len, rx_len, i, err; struct tg3_rx_buffer_desc *desc; + struct tg3_napi *tnapi, *rnapi; + struct tg3_rx_prodring_set *tpr = &tp->prodring[0]; + + tnapi = &tp->napi[0]; + rnapi = &tp->napi[0]; if (loopback_mode == TG3_MAC_LOOPBACK) { /* HW errata - mac loopback fails in some cases on 5780. @@ -9699,18 +9869,8 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) } else if (loopback_mode == TG3_PHY_LOOPBACK) { u32 val; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { - u32 phytest; - - if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &phytest)) { - u32 phy; - - tg3_writephy(tp, MII_TG3_EPHY_TEST, - phytest | MII_TG3_EPHY_SHADOW_EN); - if (!tg3_readphy(tp, 0x1b, &phy)) - tg3_writephy(tp, 0x1b, phy & ~0x20); - tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest); - } + if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { + tg3_phy_fet_toggle_apd(tp, false); val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED100; } else val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED1000; @@ -9721,8 +9881,9 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) udelay(40); mac_mode = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { - tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800); + if (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) { + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + tg3_writephy(tp, MII_TG3_FET_PTEST, 0x1800); mac_mode |= MAC_MODE_PORT_MODE_MII; } else mac_mode |= MAC_MODE_PORT_MODE_GMII; @@ -9769,18 +9930,17 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) udelay(10); - rx_start_idx = tp->hw_status->idx[0].rx_producer; + rx_start_idx = rnapi->hw_status->idx[0].rx_producer; num_pkts = 0; - tg3_set_txd(tp, tp->tx_prod, map, tx_len, 0, 1); + tg3_set_txd(tnapi, tnapi->tx_prod, map, tx_len, 0, 1); - tp->tx_prod++; + tnapi->tx_prod++; num_pkts++; - tw32_tx_mbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, - tp->tx_prod); - tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW); + tw32_tx_mbox(tnapi->prodmbox, tnapi->tx_prod); + tr32_mailbox(tnapi->prodmbox); udelay(10); @@ -9791,9 +9951,9 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) udelay(10); - tx_idx = tp->hw_status->idx[0].tx_consumer; - rx_idx = tp->hw_status->idx[0].rx_producer; - if ((tx_idx == tp->tx_prod) && + tx_idx = tnapi->hw_status->idx[0].tx_consumer; + rx_idx = rnapi->hw_status->idx[0].rx_producer; + if ((tx_idx == tnapi->tx_prod) && (rx_idx == (rx_start_idx + num_pkts))) break; } @@ -9801,13 +9961,13 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) pci_unmap_single(tp->pdev, map, tx_len, PCI_DMA_TODEVICE); dev_kfree_skb(skb); - if (tx_idx != tp->tx_prod) + if (tx_idx != tnapi->tx_prod) goto out; if (rx_idx != rx_start_idx + num_pkts) goto out; - desc = &tp->rx_rcb[rx_start_idx]; + desc = &rnapi->rx_rcb[rx_start_idx]; desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK; opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; if (opaque_key != RXD_OPAQUE_RING_STD) @@ -9821,9 +9981,9 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) if (rx_len != tx_len) goto out; - rx_skb = tp->rx_std_buffers[desc_idx].skb; + rx_skb = tpr->rx_std_buffers[desc_idx].skb; - map = pci_unmap_addr(&tp->rx_std_buffers[desc_idx], mapping); + map = pci_unmap_addr(&tpr->rx_std_buffers[desc_idx], mapping); pci_dma_sync_single_for_cpu(tp->pdev, map, rx_len, PCI_DMA_FROMDEVICE); for (i = 14; i < tx_len; i++) { @@ -10236,8 +10396,7 @@ static void __devinit tg3_get_nvram_info(struct tg3 *tp) nvcfg1 = tr32(NVRAM_CFG1); if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) { tp->tg3_flags2 |= TG3_FLG2_FLASH; - } - else { + } else { nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; tw32(NVRAM_CFG1, nvcfg1); } @@ -10245,37 +10404,36 @@ static void __devinit tg3_get_nvram_info(struct tg3 *tp) if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) || (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) { switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) { - case FLASH_VENDOR_ATMEL_FLASH_BUFFERED: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - break; - case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE; - break; - case FLASH_VENDOR_ATMEL_EEPROM: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - break; - case FLASH_VENDOR_ST: - tp->nvram_jedecnum = JEDEC_ST; - tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - break; - case FLASH_VENDOR_SAIFUN: - tp->nvram_jedecnum = JEDEC_SAIFUN; - tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE; - break; - case FLASH_VENDOR_SST_SMALL: - case FLASH_VENDOR_SST_LARGE: - tp->nvram_jedecnum = JEDEC_SST; - tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE; - break; + case FLASH_VENDOR_ATMEL_FLASH_BUFFERED: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + break; + case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE; + break; + case FLASH_VENDOR_ATMEL_EEPROM: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + break; + case FLASH_VENDOR_ST: + tp->nvram_jedecnum = JEDEC_ST; + tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + break; + case FLASH_VENDOR_SAIFUN: + tp->nvram_jedecnum = JEDEC_SAIFUN; + tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE; + break; + case FLASH_VENDOR_SST_SMALL: + case FLASH_VENDOR_SST_LARGE: + tp->nvram_jedecnum = JEDEC_SST; + tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE; + break; } - } - else { + } else { tp->nvram_jedecnum = JEDEC_ATMEL; tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; @@ -10293,48 +10451,47 @@ static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp) tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM; switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ: - case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - break; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - break; + case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ: + case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + break; + case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + break; + case FLASH_5752VENDOR_ST_M45PE10: + case FLASH_5752VENDOR_ST_M45PE20: + case FLASH_5752VENDOR_ST_M45PE40: + tp->nvram_jedecnum = JEDEC_ST; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + break; } if (tp->tg3_flags2 & TG3_FLG2_FLASH) { switch (nvcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) { - case FLASH_5752PAGE_SIZE_256: - tp->nvram_pagesize = 256; - break; - case FLASH_5752PAGE_SIZE_512: - tp->nvram_pagesize = 512; - break; - case FLASH_5752PAGE_SIZE_1K: - tp->nvram_pagesize = 1024; - break; - case FLASH_5752PAGE_SIZE_2K: - tp->nvram_pagesize = 2048; - break; - case FLASH_5752PAGE_SIZE_4K: - tp->nvram_pagesize = 4096; - break; - case FLASH_5752PAGE_SIZE_264: - tp->nvram_pagesize = 264; - break; + case FLASH_5752PAGE_SIZE_256: + tp->nvram_pagesize = 256; + break; + case FLASH_5752PAGE_SIZE_512: + tp->nvram_pagesize = 512; + break; + case FLASH_5752PAGE_SIZE_1K: + tp->nvram_pagesize = 1024; + break; + case FLASH_5752PAGE_SIZE_2K: + tp->nvram_pagesize = 2048; + break; + case FLASH_5752PAGE_SIZE_4K: + tp->nvram_pagesize = 4096; + break; + case FLASH_5752PAGE_SIZE_264: + tp->nvram_pagesize = 264; + break; } - } - else { + } else { /* For eeprom, set pagesize to maximum eeprom size */ tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; @@ -10357,45 +10514,45 @@ static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp) nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK; switch (nvcfg1) { - case FLASH_5755VENDOR_ATMEL_FLASH_1: - case FLASH_5755VENDOR_ATMEL_FLASH_2: - case FLASH_5755VENDOR_ATMEL_FLASH_3: - case FLASH_5755VENDOR_ATMEL_FLASH_5: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 264; - if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || - nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) - tp->nvram_size = (protect ? 0x3e200 : - TG3_NVRAM_SIZE_512KB); - else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) - tp->nvram_size = (protect ? 0x1f200 : - TG3_NVRAM_SIZE_256KB); - else - tp->nvram_size = (protect ? 0x1f200 : - TG3_NVRAM_SIZE_128KB); - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 256; - if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) - tp->nvram_size = (protect ? - TG3_NVRAM_SIZE_64KB : - TG3_NVRAM_SIZE_128KB); - else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) - tp->nvram_size = (protect ? - TG3_NVRAM_SIZE_64KB : - TG3_NVRAM_SIZE_256KB); - else - tp->nvram_size = (protect ? - TG3_NVRAM_SIZE_128KB : - TG3_NVRAM_SIZE_512KB); - break; + case FLASH_5755VENDOR_ATMEL_FLASH_1: + case FLASH_5755VENDOR_ATMEL_FLASH_2: + case FLASH_5755VENDOR_ATMEL_FLASH_3: + case FLASH_5755VENDOR_ATMEL_FLASH_5: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + tp->nvram_pagesize = 264; + if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || + nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) + tp->nvram_size = (protect ? 0x3e200 : + TG3_NVRAM_SIZE_512KB); + else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) + tp->nvram_size = (protect ? 0x1f200 : + TG3_NVRAM_SIZE_256KB); + else + tp->nvram_size = (protect ? 0x1f200 : + TG3_NVRAM_SIZE_128KB); + break; + case FLASH_5752VENDOR_ST_M45PE10: + case FLASH_5752VENDOR_ST_M45PE20: + case FLASH_5752VENDOR_ST_M45PE40: + tp->nvram_jedecnum = JEDEC_ST; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + tp->nvram_pagesize = 256; + if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) + tp->nvram_size = (protect ? + TG3_NVRAM_SIZE_64KB : + TG3_NVRAM_SIZE_128KB); + else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) + tp->nvram_size = (protect ? + TG3_NVRAM_SIZE_64KB : + TG3_NVRAM_SIZE_256KB); + else + tp->nvram_size = (protect ? + TG3_NVRAM_SIZE_128KB : + TG3_NVRAM_SIZE_512KB); + break; } } @@ -10406,34 +10563,34 @@ static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) nvcfg1 = tr32(NVRAM_CFG1); switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ: - case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; + case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ: + case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: + case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ: + case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - break; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - case FLASH_5755VENDOR_ATMEL_FLASH_1: - case FLASH_5755VENDOR_ATMEL_FLASH_2: - case FLASH_5755VENDOR_ATMEL_FLASH_3: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 264; - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 256; - break; + nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; + tw32(NVRAM_CFG1, nvcfg1); + break; + case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: + case FLASH_5755VENDOR_ATMEL_FLASH_1: + case FLASH_5755VENDOR_ATMEL_FLASH_2: + case FLASH_5755VENDOR_ATMEL_FLASH_3: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + tp->nvram_pagesize = 264; + break; + case FLASH_5752VENDOR_ST_M45PE10: + case FLASH_5752VENDOR_ST_M45PE20: + case FLASH_5752VENDOR_ST_M45PE40: + tp->nvram_jedecnum = JEDEC_ST; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + tp->nvram_pagesize = 256; + break; } } @@ -10451,63 +10608,63 @@ static void __devinit tg3_get_5761_nvram_info(struct tg3 *tp) nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK; switch (nvcfg1) { - case FLASH_5761VENDOR_ATMEL_ADB021D: - case FLASH_5761VENDOR_ATMEL_ADB041D: - case FLASH_5761VENDOR_ATMEL_ADB081D: - case FLASH_5761VENDOR_ATMEL_ADB161D: - case FLASH_5761VENDOR_ATMEL_MDB021D: - case FLASH_5761VENDOR_ATMEL_MDB041D: - case FLASH_5761VENDOR_ATMEL_MDB081D: - case FLASH_5761VENDOR_ATMEL_MDB161D: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; - tp->nvram_pagesize = 256; - break; - case FLASH_5761VENDOR_ST_A_M45PE20: - case FLASH_5761VENDOR_ST_A_M45PE40: - case FLASH_5761VENDOR_ST_A_M45PE80: - case FLASH_5761VENDOR_ST_A_M45PE16: - case FLASH_5761VENDOR_ST_M_M45PE20: - case FLASH_5761VENDOR_ST_M_M45PE40: - case FLASH_5761VENDOR_ST_M_M45PE80: - case FLASH_5761VENDOR_ST_M_M45PE16: - tp->nvram_jedecnum = JEDEC_ST; - tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; - tp->tg3_flags2 |= TG3_FLG2_FLASH; - tp->nvram_pagesize = 256; - break; + case FLASH_5761VENDOR_ATMEL_ADB021D: + case FLASH_5761VENDOR_ATMEL_ADB041D: + case FLASH_5761VENDOR_ATMEL_ADB081D: + case FLASH_5761VENDOR_ATMEL_ADB161D: + case FLASH_5761VENDOR_ATMEL_MDB021D: + case FLASH_5761VENDOR_ATMEL_MDB041D: + case FLASH_5761VENDOR_ATMEL_MDB081D: + case FLASH_5761VENDOR_ATMEL_MDB161D: + tp->nvram_jedecnum = JEDEC_ATMEL; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS; + tp->nvram_pagesize = 256; + break; + case FLASH_5761VENDOR_ST_A_M45PE20: + case FLASH_5761VENDOR_ST_A_M45PE40: + case FLASH_5761VENDOR_ST_A_M45PE80: + case FLASH_5761VENDOR_ST_A_M45PE16: + case FLASH_5761VENDOR_ST_M_M45PE20: + case FLASH_5761VENDOR_ST_M_M45PE40: + case FLASH_5761VENDOR_ST_M_M45PE80: + case FLASH_5761VENDOR_ST_M_M45PE16: + tp->nvram_jedecnum = JEDEC_ST; + tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; + tp->tg3_flags2 |= TG3_FLG2_FLASH; + tp->nvram_pagesize = 256; + break; } if (protect) { tp->nvram_size = tr32(NVRAM_ADDR_LOCKOUT); } else { switch (nvcfg1) { - case FLASH_5761VENDOR_ATMEL_ADB161D: - case FLASH_5761VENDOR_ATMEL_MDB161D: - case FLASH_5761VENDOR_ST_A_M45PE16: - case FLASH_5761VENDOR_ST_M_M45PE16: - tp->nvram_size = TG3_NVRAM_SIZE_2MB; - break; - case FLASH_5761VENDOR_ATMEL_ADB081D: - case FLASH_5761VENDOR_ATMEL_MDB081D: - case FLASH_5761VENDOR_ST_A_M45PE80: - case FLASH_5761VENDOR_ST_M_M45PE80: - tp->nvram_size = TG3_NVRAM_SIZE_1MB; - break; - case FLASH_5761VENDOR_ATMEL_ADB041D: - case FLASH_5761VENDOR_ATMEL_MDB041D: - case FLASH_5761VENDOR_ST_A_M45PE40: - case FLASH_5761VENDOR_ST_M_M45PE40: - tp->nvram_size = TG3_NVRAM_SIZE_512KB; - break; - case FLASH_5761VENDOR_ATMEL_ADB021D: - case FLASH_5761VENDOR_ATMEL_MDB021D: - case FLASH_5761VENDOR_ST_A_M45PE20: - case FLASH_5761VENDOR_ST_M_M45PE20: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; + case FLASH_5761VENDOR_ATMEL_ADB161D: + case FLASH_5761VENDOR_ATMEL_MDB161D: + case FLASH_5761VENDOR_ST_A_M45PE16: + case FLASH_5761VENDOR_ST_M_M45PE16: + tp->nvram_size = TG3_NVRAM_SIZE_2MB; + break; + case FLASH_5761VENDOR_ATMEL_ADB081D: + case FLASH_5761VENDOR_ATMEL_MDB081D: + case FLASH_5761VENDOR_ST_A_M45PE80: + case FLASH_5761VENDOR_ST_M_M45PE80: + tp->nvram_size = TG3_NVRAM_SIZE_1MB; + break; + case FLASH_5761VENDOR_ATMEL_ADB041D: + case FLASH_5761VENDOR_ATMEL_MDB041D: + case FLASH_5761VENDOR_ST_A_M45PE40: + case FLASH_5761VENDOR_ST_M_M45PE40: + tp->nvram_size = TG3_NVRAM_SIZE_512KB; + break; + case FLASH_5761VENDOR_ATMEL_ADB021D: + case FLASH_5761VENDOR_ATMEL_MDB021D: + case FLASH_5761VENDOR_ST_A_M45PE20: + case FLASH_5761VENDOR_ST_M_M45PE20: + tp->nvram_size = TG3_NVRAM_SIZE_256KB; + break; } } } @@ -11485,6 +11642,9 @@ out_not_found: else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 && tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790) strcpy(tp->board_part_number, "BCM57790"); + else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 && + tp->pdev->device == TG3PCI_DEVICE_TIGON3_57788) + strcpy(tp->board_part_number, "BCM57788"); else strcpy(tp->board_part_number, "none"); } @@ -11967,7 +12127,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) - tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; + tp->tg3_flags |= TG3_FLAG_JUMBO_CAPABLE; pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, &pci_state_reg); @@ -12216,12 +12376,15 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) tp->tg3_flags |= TG3_FLAG_WOL_SPEED_100MB; } + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + tp->tg3_flags3 |= TG3_FLG3_PHY_IS_FET; + /* A few boards don't want Ethernet@WireSpeed phy feature */ if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) || ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) || - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) || + (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) || (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; @@ -12232,7 +12395,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG; if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && - GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906 && + !(tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET) && GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785 && GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_57780) { if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || @@ -12269,6 +12432,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780) tp->tg3_flags3 |= TG3_FLG3_USE_PHYLIB; + if ((tp->pci_chip_rev_id == CHIPREV_ID_57780_A1 && + tr32(RCVLPC_STATS_ENABLE) & RCVLPC_STATSENAB_ASF_FIX) || + tp->pci_chip_rev_id == CHIPREV_ID_57780_A0) + tp->tg3_flags3 |= TG3_FLG3_TOGGLE_10_100_L1PLLPD; + err = tg3_mdio_init(tp); if (err) return err; @@ -12352,7 +12520,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F || tp->pdev->device == PCI_DEVICE_ID_TIGON3_5787F)) || tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) + (tp->tg3_flags3 & TG3_FLG3_PHY_IS_FET)) tp->tg3_flags |= TG3_FLAG_10_100_ONLY; err = tg3_phy_probe(tp); @@ -13252,9 +13420,13 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, tp->rx_pending = TG3_DEF_RX_RING_PENDING; tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING; - tp->tx_pending = TG3_DEF_TX_RING_PENDING; - netif_napi_add(dev, &tp->napi, tg3_poll, 64); + tp->napi[0].tp = tp; + tp->napi[0].int_mbox = MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW; + tp->napi[0].consmbox = MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW; + tp->napi[0].prodmbox = MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW; + tp->napi[0].tx_pending = TG3_DEF_TX_RING_PENDING; + netif_napi_add(dev, &tp->napi[0].napi, tg3_poll, 64); dev->ethtool_ops = &tg3_ethtool_ops; dev->watchdog_timeo = TG3_TX_TIMEOUT; dev->irq = pdev->irq; diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index b3347c4..a816b2c 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h @@ -43,7 +43,9 @@ #define TG3PCI_DEVICE_TIGON3_57780 0x1692 #define TG3PCI_DEVICE_TIGON3_57760 0x1690 #define TG3PCI_DEVICE_TIGON3_57790 0x1694 -#define TG3PCI_DEVICE_TIGON3_57720 0x168c +#define TG3PCI_DEVICE_TIGON3_57788 0x1691 +#define TG3PCI_DEVICE_TIGON3_5785_G 0x1699 /* GPHY */ +#define TG3PCI_DEVICE_TIGON3_5785_F 0x16a0 /* 10/100 only */ /* 0x04 --> 0x64 unused */ #define TG3PCI_MSI_DATA 0x00000064 /* 0x66 --> 0x68 unused */ @@ -214,9 +216,11 @@ #define DUAL_MAC_CTRL_ID 0x00000004 #define TG3PCI_PRODID_ASICREV 0x000000bc #define PROD_ID_ASIC_REV_MASK 0x0fffffff -/* 0xc0 --> 0x100 unused */ +/* 0xc0 --> 0x110 unused */ -/* 0x100 --> 0x200 unused */ +#define TG3_CORR_ERR_STAT 0x00000110 +#define TG3_CORR_ERR_STAT_CLEAR 0xffffffff +/* 0x114 --> 0x200 unused */ /* Mailbox registers */ #define MAILBOX_INTERRUPT_0 0x00000200 /* 64-bit */ @@ -522,6 +526,10 @@ /* 0x598 --> 0x5a0 unused */ #define MAC_PHYCFG1 0x000005a0 #define MAC_PHYCFG1_RGMII_INT 0x00000001 +#define MAC_PHYCFG1_RXCLK_TO_MASK 0x00001ff0 +#define MAC_PHYCFG1_RXCLK_TIMEOUT 0x00001000 +#define MAC_PHYCFG1_TXCLK_TO_MASK 0x01ff0000 +#define MAC_PHYCFG1_TXCLK_TIMEOUT 0x01000000 #define MAC_PHYCFG1_RGMII_EXT_RX_DEC 0x02000000 #define MAC_PHYCFG1_RGMII_SND_STAT_EN 0x04000000 #define MAC_PHYCFG1_TXC_DRV 0x20000000 @@ -864,6 +872,7 @@ #define RCVLPC_STATSCTRL_ENABLE 0x00000001 #define RCVLPC_STATSCTRL_FASTUPD 0x00000002 #define RCVLPC_STATS_ENABLE 0x00002018 +#define RCVLPC_STATSENAB_ASF_FIX 0x00000002 #define RCVLPC_STATSENAB_DACK_FIX 0x00040000 #define RCVLPC_STATSENAB_LNGBRST_RFIX 0x00400000 #define RCVLPC_STATS_INCMASK 0x0000201c @@ -1696,11 +1705,23 @@ #define PCIE_TRANSACTION_CFG 0x00007c04 #define PCIE_TRANS_CFG_1SHOT_MSI 0x20000000 #define PCIE_TRANS_CFG_LOM 0x00000020 +/* 0x7c08 --> 0x7d28 unused */ #define PCIE_PWR_MGMT_THRESH 0x00007d28 #define PCIE_PWR_MGMT_L1_THRESH_MSK 0x0000ff00 #define PCIE_PWR_MGMT_L1_THRESH_4MS 0x0000ff00 #define PCIE_PWR_MGMT_EXT_ASPM_TMR_EN 0x01000000 +/* 0x7d2c --> 0x7d54 unused */ + +#define TG3_PCIE_LNKCTL 0x00007d54 +#define TG3_PCIE_LNKCTL_L1_PLL_PD_EN 0x00000008 +#define TG3_PCIE_LNKCTL_L1_PLL_PD_DIS 0x00000080 +/* 0x7d58 --> 0x7e70 unused */ + +#define TG3_PCIE_EIDLE_DELAY 0x00007e70 +#define TG3_PCIE_EIDLE_DELAY_MASK 0x0000001f +#define TG3_PCIE_EIDLE_DELAY_13_CLKS 0x0000000c +/* 0x7e74 --> 0x8000 unused */ /* OTP bit definitions */ @@ -1890,7 +1911,6 @@ #define MII_TG3_DSP_RW_PORT 0x15 /* DSP coefficient read/write port */ -#define MII_TG3_EPHY_PTEST 0x17 /* 5906 PHY register */ #define MII_TG3_DSP_ADDRESS 0x17 /* DSP address register */ #define MII_TG3_DSP_TAP1 0x0001 @@ -1957,17 +1977,23 @@ #define MII_TG3_MISC_SHDW_SCR5_LPED 0x0010 #define MII_TG3_MISC_SHDW_SCR5_SEL 0x1400 - -#define MII_TG3_EPHY_TEST 0x1f /* 5906 PHY register */ -#define MII_TG3_EPHY_SHADOW_EN 0x80 - -#define MII_TG3_EPHYTST_MISCCTRL 0x10 /* 5906 EPHY misc ctrl shadow register */ -#define MII_TG3_EPHYTST_MISCCTRL_MDIX 0x4000 - #define MII_TG3_TEST1 0x1e #define MII_TG3_TEST1_TRIM_EN 0x0010 #define MII_TG3_TEST1_CRC_EN 0x8000 + +/* Fast Ethernet Tranceiver definitions */ +#define MII_TG3_FET_PTEST 0x17 +#define MII_TG3_FET_TEST 0x1f +#define MII_TG3_FET_SHADOW_EN 0x0080 + +#define MII_TG3_FET_SHDW_MISCCTRL 0x10 +#define MII_TG3_FET_SHDW_MISCCTRL_MDIX 0x4000 + +#define MII_TG3_FET_SHDW_AUXSTAT2 0x1b +#define MII_TG3_FET_SHDW_AUXSTAT2_APD 0x0020 + + /* APE registers. Accessible through BAR1 */ #define TG3_APE_EVENT 0x000c #define APE_EVENT_1 0x00000001 @@ -2450,6 +2476,44 @@ struct tg3_ethtool_stats { u64 nic_tx_threshold_hit; }; +struct tg3_rx_prodring_set { + u32 rx_std_ptr; + u32 rx_jmb_ptr; + struct tg3_rx_buffer_desc *rx_std; + struct tg3_ext_rx_buffer_desc *rx_jmb; + struct ring_info *rx_std_buffers; + struct ring_info *rx_jmb_buffers; + dma_addr_t rx_std_mapping; + dma_addr_t rx_jmb_mapping; +}; + +#define TG3_IRQ_MAX_VECS 1 + +struct tg3_napi { + struct napi_struct napi ____cacheline_aligned; + struct tg3 *tp; + struct tg3_hw_status *hw_status; + + u32 last_tag; + u32 last_irq_tag; + u32 int_mbox; + u32 tx_prod; + u32 tx_cons; + u32 tx_pending; + u32 prodmbox; + + u32 consmbox; + u32 rx_rcb_ptr; + + struct tg3_rx_buffer_desc *rx_rcb; + struct tg3_tx_buffer_desc *tx_ring; + struct tx_ring_info *tx_buffers; + + dma_addr_t status_mapping; + dma_addr_t rx_rcb_mapping; + dma_addr_t tx_desc_mapping; +}; + struct tg3 { /* begin "general, frequently-used members" cacheline section */ @@ -2502,50 +2566,26 @@ struct tg3 { struct net_device *dev; struct pci_dev *pdev; - struct tg3_hw_status *hw_status; - dma_addr_t status_mapping; - u32 last_tag; - u32 last_irq_tag; - u32 msg_enable; /* begin "tx thread" cacheline section */ void (*write32_tx_mbox) (struct tg3 *, u32, u32); - u32 tx_prod; - u32 tx_cons; - u32 tx_pending; - - struct tg3_tx_buffer_desc *tx_ring; - struct tx_ring_info *tx_buffers; - dma_addr_t tx_desc_mapping; /* begin "rx thread" cacheline section */ - struct napi_struct napi; + struct tg3_napi napi[TG3_IRQ_MAX_VECS]; void (*write32_rx_mbox) (struct tg3 *, u32, u32); - u32 rx_rcb_ptr; - u32 rx_std_ptr; - u32 rx_jumbo_ptr; u32 rx_pending; u32 rx_jumbo_pending; + u32 rx_std_max_post; + u32 rx_pkt_map_sz; #if TG3_VLAN_TAG_USED struct vlan_group *vlgrp; #endif - struct tg3_rx_buffer_desc *rx_std; - struct ring_info *rx_std_buffers; - dma_addr_t rx_std_mapping; - u32 rx_std_max_post; - - struct tg3_rx_buffer_desc *rx_jumbo; - struct ring_info *rx_jumbo_buffers; - dma_addr_t rx_jumbo_mapping; - - struct tg3_rx_buffer_desc *rx_rcb; - dma_addr_t rx_rcb_mapping; + struct tg3_rx_prodring_set prodring[1]; - u32 rx_pkt_buf_sz; /* begin "everything else" cacheline(s) section */ struct net_device_stats net_stats; @@ -2575,6 +2615,7 @@ struct tg3 { #define TG3_FLAG_EEPROM_WRITE_PROT 0x00001000 #define TG3_FLAG_NVRAM 0x00002000 #define TG3_FLAG_NVRAM_BUFFERED 0x00004000 +#define TG3_FLAG_SUPPORT_MSI 0x00008000 #define TG3_FLAG_PCIX_MODE 0x00020000 #define TG3_FLAG_PCI_HIGH_SPEED 0x00040000 #define TG3_FLAG_PCI_32BIT 0x00080000 @@ -2587,7 +2628,7 @@ struct tg3 { #define TG3_FLAG_CPMU_PRESENT 0x04000000 #define TG3_FLAG_40BIT_DMA_BUG 0x08000000 #define TG3_FLAG_BROKEN_CHECKSUMS 0x10000000 -#define TG3_FLAG_SUPPORT_MSI 0x20000000 +#define TG3_FLAG_JUMBO_CAPABLE 0x20000000 #define TG3_FLAG_CHIP_RESETTING 0x40000000 #define TG3_FLAG_INIT_COMPLETE 0x80000000 u32 tg3_flags2; @@ -2613,7 +2654,6 @@ struct tg3 { #define TG3_FLG2_5750_PLUS 0x00080000 #define TG3_FLG2_PROTECTED_NVRAM 0x00100000 #define TG3_FLG2_USING_MSI 0x00200000 -#define TG3_FLG2_JUMBO_CAPABLE 0x00400000 #define TG3_FLG2_MII_SERDES 0x00800000 #define TG3_FLG2_ANY_SERDES (TG3_FLG2_PHY_SERDES | \ TG3_FLG2_MII_SERDES) @@ -2641,6 +2681,8 @@ struct tg3 { #define TG3_FLG3_PHY_ENABLE_APD 0x00001000 #define TG3_FLG3_5755_PLUS 0x00002000 #define TG3_FLG3_NO_NVRAM 0x00004000 +#define TG3_FLG3_TOGGLE_10_100_L1PLLPD 0x00008000 +#define TG3_FLG3_PHY_IS_FET 0x00010000 struct timer_list timer; u16 timer_counter; diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c index 6e6b08c..4b83d88 100644 --- a/drivers/net/wan/lmc/lmc_main.c +++ b/drivers/net/wan/lmc/lmc_main.c @@ -1657,7 +1657,7 @@ static int lmc_rx(struct net_device *dev) } skb_copy_from_linear_data(skb, skb_put(nsb, len), len); - nsb->protocol = lmc_proto_type(sc, skb); + nsb->protocol = lmc_proto_type(sc, nsb); skb_reset_mac_header(nsb); /* skb_reset_network_header(nsb); */ nsb->dev = dev; diff --git a/drivers/net/wireless/ath/ar9170/ar9170.h b/drivers/net/wireless/ath/ar9170/ar9170.h index ce40724..914e471 100644 --- a/drivers/net/wireless/ath/ar9170/ar9170.h +++ b/drivers/net/wireless/ath/ar9170/ar9170.h @@ -178,6 +178,7 @@ struct ar9170 { /* beaconing */ struct sk_buff *beacon; struct work_struct beacon_work; + bool enable_beacon; /* cryptographic engine */ u64 usedkeys; diff --git a/drivers/net/wireless/ath/ar9170/mac.c b/drivers/net/wireless/ath/ar9170/mac.c index 6004936..614e321 100644 --- a/drivers/net/wireless/ath/ar9170/mac.c +++ b/drivers/net/wireless/ath/ar9170/mac.c @@ -383,24 +383,26 @@ int ar9170_set_beacon_timers(struct ar9170 *ar) if (ar->vif) { v |= ar->vif->bss_conf.beacon_int; - switch (ar->vif->type) { - case NL80211_IFTYPE_MESH_POINT: - case NL80211_IFTYPE_ADHOC: - v |= BIT(25); - break; - case NL80211_IFTYPE_AP: - v |= BIT(24); - pretbtt = (ar->vif->bss_conf.beacon_int - 6) << 16; - break; - default: + if (ar->enable_beacon) { + switch (ar->vif->type) { + case NL80211_IFTYPE_MESH_POINT: + case NL80211_IFTYPE_ADHOC: + v |= BIT(25); + break; + case NL80211_IFTYPE_AP: + v |= BIT(24); + pretbtt = (ar->vif->bss_conf.beacon_int - 6) << + 16; + break; + default: break; + } } v |= ar->vif->bss_conf.dtim_period << 16; } ar9170_regwrite_begin(ar); - ar9170_regwrite(AR9170_MAC_REG_PRETBTT, pretbtt); ar9170_regwrite(AR9170_MAC_REG_BCN_PERIOD, v); ar9170_regwrite_finish(); diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c index 658b323..c1f8c69 100644 --- a/drivers/net/wireless/ath/ar9170/main.c +++ b/drivers/net/wireless/ath/ar9170/main.c @@ -2031,12 +2031,6 @@ static int ar9170_op_config(struct ieee80211_hw *hw, u32 changed) goto out; } - if (changed & BSS_CHANGED_BEACON_INT) { - err = ar9170_set_beacon_timers(ar); - if (err) - goto out; - } - if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { /* adjust slot time for 5 GHz */ @@ -2148,11 +2142,17 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw, goto out; } - if (changed & (BSS_CHANGED_BEACON | BSS_CHANGED_BEACON_ENABLED)) { + if (changed & BSS_CHANGED_BEACON_ENABLED) + ar->enable_beacon = bss_conf->enable_beacon; + + if (changed & BSS_CHANGED_BEACON) { err = ar9170_update_beacon(ar); if (err) goto out; + } + if (changed & (BSS_CHANGED_BEACON_ENABLED | BSS_CHANGED_BEACON | + BSS_CHANGED_BEACON_INT)) { err = ar9170_set_beacon_timers(ar); if (err) goto out; @@ -2165,12 +2165,6 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw, #endif /* CONFIG_AR9170_LEDS */ } - if (changed & BSS_CHANGED_BEACON_INT) { - err = ar9170_set_beacon_timers(ar); - if (err) - goto out; - } - if (changed & BSS_CHANGED_HT) { /* TODO */ err = 0; diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h index 862762ce..6cd5efc 100644 --- a/drivers/net/wireless/ath/ath5k/ath5k.h +++ b/drivers/net/wireless/ath/ath5k/ath5k.h @@ -306,6 +306,7 @@ struct ath5k_srev_name { #define AR5K_SREV_AR5311B 0x30 /* Spirit */ #define AR5K_SREV_AR5211 0x40 /* Oahu */ #define AR5K_SREV_AR5212 0x50 /* Venice */ +#define AR5K_SREV_AR5212_V4 0x54 /* ??? */ #define AR5K_SREV_AR5213 0x55 /* ??? */ #define AR5K_SREV_AR5213A 0x59 /* Hainan */ #define AR5K_SREV_AR2413 0x78 /* Griffin lite */ @@ -1037,6 +1038,7 @@ struct ath5k_hw { bool ah_turbo; bool ah_calibration; bool ah_single_chip; + bool ah_aes_support; bool ah_combined_mic; enum ath5k_version ah_version; @@ -1158,7 +1160,7 @@ struct ath5k_hw { */ /* Attach/Detach Functions */ -extern struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version); +extern struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc); extern void ath5k_hw_detach(struct ath5k_hw *ah); /* LED functions */ diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c index 65d438b..71a1bd25 100644 --- a/drivers/net/wireless/ath/ath5k/attach.c +++ b/drivers/net/wireless/ath/ath5k/attach.c @@ -95,17 +95,17 @@ static int ath5k_hw_post(struct ath5k_hw *ah) * ath5k_hw_attach - Check if hw is supported and init the needed structs * * @sc: The &struct ath5k_softc we got from the driver's attach function - * @mac_version: The mac version id (check out ath5k.h) based on pci id * * Check if the device is supported, perform a POST and initialize the needed * structs. Returns -ENOMEM if we don't have memory for the needed structs, * -ENODEV if the device is not supported or prints an error msg if something * else went wrong. */ -struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) +struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc) { struct ath5k_hw *ah; struct pci_dev *pdev = sc->pdev; + struct ath5k_eeprom_info *ee; int ret; u32 srev; @@ -135,9 +135,15 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) ah->ah_software_retry = false; /* - * Set the mac version based on the pci id + * Find the mac version */ - ah->ah_version = mac_version; + srev = ath5k_hw_reg_read(ah, AR5K_SREV); + if (srev < AR5K_SREV_AR5311) + ah->ah_version = AR5K_AR5210; + else if (srev < AR5K_SREV_AR5212) + ah->ah_version = AR5K_AR5211; + else + ah->ah_version = AR5K_AR5212; /*Fill the ath5k_hw struct with the needed functions*/ ret = ath5k_hw_init_desc_functions(ah); @@ -150,7 +156,6 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) goto err_free; /* Get MAC, PHY and RADIO revisions */ - srev = ath5k_hw_reg_read(ah, AR5K_SREV); ah->ah_mac_srev = srev; ah->ah_mac_version = AR5K_REG_MS(srev, AR5K_SREV_VER); ah->ah_mac_revision = AR5K_REG_MS(srev, AR5K_SREV_REV); @@ -315,6 +320,12 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) goto err_free; } + /* Crypto settings */ + ee = &ah->ah_capabilities.cap_eeprom; + ah->ah_aes_support = srev >= AR5K_SREV_AR5212_V4 && + (ee->ee_version >= AR5K_EEPROM_VERSION_5_0 && + !AR5K_EEPROM_AES_DIS(ee->ee_misc5)); + if (srev >= AR5K_SREV_AR2414) { ah->ah_combined_mic = true; AR5K_REG_ENABLE_BITS(ah, AR5K_MISC_MODE, diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 5056410..9c6ab53 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -84,24 +84,24 @@ MODULE_VERSION("0.6.0 (EXPERIMENTAL)"); /* Known PCI ids */ static const struct pci_device_id ath5k_pci_id_table[] = { - { PCI_VDEVICE(ATHEROS, 0x0207), .driver_data = AR5K_AR5210 }, /* 5210 early */ - { PCI_VDEVICE(ATHEROS, 0x0007), .driver_data = AR5K_AR5210 }, /* 5210 */ - { PCI_VDEVICE(ATHEROS, 0x0011), .driver_data = AR5K_AR5211 }, /* 5311 - this is on AHB bus !*/ - { PCI_VDEVICE(ATHEROS, 0x0012), .driver_data = AR5K_AR5211 }, /* 5211 */ - { PCI_VDEVICE(ATHEROS, 0x0013), .driver_data = AR5K_AR5212 }, /* 5212 */ - { PCI_VDEVICE(3COM_2, 0x0013), .driver_data = AR5K_AR5212 }, /* 3com 5212 */ - { PCI_VDEVICE(3COM, 0x0013), .driver_data = AR5K_AR5212 }, /* 3com 3CRDAG675 5212 */ - { PCI_VDEVICE(ATHEROS, 0x1014), .driver_data = AR5K_AR5212 }, /* IBM minipci 5212 */ - { PCI_VDEVICE(ATHEROS, 0x0014), .driver_data = AR5K_AR5212 }, /* 5212 combatible */ - { PCI_VDEVICE(ATHEROS, 0x0015), .driver_data = AR5K_AR5212 }, /* 5212 combatible */ - { PCI_VDEVICE(ATHEROS, 0x0016), .driver_data = AR5K_AR5212 }, /* 5212 combatible */ - { PCI_VDEVICE(ATHEROS, 0x0017), .driver_data = AR5K_AR5212 }, /* 5212 combatible */ - { PCI_VDEVICE(ATHEROS, 0x0018), .driver_data = AR5K_AR5212 }, /* 5212 combatible */ - { PCI_VDEVICE(ATHEROS, 0x0019), .driver_data = AR5K_AR5212 }, /* 5212 combatible */ - { PCI_VDEVICE(ATHEROS, 0x001a), .driver_data = AR5K_AR5212 }, /* 2413 Griffin-lite */ - { PCI_VDEVICE(ATHEROS, 0x001b), .driver_data = AR5K_AR5212 }, /* 5413 Eagle */ - { PCI_VDEVICE(ATHEROS, 0x001c), .driver_data = AR5K_AR5212 }, /* PCI-E cards */ - { PCI_VDEVICE(ATHEROS, 0x001d), .driver_data = AR5K_AR5212 }, /* 2417 Nala */ + { PCI_VDEVICE(ATHEROS, 0x0207) }, /* 5210 early */ + { PCI_VDEVICE(ATHEROS, 0x0007) }, /* 5210 */ + { PCI_VDEVICE(ATHEROS, 0x0011) }, /* 5311 - this is on AHB bus !*/ + { PCI_VDEVICE(ATHEROS, 0x0012) }, /* 5211 */ + { PCI_VDEVICE(ATHEROS, 0x0013) }, /* 5212 */ + { PCI_VDEVICE(3COM_2, 0x0013) }, /* 3com 5212 */ + { PCI_VDEVICE(3COM, 0x0013) }, /* 3com 3CRDAG675 5212 */ + { PCI_VDEVICE(ATHEROS, 0x1014) }, /* IBM minipci 5212 */ + { PCI_VDEVICE(ATHEROS, 0x0014) }, /* 5212 combatible */ + { PCI_VDEVICE(ATHEROS, 0x0015) }, /* 5212 combatible */ + { PCI_VDEVICE(ATHEROS, 0x0016) }, /* 5212 combatible */ + { PCI_VDEVICE(ATHEROS, 0x0017) }, /* 5212 combatible */ + { PCI_VDEVICE(ATHEROS, 0x0018) }, /* 5212 combatible */ + { PCI_VDEVICE(ATHEROS, 0x0019) }, /* 5212 combatible */ + { PCI_VDEVICE(ATHEROS, 0x001a) }, /* 2413 Griffin-lite */ + { PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */ + { PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */ + { PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */ { 0 } }; MODULE_DEVICE_TABLE(pci, ath5k_pci_id_table); @@ -566,7 +566,7 @@ ath5k_pci_probe(struct pci_dev *pdev, } /* Initialize device */ - sc->ah = ath5k_hw_attach(sc, id->driver_data); + sc->ah = ath5k_hw_attach(sc); if (IS_ERR(sc->ah)) { ret = PTR_ERR(sc->ah); goto err_irq; @@ -1741,7 +1741,7 @@ ath5k_check_ibss_tsf(struct ath5k_softc *sc, struct sk_buff *skb, static void ath5k_tasklet_rx(unsigned long data) { - struct ieee80211_rx_status rxs = {}; + struct ieee80211_rx_status *rxs; struct ath5k_rx_status rs = {}; struct sk_buff *skb, *next_skb; dma_addr_t next_skb_addr; @@ -1751,6 +1751,7 @@ ath5k_tasklet_rx(unsigned long data) int ret; int hdrlen; int padsize; + int rx_flag; spin_lock(&sc->rxbuflock); if (list_empty(&sc->rxbuf)) { @@ -1758,7 +1759,7 @@ ath5k_tasklet_rx(unsigned long data) goto unlock; } do { - rxs.flag = 0; + rx_flag = 0; bf = list_first_entry(&sc->rxbuf, struct ath5k_buf, list); BUG_ON(bf->skb == NULL); @@ -1802,7 +1803,7 @@ ath5k_tasklet_rx(unsigned long data) goto accept; } if (rs.rs_status & AR5K_RXERR_MIC) { - rxs.flag |= RX_FLAG_MMIC_ERROR; + rx_flag |= RX_FLAG_MMIC_ERROR; goto accept; } @@ -1840,6 +1841,7 @@ accept: memmove(skb->data + padsize, skb->data, hdrlen); skb_pull(skb, padsize); } + rxs = IEEE80211_SKB_RXCB(skb); /* * always extend the mac timestamp, since this information is @@ -1861,41 +1863,40 @@ accept: * impossible to comply to that. This affects IBSS merge only * right now, so it's not too bad... */ - rxs.mactime = ath5k_extend_tsf(sc->ah, rs.rs_tstamp); - rxs.flag |= RX_FLAG_TSFT; + rxs->mactime = ath5k_extend_tsf(sc->ah, rs.rs_tstamp); + rxs->flag = rx_flag | RX_FLAG_TSFT; - rxs.freq = sc->curchan->center_freq; - rxs.band = sc->curband->band; + rxs->freq = sc->curchan->center_freq; + rxs->band = sc->curband->band; - rxs.noise = sc->ah->ah_noise_floor; - rxs.signal = rxs.noise + rs.rs_rssi; + rxs->noise = sc->ah->ah_noise_floor; + rxs->signal = rxs->noise + rs.rs_rssi; /* An rssi of 35 indicates you should be able use * 54 Mbps reliably. A more elaborate scheme can be used * here but it requires a map of SNR/throughput for each * possible mode used */ - rxs.qual = rs.rs_rssi * 100 / 35; + rxs->qual = rs.rs_rssi * 100 / 35; /* rssi can be more than 35 though, anything above that * should be considered at 100% */ - if (rxs.qual > 100) - rxs.qual = 100; + if (rxs->qual > 100) + rxs->qual = 100; - rxs.antenna = rs.rs_antenna; - rxs.rate_idx = ath5k_hw_to_driver_rix(sc, rs.rs_rate); - rxs.flag |= ath5k_rx_decrypted(sc, ds, skb, &rs); + rxs->antenna = rs.rs_antenna; + rxs->rate_idx = ath5k_hw_to_driver_rix(sc, rs.rs_rate); + rxs->flag |= ath5k_rx_decrypted(sc, ds, skb, &rs); - if (rxs.rate_idx >= 0 && rs.rs_rate == - sc->curband->bitrates[rxs.rate_idx].hw_value_short) - rxs.flag |= RX_FLAG_SHORTPRE; + if (rxs->rate_idx >= 0 && rs.rs_rate == + sc->curband->bitrates[rxs->rate_idx].hw_value_short) + rxs->flag |= RX_FLAG_SHORTPRE; ath5k_debug_dump_skb(sc, skb, "RX ", 0); /* check beacons in IBSS mode */ if (sc->opmode == NL80211_IFTYPE_ADHOC) - ath5k_check_ibss_tsf(sc, skb, &rxs); + ath5k_check_ibss_tsf(sc, skb, rxs); - memcpy(IEEE80211_SKB_RXCB(skb), &rxs, sizeof(rxs)); ieee80211_rx(sc->hw, skb); bf->skb = next_skb; @@ -2918,6 +2919,8 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, struct ath5k_hw *ah = sc->ah; u32 mfilt[2], rfilt; + mutex_lock(&sc->lock); + mfilt[0] = multicast; mfilt[1] = multicast >> 32; @@ -2968,22 +2971,25 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, /* XXX move these to mac80211, and add a beacon IFF flag to mac80211 */ - if (sc->opmode == NL80211_IFTYPE_MONITOR) - rfilt |= AR5K_RX_FILTER_CONTROL | AR5K_RX_FILTER_BEACON | - AR5K_RX_FILTER_PROBEREQ | AR5K_RX_FILTER_PROM; - if (sc->opmode != NL80211_IFTYPE_STATION) - rfilt |= AR5K_RX_FILTER_PROBEREQ; - if (sc->opmode != NL80211_IFTYPE_AP && - sc->opmode != NL80211_IFTYPE_MESH_POINT && - test_bit(ATH_STAT_PROMISC, sc->status)) - rfilt |= AR5K_RX_FILTER_PROM; - if ((sc->opmode == NL80211_IFTYPE_STATION && sc->assoc) || - sc->opmode == NL80211_IFTYPE_ADHOC || - sc->opmode == NL80211_IFTYPE_AP) - rfilt |= AR5K_RX_FILTER_BEACON; - if (sc->opmode == NL80211_IFTYPE_MESH_POINT) - rfilt |= AR5K_RX_FILTER_CONTROL | AR5K_RX_FILTER_BEACON | - AR5K_RX_FILTER_PROBEREQ | AR5K_RX_FILTER_PROM; + switch (sc->opmode) { + case NL80211_IFTYPE_MESH_POINT: + case NL80211_IFTYPE_MONITOR: + rfilt |= AR5K_RX_FILTER_CONTROL | + AR5K_RX_FILTER_BEACON | + AR5K_RX_FILTER_PROBEREQ | + AR5K_RX_FILTER_PROM; + break; + case NL80211_IFTYPE_AP: + case NL80211_IFTYPE_ADHOC: + rfilt |= AR5K_RX_FILTER_PROBEREQ | + AR5K_RX_FILTER_BEACON; + break; + case NL80211_IFTYPE_STATION: + if (sc->assoc) + rfilt |= AR5K_RX_FILTER_BEACON; + default: + break; + } /* Set filters */ ath5k_hw_set_rx_filter(ah, rfilt); @@ -2993,6 +2999,8 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, /* Set the cached hw filter flags, this will alter actually * be set in HW */ sc->filter_flags = rfilt; + + mutex_unlock(&sc->lock); } static int @@ -3014,6 +3022,9 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, case ALG_TKIP: break; case ALG_CCMP: + if (sc->ah->ah_aes_support) + break; + return -EOPNOTSUPP; default: WARN_ON(1); diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c index 8af477d..644962a 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.c +++ b/drivers/net/wireless/ath/ath5k/eeprom.c @@ -414,27 +414,11 @@ static int ath5k_eeprom_read_modes(struct ath5k_hw *ah, u32 *offset, break; } -done: - /* return new offset */ - *offset = o; - - return 0; -} - -/* - * Read turbo mode information on newer EEPROM versions - */ -static int -ath5k_eeprom_read_turbo_modes(struct ath5k_hw *ah, - u32 *offset, unsigned int mode) -{ - struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom; - u32 o = *offset; - u16 val; - int ret; - + /* + * Read turbo mode information on newer EEPROM versions + */ if (ee->ee_version < AR5K_EEPROM_VERSION_5_0) - return 0; + goto done; switch (mode){ case AR5K_EEPROM_MODE_11A: @@ -468,6 +452,7 @@ ath5k_eeprom_read_turbo_modes(struct ath5k_hw *ah, break; } +done: /* return new offset */ *offset = o; @@ -504,10 +489,6 @@ ath5k_eeprom_init_modes(struct ath5k_hw *ah) ret = ath5k_eeprom_read_modes(ah, &offset, mode); if (ret) return ret; - - ret = ath5k_eeprom_read_turbo_modes(ah, &offset, mode); - if (ret) - return ret; } /* override for older eeprom versions for better performance */ diff --git a/drivers/net/wireless/ath/ath5k/led.c b/drivers/net/wireless/ath/ath5k/led.c index 876725f..b767c3b 100644 --- a/drivers/net/wireless/ath/ath5k/led.c +++ b/drivers/net/wireless/ath/ath5k/led.c @@ -69,6 +69,8 @@ static const struct pci_device_id ath5k_led_devices[] = { { ATH_SDEVICE(PCI_VENDOR_ID_AZWAVE, 0x1026), ATH_LED(3, 0) }, /* IBM ThinkPad AR5BXB6 (legovini@spiro.fisica.unipd.it) */ { ATH_SDEVICE(PCI_VENDOR_ID_IBM, 0x058a), ATH_LED(1, 0) }, + /* HP Compaq C700 (nitrousnrg@gmail.com) */ + { ATH_SDEVICE(PCI_VENDOR_ID_HP, 0x0137b), ATH_LED(3, 1) }, /* IBM-specific AR5212 (all others) */ { PCI_VDEVICE(ATHEROS, PCI_DEVICE_ID_ATHEROS_AR5212_IBM), ATH_LED(0, 0) }, { } diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile index 28443e0..ff2c9a2 100644 --- a/drivers/net/wireless/ath/ath9k/Makefile +++ b/drivers/net/wireless/ath/ath9k/Makefile @@ -12,7 +12,8 @@ ath9k-y += hw.o \ recv.o \ xmit.o \ virtual.o \ - rc.o + rc.o \ + btcoex.o ath9k-$(CONFIG_PCI) += pci.o ath9k-$(CONFIG_ATHEROS_AR71XX) += ahb.o diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 7705da1..1c68a9d 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h @@ -26,6 +26,7 @@ #include "rc.h" #include "debug.h" #include "../ath.h" +#include "btcoex.h" struct ath_node; @@ -521,6 +522,8 @@ struct ath_led { #define SC_OP_WAIT_FOR_PSPOLL_DATA BIT(17) #define SC_OP_WAIT_FOR_TX_ACK BIT(18) #define SC_OP_BEACON_SYNC BIT(19) +#define SC_OP_BTCOEX_ENABLED BIT(20) +#define SC_OP_BT_PRIORITY_DETECTED BIT(21) struct ath_bus_ops { void (*read_cachesize)(struct ath_softc *sc, int *csz); @@ -609,6 +612,7 @@ struct ath_softc { struct ath_bus_ops *bus_ops; struct ath_beacon_config cur_beacon_conf; struct delayed_work tx_complete_work; + struct ath_btcoex_info btcoex_info; }; struct ath_wiphy { @@ -705,4 +709,5 @@ bool ath9k_all_wiphys_idle(struct ath_softc *sc); void ath9k_iowrite32(struct ath_hw *ah, u32 reg_offset, u32 val); unsigned int ath9k_ioread32(struct ath_hw *ah, u32 reg_offset); +int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype); #endif /* ATH9K_H */ diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c new file mode 100644 index 0000000..8fb3567 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/btcoex.c @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2009 Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ath9k.h" + +static const struct ath_btcoex_config ath_bt_config = { 0, true, true, + ATH_BT_COEX_MODE_SLOTTED, true, true, 2, 5, true }; + + +/* + * Detects if there is any priority bt traffic + */ +static void ath_detect_bt_priority(struct ath_softc *sc) +{ + struct ath_btcoex_info *btinfo = &sc->btcoex_info; + + if (ath9k_hw_gpio_get(sc->sc_ah, btinfo->btpriority_gpio)) + btinfo->bt_priority_cnt++; + + if (time_after(jiffies, btinfo->bt_priority_time + + msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) { + if (btinfo->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) { + DPRINTF(sc, ATH_DBG_BTCOEX, + "BT priority traffic detected"); + sc->sc_flags |= SC_OP_BT_PRIORITY_DETECTED; + } else { + sc->sc_flags &= ~SC_OP_BT_PRIORITY_DETECTED; + } + + btinfo->bt_priority_cnt = 0; + btinfo->bt_priority_time = jiffies; + } +} + +/* + * Configures appropriate weight based on stomp type. + */ +static void ath_btcoex_bt_stomp(struct ath_softc *sc, + struct ath_btcoex_info *btinfo, + int stomp_type) +{ + + switch (stomp_type) { + case ATH_BTCOEX_STOMP_ALL: + ath_btcoex_set_weight(btinfo, AR_BT_COEX_WGHT, + AR_STOMP_ALL_WLAN_WGHT); + break; + case ATH_BTCOEX_STOMP_LOW: + ath_btcoex_set_weight(btinfo, AR_BT_COEX_WGHT, + AR_STOMP_LOW_WLAN_WGHT); + break; + case ATH_BTCOEX_STOMP_NONE: + ath_btcoex_set_weight(btinfo, AR_BT_COEX_WGHT, + AR_STOMP_NONE_WLAN_WGHT); + break; + default: + DPRINTF(sc, ATH_DBG_BTCOEX, "Invalid Stomptype\n"); + break; + } + + ath9k_hw_btcoex_enable(sc->sc_ah); +} + +/* + * This is the master bt coex timer which runs for every + * 45ms, bt traffic will be given priority during 55% of this + * period while wlan gets remaining 45% + */ + +static void ath_btcoex_period_timer(unsigned long data) +{ + struct ath_softc *sc = (struct ath_softc *) data; + struct ath_btcoex_info *btinfo = &sc->btcoex_info; + unsigned long flags; + + ath_detect_bt_priority(sc); + + spin_lock_irqsave(&btinfo->btcoex_lock, flags); + + ath_btcoex_bt_stomp(sc, btinfo, btinfo->bt_stomp_type); + + spin_unlock_irqrestore(&btinfo->btcoex_lock, flags); + + if (btinfo->btcoex_period != btinfo->btcoex_no_stomp) { + if (btinfo->hw_timer_enabled) + ath_gen_timer_stop(sc->sc_ah, btinfo->no_stomp_timer); + + ath_gen_timer_start(sc->sc_ah, + btinfo->no_stomp_timer, + (ath9k_hw_gettsf32(sc->sc_ah) + + btinfo->btcoex_no_stomp), + btinfo->btcoex_no_stomp * 10); + btinfo->hw_timer_enabled = true; + } + + mod_timer(&btinfo->period_timer, jiffies + + msecs_to_jiffies(ATH_BTCOEX_DEF_BT_PERIOD)); +} + +/* + * Generic tsf based hw timer which configures weight + * registers to time slice between wlan and bt traffic + */ + +static void ath_btcoex_no_stomp_timer(void *arg) +{ + struct ath_softc *sc = (struct ath_softc *)arg; + struct ath_btcoex_info *btinfo = &sc->btcoex_info; + unsigned long flags; + + DPRINTF(sc, ATH_DBG_BTCOEX, "no stomp timer running \n"); + + spin_lock_irqsave(&btinfo->btcoex_lock, flags); + + if (btinfo->bt_stomp_type == ATH_BTCOEX_STOMP_LOW) + ath_btcoex_bt_stomp(sc, btinfo, ATH_BTCOEX_STOMP_NONE); + else if (btinfo->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) + ath_btcoex_bt_stomp(sc, btinfo, ATH_BTCOEX_STOMP_LOW); + + spin_unlock_irqrestore(&btinfo->btcoex_lock, flags); +} + +static int ath_init_btcoex_info(struct ath_hw *hw, + struct ath_btcoex_info *btcoex_info) +{ + u32 i; + int qnum; + + qnum = ath_tx_get_qnum(hw->ah_sc, ATH9K_TX_QUEUE_DATA, ATH9K_WME_AC_BE); + + btcoex_info->bt_coex_mode = + (btcoex_info->bt_coex_mode & AR_BT_QCU_THRESH) | + SM(ath_bt_config.bt_time_extend, AR_BT_TIME_EXTEND) | + SM(ath_bt_config.bt_txstate_extend, AR_BT_TXSTATE_EXTEND) | + SM(ath_bt_config.bt_txframe_extend, AR_BT_TX_FRAME_EXTEND) | + SM(ath_bt_config.bt_mode, AR_BT_MODE) | + SM(ath_bt_config.bt_quiet_collision, AR_BT_QUIET) | + SM(ath_bt_config.bt_rxclear_polarity, AR_BT_RX_CLEAR_POLARITY) | + SM(ath_bt_config.bt_priority_time, AR_BT_PRIORITY_TIME) | + SM(ath_bt_config.bt_first_slot_time, AR_BT_FIRST_SLOT_TIME) | + SM(qnum, AR_BT_QCU_THRESH); + + btcoex_info->bt_coex_mode2 = + SM(ath_bt_config.bt_hold_rx_clear, AR_BT_HOLD_RX_CLEAR) | + SM(ATH_BTCOEX_BMISS_THRESH, AR_BT_BCN_MISS_THRESH) | + AR_BT_DISABLE_BT_ANT; + + btcoex_info->bt_stomp_type = ATH_BTCOEX_STOMP_LOW; + + btcoex_info->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD * 1000; + + btcoex_info->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * + btcoex_info->btcoex_period / 100; + + for (i = 0; i < 32; i++) + hw->hw_gen_timers.gen_timer_index[(debruijn32 << i) >> 27] = i; + + setup_timer(&btcoex_info->period_timer, ath_btcoex_period_timer, + (unsigned long) hw->ah_sc); + + btcoex_info->no_stomp_timer = ath_gen_timer_alloc(hw, + ath_btcoex_no_stomp_timer, + ath_btcoex_no_stomp_timer, + (void *)hw->ah_sc, AR_FIRST_NDP_TIMER); + + if (btcoex_info->no_stomp_timer == NULL) + return -ENOMEM; + + spin_lock_init(&btcoex_info->btcoex_lock); + + return 0; +} + +int ath9k_hw_btcoex_init(struct ath_hw *ah) +{ + struct ath_btcoex_info *btcoex_info = &ah->ah_sc->btcoex_info; + int ret = 0; + + if (btcoex_info->btcoex_scheme == ATH_BTCOEX_CFG_2WIRE) { + /* connect bt_active to baseband */ + REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL, + (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF | + AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF)); + + REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, + AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB); + + /* Set input mux for bt_active to gpio pin */ + REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, + AR_GPIO_INPUT_MUX1_BT_ACTIVE, + btcoex_info->btactive_gpio); + + /* Configure the desired gpio port for input */ + ath9k_hw_cfg_gpio_input(ah, btcoex_info->btactive_gpio); + } else { + /* btcoex 3-wire */ + REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, + (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB | + AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB)); + + /* Set input mux for bt_prority_async and + * bt_active_async to GPIO pins */ + REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, + AR_GPIO_INPUT_MUX1_BT_ACTIVE, + btcoex_info->btactive_gpio); + + REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, + AR_GPIO_INPUT_MUX1_BT_PRIORITY, + btcoex_info->btpriority_gpio); + + /* Configure the desired GPIO ports for input */ + + ath9k_hw_cfg_gpio_input(ah, btcoex_info->btactive_gpio); + ath9k_hw_cfg_gpio_input(ah, btcoex_info->btpriority_gpio); + + ret = ath_init_btcoex_info(ah, btcoex_info); + } + + return ret; +} + +void ath9k_hw_btcoex_enable(struct ath_hw *ah) +{ + struct ath_btcoex_info *btcoex_info = &ah->ah_sc->btcoex_info; + + if (btcoex_info->btcoex_scheme == ATH_BTCOEX_CFG_2WIRE) { + /* Configure the desired GPIO port for TX_FRAME output */ + ath9k_hw_cfg_output(ah, btcoex_info->wlanactive_gpio, + AR_GPIO_OUTPUT_MUX_AS_TX_FRAME); + } else { + /* + * Program coex mode and weight registers to + * enable coex 3-wire + */ + REG_WRITE(ah, AR_BT_COEX_MODE, btcoex_info->bt_coex_mode); + REG_WRITE(ah, AR_BT_COEX_WEIGHT, btcoex_info->bt_coex_weights); + REG_WRITE(ah, AR_BT_COEX_MODE2, btcoex_info->bt_coex_mode2); + + REG_RMW_FIELD(ah, AR_QUIET1, + AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1); + REG_RMW_FIELD(ah, AR_PCU_MISC, + AR_PCU_BT_ANT_PREVENT_RX, 0); + + ath9k_hw_cfg_output(ah, btcoex_info->wlanactive_gpio, + AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL); + } + + REG_RMW(ah, AR_GPIO_PDPU, + (0x2 << (btcoex_info->btactive_gpio * 2)), + (0x3 << (btcoex_info->btactive_gpio * 2))); + + ah->ah_sc->sc_flags |= SC_OP_BTCOEX_ENABLED; +} + +void ath9k_hw_btcoex_disable(struct ath_hw *ah) +{ + struct ath_btcoex_info *btcoex_info = &ah->ah_sc->btcoex_info; + + ath9k_hw_set_gpio(ah, btcoex_info->wlanactive_gpio, 0); + + ath9k_hw_cfg_output(ah, btcoex_info->wlanactive_gpio, + AR_GPIO_OUTPUT_MUX_AS_OUTPUT); + + if (btcoex_info->btcoex_scheme == ATH_BTCOEX_CFG_3WIRE) { + REG_WRITE(ah, AR_BT_COEX_MODE, AR_BT_QUIET | AR_BT_MODE); + REG_WRITE(ah, AR_BT_COEX_WEIGHT, 0); + REG_WRITE(ah, AR_BT_COEX_MODE2, 0); + } + + ah->ah_sc->sc_flags &= ~SC_OP_BTCOEX_ENABLED; +} + +/* + * Pause btcoex timer and bt duty cycle timer + */ +void ath_btcoex_timer_pause(struct ath_softc *sc, + struct ath_btcoex_info *btinfo) +{ + + del_timer_sync(&btinfo->period_timer); + + if (btinfo->hw_timer_enabled) + ath_gen_timer_stop(sc->sc_ah, btinfo->no_stomp_timer); + + btinfo->hw_timer_enabled = false; +} + +/* + * (Re)start btcoex timers + */ +void ath_btcoex_timer_resume(struct ath_softc *sc, + struct ath_btcoex_info *btinfo) +{ + + DPRINTF(sc, ATH_DBG_BTCOEX, "Starting btcoex timers"); + + /* make sure duty cycle timer is also stopped when resuming */ + if (btinfo->hw_timer_enabled) + ath_gen_timer_stop(sc->sc_ah, btinfo->no_stomp_timer); + + btinfo->bt_priority_cnt = 0; + btinfo->bt_priority_time = jiffies; + sc->sc_flags &= ~SC_OP_BT_PRIORITY_DETECTED; + + mod_timer(&btinfo->period_timer, jiffies); +} diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h new file mode 100644 index 0000000..4556819 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/btcoex.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2009 Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef BTCOEX_H +#define BTCOEX_H + +#define ATH_WLANACTIVE_GPIO 5 +#define ATH_BTACTIVE_GPIO 6 + +#define ATH_BTCOEX_DEF_BT_PERIOD 45 +#define ATH_BTCOEX_DEF_DUTY_CYCLE 55 +#define ATH_BTCOEX_BMISS_THRESH 50 + +#define ATH_BT_PRIORITY_TIME_THRESHOLD 1000 /* ms */ +#define ATH_BT_CNT_THRESHOLD 3 + +enum ath_btcoex_scheme { + ATH_BTCOEX_CFG_NONE, + ATH_BTCOEX_CFG_2WIRE, + ATH_BTCOEX_CFG_3WIRE, +}; + +enum ath_stomp_type { + ATH_BTCOEX_NO_STOMP, + ATH_BTCOEX_STOMP_ALL, + ATH_BTCOEX_STOMP_LOW, + ATH_BTCOEX_STOMP_NONE +}; + +enum ath_bt_mode { + ATH_BT_COEX_MODE_LEGACY, /* legacy rx_clear mode */ + ATH_BT_COEX_MODE_UNSLOTTED, /* untimed/unslotted mode */ + ATH_BT_COEX_MODE_SLOTTED, /* slotted mode */ + ATH_BT_COEX_MODE_DISALBED, /* coexistence disabled */ +}; + +struct ath_btcoex_config { + u8 bt_time_extend; + bool bt_txstate_extend; + bool bt_txframe_extend; + enum ath_bt_mode bt_mode; /* coexistence mode */ + bool bt_quiet_collision; + bool bt_rxclear_polarity; /* invert rx_clear as WLAN_ACTIVE*/ + u8 bt_priority_time; + u8 bt_first_slot_time; + bool bt_hold_rx_clear; +}; + +struct ath_btcoex_info { + enum ath_btcoex_scheme btcoex_scheme; + u8 wlanactive_gpio; + u8 btactive_gpio; + u8 btpriority_gpio; + u8 bt_duty_cycle; /* BT duty cycle in percentage */ + int bt_stomp_type; /* Types of BT stomping */ + u32 bt_coex_mode; /* Register setting for AR_BT_COEX_MODE */ + u32 bt_coex_weights; /* Register setting for AR_BT_COEX_WEIGHT */ + u32 bt_coex_mode2; /* Register setting for AR_BT_COEX_MODE2 */ + u32 btcoex_no_stomp; /* in usec */ + u32 btcoex_period; /* in usec */ + u32 bt_priority_cnt; + unsigned long bt_priority_time; + bool hw_timer_enabled; + spinlock_t btcoex_lock; + struct timer_list period_timer; /* Timer for BT period */ + struct ath_gen_timer *no_stomp_timer; /*Timer for no BT stomping*/ +}; + +int ath9k_hw_btcoex_init(struct ath_hw *ah); +void ath9k_hw_btcoex_enable(struct ath_hw *ah); +void ath9k_hw_btcoex_disable(struct ath_hw *ah); +void ath_btcoex_timer_resume(struct ath_softc *sc, + struct ath_btcoex_info *btinfo); +void ath_btcoex_timer_pause(struct ath_softc *sc, + struct ath_btcoex_info *btinfo); + +static inline void ath_btcoex_set_weight(struct ath_btcoex_info *btcoex_info, + u32 bt_weight, + u32 wlan_weight) +{ + btcoex_info->bt_coex_weights = SM(bt_weight, AR_BTCOEX_BT_WGHT) | + SM(wlan_weight, AR_BTCOEX_WL_WGHT); +} + +#endif diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c index 20f74b5..3234995 100644 --- a/drivers/net/wireless/ath/ath9k/calib.c +++ b/drivers/net/wireless/ath/ath9k/calib.c @@ -861,7 +861,7 @@ static void ath9k_hw_9271_pa_cal(struct ath_hw *ah) REG_WRITE(ah, regList[i][0], regList[i][1]); } -static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah) +static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah, bool is_reset) { u32 regVal; @@ -877,6 +877,13 @@ static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah) { 0x7838, 0 }, }; + DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE, "Running PA Calibration\n"); + + /* PA CAL is not needed for high power solution */ + if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == + AR5416_EEP_TXGAIN_HIGH_POWER) + return; + if (AR_SREV_9285_11(ah)) { REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14)); udelay(10); @@ -899,13 +906,13 @@ static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah) REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); - REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 1); + REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0); REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); ccomp_org = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_CCOMP); - REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 7); + REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 0xf); REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); udelay(30); @@ -917,7 +924,6 @@ static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah) regVal |= (1 << (19 + i)); REG_WRITE(ah, 0x7834, regVal); udelay(1); - regVal = REG_READ(ah, 0x7834); regVal &= (~(0x1 << (19 + i))); reg_field = MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9); regVal |= (reg_field << (19 + i)); @@ -936,6 +942,17 @@ static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah) offs_6_1 = offset>>1; offs_0 = offset & 1; + if ((!is_reset) && (ah->pacal_info.prev_offset == offset)) { + if (ah->pacal_info.max_skipcount < MAX_PACAL_SKIPCOUNT) + ah->pacal_info.max_skipcount = + 2 * ah->pacal_info.max_skipcount; + ah->pacal_info.skipcount = ah->pacal_info.max_skipcount; + } else { + ah->pacal_info.max_skipcount = 1; + ah->pacal_info.skipcount = 0; + ah->pacal_info.prev_offset = offset; + } + REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, offs_6_1); REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, offs_0); @@ -982,8 +999,12 @@ bool ath9k_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, /* Do periodic PAOffset Cal */ if (AR_SREV_9271(ah)) ath9k_hw_9271_pa_cal(ah); - else if (AR_SREV_9285_11_OR_LATER(ah)) - ath9k_hw_9285_pa_cal(ah); + else if (AR_SREV_9285_11_OR_LATER(ah)) { + if (!ah->pacal_info.skipcount) + ath9k_hw_9285_pa_cal(ah, false); + else + ah->pacal_info.skipcount--; + } if (OLC_FOR_AR9280_20_LATER || OLC_FOR_AR9287_10_LATER) ath9k_olc_temp_compensation(ah); @@ -1081,7 +1102,7 @@ bool ath9k_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan) /* Do PA Calibration */ if (AR_SREV_9285_11_OR_LATER(ah)) - ath9k_hw_9285_pa_cal(ah); + ath9k_hw_9285_pa_cal(ah, true); /* Do NF Calibration after DC offset and other calibrations */ REG_WRITE(ah, AR_PHY_AGC_CONTROL, diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h index 547e697..019bcbb 100644 --- a/drivers/net/wireless/ath/ath9k/calib.h +++ b/drivers/net/wireless/ath/ath9k/calib.h @@ -110,6 +110,13 @@ struct ath9k_nfcal_hist { u8 invalidNFcount; }; +#define MAX_PACAL_SKIPCOUNT 8 +struct ath9k_pacal_info{ + int32_t prev_offset; /* Previous value of PA offset value */ + int8_t max_skipcount; /* Max No. of times PACAL can be skipped */ + int8_t skipcount; /* No. of times the PACAL to be skipped */ +}; + bool ath9k_hw_reset_calvalid(struct ath_hw *ah); void ath9k_hw_start_nfcal(struct ath_hw *ah); void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 9e36920..2be4c22 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c @@ -93,6 +93,8 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, int i, qcuOffset = 0, dcuOffset = 0; u32 *qcuBase = &val[0], *dcuBase = &val[4]; + ath9k_ps_wakeup(sc); + REG_WRITE(ah, AR_MACMISC, ((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) | (AR_MACMISC_MISC_OBS_BUS_1 << @@ -159,6 +161,8 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, len += snprintf(buf + len, sizeof(buf) - len, "AR_CR: 0x%x \n", REG_READ(ah, AR_CR)); + ath9k_ps_restore(sc); + return simple_read_from_buffer(user_buf, count, ppos, buf, len); } diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h index 5e56b79..7241f47 100644 --- a/drivers/net/wireless/ath/ath9k/debug.h +++ b/drivers/net/wireless/ath/ath9k/debug.h @@ -30,6 +30,8 @@ enum ATH_DEBUG { ATH_DBG_CONFIG = 0x00000200, ATH_DBG_FATAL = 0x00000400, ATH_DBG_PS = 0x00000800, + ATH_DBG_HWTIMER = 0x00001000, + ATH_DBG_BTCOEX = 0x00002000, ATH_DBG_ANY = 0xffffffff }; diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c index 958948b..b6e52d0 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom.c +++ b/drivers/net/wireless/ath/ath9k/eeprom.c @@ -143,10 +143,10 @@ void ath9k_hw_get_legacy_target_powers(struct ath_hw *ah, IS_CHAN_2GHZ(chan))) { matchIndex = i; break; - } else if ((freq < ath9k_hw_fbin2freq(powInfo[i].bChannel, - IS_CHAN_2GHZ(chan))) && - (freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel, - IS_CHAN_2GHZ(chan)))) { + } else if (freq < ath9k_hw_fbin2freq(powInfo[i].bChannel, + IS_CHAN_2GHZ(chan)) && i > 0 && + freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel, + IS_CHAN_2GHZ(chan))) { lowIndex = i - 1; break; } @@ -198,10 +198,10 @@ void ath9k_hw_get_target_powers(struct ath_hw *ah, matchIndex = i; break; } else - if ((freq < ath9k_hw_fbin2freq(powInfo[i].bChannel, - IS_CHAN_2GHZ(chan))) && - (freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel, - IS_CHAN_2GHZ(chan)))) { + if (freq < ath9k_hw_fbin2freq(powInfo[i].bChannel, + IS_CHAN_2GHZ(chan)) && i > 0 && + freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel, + IS_CHAN_2GHZ(chan))) { lowIndex = i - 1; break; } diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 4f3d5ea..e340dac 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -2555,6 +2555,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, #endif } + if (ah->ah_sc->sc_flags & SC_OP_BTCOEX_ENABLED) + ath9k_hw_btcoex_enable(ah); + return 0; } @@ -3212,6 +3215,23 @@ bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked) if (AR_SREV_9100(ah)) return true; + if (isr & AR_ISR_GENTMR) { + u32 s5_s; + + s5_s = REG_READ(ah, AR_ISR_S5_S); + if (isr & AR_ISR_GENTMR) { + ah->intr_gen_timer_trigger = + MS(s5_s, AR_ISR_S5_GENTIMER_TRIG); + + ah->intr_gen_timer_thresh = + MS(s5_s, AR_ISR_S5_GENTIMER_THRESH); + + if (ah->intr_gen_timer_trigger) + *masked |= ATH9K_INT_GENTIMER; + + } + } + if (sync_cause) { fatal_int = (sync_cause & @@ -3486,6 +3506,7 @@ void ath9k_hw_fill_cap_info(struct ath_hw *ah) { struct ath9k_hw_capabilities *pCap = &ah->caps; struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); + struct ath_btcoex_info *btcoex_info = &ah->ah_sc->btcoex_info; u16 capField = 0, eeval; @@ -3662,9 +3683,15 @@ void ath9k_hw_fill_cap_info(struct ath_hw *ah) ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ); if (AR_SREV_9280_10_OR_LATER(ah) && btcoex_enable) { - pCap->hw_caps |= ATH9K_HW_CAP_BT_COEX; - ah->btactive_gpio = 6; - ah->wlanactive_gpio = 5; + btcoex_info->btactive_gpio = ATH_BTACTIVE_GPIO; + btcoex_info->wlanactive_gpio = ATH_WLANACTIVE_GPIO; + + if (AR_SREV_9285(ah)) + btcoex_info->btcoex_scheme = ATH_BTCOEX_CFG_3WIRE; + else + btcoex_info->btcoex_scheme = ATH_BTCOEX_CFG_2WIRE; + } else { + btcoex_info->btcoex_scheme = ATH_BTCOEX_CFG_NONE; } } @@ -4069,29 +4096,197 @@ void ath9k_hw_set11nmac2040(struct ath_hw *ah, enum ath9k_ht_macmode mode) REG_WRITE(ah, AR_2040_MODE, macmode); } -/***************************/ -/* Bluetooth Coexistence */ -/***************************/ +/* HW Generic timers configuration */ -void ath9k_hw_btcoex_enable(struct ath_hw *ah) +static const struct ath_gen_timer_configuration gen_tmr_configuration[] = +{ + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080}, + {AR_NEXT_NDP2_TIMER, AR_NDP2_PERIOD, AR_NDP2_TIMER_MODE, 0x0001}, + {AR_NEXT_NDP2_TIMER + 1*4, AR_NDP2_PERIOD + 1*4, + AR_NDP2_TIMER_MODE, 0x0002}, + {AR_NEXT_NDP2_TIMER + 2*4, AR_NDP2_PERIOD + 2*4, + AR_NDP2_TIMER_MODE, 0x0004}, + {AR_NEXT_NDP2_TIMER + 3*4, AR_NDP2_PERIOD + 3*4, + AR_NDP2_TIMER_MODE, 0x0008}, + {AR_NEXT_NDP2_TIMER + 4*4, AR_NDP2_PERIOD + 4*4, + AR_NDP2_TIMER_MODE, 0x0010}, + {AR_NEXT_NDP2_TIMER + 5*4, AR_NDP2_PERIOD + 5*4, + AR_NDP2_TIMER_MODE, 0x0020}, + {AR_NEXT_NDP2_TIMER + 6*4, AR_NDP2_PERIOD + 6*4, + AR_NDP2_TIMER_MODE, 0x0040}, + {AR_NEXT_NDP2_TIMER + 7*4, AR_NDP2_PERIOD + 7*4, + AR_NDP2_TIMER_MODE, 0x0080} +}; + +/* HW generic timer primitives */ + +/* compute and clear index of rightmost 1 */ +static u32 rightmost_index(struct ath_gen_timer_table *timer_table, u32 *mask) { - /* connect bt_active to baseband */ - REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL, - (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF | - AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF)); + u32 b; - REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, - AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB); + b = *mask; + b &= (0-b); + *mask &= ~b; + b *= debruijn32; + b >>= 27; + + return timer_table->gen_timer_index[b]; +} + +u32 ath9k_hw_gettsf32(struct ath_hw *ah) +{ + return REG_READ(ah, AR_TSF_L32); +} + +struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, + void (*trigger)(void *), + void (*overflow)(void *), + void *arg, + u8 timer_index) +{ + struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; + struct ath_gen_timer *timer; + + timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL); + + if (timer == NULL) { + printk(KERN_DEBUG "Failed to allocate memory" + "for hw timer[%d]\n", timer_index); + return NULL; + } + + /* allocate a hardware generic timer slot */ + timer_table->timers[timer_index] = timer; + timer->index = timer_index; + timer->trigger = trigger; + timer->overflow = overflow; + timer->arg = arg; + + return timer; +} + +void ath_gen_timer_start(struct ath_hw *ah, + struct ath_gen_timer *timer, + u32 timer_next, u32 timer_period) +{ + struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; + u32 tsf; + + BUG_ON(!timer_period); + + set_bit(timer->index, &timer_table->timer_mask.timer_bits); - /* Set input mux for bt_active to gpio pin */ - REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1, - AR_GPIO_INPUT_MUX1_BT_ACTIVE, - ah->btactive_gpio); + tsf = ath9k_hw_gettsf32(ah); - /* Configure the desired gpio port for input */ - ath9k_hw_cfg_gpio_input(ah, ah->btactive_gpio); + DPRINTF(ah->ah_sc, ATH_DBG_HWTIMER, "curent tsf %x period %x" + "timer_next %x\n", tsf, timer_period, timer_next); - /* Configure the desired GPIO port for TX_FRAME output */ - ath9k_hw_cfg_output(ah, ah->wlanactive_gpio, - AR_GPIO_OUTPUT_MUX_AS_TX_FRAME); + /* + * Pull timer_next forward if the current TSF already passed it + * because of software latency + */ + if (timer_next < tsf) + timer_next = tsf + timer_period; + + /* + * Program generic timer registers + */ + REG_WRITE(ah, gen_tmr_configuration[timer->index].next_addr, + timer_next); + REG_WRITE(ah, gen_tmr_configuration[timer->index].period_addr, + timer_period); + REG_SET_BIT(ah, gen_tmr_configuration[timer->index].mode_addr, + gen_tmr_configuration[timer->index].mode_mask); + + /* Enable both trigger and thresh interrupt masks */ + REG_SET_BIT(ah, AR_IMR_S5, + (SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) | + SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG))); + + if ((ah->ah_sc->imask & ATH9K_INT_GENTIMER) == 0) { + ath9k_hw_set_interrupts(ah, 0); + ah->ah_sc->imask |= ATH9K_INT_GENTIMER; + ath9k_hw_set_interrupts(ah, ah->ah_sc->imask); + } +} + +void ath_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer) +{ + struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; + + if ((timer->index < AR_FIRST_NDP_TIMER) || + (timer->index >= ATH_MAX_GEN_TIMER)) { + return; + } + + /* Clear generic timer enable bits. */ + REG_CLR_BIT(ah, gen_tmr_configuration[timer->index].mode_addr, + gen_tmr_configuration[timer->index].mode_mask); + + /* Disable both trigger and thresh interrupt masks */ + REG_CLR_BIT(ah, AR_IMR_S5, + (SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) | + SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG))); + + clear_bit(timer->index, &timer_table->timer_mask.timer_bits); + + /* if no timer is enabled, turn off interrupt mask */ + if (timer_table->timer_mask.val == 0) { + ath9k_hw_set_interrupts(ah, 0); + ah->ah_sc->imask &= ~ATH9K_INT_GENTIMER; + ath9k_hw_set_interrupts(ah, ah->ah_sc->imask); + } +} + +void ath_gen_timer_free(struct ath_hw *ah, struct ath_gen_timer *timer) +{ + struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; + + /* free the hardware generic timer slot */ + timer_table->timers[timer->index] = NULL; + kfree(timer); +} + +/* + * Generic Timer Interrupts handling + */ +void ath_gen_timer_isr(struct ath_hw *ah) +{ + struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; + struct ath_gen_timer *timer; + u32 trigger_mask, thresh_mask, index; + + /* get hardware generic timer interrupt status */ + trigger_mask = ah->intr_gen_timer_trigger; + thresh_mask = ah->intr_gen_timer_thresh; + trigger_mask &= timer_table->timer_mask.val; + thresh_mask &= timer_table->timer_mask.val; + + trigger_mask &= ~thresh_mask; + + while (thresh_mask) { + index = rightmost_index(timer_table, &thresh_mask); + timer = timer_table->timers[index]; + BUG_ON(!timer); + DPRINTF(ah->ah_sc, ATH_DBG_HWTIMER, + "TSF overflow for Gen timer %d\n", index); + timer->overflow(timer->arg); + } + + while (trigger_mask) { + index = rightmost_index(timer_table, &trigger_mask); + timer = timer_table->timers[index]; + BUG_ON(!timer); + DPRINTF(ah->ah_sc, ATH_DBG_HWTIMER, + "Gen timer[%d] trigger\n", index); + timer->trigger(timer->arg); + } } diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 24b3063..5ca6ffa7 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h @@ -79,6 +79,7 @@ #define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1 #define AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED 2 #define AR_GPIO_OUTPUT_MUX_AS_TX_FRAME 3 +#define AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL 4 #define AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED 5 #define AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED 6 @@ -151,7 +152,6 @@ enum ath9k_hw_caps { ATH9K_HW_CAP_ENHANCEDPM = BIT(14), ATH9K_HW_CAP_AUTOSLEEP = BIT(15), ATH9K_HW_CAP_4KB_SPLITTRANS = BIT(16), - ATH9K_HW_CAP_BT_COEX = BIT(17) }; enum ath9k_capability_type { @@ -238,6 +238,7 @@ enum ath9k_int { ATH9K_INT_GPIO = 0x01000000, ATH9K_INT_CABEND = 0x02000000, ATH9K_INT_TSFOOR = 0x04000000, + ATH9K_INT_GENTIMER = 0x08000000, ATH9K_INT_CST = 0x10000000, ATH9K_INT_GTT = 0x20000000, ATH9K_INT_FATAL = 0x40000000, @@ -391,6 +392,41 @@ struct ath9k_hw_version { u16 analog2GhzRev; }; +/* Generic TSF timer definitions */ + +#define ATH_MAX_GEN_TIMER 16 + +#define AR_GENTMR_BIT(_index) (1 << (_index)) + +/* + * Using de Bruijin sequence to to look up 1's index in a 32 bit number + * debruijn32 = 0000 0111 0111 1100 1011 0101 0011 0001 + */ +#define debruijn32 0x077CB531UL + +struct ath_gen_timer_configuration { + u32 next_addr; + u32 period_addr; + u32 mode_addr; + u32 mode_mask; +}; + +struct ath_gen_timer { + void (*trigger)(void *arg); + void (*overflow)(void *arg); + void *arg; + u8 index; +}; + +struct ath_gen_timer_table { + u32 gen_timer_index[32]; + struct ath_gen_timer *timers[ATH_MAX_GEN_TIMER]; + union { + unsigned long timer_bits; + u16 val; + } timer_mask; +}; + struct ath_hw { struct ath_softc *ah_sc; struct ath9k_hw_version hw_version; @@ -414,8 +450,6 @@ struct ath_hw { u16 rfsilent; u32 rfkill_gpio; u32 rfkill_polarity; - u32 btactive_gpio; - u32 wlanactive_gpio; u32 ah_flags; bool htc_reset_init; @@ -424,6 +458,7 @@ struct ath_hw { enum ath9k_power_mode power_mode; struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS]; + struct ath9k_pacal_info pacal_info; struct ar5416Stats stats; struct ath9k_tx_queue_info txq[ATH9K_NUM_TX_QUEUES]; @@ -538,6 +573,10 @@ struct ath_hw { struct ar5416IniArray iniModesAdditional; struct ar5416IniArray iniModesRxGain; struct ar5416IniArray iniModesTxGain; + + u32 intr_gen_timer_trigger; + u32 intr_gen_timer_thresh; + struct ath_gen_timer_table hw_gen_timers; }; /* Initialization, Detach, Reset */ @@ -613,6 +652,17 @@ bool ath9k_hw_intrpend(struct ath_hw *ah); bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked); enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints); -void ath9k_hw_btcoex_enable(struct ath_hw *ah); +/* Generic hw timer primitives */ +struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, + void (*trigger)(void *), + void (*overflow)(void *), + void *arg, + u8 timer_index); +void ath_gen_timer_start(struct ath_hw *ah, struct ath_gen_timer *timer, + u32 timer_next, u32 timer_period); +void ath_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer); +void ath_gen_timer_free(struct ath_hw *ah, struct ath_gen_timer *timer); +void ath_gen_timer_isr(struct ath_hw *hw); +u32 ath9k_hw_gettsf32(struct ath_hw *ah); #endif diff --git a/drivers/net/wireless/ath/ath9k/initvals.h b/drivers/net/wireless/ath/ath9k/initvals.h index 27a86bb..8622265 100644 --- a/drivers/net/wireless/ath/ath9k/initvals.h +++ b/drivers/net/wireless/ath/ath9k/initvals.h @@ -4133,7 +4133,7 @@ static const u_int32_t ar9285Modes_9285_1_2[][6] = { { 0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440, 0x00006880 }, { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, - { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, + { 0x00009824, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e }, { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, @@ -4158,7 +4158,7 @@ static const u_int32_t ar9285Modes_9285_1_2[][6] = { { 0x000099bc, 0x00000600, 0x00000600, 0x00000c00, 0x00000c00, 0x00000c00 }, { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, - { 0x000099c8, 0x6af65329, 0x6af65329, 0x6af65329, 0x6af65329, 0x6af65329 }, + { 0x000099c8, 0x6af6532f, 0x6af6532f, 0x6af6532f, 0x6af6532f, 0x6af6532f }, { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, @@ -4601,7 +4601,7 @@ static const u_int32_t ar9285Common_9285_1_2[][2] = { { 0x00008258, 0x00000000 }, { 0x0000825c, 0x400000ff }, { 0x00008260, 0x00080922 }, - { 0x00008264, 0xa8a00010 }, + { 0x00008264, 0x88a00010 }, { 0x00008270, 0x00000000 }, { 0x00008274, 0x40000000 }, { 0x00008278, 0x003e4180 }, @@ -4650,7 +4650,7 @@ static const u_int32_t ar9285Common_9285_1_2[][2] = { { 0x00009954, 0x5f3ca3de }, { 0x00009958, 0x2108ecff }, { 0x00009968, 0x000003ce }, - { 0x00009970, 0x192bb515 }, + { 0x00009970, 0x192bb514 }, { 0x00009974, 0x00000000 }, { 0x00009978, 0x00000001 }, { 0x0000997c, 0x00000000 }, @@ -4728,7 +4728,7 @@ static const u_int32_t ar9285Common_9285_1_2[][2] = { { 0x00007800, 0x00140000 }, { 0x00007804, 0x0e4548d8 }, { 0x00007808, 0x54214514 }, - { 0x0000780c, 0x02025820 }, + { 0x0000780c, 0x02025830 }, { 0x00007810, 0x71c0d388 }, { 0x00007814, 0x924934a8 }, { 0x0000781c, 0x00000000 }, diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 9b9b4e8..4fae699 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -439,8 +439,8 @@ static void ath_start_ani(struct ath_softc *sc) */ void ath_update_chainmask(struct ath_softc *sc, int is_ht) { - if (is_ht || - (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BT_COEX)) { + if ((sc->sc_flags & SC_OP_SCANNING) || is_ht || + (sc->btcoex_info.btcoex_scheme != ATH_BTCOEX_CFG_NONE)) { sc->tx_chainmask = sc->sc_ah->caps.tx_chainmask; sc->rx_chainmask = sc->sc_ah->caps.rx_chainmask; } else { @@ -602,6 +602,10 @@ irqreturn_t ath_isr(int irq, void *dev) sc->sc_flags |= SC_OP_WAIT_FOR_BEACON; } + if (sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE) + if (status & ATH9K_INT_GENTIMER) + ath_gen_timer_isr(ah); + chip_reset: ath_debug_stat_interrupt(sc, status); @@ -1279,6 +1283,10 @@ void ath_detach(struct ath_softc *sc) if (ATH_TXQ_SETUP(sc, i)) ath_tx_cleanupq(sc, &sc->tx.txq[i]); + if ((sc->btcoex_info.no_stomp_timer) && + sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE) + ath_gen_timer_free(sc->sc_ah, sc->btcoex_info.no_stomp_timer); + ath9k_hw_detach(sc->sc_ah); sc->sc_ah = NULL; ath9k_exit_debug(sc); @@ -1509,8 +1517,11 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc) ARRAY_SIZE(ath9k_5ghz_chantable); } - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BT_COEX) - ath9k_hw_btcoex_enable(sc->sc_ah); + if (sc->btcoex_info.btcoex_scheme != ATH_BTCOEX_CFG_NONE) { + r = ath9k_hw_btcoex_init(ah); + if (r) + goto bad2; + } return 0; bad2: @@ -1992,6 +2003,16 @@ static int ath9k_start(struct ieee80211_hw *hw) ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); + if ((sc->btcoex_info.btcoex_scheme != ATH_BTCOEX_CFG_NONE) && + !(sc->sc_flags & SC_OP_BTCOEX_ENABLED)) { + ath_btcoex_set_weight(&sc->btcoex_info, AR_BT_COEX_WGHT, + AR_STOMP_LOW_WLAN_WGHT); + ath9k_hw_btcoex_enable(sc->sc_ah); + + if (sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE) + ath_btcoex_timer_resume(sc, &sc->btcoex_info); + } + mutex_unlock: mutex_unlock(&sc->mutex); @@ -2125,6 +2146,12 @@ static void ath9k_stop(struct ieee80211_hw *hw) return; /* another wiphy still in use */ } + if (sc->sc_flags & SC_OP_BTCOEX_ENABLED) { + ath9k_hw_btcoex_disable(sc->sc_ah); + if (sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE) + ath_btcoex_timer_pause(sc, &sc->btcoex_info); + } + /* make sure h/w will not generate any interrupt * before setting the invalid flag. */ ath9k_hw_set_interrupts(sc->sc_ah, 0); @@ -2713,6 +2740,7 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw) struct ath_wiphy *aphy = hw->priv; struct ath_softc *sc = aphy->sc; + mutex_lock(&sc->mutex); if (ath9k_wiphy_scanning(sc)) { printk(KERN_DEBUG "ath9k: Two wiphys trying to scan at the " "same time\n"); @@ -2720,6 +2748,7 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw) * Do not allow the concurrent scanning state for now. This * could be improved with scanning control moved into ath9k. */ + mutex_unlock(&sc->mutex); return; } @@ -2729,6 +2758,7 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw) spin_lock_bh(&sc->ani_lock); sc->sc_flags |= SC_OP_SCANNING; spin_unlock_bh(&sc->ani_lock); + mutex_unlock(&sc->mutex); } static void ath9k_sw_scan_complete(struct ieee80211_hw *hw) @@ -2736,11 +2766,13 @@ static void ath9k_sw_scan_complete(struct ieee80211_hw *hw) struct ath_wiphy *aphy = hw->priv; struct ath_softc *sc = aphy->sc; + mutex_lock(&sc->mutex); spin_lock_bh(&sc->ani_lock); aphy->state = ATH_WIPHY_ACTIVE; sc->sc_flags &= ~SC_OP_SCANNING; sc->sc_flags |= SC_OP_FULL_RESET; spin_unlock_bh(&sc->ani_lock); + mutex_unlock(&sc->mutex); } struct ieee80211_ops ath9k_ops = { diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 7b62c22..52e62da 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c @@ -423,11 +423,12 @@ u32 ath_calcrxfilter(struct ath_softc *sc) if (sc->rx.rxfilter & FIF_PSPOLL) rfilt |= ATH9K_RX_FILTER_PSPOLL; - if (sc->sec_wiphy) { + if (sc->sec_wiphy || (sc->rx.rxfilter & FIF_OTHER_BSS)) { /* TODO: only needed if more than one BSSID is in use in * station/adhoc mode */ - /* TODO: for older chips, may need to add ATH9K_RX_FILTER_PROM - */ + /* The following may also be needed for other older chips */ + if (sc->sc_ah->hw_version.macVersion == AR_SREV_VERSION_9160) + rfilt |= ATH9K_RX_FILTER_PROM; rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL; } diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index c9e1ac9..3ddb243f0 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h @@ -234,7 +234,15 @@ #define AR_IMR_S5 0x00b8 #define AR_IMR_S5_TIM_TIMER 0x00000010 #define AR_IMR_S5_DTIM_TIMER 0x00000020 - +#define AR_ISR_S5_GENTIMER_TRIG 0x0000FF80 +#define AR_ISR_S5_GENTIMER_TRIG_S 0 +#define AR_ISR_S5_GENTIMER_THRESH 0xFF800000 +#define AR_ISR_S5_GENTIMER_THRESH_S 16 +#define AR_ISR_S5_S 0x00d8 +#define AR_IMR_S5_GENTIMER_TRIG 0x0000FF80 +#define AR_IMR_S5_GENTIMER_TRIG_S 0 +#define AR_IMR_S5_GENTIMER_THRESH 0xFF800000 +#define AR_IMR_S5_GENTIMER_THRESH_S 16 #define AR_IMR 0x00a0 #define AR_IMR_RXOK 0x00000001 @@ -962,6 +970,8 @@ enum { #define AR_GPIO_INPUT_EN_VAL_RFSILENT_DEF_S 7 #define AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB 0x00001000 #define AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB_S 12 +#define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB 0x00001000 +#define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB_S 1 #define AR_GPIO_INPUT_EN_VAL_RFSILENT_BB 0x00008000 #define AR_GPIO_INPUT_EN_VAL_RFSILENT_BB_S 15 #define AR_GPIO_RTC_RESET_OVERRIDE_ENABLE 0x00010000 @@ -970,6 +980,8 @@ enum { #define AR_GPIO_INPUT_MUX1 0x4058 #define AR_GPIO_INPUT_MUX1_BT_ACTIVE 0x000f0000 #define AR_GPIO_INPUT_MUX1_BT_ACTIVE_S 16 +#define AR_GPIO_INPUT_MUX1_BT_PRIORITY 0x00000f00 +#define AR_GPIO_INPUT_MUX1_BT_PRIORITY_S 8 #define AR_GPIO_INPUT_MUX2 0x405c #define AR_GPIO_INPUT_MUX2_CLK25 0x0000000f @@ -995,6 +1007,8 @@ enum { #define AR_OBS 0x4080 +#define AR_GPIO_PDPU 0x4088 + #define AR_PCIE_MSI 0x4094 #define AR_PCIE_MSI_ENABLE 0x00000001 @@ -1428,6 +1442,7 @@ enum { #define AR_QUIET1_NEXT_QUIET_M 0x0000ffff #define AR_QUIET1_QUIET_ENABLE 0x00010000 #define AR_QUIET1_QUIET_ACK_CTS_ENABLE 0x00020000 +#define AR_QUIET1_QUIET_ACK_CTS_ENABLE_S 17 #define AR_QUIET2 0x8100 #define AR_QUIET2_QUIET_PERIOD_S 0 #define AR_QUIET2_QUIET_PERIOD_M 0x0000ffff @@ -1473,6 +1488,8 @@ enum { #define AR_PCU_CLEAR_VMF 0x01000000 #define AR_PCU_CLEAR_BA_VALID 0x04000000 +#define AR_PCU_BT_ANT_PREVENT_RX 0x00100000 +#define AR_PCU_BT_ANT_PREVENT_RX_S 20 #define AR_FILT_OFDM 0x8124 #define AR_FILT_OFDM_COUNT 0x00FFFFFF @@ -1500,6 +1517,46 @@ enum { #define AR_PHY_ERR_3_COUNT 0x00FFFFFF #define AR_PHY_ERR_MASK_3 0x816c +#define AR_BT_COEX_MODE 0x8170 +#define AR_BT_TIME_EXTEND 0x000000ff +#define AR_BT_TIME_EXTEND_S 0 +#define AR_BT_TXSTATE_EXTEND 0x00000100 +#define AR_BT_TXSTATE_EXTEND_S 8 +#define AR_BT_TX_FRAME_EXTEND 0x00000200 +#define AR_BT_TX_FRAME_EXTEND_S 9 +#define AR_BT_MODE 0x00000c00 +#define AR_BT_MODE_S 10 +#define AR_BT_QUIET 0x00001000 +#define AR_BT_QUIET_S 12 +#define AR_BT_QCU_THRESH 0x0001e000 +#define AR_BT_QCU_THRESH_S 13 +#define AR_BT_RX_CLEAR_POLARITY 0x00020000 +#define AR_BT_RX_CLEAR_POLARITY_S 17 +#define AR_BT_PRIORITY_TIME 0x00fc0000 +#define AR_BT_PRIORITY_TIME_S 18 +#define AR_BT_FIRST_SLOT_TIME 0xff000000 +#define AR_BT_FIRST_SLOT_TIME_S 24 + +#define AR_BT_COEX_WEIGHT 0x8174 +#define AR_BT_COEX_WGHT 0xff55 +#define AR_STOMP_ALL_WLAN_WGHT 0xffcc +#define AR_STOMP_LOW_WLAN_WGHT 0xaaa8 +#define AR_STOMP_NONE_WLAN_WGHT 0xaa00 +#define AR_BTCOEX_BT_WGHT 0x0000ffff +#define AR_BTCOEX_BT_WGHT_S 0 +#define AR_BTCOEX_WL_WGHT 0xffff0000 +#define AR_BTCOEX_WL_WGHT_S 16 + +#define AR_BT_COEX_MODE2 0x817c +#define AR_BT_BCN_MISS_THRESH 0x000000ff +#define AR_BT_BCN_MISS_THRESH_S 0 +#define AR_BT_BCN_MISS_CNT 0x0000ff00 +#define AR_BT_BCN_MISS_CNT_S 8 +#define AR_BT_HOLD_RX_CLEAR 0x00010000 +#define AR_BT_HOLD_RX_CLEAR_S 16 +#define AR_BT_DISABLE_BT_ANT 0x00100000 +#define AR_BT_DISABLE_BT_ANT_S 20 + #define AR_TXSIFS 0x81d0 #define AR_TXSIFS_TIME 0x000000FF #define AR_TXSIFS_TX_LATENCY 0x00000F00 @@ -1516,7 +1573,10 @@ enum { #define AR_TXOP_8_11 0x81f8 #define AR_TXOP_12_15 0x81fc - +#define AR_NEXT_NDP2_TIMER 0x8180 +#define AR_FIRST_NDP_TIMER 7 +#define AR_NDP2_PERIOD 0x81a0 +#define AR_NDP2_TIMER_MODE 0x81c0 #define AR_NEXT_TBTT_TIMER 0x8200 #define AR_NEXT_DMA_BEACON_ALERT 0x8204 #define AR_NEXT_SWBA 0x8208 diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 87762da..42551a4 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -493,7 +493,12 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf, if (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE || legacy) return 0; - aggr_limit = min(max_4ms_framelen, (u32)ATH_AMPDU_LIMIT_MAX); + if (sc->sc_flags & SC_OP_BT_PRIORITY_DETECTED) + aggr_limit = min((max_4ms_framelen * 3) / 8, + (u32)ATH_AMPDU_LIMIT_MAX); + else + aggr_limit = min(max_4ms_framelen, + (u32)ATH_AMPDU_LIMIT_MAX); /* * h/w can accept aggregates upto 16 bit lengths (65535). @@ -872,7 +877,7 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) return &sc->tx.txq[qnum]; } -static int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype) +int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype) { int qnum; diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig index 237b1aa..2af3b35 100644 --- a/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig @@ -82,15 +82,13 @@ config B43_NPHY config B43_PHY_LP bool "Support for low-power (LP-PHY) devices (EXPERIMENTAL)" depends on B43 && EXPERIMENTAL + default y ---help--- Support for the LP-PHY. The LP-PHY is a low-power PHY built into some notebooks and embedded devices. It supports 802.11a/g (802.11a support is optional, and currently disabled). - This is heavily experimental, and probably will not work for you. - Say N unless you want to help debug the driver. - # This config option automatically enables b43 LEDS support, # if it's possible. config B43_LEDS diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index f5bdf1c..0f16844 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -1456,7 +1456,8 @@ static u16 b43_antenna_to_phyctl(int antenna) return B43_TXH_PHY_ANT2; case B43_ANTENNA3: return B43_TXH_PHY_ANT3; - case B43_ANTENNA_AUTO: + case B43_ANTENNA_AUTO0: + case B43_ANTENNA_AUTO1: return B43_TXH_PHY_ANT01AUTO; } B43_WARN_ON(1); diff --git a/drivers/net/wireless/b43/phy_a.c b/drivers/net/wireless/b43/phy_a.c index 816e028..809ec97 100644 --- a/drivers/net/wireless/b43/phy_a.c +++ b/drivers/net/wireless/b43/phy_a.c @@ -531,7 +531,7 @@ static void b43_aphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna) tmp = b43_phy_read(dev, B43_PHY_BBANDCFG); tmp &= ~B43_PHY_BBANDCFG_RXANT; - tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna) + tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna) << B43_PHY_BBANDCFG_RXANT_SHIFT; b43_phy_write(dev, B43_PHY_BBANDCFG, tmp); diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c index 51686ec..6e704be 100644 --- a/drivers/net/wireless/b43/phy_common.c +++ b/drivers/net/wireless/b43/phy_common.c @@ -249,20 +249,35 @@ void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) void b43_phy_mask(struct b43_wldev *dev, u16 offset, u16 mask) { - b43_phy_write(dev, offset, - b43_phy_read(dev, offset) & mask); + if (dev->phy.ops->phy_maskset) { + assert_mac_suspended(dev); + dev->phy.ops->phy_maskset(dev, offset, mask, 0); + } else { + b43_phy_write(dev, offset, + b43_phy_read(dev, offset) & mask); + } } void b43_phy_set(struct b43_wldev *dev, u16 offset, u16 set) { - b43_phy_write(dev, offset, - b43_phy_read(dev, offset) | set); + if (dev->phy.ops->phy_maskset) { + assert_mac_suspended(dev); + dev->phy.ops->phy_maskset(dev, offset, 0xFFFF, set); + } else { + b43_phy_write(dev, offset, + b43_phy_read(dev, offset) | set); + } } void b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set) { - b43_phy_write(dev, offset, - (b43_phy_read(dev, offset) & mask) | set); + if (dev->phy.ops->phy_maskset) { + assert_mac_suspended(dev); + dev->phy.ops->phy_maskset(dev, offset, mask, set); + } else { + b43_phy_write(dev, offset, + (b43_phy_read(dev, offset) & mask) | set); + } } int b43_switch_channel(struct b43_wldev *dev, unsigned int new_channel) diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h index 9f9f23c..28e3846 100644 --- a/drivers/net/wireless/b43/phy_common.h +++ b/drivers/net/wireless/b43/phy_common.h @@ -49,11 +49,11 @@ enum b43_interference_mitigation { /* Antenna identifiers */ enum { - B43_ANTENNA0, /* Antenna 0 */ - B43_ANTENNA1, /* Antenna 0 */ - B43_ANTENNA_AUTO1, /* Automatic, starting with antenna 1 */ - B43_ANTENNA_AUTO0, /* Automatic, starting with antenna 0 */ - B43_ANTENNA2, + B43_ANTENNA0 = 0, /* Antenna 0 */ + B43_ANTENNA1 = 1, /* Antenna 1 */ + B43_ANTENNA_AUTO0 = 2, /* Automatic, starting with antenna 0 */ + B43_ANTENNA_AUTO1 = 3, /* Automatic, starting with antenna 1 */ + B43_ANTENNA2 = 4, B43_ANTENNA3 = 8, B43_ANTENNA_AUTO = B43_ANTENNA_AUTO0, @@ -95,6 +95,8 @@ enum b43_txpwr_result { * Must not be NULL. * @phy_write: Write to a PHY register. * Must not be NULL. + * @phy_maskset: Maskset a PHY register, taking shortcuts. + * If it is NULL, a generic algorithm is used. * @radio_read: Read from a Radio register. * Must not be NULL. * @radio_write: Write to a Radio register. @@ -154,6 +156,7 @@ struct b43_phy_operations { /* Register access */ u16 (*phy_read)(struct b43_wldev *dev, u16 reg); void (*phy_write)(struct b43_wldev *dev, u16 reg, u16 value); + void (*phy_maskset)(struct b43_wldev *dev, u16 reg, u16 mask, u16 set); u16 (*radio_read)(struct b43_wldev *dev, u16 reg); void (*radio_write)(struct b43_wldev *dev, u16 reg, u16 value); diff --git a/drivers/net/wireless/b43/phy_g.c b/drivers/net/wireless/b43/phy_g.c index e471312..bdff9af 100644 --- a/drivers/net/wireless/b43/phy_g.c +++ b/drivers/net/wireless/b43/phy_g.c @@ -2664,7 +2664,7 @@ static void b43_gphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna) tmp = b43_phy_read(dev, B43_PHY_BBANDCFG); tmp &= ~B43_PHY_BBANDCFG_RXANT; - tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna) + tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna) << B43_PHY_BBANDCFG_RXANT_SHIFT; b43_phy_write(dev, B43_PHY_BBANDCFG, tmp); diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c index 2d3a5d8..1ab00b0 100644 --- a/drivers/net/wireless/b43/phy_lp.c +++ b/drivers/net/wireless/b43/phy_lp.c @@ -182,8 +182,8 @@ static void lpphy_adjust_gain_table(struct b43_wldev *dev, u32 freq) temp[1] = temp[0] + 0x1000; temp[2] = temp[0] + 0x2000; - b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), 3, temp); b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), 3, temp); + b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), 3, temp); } static void lpphy_table_init(struct b43_wldev *dev) @@ -223,8 +223,8 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev) b43_phy_maskset(dev, B43_LPPHY_VERYLOWGAINDB, 0xFF00, 0x0006); b43_phy_mask(dev, B43_LPPHY_RX_RADIO_CTL, 0xFFFE); b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFFE0, 0x0005); - b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFC10, 0x0180); - b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0x83FF, 0x3800); + b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFC1F, 0x0180); + b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0x83FF, 0x3C00); b43_phy_maskset(dev, B43_LPPHY_GAINDIRECTMISMATCH, 0xFFF0, 0x0005); b43_phy_maskset(dev, B43_LPPHY_GAIN_MISMATCH_LIMIT, 0xFFC0, 0x001A); b43_phy_maskset(dev, B43_LPPHY_CRS_ED_THRESH, 0xFF00, 0x00B3); @@ -234,19 +234,15 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev) if ((bus->sprom.boardflags_lo & B43_BFL_FEM) && ((b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) || (bus->sprom.boardflags_hi & B43_BFH_PAREF))) { - /* TODO: - * Set the LDO voltage to 0x0028 - FIXME: What is this? - * Call sb_pmu_set_ldo_voltage with 4 and the LDO voltage - * as arguments - * Call sb_pmu_paref_ldo_enable with argument TRUE - */ + ssb_pmu_set_ldo_voltage(&bus->chipco, LDO_PAREF, 0x28); + ssb_pmu_set_ldo_paref(&bus->chipco, true); if (dev->phy.rev == 0) { b43_phy_maskset(dev, B43_LPPHY_LP_RF_SIGNAL_LUT, 0xFFCF, 0x0010); } b43_lptab_write(dev, B43_LPTAB16(11, 7), 60); } else { - //TODO: Call ssb_pmu_paref_ldo_enable with argument FALSE + ssb_pmu_set_ldo_paref(&bus->chipco, false); b43_phy_maskset(dev, B43_LPPHY_LP_RF_SIGNAL_LUT, 0xFFCF, 0x0020); b43_lptab_write(dev, B43_LPTAB16(11, 7), 100); @@ -340,11 +336,11 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev) if (dev->phy.rev == 1) { tmp = b43_phy_read(dev, B43_LPPHY_CLIPCTRTHRESH); tmp2 = (tmp & 0x03E0) >> 5; - tmp2 |= tmp << 5; + tmp2 |= tmp2 << 5; b43_phy_write(dev, B43_LPPHY_4C3, tmp2); - tmp = b43_phy_read(dev, B43_LPPHY_OFDMSYNCTHRESH0); + tmp = b43_phy_read(dev, B43_LPPHY_GAINDIRECTMISMATCH); tmp2 = (tmp & 0x1F00) >> 8; - tmp2 |= tmp << 5; + tmp2 |= tmp2 << 5; b43_phy_write(dev, B43_LPPHY_4C4, tmp2); tmp = b43_phy_read(dev, B43_LPPHY_VERYLOWGAINDB); tmp2 = tmp & 0x00FF; @@ -705,7 +701,7 @@ static void lpphy_set_rc_cap(struct b43_wldev *dev) u8 rc_cap = (lpphy->rc_cap & 0x1F) >> 1; if (dev->phy.rev == 1) //FIXME check channel 14! - rc_cap = max_t(u8, rc_cap + 5, 15); + rc_cap = min_t(u8, rc_cap + 5, 15); b43_radio_write(dev, B2062_N_RXBB_CALIB2, max_t(u8, lpphy->rc_cap - 4, 0x80)); @@ -761,7 +757,7 @@ static void lpphy_disable_crs(struct b43_wldev *dev, bool user) b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x3); b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xFFFB); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x4); - b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_0, 0xFFF7); + b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xFFF7); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x8); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0x10); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x10); @@ -956,7 +952,7 @@ static void lpphy_run_ddfs(struct b43_wldev *dev, int i_on, int q_on, b43_phy_maskset(dev, B43_LPPHY_AFE_DDFS, 0xFF9F, scale_idx << 5); b43_phy_mask(dev, B43_LPPHY_AFE_DDFS, 0xFFFB); b43_phy_set(dev, B43_LPPHY_AFE_DDFS, 0x2); - b43_phy_set(dev, B43_LPPHY_AFE_DDFS, 0x20); + b43_phy_set(dev, B43_LPPHY_LP_PHY_CTL, 0x20); } static bool lpphy_rx_iq_est(struct b43_wldev *dev, u16 samples, u8 time, @@ -968,7 +964,7 @@ static bool lpphy_rx_iq_est(struct b43_wldev *dev, u16 samples, u8 time, b43_phy_write(dev, B43_LPPHY_IQ_NUM_SMPLS_ADDR, samples); b43_phy_maskset(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFF00, time); b43_phy_mask(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFEFF); - b43_phy_set(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFDFF); + b43_phy_set(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0x200); for (i = 0; i < 500; i++) { if (!(b43_phy_read(dev, @@ -1008,6 +1004,7 @@ static int lpphy_loopback(struct b43_wldev *dev) b43_phy_maskset(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xFFFC, 0x3); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x3); + b43_phy_set(dev, B43_LPPHY_AFE_CTL_OVR, 1); b43_phy_mask(dev, B43_LPPHY_AFE_CTL_OVRVAL, 0xFFFE); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x800); b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0x800); @@ -1031,9 +1028,10 @@ static int lpphy_loopback(struct b43_wldev *dev) return index; } +/* Fixed-point division algorithm using only integer math. */ static u32 lpphy_qdiv_roundup(u32 dividend, u32 divisor, u8 precision) { - u32 quotient, remainder, rbit, roundup, tmp; + u32 quotient, remainder; if (divisor == 0) return 0; @@ -1041,20 +1039,16 @@ static u32 lpphy_qdiv_roundup(u32 dividend, u32 divisor, u8 precision) quotient = dividend / divisor; remainder = dividend % divisor; - rbit = divisor & 0x1; - roundup = (divisor >> 1) + rbit; - - while (precision != 0) { - tmp = remainder - roundup; + while (precision > 0) { quotient <<= 1; - if (remainder >= roundup) - remainder = (tmp << 1) + rbit; - else - remainder <<= 1; + if (remainder << 1 >= divisor) { + quotient++; + remainder = (remainder << 1) - divisor; + } precision--; } - if (remainder >= roundup) + if (remainder << 1 >= divisor) quotient++; return quotient; @@ -1137,9 +1131,9 @@ static void lpphy_set_tx_power_control(struct b43_wldev *dev, } if (dev->phy.rev >= 2) { if (mode == B43_LPPHY_TXPCTL_HW) - b43_phy_maskset(dev, B43_PHY_OFDM(0xD0), 0xFD, 0x2); + b43_phy_set(dev, B43_PHY_OFDM(0xD0), 0x2); else - b43_phy_maskset(dev, B43_PHY_OFDM(0xD0), 0xFD, 0); + b43_phy_mask(dev, B43_PHY_OFDM(0xD0), 0xFFFD); } lpphy_write_tx_pctl_mode_to_hardware(dev); } @@ -1171,7 +1165,7 @@ static void lpphy_rev0_1_rc_calib(struct b43_wldev *dev) err = b43_lpphy_op_switch_channel(dev, 7); if (err) { b43dbg(dev->wl, - "RC calib: Failed to switch to channel 7, error = %d", + "RC calib: Failed to switch to channel 7, error = %d\n", err); } old_txg_ovr = !!(b43_phy_read(dev, B43_LPPHY_AFE_CTL_OVR) & 0x40); @@ -1213,7 +1207,7 @@ static void lpphy_rev0_1_rc_calib(struct b43_wldev *dev) mean_sq_pwr = ideal_pwr - normal_pwr; mean_sq_pwr *= mean_sq_pwr; inner_sum += mean_sq_pwr; - if ((i = 128) || (inner_sum < mean_sq_pwr_min)) { + if ((i == 128) || (inner_sum < mean_sq_pwr_min)) { lpphy->rc_cap = i; mean_sq_pwr_min = inner_sum; } @@ -1506,6 +1500,14 @@ static void b43_lpphy_op_write(struct b43_wldev *dev, u16 reg, u16 value) b43_write16(dev, B43_MMIO_PHY_DATA, value); } +static void b43_lpphy_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask, + u16 set) +{ + b43_write16(dev, B43_MMIO_PHY_CONTROL, reg); + b43_write16(dev, B43_MMIO_PHY_DATA, + (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set); +} + static u16 b43_lpphy_op_radio_read(struct b43_wldev *dev, u16 reg) { /* Register 1 is a 32-bit register. */ @@ -1922,8 +1924,8 @@ static void lpphy_b2062_reset_pll_bias(struct b43_wldev *dev) static void lpphy_b2062_vco_calib(struct b43_wldev *dev) { - b43_phy_write(dev, B2062_S_RFPLL_CTL21, 0x42); - b43_phy_write(dev, B2062_S_RFPLL_CTL21, 0x62); + b43_radio_write(dev, B2062_S_RFPLL_CTL21, 0x42); + b43_radio_write(dev, B2062_S_RFPLL_CTL21, 0x62); udelay(200); } @@ -1982,7 +1984,7 @@ static int lpphy_b2062_tune(struct b43_wldev *dev, tmp6 = tmp5 / tmp4; tmp7 = tmp5 % tmp4; b43_radio_write(dev, B2062_S_RFPLL_CTL29, tmp6 + ((2 * tmp7) / tmp4)); - tmp8 = b43_phy_read(dev, B2062_S_RFPLL_CTL19); + tmp8 = b43_radio_read(dev, B2062_S_RFPLL_CTL19); tmp9 = ((2 * tmp3 * (tmp8 + 1)) + (3 * tmp1)) / (6 * tmp1); b43_radio_write(dev, B2062_S_RFPLL_CTL23, (tmp9 >> 8) + 16); b43_radio_write(dev, B2062_S_RFPLL_CTL24, tmp9 & 0xFF); @@ -2021,17 +2023,17 @@ static void lpphy_b2063_vco_calib(struct b43_wldev *dev) { u16 tmp; - b43_phy_mask(dev, B2063_PLL_SP1, ~0x40); - tmp = b43_phy_read(dev, B2063_PLL_JTAG_CALNRST) & 0xF8; - b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp); + b43_radio_mask(dev, B2063_PLL_SP1, ~0x40); + tmp = b43_radio_read(dev, B2063_PLL_JTAG_CALNRST) & 0xF8; + b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp); udelay(1); - b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x4); + b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x4); udelay(1); - b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x6); + b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x6); udelay(1); - b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x7); + b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x7); udelay(300); - b43_phy_set(dev, B2063_PLL_SP1, 0x40); + b43_radio_set(dev, B2063_PLL_SP1, 0x40); } static int lpphy_b2063_tune(struct b43_wldev *dev, @@ -2126,31 +2128,31 @@ static int lpphy_b2063_tune(struct b43_wldev *dev, scale = 0; tmp5 = ((tmp4 + (tmp3 >> 1)) / tmp3) - 8; } - b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFC0, tmp5); - b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFBF, scale << 6); + b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFC0, tmp5); + b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFBF, scale << 6); tmp6 = lpphy_qdiv_roundup(100 * val1, val3, 16); tmp6 *= (tmp5 * 8) * (scale + 1); if (tmp6 > 150) tmp6 = 0; - b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFE0, tmp6); - b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFDF, scale << 5); + b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFE0, tmp6); + b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFDF, scale << 5); - b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFFFB, 0x4); + b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFFFB, 0x4); if (crystal_freq > 26000000) - b43_phy_set(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0x2); + b43_radio_set(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0x2); else - b43_phy_mask(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFD); + b43_radio_mask(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFD); if (val1 == 45) - b43_phy_set(dev, B2063_PLL_JTAG_PLL_VCO1, 0x2); + b43_radio_set(dev, B2063_PLL_JTAG_PLL_VCO1, 0x2); else - b43_phy_mask(dev, B2063_PLL_JTAG_PLL_VCO1, 0xFD); + b43_radio_mask(dev, B2063_PLL_JTAG_PLL_VCO1, 0xFD); - b43_phy_set(dev, B2063_PLL_SP2, 0x3); + b43_radio_set(dev, B2063_PLL_SP2, 0x3); udelay(1); - b43_phy_mask(dev, B2063_PLL_SP2, 0xFFFC); + b43_radio_mask(dev, B2063_PLL_SP2, 0xFFFC); lpphy_b2063_vco_calib(dev); b43_radio_write(dev, B2063_COMM15, old_comm15); @@ -2160,10 +2162,9 @@ static int lpphy_b2063_tune(struct b43_wldev *dev, static int b43_lpphy_op_switch_channel(struct b43_wldev *dev, unsigned int new_channel) { + struct b43_phy_lp *lpphy = dev->phy.lp; int err; - b43_write16(dev, B43_MMIO_CHANNEL, new_channel); - if (dev->phy.radio_ver == 0x2063) { err = lpphy_b2063_tune(dev, new_channel); if (err) @@ -2176,6 +2177,9 @@ static int b43_lpphy_op_switch_channel(struct b43_wldev *dev, lpphy_adjust_gain_table(dev, channel2freq_lp(new_channel)); } + lpphy->channel = new_channel; + b43_write16(dev, B43_MMIO_CHANNEL, new_channel); + return 0; } @@ -2187,10 +2191,9 @@ static int b43_lpphy_op_init(struct b43_wldev *dev) lpphy_baseband_init(dev); lpphy_radio_init(dev); lpphy_calibrate_rc(dev); - err = b43_lpphy_op_switch_channel(dev, - b43_lpphy_op_get_default_chan(dev)); + err = b43_lpphy_op_switch_channel(dev, 7); if (err) { - b43dbg(dev->wl, "Switch to init channel failed, error = %d.\n", + b43dbg(dev->wl, "Switch to channel 7 failed, error = %d.\n", err); } lpphy_tx_pctl_init(dev); @@ -2202,7 +2205,14 @@ static int b43_lpphy_op_init(struct b43_wldev *dev) static void b43_lpphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna) { - //TODO + if (dev->phy.rev >= 2) + return; // rev2+ doesn't support antenna diversity + + if (B43_WARN_ON(antenna > B43_ANTENNA_AUTO1)) + return; + + b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFD, antenna & 0x2); + b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFE, antenna & 0x1); } static void b43_lpphy_op_adjust_txpower(struct b43_wldev *dev) @@ -2224,6 +2234,7 @@ const struct b43_phy_operations b43_phyops_lp = { .init = b43_lpphy_op_init, .phy_read = b43_lpphy_op_read, .phy_write = b43_lpphy_op_write, + .phy_maskset = b43_lpphy_op_maskset, .radio_read = b43_lpphy_op_radio_read, .radio_write = b43_lpphy_op_radio_write, .software_rfkill = b43_lpphy_op_software_rfkill, diff --git a/drivers/net/wireless/b43/phy_lp.h b/drivers/net/wireless/b43/phy_lp.h index e158d1f..c3232c1 100644 --- a/drivers/net/wireless/b43/phy_lp.h +++ b/drivers/net/wireless/b43/phy_lp.h @@ -888,6 +888,9 @@ struct b43_phy_lp { bool crs_usr_disable, crs_sys_disable; unsigned int pdiv; + + /* The channel we are tuned to */ + u8 channel; }; enum tssi_mux_mode { diff --git a/drivers/net/wireless/b43/tables_lpphy.c b/drivers/net/wireless/b43/tables_lpphy.c index 60d472f..c784def 100644 --- a/drivers/net/wireless/b43/tables_lpphy.c +++ b/drivers/net/wireless/b43/tables_lpphy.c @@ -624,30 +624,35 @@ u32 b43_lptab_read(struct b43_wldev *dev, u32 offset) void b43_lptab_read_bulk(struct b43_wldev *dev, u32 offset, unsigned int nr_elements, void *_data) { - u32 type, value; + u32 type; u8 *data = _data; unsigned int i; type = offset & B43_LPTAB_TYPEMASK; + offset &= ~B43_LPTAB_TYPEMASK; + B43_WARN_ON(offset > 0xFFFF); + + b43_phy_write(dev, B43_LPPHY_TABLE_ADDR, offset); + for (i = 0; i < nr_elements; i++) { - value = b43_lptab_read(dev, offset); switch (type) { case B43_LPTAB_8BIT: - *data = value; + *data = b43_phy_read(dev, B43_LPPHY_TABLEDATALO) & 0xFF; data++; break; case B43_LPTAB_16BIT: - *((u16 *)data) = value; + *((u16 *)data) = b43_phy_read(dev, B43_LPPHY_TABLEDATALO); data += 2; break; case B43_LPTAB_32BIT: - *((u32 *)data) = value; + *((u32 *)data) = b43_phy_read(dev, B43_LPPHY_TABLEDATAHI); + *((u32 *)data) <<= 16; + *((u32 *)data) |= b43_phy_read(dev, B43_LPPHY_TABLEDATALO); data += 4; break; default: B43_WARN_ON(1); } - offset++; } } @@ -688,26 +693,34 @@ void b43_lptab_write_bulk(struct b43_wldev *dev, u32 offset, unsigned int i; type = offset & B43_LPTAB_TYPEMASK; + offset &= ~B43_LPTAB_TYPEMASK; + B43_WARN_ON(offset > 0xFFFF); + + b43_phy_write(dev, B43_LPPHY_TABLE_ADDR, offset); + for (i = 0; i < nr_elements; i++) { switch (type) { case B43_LPTAB_8BIT: value = *data; data++; + B43_WARN_ON(value & ~0xFF); + b43_phy_write(dev, B43_LPPHY_TABLEDATALO, value); break; case B43_LPTAB_16BIT: value = *((u16 *)data); data += 2; + B43_WARN_ON(value & ~0xFFFF); + b43_phy_write(dev, B43_LPPHY_TABLEDATALO, value); break; case B43_LPTAB_32BIT: value = *((u32 *)data); data += 4; + b43_phy_write(dev, B43_LPPHY_TABLEDATAHI, value >> 16); + b43_phy_write(dev, B43_LPPHY_TABLEDATALO, value); break; default: B43_WARN_ON(1); - value = 0; } - b43_lptab_write(dev, offset, value); - offset++; } } @@ -777,7 +790,7 @@ static const u8 lpphy_pll_fraction_table[] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, }; -static const u16 lpphy_iq_local_table[] = { +static const u16 lpphy_iqlo_cal_table[] = { 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -789,10 +802,17 @@ static const u16 lpphy_iq_local_table[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; -static const u16 lpphy_ofdm_cck_gain_table[] = { +static const u16 lpphy_rev0_ofdm_cck_gain_table[] = { + 0x0001, 0x0001, 0x0001, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, 0x5001, + 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, 0x2065, 0x2075, + 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, 0x135d, 0x055d, 0x155d, + 0x0d5d, 0x1d5d, 0x2d5d, 0x555d, 0x655d, 0x755d, +}; + +static const u16 lpphy_rev1_ofdm_cck_gain_table[] = { 0x5000, 0x6000, 0x7000, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, 0x5001, 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, 0x2065, 0x2075, 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, 0x135d, 0x055d, 0x155d, @@ -2263,11 +2283,18 @@ void lpphy_rev0_1_table_init(struct b43_wldev *dev) b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0), ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table); b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0), - ARRAY_SIZE(lpphy_iq_local_table), lpphy_iq_local_table); - b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), - ARRAY_SIZE(lpphy_ofdm_cck_gain_table), lpphy_ofdm_cck_gain_table); - b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), - ARRAY_SIZE(lpphy_ofdm_cck_gain_table), lpphy_ofdm_cck_gain_table); + ARRAY_SIZE(lpphy_iqlo_cal_table), lpphy_iqlo_cal_table); + if (dev->phy.rev == 0) { + b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), + ARRAY_SIZE(lpphy_rev0_ofdm_cck_gain_table), lpphy_rev0_ofdm_cck_gain_table); + b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), + ARRAY_SIZE(lpphy_rev0_ofdm_cck_gain_table), lpphy_rev0_ofdm_cck_gain_table); + } else { + b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), + ARRAY_SIZE(lpphy_rev1_ofdm_cck_gain_table), lpphy_rev1_ofdm_cck_gain_table); + b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), + ARRAY_SIZE(lpphy_rev1_ofdm_cck_gain_table), lpphy_rev1_ofdm_cck_gain_table); +} b43_lptab_write_bulk(dev, B43_LPTAB16(15, 0), ARRAY_SIZE(lpphy_gain_delta_table), lpphy_gain_delta_table); b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0), @@ -2281,22 +2308,6 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev) B43_WARN_ON(dev->phy.rev < 2); - /* - * FIXME This code follows the specs, but it looks wrong: - * In each pass, it writes 4 bytes to an offset in table ID 7, - * then increments the offset by 1 for the next pass. This results - * in the first 3 bytes of each pass except the first one getting - * written to a location that has already been zeroed in the previous - * pass. - * This is what the vendor driver does, but it still looks suspicious. - * - * This should probably suffice: - * - * for (i = 0; i < 704; i+=4) - * b43_lptab_write(dev, B43_LPTAB32(7, i), 0) - * - * This should be tested once the code is functional. - */ for (i = 0; i < 704; i++) b43_lptab_write(dev, B43_LPTAB32(7, i), 0); @@ -2323,7 +2334,7 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev) b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0), ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table); b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0), - ARRAY_SIZE(lpphy_iq_local_table), lpphy_iq_local_table); + ARRAY_SIZE(lpphy_iqlo_cal_table), lpphy_iqlo_cal_table); b43_lptab_write_bulk(dev, B43_LPTAB32(9, 0), ARRAY_SIZE(lpphy_papd_eps_table), lpphy_papd_eps_table); b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0), diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index dee50ed..7745738 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c @@ -19,7 +19,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Portions of this file are based on the sample_* files provided by Wireless @@ -1673,7 +1673,7 @@ static int ipw2100_start_scan(struct ipw2100_priv *priv) return err; } -static const struct ieee80211_geo ipw_geos[] = { +static const struct libipw_geo ipw_geos[] = { { /* Restricted */ "---", .bg_channels = 14, @@ -1694,7 +1694,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) /* Age scan list entries found before suspend */ if (priv->suspend_time) { - ieee80211_networks_age(priv->ieee, priv->suspend_time); + libipw_networks_age(priv->ieee, priv->suspend_time); priv->suspend_time = 0; } @@ -1752,11 +1752,11 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) } /* Initialize the geo */ - if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) { + if (libipw_set_geo(priv->ieee, &ipw_geos[0])) { printk(KERN_WARNING DRV_NAME "Could not set geo\n"); return 0; } - priv->ieee->freq_band = IEEE80211_24GHZ_BAND; + priv->ieee->freq_band = LIBIPW_24GHZ_BAND; lock = LOCK_NONE; if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { @@ -1817,7 +1817,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) /* Called by register_netdev() */ static int ipw2100_net_init(struct net_device *dev) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); return ipw2100_up(priv, 1); } @@ -2340,8 +2340,8 @@ static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf, * * When packet is provided by the firmware, it contains the following: * - * . ieee80211_hdr - * . ieee80211_snap_hdr + * . libipw_hdr + * . libipw_snap_hdr * * The size of the constructed ethernet * @@ -2396,7 +2396,7 @@ static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i) } static void isr_rx(struct ipw2100_priv *priv, int i, - struct ieee80211_rx_stats *stats) + struct libipw_rx_stats *stats) { struct net_device *dev = priv->net_dev; struct ipw2100_status *status = &priv->status_queue.drv[i]; @@ -2435,13 +2435,13 @@ static void isr_rx(struct ipw2100_priv *priv, int i, #ifdef IPW2100_RX_DEBUG /* Make a copy of the frame so we can dump it to the logs if - * ieee80211_rx fails */ + * libipw_rx fails */ skb_copy_from_linear_data(packet->skb, packet_data, min_t(u32, status->frame_size, IPW_RX_NIC_BUFFER_LENGTH)); #endif - if (!ieee80211_rx(priv->ieee, packet->skb, stats)) { + if (!libipw_rx(priv->ieee, packet->skb, stats)) { #ifdef IPW2100_RX_DEBUG IPW_DEBUG_DROP("%s: Non consumed packet:\n", dev->name); @@ -2449,7 +2449,7 @@ static void isr_rx(struct ipw2100_priv *priv, int i, #endif dev->stats.rx_errors++; - /* ieee80211_rx failed, so it didn't free the SKB */ + /* libipw_rx failed, so it didn't free the SKB */ dev_kfree_skb_any(packet->skb); packet->skb = NULL; } @@ -2470,7 +2470,7 @@ static void isr_rx(struct ipw2100_priv *priv, int i, #ifdef CONFIG_IPW2100_MONITOR static void isr_rx_monitor(struct ipw2100_priv *priv, int i, - struct ieee80211_rx_stats *stats) + struct libipw_rx_stats *stats) { struct net_device *dev = priv->net_dev; struct ipw2100_status *status = &priv->status_queue.drv[i]; @@ -2528,10 +2528,10 @@ static void isr_rx_monitor(struct ipw2100_priv *priv, int i, skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr)); - if (!ieee80211_rx(priv->ieee, packet->skb, stats)) { + if (!libipw_rx(priv->ieee, packet->skb, stats)) { dev->stats.rx_errors++; - /* ieee80211_rx failed, so it didn't free the SKB */ + /* libipw_rx failed, so it didn't free the SKB */ dev_kfree_skb_any(packet->skb); packet->skb = NULL; } @@ -2615,7 +2615,7 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv) u16 frame_type; u32 r, w, i, s; struct ipw2100_rx *u; - struct ieee80211_rx_stats stats = { + struct libipw_rx_stats stats = { .mac_time = jiffies, }; @@ -2661,8 +2661,8 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv) stats.mask = 0; if (stats.rssi != 0) - stats.mask |= IEEE80211_STATMASK_RSSI; - stats.freq = IEEE80211_24GHZ_BAND; + stats.mask |= LIBIPW_STATMASK_RSSI; + stats.freq = LIBIPW_24GHZ_BAND; IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n", priv->net_dev->name, frame_types[frame_type], @@ -2686,11 +2686,11 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv) break; } #endif - if (stats.len < sizeof(struct ieee80211_hdr_3addr)) + if (stats.len < sizeof(struct libipw_hdr_3addr)) break; switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) { case IEEE80211_FTYPE_MGMT: - ieee80211_rx_mgt(priv->ieee, + libipw_rx_mgt(priv->ieee, &u->rx_data.header, &stats); break; @@ -2884,7 +2884,7 @@ static int __ipw2100_tx_process(struct ipw2100_priv *priv) tbd->buf_length, PCI_DMA_TODEVICE); } - ieee80211_txb_free(packet->info.d_struct.txb); + libipw_txb_free(packet->info.d_struct.txb); packet->info.d_struct.txb = NULL; list_add_tail(element, &priv->tx_free_list); @@ -3028,7 +3028,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv) int next = txq->next; int i = 0; struct ipw2100_data_header *ipw_hdr; - struct ieee80211_hdr_3addr *hdr; + struct libipw_hdr_3addr *hdr; while (!list_empty(&priv->tx_pend_list)) { /* if there isn't enough space in TBD queue, then @@ -3062,7 +3062,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv) packet->index = txq->next; ipw_hdr = packet->info.d_struct.data; - hdr = (struct ieee80211_hdr_3addr *)packet->info.d_struct.txb-> + hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb-> fragments[0]->data; if (priv->ieee->iw_mode == IW_MODE_INFRA) { @@ -3086,7 +3086,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv) if (packet->info.d_struct.txb->nr_frags > 1) ipw_hdr->fragment_size = packet->info.d_struct.txb->frag_size - - IEEE80211_3ADDR_LEN; + LIBIPW_3ADDR_LEN; else ipw_hdr->fragment_size = 0; @@ -3119,13 +3119,13 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv) IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT; tbd->buf_length = packet->info.d_struct.txb-> - fragments[i]->len - IEEE80211_3ADDR_LEN; + fragments[i]->len - LIBIPW_3ADDR_LEN; tbd->host_addr = pci_map_single(priv->pci_dev, packet->info.d_struct. txb->fragments[i]-> data + - IEEE80211_3ADDR_LEN, + LIBIPW_3ADDR_LEN, tbd->buf_length, PCI_DMA_TODEVICE); @@ -3330,10 +3330,10 @@ static irqreturn_t ipw2100_interrupt(int irq, void *data) return IRQ_NONE; } -static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev, +static int ipw2100_tx(struct libipw_txb *txb, struct net_device *dev, int pri) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); struct list_head *element; struct ipw2100_tx_packet *packet; unsigned long flags; @@ -4488,7 +4488,7 @@ static void ipw2100_tx_initialize(struct ipw2100_priv *priv) /* We simply drop any SKBs that have been queued for * transmit */ if (priv->tx_buffers[i].info.d_struct.txb) { - ieee80211_txb_free(priv->tx_buffers[i].info.d_struct. + libipw_txb_free(priv->tx_buffers[i].info.d_struct. txb); priv->tx_buffers[i].info.d_struct.txb = NULL; } @@ -4527,7 +4527,7 @@ static void ipw2100_tx_free(struct ipw2100_priv *priv) for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) { if (priv->tx_buffers[i].info.d_struct.txb) { - ieee80211_txb_free(priv->tx_buffers[i].info.d_struct. + libipw_txb_free(priv->tx_buffers[i].info.d_struct. txb); priv->tx_buffers[i].info.d_struct.txb = NULL; } @@ -5558,9 +5558,9 @@ static void ipw2100_security_work(struct work_struct *work) } static void shim__set_security(struct net_device *dev, - struct ieee80211_security *sec) + struct libipw_security *sec) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int i, force_update = 0; mutex_lock(&priv->action_mutex); @@ -5753,7 +5753,7 @@ static int ipw2100_adapter_setup(struct ipw2100_priv *priv) * method as well) to talk to the firmware */ static int ipw2100_set_address(struct net_device *dev, void *p) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); struct sockaddr *addr = p; int err = 0; @@ -5781,7 +5781,7 @@ static int ipw2100_set_address(struct net_device *dev, void *p) static int ipw2100_open(struct net_device *dev) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); unsigned long flags; IPW_DEBUG_INFO("dev->open\n"); @@ -5797,7 +5797,7 @@ static int ipw2100_open(struct net_device *dev) static int ipw2100_close(struct net_device *dev) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); unsigned long flags; struct list_head *element; struct ipw2100_tx_packet *packet; @@ -5818,7 +5818,7 @@ static int ipw2100_close(struct net_device *dev) list_del(element); DEC_STAT(&priv->tx_pend_stat); - ieee80211_txb_free(packet->info.d_struct.txb); + libipw_txb_free(packet->info.d_struct.txb); packet->info.d_struct.txb = NULL; list_add_tail(element, &priv->tx_free_list); @@ -5836,7 +5836,7 @@ static int ipw2100_close(struct net_device *dev) */ static void ipw2100_tx_timeout(struct net_device *dev) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); dev->stats.tx_errors++; @@ -5861,8 +5861,8 @@ static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value) static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) { - struct ieee80211_device *ieee = priv->ieee; - struct ieee80211_security sec = { + struct libipw_device *ieee = priv->ieee; + struct libipw_security sec = { .flags = SEC_AUTH_MODE, }; int ret = 0; @@ -5907,7 +5907,7 @@ static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, static void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); char fw_ver[64], ucode_ver[64]; strcpy(info->driver, DRV_NAME); @@ -5924,7 +5924,7 @@ static void ipw_ethtool_get_drvinfo(struct net_device *dev, static u32 ipw2100_ethtool_get_link(struct net_device *dev) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); return (priv->status & STATUS_ASSOCIATED) ? 1 : 0; } @@ -6011,8 +6011,8 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv); static const struct net_device_ops ipw2100_netdev_ops = { .ndo_open = ipw2100_open, .ndo_stop = ipw2100_close, - .ndo_start_xmit = ieee80211_xmit, - .ndo_change_mtu = ieee80211_change_mtu, + .ndo_start_xmit = libipw_xmit, + .ndo_change_mtu = libipw_change_mtu, .ndo_init = ipw2100_net_init, .ndo_tx_timeout = ipw2100_tx_timeout, .ndo_set_mac_address = ipw2100_set_address, @@ -6029,10 +6029,10 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, struct ipw2100_priv *priv; struct net_device *dev; - dev = alloc_ieee80211(sizeof(struct ipw2100_priv)); + dev = alloc_ieee80211(sizeof(struct ipw2100_priv), 0); if (!dev) return NULL; - priv = ieee80211_priv(dev); + priv = libipw_priv(dev); priv->ieee = netdev_priv(dev); priv->pci_dev = pci_dev; priv->net_dev = dev; @@ -6046,7 +6046,7 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, dev->netdev_ops = &ipw2100_netdev_ops; dev->ethtool_ops = &ipw2100_ethtool_ops; dev->wireless_handlers = &ipw2100_wx_handler_def; - priv->wireless_data.ieee80211 = priv->ieee; + priv->wireless_data.libipw = priv->ieee; dev->wireless_data = &priv->wireless_data; dev->watchdog_timeo = 3 * HZ; dev->irq = 0; @@ -6202,7 +6202,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, return err; } - priv = ieee80211_priv(dev); + priv = libipw_priv(dev); pci_set_master(pci_dev); pci_set_drvdata(pci_dev, priv); @@ -6342,7 +6342,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); - free_ieee80211(dev); + free_ieee80211(dev, 0); pci_set_drvdata(pci_dev, NULL); } @@ -6400,7 +6400,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) if (dev->base_addr) iounmap((void __iomem *)dev->base_addr); - free_ieee80211(dev); + free_ieee80211(dev, 0); } pci_release_regions(pci_dev); @@ -6629,7 +6629,7 @@ static int ipw2100_wx_get_name(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (!(priv->status & STATUS_ASSOCIATED)) strcpy(wrqu->name, "unassociated"); else @@ -6643,7 +6643,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); struct iw_freq *fwrq = &wrqu->freq; int err = 0; @@ -6693,7 +6693,7 @@ static int ipw2100_wx_get_freq(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->freq.e = 0; @@ -6714,7 +6714,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0; IPW_DEBUG_WX("SET Mode -> %d \n", wrqu->mode); @@ -6757,7 +6757,7 @@ static int ipw2100_wx_get_mode(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->mode = priv->ieee->iw_mode; IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode); @@ -6792,7 +6792,7 @@ static int ipw2100_wx_get_range(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); struct iw_range *range = (struct iw_range *)extra; u16 val; int i, level; @@ -6913,7 +6913,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0; static const unsigned char any[] = { @@ -6962,7 +6962,7 @@ static int ipw2100_wx_get_wap(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); /* If we are associated, trying to associate, or have a statically * configured BSSID then return that; otherwise return ANY */ @@ -6980,7 +6980,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); char *essid = ""; /* ANY */ int length = 0; int err = 0; @@ -7035,7 +7035,7 @@ static int ipw2100_wx_get_essid(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); DECLARE_SSID_BUF(ssid); /* If we are associated, trying to associate, or have a statically @@ -7063,7 +7063,7 @@ static int ipw2100_wx_set_nick(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (wrqu->data.length > IW_ESSID_MAX_SIZE) return -E2BIG; @@ -7085,7 +7085,7 @@ static int ipw2100_wx_get_nick(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->data.length = strlen(priv->nick); memcpy(extra, priv->nick, wrqu->data.length); @@ -7100,7 +7100,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); u32 target_rate = wrqu->bitrate.value; u32 rate; int err = 0; @@ -7140,7 +7140,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int val; unsigned int len = sizeof(val); int err = 0; @@ -7192,7 +7192,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int value, err; /* Auto RTS not yet supported */ @@ -7231,7 +7231,7 @@ static int ipw2100_wx_get_rts(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED; wrqu->rts.fixed = 1; /* no auto select */ @@ -7248,7 +7248,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0, value; if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled)) @@ -7293,7 +7293,7 @@ static int ipw2100_wx_get_txpow(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; @@ -7320,7 +7320,7 @@ static int ipw2100_wx_set_frag(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (!wrqu->frag.fixed) return -EINVAL; @@ -7350,7 +7350,7 @@ static int ipw2100_wx_get_frag(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED; wrqu->frag.fixed = 0; /* no auto select */ wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0; @@ -7364,7 +7364,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0; if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) @@ -7412,7 +7412,7 @@ static int ipw2100_wx_get_retry(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); wrqu->retry.disabled = 0; /* can't be disabled */ @@ -7440,7 +7440,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0; mutex_lock(&priv->action_mutex); @@ -7472,8 +7472,8 @@ static int ipw2100_wx_get_scan(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra); + struct ipw2100_priv *priv = libipw_priv(dev); + return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); } /* @@ -7487,8 +7487,8 @@ static int ipw2100_wx_set_encode(struct net_device *dev, * No check of STATUS_INITIALIZED required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key); + struct ipw2100_priv *priv = libipw_priv(dev); + return libipw_wx_set_encode(priv->ieee, info, wrqu, key); } static int ipw2100_wx_get_encode(struct net_device *dev, @@ -7499,15 +7499,15 @@ static int ipw2100_wx_get_encode(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key); + struct ipw2100_priv *priv = libipw_priv(dev); + return libipw_wx_get_encode(priv->ieee, info, wrqu, key); } static int ipw2100_wx_set_power(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0; mutex_lock(&priv->action_mutex); @@ -7556,7 +7556,7 @@ static int ipw2100_wx_get_power(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (!(priv->power_mode & IPW_POWER_ENABLED)) wrqu->power.disabled = 1; @@ -7580,8 +7580,8 @@ static int ipw2100_wx_set_genie(struct net_device *dev, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw2100_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; u8 *buf; if (!ieee->wpa_enabled) @@ -7615,8 +7615,8 @@ static int ipw2100_wx_get_genie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw2100_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { wrqu->data.length = 0; @@ -7637,8 +7637,8 @@ static int ipw2100_wx_set_auth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw2100_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; struct iw_param *param = &wrqu->param; struct lib80211_crypt_data *crypt; unsigned long flags; @@ -7682,7 +7682,7 @@ static int ipw2100_wx_set_auth(struct net_device *dev, * can use this to determine if the CAP_PRIVACY_ON bit should * be set. */ - struct ieee80211_security sec = { + struct libipw_security sec = { .flags = SEC_ENABLED, .enabled = param->value, }; @@ -7730,8 +7730,8 @@ static int ipw2100_wx_get_auth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw2100_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; struct lib80211_crypt_data *crypt; struct iw_param *param = &wrqu->param; int ret = 0; @@ -7792,8 +7792,8 @@ static int ipw2100_wx_set_encodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra); + struct ipw2100_priv *priv = libipw_priv(dev); + return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); } /* SIOCGIWENCODEEXT */ @@ -7801,8 +7801,8 @@ static int ipw2100_wx_get_encodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra); + struct ipw2100_priv *priv = libipw_priv(dev); + return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); } /* SIOCSIWMLME */ @@ -7810,7 +7810,7 @@ static int ipw2100_wx_set_mlme(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); struct iw_mlme *mlme = (struct iw_mlme *)extra; __le16 reason; @@ -7841,7 +7841,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); int err = 0; @@ -7872,7 +7872,7 @@ static int ipw2100_wx_reset(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (priv->status & STATUS_INITIALIZED) schedule_reset(priv); return 0; @@ -7884,7 +7884,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err = 0, mode = *(int *)extra; mutex_lock(&priv->action_mutex); @@ -7912,7 +7912,7 @@ static int ipw2100_wx_get_powermode(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int level = IPW_POWER_LEVEL(priv->power_mode); s32 timeout, period; @@ -7948,7 +7948,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err, mode = *(int *)extra; mutex_lock(&priv->action_mutex); @@ -7981,7 +7981,7 @@ static int ipw2100_wx_get_preamble(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (priv->config & CFG_LONG_PREAMBLE) snprintf(wrqu->name, IFNAMSIZ, "long (1)"); @@ -7996,7 +7996,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); int err, mode = *(int *)extra; mutex_lock(&priv->action_mutex); @@ -8028,7 +8028,7 @@ static int ipw2100_wx_get_crc_check(struct net_device *dev, * This can be called at any time. No action lock required */ - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); if (priv->config & CFG_CRC_CHECK) snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)"); @@ -8181,7 +8181,7 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev) int beacon_qual; int quality; - struct ipw2100_priv *priv = ieee80211_priv(dev); + struct ipw2100_priv *priv = libipw_priv(dev); struct iw_statistics *wstats; u32 rssi, tx_retries, missed_beacons, tx_failures; u32 ord_len = sizeof(u32); diff --git a/drivers/net/wireless/ipw2x00/ipw2100.h b/drivers/net/wireless/ipw2x00/ipw2100.h index f183d95..1eab0d6 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.h +++ b/drivers/net/wireless/ipw2x00/ipw2100.h @@ -19,7 +19,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ******************************************************************************/ @@ -46,7 +46,7 @@ #include <linux/workqueue.h> #include <linux/mutex.h> -#include "ieee80211.h" +#include "libipw.h" struct ipw2100_priv; struct ipw2100_tx_packet; @@ -343,7 +343,7 @@ struct ipw2100_tx_packet { struct { /* DATA */ struct ipw2100_data_header *data; dma_addr_t data_phys; - struct ieee80211_txb *txb; + struct libipw_txb *txb; } d_struct; } info; int jiffy_start; @@ -492,7 +492,7 @@ struct ipw2100_priv { int stop_hang_check; /* Set 1 when shutting down to kill hang_check */ int stop_rf_kill; /* Set 1 when shutting down to kill rf_kill */ - struct ieee80211_device *ieee; + struct libipw_device *ieee; unsigned long status; unsigned long config; unsigned long capability; @@ -788,7 +788,7 @@ struct ipw2100_priv { #define IPW_CARD_DISABLE_PHY_OFF_COMPLETE_WAIT 100 // 100 milli #define IPW_PREPARE_POWER_DOWN_COMPLETE_WAIT 100 // 100 milli -#define IPW_HEADER_802_11_SIZE sizeof(struct ieee80211_hdr_3addr) +#define IPW_HEADER_802_11_SIZE sizeof(struct libipw_hdr_3addr) #define IPW_MAX_80211_PAYLOAD_SIZE 2304U #define IPW_MAX_802_11_PAYLOAD_LENGTH 2312 #define IPW_MAX_ACCEPTABLE_TX_FRAME_LENGTH 1536 @@ -803,13 +803,13 @@ struct ipw2100_priv { IPW_802_11_FCS_LENGTH) #define IPW_802_11_PAYLOAD_OFFSET \ - (sizeof(struct ieee80211_hdr_3addr) + \ - sizeof(struct ieee80211_snap_hdr)) + (sizeof(struct libipw_hdr_3addr) + \ + sizeof(struct libipw_snap_hdr)) struct ipw2100_rx { union { unsigned char payload[IPW_RX_NIC_BUFFER_LENGTH]; - struct ieee80211_hdr_4addr header; + struct libipw_hdr_4addr header; u32 status; struct ipw2100_notification notification; struct ipw2100_cmd_header command; diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 8e18d53..3f8372d 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c @@ -25,7 +25,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ******************************************************************************/ @@ -103,6 +103,25 @@ static int antenna = CFG_SYS_ANTENNA_BOTH; static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ #endif +static struct ieee80211_rate ipw2200_rates[] = { + { .bitrate = 10 }, + { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, + { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, + { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, + { .bitrate = 60 }, + { .bitrate = 90 }, + { .bitrate = 120 }, + { .bitrate = 180 }, + { .bitrate = 240 }, + { .bitrate = 360 }, + { .bitrate = 480 }, + { .bitrate = 540 } +}; + +#define ipw2200_a_rates (ipw2200_rates + 4) +#define ipw2200_num_a_rates 8 +#define ipw2200_bg_rates (ipw2200_rates + 0) +#define ipw2200_num_bg_rates 12 #ifdef CONFIG_IPW2200_QOS static int qos_enable = 0; @@ -111,7 +130,7 @@ static int qos_no_ack_mask = 0; static int burst_duration_CCK = 0; static int burst_duration_OFDM = 0; -static struct ieee80211_qos_parameters def_qos_parameters_OFDM = { +static struct libipw_qos_parameters def_qos_parameters_OFDM = { {QOS_TX0_CW_MIN_OFDM, QOS_TX1_CW_MIN_OFDM, QOS_TX2_CW_MIN_OFDM, QOS_TX3_CW_MIN_OFDM}, {QOS_TX0_CW_MAX_OFDM, QOS_TX1_CW_MAX_OFDM, QOS_TX2_CW_MAX_OFDM, @@ -122,7 +141,7 @@ static struct ieee80211_qos_parameters def_qos_parameters_OFDM = { QOS_TX2_TXOP_LIMIT_OFDM, QOS_TX3_TXOP_LIMIT_OFDM} }; -static struct ieee80211_qos_parameters def_qos_parameters_CCK = { +static struct libipw_qos_parameters def_qos_parameters_CCK = { {QOS_TX0_CW_MIN_CCK, QOS_TX1_CW_MIN_CCK, QOS_TX2_CW_MIN_CCK, QOS_TX3_CW_MIN_CCK}, {QOS_TX0_CW_MAX_CCK, QOS_TX1_CW_MAX_CCK, QOS_TX2_CW_MAX_CCK, @@ -133,7 +152,7 @@ static struct ieee80211_qos_parameters def_qos_parameters_CCK = { QOS_TX3_TXOP_LIMIT_CCK} }; -static struct ieee80211_qos_parameters def_parameters_OFDM = { +static struct libipw_qos_parameters def_parameters_OFDM = { {DEF_TX0_CW_MIN_OFDM, DEF_TX1_CW_MIN_OFDM, DEF_TX2_CW_MIN_OFDM, DEF_TX3_CW_MIN_OFDM}, {DEF_TX0_CW_MAX_OFDM, DEF_TX1_CW_MAX_OFDM, DEF_TX2_CW_MAX_OFDM, @@ -144,7 +163,7 @@ static struct ieee80211_qos_parameters def_parameters_OFDM = { DEF_TX2_TXOP_LIMIT_OFDM, DEF_TX3_TXOP_LIMIT_OFDM} }; -static struct ieee80211_qos_parameters def_parameters_CCK = { +static struct libipw_qos_parameters def_parameters_CCK = { {DEF_TX0_CW_MIN_CCK, DEF_TX1_CW_MIN_CCK, DEF_TX2_CW_MIN_CCK, DEF_TX3_CW_MIN_CCK}, {DEF_TX0_CW_MAX_CCK, DEF_TX1_CW_MAX_CCK, DEF_TX2_CW_MAX_CCK, @@ -164,9 +183,9 @@ static int from_priority_to_tx_queue[] = { static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv); -static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters +static int ipw_send_qos_params_command(struct ipw_priv *priv, struct libipw_qos_parameters *qos_param); -static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element +static int ipw_send_qos_info_command(struct ipw_priv *priv, struct libipw_qos_information_element *qos_param); #endif /* CONFIG_IPW2200_QOS */ @@ -1830,7 +1849,7 @@ static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr, break; } - if (ieee80211_is_valid_channel(priv->ieee, channel)) + if (libipw_is_valid_channel(priv->ieee, channel)) priv->speed_scan[pos++] = channel; else IPW_WARNING("Skipping invalid channel request: %d\n", @@ -1882,7 +1901,7 @@ static ssize_t show_channels(struct device *d, char *buf) { struct ipw_priv *priv = dev_get_drvdata(d); - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct libipw_geo *geo = libipw_get_geo(priv->ieee); int len = 0, i; len = sprintf(&buf[len], @@ -1892,14 +1911,14 @@ static ssize_t show_channels(struct device *d, for (i = 0; i < geo->bg_channels; i++) { len += sprintf(&buf[len], "%d: BSS%s%s, %s, Band %s.\n", geo->bg[i].channel, - geo->bg[i].flags & IEEE80211_CH_RADAR_DETECT ? + geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT ? " (radar spectrum)" : "", - ((geo->bg[i].flags & IEEE80211_CH_NO_IBSS) || - (geo->bg[i].flags & IEEE80211_CH_RADAR_DETECT)) + ((geo->bg[i].flags & LIBIPW_CH_NO_IBSS) || + (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)) ? "" : ", IBSS", - geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY ? + geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY ? "passive only" : "active/passive", - geo->bg[i].flags & IEEE80211_CH_B_ONLY ? + geo->bg[i].flags & LIBIPW_CH_B_ONLY ? "B" : "B/G"); } @@ -1909,12 +1928,12 @@ static ssize_t show_channels(struct device *d, for (i = 0; i < geo->a_channels; i++) { len += sprintf(&buf[len], "%d: BSS%s%s, %s.\n", geo->a[i].channel, - geo->a[i].flags & IEEE80211_CH_RADAR_DETECT ? + geo->a[i].flags & LIBIPW_CH_RADAR_DETECT ? " (radar spectrum)" : "", - ((geo->a[i].flags & IEEE80211_CH_NO_IBSS) || - (geo->a[i].flags & IEEE80211_CH_RADAR_DETECT)) + ((geo->a[i].flags & LIBIPW_CH_NO_IBSS) || + (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT)) ? "" : ", IBSS", - geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY ? + geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY ? "passive only" : "active/passive"); } @@ -2429,7 +2448,7 @@ static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) static int ipw_set_tx_power(struct ipw_priv *priv) { - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct libipw_geo *geo = libipw_get_geo(priv->ieee); struct ipw_tx_power tx_power; s8 max_power; int i; @@ -2960,12 +2979,12 @@ static int ipw_fw_dma_wait(struct ipw_priv *priv) static void ipw_remove_current_network(struct ipw_priv *priv) { struct list_head *element, *safe; - struct ieee80211_network *network = NULL; + struct libipw_network *network = NULL; unsigned long flags; spin_lock_irqsave(&priv->ieee->lock, flags); list_for_each_safe(element, safe, &priv->ieee->network_list) { - network = list_entry(element, struct ieee80211_network, list); + network = list_entry(element, struct libipw_network, list); if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) { list_del(element); list_add_tail(&network->list, @@ -3751,7 +3770,7 @@ static void ipw_queue_tx_free_tfd(struct ipw_priv *priv, le16_to_cpu(bd->u.data.chunk_len[i]), PCI_DMA_TODEVICE); if (txq->txb[txq->q.last_used]) { - ieee80211_txb_free(txq->txb[txq->q.last_used]); + libipw_txb_free(txq->txb[txq->q.last_used]); txq->txb[txq->q.last_used] = NULL; } } @@ -4070,7 +4089,7 @@ static u32 ipw_get_max_rate(struct ipw_priv *priv) /* If currently associated in B mode, restrict the maximum * rate match to B rates */ if (priv->assoc_request.ieee_mode == IPW_B_MODE) - mask &= IEEE80211_CCK_RATES_MASK; + mask &= LIBIPW_CCK_RATES_MASK; /* TODO: Verify that the rate is supported by the current rates * list. */ @@ -4078,29 +4097,29 @@ static u32 ipw_get_max_rate(struct ipw_priv *priv) while (i && !(mask & i)) i >>= 1; switch (i) { - case IEEE80211_CCK_RATE_1MB_MASK: + case LIBIPW_CCK_RATE_1MB_MASK: return 1000000; - case IEEE80211_CCK_RATE_2MB_MASK: + case LIBIPW_CCK_RATE_2MB_MASK: return 2000000; - case IEEE80211_CCK_RATE_5MB_MASK: + case LIBIPW_CCK_RATE_5MB_MASK: return 5500000; - case IEEE80211_OFDM_RATE_6MB_MASK: + case LIBIPW_OFDM_RATE_6MB_MASK: return 6000000; - case IEEE80211_OFDM_RATE_9MB_MASK: + case LIBIPW_OFDM_RATE_9MB_MASK: return 9000000; - case IEEE80211_CCK_RATE_11MB_MASK: + case LIBIPW_CCK_RATE_11MB_MASK: return 11000000; - case IEEE80211_OFDM_RATE_12MB_MASK: + case LIBIPW_OFDM_RATE_12MB_MASK: return 12000000; - case IEEE80211_OFDM_RATE_18MB_MASK: + case LIBIPW_OFDM_RATE_18MB_MASK: return 18000000; - case IEEE80211_OFDM_RATE_24MB_MASK: + case LIBIPW_OFDM_RATE_24MB_MASK: return 24000000; - case IEEE80211_OFDM_RATE_36MB_MASK: + case LIBIPW_OFDM_RATE_36MB_MASK: return 36000000; - case IEEE80211_OFDM_RATE_48MB_MASK: + case LIBIPW_OFDM_RATE_48MB_MASK: return 48000000; - case IEEE80211_OFDM_RATE_54MB_MASK: + case LIBIPW_OFDM_RATE_54MB_MASK: return 54000000; } @@ -4466,11 +4485,11 @@ static void ipw_rx_notification(struct ipw_priv *priv, == IEEE80211_STYPE_ASSOC_RESP)) { if ((sizeof (struct - ieee80211_assoc_response) + libipw_assoc_response) <= size) && (size <= 2314)) { struct - ieee80211_rx_stats + libipw_rx_stats stats = { .len = size - 1, }; @@ -4478,10 +4497,10 @@ static void ipw_rx_notification(struct ipw_priv *priv, IPW_DEBUG_QOS ("QoS Associate " "size %d\n", size); - ieee80211_rx_mgt(priv-> + libipw_rx_mgt(priv-> ieee, (struct - ieee80211_hdr_4addr + libipw_hdr_4addr *) ¬if->u.raw, &stats); } @@ -4537,11 +4556,11 @@ static void ipw_rx_notification(struct ipw_priv *priv, case CMAS_INIT:{ if (priv->status & STATUS_AUTH) { struct - ieee80211_assoc_response + libipw_assoc_response *resp; resp = (struct - ieee80211_assoc_response + libipw_assoc_response *)¬if->u.raw; IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | @@ -5227,33 +5246,33 @@ static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *priv) static int ipw_is_rate_in_mask(struct ipw_priv *priv, int ieee_mode, u8 rate) { - rate &= ~IEEE80211_BASIC_RATE_MASK; + rate &= ~LIBIPW_BASIC_RATE_MASK; if (ieee_mode == IEEE_A) { switch (rate) { - case IEEE80211_OFDM_RATE_6MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_6MB_MASK ? + case LIBIPW_OFDM_RATE_6MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_6MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_9MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_9MB_MASK ? + case LIBIPW_OFDM_RATE_9MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_9MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_12MB: + case LIBIPW_OFDM_RATE_12MB: return priv-> - rates_mask & IEEE80211_OFDM_RATE_12MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_18MB: + rates_mask & LIBIPW_OFDM_RATE_12MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_18MB: return priv-> - rates_mask & IEEE80211_OFDM_RATE_18MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_24MB: + rates_mask & LIBIPW_OFDM_RATE_18MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_24MB: return priv-> - rates_mask & IEEE80211_OFDM_RATE_24MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_36MB: + rates_mask & LIBIPW_OFDM_RATE_24MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_36MB: return priv-> - rates_mask & IEEE80211_OFDM_RATE_36MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_48MB: + rates_mask & LIBIPW_OFDM_RATE_36MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_48MB: return priv-> - rates_mask & IEEE80211_OFDM_RATE_48MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_54MB: + rates_mask & LIBIPW_OFDM_RATE_48MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_54MB: return priv-> - rates_mask & IEEE80211_OFDM_RATE_54MB_MASK ? 1 : 0; + rates_mask & LIBIPW_OFDM_RATE_54MB_MASK ? 1 : 0; default: return 0; } @@ -5261,14 +5280,14 @@ static int ipw_is_rate_in_mask(struct ipw_priv *priv, int ieee_mode, u8 rate) /* B and G mixed */ switch (rate) { - case IEEE80211_CCK_RATE_1MB: - return priv->rates_mask & IEEE80211_CCK_RATE_1MB_MASK ? 1 : 0; - case IEEE80211_CCK_RATE_2MB: - return priv->rates_mask & IEEE80211_CCK_RATE_2MB_MASK ? 1 : 0; - case IEEE80211_CCK_RATE_5MB: - return priv->rates_mask & IEEE80211_CCK_RATE_5MB_MASK ? 1 : 0; - case IEEE80211_CCK_RATE_11MB: - return priv->rates_mask & IEEE80211_CCK_RATE_11MB_MASK ? 1 : 0; + case LIBIPW_CCK_RATE_1MB: + return priv->rates_mask & LIBIPW_CCK_RATE_1MB_MASK ? 1 : 0; + case LIBIPW_CCK_RATE_2MB: + return priv->rates_mask & LIBIPW_CCK_RATE_2MB_MASK ? 1 : 0; + case LIBIPW_CCK_RATE_5MB: + return priv->rates_mask & LIBIPW_CCK_RATE_5MB_MASK ? 1 : 0; + case LIBIPW_CCK_RATE_11MB: + return priv->rates_mask & LIBIPW_CCK_RATE_11MB_MASK ? 1 : 0; } /* If we are limited to B modulations, bail at this point */ @@ -5277,29 +5296,29 @@ static int ipw_is_rate_in_mask(struct ipw_priv *priv, int ieee_mode, u8 rate) /* G */ switch (rate) { - case IEEE80211_OFDM_RATE_6MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_6MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_9MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_9MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_12MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_12MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_18MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_18MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_24MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_24MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_36MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_36MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_48MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_48MB_MASK ? 1 : 0; - case IEEE80211_OFDM_RATE_54MB: - return priv->rates_mask & IEEE80211_OFDM_RATE_54MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_6MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_6MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_9MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_9MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_12MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_12MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_18MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_18MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_24MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_24MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_36MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_36MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_48MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_48MB_MASK ? 1 : 0; + case LIBIPW_OFDM_RATE_54MB: + return priv->rates_mask & LIBIPW_OFDM_RATE_54MB_MASK ? 1 : 0; } return 0; } static int ipw_compatible_rates(struct ipw_priv *priv, - const struct ieee80211_network *network, + const struct libipw_network *network, struct ipw_supported_rates *rates) { int num_rates, i; @@ -5311,7 +5330,7 @@ static int ipw_compatible_rates(struct ipw_priv *priv, if (!ipw_is_rate_in_mask(priv, network->mode, network->rates[i])) { - if (network->rates[i] & IEEE80211_BASIC_RATE_MASK) { + if (network->rates[i] & LIBIPW_BASIC_RATE_MASK) { IPW_DEBUG_SCAN("Adding masked mandatory " "rate %02X\n", network->rates[i]); @@ -5333,7 +5352,7 @@ static int ipw_compatible_rates(struct ipw_priv *priv, for (i = 0; i < num_rates; i++) { if (!ipw_is_rate_in_mask(priv, network->mode, network->rates_ex[i])) { - if (network->rates_ex[i] & IEEE80211_BASIC_RATE_MASK) { + if (network->rates_ex[i] & LIBIPW_BASIC_RATE_MASK) { IPW_DEBUG_SCAN("Adding masked mandatory " "rate %02X\n", network->rates_ex[i]); @@ -5369,73 +5388,73 @@ static void ipw_copy_rates(struct ipw_supported_rates *dest, static void ipw_add_cck_scan_rates(struct ipw_supported_rates *rates, u8 modulation, u32 rate_mask) { - u8 basic_mask = (IEEE80211_OFDM_MODULATION == modulation) ? - IEEE80211_BASIC_RATE_MASK : 0; + u8 basic_mask = (LIBIPW_OFDM_MODULATION == modulation) ? + LIBIPW_BASIC_RATE_MASK : 0; - if (rate_mask & IEEE80211_CCK_RATE_1MB_MASK) + if (rate_mask & LIBIPW_CCK_RATE_1MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; + LIBIPW_BASIC_RATE_MASK | LIBIPW_CCK_RATE_1MB; - if (rate_mask & IEEE80211_CCK_RATE_2MB_MASK) + if (rate_mask & LIBIPW_CCK_RATE_2MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; + LIBIPW_BASIC_RATE_MASK | LIBIPW_CCK_RATE_2MB; - if (rate_mask & IEEE80211_CCK_RATE_5MB_MASK) + if (rate_mask & LIBIPW_CCK_RATE_5MB_MASK) rates->supported_rates[rates->num_rates++] = basic_mask | - IEEE80211_CCK_RATE_5MB; + LIBIPW_CCK_RATE_5MB; - if (rate_mask & IEEE80211_CCK_RATE_11MB_MASK) + if (rate_mask & LIBIPW_CCK_RATE_11MB_MASK) rates->supported_rates[rates->num_rates++] = basic_mask | - IEEE80211_CCK_RATE_11MB; + LIBIPW_CCK_RATE_11MB; } static void ipw_add_ofdm_scan_rates(struct ipw_supported_rates *rates, u8 modulation, u32 rate_mask) { - u8 basic_mask = (IEEE80211_OFDM_MODULATION == modulation) ? - IEEE80211_BASIC_RATE_MASK : 0; + u8 basic_mask = (LIBIPW_OFDM_MODULATION == modulation) ? + LIBIPW_BASIC_RATE_MASK : 0; - if (rate_mask & IEEE80211_OFDM_RATE_6MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_6MB_MASK) rates->supported_rates[rates->num_rates++] = basic_mask | - IEEE80211_OFDM_RATE_6MB; + LIBIPW_OFDM_RATE_6MB; - if (rate_mask & IEEE80211_OFDM_RATE_9MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_9MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_OFDM_RATE_9MB; + LIBIPW_OFDM_RATE_9MB; - if (rate_mask & IEEE80211_OFDM_RATE_12MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_12MB_MASK) rates->supported_rates[rates->num_rates++] = basic_mask | - IEEE80211_OFDM_RATE_12MB; + LIBIPW_OFDM_RATE_12MB; - if (rate_mask & IEEE80211_OFDM_RATE_18MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_18MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_OFDM_RATE_18MB; + LIBIPW_OFDM_RATE_18MB; - if (rate_mask & IEEE80211_OFDM_RATE_24MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_24MB_MASK) rates->supported_rates[rates->num_rates++] = basic_mask | - IEEE80211_OFDM_RATE_24MB; + LIBIPW_OFDM_RATE_24MB; - if (rate_mask & IEEE80211_OFDM_RATE_36MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_36MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_OFDM_RATE_36MB; + LIBIPW_OFDM_RATE_36MB; - if (rate_mask & IEEE80211_OFDM_RATE_48MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_48MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_OFDM_RATE_48MB; + LIBIPW_OFDM_RATE_48MB; - if (rate_mask & IEEE80211_OFDM_RATE_54MB_MASK) + if (rate_mask & LIBIPW_OFDM_RATE_54MB_MASK) rates->supported_rates[rates->num_rates++] = - IEEE80211_OFDM_RATE_54MB; + LIBIPW_OFDM_RATE_54MB; } struct ipw_network_match { - struct ieee80211_network *network; + struct libipw_network *network; struct ipw_supported_rates rates; }; static int ipw_find_adhoc_network(struct ipw_priv *priv, struct ipw_network_match *match, - struct ieee80211_network *network, + struct libipw_network *network, int roaming) { struct ipw_supported_rates rates; @@ -5556,7 +5575,7 @@ static int ipw_find_adhoc_network(struct ipw_priv *priv, } /* Filter out any incompatible freq / mode combinations */ - if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) { + if (!libipw_is_valid_mode(priv->ieee, network->mode)) { IPW_DEBUG_MERGE("Network '%s (%pM)' excluded " "because of invalid frequency/mode " "combination.\n", @@ -5606,7 +5625,7 @@ static void ipw_merge_adhoc_network(struct work_struct *work) DECLARE_SSID_BUF(ssid); struct ipw_priv *priv = container_of(work, struct ipw_priv, merge_networks); - struct ieee80211_network *network = NULL; + struct libipw_network *network = NULL; struct ipw_network_match match = { .network = priv->assoc_network }; @@ -5648,7 +5667,7 @@ static void ipw_merge_adhoc_network(struct work_struct *work) static int ipw_best_network(struct ipw_priv *priv, struct ipw_network_match *match, - struct ieee80211_network *network, int roaming) + struct libipw_network *network, int roaming) { struct ipw_supported_rates rates; DECLARE_SSID_BUF(ssid); @@ -5782,7 +5801,7 @@ static int ipw_best_network(struct ipw_priv *priv, } /* Filter out any incompatible freq / mode combinations */ - if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) { + if (!libipw_is_valid_mode(priv->ieee, network->mode)) { IPW_DEBUG_ASSOC("Network '%s (%pM)' excluded " "because of invalid frequency/mode " "combination.\n", @@ -5793,7 +5812,7 @@ static int ipw_best_network(struct ipw_priv *priv, } /* Filter out invalid channel in current GEO */ - if (!ieee80211_is_valid_channel(priv->ieee, network->channel)) { + if (!libipw_is_valid_channel(priv->ieee, network->channel)) { IPW_DEBUG_ASSOC("Network '%s (%pM)' excluded " "because of invalid channel in current GEO\n", print_ssid(ssid, network->ssid, @@ -5839,9 +5858,9 @@ static int ipw_best_network(struct ipw_priv *priv, } static void ipw_adhoc_create(struct ipw_priv *priv, - struct ieee80211_network *network) + struct libipw_network *network) { - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct libipw_geo *geo = libipw_get_geo(priv->ieee); int i; /* @@ -5856,25 +5875,25 @@ static void ipw_adhoc_create(struct ipw_priv *priv, * FW fatal error. * */ - switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { - case IEEE80211_52GHZ_BAND: + switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { + case LIBIPW_52GHZ_BAND: network->mode = IEEE_A; - i = ieee80211_channel_to_index(priv->ieee, priv->channel); + i = libipw_channel_to_index(priv->ieee, priv->channel); BUG_ON(i == -1); - if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) { + if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY) { IPW_WARNING("Overriding invalid channel\n"); priv->channel = geo->a[0].channel; } break; - case IEEE80211_24GHZ_BAND: + case LIBIPW_24GHZ_BAND: if (priv->ieee->mode & IEEE_G) network->mode = IEEE_G; else network->mode = IEEE_B; - i = ieee80211_channel_to_index(priv->ieee, priv->channel); + i = libipw_channel_to_index(priv->ieee, priv->channel); BUG_ON(i == -1); - if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) { + if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) { IPW_WARNING("Overriding invalid channel\n"); priv->channel = geo->bg[0].channel; } @@ -6110,9 +6129,9 @@ static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode) * Tx rates */ switch (priv->ieee->freq_band) { - case IEEE80211_52GHZ_BAND: /* A only */ + case LIBIPW_52GHZ_BAND: /* A only */ /* IEEE_A */ - if (priv->rates_mask & ~IEEE80211_OFDM_RATES_MASK) { + if (priv->rates_mask & ~LIBIPW_OFDM_RATES_MASK) { /* Invalid fixed rate mask */ IPW_DEBUG_WX ("invalid fixed rate mask in ipw_set_fixed_rate\n"); @@ -6120,13 +6139,13 @@ static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode) break; } - new_tx_rates >>= IEEE80211_OFDM_SHIFT_MASK_A; + new_tx_rates >>= LIBIPW_OFDM_SHIFT_MASK_A; break; default: /* 2.4Ghz or Mixed */ /* IEEE_B */ if (mode == IEEE_B) { - if (new_tx_rates & ~IEEE80211_CCK_RATES_MASK) { + if (new_tx_rates & ~LIBIPW_CCK_RATES_MASK) { /* Invalid fixed rate mask */ IPW_DEBUG_WX ("invalid fixed rate mask in ipw_set_fixed_rate\n"); @@ -6136,8 +6155,8 @@ static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode) } /* IEEE_G */ - if (new_tx_rates & ~(IEEE80211_CCK_RATES_MASK | - IEEE80211_OFDM_RATES_MASK)) { + if (new_tx_rates & ~(LIBIPW_CCK_RATES_MASK | + LIBIPW_OFDM_RATES_MASK)) { /* Invalid fixed rate mask */ IPW_DEBUG_WX ("invalid fixed rate mask in ipw_set_fixed_rate\n"); @@ -6145,19 +6164,19 @@ static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode) break; } - if (IEEE80211_OFDM_RATE_6MB_MASK & new_tx_rates) { - mask |= (IEEE80211_OFDM_RATE_6MB_MASK >> 1); - new_tx_rates &= ~IEEE80211_OFDM_RATE_6MB_MASK; + if (LIBIPW_OFDM_RATE_6MB_MASK & new_tx_rates) { + mask |= (LIBIPW_OFDM_RATE_6MB_MASK >> 1); + new_tx_rates &= ~LIBIPW_OFDM_RATE_6MB_MASK; } - if (IEEE80211_OFDM_RATE_9MB_MASK & new_tx_rates) { - mask |= (IEEE80211_OFDM_RATE_9MB_MASK >> 1); - new_tx_rates &= ~IEEE80211_OFDM_RATE_9MB_MASK; + if (LIBIPW_OFDM_RATE_9MB_MASK & new_tx_rates) { + mask |= (LIBIPW_OFDM_RATE_9MB_MASK >> 1); + new_tx_rates &= ~LIBIPW_OFDM_RATE_9MB_MASK; } - if (IEEE80211_OFDM_RATE_12MB_MASK & new_tx_rates) { - mask |= (IEEE80211_OFDM_RATE_12MB_MASK >> 1); - new_tx_rates &= ~IEEE80211_OFDM_RATE_12MB_MASK; + if (LIBIPW_OFDM_RATE_12MB_MASK & new_tx_rates) { + mask |= (LIBIPW_OFDM_RATE_12MB_MASK >> 1); + new_tx_rates &= ~LIBIPW_OFDM_RATE_12MB_MASK; } new_tx_rates |= mask; @@ -6190,12 +6209,12 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, int scan_type) { int channel_index = 0; - const struct ieee80211_geo *geo; + const struct libipw_geo *geo; int i; - geo = ieee80211_get_geo(priv->ieee); + geo = libipw_get_geo(priv->ieee); - if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) { + if (priv->ieee->freq_band & LIBIPW_52GHZ_BAND) { int start = channel_index; for (i = 0; i < geo->a_channels; i++) { if ((priv->status & STATUS_ASSOCIATED) && @@ -6205,7 +6224,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, scan->channels_list[channel_index] = geo->a[i].channel; ipw_set_scan_type(scan, channel_index, geo->a[i]. - flags & IEEE80211_CH_PASSIVE_ONLY ? + flags & LIBIPW_CH_PASSIVE_ONLY ? IPW_SCAN_PASSIVE_FULL_DWELL_SCAN : scan_type); } @@ -6217,11 +6236,11 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, } } - if (priv->ieee->freq_band & IEEE80211_24GHZ_BAND) { + if (priv->ieee->freq_band & LIBIPW_24GHZ_BAND) { int start = channel_index; if (priv->config & CFG_SPEED_SCAN) { int index; - u8 channels[IEEE80211_24GHZ_CHANNELS] = { + u8 channels[LIBIPW_24GHZ_CHANNELS] = { /* nop out the list */ [0] = 0 }; @@ -6253,11 +6272,11 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, channel_index++; scan->channels_list[channel_index] = channel; index = - ieee80211_channel_to_index(priv->ieee, channel); + libipw_channel_to_index(priv->ieee, channel); ipw_set_scan_type(scan, channel_index, geo->bg[index]. flags & - IEEE80211_CH_PASSIVE_ONLY ? + LIBIPW_CH_PASSIVE_ONLY ? IPW_SCAN_PASSIVE_FULL_DWELL_SCAN : scan_type); } @@ -6272,7 +6291,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, ipw_set_scan_type(scan, channel_index, geo->bg[i]. flags & - IEEE80211_CH_PASSIVE_ONLY ? + LIBIPW_CH_PASSIVE_ONLY ? IPW_SCAN_PASSIVE_FULL_DWELL_SCAN : scan_type); } @@ -6339,7 +6358,7 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) } memset(&scan, 0, sizeof(scan)); - scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); + scan.full_scan_index = cpu_to_le32(libipw_get_scans(priv->ieee)); if (type == IW_SCAN_TYPE_PASSIVE) { IPW_DEBUG_WX("use passive scanning\n"); @@ -6370,13 +6389,13 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) u8 channel; u8 band = 0; - switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { - case IEEE80211_52GHZ_BAND: + switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { + case LIBIPW_52GHZ_BAND: band = (u8) (IPW_A_MODE << 6) | 1; channel = priv->channel; break; - case IEEE80211_24GHZ_BAND: + case LIBIPW_24GHZ_BAND: band = (u8) (IPW_B_MODE << 6) | 1; channel = priv->channel; break; @@ -6497,8 +6516,8 @@ static int ipw_wpa_enable(struct ipw_priv *priv, int value) static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value) { - struct ieee80211_device *ieee = priv->ieee; - struct ieee80211_security sec = { + struct libipw_device *ieee = priv->ieee; + struct libipw_security sec = { .flags = SEC_AUTH_MODE, }; int ret = 0; @@ -6548,8 +6567,8 @@ static int ipw_wx_set_genie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; u8 *buf; int err = 0; @@ -6584,8 +6603,8 @@ static int ipw_wx_get_genie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; int err = 0; if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { @@ -6627,8 +6646,8 @@ static int ipw_wx_set_auth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; struct iw_param *param = &wrqu->param; struct lib80211_crypt_data *crypt; unsigned long flags; @@ -6679,7 +6698,7 @@ static int ipw_wx_set_auth(struct net_device *dev, * can use this to determine if the CAP_PRIVACY_ON bit should * be set. */ - struct ieee80211_security sec = { + struct libipw_security sec = { .flags = SEC_ENABLED, .enabled = param->value, }; @@ -6727,8 +6746,8 @@ static int ipw_wx_get_auth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - struct ieee80211_device *ieee = priv->ieee; + struct ipw_priv *priv = libipw_priv(dev); + struct libipw_device *ieee = priv->ieee; struct lib80211_crypt_data *crypt; struct iw_param *param = &wrqu->param; int ret = 0; @@ -6786,7 +6805,7 @@ static int ipw_wx_set_encodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; if (hwcrypto) { @@ -6808,7 +6827,7 @@ static int ipw_wx_set_encodeext(struct net_device *dev, } } - return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra); + return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra); } /* SIOCGIWENCODEEXT */ @@ -6816,8 +6835,8 @@ static int ipw_wx_get_encodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra); + struct ipw_priv *priv = libipw_priv(dev); + return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra); } /* SIOCSIWMLME */ @@ -6825,7 +6844,7 @@ static int ipw_wx_set_mlme(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); struct iw_mlme *mlme = (struct iw_mlme *)extra; __le16 reason; @@ -6875,9 +6894,9 @@ static u8 ipw_qos_current_mode(struct ipw_priv * priv) */ static int ipw_qos_handle_probe_response(struct ipw_priv *priv, int active_network, - struct ieee80211_network *network) + struct libipw_network *network) { - u32 size = sizeof(struct ieee80211_qos_parameters); + u32 size = sizeof(struct libipw_qos_parameters); if (network->capability & WLAN_CAPABILITY_IBSS) network->qos_data.active = network->qos_data.supported; @@ -6935,12 +6954,12 @@ static int ipw_qos_handle_probe_response(struct ipw_priv *priv, * IPW_CMD_QOS_PARAMETERS and IPW_CMD_WME_INFO */ static int ipw_qos_activate(struct ipw_priv *priv, - struct ieee80211_qos_data *qos_network_data) + struct libipw_qos_data *qos_network_data) { int err; - struct ieee80211_qos_parameters qos_parameters[QOS_QOS_SETS]; - struct ieee80211_qos_parameters *active_one = NULL; - u32 size = sizeof(struct ieee80211_qos_parameters); + struct libipw_qos_parameters qos_parameters[QOS_QOS_SETS]; + struct libipw_qos_parameters *active_one = NULL; + u32 size = sizeof(struct libipw_qos_parameters); u32 burst_duration; int i; u8 type; @@ -7001,7 +7020,7 @@ static int ipw_qos_activate(struct ipw_priv *priv, IPW_DEBUG_QOS("QoS sending IPW_CMD_QOS_PARAMETERS\n"); err = ipw_send_qos_params_command(priv, - (struct ieee80211_qos_parameters *) + (struct libipw_qos_parameters *) &(qos_parameters[0])); if (err) IPW_DEBUG_QOS("QoS IPW_CMD_QOS_PARAMETERS failed\n"); @@ -7015,13 +7034,13 @@ static int ipw_qos_activate(struct ipw_priv *priv, static int ipw_qos_set_info_element(struct ipw_priv *priv) { int ret = 0; - struct ieee80211_qos_information_element qos_info; + struct libipw_qos_information_element qos_info; if (priv == NULL) return -1; qos_info.elementID = QOS_ELEMENT_ID; - qos_info.length = sizeof(struct ieee80211_qos_information_element) - 2; + qos_info.length = sizeof(struct libipw_qos_information_element) - 2; qos_info.version = QOS_VERSION_1; qos_info.ac_info = 0; @@ -7041,11 +7060,11 @@ static int ipw_qos_set_info_element(struct ipw_priv *priv) * Set the QoS parameter with the association request structure */ static int ipw_qos_association(struct ipw_priv *priv, - struct ieee80211_network *network) + struct libipw_network *network) { int err = 0; - struct ieee80211_qos_data *qos_data = NULL; - struct ieee80211_qos_data ibss_data = { + struct libipw_qos_data *qos_data = NULL; + struct libipw_qos_data ibss_data = { .supported = 1, .active = 1, }; @@ -7087,11 +7106,11 @@ static int ipw_qos_association(struct ipw_priv *priv, * setting */ static int ipw_qos_association_resp(struct ipw_priv *priv, - struct ieee80211_network *network) + struct libipw_network *network) { int ret = 0; unsigned long flags; - u32 size = sizeof(struct ieee80211_qos_parameters); + u32 size = sizeof(struct libipw_qos_parameters); int set_qos_param = 0; if ((priv == NULL) || (network == NULL) || @@ -7107,7 +7126,7 @@ static int ipw_qos_association_resp(struct ipw_priv *priv, spin_lock_irqsave(&priv->ieee->lock, flags); if (network->flags & NETWORK_HAS_QOS_PARAMETERS) { memcpy(&priv->assoc_network->qos_data, &network->qos_data, - sizeof(struct ieee80211_qos_data)); + sizeof(struct libipw_qos_data)); priv->assoc_network->qos_data.active = 1; if ((network->qos_data.old_param_count != network->qos_data.param_count)) { @@ -7143,7 +7162,7 @@ static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv) if ((priv == NULL)) return 0; - if (!(priv->ieee->modulation & IEEE80211_OFDM_MODULATION)) + if (!(priv->ieee->modulation & LIBIPW_OFDM_MODULATION)) ret = priv->qos_data.burst_duration_CCK; else ret = priv->qos_data.burst_duration_OFDM; @@ -7195,8 +7214,8 @@ static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority) static int ipw_is_qos_active(struct net_device *dev, struct sk_buff *skb) { - struct ipw_priv *priv = ieee80211_priv(dev); - struct ieee80211_qos_data *qos_data = NULL; + struct ipw_priv *priv = libipw_priv(dev); + struct libipw_qos_data *qos_data = NULL; int active, supported; u8 *daddr = skb->data + ETH_ALEN; int unicast = !is_multicast_ether_addr(daddr); @@ -7260,10 +7279,10 @@ static void ipw_bg_qos_activate(struct work_struct *work) } static int ipw_handle_probe_response(struct net_device *dev, - struct ieee80211_probe_response *resp, - struct ieee80211_network *network) + struct libipw_probe_response *resp, + struct libipw_network *network) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int active_network = ((priv->status & STATUS_ASSOCIATED) && (network == priv->assoc_network)); @@ -7273,10 +7292,10 @@ static int ipw_handle_probe_response(struct net_device *dev, } static int ipw_handle_beacon(struct net_device *dev, - struct ieee80211_beacon *resp, - struct ieee80211_network *network) + struct libipw_beacon *resp, + struct libipw_network *network) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int active_network = ((priv->status & STATUS_ASSOCIATED) && (network == priv->assoc_network)); @@ -7286,22 +7305,22 @@ static int ipw_handle_beacon(struct net_device *dev, } static int ipw_handle_assoc_response(struct net_device *dev, - struct ieee80211_assoc_response *resp, - struct ieee80211_network *network) + struct libipw_assoc_response *resp, + struct libipw_network *network) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); ipw_qos_association_resp(priv, network); return 0; } -static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters +static int ipw_send_qos_params_command(struct ipw_priv *priv, struct libipw_qos_parameters *qos_param) { return ipw_send_cmd_pdu(priv, IPW_CMD_QOS_PARAMETERS, sizeof(*qos_param) * 3, qos_param); } -static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element +static int ipw_send_qos_info_command(struct ipw_priv *priv, struct libipw_qos_information_element *qos_param) { return ipw_send_cmd_pdu(priv, IPW_CMD_WME_INFO, sizeof(*qos_param), @@ -7311,7 +7330,7 @@ static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos #endif /* CONFIG_IPW2200_QOS */ static int ipw_associate_network(struct ipw_priv *priv, - struct ieee80211_network *network, + struct libipw_network *network, struct ipw_supported_rates *rates, int roaming) { int err; @@ -7493,7 +7512,7 @@ static int ipw_associate_network(struct ipw_priv *priv, static void ipw_roam(void *data) { struct ipw_priv *priv = data; - struct ieee80211_network *network = NULL; + struct libipw_network *network = NULL; struct ipw_network_match match = { .network = priv->assoc_network }; @@ -7568,7 +7587,7 @@ static int ipw_associate(void *data) { struct ipw_priv *priv = data; - struct ieee80211_network *network = NULL; + struct libipw_network *network = NULL; struct ipw_network_match match = { .network = NULL }; @@ -7622,8 +7641,8 @@ static int ipw_associate(void *data) priv->config & CFG_STATIC_CHANNEL) { /* Use oldest network if the free list is empty */ if (list_empty(&priv->ieee->network_free_list)) { - struct ieee80211_network *oldest = NULL; - struct ieee80211_network *target; + struct libipw_network *oldest = NULL; + struct libipw_network *target; list_for_each_entry(target, &priv->ieee->network_list, list) { if ((oldest == NULL) || @@ -7644,7 +7663,7 @@ static int ipw_associate(void *data) } element = priv->ieee->network_free_list.next; - network = list_entry(element, struct ieee80211_network, list); + network = list_entry(element, struct libipw_network, list); ipw_adhoc_create(priv, network); rates = &priv->rates; list_del(element); @@ -7700,18 +7719,18 @@ static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv, switch (priv->ieee->sec.level) { case SEC_LEVEL_3: /* Remove CCMP HDR */ - memmove(skb->data + IEEE80211_3ADDR_LEN, - skb->data + IEEE80211_3ADDR_LEN + 8, - skb->len - IEEE80211_3ADDR_LEN - 8); + memmove(skb->data + LIBIPW_3ADDR_LEN, + skb->data + LIBIPW_3ADDR_LEN + 8, + skb->len - LIBIPW_3ADDR_LEN - 8); skb_trim(skb, skb->len - 16); /* CCMP_HDR_LEN + CCMP_MIC_LEN */ break; case SEC_LEVEL_2: break; case SEC_LEVEL_1: /* Remove IV */ - memmove(skb->data + IEEE80211_3ADDR_LEN, - skb->data + IEEE80211_3ADDR_LEN + 4, - skb->len - IEEE80211_3ADDR_LEN - 4); + memmove(skb->data + LIBIPW_3ADDR_LEN, + skb->data + LIBIPW_3ADDR_LEN + 4, + skb->len - LIBIPW_3ADDR_LEN - 4); skb_trim(skb, skb->len - 8); /* IV + ICV */ break; case SEC_LEVEL_0: @@ -7725,10 +7744,10 @@ static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv, static void ipw_handle_data_packet(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, - struct ieee80211_rx_stats *stats) + struct libipw_rx_stats *stats) { struct net_device *dev = priv->net_dev; - struct ieee80211_hdr_4addr *hdr; + struct libipw_hdr_4addr *hdr; struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; /* We received data from the HW, so stop the watchdog */ @@ -7758,15 +7777,15 @@ static void ipw_handle_data_packet(struct ipw_priv *priv, IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len); /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */ - hdr = (struct ieee80211_hdr_4addr *)rxb->skb->data; + hdr = (struct libipw_hdr_4addr *)rxb->skb->data; if (priv->ieee->iw_mode != IW_MODE_MONITOR && (is_multicast_ether_addr(hdr->addr1) ? !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt)) ipw_rebuild_decrypted_skb(priv, rxb->skb); - if (!ieee80211_rx(priv->ieee, rxb->skb, stats)) + if (!libipw_rx(priv->ieee, rxb->skb, stats)) dev->stats.rx_errors++; - else { /* ieee80211_rx succeeded, so it now owns the SKB */ + else { /* libipw_rx succeeded, so it now owns the SKB */ rxb->skb = NULL; __ipw_led_activity_on(priv); } @@ -7775,7 +7794,7 @@ static void ipw_handle_data_packet(struct ipw_priv *priv, #ifdef CONFIG_IPW2200_RADIOTAP static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, - struct ieee80211_rx_stats *stats) + struct libipw_rx_stats *stats) { struct net_device *dev = priv->net_dev; struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; @@ -7921,9 +7940,9 @@ static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len); - if (!ieee80211_rx(priv->ieee, rxb->skb, stats)) + if (!libipw_rx(priv->ieee, rxb->skb, stats)) dev->stats.rx_errors++; - else { /* ieee80211_rx succeeded, so it now owns the SKB */ + else { /* libipw_rx succeeded, so it now owns the SKB */ rxb->skb = NULL; /* no LED during capture */ } @@ -7931,28 +7950,28 @@ static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, #endif #ifdef CONFIG_IPW2200_PROMISCUOUS -#define ieee80211_is_probe_response(fc) \ +#define libipw_is_probe_response(fc) \ ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT && \ (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP ) -#define ieee80211_is_management(fc) \ +#define libipw_is_management(fc) \ ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) -#define ieee80211_is_control(fc) \ +#define libipw_is_control(fc) \ ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) -#define ieee80211_is_data(fc) \ +#define libipw_is_data(fc) \ ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) -#define ieee80211_is_assoc_request(fc) \ +#define libipw_is_assoc_request(fc) \ ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ) -#define ieee80211_is_reassoc_request(fc) \ +#define libipw_is_reassoc_request(fc) \ ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_REQ) static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, - struct ieee80211_rx_stats *stats) + struct libipw_rx_stats *stats) { struct net_device *dev = priv->prom_net_dev; struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; @@ -8002,17 +8021,17 @@ static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, } hdr = (void *)rxb->skb->data + IPW_RX_FRAME_SIZE; - if (ieee80211_is_management(le16_to_cpu(hdr->frame_control))) { + if (libipw_is_management(le16_to_cpu(hdr->frame_control))) { if (filter & IPW_PROM_NO_MGMT) return; if (filter & IPW_PROM_MGMT_HEADER_ONLY) hdr_only = 1; - } else if (ieee80211_is_control(le16_to_cpu(hdr->frame_control))) { + } else if (libipw_is_control(le16_to_cpu(hdr->frame_control))) { if (filter & IPW_PROM_NO_CTL) return; if (filter & IPW_PROM_CTL_HEADER_ONLY) hdr_only = 1; - } else if (ieee80211_is_data(le16_to_cpu(hdr->frame_control))) { + } else if (libipw_is_data(le16_to_cpu(hdr->frame_control))) { if (filter & IPW_PROM_NO_DATA) return; if (filter & IPW_PROM_DATA_HEADER_ONLY) @@ -8030,7 +8049,7 @@ static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, ipw_rt = (void *)skb->data; if (hdr_only) - len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); + len = libipw_get_hdrlen(le16_to_cpu(hdr->frame_control)); memcpy(ipw_rt->payload, hdr, len); @@ -8127,7 +8146,7 @@ static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, IPW_DEBUG_RX("Rx packet of %d bytes.\n", skb->len); - if (!ieee80211_rx(priv->prom_priv->ieee, skb, stats)) { + if (!libipw_rx(priv->prom_priv->ieee, skb, stats)) { dev->stats.rx_errors++; dev_kfree_skb_any(skb); } @@ -8135,7 +8154,7 @@ static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, #endif static int is_network_packet(struct ipw_priv *priv, - struct ieee80211_hdr_4addr *header) + struct libipw_hdr_4addr *header) { /* Filter incoming packets to determine if they are targetted toward * this network, discarding packets coming from ourselves */ @@ -8173,7 +8192,7 @@ static int is_network_packet(struct ipw_priv *priv, #define IPW_PACKET_RETRY_TIME HZ static int is_duplicate_packet(struct ipw_priv *priv, - struct ieee80211_hdr_4addr *header) + struct libipw_hdr_4addr *header) { u16 sc = le16_to_cpu(header->seq_ctl); u16 seq = WLAN_GET_SEQ_SEQ(sc); @@ -8247,14 +8266,14 @@ static int is_duplicate_packet(struct ipw_priv *priv, static void ipw_handle_mgmt_packet(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, - struct ieee80211_rx_stats *stats) + struct libipw_rx_stats *stats) { struct sk_buff *skb = rxb->skb; struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)skb->data; - struct ieee80211_hdr_4addr *header = (struct ieee80211_hdr_4addr *) + struct libipw_hdr_4addr *header = (struct libipw_hdr_4addr *) (skb->data + IPW_RX_FRAME_SIZE); - ieee80211_rx_mgt(priv->ieee, header, stats); + libipw_rx_mgt(priv->ieee, header, stats); if (priv->ieee->iw_mode == IW_MODE_ADHOC && ((WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) == @@ -8276,12 +8295,12 @@ static void ipw_handle_mgmt_packet(struct ipw_priv *priv, /* Advance past the ipw packet header to the 802.11 frame */ skb_pull(skb, IPW_RX_FRAME_SIZE); - /* Push the ieee80211_rx_stats before the 802.11 frame */ + /* Push the libipw_rx_stats before the 802.11 frame */ memcpy(skb_push(skb, sizeof(*stats)), stats, sizeof(*stats)); skb->dev = priv->ieee->dev; - /* Point raw at the ieee80211_stats */ + /* Point raw at the libipw_stats */ skb_reset_mac_header(skb); skb->pkt_type = PACKET_OTHERHOST; @@ -8301,7 +8320,7 @@ static void ipw_rx(struct ipw_priv *priv) { struct ipw_rx_mem_buffer *rxb; struct ipw_rx_packet *pkt; - struct ieee80211_hdr_4addr *header; + struct libipw_hdr_4addr *header; u32 r, w, i; u8 network_packet; u8 fill_rx = 0; @@ -8332,7 +8351,7 @@ static void ipw_rx(struct ipw_priv *priv) switch (pkt->header.message_type) { case RX_FRAME_TYPE: /* 802.11 frame */ { - struct ieee80211_rx_stats stats = { + struct libipw_rx_stats stats = { .rssi = pkt->u.frame.rssi_dbm - IPW_RSSI_TO_DBM, .signal = @@ -8347,19 +8366,19 @@ static void ipw_rx(struct ipw_priv *priv) .freq = (pkt->u.frame. control & (1 << 0)) ? - IEEE80211_24GHZ_BAND : - IEEE80211_52GHZ_BAND, + LIBIPW_24GHZ_BAND : + LIBIPW_52GHZ_BAND, .len = le16_to_cpu(pkt->u.frame.length), }; if (stats.rssi != 0) - stats.mask |= IEEE80211_STATMASK_RSSI; + stats.mask |= LIBIPW_STATMASK_RSSI; if (stats.signal != 0) - stats.mask |= IEEE80211_STATMASK_SIGNAL; + stats.mask |= LIBIPW_STATMASK_SIGNAL; if (stats.noise != 0) - stats.mask |= IEEE80211_STATMASK_NOISE; + stats.mask |= LIBIPW_STATMASK_NOISE; if (stats.rate != 0) - stats.mask |= IEEE80211_STATMASK_RATE; + stats.mask |= LIBIPW_STATMASK_RATE; priv->rx_packets++; @@ -8384,7 +8403,7 @@ static void ipw_rx(struct ipw_priv *priv) #endif header = - (struct ieee80211_hdr_4addr *)(rxb->skb-> + (struct libipw_hdr_4addr *)(rxb->skb-> data + IPW_RX_FRAME_SIZE); /* TODO: Check Ad-Hoc dest/source and make sure @@ -8407,7 +8426,7 @@ static void ipw_rx(struct ipw_priv *priv) le16_to_cpu(pkt->u.frame.length)); if (le16_to_cpu(pkt->u.frame.length) < - ieee80211_get_hdrlen(le16_to_cpu( + libipw_get_hdrlen(le16_to_cpu( header->frame_ctl))) { IPW_DEBUG_DROP ("Received packet is too small. " @@ -8592,9 +8611,9 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) ": Detected Intel PRO/Wireless 2915ABG Network " "Connection\n"); priv->ieee->abg_true = 1; - band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND; - modulation = IEEE80211_OFDM_MODULATION | - IEEE80211_CCK_MODULATION; + band = LIBIPW_52GHZ_BAND | LIBIPW_24GHZ_BAND; + modulation = LIBIPW_OFDM_MODULATION | + LIBIPW_CCK_MODULATION; priv->adapter = IPW_2915ABG; priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B; } else { @@ -8604,9 +8623,9 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) "Connection\n"); priv->ieee->abg_true = 0; - band = IEEE80211_24GHZ_BAND; - modulation = IEEE80211_OFDM_MODULATION | - IEEE80211_CCK_MODULATION; + band = LIBIPW_24GHZ_BAND; + modulation = LIBIPW_OFDM_MODULATION | + LIBIPW_CCK_MODULATION; priv->adapter = IPW_2200BG; priv->ieee->mode = IEEE_G | IEEE_B; } @@ -8614,7 +8633,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) priv->ieee->freq_band = band; priv->ieee->modulation = modulation; - priv->rates_mask = IEEE80211_DEFAULT_RATES_MASK; + priv->rates_mask = LIBIPW_DEFAULT_RATES_MASK; priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT; priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT; @@ -8640,24 +8659,6 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) * */ -static int ipw_wx_get_name(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct ipw_priv *priv = ieee80211_priv(dev); - mutex_lock(&priv->mutex); - if (priv->status & STATUS_RF_KILL_MASK) - strcpy(wrqu->name, "radio off"); - else if (!(priv->status & STATUS_ASSOCIATED)) - strcpy(wrqu->name, "unassociated"); - else - snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", - ipw_modes[priv->assoc_request.ieee_mode]); - IPW_DEBUG_WX("Name: %s\n", wrqu->name); - mutex_unlock(&priv->mutex); - return 0; -} - static int ipw_set_channel(struct ipw_priv *priv, u8 channel) { if (channel == 0) { @@ -8714,8 +8715,8 @@ static int ipw_wx_set_freq(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + struct ipw_priv *priv = libipw_priv(dev); + const struct libipw_geo *geo = libipw_get_geo(priv->ieee); struct iw_freq *fwrq = &wrqu->freq; int ret = 0, i; u8 channel, flags; @@ -8730,23 +8731,23 @@ static int ipw_wx_set_freq(struct net_device *dev, } /* if setting by freq convert to channel */ if (fwrq->e == 1) { - channel = ieee80211_freq_to_channel(priv->ieee, fwrq->m); + channel = libipw_freq_to_channel(priv->ieee, fwrq->m); if (channel == 0) return -EINVAL; } else channel = fwrq->m; - if (!(band = ieee80211_is_valid_channel(priv->ieee, channel))) + if (!(band = libipw_is_valid_channel(priv->ieee, channel))) return -EINVAL; if (priv->ieee->iw_mode == IW_MODE_ADHOC) { - i = ieee80211_channel_to_index(priv->ieee, channel); + i = libipw_channel_to_index(priv->ieee, channel); if (i == -1) return -EINVAL; - flags = (band == IEEE80211_24GHZ_BAND) ? + flags = (band == LIBIPW_24GHZ_BAND) ? geo->bg[i].flags : geo->a[i].flags; - if (flags & IEEE80211_CH_PASSIVE_ONLY) { + if (flags & LIBIPW_CH_PASSIVE_ONLY) { IPW_DEBUG_WX("Invalid Ad-Hoc channel for 802.11a\n"); return -EINVAL; } @@ -8763,7 +8764,7 @@ static int ipw_wx_get_freq(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); wrqu->freq.e = 0; @@ -8774,16 +8775,16 @@ static int ipw_wx_get_freq(struct net_device *dev, priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) { int i; - i = ieee80211_channel_to_index(priv->ieee, priv->channel); + i = libipw_channel_to_index(priv->ieee, priv->channel); BUG_ON(i == -1); wrqu->freq.e = 1; - switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { - case IEEE80211_52GHZ_BAND: + switch (libipw_is_valid_channel(priv->ieee, priv->channel)) { + case LIBIPW_52GHZ_BAND: wrqu->freq.m = priv->ieee->geo.a[i].freq * 100000; break; - case IEEE80211_24GHZ_BAND: + case LIBIPW_24GHZ_BAND: wrqu->freq.m = priv->ieee->geo.bg[i].freq * 100000; break; @@ -8802,7 +8803,7 @@ static int ipw_wx_set_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int err = 0; IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode); @@ -8854,7 +8855,7 @@ static int ipw_wx_get_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->mode = priv->ieee->iw_mode; IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode); @@ -8883,9 +8884,9 @@ static int ipw_wx_get_range(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); struct iw_range *range = (struct iw_range *)extra; - const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); + const struct libipw_geo *geo = libipw_get_geo(priv->ieee); int i = 0, j; wrqu->data.length = sizeof(*range); @@ -8929,7 +8930,7 @@ static int ipw_wx_get_range(struct net_device *dev, if (priv->ieee->mode & (IEEE_B | IEEE_G)) { for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES; j++) { if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && - (geo->bg[j].flags & IEEE80211_CH_PASSIVE_ONLY)) + (geo->bg[j].flags & LIBIPW_CH_PASSIVE_ONLY)) continue; range->freq[i].i = geo->bg[j].channel; @@ -8942,7 +8943,7 @@ static int ipw_wx_get_range(struct net_device *dev, if (priv->ieee->mode & IEEE_A) { for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES; j++) { if ((priv->ieee->iw_mode == IW_MODE_ADHOC) && - (geo->a[j].flags & IEEE80211_CH_PASSIVE_ONLY)) + (geo->a[j].flags & LIBIPW_CH_PASSIVE_ONLY)) continue; range->freq[i].i = geo->a[j].channel; @@ -8977,7 +8978,7 @@ static int ipw_wx_set_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); static const unsigned char any[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff @@ -9026,7 +9027,7 @@ static int ipw_wx_get_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); /* If we are associated, trying to associate, or have a statically * configured BSSID then return that; otherwise return ANY */ @@ -9048,7 +9049,7 @@ static int ipw_wx_set_essid(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int length; DECLARE_SSID_BUF(ssid); @@ -9094,7 +9095,7 @@ static int ipw_wx_get_essid(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); DECLARE_SSID_BUF(ssid); /* If we are associated, trying to associate, or have a statically @@ -9120,7 +9121,7 @@ static int ipw_wx_set_nick(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); IPW_DEBUG_WX("Setting nick to '%s'\n", extra); if (wrqu->data.length > IW_ESSID_MAX_SIZE) @@ -9139,7 +9140,7 @@ static int ipw_wx_get_nick(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); IPW_DEBUG_WX("Getting nick\n"); mutex_lock(&priv->mutex); wrqu->data.length = strlen(priv->nick); @@ -9153,7 +9154,7 @@ static int ipw_wx_set_sens(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int err = 0; IPW_DEBUG_WX("Setting roaming threshold to %d\n", wrqu->sens.value); @@ -9183,7 +9184,7 @@ static int ipw_wx_get_sens(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->sens.fixed = 1; wrqu->sens.value = priv->roaming_threshold; @@ -9200,7 +9201,7 @@ static int ipw_wx_set_rate(struct net_device *dev, union iwreq_data *wrqu, char *extra) { /* TODO: We should use semaphores or locks for access to priv */ - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); u32 target_rate = wrqu->bitrate.value; u32 fixed, mask; @@ -9210,7 +9211,7 @@ static int ipw_wx_set_rate(struct net_device *dev, if (target_rate == -1) { fixed = 0; - mask = IEEE80211_DEFAULT_RATES_MASK; + mask = LIBIPW_DEFAULT_RATES_MASK; /* Now we should reassociate */ goto apply; } @@ -9219,62 +9220,62 @@ static int ipw_wx_set_rate(struct net_device *dev, fixed = wrqu->bitrate.fixed; if (target_rate == 1000000 || !fixed) - mask |= IEEE80211_CCK_RATE_1MB_MASK; + mask |= LIBIPW_CCK_RATE_1MB_MASK; if (target_rate == 1000000) goto apply; if (target_rate == 2000000 || !fixed) - mask |= IEEE80211_CCK_RATE_2MB_MASK; + mask |= LIBIPW_CCK_RATE_2MB_MASK; if (target_rate == 2000000) goto apply; if (target_rate == 5500000 || !fixed) - mask |= IEEE80211_CCK_RATE_5MB_MASK; + mask |= LIBIPW_CCK_RATE_5MB_MASK; if (target_rate == 5500000) goto apply; if (target_rate == 6000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_6MB_MASK; + mask |= LIBIPW_OFDM_RATE_6MB_MASK; if (target_rate == 6000000) goto apply; if (target_rate == 9000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_9MB_MASK; + mask |= LIBIPW_OFDM_RATE_9MB_MASK; if (target_rate == 9000000) goto apply; if (target_rate == 11000000 || !fixed) - mask |= IEEE80211_CCK_RATE_11MB_MASK; + mask |= LIBIPW_CCK_RATE_11MB_MASK; if (target_rate == 11000000) goto apply; if (target_rate == 12000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_12MB_MASK; + mask |= LIBIPW_OFDM_RATE_12MB_MASK; if (target_rate == 12000000) goto apply; if (target_rate == 18000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_18MB_MASK; + mask |= LIBIPW_OFDM_RATE_18MB_MASK; if (target_rate == 18000000) goto apply; if (target_rate == 24000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_24MB_MASK; + mask |= LIBIPW_OFDM_RATE_24MB_MASK; if (target_rate == 24000000) goto apply; if (target_rate == 36000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_36MB_MASK; + mask |= LIBIPW_OFDM_RATE_36MB_MASK; if (target_rate == 36000000) goto apply; if (target_rate == 48000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_48MB_MASK; + mask |= LIBIPW_OFDM_RATE_48MB_MASK; if (target_rate == 48000000) goto apply; if (target_rate == 54000000 || !fixed) - mask |= IEEE80211_OFDM_RATE_54MB_MASK; + mask |= LIBIPW_OFDM_RATE_54MB_MASK; if (target_rate == 54000000) goto apply; @@ -9285,7 +9286,7 @@ static int ipw_wx_set_rate(struct net_device *dev, IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n", mask, fixed ? "fixed" : "sub-rates"); mutex_lock(&priv->mutex); - if (mask == IEEE80211_DEFAULT_RATES_MASK) { + if (mask == LIBIPW_DEFAULT_RATES_MASK) { priv->config &= ~CFG_FIXED_RATE; ipw_set_fixed_rate(priv, priv->ieee->mode); } else @@ -9312,7 +9313,7 @@ static int ipw_wx_get_rate(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->bitrate.value = priv->last_rate; wrqu->bitrate.fixed = (priv->config & CFG_FIXED_RATE) ? 1 : 0; @@ -9325,7 +9326,7 @@ static int ipw_wx_set_rts(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); if (wrqu->rts.disabled || !wrqu->rts.fixed) priv->rts_threshold = DEFAULT_RTS_THRESHOLD; @@ -9348,7 +9349,7 @@ static int ipw_wx_get_rts(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->rts.value = priv->rts_threshold; wrqu->rts.fixed = 0; /* no auto select */ @@ -9362,7 +9363,7 @@ static int ipw_wx_set_txpow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int err = 0; mutex_lock(&priv->mutex); @@ -9396,7 +9397,7 @@ static int ipw_wx_get_txpow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->power.value = priv->tx_power; wrqu->power.fixed = 1; @@ -9414,7 +9415,7 @@ static int ipw_wx_set_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); if (wrqu->frag.disabled || !wrqu->frag.fixed) priv->ieee->fts = DEFAULT_FTS; @@ -9438,7 +9439,7 @@ static int ipw_wx_get_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->frag.value = priv->ieee->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -9453,7 +9454,7 @@ static int ipw_wx_set_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled) return -EINVAL; @@ -9486,7 +9487,7 @@ static int ipw_wx_get_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); wrqu->retry.disabled = 0; @@ -9517,7 +9518,7 @@ static int ipw_wx_set_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); struct iw_scan_req *req = (struct iw_scan_req *)extra; struct delayed_work *work = NULL; @@ -9553,20 +9554,20 @@ static int ipw_wx_get_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra); + struct ipw_priv *priv = libipw_priv(dev); + return libipw_wx_get_scan(priv->ieee, info, wrqu, extra); } static int ipw_wx_set_encode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int ret; u32 cap = priv->capability; mutex_lock(&priv->mutex); - ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key); + ret = libipw_wx_set_encode(priv->ieee, info, wrqu, key); /* In IBSS mode, we need to notify the firmware to update * the beacon info after we changed the capability. */ @@ -9583,15 +9584,15 @@ static int ipw_wx_get_encode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct ipw_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key); + struct ipw_priv *priv = libipw_priv(dev); + return libipw_wx_get_encode(priv->ieee, info, wrqu, key); } static int ipw_wx_set_power(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int err; mutex_lock(&priv->mutex); if (wrqu->power.disabled) { @@ -9642,7 +9643,7 @@ static int ipw_wx_get_power(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); if (!(priv->power_mode & IPW_POWER_ENABLED)) wrqu->power.disabled = 1; @@ -9659,7 +9660,7 @@ static int ipw_wx_set_powermode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int mode = *(int *)extra; int err; @@ -9685,7 +9686,7 @@ static int ipw_wx_get_powermode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int level = IPW_POWER_LEVEL(priv->power_mode); char *p = extra; @@ -9717,7 +9718,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int mode = *(int *)extra; u8 band = 0, modulation = 0; @@ -9729,8 +9730,8 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, if (priv->adapter == IPW_2915ABG) { priv->ieee->abg_true = 1; if (mode & IEEE_A) { - band |= IEEE80211_52GHZ_BAND; - modulation |= IEEE80211_OFDM_MODULATION; + band |= LIBIPW_52GHZ_BAND; + modulation |= LIBIPW_OFDM_MODULATION; } else priv->ieee->abg_true = 0; } else { @@ -9745,14 +9746,14 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, } if (mode & IEEE_B) { - band |= IEEE80211_24GHZ_BAND; - modulation |= IEEE80211_CCK_MODULATION; + band |= LIBIPW_24GHZ_BAND; + modulation |= LIBIPW_CCK_MODULATION; } else priv->ieee->abg_true = 0; if (mode & IEEE_G) { - band |= IEEE80211_24GHZ_BAND; - modulation |= IEEE80211_OFDM_MODULATION; + band |= LIBIPW_24GHZ_BAND; + modulation |= LIBIPW_OFDM_MODULATION; } else priv->ieee->abg_true = 0; @@ -9782,7 +9783,7 @@ static int ipw_wx_get_wireless_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); switch (priv->ieee->mode) { case IEEE_A: @@ -9823,7 +9824,7 @@ static int ipw_wx_set_preamble(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int mode = *(int *)extra; mutex_lock(&priv->mutex); /* Switching from SHORT -> LONG requires a disassociation */ @@ -9856,7 +9857,7 @@ static int ipw_wx_get_preamble(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); mutex_lock(&priv->mutex); if (priv->config & CFG_PREAMBLE_LONG) snprintf(wrqu->name, IFNAMSIZ, "long (1)"); @@ -9871,7 +9872,7 @@ static int ipw_wx_set_monitor(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); mutex_lock(&priv->mutex); @@ -9905,7 +9906,7 @@ static int ipw_wx_reset(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); IPW_DEBUG_WX("RESET\n"); queue_work(priv->workqueue, &priv->adapter_restart); return 0; @@ -9915,7 +9916,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); union iwreq_data wrqu_sec = { .encoding = { .flags = IW_ENCODE_DISABLED, @@ -9938,7 +9939,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW); mutex_unlock(&priv->mutex); - ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); + libipw_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); mutex_lock(&priv->mutex); if (!(priv->status & STATUS_RF_KILL_MASK)) { @@ -9957,7 +9958,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, /* Rebase the WE IOCTLs to zero for the handler array */ #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] static iw_handler ipw_wx_handlers[] = { - IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name, + IW_IOCTL(SIOCGIWNAME) = (iw_handler) cfg80211_wext_giwname, IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq, IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, @@ -10083,7 +10084,7 @@ static struct iw_handler_def ipw_wx_handler_def = { */ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); struct iw_statistics *wstats; wstats = &priv->wstats; @@ -10164,13 +10165,13 @@ static int ipw_net_stop(struct net_device *dev) todo: modify to send one tfd per fragment instead of using chunking. otherwise -we need to heavily modify the ieee80211_skb_to_txb. +we need to heavily modify the libipw_skb_to_txb. */ -static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, +static int ipw_tx_skb(struct ipw_priv *priv, struct libipw_txb *txb, int pri) { - struct ieee80211_hdr_3addrqos *hdr = (struct ieee80211_hdr_3addrqos *) + struct libipw_hdr_3addrqos *hdr = (struct libipw_hdr_3addrqos *) txb->fragments[0]->data; int i = 0; struct tfd_frame *tfd; @@ -10187,7 +10188,7 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, if (!(priv->status & STATUS_ASSOCIATED)) goto drop; - hdr_len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdr_len = libipw_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); switch (priv->ieee->iw_mode) { case IW_MODE_ADHOC: unicast = !is_multicast_ether_addr(hdr->addr1); @@ -10356,13 +10357,13 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, drop: IPW_DEBUG_DROP("Silently dropping Tx packet.\n"); - ieee80211_txb_free(txb); + libipw_txb_free(txb); return NETDEV_TX_OK; } static int ipw_net_is_queue_full(struct net_device *dev, int pri) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); #ifdef CONFIG_IPW2200_QOS int tx_id = ipw_get_tx_queue_number(priv, pri); struct clx2_tx_queue *txq = &priv->txq[tx_id]; @@ -10378,9 +10379,9 @@ static int ipw_net_is_queue_full(struct net_device *dev, int pri) #ifdef CONFIG_IPW2200_PROMISCUOUS static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, - struct ieee80211_txb *txb) + struct libipw_txb *txb) { - struct ieee80211_rx_stats dummystats; + struct libipw_rx_stats dummystats; struct ieee80211_hdr *hdr; u8 n; u16 filter = priv->prom_priv->filter; @@ -10393,17 +10394,17 @@ static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, /* Filtering of fragment chains is done agains the first fragment */ hdr = (void *)txb->fragments[0]->data; - if (ieee80211_is_management(le16_to_cpu(hdr->frame_control))) { + if (libipw_is_management(le16_to_cpu(hdr->frame_control))) { if (filter & IPW_PROM_NO_MGMT) return; if (filter & IPW_PROM_MGMT_HEADER_ONLY) hdr_only = 1; - } else if (ieee80211_is_control(le16_to_cpu(hdr->frame_control))) { + } else if (libipw_is_control(le16_to_cpu(hdr->frame_control))) { if (filter & IPW_PROM_NO_CTL) return; if (filter & IPW_PROM_CTL_HEADER_ONLY) hdr_only = 1; - } else if (ieee80211_is_data(le16_to_cpu(hdr->frame_control))) { + } else if (libipw_is_data(le16_to_cpu(hdr->frame_control))) { if (filter & IPW_PROM_NO_DATA) return; if (filter & IPW_PROM_DATA_HEADER_ONLY) @@ -10418,7 +10419,7 @@ static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, if (hdr_only) { hdr = (void *)src->data; - len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); + len = libipw_get_hdrlen(le16_to_cpu(hdr->frame_control)); } else len = src->len; @@ -10452,16 +10453,16 @@ static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, skb_copy_from_linear_data(src, skb_put(dst, len), len); - if (!ieee80211_rx(priv->prom_priv->ieee, dst, &dummystats)) + if (!libipw_rx(priv->prom_priv->ieee, dst, &dummystats)) dev_kfree_skb_any(dst); } } #endif -static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb, +static int ipw_net_hard_start_xmit(struct libipw_txb *txb, struct net_device *dev, int pri) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); unsigned long flags; int ret; @@ -10488,7 +10489,7 @@ static void ipw_net_set_multicast_list(struct net_device *dev) static int ipw_net_set_mac_address(struct net_device *dev, void *p) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); struct sockaddr *addr = p; if (!is_valid_ether_addr(addr->sa_data)) @@ -10506,7 +10507,7 @@ static int ipw_net_set_mac_address(struct net_device *dev, void *p) static void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct ipw_priv *p = ieee80211_priv(dev); + struct ipw_priv *p = libipw_priv(dev); char vers[64]; char date[32]; u32 len; @@ -10527,7 +10528,7 @@ static void ipw_ethtool_get_drvinfo(struct net_device *dev, static u32 ipw_ethtool_get_link(struct net_device *dev) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); return (priv->status & STATUS_ASSOCIATED) != 0; } @@ -10539,7 +10540,7 @@ static int ipw_ethtool_get_eeprom_len(struct net_device *dev) static int ipw_ethtool_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 * bytes) { - struct ipw_priv *p = ieee80211_priv(dev); + struct ipw_priv *p = libipw_priv(dev); if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) return -EINVAL; @@ -10552,7 +10553,7 @@ static int ipw_ethtool_get_eeprom(struct net_device *dev, static int ipw_ethtool_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 * bytes) { - struct ipw_priv *p = ieee80211_priv(dev); + struct ipw_priv *p = libipw_priv(dev); int i; if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) @@ -10768,9 +10769,9 @@ static int __devinit ipw_setup_deferred_work(struct ipw_priv *priv) } static void shim__set_security(struct net_device *dev, - struct ieee80211_security *sec) + struct libipw_security *sec) { - struct ipw_priv *priv = ieee80211_priv(dev); + struct ipw_priv *priv = libipw_priv(dev); int i; for (i = 0; i < 4; i++) { if (sec->flags & (1 << i)) { @@ -10855,21 +10856,21 @@ static int init_supported_rates(struct ipw_priv *priv, memset(rates, 0, sizeof(*rates)); /* configure supported rates */ switch (priv->ieee->freq_band) { - case IEEE80211_52GHZ_BAND: + case LIBIPW_52GHZ_BAND: rates->ieee_mode = IPW_A_MODE; rates->purpose = IPW_RATE_CAPABILITIES; - ipw_add_ofdm_scan_rates(rates, IEEE80211_CCK_MODULATION, - IEEE80211_OFDM_DEFAULT_RATES_MASK); + ipw_add_ofdm_scan_rates(rates, LIBIPW_CCK_MODULATION, + LIBIPW_OFDM_DEFAULT_RATES_MASK); break; default: /* Mixed or 2.4Ghz */ rates->ieee_mode = IPW_G_MODE; rates->purpose = IPW_RATE_CAPABILITIES; - ipw_add_cck_scan_rates(rates, IEEE80211_CCK_MODULATION, - IEEE80211_CCK_DEFAULT_RATES_MASK); - if (priv->ieee->modulation & IEEE80211_OFDM_MODULATION) { - ipw_add_ofdm_scan_rates(rates, IEEE80211_CCK_MODULATION, - IEEE80211_OFDM_DEFAULT_RATES_MASK); + ipw_add_cck_scan_rates(rates, LIBIPW_CCK_MODULATION, + LIBIPW_CCK_DEFAULT_RATES_MASK); + if (priv->ieee->modulation & LIBIPW_OFDM_MODULATION) { + ipw_add_ofdm_scan_rates(rates, LIBIPW_CCK_MODULATION, + LIBIPW_OFDM_DEFAULT_RATES_MASK); } break; } @@ -10975,7 +10976,7 @@ static int ipw_config(struct ipw_priv *priv) * table. * */ -static const struct ieee80211_geo ipw_geos[] = { +static const struct libipw_geo ipw_geos[] = { { /* Restricted */ "---", .bg_channels = 11, @@ -10997,10 +10998,10 @@ static const struct ieee80211_geo ipw_geos[] = { {5200, 40}, {5220, 44}, {5240, 48}, - {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, - {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, - {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, - {5320, 64, IEEE80211_CH_PASSIVE_ONLY}}, + {5260, 52, LIBIPW_CH_PASSIVE_ONLY}, + {5280, 56, LIBIPW_CH_PASSIVE_ONLY}, + {5300, 60, LIBIPW_CH_PASSIVE_ONLY}, + {5320, 64, LIBIPW_CH_PASSIVE_ONLY}}, }, { /* Rest of World */ @@ -11025,10 +11026,10 @@ static const struct ieee80211_geo ipw_geos[] = { {5200, 40}, {5220, 44}, {5240, 48}, - {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, - {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, - {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, - {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, + {5260, 52, LIBIPW_CH_PASSIVE_ONLY}, + {5280, 56, LIBIPW_CH_PASSIVE_ONLY}, + {5300, 60, LIBIPW_CH_PASSIVE_ONLY}, + {5320, 64, LIBIPW_CH_PASSIVE_ONLY}, {5745, 149}, {5765, 153}, {5785, 157}, @@ -11048,15 +11049,15 @@ static const struct ieee80211_geo ipw_geos[] = { {5200, 40}, {5220, 44}, {5240, 48}, - {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, - {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, - {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, - {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, - {5745, 149, IEEE80211_CH_PASSIVE_ONLY}, - {5765, 153, IEEE80211_CH_PASSIVE_ONLY}, - {5785, 157, IEEE80211_CH_PASSIVE_ONLY}, - {5805, 161, IEEE80211_CH_PASSIVE_ONLY}, - {5825, 165, IEEE80211_CH_PASSIVE_ONLY}}, + {5260, 52, LIBIPW_CH_PASSIVE_ONLY}, + {5280, 56, LIBIPW_CH_PASSIVE_ONLY}, + {5300, 60, LIBIPW_CH_PASSIVE_ONLY}, + {5320, 64, LIBIPW_CH_PASSIVE_ONLY}, + {5745, 149, LIBIPW_CH_PASSIVE_ONLY}, + {5765, 153, LIBIPW_CH_PASSIVE_ONLY}, + {5785, 157, LIBIPW_CH_PASSIVE_ONLY}, + {5805, 161, LIBIPW_CH_PASSIVE_ONLY}, + {5825, 165, LIBIPW_CH_PASSIVE_ONLY}}, }, { /* Custom Japan */ @@ -11093,21 +11094,21 @@ static const struct ieee80211_geo ipw_geos[] = { {5200, 40}, {5220, 44}, {5240, 48}, - {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, - {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, - {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, - {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, - {5500, 100, IEEE80211_CH_PASSIVE_ONLY}, - {5520, 104, IEEE80211_CH_PASSIVE_ONLY}, - {5540, 108, IEEE80211_CH_PASSIVE_ONLY}, - {5560, 112, IEEE80211_CH_PASSIVE_ONLY}, - {5580, 116, IEEE80211_CH_PASSIVE_ONLY}, - {5600, 120, IEEE80211_CH_PASSIVE_ONLY}, - {5620, 124, IEEE80211_CH_PASSIVE_ONLY}, - {5640, 128, IEEE80211_CH_PASSIVE_ONLY}, - {5660, 132, IEEE80211_CH_PASSIVE_ONLY}, - {5680, 136, IEEE80211_CH_PASSIVE_ONLY}, - {5700, 140, IEEE80211_CH_PASSIVE_ONLY}}, + {5260, 52, LIBIPW_CH_PASSIVE_ONLY}, + {5280, 56, LIBIPW_CH_PASSIVE_ONLY}, + {5300, 60, LIBIPW_CH_PASSIVE_ONLY}, + {5320, 64, LIBIPW_CH_PASSIVE_ONLY}, + {5500, 100, LIBIPW_CH_PASSIVE_ONLY}, + {5520, 104, LIBIPW_CH_PASSIVE_ONLY}, + {5540, 108, LIBIPW_CH_PASSIVE_ONLY}, + {5560, 112, LIBIPW_CH_PASSIVE_ONLY}, + {5580, 116, LIBIPW_CH_PASSIVE_ONLY}, + {5600, 120, LIBIPW_CH_PASSIVE_ONLY}, + {5620, 124, LIBIPW_CH_PASSIVE_ONLY}, + {5640, 128, LIBIPW_CH_PASSIVE_ONLY}, + {5660, 132, LIBIPW_CH_PASSIVE_ONLY}, + {5680, 136, LIBIPW_CH_PASSIVE_ONLY}, + {5700, 140, LIBIPW_CH_PASSIVE_ONLY}}, }, { /* Custom Japan */ @@ -11117,7 +11118,7 @@ static const struct ieee80211_geo ipw_geos[] = { {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7}, {2447, 8}, {2452, 9}, {2457, 10}, {2462, 11}, {2467, 12}, - {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY}}, + {2472, 13}, {2484, 14, LIBIPW_CH_B_ONLY}}, .a_channels = 4, .a = {{5170, 34}, {5190, 38}, {5210, 42}, {5230, 46}}, @@ -11130,8 +11131,8 @@ static const struct ieee80211_geo ipw_geos[] = { {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7}, {2447, 8}, {2452, 9}, {2457, 10}, {2462, 11}, {2467, 12}, - {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY | - IEEE80211_CH_PASSIVE_ONLY}}, + {2472, 13}, {2484, 14, LIBIPW_CH_B_ONLY | + LIBIPW_CH_PASSIVE_ONLY}}, }, { /* High Band */ @@ -11141,8 +11142,8 @@ static const struct ieee80211_geo ipw_geos[] = { {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7}, {2447, 8}, {2452, 9}, {2457, 10}, {2462, 11}, - {2467, 12, IEEE80211_CH_PASSIVE_ONLY}, - {2472, 13, IEEE80211_CH_PASSIVE_ONLY}}, + {2467, 12, LIBIPW_CH_PASSIVE_ONLY}, + {2472, 13, LIBIPW_CH_PASSIVE_ONLY}}, .a_channels = 4, .a = {{5745, 149}, {5765, 153}, {5785, 157}, {5805, 161}}, @@ -11168,33 +11169,33 @@ static const struct ieee80211_geo ipw_geos[] = { {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7}, {2447, 8}, {2452, 9}, {2457, 10}, {2462, 11}, - {2467, 12, IEEE80211_CH_PASSIVE_ONLY}, - {2472, 13, IEEE80211_CH_PASSIVE_ONLY}}, + {2467, 12, LIBIPW_CH_PASSIVE_ONLY}, + {2472, 13, LIBIPW_CH_PASSIVE_ONLY}}, .a_channels = 24, - .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY}, - {5200, 40, IEEE80211_CH_PASSIVE_ONLY}, - {5220, 44, IEEE80211_CH_PASSIVE_ONLY}, - {5240, 48, IEEE80211_CH_PASSIVE_ONLY}, - {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, - {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, - {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, - {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, - {5500, 100, IEEE80211_CH_PASSIVE_ONLY}, - {5520, 104, IEEE80211_CH_PASSIVE_ONLY}, - {5540, 108, IEEE80211_CH_PASSIVE_ONLY}, - {5560, 112, IEEE80211_CH_PASSIVE_ONLY}, - {5580, 116, IEEE80211_CH_PASSIVE_ONLY}, - {5600, 120, IEEE80211_CH_PASSIVE_ONLY}, - {5620, 124, IEEE80211_CH_PASSIVE_ONLY}, - {5640, 128, IEEE80211_CH_PASSIVE_ONLY}, - {5660, 132, IEEE80211_CH_PASSIVE_ONLY}, - {5680, 136, IEEE80211_CH_PASSIVE_ONLY}, - {5700, 140, IEEE80211_CH_PASSIVE_ONLY}, - {5745, 149, IEEE80211_CH_PASSIVE_ONLY}, - {5765, 153, IEEE80211_CH_PASSIVE_ONLY}, - {5785, 157, IEEE80211_CH_PASSIVE_ONLY}, - {5805, 161, IEEE80211_CH_PASSIVE_ONLY}, - {5825, 165, IEEE80211_CH_PASSIVE_ONLY}}, + .a = {{5180, 36, LIBIPW_CH_PASSIVE_ONLY}, + {5200, 40, LIBIPW_CH_PASSIVE_ONLY}, + {5220, 44, LIBIPW_CH_PASSIVE_ONLY}, + {5240, 48, LIBIPW_CH_PASSIVE_ONLY}, + {5260, 52, LIBIPW_CH_PASSIVE_ONLY}, + {5280, 56, LIBIPW_CH_PASSIVE_ONLY}, + {5300, 60, LIBIPW_CH_PASSIVE_ONLY}, + {5320, 64, LIBIPW_CH_PASSIVE_ONLY}, + {5500, 100, LIBIPW_CH_PASSIVE_ONLY}, + {5520, 104, LIBIPW_CH_PASSIVE_ONLY}, + {5540, 108, LIBIPW_CH_PASSIVE_ONLY}, + {5560, 112, LIBIPW_CH_PASSIVE_ONLY}, + {5580, 116, LIBIPW_CH_PASSIVE_ONLY}, + {5600, 120, LIBIPW_CH_PASSIVE_ONLY}, + {5620, 124, LIBIPW_CH_PASSIVE_ONLY}, + {5640, 128, LIBIPW_CH_PASSIVE_ONLY}, + {5660, 132, LIBIPW_CH_PASSIVE_ONLY}, + {5680, 136, LIBIPW_CH_PASSIVE_ONLY}, + {5700, 140, LIBIPW_CH_PASSIVE_ONLY}, + {5745, 149, LIBIPW_CH_PASSIVE_ONLY}, + {5765, 153, LIBIPW_CH_PASSIVE_ONLY}, + {5785, 157, LIBIPW_CH_PASSIVE_ONLY}, + {5805, 161, LIBIPW_CH_PASSIVE_ONLY}, + {5825, 165, LIBIPW_CH_PASSIVE_ONLY}}, }, { /* Europe */ @@ -11205,19 +11206,19 @@ static const struct ieee80211_geo ipw_geos[] = { {2442, 7}, {2447, 8}, {2452, 9}, {2457, 10}, {2462, 11}}, .a_channels = 13, - .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY}, - {5200, 40, IEEE80211_CH_PASSIVE_ONLY}, - {5220, 44, IEEE80211_CH_PASSIVE_ONLY}, - {5240, 48, IEEE80211_CH_PASSIVE_ONLY}, - {5260, 52, IEEE80211_CH_PASSIVE_ONLY}, - {5280, 56, IEEE80211_CH_PASSIVE_ONLY}, - {5300, 60, IEEE80211_CH_PASSIVE_ONLY}, - {5320, 64, IEEE80211_CH_PASSIVE_ONLY}, - {5745, 149, IEEE80211_CH_PASSIVE_ONLY}, - {5765, 153, IEEE80211_CH_PASSIVE_ONLY}, - {5785, 157, IEEE80211_CH_PASSIVE_ONLY}, - {5805, 161, IEEE80211_CH_PASSIVE_ONLY}, - {5825, 165, IEEE80211_CH_PASSIVE_ONLY}}, + .a = {{5180, 36, LIBIPW_CH_PASSIVE_ONLY}, + {5200, 40, LIBIPW_CH_PASSIVE_ONLY}, + {5220, 44, LIBIPW_CH_PASSIVE_ONLY}, + {5240, 48, LIBIPW_CH_PASSIVE_ONLY}, + {5260, 52, LIBIPW_CH_PASSIVE_ONLY}, + {5280, 56, LIBIPW_CH_PASSIVE_ONLY}, + {5300, 60, LIBIPW_CH_PASSIVE_ONLY}, + {5320, 64, LIBIPW_CH_PASSIVE_ONLY}, + {5745, 149, LIBIPW_CH_PASSIVE_ONLY}, + {5765, 153, LIBIPW_CH_PASSIVE_ONLY}, + {5785, 157, LIBIPW_CH_PASSIVE_ONLY}, + {5805, 161, LIBIPW_CH_PASSIVE_ONLY}, + {5825, 165, LIBIPW_CH_PASSIVE_ONLY}}, } }; @@ -11228,7 +11229,7 @@ static int ipw_up(struct ipw_priv *priv) /* Age scan list entries found before suspend */ if (priv->suspend_time) { - ieee80211_networks_age(priv->ieee, priv->suspend_time); + libipw_networks_age(priv->ieee, priv->suspend_time); priv->suspend_time = 0; } @@ -11273,7 +11274,7 @@ static int ipw_up(struct ipw_priv *priv) priv->eeprom[EEPROM_COUNTRY_CODE + 2]); j = 0; } - if (ieee80211_set_geo(priv->ieee, &ipw_geos[j])) { + if (libipw_set_geo(priv->ieee, &ipw_geos[j])) { IPW_WARNING("Could not set geography."); return 0; } @@ -11401,16 +11402,100 @@ static void ipw_bg_down(struct work_struct *work) /* Called by register_netdev() */ static int ipw_net_init(struct net_device *dev) { - struct ipw_priv *priv = ieee80211_priv(dev); + int i, rc = 0; + struct ipw_priv *priv = libipw_priv(dev); + const struct libipw_geo *geo = libipw_get_geo(priv->ieee); + struct wireless_dev *wdev = &priv->ieee->wdev; mutex_lock(&priv->mutex); if (ipw_up(priv)) { - mutex_unlock(&priv->mutex); - return -EIO; + rc = -EIO; + goto out; } + memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); + + /* fill-out priv->ieee->bg_band */ + if (geo->bg_channels) { + struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; + + bg_band->band = IEEE80211_BAND_2GHZ; + bg_band->n_channels = geo->bg_channels; + bg_band->channels = + kzalloc(geo->bg_channels * + sizeof(struct ieee80211_channel), GFP_KERNEL); + /* translate geo->bg to bg_band.channels */ + for (i = 0; i < geo->bg_channels; i++) { + bg_band->channels[i].band = IEEE80211_BAND_2GHZ; + bg_band->channels[i].center_freq = geo->bg[i].freq; + bg_band->channels[i].hw_value = geo->bg[i].channel; + bg_band->channels[i].max_power = geo->bg[i].max_power; + if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) + bg_band->channels[i].flags |= + IEEE80211_CHAN_PASSIVE_SCAN; + if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) + bg_band->channels[i].flags |= + IEEE80211_CHAN_NO_IBSS; + if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) + bg_band->channels[i].flags |= + IEEE80211_CHAN_RADAR; + /* No equivalent for LIBIPW_CH_80211H_RULES, + LIBIPW_CH_UNIFORM_SPREADING, or + LIBIPW_CH_B_ONLY... */ + } + /* point at bitrate info */ + bg_band->bitrates = ipw2200_bg_rates; + bg_band->n_bitrates = ipw2200_num_bg_rates; + + wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = bg_band; + } + + /* fill-out priv->ieee->a_band */ + if (geo->a_channels) { + struct ieee80211_supported_band *a_band = &priv->ieee->a_band; + + a_band->band = IEEE80211_BAND_5GHZ; + a_band->n_channels = geo->a_channels; + a_band->channels = + kzalloc(geo->a_channels * + sizeof(struct ieee80211_channel), GFP_KERNEL); + /* translate geo->bg to a_band.channels */ + for (i = 0; i < geo->a_channels; i++) { + a_band->channels[i].band = IEEE80211_BAND_2GHZ; + a_band->channels[i].center_freq = geo->a[i].freq; + a_band->channels[i].hw_value = geo->a[i].channel; + a_band->channels[i].max_power = geo->a[i].max_power; + if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY) + a_band->channels[i].flags |= + IEEE80211_CHAN_PASSIVE_SCAN; + if (geo->a[i].flags & LIBIPW_CH_NO_IBSS) + a_band->channels[i].flags |= + IEEE80211_CHAN_NO_IBSS; + if (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT) + a_band->channels[i].flags |= + IEEE80211_CHAN_RADAR; + /* No equivalent for LIBIPW_CH_80211H_RULES, + LIBIPW_CH_UNIFORM_SPREADING, or + LIBIPW_CH_B_ONLY... */ + } + /* point at bitrate info */ + a_band->bitrates = ipw2200_a_rates; + a_band->n_bitrates = ipw2200_num_a_rates; + + wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = a_band; + } + + set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); + + /* With that information in place, we can now register the wiphy... */ + if (wiphy_register(wdev->wiphy)) { + rc = -EIO; + goto out; + } + +out: mutex_unlock(&priv->mutex); - return 0; + return rc; } /* PCI driver stuff */ @@ -11480,7 +11565,7 @@ static struct attribute_group ipw_attribute_group = { #ifdef CONFIG_IPW2200_PROMISCUOUS static int ipw_prom_open(struct net_device *dev) { - struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); + struct ipw_prom_priv *prom_priv = libipw_priv(dev); struct ipw_priv *priv = prom_priv->priv; IPW_DEBUG_INFO("prom dev->open\n"); @@ -11500,7 +11585,7 @@ static int ipw_prom_open(struct net_device *dev) static int ipw_prom_stop(struct net_device *dev) { - struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); + struct ipw_prom_priv *prom_priv = libipw_priv(dev); struct ipw_priv *priv = prom_priv->priv; IPW_DEBUG_INFO("prom dev->stop\n"); @@ -11528,7 +11613,7 @@ static const struct net_device_ops ipw_prom_netdev_ops = { .ndo_open = ipw_prom_open, .ndo_stop = ipw_prom_stop, .ndo_start_xmit = ipw_prom_hard_start_xmit, - .ndo_change_mtu = ieee80211_change_mtu, + .ndo_change_mtu = libipw_change_mtu, .ndo_set_mac_address = eth_mac_addr, .ndo_validate_addr = eth_validate_addr, }; @@ -11540,11 +11625,11 @@ static int ipw_prom_alloc(struct ipw_priv *priv) if (priv->prom_net_dev) return -EPERM; - priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv)); + priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv), 1); if (priv->prom_net_dev == NULL) return -ENOMEM; - priv->prom_priv = ieee80211_priv(priv->prom_net_dev); + priv->prom_priv = libipw_priv(priv->prom_net_dev); priv->prom_priv->ieee = netdev_priv(priv->prom_net_dev); priv->prom_priv->priv = priv; @@ -11559,7 +11644,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv) rc = register_netdev(priv->prom_net_dev); if (rc) { - free_ieee80211(priv->prom_net_dev); + free_ieee80211(priv->prom_net_dev, 1); priv->prom_net_dev = NULL; return rc; } @@ -11573,7 +11658,7 @@ static void ipw_prom_free(struct ipw_priv *priv) return; unregister_netdev(priv->prom_net_dev); - free_ieee80211(priv->prom_net_dev); + free_ieee80211(priv->prom_net_dev, 1); priv->prom_net_dev = NULL; } @@ -11586,8 +11671,8 @@ static const struct net_device_ops ipw_netdev_ops = { .ndo_stop = ipw_net_stop, .ndo_set_multicast_list = ipw_net_set_multicast_list, .ndo_set_mac_address = ipw_net_set_mac_address, - .ndo_start_xmit = ieee80211_xmit, - .ndo_change_mtu = ieee80211_change_mtu, + .ndo_start_xmit = libipw_xmit, + .ndo_change_mtu = libipw_change_mtu, .ndo_validate_addr = eth_validate_addr, }; @@ -11601,13 +11686,13 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, struct ipw_priv *priv; int i; - net_dev = alloc_ieee80211(sizeof(struct ipw_priv)); + net_dev = alloc_ieee80211(sizeof(struct ipw_priv), 0); if (net_dev == NULL) { err = -ENOMEM; goto out; } - priv = ieee80211_priv(net_dev); + priv = libipw_priv(net_dev); priv->ieee = netdev_priv(net_dev); priv->net_dev = net_dev; @@ -11749,7 +11834,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); out_free_ieee80211: - free_ieee80211(priv->net_dev); + free_ieee80211(priv->net_dev, 0); out: return err; } @@ -11816,7 +11901,7 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) pci_release_regions(pdev); pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); - free_ieee80211(priv->net_dev); + free_ieee80211(priv->net_dev, 0); free_firmware(); } diff --git a/drivers/net/wireless/ipw2x00/ipw2200.h b/drivers/net/wireless/ipw2x00/ipw2200.h index 05e8ccf..bf0eeb2 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.h +++ b/drivers/net/wireless/ipw2x00/ipw2200.h @@ -19,7 +19,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ******************************************************************************/ @@ -55,7 +55,7 @@ #include <linux/workqueue.h> -#include "ieee80211.h" +#include "libipw.h" /* Authentication and Association States */ enum connection_manager_assoc_states { @@ -365,8 +365,8 @@ enum connection_manager_assoc_states { /* QoS sturctures */ struct ipw_qos_info { int qos_enable; - struct ieee80211_qos_parameters *def_qos_parm_OFDM; - struct ieee80211_qos_parameters *def_qos_parm_CCK; + struct libipw_qos_parameters *def_qos_parm_OFDM; + struct libipw_qos_parameters *def_qos_parm_CCK; u32 burst_duration_CCK; u32 burst_duration_OFDM; u16 qos_no_ack_mask; @@ -534,7 +534,7 @@ typedef void destructor_func(const void *); struct clx2_tx_queue { struct clx2_queue q; struct tfd_frame *bd; - struct ieee80211_txb **txb; + struct libipw_txb **txb; }; /* @@ -1144,7 +1144,7 @@ enum ipw_prom_filter { struct ipw_priv; struct ipw_prom_priv { struct ipw_priv *priv; - struct ieee80211_device *ieee; + struct libipw_device *ieee; enum ipw_prom_filter filter; int tx_packets; int rx_packets; @@ -1175,7 +1175,7 @@ struct ipw_rt_hdr { struct ipw_priv { /* ieee device used by generic ieee processing code */ - struct ieee80211_device *ieee; + struct libipw_device *ieee; spinlock_t lock; spinlock_t irq_lock; @@ -1222,7 +1222,7 @@ struct ipw_priv { u32 roaming_threshold; struct ipw_associate assoc_request; - struct ieee80211_network *assoc_network; + struct libipw_network *assoc_network; unsigned long ts_scan_abort; struct ipw_supported_rates rates; diff --git a/drivers/net/wireless/ipw2x00/ieee80211.h b/drivers/net/wireless/ipw2x00/libipw.h index 70755c1..8f91d34 100644 --- a/drivers/net/wireless/ipw2x00/ieee80211.h +++ b/drivers/net/wireless/ipw2x00/libipw.h @@ -20,21 +20,22 @@ * * API Version History * 1.0.x -- Initial version - * 1.1.x -- Added radiotap, QoS, TIM, ieee80211_geo APIs, + * 1.1.x -- Added radiotap, QoS, TIM, libipw_geo APIs, * various structure changes, and crypto API init method */ -#ifndef IEEE80211_H -#define IEEE80211_H +#ifndef LIBIPW_H +#define LIBIPW_H #include <linux/if_ether.h> /* ETH_ALEN */ #include <linux/kernel.h> /* ARRAY_SIZE */ #include <linux/wireless.h> #include <linux/ieee80211.h> #include <net/lib80211.h> +#include <net/cfg80211.h> -#define IEEE80211_VERSION "git-1.1.13" +#define LIBIPW_VERSION "git-1.1.13" -#define IEEE80211_DATA_LEN 2304 +#define LIBIPW_DATA_LEN 2304 /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section 6.2.1.1.2. @@ -43,35 +44,35 @@ represents the 2304 bytes of real data, plus a possible 8 bytes of WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ -#define IEEE80211_1ADDR_LEN 10 -#define IEEE80211_2ADDR_LEN 16 -#define IEEE80211_3ADDR_LEN 24 -#define IEEE80211_4ADDR_LEN 30 -#define IEEE80211_FCS_LEN 4 -#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) -#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) +#define LIBIPW_1ADDR_LEN 10 +#define LIBIPW_2ADDR_LEN 16 +#define LIBIPW_3ADDR_LEN 24 +#define LIBIPW_4ADDR_LEN 30 +#define LIBIPW_FCS_LEN 4 +#define LIBIPW_HLEN (LIBIPW_4ADDR_LEN) +#define LIBIPW_FRAME_LEN (LIBIPW_DATA_LEN + LIBIPW_HLEN) #define MIN_FRAG_THRESHOLD 256U #define MAX_FRAG_THRESHOLD 2346U /* QOS control */ -#define IEEE80211_QCTL_TID 0x000F +#define LIBIPW_QCTL_TID 0x000F /* debug macros */ #ifdef CONFIG_LIBIPW_DEBUG -extern u32 ieee80211_debug_level; -#define IEEE80211_DEBUG(level, fmt, args...) \ -do { if (ieee80211_debug_level & (level)) \ +extern u32 libipw_debug_level; +#define LIBIPW_DEBUG(level, fmt, args...) \ +do { if (libipw_debug_level & (level)) \ printk(KERN_DEBUG "ieee80211: %c %s " fmt, \ in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0) -static inline bool ieee80211_ratelimit_debug(u32 level) +static inline bool libipw_ratelimit_debug(u32 level) { - return (ieee80211_debug_level & level) && net_ratelimit(); + return (libipw_debug_level & level) && net_ratelimit(); } #else -#define IEEE80211_DEBUG(level, fmt, args...) do {} while (0) -static inline bool ieee80211_ratelimit_debug(u32 level) +#define LIBIPW_DEBUG(level, fmt, args...) do {} while (0) +static inline bool libipw_ratelimit_debug(u32 level) { return false; } @@ -83,51 +84,51 @@ static inline bool ieee80211_ratelimit_debug(u32 level) * If you are defining a new debug classification, simply add it to the #define * list here in the form of: * - * #define IEEE80211_DL_xxxx VALUE + * #define LIBIPW_DL_xxxx VALUE * * shifting value to the left one bit from the previous entry. xxxx should be * the name of the classification (for example, WEP) * - * You then need to either add a IEEE80211_xxxx_DEBUG() macro definition for your - * classification, or use IEEE80211_DEBUG(IEEE80211_DL_xxxx, ...) whenever you want + * You then need to either add a LIBIPW_xxxx_DEBUG() macro definition for your + * classification, or use LIBIPW_DEBUG(LIBIPW_DL_xxxx, ...) whenever you want * to send output to that classification. * * To add your debug level to the list of levels seen when you perform * * % cat /proc/net/ieee80211/debug_level * - * you simply need to add your entry to the ieee80211_debug_level array. + * you simply need to add your entry to the libipw_debug_level array. * * If you do not see debug_level in /proc/net/ieee80211 then you do not have * CONFIG_LIBIPW_DEBUG defined in your kernel configuration * */ -#define IEEE80211_DL_INFO (1<<0) -#define IEEE80211_DL_WX (1<<1) -#define IEEE80211_DL_SCAN (1<<2) -#define IEEE80211_DL_STATE (1<<3) -#define IEEE80211_DL_MGMT (1<<4) -#define IEEE80211_DL_FRAG (1<<5) -#define IEEE80211_DL_DROP (1<<7) - -#define IEEE80211_DL_TX (1<<8) -#define IEEE80211_DL_RX (1<<9) -#define IEEE80211_DL_QOS (1<<31) - -#define IEEE80211_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a) -#define IEEE80211_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a) -#define IEEE80211_DEBUG_INFO(f, a...) IEEE80211_DEBUG(IEEE80211_DL_INFO, f, ## a) - -#define IEEE80211_DEBUG_WX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_WX, f, ## a) -#define IEEE80211_DEBUG_SCAN(f, a...) IEEE80211_DEBUG(IEEE80211_DL_SCAN, f, ## a) -#define IEEE80211_DEBUG_STATE(f, a...) IEEE80211_DEBUG(IEEE80211_DL_STATE, f, ## a) -#define IEEE80211_DEBUG_MGMT(f, a...) IEEE80211_DEBUG(IEEE80211_DL_MGMT, f, ## a) -#define IEEE80211_DEBUG_FRAG(f, a...) IEEE80211_DEBUG(IEEE80211_DL_FRAG, f, ## a) -#define IEEE80211_DEBUG_DROP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_DROP, f, ## a) -#define IEEE80211_DEBUG_TX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_TX, f, ## a) -#define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a) -#define IEEE80211_DEBUG_QOS(f, a...) IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a) +#define LIBIPW_DL_INFO (1<<0) +#define LIBIPW_DL_WX (1<<1) +#define LIBIPW_DL_SCAN (1<<2) +#define LIBIPW_DL_STATE (1<<3) +#define LIBIPW_DL_MGMT (1<<4) +#define LIBIPW_DL_FRAG (1<<5) +#define LIBIPW_DL_DROP (1<<7) + +#define LIBIPW_DL_TX (1<<8) +#define LIBIPW_DL_RX (1<<9) +#define LIBIPW_DL_QOS (1<<31) + +#define LIBIPW_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a) +#define LIBIPW_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a) +#define LIBIPW_DEBUG_INFO(f, a...) LIBIPW_DEBUG(LIBIPW_DL_INFO, f, ## a) + +#define LIBIPW_DEBUG_WX(f, a...) LIBIPW_DEBUG(LIBIPW_DL_WX, f, ## a) +#define LIBIPW_DEBUG_SCAN(f, a...) LIBIPW_DEBUG(LIBIPW_DL_SCAN, f, ## a) +#define LIBIPW_DEBUG_STATE(f, a...) LIBIPW_DEBUG(LIBIPW_DL_STATE, f, ## a) +#define LIBIPW_DEBUG_MGMT(f, a...) LIBIPW_DEBUG(LIBIPW_DL_MGMT, f, ## a) +#define LIBIPW_DEBUG_FRAG(f, a...) LIBIPW_DEBUG(LIBIPW_DL_FRAG, f, ## a) +#define LIBIPW_DEBUG_DROP(f, a...) LIBIPW_DEBUG(LIBIPW_DL_DROP, f, ## a) +#define LIBIPW_DEBUG_TX(f, a...) LIBIPW_DEBUG(LIBIPW_DL_TX, f, ## a) +#define LIBIPW_DEBUG_RX(f, a...) LIBIPW_DEBUG(LIBIPW_DL_RX, f, ## a) +#define LIBIPW_DEBUG_QOS(f, a...) LIBIPW_DEBUG(LIBIPW_DL_QOS, f, ## a) #include <linux/netdevice.h> #include <linux/if_arp.h> /* ARPHRD_ETHER */ @@ -146,7 +147,7 @@ static inline bool ieee80211_ratelimit_debug(u32 level) #define P80211_OUI_LEN 3 -struct ieee80211_snap_hdr { +struct libipw_snap_hdr { u8 dsap; /* always 0xAA */ u8 ssap; /* always 0xAA */ @@ -155,7 +156,7 @@ struct ieee80211_snap_hdr { } __attribute__ ((packed)); -#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) +#define SNAP_SIZE sizeof(struct libipw_snap_hdr) #define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS) #define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) @@ -164,74 +165,74 @@ struct ieee80211_snap_hdr { #define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) #define WLAN_GET_SEQ_SEQ(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4) -#define IEEE80211_STATMASK_SIGNAL (1<<0) -#define IEEE80211_STATMASK_RSSI (1<<1) -#define IEEE80211_STATMASK_NOISE (1<<2) -#define IEEE80211_STATMASK_RATE (1<<3) -#define IEEE80211_STATMASK_WEMASK 0x7 - -#define IEEE80211_CCK_MODULATION (1<<0) -#define IEEE80211_OFDM_MODULATION (1<<1) - -#define IEEE80211_24GHZ_BAND (1<<0) -#define IEEE80211_52GHZ_BAND (1<<1) - -#define IEEE80211_CCK_RATE_1MB 0x02 -#define IEEE80211_CCK_RATE_2MB 0x04 -#define IEEE80211_CCK_RATE_5MB 0x0B -#define IEEE80211_CCK_RATE_11MB 0x16 -#define IEEE80211_OFDM_RATE_6MB 0x0C -#define IEEE80211_OFDM_RATE_9MB 0x12 -#define IEEE80211_OFDM_RATE_12MB 0x18 -#define IEEE80211_OFDM_RATE_18MB 0x24 -#define IEEE80211_OFDM_RATE_24MB 0x30 -#define IEEE80211_OFDM_RATE_36MB 0x48 -#define IEEE80211_OFDM_RATE_48MB 0x60 -#define IEEE80211_OFDM_RATE_54MB 0x6C -#define IEEE80211_BASIC_RATE_MASK 0x80 - -#define IEEE80211_CCK_RATE_1MB_MASK (1<<0) -#define IEEE80211_CCK_RATE_2MB_MASK (1<<1) -#define IEEE80211_CCK_RATE_5MB_MASK (1<<2) -#define IEEE80211_CCK_RATE_11MB_MASK (1<<3) -#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) -#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) -#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) -#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) -#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) -#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) -#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) -#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) - -#define IEEE80211_CCK_RATES_MASK 0x0000000F -#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ - IEEE80211_CCK_RATE_2MB_MASK) -#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ - IEEE80211_CCK_RATE_5MB_MASK | \ - IEEE80211_CCK_RATE_11MB_MASK) - -#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 -#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ - IEEE80211_OFDM_RATE_12MB_MASK | \ - IEEE80211_OFDM_RATE_24MB_MASK) -#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ - IEEE80211_OFDM_RATE_9MB_MASK | \ - IEEE80211_OFDM_RATE_18MB_MASK | \ - IEEE80211_OFDM_RATE_36MB_MASK | \ - IEEE80211_OFDM_RATE_48MB_MASK | \ - IEEE80211_OFDM_RATE_54MB_MASK) -#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ - IEEE80211_CCK_DEFAULT_RATES_MASK) - -#define IEEE80211_NUM_OFDM_RATES 8 -#define IEEE80211_NUM_CCK_RATES 4 -#define IEEE80211_OFDM_SHIFT_MASK_A 4 +#define LIBIPW_STATMASK_SIGNAL (1<<0) +#define LIBIPW_STATMASK_RSSI (1<<1) +#define LIBIPW_STATMASK_NOISE (1<<2) +#define LIBIPW_STATMASK_RATE (1<<3) +#define LIBIPW_STATMASK_WEMASK 0x7 + +#define LIBIPW_CCK_MODULATION (1<<0) +#define LIBIPW_OFDM_MODULATION (1<<1) + +#define LIBIPW_24GHZ_BAND (1<<0) +#define LIBIPW_52GHZ_BAND (1<<1) + +#define LIBIPW_CCK_RATE_1MB 0x02 +#define LIBIPW_CCK_RATE_2MB 0x04 +#define LIBIPW_CCK_RATE_5MB 0x0B +#define LIBIPW_CCK_RATE_11MB 0x16 +#define LIBIPW_OFDM_RATE_6MB 0x0C +#define LIBIPW_OFDM_RATE_9MB 0x12 +#define LIBIPW_OFDM_RATE_12MB 0x18 +#define LIBIPW_OFDM_RATE_18MB 0x24 +#define LIBIPW_OFDM_RATE_24MB 0x30 +#define LIBIPW_OFDM_RATE_36MB 0x48 +#define LIBIPW_OFDM_RATE_48MB 0x60 +#define LIBIPW_OFDM_RATE_54MB 0x6C +#define LIBIPW_BASIC_RATE_MASK 0x80 + +#define LIBIPW_CCK_RATE_1MB_MASK (1<<0) +#define LIBIPW_CCK_RATE_2MB_MASK (1<<1) +#define LIBIPW_CCK_RATE_5MB_MASK (1<<2) +#define LIBIPW_CCK_RATE_11MB_MASK (1<<3) +#define LIBIPW_OFDM_RATE_6MB_MASK (1<<4) +#define LIBIPW_OFDM_RATE_9MB_MASK (1<<5) +#define LIBIPW_OFDM_RATE_12MB_MASK (1<<6) +#define LIBIPW_OFDM_RATE_18MB_MASK (1<<7) +#define LIBIPW_OFDM_RATE_24MB_MASK (1<<8) +#define LIBIPW_OFDM_RATE_36MB_MASK (1<<9) +#define LIBIPW_OFDM_RATE_48MB_MASK (1<<10) +#define LIBIPW_OFDM_RATE_54MB_MASK (1<<11) + +#define LIBIPW_CCK_RATES_MASK 0x0000000F +#define LIBIPW_CCK_BASIC_RATES_MASK (LIBIPW_CCK_RATE_1MB_MASK | \ + LIBIPW_CCK_RATE_2MB_MASK) +#define LIBIPW_CCK_DEFAULT_RATES_MASK (LIBIPW_CCK_BASIC_RATES_MASK | \ + LIBIPW_CCK_RATE_5MB_MASK | \ + LIBIPW_CCK_RATE_11MB_MASK) + +#define LIBIPW_OFDM_RATES_MASK 0x00000FF0 +#define LIBIPW_OFDM_BASIC_RATES_MASK (LIBIPW_OFDM_RATE_6MB_MASK | \ + LIBIPW_OFDM_RATE_12MB_MASK | \ + LIBIPW_OFDM_RATE_24MB_MASK) +#define LIBIPW_OFDM_DEFAULT_RATES_MASK (LIBIPW_OFDM_BASIC_RATES_MASK | \ + LIBIPW_OFDM_RATE_9MB_MASK | \ + LIBIPW_OFDM_RATE_18MB_MASK | \ + LIBIPW_OFDM_RATE_36MB_MASK | \ + LIBIPW_OFDM_RATE_48MB_MASK | \ + LIBIPW_OFDM_RATE_54MB_MASK) +#define LIBIPW_DEFAULT_RATES_MASK (LIBIPW_OFDM_DEFAULT_RATES_MASK | \ + LIBIPW_CCK_DEFAULT_RATES_MASK) + +#define LIBIPW_NUM_OFDM_RATES 8 +#define LIBIPW_NUM_CCK_RATES 4 +#define LIBIPW_OFDM_SHIFT_MASK_A 4 /* NOTE: This data is for statistical purposes; not all hardware provides this * information for frames received. - * For ieee80211_rx_mgt, you need to set at least the 'len' parameter. + * For libipw_rx_mgt, you need to set at least the 'len' parameter. */ -struct ieee80211_rx_stats { +struct libipw_rx_stats { u32 mac_time; s8 rssi; u8 signal; @@ -250,9 +251,9 @@ struct ieee80211_rx_stats { * three fragmented frames. This define can be increased to support more * concurrent frames, but it should be noted that each entry can consume about * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ -#define IEEE80211_FRAG_CACHE_LEN 4 +#define LIBIPW_FRAG_CACHE_LEN 4 -struct ieee80211_frag_entry { +struct libipw_frag_entry { unsigned long first_frag_time; unsigned int seq; unsigned int last_frag; @@ -261,7 +262,7 @@ struct ieee80211_frag_entry { u8 dst_addr[ETH_ALEN]; }; -struct ieee80211_stats { +struct libipw_stats { unsigned int tx_unicast_frames; unsigned int tx_multicast_frames; unsigned int tx_fragments; @@ -285,7 +286,7 @@ struct ieee80211_stats { unsigned int rx_message_in_bad_msg_fragments; }; -struct ieee80211_device; +struct libipw_device; #define SEC_KEY_1 (1<<0) #define SEC_KEY_2 (1<<1) @@ -314,7 +315,7 @@ struct ieee80211_device; #define SCM_KEY_LEN 32 #define SCM_TEMPORAL_KEY_LENGTH 16 -struct ieee80211_security { +struct libipw_security { u16 active_key:2, enabled:1, unicast_uses_group:1, encrypt:1; u8 auth_mode; u8 encode_alg[WEP_KEYS]; @@ -341,14 +342,14 @@ Total: 28-2340 bytes #define BEACON_PROBE_SSID_ID_POSITION 12 -struct ieee80211_hdr_1addr { +struct libipw_hdr_1addr { __le16 frame_ctl; __le16 duration_id; u8 addr1[ETH_ALEN]; u8 payload[0]; } __attribute__ ((packed)); -struct ieee80211_hdr_2addr { +struct libipw_hdr_2addr { __le16 frame_ctl; __le16 duration_id; u8 addr1[ETH_ALEN]; @@ -356,7 +357,7 @@ struct ieee80211_hdr_2addr { u8 payload[0]; } __attribute__ ((packed)); -struct ieee80211_hdr_3addr { +struct libipw_hdr_3addr { __le16 frame_ctl; __le16 duration_id; u8 addr1[ETH_ALEN]; @@ -366,7 +367,7 @@ struct ieee80211_hdr_3addr { u8 payload[0]; } __attribute__ ((packed)); -struct ieee80211_hdr_4addr { +struct libipw_hdr_4addr { __le16 frame_ctl; __le16 duration_id; u8 addr1[ETH_ALEN]; @@ -377,7 +378,7 @@ struct ieee80211_hdr_4addr { u8 payload[0]; } __attribute__ ((packed)); -struct ieee80211_hdr_3addrqos { +struct libipw_hdr_3addrqos { __le16 frame_ctl; __le16 duration_id; u8 addr1[ETH_ALEN]; @@ -388,7 +389,7 @@ struct ieee80211_hdr_3addrqos { __le16 qos_ctl; } __attribute__ ((packed)); -struct ieee80211_info_element { +struct libipw_info_element { u8 id; u8 len; u8 data[0]; @@ -411,16 +412,16 @@ struct ieee80211_info_element { u16 status; */ -struct ieee80211_auth { - struct ieee80211_hdr_3addr header; +struct libipw_auth { + struct libipw_hdr_3addr header; __le16 algorithm; __le16 transaction; __le16 status; /* challenge */ - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_channel_switch { +struct libipw_channel_switch { u8 id; u8 len; u8 mode; @@ -428,73 +429,73 @@ struct ieee80211_channel_switch { u8 count; } __attribute__ ((packed)); -struct ieee80211_action { - struct ieee80211_hdr_3addr header; +struct libipw_action { + struct libipw_hdr_3addr header; u8 category; u8 action; union { - struct ieee80211_action_exchange { + struct libipw_action_exchange { u8 token; - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } exchange; - struct ieee80211_channel_switch channel_switch; + struct libipw_channel_switch channel_switch; } format; } __attribute__ ((packed)); -struct ieee80211_disassoc { - struct ieee80211_hdr_3addr header; +struct libipw_disassoc { + struct libipw_hdr_3addr header; __le16 reason; } __attribute__ ((packed)); /* Alias deauth for disassoc */ -#define ieee80211_deauth ieee80211_disassoc +#define libipw_deauth libipw_disassoc -struct ieee80211_probe_request { - struct ieee80211_hdr_3addr header; +struct libipw_probe_request { + struct libipw_hdr_3addr header; /* SSID, supported rates */ - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_probe_response { - struct ieee80211_hdr_3addr header; +struct libipw_probe_response { + struct libipw_hdr_3addr header; __le32 time_stamp[2]; __le16 beacon_interval; __le16 capability; /* SSID, supported rates, FH params, DS params, * CF params, IBSS params, TIM (if beacon), RSN */ - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } __attribute__ ((packed)); /* Alias beacon for probe_response */ -#define ieee80211_beacon ieee80211_probe_response +#define libipw_beacon libipw_probe_response -struct ieee80211_assoc_request { - struct ieee80211_hdr_3addr header; +struct libipw_assoc_request { + struct libipw_hdr_3addr header; __le16 capability; __le16 listen_interval; /* SSID, supported rates, RSN */ - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_reassoc_request { - struct ieee80211_hdr_3addr header; +struct libipw_reassoc_request { + struct libipw_hdr_3addr header; __le16 capability; __le16 listen_interval; u8 current_ap[ETH_ALEN]; - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_assoc_response { - struct ieee80211_hdr_3addr header; +struct libipw_assoc_response { + struct libipw_hdr_3addr header; __le16 capability; __le16 status; __le16 aid; /* supported rates */ - struct ieee80211_info_element info_element[0]; + struct libipw_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_txb { +struct libipw_txb { u8 nr_frags; u8 encrypted; u8 rts_included; @@ -546,7 +547,7 @@ struct ieee80211_txb { #define QOS_VERSION_1 1 #define QOS_AIFSN_MIN_VALUE 2 -struct ieee80211_qos_information_element { +struct libipw_qos_information_element { u8 elementID; u8 length; u8 qui[QOS_OUI_LEN]; @@ -556,19 +557,19 @@ struct ieee80211_qos_information_element { u8 ac_info; } __attribute__ ((packed)); -struct ieee80211_qos_ac_parameter { +struct libipw_qos_ac_parameter { u8 aci_aifsn; u8 ecw_min_max; __le16 tx_op_limit; } __attribute__ ((packed)); -struct ieee80211_qos_parameter_info { - struct ieee80211_qos_information_element info_element; +struct libipw_qos_parameter_info { + struct libipw_qos_information_element info_element; u8 reserved; - struct ieee80211_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM]; + struct libipw_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM]; } __attribute__ ((packed)); -struct ieee80211_qos_parameters { +struct libipw_qos_parameters { __le16 cw_min[QOS_QUEUE_NUM]; __le16 cw_max[QOS_QUEUE_NUM]; u8 aifs[QOS_QUEUE_NUM]; @@ -576,107 +577,107 @@ struct ieee80211_qos_parameters { __le16 tx_op_limit[QOS_QUEUE_NUM]; } __attribute__ ((packed)); -struct ieee80211_qos_data { - struct ieee80211_qos_parameters parameters; +struct libipw_qos_data { + struct libipw_qos_parameters parameters; int active; int supported; u8 param_count; u8 old_param_count; }; -struct ieee80211_tim_parameters { +struct libipw_tim_parameters { u8 tim_count; u8 tim_period; } __attribute__ ((packed)); /*******************************************************/ -enum { /* ieee80211_basic_report.map */ - IEEE80211_BASIC_MAP_BSS = (1 << 0), - IEEE80211_BASIC_MAP_OFDM = (1 << 1), - IEEE80211_BASIC_MAP_UNIDENTIFIED = (1 << 2), - IEEE80211_BASIC_MAP_RADAR = (1 << 3), - IEEE80211_BASIC_MAP_UNMEASURED = (1 << 4), +enum { /* libipw_basic_report.map */ + LIBIPW_BASIC_MAP_BSS = (1 << 0), + LIBIPW_BASIC_MAP_OFDM = (1 << 1), + LIBIPW_BASIC_MAP_UNIDENTIFIED = (1 << 2), + LIBIPW_BASIC_MAP_RADAR = (1 << 3), + LIBIPW_BASIC_MAP_UNMEASURED = (1 << 4), /* Bits 5-7 are reserved */ }; -struct ieee80211_basic_report { +struct libipw_basic_report { u8 channel; __le64 start_time; __le16 duration; u8 map; } __attribute__ ((packed)); -enum { /* ieee80211_measurement_request.mode */ +enum { /* libipw_measurement_request.mode */ /* Bit 0 is reserved */ - IEEE80211_MEASUREMENT_ENABLE = (1 << 1), - IEEE80211_MEASUREMENT_REQUEST = (1 << 2), - IEEE80211_MEASUREMENT_REPORT = (1 << 3), + LIBIPW_MEASUREMENT_ENABLE = (1 << 1), + LIBIPW_MEASUREMENT_REQUEST = (1 << 2), + LIBIPW_MEASUREMENT_REPORT = (1 << 3), /* Bits 4-7 are reserved */ }; enum { - IEEE80211_REPORT_BASIC = 0, /* required */ - IEEE80211_REPORT_CCA = 1, /* optional */ - IEEE80211_REPORT_RPI = 2, /* optional */ + LIBIPW_REPORT_BASIC = 0, /* required */ + LIBIPW_REPORT_CCA = 1, /* optional */ + LIBIPW_REPORT_RPI = 2, /* optional */ /* 3-255 reserved */ }; -struct ieee80211_measurement_params { +struct libipw_measurement_params { u8 channel; __le64 start_time; __le16 duration; } __attribute__ ((packed)); -struct ieee80211_measurement_request { - struct ieee80211_info_element ie; +struct libipw_measurement_request { + struct libipw_info_element ie; u8 token; u8 mode; u8 type; - struct ieee80211_measurement_params params[0]; + struct libipw_measurement_params params[0]; } __attribute__ ((packed)); -struct ieee80211_measurement_report { - struct ieee80211_info_element ie; +struct libipw_measurement_report { + struct libipw_info_element ie; u8 token; u8 mode; u8 type; union { - struct ieee80211_basic_report basic[0]; + struct libipw_basic_report basic[0]; } u; } __attribute__ ((packed)); -struct ieee80211_tpc_report { +struct libipw_tpc_report { u8 transmit_power; u8 link_margin; } __attribute__ ((packed)); -struct ieee80211_channel_map { +struct libipw_channel_map { u8 channel; u8 map; } __attribute__ ((packed)); -struct ieee80211_ibss_dfs { - struct ieee80211_info_element ie; +struct libipw_ibss_dfs { + struct libipw_info_element ie; u8 owner[ETH_ALEN]; u8 recovery_interval; - struct ieee80211_channel_map channel_map[0]; + struct libipw_channel_map channel_map[0]; }; -struct ieee80211_csa { +struct libipw_csa { u8 mode; u8 channel; u8 count; } __attribute__ ((packed)); -struct ieee80211_quiet { +struct libipw_quiet { u8 count; u8 period; u8 duration; u8 offset; } __attribute__ ((packed)); -struct ieee80211_network { +struct libipw_network { /* These entries are used to identify a unique network */ u8 bssid[ETH_ALEN]; u8 channel; @@ -684,10 +685,10 @@ struct ieee80211_network { u8 ssid[IW_ESSID_MAX_SIZE + 1]; u8 ssid_len; - struct ieee80211_qos_data qos_data; + struct libipw_qos_data qos_data; /* These are network statistics */ - struct ieee80211_rx_stats stats; + struct libipw_rx_stats stats; u16 capability; u8 rates[MAX_RATES_LENGTH]; u8 rates_len; @@ -706,7 +707,7 @@ struct ieee80211_network { size_t wpa_ie_len; u8 rsn_ie[MAX_WPA_IE_LEN]; size_t rsn_ie_len; - struct ieee80211_tim_parameters tim; + struct libipw_tim_parameters tim; /* 802.11h info */ @@ -714,86 +715,89 @@ struct ieee80211_network { u8 power_constraint; /* TPC Report - mandatory if spctrm mgmt required */ - struct ieee80211_tpc_report tpc_report; + struct libipw_tpc_report tpc_report; /* IBSS DFS - mandatory if spctrm mgmt required and IBSS * NOTE: This is variable length and so must be allocated dynamically */ - struct ieee80211_ibss_dfs *ibss_dfs; + struct libipw_ibss_dfs *ibss_dfs; /* Channel Switch Announcement - optional if spctrm mgmt required */ - struct ieee80211_csa csa; + struct libipw_csa csa; /* Quiet - optional if spctrm mgmt required */ - struct ieee80211_quiet quiet; + struct libipw_quiet quiet; struct list_head list; }; -enum ieee80211_state { - IEEE80211_UNINITIALIZED = 0, - IEEE80211_INITIALIZED, - IEEE80211_ASSOCIATING, - IEEE80211_ASSOCIATED, - IEEE80211_AUTHENTICATING, - IEEE80211_AUTHENTICATED, - IEEE80211_SHUTDOWN +enum libipw_state { + LIBIPW_UNINITIALIZED = 0, + LIBIPW_INITIALIZED, + LIBIPW_ASSOCIATING, + LIBIPW_ASSOCIATED, + LIBIPW_AUTHENTICATING, + LIBIPW_AUTHENTICATED, + LIBIPW_SHUTDOWN }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) #define DEFAULT_FTS 2346 -#define CFG_IEEE80211_RESERVE_FCS (1<<0) -#define CFG_IEEE80211_COMPUTE_FCS (1<<1) -#define CFG_IEEE80211_RTS (1<<2) +#define CFG_LIBIPW_RESERVE_FCS (1<<0) +#define CFG_LIBIPW_COMPUTE_FCS (1<<1) +#define CFG_LIBIPW_RTS (1<<2) -#define IEEE80211_24GHZ_MIN_CHANNEL 1 -#define IEEE80211_24GHZ_MAX_CHANNEL 14 -#define IEEE80211_24GHZ_CHANNELS (IEEE80211_24GHZ_MAX_CHANNEL - \ - IEEE80211_24GHZ_MIN_CHANNEL + 1) +#define LIBIPW_24GHZ_MIN_CHANNEL 1 +#define LIBIPW_24GHZ_MAX_CHANNEL 14 +#define LIBIPW_24GHZ_CHANNELS (LIBIPW_24GHZ_MAX_CHANNEL - \ + LIBIPW_24GHZ_MIN_CHANNEL + 1) -#define IEEE80211_52GHZ_MIN_CHANNEL 34 -#define IEEE80211_52GHZ_MAX_CHANNEL 165 -#define IEEE80211_52GHZ_CHANNELS (IEEE80211_52GHZ_MAX_CHANNEL - \ - IEEE80211_52GHZ_MIN_CHANNEL + 1) +#define LIBIPW_52GHZ_MIN_CHANNEL 34 +#define LIBIPW_52GHZ_MAX_CHANNEL 165 +#define LIBIPW_52GHZ_CHANNELS (LIBIPW_52GHZ_MAX_CHANNEL - \ + LIBIPW_52GHZ_MIN_CHANNEL + 1) enum { - IEEE80211_CH_PASSIVE_ONLY = (1 << 0), - IEEE80211_CH_80211H_RULES = (1 << 1), - IEEE80211_CH_B_ONLY = (1 << 2), - IEEE80211_CH_NO_IBSS = (1 << 3), - IEEE80211_CH_UNIFORM_SPREADING = (1 << 4), - IEEE80211_CH_RADAR_DETECT = (1 << 5), - IEEE80211_CH_INVALID = (1 << 6), + LIBIPW_CH_PASSIVE_ONLY = (1 << 0), + LIBIPW_CH_80211H_RULES = (1 << 1), + LIBIPW_CH_B_ONLY = (1 << 2), + LIBIPW_CH_NO_IBSS = (1 << 3), + LIBIPW_CH_UNIFORM_SPREADING = (1 << 4), + LIBIPW_CH_RADAR_DETECT = (1 << 5), + LIBIPW_CH_INVALID = (1 << 6), }; -struct ieee80211_channel { +struct libipw_channel { u32 freq; /* in MHz */ u8 channel; u8 flags; u8 max_power; /* in dBm */ }; -struct ieee80211_geo { +struct libipw_geo { u8 name[4]; u8 bg_channels; u8 a_channels; - struct ieee80211_channel bg[IEEE80211_24GHZ_CHANNELS]; - struct ieee80211_channel a[IEEE80211_52GHZ_CHANNELS]; + struct libipw_channel bg[LIBIPW_24GHZ_CHANNELS]; + struct libipw_channel a[LIBIPW_52GHZ_CHANNELS]; }; -struct ieee80211_device { +struct libipw_device { struct net_device *dev; - struct ieee80211_security sec; + struct wireless_dev wdev; + struct libipw_security sec; /* Bookkeeping structures */ - struct ieee80211_stats ieee_stats; + struct libipw_stats ieee_stats; - struct ieee80211_geo geo; + struct libipw_geo geo; + struct ieee80211_supported_band bg_band; + struct ieee80211_supported_band a_band; /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; - struct ieee80211_network *networks; + struct libipw_network *networks; int scans; int scan_age; @@ -840,7 +844,7 @@ struct ieee80211_device { * with RX of broad/multicast frames */ /* Fragmentation structures */ - struct ieee80211_frag_entry frag_cache[IEEE80211_FRAG_CACHE_LEN]; + struct libipw_frag_entry frag_cache[LIBIPW_FRAG_CACHE_LEN]; unsigned int frag_next_idx; u16 fts; /* Fragmentation Threshold */ u16 rts; /* RTS threshold */ @@ -848,7 +852,7 @@ struct ieee80211_device { /* Association info */ u8 bssid[ETH_ALEN]; - enum ieee80211_state state; + enum libipw_state state; int mode; /* A, B, G */ int modulation; /* CCK, OFDM */ @@ -862,43 +866,43 @@ struct ieee80211_device { /* Callback functions */ void (*set_security) (struct net_device * dev, - struct ieee80211_security * sec); - int (*hard_start_xmit) (struct ieee80211_txb * txb, + struct libipw_security * sec); + int (*hard_start_xmit) (struct libipw_txb * txb, struct net_device * dev, int pri); int (*reset_port) (struct net_device * dev); int (*is_queue_full) (struct net_device * dev, int pri); int (*handle_management) (struct net_device * dev, - struct ieee80211_network * network, u16 type); + struct libipw_network * network, u16 type); int (*is_qos_active) (struct net_device *dev, struct sk_buff *skb); /* Typical STA methods */ int (*handle_auth) (struct net_device * dev, - struct ieee80211_auth * auth); + struct libipw_auth * auth); int (*handle_deauth) (struct net_device * dev, - struct ieee80211_deauth * auth); + struct libipw_deauth * auth); int (*handle_action) (struct net_device * dev, - struct ieee80211_action * action, - struct ieee80211_rx_stats * stats); + struct libipw_action * action, + struct libipw_rx_stats * stats); int (*handle_disassoc) (struct net_device * dev, - struct ieee80211_disassoc * assoc); + struct libipw_disassoc * assoc); int (*handle_beacon) (struct net_device * dev, - struct ieee80211_beacon * beacon, - struct ieee80211_network * network); + struct libipw_beacon * beacon, + struct libipw_network * network); int (*handle_probe_response) (struct net_device * dev, - struct ieee80211_probe_response * resp, - struct ieee80211_network * network); + struct libipw_probe_response * resp, + struct libipw_network * network); int (*handle_probe_request) (struct net_device * dev, - struct ieee80211_probe_request * req, - struct ieee80211_rx_stats * stats); + struct libipw_probe_request * req, + struct libipw_rx_stats * stats); int (*handle_assoc_response) (struct net_device * dev, - struct ieee80211_assoc_response * resp, - struct ieee80211_network * network); + struct libipw_assoc_response * resp, + struct libipw_network * network); /* Typical AP methods */ int (*handle_assoc_request) (struct net_device * dev); int (*handle_reassoc_request) (struct net_device * dev, - struct ieee80211_reassoc_request * req); + struct libipw_reassoc_request * req); /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ @@ -910,12 +914,12 @@ struct ieee80211_device { #define IEEE_G (1<<2) #define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) -static inline void *ieee80211_priv(struct net_device *dev) +static inline void *libipw_priv(struct net_device *dev) { - return ((struct ieee80211_device *)netdev_priv(dev))->priv; + return ((struct libipw_device *)netdev_priv(dev))->priv; } -static inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, +static inline int libipw_is_valid_mode(struct libipw_device *ieee, int mode) { /* @@ -925,32 +929,32 @@ static inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, * */ if ((mode & IEEE_A) && - (ieee->modulation & IEEE80211_OFDM_MODULATION) && - (ieee->freq_band & IEEE80211_52GHZ_BAND)) + (ieee->modulation & LIBIPW_OFDM_MODULATION) && + (ieee->freq_band & LIBIPW_52GHZ_BAND)) return 1; if ((mode & IEEE_G) && - (ieee->modulation & IEEE80211_OFDM_MODULATION) && - (ieee->freq_band & IEEE80211_24GHZ_BAND)) + (ieee->modulation & LIBIPW_OFDM_MODULATION) && + (ieee->freq_band & LIBIPW_24GHZ_BAND)) return 1; if ((mode & IEEE_B) && - (ieee->modulation & IEEE80211_CCK_MODULATION) && - (ieee->freq_band & IEEE80211_24GHZ_BAND)) + (ieee->modulation & LIBIPW_CCK_MODULATION) && + (ieee->freq_band & LIBIPW_24GHZ_BAND)) return 1; return 0; } -static inline int ieee80211_get_hdrlen(u16 fc) +static inline int libipw_get_hdrlen(u16 fc) { - int hdrlen = IEEE80211_3ADDR_LEN; + int hdrlen = LIBIPW_3ADDR_LEN; u16 stype = WLAN_FC_GET_STYPE(fc); switch (WLAN_FC_GET_TYPE(fc)) { case IEEE80211_FTYPE_DATA: if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) - hdrlen = IEEE80211_4ADDR_LEN; + hdrlen = LIBIPW_4ADDR_LEN; if (stype & IEEE80211_STYPE_QOS_DATA) hdrlen += 2; break; @@ -958,10 +962,10 @@ static inline int ieee80211_get_hdrlen(u16 fc) switch (WLAN_FC_GET_STYPE(fc)) { case IEEE80211_STYPE_CTS: case IEEE80211_STYPE_ACK: - hdrlen = IEEE80211_1ADDR_LEN; + hdrlen = LIBIPW_1ADDR_LEN; break; default: - hdrlen = IEEE80211_2ADDR_LEN; + hdrlen = LIBIPW_2ADDR_LEN; break; } break; @@ -970,118 +974,118 @@ static inline int ieee80211_get_hdrlen(u16 fc) return hdrlen; } -static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr) +static inline u8 *libipw_get_payload(struct ieee80211_hdr *hdr) { - switch (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control))) { - case IEEE80211_1ADDR_LEN: - return ((struct ieee80211_hdr_1addr *)hdr)->payload; - case IEEE80211_2ADDR_LEN: - return ((struct ieee80211_hdr_2addr *)hdr)->payload; - case IEEE80211_3ADDR_LEN: - return ((struct ieee80211_hdr_3addr *)hdr)->payload; - case IEEE80211_4ADDR_LEN: - return ((struct ieee80211_hdr_4addr *)hdr)->payload; + switch (libipw_get_hdrlen(le16_to_cpu(hdr->frame_control))) { + case LIBIPW_1ADDR_LEN: + return ((struct libipw_hdr_1addr *)hdr)->payload; + case LIBIPW_2ADDR_LEN: + return ((struct libipw_hdr_2addr *)hdr)->payload; + case LIBIPW_3ADDR_LEN: + return ((struct libipw_hdr_3addr *)hdr)->payload; + case LIBIPW_4ADDR_LEN: + return ((struct libipw_hdr_4addr *)hdr)->payload; } return NULL; } -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int libipw_is_ofdm_rate(u8 rate) { - switch (rate & ~IEEE80211_BASIC_RATE_MASK) { - case IEEE80211_OFDM_RATE_6MB: - case IEEE80211_OFDM_RATE_9MB: - case IEEE80211_OFDM_RATE_12MB: - case IEEE80211_OFDM_RATE_18MB: - case IEEE80211_OFDM_RATE_24MB: - case IEEE80211_OFDM_RATE_36MB: - case IEEE80211_OFDM_RATE_48MB: - case IEEE80211_OFDM_RATE_54MB: + switch (rate & ~LIBIPW_BASIC_RATE_MASK) { + case LIBIPW_OFDM_RATE_6MB: + case LIBIPW_OFDM_RATE_9MB: + case LIBIPW_OFDM_RATE_12MB: + case LIBIPW_OFDM_RATE_18MB: + case LIBIPW_OFDM_RATE_24MB: + case LIBIPW_OFDM_RATE_36MB: + case LIBIPW_OFDM_RATE_48MB: + case LIBIPW_OFDM_RATE_54MB: return 1; } return 0; } -static inline int ieee80211_is_cck_rate(u8 rate) +static inline int libipw_is_cck_rate(u8 rate) { - switch (rate & ~IEEE80211_BASIC_RATE_MASK) { - case IEEE80211_CCK_RATE_1MB: - case IEEE80211_CCK_RATE_2MB: - case IEEE80211_CCK_RATE_5MB: - case IEEE80211_CCK_RATE_11MB: + switch (rate & ~LIBIPW_BASIC_RATE_MASK) { + case LIBIPW_CCK_RATE_1MB: + case LIBIPW_CCK_RATE_2MB: + case LIBIPW_CCK_RATE_5MB: + case LIBIPW_CCK_RATE_11MB: return 1; } return 0; } /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); -extern int ieee80211_change_mtu(struct net_device *dev, int new_mtu); +extern void free_ieee80211(struct net_device *dev, int monitor); +extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); +extern int libipw_change_mtu(struct net_device *dev, int new_mtu); -extern void ieee80211_networks_age(struct ieee80211_device *ieee, +extern void libipw_networks_age(struct libipw_device *ieee, unsigned long age_secs); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int libipw_set_encryption(struct libipw_device *ieee); -/* ieee80211_tx.c */ -extern int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +/* libipw_tx.c */ +extern int libipw_xmit(struct sk_buff *skb, struct net_device *dev); +extern void libipw_txb_free(struct libipw_txb *); -/* ieee80211_rx.c */ -extern void ieee80211_rx_any(struct ieee80211_device *ieee, - struct sk_buff *skb, struct ieee80211_rx_stats *stats); -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, - struct ieee80211_rx_stats *rx_stats); +/* libipw_rx.c */ +extern void libipw_rx_any(struct libipw_device *ieee, + struct sk_buff *skb, struct libipw_rx_stats *stats); +extern int libipw_rx(struct libipw_device *ieee, struct sk_buff *skb, + struct libipw_rx_stats *rx_stats); /* make sure to set stats->len */ -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, - struct ieee80211_hdr_4addr *header, - struct ieee80211_rx_stats *stats); -extern void ieee80211_network_reset(struct ieee80211_network *network); +extern void libipw_rx_mgt(struct libipw_device *ieee, + struct libipw_hdr_4addr *header, + struct libipw_rx_stats *stats); +extern void libipw_network_reset(struct libipw_network *network); -/* ieee80211_geo.c */ -extern const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device +/* libipw_geo.c */ +extern const struct libipw_geo *libipw_get_geo(struct libipw_device *ieee); -extern int ieee80211_set_geo(struct ieee80211_device *ieee, - const struct ieee80211_geo *geo); +extern int libipw_set_geo(struct libipw_device *ieee, + const struct libipw_geo *geo); -extern int ieee80211_is_valid_channel(struct ieee80211_device *ieee, +extern int libipw_is_valid_channel(struct libipw_device *ieee, u8 channel); -extern int ieee80211_channel_to_index(struct ieee80211_device *ieee, +extern int libipw_channel_to_index(struct libipw_device *ieee, u8 channel); -extern u8 ieee80211_freq_to_channel(struct ieee80211_device *ieee, u32 freq); -extern u8 ieee80211_get_channel_flags(struct ieee80211_device *ieee, +extern u8 libipw_freq_to_channel(struct libipw_device *ieee, u32 freq); +extern u8 libipw_get_channel_flags(struct libipw_device *ieee, u8 channel); -extern const struct ieee80211_channel *ieee80211_get_channel(struct - ieee80211_device +extern const struct libipw_channel *libipw_get_channel(struct + libipw_device *ieee, u8 channel); -extern u32 ieee80211_channel_to_freq(struct ieee80211_device * ieee, +extern u32 libipw_channel_to_freq(struct libipw_device * ieee, u8 channel); -/* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +/* libipw_wx.c */ +extern int libipw_wx_get_scan(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int libipw_wx_set_encode(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int libipw_wx_get_encode(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, +extern int libipw_wx_set_encodeext(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee, +extern int libipw_wx_get_encodeext(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -static inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +static inline void libipw_increment_scans(struct libipw_device *ieee) { ieee->scans++; } -static inline int ieee80211_get_scans(struct ieee80211_device *ieee) +static inline int libipw_get_scans(struct libipw_device *ieee) { return ieee->scans; } -#endif /* IEEE80211_H */ +#endif /* LIBIPW_H */ diff --git a/drivers/net/wireless/ipw2x00/libipw_geo.c b/drivers/net/wireless/ipw2x00/libipw_geo.c index 9dfbb87..65e8c17 100644 --- a/drivers/net/wireless/ipw2x00/libipw_geo.c +++ b/drivers/net/wireless/ipw2x00/libipw_geo.c @@ -19,7 +19,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ******************************************************************************/ @@ -41,9 +41,9 @@ #include <linux/etherdevice.h> #include <asm/uaccess.h> -#include "ieee80211.h" +#include "libipw.h" -int ieee80211_is_valid_channel(struct ieee80211_device *ieee, u8 channel) +int libipw_is_valid_channel(struct libipw_device *ieee, u8 channel) { int i; @@ -52,27 +52,27 @@ int ieee80211_is_valid_channel(struct ieee80211_device *ieee, u8 channel) if (ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0) return 0; - if (ieee->freq_band & IEEE80211_24GHZ_BAND) + if (ieee->freq_band & LIBIPW_24GHZ_BAND) for (i = 0; i < ieee->geo.bg_channels; i++) /* NOTE: If G mode is currently supported but * this is a B only channel, we don't see it * as valid. */ if ((ieee->geo.bg[i].channel == channel) && - !(ieee->geo.bg[i].flags & IEEE80211_CH_INVALID) && + !(ieee->geo.bg[i].flags & LIBIPW_CH_INVALID) && (!(ieee->mode & IEEE_G) || - !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY))) - return IEEE80211_24GHZ_BAND; + !(ieee->geo.bg[i].flags & LIBIPW_CH_B_ONLY))) + return LIBIPW_24GHZ_BAND; - if (ieee->freq_band & IEEE80211_52GHZ_BAND) + if (ieee->freq_band & LIBIPW_52GHZ_BAND) for (i = 0; i < ieee->geo.a_channels; i++) if ((ieee->geo.a[i].channel == channel) && - !(ieee->geo.a[i].flags & IEEE80211_CH_INVALID)) - return IEEE80211_52GHZ_BAND; + !(ieee->geo.a[i].flags & LIBIPW_CH_INVALID)) + return LIBIPW_52GHZ_BAND; return 0; } -int ieee80211_channel_to_index(struct ieee80211_device *ieee, u8 channel) +int libipw_channel_to_index(struct libipw_device *ieee, u8 channel) { int i; @@ -81,12 +81,12 @@ int ieee80211_channel_to_index(struct ieee80211_device *ieee, u8 channel) if (ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0) return -1; - if (ieee->freq_band & IEEE80211_24GHZ_BAND) + if (ieee->freq_band & LIBIPW_24GHZ_BAND) for (i = 0; i < ieee->geo.bg_channels; i++) if (ieee->geo.bg[i].channel == channel) return i; - if (ieee->freq_band & IEEE80211_52GHZ_BAND) + if (ieee->freq_band & LIBIPW_52GHZ_BAND) for (i = 0; i < ieee->geo.a_channels; i++) if (ieee->geo.a[i].channel == channel) return i; @@ -94,22 +94,22 @@ int ieee80211_channel_to_index(struct ieee80211_device *ieee, u8 channel) return -1; } -u32 ieee80211_channel_to_freq(struct ieee80211_device * ieee, u8 channel) +u32 libipw_channel_to_freq(struct libipw_device * ieee, u8 channel) { - const struct ieee80211_channel * ch; + const struct libipw_channel * ch; /* Driver needs to initialize the geography map before using * these helper functions */ if (ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0) return 0; - ch = ieee80211_get_channel(ieee, channel); + ch = libipw_get_channel(ieee, channel); if (!ch->channel) return 0; return ch->freq; } -u8 ieee80211_freq_to_channel(struct ieee80211_device * ieee, u32 freq) +u8 libipw_freq_to_channel(struct libipw_device * ieee, u32 freq) { int i; @@ -120,12 +120,12 @@ u8 ieee80211_freq_to_channel(struct ieee80211_device * ieee, u32 freq) freq /= 100000; - if (ieee->freq_band & IEEE80211_24GHZ_BAND) + if (ieee->freq_band & LIBIPW_24GHZ_BAND) for (i = 0; i < ieee->geo.bg_channels; i++) if (ieee->geo.bg[i].freq == freq) return ieee->geo.bg[i].channel; - if (ieee->freq_band & IEEE80211_52GHZ_BAND) + if (ieee->freq_band & LIBIPW_52GHZ_BAND) for (i = 0; i < ieee->geo.a_channels; i++) if (ieee->geo.a[i].freq == freq) return ieee->geo.a[i].channel; @@ -133,63 +133,63 @@ u8 ieee80211_freq_to_channel(struct ieee80211_device * ieee, u32 freq) return 0; } -int ieee80211_set_geo(struct ieee80211_device *ieee, - const struct ieee80211_geo *geo) +int libipw_set_geo(struct libipw_device *ieee, + const struct libipw_geo *geo) { memcpy(ieee->geo.name, geo->name, 3); ieee->geo.name[3] = '\0'; ieee->geo.bg_channels = geo->bg_channels; ieee->geo.a_channels = geo->a_channels; memcpy(ieee->geo.bg, geo->bg, geo->bg_channels * - sizeof(struct ieee80211_channel)); + sizeof(struct libipw_channel)); memcpy(ieee->geo.a, geo->a, ieee->geo.a_channels * - sizeof(struct ieee80211_channel)); + sizeof(struct libipw_channel)); return 0; } -const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device *ieee) +const struct libipw_geo *libipw_get_geo(struct libipw_device *ieee) { return &ieee->geo; } -u8 ieee80211_get_channel_flags(struct ieee80211_device * ieee, u8 channel) +u8 libipw_get_channel_flags(struct libipw_device * ieee, u8 channel) { - int index = ieee80211_channel_to_index(ieee, channel); + int index = libipw_channel_to_index(ieee, channel); if (index == -1) - return IEEE80211_CH_INVALID; + return LIBIPW_CH_INVALID; - if (channel <= IEEE80211_24GHZ_CHANNELS) + if (channel <= LIBIPW_24GHZ_CHANNELS) return ieee->geo.bg[index].flags; return ieee->geo.a[index].flags; } -static const struct ieee80211_channel bad_channel = { +static const struct libipw_channel bad_channel = { .channel = 0, - .flags = IEEE80211_CH_INVALID, + .flags = LIBIPW_CH_INVALID, .max_power = 0, }; -const struct ieee80211_channel *ieee80211_get_channel(struct ieee80211_device +const struct libipw_channel *libipw_get_channel(struct libipw_device *ieee, u8 channel) { - int index = ieee80211_channel_to_index(ieee, channel); + int index = libipw_channel_to_index(ieee, channel); if (index == -1) return &bad_channel; - if (channel <= IEEE80211_24GHZ_CHANNELS) + if (channel <= LIBIPW_24GHZ_CHANNELS) return &ieee->geo.bg[index]; return &ieee->geo.a[index]; } -EXPORT_SYMBOL(ieee80211_get_channel); -EXPORT_SYMBOL(ieee80211_get_channel_flags); -EXPORT_SYMBOL(ieee80211_is_valid_channel); -EXPORT_SYMBOL(ieee80211_freq_to_channel); -EXPORT_SYMBOL(ieee80211_channel_to_freq); -EXPORT_SYMBOL(ieee80211_channel_to_index); -EXPORT_SYMBOL(ieee80211_set_geo); -EXPORT_SYMBOL(ieee80211_get_geo); +EXPORT_SYMBOL(libipw_get_channel); +EXPORT_SYMBOL(libipw_get_channel_flags); +EXPORT_SYMBOL(libipw_is_valid_channel); +EXPORT_SYMBOL(libipw_freq_to_channel); +EXPORT_SYMBOL(libipw_channel_to_freq); +EXPORT_SYMBOL(libipw_channel_to_index); +EXPORT_SYMBOL(libipw_set_geo); +EXPORT_SYMBOL(libipw_get_geo); diff --git a/drivers/net/wireless/ipw2x00/libipw_module.c b/drivers/net/wireless/ipw2x00/libipw_module.c index 8ce6e96..a0e9f6a 100644 --- a/drivers/net/wireless/ipw2x00/libipw_module.c +++ b/drivers/net/wireless/ipw2x00/libipw_module.c @@ -25,7 +25,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -50,11 +50,11 @@ #include <net/net_namespace.h> #include <net/arp.h> -#include "ieee80211.h" +#include "libipw.h" #define DRV_DESCRIPTION "802.11 data/management/control stack" #define DRV_NAME "ieee80211" -#define DRV_VERSION IEEE80211_VERSION +#define DRV_VERSION LIBIPW_VERSION #define DRV_COPYRIGHT "Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com>" MODULE_VERSION(DRV_VERSION); @@ -62,13 +62,16 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_COPYRIGHT); MODULE_LICENSE("GPL"); -static int ieee80211_networks_allocate(struct ieee80211_device *ieee) +struct cfg80211_ops libipw_config_ops = { }; +void *libipw_wiphy_privid = &libipw_wiphy_privid; + +static int libipw_networks_allocate(struct libipw_device *ieee) { if (ieee->networks) return 0; ieee->networks = - kzalloc(MAX_NETWORK_COUNT * sizeof(struct ieee80211_network), + kzalloc(MAX_NETWORK_COUNT * sizeof(struct libipw_network), GFP_KERNEL); if (!ieee->networks) { printk(KERN_WARNING "%s: Out of memory allocating beacons\n", @@ -79,7 +82,7 @@ static int ieee80211_networks_allocate(struct ieee80211_device *ieee) return 0; } -void ieee80211_network_reset(struct ieee80211_network *network) +void libipw_network_reset(struct libipw_network *network) { if (!network) return; @@ -90,7 +93,7 @@ void ieee80211_network_reset(struct ieee80211_network *network) } } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void libipw_networks_free(struct libipw_device *ieee) { int i; @@ -105,10 +108,10 @@ static inline void ieee80211_networks_free(struct ieee80211_device *ieee) ieee->networks = NULL; } -void ieee80211_networks_age(struct ieee80211_device *ieee, +void libipw_networks_age(struct libipw_device *ieee, unsigned long age_secs) { - struct ieee80211_network *network = NULL; + struct libipw_network *network = NULL; unsigned long flags; unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC); @@ -118,9 +121,9 @@ void ieee80211_networks_age(struct ieee80211_device *ieee, } spin_unlock_irqrestore(&ieee->lock, flags); } -EXPORT_SYMBOL(ieee80211_networks_age); +EXPORT_SYMBOL(libipw_networks_age); -static void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static void libipw_networks_initialize(struct libipw_device *ieee) { int i; @@ -131,38 +134,59 @@ static void ieee80211_networks_initialize(struct ieee80211_device *ieee) &ieee->network_free_list); } -int ieee80211_change_mtu(struct net_device *dev, int new_mtu) +int libipw_change_mtu(struct net_device *dev, int new_mtu) { - if ((new_mtu < 68) || (new_mtu > IEEE80211_DATA_LEN)) + if ((new_mtu < 68) || (new_mtu > LIBIPW_DATA_LEN)) return -EINVAL; dev->mtu = new_mtu; return 0; } -EXPORT_SYMBOL(ieee80211_change_mtu); +EXPORT_SYMBOL(libipw_change_mtu); -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211(int sizeof_priv, int monitor) { - struct ieee80211_device *ieee; + struct libipw_device *ieee; struct net_device *dev; int err; - IEEE80211_DEBUG_INFO("Initializing...\n"); + LIBIPW_DEBUG_INFO("Initializing...\n"); - dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv); + dev = alloc_etherdev(sizeof(struct libipw_device) + sizeof_priv); if (!dev) { - IEEE80211_ERROR("Unable to allocate network device.\n"); + LIBIPW_ERROR("Unable to allocate network device.\n"); goto failed; } ieee = netdev_priv(dev); ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + if (!monitor) { + ieee->wdev.wiphy = wiphy_new(&libipw_config_ops, 0); + if (!ieee->wdev.wiphy) { + LIBIPW_ERROR("Unable to allocate wiphy.\n"); + goto failed_free_netdev; + } + + ieee->dev->ieee80211_ptr = &ieee->wdev; + ieee->wdev.iftype = NL80211_IFTYPE_STATION; + + /* Fill-out wiphy structure bits we know... Not enough info + here to call set_wiphy_dev or set MAC address or channel info + -- have to do that in ->ndo_init... */ + ieee->wdev.wiphy->privid = libipw_wiphy_privid; + + ieee->wdev.wiphy->max_scan_ssids = 1; + ieee->wdev.wiphy->max_scan_ie_len = 0; + ieee->wdev.wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) + | BIT(NL80211_IFTYPE_ADHOC); + } + + err = libipw_networks_allocate(ieee); if (err) { - IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); - goto failed_free_netdev; + LIBIPW_ERROR("Unable to allocate beacon storage: %d\n", err); + goto failed_free_wiphy; } - ieee80211_networks_initialize(ieee); + libipw_networks_initialize(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -193,33 +217,45 @@ struct net_device *alloc_ieee80211(int sizeof_priv) return dev; +failed_free_wiphy: + if (!monitor) + wiphy_free(ieee->wdev.wiphy); failed_free_netdev: free_netdev(dev); failed: return NULL; } -void free_ieee80211(struct net_device *dev) +void free_ieee80211(struct net_device *dev, int monitor) { - struct ieee80211_device *ieee = netdev_priv(dev); + struct libipw_device *ieee = netdev_priv(dev); lib80211_crypt_info_free(&ieee->crypt_info); - ieee80211_networks_free(ieee); + libipw_networks_free(ieee); + + /* free cfg80211 resources */ + if (!monitor) { + wiphy_unregister(ieee->wdev.wiphy); + kfree(ieee->a_band.channels); + kfree(ieee->bg_band.channels); + wiphy_free(ieee->wdev.wiphy); + } + free_netdev(dev); } #ifdef CONFIG_LIBIPW_DEBUG static int debug = 0; -u32 ieee80211_debug_level = 0; -EXPORT_SYMBOL_GPL(ieee80211_debug_level); -static struct proc_dir_entry *ieee80211_proc = NULL; +u32 libipw_debug_level = 0; +EXPORT_SYMBOL_GPL(libipw_debug_level); +static struct proc_dir_entry *libipw_proc = NULL; static int show_debug_level(char *page, char **start, off_t offset, int count, int *eof, void *data) { - return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); + return snprintf(page, count, "0x%08X\n", libipw_debug_level); } static int store_debug_level(struct file *file, const char __user * buffer, @@ -236,29 +272,29 @@ static int store_debug_level(struct file *file, const char __user * buffer, printk(KERN_INFO DRV_NAME ": %s is not in hex or decimal form.\n", buf); else - ieee80211_debug_level = val; + libipw_debug_level = val; return strnlen(buf, len); } #endif /* CONFIG_LIBIPW_DEBUG */ -static int __init ieee80211_init(void) +static int __init libipw_init(void) { #ifdef CONFIG_LIBIPW_DEBUG struct proc_dir_entry *e; - ieee80211_debug_level = debug; - ieee80211_proc = proc_mkdir(DRV_NAME, init_net.proc_net); - if (ieee80211_proc == NULL) { - IEEE80211_ERROR("Unable to create " DRV_NAME + libipw_debug_level = debug; + libipw_proc = proc_mkdir(DRV_NAME, init_net.proc_net); + if (libipw_proc == NULL) { + LIBIPW_ERROR("Unable to create " DRV_NAME " proc directory\n"); return -EIO; } e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR, - ieee80211_proc); + libipw_proc); if (!e) { remove_proc_entry(DRV_NAME, init_net.proc_net); - ieee80211_proc = NULL; + libipw_proc = NULL; return -EIO; } e->read_proc = show_debug_level; @@ -272,13 +308,13 @@ static int __init ieee80211_init(void) return 0; } -static void __exit ieee80211_exit(void) +static void __exit libipw_exit(void) { #ifdef CONFIG_LIBIPW_DEBUG - if (ieee80211_proc) { - remove_proc_entry("debug_level", ieee80211_proc); + if (libipw_proc) { + remove_proc_entry("debug_level", libipw_proc); remove_proc_entry(DRV_NAME, init_net.proc_net); - ieee80211_proc = NULL; + libipw_proc = NULL; } #endif /* CONFIG_LIBIPW_DEBUG */ } @@ -289,8 +325,8 @@ module_param(debug, int, 0444); MODULE_PARM_DESC(debug, "debug output mask"); #endif /* CONFIG_LIBIPW_DEBUG */ -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(libipw_exit); +module_init(libipw_init); EXPORT_SYMBOL(alloc_ieee80211); EXPORT_SYMBOL(free_ieee80211); diff --git a/drivers/net/wireless/ipw2x00/libipw_rx.c b/drivers/net/wireless/ipw2x00/libipw_rx.c index dae4b8e..282b1f7 100644 --- a/drivers/net/wireless/ipw2x00/libipw_rx.c +++ b/drivers/net/wireless/ipw2x00/libipw_rx.c @@ -34,18 +34,18 @@ #include <net/lib80211.h> -#include "ieee80211.h" +#include "libipw.h" -static void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static void libipw_monitor_rx(struct libipw_device *ieee, struct sk_buff *skb, - struct ieee80211_rx_stats *rx_stats) + struct libipw_rx_stats *rx_stats) { struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; u16 fc = le16_to_cpu(hdr->frame_control); skb->dev = ieee->dev; skb_reset_mac_header(skb); - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, libipw_get_hdrlen(fc)); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -53,22 +53,22 @@ static void ieee80211_monitor_rx(struct ieee80211_device *ieee, } /* Called only as a tasklet (software IRQ) */ -static struct ieee80211_frag_entry *ieee80211_frag_cache_find(struct - ieee80211_device +static struct libipw_frag_entry *libipw_frag_cache_find(struct + libipw_device *ieee, unsigned int seq, unsigned int frag, u8 * src, u8 * dst) { - struct ieee80211_frag_entry *entry; + struct libipw_frag_entry *entry; int i; - for (i = 0; i < IEEE80211_FRAG_CACHE_LEN; i++) { + for (i = 0; i < LIBIPW_FRAG_CACHE_LEN; i++) { entry = &ieee->frag_cache[i]; if (entry->skb != NULL && time_after(jiffies, entry->first_frag_time + 2 * HZ)) { - IEEE80211_DEBUG_FRAG("expiring fragment cache entry " + LIBIPW_DEBUG_FRAG("expiring fragment cache entry " "seq=%u last_frag=%u\n", entry->seq, entry->last_frag); dev_kfree_skb_any(entry->skb); @@ -86,13 +86,13 @@ static struct ieee80211_frag_entry *ieee80211_frag_cache_find(struct } /* Called only as a tasklet (software IRQ) */ -static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee, - struct ieee80211_hdr_4addr *hdr) +static struct sk_buff *libipw_frag_cache_get(struct libipw_device *ieee, + struct libipw_hdr_4addr *hdr) { struct sk_buff *skb = NULL; u16 sc; unsigned int frag, seq; - struct ieee80211_frag_entry *entry; + struct libipw_frag_entry *entry; sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); @@ -101,7 +101,7 @@ static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee, if (frag == 0) { /* Reserve enough space to fit maximum frame length */ skb = dev_alloc_skb(ieee->dev->mtu + - sizeof(struct ieee80211_hdr_4addr) + + sizeof(struct libipw_hdr_4addr) + 8 /* LLC */ + 2 /* alignment */ + 8 /* WEP */ + ETH_ALEN /* WDS */ ); @@ -110,7 +110,7 @@ static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee, entry = &ieee->frag_cache[ieee->frag_next_idx]; ieee->frag_next_idx++; - if (ieee->frag_next_idx >= IEEE80211_FRAG_CACHE_LEN) + if (ieee->frag_next_idx >= LIBIPW_FRAG_CACHE_LEN) ieee->frag_next_idx = 0; if (entry->skb != NULL) @@ -125,7 +125,7 @@ static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee, } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = libipw_frag_cache_find(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -137,21 +137,21 @@ static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee, } /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, - struct ieee80211_hdr_4addr *hdr) +static int libipw_frag_cache_invalidate(struct libipw_device *ieee, + struct libipw_hdr_4addr *hdr) { u16 sc; unsigned int seq; - struct ieee80211_frag_entry *entry; + struct libipw_frag_entry *entry; sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = libipw_frag_cache_find(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { - IEEE80211_DEBUG_FRAG("could not invalidate fragment cache " + LIBIPW_DEBUG_FRAG("could not invalidate fragment cache " "entry (seq=%u)\n", seq); return -1; } @@ -161,14 +161,14 @@ static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, } #ifdef NOT_YET -/* ieee80211_rx_frame_mgtmt +/* libipw_rx_frame_mgtmt * * Responsible for handling management control frames * - * Called by ieee80211_rx */ + * Called by libipw_rx */ static int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, - struct ieee80211_rx_stats *rx_stats, u16 type, +libipw_rx_frame_mgmt(struct libipw_device *ieee, struct sk_buff *skb, + struct libipw_rx_stats *rx_stats, u16 type, u16 stype) { if (ieee->iw_mode == IW_MODE_MASTER) { @@ -176,7 +176,7 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, ieee->dev->name); return 0; /* - hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr_4addr *) + hostap_update_sta_ps(ieee, (struct hostap_libipw_hdr_4addr *) skb->data);*/ } @@ -219,26 +219,27 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ -static unsigned char rfc1042_header[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; +static unsigned char libipw_rfc1042_header[] = + { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ -static unsigned char bridge_tunnel_header[] = +static unsigned char libipw_bridge_tunnel_header[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; /* No encapsulation header if EtherType < 0x600 (=length) */ -/* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +/* Called by libipw_rx_frame_decrypt */ +static int libipw_is_eapol_frame(struct libipw_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; u16 fc, ethertype; - struct ieee80211_hdr_3addr *hdr; + struct libipw_hdr_3addr *hdr; u8 *pos; if (skb->len < 24) return 0; - hdr = (struct ieee80211_hdr_3addr *)skb->data; + hdr = (struct libipw_hdr_3addr *)skb->data; fc = le16_to_cpu(hdr->frame_ctl); /* check that the frame is unicast frame to us */ @@ -266,28 +267,28 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, return 0; } -/* Called only as a tasklet (software IRQ), by ieee80211_rx */ +/* Called only as a tasklet (software IRQ), by libipw_rx */ static int -ieee80211_rx_frame_decrypt(struct ieee80211_device *ieee, struct sk_buff *skb, +libipw_rx_frame_decrypt(struct libipw_device *ieee, struct sk_buff *skb, struct lib80211_crypt_data *crypt) { - struct ieee80211_hdr_3addr *hdr; + struct libipw_hdr_3addr *hdr; int res, hdrlen; if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) return 0; - hdr = (struct ieee80211_hdr_3addr *)skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdr = (struct libipw_hdr_3addr *)skb->data; + hdrlen = libipw_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv); atomic_dec(&crypt->refcnt); if (res < 0) { - IEEE80211_DEBUG_DROP("decryption failed (SA=%pM) res=%d\n", + LIBIPW_DEBUG_DROP("decryption failed (SA=%pM) res=%d\n", hdr->addr2, res); if (res == -2) - IEEE80211_DEBUG_DROP("Decryption failed ICV " + LIBIPW_DEBUG_DROP("Decryption failed ICV " "mismatch (key %d)\n", skb->data[hdrlen + 3] >> 6); ieee->ieee_stats.rx_discards_undecryptable++; @@ -297,20 +298,20 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device *ieee, struct sk_buff *skb, return res; } -/* Called only as a tasklet (software IRQ), by ieee80211_rx */ +/* Called only as a tasklet (software IRQ), by libipw_rx */ static int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device *ieee, +libipw_rx_frame_decrypt_msdu(struct libipw_device *ieee, struct sk_buff *skb, int keyidx, struct lib80211_crypt_data *crypt) { - struct ieee80211_hdr_3addr *hdr; + struct libipw_hdr_3addr *hdr; int res, hdrlen; if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) return 0; - hdr = (struct ieee80211_hdr_3addr *)skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdr = (struct libipw_hdr_3addr *)skb->data; + hdrlen = libipw_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -328,11 +329,11 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device *ieee, /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, - struct ieee80211_rx_stats *rx_stats) +int libipw_rx(struct libipw_device *ieee, struct sk_buff *skb, + struct libipw_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; - struct ieee80211_hdr_4addr *hdr; + struct libipw_hdr_4addr *hdr; size_t hdrlen; u16 fc, type, stype, sc; unsigned int frag; @@ -352,7 +353,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, int keyidx = 0; int can_be_decrypted = 0; - hdr = (struct ieee80211_hdr_4addr *)skb->data; + hdr = (struct libipw_hdr_4addr *)skb->data; if (skb->len < 10) { printk(KERN_INFO "%s: SKB length < 10\n", dev->name); goto rx_dropped; @@ -363,7 +364,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = libipw_get_hdrlen(fc); if (skb->len < hdrlen) { printk(KERN_INFO "%s: invalid SKB length %d\n", @@ -380,19 +381,19 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, struct iw_quality wstats; wstats.updated = 0; - if (rx_stats->mask & IEEE80211_STATMASK_RSSI) { + if (rx_stats->mask & LIBIPW_STATMASK_RSSI) { wstats.level = rx_stats->signal; wstats.updated |= IW_QUAL_LEVEL_UPDATED; } else wstats.updated |= IW_QUAL_LEVEL_INVALID; - if (rx_stats->mask & IEEE80211_STATMASK_NOISE) { + if (rx_stats->mask & LIBIPW_STATMASK_NOISE) { wstats.noise = rx_stats->noise; wstats.updated |= IW_QUAL_NOISE_UPDATED; } else wstats.updated |= IW_QUAL_NOISE_INVALID; - if (rx_stats->mask & IEEE80211_STATMASK_SIGNAL) { + if (rx_stats->mask & LIBIPW_STATMASK_SIGNAL) { wstats.qual = rx_stats->signal; wstats.updated |= IW_QUAL_QUAL_UPDATED; } else @@ -411,7 +412,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, if (ieee->iw_mode == IW_MODE_MONITOR) { dev->stats.rx_packets++; dev->stats.rx_bytes += skb->len; - ieee80211_monitor_rx(ieee, skb, rx_stats); + libipw_monitor_rx(ieee, skb, rx_stats); return 1; } @@ -457,7 +458,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, * frames from other than current BSS, so just drop the * frames silently instead of filling system log with * these reports. */ - IEEE80211_DEBUG_DROP("Decryption failed (not set)" + LIBIPW_DEBUG_DROP("Decryption failed (not set)" " (SA=%pM)\n", hdr->addr2); ieee->ieee_stats.rx_discards_undecryptable++; goto rx_dropped; @@ -475,7 +476,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, goto rx_dropped; } - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (libipw_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -488,7 +489,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ieee->prev_seq_ctl = sc; /* Data frame - extract src/dst addresses */ - if (skb->len < IEEE80211_3ADDR_LEN) + if (skb->len < LIBIPW_3ADDR_LEN) goto rx_dropped; switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { @@ -501,7 +502,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, memcpy(src, hdr->addr2, ETH_ALEN); break; case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS: - if (skb->len < IEEE80211_4ADDR_LEN) + if (skb->len < LIBIPW_4ADDR_LEN) goto rx_dropped; memcpy(dst, hdr->addr3, ETH_ALEN); memcpy(src, hdr->addr4, ETH_ALEN); @@ -560,7 +561,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, stype != IEEE80211_STYPE_DATA_CFPOLL && stype != IEEE80211_STYPE_DATA_CFACKPOLL) { if (stype != IEEE80211_STYPE_NULLFUNC) - IEEE80211_DEBUG_DROP("RX: dropped data frame " + LIBIPW_DEBUG_DROP("RX: dropped data frame " "with no data (type=0x%02x, " "subtype=0x%02x, len=%d)\n", type, stype, skb->len); @@ -570,21 +571,21 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if ((fc & IEEE80211_FCTL_PROTECTED) && can_be_decrypted && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = libipw_rx_frame_decrypt(ieee, skb, crypt)) < 0) goto rx_dropped; - hdr = (struct ieee80211_hdr_4addr *)skb->data; + hdr = (struct libipw_hdr_4addr *)skb->data; /* skb: hdr + (possibly fragmented) plaintext payload */ // PR: FIXME: hostap has additional conditions in the "if" below: // ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && if ((frag != 0) || (fc & IEEE80211_FCTL_MOREFRAGS)) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); - IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); + struct sk_buff *frag_skb = libipw_frag_cache_get(ieee, hdr); + LIBIPW_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { - IEEE80211_DEBUG(IEEE80211_DL_RX | IEEE80211_DL_FRAG, + LIBIPW_DEBUG(LIBIPW_DL_RX | LIBIPW_DL_FRAG, "Rx cannot get skb from fragment " "cache (morefrag=%d seq=%u frag=%u)\n", (fc & IEEE80211_FCTL_MOREFRAGS) != 0, @@ -600,7 +601,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + libipw_frag_cache_invalidate(ieee, hdr); goto rx_dropped; } @@ -627,24 +628,24 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, /* this was the last fragment and the frame will be * delivered, so remove skb from fragment cache */ skb = frag_skb; - hdr = (struct ieee80211_hdr_4addr *)skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + hdr = (struct libipw_hdr_4addr *)skb->data; + libipw_frag_cache_invalidate(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if ((fc & IEEE80211_FCTL_PROTECTED) && can_be_decrypted && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + libipw_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) goto rx_dropped; - hdr = (struct ieee80211_hdr_4addr *)skb->data; + hdr = (struct libipw_hdr_4addr *)skb->data; if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) { if ( /*ieee->ieee802_1x && */ - ieee80211_is_eapol_frame(ieee, skb)) { + libipw_is_eapol_frame(ieee, skb)) { /* pass unencrypted EAPOL frames even if encryption is * configured */ } else { - IEEE80211_DEBUG_DROP("encryption configured, but RX " + LIBIPW_DEBUG_DROP("encryption configured, but RX " "frame not encrypted (SA=%pM)\n", hdr->addr2); goto rx_dropped; @@ -652,8 +653,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, } if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { - IEEE80211_DEBUG_DROP("dropped unencrypted RX data " + !libipw_is_eapol_frame(ieee, skb)) { + LIBIPW_DEBUG_DROP("dropped unencrypted RX data " "frame from %pM (drop_unencrypted=1)\n", hdr->addr2); goto rx_dropped; @@ -736,9 +737,9 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, /* convert hdr + possible LLC headers into Ethernet header */ if (skb->len - hdrlen >= 8 && - ((memcmp(payload, rfc1042_header, SNAP_SIZE) == 0 && + ((memcmp(payload, libipw_rfc1042_header, SNAP_SIZE) == 0 && ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) || - memcmp(payload, bridge_tunnel_header, SNAP_SIZE) == 0)) { + memcmp(payload, libipw_bridge_tunnel_header, SNAP_SIZE) == 0)) { /* remove RFC1042 or Bridge-Tunnel encapsulation and * replace EtherType */ skb_pull(skb, hdrlen + SNAP_SIZE); @@ -807,7 +808,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, /* netif_rx always succeeds, but it might drop * the packet. If it drops the packet, we log that * in our stats. */ - IEEE80211_DEBUG_DROP + LIBIPW_DEBUG_DROP ("RX: netif_rx dropped the packet\n"); dev->stats.rx_dropped++; } @@ -829,18 +830,18 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, return 0; } -/* Filter out unrelated packets, call ieee80211_rx[_mgt] +/* Filter out unrelated packets, call libipw_rx[_mgt] * This function takes over the skb, it should not be used again after calling * this function. */ -void ieee80211_rx_any(struct ieee80211_device *ieee, - struct sk_buff *skb, struct ieee80211_rx_stats *stats) +void libipw_rx_any(struct libipw_device *ieee, + struct sk_buff *skb, struct libipw_rx_stats *stats) { - struct ieee80211_hdr_4addr *hdr; + struct libipw_hdr_4addr *hdr; int is_packet_for_us; u16 fc; if (ieee->iw_mode == IW_MODE_MONITOR) { - if (!ieee80211_rx(ieee, skb, stats)) + if (!libipw_rx(ieee, skb, stats)) dev_kfree_skb_irq(skb); return; } @@ -848,7 +849,7 @@ void ieee80211_rx_any(struct ieee80211_device *ieee, if (skb->len < sizeof(struct ieee80211_hdr)) goto drop_free; - hdr = (struct ieee80211_hdr_4addr *)skb->data; + hdr = (struct libipw_hdr_4addr *)skb->data; fc = le16_to_cpu(hdr->frame_ctl); if ((fc & IEEE80211_FCTL_VERS) != 0) @@ -856,9 +857,9 @@ void ieee80211_rx_any(struct ieee80211_device *ieee, switch (fc & IEEE80211_FCTL_FTYPE) { case IEEE80211_FTYPE_MGMT: - if (skb->len < sizeof(struct ieee80211_hdr_3addr)) + if (skb->len < sizeof(struct libipw_hdr_3addr)) goto drop_free; - ieee80211_rx_mgt(ieee, hdr, stats); + libipw_rx_mgt(ieee, hdr, stats); dev_kfree_skb_irq(skb); return; case IEEE80211_FTYPE_DATA: @@ -910,7 +911,7 @@ void ieee80211_rx_any(struct ieee80211_device *ieee, } if (is_packet_for_us) - if (!ieee80211_rx(ieee, skb, stats)) + if (!libipw_rx(ieee, skb, stats)) dev_kfree_skb_irq(skb); return; @@ -928,7 +929,7 @@ static u8 qos_oui[QOS_OUI_LEN] = { 0x00, 0x50, 0xF2 }; * Make ther structure we read from the beacon packet has * the right values */ -static int ieee80211_verify_qos_info(struct ieee80211_qos_information_element +static int libipw_verify_qos_info(struct libipw_qos_information_element *info_element, int sub_type) { @@ -947,12 +948,12 @@ static int ieee80211_verify_qos_info(struct ieee80211_qos_information_element /* * Parse a QoS parameter element */ -static int ieee80211_read_qos_param_element(struct ieee80211_qos_parameter_info - *element_param, struct ieee80211_info_element +static int libipw_read_qos_param_element(struct libipw_qos_parameter_info + *element_param, struct libipw_info_element *info_element) { int ret = 0; - u16 size = sizeof(struct ieee80211_qos_parameter_info) - 2; + u16 size = sizeof(struct libipw_qos_parameter_info) - 2; if ((info_element == NULL) || (element_param == NULL)) return -1; @@ -965,7 +966,7 @@ static int ieee80211_read_qos_param_element(struct ieee80211_qos_parameter_info } else ret = -1; if (ret == 0) - ret = ieee80211_verify_qos_info(&element_param->info_element, + ret = libipw_verify_qos_info(&element_param->info_element, QOS_OUI_PARAM_SUB_TYPE); return ret; } @@ -973,13 +974,13 @@ static int ieee80211_read_qos_param_element(struct ieee80211_qos_parameter_info /* * Parse a QoS information element */ -static int ieee80211_read_qos_info_element(struct - ieee80211_qos_information_element - *element_info, struct ieee80211_info_element +static int libipw_read_qos_info_element(struct + libipw_qos_information_element + *element_info, struct libipw_info_element *info_element) { int ret = 0; - u16 size = sizeof(struct ieee80211_qos_information_element) - 2; + u16 size = sizeof(struct libipw_qos_information_element) - 2; if (element_info == NULL) return -1; @@ -995,7 +996,7 @@ static int ieee80211_read_qos_info_element(struct ret = -1; if (ret == 0) - ret = ieee80211_verify_qos_info(element_info, + ret = libipw_verify_qos_info(element_info, QOS_OUI_INFO_SUB_TYPE); return ret; } @@ -1003,15 +1004,15 @@ static int ieee80211_read_qos_info_element(struct /* * Write QoS parameters from the ac parameters. */ -static int ieee80211_qos_convert_ac_to_parameters(struct - ieee80211_qos_parameter_info +static int libipw_qos_convert_ac_to_parameters(struct + libipw_qos_parameter_info *param_elm, struct - ieee80211_qos_parameters + libipw_qos_parameters *qos_param) { int rc = 0; int i; - struct ieee80211_qos_ac_parameter *ac_params; + struct libipw_qos_ac_parameter *ac_params; u32 txop; u8 cw_min; u8 cw_max; @@ -1042,27 +1043,27 @@ static int ieee80211_qos_convert_ac_to_parameters(struct * parameters element. check the information element length to decide * which type to read */ -static int ieee80211_parse_qos_info_param_IE(struct ieee80211_info_element +static int libipw_parse_qos_info_param_IE(struct libipw_info_element *info_element, - struct ieee80211_network *network) + struct libipw_network *network) { int rc = 0; - struct ieee80211_qos_parameters *qos_param = NULL; - struct ieee80211_qos_information_element qos_info_element; + struct libipw_qos_parameters *qos_param = NULL; + struct libipw_qos_information_element qos_info_element; - rc = ieee80211_read_qos_info_element(&qos_info_element, info_element); + rc = libipw_read_qos_info_element(&qos_info_element, info_element); if (rc == 0) { network->qos_data.param_count = qos_info_element.ac_info & 0x0F; network->flags |= NETWORK_HAS_QOS_INFORMATION; } else { - struct ieee80211_qos_parameter_info param_element; + struct libipw_qos_parameter_info param_element; - rc = ieee80211_read_qos_param_element(¶m_element, + rc = libipw_read_qos_param_element(¶m_element, info_element); if (rc == 0) { qos_param = &(network->qos_data.parameters); - ieee80211_qos_convert_ac_to_parameters(¶m_element, + libipw_qos_convert_ac_to_parameters(¶m_element, qos_param); network->flags |= NETWORK_HAS_QOS_PARAMETERS; network->qos_data.param_count = @@ -1071,7 +1072,7 @@ static int ieee80211_parse_qos_info_param_IE(struct ieee80211_info_element } if (rc == 0) { - IEEE80211_DEBUG_QOS("QoS is supported\n"); + LIBIPW_DEBUG_QOS("QoS is supported\n"); network->qos_data.supported = 1; } return rc; @@ -1116,9 +1117,9 @@ static const char *get_info_element_string(u16 id) } #endif -static int ieee80211_parse_info_param(struct ieee80211_info_element +static int libipw_parse_info_param(struct libipw_info_element *info_element, u16 length, - struct ieee80211_network *network) + struct libipw_network *network) { DECLARE_SSID_BUF(ssid); u8 i; @@ -1129,7 +1130,7 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element while (length >= sizeof(*info_element)) { if (sizeof(*info_element) + info_element->len > length) { - IEEE80211_DEBUG_MGMT("Info elem: parse failed: " + LIBIPW_DEBUG_MGMT("Info elem: parse failed: " "info_element->len + 2 > left : " "info_element->len+2=%zd left=%d, id=%d.\n", info_element->len + @@ -1151,7 +1152,7 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element memset(network->ssid + network->ssid_len, 0, IW_ESSID_MAX_SIZE - network->ssid_len); - IEEE80211_DEBUG_MGMT("WLAN_EID_SSID: '%s' len=%d.\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_SSID: '%s' len=%d.\n", print_ssid(ssid, network->ssid, network->ssid_len), network->ssid_len); @@ -1170,17 +1171,17 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate + if (libipw_is_ofdm_rate (info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & - IEEE80211_BASIC_RATE_MASK) + LIBIPW_BASIC_RATE_MASK) network->flags &= ~NETWORK_HAS_CCK; } } - IEEE80211_DEBUG_MGMT("WLAN_EID_SUPP_RATES: '%s' (%d)\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_SUPP_RATES: '%s' (%d)\n", rates_str, network->rates_len); break; @@ -1197,61 +1198,61 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate + if (libipw_is_ofdm_rate (info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & - IEEE80211_BASIC_RATE_MASK) + LIBIPW_BASIC_RATE_MASK) network->flags &= ~NETWORK_HAS_CCK; } } - IEEE80211_DEBUG_MGMT("WLAN_EID_EXT_SUPP_RATES: '%s' (%d)\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_EXT_SUPP_RATES: '%s' (%d)\n", rates_str, network->rates_ex_len); break; case WLAN_EID_DS_PARAMS: - IEEE80211_DEBUG_MGMT("WLAN_EID_DS_PARAMS: %d\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_DS_PARAMS: %d\n", info_element->data[0]); network->channel = info_element->data[0]; break; case WLAN_EID_FH_PARAMS: - IEEE80211_DEBUG_MGMT("WLAN_EID_FH_PARAMS: ignored\n"); + LIBIPW_DEBUG_MGMT("WLAN_EID_FH_PARAMS: ignored\n"); break; case WLAN_EID_CF_PARAMS: - IEEE80211_DEBUG_MGMT("WLAN_EID_CF_PARAMS: ignored\n"); + LIBIPW_DEBUG_MGMT("WLAN_EID_CF_PARAMS: ignored\n"); break; case WLAN_EID_TIM: network->tim.tim_count = info_element->data[0]; network->tim.tim_period = info_element->data[1]; - IEEE80211_DEBUG_MGMT("WLAN_EID_TIM: partially ignored\n"); + LIBIPW_DEBUG_MGMT("WLAN_EID_TIM: partially ignored\n"); break; case WLAN_EID_ERP_INFO: network->erp_value = info_element->data[0]; network->flags |= NETWORK_HAS_ERP_VALUE; - IEEE80211_DEBUG_MGMT("MFIE_TYPE_ERP_SET: %d\n", + LIBIPW_DEBUG_MGMT("MFIE_TYPE_ERP_SET: %d\n", network->erp_value); break; case WLAN_EID_IBSS_PARAMS: network->atim_window = info_element->data[0]; - IEEE80211_DEBUG_MGMT("WLAN_EID_IBSS_PARAMS: %d\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_IBSS_PARAMS: %d\n", network->atim_window); break; case WLAN_EID_CHALLENGE: - IEEE80211_DEBUG_MGMT("WLAN_EID_CHALLENGE: ignored\n"); + LIBIPW_DEBUG_MGMT("WLAN_EID_CHALLENGE: ignored\n"); break; case WLAN_EID_GENERIC: - IEEE80211_DEBUG_MGMT("WLAN_EID_GENERIC: %d bytes\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_GENERIC: %d bytes\n", info_element->len); - if (!ieee80211_parse_qos_info_param_IE(info_element, + if (!libipw_parse_qos_info_param_IE(info_element, network)) break; @@ -1268,7 +1269,7 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element break; case WLAN_EID_RSN: - IEEE80211_DEBUG_MGMT("WLAN_EID_RSN: %d bytes\n", + LIBIPW_DEBUG_MGMT("WLAN_EID_RSN: %d bytes\n", info_element->len); network->rsn_ie_len = min(info_element->len + 2, MAX_WPA_IE_LEN); @@ -1318,7 +1319,7 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element break; default: - IEEE80211_DEBUG_MGMT + LIBIPW_DEBUG_MGMT ("Unsupported info element: %s (%d)\n", get_info_element_string(info_element->id), info_element->id); @@ -1327,20 +1328,20 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element length -= sizeof(*info_element) + info_element->len; info_element = - (struct ieee80211_info_element *)&info_element-> + (struct libipw_info_element *)&info_element-> data[info_element->len]; } return 0; } -static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct ieee80211_assoc_response - *frame, struct ieee80211_rx_stats *stats) +static int libipw_handle_assoc_resp(struct libipw_device *ieee, struct libipw_assoc_response + *frame, struct libipw_rx_stats *stats) { - struct ieee80211_network network_resp = { + struct libipw_network network_resp = { .ibss_dfs = NULL, }; - struct ieee80211_network *network = &network_resp; + struct libipw_network *network = &network_resp; struct net_device *dev = ieee->dev; network->flags = 0; @@ -1361,7 +1362,7 @@ static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct iee network->erp_value = (network->capability & WLAN_CAPABILITY_IBSS) ? 0x3 : 0x0; - if (stats->freq == IEEE80211_52GHZ_BAND) { + if (stats->freq == LIBIPW_52GHZ_BAND) { /* for A band (No DS info) */ network->channel = stats->received_channel; } else @@ -1370,12 +1371,12 @@ static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct iee network->wpa_ie_len = 0; network->rsn_ie_len = 0; - if (ieee80211_parse_info_param + if (libipw_parse_info_param (frame->info_element, stats->len - sizeof(*frame), network)) return 1; network->mode = 0; - if (stats->freq == IEEE80211_52GHZ_BAND) + if (stats->freq == LIBIPW_52GHZ_BAND) network->mode = IEEE_A; else { if (network->flags & NETWORK_HAS_OFDM) @@ -1394,10 +1395,10 @@ static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct iee /***************************************************/ -static int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee80211_probe_response +static int libipw_network_init(struct libipw_device *ieee, struct libipw_probe_response *beacon, - struct ieee80211_network *network, - struct ieee80211_rx_stats *stats) + struct libipw_network *network, + struct libipw_rx_stats *stats) { DECLARE_SSID_BUF(ssid); @@ -1423,7 +1424,7 @@ static int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee8021 network->erp_value = (network->capability & WLAN_CAPABILITY_IBSS) ? 0x3 : 0x0; - if (stats->freq == IEEE80211_52GHZ_BAND) { + if (stats->freq == LIBIPW_52GHZ_BAND) { /* for A band (No DS info) */ network->channel = stats->received_channel; } else @@ -1432,12 +1433,12 @@ static int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee8021 network->wpa_ie_len = 0; network->rsn_ie_len = 0; - if (ieee80211_parse_info_param + if (libipw_parse_info_param (beacon->info_element, stats->len - sizeof(*beacon), network)) return 1; network->mode = 0; - if (stats->freq == IEEE80211_52GHZ_BAND) + if (stats->freq == LIBIPW_52GHZ_BAND) network->mode = IEEE_A; else { if (network->flags & NETWORK_HAS_OFDM) @@ -1447,7 +1448,7 @@ static int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee8021 } if (network->mode == 0) { - IEEE80211_DEBUG_SCAN("Filtered out '%s (%pM)' " + LIBIPW_DEBUG_SCAN("Filtered out '%s (%pM)' " "network.\n", print_ssid(ssid, network->ssid, network->ssid_len), @@ -1460,8 +1461,8 @@ static int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee8021 return 0; } -static inline int is_same_network(struct ieee80211_network *src, - struct ieee80211_network *dst) +static inline int is_same_network(struct libipw_network *src, + struct libipw_network *dst) { /* A network is only a duplicate if the channel, BSSID, and ESSID * all match. We treat all <hidden> with the same BSSID and channel @@ -1472,13 +1473,13 @@ static inline int is_same_network(struct ieee80211_network *src, !memcmp(src->ssid, dst->ssid, src->ssid_len)); } -static void update_network(struct ieee80211_network *dst, - struct ieee80211_network *src) +static void update_network(struct libipw_network *dst, + struct libipw_network *src) { int qos_active; u8 old_param; - ieee80211_network_reset(dst); + libipw_network_reset(dst); dst->ibss_dfs = src->ibss_dfs; /* We only update the statistics if they were created by receiving @@ -1488,9 +1489,9 @@ static void update_network(struct ieee80211_network *dst, * down the signal level of an AP. */ if (dst->channel == src->stats.received_channel) memcpy(&dst->stats, &src->stats, - sizeof(struct ieee80211_rx_stats)); + sizeof(struct libipw_rx_stats)); else - IEEE80211_DEBUG_SCAN("Network %pM info received " + LIBIPW_DEBUG_SCAN("Network %pM info received " "off channel (%d vs. %d)\n", src->bssid, dst->channel, src->stats.received_channel); @@ -1521,7 +1522,7 @@ static void update_network(struct ieee80211_network *dst, old_param = dst->qos_data.old_param_count; if (dst->flags & NETWORK_HAS_QOS_MASK) memcpy(&dst->qos_data, &src->qos_data, - sizeof(struct ieee80211_qos_data)); + sizeof(struct libipw_qos_data)); else { dst->qos_data.supported = src->qos_data.supported; dst->qos_data.param_count = src->qos_data.param_count; @@ -1529,11 +1530,11 @@ static void update_network(struct ieee80211_network *dst, if (dst->qos_data.supported == 1) { if (dst->ssid_len) - IEEE80211_DEBUG_QOS + LIBIPW_DEBUG_QOS ("QoS the network %s is QoS supported\n", dst->ssid); else - IEEE80211_DEBUG_QOS + LIBIPW_DEBUG_QOS ("QoS the network is QoS supported\n"); } dst->qos_data.active = qos_active; @@ -1547,25 +1548,25 @@ static inline int is_beacon(__le16 fc) return (WLAN_FC_GET_STYPE(le16_to_cpu(fc)) == IEEE80211_STYPE_BEACON); } -static void ieee80211_process_probe_response(struct ieee80211_device +static void libipw_process_probe_response(struct libipw_device *ieee, struct - ieee80211_probe_response - *beacon, struct ieee80211_rx_stats + libipw_probe_response + *beacon, struct libipw_rx_stats *stats) { struct net_device *dev = ieee->dev; - struct ieee80211_network network = { + struct libipw_network network = { .ibss_dfs = NULL, }; - struct ieee80211_network *target; - struct ieee80211_network *oldest = NULL; + struct libipw_network *target; + struct libipw_network *oldest = NULL; #ifdef CONFIG_LIBIPW_DEBUG - struct ieee80211_info_element *info_element = beacon->info_element; + struct libipw_info_element *info_element = beacon->info_element; #endif unsigned long flags; DECLARE_SSID_BUF(ssid); - IEEE80211_DEBUG_SCAN("'%s' (%pM" + LIBIPW_DEBUG_SCAN("'%s' (%pM" "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n", print_ssid(ssid, info_element->data, info_element->len), beacon->header.addr3, @@ -1586,8 +1587,8 @@ static void ieee80211_process_probe_response(struct ieee80211_device (beacon->capability & cpu_to_le16(1 << 0x1)) ? '1' : '0', (beacon->capability & cpu_to_le16(1 << 0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { - IEEE80211_DEBUG_SCAN("Dropped '%s' (%pM) via %s.\n", + if (libipw_network_init(ieee, beacon, &network, stats)) { + LIBIPW_DEBUG_SCAN("Dropped '%s' (%pM) via %s.\n", print_ssid(ssid, info_element->data, info_element->len), beacon->header.addr3, @@ -1624,21 +1625,21 @@ static void ieee80211_process_probe_response(struct ieee80211_device /* If there are no more slots, expire the oldest */ list_del(&oldest->list); target = oldest; - IEEE80211_DEBUG_SCAN("Expired '%s' (%pM) from " + LIBIPW_DEBUG_SCAN("Expired '%s' (%pM) from " "network list.\n", print_ssid(ssid, target->ssid, target->ssid_len), target->bssid); - ieee80211_network_reset(target); + libipw_network_reset(target); } else { /* Otherwise just pull from the free list */ target = list_entry(ieee->network_free_list.next, - struct ieee80211_network, list); + struct libipw_network, list); list_del(ieee->network_free_list.next); } #ifdef CONFIG_LIBIPW_DEBUG - IEEE80211_DEBUG_SCAN("Adding '%s' (%pM) via %s.\n", + LIBIPW_DEBUG_SCAN("Adding '%s' (%pM) via %s.\n", print_ssid(ssid, network.ssid, network.ssid_len), network.bssid, @@ -1649,7 +1650,7 @@ static void ieee80211_process_probe_response(struct ieee80211_device network.ibss_dfs = NULL; list_add_tail(&target->list, &ieee->network_list); } else { - IEEE80211_DEBUG_SCAN("Updating '%s' (%pM) via %s.\n", + LIBIPW_DEBUG_SCAN("Updating '%s' (%pM) via %s.\n", print_ssid(ssid, target->ssid, target->ssid_len), target->bssid, @@ -1670,121 +1671,121 @@ static void ieee80211_process_probe_response(struct ieee80211_device } } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, - struct ieee80211_hdr_4addr *header, - struct ieee80211_rx_stats *stats) +void libipw_rx_mgt(struct libipw_device *ieee, + struct libipw_hdr_4addr *header, + struct libipw_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl))) { case IEEE80211_STYPE_ASSOC_RESP: - IEEE80211_DEBUG_MGMT("received ASSOCIATION RESPONSE (%d)\n", + LIBIPW_DEBUG_MGMT("received ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - ieee80211_handle_assoc_resp(ieee, - (struct ieee80211_assoc_response *) + libipw_handle_assoc_resp(ieee, + (struct libipw_assoc_response *) header, stats); break; case IEEE80211_STYPE_REASSOC_RESP: - IEEE80211_DEBUG_MGMT("received REASSOCIATION RESPONSE (%d)\n", + LIBIPW_DEBUG_MGMT("received REASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); break; case IEEE80211_STYPE_PROBE_REQ: - IEEE80211_DEBUG_MGMT("received auth (%d)\n", + LIBIPW_DEBUG_MGMT("received auth (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); if (ieee->handle_probe_request != NULL) ieee->handle_probe_request(ieee->dev, (struct - ieee80211_probe_request *) + libipw_probe_request *) header, stats); break; case IEEE80211_STYPE_PROBE_RESP: - IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", + LIBIPW_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response(ieee, + LIBIPW_DEBUG_SCAN("Probe response\n"); + libipw_process_probe_response(ieee, (struct - ieee80211_probe_response *) + libipw_probe_response *) header, stats); break; case IEEE80211_STYPE_BEACON: - IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", + LIBIPW_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response(ieee, + LIBIPW_DEBUG_SCAN("Beacon\n"); + libipw_process_probe_response(ieee, (struct - ieee80211_probe_response *) + libipw_probe_response *) header, stats); break; case IEEE80211_STYPE_AUTH: - IEEE80211_DEBUG_MGMT("received auth (%d)\n", + LIBIPW_DEBUG_MGMT("received auth (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); if (ieee->handle_auth != NULL) ieee->handle_auth(ieee->dev, - (struct ieee80211_auth *)header); + (struct libipw_auth *)header); break; case IEEE80211_STYPE_DISASSOC: if (ieee->handle_disassoc != NULL) ieee->handle_disassoc(ieee->dev, - (struct ieee80211_disassoc *) + (struct libipw_disassoc *) header); break; case IEEE80211_STYPE_ACTION: - IEEE80211_DEBUG_MGMT("ACTION\n"); + LIBIPW_DEBUG_MGMT("ACTION\n"); if (ieee->handle_action) ieee->handle_action(ieee->dev, - (struct ieee80211_action *) + (struct libipw_action *) header, stats); break; case IEEE80211_STYPE_REASSOC_REQ: - IEEE80211_DEBUG_MGMT("received reassoc (%d)\n", + LIBIPW_DEBUG_MGMT("received reassoc (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_DEBUG_MGMT("%s: IEEE80211_REASSOC_REQ received\n", + LIBIPW_DEBUG_MGMT("%s: LIBIPW_REASSOC_REQ received\n", ieee->dev->name); if (ieee->handle_reassoc_request != NULL) ieee->handle_reassoc_request(ieee->dev, - (struct ieee80211_reassoc_request *) + (struct libipw_reassoc_request *) header); break; case IEEE80211_STYPE_ASSOC_REQ: - IEEE80211_DEBUG_MGMT("received assoc (%d)\n", + LIBIPW_DEBUG_MGMT("received assoc (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_DEBUG_MGMT("%s: IEEE80211_ASSOC_REQ received\n", + LIBIPW_DEBUG_MGMT("%s: LIBIPW_ASSOC_REQ received\n", ieee->dev->name); if (ieee->handle_assoc_request != NULL) ieee->handle_assoc_request(ieee->dev); break; case IEEE80211_STYPE_DEAUTH: - IEEE80211_DEBUG_MGMT("DEAUTH\n"); + LIBIPW_DEBUG_MGMT("DEAUTH\n"); if (ieee->handle_deauth != NULL) ieee->handle_deauth(ieee->dev, - (struct ieee80211_deauth *) + (struct libipw_deauth *) header); break; default: - IEEE80211_DEBUG_MGMT("received UNKNOWN (%d)\n", + LIBIPW_DEBUG_MGMT("received UNKNOWN (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_DEBUG_MGMT("%s: Unknown management packet: %d\n", + LIBIPW_DEBUG_MGMT("%s: Unknown management packet: %d\n", ieee->dev->name, WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); @@ -1792,6 +1793,6 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, } } -EXPORT_SYMBOL_GPL(ieee80211_rx_any); -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL_GPL(libipw_rx_any); +EXPORT_SYMBOL(libipw_rx_mgt); +EXPORT_SYMBOL(libipw_rx); diff --git a/drivers/net/wireless/ipw2x00/libipw_tx.c b/drivers/net/wireless/ipw2x00/libipw_tx.c index 2e8f84f..46530ce 100644 --- a/drivers/net/wireless/ipw2x00/libipw_tx.c +++ b/drivers/net/wireless/ipw2x00/libipw_tx.c @@ -19,7 +19,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ******************************************************************************/ @@ -41,7 +41,7 @@ #include <linux/etherdevice.h> #include <asm/uaccess.h> -#include "ieee80211.h" +#include "libipw.h" /* @@ -126,12 +126,12 @@ payload of each frame is reduced to 492 bytes. static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static int ieee80211_copy_snap(u8 * data, __be16 h_proto) +static int libipw_copy_snap(u8 * data, __be16 h_proto) { - struct ieee80211_snap_hdr *snap; + struct libipw_snap_hdr *snap; u8 *oui; - snap = (struct ieee80211_snap_hdr *)data; + snap = (struct libipw_snap_hdr *)data; snap->dsap = 0xaa; snap->ssap = 0xaa; snap->ctrl = 0x03; @@ -149,7 +149,7 @@ static int ieee80211_copy_snap(u8 * data, __be16 h_proto) return SNAP_SIZE + sizeof(u16); } -static int ieee80211_encrypt_fragment(struct ieee80211_device *ieee, +static int libipw_encrypt_fragment(struct libipw_device *ieee, struct sk_buff *frag, int hdr_len) { struct lib80211_crypt_data *crypt = @@ -177,7 +177,7 @@ static int ieee80211_encrypt_fragment(struct ieee80211_device *ieee, return 0; } -void ieee80211_txb_free(struct ieee80211_txb *txb) +void libipw_txb_free(struct libipw_txb *txb) { int i; if (unlikely(!txb)) @@ -188,17 +188,17 @@ void ieee80211_txb_free(struct ieee80211_txb *txb) kfree(txb); } -static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +static struct libipw_txb *libipw_alloc_txb(int nr_frags, int txb_size, int headroom, gfp_t gfp_mask) { - struct ieee80211_txb *txb; + struct libipw_txb *txb; int i; - txb = kmalloc(sizeof(struct ieee80211_txb) + (sizeof(u8 *) * nr_frags), + txb = kmalloc(sizeof(struct libipw_txb) + (sizeof(u8 *) * nr_frags), gfp_mask); if (!txb) return NULL; - memset(txb, 0, sizeof(struct ieee80211_txb)); + memset(txb, 0, sizeof(struct libipw_txb)); txb->nr_frags = nr_frags; txb->frag_size = txb_size; @@ -220,7 +220,7 @@ static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, return txb; } -static int ieee80211_classify(struct sk_buff *skb) +static int libipw_classify(struct sk_buff *skb) { struct ethhdr *eth; struct iphdr *ip; @@ -252,11 +252,11 @@ static int ieee80211_classify(struct sk_buff *skb) /* Incoming skb is converted to a txb which consists of * a block of 802.11 fragment packets (stored as skbs) */ -int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) +int libipw_xmit(struct sk_buff *skb, struct net_device *dev) { - struct ieee80211_device *ieee = netdev_priv(dev); - struct ieee80211_txb *txb = NULL; - struct ieee80211_hdr_3addrqos *frag_hdr; + struct libipw_device *ieee = netdev_priv(dev); + struct libipw_txb *txb = NULL; + struct libipw_hdr_3addrqos *frag_hdr; int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size, rts_required; unsigned long flags; @@ -264,7 +264,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) __be16 ether_type; int bytes, fc, hdr_len; struct sk_buff *skb_frag; - struct ieee80211_hdr_3addrqos header = {/* Ensure zero initialized */ + struct libipw_hdr_3addrqos header = {/* Ensure zero initialized */ .duration_id = 0, .seq_ctl = 0, .qos_ctl = 0 @@ -331,14 +331,14 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) memcpy(header.addr2, src, ETH_ALEN); memcpy(header.addr3, ieee->bssid, ETH_ALEN); } - hdr_len = IEEE80211_3ADDR_LEN; + hdr_len = LIBIPW_3ADDR_LEN; if (ieee->is_qos_active && ieee->is_qos_active(dev, skb)) { fc |= IEEE80211_STYPE_QOS_DATA; hdr_len += 2; - skb->priority = ieee80211_classify(skb); - header.qos_ctl |= cpu_to_le16(skb->priority & IEEE80211_QCTL_TID); + skb->priority = libipw_classify(skb); + header.qos_ctl |= cpu_to_le16(skb->priority & LIBIPW_QCTL_TID); } header.frame_ctl = cpu_to_le16(fc); @@ -362,12 +362,12 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) skb_reserve(skb_new, crypt->ops->extra_msdu_prefix_len); memcpy(skb_put(skb_new, hdr_len), &header, hdr_len); snapped = 1; - ieee80211_copy_snap(skb_put(skb_new, SNAP_SIZE + sizeof(u16)), + libipw_copy_snap(skb_put(skb_new, SNAP_SIZE + sizeof(u16)), ether_type); skb_copy_from_linear_data(skb, skb_put(skb_new, skb->len), skb->len); res = crypt->ops->encrypt_msdu(skb_new, hdr_len, crypt->priv); if (res < 0) { - IEEE80211_ERROR("msdu encryption failed\n"); + LIBIPW_ERROR("msdu encryption failed\n"); dev_kfree_skb_any(skb_new); goto failed; } @@ -393,8 +393,8 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) * for it when determining the amount of payload space. */ bytes_per_frag = frag_size - hdr_len; if (ieee->config & - (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) - bytes_per_frag -= IEEE80211_FCS_LEN; + (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS)) + bytes_per_frag -= LIBIPW_FCS_LEN; /* Each fragment may need to have room for encryptiong * pre/postfix */ @@ -417,14 +417,14 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) } rts_required = (frag_size > ieee->rts - && ieee->config & CFG_IEEE80211_RTS); + && ieee->config & CFG_LIBIPW_RTS); if (rts_required) nr_frags++; /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, + txb = libipw_alloc_txb(nr_frags, frag_size, ieee->tx_headroom, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", @@ -441,7 +441,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) if (rts_required) { skb_frag = txb->fragments[0]; frag_hdr = - (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len); + (struct libipw_hdr_3addrqos *)skb_put(skb_frag, hdr_len); /* * Set header frame_ctl to the RTS. @@ -456,7 +456,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) header.frame_ctl = cpu_to_le16(fc); if (ieee->config & - (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) + (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS)) skb_put(skb_frag, 4); txb->rts_included = 1; @@ -472,7 +472,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) crypt->ops->extra_mpdu_prefix_len); frag_hdr = - (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len); + (struct libipw_hdr_3addrqos *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); /* If this is not the last fragment, then add the MOREFRAGS @@ -487,7 +487,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) } if (i == 0 && !snapped) { - ieee80211_copy_snap(skb_put + libipw_copy_snap(skb_put (skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -501,7 +501,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (host_encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + libipw_encrypt_fragment(ieee, skb_frag, hdr_len); else if (host_build_iv) { atomic_inc(&crypt->refcnt); if (crypt->ops->build_iv) @@ -513,7 +513,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) } if (ieee->config & - (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) + (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS)) skb_put(skb_frag, 4); } @@ -530,7 +530,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_OK; } - ieee80211_txb_free(txb); + libipw_txb_free(txb); } return NETDEV_TX_OK; @@ -541,6 +541,6 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) dev->stats.tx_errors++; return NETDEV_TX_BUSY; } -EXPORT_SYMBOL(ieee80211_xmit); +EXPORT_SYMBOL(libipw_xmit); -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(libipw_txb_free); diff --git a/drivers/net/wireless/ipw2x00/libipw_wx.c b/drivers/net/wireless/ipw2x00/libipw_wx.c index 3c0812d..4d89f66 100644 --- a/drivers/net/wireless/ipw2x00/libipw_wx.c +++ b/drivers/net/wireless/ipw2x00/libipw_wx.c @@ -25,7 +25,7 @@ file called LICENSE. Contact Information: - James P. Ketrenos <ipw2100-admin@linux.intel.com> + Intel Linux Wireless <ilw@linux.intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ******************************************************************************/ @@ -37,9 +37,9 @@ #include <net/lib80211.h> #include <linux/wireless.h> -#include "ieee80211.h" +#include "libipw.h" -static const char *ieee80211_modes[] = { +static const char *libipw_modes[] = { "?", "a", "b", "ab", "g", "ag", "bg", "abg" }; @@ -54,9 +54,9 @@ static inline unsigned int elapsed_jiffies_msecs(unsigned long start) } #define MAX_CUSTOM_LEN 64 -static char *ieee80211_translate_scan(struct ieee80211_device *ieee, +static char *libipw_translate_scan(struct libipw_device *ieee, char *start, char *stop, - struct ieee80211_network *network, + struct libipw_network *network, struct iw_request_info *info) { char custom[MAX_CUSTOM_LEN]; @@ -84,7 +84,7 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, /* Add the protocol name */ iwe.cmd = SIOCGIWNAME; snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11%s", - ieee80211_modes[network->mode]); + libipw_modes[network->mode]); start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN); /* Add mode */ @@ -102,7 +102,7 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, /* Add channel and frequency */ /* Note : userspace automatically computes channel using iwrange */ iwe.cmd = SIOCGIWFREQ; - iwe.u.freq.m = ieee80211_channel_to_freq(ieee, network->channel); + iwe.u.freq.m = libipw_channel_to_freq(ieee, network->channel); iwe.u.freq.e = 6; iwe.u.freq.i = 0; start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN); @@ -155,7 +155,7 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_UPDATED; - if (!(network->stats.mask & IEEE80211_STATMASK_RSSI)) { + if (!(network->stats.mask & LIBIPW_STATMASK_RSSI)) { iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID; iwe.u.qual.qual = 0; @@ -180,14 +180,14 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, iwe.u.qual.qual = 0; } - if (!(network->stats.mask & IEEE80211_STATMASK_NOISE)) { + if (!(network->stats.mask & LIBIPW_STATMASK_NOISE)) { iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID; iwe.u.qual.noise = 0; } else { iwe.u.qual.noise = network->stats.noise; } - if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL)) { + if (!(network->stats.mask & LIBIPW_STATMASK_SIGNAL)) { iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID; iwe.u.qual.level = 0; } else { @@ -237,14 +237,14 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, p = custom; p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Channel flags: "); - if (ieee80211_get_channel_flags(ieee, network->channel) & - IEEE80211_CH_INVALID) { + if (libipw_get_channel_flags(ieee, network->channel) & + LIBIPW_CH_INVALID) { iwe.cmd = IWEVCUSTOM; p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), "INVALID "); } - if (ieee80211_get_channel_flags(ieee, network->channel) & - IEEE80211_CH_RADAR_DETECT) { + if (libipw_get_channel_flags(ieee, network->channel) & + LIBIPW_CH_RADAR_DETECT) { iwe.cmd = IWEVCUSTOM; p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), "DFS "); } @@ -259,11 +259,11 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, #define SCAN_ITEM_SIZE 128 -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int libipw_wx_get_scan(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct ieee80211_network *network; + struct libipw_network *network; unsigned long flags; int err = 0; @@ -272,7 +272,7 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee, int i = 0; DECLARE_SSID_BUF(ssid); - IEEE80211_DEBUG_WX("Getting scan\n"); + LIBIPW_DEBUG_WX("Getting scan\n"); spin_lock_irqsave(&ieee->lock, flags); @@ -285,10 +285,10 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee, if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ieee80211_translate_scan(ieee, ev, stop, network, + ev = libipw_translate_scan(ieee, ev, stop, network, info); else { - IEEE80211_DEBUG_SCAN("Not showing network '%s (" + LIBIPW_DEBUG_SCAN("Not showing network '%s (" "%pM)' due to age (%ums).\n", print_ssid(ssid, network->ssid, network->ssid_len), @@ -303,18 +303,18 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee, wrqu->data.length = ev - extra; wrqu->data.flags = 0; - IEEE80211_DEBUG_WX("exit: %d networks returned.\n", i); + LIBIPW_DEBUG_WX("exit: %d networks returned.\n", i); return err; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int libipw_wx_set_encode(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { struct iw_point *erq = &(wrqu->encoding); struct net_device *dev = ieee->dev; - struct ieee80211_security sec = { + struct libipw_security sec = { .flags = 0 }; int i, key, key_provided, len; @@ -322,7 +322,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, int host_crypto = ieee->host_encrypt || ieee->host_decrypt || ieee->host_build_iv; DECLARE_SSID_BUF(ssid); - IEEE80211_DEBUG_WX("SET_ENCODE\n"); + LIBIPW_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; if (key) { @@ -335,18 +335,18 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, key = ieee->crypt_info.tx_keyidx; } - IEEE80211_DEBUG_WX("Key: %d [%s]\n", key, key_provided ? + LIBIPW_DEBUG_WX("Key: %d [%s]\n", key, key_provided ? "provided" : "default"); crypt = &ieee->crypt_info.crypt[key]; if (erq->flags & IW_ENCODE_DISABLED) { if (key_provided && *crypt) { - IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", + LIBIPW_DEBUG_WX("Disabling encryption on key %d.\n", key); lib80211_crypt_delayed_deinit(&ieee->crypt_info, crypt); } else - IEEE80211_DEBUG_WX("Disabling encryption.\n"); + LIBIPW_DEBUG_WX("Disabling encryption.\n"); /* Check all the keys to see if any are still configured, * and if no key index was provided, de-init them all */ @@ -410,7 +410,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, /* If a new key was provided, set it up */ if (erq->length > 0) { -#ifdef CONFIG_IEEE80211_DEBUG +#ifdef CONFIG_LIBIPW_DEBUG DECLARE_SSID_BUF(ssid); #endif @@ -419,7 +419,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, if (len > erq->length) memset(sec.keys[key] + erq->length, 0, len - erq->length); - IEEE80211_DEBUG_WX("Setting key %d to '%s' (%d:%d bytes)\n", + LIBIPW_DEBUG_WX("Setting key %d to '%s' (%d:%d bytes)\n", key, print_ssid(ssid, sec.keys[key], len), erq->length, len); sec.key_sizes[key] = len; @@ -438,7 +438,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, NULL, (*crypt)->priv); if (len == 0) { /* Set a default key of all 0 */ - IEEE80211_DEBUG_WX("Setting key %d to all " + LIBIPW_DEBUG_WX("Setting key %d to all " "zero.\n", key); memset(sec.keys[key], 0, 13); (*crypt)->ops->set_key(sec.keys[key], 13, NULL, @@ -449,7 +449,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, } /* No key data - just set the default TX key index */ if (key_provided) { - IEEE80211_DEBUG_WX("Setting key %d to default Tx " + LIBIPW_DEBUG_WX("Setting key %d to default Tx " "key.\n", key); ieee->crypt_info.tx_keyidx = key; sec.active_key = key; @@ -461,7 +461,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, sec.auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; sec.flags |= SEC_AUTH_MODE; - IEEE80211_DEBUG_WX("Auth: %s\n", + LIBIPW_DEBUG_WX("Auth: %s\n", sec.auth_mode == WLAN_AUTH_OPEN ? "OPEN" : "SHARED KEY"); } @@ -490,16 +490,16 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int libipw_wx_get_encode(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { struct iw_point *erq = &(wrqu->encoding); int len, key; struct lib80211_crypt_data *crypt; - struct ieee80211_security *sec = &ieee->sec; + struct libipw_security *sec = &ieee->sec; - IEEE80211_DEBUG_WX("GET_ENCODE\n"); + LIBIPW_DEBUG_WX("GET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; if (key) { @@ -532,7 +532,7 @@ int ieee80211_wx_get_encode(struct ieee80211_device *ieee, return 0; } -int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, +int libipw_wx_set_encodeext(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -545,7 +545,7 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, struct lib80211_crypto_ops *ops; struct lib80211_crypt_data **crypt; - struct ieee80211_security sec = { + struct libipw_security sec = { .flags = 0, }; @@ -611,7 +611,7 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, module = "lib80211_crypt_ccmp"; break; default: - IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", + LIBIPW_DEBUG_WX("%s: unknown crypto alg %d\n", dev->name, ext->alg); ret = -EINVAL; goto done; @@ -623,7 +623,7 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, ops = lib80211_get_crypto_ops(alg); } if (ops == NULL) { - IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", + LIBIPW_DEBUG_WX("%s: unknown crypto alg %d\n", dev->name, ext->alg); ret = -EINVAL; goto done; @@ -653,7 +653,7 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, if (ext->key_len > 0 && (*crypt)->ops->set_key && (*crypt)->ops->set_key(ext->key, ext->key_len, ext->rx_seq, (*crypt)->priv) < 0) { - IEEE80211_DEBUG_WX("%s: key setting failed\n", dev->name); + LIBIPW_DEBUG_WX("%s: key setting failed\n", dev->name); ret = -EINVAL; goto done; } @@ -700,20 +700,20 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, if (ieee->reset_on_keychange && ieee->iw_mode != IW_MODE_INFRA && ieee->reset_port && ieee->reset_port(dev)) { - IEEE80211_DEBUG_WX("%s: reset_port failed\n", dev->name); + LIBIPW_DEBUG_WX("%s: reset_port failed\n", dev->name); return -EINVAL; } return ret; } -int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee, +int libipw_wx_get_encodeext(struct libipw_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_point *encoding = &wrqu->encoding; struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; - struct ieee80211_security *sec = &ieee->sec; + struct libipw_security *sec = &ieee->sec; int idx, max_key_len; max_key_len = encoding->length - sizeof(*ext); @@ -763,9 +763,9 @@ int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee, return 0; } -EXPORT_SYMBOL(ieee80211_wx_set_encodeext); -EXPORT_SYMBOL(ieee80211_wx_get_encodeext); +EXPORT_SYMBOL(libipw_wx_set_encodeext); +EXPORT_SYMBOL(libipw_wx_get_encodeext); -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(libipw_wx_get_scan); +EXPORT_SYMBOL(libipw_wx_set_encode); +EXPORT_SYMBOL(libipw_wx_get_encode); diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 383177d..82b9c93 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c @@ -46,8 +46,8 @@ #include "iwl-5000-hw.h" /* Highest firmware API version supported */ -#define IWL6000_UCODE_API_MAX 3 -#define IWL6050_UCODE_API_MAX 3 +#define IWL6000_UCODE_API_MAX 4 +#define IWL6050_UCODE_API_MAX 4 /* Lowest firmware API version supported */ #define IWL6000_UCODE_API_MIN 1 @@ -126,6 +126,7 @@ static struct iwl_lib_ops iwl6000_lib = { .release_semaphore = iwlcore_eeprom_release_semaphore, .calib_version = iwl5000_eeprom_calib_version, .query_addr = iwl5000_eeprom_query_addr, + .update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower, }, .post_associate = iwl_post_associate, .isr = iwl_isr_ict, diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index fee110d..26ec969 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c @@ -2546,6 +2546,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta, rate_idx = rate_lowest_index(sband, sta); else if (sband->band == IEEE80211_BAND_5GHZ) rate_idx -= IWL_FIRST_OFDM_RATE; + info->control.rates[0].flags = 0; } info->control.rates[0].idx = rate_idx; diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 2232b17..00457bf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c @@ -2155,7 +2155,7 @@ static void iwl_mac_stop(struct ieee80211_hw *hw) priv->is_open = 0; - if (iwl_is_ready_rf(priv)) { + if (iwl_is_ready_rf(priv) || test_bit(STATUS_SCAN_HW, &priv->status)) { /* stop mac, cancel any scan request and clear * RXON_FILTER_ASSOC_MSK BIT */ @@ -2477,10 +2477,15 @@ static ssize_t store_tx_power(struct device *d, ret = strict_strtoul(buf, 10, &val); if (ret) IWL_INFO(priv, "%s is not in decimal form.\n", buf); - else - iwl_set_tx_power(priv, val, false); - - return count; + else { + ret = iwl_set_tx_power(priv, val, false); + if (ret) + IWL_ERR(priv, "failed setting tx power (0x%d).\n", + ret); + else + ret = count; + } + return ret; } static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index f430384..2c5c88f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h @@ -886,7 +886,6 @@ struct iwl_qosparam_cmd { #define STA_FLG_TX_RATE_MSK cpu_to_le32(1 << 2); #define STA_FLG_PWR_SAVE_MSK cpu_to_le32(1 << 8); -#define STA_FLG_PWR_SAVE_MSK cpu_to_le32(1 << 8); #define STA_FLG_RTS_MIMO_PROT_MSK cpu_to_le32(1 << 17) #define STA_FLG_AGG_MPDU_8US_MSK cpu_to_le32(1 << 18) #define STA_FLG_MAX_AGG_SIZE_POS (19) @@ -2930,6 +2929,20 @@ struct statistics_rx { struct statistics_rx_ht_phy ofdm_ht; } __attribute__ ((packed)); +/** + * struct statistics_tx_power - current tx power + * + * @ant_a: current tx power on chain a in 1/2 dB step + * @ant_b: current tx power on chain b in 1/2 dB step + * @ant_c: current tx power on chain c in 1/2 dB step + */ +struct statistics_tx_power { + u8 ant_a; + u8 ant_b; + u8 ant_c; + u8 reserved; +} __attribute__ ((packed)); + struct statistics_tx_non_phy_agg { __le32 ba_timeout; __le32 ba_reschedule_frames; @@ -2941,8 +2954,6 @@ struct statistics_tx_non_phy_agg { __le32 underrun; __le32 bt_prio_kill; __le32 rx_ba_rsp_cnt; - __le32 reserved2; - __le32 reserved3; } __attribute__ ((packed)); struct statistics_tx { @@ -2961,6 +2972,8 @@ struct statistics_tx { __le32 cts_timeout_collision; __le32 ack_or_ba_timeout_collision; struct statistics_tx_non_phy_agg agg; + struct statistics_tx_power tx_power; + __le32 reserved1; } __attribute__ ((packed)); diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index f1f6dab..0bfd4e9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c @@ -543,8 +543,8 @@ int iwlcore_init_geos(struct iwl_priv *priv) geo_ch->flags |= ch->ht40_extension_channel; - if (ch->max_power_avg > priv->tx_power_channel_lmt) - priv->tx_power_channel_lmt = ch->max_power_avg; + if (ch->max_power_avg > priv->tx_power_device_lmt) + priv->tx_power_device_lmt = ch->max_power_avg; } else { geo_ch->flags |= IEEE80211_CHAN_DISABLED; } @@ -1671,7 +1671,10 @@ int iwl_init_drv(struct iwl_priv *priv) priv->qos_data.qos_cap.val = 0; priv->rates_mask = IWL_RATES_MASK; - priv->tx_power_user_lmt = IWL_TX_POWER_TARGET_POWER_MAX; + /* Set the tx_power_user_lmt to the lowest power level + * this value will get overwritten by channel max power avg + * from eeprom */ + priv->tx_power_user_lmt = IWL_TX_POWER_TARGET_POWER_MIN; ret = iwl_init_channel_map(priv); if (ret) { @@ -1698,6 +1701,8 @@ EXPORT_SYMBOL(iwl_init_drv); int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) { int ret = 0; + s8 prev_tx_power = priv->tx_power_user_lmt; + if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) { IWL_WARN(priv, "Requested user TXPOWER %d below lower limit %d.\n", tx_power, @@ -1705,25 +1710,37 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) return -EINVAL; } - if (tx_power > IWL_TX_POWER_TARGET_POWER_MAX) { - IWL_WARN(priv, "Requested user TXPOWER %d above upper limit %d.\n", - tx_power, - IWL_TX_POWER_TARGET_POWER_MAX); + if (tx_power > priv->tx_power_device_lmt) { + IWL_WARN(priv, + "Requested user TXPOWER %d above upper limit %d.\n", + tx_power, priv->tx_power_device_lmt); return -EINVAL; } if (priv->tx_power_user_lmt != tx_power) force = true; - priv->tx_power_user_lmt = tx_power; - /* if nic is not up don't send command */ - if (!iwl_is_ready_rf(priv)) - return ret; - - if (force && priv->cfg->ops->lib->send_tx_power) - ret = priv->cfg->ops->lib->send_tx_power(priv); + if (iwl_is_ready_rf(priv)) { + priv->tx_power_user_lmt = tx_power; + if (force && priv->cfg->ops->lib->send_tx_power) + ret = priv->cfg->ops->lib->send_tx_power(priv); + else if (!priv->cfg->ops->lib->send_tx_power) + ret = -EOPNOTSUPP; + /* + * if fail to set tx_power, restore the orig. tx power + */ + if (ret) + priv->tx_power_user_lmt = prev_tx_power; + } + /* + * Even this is an async host command, the command + * will always report success from uCode + * So once driver can placing the command into the queue + * successfully, driver can use priv->tx_power_user_lmt + * to reflect the current tx power + */ return ret; } EXPORT_SYMBOL(iwl_set_tx_power); @@ -1806,7 +1823,7 @@ int iwl_reset_ict(struct iwl_priv *priv) spin_lock_irqsave(&priv->lock, flags); iwl_disable_interrupts(priv); - memset(&priv->ict_tbl[0],0, sizeof(u32) * ICT_COUNT); + memset(&priv->ict_tbl[0], 0, sizeof(u32) * ICT_COUNT); val = priv->aligned_ict_tbl_dma >> PAGE_SHIFT; @@ -1884,13 +1901,13 @@ irqreturn_t iwl_isr_ict(int irq, void *data) /* read all entries that not 0 start with ict_index */ while (priv->ict_tbl[priv->ict_index]) { - val |= priv->ict_tbl[priv->ict_index]; + val |= le32_to_cpu(priv->ict_tbl[priv->ict_index]); IWL_DEBUG_ISR(priv, "ICT index %d value 0x%08X\n", - priv->ict_index, - priv->ict_tbl[priv->ict_index]); + priv->ict_index, + le32_to_cpu(priv->ict_tbl[priv->ict_index])); priv->ict_tbl[priv->ict_index] = 0; priv->ict_index = iwl_queue_inc_wrap(priv->ict_index, - ICT_COUNT); + ICT_COUNT); } diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h index 723f38a..cbc6290 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-debug.h @@ -107,6 +107,7 @@ struct iwl_debugfs { struct dentry *file_ucode_general_stats; struct dentry *file_sensitivity; struct dentry *file_chain_noise; + struct dentry *file_tx_power; } dbgfs_debug_files; u32 sram_offset; u32 sram_len; diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index f68fb47..fb84485 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c @@ -1563,6 +1563,57 @@ static ssize_t iwl_dbgfs_chain_noise_read(struct file *file, return ret; } +static ssize_t iwl_dbgfs_tx_power_read(struct file *file, + char __user *user_buf, + size_t count, loff_t *ppos) { + + struct iwl_priv *priv = (struct iwl_priv *)file->private_data; + char buf[128]; + int pos = 0; + ssize_t ret; + const size_t bufsz = sizeof(buf); + struct statistics_tx *tx; + + if (!iwl_is_alive(priv)) + pos += scnprintf(buf + pos, bufsz - pos, "N/A\n"); + else { + /* make request to uCode to retrieve statistics information */ + mutex_lock(&priv->mutex); + ret = iwl_send_statistics_request(priv, 0); + mutex_unlock(&priv->mutex); + + if (ret) { + IWL_ERR(priv, "Error sending statistics request: %zd\n", + ret); + return -EAGAIN; + } + tx = &priv->statistics.tx; + if (tx->tx_power.ant_a || + tx->tx_power.ant_b || + tx->tx_power.ant_c) { + pos += scnprintf(buf + pos, bufsz - pos, + "tx power: (1/2 dB step)\n"); + if ((priv->cfg->valid_tx_ant & ANT_A) && + tx->tx_power.ant_a) + pos += scnprintf(buf + pos, bufsz - pos, + "\tantenna A: 0x%X\n", + tx->tx_power.ant_a); + if ((priv->cfg->valid_tx_ant & ANT_B) && + tx->tx_power.ant_b) + pos += scnprintf(buf + pos, bufsz - pos, + "\tantenna B: 0x%X\n", + tx->tx_power.ant_b); + if ((priv->cfg->valid_tx_ant & ANT_C) && + tx->tx_power.ant_c) + pos += scnprintf(buf + pos, bufsz - pos, + "\tantenna C: 0x%X\n", + tx->tx_power.ant_c); + } else + pos += scnprintf(buf + pos, bufsz - pos, "N/A\n"); + } + return simple_read_from_buffer(user_buf, count, ppos, buf, pos); +} + DEBUGFS_READ_WRITE_FILE_OPS(rx_statistics); DEBUGFS_READ_WRITE_FILE_OPS(tx_statistics); DEBUGFS_READ_WRITE_FILE_OPS(traffic_log); @@ -1573,6 +1624,7 @@ DEBUGFS_READ_FILE_OPS(ucode_tx_stats); DEBUGFS_READ_FILE_OPS(ucode_general_stats); DEBUGFS_READ_FILE_OPS(sensitivity); DEBUGFS_READ_FILE_OPS(chain_noise); +DEBUGFS_READ_FILE_OPS(tx_power); /* * Create the debugfs files and directories @@ -1621,6 +1673,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) DEBUGFS_ADD_FILE(traffic_log, debug); DEBUGFS_ADD_FILE(rx_queue, debug); DEBUGFS_ADD_FILE(tx_queue, debug); + DEBUGFS_ADD_FILE(tx_power, debug); if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { DEBUGFS_ADD_FILE(ucode_rx_stats, debug); DEBUGFS_ADD_FILE(ucode_tx_stats, debug); @@ -1674,6 +1727,7 @@ void iwl_dbgfs_unregister(struct iwl_priv *priv) DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_traffic_log); DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_rx_queue); DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_tx_queue); + DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_tx_power); if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. file_ucode_rx_stats); diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 0178734..028d505 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h @@ -1170,7 +1170,7 @@ struct iwl_priv { struct iwl_hw_params hw_params; /* INT ICT Table */ - u32 *ict_tbl; + __le32 *ict_tbl; dma_addr_t ict_tbl_dma; dma_addr_t aligned_ict_tbl_dma; int ict_index; @@ -1215,7 +1215,7 @@ struct iwl_priv { /* TX Power */ s8 tx_power_user_lmt; - s8 tx_power_channel_lmt; + s8 tx_power_device_lmt; #ifdef CONFIG_IWLWIFI_DEBUG diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index 01b95e8..3d2b93a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c @@ -135,6 +135,78 @@ static const u8 iwl_eeprom_band_7[] = { /* 5.2 ht40 channel */ 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 }; +/** + * struct iwl_txpwr_section: eeprom section information + * @offset: indirect address into eeprom image + * @count: number of "struct iwl_eeprom_enhanced_txpwr" in this section + * @band: band type for the section + * @is_common - true: common section, false: channel section + * @is_cck - true: cck section, false: not cck section + * @is_ht_40 - true: all channel in the section are HT40 channel, + * false: legacy or HT 20 MHz + * ignore if it is common section + * @iwl_eeprom_section_channel: channel array in the section, + * ignore if common section + */ +struct iwl_txpwr_section { + u32 offset; + u8 count; + enum ieee80211_band band; + bool is_common; + bool is_cck; + bool is_ht40; + u8 iwl_eeprom_section_channel[EEPROM_MAX_TXPOWER_SECTION_ELEMENTS]; +}; + +/** + * section 1 - 3 are regulatory tx power apply to all channels based on + * modulation: CCK, OFDM + * Band: 2.4GHz, 5.2GHz + * section 4 - 10 are regulatory tx power apply to specified channels + * For example: + * 1L - Channel 1 Legacy + * 1HT - Channel 1 HT + * (1,+1) - Channel 1 HT40 "_above_" + * + * Section 1: all CCK channels + * Section 2: all 2.4 GHz OFDM (Legacy, HT and HT40) channels + * Section 3: all 5.2 GHz OFDM (Legacy, HT and HT40) channels + * Section 4: 2.4 GHz 20MHz channels: 1L, 1HT, 2L, 2HT, 10L, 10HT, 11L, 11HT + * Section 5: 2.4 GHz 40MHz channels: (1,+1) (2,+1) (6,+1) (7,+1) (9,+1) + * Section 6: 5.2 GHz 20MHz channels: 36L, 64L, 100L, 36HT, 64HT, 100HT + * Section 7: 5.2 GHz 40MHz channels: (36,+1) (60,+1) (100,+1) + * Section 8: 2.4 GHz channel: 13L, 13HT + * Section 9: 2.4 GHz channel: 140L, 140HT + * Section 10: 2.4 GHz 40MHz channels: (132,+1) (44,+1) + * + */ +static const struct iwl_txpwr_section enhinfo[] = { + { EEPROM_LB_CCK_20_COMMON, 1, IEEE80211_BAND_2GHZ, true, true, false }, + { EEPROM_LB_OFDM_COMMON, 3, IEEE80211_BAND_2GHZ, true, false, false }, + { EEPROM_HB_OFDM_COMMON, 3, IEEE80211_BAND_5GHZ, true, false, false }, + { EEPROM_LB_OFDM_20_BAND, 8, IEEE80211_BAND_2GHZ, + false, false, false, + {1, 1, 2, 2, 10, 10, 11, 11 } }, + { EEPROM_LB_OFDM_HT40_BAND, 5, IEEE80211_BAND_2GHZ, + false, false, true, + { 1, 2, 6, 7, 9 } }, + { EEPROM_HB_OFDM_20_BAND, 6, IEEE80211_BAND_5GHZ, + false, false, false, + { 36, 64, 100, 36, 64, 100 } }, + { EEPROM_HB_OFDM_HT40_BAND, 3, IEEE80211_BAND_5GHZ, + false, false, true, + { 36, 60, 100 } }, + { EEPROM_LB_OFDM_20_CHANNEL_13, 2, IEEE80211_BAND_2GHZ, + false, false, false, + { 13, 13 } }, + { EEPROM_HB_OFDM_20_CHANNEL_140, 2, IEEE80211_BAND_5GHZ, + false, false, false, + { 140, 140 } }, + { EEPROM_HB_OFDM_HT40_BAND_1, 2, IEEE80211_BAND_5GHZ, + false, false, true, + { 132, 44 } }, +}; + /****************************************************************************** * * EEPROM related functions @@ -643,6 +715,178 @@ static int iwl_mod_ht40_chan_info(struct iwl_priv *priv, return 0; } +/** + * iwl_get_max_txpower_avg - get the highest tx power from all chains. + * find the highest tx power from all chains for the channel + */ +static s8 iwl_get_max_txpower_avg(struct iwl_priv *priv, + struct iwl_eeprom_enhanced_txpwr *enhanced_txpower, int element) +{ + s8 max_txpower_avg = 0; /* (dBm) */ + + IWL_DEBUG_INFO(priv, "%d - " + "chain_a: %d dB chain_b: %d dB " + "chain_c: %d dB mimo2: %d dB mimo3: %d dB\n", + element, + enhanced_txpower[element].chain_a_max >> 1, + enhanced_txpower[element].chain_b_max >> 1, + enhanced_txpower[element].chain_c_max >> 1, + enhanced_txpower[element].mimo2_max >> 1, + enhanced_txpower[element].mimo3_max >> 1); + /* Take the highest tx power from any valid chains */ + if ((priv->cfg->valid_tx_ant & ANT_A) && + (enhanced_txpower[element].chain_a_max > max_txpower_avg)) + max_txpower_avg = enhanced_txpower[element].chain_a_max; + if ((priv->cfg->valid_tx_ant & ANT_B) && + (enhanced_txpower[element].chain_b_max > max_txpower_avg)) + max_txpower_avg = enhanced_txpower[element].chain_b_max; + if ((priv->cfg->valid_tx_ant & ANT_C) && + (enhanced_txpower[element].chain_c_max > max_txpower_avg)) + max_txpower_avg = enhanced_txpower[element].chain_c_max; + if (((priv->cfg->valid_tx_ant == ANT_AB) | + (priv->cfg->valid_tx_ant == ANT_BC) | + (priv->cfg->valid_tx_ant == ANT_AC)) && + (enhanced_txpower[element].mimo2_max > max_txpower_avg)) + max_txpower_avg = enhanced_txpower[element].mimo2_max; + if ((priv->cfg->valid_tx_ant == ANT_ABC) && + (enhanced_txpower[element].mimo3_max > max_txpower_avg)) + max_txpower_avg = enhanced_txpower[element].mimo3_max; + + /* max. tx power in EEPROM is in 1/2 dBm format + * convert from 1/2 dBm to dBm + */ + return max_txpower_avg >> 1; +} + +/** + * iwl_update_common_txpower: update channel tx power + * update tx power per band based on EEPROM enhanced tx power info. + */ +static s8 iwl_update_common_txpower(struct iwl_priv *priv, + struct iwl_eeprom_enhanced_txpwr *enhanced_txpower, + int section, int element) +{ + struct iwl_channel_info *ch_info; + int ch; + bool is_ht40 = false; + s8 max_txpower_avg; /* (dBm) */ + + /* it is common section, contain all type (Legacy, HT and HT40) + * based on the element in the section to determine + * is it HT 40 or not + */ + if (element == EEPROM_TXPOWER_COMMON_HT40_INDEX) + is_ht40 = true; + max_txpower_avg = + iwl_get_max_txpower_avg(priv, enhanced_txpower, element); + ch_info = priv->channel_info; + + for (ch = 0; ch < priv->channel_count; ch++) { + /* find matching band and update tx power if needed */ + if ((ch_info->band == enhinfo[section].band) && + (ch_info->max_power_avg < max_txpower_avg) && (!is_ht40)) { + /* Update regulatory-based run-time data */ + ch_info->max_power_avg = ch_info->curr_txpow = + max_txpower_avg; + ch_info->scan_power = max_txpower_avg; + } + if ((ch_info->band == enhinfo[section].band) && is_ht40 && + ch_info->ht40_max_power_avg && + (ch_info->ht40_max_power_avg < max_txpower_avg)) { + /* Update regulatory-based run-time data */ + ch_info->ht40_max_power_avg = max_txpower_avg; + ch_info->ht40_curr_txpow = max_txpower_avg; + ch_info->ht40_scan_power = max_txpower_avg; + } + ch_info++; + } + return max_txpower_avg; +} + +/** + * iwl_update_channel_txpower: update channel tx power + * update channel tx power based on EEPROM enhanced tx power info. + */ +static s8 iwl_update_channel_txpower(struct iwl_priv *priv, + struct iwl_eeprom_enhanced_txpwr *enhanced_txpower, + int section, int element) +{ + struct iwl_channel_info *ch_info; + int ch; + u8 channel; + s8 max_txpower_avg; /* (dBm) */ + + channel = enhinfo[section].iwl_eeprom_section_channel[element]; + max_txpower_avg = + iwl_get_max_txpower_avg(priv, enhanced_txpower, element); + + ch_info = priv->channel_info; + for (ch = 0; ch < priv->channel_count; ch++) { + /* find matching channel and update tx power if needed */ + if (ch_info->channel == channel) { + if ((ch_info->max_power_avg < max_txpower_avg) && + (!enhinfo[section].is_ht40)) { + /* Update regulatory-based run-time data */ + ch_info->max_power_avg = max_txpower_avg; + ch_info->curr_txpow = max_txpower_avg; + ch_info->scan_power = max_txpower_avg; + } + if ((enhinfo[section].is_ht40) && + (ch_info->ht40_max_power_avg) && + (ch_info->ht40_max_power_avg < max_txpower_avg)) { + /* Update regulatory-based run-time data */ + ch_info->ht40_max_power_avg = max_txpower_avg; + ch_info->ht40_curr_txpow = max_txpower_avg; + ch_info->ht40_scan_power = max_txpower_avg; + } + break; + } + ch_info++; + } + return max_txpower_avg; +} + +/** + * iwlcore_eeprom_enhanced_txpower: process enhanced tx power info + */ +void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv) +{ + int eeprom_section_count = 0; + int section, element; + struct iwl_eeprom_enhanced_txpwr *enhanced_txpower; + u32 offset; + s8 max_txpower_avg; /* (dBm) */ + + /* Loop through all the sections + * adjust bands and channel's max tx power + * Set the tx_power_user_lmt to the highest power + * supported by any channels and chains + */ + for (section = 0; section < ARRAY_SIZE(enhinfo); section++) { + eeprom_section_count = enhinfo[section].count; + offset = enhinfo[section].offset; + enhanced_txpower = (struct iwl_eeprom_enhanced_txpwr *) + iwl_eeprom_query_addr(priv, offset); + + for (element = 0; element < eeprom_section_count; element++) { + if (enhinfo[section].is_common) + max_txpower_avg = + iwl_update_common_txpower(priv, + enhanced_txpower, section, element); + else + max_txpower_avg = + iwl_update_channel_txpower(priv, + enhanced_txpower, section, element); + + /* Update the tx_power_user_lmt to the highest power + * supported by any channel */ + if (max_txpower_avg > priv->tx_power_user_lmt) + priv->tx_power_user_lmt = max_txpower_avg; + } + } +} +EXPORT_SYMBOL(iwlcore_eeprom_enhanced_txpower); + #define CHECK_AND_PRINT_I(x) ((eeprom_ch_info[ch].flags & EEPROM_CHANNEL_##x) \ ? # x " " : "") @@ -790,6 +1034,14 @@ int iwl_init_channel_map(struct iwl_priv *priv) } } + /* for newer device (6000 series and up) + * EEPROM contain enhanced tx power information + * driver need to process addition information + * to determine the max channel tx power limits + */ + if (priv->cfg->ops->lib->eeprom_ops.update_enhanced_txpower) + priv->cfg->ops->lib->eeprom_ops.update_enhanced_txpower(priv); + return 0; } EXPORT_SYMBOL(iwl_init_channel_map); diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h index ca7920a..6b68db7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h @@ -118,6 +118,30 @@ struct iwl_eeprom_channel { s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ } __attribute__ ((packed)); +/** + * iwl_eeprom_enhanced_txpwr structure + * This structure presents the enhanced regulatory tx power limit layout + * in eeprom image + * Enhanced regulatory tx power portion of eeprom image can be broken down + * into individual structures; each one is 8 bytes in size and contain the + * following information + * @chain_a_max_pwr: chain a max power in 1/2 dBm + * @chain_b_max_pwr: chain b max power in 1/2 dBm + * @chain_c_max_pwr: chain c max power in 1/2 dBm + * @mimo2_max_pwr: mimo2 max power in 1/2 dBm + * @mimo3_max_pwr: mimo3 max power in 1/2 dBm + * + */ +struct iwl_eeprom_enhanced_txpwr { + u16 reserved; + s8 chain_a_max; + s8 chain_b_max; + s8 chain_c_max; + s8 reserved1; + s8 mimo2_max; + s8 mimo3_max; +} __attribute__ ((packed)); + /* 3945 Specific */ #define EEPROM_3945_EEPROM_VERSION (0x2f) @@ -175,6 +199,59 @@ struct iwl_eeprom_channel { #define EEPROM_5000_REG_BAND_52_HT40_CHANNELS ((0x92)\ | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 22 bytes */ +/* 6000 and up regulatory tx power - indirect access */ +/* max. elements per section */ +#define EEPROM_MAX_TXPOWER_SECTION_ELEMENTS (8) +#define EEPROM_TXPOWER_COMMON_HT40_INDEX (2) + +/** + * Partition the enhanced tx power portion of eeprom image into + * 10 sections based on band, modulation, frequency and channel + * + * Section 1: all CCK channels + * Section 2: all 2.4 GHz OFDM (Legacy, HT and HT40 ) channels + * Section 3: all 5.2 GHz OFDM (Legacy, HT and HT40) channels + * Section 4: 2.4 GHz 20MHz channels: 1, 2, 10, 11. Both Legacy and HT + * Section 5: 2.4 GHz 40MHz channels: 1, 2, 6, 7, 9, (_above_) + * Section 6: 5.2 GHz 20MHz channels: 36, 64, 100, both Legacy and HT + * Section 7: 5.2 GHz 40MHz channels: 36, 60, 100 (_above_) + * Section 8: 2.4 GHz channel 13, Both Legacy and HT + * Section 9: 2.4 GHz channel 140, Both Legacy and HT + * Section 10: 2.4 GHz 40MHz channels: 132, 44 (_above_) + */ +/* 2.4 GHz band: CCK */ +#define EEPROM_LB_CCK_20_COMMON ((0xAA)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 8 bytes */ +/* 2.4 GHz band: 20MHz-Legacy, 20MHz-HT, 40MHz-HT */ +#define EEPROM_LB_OFDM_COMMON ((0xB2)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ +/* 5.2 GHz band: 20MHz-Legacy, 20MHz-HT, 40MHz-HT */ +#define EEPROM_HB_OFDM_COMMON ((0xCA)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ +/* 2.4GHz band channels: + * 1Legacy, 1HT, 2Legacy, 2HT, 10Legacy, 10HT, 11Legacy, 11HT */ +#define EEPROM_LB_OFDM_20_BAND ((0xE2)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 64 bytes */ +/* 2.4 GHz band HT40 channels: (1,+1) (2,+1) (6,+1) (7,+1) (9,+1) */ +#define EEPROM_LB_OFDM_HT40_BAND ((0x122)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 40 bytes */ +/* 5.2GHz band channels: 36Legacy, 36HT, 64Legacy, 64HT, 100Legacy, 100HT */ +#define EEPROM_HB_OFDM_20_BAND ((0x14A)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 48 bytes */ +/* 5.2 GHz band HT40 channels: (36,+1) (60,+1) (100,+1) */ +#define EEPROM_HB_OFDM_HT40_BAND ((0x17A)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ +/* 2.4 GHz band, channnel 13: Legacy, HT */ +#define EEPROM_LB_OFDM_20_CHANNEL_13 ((0x192)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ +/* 5.2 GHz band, channnel 140: Legacy, HT */ +#define EEPROM_HB_OFDM_20_CHANNEL_140 ((0x1A2)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ +/* 5.2 GHz band, HT40 channnels (132,+1) (44,+1) */ +#define EEPROM_HB_OFDM_HT40_BAND_1 ((0x1B2)\ + | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ + + /* 5050 Specific */ #define EEPROM_5050_TX_POWER_VERSION (4) #define EEPROM_5050_EEPROM_VERSION (0x21E) @@ -389,6 +466,7 @@ struct iwl_eeprom_ops { void (*release_semaphore) (struct iwl_priv *priv); u16 (*calib_version) (struct iwl_priv *priv); const u8* (*query_addr) (const struct iwl_priv *priv, size_t offset); + void (*update_enhanced_txpower) (struct iwl_priv *priv); }; @@ -403,7 +481,7 @@ int iwlcore_eeprom_verify_signature(struct iwl_priv *priv); int iwlcore_eeprom_acquire_semaphore(struct iwl_priv *priv); void iwlcore_eeprom_release_semaphore(struct iwl_priv *priv); const u8 *iwlcore_eeprom_query_addr(const struct iwl_priv *priv, size_t offset); - +void iwlcore_eeprom_enhanced_txpower(struct iwl_priv *priv); int iwl_init_channel_map(struct iwl_priv *priv); void iwl_free_channel_map(struct iwl_priv *priv); const struct iwl_channel_info *iwl_get_channel_info( diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 353d9a2..e34d3fc 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c @@ -915,6 +915,7 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, u32 len; u32 ampdu_status; u16 fc; + u32 rate_n_flags; /** * REPLY_RX and REPLY_RX_MPDU_CMD are handled differently. @@ -1032,6 +1033,15 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, if (phy_res->phy_flags & RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK) rx_status.flag |= RX_FLAG_SHORTPRE; + /* Set up the HT phy flags */ + rate_n_flags = le32_to_cpu(phy_res->rate_n_flags); + if (rate_n_flags & RATE_MCS_HT_MSK) + rx_status.flag |= RX_FLAG_HT; + if (rate_n_flags & RATE_MCS_HT40_MSK) + rx_status.flag |= RX_FLAG_40MHZ; + if (rate_n_flags & RATE_MCS_SGI_MSK) + rx_status.flag |= RX_FLAG_SHORT_GI; + if (iwl_is_network_packet(priv, header)) { priv->last_rx_rssi = rx_status.signal; priv->last_beacon_time = priv->ucode_beacon_time; diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index c4c916d..4f3a108 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c @@ -796,7 +796,8 @@ void iwl_bg_abort_scan(struct work_struct *work) { struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); - if (!iwl_is_ready(priv)) + if (!test_bit(STATUS_READY, &priv->status) || + !test_bit(STATUS_GEO_CONFIGURED, &priv->status)) return; mutex_lock(&priv->mutex); diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index c6633fe..a2b9ec8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c @@ -520,7 +520,7 @@ int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty) struct iwl_host_cmd cmd = { .id = REPLY_WEPKEY, .data = wep_cmd, - .flags = CMD_ASYNC, + .flags = CMD_SYNC, }; memset(wep_cmd, 0, cmd_size + diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 7686fc7..7bc9c00 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c @@ -718,10 +718,9 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) IWL_DEBUG_TX(priv, "Sending REASSOC frame\n"); #endif - /* drop all data frame if we are not associated */ + /* drop all non-injected data frame if we are not associated */ if (ieee80211_is_data(fc) && - (!iwl_is_monitor_mode(priv) || - !(info->flags & IEEE80211_TX_CTL_INJECTED)) && /* packet injection */ + !(info->flags & IEEE80211_TX_CTL_INJECTED) && (!iwl_is_associated(priv) || ((priv->iw_mode == NL80211_IFTYPE_STATION) && !priv->assoc_id) || !priv->assoc_station_added)) { @@ -732,7 +731,10 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) hdr_len = ieee80211_hdrlen(fc); /* Find (or create) index into station table for destination station */ - sta_id = iwl_get_sta_id(priv, hdr); + if (info->flags & IEEE80211_TX_CTL_INJECTED) + sta_id = priv->hw_params.bcast_sta_id; + else + sta_id = iwl_get_sta_id(priv, hdr); if (sta_id == IWL_INVALID_STATION) { IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", hdr->addr1); diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index f339c5b..3479041 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c @@ -518,9 +518,9 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) IWL_DEBUG_TX(priv, "Sending REASSOC frame\n"); #endif - /* drop all data frame if we are not associated */ + /* drop all non-injected data frame if we are not associated */ if (ieee80211_is_data(fc) && - (!iwl_is_monitor_mode(priv)) && /* packet injection */ + !(info->flags & IEEE80211_TX_CTL_INJECTED) && (!iwl_is_associated(priv) || ((priv->iw_mode == NL80211_IFTYPE_STATION) && !priv->assoc_id))) { IWL_DEBUG_DROP(priv, "Dropping - !iwl_is_associated\n"); @@ -532,7 +532,10 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) hdr_len = ieee80211_hdrlen(fc); /* Find (or create) index into station table for destination station */ - sta_id = iwl_get_sta_id(priv, hdr); + if (info->flags & IEEE80211_TX_CTL_INJECTED) + sta_id = priv->hw_params.bcast_sta_id; + else + sta_id = iwl_get_sta_id(priv, hdr); if (sta_id == IWL_INVALID_STATION) { IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", hdr->addr1); diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index 81f86ef..dd87326 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c @@ -34,7 +34,8 @@ static const u8 bssid_off[ETH_ALEN] __attribute__ ((aligned (2))) = * * @param priv A pointer to struct lbs_private structure * @param rates the buffer which keeps input and output - * @param rates_size the size of rate1 buffer; new size of buffer on return + * @param rates_size the size of rates buffer; new size of buffer on return, + * which will be less than or equal to original rates_size * * @return 0 on success, or -1 on error */ @@ -42,48 +43,42 @@ static int get_common_rates(struct lbs_private *priv, u8 *rates, u16 *rates_size) { - u8 *card_rates = lbs_bg_rates; - size_t num_card_rates = sizeof(lbs_bg_rates); - int ret = 0, i, j; - u8 *tmp; - size_t tmp_size = 0; - - tmp = kzalloc((ARRAY_SIZE(lbs_bg_rates) - 1) * (*rates_size - 1), - GFP_KERNEL); - if (!tmp) - return -1; - - /* For each rate in card_rates that exists in rate1, copy to tmp */ - for (i = 0; card_rates[i] && (i < num_card_rates); i++) { - for (j = 0; rates[j] && (j < *rates_size); j++) { - if (rates[j] == card_rates[i]) - tmp[tmp_size++] = card_rates[i]; + int i, j; + u8 intersection[MAX_RATES]; + u16 intersection_size; + u16 num_rates = 0; + + intersection_size = min_t(u16, *rates_size, ARRAY_SIZE(intersection)); + + /* Allow each rate from 'rates' that is supported by the hardware */ + for (i = 0; i < ARRAY_SIZE(lbs_bg_rates) && lbs_bg_rates[i]; i++) { + for (j = 0; j < intersection_size && rates[j]; j++) { + if (rates[j] == lbs_bg_rates[i]) + intersection[num_rates++] = rates[j]; } } lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size); - lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, num_card_rates); - lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size); + lbs_deb_hex(LBS_DEB_JOIN, "card rates ", lbs_bg_rates, + ARRAY_SIZE(lbs_bg_rates)); + lbs_deb_hex(LBS_DEB_JOIN, "common rates", intersection, num_rates); lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate); if (!priv->enablehwauto) { - for (i = 0; i < tmp_size; i++) { - if (tmp[i] == priv->cur_rate) + for (i = 0; i < num_rates; i++) { + if (intersection[i] == priv->cur_rate) goto done; } lbs_pr_alert("Previously set fixed data rate %#x isn't " "compatible with the network.\n", priv->cur_rate); - ret = -1; - goto done; + return -1; } - ret = 0; done: memset(rates, 0, *rates_size); - *rates_size = min_t(int, tmp_size, *rates_size); - memcpy(rates, tmp, *rates_size); - kfree(tmp); - return ret; + *rates_size = num_rates; + memcpy(rates, intersection, num_rates); + return 0; } @@ -325,8 +320,8 @@ static int lbs_associate(struct lbs_private *priv, rates = (struct mrvl_ie_rates_param_set *) pos; rates->header.type = cpu_to_le16(TLV_TYPE_RATES); - memcpy(&rates->rates, &bss->rates, MAX_RATES); - tmplen = MAX_RATES; + tmplen = min_t(u16, ARRAY_SIZE(bss->rates), MAX_RATES); + memcpy(&rates->rates, &bss->rates, tmplen); if (get_common_rates(priv, rates->rates, &tmplen)) { ret = -1; goto done; @@ -600,7 +595,7 @@ static int lbs_adhoc_join(struct lbs_private *priv, /* Copy Data rates from the rates recorded in scan response */ memset(cmd.bss.rates, 0, sizeof(cmd.bss.rates)); - ratesize = min_t(u16, sizeof(cmd.bss.rates), MAX_RATES); + ratesize = min_t(u16, ARRAY_SIZE(cmd.bss.rates), ARRAY_SIZE (bss->rates)); memcpy(cmd.bss.rates, bss->rates, ratesize); if (get_common_rates(priv, cmd.bss.rates, &ratesize)) { lbs_deb_join("ADHOC_JOIN: get_common_rates returned error.\n"); diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c index 811ffc3..893a55c 100644 --- a/drivers/net/wireless/libertas/debugfs.c +++ b/drivers/net/wireless/libertas/debugfs.c @@ -45,6 +45,8 @@ static ssize_t lbs_dev_info(struct file *file, char __user *userbuf, unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; ssize_t res; + if (!buf) + return -ENOMEM; pos += snprintf(buf+pos, len-pos, "state = %s\n", szStates[priv->connect_status]); @@ -68,6 +70,8 @@ static ssize_t lbs_getscantable(struct file *file, char __user *userbuf, char *buf = (char *)addr; DECLARE_SSID_BUF(ssid); struct bss_descriptor * iter_bss; + if (!buf) + return -ENOMEM; pos += snprintf(buf+pos, len-pos, "# | ch | rssi | bssid | cap | Qual | SSID \n"); @@ -110,6 +114,8 @@ static ssize_t lbs_sleepparams_write(struct file *file, int p1, p2, p3, p4, p5, p6; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, user_buf, buf_size)) { @@ -148,6 +154,8 @@ static ssize_t lbs_sleepparams_read(struct file *file, char __user *userbuf, struct sleep_params sp; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; ret = lbs_cmd_802_11_sleep_params(priv, CMD_ACT_GET, &sp); if (ret) @@ -433,6 +441,8 @@ static ssize_t lbs_rdmac_read(struct file *file, char __user *userbuf, int ret; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; offval.offset = priv->mac_offset; offval.value = 0; @@ -457,6 +467,8 @@ static ssize_t lbs_rdmac_write(struct file *file, ssize_t res, buf_size; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, userbuf, buf_size)) { @@ -481,6 +493,8 @@ static ssize_t lbs_wrmac_write(struct file *file, struct lbs_offset_value offval; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, userbuf, buf_size)) { @@ -515,6 +529,8 @@ static ssize_t lbs_rdbbp_read(struct file *file, char __user *userbuf, int ret; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; offval.offset = priv->bbp_offset; offval.value = 0; @@ -540,6 +556,8 @@ static ssize_t lbs_rdbbp_write(struct file *file, ssize_t res, buf_size; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, userbuf, buf_size)) { @@ -564,6 +582,8 @@ static ssize_t lbs_wrbbp_write(struct file *file, struct lbs_offset_value offval; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, userbuf, buf_size)) { @@ -598,6 +618,8 @@ static ssize_t lbs_rdrf_read(struct file *file, char __user *userbuf, int ret; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; offval.offset = priv->rf_offset; offval.value = 0; @@ -623,6 +645,8 @@ static ssize_t lbs_rdrf_write(struct file *file, ssize_t res, buf_size; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, userbuf, buf_size)) { @@ -647,6 +671,8 @@ static ssize_t lbs_wrrf_write(struct file *file, struct lbs_offset_value offval; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; buf_size = min(count, len - 1); if (copy_from_user(buf, userbuf, buf_size)) { @@ -853,6 +879,8 @@ static ssize_t lbs_debugfs_read(struct file *file, char __user *userbuf, struct debug_data *d; unsigned long addr = get_zeroed_page(GFP_KERNEL); char *buf = (char *)addr; + if (!buf) + return -ENOMEM; p = buf; diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index f658fd6..6238176 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c @@ -59,6 +59,7 @@ struct if_cs_card { struct pcmcia_device *p_dev; struct lbs_private *priv; void __iomem *iobase; + bool align_regs; }; @@ -274,16 +275,25 @@ static int if_cs_poll_while_fw_download(struct if_cs_card *card, uint addr, u8 r #define IF_CS_PRODUCT_ID 0x0000001C #define IF_CS_CF8385_B1_REV 0x12 #define IF_CS_CF8381_B3_REV 0x04 +#define IF_CS_CF8305_B1_REV 0x03 /* * Used to detect other cards than CF8385 since their revisions of silicon * doesn't match those from CF8385, eg. CF8381 B3 works with this driver. */ +#define CF8305_MANFID 0x02db +#define CF8305_CARDID 0x8103 #define CF8381_MANFID 0x02db #define CF8381_CARDID 0x6064 #define CF8385_MANFID 0x02df #define CF8385_CARDID 0x8103 +static inline int if_cs_hw_is_cf8305(struct pcmcia_device *p_dev) +{ + return (p_dev->manf_id == CF8305_MANFID && + p_dev->card_id == CF8305_CARDID); +} + static inline int if_cs_hw_is_cf8381(struct pcmcia_device *p_dev) { return (p_dev->manf_id == CF8381_MANFID && @@ -556,7 +566,15 @@ static int if_cs_prog_helper(struct if_cs_card *card) lbs_deb_enter(LBS_DEB_CS); - scratch = if_cs_read8(card, IF_CS_SCRATCH); + /* + * This is the only place where an unaligned register access happens on + * the CF8305 card, therefore for the sake of speed of the driver, we do + * the alignment correction here. + */ + if (card->align_regs) + scratch = if_cs_read16(card, IF_CS_SCRATCH) >> 8; + else + scratch = if_cs_read8(card, IF_CS_SCRATCH); /* "If the value is 0x5a, the firmware is already * downloaded successfully" @@ -880,8 +898,24 @@ static int if_cs_probe(struct pcmcia_device *p_dev) p_dev->irq.AssignedIRQ, p_dev->io.BasePort1, p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1); + /* + * Most of the libertas cards can do unaligned register access, but some + * weird ones can not. That's especially true for the CF8305 card. + */ + card->align_regs = 0; + /* Check if we have a current silicon */ prod_id = if_cs_read8(card, IF_CS_PRODUCT_ID); + if (if_cs_hw_is_cf8305(p_dev)) { + card->align_regs = 1; + if (prod_id < IF_CS_CF8305_B1_REV) { + lbs_pr_err("old chips like 8305 rev B3 " + "aren't supported\n"); + ret = -ENODEV; + goto out2; + } + } + if (if_cs_hw_is_cf8381(p_dev) && prod_id < IF_CS_CF8381_B3_REV) { lbs_pr_err("old chips like 8381 rev B3 aren't supported\n"); ret = -ENODEV; @@ -896,7 +930,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev) /* Load the firmware early, before calling into libertas.ko */ ret = if_cs_prog_helper(card); - if (ret == 0) + if (ret == 0 && !if_cs_hw_is_cf8305(p_dev)) ret = if_cs_prog_real(card); if (ret) goto out2; @@ -976,6 +1010,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev) /********************************************************************/ static struct pcmcia_device_id if_cs_ids[] = { + PCMCIA_DEVICE_MANF_CARD(CF8305_MANFID, CF8305_CARDID), PCMCIA_DEVICE_MANF_CARD(CF8381_MANFID, CF8381_CARDID), PCMCIA_DEVICE_MANF_CARD(CF8385_MANFID, CF8385_CARDID), PCMCIA_DEVICE_NULL, diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c index 41a708c..746532e 100644 --- a/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c @@ -164,7 +164,7 @@ struct mwl8k_priv { u16 num_mcaddrs; u8 hw_rev; - __le32 fw_rev; + u32 fw_rev; /* * Running count of TX packets in flight, to avoid @@ -1439,8 +1439,11 @@ static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd) return -ENOMEM; rc = mwl8k_fw_lock(hw); - if (rc) + if (rc) { + pci_unmap_single(priv->pdev, dma_addr, dma_size, + PCI_DMA_BIDIRECTIONAL); return rc; + } priv->hostcmd_wait = &cmd_wait; iowrite32(dma_addr, regs + MWL8K_HIU_GEN_PTR); @@ -1471,7 +1474,7 @@ static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd) printk(KERN_ERR "%s: Command %s error 0x%x\n", priv->name, mwl8k_cmd_name(cmd->code, buf, sizeof(buf)), - cmd->result); + le16_to_cpu(cmd->result)); } return rc; @@ -2617,7 +2620,7 @@ static void mwl8k_bss_info_changed(struct ieee80211_hw *hw, priv->capture_beacon = false; rc = mwl8k_fw_lock(hw); - if (!rc) + if (rc) return; if (info->assoc) { @@ -2822,11 +2825,16 @@ static void mwl8k_finalize_join_worker(struct work_struct *work) static int __devinit mwl8k_probe(struct pci_dev *pdev, const struct pci_device_id *id) { + static int printed_version = 0; struct ieee80211_hw *hw; struct mwl8k_priv *priv; int rc; int i; - u8 *fw; + + if (!printed_version) { + printk(KERN_INFO "%s version %s\n", MWL8K_DESC, MWL8K_VERSION); + printed_version = 1; + } rc = pci_enable_device(pdev); if (rc) { @@ -3001,13 +3009,11 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev, goto err_stop_firmware; } - fw = (u8 *)&priv->fw_rev; - printk(KERN_INFO "%s: 88W%u %s\n", priv->name, priv->part_num, - MWL8K_DESC); - printk(KERN_INFO "%s: Driver Ver:%s Firmware Ver:%u.%u.%u.%u\n", - priv->name, MWL8K_VERSION, fw[3], fw[2], fw[1], fw[0]); - printk(KERN_INFO "%s: MAC Address: %pM\n", priv->name, - hw->wiphy->perm_addr); + printk(KERN_INFO "%s: 88w%u v%d, %pM, firmware version %u.%u.%u.%u\n", + wiphy_name(hw->wiphy), priv->part_num, priv->hw_rev, + hw->wiphy->perm_addr, + (priv->fw_rev >> 24) & 0xff, (priv->fw_rev >> 16) & 0xff, + (priv->fw_rev >> 8) & 0xff, priv->fw_rev & 0xff); return 0; diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c index 6fc0b61..b6dda2b 100644 --- a/drivers/net/wireless/p54/txrx.c +++ b/drivers/net/wireless/p54/txrx.c @@ -623,6 +623,9 @@ static void p54_tx_80211_header(struct p54_common *priv, struct sk_buff *skb, if (info->flags & IEEE80211_TX_CTL_PSPOLL_RESPONSE) *flags |= P54_HDR_FLAG_DATA_OUT_NOCANCEL; + if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) + *flags |= P54_HDR_FLAG_DATA_OUT_NOCANCEL; + *queue = skb_get_queue_mapping(skb) + P54_QUEUE_DATA; switch (priv->mode) { diff --git a/drivers/net/wireless/prism54/islpci_eth.c b/drivers/net/wireless/prism54/islpci_eth.c index c255d9c..9b5ee34 100644 --- a/drivers/net/wireless/prism54/islpci_eth.c +++ b/drivers/net/wireless/prism54/islpci_eth.c @@ -50,7 +50,7 @@ islpci_eth_cleanup_transmit(islpci_private *priv, /* check for holes in the arrays caused by multi fragment frames * searching for the last fragment of a frame */ - if (priv->pci_map_tx_address[index] != (dma_addr_t) NULL) { + if (priv->pci_map_tx_address[index]) { /* entry is the last fragment of a frame * free the skb structure and unmap pci memory */ skb = priv->data_low_tx[index]; @@ -450,7 +450,7 @@ islpci_eth_receive(islpci_private *priv) pci_map_single(priv->pdev, (void *) skb->data, MAX_FRAGMENT_SIZE_RX + 2, PCI_DMA_FROMDEVICE); - if (unlikely(priv->pci_map_rx_address[index] == (dma_addr_t) NULL)) { + if (unlikely(!priv->pci_map_rx_address[index])) { /* error mapping the buffer to device accessable memory address */ DEBUG(SHOW_ERROR_MESSAGES, "Error mapping DMA address\n"); diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index d42692d..402d367 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c @@ -358,13 +358,6 @@ struct ndis_80211_assoc_info { __le32 offset_resp_ies; } __attribute__((packed)); -/* these have to match what is in wpa_supplicant */ -enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP }; -enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, - CIPHER_WEP104 }; -enum wpa_key_mgmt { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, - KEY_MGMT_802_1X_NO_WPA, KEY_MGMT_WPA_NONE }; - /* * private data */ @@ -379,6 +372,15 @@ enum wpa_key_mgmt { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, #define WORK_LINK_DOWN (1<<1) #define WORK_SET_MULTICAST_LIST (1<<2) +#define RNDIS_WLAN_ALG_NONE 0 +#define RNDIS_WLAN_ALG_WEP (1<<0) +#define RNDIS_WLAN_ALG_TKIP (1<<1) +#define RNDIS_WLAN_ALG_CCMP (1<<2) + +#define RNDIS_WLAN_KEY_MGMT_NONE 0 +#define RNDIS_WLAN_KEY_MGMT_802_1X (1<<0) +#define RNDIS_WLAN_KEY_MGMT_PSK (1<<1) + #define COMMAND_BUFFER_SIZE (CONTROL_BUFFER_SIZE + sizeof(struct rndis_set)) static const struct ieee80211_channel rndis_channels[] = { @@ -413,9 +415,16 @@ static const struct ieee80211_rate rndis_rates[] = { { .bitrate = 540 } }; +static const u32 rndis_cipher_suites[] = { + WLAN_CIPHER_SUITE_WEP40, + WLAN_CIPHER_SUITE_WEP104, + WLAN_CIPHER_SUITE_TKIP, + WLAN_CIPHER_SUITE_CCMP, +}; + struct rndis_wlan_encr_key { int len; - int cipher; + u32 cipher; u8 material[32]; u8 bssid[ETH_ALEN]; bool pairwise; @@ -431,19 +440,17 @@ struct rndis_wlan_private { struct cfg80211_scan_request *scan_request; struct workqueue_struct *workqueue; - struct delayed_work stats_work; + struct delayed_work dev_poller_work; struct delayed_work scan_work; struct work_struct work; struct mutex command_lock; - spinlock_t stats_lock; unsigned long work_pending; + int last_qual; struct ieee80211_supported_band band; struct ieee80211_channel channels[ARRAY_SIZE(rndis_channels)]; struct ieee80211_rate rates[ARRAY_SIZE(rndis_rates)]; - - struct iw_statistics iwstats; - struct iw_statistics privstats; + u32 cipher_suites[ARRAY_SIZE(rndis_cipher_suites)]; int caps; int multicast_size; @@ -461,14 +468,17 @@ struct rndis_wlan_private { /* hardware state */ int radio_on; int infra_mode; + bool connected; + u8 bssid[ETH_ALEN]; struct ndis_80211_ssid essid; + __le32 current_command_oid; /* encryption stuff */ int encr_tx_key_index; struct rndis_wlan_encr_key encr_keys[4]; + enum nl80211_auth_type wpa_auth_type; int wpa_version; int wpa_keymgmt; - int wpa_authalg; int wpa_ie_len; u8 *wpa_ie; int wpa_cipher_pair; @@ -494,22 +504,57 @@ static int rndis_set_tx_power(struct wiphy *wiphy, enum tx_power_setting type, int dbm); static int rndis_get_tx_power(struct wiphy *wiphy, int *dbm); +static int rndis_connect(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_connect_params *sme); + +static int rndis_disconnect(struct wiphy *wiphy, struct net_device *dev, + u16 reason_code); + +static int rndis_join_ibss(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_ibss_params *params); + +static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev); + +static int rndis_set_channel(struct wiphy *wiphy, + struct ieee80211_channel *chan, enum nl80211_channel_type channel_type); + +static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev, + u8 key_index, const u8 *mac_addr, + struct key_params *params); + +static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev, + u8 key_index, const u8 *mac_addr); + +static int rndis_set_default_key(struct wiphy *wiphy, struct net_device *netdev, + u8 key_index); + +static int rndis_get_station(struct wiphy *wiphy, struct net_device *dev, + u8 *mac, struct station_info *sinfo); + +static int rndis_dump_station(struct wiphy *wiphy, struct net_device *dev, + int idx, u8 *mac, struct station_info *sinfo); + static struct cfg80211_ops rndis_config_ops = { .change_virtual_intf = rndis_change_virtual_intf, .scan = rndis_scan, .set_wiphy_params = rndis_set_wiphy_params, .set_tx_power = rndis_set_tx_power, .get_tx_power = rndis_get_tx_power, + .connect = rndis_connect, + .disconnect = rndis_disconnect, + .join_ibss = rndis_join_ibss, + .leave_ibss = rndis_leave_ibss, + .set_channel = rndis_set_channel, + .add_key = rndis_add_key, + .del_key = rndis_del_key, + .set_default_key = rndis_set_default_key, + .get_station = rndis_get_station, + .dump_station = rndis_dump_station, }; static void *rndis_wiphy_privid = &rndis_wiphy_privid; -static const unsigned char zero_bssid[ETH_ALEN] = {0,}; -static const unsigned char ffff_bssid[ETH_ALEN] = { 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff }; - - static struct rndis_wlan_private *get_rndis_wlan_priv(struct usbnet *dev) { return (struct rndis_wlan_private *)dev->driver_priv; @@ -541,6 +586,34 @@ static bool is_wpa_key(struct rndis_wlan_private *priv, int idx) } +static int rndis_cipher_to_alg(u32 cipher) +{ + switch (cipher) { + default: + return RNDIS_WLAN_ALG_NONE; + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + return RNDIS_WLAN_ALG_WEP; + case WLAN_CIPHER_SUITE_TKIP: + return RNDIS_WLAN_ALG_TKIP; + case WLAN_CIPHER_SUITE_CCMP: + return RNDIS_WLAN_ALG_CCMP; + } +} + +static int rndis_akm_suite_to_key_mgmt(u32 akm_suite) +{ + switch (akm_suite) { + default: + return RNDIS_WLAN_KEY_MGMT_NONE; + case WLAN_AKM_SUITE_8021X: + return RNDIS_WLAN_KEY_MGMT_802_1X; + case WLAN_AKM_SUITE_PSK: + return RNDIS_WLAN_KEY_MGMT_PSK; + } +} + + #ifdef DEBUG static const char *oid_to_string(__le32 oid) { @@ -657,7 +730,9 @@ static int rndis_query_oid(struct usbnet *dev, __le32 oid, void *data, int *len) u.get->msg_len = cpu_to_le32(sizeof *u.get); u.get->oid = oid; + priv->current_command_oid = oid; ret = rndis_command(dev, u.header, buflen); + priv->current_command_oid = 0; if (ret < 0) devdbg(dev, "rndis_query_oid(%s): rndis_command() failed, %d " "(%08x)", oid_to_string(oid), ret, @@ -665,7 +740,8 @@ static int rndis_query_oid(struct usbnet *dev, __le32 oid, void *data, int *len) if (ret == 0) { ret = le32_to_cpu(u.get_c->len); - *len = (*len > ret) ? ret : *len; + if (ret > *len) + *len = ret; memcpy(data, u.buf + le32_to_cpu(u.get_c->offset) + 8, *len); ret = rndis_error_status(u.get_c->status); @@ -717,7 +793,9 @@ static int rndis_set_oid(struct usbnet *dev, __le32 oid, void *data, int len) u.set->handle = cpu_to_le32(0); memcpy(u.buf + sizeof(*u.set), data, len); + priv->current_command_oid = oid; ret = rndis_command(dev, u.header, buflen); + priv->current_command_oid = 0; if (ret < 0) devdbg(dev, "rndis_set_oid(%s): rndis_command() failed, %d " "(%08x)", oid_to_string(oid), ret, @@ -752,6 +830,7 @@ static int rndis_reset(struct usbnet *usbdev) memset(reset, 0, sizeof(*reset)); reset->msg_type = RNDIS_MSG_RESET; reset->msg_len = cpu_to_le32(sizeof(*reset)); + priv->current_command_oid = 0; ret = rndis_command(usbdev, (void *)reset, CONTROL_BUFFER_SIZE); mutex_unlock(&priv->command_lock); @@ -868,73 +947,12 @@ static int level_to_qual(int level) } -static void dsconfig_to_freq(unsigned int dsconfig, struct iw_freq *freq) -{ - freq->e = 0; - freq->i = 0; - freq->flags = 0; - - /* see comment in wireless.h above the "struct iw_freq" - * definition for an explanation of this if - * NOTE: 1000000 is due to the kHz - */ - if (dsconfig > 1000000) { - freq->m = dsconfig / 10; - freq->e = 1; - } else - freq->m = dsconfig; - - /* convert from kHz to Hz */ - freq->e += 3; -} - - -static int freq_to_dsconfig(struct iw_freq *freq, unsigned int *dsconfig) -{ - if (freq->m < 1000 && freq->e == 0) { - if (freq->m >= 1 && freq->m <= 14) - *dsconfig = ieee80211_dsss_chan_to_freq(freq->m) * 1000; - else - return -1; - } else { - int i; - *dsconfig = freq->m; - for (i = freq->e; i > 0; i--) - *dsconfig *= 10; - *dsconfig /= 1000; - } - - return 0; -} - - /* * common functions */ +static int set_infra_mode(struct usbnet *usbdev, int mode); static void restore_keys(struct usbnet *usbdev); - -static int get_essid(struct usbnet *usbdev, struct ndis_80211_ssid *ssid) -{ - int ret, len; - - len = sizeof(*ssid); - ret = rndis_query_oid(usbdev, OID_802_11_SSID, ssid, &len); - - if (ret != 0) - ssid->length = 0; - -#ifdef DEBUG - { - unsigned char tmp[NDIS_802_11_LENGTH_SSID + 1]; - - memcpy(tmp, ssid->essid, le32_to_cpu(ssid->length)); - tmp[le32_to_cpu(ssid->length)] = 0; - devdbg(usbdev, "get_essid: '%s', ret: %d", tmp, ret); - } -#endif - return ret; -} - +static int rndis_check_bssid_list(struct usbnet *usbdev); static int set_essid(struct usbnet *usbdev, struct ndis_80211_ssid *ssid) { @@ -942,6 +960,10 @@ static int set_essid(struct usbnet *usbdev, struct ndis_80211_ssid *ssid) int ret; ret = rndis_set_oid(usbdev, OID_802_11_SSID, ssid, sizeof(*ssid)); + if (ret < 0) { + devwarn(usbdev, "setting SSID failed (%08X)", ret); + return ret; + } if (ret == 0) { memcpy(&priv->essid, ssid, sizeof(priv->essid)); priv->radio_on = 1; @@ -951,6 +973,25 @@ static int set_essid(struct usbnet *usbdev, struct ndis_80211_ssid *ssid) return ret; } +static int set_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN]) +{ + int ret; + + ret = rndis_set_oid(usbdev, OID_802_11_BSSID, bssid, ETH_ALEN); + if (ret < 0) { + devwarn(usbdev, "setting BSSID[%pM] failed (%08X)", bssid, ret); + return ret; + } + + return ret; +} + +static int clear_bssid(struct usbnet *usbdev) +{ + u8 broadcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + return set_bssid(usbdev, broadcast_mac); +} static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN]) { @@ -972,14 +1013,18 @@ static int get_association_info(struct usbnet *usbdev, info, &len); } -static int is_associated(struct usbnet *usbdev) +static bool is_associated(struct usbnet *usbdev) { + struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); u8 bssid[ETH_ALEN]; int ret; + if (!priv->radio_on) + return false; + ret = get_bssid(usbdev, bssid); - return(ret == 0 && memcmp(bssid, zero_bssid, ETH_ALEN) != 0); + return (ret == 0 && !is_zero_ether_addr(bssid)); } @@ -1003,6 +1048,11 @@ static int disassociate(struct usbnet *usbdev, int reset_ssid) /* disassociate causes radio to be turned off; if reset_ssid * is given, set random ssid to enable radio */ if (reset_ssid) { + /* Set device to infrastructure mode so we don't get ad-hoc + * 'media connect' indications with the random ssid. + */ + set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA); + ssid.length = cpu_to_le32(sizeof(ssid.essid)); get_random_bytes(&ssid.essid[2], sizeof(ssid.essid)-2); ssid.essid[0] = 0x1; @@ -1015,34 +1065,34 @@ static int disassociate(struct usbnet *usbdev, int reset_ssid) } -static int set_auth_mode(struct usbnet *usbdev, int wpa_version, int authalg) +static int set_auth_mode(struct usbnet *usbdev, u32 wpa_version, + enum nl80211_auth_type auth_type, int keymgmt) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); __le32 tmp; int auth_mode, ret; devdbg(usbdev, "set_auth_mode: wpa_version=0x%x authalg=0x%x " - "keymgmt=0x%x", wpa_version, authalg, priv->wpa_keymgmt); + "keymgmt=0x%x", wpa_version, auth_type, keymgmt); - if (wpa_version & IW_AUTH_WPA_VERSION_WPA2) { - if (priv->wpa_keymgmt & IW_AUTH_KEY_MGMT_802_1X) + if (wpa_version & NL80211_WPA_VERSION_2) { + if (keymgmt & RNDIS_WLAN_KEY_MGMT_802_1X) auth_mode = NDIS_80211_AUTH_WPA2; else auth_mode = NDIS_80211_AUTH_WPA2_PSK; - } else if (wpa_version & IW_AUTH_WPA_VERSION_WPA) { - if (priv->wpa_keymgmt & IW_AUTH_KEY_MGMT_802_1X) + } else if (wpa_version & NL80211_WPA_VERSION_1) { + if (keymgmt & RNDIS_WLAN_KEY_MGMT_802_1X) auth_mode = NDIS_80211_AUTH_WPA; - else if (priv->wpa_keymgmt & IW_AUTH_KEY_MGMT_PSK) + else if (keymgmt & RNDIS_WLAN_KEY_MGMT_PSK) auth_mode = NDIS_80211_AUTH_WPA_PSK; else auth_mode = NDIS_80211_AUTH_WPA_NONE; - } else if (authalg & IW_AUTH_ALG_SHARED_KEY) { - if (authalg & IW_AUTH_ALG_OPEN_SYSTEM) - auth_mode = NDIS_80211_AUTH_AUTO_SWITCH; - else - auth_mode = NDIS_80211_AUTH_SHARED; - } else + } else if (auth_type == NL80211_AUTHTYPE_SHARED_KEY) + auth_mode = NDIS_80211_AUTH_SHARED; + else if (auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) auth_mode = NDIS_80211_AUTH_OPEN; + else + return -ENOTSUPP; tmp = cpu_to_le32(auth_mode); ret = rndis_set_oid(usbdev, OID_802_11_AUTHENTICATION_MODE, &tmp, @@ -1053,7 +1103,9 @@ static int set_auth_mode(struct usbnet *usbdev, int wpa_version, int authalg) } priv->wpa_version = wpa_version; - priv->wpa_authalg = authalg; + priv->wpa_auth_type = auth_type; + priv->wpa_keymgmt = keymgmt; + return 0; } @@ -1065,8 +1117,8 @@ static int set_priv_filter(struct usbnet *usbdev) devdbg(usbdev, "set_priv_filter: wpa_version=0x%x", priv->wpa_version); - if (priv->wpa_version & IW_AUTH_WPA_VERSION_WPA2 || - priv->wpa_version & IW_AUTH_WPA_VERSION_WPA) + if (priv->wpa_version & NL80211_WPA_VERSION_2 || + priv->wpa_version & NL80211_WPA_VERSION_1) tmp = cpu_to_le32(NDIS_80211_PRIV_8021X_WEP); else tmp = cpu_to_le32(NDIS_80211_PRIV_ACCEPT_ALL); @@ -1083,19 +1135,17 @@ static int set_encr_mode(struct usbnet *usbdev, int pairwise, int groupwise) int encr_mode, ret; devdbg(usbdev, "set_encr_mode: cipher_pair=0x%x cipher_group=0x%x", - pairwise, - groupwise); + pairwise, groupwise); - if (pairwise & IW_AUTH_CIPHER_CCMP) + if (pairwise & RNDIS_WLAN_ALG_CCMP) encr_mode = NDIS_80211_ENCR_CCMP_ENABLED; - else if (pairwise & IW_AUTH_CIPHER_TKIP) + else if (pairwise & RNDIS_WLAN_ALG_TKIP) encr_mode = NDIS_80211_ENCR_TKIP_ENABLED; - else if (pairwise & - (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104)) + else if (pairwise & RNDIS_WLAN_ALG_WEP) encr_mode = NDIS_80211_ENCR_WEP_ENABLED; - else if (groupwise & IW_AUTH_CIPHER_CCMP) + else if (groupwise & RNDIS_WLAN_ALG_CCMP) encr_mode = NDIS_80211_ENCR_CCMP_ENABLED; - else if (groupwise & IW_AUTH_CIPHER_TKIP) + else if (groupwise & RNDIS_WLAN_ALG_TKIP) encr_mode = NDIS_80211_ENCR_TKIP_ENABLED; else encr_mode = NDIS_80211_ENCR_DISABLED; @@ -1114,18 +1164,6 @@ static int set_encr_mode(struct usbnet *usbdev, int pairwise, int groupwise) } -static int set_assoc_params(struct usbnet *usbdev) -{ - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - - set_auth_mode(usbdev, priv->wpa_version, priv->wpa_authalg); - set_priv_filter(usbdev); - set_encr_mode(usbdev, priv->wpa_cipher_pair, priv->wpa_cipher_group); - - return 0; -} - - static int set_infra_mode(struct usbnet *usbdev, int mode) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); @@ -1184,16 +1222,11 @@ static int set_frag_threshold(struct usbnet *usbdev, u32 frag_threshold) static void set_default_iw_params(struct usbnet *usbdev) { - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - - priv->wpa_keymgmt = 0; - priv->wpa_version = 0; - set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA); - set_auth_mode(usbdev, IW_AUTH_WPA_VERSION_DISABLED, - IW_AUTH_ALG_OPEN_SYSTEM); + set_auth_mode(usbdev, 0, NL80211_AUTHTYPE_OPEN_SYSTEM, + RNDIS_WLAN_KEY_MGMT_NONE); set_priv_filter(usbdev); - set_encr_mode(usbdev, IW_AUTH_CIPHER_NONE, IW_AUTH_CIPHER_NONE); + set_encr_mode(usbdev, RNDIS_WLAN_ALG_NONE, RNDIS_WLAN_ALG_NONE); } @@ -1207,14 +1240,49 @@ static int deauthenticate(struct usbnet *usbdev) } +static int set_channel(struct usbnet *usbdev, int channel) +{ + struct ndis_80211_conf config; + unsigned int dsconfig; + int len, ret; + + devdbg(usbdev, "set_channel(%d)", channel); + + /* this OID is valid only when not associated */ + if (is_associated(usbdev)) + return 0; + + dsconfig = ieee80211_dsss_chan_to_freq(channel) * 1000; + + len = sizeof(config); + ret = rndis_query_oid(usbdev, OID_802_11_CONFIGURATION, &config, &len); + if (ret < 0) { + devdbg(usbdev, "set_channel: querying configuration failed"); + return ret; + } + + config.ds_config = cpu_to_le32(dsconfig); + ret = rndis_set_oid(usbdev, OID_802_11_CONFIGURATION, &config, + sizeof(config)); + + devdbg(usbdev, "set_channel: %d -> %d", channel, ret); + + return ret; +} + + /* index must be 0 - N, as per NDIS */ -static int add_wep_key(struct usbnet *usbdev, char *key, int key_len, int index) +static int add_wep_key(struct usbnet *usbdev, const u8 *key, int key_len, + int index) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); struct ndis_80211_wep_key ndis_key; - int cipher, ret; + u32 cipher; + int ret; - if ((key_len != 5 || key_len != 13) || index < 0 || index > 3) + devdbg(usbdev, "add_wep_key(idx: %d, len: %d)", index, key_len); + + if ((key_len != 5 && key_len != 13) || index < 0 || index > 3) return -EINVAL; if (key_len == 5) @@ -1231,8 +1299,8 @@ static int add_wep_key(struct usbnet *usbdev, char *key, int key_len, int index) if (index == priv->encr_tx_key_index) { ndis_key.index |= NDIS_80211_ADDWEP_TRANSMIT_KEY; - ret = set_encr_mode(usbdev, IW_AUTH_CIPHER_WEP104, - IW_AUTH_CIPHER_NONE); + ret = set_encr_mode(usbdev, RNDIS_WLAN_ALG_WEP, + RNDIS_WLAN_ALG_NONE); if (ret) devwarn(usbdev, "encryption couldn't be enabled (%08X)", ret); @@ -1256,8 +1324,8 @@ static int add_wep_key(struct usbnet *usbdev, char *key, int key_len, int index) static int add_wpa_key(struct usbnet *usbdev, const u8 *key, int key_len, - int index, const u8 *addr, const u8 *rx_seq, int cipher, - int flags) + int index, const u8 *addr, const u8 *rx_seq, + int seq_len, u32 cipher, int flags) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); struct ndis_80211_key ndis_key; @@ -1273,12 +1341,20 @@ static int add_wpa_key(struct usbnet *usbdev, const u8 *key, int key_len, key_len); return -EINVAL; } - if ((flags & NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ) && !rx_seq) { - devdbg(usbdev, "add_wpa_key: recv seq flag without buffer"); - return -EINVAL; + if (flags & NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ) { + if (!rx_seq || seq_len <= 0) { + devdbg(usbdev, "add_wpa_key: recv seq flag without" + "buffer"); + return -EINVAL; + } + if (rx_seq && seq_len > sizeof(ndis_key.rsc)) { + devdbg(usbdev, "add_wpa_key: too big recv seq buffer"); + return -EINVAL; + } } - is_addr_ok = addr && memcmp(addr, zero_bssid, ETH_ALEN) != 0 && - memcmp(addr, ffff_bssid, ETH_ALEN) != 0; + + is_addr_ok = addr && !is_zero_ether_addr(addr) && + !is_broadcast_ether_addr(addr); if ((flags & NDIS_80211_ADDKEY_PAIRWISE_KEY) && !is_addr_ok) { devdbg(usbdev, "add_wpa_key: pairwise but bssid invalid (%pM)", addr); @@ -1307,7 +1383,7 @@ static int add_wpa_key(struct usbnet *usbdev, const u8 *key, int key_len, memcpy(ndis_key.material, key, key_len); if (flags & NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ) - memcpy(ndis_key.rsc, rx_seq, 6); + memcpy(ndis_key.rsc, rx_seq, seq_len); if (flags & NDIS_80211_ADDKEY_PAIRWISE_KEY) { /* pairwise key */ @@ -1346,31 +1422,17 @@ static int restore_key(struct usbnet *usbdev, int key_idx) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); struct rndis_wlan_encr_key key; - int flags; + + if (is_wpa_key(priv, key_idx)) + return 0; key = priv->encr_keys[key_idx]; - devdbg(usbdev, "restore_key: %i:%s:%i", key_idx, - is_wpa_key(priv, key_idx) ? "wpa" : "wep", - key.len); + devdbg(usbdev, "restore_key: %i:%i", key_idx, key.len); if (key.len == 0) return 0; - if (is_wpa_key(priv, key_idx)) { - flags = 0; - - /*if (priv->encr_tx_key_index == key_idx) - flags |= NDIS_80211_ADDKEY_TRANSMIT_KEY;*/ - - if (memcmp(key.bssid, zero_bssid, ETH_ALEN) != 0 && - memcmp(key.bssid, ffff_bssid, ETH_ALEN) != 0) - flags |= NDIS_80211_ADDKEY_PAIRWISE_KEY; - - return add_wpa_key(usbdev, key.material, key.len, key_idx, - key.bssid, NULL, key.cipher, flags); - } - return add_wep_key(usbdev, key.material, key.len, key_idx); } @@ -1391,7 +1453,7 @@ static void clear_key(struct rndis_wlan_private *priv, int idx) /* remove_key is for both wep and wpa */ -static int remove_key(struct usbnet *usbdev, int index, u8 bssid[ETH_ALEN]) +static int remove_key(struct usbnet *usbdev, int index, const u8 *bssid) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); struct ndis_80211_remove_key remove_key; @@ -1414,7 +1476,7 @@ static int remove_key(struct usbnet *usbdev, int index, u8 bssid[ETH_ALEN]) remove_key.index = cpu_to_le32(index); if (bssid) { /* pairwise key */ - if (memcmp(bssid, ffff_bssid, ETH_ALEN) != 0) + if (!is_broadcast_ether_addr(bssid)) remove_key.index |= NDIS_80211_ADDKEY_PAIRWISE_KEY; memcpy(remove_key.bssid, bssid, @@ -1441,7 +1503,7 @@ static int remove_key(struct usbnet *usbdev, int index, u8 bssid[ETH_ALEN]) /* if it is transmit key, disable encryption */ if (index == priv->encr_tx_key_index) - set_encr_mode(usbdev, IW_AUTH_CIPHER_NONE, IW_AUTH_CIPHER_NONE); + set_encr_mode(usbdev, RNDIS_WLAN_ALG_NONE, RNDIS_WLAN_ALG_NONE); return 0; } @@ -1515,7 +1577,8 @@ static int rndis_change_virtual_intf(struct wiphy *wiphy, enum nl80211_iftype type, u32 *flags, struct vif_params *params) { - struct usbnet *usbdev = netdev_priv(dev); + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; int mode; switch (type) { @@ -1529,6 +1592,8 @@ static int rndis_change_virtual_intf(struct wiphy *wiphy, return -EINVAL; } + priv->wdev.iftype = type; + return set_infra_mode(usbdev, mode); } @@ -1591,7 +1656,7 @@ static int rndis_get_tx_power(struct wiphy *wiphy, int *dbm) } -#define SCAN_DELAY_JIFFIES (HZ) +#define SCAN_DELAY_JIFFIES (6 * HZ) static int rndis_scan(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_scan_request *request) { @@ -1602,6 +1667,11 @@ static int rndis_scan(struct wiphy *wiphy, struct net_device *dev, devdbg(usbdev, "cfg80211.scan"); + /* Get current bssid list from device before new scan, as new scan + * clears internal bssid list. + */ + rndis_check_bssid_list(usbdev); + if (!request) return -EINVAL; @@ -1636,6 +1706,9 @@ static struct cfg80211_bss *rndis_bss_info_update(struct usbnet *usbdev, int ie_len, bssid_len; u8 *ie; + devdbg(usbdev, " found bssid: '%.32s' [%pM]", bssid->ssid.essid, + bssid->mac); + /* parse bssid structure */ bssid_len = le32_to_cpu(bssid->length); @@ -1675,10 +1748,12 @@ static int rndis_check_bssid_list(struct usbnet *usbdev) struct ndis_80211_bssid_list_ex *bssid_list; struct ndis_80211_bssid_ex *bssid; int ret = -EINVAL, len, count, bssid_len; + bool resized = false; devdbg(usbdev, "check_bssid_list"); len = CONTROL_BUFFER_SIZE; +resize_buf: buf = kmalloc(len, GFP_KERNEL); if (!buf) { ret = -ENOMEM; @@ -1689,11 +1764,18 @@ static int rndis_check_bssid_list(struct usbnet *usbdev) if (ret != 0) goto out; + if (!resized && len > CONTROL_BUFFER_SIZE) { + resized = true; + kfree(buf); + goto resize_buf; + } + bssid_list = buf; bssid = bssid_list->bssid; bssid_len = le32_to_cpu(bssid->length); count = le32_to_cpu(bssid_list->num_items); - devdbg(usbdev, "check_bssid_list: %d BSSIDs found", count); + devdbg(usbdev, "check_bssid_list: %d BSSIDs found (buflen: %d)", count, + len); while (count && ((void *)bssid + bssid_len) <= (buf + len)) { rndis_bss_info_update(usbdev, bssid); @@ -1728,625 +1810,472 @@ static void rndis_get_scan_results(struct work_struct *work) priv->scan_request = NULL; } - -/* - * wireless extension handlers - */ - -static int rndis_iw_commit(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) -{ - /* dummy op */ - return 0; -} - - -static int rndis_iw_set_essid(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *essid) +static int rndis_connect(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_connect_params *sme) { + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; + struct ieee80211_channel *channel = sme->channel; struct ndis_80211_ssid ssid; - int length = wrqu->essid.length; - struct usbnet *usbdev = netdev_priv(dev); + int pairwise = RNDIS_WLAN_ALG_NONE; + int groupwise = RNDIS_WLAN_ALG_NONE; + int keymgmt = RNDIS_WLAN_KEY_MGMT_NONE; + int length, i, ret, chan = -1; - devdbg(usbdev, "SIOCSIWESSID: [flags:%d,len:%d] '%.32s'", - wrqu->essid.flags, wrqu->essid.length, essid); + if (channel) + chan = ieee80211_frequency_to_channel(channel->center_freq); - if (length > NDIS_802_11_LENGTH_SSID) - length = NDIS_802_11_LENGTH_SSID; - - ssid.length = cpu_to_le32(length); - if (length > 0) - memcpy(ssid.essid, essid, length); - else - memset(ssid.essid, 0, NDIS_802_11_LENGTH_SSID); + groupwise = rndis_cipher_to_alg(sme->crypto.cipher_group); + for (i = 0; i < sme->crypto.n_ciphers_pairwise; i++) + pairwise |= + rndis_cipher_to_alg(sme->crypto.ciphers_pairwise[i]); - set_assoc_params(usbdev); + if (sme->crypto.n_ciphers_pairwise > 0 && + pairwise == RNDIS_WLAN_ALG_NONE) { + deverr(usbdev, "Unsupported pairwise cipher"); + return -ENOTSUPP; + } - if (!wrqu->essid.flags || length == 0) - return disassociate(usbdev, 1); - else { - /* Pause and purge rx queue, so we don't pass packets before - * 'media connect'-indication. - */ - usbnet_pause_rx(usbdev); - usbnet_purge_paused_rxq(usbdev); + for (i = 0; i < sme->crypto.n_akm_suites; i++) + keymgmt |= + rndis_akm_suite_to_key_mgmt(sme->crypto.akm_suites[i]); - return set_essid(usbdev, &ssid); + if (sme->crypto.n_akm_suites > 0 && + keymgmt == RNDIS_WLAN_KEY_MGMT_NONE) { + deverr(usbdev, "Invalid keymgmt"); + return -ENOTSUPP; } -} + devdbg(usbdev, "cfg80211.connect('%.32s':[%pM]:%d:[%d,0x%x:0x%x]:[0x%x:" + "0x%x]:0x%x)", sme->ssid, sme->bssid, chan, + sme->privacy, sme->crypto.wpa_versions, sme->auth_type, + groupwise, pairwise, keymgmt); -static int rndis_iw_get_essid(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *essid) -{ - struct ndis_80211_ssid ssid; - struct usbnet *usbdev = netdev_priv(dev); - int ret; - - ret = get_essid(usbdev, &ssid); + if (is_associated(usbdev)) + disassociate(usbdev, false); - if (ret == 0 && le32_to_cpu(ssid.length) > 0) { - wrqu->essid.flags = 1; - wrqu->essid.length = le32_to_cpu(ssid.length); - memcpy(essid, ssid.essid, wrqu->essid.length); - essid[wrqu->essid.length] = 0; - } else { - memset(essid, 0, sizeof(NDIS_802_11_LENGTH_SSID)); - wrqu->essid.flags = 0; - wrqu->essid.length = 0; + ret = set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA); + if (ret < 0) { + devdbg(usbdev, "connect: set_infra_mode failed, %d", ret); + goto err_turn_radio_on; } - devdbg(usbdev, "SIOCGIWESSID: %s", essid); - return ret; -} + ret = set_auth_mode(usbdev, sme->crypto.wpa_versions, sme->auth_type, + keymgmt); + if (ret < 0) { + devdbg(usbdev, "connect: set_auth_mode failed, %d", ret); + goto err_turn_radio_on; + } -static int rndis_iw_get_bssid(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) -{ - struct usbnet *usbdev = netdev_priv(dev); - unsigned char bssid[ETH_ALEN]; - int ret; + set_priv_filter(usbdev); - ret = get_bssid(usbdev, bssid); + ret = set_encr_mode(usbdev, pairwise, groupwise); + if (ret < 0) { + devdbg(usbdev, "connect: set_encr_mode failed, %d", ret); + goto err_turn_radio_on; + } - if (ret == 0) - devdbg(usbdev, "SIOCGIWAP: %pM", bssid); - else - devdbg(usbdev, "SIOCGIWAP: <not associated>"); + if (channel) { + ret = set_channel(usbdev, chan); + if (ret < 0) { + devdbg(usbdev, "connect: set_channel failed, %d", ret); + goto err_turn_radio_on; + } + } - wrqu->ap_addr.sa_family = ARPHRD_ETHER; - memcpy(wrqu->ap_addr.sa_data, bssid, ETH_ALEN); + if (sme->key && ((groupwise | pairwise) & RNDIS_WLAN_ALG_WEP)) { + priv->encr_tx_key_index = sme->key_idx; + ret = add_wep_key(usbdev, sme->key, sme->key_len, sme->key_idx); + if (ret < 0) { + devdbg(usbdev, "connect: add_wep_key failed, %d " + "(%d, %d)", ret, sme->key_len, sme->key_idx); + goto err_turn_radio_on; + } + } - return ret; -} + if (sme->bssid && !is_zero_ether_addr(sme->bssid) && + !is_broadcast_ether_addr(sme->bssid)) { + ret = set_bssid(usbdev, sme->bssid); + if (ret < 0) { + devdbg(usbdev, "connect: set_bssid failed, %d", ret); + goto err_turn_radio_on; + } + } else + clear_bssid(usbdev); + length = sme->ssid_len; + if (length > NDIS_802_11_LENGTH_SSID) + length = NDIS_802_11_LENGTH_SSID; -static int rndis_iw_set_bssid(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) -{ - struct usbnet *usbdev = netdev_priv(dev); - u8 *bssid = (u8 *)wrqu->ap_addr.sa_data; - int ret; + memset(&ssid, 0, sizeof(ssid)); + ssid.length = cpu_to_le32(length); + memcpy(ssid.essid, sme->ssid, length); - devdbg(usbdev, "SIOCSIWAP: %pM", bssid); + /* Pause and purge rx queue, so we don't pass packets before + * 'media connect'-indication. + */ + usbnet_pause_rx(usbdev); + usbnet_purge_paused_rxq(usbdev); - ret = rndis_set_oid(usbdev, OID_802_11_BSSID, bssid, ETH_ALEN); + ret = set_essid(usbdev, &ssid); + if (ret < 0) + devdbg(usbdev, "connect: set_essid failed, %d", ret); + return ret; - /* user apps may set ap's mac address, which is not required; - * they may fail to work if this function fails, so return - * success */ - if (ret) - devwarn(usbdev, "setting AP mac address failed (%08X)", ret); +err_turn_radio_on: + disassociate(usbdev, 1); - return 0; + return ret; } - -static int rndis_iw_set_auth(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_disconnect(struct wiphy *wiphy, struct net_device *dev, + u16 reason_code) { - struct iw_param *p = &wrqu->param; - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - int ret = -ENOTSUPP; - - switch (p->flags & IW_AUTH_INDEX) { - case IW_AUTH_WPA_VERSION: - devdbg(usbdev, "SIOCSIWAUTH: WPA_VERSION, %08x", p->value); - priv->wpa_version = p->value; - ret = 0; - break; - - case IW_AUTH_CIPHER_PAIRWISE: - devdbg(usbdev, "SIOCSIWAUTH: CIPHER_PAIRWISE, %08x", p->value); - priv->wpa_cipher_pair = p->value; - ret = 0; - break; - - case IW_AUTH_CIPHER_GROUP: - devdbg(usbdev, "SIOCSIWAUTH: CIPHER_GROUP, %08x", p->value); - priv->wpa_cipher_group = p->value; - ret = 0; - break; - - case IW_AUTH_KEY_MGMT: - devdbg(usbdev, "SIOCSIWAUTH: KEY_MGMT, %08x", p->value); - priv->wpa_keymgmt = p->value; - ret = 0; - break; - - case IW_AUTH_TKIP_COUNTERMEASURES: - devdbg(usbdev, "SIOCSIWAUTH: TKIP_COUNTERMEASURES, %08x", - p->value); - ret = 0; - break; - - case IW_AUTH_DROP_UNENCRYPTED: - devdbg(usbdev, "SIOCSIWAUTH: DROP_UNENCRYPTED, %08x", p->value); - ret = 0; - break; - - case IW_AUTH_80211_AUTH_ALG: - devdbg(usbdev, "SIOCSIWAUTH: 80211_AUTH_ALG, %08x", p->value); - priv->wpa_authalg = p->value; - ret = 0; - break; - - case IW_AUTH_WPA_ENABLED: - devdbg(usbdev, "SIOCSIWAUTH: WPA_ENABLED, %08x", p->value); - if (wrqu->param.value) - deauthenticate(usbdev); - ret = 0; - break; - - case IW_AUTH_RX_UNENCRYPTED_EAPOL: - devdbg(usbdev, "SIOCSIWAUTH: RX_UNENCRYPTED_EAPOL, %08x", - p->value); - ret = 0; - break; + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; - case IW_AUTH_ROAMING_CONTROL: - devdbg(usbdev, "SIOCSIWAUTH: ROAMING_CONTROL, %08x", p->value); - ret = 0; - break; + devdbg(usbdev, "cfg80211.disconnect(%d)", reason_code); - case IW_AUTH_PRIVACY_INVOKED: - devdbg(usbdev, "SIOCSIWAUTH: invalid cmd %d", - wrqu->param.flags & IW_AUTH_INDEX); - return -EOPNOTSUPP; + priv->connected = false; + memset(priv->bssid, 0, ETH_ALEN); - default: - devdbg(usbdev, "SIOCSIWAUTH: UNKNOWN %08x, %08x", - p->flags & IW_AUTH_INDEX, p->value); - } - return ret; + return deauthenticate(usbdev); } - -static int rndis_iw_get_auth(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_join_ibss(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_ibss_params *params) { - struct iw_param *p = &wrqu->param; - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - - switch (p->flags & IW_AUTH_INDEX) { - case IW_AUTH_WPA_VERSION: - p->value = priv->wpa_version; - break; - case IW_AUTH_CIPHER_PAIRWISE: - p->value = priv->wpa_cipher_pair; - break; - case IW_AUTH_CIPHER_GROUP: - p->value = priv->wpa_cipher_group; - break; - case IW_AUTH_KEY_MGMT: - p->value = priv->wpa_keymgmt; - break; - case IW_AUTH_80211_AUTH_ALG: - p->value = priv->wpa_authalg; - break; - default: - devdbg(usbdev, "SIOCGIWAUTH: invalid cmd %d", - wrqu->param.flags & IW_AUTH_INDEX); - return -EOPNOTSUPP; - } - return 0; -} + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; + struct ieee80211_channel *channel = params->channel; + struct ndis_80211_ssid ssid; + enum nl80211_auth_type auth_type; + int ret, alg, length, chan = -1; + if (channel) + chan = ieee80211_frequency_to_channel(channel->center_freq); -static int rndis_iw_set_encode(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) -{ - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - struct rndis_wlan_encr_key key; - int ret, index, key_len; - u8 *keybuf; + /* TODO: How to handle ad-hoc encryption? + * connect() has *key, join_ibss() doesn't. RNDIS requires key to be + * pre-shared for encryption (open/shared/wpa), is key set before + * join_ibss? Which auth_type to use (not in params)? What about WPA? + */ + if (params->privacy) { + auth_type = NL80211_AUTHTYPE_SHARED_KEY; + alg = RNDIS_WLAN_ALG_WEP; + } else { + auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM; + alg = RNDIS_WLAN_ALG_NONE; + } - index = (wrqu->encoding.flags & IW_ENCODE_INDEX); + devdbg(usbdev, "cfg80211.join_ibss('%.32s':[%pM]:%d:%d)", params->ssid, + params->bssid, chan, params->privacy); - /* iwconfig gives index as 1 - N */ - if (index > 0) - index--; - else - index = priv->encr_tx_key_index; + if (is_associated(usbdev)) + disassociate(usbdev, false); - if (index < 0 || index >= 4) { - devwarn(usbdev, "encryption index out of range (%u)", index); - return -EINVAL; + ret = set_infra_mode(usbdev, NDIS_80211_INFRA_ADHOC); + if (ret < 0) { + devdbg(usbdev, "join_ibss: set_infra_mode failed, %d", ret); + goto err_turn_radio_on; } - /* remove key if disabled */ - if (wrqu->data.flags & IW_ENCODE_DISABLED) { - if (remove_key(usbdev, index, NULL)) - return -EINVAL; - else - return 0; + ret = set_auth_mode(usbdev, 0, auth_type, RNDIS_WLAN_KEY_MGMT_NONE); + if (ret < 0) { + devdbg(usbdev, "join_ibss: set_auth_mode failed, %d", ret); + goto err_turn_radio_on; } - /* global encryption state (for all keys) */ - if (wrqu->data.flags & IW_ENCODE_OPEN) - ret = set_auth_mode(usbdev, IW_AUTH_WPA_VERSION_DISABLED, - IW_AUTH_ALG_OPEN_SYSTEM); - else /*if (wrqu->data.flags & IW_ENCODE_RESTRICTED)*/ - ret = set_auth_mode(usbdev, IW_AUTH_WPA_VERSION_DISABLED, - IW_AUTH_ALG_SHARED_KEY); - if (ret != 0) - return ret; + set_priv_filter(usbdev); - if (wrqu->data.length > 0) { - key_len = wrqu->data.length; - keybuf = extra; - } else { - /* must be set as tx key */ - if (priv->encr_keys[index].len == 0) - return -EINVAL; - key = priv->encr_keys[index]; - key_len = key.len; - keybuf = key.material; - priv->encr_tx_key_index = index; + ret = set_encr_mode(usbdev, alg, RNDIS_WLAN_ALG_NONE); + if (ret < 0) { + devdbg(usbdev, "join_ibss: set_encr_mode failed, %d", ret); + goto err_turn_radio_on; } - if (add_wep_key(usbdev, keybuf, key_len, index) != 0) - return -EINVAL; - - if (index == priv->encr_tx_key_index) - /* ndis drivers want essid to be set after setting encr */ - set_essid(usbdev, &priv->essid); - - return 0; -} + if (channel) { + ret = set_channel(usbdev, chan); + if (ret < 0) { + devdbg(usbdev, "join_ibss: set_channel failed, %d", + ret); + goto err_turn_radio_on; + } + } + if (params->bssid && !is_zero_ether_addr(params->bssid) && + !is_broadcast_ether_addr(params->bssid)) { + ret = set_bssid(usbdev, params->bssid); + if (ret < 0) { + devdbg(usbdev, "join_ibss: set_bssid failed, %d", ret); + goto err_turn_radio_on; + } + } else + clear_bssid(usbdev); -static int rndis_iw_set_encode_ext(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) -{ - struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - int keyidx, flags, cipher; + length = params->ssid_len; + if (length > NDIS_802_11_LENGTH_SSID) + length = NDIS_802_11_LENGTH_SSID; - keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX; + memset(&ssid, 0, sizeof(ssid)); + ssid.length = cpu_to_le32(length); + memcpy(ssid.essid, params->ssid, length); - /* iwconfig gives index as 1 - N */ - if (keyidx) - keyidx--; - else - keyidx = priv->encr_tx_key_index; + /* Don't need to pause rx queue for ad-hoc. */ + usbnet_purge_paused_rxq(usbdev); + usbnet_resume_rx(usbdev); - if (keyidx < 0 || keyidx >= 4) { - devwarn(usbdev, "encryption index out of range (%u)", keyidx); - return -EINVAL; - } + ret = set_essid(usbdev, &ssid); + if (ret < 0) + devdbg(usbdev, "join_ibss: set_essid failed, %d", ret); + return ret; - if (ext->alg == WPA_ALG_WEP) { - if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) - priv->encr_tx_key_index = keyidx; - return add_wep_key(usbdev, ext->key, ext->key_len, keyidx); - } +err_turn_radio_on: + disassociate(usbdev, 1); - cipher = -1; - if (ext->alg == IW_ENCODE_ALG_TKIP) - cipher = WLAN_CIPHER_SUITE_TKIP; - else if (ext->alg == IW_ENCODE_ALG_CCMP) - cipher = WLAN_CIPHER_SUITE_CCMP; + return ret; +} - if ((wrqu->encoding.flags & IW_ENCODE_DISABLED) || - ext->alg == IW_ENCODE_ALG_NONE || ext->key_len == 0) - return remove_key(usbdev, keyidx, NULL); +static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev) +{ + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; - if (cipher == -1) - return -EOPNOTSUPP; + devdbg(usbdev, "cfg80211.leave_ibss()"); - flags = 0; - if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) - flags |= NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ; - if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)) - flags |= NDIS_80211_ADDKEY_PAIRWISE_KEY; - if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) - flags |= NDIS_80211_ADDKEY_TRANSMIT_KEY; + priv->connected = false; + memset(priv->bssid, 0, ETH_ALEN); - return add_wpa_key(usbdev, ext->key, ext->key_len, keyidx, - (u8 *)&ext->addr.sa_data, ext->rx_seq, cipher, - flags); + return deauthenticate(usbdev); } - -static int rndis_iw_set_genie(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_set_channel(struct wiphy *wiphy, + struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) { - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - int ret = 0; - -#ifdef DEBUG - int j; - u8 *gie = extra; - for (j = 0; j < wrqu->data.length; j += 8) - devdbg(usbdev, - "SIOCSIWGENIE %04x - " - "%02x %02x %02x %02x %02x %02x %02x %02x", j, - gie[j + 0], gie[j + 1], gie[j + 2], gie[j + 3], - gie[j + 4], gie[j + 5], gie[j + 6], gie[j + 7]); -#endif - /* clear existing IEs */ - if (priv->wpa_ie_len) { - kfree(priv->wpa_ie); - priv->wpa_ie_len = 0; - } + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; - /* set new IEs */ - priv->wpa_ie = kmalloc(wrqu->data.length, GFP_KERNEL); - if (priv->wpa_ie) { - priv->wpa_ie_len = wrqu->data.length; - memcpy(priv->wpa_ie, extra, priv->wpa_ie_len); - } else - ret = -ENOMEM; - return ret; + return set_channel(usbdev, + ieee80211_frequency_to_channel(chan->center_freq)); } - -static int rndis_iw_get_genie(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev, + u8 key_index, const u8 *mac_addr, + struct key_params *params) { - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; + int flags; - devdbg(usbdev, "SIOCGIWGENIE"); + devdbg(usbdev, "rndis_add_key(%i, %pM, %08x)", key_index, mac_addr, + params->cipher); - if (priv->wpa_ie_len == 0 || priv->wpa_ie == NULL) { - wrqu->data.length = 0; - return 0; - } - - if (wrqu->data.length < priv->wpa_ie_len) - return -E2BIG; + switch (params->cipher) { + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + return add_wep_key(usbdev, params->key, params->key_len, + key_index); + case WLAN_CIPHER_SUITE_TKIP: + case WLAN_CIPHER_SUITE_CCMP: + flags = 0; - wrqu->data.length = priv->wpa_ie_len; - memcpy(extra, priv->wpa_ie, priv->wpa_ie_len); + if (params->seq && params->seq_len > 0) + flags |= NDIS_80211_ADDKEY_SET_INIT_RECV_SEQ; + if (mac_addr) + flags |= NDIS_80211_ADDKEY_PAIRWISE_KEY | + NDIS_80211_ADDKEY_TRANSMIT_KEY; - return 0; + return add_wpa_key(usbdev, params->key, params->key_len, + key_index, mac_addr, params->seq, + params->seq_len, params->cipher, flags); + default: + devdbg(usbdev, "rndis_add_key: unsupported cipher %08x", + params->cipher); + return -ENOTSUPP; + } } - -static int rndis_iw_set_freq(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev, + u8 key_index, const u8 *mac_addr) { - struct usbnet *usbdev = netdev_priv(dev); - struct ndis_80211_conf config; - unsigned int dsconfig; - int len, ret; - - /* this OID is valid only when not associated */ - if (is_associated(usbdev)) - return 0; - - dsconfig = 0; - if (freq_to_dsconfig(&wrqu->freq, &dsconfig)) - return -EINVAL; - - len = sizeof(config); - ret = rndis_query_oid(usbdev, OID_802_11_CONFIGURATION, &config, &len); - if (ret != 0) { - devdbg(usbdev, "SIOCSIWFREQ: querying configuration failed"); - return 0; - } + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; - config.ds_config = cpu_to_le32(dsconfig); + devdbg(usbdev, "rndis_del_key(%i, %pM)", key_index, mac_addr); - devdbg(usbdev, "SIOCSIWFREQ: %d * 10^%d", wrqu->freq.m, wrqu->freq.e); - return rndis_set_oid(usbdev, OID_802_11_CONFIGURATION, &config, - sizeof(config)); + return remove_key(usbdev, key_index, mac_addr); } - -static int rndis_iw_get_freq(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_set_default_key(struct wiphy *wiphy, struct net_device *netdev, + u8 key_index) { - struct usbnet *usbdev = netdev_priv(dev); - struct ndis_80211_conf config; - int len, ret; + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; + struct rndis_wlan_encr_key key; - len = sizeof(config); - ret = rndis_query_oid(usbdev, OID_802_11_CONFIGURATION, &config, &len); - if (ret == 0) - dsconfig_to_freq(le32_to_cpu(config.ds_config), &wrqu->freq); + devdbg(usbdev, "rndis_set_default_key(%i)", key_index); - devdbg(usbdev, "SIOCGIWFREQ: %d", wrqu->freq.m); - return ret; -} + priv->encr_tx_key_index = key_index; + + key = priv->encr_keys[key_index]; + return add_wep_key(usbdev, key.material, key.len, key_index); +} -static int rndis_iw_get_rate(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static void rndis_fill_station_info(struct usbnet *usbdev, + struct station_info *sinfo) { - struct usbnet *usbdev = netdev_priv(dev); - __le32 tmp; + __le32 linkspeed, rssi; int ret, len; - len = sizeof(tmp); - ret = rndis_query_oid(usbdev, OID_GEN_LINK_SPEED, &tmp, &len); + memset(sinfo, 0, sizeof(*sinfo)); + + len = sizeof(linkspeed); + ret = rndis_query_oid(usbdev, OID_GEN_LINK_SPEED, &linkspeed, &len); if (ret == 0) { - wrqu->bitrate.value = le32_to_cpu(tmp) * 100; - wrqu->bitrate.disabled = 0; - wrqu->bitrate.flags = 1; + sinfo->txrate.legacy = le32_to_cpu(linkspeed) / 1000; + sinfo->filled |= STATION_INFO_TX_BITRATE; } - return ret; -} + len = sizeof(rssi); + ret = rndis_query_oid(usbdev, OID_802_11_RSSI, &rssi, &len); + if (ret == 0) { + sinfo->signal = level_to_qual(le32_to_cpu(rssi)); + sinfo->filled |= STATION_INFO_SIGNAL; + } +} -static int rndis_iw_set_mlme(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) +static int rndis_get_station(struct wiphy *wiphy, struct net_device *dev, + u8 *mac, struct station_info *sinfo) { - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - struct iw_mlme *mlme = (struct iw_mlme *)extra; - unsigned char bssid[ETH_ALEN]; + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; - get_bssid(usbdev, bssid); + if (compare_ether_addr(priv->bssid, mac)) + return -ENOENT; - if (memcmp(bssid, mlme->addr.sa_data, ETH_ALEN)) - return -EINVAL; - - switch (mlme->cmd) { - case IW_MLME_DEAUTH: - return deauthenticate(usbdev); - case IW_MLME_DISASSOC: - return disassociate(usbdev, priv->radio_on); - default: - return -EOPNOTSUPP; - } + rndis_fill_station_info(usbdev, sinfo); return 0; } - -static struct iw_statistics *rndis_get_wireless_stats(struct net_device *dev) +static int rndis_dump_station(struct wiphy *wiphy, struct net_device *dev, + int idx, u8 *mac, struct station_info *sinfo) { - struct usbnet *usbdev = netdev_priv(dev); - struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); - unsigned long flags; - - spin_lock_irqsave(&priv->stats_lock, flags); - memcpy(&priv->iwstats, &priv->privstats, sizeof(priv->iwstats)); - spin_unlock_irqrestore(&priv->stats_lock, flags); - - return &priv->iwstats; -} - - -#define IW_IOCTL(x) [(x) - SIOCSIWCOMMIT] -static const iw_handler rndis_iw_handler[] = -{ - IW_IOCTL(SIOCSIWCOMMIT) = rndis_iw_commit, - IW_IOCTL(SIOCGIWNAME) = (iw_handler) cfg80211_wext_giwname, - IW_IOCTL(SIOCSIWFREQ) = rndis_iw_set_freq, - IW_IOCTL(SIOCGIWFREQ) = rndis_iw_get_freq, - IW_IOCTL(SIOCSIWMODE) = (iw_handler) cfg80211_wext_siwmode, - IW_IOCTL(SIOCGIWMODE) = (iw_handler) cfg80211_wext_giwmode, - IW_IOCTL(SIOCGIWRANGE) = (iw_handler) cfg80211_wext_giwrange, - IW_IOCTL(SIOCSIWAP) = rndis_iw_set_bssid, - IW_IOCTL(SIOCGIWAP) = rndis_iw_get_bssid, - IW_IOCTL(SIOCSIWSCAN) = (iw_handler) cfg80211_wext_siwscan, - IW_IOCTL(SIOCGIWSCAN) = (iw_handler) cfg80211_wext_giwscan, - IW_IOCTL(SIOCSIWESSID) = rndis_iw_set_essid, - IW_IOCTL(SIOCGIWESSID) = rndis_iw_get_essid, - IW_IOCTL(SIOCGIWRATE) = rndis_iw_get_rate, - IW_IOCTL(SIOCSIWRTS) = (iw_handler) cfg80211_wext_siwrts, - IW_IOCTL(SIOCGIWRTS) = (iw_handler) cfg80211_wext_giwrts, - IW_IOCTL(SIOCSIWFRAG) = (iw_handler) cfg80211_wext_siwfrag, - IW_IOCTL(SIOCGIWFRAG) = (iw_handler) cfg80211_wext_giwfrag, - IW_IOCTL(SIOCSIWTXPOW) = (iw_handler) cfg80211_wext_siwtxpower, - IW_IOCTL(SIOCGIWTXPOW) = (iw_handler) cfg80211_wext_giwtxpower, - IW_IOCTL(SIOCSIWENCODE) = rndis_iw_set_encode, - IW_IOCTL(SIOCSIWENCODEEXT) = rndis_iw_set_encode_ext, - IW_IOCTL(SIOCSIWAUTH) = rndis_iw_set_auth, - IW_IOCTL(SIOCGIWAUTH) = rndis_iw_get_auth, - IW_IOCTL(SIOCSIWGENIE) = rndis_iw_set_genie, - IW_IOCTL(SIOCGIWGENIE) = rndis_iw_get_genie, - IW_IOCTL(SIOCSIWMLME) = rndis_iw_set_mlme, -}; + struct rndis_wlan_private *priv = wiphy_priv(wiphy); + struct usbnet *usbdev = priv->usbdev; -static const iw_handler rndis_wlan_private_handler[] = { -}; + if (idx != 0) + return -ENOENT; -static const struct iw_priv_args rndis_wlan_private_args[] = { -}; + memcpy(mac, priv->bssid, ETH_ALEN); + rndis_fill_station_info(usbdev, sinfo); -static const struct iw_handler_def rndis_iw_handlers = { - .num_standard = ARRAY_SIZE(rndis_iw_handler), - .num_private = ARRAY_SIZE(rndis_wlan_private_handler), - .num_private_args = ARRAY_SIZE(rndis_wlan_private_args), - .standard = (iw_handler *)rndis_iw_handler, - .private = (iw_handler *)rndis_wlan_private_handler, - .private_args = (struct iw_priv_args *)rndis_wlan_private_args, - .get_wireless_stats = rndis_get_wireless_stats, -}; + return 0; +} -static void rndis_wlan_worker(struct work_struct *work) +static void rndis_wlan_do_link_up_work(struct usbnet *usbdev) { - struct rndis_wlan_private *priv = - container_of(work, struct rndis_wlan_private, work); - struct usbnet *usbdev = priv->usbdev; - union iwreq_data evt; - unsigned char bssid[ETH_ALEN]; + struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); struct ndis_80211_assoc_info *info; - int assoc_size = sizeof(*info) + IW_CUSTOM_MAX + 32; + u8 assoc_buf[sizeof(*info) + IW_CUSTOM_MAX + 32]; + u8 bssid[ETH_ALEN]; + int resp_ie_len, req_ie_len; + u8 *req_ie, *resp_ie; int ret, offset; + bool roamed = false; - if (test_and_clear_bit(WORK_LINK_UP, &priv->work_pending)) { - netif_carrier_on(usbdev->net); + if (priv->infra_mode == NDIS_80211_INFRA_INFRA && priv->connected) { + /* received media connect indication while connected, either + * device reassociated with same AP or roamed to new. */ + roamed = true; + } + + req_ie_len = 0; + resp_ie_len = 0; + req_ie = NULL; + resp_ie = NULL; - info = kzalloc(assoc_size, GFP_KERNEL); - if (!info) - goto get_bssid; + if (priv->infra_mode == NDIS_80211_INFRA_INFRA) { + memset(assoc_buf, 0, sizeof(assoc_buf)); + info = (void *)assoc_buf; /* Get association info IEs from device and send them back to * userspace. */ - ret = get_association_info(usbdev, info, assoc_size); + ret = get_association_info(usbdev, info, sizeof(assoc_buf)); if (!ret) { - evt.data.length = le32_to_cpu(info->req_ie_length); - if (evt.data.length > 0) { + req_ie_len = le32_to_cpu(info->req_ie_length); + if (req_ie_len > 0) { offset = le32_to_cpu(info->offset_req_ies); - wireless_send_event(usbdev->net, - IWEVASSOCREQIE, &evt, - (char *)info + offset); + req_ie = (u8 *)info + offset; } - evt.data.length = le32_to_cpu(info->resp_ie_length); - if (evt.data.length > 0) { + resp_ie_len = le32_to_cpu(info->resp_ie_length); + if (resp_ie_len > 0) { offset = le32_to_cpu(info->offset_resp_ies); - wireless_send_event(usbdev->net, - IWEVASSOCRESPIE, &evt, - (char *)info + offset); + resp_ie = (u8 *)info + offset; } } + } else if (WARN_ON(priv->infra_mode != NDIS_80211_INFRA_ADHOC)) + return; - kfree(info); + ret = get_bssid(usbdev, bssid); + if (ret < 0) + memset(bssid, 0, sizeof(bssid)); -get_bssid: - ret = get_bssid(usbdev, bssid); - if (!ret) { - evt.data.flags = 0; - evt.data.length = 0; - memcpy(evt.ap_addr.sa_data, bssid, ETH_ALEN); - wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL); - } + devdbg(usbdev, "link up work: [%pM] %s", bssid, roamed ? "roamed" : ""); - usbnet_resume_rx(usbdev); - } + /* Internal bss list in device always contains at least the currently + * connected bss and we can get it to cfg80211 with + * rndis_check_bssid_list(). + * NOTE: This is true for Broadcom chip, but not mentioned in RNDIS + * spec. + */ + rndis_check_bssid_list(usbdev); - if (test_and_clear_bit(WORK_LINK_DOWN, &priv->work_pending)) { - netif_carrier_off(usbdev->net); + if (priv->infra_mode == NDIS_80211_INFRA_INFRA) { + if (!roamed) + cfg80211_connect_result(usbdev->net, bssid, req_ie, + req_ie_len, resp_ie, + resp_ie_len, 0, GFP_KERNEL); + else + cfg80211_roamed(usbdev->net, bssid, req_ie, req_ie_len, + resp_ie, resp_ie_len, GFP_KERNEL); + } else if (priv->infra_mode == NDIS_80211_INFRA_ADHOC) + cfg80211_ibss_joined(usbdev->net, bssid, GFP_KERNEL); - evt.data.flags = 0; - evt.data.length = 0; - memset(evt.ap_addr.sa_data, 0, ETH_ALEN); - wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL); - } + priv->connected = true; + memcpy(priv->bssid, bssid, ETH_ALEN); + + usbnet_resume_rx(usbdev); + netif_carrier_on(usbdev->net); +} + +static void rndis_wlan_do_link_down_work(struct usbnet *usbdev) +{ + union iwreq_data evt; + + netif_carrier_off(usbdev->net); + + evt.data.flags = 0; + evt.data.length = 0; + memset(evt.ap_addr.sa_data, 0, ETH_ALEN); + wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL); +} + +static void rndis_wlan_worker(struct work_struct *work) +{ + struct rndis_wlan_private *priv = + container_of(work, struct rndis_wlan_private, work); + struct usbnet *usbdev = priv->usbdev; + + if (test_and_clear_bit(WORK_LINK_UP, &priv->work_pending)) + rndis_wlan_do_link_up_work(usbdev); + + if (test_and_clear_bit(WORK_LINK_DOWN, &priv->work_pending)) + rndis_wlan_do_link_down_work(usbdev); if (test_and_clear_bit(WORK_SET_MULTICAST_LIST, &priv->work_pending)) set_multicast_list(usbdev); @@ -2371,9 +2300,10 @@ static void rndis_wlan_auth_indication(struct usbnet *usbdev, { u8 *buf; const char *type; - int flags, buflen; + int flags, buflen, key_id; bool pairwise_error, group_error; struct ndis_80211_auth_request *auth_req; + enum nl80211_key_type key_type; /* must have at least one array entry */ if (len < offsetof(struct ndis_80211_status_indication, u) + @@ -2409,23 +2339,24 @@ static void rndis_wlan_auth_indication(struct usbnet *usbdev, devinfo(usbdev, "authentication indication: %s (0x%08x)", type, le32_to_cpu(auth_req->flags)); - if (pairwise_error || group_error) { - union iwreq_data wrqu; - struct iw_michaelmicfailure micfailure; + if (pairwise_error) { + key_type = NL80211_KEYTYPE_PAIRWISE; + key_id = -1; - memset(&micfailure, 0, sizeof(micfailure)); - if (pairwise_error) - micfailure.flags |= IW_MICFAILURE_PAIRWISE; - if (group_error) - micfailure.flags |= IW_MICFAILURE_GROUP; + cfg80211_michael_mic_failure(usbdev->net, + auth_req->bssid, + key_type, key_id, NULL, + GFP_KERNEL); + } - memcpy(micfailure.src_addr.sa_data, auth_req->bssid, - ETH_ALEN); + if (group_error) { + key_type = NL80211_KEYTYPE_GROUP; + key_id = -1; - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.data.length = sizeof(micfailure); - wireless_send_event(usbdev->net, IWEVMICHAELMICFAILURE, - &wrqu, (u8 *)&micfailure); + cfg80211_michael_mic_failure(usbdev->net, + auth_req->bssid, + key_type, key_id, NULL, + GFP_KERNEL); } buflen -= le32_to_cpu(auth_req->length); @@ -2470,14 +2401,16 @@ static void rndis_wlan_pmkid_cand_list_indication(struct usbnet *usbdev, return; for (i = 0; i < le32_to_cpu(cand_list->num_candidates); i++) { - struct iw_pmkid_cand pcand; - union iwreq_data wrqu; struct ndis_80211_pmkid_candidate *cand = &cand_list->candidate_list[i]; devdbg(usbdev, "cand[%i]: flags: 0x%08x, bssid: %pM", i, le32_to_cpu(cand->flags), cand->bssid); +#if 0 + struct iw_pmkid_cand pcand; + union iwreq_data wrqu; + memset(&pcand, 0, sizeof(pcand)); if (le32_to_cpu(cand->flags) & 0x01) pcand.flags |= IW_PMKID_CAND_PREAUTH; @@ -2488,6 +2421,7 @@ static void rndis_wlan_pmkid_cand_list_indication(struct usbnet *usbdev, wrqu.data.length = sizeof(pcand); wireless_send_event(usbdev->net, IWEVPMKIDCAND, &wrqu, (u8 *)&pcand); +#endif } } @@ -2550,6 +2484,17 @@ static void rndis_wlan_indication(struct usbnet *usbdev, void *ind, int buflen) switch (msg->status) { case RNDIS_STATUS_MEDIA_CONNECT: + if (priv->current_command_oid == OID_802_11_ADD_KEY) { + /* OID_802_11_ADD_KEY causes sometimes extra + * "media connect" indications which confuses driver + * and userspace to think that device is + * roaming/reassociating when it isn't. + */ + devdbg(usbdev, "ignored OID_802_11_ADD_KEY triggered " + "'media connect'"); + return; + } + usbnet_pause_rx(usbdev); devinfo(usbdev, "media connect"); @@ -2616,77 +2561,44 @@ static int rndis_wlan_get_caps(struct usbnet *usbdev) } -#define STATS_UPDATE_JIFFIES (HZ) -static void rndis_update_wireless_stats(struct work_struct *work) +#define DEVICE_POLLER_JIFFIES (HZ) +static void rndis_device_poller(struct work_struct *work) { struct rndis_wlan_private *priv = - container_of(work, struct rndis_wlan_private, stats_work.work); + container_of(work, struct rndis_wlan_private, + dev_poller_work.work); struct usbnet *usbdev = priv->usbdev; - struct iw_statistics iwstats; __le32 rssi, tmp; int len, ret, j; - unsigned long flags; - int update_jiffies = STATS_UPDATE_JIFFIES; + int update_jiffies = DEVICE_POLLER_JIFFIES; void *buf; - spin_lock_irqsave(&priv->stats_lock, flags); - memcpy(&iwstats, &priv->privstats, sizeof(iwstats)); - spin_unlock_irqrestore(&priv->stats_lock, flags); - - /* only update stats when connected */ - if (!is_associated(usbdev)) { - iwstats.qual.qual = 0; - iwstats.qual.level = 0; - iwstats.qual.updated = IW_QUAL_QUAL_UPDATED - | IW_QUAL_LEVEL_UPDATED - | IW_QUAL_NOISE_INVALID - | IW_QUAL_QUAL_INVALID - | IW_QUAL_LEVEL_INVALID; + /* Only check/do workaround when connected. Calling is_associated() + * also polls device with rndis_command() and catches for media link + * indications. + */ + if (!is_associated(usbdev)) goto end; - } len = sizeof(rssi); ret = rndis_query_oid(usbdev, OID_802_11_RSSI, &rssi, &len); - - devdbg(usbdev, "stats: OID_802_11_RSSI -> %d, rssi:%d", ret, - le32_to_cpu(rssi)); - if (ret == 0) { - memset(&iwstats.qual, 0, sizeof(iwstats.qual)); - iwstats.qual.qual = level_to_qual(le32_to_cpu(rssi)); - iwstats.qual.level = level_to_qual(le32_to_cpu(rssi)); - iwstats.qual.updated = IW_QUAL_QUAL_UPDATED - | IW_QUAL_LEVEL_UPDATED - | IW_QUAL_NOISE_INVALID; - } - - memset(&iwstats.discard, 0, sizeof(iwstats.discard)); - - len = sizeof(tmp); - ret = rndis_query_oid(usbdev, OID_GEN_XMIT_ERROR, &tmp, &len); - if (ret == 0) - iwstats.discard.misc += le32_to_cpu(tmp); - - len = sizeof(tmp); - ret = rndis_query_oid(usbdev, OID_GEN_RCV_ERROR, &tmp, &len); if (ret == 0) - iwstats.discard.misc += le32_to_cpu(tmp); + priv->last_qual = level_to_qual(le32_to_cpu(rssi)); - len = sizeof(tmp); - ret = rndis_query_oid(usbdev, OID_GEN_RCV_NO_BUFFER, &tmp, &len); - if (ret == 0) - iwstats.discard.misc += le32_to_cpu(tmp); + devdbg(usbdev, "dev-poller: OID_802_11_RSSI -> %d, rssi:%d, qual: %d", + ret, le32_to_cpu(rssi), level_to_qual(le32_to_cpu(rssi))); /* Workaround transfer stalls on poor quality links. * TODO: find right way to fix these stalls (as stalls do not happen * with ndiswrapper/windows driver). */ - if (iwstats.qual.qual <= 25) { + if (priv->last_qual <= 25) { /* Decrease stats worker interval to catch stalls. * faster. Faster than 400-500ms causes packet loss, * Slower doesn't catch stalls fast enough. */ j = msecs_to_jiffies(priv->param_workaround_interval); - if (j > STATS_UPDATE_JIFFIES) - j = STATS_UPDATE_JIFFIES; + if (j > DEVICE_POLLER_JIFFIES) + j = DEVICE_POLLER_JIFFIES; else if (j <= 0) j = 1; update_jiffies = j; @@ -2706,11 +2618,8 @@ static void rndis_update_wireless_stats(struct work_struct *work) rndis_query_oid(usbdev, OID_802_11_BSSID_LIST, buf, &len); kfree(buf); } -end: - spin_lock_irqsave(&priv->stats_lock, flags); - memcpy(&priv->privstats, &iwstats, sizeof(iwstats)); - spin_unlock_irqrestore(&priv->stats_lock, flags); +end: if (update_jiffies >= HZ) update_jiffies = round_jiffies_relative(update_jiffies); else { @@ -2719,7 +2628,8 @@ end: update_jiffies = j; } - queue_delayed_work(priv->workqueue, &priv->stats_work, update_jiffies); + queue_delayed_work(priv->workqueue, &priv->dev_poller_work, + update_jiffies); } @@ -2836,16 +2746,14 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) * Otherwise we'll be in big trouble in rndis_wlan_early_init(). */ usbdev->driver_priv = priv; - usbdev->net->wireless_handlers = &rndis_iw_handlers; priv->usbdev = usbdev; mutex_init(&priv->command_lock); - spin_lock_init(&priv->stats_lock); /* because rndis_command() sleeps we need to use workqueue */ priv->workqueue = create_singlethread_workqueue("rndis_wlan"); INIT_WORK(&priv->work, rndis_wlan_worker); - INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats); + INIT_DELAYED_WORK(&priv->dev_poller_work, rndis_device_poller); INIT_DELAYED_WORK(&priv->scan_work, rndis_get_scan_results); /* try bind rndis_host */ @@ -2877,14 +2785,6 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) else usbdev->net->flags &= ~IFF_MULTICAST; - priv->iwstats.qual.qual = 0; - priv->iwstats.qual.level = 0; - priv->iwstats.qual.updated = IW_QUAL_QUAL_UPDATED - | IW_QUAL_LEVEL_UPDATED - | IW_QUAL_NOISE_INVALID - | IW_QUAL_QUAL_INVALID - | IW_QUAL_LEVEL_INVALID; - /* fill-out wiphy structure and register w/ cfg80211 */ memcpy(wiphy->perm_addr, usbdev->net->dev_addr, ETH_ALEN); wiphy->privid = rndis_wiphy_privid; @@ -2892,7 +2792,7 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) | BIT(NL80211_IFTYPE_ADHOC); wiphy->max_scan_ssids = 1; - /* TODO: fill-out band information based on priv->caps */ + /* TODO: fill-out band/encr information based on priv->caps */ rndis_wlan_get_caps(usbdev); memcpy(priv->channels, rndis_channels, sizeof(rndis_channels)); @@ -2904,6 +2804,11 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band; wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; + memcpy(priv->cipher_suites, rndis_cipher_suites, + sizeof(rndis_cipher_suites)); + wiphy->cipher_suites = priv->cipher_suites; + wiphy->n_cipher_suites = ARRAY_SIZE(rndis_cipher_suites); + set_wiphy_dev(wiphy, &usbdev->udev->dev); if (wiphy_register(wiphy)) { @@ -2925,7 +2830,7 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf) return 0; fail: - cancel_delayed_work_sync(&priv->stats_work); + cancel_delayed_work_sync(&priv->dev_poller_work); cancel_delayed_work_sync(&priv->scan_work); cancel_work_sync(&priv->work); flush_workqueue(priv->workqueue); @@ -2943,7 +2848,7 @@ static void rndis_wlan_unbind(struct usbnet *usbdev, struct usb_interface *intf) /* turn radio off */ disassociate(usbdev, 0); - cancel_delayed_work_sync(&priv->stats_work); + cancel_delayed_work_sync(&priv->dev_poller_work); cancel_delayed_work_sync(&priv->scan_work); cancel_work_sync(&priv->work); flush_workqueue(priv->workqueue); @@ -2974,8 +2879,8 @@ static int rndis_wlan_reset(struct usbnet *usbdev) (set_multicast_list() also turns on current packet filter) */ set_multicast_list(usbdev); - queue_delayed_work(priv->workqueue, &priv->stats_work, - round_jiffies_relative(STATS_UPDATE_JIFFIES)); + queue_delayed_work(priv->workqueue, &priv->dev_poller_work, + round_jiffies_relative(DEVICE_POLLER_JIFFIES)); return deauthenticate(usbdev); } @@ -2992,7 +2897,7 @@ static int rndis_wlan_stop(struct usbnet *usbdev) retval = disassociate(usbdev, 0); priv->work_pending = 0; - cancel_delayed_work_sync(&priv->stats_work); + cancel_delayed_work_sync(&priv->dev_poller_work); cancel_delayed_work_sync(&priv->scan_work); cancel_work_sync(&priv->work); flush_workqueue(priv->workqueue); diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index a91f316..929b85f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c @@ -582,7 +582,6 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, { struct rt2x00_dev *rt2x00dev = hw->priv; struct rt2x00_intf *intf = vif_to_intf(vif); - unsigned int delayed = 0; int update_bssid = 0; /* @@ -645,13 +644,6 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, */ if (changes & ~(BSS_CHANGED_ASSOC | BSS_CHANGED_HT)) rt2x00lib_config_erp(rt2x00dev, intf, bss_conf); - - spin_lock(&intf->lock); - if (delayed) { - intf->delayed_flags |= delayed; - schedule_work(&rt2x00dev->intf_work); - } - spin_unlock(&intf->lock); } EXPORT_SYMBOL_GPL(rt2x00mac_bss_info_changed); diff --git a/drivers/net/wireless/rtl818x/Makefile b/drivers/net/wireless/rtl818x/Makefile index 37e3d4d..93cbfbe 100644 --- a/drivers/net/wireless/rtl818x/Makefile +++ b/drivers/net/wireless/rtl818x/Makefile @@ -1,5 +1,5 @@ rtl8180-objs := rtl8180_dev.o rtl8180_rtl8225.o rtl8180_sa2400.o rtl8180_max2820.o rtl8180_grf5101.o -rtl8187-objs := rtl8187_dev.o rtl8187_rtl8225.o rtl8187_leds.o +rtl8187-objs := rtl8187_dev.o rtl8187_rtl8225.o rtl8187_leds.o rtl8187_rfkill.o obj-$(CONFIG_RTL8180) += rtl8180.o obj-$(CONFIG_RTL8187) += rtl8187.o diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h index c09bfef..bf9175a 100644 --- a/drivers/net/wireless/rtl818x/rtl8187.h +++ b/drivers/net/wireless/rtl818x/rtl8187.h @@ -133,6 +133,7 @@ struct rtl8187_priv { __le16 bits16; __le32 bits32; } *io_dmabuf; + bool rfkill_off; }; void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 90f3835..9679b29 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c @@ -32,6 +32,7 @@ #ifdef CONFIG_RTL8187_LEDS #include "rtl8187_leds.h" #endif +#include "rtl8187_rfkill.h" MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>"); MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>"); @@ -648,10 +649,10 @@ static int rtl8187_init_hw(struct ieee80211_hw *dev) /* setup card */ rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0); - rtl818x_iowrite8(priv, &priv->map->GPIO, 0); + rtl818x_iowrite8(priv, &priv->map->GPIO0, 0); rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8)); - rtl818x_iowrite8(priv, &priv->map->GPIO, 1); + rtl818x_iowrite8(priv, &priv->map->GPIO0, 1); rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0); rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); @@ -674,11 +675,11 @@ static int rtl8187_init_hw(struct ieee80211_hw *dev) /* host_usb_init */ rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0); - rtl818x_iowrite8(priv, &priv->map->GPIO, 0); + rtl818x_iowrite8(priv, &priv->map->GPIO0, 0); reg = rtl818x_ioread8(priv, (u8 *)0xFE53); rtl818x_iowrite8(priv, (u8 *)0xFE53, reg | (1 << 7)); rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8)); - rtl818x_iowrite8(priv, &priv->map->GPIO, 0x20); + rtl818x_iowrite8(priv, &priv->map->GPIO0, 0x20); rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0); rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x80); rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0x80); @@ -907,12 +908,12 @@ static int rtl8187_start(struct ieee80211_hw *dev) u32 reg; int ret; + mutex_lock(&priv->conf_mutex); + ret = (!priv->is_rtl8187b) ? rtl8187_init_hw(dev) : rtl8187b_init_hw(dev); if (ret) - return ret; - - mutex_lock(&priv->conf_mutex); + goto rtl8187_start_exit; init_usb_anchor(&priv->anchored); priv->dev = dev; @@ -939,8 +940,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) (7 << 21 /* MAX TX DMA */)); rtl8187_init_urbs(dev); rtl8187b_init_status_urb(dev); - mutex_unlock(&priv->conf_mutex); - return 0; + goto rtl8187_start_exit; } rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0xFFFF); @@ -984,9 +984,10 @@ static int rtl8187_start(struct ieee80211_hw *dev) reg |= RTL818X_CMD_RX_ENABLE; rtl818x_iowrite8(priv, &priv->map->CMD, reg); INIT_DELAYED_WORK(&priv->work, rtl8187_work); - mutex_unlock(&priv->conf_mutex); - return 0; +rtl8187_start_exit: + mutex_unlock(&priv->conf_mutex); + return ret; } static void rtl8187_stop(struct ieee80211_hw *dev) @@ -1014,9 +1015,10 @@ static void rtl8187_stop(struct ieee80211_hw *dev) dev_kfree_skb_any(skb); usb_kill_anchored_urbs(&priv->anchored); + mutex_unlock(&priv->conf_mutex); + if (!priv->is_rtl8187b) cancel_delayed_work_sync(&priv->work); - mutex_unlock(&priv->conf_mutex); } static int rtl8187_add_interface(struct ieee80211_hw *dev, @@ -1276,7 +1278,8 @@ static const struct ieee80211_ops rtl8187_ops = { .bss_info_changed = rtl8187_bss_info_changed, .prepare_multicast = rtl8187_prepare_multicast, .configure_filter = rtl8187_configure_filter, - .conf_tx = rtl8187_conf_tx + .conf_tx = rtl8187_conf_tx, + .rfkill_poll = rtl8187_rfkill_poll }; static void rtl8187_eeprom_register_read(struct eeprom_93cx6 *eeprom) @@ -1516,6 +1519,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, reg &= 0xFF; rtl8187_leds_init(dev, reg); #endif + rtl8187_rfkill_init(dev); return 0; @@ -1539,6 +1543,7 @@ static void __devexit rtl8187_disconnect(struct usb_interface *intf) #ifdef CONFIG_RTL8187_LEDS rtl8187_leds_exit(dev); #endif + rtl8187_rfkill_exit(dev); ieee80211_unregister_hw(dev); priv = dev->priv; diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c index a6cfb7e..a1c670f 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c @@ -42,7 +42,7 @@ static void led_turn_on(struct work_struct *work) mutex_lock(&priv->conf_mutex); switch (led->ledpin) { case LED_PIN_GPIO0: - rtl818x_iowrite8(priv, &priv->map->GPIO, 0x01); + rtl818x_iowrite8(priv, &priv->map->GPIO0, 0x01); rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0x00); break; case LED_PIN_LED0: @@ -80,7 +80,7 @@ static void led_turn_off(struct work_struct *work) mutex_lock(&priv->conf_mutex); switch (led->ledpin) { case LED_PIN_GPIO0: - rtl818x_iowrite8(priv, &priv->map->GPIO, 0x01); + rtl818x_iowrite8(priv, &priv->map->GPIO0, 0x01); rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0x01); break; case LED_PIN_LED0: diff --git a/drivers/net/wireless/rtl818x/rtl8187_rfkill.c b/drivers/net/wireless/rtl818x/rtl8187_rfkill.c new file mode 100644 index 0000000..9fab13e --- /dev/null +++ b/drivers/net/wireless/rtl818x/rtl8187_rfkill.c @@ -0,0 +1,63 @@ +/* + * Linux RFKILL support for RTL8187 + * + * Copyright (c) 2009 Herton Ronaldo Krzesinski <herton@mandriva.com.br> + * + * Based on the RFKILL handling in the r8187 driver, which is: + * Copyright (c) Realtek Semiconductor Corp. All rights reserved. + * + * Thanks to Realtek for their support! + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/types.h> +#include <linux/usb.h> +#include <net/mac80211.h> + +#include "rtl8187.h" + +static bool rtl8187_is_radio_enabled(struct rtl8187_priv *priv) +{ + u8 gpio; + + gpio = rtl818x_ioread8(priv, &priv->map->GPIO0); + rtl818x_iowrite8(priv, &priv->map->GPIO0, gpio & ~0x02); + gpio = rtl818x_ioread8(priv, &priv->map->GPIO1); + + return gpio & 0x02; +} + +void rtl8187_rfkill_init(struct ieee80211_hw *hw) +{ + struct rtl8187_priv *priv = hw->priv; + + priv->rfkill_off = rtl8187_is_radio_enabled(priv); + printk(KERN_INFO "rtl8187: wireless switch is %s\n", + priv->rfkill_off ? "on" : "off"); + wiphy_rfkill_set_hw_state(hw->wiphy, !priv->rfkill_off); + wiphy_rfkill_start_polling(hw->wiphy); +} + +void rtl8187_rfkill_poll(struct ieee80211_hw *hw) +{ + bool enabled; + struct rtl8187_priv *priv = hw->priv; + + mutex_lock(&priv->conf_mutex); + enabled = rtl8187_is_radio_enabled(priv); + if (unlikely(enabled != priv->rfkill_off)) { + priv->rfkill_off = enabled; + printk(KERN_INFO "rtl8187: wireless radio switch turned %s\n", + enabled ? "on" : "off"); + wiphy_rfkill_set_hw_state(hw->wiphy, !enabled); + } + mutex_unlock(&priv->conf_mutex); +} + +void rtl8187_rfkill_exit(struct ieee80211_hw *hw) +{ + wiphy_rfkill_stop_polling(hw->wiphy); +} diff --git a/drivers/net/wireless/rtl818x/rtl8187_rfkill.h b/drivers/net/wireless/rtl818x/rtl8187_rfkill.h new file mode 100644 index 0000000..e12575e --- /dev/null +++ b/drivers/net/wireless/rtl818x/rtl8187_rfkill.h @@ -0,0 +1,8 @@ +#ifndef RTL8187_RFKILL_H +#define RTL8187_RFKILL_H + +void rtl8187_rfkill_init(struct ieee80211_hw *hw); +void rtl8187_rfkill_poll(struct ieee80211_hw *hw); +void rtl8187_rfkill_exit(struct ieee80211_hw *hw); + +#endif /* RTL8187_RFKILL_H */ diff --git a/drivers/net/wireless/rtl818x/rtl818x.h b/drivers/net/wireless/rtl818x/rtl818x.h index 562222e..8522490 100644 --- a/drivers/net/wireless/rtl818x/rtl818x.h +++ b/drivers/net/wireless/rtl818x/rtl818x.h @@ -138,8 +138,9 @@ struct rtl818x_csr { __le32 RF_PARA; __le32 RF_TIMING; u8 GP_ENABLE; - u8 GPIO; - u8 reserved_12[2]; + u8 GPIO0; + u8 GPIO1; + u8 reserved_12; __le32 HSSI_PARA; u8 reserved_13[4]; u8 TX_AGC_CTL; diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index 447e1d1..31a2b4e 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h @@ -435,6 +435,7 @@ struct qeth_qdio_out_q { * index of buffer to be filled by driver; state EMPTY or PACKING */ int next_buf_to_fill; + int sync_iqdio_error; /* * number of buffers that are currently filled (PRIMED) * -> these buffers are hardware-owned @@ -685,6 +686,14 @@ struct qeth_mc_mac { int is_vmac; }; +struct qeth_skb_data { + __u32 magic; + int count; +}; + +#define QETH_SKB_MAGIC 0x71657468 +#define QETH_SIGA_CC2_RETRIES 3 + struct qeth_card { struct list_head list; enum qeth_card_states state; @@ -834,7 +843,6 @@ int qeth_default_setadapterparms_cb(struct qeth_card *, struct qeth_reply *, int qeth_send_control_data(struct qeth_card *, int, struct qeth_cmd_buffer *, int (*reply_cb)(struct qeth_card *, struct qeth_reply*, unsigned long), void *reply_param); -int qeth_get_cast_type(struct qeth_card *, struct sk_buff *); int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int); int qeth_get_elements_no(struct qeth_card *, void *, struct sk_buff *, int); int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *, diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index d53621c..c4a42d9 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c @@ -927,8 +927,8 @@ out: return; } -static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, - struct qeth_qdio_out_buffer *buf) +static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, + struct qeth_qdio_out_buffer *buf, unsigned int qeth_skip_skb) { int i; struct sk_buff *skb; @@ -937,11 +937,13 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, if (buf->buffer->element[0].flags & 0x40) atomic_dec(&queue->set_pci_flags_count); - skb = skb_dequeue(&buf->skb_list); - while (skb) { - atomic_dec(&skb->users); - dev_kfree_skb_any(skb); + if (!qeth_skip_skb) { skb = skb_dequeue(&buf->skb_list); + while (skb) { + atomic_dec(&skb->users); + dev_kfree_skb_any(skb); + skb = skb_dequeue(&buf->skb_list); + } } for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) { if (buf->buffer->element[i].addr && buf->is_header[i]) @@ -957,6 +959,12 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY); } +static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, + struct qeth_qdio_out_buffer *buf) +{ + __qeth_clear_output_buffer(queue, buf, 0); +} + void qeth_clear_qdio_buffers(struct qeth_card *card) { int i, j; @@ -1152,8 +1160,9 @@ static void qeth_core_sl_print(struct seq_file *m, struct service_level *slr) { struct qeth_card *card = container_of(slr, struct qeth_card, qeth_service_level); - seq_printf(m, "qeth: %s firmware level %s\n", CARD_BUS_ID(card), - card->info.mcl_level); + if (card->info.mcl_level[0]) + seq_printf(m, "qeth: %s firmware level %s\n", + CARD_BUS_ID(card), card->info.mcl_level); } static struct qeth_card *qeth_alloc_card(void) @@ -2685,6 +2694,13 @@ static int qeth_handle_send_error(struct qeth_card *card, int sbalf15 = buffer->buffer->element[15].flags & 0xff; QETH_DBF_TEXT(TRACE, 6, "hdsnderr"); + if (card->info.type == QETH_CARD_TYPE_IQD) { + if (sbalf15 == 0) { + qdio_err = 0; + } else { + qdio_err = 1; + } + } qeth_check_qdio_errors(buffer->buffer, qdio_err, "qouterr"); if (!qdio_err) @@ -2817,6 +2833,7 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, } } + queue->sync_iqdio_error = 0; queue->card->dev->trans_start = jiffies; if (queue->card->options.performance_stats) { queue->card->perf_stats.outbound_do_qdio_cnt++; @@ -2832,6 +2849,10 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, queue->card->perf_stats.outbound_do_qdio_time += qeth_get_micros() - queue->card->perf_stats.outbound_do_qdio_start_time; + if (rc > 0) { + if (!(rc & QDIO_ERROR_SIGA_BUSY)) + queue->sync_iqdio_error = rc & 3; + } if (rc) { queue->card->stats.tx_errors += count; /* ignore temporary SIGA errors without busy condition */ @@ -2899,6 +2920,7 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue]; struct qeth_qdio_out_buffer *buffer; int i; + unsigned qeth_send_err; QETH_DBF_TEXT(TRACE, 6, "qdouhdl"); if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { @@ -2915,8 +2937,9 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, } for (i = first_element; i < (first_element + count); ++i) { buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; - qeth_handle_send_error(card, buffer, qdio_error); - qeth_clear_output_buffer(queue, buffer); + qeth_send_err = qeth_handle_send_error(card, buffer, qdio_error); + __qeth_clear_output_buffer(queue, buffer, + (qeth_send_err == QETH_SEND_ERROR_RETRY) ? 1 : 0); } atomic_sub(count, &queue->used_buffers); /* check if we need to do something on this outbound queue */ @@ -2930,55 +2953,6 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, } EXPORT_SYMBOL_GPL(qeth_qdio_output_handler); -int qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb) -{ - int cast_type = RTN_UNSPEC; - - if (card->info.type == QETH_CARD_TYPE_OSN) - return cast_type; - - if (skb_dst(skb) && skb_dst(skb)->neighbour) { - cast_type = skb_dst(skb)->neighbour->type; - if ((cast_type == RTN_BROADCAST) || - (cast_type == RTN_MULTICAST) || - (cast_type == RTN_ANYCAST)) - return cast_type; - else - return RTN_UNSPEC; - } - /* try something else */ - if (skb->protocol == ETH_P_IPV6) - return (skb_network_header(skb)[24] == 0xff) ? - RTN_MULTICAST : 0; - else if (skb->protocol == ETH_P_IP) - return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ? - RTN_MULTICAST : 0; - /* ... */ - if (!memcmp(skb->data, skb->dev->broadcast, 6)) - return RTN_BROADCAST; - else { - u16 hdr_mac; - - hdr_mac = *((u16 *)skb->data); - /* tr multicast? */ - switch (card->info.link_type) { - case QETH_LINK_TYPE_HSTR: - case QETH_LINK_TYPE_LANE_TR: - if ((hdr_mac == QETH_TR_MAC_NC) || - (hdr_mac == QETH_TR_MAC_C)) - return RTN_MULTICAST; - break; - /* eth or so multicast? */ - default: - if ((hdr_mac == QETH_ETH_MAC_V4) || - (hdr_mac == QETH_ETH_MAC_V6)) - return RTN_MULTICAST; - } - } - return cast_type; -} -EXPORT_SYMBOL_GPL(qeth_get_cast_type); - int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb, int ipv, int cast_type) { @@ -3159,7 +3133,10 @@ int qeth_do_send_packet_fast(struct qeth_card *card, int offset, int hd_len) { struct qeth_qdio_out_buffer *buffer; + struct sk_buff *skb1; + struct qeth_skb_data *retry_ctrl; int index; + int rc; /* spin until we get the queue ... */ while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED, @@ -3178,6 +3155,25 @@ int qeth_do_send_packet_fast(struct qeth_card *card, atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len); qeth_flush_buffers(queue, index, 1); + if (queue->sync_iqdio_error == 2) { + skb1 = skb_dequeue(&buffer->skb_list); + while (skb1) { + atomic_dec(&skb1->users); + skb1 = skb_dequeue(&buffer->skb_list); + } + retry_ctrl = (struct qeth_skb_data *) &skb->cb[16]; + if (retry_ctrl->magic != QETH_SKB_MAGIC) { + retry_ctrl->magic = QETH_SKB_MAGIC; + retry_ctrl->count = 0; + } + if (retry_ctrl->count < QETH_SIGA_CC2_RETRIES) { + retry_ctrl->count++; + rc = dev_queue_xmit(skb); + } else { + dev_kfree_skb_any(skb); + QETH_DBF_TEXT(QERR, 2, "qrdrop"); + } + } return 0; out: atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); diff --git a/drivers/s390/net/qeth_core_sys.c b/drivers/s390/net/qeth_core_sys.c index 568465d..33505c2 100644 --- a/drivers/s390/net/qeth_core_sys.c +++ b/drivers/s390/net/qeth_core_sys.c @@ -364,7 +364,7 @@ static ssize_t qeth_dev_layer2_show(struct device *dev, if (!card) return -EINVAL; - return sprintf(buf, "%i\n", card->options.layer2 ? 1:0); + return sprintf(buf, "%i\n", card->options.layer2); } static ssize_t qeth_dev_layer2_store(struct device *dev, diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 2cfc338..12ee7a35 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c @@ -216,36 +216,16 @@ static void qeth_l2_del_all_mc(struct qeth_card *card) spin_unlock_bh(&card->mclock); } -static void qeth_l2_get_packet_type(struct qeth_card *card, - struct qeth_hdr *hdr, struct sk_buff *skb) +static inline int qeth_l2_get_cast_type(struct qeth_card *card, + struct sk_buff *skb) { - __u16 hdr_mac; - - if (!memcmp(skb->data + QETH_HEADER_SIZE, - skb->dev->broadcast, 6)) { - /* broadcast? */ - hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST; - return; - } - hdr_mac = *((__u16 *)skb->data); - /* tr multicast? */ - switch (card->info.link_type) { - case QETH_LINK_TYPE_HSTR: - case QETH_LINK_TYPE_LANE_TR: - if ((hdr_mac == QETH_TR_MAC_NC) || - (hdr_mac == QETH_TR_MAC_C)) - hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST; - else - hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; - break; - /* eth or so multicast? */ - default: - if ((hdr_mac == QETH_ETH_MAC_V4) || - (hdr_mac == QETH_ETH_MAC_V6)) - hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST; - else - hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; - } + if (card->info.type == QETH_CARD_TYPE_OSN) + return RTN_UNSPEC; + if (is_broadcast_ether_addr(skb->data)) + return RTN_BROADCAST; + if (is_multicast_ether_addr(skb->data)) + return RTN_MULTICAST; + return RTN_UNSPEC; } static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, @@ -262,7 +242,7 @@ static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, else if (cast_type == RTN_BROADCAST) hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST; else - qeth_l2_get_packet_type(card, hdr, skb); + hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST; hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE; /* VSWITCH relies on the VLAN @@ -672,7 +652,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) struct qeth_card *card = dev->ml_priv; struct sk_buff *new_skb = skb; int ipv = qeth_get_ip_version(skb); - int cast_type = qeth_get_cast_type(card, skb); + int cast_type = qeth_l2_get_cast_type(card, skb); struct qeth_qdio_out_q *queue = card->qdio.out_qs [qeth_get_priority_queue(card, skb, ipv, cast_type)]; int tx_bytes = skb->len; diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 048defa..d9fabe3 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c @@ -2525,6 +2525,51 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return rc; } +int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb) +{ + int cast_type = RTN_UNSPEC; + + if (skb_dst(skb) && skb_dst(skb)->neighbour) { + cast_type = skb_dst(skb)->neighbour->type; + if ((cast_type == RTN_BROADCAST) || + (cast_type == RTN_MULTICAST) || + (cast_type == RTN_ANYCAST)) + return cast_type; + else + return RTN_UNSPEC; + } + /* try something else */ + if (skb->protocol == ETH_P_IPV6) + return (skb_network_header(skb)[24] == 0xff) ? + RTN_MULTICAST : 0; + else if (skb->protocol == ETH_P_IP) + return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ? + RTN_MULTICAST : 0; + /* ... */ + if (!memcmp(skb->data, skb->dev->broadcast, 6)) + return RTN_BROADCAST; + else { + u16 hdr_mac; + + hdr_mac = *((u16 *)skb->data); + /* tr multicast? */ + switch (card->info.link_type) { + case QETH_LINK_TYPE_HSTR: + case QETH_LINK_TYPE_LANE_TR: + if ((hdr_mac == QETH_TR_MAC_NC) || + (hdr_mac == QETH_TR_MAC_C)) + return RTN_MULTICAST; + break; + /* eth or so multicast? */ + default: + if ((hdr_mac == QETH_ETH_MAC_V4) || + (hdr_mac == QETH_ETH_MAC_V6)) + return RTN_MULTICAST; + } + } + return cast_type; +} + static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, struct sk_buff *skb, int ipv, int cast_type) { @@ -2650,7 +2695,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) struct qeth_card *card = dev->ml_priv; struct sk_buff *new_skb = NULL; int ipv = qeth_get_ip_version(skb); - int cast_type = qeth_get_cast_type(card, skb); + int cast_type = qeth_l3_get_cast_type(card, skb); struct qeth_qdio_out_q *queue = card->qdio.out_qs [qeth_get_priority_queue(card, skb, ipv, cast_type)]; int tx_bytes = skb->len; @@ -3180,6 +3225,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) netif_carrier_on(card->dev); qeth_set_allowed_threads(card, 0xffffffff, 0); + qeth_l3_set_ip_addr_list(card); if (recover_flag == CARD_STATE_RECOVER) { if (recovery_mode) qeth_l3_open(card->dev); diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c index 4aaddee..64abd11 100644 --- a/drivers/ssb/driver_chipcommon_pmu.c +++ b/drivers/ssb/driver_chipcommon_pmu.c @@ -28,6 +28,21 @@ static void ssb_chipco_pll_write(struct ssb_chipcommon *cc, chipco_write32(cc, SSB_CHIPCO_PLLCTL_DATA, value); } +static void ssb_chipco_regctl_maskset(struct ssb_chipcommon *cc, + u32 offset, u32 mask, u32 set) +{ + u32 value; + + chipco_read32(cc, SSB_CHIPCO_REGCTL_ADDR); + chipco_write32(cc, SSB_CHIPCO_REGCTL_ADDR, offset); + chipco_read32(cc, SSB_CHIPCO_REGCTL_ADDR); + value = chipco_read32(cc, SSB_CHIPCO_REGCTL_DATA); + value &= mask; + value |= set; + chipco_write32(cc, SSB_CHIPCO_REGCTL_DATA, value); + chipco_read32(cc, SSB_CHIPCO_REGCTL_DATA); +} + struct pmu0_plltab_entry { u16 freq; /* Crystal frequency in kHz.*/ u8 xf; /* Crystal frequency value for PMU control */ @@ -506,3 +521,82 @@ void ssb_pmu_init(struct ssb_chipcommon *cc) ssb_pmu_pll_init(cc); ssb_pmu_resources_init(cc); } + +void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc, + enum ssb_pmu_ldo_volt_id id, u32 voltage) +{ + struct ssb_bus *bus = cc->dev->bus; + u32 addr, shift, mask; + + switch (bus->chip_id) { + case 0x4328: + case 0x5354: + switch (id) { + case LDO_VOLT1: + addr = 2; + shift = 25; + mask = 0xF; + break; + case LDO_VOLT2: + addr = 3; + shift = 1; + mask = 0xF; + break; + case LDO_VOLT3: + addr = 3; + shift = 9; + mask = 0xF; + break; + case LDO_PAREF: + addr = 3; + shift = 17; + mask = 0x3F; + break; + default: + SSB_WARN_ON(1); + return; + } + break; + case 0x4312: + if (SSB_WARN_ON(id != LDO_PAREF)) + return; + addr = 0; + shift = 21; + mask = 0x3F; + break; + default: + return; + } + + ssb_chipco_regctl_maskset(cc, addr, ~(mask << shift), + (voltage & mask) << shift); +} + +void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on) +{ + struct ssb_bus *bus = cc->dev->bus; + int ldo; + + switch (bus->chip_id) { + case 0x4312: + ldo = SSB_PMURES_4312_PA_REF_LDO; + break; + case 0x4328: + ldo = SSB_PMURES_4328_PA_REF_LDO; + break; + case 0x5354: + ldo = SSB_PMURES_5354_PA_REF_LDO; + break; + default: + return; + } + + if (on) + chipco_set32(cc, SSB_CHIPCO_PMU_MINRES_MSK, 1 << ldo); + else + chipco_mask32(cc, SSB_CHIPCO_PMU_MINRES_MSK, ~(1 << ldo)); + chipco_read32(cc, SSB_CHIPCO_PMU_MINRES_MSK); //SPEC FIXME found via mmiotrace - dummy read? +} + +EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage); +EXPORT_SYMBOL(ssb_pmu_set_ldo_paref); diff --git a/firmware/Makefile b/firmware/Makefile index 317212c..878329c 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -33,10 +33,11 @@ fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \ fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw fw-shipped-$(CONFIG_BNX2X) += bnx2x-e1-5.0.21.0.fw bnx2x-e1h-5.0.21.0.fw -fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-4.6.17.fw \ - bnx2/bnx2-rv2p-09-4.6.15.fw \ - bnx2/bnx2-mips-06-4.6.16.fw \ - bnx2/bnx2-rv2p-06-4.6.16.fw +fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-5.0.0.j3.fw \ + bnx2/bnx2-rv2p-09-5.0.0.j3.fw \ + bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw \ + bnx2/bnx2-mips-06-5.0.0.j3.fw \ + bnx2/bnx2-rv2p-06-5.0.0.j3.fw fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \ diff --git a/firmware/bnx2/bnx2-mips-06-4.6.16.fw.ihex b/firmware/bnx2/bnx2-mips-06-4.6.16.fw.ihex deleted file mode 100644 index 0df10b5..0000000 --- a/firmware/bnx2/bnx2-mips-06-4.6.16.fw.ihex +++ /dev/null @@ -1,5805 +0,0 @@ -:10000000080000F80800000000004DA4000000C82F -:1000100000000000000000000000000008004DA4E7 -:100020000000001400004E6C080000800800000072 -:10003000000056CC00004E800800582000000084CC -:100040000000A54C080056CC000001340000A5D0EB -:10005000080031D808000000000070DC0000A70490 -:10006000000000000000000000000000080070DC3C -:1000700000000024000117E00800048808000400C4 -:100080000000175C000118040000000000000000E0 -:100090000000000000000000000000000000000060 -:1000A000080000980800000000003A7400012F606A -:1000B0000000000000000000000000000000000040 -:0800C000000000000000000038 -:0800C8000A00003E00000000E8 -:1000D000000000000000000D636F6D342E362E31DD -:1000E00036000000040610020000000000000003BB -:1000F00000000014000000320000000300000000B7 -:1001000000000000000000000000000000000000EF -:1001100000000010000001360000EA60000000014D -:1001200000000000000000000000000000000008C7 -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000020000000000000000000000008D -:10017000000000000000000000000000000000007F -:10018000000000000000000000000010000000005F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C0000000000010000003000000000000000D0F -:1001D0000000000D3C02080024424DE03C030800F2 -:1001E00024634ED4AC4000000043202B1480FFFD5C -:1001F000244200043C1D080037BD7FFC03A0F02111 -:100200003C100800261000F83C1C0800279C4DE01C -:100210000E0002AA000000000000000D3C03601068 -:100220008C6450002402FF7F3C1A8000008220244E -:100230003484380C24020037AC645000AF4200080C -:1002400024020C80AF4200243C1B80083C060800BE -:1002500024C6079C3C02080024424E182404001BBC -:100260002484FFFFAC4600000481FFFD244200040B -:100270003C020800244203803C010800AC224E20CE -:100280003C020800244206803C010800AC224E24B7 -:100290003C02080024420D803C010800AC224E6064 -:1002A0003C02080024420A103C03080024630908A9 -:1002B0003C040800248409443C05080024A53C248F -:1002C0003C010800AC224E683C0208002442057044 -:1002D0003C010800AC264E643C010800AC254E747D -:1002E0003C010800AC234E7C3C010800AC224E804F -:1002F0003C010800AC244E843C010800AC234E1C99 -:100300003C010800AC204E283C010800AC204E2CDB -:100310003C010800AC204E303C010800AC204E34BB -:100320003C010800AC204E383C010800AC204E3C9B -:100330003C010800AC204E403C010800AC244E4477 -:100340003C010800AC204E483C010800AC204E4C5B -:100350003C010800AC204E503C010800AC204E543B -:100360003C010800AC204E583C010800AC264E5C15 -:100370003C010800AC204E6C3C010800AC254E70DE -:100380003C010800AC234E780A0006F4000000008F -:100390003C0308008C6300208F8200081043000398 -:1003A000000000000A00052CAF83000803E00008ED -:1003B0000000000027BDFFE8AFB00010AFBF001481 -:1003C00027500100920200091040001A2403000186 -:1003D0003C0208008C42002010400016000018214A -:1003E0000E00056400000000960300083C060800AB -:1003F00094C64E968E0400188F8200209605000C3D -:1004000000031C0000661825AC440000AC45000445 -:1004100024040001AC400008AC40000CAC400010CB -:10042000AC400014AC4000180E000589AC43001C21 -:10043000000018218FBF00148FB000100060102141 -:1004400003E0000827BD001827BDFFE8AFBF00107C -:100450009742010830437000240220001062000A15 -:1004600028642001548000128FBF00102402400035 -:1004700010620008240260001062000A8FBF0010A2 -:100480000A0000FB000010218FBF00100A0000BB13 -:1004900027BD00180E0003F6000000000A0000FA55 -:1004A0008FBF00100E000FB6000000008FBF0010BD -:1004B0000000102103E0000827BD00183C020800DE -:1004C0008C42002027BDFFE810400027AFBF00107E -:1004D0000E00056400000000974201089743010CDC -:1004E0008F8500203042003E3063FFFF0002140081 -:1004F00000431025ACA200008F4201003C0608001A -:1005000094C64E968FBF0010ACA20004974301160C -:100510009744010E3C02200000031C003084FFFFC2 -:1005200000641825ACA3000800C2302597420110D2 -:100530009743011224040001000214003063FFFFFE -:1005400000431025ACA2000C9742011427BD0018EF -:100550003042FFFFACA20010ACA00014ACA0001809 -:100560000A000589ACA6001C8FBF001003E000083C -:1005700027BD00183C0208008C42002027BDFFE880 -:100580001040002AAFBF00100E00056400000000FC -:10059000974201089743010C8F8500203042003EAE -:1005A0003063FFFF0002140000431025ACA20000DE -:1005B0008F4201003C06080094C64E968FBF001083 -:1005C000ACA20004974301169744010E3C022000A0 -:1005D00000031C003084FFFF00641825ACA3000852 -:1005E00000C23025974201109743011224040001F4 -:1005F000000214003063FFFF00431025ACA2000C82 -:100600009742011427BD00183042FFFFACA2001032 -:100610008F420118ACA200149342010B304200FF3C -:10062000ACA200180A000589ACA6001C8FBF001000 -:1006300003E0000827BD001827BDFFE0AFB00010A1 -:10064000AFBF0018AFB10014275001009203000B98 -:100650002402001A961100081462003500002021BF -:100660003222000110400009000000008E0200004C -:1006700096030014000211C200021040005A10211B -:10068000A44300800A000179322200020E00012BEF -:10069000000000003C0208008C420040244200019F -:1006A0003C010800AC220040322200020002202B54 -:1006B0003C0208008C420044322300042442000122 -:1006C0003C010800AC2200441060001A8FBF0018E3 -:1006D0008F4202B804410008240400013C020800D3 -:1006E0008C420060244200013C010800AC22006002 -:1006F0000A00019C8FB100148E02002096030016A0 -:1007000000002021AF4202808E020004A743028431 -:10071000AF4202883C021000AF4202B83C0208001F -:100720008C42005C244200013C010800AC22005CC9 -:100730008FBF00188FB100148FB0001000801021FF -:1007400003E0000827BD002027BDFFE0AFB0001088 -:10075000AFBF0018AFB10014275001009203000B87 -:1007600024020003961100081462003500002021C5 -:100770003222000110400009000000008E0200003B -:1007800096030014000211C200021040005A10210A -:10079000A44300800A0001BD322200020E0000FDC9 -:1007A000000000003C0208008C420040244200018E -:1007B0003C010800AC220040322200020002202B43 -:1007C0003C0208008C420044322300042442000111 -:1007D0003C010800AC2200441060001A8FBF0018D2 -:1007E0008F4202B804410008240400013C020800C2 -:1007F0008C420060244200013C010800AC220060F1 -:100800000A0001E08FB100148E020020960300164A -:1008100000002021AF4202808E020004A743028420 -:10082000AF4202883C021000AF4202B83C0208000E -:100830008C42005C244200013C010800AC22005CB8 -:100840008FBF00188FB100148FB0001000801021EE -:1008500003E0000827BD00209362000003E00008C9 -:10086000AF80000403E000080000102127BDFFE86E -:10087000AFBF0014AFB000108F420100AF420020A4 -:100880008F420104AF4200A89350010B0E0001E417 -:10089000321000FF3C02080024424E18001018805D -:1008A0002E10001C16000004006210210E0001E74B -:1008B0000A0001FF000000008C4200000040F8091F -:1008C00000000000104000053C0240008F4301047E -:1008D0003C026020AC4300143C024000AF420138AF -:1008E0003C0208008C4200348FBF00148FB000100F -:1008F000244200013C010800AC22003403E000085F -:1009000027BD001827BDFFE8AFBF00108F42014090 -:100910000E0001E4AF4200200E0003800000000042 -:100920003C024000AF4201783C03080024630038D9 -:100930008C6200008FBF001027BD00182442000108 -:1009400003E00008AC62000027BDFFE8AFBF001065 -:100950008F4201800E0001E4AF4200208F430180EE -:1009600024020F0014620005000000008F4201887D -:10097000A742009C0A0002393C024000936200003A -:1009800024030050304200FF144300083C024000A2 -:100990000E00036400000000144000043C0240000C -:1009A0000E000E42000000003C024000AF4201B8C1 -:1009B0003C0208008C42003C8FBF00102442000122 -:1009C0003C010800AC22003C03E0000827BD0018F1 -:1009D00003E00008000010218F4301048F82001003 -:1009E00010430008000000003C0208008C42008414 -:1009F000244200013C010800AC2200848F42010423 -:100A0000AF82001003E000080000000027BDFFE8EF -:100A1000AFBF001027440100948200083043000259 -:100A2000304200041040001B000000008F4202B85A -:100A300004410008240500013C0208008C420060CB -:100A4000244200013C010800AC2200600A0002813F -:100A50008FBF00108C820020948300160000282194 -:100A6000AF4202808C820004A7430284AF42028816 -:100A70003C021000AF4202B83C0208008C42005C0D -:100A8000244200013C010800AC22005C0A00028103 -:100A90008FBF001010600008240500013C02080010 -:100AA0008C420084244200013C010800AC220084F6 -:100AB0000A0002818FBF00108F4401000E00024423 -:100AC00000000000000028218FBF001000A01021AE -:100AD00003E0000827BD00183C0208008C42008893 -:100AE000274301009465000C244200013C010800EA -:100AF000AC2200888C64001803451021904540000A -:100B0000AF4400388C62001C2403FFF800052E005F -:100B10000043102434420004AF42003C3C02000574 -:100B2000AF420030000000000000000000000000A4 -:100B3000AF450404000000000000000000000000B9 -:100B40003C02000634420001AF42003000000000C9 -:100B500000000000000000008F4200003042001042 -:100B60001040FFFD0000102103E00008000000001D -:100B700027BDFFE0AFBF0018AFB100140E00005555 -:100B8000AFB000103C028000344200708C42000084 -:100B9000AF8200140E0000B2000000003C02800092 -:100BA000344600703C0308008C6300A03C0208003F -:100BB0008C4200A4104300048F8400143C01080000 -:100BC000AC2300A4A743009E8CCA00003C0308008D -:100BD0008C6300BC3C0208008C4200B80144202316 -:100BE00000641821000040210064202B00481021DF -:100BF000004410213C010800AC2300BC3C0108006B -:100C0000AC2200B88F510000322200071040FFE1F3 -:100C1000AF8A00148CC600003C0508008CA500BCFF -:100C20003C0408008C8400B800CA302300A62821A8 -:100C30000000102100A6302B0082202100862021F8 -:100C4000322700013C010800AC2500BC3C01080033 -:100C5000AC2400B810E00021322200028F420100D3 -:100C6000AF4200208F420104AF4200A89342010B23 -:100C70000E0001E4305000FF2E02001C544000041E -:100C8000001010800E0001E70A0002F800000000CA -:100C90003C03080024634E18004310218C420000DE -:100CA0000040F80900000000104000053C02400030 -:100CB0008F4301043C026020AC4300143C0240001E -:100CC000AF4201383C0208008C420034244200014B -:100CD0003C010800AC220034322200021040000E19 -:100CE000322200048F4201400E0001E4AF42002096 -:100CF0000E000380000000003C024000AF4201787B -:100D00003C0208008C420038244200013C010800EB -:100D1000AC220038322200041040FF9B3C028000CD -:100D20008F4201800E0001E4AF4200208F4301801A -:100D300024020F0014620005000000008F420188A9 -:100D4000A742009C0A00032D3C0240009362000071 -:100D500024030050304200FF144300083C024000CE -:100D60000E00036400000000544000043C024000F8 -:100D70000E000E42000000003C024000AF4201B8ED -:100D80003C0208008C42003C244200013C01080067 -:100D9000AC22003C0A0002B03C0280003C02900001 -:100DA0003442000100822025AF4400208F42002001 -:100DB0000440FFFE0000000003E000080000000007 -:100DC0003C028000344200010082202503E000083C -:100DD000AF44002027BDFFE0AFB10014AFB000105A -:100DE00000808821AFBF00180E00033530B000FF2F -:100DF0009362007D0220202102028025A370007DE5 -:100E00008F7000743C0280000E00033E02028024BA -:100E1000160000098FBF00188F4201F80440FFFE42 -:100E200024020002AF5101C0A34201C43C021000E1 -:100E3000AF4201F88FBF00188FB100148FB00010BF -:100E400003E0000827BD002027BDFFD000001021CF -:100E500003E0000827BD003027BDFFE8AFBF00104A -:100E6000974201843042020010400005000020211A -:100E70000E001079000000000A000378240400012D -:100E80008F420188044000098FBF00108F42018803 -:100E90003C03FF00004310243C0304001443000300 -:100EA000240400019362003E8FBF001000801021D7 -:100EB00003E0000827BD0018A36000228F44014012 -:100EC0000A0003432405000127BDFFE8AFBF00145B -:100ED000AFB000109362000024030020304200FFF6 -:100EE0001043000B00000000936200002403003058 -:100EF000304200FF10430006000000009362000033 -:100F000024030050304200FF144300628FBF0014DE -:100F100093420148304200FF2443FFFF2C6200054A -:100F20001040005C8FBF0014000310803C030800D9 -:100F300024634DA4004310218C42000000400008AF -:100F4000000000000E0003358F4401408F70000C3C -:100F50008F4201441602000224020001AF62000C1D -:100F60000E00033E8F4401408F42014414500004A0 -:100F70008FBF00148FB000100A000FED27BD0018BE -:100F80008F62000C0A0003EC000000009762001062 -:100F90008F4301443042FFFF14620009000000004B -:100FA00024020001A76200108F420140AF420200FC -:100FB0003C021000AF4202380A0003F38FBF001456 -:100FC000976200100A0003EC000000000E000335D9 -:100FD0008F440140976200128F4301443050FFFF5D -:100FE0001603000224020001A76200120E00033E55 -:100FF0008F4401408F420144160200048FBF001449 -:101000008FB000100A00037C27BD00189762001201 -:101010000A0003EC00000000976200148F430144B3 -:101020003042FFFF146200068FBF0014240200014B -:101030008FB00010A76200140A00131927BD001812 -:10104000976200140A0003EC00000000976200168B -:101050008F4301443042FFFF146200062402000166 -:101060008FBF00148FB00010A76200160A000BE0BB -:1010700027BD001897620016144000068FBF0014A9 -:101080003C0208008C420070244200013C01080030 -:10109000AC2200708FB0001003E0000827BD0018DC -:1010A00027BDFFE8AFBF0014AFB0001093430109A4 -:1010B0002402001F8F500100106200A5286200204A -:1010C00010400018240200382862000A1040000C6A -:1010D0002402000B286200081040002C00000000D1 -:1010E000046000E728620002144000282402000681 -:1010F000106200268FBF00140A0004F08FB00010A9 -:101100001062005E2862000B144000DE8FBF0014E6 -:101110002402000E106200738FB000100A0004F069 -:1011200000000000106200C2286200391040000A6E -:101130002402008024020036106200CC28620037AE -:10114000104000B624020035106200C38FBF0014A7 -:101150000A0004F08FB000101062002B286200819A -:1011600010400006240200C824020039106200B6B4 -:101170008FBF00140A0004F08FB0001010620099B5 -:101180008FBF00140A0004F08FB000103C0208006A -:101190008C420020104000BB8FBF00140E0005647D -:1011A000000000008F4201008F8300209745010C52 -:1011B00097460108AC6200008F4201043C0408001D -:1011C00094844E9600052C00AC6200048F420118F6 -:1011D0000006340000C43025AC6200088F42011CB8 -:1011E00024040001AC62000C9342010A00A22825ED -:1011F000AC650010AC600014AC600018AC66001C5C -:101200000A0004C48FBF00143C0208008C42002076 -:101210001040009C8FBF00140E0005640000000009 -:10122000974401083C03080094634E969745010CCF -:10123000000422029746010E8F820020000426003F -:101240000083202500052C003C03008000A62825F3 -:1012500000832025AC400000AC400004AC400008F6 -:10126000AC40000CAC450010AC400014AC40001881 -:10127000AC44001C0A0004C3240400019742010C82 -:101280001440001500000000936200053042001079 -:1012900014400011000000000E0003350200202160 -:1012A0009362000502002021344200100E00033E2C -:1012B000A36200059362000024030020304200FF77 -:1012C0001043006F020020218FBF00148FB0001068 -:1012D0000A00108F27BD00180000000D0A0004EF5F -:1012E0008FBF00143C0208008C42002010400065B3 -:1012F0008FBF00140E000564000000008F4201043F -:101300008F8300209744010C3C05080094A54E965D -:10131000AC6200009762002C000424003042FFFF02 -:10132000008220253C02400E00A22825AC64000467 -:10133000AC600008AC60000CAC600010AC60001445 -:10134000AC600018AC65001C0A0004C32404000152 -:101350000E00033502002021A76000080E00033EA6 -:1013600002002021020020210E0003432405000179 -:101370003C0208008C420020104000428FBF001445 -:101380000E000564000000009742010C8F830020CE -:101390003C05080094A54E9600021400AC700000B5 -:1013A000AC620004AC6000088F64004C3C02401F3B -:1013B00000A22825AC64000C8F62005024040001B8 -:1013C000AC6200108F620054AC620014AC60001874 -:1013D000AC65001C8FBF00148FB000100A00058997 -:1013E00027BD00189362000024030020304200FF54 -:1013F000104300248FBF00140E000FD702002021DD -:10140000104000208FBF0014020020218FB0001078 -:10141000000028210A00034327BD001802002021F4 -:101420008FBF00148FB000100A00065127BD0018AE -:101430009745010C020020218FBF00148FB00010CF -:101440000A00067127BD0018020020218FB000108D -:101450000A00069627BD00189345010D02002021C1 -:101460008FB000100A0006E027BD001802002021FE -:101470008FBF00148FB000100A0006BC27BD0018F3 -:101480008FBF00148FB0001003E0000827BD0018C4 -:101490008F4202780440FFFE34820080AF42024057 -:1014A00024020002A34202443C02100003E00008B0 -:1014B000AF4202783C04080094844EA23C0208002B -:1014C0008C424EAC3083FFFF000318C00043102154 -:1014D000AF42003C3C0208008C424EA8AF420038AC -:1014E0003C02005034420008AF42003000000000CF -:1014F00000000000000000008F4200003042002089 -:101500001040FFFD000000008F4204003C01080075 -:10151000AC224E988F4204043C010800AC224E9C41 -:101520003C020020AF420030000000003C020800F6 -:1015300094424EA03C03080094634EA43C0508006E -:1015400094A54EA624840001004310213083FFFFA0 -:101550003C010800A4224EA03C010800A4244EA295 -:1015600014650003000000003C010800A4204EA206 -:1015700003E00008000000003C05000A27BDFFE86A -:10158000034528213C04080024844E88AFBF001086 -:101590000E0005EE2406000A3C02080094424E8A22 -:1015A0003C03080094634EA63042000F244200031F -:1015B0000043180424027FFF0043102B1040000258 -:1015C000AF83001C0000000D0E0004FB00000000B3 -:1015D0003C02080094424E928FBF001027BD0018B5 -:1015E00003E00008A74200A23C02000A03421021C7 -:1015F000944300063C02080094424E923C010800CD -:10160000A4234E8E004310238F83001C000214007D -:10161000000214030043102B03E0000838420001CD -:1016200027BDFFE8AFBF00103C02000A03421021B3 -:10163000944200063C010800A4224E8E0E0005488C -:10164000000000005440FFF93C02000A8FBF001068 -:1016500003E0000827BD001827BDFFE8AFBF00105A -:101660000E000548000000001040000300000000CC -:101670000E000556000000003C0208008C424E9807 -:101680008FBF001027430400AF4200383C0208001F -:101690008C424E9C27BD0018AF830020AF42003C17 -:1016A0003C020005AF42003003E00008AF800018A4 -:1016B0008F8200183C0300060002114000431025F1 -:1016C000AF420030000000000000000000000000F9 -:1016D0008F420000304200101040FFFD27420400FE -:1016E000AF82002003E00008AF8000183C0608002D -:1016F0008CC64E9C8F8500188F8300203C0208000A -:1017000094424E9227BDFFE024A5000124630020EF -:101710002442000124C70020AFB10014AFB0001074 -:10172000AFBF0018AF850018AF8300203C01080050 -:10173000A4224E92309000FF3C010800AC274E9C42 -:1017400004C100080000882104E000060000000039 -:101750003C0208008C424E98244200013C010800E3 -:10176000AC224E983C02080094424E923C03080082 -:1017700094634EA00010202B004310262C42000141 -:1017800000441025144000048F8300182402001028 -:101790001462000F000000000E00057A2411000101 -:1017A0003C03080094634E923C02080094424EA011 -:1017B00014620003000000000E0004FB00000000A3 -:1017C00016000003000000000E0005640000000089 -:1017D0003C03080094634E963C02080094424E94E9 -:1017E000246300013064FFFF3C010800A4234E96EF -:1017F00014820003000000003C010800A4204E9663 -:1018000012000006000000003C02080094424E92C4 -:10181000A74200A20A0005DC022010210E000548A4 -:101820000000000010400004022010210E000556A8 -:1018300000000000022010218FBF00188FB100149B -:101840008FB0001003E0000827BD00203084FFFFA8 -:1018500030A5FFFF000018211080000700000000E5 -:10186000308200011040000200042042006518216F -:101870000A0005E40005284003E00008006010218C -:1018800010C0000624C6FFFF8CA2000024A500049F -:10189000AC8200000A0005EE2484000403E0000886 -:1018A0000000000010A0000824A3FFFFAC86000089 -:1018B00000000000000000002402FFFF2463FFFF7F -:1018C0001462FFFA2484000403E000080000000012 -:1018D00024020001AF62000CA7620010A762001290 -:1018E000A762001403E00008A76200163082007FA0 -:1018F000034210213C08000E004818213C02080059 -:101900008C42002027BDFFD82407FF80AFB3001C06 -:10191000AFB20018AFB10014AFB00010AFBF0020DD -:101920000080802130B100FF0087202430D200FFEA -:101930001040002F00009821AF44002C906200005E -:1019400024030050304200FF1443000E000000004A -:101950003C0208008C4200E00202102100471024E3 -:10196000AF42002C3C0208008C4200E00202102131 -:101970003042007F0342102100481021944200D4DD -:101980003053FFFF0E000564000000003C02080019 -:1019900094424E968F8300200011340000C23025FF -:1019A00000122C003C02400000C2302534A500018A -:1019B000AC7000008FBF0020AC6000048FB2001834 -:1019C000AC7300088FB10014AC60000C8FB3001C26 -:1019D000AC6500108FB00010AC600014240400014E -:1019E000AC60001827BD00280A000589AC66001C01 -:1019F0008FBF00208FB3001C8FB200188FB100146E -:101A00008FB0001003E0000827BD00289343010FAA -:101A1000240200101062000E2865001110A00007BB -:101A200024020012240200082405003A1062000675 -:101A30000000302103E0000800000000240500350C -:101A40001462FFFC000030210A00060900000000BB -:101A50008F42007424420FA003E00008AF62000C24 -:101A600027BDFFE8AFBF00100E00034324050001AF -:101A70008FBF001024020001A762001227BD0018CA -:101A80002402000103E00008A360002227BDFFE05C -:101A9000AFB10014AFB00010AFBF001830B1FFFFFE -:101AA0000E000335008080219362003F2403000470 -:101AB000304200FF1443000C0200202112200008D5 -:101AC0002402000A0E0006020000000093620005D6 -:101AD0002403FFFE00431024A36200052402001229 -:101AE000A362003F020020210E00033EA36000819C -:101AF00016200003020020210E00066600000000F0 -:101B000002002021322600FF8FBF00188FB1001481 -:101B10008FB00010240500380A00060927BD0020F8 -:101B200027BDFFE0AFBF001CAFB20018AFB100147B -:101B3000AFB000100E000335008080210E000602B9 -:101B4000000000009362003F24120018305100FF93 -:101B5000123200030200202124020012A362003F7F -:101B6000936200052403FFFE004310240E00033E91 -:101B7000A362000502002021240500201632000780 -:101B8000000030218FBF001C8FB200188FB10014ED -:101B90008FB000100A00034327BD00208FBF001C38 -:101BA0008FB200188FB100148FB0001024050039D7 -:101BB0000A00060927BD002027BDFFE8AFB00010CE -:101BC000AFBF00149742010C24050036008080212D -:101BD00014400010304600FF0E00033500000000E6 -:101BE00024020012A362003F9362000534420010F9 -:101BF0000E000602A36200050E00033E0200202133 -:101C0000020020210E000343240500200A0006D50F -:101C1000000000000E000609000000000E00033561 -:101C200002002021936200232403FF9F0200202151 -:101C3000004310248FBF00148FB00010A362002354 -:101C40000A00033E27BD001827BDFFE0AFBF001804 -:101C5000AFB10014AFB0001030B100FF0E0003357B -:101C600000808021240200120E000602A362003FC1 -:101C70000E00033E0200202102002021022030211C -:101C80008FBF00188FB100148FB0001024050035ED -:101C90000A00060927BD0020A380002C03E00008ED -:101CA000A380002D8F4202780440FFFE8F82003413 -:101CB000AF42024024020002A34202443C02100050 -:101CC00003E00008AF4202783C0360008C625400DD -:101CD000304200081440FFFD000000008C625408F0 -:101CE000AF82000024020052AC605408AC6454304F -:101CF000AC6254342402000803E00008AC625400D3 -:101D00003C0260008C425400304200081040000544 -:101D10003C0360008C625400304200081440FFFD18 -:101D2000000000008F8300003C02600003E0000818 -:101D3000AC43540890A30000240200050080402119 -:101D40003063003F0000482114620005000050216C -:101D500090A2001C94A3001E304900FF306AFFFFD0 -:101D6000AD00000CAD000010AD0000249502001481 -:101D70008D05001C8D0400183042FFFF0049102320 -:101D800000021100000237C30040382100862023E2 -:101D900000A2102B0082202300A72823AD05001CE1 -:101DA000AD040018A5090014A5090020A50A001615 -:101DB00003E00008A50A00228F4201F80440FFFE5C -:101DC00024020002AF4401C0A34201C43C0210003F -:101DD00003E00008AF4201F83C0208008C4200B466 -:101DE00027BDFFE8AFBF001424420001AFB00010D0 -:101DF0003C010800AC2200B48F4300243C02001FC9 -:101E000030AA00FF3442FF8030D800FF00628024F7 -:101E10000080F82130EF00FF1158003B01405821AD -:101E2000240CFF803C19000A3163007F000310C0BE -:101E300000031940006218213C0208008C4200DCBB -:101E400025680001310D007F03E2102100431021BD -:101E50003043007F03431821004C102400794821AF -:101E6000AF4200248D220024016C1824006C7026DF -:101E7000AD22000C8D220024310800FFAD2200109D -:101E800095220014952300208D27001C3042FFFF6F -:101E90003063FFFF8D26001800431023000211005D -:101EA000000227C30040282100C4302300E2102B89 -:101EB00000C2302300E53823AD27001CAD260018F2 -:101EC00095220020A522001495220022154B000A1D -:101ED000A52200168D2300248D220008254600012E -:101EE000314500801462000430C4007F108F00026E -:101EF00038AA008000C0502151AF000131C800FF56 -:101F00001518FFC9010058218F8400343082007FEA -:101F1000034218213C02000A006218212402FF80BB -:101F200000822024AF440024A06A0079A06A0083C4 -:101F30008C6200508F840034AC6200708C65007439 -:101F40003C027FFF3442FFFF00A228240E00073C22 -:101F5000AC650074AF5000248FBF00148FB0001028 -:101F600003E0000827BD001827BDFFC0AFBE003842 -:101F7000AFB70034AFB5002CAFB20020AFB1001C3A -:101F8000AFB00018AFBF003CAFB60030AFB4002810 -:101F9000AFB300248F4500248F4600288F43002CC8 -:101FA0003C02001F3442FF800062182400C230242B -:101FB0000080A821AFA3001400A2F0240E000700A7 -:101FC000AFA600103C0208008C4200E02410FF8005 -:101FD0000360882102A2102100501024AF42002487 -:101FE0003C0208008C4200E002A210213042007F37 -:101FF000034218213C02000A00629021924200D262 -:1020000093630084305700FF306300FF2402000117 -:1020100010620034036020212402000214620036A2 -:10202000000000000E0012E50240282192230083E8 -:10203000922200833063007F3042007F000210C094 -:1020400000031940006218213C0208008C4200DCA9 -:1020500002A210210043382100F01024AF420028D2 -:10206000922500789224008330E2007F03421821F9 -:102070003C02000C14850007006280212402FFFF4F -:10208000A24200F12402FFFFA64200F20A0007F874 -:102090002402FFFF96020020A24200F196020022D5 -:1020A000A64200F28E020024AE4200F49222008387 -:1020B000A24200F08E4200C8AE4200FC8E4200C434 -:1020C000AE4200F88E220050AE4201008E4200CC9B -:1020D000AE420104922200853042003F0A000853BC -:1020E000344200400E00130802402821922200854D -:1020F0000A0008533042003F936200852403FFDF4B -:102100003042003FA36200859362008500431024A3 -:10211000A36200859363008393620078307400FFAC -:10212000304200FF10540036240AFF803C0C000CA3 -:102130003283007F000310C00003194000621821A1 -:102140003C0208008C4200DC268800013109007F37 -:1021500002A210210043382130E2007F03421821FF -:1021600000EA1024AF420028006C80218E02002477 -:10217000028A1824006A5826AE02000C8E0200243F -:10218000310800FFAE0200109602001496030020F2 -:102190008E07001C3042FFFF3063FFFF8E060018E1 -:1021A0000043102300021100000227C30040282131 -:1021B00000C4302300E2102B00C2302300E5382396 -:1021C000AE07001CAE06001896020020A6020014FE -:1021D00096020022A602001692220079304200FFE9 -:1021E000105400070000000051370001316800FF63 -:1021F00092220078304200FF1448FFCD0100A02158 -:1022000092220083A22200798E2200500A0008B395 -:10221000AE220070A22200858E22004C2405FF8091 -:10222000AE42010C9222008534420020A222008599 -:10223000924200D13C0308008C6300DC305400FF64 -:102240003C0208008C4200E400143140001420C01D -:1022500002A3182100C4202102A210210064382109 -:10226000004610210045182400E52824AF45002829 -:10227000AF43002C3042007F924400D030E3007F17 -:1022800003422821034318213C02000C00628021F4 -:102290003C02000E309600FF00A298211296002A00 -:1022A000000000008E02000C0200202102602821A4 -:1022B00010400025261000280E00071B000000001B -:1022C0009262000D26830001307400FF3042007FCF -:1022D000A262000D2404FF801697FFF026730020F1 -:1022E0003C0208008C4200DC0000A02102A2102168 -:1022F00000441024AF4200283C0208008C4200E455 -:102300003C0308008C6300DC02A21021004410246E -:10231000AF42002C3C0208008C4200E402A31821CA -:102320003063007F02A210213042007F034220214F -:10233000034318213C02000C006280213C02000E85 -:102340000A000875008298218E4200D8AE22005003 -:102350008E4200D8AE22007092250083924600D1B2 -:1023600092230083924400D12402FF8000A22824FB -:102370003063007F308400FF00A628250064182AFF -:102380001060000230A500FF38A50080A225008360 -:10239000A22500790E00070E000000009222007EA8 -:1023A00002A02021A222007A8E2300743C027FFF2B -:1023B0003442FFFF006218240E00073CAE23007475 -:1023C0008FA20010AF5E00248FBF003CAF420028F8 -:1023D0008FBE00388FA200148FB700348FB6003044 -:1023E0008FB5002C8FB400288FB300248FB200204B -:1023F0008FB1001C8FB0001827BD004003E000081B -:10240000AF42002C90A2000024420001A0A20000D4 -:102410003C0308008C6300F4304200FF1443000FBB -:1024200000803021A0A000003C0208008C4200E4A3 -:102430008F840034008220213082007F03421821E3 -:102440003C02000C006218212402FF80008220243C -:10245000ACC3000003E00008AF4400288C820000F9 -:102460002442002003E00008AC82000094C2000077 -:102470003C080800950800CA30E7FFFF00804821AB -:1024800001021021A4C2000094C200003042FFFFEC -:1024900000E2102B54400001A4C7000094A20000E9 -:1024A0003C0308008C6300CC24420001A4A200007D -:1024B00094A200003042FFFF544300078F8600289B -:1024C0000107102BA4A00000544000010100382196 -:1024D000A4C700008F8600288CC4001CAF44003CB9 -:1024E00094A200008F43003C3042FFFF000210C066 -:1024F00000621821AF43003C8F42003C0082202341 -:1025000018800004000000008CC200180A000914A2 -:10251000244200018CC20018AF4200383C02005037 -:1025200034420010AF420030000000000000000004 -:10253000000000008F420000304200201040FFFDEC -:10254000000000008F420404AD2200048F4204000A -:10255000AD2200003C020020AF42003003E0000842 -:102560000000000027BDFFE0AFB20018AFB10014BB -:10257000AFB00010AFBF001C94C2000000C08021AB -:102580003C120800965200C624420001A602000038 -:102590009603000094E2000000E03021144300059F -:1025A0008FB100300E0008E9024038210A000946C8 -:1025B000000000008C8300048C8200042442004050 -:1025C00004610007AC8200048C8200040440000413 -:1025D000000000008C82000024420001AC82000058 -:1025E000960200003042FFFF50520001A60000009A -:1025F0009622000024420001A62200008F820028BB -:102600009623000094420016144300048FBF001C60 -:1026100024020001A62200008FBF001C8FB2001808 -:102620008FB100148FB0001003E0000827BD002018 -:102630008F89002827BDFFE0AFBF00188D2200283A -:102640002748040030E700FFAF4200388D22002CFD -:10265000AF880030AF42003C3C020005AF42003082 -:10266000000000000000000000000000000000006A -:1026700000000000000000008C82000C8C82000C26 -:10268000AD0200008C820010AD0200048C820018A4 -:10269000AD0200088C82001CAD02000C8CA200145C -:1026A000AD0200108C820020AD0200149082000563 -:1026B000304200FF00021200AD0200188CA2001888 -:1026C000AD02001C8CA2000CAD0200208CA20010F8 -:1026D000AD0200248CA2001CAD0200288CA20020B8 -:1026E000AD02002CAD060030AD000034978300260B -:1026F0003402FFFF14620002006020213404FFFF57 -:1027000010E00011AD040038952300369524003602 -:10271000240200013063FFFF000318C20069182182 -:1027200090650040308400070082100400451025A9 -:10273000A06200408F820028944200563042FFFF82 -:102740000A0009ADAD02003C952300369524003601 -:10275000240200013063FFFF000318C20069182142 -:1027600090650040308400070082100400021027AA -:1027700000451024A0620040AD00003C00000000B5 -:1027800000000000000000003C020006344200404F -:10279000AF42003000000000000000000000000018 -:1027A0008F420000304200101040FFFD8F8600284D -:1027B000AF88003024C2005624C7003C24C400283F -:1027C00024C5003224C600360E000927AFA200102F -:1027D0008FBF001803E0000827BD00208F8300246E -:1027E0003C0508008CA500E88F82003430633FFF71 -:1027F0000003198000451021004310212403FF80AD -:102800003045007F00431024AF42002803451821C3 -:102810003C02000C0062302190C2000D0000382103 -:1028200034420010A0C2000D8F8900288F8A002436 -:1028300095230036000A1382304800032402000169 -:10284000A4C3000E1102000B290200021040000573 -:10285000240200021100000C240300010A0009F008 -:102860000000182111020006000000000A0009F013 -:10287000000018218CC2002C0A0009F0244300013A -:102880008CC20014244300018CC200180043102B9A -:1028900014400003000000000A0009F924070001A9 -:1028A0009522003E24420001A522003E000A138228 -:1028B000304300032C6200021040000900802821F0 -:1028C000146000040000000094C200360A000A09E7 -:1028D0003046FFFF8CC600380A000A090080282114 -:1028E000000030213C04080024844EB00A00095A3C -:1028F00000000000274901008D22000C95230006EE -:1029000001202021000216023045003F3063FFFF06 -:102910002402002728A6002810A2000EAF8300245E -:1029200010C00008240200312402002110A2000976 -:102930002402002510A200079382002D0A000A2716 -:102940000000000010A200059382002D0A000A2753 -:10295000000000000A0009C5000000000A0006F798 -:102960000000000095230006912400058D25000C31 -:102970008D2600108D2700188D28001C8D29002021 -:10298000244200013C010800A4234EB63C0108008B -:10299000A0244EB53C010800AC254EBC3C0108000B -:1029A000AC264EC03C010800AC274EC83C010800D4 -:1029B000AC284ECC3C010800AC294ED003E0000806 -:1029C000A382002D8F87002827BDFFC0AFB300343E -:1029D000AFB20030AFB1002CAFB00028AFBF0038AD -:1029E0003C0208008C4200D094E3003030B0FFFF7E -:1029F000005010073045FFFF3063FFFF00C09821F3 -:102A0000A7A200103C110800963100C614A30006CE -:102A10003092FFFF8CE2002424420030AF42003CA1 -:102A20000A000A608CE2002094E200323042FFFF8C -:102A300054A2000827A400188CE2002C2442003085 -:102A4000AF42003C8CE20028AF4200380A000A6E18 -:102A50008F84002827A5001027A6002002203821F7 -:102A60000E0008E9A7A000208FA200182442003021 -:102A7000AF4200388FA2001CAF42003C8F84002878 -:102A80003C020005AF42003094820034274304002A -:102A90003042FFFF0202102B14400007AF830030CA -:102AA00094820054948300340202102100431023C6 -:102AB0000A000A823043FFFF94830054948200345A -:102AC0000223182100501023006218233063FFFFF7 -:102AD000948200163042FFFF144300030000000000 -:102AE0000A000A9024030001948200163042FFFF7E -:102AF0000043102B104000058F8200309482001696 -:102B0000006210233043FFFF8F820030AC5300007F -:102B1000AC400004AC520008AC43000C3C02000680 -:102B200034420010AF4200300000000000000000FE -:102B3000000000008F420000304200101040FFFDF6 -:102B4000001018C20064182190650040320400078C -:102B5000240200018FBF00388FB300348FB20030E1 -:102B60008FB1002C8FB00028008210040045102582 -:102B700027BD004003E00008A062004027BDFFA879 -:102B8000AFB60050AFB5004CAFB40048AFB300448F -:102B9000AFB1003CAFBF0054AFB20040AFB000389F -:102BA0008C9000003C0208008C4200E88F860034C4 -:102BB000960300022413FF8000C2302130633FFFE0 -:102BC0000003198000C3382100F3102490B20000E4 -:102BD000AF42002C9203000230E2007F034230211A -:102BE0003C02000E00C28821306300C02402004075 -:102BF0000080A82100A0B021146200260000A021BE -:102C00008E3400388E220018144000022402000185 -:102C1000AE2200189202000D304200201440001530 -:102C20008F8200343C0308008C6300DC001238C043 -:102C3000001231400043102100C7302100463821E6 -:102C400030E300073C02008030E6007800C2302507 -:102C50000343182100F31024AF4208002463090045 -:102C6000AF4608108E2200188C6300080043102124 -:102C7000AE2200188E22002C8E2300182442000160 -:102C80000062182B1060003D000000000A000B4499 -:102C900000000000920300022402FFC00043102441 -:102CA000304200FF1440000524020001AE2200184B -:102CB000962200360A000B2D3054FFFF8E2200149E -:102CC00024420001AE220018920200000002160009 -:102CD00000021603044100290000000096020002D1 -:102CE00027A4001000802821A7A200169602000247 -:102CF00024070001000030213042FFFFAF82002492 -:102D00000E00095AAFA0001C960300023C04080004 -:102D10008C8400E88F82003430633FFF0003198009 -:102D200000441021004310213043007F3C05000C7B -:102D30000053102403431821AF42002800651821D6 -:102D40009062000D001221403042007FA062000D11 -:102D50003C0308008C6300E48F82003400431021A0 -:102D60000044382130E2007F034210210045102149 -:102D700000F31824AF430028AEA200009222000DF9 -:102D8000304200101040001302A020218F83002841 -:102D90008EA40000028030219462003E2442FFFF96 -:102DA000A462003E948400029625000E3084FFFF4A -:102DB0000E000A3F30A5FFFF8F82002894430034A5 -:102DC0009622000E1443000302A0202124020001D9 -:102DD000A382002C02C028210E0008CF00000000B2 -:102DE0008FBF00548FB600508FB5004C8FB4004891 -:102DF0008FB300448FB200408FB1003C8FB00038D9 -:102E000003E0000827BD00588F85002827BDFFD0AC -:102E1000AFB40028AFB20020AFBF002CAFB3002486 -:102E2000AFB1001CAFB0001890A800D090A600D1A0 -:102E30003C0208008C4200E48F83003430C700FF5E -:102E4000A3A600100062182100071140006218219B -:102E50003062007F034220213C02000C00822021CE -:102E60002402FF8000621824311200FF8CB100D8C8 -:102E7000AFA400148CB300DC0000A021AF430028F5 -:102E800010F2001F240200018FA6001427A40014D2 -:102E900027A500108CC2000402228021027010239A -:102EA000044000172402000190C3000D2402FF809B -:102EB00000431024304200FF144000070200882124 -:102EC00090C2000D344200400E0008CFA0C2000D99 -:102ED0000A000B8B93A200100E000AAD241400010F -:102EE0008F830028AC7000D893A20010A06200D19C -:102EF00093A200101452FFE58FA6001424020001D3 -:102F0000168200048FBF002C0E0006F700000000A0 -:102F10008FBF002C8FB400288FB300248FB2002005 -:102F20008FB1001C8FB0001803E0000827BD0030EF -:102F300027BDFFD8AFB3001CAFB20018AFB100146B -:102F4000AFB00010AFBF00200080982100E08021CA -:102F500030B1FFFF0E00056430D200FF000000001A -:102F600000000000000000008F820020AC51000033 -:102F7000AC520004AC530008AC40000CAC40001054 -:102F8000AC400014AC4000183C03080094634E961B -:102F900002038025AC50001C00000000000000006F -:102FA00000000000240400018FBF00208FB3001C2C -:102FB0008FB200188FB100148FB000100A0005897D -:102FC00027BD002827BDFFE8AFB00010AFBF001439 -:102FD00030A5FFFF30C600FF0080802124020C8056 -:102FE000AF420024000000000000000000000000CC -:102FF00000000000000000000E000B9A000000001E -:103000003C040800248400E08C8200002403FF803C -:103010008FBF00140202102100431024AF4200248D -:103020008C8200003C03000A020280213210007FE3 -:10303000035010218FB000100043102127BD00184D -:1030400003E00008AF82002827BDFFE8AFBF0010F3 -:103050008F4401403C0308008C6300E02402FF80A1 -:10306000AF8400340083182100621024AF42002492 -:103070003C02000803424021950500023063007FB6 -:103080003C02000A034318210062182130A5FFFF0B -:103090003402FFFF000030213C07602010A2000630 -:1030A000AF8300282402FFFFA5020002946500D42C -:1030B0000E000BBF30A5FFFF8FBF001024020C8055 -:1030C00027BD001803E00008AF4200243C020008BE -:1030D00003424021950200023C0A0800954A00C6BE -:1030E0003046FFFF14C000073402FFFF8F82002824 -:1030F0008F8400343C076020944500D40A000C28DB -:1031000030A5FFFF10C200248F87002894E20054EE -:1031100094E400163045FFFF00A6102300A6182BEC -:103120003089FFFF106000043044FFFF00C510230A -:10313000012210233044FFFF008A102B1040000CA6 -:10314000012A102324020001A50200162402FFFF19 -:10315000A502000294E500D48F84003400003021E1 -:1031600030A5FFFF3C0760200A000BBF00000000F5 -:103170000044102A104000080000000095020016CC -:103180003042000110400004000000009742007E21 -:1031900024420014A502001603E00008000000000D -:1031A0008F84002827BDFFE0AFBF00189482003451 -:1031B0009483003E1060001A3048FFFF9383002C78 -:1031C00024020001146200278FBF00188F8200289C -:1031D000000818C231080007006218212447003A8D -:1031E000244900542444002024450030244600345F -:1031F00090620040304200FF01021007304200019F -:10320000104000168FBF00180E000927AFA900104C -:103210008F820028944200340A000C413048FFFF9E -:1032200094830036948200341043000E8FBF001840 -:1032300094820036A482003494820056A482005402 -:103240008C82002CAC82002494820032A482003054 -:103250009482003CA482003A8FBF00180A000C013F -:1032600027BD002003E0000827BD002027BDFFE8A0 -:10327000AFBF00108F4A01003C0508008CA500E09C -:103280003C02080090424EBC3C0C0800958C4EB6A7 -:1032900001452821304B003F30A2007F03424021EE -:1032A000396900323C02000A3963003F2C63000197 -:1032B000010240212D2900012402FF8000A22824C0 -:1032C00001234825AF8A003400801821AF4500242F -:1032D000000030210080282124070001AF88002849 -:1032E0003C04080024844EB0AF8C00241520000656 -:1032F000A380002D240200201562000E3402FFFF7F -:103300001582000C00000000240200201562000558 -:10331000000000008C6300142402FFFF106200070D -:10332000000000000E00095A000000000A000C9D79 -:10333000000000000E0009C5006020210E000C36C0 -:10334000000000008FBF001024020C8027BD001871 -:1033500003E00008AF4200243C0208008C4200E079 -:1033600027BDFFA0AFB1003C008210212411FF80D7 -:10337000AFBE0058AFB70054AFB20040AFB0003896 -:10338000AFBF005CAFB60050AFB5004CAFB4004863 -:10339000AFB30044005110248F4800248F49002807 -:1033A0008F470028AF4200243C0208008C4200E016 -:1033B0000080902124060006008210213042007F08 -:1033C000034218213C02000A006280213C02001FD7 -:1033D0003442FF8000E2382427A40010260500F0C4 -:1033E0000122F0240102B8240E0005EEAFA7003040 -:1033F0008FA20018AE0200C48FA2001CAE0200C84B -:103400008FA20024AE0200CC93A40010920300D13E -:103410002402FF800082102400431025304900FF61 -:103420003083007F3122007F0062102A10400004A8 -:10343000000310C001311026304900FF000310C006 -:1034400000031940006218213C0208008C4200DC95 -:10345000920400D202421021004310210051102496 -:10346000AF42002893A300103063007F000310C018 -:1034700000031940006218213C0208008C4200DC65 -:1034800002421021004310213042007F03421821E4 -:103490003C02000C006240218FA300142402FFFFB5 -:1034A00010620030309500FF93A2001195030014C4 -:1034B000304400FF3063FFFF0064182B1060000DE4 -:1034C00000000000950400148D07001C8D060018F4 -:1034D0003084FFFF0044202300042100000010215D -:1034E00000E4382100E4202B00C230210A000D172F -:1034F00000C43021950400148D07001C8D060018AF -:103500003084FFFF008220230004210000001021EE -:103510000080182100C2302300E4202B00C4302397 -:1035200000E33823AD07001CAD06001893A200117C -:10353000A502001497A20012A50200168FA2001483 -:10354000AD0200108FA20014AD02000C93A2001176 -:10355000A502002097A20012A50200228FA200144B -:10356000AD0200242406FF80024610243256007F5C -:10357000AF420024035618213C02000A0062802159 -:103580008E02004C8FA200203124007F000428C04E -:10359000AE0200508FA200200004214000852821A7 -:1035A000AE02007093A2001001208821A2020083C5 -:1035B00093A20010A2020079920200853042003FDF -:1035C000A20200853C0208008C4200DC024210216D -:1035D0000045102100461024AF42002C3C02080098 -:1035E0008C4200E43C0308008C6300DC02421021A2 -:1035F0000044102100461024AF4200283C0208007D -:103600008C4200E402431821006518210242102177 -:10361000004410213042007F3063007F93A50010EA -:1036200003422021034318213C02000E0062402186 -:103630003C02000C10B1008C008248213233007F24 -:10364000166000192404FF803C0208008C4200DC54 -:103650000242102100441024AF42002C3C0208001A -:103660008C4200E43C0308008C6300DC0242102121 -:1036700000441024AF4200283C0208008C4200E4C1 -:10368000024318213063007F024210213042007F44 -:1036900003422021034318213C02000E0062402116 -:1036A0003C02000C008248219124000D2414FF806C -:1036B0000000102100942025A124000D9504000293 -:1036C000950500148D07001C3084FFFF30A5FFFF17 -:1036D0008D060018008520230004210000E4382115 -:1036E00000C2302100E4202B00C43021AD07001CB3 -:1036F000AD06001895020002A5020014A5000016F0 -:103700008D020008AD0200108D020008AD02000C11 -:1037100095020002A5020020A50000228D020008EB -:10372000AD0200249122000D3042004010400042C2 -:10373000262200013C0208008C4200E0A3B30028CE -:103740003C10000A0242102100541024AF42002411 -:103750003C0208008C4200E0A380002C27A4002C2F -:10376000024210213042007F0342182100701821CC -:103770008C6200D88D26000427A50028AFA9002C54 -:1037800000461021AC6200D80E000AADAF830028BD -:1037900093A300288F8200280E0006F7A04300D1D3 -:1037A0000E000C360000000002541024AF4200242A -:1037B0003C0208008C4200DC00132940001320C0AA -:1037C00000A42021024210210044102100541024A2 -:1037D000AF42002C3C0208008C4200E43C0308008D -:1037E0008C6300DC03563021024210210045102179 -:1037F00000541024AF4200283C0208008C4200E430 -:1038000002431821006418210242102100451021B2 -:103810003042007F3063007F0342202103431821A0 -:103820003C02000E006240213C02000C00D08021CE -:1038300000824821262200013043007F14750005D4 -:10384000304400FF2403FF8002231024004310268D -:10385000304400FF93A20010008088212508002832 -:103860001444FF762529002093A400108FA3001490 -:103870002402FFFF1062000A308900FF2482000149 -:10388000248300013042007F14550005306900FF99 -:103890002403FF800083102400431026304900FFDA -:1038A00092020078305300FF11330032012088214A -:1038B0003C0208008C4200DC3225007F000520C05D -:1038C0000005294000A42021024210212406FF8087 -:1038D0000044102100461024AF42002C3C03080095 -:1038E0008C6300DC3C0208008C4200E40243182197 -:1038F00002421021004510210064182100461024C6 -:103900003063007FAF420028034318213C02000EC1 -:10391000006240213C0208008C4200E48D06000C4D -:103920000100202102421021004510213042007F79 -:10393000034218213C02000C0062482110C0000D17 -:10394000012028210E00071B000000002402FF8038 -:103950000222182426240001006228263082007FDB -:1039600014550002308300FF30A300FF1473FFD012 -:10397000006088218E0300743C027FFF3442FFFF09 -:1039800000621824AE0300740E00073C02402021A0 -:10399000AF5700248FA20030AF5E00288FBF005CBD -:1039A0008FBE00588FB700548FB600508FB5004CB3 -:1039B0008FB400488FB300448FB200408FB1003CF9 -:1039C0008FB0003827BD006003E00008AF42002C34 -:1039D00027BDFFD8AFB1001CAFBF0020AFB00018AB -:1039E00027510188922200032408FF803C03000A2B -:1039F0003047007FA3A700108F4601803C020800DB -:103A00008C4200E0AF86003400C2282100A81024B8 -:103A1000AF4200249224000030A2007F0342102114 -:103A200000431021AF8200283084007F240200026E -:103A300014820025000719403C0208008C4200E473 -:103A400000C210210043282130A2007F0342182128 -:103A500000A81024AF4200283C02000C006218218C -:103A60009062000DAFA3001400481025A062000D65 -:103A70008FA300149062000D304200405040006A55 -:103A80008FBF00208F860028A380002C27A400145D -:103A90008CC200D88C63000427A5001000431021BD -:103AA0000E000AADACC200D893A300108F8200288C -:103AB0000E0006F7A04300D10E000C3600000000F7 -:103AC0000A000ED88FBF00200E00070000C0202182 -:103AD0000E00070E000000003C0200080342802197 -:103AE000922300019202007B1443004F8FBF0020FD -:103AF000922200003044007F24020004108200174C -:103B0000288200051040000624020005240200035C -:103B1000108200078FB1001C0A000ED900000000BF -:103B2000108200128FBF00200A000ED98FB1001C36 -:103B300092050083920600788E0700748F8400340B -:103B400030A500FF00073E0230C600FF0E0007440C -:103B500030E7007F0A000ED88FBF00200E000CA4B3 -:103B60008F8400340A000ED88FBF002024020C80FE -:103B7000AF4200249202003E30420040104000203C -:103B8000000000009202003E000216000002160330 -:103B900004410006000000008F8400340E0006710E -:103BA000240500930A000ED88FBF00209202003F28 -:103BB00024030018304200FF1443000C8F840034AB -:103BC000240500390E000609000030210E000335DF -:103BD0008F84003424020012A202003F0E00033E34 -:103BE0008F8400340A000ED88FBF002024050036D1 -:103BF0000E000609000030210A000ED88FBF0020F9 -:103C00000E0003358F8400349202000534420020F8 -:103C1000A20200050E00033E8F8400340E00108FB8 -:103C20008F8400348FBF00208FB1001C8FB000182C -:103C300024020C8027BD002803E00008AF420024C6 -:103C400027BDFFE8AFB00010AFBF0014274301004D -:103C500094620008000214000002140304410002F0 -:103C6000000080212410000194620008304200808E -:103C70001040001A02001021946200083042200017 -:103C800010400016020010218C6300183C021C2D0D -:103C9000344219ED240600061062000F3C07602133 -:103CA0003C0208008C4200D4104000078F8200289C -:103CB0008F830028906200623042000F344200403F -:103CC000A06200628F8200288F840034944500D463 -:103CD0000E000BBF30A5FFFF020010218FBF0014A4 -:103CE0008FB0001003E0000827BD001827BDFFE0DB -:103CF000AFB10014AFB00010A380002CAFBF00180C -:103D00008F4501003C0308008C6300E02402FF8023 -:103D1000AF85003400A318213064007F03442021C4 -:103D2000006218243C02000A00822021AF430024D4 -:103D3000275001008E0200148C8300DCAF84002821 -:103D40000043102318400004000088218E02001454 -:103D50000E000B50AC8200DC9202000B2403000228 -:103D6000304200FF1443002F0000000096020008BC -:103D7000304300FF24020082146200052402008404 -:103D80000E000A0B000000000A000F640000000093 -:103D900014620009240200818F8200288F8400347D -:103DA0003C076021944500D49206000530A5FFFF32 -:103DB0000A000F5330C600FF146200270000000005 -:103DC0009202000A304300FF3062002010400004DD -:103DD000306200408F8400340A000F4F24060040F8 -:103DE00010400004000316008F8400340A000F4FB7 -:103DF0002406004100021603044100178F8400349A -:103E0000240600428F8200283C076019944500D4A4 -:103E100030A5FFFF0E000BBF000000000A000F647A -:103E2000000000009202000B24030016304200FF45 -:103E300010430006000000009202000B240300174C -:103E4000304200FF14430004000000000E000EDEAC -:103E500000000000004088210E000C360000000029 -:103E60009202000A304200081040000624020C8032 -:103E70008F8500283C0400080E0012BD0344202159 -:103E800024020C80AF4200248FBF001802201021B2 -:103E90008FB000108FB1001403E0000827BD002090 -:103EA00027BDFFE8AFBF0014AFB000108F50002453 -:103EB0003C0308008C6300E08F4501002402FF8072 -:103EC00000A318213064007F0344202100621824DD -:103ED0003C02000A00822021AF850034AF43002459 -:103EE00090820062AF8400283042000F34420050BC -:103EF000A08200623C02001F3442FF800E0006F7E1 -:103F000002028024AF5000248FBF00148FB0001035 -:103F100003E0000827BD00183C0208008C42002086 -:103F20001040001D2745010090A300093C02000835 -:103F30000342202124020018546200033C020008BE -:103F40000A000FA5240200080342202124020016C3 -:103F5000146200052402001724020012A082003F10 -:103F60000A000FAF94A700085462000694A7000847 -:103F7000936200052403FFFE00431024A3620005A2 -:103F800094A7000890A6001B8CA4000094A500062E -:103F90000A000B9A00073C0003E000080000000044 -:103FA0002744010094820008304500FF38A30082B6 -:103FB00038A200842C6300012C4200010062182505 -:103FC00010600006240200839382002D1040000D33 -:103FD000000000000A000C690000000014A20005A7 -:103FE00024A2FF808F4301043C02602003E000080C -:103FF000AC430014304200FF2C420002104000038A -:10400000240200220A000F090000000014A200038D -:10401000000000000A000F76000000000A000F9464 -:10402000000000009363007E9362007A144300094D -:10403000000020219362000024030050304200FF62 -:1040400014430004240400019362007E2442000112 -:10405000A362007E03E00008008010218F4201F877 -:104060000440FFFE24020002AF4401C0A34201C489 -:104070003C02100003E00008AF4201F827BDFFE852 -:10408000AFBF00109362003F2403000A304200FFDC -:1040900014430046000000008F6300548F62004C00 -:1040A0001062007F036030219362000024030050FF -:1040B000304200FF1443002F000000008F440140F5 -:1040C0003C0208008C4200E02403FF8000821021A3 -:1040D00000431024AF4200243C0208008C4200E060 -:1040E0008F6500543C03000A008220213084007F49 -:1040F0000344102100431021AC4501089762003CA5 -:104100008F63004C3042FFFF000210400062182114 -:10411000AF63005C8F6300548F64004C9762003C77 -:10412000006418233042FFFF0003184300021040D0 -:104130000043102A10400006000000008F62005467 -:104140008F63004C004310230A0010250002104327 -:104150009762003C3042FFFF00021040ACC2006496 -:1041600024020001A0C0007CA0C2008424020C80B4 -:10417000AF4200240E000FD78F4401401040004989 -:104180008FBF00108F4301408F4201F80440FFFEB3 -:1041900024020002AF4301C0A34201C43C0210004C -:1041A000AF4201F80A0010778FBF00109362003F02 -:1041B00024030010304200FF1443000400000000FC -:1041C0008F4401400A001063000028219362003FE1 -:1041D00024030016304200FF14430004240200149C -:1041E000A362003F0A001071000000008F62004CC3 -:1041F0008F630050004310230441002A8FBF00103A -:104200009362008124420001A362008193620081D5 -:104210003C0308008C6300C0304200FF14430010D0 -:10422000000000009362003F24030004304200FFBE -:1042300014430006000000008F4401408FBF0010AF -:10424000240500930A00067127BD00188F44014021 -:10425000240500938FBF00100A0006E027BD001858 -:104260008F4401400E000335000000008F620054AF -:104270002442FFFFAF6200548F6200502442FFFFD0 -:10428000AF6200500E00033E8F4401408F44014056 -:104290008FBF0010240500040A00034327BD001847 -:1042A0008FBF001003E0000827BD00188F4201886F -:1042B0009363007E00021402304400FF306300FF6D -:1042C0001464000D0000000093620080304200FF83 -:1042D0001044000900000000A36400809362000005 -:1042E00024030050304200FF14430004000000008B -:1042F0000A0007A88F440180A364008003E000083F -:104300000000000027BDFFE8AFB00010AFBF0014F1 -:1043100093620005240300303042003014430089CA -:10432000008080213C0208008C4200201040008068 -:10433000020020210E000564000000008F8500208F -:10434000ACB000009362003E9363003F304200FF38 -:1043500000021200306300FF00431025ACA20004ED -:104360009362008200021600000216030441000559 -:10437000000000003C0308008C6300480A0010B5F0 -:10438000000000009362003E3042004014400003F1 -:104390000000182193620081304300FF9362008285 -:1043A00000031E00304200FF0002140000621825C6 -:1043B000ACA300088F620040ACA2000C8F620048E2 -:1043C000ACA200108F62004CACA200148F620050AF -:1043D0008F63004C004310230441000300000000E1 -:1043E0000A0010C98F62004C8F620050ACA2001806 -:1043F0003C02080094424E963C03C00B0000202172 -:10440000004310250E000589ACA2001C8F620054E9 -:104410008F840020AC8200008F620058AC820004C0 -:104420008F62005CAC8200088F6200608F43007472 -:1044300000431021AC82000C8F620064AC8200103B -:10444000976300689762006A00031C003042FFFF18 -:1044500000621825AC83001493620082240300805C -:10446000304200FF14430003000000000A0010FD6A -:10447000AC8000188F63000C240200011062000E53 -:104480002402FFFF9362003E304200401440000AC5 -:104490002402FFFF8F63000C8F4200740062182318 -:1044A0003C02080000621024144000020000282191 -:1044B0000060282100051043AC8200183C0208006F -:1044C00094424E963C03C00C00002021004310256E -:1044D0008F8300200E000589AC62001C8F620018DB -:1044E0008F8300203C05080094A54E96240400010B -:1044F000AC620000AC6000048F66006C3C02400DB2 -:1045000000A22825AC6600088F6200DCAC62000CBB -:10451000AC6000109362000500021600AC6200144B -:10452000AC6000180E000589AC65001C020020215B -:104530008FBF00148FB00010A36000050A0004F2C2 -:1045400027BD00188FBF00148FB0001003E00008D3 -:1045500027BD00189742007C30C600FFA08600846B -:104560003047FFFF2402000514C2000B24E346502D -:1045700090A201122C4200071040000724E30A0019 -:1045800090A30112240200140062100400E2102122 -:104590000A0011353047FFFF3067FFFF03E00008D6 -:1045A000A4870014AC87004C8CA201080080402135 -:1045B00000A0482100E2102330C600FF184000038D -:1045C00093AA001324E2FFFCACA2010830C2000150 -:1045D00010400008000000008D02005000E210238F -:1045E00004410013240600058D02005410E200105F -:1045F000000000008D02005414E2001A00000000C8 -:104600003C0208008C4200D8304200201040000AD2 -:1046100024020001910300789102008314430006F4 -:104620002402000101002021012028212406000489 -:104630000A00112300000000A100008411400009BD -:10464000A50200148F4301008F4201F80440FFFED1 -:1046500024020002AF4301C0A34201C43C02100087 -:10466000AF4201F803E000080000000027BDFFE8AA -:104670008FA90028AFBF00100080402100E9182357 -:104680001860007330C600FFA080007CA08000810D -:104690008CA2010800E210230440004D000000003D -:1046A0008C8200509483003C8C8400640047482333 -:1046B0003063FFFF012318210083202B10800004AA -:1046C000000000008D0200640A00118600E2102143 -:1046D0009502003C3042FFFF0122102100E2102130 -:1046E000AD02005C9502003C8D03005C3042FFFF90 -:1046F0000002104000E210210043102B1040000384 -:10470000000000000A0011958D02005C9502003C3B -:104710003042FFFF0002104000E21021AD02005CB9 -:10472000A1000084AD07004C8CA2010800E2102318 -:104730001840000224E2FFFCACA2010830C20001D4 -:104740001040000A000000008D02005000E210231B -:1047500004410004010020218D02005414E20003F2 -:10476000000000000A0011B7240600058D02005465 -:1047700014E200478FBF00103C0208008C4200D8B2 -:10478000304200201040000A24020001910300780A -:10479000910200831443000624020001010020213D -:1047A000240600048FBF00100A00112327BD001843 -:1047B000A1000084A50200148F4301008F4201F87C -:1047C0000440FFFE240200020A0011DC0000000089 -:1047D0008C82005C004910230043102B54400001E0 -:1047E000AC87005C9502003C3042FFFF0062102B5A -:1047F00014400007240200029502003C8D03005C77 -:104800003042FFFF00621821AD03005C2402000269 -:10481000AD07004CA10200840E000FD78F440100A9 -:104820001040001B8FBF00108F4301008F4201F822 -:104830000440FFFE24020002AF4301C0A34201C4B2 -:104840003C021000AF4201F80A0011F28FBF0010C5 -:1048500030C200101040000E8FBF00108C83005C2F -:104860009482003C006918233042FFFF0062182147 -:104870003C023FFF3444FFFF0083102B54400001F3 -:104880000080182101231021AD02005C8FBF0010B1 -:1048900003E0000827BD001827BDFFE88FAA002805 -:1048A000AFBF00100080402100EA482319200021FA -:1048B00030C600FF8C83005C8C820064006A182381 -:1048C0000043102B504000100069182194A20110E1 -:1048D00001221021A4A2011094A201103042FFFF76 -:1048E0000043102B1440000A3C023FFF94A2011029 -:1048F00000431023A4A201109482003C3042FFFF29 -:104900000A00121100621821A4A001103C023FFF0E -:104910003444FFFF0083102B544000010080182115 -:1049200000671021AD02005CA100007C0A00125952 -:10493000A100008130C200101040003C00000000C7 -:104940008C820050004A10231840003800000000FC -:104950009082007C24420001A082007C9082007C36 -:104960003C0308008C630024304200FF0043102BFE -:104970001440005C8FBF00108CA2010800E21023DD -:1049800018400058000000008C8300549482003CC2 -:10499000006A18233042FFFF000318430002104052 -:1049A0000043102A10400005000000008C820054D3 -:1049B000004A10230A001240000210439482003C77 -:1049C0003042FFFF00021040AD0200649502003C3F -:1049D0008D0400649503003C3042FFFF000210404C -:1049E000008220213063FFFF008318210143102142 -:1049F000AD02005C8D020054ACA20108240200024A -:104A0000A10200840E000FD78F4401001040003532 -:104A10008FBF00108F4301008F4201F80440FFFE5A -:104A2000240200020A00128200000000AD07004CC0 -:104A30008CA2010800E210231840000224E2FFFCCF -:104A4000ACA2010830C200011040000A00000000C2 -:104A50008D02005000E210230441000401002021D7 -:104A60008D02005414E20003000000000A001279D5 -:104A7000240600058D02005414E2001A8FBF0010B6 -:104A80003C0208008C4200D8304200201040000A4E -:104A90002402000191030078910200831443000670 -:104AA0002402000101002021240600048FBF001011 -:104AB0000A00112327BD0018A1000084A5020014DC -:104AC0008F4301008F4201F80440FFFE24020002E0 -:104AD000AF4301C0A34201C43C021000AF4201F841 -:104AE0008FBF001003E0000827BD00188FAA001038 -:104AF0008C8200500080402130C600FF004A102305 -:104B000000A048211840000700E0182124020001FD -:104B1000A0800084A0A00112A48200140A0011F455 -:104B2000AFAA0010A0800081AD07004C8CA2010844 -:104B300000E210231840000224E2FFFCACA20108AE -:104B400030C2000110400008000000008D0200503B -:104B50000062102304410013240600058D02005456 -:104B600010620010000000008D0200541462001159 -:104B7000000000003C0208008C4200D830420020B7 -:104B80001040000A24020001910300789102008382 -:104B900014430006240200010100202101202821E5 -:104BA000240600040A00112300000000A100008474 -:104BB000A502001403E000080000000027BDFFE08C -:104BC000AFBF0018274201009046000A8C4800142D -:104BD0008C8B004C9082008430C900FF0168182340 -:104BE000304A00FF1C60001A2D4600062402000116 -:104BF0000142100410C00016304300030120302190 -:104C00000100382114600007304C000C15800009A9 -:104C1000304200301440000B8FBF00180A0012E32E -:104C2000000000000E0011F4AFAB00100A0012E308 -:104C30008FBF00180E001169AFAB00100A0012E31D -:104C40008FBF0018AFAB00100E001289AFAA00147E -:104C50008FBF001803E0000827BD002024020003D6 -:104C6000A08200848C82005403E00008ACA20108FA -:104C70003C02000803421821906200812406004390 -:104C80003C07601924420001A0620081906300810A -:104C90003C0208008C4200C0306300FF1462001028 -:104CA0002403FF803C0208008C4200E000821021B7 -:104CB00000431024AF4200243C0208008C4200E074 -:104CC0003C03000A008210213042007F0342102181 -:104CD00000431021944500D40A000BBF30A5FFFF0C -:104CE00003E000080000000027BDFFE0AFBF001890 -:104CF000AFB10014AFB000108F420180008080215E -:104D000000A088210E0012EA00402021A2000084A9 -:104D10008E0200548FBF00188FB00010AE22010821 -:104D20008FB1001403E0000827BD002027BDFFE07D -:104D30003C020008AFB00010AFBF0018AFB10014C4 -:104D4000034280218F510140920300848E04005061 -:104D50008E02004C14820040306600FF3C020800C6 -:104D60008C4200E02403FF80022210210043102423 -:104D7000AF4200243C0208008C4200E09744007CD3 -:104D800092050081022210213042007F0342182147 -:104D90003C02000A0062182114A0000B3084FFFFBF -:104DA0002402000554C20014248205DC9062011222 -:104DB00024420001A062011224020C80AF420024B0 -:104DC0000A00134224020005A0600112240200051B -:104DD00014C20009248205DC920200812C420007E3 -:104DE0005040000524820A0092030081240200142E -:104DF00000621004008210213044FFFFA60400145A -:104E00000E0012EA022020219602003C8E03004C84 -:104E1000022020213042FFFF0002104000621821D2 -:104E20000E000335AE03005C9202007D02202021BB -:104E3000344200400E00033EA202007D8F4201F882 -:104E40000440FFFE24020002AF5101C0A34201C48E -:104E50003C021000AF4201F88FBF00188FB1001460 -:0C4E60008FB0001003E0000827BD002008 -:044E6C0008000E7CB0 -:104E700008000EC408000F0408000F5008000F843B -:104E80000A00002000000000000000000000000DEB -:104E90006370342E362E31360000000004061004F4 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000002000000000C2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF0000000000000000000000000010000002B86 -:104F00000000000010000003000000000000000D81 -:104F10000000000D3C020800244258A43C03080095 -:104F200024635F70AC4000000043202B1480FFFD21 -:104F3000244200043C1D080037BD7FFC03A0F02183 -:104F40003C100800261000803C1C0800279C58A438 -:104F50000E00019C000000000000000D27BDFFE8CE -:104F60003C096018AFBF00108D2C5000240DFF7F4E -:104F700024080031018D5824356A380C24070C00B0 -:104F80003C1A8000AD2A50003C04800AAF4800085B -:104F90003C1B8008AF4700240E000924AF8400109A -:104FA0000E0008E7000000000E00083400000000BA -:104FB0000E00125E000000003C0460168C850000AC -:104FC0003C06FFFF3C02535300A618241062003F2A -:104FD00034867C0094C201F2A780002C10400003AC -:104FE000A78000CC38581E1EA798002C94C201F848 -:104FF00010400004978300CC38591E1EA79900CC9E -:10500000978300CC2C7F006753E0000124030066E7 -:105010009784002C2C820401144000020060282197 -:10502000240404003C0760008CE904382403103C8D -:105030003128FFFF1103001730B9FFFF5720000C84 -:10504000A38000CE24020050A38200CE939F00CE06 -:1050500013E0000A8FBF001027BD0018A78000CC06 -:10506000A780002CA780003403E00008A78000E69A -:10507000939F00CE17E0FFF88FBF001027BD0018E8 -:10508000A78500CCA784002CA780003403E000088B -:10509000A78000E6A38000CE8CCB003C316A0001E3 -:1050A0001140000E0000000030A7FFFF10E0FFE6F7 -:1050B000240200508CCC00C83186000114C0FFE4EB -:1050C000939F00CE0A000072240200518C8F0004CE -:1050D0003C0E60000A00005501EE30218CEF0808FC -:1050E000240D5708000F740211CD000430B8FFFFE3 -:1050F000240500660A000073240404001700FFD48E -:10510000939F00CE0A000072240200508F86001088 -:105110003089FFFF000939408CC300103C08005063 -:1051200000E82025AF4300388CC500142742040056 -:10513000AF82001CAF45003CAF44003000000000CF -:10514000000000000000000000000000000000005F -:105150000000000000000000000000008F4B000075 -:10516000316A00201140FFFD0000000003E000084C -:10517000000000008F840010948A001A8C8700249D -:105180003149FFFF000940C000E83021AF46003C34 -:105190008C8500248F43003C00A310231840002975 -:1051A000000000008C8B0020256200013C0D0050A7 -:1051B00035AC0008AF420038AF4C003000000000B2 -:1051C00000000000000000000000000000000000DF -:1051D0000000000000000000000000008F4F0000F1 -:1051E00031EE002011C0FFFD000000008F4A0400D6 -:1051F0003C080020AC8A00108F490404AC890014DC -:10520000AF48003000000000948600189487001C0E -:1052100000C71821A48300189485001A24A2000155 -:10522000A482001A9498001A9499001E133800035F -:105230000000000003E000080000000003E0000898 -:10524000A480001A8C8200200A0000CC3C0D005083 -:105250000A0000BD000000003C0308008C63002031 -:105260008F82001827BDFFE810620008AFBF001052 -:105270000E0000F4AF8300183C0308008C6300208C -:1052800024040001106400048F8900108FBF0010F7 -:1052900003E0000827BD00188FBF00103C07601214 -:1052A000A520000A9528000A34E5001027BD001843 -:1052B0003106FFFF03E00008ACA600903C020800A6 -:1052C0008C42002027BDFFC8AFBF0034AFBE003006 -:1052D000AFB7002CAFB60028AFB50024AFB40020A4 -:1052E000AFB3001CAFB20018AFB1001410400050B3 -:1052F000AFB000108F840010948600069483000ADB -:1053000000C3282330B6FFFF12C0004A8FBF00340D -:1053100094890018948A000A012A40233102FFFF71 -:1053200002C2382B14E0000202C0202100402021DC -:105330002C8C0005158000020080A021241400049C -:105340000E0000A3028020218F8700100280982188 -:10535000AF80001494ED000A028088211280004E74 -:1053600031B2FFFF3C1770003C1540003C1E60004E -:105370008F8F001C8DEE000001D71824507500504F -:105380000220202102A3802B160000353C182000AB -:105390005078004702202021241000018F83001440 -:1053A00014600039029158230230F8230250C821BA -:1053B00033F1FFFF1620FFEE3332FFFF8F8700101F -:1053C0003C110020AF5100300000000094E6000ABC -:1053D0003C1E601237D5001002662821A4E5000AA1 -:1053E00094E2000A94F2000A94F400183057FFFF88 -:1053F0001292003BAEB700908CED00148CE40010CC -:105400000013714001AE4021000E5FC3010E502B0E -:10541000008B4821012A1821ACE80014ACE30010ED -:1054200002D3382330F6FFFF16C0FFB98F84001077 -:105430008FBF00348FBE00308FB7002C8FB600288E -:105440008FB500248FB400208FB3001C8FB20018DA -:105450008FB100148FB0001003E0000827BD0038A2 -:10546000107E001B000000001477FFCC2410000108 -:105470000E0015A9000000008F8300141060FFCB00 -:105480000230F823029158238F87001001702021E9 -:105490000A0001873093FFFF8F8300141460FFCB55 -:1054A0003C110020AF5100300A0001530000000001 -:1054B0000E00079B024028210A000147004080217E -:1054C0000E000341024028210A00014700408021CC -:1054D0000E001471022020210A00014700408021A3 -:1054E0000E0000BD000000000A00016902D338234D -:1054F00027BDFFE8AFB00010AFBF00140E000037AB -:10550000000000003C028000345000700A0001AA34 -:105510008E0600008F4F000039EE000131C20001FD -:10552000104000248F8600A88E0700003C0C080065 -:105530008D8C003C3C0908008D29003800E668236A -:10554000018D28210000502100AD302B012A40217F -:10555000010620213C010800AC25003CAF8700A8D3 -:105560003C010800AC2400380E0000F600000000EA -:105570003C0308008C6300701060FFE6006020218F -:105580003C0508008CA500683C0608008CC6006C31 -:105590000E001538000000003C010800AC2000702F -:1055A0008F4F000039EE000131C200011440FFDED0 -:1055B0008F8600A88E0A00008F8B00A83C0508008B -:1055C0008CA5003C3C0408008C840038014B482327 -:1055D00000A938210082182100E9402B0068102121 -:1055E0003C010800AC27003C3C010800AC2200381C -:1055F0008F5F01002419FF0024180C0003F92024F8 -:1056000010980012AF840000AF440020936D00009A -:10561000240C002031A600FF10CC0012240E0050F4 -:1056200010CE00043C194000AF5901380A0001A314 -:10563000000000000E0011D4000000003C194000E2 -:10564000AF5901380A0001A3000000000E00010F4D -:10565000000000003C194000AF5901380A0001A3C6 -:10566000000000008F58010000802821330F00FF48 -:1056700001E020210E0002EEAF8F00043C19400033 -:10568000AF5901380A0001A30000000000A4102B4C -:1056900024030001104000090000302100052840CB -:1056A00000A4102B04A00003000318405440FFFC8A -:1056B000000528405060000A0004182B0085382B94 -:1056C00054E000040003184200C330250085202365 -:1056D000000318421460FFF9000528420004182B4B -:1056E00003E0000800C310213084FFFF30A5FFFF56 -:1056F0008F4201B80440FFFE3C0740800087302500 -:105700003C031000AF400180AF450184AF460188E3 -:1057100003E00008AF4301B83084FFFF8F4201B8B7 -:105720000440FFFE3C0740388CA600000087282577 -:105730003C031000AF460180AF45018803E000083C -:10574000AF4301B88F8300388F8600301066000B9E -:10575000008040213C07080024E75A18000328C0B5 -:1057600000A710218C44000024630001108800056C -:105770003063000F5466FFFA000328C003E00008FE -:10578000000010213C07080024E75A1C00A7302124 -:1057900003E000088CC200003C039000346200016A -:1057A00000822025AF4400208F45002004A0FFFE8A -:1057B0000000000003E00008000000003C0380003F -:1057C000346200010082202503E00008AF4400207D -:1057D00027BDFFE0AFB100143091FFFFAFB0001064 -:1057E000AFBF00181220001500A080218CA500007A -:1057F00010A00013240400020E000C6B24060140CC -:10580000AE0000008F4201B80440000D00002821C6 -:105810003C064000022620258FBF00188FB10014DF -:105820008FB000103C03100027BD0020AF45018061 -:10583000AF44018803E00008AF4301B88CA5000025 -:105840008F4201B80440FFFE3C064000022620259E -:105850008FBF00188FB100148FB000103C031000F0 -:1058600027BD0020AF450180AF44018803E0000858 -:10587000AF4301B83086FFFF8F4201B80440FFFEFE -:105880003C0940068CA8000000C93825AF480180BB -:105890008CA400043C031000AF440184AF4701888E -:1058A00003E00008AF4301B827BDFFE0AFB0001030 -:1058B000AFBF0018AFB100149363003E0080802199 -:1058C0000080282130620040000020211040000F9D -:1058D0008E1100000E000860022020219367000056 -:1058E0002404005030E500FF50A400128E0F000089 -:1058F000022020218FBF00188FB100148FB000103C -:10590000A762013C0A00092027BD00200E00027D8D -:10591000000000000E0008600220202193670000B4 -:105920002404005030E500FF14A4FFF202202021DF -:105930008E0F00003C1008008E1000503C0D000C33 -:10594000240BFF8001F05021314E007F01DA6021ED -:10595000018D4021014B4824AF490028022020211D -:105960008FBF00188FB100148FB00010A50200D6B1 -:1059700027BD00200A000920AF8800D027BDFFE026 -:10598000AFBF0018AFB10014AFB0001093660001B4 -:10599000008080210E00024630D10004936400058F -:1059A000001029C2A765000034830040A3630005EE -:1059B0000E00024F020020210E00092202002021C9 -:1059C00024020001AF62000C02002821A76200102F -:1059D00024040002A762001224060140A7620014FA -:1059E0000E000C6BA76200161620000F8FBF001868 -:1059F000978C00343C0B08008D6B00782588FFFFE6 -:105A00003109FFFF256A0001012A382B10E000064A -:105A1000A78800343C0F6006240E001635ED0010F8 -:105A2000ADAE00508FBF00188FB100148FB00010C2 -:105A300003E0000827BD002027BDFFE0AFB1001440 -:105A4000AFBF0018AFB0001000A088211080000A7E -:105A50003C0360002402008010820012000000005D -:105A60000000000D8FBF00188FB100148FB0001020 -:105A700003E0000827BD00208C682BF80500FFFE1E -:105A800000000000AC712BC08FBF00188FB1001454 -:105A90008FB000103C09100027BD002003E0000873 -:105AA000AC692BF80E00024600A02021936500058A -:105AB000022020210E00024F30B000FF2403003EE0 -:105AC0001603FFE7000000008F4401780480FFFE0A -:105AD000240700073C061000AF510140022020219E -:105AE000A34701448FBF00188FB100148FB000107E -:105AF000AF4601780A0002BF27BD002027BDFFE89E -:105B0000AFBF0014AFB000108F50002000000000A5 -:105B10000E000922AF440020AF5000208FBF0014B8 -:105B20008FB0001003E0000827BD00183084FFFF8D -:105B30008F4201B80440FFFE3C0740350087302506 -:105B40003C031000AF450180AF400184AF4601889F -:105B500003E00008AF4301B83084FFFF8F4201B873 -:105B60000440FFFE3C074036008730253C03100010 -:105B7000AF450180AF400184AF46018803E00008D3 -:105B8000AF4301B827BDFFD0AFB3001C3093FFFF78 -:105B9000AFB50024AFB20018AFBF0028AFB40020EB -:105BA000AFB10014AFB0001030B5FFFF1260002796 -:105BB000000090218F90001C8E0300003C068000A6 -:105BC0002402004000033E0200032C0230E4007F68 -:105BD000006688241482001D30A500FF8F830028F2 -:105BE0002C68000A510000108F91001400035880A7 -:105BF0003C0C0800258C56CC016C50218D490000CE -:105C0000012000080000000002B218213065FFFFEB -:105C10000E00021A24040084162000028F90001C3B -:105C2000AF8000288F910014260C0020264B000125 -:105C3000018080213172FFFF16200004AF8C001C10 -:105C40000253402B1500FFDC000000000240102131 -:105C50008FBF00288FB500248FB400208FB3001CA5 -:105C60008FB200188FB100148FB0001003E000084D -:105C700027BD0030240D003414AD00F600000000F4 -:105C8000920B000E240A16803C07000CA36B002127 -:105C90009203000D0347F8213C066000A363002037 -:105CA000961100123C087FFF350CFFFFA771003CE6 -:105CB00096020010240B00053054FFFFAF740084DF -:105CC0008E19001CAF4A00288FF800008CCF444882 -:105CD0000319702601EE3021AF66004C8F69004C2D -:105CE00024CD00013C197F00AF6900508F64005043 -:105CF000AF640054AF660070AF6D00588F650058F8 -:105D000024040050AF65005CA3600023AF6C006406 -:105D1000A36B00378E030014AF6300488F710048F7 -:105D2000AF7100248E020018AF62006C9214000C58 -:105D3000A3740036936A003E355F0020A37F003EC7 -:105D40008F7800740319782435EE4000AF6E00742C -:105D500093700000320900FF112402332418FF80E1 -:105D60003C04080024845A980E00028A00000000B7 -:105D700024060004240700013C0408008C845A987F -:105D8000A366007DA36700058F4A01780540FFFEEA -:105D900024020002AF440140A34201448F90001C42 -:105DA0003C141000AF5401780A000369AF8000284A -:105DB0002CAD003751A0FF9C8F9100140005A080EE -:105DC0003C180800271856F4029878218DEE000040 -:105DD00001C00008000000002406000614A60011FF -:105DE000000000003C1F08008FFF5A9824040005A3 -:105DF000AF5F00208E190018AF7900188F78004C23 -:105E0000AF78001C8F6F0050122000C2AF6F00707F -:105E10000A000369AF840028240A000710AA00843E -:105E2000240300063C05080024A55A980E000254DD -:105E3000240400818F90001C0011102B0A000369BC -:105E4000AF820028240A000414AAFFF6240300509D -:105E50003C0E08008DCE5A98AF4E00208E090008E7 -:105E6000AF6900408E060008AF6600448E07000C44 -:105E7000AF6700488E040010AF64004C8E0D001018 -:105E8000AF6D00848E080014AF6800508E050018B6 -:105E9000AF6500548E0C001CAF6C0058936B000073 -:105EA000317400FF128301F5000000008F64004888 -:105EB0008F6600400086382304E000042404008C30 -:105EC0001620FFDE24020003240400823C050800A3 -:105ED00024A55A980E00027D000000008F90001C3F -:105EE000000010210A000369AF8200282409000580 -:105EF00014A9FFCC240520003C0A08008D4A5A98BA -:105F0000AF4A00208E1F0004AF7F005C921900088A -:105F100024100008A37900218F98001C930F00091A -:105F2000A36F00208F86001C90CE000A31C400FFB2 -:105F300010900010288300091460006C24020002F5 -:105F4000240800201088000B3405800028850021DB -:105F500014A0000824054000240D0040108D000509 -:105F60003C05000124070080108700023C05000268 -:105F7000240540008F6E00743C0FFF0001CF802489 -:105F800002054825AF69007490C4000BA36400812A -:105F90008F84001C9486000C10C0019B0000000040 -:105FA000948E000C241FFFBF24060004A76E003C43 -:105FB0009090000EA370003E8F89001C9124000F6A -:105FC000A364003F8F94001C8E8D00108F470074D7 -:105FD00001A72823AF6500608E880014AF680064B5 -:105FE000968C0018A76C0068968B001AA76B006A45 -:105FF0008E82001CAF62006C96830002A763013E94 -:10600000928A000EA36A003E9379003E033FC024AB -:106010001220016AA378003E8F90001C0A000369D9 -:10602000AF8600282414002214B4FF7E2403000746 -:106030003C0208008C425A981220000CAF4200200B -:106040000A000369AF830028240C003310AC00144D -:10605000240800283C05080024A55A980E000226B2 -:10606000240400810A0003EE8F90001C3C04080009 -:1060700024845A980E00028A00000000936B0000EE -:1060800024110050316300FF107101540000000022 -:106090008F90001C000018210A000369AF830028BC -:1060A0003C0508008CA55A9824040081AF450020C7 -:1060B000A36800343C05080024A55A980E00022667 -:1060C000000000008F90001C240200090A000369F0 -:1060D000AF82002802B288213225FFFF0E00021A8B -:1060E000240400840A0003698F90001C1082FFA121 -:1060F000240504002894000312800176240C000477 -:10610000240B0001548BFF9B240540000A00043D32 -:10611000240501003C04080024845A988F62004C36 -:106120000E00028A8F6300508F90001C0000202117 -:106130000A000369AF8400288E1000042404008A3A -:10614000AF500020936E000531C900021520016593 -:10615000020028219378002302002821330F002019 -:1061600015E001602404008D9362003F24190012A1 -:10617000305F00FF13F9015B240400810E0002462A -:106180000200202193740023240A0004020020212D -:1061900036830042A36300230E00024FA36A007DF2 -:1061A0008F4B01780560FFFE24050002AF500140CF -:1061B000A34501448F90001C3C0C1000AF4C0178AB -:1061C0000A0003EF0011102B8E1000042404008A33 -:1061D000AF500020936D000531A800021500001992 -:1061E000020028219367003F2414001230E400FFCE -:1061F0001094010100000000936E003F240600048B -:1062000031C900FF112600FC000000000E0002460C -:1062100002002021936200232419FFFE02002021A6 -:10622000345F0020A37F0023A374003F9378000510 -:10623000031978240E00024FA36F000502002821E5 -:10624000000020210E000336000000000A0003EECB -:106250008F90001C8E0500043C0F0008034F402166 -:10626000AF450020910E00002406005031C900FF08 -:106270001126017A240400888F5901B80720FFFEF7 -:106280003C0C400E008C58253C031000AF450180AB -:10629000AF400184AF4B0188AF4301B891020000C9 -:1062A000240AFF8024040004004AF825A11F0000EE -:1062B0000E000C6B240600300A0003EE8F90001CC9 -:1062C0008E04001C0E000231000000001040014C42 -:1062D000004048218F90001C240500898F4D01B893 -:1062E00005A0FFFE00000000AF4901808E0F001CDA -:1062F0003C1440010011702B00B448253C111000E3 -:10630000AF4F0184AF8E0028AF490188AF5101B86B -:106310000A00036A8F910014961900023C140800C9 -:1063200026945A9833380004130000F23C026000AF -:106330008E1F001C3C010800AC3F5A98AF5F002044 -:10634000920C0010240B0014318400FF148B011CEC -:106350000000000096090002312D000115A001B2D5 -:10636000000000008E020004AE8200083C0E08000F -:106370008DCE5AA011C001A8000000008F690074E2 -:106380003C0E800024040001012E6825AF6D0074CE -:10639000A3600005AF64000C3C0C08008D8C5AA073 -:1063A0008F88001CA7640010000C59C2A76400125B -:1063B000A7640014A7640016A76B00088D030008EB -:1063C00024040002AF63002C8D0A000CAF6A003079 -:1063D00091070010A36700348F82001C90450011C4 -:1063E000A36500358F86001C90D00012A370003684 -:1063F0008F9F001C93F90013A37900378F90001C26 -:1064000096180014A778003896140016A774003A5E -:106410008E0F0018AF6F00245620FE02AF840028B4 -:106420003C05080024A55A980E00025400002021C3 -:106430008F90001C0A0004AC000020218E0F000485 -:106440003C14080026945A983C010800AC2F5A9836 -:10645000AF4F0020920E000331C90004112000024A -:106460002402001224020006A362003F9203001BD4 -:10647000240AFFC03062003F004AF825A37F003E97 -:106480009219000333380001170000C1000000001A -:106490008E020008AE8200083C0208008C425AA01E -:1064A000104000C000000000000221C2A7640008E4 -:1064B0008E0D000C240B000124140014AF6D002C71 -:1064C0008E080010AF68003096050016A7650038EA -:1064D000960C0014A76C003AAF6B000CA76B001071 -:1064E000A76B0012A76B0014A76B0016122000EB1D -:1064F000A37400349206000330C700022CF00001A0 -:10650000260200088F90001C0A000369AF82002851 -:106510008E14000424030081AF54002093680023EC -:106520003105001010A000AC000000008F4401B83D -:106530000480FFFE3C06401F0011382B006610252A -:106540003C111000AF540180AF870028AF40018498 -:10655000AF420188AF5101B80A00036A8F9100145D -:106560008E0600043C19000803592021AF46002084 -:106570008E07000890980000240F0050331400FF8D -:10658000128F00A7240500888F4401B80480FFFE05 -:106590003C0D40090011602B00AD10253C1110008E -:1065A000AF460180AF8C0028AF470184AF4201881D -:1065B000AF5101B80A00036A8F9100143C0508002E -:1065C00024A55A980E00027D240400828F90001C9E -:1065D000000030210A000369AF8600283C0408004F -:1065E0008C845A980E0014F6000000008F90001C56 -:1065F0000A000486000018210E00033624040081DE -:106600000A0003EE8F90001C3C05080024A55A9850 -:106610000E00027D2404008B8F90001C0011302B93 -:106620000A000369AF8600283C1908008F395A9880 -:106630003C1F08008FFF005024CCFFFE033F782151 -:1066400001F87024AF4E00283C0408008C845A984E -:106650003C0908008D2900500089682131A5007F80 -:1066600000BA402101078021AE0600D8AF9000D0CB -:10667000AE0000DC0A0003B8AE0C0108AF60008475 -:106680003C0808008D085A983C0D08008DAD00505C -:106690002405FF803C02000C010D58210165602497 -:1066A000AF4C00288E0A00143174007F029A182122 -:1066B00000627821ADEA00D88E1F0014AF8F00D0A1 -:1066C000ADFF00DC8E1900102738FFFE0A00040B16 -:1066D000ADF80108548CFE27240540000A00043D53 -:1066E000240510000E00032B000000000A0003EE3A -:1066F0008F90001C8C46442C3C056C6234B0797041 -:106700003C010800AC205A9814D000082404000270 -:1067100097880034978A002C02802821010A382BA0 -:1067200010E0001124040092240400020E000C89E1 -:10673000240501403C010800AC225A98AF420020D9 -:106740003C0308008C635A98106000052404008301 -:106750000E000854000000001040000924040083CB -:106760003C05080024A55A980E00025400000000C1 -:106770008F90001C0011202B0A000369AF840028B1 -:106780000E000858000000000A0005308F90001C21 -:106790008E0400080E000231000000000A00058689 -:1067A000AE8200083C05080024A55A980E00022677 -:1067B000240400878F90001C0A0005A20011102BF2 -:1067C0000E00085C000000003C05080024A55A9853 -:1067D0000A00063A2404008B0E00024602802021A3 -:1067E0009370002302802021360D00100E00024F0E -:1067F000A36D00238F90001C0A0005AB0000182138 -:10680000240400040E000C89240500301440002AE2 -:10681000004048218F90001C0A00051724050083C2 -:106820009205000C30BF000113E0000300000000DF -:106830009602000EA482002C920A000C314800023D -:106840001100FF5100002821960B00128E03001446 -:10685000A48B001A0A0005C2AC83001C8F83003889 -:106860008F8700301067FE84000020213C0908005B -:1068700025295A1C000320C0008930218CD4000037 -:106880001285005E247800013303000F5467FFFA7D -:10689000000320C00A0004FE000020213C0508007F -:1068A00024A55A980E00027D240400828F90001CBB -:1068B0000A0005A2000010213C0B0008034B202118 -:1068C00024030050240A0001AF420020A0830000EE -:1068D000A08A00018F88001C91070004A08700187F -:1068E0008F82001C90450005A08500198F86001C32 -:1068F00090DF0006A09F001A8F99001C93380007B4 -:10690000A098001B8F94001C928F0008A08F001C81 -:106910008F90001C920E0009A08E001D8F8D001C10 -:1069200091AC000AA08C001E8F8B001C3C0C080050 -:10693000258C5A1C9163000B3C0B0800256B5A18E0 -:10694000A083001F8F8A001C9148000CA0880020A3 -:106950008F87001C90E5000DA08500218F82001C10 -:10696000240546469046000EA08600228F9F001CFC -:1069700093F9000FA09900238F98001C9314001026 -:10698000A09400248F8F001C91F00011A09000258E -:106990008F90001C8F8E00308F990038960D001458 -:1069A000000E18C025C80001A48D0028960A001604 -:1069B000006C3021006BF821A48A002A9607001889 -:1069C0003108000FA487002CA485002E8E02001C25 -:1069D000ACC90000AF88003011190003AFE200001D -:1069E0000A00051700002821250C00013184000F42 -:1069F000000028210A000517AF8400383C07080072 -:106A000024E75A180087802100002021ACC0000034 -:106A10000A0004FEAE0000003C05080024A55A98B8 -:106A20000A00063A240400878E0400040E00023196 -:106A3000000000000A00053BAE8200083084FFFF22 -:106A400030C600FF8F4201B80440FFFE000644003C -:106A5000010430253C07200000C720253C0310001E -:106A6000AF400180AF450184AF44018803E00008D6 -:106A7000AF4301B827BDFFE8AFB00010AFBF0014AF -:106A80003C076000240600021080000600A0802160 -:106A90000010102B8FBF00148FB0001003E000080F -:106AA00027BD00183C09600EAD2000348CE5201C89 -:106AB0008F82001C2408FFFC00A81824ACE3201CD3 -:106AC0000E0006EF8C45000C0010102B8FBF001439 -:106AD0008FB0001003E0000827BD00183C02600ED4 -:106AE0003447010024090018274A04000000000070 -:106AF00000000000000000003C06005034C302000B -:106B0000AF440038AF45003CAF430030014018218E -:106B10008F4B0000316800201100FFFD2406007F2C -:106B20002408FFFF8C6C000024C6FFFF24630004D0 -:106B3000ACEC000014C8FFFB24E7000400000000D8 -:106B400000000000000000003C0F0020AF4F0030AC -:106B50000000000024AD020001A5702B2529FFFFD5 -:106B6000008E20211520FFE101A0282103E000086C -:106B70000000000027BDFFE0AFB10014AFBF001858 -:106B8000AFB000103C05600E8CA20034008088215C -:106B9000144000063C0460008C87201C2408FFFC85 -:106BA00000E8302434C30001AC83201C8F8B001C10 -:106BB00024090001ACA90034956900028D65001418 -:106BC0008D70000C2D2400818D6700048D660008F7 -:106BD000108000078D6A00102D2C00041580000E17 -:106BE00030CE0007312D000311A0000B0000000083 -:106BF0002404008B020028210E0006EF2406000367 -:106C00000011102B8FBF00188FB100148FB000102F -:106C100003E0000827BD002015C0FFF62404008B08 -:106C20003C030020AF4300300000000024020001BC -:106C3000AF8200140000000000000000000000000F -:106C40003C1F0150013FC825253800033C0F600E52 -:106C5000AF47003800181882AF46003C35E8003CCA -:106C6000AF590030274704008F44000030860020D1 -:106C700010C0FFFD00000000106000082466FFFF48 -:106C80002403FFFF8CEB000024C6FFFF24E7000471 -:106C9000AD0B000014C3FFFB250800043C08600E88 -:106CA000AD090038000000000000000000000000F6 -:106CB0003C070020AF470030000000000E0007171F -:106CC0000140202102002821000020210E0006EFB3 -:106CD000240600030011102B8FBF00188FB1001481 -:106CE0008FB0001003E0000827BD002027BDFFD8AB -:106CF000AFB200183092FFFFAFB10014AFBF002059 -:106D0000AFB3001CAFB000101240002C000088216F -:106D10000A0007AF2413000150B3003C8CE5000CBF -:106D20000000000D262D000131B1FFFF24EC0020F2 -:106D30000232382B10E00021AF8C001C8F8200142F -:106D40001440001E8F87001C3C0670003C0320008E -:106D50008CE400000086282414A300188F85003CD2 -:106D6000000444023C0980000089802414A0FFEA4A -:106D7000310600FF2404000210C4001F28CA0003CB -:106D800011400016240B000314D3FFE7262D000149 -:106D9000020028210E0006FD240400018F87001C3C -:106DA000AF82003C262D000131B1FFFF24EC002012 -:106DB0000232382B14E0FFE1AF8C001C02201021BE -:106DC0008FBF00208FB3001C8FB200188FB100144A -:106DD0008FB0001003E0000827BD002814CBFFD2BD -:106DE000262D00010E00073D020020218F87001C88 -:106DF0000A0007C9AF82003C020028210E0006FDF0 -:106E0000000020210A0007C88F87001C0E0006EF33 -:106E1000240400841600FFC38F87001C0A0007A902 -:106E2000AF80003C3082FFFF1440000300001821B7 -:106E30000004240224030010308500FF14A0000584 -:106E40003087000F246600080004220230C300FFD0 -:106E50003087000F14E00005308900032468000427 -:106E600000042102310300FF3089000315200005D2 -:106E7000388B0001246A000200042082314300FFA5 -:106E8000388B00013164000110800002246C000185 -:106E9000318300FF03E0000800601021308BFFFF0A -:106EA000000B394230E600FF3C09080025295998BB -:106EB00000064080010960218D8700003164001FB9 -:106EC000240A0001008A180430A500FF00E32025F1 -:106ED00014A000020003102700E22024240F000168 -:106EE00000CF700401096821000E282714800005D6 -:106EF000ADA400008F86000C00A6102403E000085B -:106F0000AF82000C8F88000C01C8102503E0000838 -:106F1000AF82000C3C06001F3C0360003084FFFF82 -:106F200034C5FF8024020020AC602008AC60200C37 -:106F3000AC602010AC652014AC642018AC6220005A -:106F4000000000000000000003E000080000000056 -:106F500027BDFFE82402FFFFAFBF0010AF82000C87 -:106F6000000020213C06080024C659982405FFFF94 -:106F700024890001000440803124FFFF010618210C -:106F80002C87002014E0FFFAAC6500000E000825F5 -:106F900000002021240200013C04600024050020A0 -:106FA000AC822018AC85200000000000000000002A -:106FB00000000000244A00013142FFFF2C4604007B -:106FC00014C0FFF78FBF001003E0000827BD0018B2 -:106FD0008F8300082C62040003E00008384200019F -:106FE0008F8300082462000103E00008AF820008DC -:106FF0008F8300082462FFFF03E00008AF820008CF -:1070000027BDFFE0AFB10014AFBF0018AFB0001054 -:107010008F6B00303C06600000808821ACCB2008DC -:107020008F6A002C3C02800024030008ACCA200CAC -:107030009769003A9768003800092C003107FFFF74 -:1070400000A72025ACC42010ACC22014ACC3200083 -:107050000000000000000000000000003C03600091 -:107060008C6D200031AC00081580FFF90000000095 -:107070008C6E201405C00020000000000E0007E9FF -:107080008F84000C000240803C0908002529599893 -:10709000010938218CE400000E0007E9000281405C -:1070A000020220213090FFFF020020210E0008077D -:1070B000000028213C0C8000022C58253210FFFFD4 -:1070C0003C116000240A0020AE2B2014AE302018A2 -:1070D000AE2A2000000000000000000000000000B8 -:1070E000020010218FBF00188FB100148FB0001064 -:1070F00003E0000827BD00208C6620143C02001F1E -:107100003443FF803C1FFFE800C3C02437F9080068 -:1071100003198021001079C23C0C8000022C5825F4 -:1071200031F0FFFF3C116000240A0020AE2B201438 -:10713000AE302018AE2A2000000000000000000041 -:1071400000000000020010218FBF00188FB1001452 -:107150008FB0001003E0000827BD002027BDFFE826 -:10716000AFB000103402FFFF3090FFFFAFBF00143C -:1071700012020006020020210E0008250000000077 -:10718000020020210E000807240500018F8400085A -:107190008FBF00148FB000102483FFFF27BD00189D -:1071A00003E00008AF830008000439C230E6003F66 -:1071B00000043B4200071840240210002CC40020A9 -:1071C00024C8FFE0AF42002C2463000114800003B8 -:1071D00030A900FF00071840310600FF000360805F -:1071E00024080001019A58213C0A000E00C8280416 -:1071F000016A382111200005000530278CE90000C4 -:107200000125302503E00008ACE600008CEE00000C -:1072100001C6682403E00008ACED000027BDFFE8CC -:10722000AFBF0014AFB000103C0460008C850808AC -:107230003403F00030A2F0005043000624020001A5 -:107240008C8708083404E00030E6F00010C4001E0B -:1072500024020002AF8200403C1060003C0A0200A1 -:10726000AE0A0814240910003C08000E8E034400E6 -:1072700003482021AF49002C240501200E000CCF2B -:10728000000030218F830040106000043C02169102 -:10729000240B0001106B000E3C023D6C344F00903B -:1072A000AE0F44088FBF00148FB000103C0C60007C -:1072B000240E10003C0D020027BD0018AD8E4420A6 -:1072C00003E00008AD8D08100A0008F6AF8000400A -:1072D0003C0218DA344F0090AE0F44088FBF001400 -:1072E0008FB000103C0C6000240E10003C0D02001A -:1072F00027BD0018AD8E442003E00008AD8D0810B6 -:107300000A0008CA240500010A0008CA0000282152 -:107310003C08080025085DA42404FFFF0100182193 -:107320002402001E2442FFFFAC6400000441FFFD64 -:10733000246300043C07080024E75E208CE5FFFC82 -:107340002404001C24060001308A001F0146480462 -:1073500024840001000910272C8300201460FFFA08 -:1073600000A22824ACE5FFFC3C05666634A4616EEF -:107370003C06080024C65EE0AF840058AF88009C3D -:107380002404FFFF00C018212402001F2442FFFF35 -:10739000AC6400000441FFFD246300043C07666602 -:1073A0003C05080024A55EA0AF86004834E6616E67 -:1073B000AF8600982404FFFF00A018212402000FCC -:1073C0002442FFFFAC6400000441FFFD246300047D -:1073D0003C0B66663C06080024C65E203568616E7C -:1073E000AF8500A4AF8800702404FFFF00C01821FF -:1073F0002402001F2442FFFFAC6400000441FFFD93 -:10740000246300043C0D66663C0A0800254A5F6060 -:1074100035AC616EAF860090AF8C005C2404FFFF3A -:1074200001401821240200032442FFFFAC64000045 -:107430000441FFFD246300043C09080025295F7016 -:107440008D27FFFC24040006240500013099001F4D -:107450000325C00424840001001878272C8E002006 -:1074600015C0FFFA00EF3824AD27FFFC3C09666623 -:1074700024030400240403DC24050200240600661F -:107480003522616E3C08080025085AA4AF820074BA -:10749000AF830044AF83006CAF830050AF830084A0 -:1074A000AF8A008CAF840064AF85004CAF86005477 -:1074B000AF840078AF850060AF860080010018219E -:1074C000240200022442FFFFAC6000000441FFFDE3 -:1074D00024630004240400032403000C3C0A080075 -:1074E000254A5AB0AF8A00680A00099D2405FFFFAB -:1074F0000004188024840001006858212C8700C0F3 -:1075000014E0FFFBAD6500003C0E666635CD616E94 -:10751000240C17A024081800AF8D0088AF8C0094AD -:1075200003E00008AF88007C2484007F000421C2AF -:1075300000004021000030210000382100002821F7 -:107540000A0009B4AF8400A01060000624E700011F -:1075500000C4302124A500012CC20BF51440FFFA11 -:107560002CA300663C09080025295F600120182132 -:10757000240200032442FFFFAC6000000441FFFD31 -:107580002463000410E0001A24E3FFFF00032942F3 -:1075900010A0000A000020212406FFFF3C03080081 -:1075A00024635F60248400010085502BAC660000DA -:1075B000250800011540FFFB2463000430E2001F92 -:1075C0001040000800086880240C0001004C3804BA -:1075D000000858800169282124E6FFFF03E0000825 -:1075E000ACA6000001A940212409FFFFAD0900005D -:1075F00003E0000800000000AF4400283C04000C39 -:1076000003442021000528820A000CCF000030210D -:10761000000421803C036000AC64100800000000FE -:1076200000052980AC65100C0000000003E0000894 -:107630008C62100C27BDFFE800802821240400384C -:10764000AFBF00140E0009E4AFB0001024040E0018 -:10765000AF4400283C10000C0350202124050010EA -:107660000E000CCF0000302103501021AC40000070 -:10767000AC400004240400388FBF00148FB0001009 -:1076800024053FFF27BD00180A0009E48C430000D1 -:10769000000421803C036000AC641008000000007E -:1076A0008C62100C03E000080002118227BDFFC8A5 -:1076B000AFB400208F940068AFBE0030AFB7002C8D -:1076C000AFB600280000B8210080B021241E00C001 -:1076D000AFBF0034AFB50024AFB3001CAFB2001889 -:1076E000AFB10014AFB000100A000A21AFA5003CF2 -:1076F000504000018F94006827DEFFFF13C0002870 -:10770000269400048E9200003C03080024635DA0D0 -:107710001240FFF70283102B3C04080024845AA473 -:10772000028410230002A8C0000098210A000A3039 -:1077300024110001001188401220002600000000E2 -:1077400002B38021025128240200202110A0FFF959 -:10775000267300010E0009ED0000000000166840CD -:1077600032EC000101AC20210E0009E402002821C6 -:107770008F89009426F700018FA6003C3AEB0001A8 -:10778000316A00012528FFFF0011382702CAB02105 -:10779000AF88009416E6FFE702479024AE920000FF -:1077A00002E010218FBF00348FBE00308FB7002C55 -:1077B0008FB600288FB500248FB400208FB3001C33 -:1077C0008FB200188FB100148FB0001003E00008D2 -:1077D00027BD00383C0E080025CE5DA0028E102B80 -:1077E0000A000A1CAE92000027BDFFD8AFB10014FA -:1077F000AFB00010AFBF0020AFB3001CAFB2001895 -:1078000000A0882110A0001F000480403C13080045 -:1078100026735AA40A000A692412000112200019D2 -:10782000261000010E000A0402002021000231424D -:107830002444FFA0000618803045001F2C8217A1A9 -:10784000007318212631FFFF1040FFF400B230040E -:107850008C6900000200202124053FFF01264024FE -:107860001500FFEE012638250E0009E4AC67000084 -:107870008F8A009426100001254700011620FFE999 -:10788000AF8700948FBF00208FB3001C8FB2001809 -:107890008FB100148FB0001003E0000827BD00284E -:1078A0008F85009C00805821000040210000482165 -:1078B000240A001F3C0C0800258C5E1C3C0D0800AF -:1078C00025AD5DA48CA6000050C00014000040212E -:1078D00000AD1023000238C0240300010A000AA2F0 -:1078E000000020211500000300E41021244820247A -:1078F0000000482125290001512B00132506DFDC5B -:10790000106000062484000100C3702415C0FFF538 -:10791000000318400A000AA00000402110AC002615 -:1079200024A3000400602821254AFFFF1540FFE53D -:10793000AF85009C512B00042506DFDC00004021B0 -:1079400003E00008010010210006614230C5001F5D -:10795000000C50803C07080024E75DA424040001CB -:10796000014730211120000F00A420043C0508002D -:1079700024A55E20148000052529FFFF24C60004ED -:1079800010C5001100000000240400018CCF00008D -:107990000004C0270004204001F868241520FFF5EA -:1079A000ACCD00008F99007801001021032B4823F3 -:1079B00003E00008AF8900783C05080024A55DA419 -:1079C0000A000AAA000040213C06080024C65DA463 -:1079D0000A000AC324040001308800FF24020002C8 -:1079E0001102000A240300031103005C8F8900A424 -:1079F000240400041104005F24050005110500673C -:107A00000000182103E00008006010218F89004861 -:107A10003C0C0800258C5EE03C04080024845F6078 -:107A2000240300201060000F00005821240D0002E4 -:107A3000240E00033C0F080025EF5EE08D270000B8 -:107A400014E0000B30F9FFFF252900040124C02BAE -:107A500053000001018048212463FFFF5460FFF8B8 -:107A60008D2700000160182103E00008006010214C -:107A7000132000323C0500FF30E200FF00403021BF -:107A80001040004200005021240500010000202188 -:107A90000005C84000A6C02417000003332500FFDE -:107AA00014A0FFFB24840001012CC023001828C06F -:107AB00000AA6021008C50213144001F240C0001D9 -:107AC000008C18040003102700E23024110D00413F -:107AD000AD260000110E004C000A1840110D0036B2 -:107AE0008F87006C510E00568F8C0060240D0004AF -:107AF000110D005A8F8E0084240E0005150EFFDA3A -:107B000001601821240B14301140000600001821D8 -:107B10008F8400A024630001006A402B1500FFFD44 -:107B2000016458218F8A0080AF89008C0160182180 -:107B30002549FFFF0A000AFAAF89008000E52024EA -:107B4000000736021080FFD0240A001800075402F4 -:107B5000314600FF0A000B02240A00103C0C08000A -:107B6000258C5EA03C04080024845EE00A000AE93B -:107B7000240300103C0C0800258C5E203C04080007 -:107B800024845EA00A000AE88F89009000071A0288 -:107B9000306600FF0A000B02240A00088F89008C5F -:107BA0003C0C0800258C5F603C04080024845F7056 -:107BB0000A000AE924030004000A4080250B003073 -:107BC00024E6FFFF01601821AF8900480A000AFA85 -:107BD000AF86006C000AC982001978803C07080053 -:107BE00024E75EA001E72021000A18428C8F0000E4 -:107BF0003079001F032C38040007C02701F86024E7 -:107C00000A000B17AC8C00000003314200062880EC -:107C100000AF28213062001F8CB8000024630001EF -:107C2000004CC804000321420019382700041080CA -:107C300003073024004F20210A000B5BACA6000094 -:107C4000000A68C025AB0032258AFFFF01601821B9 -:107C5000AF8900A40A000AFAAF8A0060254B1030F1 -:107C6000AF8900900160182125C9FFFF0A000AFAB8 -:107C7000AF890084308600072CC200061040001433 -:107C800000000000000640803C030800246357D039 -:107C9000010338218CE4000000800008000000008F -:107CA0002409000310A9000E00000000240A0005AA -:107CB00010AA000B00000000240B000110AB00080C -:107CC000000000008F8C00A010AC00050000000038 -:107CD00003E00008000010210A000A8800A020210B -:107CE0000A000AD600C0202127BDFFE8308400FF2B -:107CF000240300021083000BAFBF00102406000312 -:107D00001086003A2408000410880068240E00053C -:107D1000108E007F2CAF14308FBF001003E00008DE -:107D200027BD00182CA200301440FFFC8FBF0010AC -:107D300024A5FFD0000531C2000668803C0708007A -:107D400024E75EE001A730218CC9000000052882ED -:107D500030AC001F240B0001018B50048F840048BD -:107D6000012A4025ACC800008C830000506000014F -:107D7000AF8600488F98006C30AE000124A6FFFF4C -:107D8000270F000115C00002AF8F006C24A6000170 -:107D90000006414200082080008718218C790000ED -:107DA00030C2001F240600010046F804033F3824B7 -:107DB00010E0FFDA8FBF00100005C182001870804C -:107DC0003C0F080025EF5EA001CF48218D2B00005D -:107DD0000005684231A5001F00A66004016C502513 -:107DE00027BD001803E00008AD2A00002CA70030D2 -:107DF00014E0FFCA8FBF001030B900071723FFC778 -:107E000024A8FFCE00086A02000D60803C0B080029 -:107E1000256B5EA0018B30218CC40000000828C2B5 -:107E200030AA001F24080001014848048F8200A4E2 -:107E300000891825ACC300008C5F000053E00001EE -:107E4000AF8600A400057040000E7942000F288024 -:107E50003C04080024845EE000A418218C6B000020 -:107E600025DF000131CD001F001F514201A8600431 -:107E7000016C4825000A1080AC69000000442821EC -:107E80008CA600008F98006033F9001F8FBF001090 -:107E90000328380400C77825270E000127BD0018E5 -:107EA000ACAF000003E00008AF8E006024A5EFD067 -:107EB0002CB804001300FF998FBF00100005314259 -:107EC000000658803C0A0800254A5E20016A3021DD -:107ED0008CC4000030A3001F2409000100691004B5 -:107EE0008F9900900082F825ACDF00008F270000FA -:107EF00050E00001AF8600908F8D00848FBF00108E -:107F000027BD001825AC000103E00008AF8C0084F9 -:107F100015E0FF828FBF00108F8600A00006104082 -:107F20000046F821001F210003E4C8210019384051 -:107F300024F8143000B8402B1100FF788FBF0010D8 -:107F400024A4EBD00E00020300C0282100027942D5 -:107F5000000F70803C0D080025AD5F6001CD202131 -:107F60008C8B0000304C001F240600010186180491 -:107F70008F89008C01635025AC8A00008D2500009C -:107F800050A00001AF84008C8F9800808FBF00103C -:107F900027BD00182708000103E00008AF88008013 -:107FA00030A500072403000310A3001028A200043A -:107FB00014400008240700022403000410A3001545 -:107FC0002408000510A8000F8F8500A003E000081A -:107FD0000000000014A7FFFD0080282114C3FFFB50 -:107FE000240400020A000B9A000000002409000586 -:107FF0000080282110C9FFFB2404000303E00008CF -:108000000000000014C5FFF1008028210A000B9A2F -:1080100024040005240A00010080282110CAFFF171 -:108020002404000403E000080000000027BDFFE076 -:10803000AFB00010000581C22603FFD024C5003F69 -:108040002C6223D024C6007FAFB20018AFB1001459 -:10805000AFBF001C309100FF000691C200052982CD -:1080600002002021104000082403FFFF0E000A5ADE -:108070000000000002002021022028210E000C48F0 -:1080800002403021000018218FBF001C8FB2001861 -:108090008FB100148FB000100060102103E00008C1 -:1080A00027BD002027BDFFD824A2007FAFB3001C4E -:1080B000AFB20018000299C2309200FF24A3003F23 -:1080C0000240202102602821AFB10014AFB000109F -:1080D000AFBF00200E000B7D00038982004080218D -:1080E000004020210220282114400009000018210E -:1080F0008FBF00208FB3001C8FB200188FB1001407 -:108100008FB000100060102103E0000827BD002898 -:108110000E000A0B00000000004028210200202170 -:108120001051FFF3001019C00E000A5A00000000A1 -:1081300002002021024028210E000C48026030215C -:108140008FBF00208FB3001C8FB200188FB10014B6 -:108150008FB00010000018210060102103E000081B -:1081600027BD00283084FFFF30A5FFFF10800007E7 -:10817000000018213082000110400002000420425B -:10818000006518211480FFFB0005284003E000086B -:108190000060102110C00007000000008CA2000049 -:1081A00024C6FFFF24A50004AC82000014C0FFFB1E -:1081B0002484000403E000080000000010A0000870 -:1081C00024A3FFFFAC8600000000000000000000B8 -:1081D0002402FFFF2463FFFF1462FFFA24840004DB -:1081E00003E000080000000030A5FFFF8F4201B847 -:1081F0000440FFFE3C07601500A730253C0310003B -:10820000AF440180AF400184AF46018803E000081D -:10821000AF4301B88F8500D02C8640000080182124 -:108220008CA700840087102B144000100000000071 -:108230008CA800842D06400050C0000F240340008D -:108240008CAA0084008A482B512000018CA3008452 -:1082500000035A42000B20803C05080024A558204A -:108260000085182103E000088C62000014C0FFF4B0 -:10827000000000002403400000035A42000B20804D -:108280003C05080024A558200085182103E00008BB -:108290008C6200008F8300D0906600D024C500015E -:1082A000A06500D08F8500D0906400D090A200D24D -:1082B0001044001700000000936C00788F8B00BC06 -:1082C000318A00FFA16A000C25490001938700C490 -:1082D000312200FF3048007F1107000B00026827A1 -:1082E000A36200788F4E017805C0FFFE8F9900B021 -:1082F000241800023C0F1000AF590140A35801445C -:1083000003E00008AF4F01780A000D1831A2008089 -:10831000A0A000D00A000D0E000000008F8700D042 -:1083200027BDFFC8AFBF0030AFB7002CAFB60028E5 -:10833000AFB50024AFB40020AFB3001CAFB200183B -:10834000AFB10014AFB0001094E300E094E200E29B -:10835000104300D72405FFFF3C047FFF3497FFFF45 -:108360002415FF800A000DFF3C16000E108A00D174 -:108370008FBF00308F9100B03C1808008F18005C50 -:10838000001230C0001291400311702101D57824F1 -:10839000AF4F002C94EC00E231CD007F01BA5821A0 -:1083A000318A7FFF01764821000A804002091021AE -:1083B000945300003C0808008D0800580246C02174 -:1083C00032733FFF0013198001032021022428216A -:1083D00030BF007F03FAC82100B5A024AF54002CA1 -:1083E0000336A0218E8700108E8F0030037858212D -:1083F000256D008800EF7023240C0002AE8E001063 -:10840000AF8D00ACA16C0088976A003C8E84003070 -:108410008F9100AC0E000CE53150FFFF00024B8045 -:10842000020940253C02420001022025AE2400043E -:108430008E8300048F8D00AC8E860000240E000811 -:10844000ADA3001CADA60018ADA0000CADA000109F -:10845000929F000A33F900FFA5B900149685000821 -:108460003C1F000CA5A500169298000A331100FFCE -:10847000A5B100209690000824180005A5B00022A0 -:10848000ADA00024928F000B2410C00031E700FF44 -:10849000A5A70002A1AE00018E8C00308F8B00AC2E -:1084A0008F8400B0AD6C00083C0A08008D4A00546F -:1084B0000144482101354024AF4800283C0208000F -:1084C0008C4200540044302130C3007F007AC82120 -:1084D000033F282102458821AF9100BCAF8500C031 -:1084E000A23800008F8A00BC2403FFBF2418FFDFDE -:1084F000954F000201F0382400F37025A54E0002CC -:10850000914D000231AC003F358B0040A14B000281 -:108510008F8600BC8F8900D0ACC000048D28007C01 -:108520003C098000ACC8000890C4000D3082007F78 -:10853000A0C2000D8F8500BC90BF000D03E3C824CE -:10854000A0B9000D8F9100BC9233000D02789024E9 -:10855000A232000D8E9000348F8B00BCAD700010E5 -:108560008E87002C8E8F003000EF7023AD6E0014CC -:10857000916D001831AC007FA16C00188F9F00BC7A -:108580008E8A00308FE8001801572024010930241A -:1085900000C41025AFE200189283000AA3E3001C78 -:1085A000969900088F8500BC8F9800D0A4B9001E52 -:1085B0008E9000308E8400300E0002038F05008400 -:1085C0008F8500D0000291400002990090AF00BC5E -:1085D000025388210040302131E7000210E00003FF -:1085E00002118021000290800212802190B900BC0B -:1085F0003327000410E000020006F880021F8021EB -:108600008E9800308F8B00BC24068000330F00034F -:10861000000F702331CD0003020D6021AD6C00040A -:1086200094A400E294AA00E294B000E231497FFFF2 -:108630002522000130537FFF0206182400734025D5 -:10864000A4A800E294A400E23C1408008E94006008 -:1086500030917FFF12340022000000000E000D0553 -:10866000000000008F8700D00000282194F300E074 -:1086700094F000E21213000F8FBF003090E900D099 -:1086800090E800D1313200FF310400FF0244302B6A -:1086900014C0FF36264A000190EE00D2264B00019E -:1086A00031CD00FF008D6021158BFF338F9100B01D -:1086B0008FBF00308FB7002C8FB600288FB50024F5 -:1086C0008FB400208FB3001C8FB200188FB100143C -:1086D0008FB0001000A0102103E0000827BD003873 -:1086E00094A300E200664024A4A800E290A400E263 -:1086F00090B900E2309100FF0011A1C20014F827E8 -:10870000001F39C03332007F024730250A000DF7C1 -:10871000A0A600E23084FFFF30A5FFFFAF440018A1 -:10872000AF45001C03E000088F42001427BDFFB8CE -:10873000AFB000208F9000D03084FFFFAFA40010B6 -:10874000AFBF0044AFBE0040AFB7003CAFB600388B -:10875000AFB50034AFB40030AFB3002CAFB20028D7 -:10876000AFB10024A7A00018920600D1920500D056 -:1087700030C400FF30A300FF0064102B1040012222 -:10878000AFA00014920900D08FB50010312800FF6F -:108790000088382324F4FFFF0014882B0015982B41 -:1087A00002339024524001268FB40014961E00120A -:1087B000961F00108FB7001003DFC82300171400A6 -:1087C0000019C400000224030018140302E2B02AB6 -:1087D00052C00001004020210284282B10A000027A -:1087E000008018210280182100033C0000071C03B0 -:1087F0003064FFFF2C86000914C000020060B8211D -:10880000241700088E0A0008001769808E09000CE2 -:1088100031ABFFFF3C0C0010016C402527520400D7 -:10882000AF4A0038AF9200B8AF49003CAF480030C3 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850008F4F000031EE002011C0FFFD0017982A55 -:10886000027110240A000E920000B02155E00101AF -:108870009258000131130080126001CF01202021A5 -:108880009655001232A5FFFF0E000CDAA7B50018AE -:108890008F9000D00291A02326C800018F9100B8CC -:1088A0000008B4000016B403262C004002D7782A32 -:1088B0000014882B240B00010180902101F1102469 -:1088C000AF8C00B8AFAB0014104001BC8F8900B072 -:1088D0003C0C08008D8C0054240BFF80921E00D0AD -:1088E00001895021014B2824921900D0AF4500285E -:1088F0008E4700103C0808008D0800583C180800FE -:108900008F18005430E33FFF000321800104302121 -:10891000012658212402FF800162F824920C00D025 -:10892000AF5F002C9248000033D100FF333500FFC9 -:108930000309982100117140001578C0326D007F45 -:1089400001CF382101BA2821318300FF3164007F33 -:108950003C0A000C00AA88210367F0210003314083 -:10896000009A10213108003F3C1F000E00D1C021A9 -:10897000005F982127D900882D150008AF9100C00D -:10898000AF9900ACAF9800BCAF9300B412A0018ABD -:1089900000008821240E0001010E4004310D005D0D -:1089A00011A0FFB2310F00028E4A00283C03008064 -:1089B0003C04FFEFAE6A00008E450024A260000A6E -:1089C0003488FFFFAE6500049247002C3C1FFF9FD8 -:1089D00037FEFFFFA267000C8E62000C3C180040BF -:1089E000A267000B0043302500C8C824033E88243A -:1089F0000238A825AE75000C8E490004AE60001840 -:108A00003C0F00FFAE6900148E4D002C35EEFFFFC9 -:108A10008F8B00B001AE6024AE6C00108E47000852 -:108A2000A660000896450012AE6700208E42000C3A -:108A300030B03FFF00105180AE6200248E5E001403 -:108A4000014B182130A40001AE7E00288E59001879 -:108A5000000331C200044380AE79002C8E51001C0B -:108A600000C8F821A67F001CAE71003096580002A5 -:108A70008E550020A678001EAE7500349249003352 -:108A80003130000456000005925000008F8C00D059 -:108A90008D8B007CAE6B0030925000008F8F00BC3D -:108AA000A1F00000924E003331CD000251A000072A -:108AB000925E00018F8900BC2418FF809131000074 -:108AC0000311A825A1350000925E00018F9900BC1A -:108AD0002409FFBF240BFFDFA33E00018F9500BCDC -:108AE00092B8000D3311007FA2B1000D8F8E00BC33 -:108AF00091D0000D02097824A1CF000D8F8800BC11 -:108B00008E6D0014910A000D2DAC0001000C29405F -:108B1000014B382400E51825A103000D96420012F0 -:108B20008F8800BC8F8700D0A50200028E4500040C -:108B300090FF00BC30A400030004302330DE0003AB -:108B400000BE102133F90002172000022444003433 -:108B50002444003090E200BC00A2302430DF000446 -:108B600017E0000224830004008018218F8F00ACDE -:108B700024090002AD030004A1E90000924E003F69 -:108B80008F8D00ACA1AE00018F9500AC924C003FE0 -:108B90008E440004A6AC0002976B003C0E000CE56E -:108BA0003170FFFF00025380020A38253C05420065 -:108BB00000E51825AEA300048F8600AC8E4800386F -:108BC000ACC800188E440034ACC4001CACC0000C0F -:108BD000ACC00010A4C00014A4C00016A4C00020A3 -:108BE000A4C00022ACC000248E6400145080000198 -:108BF00024040001ACC400080E000D05241100017E -:108C00000A000E858F9000D0920F00D2920E00D0F5 -:108C10008FB5001031EB00FF31CD00FF008D6023D8 -:108C2000016C50212554FFFF0014882B0015982B50 -:108C3000023390241640FEDD000000008FB40014C3 -:108C40008FBF00448FBE00403A8200018FB7003CC6 -:108C50008FB600388FB500348FB400308FB3002C3E -:108C60008FB200288FB100248FB0002003E00008ED -:108C700027BD004833110020122000EE241500010A -:108C8000921E00BC241F00010000A82133D900015E -:108C90001320000DAFBF001C8E4400148E0800840A -:108CA0000088102B14400002008030218E060084C2 -:108CB0008E03006400C3A82B16A0000200C0202170 -:108CC0008E0400640080A8218E4700148E05006485 -:108CD00000E5302B14C0000200E020218E04006467 -:108CE0000095F02313C000048FAC001C240A00027E -:108CF000AFAA001C8FAC001C028C582B156000A87A -:108D0000000018218E4F00388E6D000C3C0E008044 -:108D1000AE6F00008E4A00343C10FF9F01AE582514 -:108D2000AE6A00049246003F360CFFFF016C382407 -:108D30003C0500203C03FFEFA266000B00E5102578 -:108D40003468FFFF8F8700B80048F8243C0400080F -:108D500003E4C825AE79000C8CF80014AE6000184E -:108D600002BE7821AE7800148CF10018AE71001CA0 -:108D70008CE90008AE6900248CEE000CAE6F002C6C -:108D8000AE600028AE6E0020A6600038A660003AF3 -:108D90008CED001401B58023021E902312400011B7 -:108DA000AE72001090EA003D8E6500048E640000F3 -:108DB000000A310000A6C821000010210326402B24 -:108DC0000082F82103E8C021AE790004AE780000EB -:108DD00090F1003DA271000A8F8900B8953200061B -:108DE000A67200088F9800AC2419000202A020216E -:108DF000A31900009769003C8F9200AC0E000CE5AF -:108E00003131FFFF00027B808F8500B8022F68257B -:108E10003C0E420001AE8025AE5000048F8400ACB1 -:108E20008CAC0038AC8C00188CAB0034AC8B001CC4 -:108E3000AC80000CAC800010A4800014A48000164C -:108E4000A4800020A4800022AC80002490A7003FD2 -:108E5000A487000212A001342403000153C00002C1 -:108E600090A2003D90A2003E24480001A08800018D -:108E70008F9F00ACAFF500088F8300D0240700342B -:108E8000906600BC30C5000250A0000124070030ED -:108E90008F9200B88F8A00BC906D00BC924B00008E -:108EA0002412C00032A50003A14B00008F8600B839 -:108EB0008F8800BC2402000490C4000100451823E0 -:108EC00030790003A10400018F8A00BC8F9F00B895 -:108ED00000F538219558000297E9001200F9382171 -:108EE00003128824312F3FFF022F7025A54E000268 -:108EF0009150000231A80004320C003F358B004035 -:108F0000A14B000212A000028F8500BC00E83821AE -:108F10008F8E00D0ACA70004240BFFBF8DCD007C4A -:108F20002EA400012403FFDFACAD000890B0000DBB -:108F300000044140320C007FA0AC000D8F8600BCC5 -:108F400090CA000D014B1024A0C2000D8F8700BCF9 -:108F500090E5000D00A3F82403E8C825A0F9000D52 -:108F60008F9100B88F8D00BC8E380020ADB80010F6 -:108F70008E290024ADA900148E2F0028ADAF001853 -:108F80008E2E002C0E000D05ADAE001C8FB0001C07 -:108F9000240C0002120C00ED8F9000D08FA3001C57 -:108FA00000608821146000020060A8210000A02158 -:108FB00056A0FE390291A0230014882B8FAE00101A -:108FC000960700103C0A002001D6F02302C7C021FA -:108FD00033D2FFFFA6180010AFB20010AF4A003026 -:108FE0000000000096170010961300121277008EF2 -:108FF000001641808E16000C8E0F0008000817C363 -:1090000002C8282100A8582B01E2A82102AB182190 -:10901000AE05000CAE0300088FB300100013B82B90 -:10902000023780241200FF058F9000D00A000E4BFB -:10903000000000008E480038A6600008240F0003DE -:10904000AE6800008E4C0034A260000A8F9000B819 -:10905000AE6C00043C050080920B003FA26F000C38 -:109060008E62000C3C11FF9FA26B000B004568252F -:109070003623FFFF3C04FFEF8F8C00B801A33024A0 -:10908000349FFFFF00DFC824AE79000C8D890014E7 -:10909000959E00128F9800B0AE6900108D8E00145E -:1090A000AE600018AE600020AE6E0014AE6000240A -:1090B0008D87001833CE3FFF000E5180AE67002829 -:1090C0008D8800080158902133D00001AE6800302F -:1090D0008D91000C8F8D00AC001259C200107B8066 -:1090E000016F282124020002A665001CA66000363C -:1090F000AE71002CA1A200009763003C8F9800ACD9 -:109100003C044200307FFFFF03E43025AF0600043B -:109110008F9900B824070001240BC0008F3300385A -:1091200024060034AF1300188F290034AF09001C47 -:10913000AF00000CAF000010A7000014A70000163D -:10914000A7000020A7000022AF000024A7150002FE -:10915000A30700018F8A00AC8F9E00B88F8C00BCE3 -:10916000AD55000893C80000A18800008F9200B898 -:109170008F8F00BC92500001A1F000018F8400BCD1 -:1091800094910002022B282400AE1025A482000234 -:10919000908D000231A3003FA08300028F8300D096 -:1091A0008F8400BC907F00BC33F30002526000014A -:1091B00024060030AC8600048C65007C240DFFBFC3 -:1091C00002A08821AC8500089082000D3043007F0A -:1091D000A083000D8F8600BC90C4000D008DF82484 -:1091E000A0DF000D8F8E00BC91D9000D3729002023 -:1091F000A1C9000D8F9E00B88F9300BC8FC70020BF -:10920000AE6700108FD80024AE7800148FCA0028F3 -:10921000AE6A00188FD2002C0E000D05AE72001C35 -:109220000A00104C8F9000D0960200148E040004A7 -:109230003043FFFF000368C0008DF821AF5F003CA2 -:109240008E1900048F46003C032648231920003C59 -:10925000000000008E05000024A200013C0B00105D -:1092600035750008AF420038AF55003000000000EF -:1092700000000000000000000000000000000000EE -:109280000000000000000000000000008F4C000003 -:10929000318F002011E0FFFD000000008F5304001B -:1092A0003C080020AE1300088F570404AE17000CD2 -:1092B000AF480030000000003C0608008CC60044A7 -:1092C0002416000110D600BB000000009619001201 -:1092D0003C0508008CA5004000B94821A6090012F1 -:1092E000960E001425C70001A60700149618001456 -:1092F0003304FFFF5486FF498FB30010A60000140B -:109300000E000E2530A5FFFF3C0408008C840024CD -:10931000961F00120044682303ED3023A6060012B6 -:109320000A0010678FB30010A08300018F8200AC89 -:1093300024040001AC4400080A000FFF8F8300D012 -:109340008E0200000A0010F83C0B00108F9F00C036 -:109350008FB8001C920F00D0920B00D0920D00D05D -:1093600031F100FF316E00FF000E28C000111140E6 -:109370000045182131A600FF036350210006C940B3 -:10938000033F382125490088AF8900ACAF8700BC76 -:10939000A15800889768003C03C020218F9100AC41 -:1093A0000E000CE53110FFFF00026380020C7825EF -:1093B0003C0442008F8C00B801E45825AE2B000419 -:1093C0008D9100388F8B00AC00006821000D1100DA -:1093D000AD7100188D8E00343C087FFF3504FFFF0F -:1093E000AD6E001C9183003E8D65001C8D790018C8 -:1093F000000331000003870200A6C0210050F825B9 -:109400000306482B033F382100E95021AD78001CAA -:10941000AD6A0018AD60000CAD600010918F003E89 -:109420002405000503C45024A56F00149591000481 -:1094300003C02021A5710016918E003EA56E00206C -:10944000958D0004A56D0022AD6000249190003F31 -:10945000A57000029182003D24430001A163000138 -:109460008F8600AC8F9F00BCACDE0008A3E5000037 -:109470008F9000BC8F9900B82405FFBF96070002AB -:10948000973800120247782433093FFF01E9882505 -:10949000A6110002921200022418FFDF324E003F94 -:1094A00035CD0040A20D00028F8600BC8F8C00D00D -:1094B0002412FFFFACC000048D8B007C3C0C8000AC -:1094C000ACCB000890C2000D3043007FA0C3000D5C -:1094D0008F8700BC90FF000D03E5C824A0F9000DA4 -:1094E0008F9100BC9229000D01387824A22F000D25 -:1094F0008F9000BCAE120010AE150014920E001832 -:109500002415FF8002AE6825A20D00188F8500BCCF -:109510008F8300B88CAB0018016C1024004A3025F2 -:10952000ACA600189068003EA0A8001C8F9F00B851 -:109530008F8700BC8F9800D097F90004A4F9001E13 -:109540000E0002038F0500848F8600D00002794050 -:109550000002490090D200BC01E988210040282186 -:109560003255000212A0000303D120210002A8807E -:109570000095202190CC00BC3192000412400003E1 -:1095800033C900030005408000882021241900040D -:109590008F9E00BC0329382330F800030098502127 -:1095A000AFCA00040E000D05A66500380A0010477A -:1095B0008F9000D0960A00123C1E08008FDE002417 -:1095C00003CA9021A61200120A0010678FB3001080 -:1095D00027BDFFE03C1808008F180050AFB0001006 -:1095E000AFBF0018AFB10014AF8400B09371007426 -:1095F000030478212410FF8031EE007F3225007FA4 -:1096000001F0582401DA68213C0C000AA38500C44B -:1096100001AC2821AF4B002494A9001097680006E4 -:1096200090A6006200803821240200300109202326 -:1096300030C300F0AF8500D0106200193090FFFFFA -:1096400090AE0062240DFFF0240A005001AE6024A9 -:10965000318B00FF116A002F000000001600000788 -:10966000241F0C00AF5F00248FB100148FBF0018BF -:109670008FB0001003E0000827BD00200E000E2B65 -:1096800002002021241F0C00AF5F00248FB10014C2 -:109690008FBF00188FB0001003E0000827BD002026 -:1096A00094A200E094A400E290BF01130082182667 -:1096B0003079FFFF33E700C014E000092F310001CB -:1096C00016000038000000005620FFE6241F0C00A2 -:1096D0000E000D27000000000A0011F9241F0C00E5 -:1096E0001620FFDE000000000E000D270000000025 -:1096F0001440FFDC241F0C00160000228F8300D0D2 -:10970000906901133122003FA06201130A0011F990 -:10971000241F0C0094AF00D48F8600D400E02821D1 -:10972000240400050E000C6B31F0FFFF144000050F -:1097300024030003979100E6000018212625FFFF6F -:10974000A78500E68F5801B80700FFFE3C1960139B -:10975000AF400180241F0C00AF50018400793825F0 -:109760003C101000AF4701888FB10014AF5001B812 -:10977000AF5F00248FB000108FBF001803E0000817 -:1097800027BD00200E000E2B020020215040FFB507 -:10979000241F0C008F8300D0906901130A0012224D -:1097A0003122003F0E000E2B020020211440FFAD9D -:1097B000241F0C00122000078F8300D09068011333 -:1097C0003106003F34C20040A06201130A0011F9C3 -:1097D000241F0C000E000D27000000005040FFA1C8 -:1097E000241F0C008F8300D0906801133106003FC6 -:1097F0000A00125234C20040AF9B00C803E00008C8 -:10980000AF8000EC3089FFFF000940422D0200418B -:10981000000929801440000200095040240800403B -:10982000000879400008C0C001F85821256701A848 -:1098300000EF702125CC007F240DFF80018D1824BE -:109840000065302100CA282125640088240A008888 -:109850003C010800AC2A004C3C010800AC2400503C -:10986000AF8500D43C010800AC2900603C01080031 -:10987000AC2800643C010800AC2700543C010800FF -:10988000AC2300583C010800AC26005C03E0000853 -:1098900000000000308300FF30C6FFFF30E400FF0F -:1098A0008F4201B80440FFFE00034C00012438251C -:1098B0003C08600000E820253C031000AF45018013 -:1098C000AF460184AF44018803E00008AF4301B80C -:1098D0008F86001C3C096012352700108CCB0004D9 -:1098E0003C0C600E35850010316A00062D480001E1 -:1098F000ACE800C48CC40004ACA431808CC2000865 -:1099000094C30002ACA2318403E00008A78300E402 -:109910003C0308008C6300508F8400E88F86001C95 -:109920002402FF800064C0210302C824AF5900282C -:109930008CCD00043305007F00BA78213C0E000C6A -:1099400001EE2821ACAD00588CC80008AF8500D0CE -:109950003C076012ACA8005C8CCC001034E800100E -:10996000ACAC000C8CCB000CACAB000894AA00147F -:109970003C0208008C42004425490001A4A90014BF -:1099800094A400143083FFFF106200178F8400D06E -:109990003C0A08008D4A0040A4AA00128CCE001890 -:1099A000AC8E00248CCD0014AC8D00208CC7001828 -:1099B000AC87002C8CCC001424060001AC8C002851 -:1099C0008D0B00BC5166001A8D0200B48D0200B8E8 -:1099D000A482003A948F003AA48F003C948800D46B -:1099E00003E000083102FFFF3C0908008D29002434 -:1099F000A4A000148F8400D0A4A900128CCE00185B -:109A0000AC8E00248CCD0014AC8D00208CC70018C7 -:109A1000AC87002C8CCC001424060001AC8C0028F0 -:109A20008D0B00BC5566FFEA8D0200B88D0200B4B4 -:109A3000A482003A948F003AA48F003C948800D40A -:109A400003E000083102FFFF8F86001C3C0C080079 -:109A50008D8C0050240BFF808CCD00083C03000C43 -:109A6000000D51C0018A4021010B4824AF8A00E853 -:109A7000AF49002890C700073105007F00BA1021C8 -:109A80000043282130E400041080002FAF8500D06F -:109A900090CF000731EE000811C0003C000000002C -:109AA0008CD9000C8CC400140324C02B1300002696 -:109AB000000000008CC2000CACA200648CCD001829 -:109AC0002402FFF8ACAD00688CCC0010ACAC008078 -:109AD0008CCB000CACAB00848CCA001CACAA007C04 -:109AE00090A900BC01224024A0A800BC90C300079C -:109AF0003067000810E000048F8500D090AF00BCF4 -:109B000035EE0001A0AE00BC90D90007333800014B -:109B10001300000F8F8400D024070020908200BC27 -:109B200034490002A08900BC8F8400D09088006274 -:109B3000310300F014670006240A0034AC8A00C028 -:109B40000A001334000000000A00130E8CC2001437 -:109B500090CB00073166000210C000050000000035 -:109B6000908D00BC35AC0004A08C00BC8F8400D06C -:109B700090980113330F003FA08F01138F8E00D0F8 -:109B800095C500D403E0000830A2FFFFACA000643C -:109B90000A00130F0000000027BDFFD8AFB000106F -:109BA0008F90001CAFBF0024AFB40020AFB20018EC -:109BB000AFB10014AFB3001C9613000E3C07600A4F -:109BC0003C1460063264FFFF369300100E001261F1 -:109BD00034F404108F8400D43C11600E0E0009AAE6 -:109BE00036310010920E00153C0708008CE700602B -:109BF0003C12601231CD000FA38D00F08E0E0004D8 -:109C00008E0D000896080012961F00109619001A73 -:109C10009618001E960F001C310CFFFF33EBFFFF60 -:109C2000332AFFFF3309FFFF31E6FFFF3C01080045 -:109C3000AC2B00403C010800AC2C00243C01080087 -:109C4000AC2A0044AE293178AE26317C9202001550 -:109C50009603001636520010304400FF3065FFFFB7 -:109C60003C0608008CC60064AE243188AE4500B4C2 -:109C70009208001496190018241F0001011FC00447 -:109C8000332FFFFF3C0508008CA50058AE5800B8E4 -:109C9000AE4F00BC920C0014AF8E00D8AF8D00DC2C -:109CA000318B00FFAE4B00C0920A0015AE67004832 -:109CB000AE66004C314900FFAE4900C8AE65007C7D -:109CC0003C0308008C6300503C0408008C84004C6A -:109CD0003C0808008D0800543C0208008C42005CDF -:109CE0008FBF0024AE6300808FB00010AE8300747D -:109CF0008FB3001CAE22319CAE4200DCAE2731A0F7 -:109D0000AE2631A4AE24318CAE233190AE283194EE -:109D1000AE253198AE870050AE860054AE850070F7 -:109D20008FB10014AE4700E0AE4600E4AE4400CC74 -:109D3000AE4300D0AE4800D4AE4500D88FB400206A -:109D40008FB2001803E0000827BD002827BDFFE000 -:109D5000AFB10014AFBF0018241100010E00085469 -:109D6000AFB0001010510005978400E6978300CC37 -:109D70000083102B144000088F8500D424070002B4 -:109D80008FBF00188FB100148FB0001000E01021B9 -:109D900003E0000827BD00200E000C892404000504 -:109DA000AF8200E81040FFF6240700020E000858BA -:109DB0008F90001C979F00E68F9900E88F8D00C858 -:109DC00027EF0001240E0050AF590020A78F00E6B6 -:109DD000A1AE00003C0C08008D8C00648F8600C88A -:109DE000240A8000000C5E00ACCB0074A4C0000606 -:109DF00094C9000A241FFF803C0D000C012AC024D6 -:109E0000A4D8000A90C8000A24182000011F1825B1 -:109E1000A0C3000A8F8700C8A0E000788F8500C823 -:109E200000003821A0A000833C0208008C420050B2 -:109E30008F8400E80044782101FFC824AF5900282E -:109E4000960B000231EE007F01DA6021018D302196 -:109E5000A4CB00D4960A0002AF8600D03C0E0004CA -:109E600025492401A4C900E68E080004ACC80004FA -:109E70008E030008ACC30000A4C00010A4C00014EE -:109E8000A0C000D08F8500D02403FFBFA0A000D1C8 -:109E90003C0408008C8400648F8200D0A04400D26F -:109EA0008E1F000C8F8A00D0978F00E4AD5F001CDE -:109EB0008E19001024100030AD590018A540003054 -:109EC000A5510054A5510056A54F0016AD4E00688F -:109ED000AD580080AD580084914D006231AC000F48 -:109EE000358B0010A14B00628F8600D090C90063B3 -:109EF0003128007FA0C800638F8400D02406FFFFB4 -:109F00009085006300A31024A08200638F9100D08D -:109F100000E01021923F00BC37F90001A23900BCDB -:109F20008F8A00D0938F00F0AD580064AD5000C010 -:109F3000914E00D3000F690031CC000F018D5825E0 -:109F4000A14B00D38F8500D08F8900DCACA900E83D -:109F50008F8800D88FBF00188FB100148FB0001009 -:109F600027BD0020ACA800ECA4A600D6A4A000E069 -:109F7000A4A000E203E000080000000027BDFFE00D -:109F8000AFB000108F90001CAFB10014AFBF00182D -:109F90008E1900043C1808008F180050240FFF8011 -:109FA000001989C00238702131CD007F01CF6024B3 -:109FB00001BA50213C0B000CAF4C0028014B402152 -:109FC000950900D4950400D68E0700043131FFFFB7 -:109FD000AF8800D00E000922000721C08E060004C1 -:109FE0008F8300C8000629C0AF4500209064003E62 -:109FF00030820040144000068F8400D0341FFFFFE1 -:10A00000948300D63062FFFF145F0004000000005C -:10A01000948400D60E0008B73084FFFF8E0500043C -:10A02000022030218FBF00188FB100148FB00010B4 -:10A030002404002200003821000529C00A001285EE -:10A0400027BD002027BDFFE0AFB100143091FFFF16 -:10A05000AFB00010AFBF00181220001D000080211B -:10A060008F86001C8CC500002403000600053F02FB -:10A070000005140230E4000714830015304500FF8A -:10A080002CA800061100004D000558803C0C08006B -:10A09000258C57E8016C50218D49000001200008F3 -:10A0A000000000008F8E00EC240D000111CD00593E -:10A0B00000000000260B00013170FFFF24CA0020C1 -:10A0C0000211202B014030211480FFE6AF8A001CD2 -:10A0D000020010218FBF00188FB100148FB0001044 -:10A0E00003E0000827BD0020938700CE14E000386D -:10A0F000240400140E001346000000008F86001C8C -:10A10000240200010A00148DAF8200EC8F8900EC5C -:10A11000240800021128003B240400130000282119 -:10A1200000003021240700010E001285000000000D -:10A130000A00148D8F86001C8F8700EC2405000216 -:10A1400014E5FFF6240400120E0012F200000000D5 -:10A150008F8500E800403021240400120E00128593 -:10A16000000038210A00148D8F86001C8F8300ECBC -:10A17000241F0003147FFFD0260B00010E0012A441 -:10A18000000000008F8500E800403021240200021A -:10A190002404001000003821AF8200EC0E0012856C -:10A1A000000000000A00148D8F86001C8F8F00ECC9 -:10A1B0002406000211E6000B000000002404001039 -:10A1C00000002821000030210A0014AA2407000101 -:10A1D000000028210E001285000030210A00148D95 -:10A1E0008F86001C0E0013B3000000001440001204 -:10A1F0008F99001C8F86001C240200030A00148D16 -:10A20000AF8200EC0E00143F000000000A00148D25 -:10A210008F86001C0E001294000000002402000231 -:10A2200024040014000028210000302100003821FF -:10A230000A0014C7AF8200EC00403821240400104B -:10A2400097380002000028210E0012853306FFFF18 -:10A250000A00148D8F86001C8F8400C83C077FFF86 -:10A2600034E6FFFF8C8500742402000100A6182448 -:10A27000AC83007403E00008A082000510A0003643 -:10A280002CA20080274A04003C0B00052409008012 -:10A29000104000072408008030A6000F00C54021B0 -:10A2A0002D0300811460000200A0482124080080D2 -:10A2B000AF4B003000000000000000000000000074 -:10A2C0001100000900003821014030218C8D000070 -:10A2D00024E7000400E8602BACCD000024840004D7 -:10A2E0001580FFFA24C600040000000000000000F2 -:10A2F000000000003C0E0006010E3825AF4700307C -:10A300000000000000000000000000008F4F00006F -:10A3100031E800101100FFFD000000008F42003CFA -:10A320008F43003C0049C8210323C02B13000004C5 -:10A33000000000008F4C003825860001AF46003831 -:10A340008F47003C00A9282300E96821AF4D003C5D -:10A3500014A0FFCE2CA2008003E000080000000043 -:10A3600027BDFFD03C020002AFB100143C11000C2D -:10A37000AF450038AFB3001CAF46003C00809821C9 -:10A38000AF42003024050088AF440028035120214B -:10A39000AFBF0028AFB50024AFB40020AFB20018A3 -:10A3A0000E0014FFAFB000103C1F08008FFF004CE0 -:10A3B0003C1808008F1800642410FF8003F3A821C4 -:10A3C00032B9007F02B078240018A0C0033A70218F -:10A3D0000018914001D12021AF4F00280E0014FF3A -:10A3E000025428213C0D08008DAD005024050120A9 -:10A3F00001B35821316C007F01705024019A48212B -:10A40000013120210E0014FFAF4A00283C0808004B -:10A410008D0800543C0508008CA500640113382108 -:10A4200030E6007F00F0182400DA2021009120217E -:10A43000AF4300280E0014FF000529403C0208002D -:10A440008C4200583C1008008E1000601200001C66 -:10A45000005388212415FF800A0015823C14000C4B -:10A460003226007F0235182400DA202102402821FC -:10A47000AF430028009420210E0014FF2610FFC0D7 -:10A480001200000F023288212E05004110A0FFF4B7 -:10A49000241210003226007F00109180023518240B -:10A4A00000DA202102402821AF4300280094202117 -:10A4B0000E0014FF000080211600FFF302328821F5 -:10A4C0003C0B08008D6B005C240AFF802405000211 -:10A4D00001734021010A4824AF4900283C040800C8 -:10A4E000948400623110007F021A88213C07000C1E -:10A4F0000E000CB90227982100402821026020217B -:10A500008FBF00288FB500248FB400208FB3001CAC -:10A510008FB200188FB100148FB000100A0014FF22 -:10A5200027BD00308F83001C8C62000410400003A4 -:10A530000000000003E00008000000008C64001030 -:0CA540008C6500080A0015388C66000CC1 -:04A54C00000000000B -:10A550000000001B0000000F0000000A00000008BF -:10A5600000000006000000050000000500000004D7 -:10A5700000000004000000030000000300000003CE -:10A5800000000003000000030000000200000002C1 -:10A5900000000002000000020000000200000002B3 -:10A5A00000000002000000020000000200000002A3 -:10A5B0000000000200000002000000020000000293 -:10A5C0000000000200000001000000010000000186 -:10A5D00008000F3008000D8808000FC40800106C38 -:10A5E00008000F5808000F98080011A408000DA4D7 -:10A5F000080011C808000DF4080014980800144061 -:10A6000008000DA408000DA408000DA408001254B1 -:10A610000800125408000DA408000DA4080016E05C -:10A6200008000DA408000DA408000DA408000DA446 -:10A63000080013D408000DA408000DA408000DA400 -:10A6400008000DA408000DA408000DA408000DA426 -:10A6500008000DA408000DA408000DA408000DA416 -:10A6600008000DA408000DA408000DA408000FB8F0 -:10A6700008000DA408000DA40800169008000DA401 -:10A6800008000DA408000DA408000DA408000DA4E6 -:10A6900008000DA408000DA408000DA408000DA4D6 -:10A6A00008000DA408000DA408000DA408000DA4C6 -:10A6B00008000DA408000DA408000DA408000DA4B6 -:10A6C000080015BC08000DA408000DA408001348DC -:10A6D000080012B808002E5008002E5808002E203E -:10A6E00008002E2C08002E3808002E440800532C99 -:10A6F000080052EC080052B80800528C080052685A -:04A7000008005224D7 -:0CA704000A000C760000000000000000BD -:10A710000000000D727870342E362E3136000000A5 -:10A72000040610030000000000000001000000000B -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E00010000003000000000000000D0000000D0B -:10D8F0003C020800244271203C030800246375C8E0 -:10D90000AC4000000043202B1480FFFD24420004A3 -:10D910003C1D080037BD7FFC03A0F0213C1008002F -:10D92000261031D83C1C0800279C71200E00116481 -:10D93000000000000000000D30A5FFFF30C600FF12 -:10D94000274301808F4201B80440FFFE24020002F9 -:10D95000AC640000A4650008A066000AA062000B89 -:10D960003C021000AC67001803E00008AF4201B8A9 -:10D970003C0360008C624FF80440FFFE3C02020052 -:10D98000AC644FC0AC624FC43C02100003E000081E -:10D99000AC624FF827BDFFE8AFBF0014AFB0001076 -:10D9A0000E0011B300808021936200052403FFFE66 -:10D9B00002002021004310248FBF00148FB00010FC -:10D9C000A36200050A0011BC27BD001827BDFFE8AF -:10D9D000AFB00010AFBF00140E000EA40080802175 -:10D9E0009362000024030050304200FF14430004FF -:10D9F00024020100AF4201800A000CC10200202174 -:10DA0000AF400180020020218FBF00148FB00010B2 -:10DA10000A000F7D27BD001827BDFF98AFBE00602C -:10DA2000AFB7005CAFB20048AFBF0064AFB60058FC -:10DA3000AFB50054AFB40050AFB3004CAFB1004429 -:10DA4000AFB000408F5001289363003F9362000500 -:10DA50000000F021307200FF000210273042000168 -:10DA60000000B82114400066AFA0003893420116B0 -:10DA700093430112304200FF306300FF0342202134 -:10DA800003431021244540008F82000010400018FD -:10DA9000248840008F4201043C030001004310240D -:10DAA00010400013000000008CA3000C8F620030B7 -:10DAB000146201A2240200018CA300108F62002CCA -:10DAC0001462019E240200019762003A9483400090 -:10DAD0003042FFFF1462019924020001976200386E -:10DAE000950300023042FFFF1462019424020001FA -:10DAF00093620000304300FF240200201062000502 -:10DB00002402005010620006000000000A000D0B05 -:10DB1000000000000000000D0A000D14AFA000304E -:10DB20003C1E080027DE71880A000D14AFA00030EB -:10DB30003C0208008C4200DC244200013C01080049 -:10DB4000AC2200DC0E00127D000000000A000E8FE7 -:10DB50008FBF00648F4201043C0300209113000D2D -:10DB6000004310240002202B00042140AFA4003009 -:10DB70008F4301043C02004000621824146000023C -:10DB8000348700400080382132620020AFA7003087 -:10DB90001440000234E6008000E0302110C0000B89 -:10DBA000AFA6003093C500088F67004C020020210B -:10DBB00000052B0034A5008130A5F0810E000C8DEE -:10DBC00030C600FF0A000E8C000000009362003E89 -:10DBD000304200401040000E24020004564200066D -:10DBE00024020012020020210E0013DA010030216D -:10DBF0000A000E8F8FBF006416420005000000006F -:10DC00000E000CB2000020210A000E8F8FBF0064AE -:10DC10009742011A9504000E9363003532650004A3 -:10DC20003055FFFF00642004AFA4003C8D110004B8 -:10DC300010A000158D1400089362003E3042004091 -:10DC400010400007000000000E00133B02202021BE -:10DC50001040000D000000000A000E8C00000000C3 -:10DC60008F620044022210230440013200000000B1 -:10DC70008F620048022210230441012E2404001662 -:10DC80000A000DA28FC200048F62004802221023F6 -:10DC900004400008000000003C0208008C423100F3 -:10DCA000244200013C010800AC2231000A000E8130 -:10DCB000000000008F62004002221023184000097B -:10DCC0002402000C3C0208008C423100327300FC3C -:10DCD0000000A821244200013C010800AC223100D0 -:10DCE0002402000CAFA200308F62004000511823C4 -:10DCF0001860000D02A3102A144001030000000068 -:10DD00001475000602A310233A620001304200019C -:10DD1000144000FD0000000002A31023022388210C -:10DD20000A000D8A3055FFFF000018213262000200 -:10DD30001040001A326200109362003E30420040F0 -:10DD4000504000118FC200040E0011B302002021C8 -:10DD500024020018A362003F936200052403FFFE23 -:10DD600002002021004310240E0011BCA362000514 -:10DD700024040039000028210E0013242406001872 -:10DD80000A000E8E24020001240400170040F80946 -:10DD9000000000000A000E8E24020001104000E581 -:10DDA000000000008F64004C8F6200540282102338 -:10DDB0001C4000E002841023044200010080A021E6 -:10DDC000AFA30018AFB10010AFB50014934201200B -:10DDD0008F6600409764003C304200FF03422821D8 -:10DDE0008FA2003C00A328218FA300303084FFFFC6 -:10DDF0000044202B8FC200000064182524A5400099 -:10DE0000AFA50020AFA60028AFA30030AFA6002426 -:10DE1000AFA0002CAFB400340040F80927A40010D4 -:10DE20008FA200303042000254400001327300FEE5 -:10DE30009362003E30420040104000378FA3001430 -:10DE40008F6200541682001A32620001240200140C -:10DE5000124200102A42001510400006240200164B -:10DE60002402000C12420007326200010A000DEB8E -:10DE70000000000012420005326200010A000DEBB2 -:10DE8000000000000A000DE62417000E0A000DE64F -:10DE9000241700100A000DEA2417001293620023D1 -:10DEA0002403FFBD00431024A3620023326200015B -:10DEB000104000198FA300142402000C1242000E1F -:10DEC0002A42000D104000062402000E2402000A1F -:10DED000124200078FA200240A000E032442000110 -:10DEE000124200088FA200240A000E0324420001FF -:10DEF0000A000E01241700082402000E16E2000298 -:10DF000024170016241700108FA2002424420001B9 -:10DF1000AFA200248FA300148FA200248F760040AC -:10DF200000431021AF6200408FA2003C9364003692 -:10DF30008F630040028290213402FFFF00821004B0 -:10DF400000621821AF6300488FA6003030C200087D -:10DF50001040000E000000008F62005816420004BE -:10DF600030C600FF9742011A5040000134C600102D -:10DF700093C500088FA700340200202100052B0064 -:10DF800034A500800E000C8D30A5F0808F6200401B -:10DF900000561023184000178FA200183C020800FA -:10DFA0008C423198304200101040000924020001D8 -:10DFB000976200681440000624020001A76200680E -:10DFC0009742007A2442000A0A000E47A762001214 -:10DFD000A76200120E0011B3020020219362007D9F -:10DFE0002403000102002021344200010A000E45F2 -:10DFF000AFA300381840000A000000000E0011B363 -:10E00000020020219362007D2403000102002021F0 -:10E01000AFA30038344200040E0011BCA362007D9F -:10E020009362003E304200401440000C3262000116 -:10E030001040000A000000008F6300408FC20004FF -:10E0400024040018246300010040F809AF63004075 -:10E050008FA200300A000E8E304200048F620058FA -:10E0600010520010000000008F62001802221023DE -:10E070001C400008240200018F62001816220009CB -:10E08000000000008F62001C028210230440000583 -:10E0900024020001AF720058AFA20038AF7100181F -:10E0A000AF74001C12E0000B8FA300380E0011B3F8 -:10E0B00002002021A377003F0E0011BC02002021A6 -:10E0C00002E03021240400370E0013240000282130 -:10E0D0008FA3003810600003000000000E000C9BAE -:10E0E0000200202112A00005000018218FA200309C -:10E0F0003042000450400011006010212403000150 -:10E100000A000E8E006010210E0011B302002021C3 -:10E110009362007D02002021344200040E0011BCF5 -:10E12000A362007D0E000C9B020020210A000E8ECF -:10E1300024020001AF400044240200018FBF0064AC -:10E140008FBE00608FB7005C8FB600588FB500544B -:10E150008FB400508FB3004C8FB200488FB1004491 -:10E160008FB0004003E0000827BD00688C870004E2 -:10E170008C8600000000102100E5382100E5282BE6 -:10E1800000C2302100C53021AC87000403E0000844 -:10E19000AC8600008F4201B80440FFFE2402080054 -:10E1A000AF4201B803E00008000000003C02000894 -:10E1B0000342282194A200483084FFFF1040001B36 -:10E1C0002484001294A200483042FFFF0044102A29 -:10E1D00010400017240200032402001A9343012078 -:10E1E000A342018B8F820008306300FF3042400061 -:10E1F000104000092463FFFE94A200483042FFFF54 -:10E200000043102B144000058F820014A743019493 -:10E210000A000EC8344200018F8200142403FFFE5E -:10E220000043102403E00008AF820014240200031E -:10E2300003E00008A342018B27BDFFE0AFB2001846 -:10E24000AFB10014AFB00010AFBF001C30B1FFFF82 -:10E2500030D0FFFF30F2FFFF8F4201B80440FFFED5 -:10E2600000000000AF440180AF4400200E000EAA61 -:10E27000020020218F8300088F840014A751018C95 -:10E28000A750018EA74301908F8300043082800045 -:10E29000AF4301A8A75201881040000E8F820014DE -:10E2A00093420116304200FC24420004005A10211F -:10E2B0008C4240003042FFFF144000068F82001461 -:10E2C0003C02FFFF34427FFF00821024AF82001423 -:10E2D0008F8200142403BFFF00431024A74201A62D -:10E2E0009743010C8F42010400031C003042FFFFE2 -:10E2F00000621825AF4301AC3C021000AF4201B8E8 -:10E300008FBF001C8FB200188FB100148FB00010A7 -:10E3100003E0000827BD002027BDFFE0AFB20018D2 -:10E3200030D2FFFFAF440180AF44002002402021E3 -:10E33000AFB10014AFB0001030F1FFFFAFBF001C51 -:10E340000E000EAA30B0FFFF8F8300142402BFFF1F -:10E35000A750018C006218248F820008A752018EFA -:10E36000A7510188A74301A6A74201903C021000D3 -:10E37000AF4201B88FBF001C8FB200188FB10014DC -:10E380008FB0001003E0000827BD00202743018064 -:10E390008F4201B80440FFFE24022000A46200085E -:10E3A00024020002A062000BA46000103C021000D6 -:10E3B000AF4201B803E00008000000008F47007082 -:10E3C000934201128F83000827BDFFF0304200FF07 -:10E3D000000228823062010000003021104000431A -:10E3E00024A400033062400010400010306220007E -:10E3F00000041080005A10218C43400024A4000423 -:10E4000000041080AFA30000005A10218C4240008D -:10E41000AFA2000493420116304200FC005A1021C2 -:10E420008C4240000A000F56AFA200081040002F97 -:10E430000000302100041080005A10218C4340005D -:10E4400024A4000400041080AFA30000005A10218F -:10E450008C424000AFA00008AFA200048FA80008C3 -:10E460000000302100002021240A00083C09080097 -:10E470002529010003A41021148A000300042A00A6 -:10E480001100000A000000009042000024840001F6 -:10E490002C83000C00A210210002108000491021E2 -:10E4A0008C4200001460FFF300C230263C040800D8 -:10E4B0008C8431048F4200702C830020106000098E -:10E4C000004738233C03080024633108000410800F -:10E4D0000043102124830001AC4700003C010800E8 -:10E4E000AC233104AF8600042406000100C01021D3 -:10E4F00003E0000827BD00103C0208008C420038F1 -:10E5000027BDFFD0AFB50024AFB3001CAFBF0028BC -:10E51000AFB40020AFB20018AFB10014AFB000101C -:10E520003C15080026B50038144000022453FFFFB4 -:10E53000000098218F840008308240001040000ABB -:10E54000308280003C0200200082102450400006EF -:10E55000308280008F8200142403BFFF00831824C0 -:10E560000A000FA2344210001040000A3C020020B2 -:10E5700000821024104000078F8200143C03FFFF2C -:10E5800034637FFF0083182434428000AF8200147C -:10E59000AF8300080E000F2E00000000144000089A -:10E5A0008F8400089743011E9742011C3063FFFFD0 -:10E5B0000002140000621825AF8300048F84000855 -:10E5C0009742010C30831000106000113046FFFFAD -:10E5D000308200201440000F241200053C0210007D -:10E5E000008210241040000B241200013C030E0096 -:10E5F0003C020DFF008318243442FFFF0043102B20 -:10E6000010400004000000000A000FC4241200059E -:10E61000241200013C0508008CA5003454A0001908 -:10E620008F8400088F82001C544000168F840008DD -:10E630008F82001430424000544000128F84000842 -:10E640003C021F01008210243C0310001443000D03 -:10E650008F84000830C202001440000B3C0200010D -:10E660009746010E364700020000202124C6000410 -:10E6700030C6FFFF0E000F05240500020A00108DB2 -:10E680008FBF00283C020001008210241040000CC3 -:10E690008F8300143C0208008C4200D89746010E7C -:10E6A000240400802442000130C6FFFF240500023C -:10E6B0003C010800AC2200D80A00108A240700039D -:10E6C00030624000104000063C0210003C020F0087 -:10E6D0000082102450400001934201163C021000B9 -:10E6E0000082102410400044000000003C0208009A -:10E6F0008C4200301040000C306240001040000A94 -:10E700003C030F00008318243C0201000043102B3F -:10E7100014400005000000009746010E3647000235 -:10E720000A0010872404008010A0000D3082010030 -:10E730001040000B3C020F00008210243C0302003A -:10E74000104300078F82000400531024005510214D -:10E7500090420004244200040A00103A000221C042 -:10E76000000000008F8600083C0508008CA500D042 -:10E77000000616023050000F38A200012C420001A2 -:10E780002E03000C0043102414400018001021C078 -:10E790002602FFFC2C4200045440001400002021FB -:10E7A00038A200022C420001004310241040000354 -:10E7B000000612420A00103A000020210010182B17 -:10E7C0000043102450400009001021C09746010E5C -:10E7D000000020212405000224C6000430C6FFFFEB -:10E7E0000E000ECD3247FFFB001021C09746010EF0 -:10E7F0000A001087364700028F4240003C11080093 -:10E800008E310024304201001040004032220001CD -:10E810000220802110A00017325400043082010031 -:10E8200010400015240200013C020F000082102459 -:10E830003C0302001043000F8F8200049746010E34 -:10E840000240382100531024005510219044000448 -:10E8500024C6000430C6FFFF24840004000421C045 -:10E860000E000ECD240500022402FFFE02228024A9 -:10E870003252FFFB2402000116020007320200019F -:10E880003242000450400001365200029746010E09 -:10E890000A001086024038211040000A32020004AB -:10E8A0009746010E024038210000202124C60004B2 -:10E8B00030C6FFFF0E000ECD240500023252FFFBD2 -:10E8C000320200041040000B8F8200083042080022 -:10E8D00010400008000000009746010E0240382159 -:10E8E0002404010024C6000430C6FFFF0E000ECD34 -:10E8F00024050002568000108FBF00280E000F2252 -:10E90000000000000A00108D8FBF00281040000A90 -:10E910008FBF00289746010E3647000200002021D5 -:10E9200024C6000430C6FFFF240500020E000ECDF1 -:10E93000000000008FBF00288FB500248FB4002096 -:10E940008FB3001C8FB200188FB100148FB000106D -:10E950000000102103E0000827BD0030274301809C -:10E960008F4201B80440FFFE000000008F420148C2 -:10E9700000021402A462000824020002A062000B3C -:10E980008F420148A46200108F420144AC6200240F -:10E990003C02100003E00008AF4201B827BDFFE8C9 -:10E9A000AFB000103C04600CAFBF00148C8250006C -:10E9B0002403FF7F3C1A8000004310243442380CAB -:10E9C000AC825000240200033C106000AF420008FB -:10E9D0008E0208083C1B80083C010800AC20002087 -:10E9E0003042FFF0384200102C4200010E001B396B -:10E9F000AF8200003C04FFFF3C02040034830806A1 -:10EA00003442000CAE021948AE03194C3C056016A6 -:10EA10008E0219808CA30000344202000064182486 -:10EA2000AE0219803C0253531462000334A47C00EC -:10EA30008CA20004005020218C82007C8C83007802 -:10EA40008FBF00148FB0001027BD0018AF820018D0 -:10EA500003E00008AF83001027BDFFE8AFBF001040 -:10EA60008F4340003402FFFF3C040800248400F080 -:10EA700010620007000000008F4240003C040800C4 -:10EA8000248400E83042010010400009000000002A -:10EA90009745010E0E000E9A30A5FFFF9745010E17 -:10EAA0003C040800248431C80A0010FC8FBF001009 -:10EAB0008F4340008F8200103C040800248400E053 -:10EAC0001462000A000000008F4340048F82001887 -:10EAD00014620006000000009745010E3C04080087 -:10EAE000248431B80A0010FC8FBF00109745010E36 -:10EAF0008FBF001030A5FFFF0A000E9A27BD001837 -:10EB000027BDFFE8AFBF00108F420128AF420020B1 -:10EB10008F4201048F430100AF8200080E000EA453 -:10EB2000AF8300140E0010D5000000003C02080066 -:10EB30008C4200C0104000088F8400083C0208008E -:10EB40008C4200C4244200013C010800AC2200C4F5 -:10EB50000A001135000000003C0200100082102461 -:10EB60001440000A8F8300143C0208008C420020ED -:10EB7000244200013C010800AC2200200E000F7D61 -:10EB8000000020210A001133000000002402BFFF12 -:10EB9000006210241040000800000000240287FFDB -:10EBA00000621024144000083C020060008210241F -:10EBB00010400005000000000E000CC50000000021 -:10EBC0000A001133000000000E00119D000000003B -:10EBD000104000063C0240008F4301243C026020AC -:10EBE000AC430014000000003C024000AF4201387A -:10EBF000000000008FBF001003E0000827BD0018D0 -:10EC000027BDFFE8AFBF00108F4201403C04400029 -:10EC1000AF4200208F4301483C027000006218247C -:10EC2000106400100083102B144000063C026000AA -:10EC30003C02200010620007000000000A00115F83 -:10EC40003C0240001062000B3C0240000A00115FD1 -:10EC5000000000000E001096000000000A00115F86 -:10EC60003C0240000E0011C1000000000A00115FCC -:10EC70003C0240000E001B46000000003C02400029 -:10EC8000AF420178000000008FBF001003E00008D1 -:10EC900027BD001827BDFFE8AFBF00140E0010A667 -:10ECA000AFB000103C028000344200708C43000082 -:10ECB00000403821AF830020006030218CE8000044 -:10ECC0003C0508008CA500FC3C0408008C8400F87E -:10ECD000010630230000102100A6282100A6302BB9 -:10ECE00000822021008620213C010800AC2500FC88 -:10ECF0003C010800AC2400F88F50000032020003F1 -:10ED00001040FFEE010030218CE600003C050800B9 -:10ED10008CA500FC3C0408008C8400F800C830235B -:10ED200000A628210000102100A6302B00822021FF -:10ED300000862021320700013C010800AC2500FCC0 -:10ED4000AF8800203C010800AC2400F810E000046B -:10ED5000320200020E0010FF00000000320200022A -:10ED60005040FFD13C0280000E00113F0000000027 -:10ED70000A0011693C0280008F4201003042003ECF -:10ED80001440001124020001AF4000488F420100EE -:10ED9000304207C01040000500000000AF40004CAA -:10EDA000AF40005003E0000824020001AF400054CF -:10EDB000AF4000408F420100304238005440000113 -:10EDC000AF4000442402000103E0000800000000FE -:10EDD0003C0290003442000100822025AF44002014 -:10EDE0008F4200200440FFFE0000000003E0000806 -:10EDF000000000003C028000344200010082202517 -:10EE000003E00008AF44002027BDFFE0AFB20018C8 -:10EE1000AFBF001CAFB10014AFB000108F50014065 -:10EE20008F5101483C0280000011940202222024EC -:10EE3000324300FF2402000E1062008A2862000F95 -:10EE40001040001228620037240200061062003BC6 -:10EE50002862000710400007240200091060001A11 -:10EE60002402000110620025000000000A00127652 -:10EE7000000000001062007B2402000B1062005BA7 -:10EE80003222FFFF0A001276000000001040000846 -:10EE90002402003828620035104000802402001F40 -:10EEA0001062007E000000000A00127600000000E0 -:10EEB0001062007A2402008010620042000000000C -:10EEC0000A001276000000008F4201B80440FFFEE5 -:10EED00024020001AF500180AF400184A752018895 -:10EEE000A342018A24020002A342018BA751019090 -:10EEF0008F4201440A001271AF4201A41080000A3F -:10EF0000240200023C010800A02271783C010800A4 -:10EF1000AC3071808F4201443C010800AC22717C0E -:10EF20000A0012788FBF001C8F4201B80440FFFE18 -:10EF3000240200020A00125B000000008F4201B8A8 -:10EF40000440FFFE00000000AF5001803C020800BA -:10EF50009042717810400003000018213C03080023 -:10EF60008C637180AF430184A75201883C02080082 -:10EF7000904271780000182134420001A342018AB6 -:10EF800024020002A342018BA75101908F42014449 -:10EF9000AF4201A43C020800904271781040000387 -:10EFA0003C0210003C0308008C63717CAF4301A855 -:10EFB000AF4201B83C010800A02071780A00127825 -:10EFC0008FBF001C8F4201B80440FFFE24020002E4 -:10EFD000A342018BA7520188A75101908F4201449F -:10EFE000A74201920A0012733C0210001440001D57 -:10EFF0000000000093620005304200041440003716 -:10F00000000000000E0011B30200202193620005F1 -:10F0100002002021344200040E0011BCA36200054E -:10F02000936200053042000414400002000000001A -:10F030000000000D9362000024030020304200FF16 -:10F0400014430008000000008F4201B80440FFFE96 -:10F0500024020005AF500180A342018B3C02100046 -:10F06000AF4201B88F4201B80440FFFE2402000203 -:10F07000AF400180AF500184A7520188A342018AAA -:10F08000A342018BA7510190AF4001A48F420144DC -:10F09000AF4201A80A0012733C0210008F4201B86F -:10F0A0000440FFFE24020001AF500180AF40018404 -:10F0B000A7520188A342018A24020002A342018BC5 -:10F0C000A7510190AF4001A4AF4001A83C0210003D -:10F0D000AF4201B80A0012788FBF001C0000000D7B -:10F0E0008FBF001C8FB200188FB100148FB00010BA -:10F0F00003E0000827BD002027BDFFE8AFBF0010D8 -:10F100000E000EA400000000AF4001808FBF001071 -:10F11000000020210A000F7D27BD00183084FFFF6A -:10F1200030A5FFFF0000182110800007000000003C -:10F1300030820001104000020004204200651821C6 -:10F140000A0012890005284003E000080060102131 -:10F1500010C0000624C6FFFF8CA2000024A50004F6 -:10F16000AC8200000A0012932484000403E000082B -:10F170000000000010A0000824A3FFFFAC860000E0 -:10F1800000000000000000002402FFFF2463FFFFD6 -:10F190001462FFFA2484000403E000080000000069 -:10F1A00027BDFFE0AFB20018AFB10014AFB0001040 -:10F1B000AFBF001C9482000C00A088212490001492 -:10F1C0000002130200021080008290210000302112 -:10F1D00000A020210E00129C240500050212102B15 -:10F1E0001040005700001021920300002C6200091B -:10F1F0005040005192020001000310803C030800BF -:10F20000246370DC004310218C42000000400008A1 -:10F2100000000000920300012402000C1462004868 -:10F2200024020001025010232C42000A1440003630 -:10F23000261000028E22000034420100AE2200009F -:10F240009202000092030001920400029205000362 -:10F2500000031C00000216000043102500042200D9 -:10F26000004410250045102526100004AE2200049D -:10F270009202000092030001920400029205000332 -:10F280000002160000031C000043102500042200A9 -:10F290000044102500451025261000040A0012B66F -:10F2A000AE2200089203000124020004146200163A -:10F2B0002610000292020000920400018E2300003A -:10F2C00000021200004410253463000426100002DE -:10F2D000AE22000C0A0012B6AE2300009203000119 -:10F2E0002402000314620008261000028E2200008F -:10F2F000920300002610000134420008A2230010EF -:10F300000A0012B6AE2200000A00130F2402000108 -:10F31000920300012402000210620002260400028F -:10F32000024020210A0012B6008080210A0012B695 -:10F3300026100001920200010A0012B6020280218A -:10F340008FBF001C8FB200188FB100148FB0001057 -:10F3500003E0000827BD002027BDFFE8AFBF001471 -:10F36000AFB000100E0011B3008080219362007DC9 -:10F3700002002021344200200E0011BCA362007D57 -:10F38000020020218FBF00148FB000100A000C9BD8 -:10F3900027BD0018308300FF30A500FF30C600FFF6 -:10F3A000274701808F4201B80440FFFE00000000A3 -:10F3B0008F42012834634000ACE2000024020001C7 -:10F3C000ACE00004A4E30008A0E2000A240200026A -:10F3D000A0E2000B3C021000A4E50010ACE0002409 -:10F3E000ACE00028A4E6001203E00008AF4201B838 -:10F3F00027BDFFE8AFBF00109362003F2403001257 -:10F40000304200FF1043000D008030218F62004425 -:10F41000008210230440000A8FBF00108F62004852 -:10F42000240400390000282100C2102304410004F4 -:10F43000240600120E001324000000008FBF0010ED -:10F440002402000103E0000827BD001827BDFFC803 -:10F45000AFB1002C00A08821AFB2003027A500106A -:10F460000080902102202021AFBF00340E0012A79F -:10F47000AFB0002810400009024020218E22000871 -:10F48000AF6200840E001315AF6000402404003802 -:10F490002405008D0A0013D1240600129362003463 -:10F4A000936300378F640084304200FF306300FFB5 -:10F4B0000043282100A4202B1080000B0000000036 -:10F4C0009763003C8F6200843063FFFF0045102388 -:10F4D0000062182B14600004000000008F6200849A -:10F4E0000A00137B004580239762003C3050FFFFE9 -:10F4F0008FA3001030620004504000032E02021857 -:10F500008FA2001C0202102B1440000502002021D3 -:10F510003062000410400002240402188FA4001C72 -:10F520002C82008010400002008080212410008086 -:10F530000E0011B30240202124020001AF62000C32 -:10F540009362003E001020403042007FA362003EE4 -:10F550008E22000424420001AF620040A770003CEC -:10F560008F6200509623000E00431021AF620058B6 -:10F570008F62005000441021AF62005C8E220004B4 -:10F58000AF6200188E220008AF62001C8FA200102C -:10F59000304200085440000A93A20020A3600036C5 -:10F5A000936200362403FFDFA36200359362003EBE -:10F5B00000431024A362003E0A0013B18E2200080B -:10F5C000A36200358E220008AF62004C8F620024D7 -:10F5D0008F63004000431021AF6200489362000037 -:10F5E00024030050304200FF144300122403FF8024 -:10F5F0003C0208008C4231A002421021004310243A -:10F60000AF4200283C0208008C4231A08E24000842 -:10F610003C03000C024210213042007F03421021C3 -:10F6200000431021AC4400D88E230008AF8200288C -:10F63000AC4300DC0E0011BC024020212404003841 -:10F64000000028212406000A0E00132400000000F8 -:10F650008FBF00348FB200308FB1002C8FB00028E4 -:10F660002402000103E0000827BD003827BDFFE8A1 -:10F67000AFBF001090C7000D00C0282130E6001079 -:10F6800010C0000A30E200048CA300088F6200540E -:10F690001062000630E20004144000178FBF001013 -:10F6A000000020210A000CB227BD00181040000DF8 -:10F6B00030E3001210C000108FBF00108CA30008B0 -:10F6C0008F6200541462000D2402000124040038EB -:10F6D0002405008D0E001324240600120A0013FDD9 -:10F6E0008FBF001024020012146200038FBF0010AD -:10F6F0000A00135227BD00182402000103E000088D -:10F7000027BD001827BDFFF827420180AFA20000E7 -:10F71000308A00FF8F4201B80440FFFE0000000065 -:10F720008F4601283C0208008C4231A02403FF8050 -:10F73000AF86005000C2102100431024AF420024C5 -:10F740003C0208008C4231A08FA900008FA8000065 -:10F7500000C210213042007F034218213C02000AFF -:10F7600000621821946400D48FA700008FA50000C8 -:10F7700024020002AF830028A0A2000B8FA3000088 -:10F78000354260003084FFFFA4E200083C02100014 -:10F79000AD260000AD040004AC60002427BD0008C5 -:10F7A000AF4201B803E00008240200018C8200048B -:10F7B0008F83002800451023AC8200049062006310 -:10F7C0003042007FA06200638C820020938300306F -:10F7D0008F85002834420002AF830044A780004296 -:10F7E000AC820020A4A000E490A200632403FFBF29 -:10F7F0000043102403E00008A0A200632743018017 -:10F800008F4201B80440FFFE8F820050AC620000BE -:10F810008F420124AC62000424026083A4620008C9 -:10F8200024020002A062000B3C02100003E000086A -:10F83000AF4201B88F880044938200308F83002844 -:10F840003C07080024E7759400481023304200FF6D -:10F85000304900FC246500888F860048304A000348 -:10F860001120000900002021248200048CA3000044 -:10F87000304400FF0089102AACE3000024A50004F6 -:10F880001440FFF924E70004114000090000202182 -:10F890002482000190A30000304400FF008A102B56 -:10F8A000A0E3000024A500011440FFF924E70001B3 -:10F8B00030C20003144000048F850044310200036D -:10F8C0001040000D0000000010A0000900002021E1 -:10F8D0002482000190C30000304400FF0085102BFB -:10F8E000A0E3000024C600011440FFF924E7000152 -:10F8F00003E00008000000001100FFFD00002021CF -:10F90000248200048CC30000304400FF0088102BC8 -:10F91000ACE3000024C600041440FFF924E700040F -:10F9200003E00008000000008F8300449382003051 -:10F9300030C600FF30A500FF00431023304300FF16 -:10F940008F820028008038210043102114C000025B -:10F95000244800880083382130E200031440000569 -:10F9600030A2000314400003306200031040000D79 -:10F970000000000010A000090000202124820001E6 -:10F9800090E30000304400FF0085102BA10300002D -:10F9900024E700011440FFF92508000103E00008F6 -:10F9A0000000000010A0FFFD0000202124820004C0 -:10F9B0008CE30000304400FF0085102BAD030000F5 -:10F9C00024E700041440FFF92508000403E00008C0 -:10F9D0000000000027BDFFF82402FFFFAFA20000D7 -:10F9E000008038212405002F3C0908002529719446 -:10F9F000240800FF2406FFFF90E2000024A3FFFF7D -:10FA00000006220200C21026304200FF00021080D1 -:10FA1000004910218C420000306500FF24E70001FE -:10FA200014A8FFF50082302600061027AFA20004BC -:10FA3000AFA200000000282127A6000400C5102363 -:10FA40009044000324A2000100BD1821304500FFAE -:10FA50002CA200041440FFF9A06400008FA2000053 -:10FA600003E0000827BD00080080482130AAFFFFFE -:10FA700030C600FF30E7FFFF274801808F4201B802 -:10FA80000440FFFE8F820050AD0200008F4201242F -:10FA9000AD0200048D220020A5070008A102000A83 -:10FAA00024020016A102000B934301208D220008BE -:10FAB0008D240004306300FF00431021978300422F -:10FAC000004410218D250024004310233C0308002E -:10FAD0008C6331A08F840028A502000C246300E809 -:10FAE0002402FFFFA50A000EA5030010A5060012C0 -:10FAF000AD050018AD020024948201142403FFF721 -:10FB00003042FFFFAD0200288C820118AD02002CAC -:10FB10003C021000AD000030AF4201B88D22002041 -:10FB20000043102403E00008AD2200208F8200284B -:10FB300030E7FFFF00804821904200D330A5FFFF4F -:10FB400030C600FF0002110030420F0000E23825ED -:10FB5000274801808F4201B80440FFFE8F82005089 -:10FB6000AD0200008F420124AD0200048D2200206E -:10FB7000A5070008A102000A24020017A102000B39 -:10FB8000934301208D2200088D240004306300FF80 -:10FB90000043102197830042004410218F840028E5 -:10FBA000004310233C0308008C6331A0A502000C25 -:10FBB000A505000E246300E8A5030010A5060012A9 -:10FBC000AD0000148D220024AD0200188C82005C70 -:10FBD000AD02001C8C820058AD0200202402FFFF01 -:10FBE000AD020024948200E63042FFFFAD020028FF -:10FBF00094820060948300BE30427FFF3063FFFF39 -:10FC00000002120000431021AD02002C3C02100043 -:10FC1000AD000030AF4201B8948200BE2403FFF76C -:10FC200000A21021A48200BE8D22002000431024D7 -:10FC300003E00008AD220020274301808F4201B875 -:10FC40000440FFFE24020018AC640000A062000B18 -:10FC50008F820028944200E6A46200103C0210004B -:10FC6000AC60003003E00008AF4201B827430180D8 -:10FC70008F4201B80440FFFE8F82002C9442001C8A -:10FC80003042FFFF000211C0AC62000024020019E4 -:10FC9000A062000B3C021000AC60003003E00008E2 -:10FCA000AF4201B88F87003430C300FF8F4201B8E4 -:10FCB0000440FFFE8F82005034636000ACA200005D -:10FCC0009382004CA0A200058CE20010A4A20006C2 -:10FCD000A4A300088C8200202403FFF7A0A2000A3E -:10FCE00024020002A0A2000B8CE20000ACA20010D3 -:10FCF0008CE20004ACA200148CE2001CACA2002434 -:10FD00008CE20020ACA200288CE2002CACA2002CDB -:10FD10008C820024ACA200183C021000AF4201B853 -:10FD20008C8200200043102403E00008AC820020F5 -:10FD30009382004C2403000127BDFFE800433004F8 -:10FD40002C420020AFB00010AFBF00142410FFFE03 -:10FD500010400005274501803C0208008C4231908C -:10FD60000A00159C004610243C0208008C42319485 -:10FD70000046102414400007240600848F830028C6 -:10FD80002410FFFF906200623042000F34420040B6 -:10FD9000A06200620E001568000000000200102141 -:10FDA0008FBF00148FB0001003E0000827BD0018BB -:10FDB0008F83002C27BDFFE0AFB20018AFB1001455 -:10FDC000AFB00010AFBF001C9062000D00A09021EA -:10FDD00030D100FF3042007FA062000D8F850028E7 -:10FDE0008E430018008080218CA2007C14620005E4 -:10FDF0002402000E90A20063344200200A0015C5C0 -:10FE0000A0A200630E00158BA382004C2403FFFF09 -:10FE1000104300472404FFFF52200045000020212A -:10FE20008E4300003C020010006210245040000489 -:10FE30003C020008020020210A0015D4240200150B -:10FE400000621024504000098E450000020020216D -:10FE5000240200140E00158BA382004C2403FFFF24 -:10FE6000104300332404FFFF8E4500003C020002D3 -:10FE700000A21024104000163C0200048F86002CC3 -:10FE80008CC200148CC300108CC4001400431023D7 -:10FE90000044102B50400005020020218E43002C0E -:10FEA0008CC2001010620003020020210A00160517 -:10FEB000240200123C02000400A210245040001C46 -:10FEC00000002021020020210A0016052402001350 -:10FED00000A21024104000068F83002C8C620010BA -:10FEE00050400013000020210A0015FF02002021CD -:10FEF0008C620010504000048E42002C0200202131 -:10FF00000A001605240200115040000900002021BB -:10FF100002002021240200170E00158BA382004C42 -:10FF20002403FFFF104300022404FFFF00002021F0 -:10FF30008FBF001C8FB200188FB100148FB000105B -:10FF40000080102103E0000827BD002093830030CB -:10FF500027BDFFE024020034AFB20018AFB1001497 -:10FF6000AFBF001CAFB00010008088211462000CED -:10FF700000A090218F8400340E0014B48C900030C7 -:10FF80001202000724020005022020210E00158B1A -:10FF9000A382004C2403FFFF1043005F2404FFFFF3 -:10FFA00092420004104000098F8200280220202184 -:10FFB0002402000C0E00158BA382004C2403FFFFCB -:10FFC000104300552404FFFF8F820028A3800024E3 -:10FFD0008E4300048C4400803C0200FF3442FFFF4B -:10FFE000006218240083202B10800008AF83003C9F -:10FFF00002202021240200190E00158BA382004C40 -:020000040001F9 -:100000002403FFFF104300442404FFFF97820042B3 -:100010008F8700448F88003C00471023110000396F -:10002000A78200428F8600283045FFFF8F84005052 -:1000300090C300BC3C0208008C4231A0000318822F -:100040003070000100822021001010800102102178 -:1000500000A2282B10A00010248200888F84003476 -:100060001082000D3C033F018E420000004310242B -:100070003C0325001443000630E500FF8C8200009D -:10008000ACC200888C8200100A001665ACC20098D1 -:100090000E001489000030218F85003C93830024DA -:1000A0008F86002830A20003000210233042000394 -:1000B00000433821A387002494C400E400A228212F -:1000C0008F8300448F82004834841000A4C400E46D -:1000D00000431021AF8200481200000EAF8500449B -:1000E00024E20004A382002494C200E424A30004B8 -:1000F000AF83004434422000A4C200E40A00168505 -:10010000000020218F820048AF800044004710216A -:10011000AF820048000020218FBF001C8FB2001862 -:100120008FB100148FB000100080102103E0000890 -:1001300027BD00208F86002827BDFFE8AFBF001431 -:10014000AFB0001090C200633042002010400008A1 -:1001500030A500FF8CC2007C2403FFDF2442000195 -:10016000ACC2007C90C2006300431024A0C20063B4 -:1001700010A000238F83002827500180020028212F -:100180000E001568240600828F82002890420063CA -:100190003042004050400019A380004C8F8300344F -:1001A0008F4201B80440FFFE8F820050AE02000073 -:1001B00024026082A602000824020002A202000BB0 -:1001C0008C620008AE0200108C62000CAE020014BB -:1001D0008C620014AE0200188C620018AE0200247B -:1001E0008C620024AE0200288C620028AE02002C33 -:1001F0003C021000AF4201B8A380004C8F8300285E -:100200008FBF00148FB000109062006327BD0018EC -:100210003042007FA0620063978200428F860044D4 -:100220008F8500289383003000461023A782004268 -:10023000A4A000E490A400638F820048AF83004430 -:100240002403FFBF0046102100832024AF82004812 -:10025000A0A400638F820028A04000BD8F820028E8 -:1002600003E00008A44000BE8F8A002827BDFFE0FD -:10027000AFB10014AFB000108F880044AFBF0018BA -:1002800093890024954200E430D100FF0109182B26 -:100290000080802130AC00FF3047FFFF0000582174 -:1002A00014600003310600FF0120302101095823AA -:1002B000978300420068102B1440003200000000B9 -:1002C00014680007240200018E0200202403FFFBB3 -:1002D00034E7800000431024AE0200202402000115 -:1002E00034E70880158200053165FFFF0E0014D940 -:1002F000020020210A00171A020020210E00150A10 -:10030000020020210E00154D8F8400508F8400289C -:100310009482006024420001A48200609482006004 -:100320003C0308008C63318830427FFF5443000F48 -:1003300002002021948200602403800000431024E6 -:10034000A48200609082006090830060304200FFD1 -:10035000000211C200021027000211C03063007FAA -:1003600000621825A08300600200202102202821BD -:100370008FBF00188FB100148FB000100A00168CC8 -:1003800027BD0020914200632403FF800043102515 -:10039000A1420063978200423048FFFF1100002015 -:1003A000938300248F840028004B1023304600FFE5 -:1003B000948300E42402EFFF0168282B00621824D4 -:1003C000A48300E414A000038E0200200100582141 -:1003D000000030212403FFFB34E780000043102499 -:1003E000AE02002024020001158200053165FFFFE6 -:1003F0000E0014D9020020210A0017429783004200 -:100400000E00150A02002021978300428F820044CB -:10041000A780004200431023AF820044938300244E -:100420008F8200288FBF00188FB100148FB000108A -:1004300027BD002003E00008A04300BD8F820028F4 -:1004400090430088904500BD244900883063003FF8 -:100450002463FFE024020001006238042C630020C2 -:1004600030E80019A385002410600010AF89003423 -:100470003C028000344200022405000124060001F1 -:100480001500000800E2182400002821146000056F -:1004900030E20020104000052405000191260001F3 -:1004A00030C600010A0016D90000000003E0000871 -:1004B0000000000027BDFFD8AFB000108F900034BF -:1004C000AFB40020AFB10014AFBF0024AFB3001C25 -:1004D000AFB200188E0500103C0208008C4231B00B -:1004E0008F86003830A33FFF0062182B8CD3001496 -:1004F000008088218CD20020106000780000A021AC -:1005000090C3000D2402FF8000431024304200FFFE -:100510005040007302202021000513823042000366 -:100520005440006F0220202194C3001C8F820028B9 -:100530008E050028A44301148CC200100262182307 -:10054000146500072402001F8F82003C0062102106 -:100550000262102B104000088F83002C2402001828 -:100560000E00158BA382004C2403FFFF1043006F85 -:100570002404FFFF8F83002C8F84003C8C620010CA -:100580000244902100441023AC6200108F820028A6 -:10059000AC7200208C4200680052102B1040000901 -:1005A0008F830038022020212402001D0E00158BAD -:1005B000A382004C2403FFFF1043005C2404FFFFD0 -:1005C0008F8300388E0200248C63002410430007C0 -:1005D000022020212402001C0E00158BA382004C57 -:1005E0002403FFFF104300512404FFFF8F84002CDD -:1005F0008C82002424420001AC82002412530004A7 -:100600008F8200288C4200685642000E8E02000045 -:100610008E0200003C030080004310241440000DB3 -:100620002402001A022020210E00158BA382004C08 -:100630002403FFFF1043003D2404FFFF0A0017D6E8 -:100640008E0200143C03008000431024504000033D -:100650008E020014AC8000208E0200142412FFFFD2 -:10066000105200062402001B022020210E00158BD0 -:10067000A382004C1052002D2404FFFF8E030000C3 -:100680003C020001006210241040001F3C02008068 -:100690000062102414400008022020212402001AC5 -:1006A0000E00158BA382004C2403FFFF1043001F94 -:1006B0002404FFFF02202021020028210E0015AB98 -:1006C000240600012403FFFF2404FFFF1443000E4F -:1006D000241400010A00180B8FBF002402202021DF -:1006E0002402000D8FBF00248FB400208FB3001CA4 -:1006F0008FB200188FB100148FB0001027BD0028F2 -:100700000A00158BA382004C8F83002C022020212D -:100710000280302194620036240500012442000149 -:100720000E0016D9A4620036000020218FBF0024DD -:100730008FB400208FB3001C8FB200188FB100144B -:100740008FB000100080102103E0000827BD0028B2 -:100750008F83002827BDFFD8AFB40020AFB3001CA3 -:10076000AFB20018AFB10014AFB00010AFBF00249B -:10077000906200638F9100342412FFFF34420040E6 -:1007800092250000A06200638E2200100080982154 -:1007900030B0003F105200060360A0212402000D7B -:1007A0000E00158BA382004C105200522404FFFF50 -:1007B0008F8300288E2200188C63007C1043000772 -:1007C000026020212402000E0E00158BA382004C33 -:1007D0002403FFFF104300472404FFFF24040020EC -:1007E000120400048F8300289062006334420020CA -:1007F000A06200638F85003C10A0001E0000000076 -:10080000560400048F820028026020210A00185537 -:100810002402000A9683000A2404FFFD944200602B -:100820003042FFFF104300348FBF00243C02080019 -:100830008C42318C0045102B1440000602602021B0 -:10084000000028210E0016D9240600010A00187C99 -:10085000000020212402002D0E00158BA382004CE5 -:100860002403FFFF104300232404FFFF0A00187C29 -:1008700000002021160400058F8400288E23001418 -:100880002402FFFF50620018026020219482006061 -:1008900024420001A4820060948200603C030800AE -:1008A0008C63318830427FFF5443000F0260202167 -:1008B000948200602403800000431024A48200601E -:1008C0009082006090830060304200FF000211C2FD -:1008D00000021027000211C03063007F006218255B -:1008E000A0830060026020210E00168C2405000108 -:1008F000000020218FBF00248FB400208FB3001C84 -:100900008FB200188FB100148FB00010008010213A -:1009100003E0000827BD00288F83002827BDFFE8DB -:10092000AFB00010AFBF0014906200638F87003437 -:1009300000808021344200408CE60010A0620063F9 -:100940003C0308008C6331B030C23FFF0043102BE2 -:100950001040004E8F8500382402FF8090A3000DC8 -:1009600000431024304200FF504000490200202183 -:10097000000613823048000324020002550200449E -:100980000200202194A2001C8F850028240300234C -:10099000A4A201148CE60000000616023042003FBB -:1009A000104300103C0300838CE300188CA2007CF1 -:1009B000106200062402000E0E00158BA382004C6C -:1009C0002403FFFF104300382404FFFF8F83002817 -:1009D0009062006334420020A06200630A0018C1E4 -:1009E0008F83002C00C31024144300078F83002C36 -:1009F00090A200623042000F34420020A0A20062A8 -:100A0000A38800408F83002C9062000D3042007F4D -:100A1000A062000D8F83003C1060001802002021AE -:100A20008F8400388C8200100043102B1040000986 -:100A300024020018020020210E00158BA382004C16 -:100A40002403FFFF104300182404FFFF0A0018E9E5 -:100A5000000020218C8200102405000102002021CA -:100A6000004310238F83002C240600010E0016D9AA -:100A7000AC6200100A0018E9000020210E00168C5C -:100A8000240500010A0018E90000202102002021AD -:100A90002402000D8FBF00148FB0001027BD001876 -:100AA0000A00158BA382004C8FBF00148FB000107A -:100AB0000080102103E0000827BD001827BDFFD8E3 -:100AC000AFB000108F900034AFB3001CAFBF002058 -:100AD000AFB20018AFB100148E1200103C03080032 -:100AE0008C6331B032423FFF0043102B1040007C3A -:100AF000008098218F8500382402FF8090A3000D8C -:100B000000431024304200FF504000760260202154 -:100B10000012138230420003240300015443007189 -:100B20000260202190A2000D3042000854400003D2 -:100B30008F82003C0A00191924020024504000034F -:100B40008E03000C0A001919240200278CA2002031 -:100B500014620005240200208E0300088CA20024E9 -:100B600010620008240200200E00158BA382004CA6 -:100B70002403FFFF1043006A2404FFFF0A00194406 -:100B80008F84002C8E0200142411FFFF14510003E7 -:100B90008F8700280A00193F240200258E030018C1 -:100BA0008CE2007C146200162402000E8E030024E6 -:100BB0008CA2002814620012240200218E06002854 -:100BC0008CA2002C14C2000E2402001F8E03002CE5 -:100BD0001060000B240200238CE200680043102BFD -:100BE00014400007240200268CA20014006618217D -:100BF0000043102B504000078F84002C2402002259 -:100C00000E00158BA382004C105100452404FFFFF9 -:100C10008F84002C2403FFF79082000D00431024E2 -:100C2000A082000D8F8600283C0308008C6331AC45 -:100C30008F82005094C400E08F85002C0043102167 -:100C400030847FFF00042040004410213043007FA7 -:100C5000034320213C03000E008320212403FF8056 -:100C600000431024AF42002CA49200008CA2002864 -:100C700024420001ACA200288CA2002C8E03002C80 -:100C800000431021ACA2002C8E02002CACA200303C -:100C90008E020014ACA2003494A2003A2442000157 -:100CA000A4A2003A94C600E03C0208008C4231B095 -:100CB00024C4000130837FFF1462001300803021C0 -:100CC000240280000082302430C2FFFF000213C2E1 -:100CD000304200FF000210270A001981000233C0D1 -:100CE000026020212402000D8FBF00208FB3001C62 -:100CF0008FB200188FB100148FB0001027BD0028EC -:100D00000A00158BA382004C8F82002802602021EC -:100D1000240500010E00168CA44600E000002021EE -:100D20008FBF00208FB3001C8FB200188FB100144A -:100D30008FB000100080102103E0000827BD0028BC -:100D400027BDFFE0AFB100148F910034AFB00010A9 -:100D5000AFBF00188E2600103C0308008C6331B032 -:100D600030C23FFF0043102B1040005E0080802106 -:100D70008F8500382402FF8090A3000D00431024CB -:100D8000304200FF50400058020020218F82003C7A -:100D900010400008000613828F8200289763000A23 -:100DA0002404FFFD944200603042FFFF10430055D1 -:100DB00000061382304200031440000E00000000C1 -:100DC00092220002104000058E230024506000157E -:100DD000922300030A0019BA020020218CA20024E9 -:100DE0005062001092230003020020210A0019C261 -:100DF0002402000F90A2000D304200085440000968 -:100E00009223000302002021240200100E00158B03 -:100E1000A382004C2403FFFF1043003A2404FFFF89 -:100E200092230003240200025462000C9222000369 -:100E30008F82003C544000099222000302002021CE -:100E40002402002C0E00158BA382004C2403FFFF0C -:100E50001043002C2404FFFF9222000302202821CB -:100E600002002021384600102CC600012C4200014F -:100E70000E0015AB004630252411FFFF1051002154 -:100E80002404FFFF8F83003C106000120200202129 -:100E90003C0208008C42318C0043102B14400006A9 -:100EA00000000000000028210E0016D924060001D1 -:100EB0000A001A00000020212402002D0E00158BCC -:100EC000A382004C1051000F2404FFFF0A001A00F7 -:100ED000000020210E00168C240500010A001A00D3 -:100EE00000002021020020212402000D8FBF0018E5 -:100EF0008FB100148FB0001027BD00200A00158BA1 -:100F0000A382004C8FBF00188FB100148FB0001067 -:100F10000080102103E0000827BD002093830040DB -:100F200027BDFFE024020002AFB10014AFB00010F3 -:100F300000808821AFBF0018000080211062008C63 -:100F40002404FFFD978500428F83004430A2FFFFF9 -:100F50000043102B5440007D8F8400480E00144C39 -:100F6000000000003C020800244275940220202169 -:100F7000004028210E001612AF8200342409FFFF22 -:100F80001049007B2404FFFF3C0808008D0875A46D -:100F90003C0208008C4231B03C0308009063759419 -:100FA00031043FFF0082102B1040001B3067003FD0 -:100FB0003C0208008C4231A88F830050000421803D -:100FC00000621821006418213062007F034228214A -:100FD0003C02000C00A228213C02008034420001A7 -:100FE0003066007800C230252402FF8000621024A1 -:100FF000AF42002830640007AF4208048F82002807 -:101000000344202124840940AF460814AF85002CF6 -:10101000AF840038AC4301189383004024020003DE -:101020001462003B240200012402002610E2003D6D -:1010300028E200271040001324020032240200227C -:1010400010E2003828E200231040000824020024A7 -:101050002402002010E200242402002110E2001EDD -:10106000022020210A001A7F2402000B10E2002D2A -:101070002402002510E20010022020210A001A7F1D -:101080002402000B10E2001A28E200331040000690 -:101090002402003F2402003110E2000B0220202134 -:1010A0000A001A7F2402000B10E200110220202106 -:1010B0000A001A7F2402000B0E00176C0220202168 -:1010C0000A001A9A004080210E0018EE022020210A -:1010D0000A001A9A004080210E00198F0220202158 -:1010E0000A001A9A004080211509000E0000000035 -:1010F0000E001813022020210A001A9A00408021B5 -:101100000E00158BA382004C0A001A9A0040802121 -:1011100014620017020020212402002314E20005BB -:101120002402000B0E001885022020210A001A9AC2 -:101130000040802102202021A382004C0E00158B4C -:101140002410FFFF0A001A9B0200202130A500FF97 -:101150000E00148924060001978300428F82004408 -:10116000A780004200431023AF82004402002021E8 -:101170008FBF00188FB100148FB0001000801021B5 -:1011800003E0000827BD002027BDFFE0AFB1001439 -:10119000AFBF0018AFB000108F4601283C03080015 -:1011A0008C6331A02402FF80AF86005000C3182159 -:1011B0003065007F03452821006218243C02000AA4 -:1011C000AF43002400A2282190A200620080882161 -:1011D000AF850028304200FF00021102A3820040C8 -:1011E00090A200BC304200021440000224030034EC -:1011F000240300308F820028A383003093830040B3 -:101200008C4200C0A380004CAF8200442402000442 -:10121000106200308F8400448E2400045080002D22 -:101220008F8400448E2200103083FFFFA784004289 -:101230001060001FAF8200488F8300282405FF80C4 -:10124000022020219062006300A21024304200FF9F -:101250001440000D000000000E001A069790004296 -:1012600010400010004018212402FFFD54620011BC -:101270008E230020020028210E00142A02202021A3 -:101280000A001AEC8E2300209062006300A2102452 -:10129000304200FF10400003022020210E00174EB4 -:1012A00000000000978200421440FFE48F83002872 -:1012B0008E23002030620004104000068F8400441A -:1012C0002402FFFB006210240E00143EAE22002018 -:1012D0008F8400448F8300288FBF00188FB10014C3 -:1012E0008FB000102402000127BD002003E0000899 -:1012F000AC6400C030A500FF2403000124A9000154 -:101300000069102B1040000C00004021240A00014D -:1013100000A31023004A3804246300013082000136 -:101320000069302B104000020004204201074025D4 -:1013300054C0FFF800A3102303E0000801001021AF -:1013400027BDFFE03C021EDCAFB20018AFB10014B5 -:10135000AFBF001CAFB0001034526F4100008821B5 -:10136000240500080E001AFC0220202100118080B4 -:101370003C07080024E771940002160002071821B8 -:10138000AC6200000000282124A200013045FFFFCC -:101390008C6200002CA600080441000200022040DC -:1013A0000092202614C0FFF8AC64000002078021E0 -:1013B0008E0400000E001AFC2405002026230001E4 -:1013C0003071FFFF2E2301001460FFE5AE02000024 -:1013D0008FBF001C8FB200188FB100148FB00010A7 -:1013E00003E0000827BD00203C02080024426A8474 -:1013F0003C010800AC2271883C02080024425000E5 -:101400003C010800AC22718C240200063C0108005B -:10141000A02271900A001B0F0000000027BDFFD81A -:10142000AFB3001CAFB20018AFBF0020AFB10014C3 -:10143000AFB000108F5101408F480148000894025E -:10144000324300FF311300FF8F4201B80440FFFE1A -:1014500027500180AE1100008F420144AE0200040B -:1014600024020002A6120008A202000B24020014AB -:10147000AE130024106200252862001510400008F9 -:101480002402001524020010106200302402001211 -:10149000106200098FBF00200A001C308FB3001CAF -:1014A0001062006724020022106200378FBF002004 -:1014B0000A001C308FB3001C3C0208008C4231A093 -:1014C0002403FF800222102100431024AF42002495 -:1014D0003C0208008C4231A0022210213042007FE1 -:1014E000034218213C02000A00621821166000B372 -:1014F000AF830028906200623042000F3442003017 -:10150000A06200620A001C2F8FBF00203C04600014 -:101510008C832C083C02F0033442FFFF0062182445 -:10152000AC832C083C0208008C4231A08C832C0830 -:101530002442007400021082000214800062182508 -:10154000AC832C080A001C2F8FBF00203C0208002F -:101550008C4231A02403FF8002221021004310247A -:10156000AF4200243C0208008C4231A03C03000A38 -:10157000022210213042007F03421021004310213B -:101580000A001C2EAF8200283C0208008C4231A0C9 -:101590002404FF800222102100441024AF420024C2 -:1015A0003C0208008C4231A0022210213042007F10 -:1015B000034218213C02000A006218219062006375 -:1015C00000821024304200FF1040007CAF830028CE -:1015D00024620088944300123C0208008C4231A827 -:1015E00030633FFF000319800222102100431021C5 -:1015F0003043007F03431821004410243C04000CB6 -:1016000000641821AF4200280E00155AAF83002C49 -:101610008F4201B80440FFFE00000000AE11000040 -:101620008F420144AE02000424020002A612000808 -:10163000A202000BAE1300240A001C2F8FBF002053 -:101640002406FF8002261024AF4200203C0208003E -:101650008C4231A031043FFF00042180022210217E -:1016600000461024AF4200243C0308008C6331A8DC -:101670003C0208008C4231A03227007F022318214F -:1016800002221021006418213042007F3064007F64 -:10169000034228213C02000A0066182400A22821E7 -:1016A000034420213C02000C00822021AF4300288B -:1016B0003C0200080347182100629021AF850028F2 -:1016C000AF84002C0E00155A010080218F4201B812 -:1016D0000440FFFE8F82002C8F8400282745018064 -:1016E0009042000DACB10000A4B00006000216004C -:1016F0000002160300021027000237C214C00016B1 -:10170000248200889442001232033FFF30423FFFA0 -:101710001443001224026082908300632402FF803D -:1017200000431024304200FF5040000C240260822D -:10173000908200623042000F34420040A08200627A -:1017400024026084A4A200082402000DA0A20005C7 -:101750000A001C193C02270024026082A4A200088F -:10176000A0A000053C02270000061C00006218250E -:1017700024020002A0A2000BACA30010ACA0001435 -:10178000ACA00024ACA00028ACA0002C8E42004CE1 -:101790008F84002CACA200189083000D2402FF80DF -:1017A00000431024304200FF104000058FBF00208E -:1017B0009082000D3042007FA082000D8FBF00207C -:1017C0008FB3001C8FB200188FB100148FB00010BF -:1017D0003C02100027BD002803E00008AF4201B81A -:1017E00008004C2808004C2808004BA008004BD8E3 -:1017F00008004C0C08004C3008004C3008004C30FD -:0418000008004B1081 -:0C1804000A0001220000000000000000AB -:101810000000000D747061342E362E313600000049 -:10182000040610010000000000000000000000009D -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:1018900010000003000000000000000D0000000D1B -:1018A0003C02080024421B803C03080024632014EF -:1018B000AC4000000043202B1480FFFD24420004B4 -:1018C0003C1D080037BD2FFC03A0F0213C10080090 -:1018D000261004883C1C0800279C1B800E00015A1F -:1018E000000000000000000D3084FFFF3082000780 -:1018F0008F85001810400002248300073064FFF831 -:101900000085302130C41FFF03441821247B400090 -:10191000AF85001CAF84001803E00008AF440084CA -:101920003084FFFF308200078F8500208F860028DB -:1019300010400002248300073064FFF80085202156 -:101940000086182B14600002AF8500240086202337 -:101950000344282134068000AF840020AF44008077 -:1019600000A6202103E00008AF84003827BDFFD87F -:10197000AFB3001CAFB20018AFB00010AFBF00246F -:10198000AFB40020AFB100143C0860088D145000C3 -:101990002418FF7F3C1A8000029898243672380C75 -:1019A000AD1250008F5100083C07601C3C086000DD -:1019B00036300001AF500008AF800018AF40008003 -:1019C000AF4000848CE600088D0F08083C076016C5 -:1019D0008CEC000031EEFFF039CA00103C0DFFFF27 -:1019E000340B80003C030080034B48212D44000150 -:1019F000018D28243C0253533C010800AC230420F1 -:101A0000AF890038AF860028AF840010275B400004 -:101A100014A2000334E37C008CF90004032818218D -:101A20008C7F007C8C6500783C0280003452007012 -:101A3000AF85003CAF9F00403C13080026731BC4D9 -:101A40000240A0218E4800008F46000038C30001EC -:101A50003064000110800017AF88003402804821F4 -:101A60008D2D00003C1908008F39045C3C110800E2 -:101A70008E31045801A8F823033F7821000040214B -:101A80000228382101FF802B00F070213C01080062 -:101A9000AC2F045C3C010800AC2E04588F4C0000B5 -:101AA000398B0001316A00011540FFED01A0402192 -:101AB000AF8D00348E4E00003C0C08008D8C045C11 -:101AC0003C0A08008D4A045801C86823018D28216A -:101AD0000000582100AD302B014B20210086102141 -:101AE0003C010800AC25045C3C010800AC22045811 -:101AF0008F4501088F44010030A92000AF85000008 -:101B0000AF84000C1120000A00A030213C0708001F -:101B10008CE7042C24EF00013C010800AC2F042CBE -:101B20003C104000AF5001380A0001900000000056 -:101B300030B002001600001424110F0010910012A2 -:101B400024070D001087023330B000065200FFF565 -:101B50003C104000936D0000240C001031A600F0F2 -:101B600010CC0269240E007010CE02DD8F8B0014A1 -:101B700025670001AF8700143C104000AF500138CA -:101B80000A00019000000000974801041100FFE5E1 -:101B90003C10400030B84000170000A200000000D8 -:101BA0008F5901780720FFFE8F870038240900082D -:101BB000240508008CE30008AF450178A7490140DF -:101BC000A7400142974201048F8600003049FFFF81 -:101BD00030DF000113E002D5012040212524FFFE63 -:101BE000240A0002A74A01463088FFFFA7440148A3 -:101BF0003C0B08008D6B043C156002C48F8F000CF9 -:101C000030C30020146000022404000924040001F1 -:101C100030CD0C00240C040051AC000134840004CD -:101C2000A744014A3C0508008CA504203C0200485A -:101C30003C19000100A2F82530D8000203F928253C -:101C400013000004000018213C04010000A4282512 -:101C50002403000130CA000451400005AF8300088E -:101C60003C06001000A6282524030001AF830008CD -:101C7000AF45100000000000000000000000000060 -:101C8000000000008F8300081060002300000000A7 -:101C90008F4B10000561FFFE000000001060001E69 -:101CA000000000008F4D10003C03002001A36024C1 -:101CB000118000198F8F000031EE000211C0001654 -:101CC00000000000975010141600001300000000E0 -:101CD0009745100830BFFFFF27F800060018C8829C -:101CE0000019308000C7282133110001330300039D -:101CF000122003208CA200000000000D00C7F82174 -:101D0000AFE200003C1908008F390430272600019B -:101D10003C010800AC2604308F6A00003405FFFF48 -:101D2000AF8A00048CE200001045029A00002021D6 -:101D30008CE5000030BF010013E0027E010020218D -:101D40003C0708008CE704743C1008008E10044C1B -:101D500000E858213C1808008F1804700168882B8F -:101D60003C0808008D080448000078210204602126 -:101D7000030F18210184702B010F6821007150217D -:101D800001AE10213C010800AC2C044C3C010800C1 -:101D9000AC2204483C010800AC2B04743C01080050 -:101DA000AC2A04708F8D00180120302131290007E2 -:101DB00025AE000831C21FFF03426021AF8D001C19 -:101DC000AF820018259B4000AF4200841120000321 -:101DD0008F90002024C800073106FFF88F84002868 -:101DE00000D0282100A4782B15E00002AF90002439 -:101DF00000A4282303452021340380000083102100 -:101E00003C061000AF850020AF820038AF4500804F -:101E1000AF4601788F8B0014256700010A0001DDB1 -:101E2000AF8700148F6200088F6700002411003014 -:101E30000007C602330300F0107100A2241900400D -:101E40001479FF4B8F8B00148F4A01780540FFFEF9 -:101E500030A7020014E00003000512820000000D0C -:101E6000000512823050000300104900013070213B -:101E7000000E688001B06021000C58800173802141 -:101E80008E08000015000002000000000000000D98 -:101E90008F6F000405E202B192030006920700056D -:101EA000920F00043C0200010007288000B060216E -:101EB0008D8900182771000825EE00050122682190 -:101EC000000E3082AD8D0018022020210E0005800A -:101ED00026050014920B00068F7F00043C087FFF4C -:101EE000000B2080009130218CC30004350AFFFFD5 -:101EF00003EAC8240079C021ACD800049207000589 -:101F000092090004960D00080007288000B1F8210E -:101F10008FEF0000974201043C07FFFF01E75024C8 -:101F2000304EFFFF01C96021018D58233168FFFF4A -:101F300001482025AFE400009203000724190001A6 -:101F4000107902692406000310660279000000007F -:101F50008E190010241F000AA75F0140A7590142F3 -:101F6000920300048F86000024070001A743014468 -:101F7000A74001469758010430D100023C050041BA -:101F8000A758014800001821A747014A1220000362 -:101F900030CA00043C050141240300015140000502 -:101FA000AF8300083C08001000A828252403000186 -:101FB000AF830008AF4510000000000000000000E3 -:101FC00000000000000000008F8B0008116000047A -:101FD000000000008F4410000481FFFE000000009C -:101FE0008F6A0000920700043C0508008CA5044499 -:101FF000AF8A0004975F01043C0F08008DEF044096 -:1020000030E300FF33F9FFFF0079C02100B86821F9 -:102010000000102124E6000A30C8FFFF01B8482B59 -:1020200001E2702101C96021311000073C01080064 -:10203000AC2D04443C010800AC2C04401200000309 -:102040008F8D0018250B00073168FFF8010D7021F6 -:1020500031CC1FFFAF8D001CAF8C0018AF4C00843B -:1020600097440104034C80213084FFFF308800072F -:1020700011000003261B4000248900073124FFF8CB -:102080008F8200208F850028008220210085782BF8 -:1020900015E00002AF82002400852023034488213C -:1020A00034058000022510213C061000AF8400207A -:1020B000AF820038AF440080AF4601780A00028545 -:1020C0008F8B00148F5F017807E0FFFE30AA0200BB -:1020D00015400003000542820000000D0005428209 -:1020E000310200030002710001C26821000D60800E -:1020F000018248210009288000B380218E0B000056 -:1021000011600002000000000000000D8F6F000C45 -:1021100005E001F38F87003824190001AE19000093 -:102120008CE30008A20000078F78000400181C024E -:10213000306600FF24D10005001130832CC400411B -:1021400014800002A20300040000000D8F6B000445 -:102150003C0EFFFF00E028213164FFFF248F000BBD -:10216000000F408200081080004748218D2D00009C -:1021700026040014A60B000801AE60240E000580A2 -:10218000AD2C00008F5F01083C0A100003EA3824E0 -:1021900010E001A30000000097460104920300072D -:1021A00024D1FFEC346500023224FFFFA2050007B2 -:1021B000960600082CC7001354E0000592030007A0 -:1021C000920A0007355F0001A21F00079203000773 -:1021D000240B0001106B01BA24090003106901CD22 -:1021E0008F88003830CFFFFF25E400020004C88349 -:1021F000333F00FF001F2880A219000500A85821C6 -:102200008D780000975101043C03FFFF0303602415 -:102210003222FFFF004F702325CDFFFE018D4825A0 -:10222000AD690000920600053C02FFF6344EFFFF48 -:1022300030CA00FF000A388000F020219099001475 -:102240003C1FFF7F37E7FFFF3323000F0066782135 -:1022500031F800FF0018288000B088218E2D002062 -:1022600000A86021A20F000601AE4824AE0D000CAC -:10227000AD89000C920B00068E04000C0127F82497 -:10228000000B50800150C821972600260148C0212C -:1022900000874024AF260024AE08000CAF3F00208A -:1022A000AF0600108F860000240C001024090002E5 -:1022B000A74C0140A7400142A7400144A74901465D -:1022C000974B01042407000130C80002256AFFFE75 -:1022D000A74A01483C050009A747014A110000032D -:1022E000000018213C0501092403000130CD000441 -:1022F00051A00005AF8300083C06001000A6282569 -:1023000024030001AF830008AF4510000000000067 -:10231000000000000000000000000000921800040F -:1023200027110002322F0007000F1023304E000744 -:10233000AE0E00108F900008120000040000000094 -:102340008F4310000461FFFE000000008F78000042 -:102350008F8F00183C1008008E100444AF980004C2 -:102360009751010425E6001030CA1FFF3222FFFFFB -:10237000AF8F001CAF8A0018AF4A00842449FFFECB -:102380003C0B08008D6B0440974E0104012068212E -:10239000000967C3020D282131C9FFFF00AD402BA2 -:1023A000016C382100E82021034AF8213139000767 -:1023B0003C010800AC2504443C010800AC24044066 -:1023C0001320000327FB4000252300073069FFF896 -:1023D0008F9F00208F840028013F382100E4C82B04 -:1023E00017200002AF9F002400E438230347202178 -:1023F00034058000008510213C061000AF870020C6 -:10240000AF820038AF470080AF4601780A000285EE -:102410008F8B0014975801041300FDC23C1040003C -:102420008F4301780460FFFE30B9400013200003A1 -:102430003C0400080000000D3C040008AF440140CB -:1024400024080800AF4801788F8B0000974A0104E8 -:10245000317F000113E000E93146FFFF24D0FFFE89 -:10246000240C0002A74C0146A75001488F8F00188A -:102470002405000DA745014A8F71000025E20008E0 -:1024800030491FFF0349702130CD0007AF91000490 -:10249000AF8F001CAF89001800C03821AF490084FD -:1024A00011A0000325DB400024C6000730C7FFF859 -:1024B0008F9800208F84002800F8302100C4382B2A -:1024C00014E00002AF98002400C430238F8A001467 -:1024D00003465821340880000168F821255900017D -:1024E0003C0310003C104000AF860020AF9F003836 -:1024F000AF460080AF430178AF990014AF50013868 -:102500000A000190000000008F6900009744010458 -:102510003127FFFF3088FFFF8F4F017805E0FFFE76 -:1025200030FF0007001F18233078000724E6FFFE65 -:102530002419000AA7590140A7580142A74601449F -:10254000A7400146A74801488F42010830510020AA -:1025500016200002240300092403000130AA00020F -:10256000A743014A3C040041114000030000182128 -:102570003C0401412403000130AB0004516000051C -:10258000AF8300083C0500100085202524030001CE -:10259000AF830008AF4410000000000000000000FE -:1025A00000000000000000008F90000812000004EE -:1025B000000000008F4C10000581FFFE00000000AD -:1025C0008F780000276200088F8D003CAF980004D0 -:1025D000944600089451000A944F000C30CEFFFF3F -:1025E0000011240031E9FFFF11CD00A20089202550 -:1025F0003C0308008C6304443C1808008F18044016 -:1026000000E85021255FFFFE007F782100001021A7 -:1026100001FF302B03028821022648213C010800DB -:10262000AC2F04443C010800AC29044024EB000812 -:102630003162FFFF3047000710E000038F8500186C -:10264000245000073202FFF83106FFFF30C80007B0 -:102650000045702131CD1FFF034D6021AF85001C67 -:10266000AF8D0018259B4000AF4D00841100000382 -:102670008F8F002024C400073086FFF88F84002845 -:1026800000CF282100A4482B15200002AF8F002482 -:1026900000A42823AF850020AF4500803C1108002E -:1026A0008E3104340345C0213402800003023021FE -:1026B00012200005AF860038938300172419000EFE -:1026C0001079000D241F043F3C0A1000AF4A017826 -:1026D0008F8B0014256700010A0001DDAF8700140D -:1026E0000E0005A63C1040008F8B001425670001EA -:1026F0000A0001DEAF8700143C0A1000A75F014802 -:10270000AF4A01780A0004B48F8B0014240E0F0026 -:1027100011EE003D30D100201620000224030009F4 -:10272000240300010A000208A743014A0A0001FB32 -:10273000A740014694E5000894E2000A94EB000CDF -:102740008F86003C0002FC00316AFFFF30B9FFFFBA -:102750001326003703EA20253C0508008CA5044415 -:102760003C1F08008FFF04400000502100A83821C2 -:1027700000E8302B03EAC8210326C0213C010800F1 -:10278000AC2704443C010800AC3804400A0002694C -:102790008F8D00183C1908008F39047C3C03080019 -:1027A0008C6304543C0608008CC604783C0F080077 -:1027B0008DEF0450032838210068682100E8C02B01 -:1027C00000C4882101A8402B01E47021023858215F -:1027D00001C860213C010800AC2D04543C010800F4 -:1027E000AC2C04503C010800AC27047C3C010800E0 -:1027F000AC2B04780A0002698F8D0018A7400146AF -:102800000A00041B8F8F001830D000201600FFC56F -:102810002403000D240300050A000208A743014A0F -:10282000975901042738FFF00A00036B3304FFFFB8 -:102830008F8C0040148CFFC8000080213C110800E0 -:102840008E31046C3C0408008C84046802287021DA -:1028500001C8782B00904021010F68213C0108003D -:10286000AC2E046C3C010800AC2D04680A0002691F -:102870008F8D00188F9900401499FF5D0000602132 -:102880003C0508008CA5046C3C1008008E10046800 -:1028900000E82021248EFFFE00AEF82103EE582B25 -:1028A000020C5021014B18213C010800AC3F046C84 -:1028B0003C010800AC2304680A00048B24EB0008E8 -:1028C0008F8800383C02FFFF8D0E000C01C2682487 -:1028D00001A46025AD0C000C0A00037930CFFFFF86 -:1028E0000A0003A9AE000000974B01049204000403 -:1028F0008E2A000C01644021251FFFF20147182495 -:1029000033F9FFFF0079C025AE38000C0A0002D46D -:102910008E1900103C03FFFF8D11001002232824A4 -:1029200000A47825AD0F00100A00037930CFFFFF17 -:1029300097450104920600048E2F001000A6102176 -:102940002449FFEE01E76824312EFFFF01AE602528 -:10295000AE2C00100A0002D48E1900108E06000C56 -:10296000AE0000000003C080031088210A0002A608 -:10297000AE2600201460000D3050FFFF3C04FFFF26 -:102980000044602401846826000D582B000C502B55 -:10299000014B102410400002000000000000000D58 -:1029A0008CA300000A00023E006410253A11FFFFCC -:1029B0000011782B0010702B01CF20241080000212 -:1029C000000000000000000D8CB800000A00023E6C -:1029D0003702FFFF3084FFFF30A5FFFF10800007A4 -:1029E0000000182130820001104000020004204243 -:1029F000006518211480FFFB0005284003E0000853 -:102A00000060102110C00007000000008CA2000030 -:102A100024C6FFFF24A50004AC82000014C0FFFB05 -:102A20002484000403E000080000000010A0000857 -:102A300024A3FFFFAC86000000000000000000009F -:102A40002402FFFF2463FFFF1462FFFA24840004C2 -:102A500003E0000800000000308EFFFF30D8FFFFC9 -:102A600000057C0001F8602539CDFFFF01AC502145 -:102A7000014C582B014B4821000944023127FFFF2C -:102A800000E830210006240230C5FFFF00A4182111 -:102A90003862FFFF03E000083042FFFF3C0C0800F3 -:102AA0008D8C0484240BFF8027BDFFD0018450212E -:102AB000014B4824AF4900203C0808008D080484DD -:102AC000AFB20020AFB00018AFBF0028AFB30024F2 -:102AD000AFB1001C936600040104382130E4007F8C -:102AE000009A10213C0300080043902130C50020CB -:102AF000036080213C080111277B000814A000021C -:102B0000264600702646006C92130004975101047B -:102B1000920F00043267000F322EFFFF31ED0040AC -:102B200001C7282311A0000500004821925900BCCC -:102B3000333800041700009000000000924300BCEE -:102B4000307F000413E0000F0000000010A0000D13 -:102B500000000000960E0002240AFF8000A76021FA -:102B600025CDFFFEA74D1016920B0004014B20242B -:102B7000308200FF10400085010C40253C0F04000E -:102B8000010F40258F5301780660FFFE2404000AE0 -:102B9000A7440140960D00022404000931AC00074F -:102BA000000C5823316A0007A74A0142960200022E -:102BB0002443FFFEA7430144A7400146975F010459 -:102BC000A75F01488F5901083338002053000001E6 -:102BD00024040001920F000431EE001015C0000221 -:102BE0003483001000801821A743014A0000000030 -:102BF000000000000000000000000000AF481000CE -:102C000000000000000000000000000000000000C4 -:102C10008F5110000621FFFE3113FFFF12600003E9 -:102C2000000000008F481018ACC800009603000692 -:102C3000307FFFFF27F90002001998820013888077 -:102C4000023B30218CD800001520005700183402B8 -:102C5000920300042405FF8000A3F82433F100FF51 -:102C60001220002C00000000924700BC30F200024D -:102C70001240002800000000974B100C2562FFFE58 -:102C8000A7421016000000003C0A0400354900303D -:102C9000AF4910000000000000000000000000002C -:102CA000000000008F4C10000581FFFE00000000B6 -:102CB0009749100C8F51101C00C020213127FFFFB5 -:102CC00024F20030001218820003288000BBF82193 -:102CD0003226FFFFAFF100000E00059500112C0217 -:102CE0000013C880033B98218E7800000002740016 -:102CF000AFB800108FA80010310FFFFFAFAF00106A -:102D00008FA4001001C46825AFAD00108FA600107D -:102D1000AE66000097730008976D000A9766000C76 -:102D20008F8A003C000D5C0030CCFFFF3262FFFF59 -:102D3000104A0036016C2025960600023C10100057 -:102D400024D300080E0001393264FFFF974C0104C0 -:102D50000E0001473184FFFFAF5001788FBF00287C -:102D60008FB300248FB200208FB1001C8FB00018E9 -:102D700003E0000827BD003010A0FF700000000035 -:102D800024A5FFFC0A0005CE240900048CD1000014 -:102D9000AF5110188F5301780660FF7A2404000A9F -:102DA0000A0005E30000000000A7C8218F88003852 -:102DB0008F4E101C0019C0820018788001E8202175 -:102DC000AC8E0000000E2C0200C020210E000595E4 -:102DD00031C6FFFF023B28218CAD000000025400E9 -:102DE00000403021AFAD00108FAC0010318BFFFFE1 -:102DF000AFAB00108FA2001001424825AFA9001010 -:102E00008FA700100A000613ACA700008F8F0040A8 -:102E1000148FFFC90000000097420104960B0002C6 -:102E20003C0508008CA5046C3049FFFF316AFFFFA8 -:102E30003C1108008E310468012A382124F2FFFE7B -:102E400000B240210012FFC30112C82B023FC02173 -:102E5000031920213C010800AC28046C3C01080047 -:102E6000AC2404680A00064D0000000000A4102BEA -:102E700010400009240300010005284000A4102B85 -:102E800004A00003000318405440FFFC0005284044 -:102E900010600007000000000085302B14C0000205 -:102EA00000031842008520231460FFFB0005284220 -:102EB00003E00008008010218F85002C27BDFFE86B -:102EC000000530272CC300012CA40002008310252C -:102ED00010400003AFBF00102405007FAF85002C19 -:102EE0000005282730A5FFFF0E000574240426F5F1 -:102EF0008F830030240402BD004030210083382B32 -:102F000010E0000924050001000420400083102B7C -:102F100004800003000528405440FFFC00042040CA -:102F200010A0000800C350210064402B15000002CF -:102F3000000528420064182314A0FFFB000420426F -:102F400000C350218FBF0010000A4C02312200FF45 -:102F500027BD0018AF8A002C03E00008AF890030BD -:102F60000A00002600000000000000000000000D24 -:102F7000747870342E362E313600000004061000AE -:102F80000000000A000001360000EA6000000000B6 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000001D000000000000000000000000E4 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000010000003BE -:10300000000000000000000D0000000D3C02080060 -:1030100024423AA03C03080024633C54AC40000026 -:103020000043202B1480FFFD244200043C1D0800B7 -:1030300037BD7FFC03A0F0213C100800261000984B -:103040003C1C0800279C3AA00E000305000000006D -:103050000000000D8F8300383C08800035070070A9 -:103060008CE50000008330253C02900000C2202542 -:10307000AF850030AF4400208F4900200520FFFEBF -:103080003C038000346200708C4500008F86003065 -:103090003C1908008F39007C3C0E08008DCE00786A -:1030A00000A6202303245821000078210164682B06 -:1030B00001CF6021018D50213C010800AC2B007C28 -:1030C0003C010800AC2A007803E000080000000082 -:1030D0000A00003D240400018F8400383C05800074 -:1030E00034A200010082182503E00008AF4300204D -:1030F00003E00008000010213084FFFF30A5FFFF2F -:1031000010800007000018213082000110400002EA -:1031100000042042006518211480FFFB00052840B0 -:1031200003E000080060102110C00007000000004C -:103130008CA2000024C6FFFF24A50004AC8200007E -:1031400014C0FFFB2484000403E00008000000001A -:1031500010A0000824A3FFFFAC86000000000000C0 -:10316000000000002402FFFF2463FFFF1462FFFA47 -:103170002484000403E0000800000000308AFFFF00 -:1031800093A80013A74A014497490E1630C600FFC2 -:103190003C021000A7490146AF450148A346015231 -:1031A000A748015AAF4701608FA400188FA30014ED -:1031B000A7440158AF43015403E00008AF4201782F -:1031C00003E00008000000003C038000346200704F -:1031D0008C4900008F88003C2484000727BDFFF83D -:1031E0003084FFF8AF890030974D008A31ACFFFF83 -:1031F000AFAC00008FAB0000016850232547FFFFF4 -:1032000030E61FFF00C4282B14A0FFF73C0C800001 -:10321000358B00708D6A00003C0708008CE7008445 -:103220003C0608008CC60080000810820149182363 -:103230000002788000E370210000202101C3C82B28 -:1032400000C4C02101FA4021031948212502400091 -:1032500027BD00083C010800AC2E00843C0108009A -:10326000AC29008003E00008000000008F82003CD1 -:103270002486000730C5FFF800A2182130641FFF24 -:1032800003E00008AF84003C3C0E20FF27BDFFE0B8 -:103290003C1A80003C0F800835CDFFFDAFBF001801 -:1032A000AFB10014AFB00010AF8F0044AF4D0E00AF -:1032B000000000000000000000000000000000000E -:1032C000000000003C0C00FF358BFFFDAF4B0E00F3 -:1032D0003C0660048CC95000240AFF7F3C1160004A -:1032E000012A40243507380CACC750008E2404381E -:1032F00024050009AF4500083083FFFF38622F71B5 -:103300002450C0B3AF80004C0E000064AF80003C7E -:1033100052000001AE20442C0E00046000000000AA -:103320008FBF00188FB100148FB000100A000E7705 -:1033300027BD002027BDFFD0AFB20028AFB10024C9 -:10334000AFBF002CAFB00020936200080080902136 -:1033500000A088211440002D240400100E00009AC3 -:10336000000000008F8E004C3C10320031C600FF80 -:1033700000067C0001F0602525CD0001AF8D004CDA -:10338000AC4C0000936B00099369000A316A00FF9E -:10339000000A3C00312800FF00E82025AC4400046E -:1033A0008F83004C06400043AC430008AC40000C47 -:1033B000979800403305000814A000022628000654 -:1033C0002628000297420E148F450E1C8F670004BA -:1033D000937F00023044FFFF33F900FFAFB90010C4 -:1033E0008F710014AFA800180E000087AFB1001451 -:1033F0008FBF002C8FB200288FB100248FB0002027 -:10340000240400100A0000C327BD0030936900099E -:103410009368000B312300FF310200FF006280211E -:10342000261F000A33F0FFFF0E00009A0200202141 -:103430008F86004C3C0D410024D90001AF99004C0F -:103440009378000930C600FF00067400330500FFC2 -:1034500024AF000201CF6025018D5825AC4B000040 -:103460008F6A000C97440E1401523825AC470004B3 -:103470008F450E1C8F670004936900023084FFFFA4 -:10348000312800FFAFA800108F630014AFB10018FF -:103490000E000087AFA30014020020218FBF002C74 -:1034A0008FB200288FB100248FB000200A0000C323 -:1034B00027BD00303C1280000A000114AC52000C01 -:1034C00027BDFFD8AFB3001CAFBF0020AFB20018BC -:1034D000AFB10014AFB00010936200081440008137 -:1034E00000809821AF60000C9785004030A4400018 -:1034F0001080008B2403001624104007A363000AE9 -:10350000AF700014938F00428F6C001431EE0007EF -:10351000000E6A40018D5825AF6B0014978A004059 -:103520008F6800143149001001093825AF67001475 -:103530009786004030C300085060008D00002821AD -:103540008F6600143C0310003C02810000C3282554 -:10355000AF65001497440E0A2418000E3405FFFCD2 -:10356000309FFFFF03E2C825AF790004A378000273 -:103570009372000A26510004A371000A9783004049 -:103580009364000A30661F00000611830044F8218E -:1035900027F90028A379000997580E0CA778001086 -:1035A0009372000926510002323000070010782380 -:1035B00031EE0007A36E000B936D0009976C0010AD -:1035C0008F9000349789004031AB00FF016C50218F -:1035D000014540213127004010E000053105FFFF83 -:1035E00000B0382B3C06800010E000140000882159 -:1035F0000205402B15000033000020218F4A0E14D5 -:10360000AF4A0E108F490E1CAF490E18AF450E0081 -:103610008F4C0000318B00081160FFFD000000009E -:10362000974D0E0800A0802100003021A78D00409A -:103630008F450E0424110001AF850034976E0010F1 -:1036400031D2FFFF8E640000009010231440000967 -:10365000AE6200008F6A00148F8700483549004031 -:10366000AF6900148F480E10ACE800208F430E188D -:10367000ACE3002400C020210E0000F50200282148 -:103680008E66000014C00005000000008F6B00145F -:10369000240CFFBF016C9824AF7300148F6D000CD5 -:1036A00001B22821AF65000C937200081640000398 -:1036B000000000001620003100000000A371000887 -:1036C000020020218FBF00208FB3001C8FB2001892 -:1036D0008FB100148FB000100080102103E00008AB -:1036E00027BD00288F900034979100403C06800051 -:1036F00002009021322F004015E0FFD20000882107 -:10370000977F00108F98003433F9FFFF1738FFEDD3 -:1037100000002021000030210A0001B9241100011D -:103720002403000E24104007A363000AAF700014A6 -:10373000938F00428F6C001431EE0007000E6A4038 -:10374000018D5825AF6B0014978A00408F680014D4 -:103750003149001001093825AF67001497860040F1 -:1037600030C300081460FF7600000000000028212C -:10377000AF6000040A000187A36000028F6F00148D -:103780003C19EFFF3738FFFE01F870240A0001D71B -:10379000AF6E00148F8700388F8A004427BDFFE08A -:1037A0008F860048AFB00018AFBF001C8F450104E2 -:1037B0008D4900ACAF4700808CC8002000A9382399 -:1037C00000008021AF480E108F440E1000004821E9 -:1037D000AF440E148CC20024AF420E188F430E1853 -:1037E000AF430E1C10E000362D390001936B00082A -:1037F0001160004F00000000976E001031CDFFFFF8 -:1038000000ED602B1580004A000000009778001042 -:10381000330FFFFFAF4F0E008F5F000033F900083A -:103820001320FFFD0000000097420E088F460E0493 -:103830003045FFFF30A300011060008A0000000047 -:103840000000000D30A8A040240400401104003BFB -:1038500030A9A0001120008500000000936C000832 -:103860005180000927A40010976F001031EEFFFF70 -:1038700000CE682B11A0000427A4001030B800402F -:103880001300007A00000000AFA70010A7850040D9 -:10389000AF8600340E0001580000000000404821AF -:1038A0001440FFD08FA700108F420E148F84004861 -:1038B000AC8200208F470E1CAC8700242D390001FC -:1038C0000330302510C000178FBF001C8F840038D4 -:1038D00024100F0010900085000000008F4F017829 -:1038E00005E0FFFE24180F001098006F0000000094 -:1038F0008F470E14240202403C101000AF470144D1 -:103900008F490E1CAF490148A3400152A740015AFC -:10391000AF400160A7400158AF420154AF50017859 -:103920008FBF001C8FB0001803E0000827BD0020E7 -:10393000AF470E000A00022E000000008F490178F8 -:103940000520FFFE240A08008F84003CAF4A01785E -:103950009758008A330FFFFF01E4702325CDFFFF46 -:1039600031AC1FFF2D8B00081560FFF9000000002F -:103970008F83004C8F9F003800C0482103442021D2 -:103980002466000124190F00AF86004C306A00FF46 -:1039900000E938232486400013F9000524080001BB -:1039A000938B004231680007000812403448000140 -:1039B000000A7C003C18010001F87025AC8E400024 -:1039C0008F8D004C30AC003630A40008ACCD000424 -:1039D0001080002E010C3025974D0E0A8F8C003C74 -:1039E0003C02810031A4FFFF258B000800824025A6 -:1039F0003C03100031651FFF25390006241F000E0F -:103A0000AF48016000C33025A75F015AAF85003C75 -:103A1000A759015814E0000A8F9F003824050F00B1 -:103A200053E500022410000134C600408F430E10FD -:103A30008F880048AD0300208F4B0E18AD0B00247B -:103A40008F420E14AF4201448F440E1CAF44014814 -:103A5000A34A01523C0A1000AF4601540A00022159 -:103A6000AF4A017814C0FF7830A8A0408F420E14EE -:103A70008F84004800004821AC8200208F470E1C34 -:103A8000AC8700240A0002582D3900018F98003CB1 -:103A900025390002A7590158270F000831EE1FFFF2 -:103AA0000A0002ADAF8E003CAF40014C1120002C4B -:103AB000000000008F460E10AF4601448F430E18E1 -:103AC000240200403C101000AF430148A3400152C3 -:103AD000A740015AAF400160A7400158AF420154CE -:103AE000AF5001780A0002718FBF001C1120000640 -:103AF00000000000975F0E0833E5004014A00002AC -:103B0000000000000000000D8F4801780500FFFE56 -:103B100000000000974E0E103C0D0500240320000D -:103B200031CCFFFF018D1025AF42014C8F440E14A4 -:103B30003C0B1000AF4401448F4A0E1CAF4A0148B1 -:103B4000A34001528F840038A740015AAF40016062 -:103B5000A7400158AF4301540A00025FAF4B017800 -:103B60008F590E14AF5901448F430E1C0A0002D91D -:103B70002402004027BDFFE0AFB20018AFB100142F -:103B8000AFB00010AFBF001C0E0000CA0000000064 -:103B90003C0280008F8A0044345000703C120800C0 -:103BA00026523B70020088218E0800008F450000DD -:103BB00038A400013083000110600017AF88003086 -:103BC000022048218D2C00003C0208008C42006C31 -:103BD0003C1808008F1800680188182300436821EA -:103BE0000000C82101A3782B0319702101CF4021C7 -:103BF0003C010800AC2D006C3C010800AC280068BA -:103C00008F4B00003967000130E6000114C0FFED62 -:103C100001804021AF8C00308E1800003C0E08005F -:103C20008DCE006C3C0C08008D8C00680308782356 -:103C300001CF28210000402100AF302B01885821FE -:103C4000016620213C010800AC25006C3C01080005 -:103C5000AC2400688F49010025470088AF870048E1 -:103C6000AF890038AF4900208E070000AF870030D1 -:103C70008F5901780720FFFE000000008E0F000022 -:103C80003C0D08008DAD00743C0C08008D8C00705C -:103C900001E7702301AE28210000302100AE582B2F -:103CA00001862021008B3821240908003C010800EE -:103CB000AC2500743C010800AC270070AF490178C6 -:103CC00093430108A383004293820042305F0001C6 -:103CD00017E000158F830038241F0D00107F001996 -:103CE00024020F001062001D000000009147000038 -:103CF0002403005030E900FF112300043C0540007C -:103D0000AF4501380A000312000000000E0008DA77 -:103D1000000000008F8A00443C054000AF45013898 -:103D20000A00031200000000939900423338000695 -:103D3000001851000E00020D0152D8210A00036E36 -:103D40008F8A00443C1B0800277B3BF00E00020DCD -:103D5000000000000A00036E8F8A00443C1B08002C -:103D6000277B3C100E00020D000000000A00036ECD -:103D70008F8A004490AA00018FAB00108CAC001019 -:103D80003C0300FF8D680004AD6C00208CAD001476 -:103D900000E060213462FFFFAD6D00248CA70018A5 -:103DA0003C09FF000109C024AD6700288CAE001C4F -:103DB0000182C82403197825AD6F0004AD6E002C74 -:103DC0008CAD0008314A00FFAD6D001C94A90002C3 -:103DD0003128FFFFAD68001090A70000A560000229 -:103DE000A1600004A167000090A30002306200FF00 -:103DF0000002198210600005240500011065000E04 -:103E00000000000003E00008A16A00018CD800282F -:103E1000354A0080AD7800188CCF0014AD6F0014C7 -:103E20008CCE0030AD6E00088CC4002CA16A00015D -:103E300003E00008AD64000C8CCD001CAD6D0018D3 -:103E40008CC90014AD6900148CC80024AD6800084A -:103E50008CC70020AD67000C8CC200148C830064FA -:103E60000043C82B13200007000000008CC2001480 -:103E7000144CFFE400000000354A008003E0000815 -:103E8000A16A00018C8200640A0003C400000000E3 -:103E900090AA000027BDFFF88FA9001CA3AA00006C -:103EA0008FAE00003C0FFF808FA8001835E2FFFFA7 -:103EB0008CCD002C01C26024AFAC0000A120000416 -:103EC00000E06021A7A000028FB800008D27000449 -:103ED0000188182100A0582100C05021006D28261B -:103EE0003C06FF7F3C0F00FF2CAD000135EEFFFFCD -:103EF00034D9FFFF3C02FF0003193024000D1DC020 -:103F0000010EC82400E2C02400C3702503197825DF -:103F1000AD2E0000AD2F00048D450024AFAE000093 -:103F2000AD2500088D4D00202405FFFFAD2D000CB0 -:103F3000956800023107FFFFAD2700109166001859 -:103F400030C200FF000219C2506000018D450034EC -:103F5000AD2500148D67000827BD0008AD27001CA3 -:103F60008C8B00CCAD2C0028AD20002CAD2B002478 -:103F7000AD20001803E00008AD20002027BDFFE0C1 -:103F8000AFB20018AFB10014AFB00010AFBF001C4B -:103F90009098000000C088213C0D00FF330F007F87 -:103FA000A0CF0000908E000135ACFFFF3C0AFF005F -:103FB000A0CE000194A6001EA22000048CAB001429 -:103FC0008E29000400A08021016C2824012A4024AD -:103FD0000080902101052025A6260002AE240004C1 -:103FE00026050020262400080E0000722406000288 -:103FF00092470000260500282624001400071E0012 -:104000000003160324060004044000032403FFFFFA -:10401000965900023323FFFF0E000072AE230010FA -:10402000262400248FBF001C8FB200188FB100140B -:104030008FB0001024050003000030210A00007C2E -:1040400027BD002027BDFFD8AFB1001CAFB00018BE -:10405000AFBF002090A80000240200018FB0003CF8 -:104060003103003F00808821106200148FAA0038BD -:10407000240B0005506B0016AFAA001000A02021F1 -:1040800000C028210E00040702003021922400BC49 -:10409000308300021060000326060030ACC0000030 -:1040A00024C600048FBF00208FB1001C8FB0001801 -:1040B00000C0102103E0000827BD0028014038217E -:1040C0000E000385AFB000100A00044B0000000092 -:1040D0000E0003CCAFB000140A00044B0000000037 -:1040E0003C02000A034218213C04080024843B08D7 -:1040F0002405001A000030210A00007CAF83002C48 -:104100003C038000346200708C48000000A05821FD -:1041100000C04821308A00FFAF8800308F4401780A -:104120000480FFFE3C0C8000358600708CC50000CA -:104130003C0308008C6300743C1808008F18007062 -:1041400000A82023006468210000C82101A4782B66 -:104150000319702101CF60213C010800AC2D0074CF -:104160003C010800AC2C00708F480E14AF4801448D -:10417000AF47014CA34A0152A74B0158934601088F -:1041800030C5000854A0000135291000934B0900E8 -:1041900024070050316A00FF1147000700000000AB -:1041A0008F450E1CAF450148AF4901543C09100032 -:1041B00003E00008AF490178934D010831A80008D9 -:1041C0001100001000000000934F010831EE0010B4 -:1041D00051C00001352900083C04080090843B6C64 -:1041E000A34401508F4309A4AF4301488F4209A063 -:1041F000AF420144AF4901543C09100003E00008FC -:10420000AF4901783C1908008F393B283338000842 -:104210005700FFF1352900080A00049E0000000045 -:1042200024070040AF470814AF4008108F420944EC -:104230008F4309508F4409548F45095C8F46094CC0 -:10424000AF820064AF830054AF840050AF85005C40 -:1042500003E00008AF8600609346010930C5007F87 -:10426000000518C0000521400083102103E000086C -:10427000244200883C0A0800914A3B2D3C09080072 -:1042800095293B263C051100000A3C002528000228 -:1042900000E8302500C5182524820008AC83000002 -:1042A00003E00008AC8000048F4A002C974D0908F9 -:1042B0003C0E000E034E382131ACFFFF000C41C014 -:1042C000AF48002C9743090894EB001A0080402166 -:1042D000240200013169FFFFAC8900008CE6001C5C -:1042E00000A05821AC8600048CE40020AD04000836 -:1042F00090E30019306300031062003E00000000EC -:104300002865000214A00071240F0002106F004CF9 -:104310000000000024180003107800550000000081 -:104320003C09080095293B1C93430934934F09210C -:104330003C05080094A53B22306400FF94EE002A5F -:104340000004688231EC00FF978F0058000DC60012 -:10435000000CCC003127FFFF0319102500A73021E6 -:104360000046202501CF68213C03400000836025E2 -:10437000000D4C00AD090004AD0C0000935909205C -:104380003C1800062509001400193E0000F82825F5 -:10439000AD0500088F4E092C25E6000130C27FFFD5 -:1043A000AD0E000C8F440930A7820058250200286A -:1043B000AD0400108F4D0938AD0D0014AD2B000475 -:1043C0008F4C0940AD2C0008934309373C19080075 -:1043D00093393B2CAD200010000347000019C400A6 -:1043E000011858253567FFFFAD27000C03E00008D2 -:1043F000AF4A002C3C09080095293B1C3C0D0800E5 -:1044000095AD3B263C0C0800958C3B1894E40024A9 -:10441000312EFFFF01AE302100CC18230004CC0068 -:104420002462FFF20322C025240F0800AD18000CFF -:10443000AD0F0014AD0000100A0004F225080018AA -:1044400094E5002494EE00283C09080095293B1CC3 -:1044500000056C00000E640035A68100358408005C -:10446000AD06000CAD0400100A0004F2250800148B -:104470003C09080095293B1C3C0F080095EF3B26A2 -:104480003C06080094C63B1894E400243125FFFF45 -:1044900094ED002801E5702101C660230004CC00E2 -:1044A000000D1C002582FFEE006278253738810060 -:1044B00024050800AD18000CAD0F0010AD05001864 -:1044C000AD0000140A0004F22508001C1460FF94DB -:1044D0000000000094E300243C09080095293B1CDF -:1044E0000003140034590800AD19000C0A0004F24E -:1044F0002508001003E00008240201F427BDFFE8AE -:10450000AFB00010AFBF00140E00005C008080212F -:1045100024050040AF4508148F8300548F84005059 -:104520008F85005C0070182100641023184000047F -:10453000AF830054AF6300548F660054AF860050C1 -:104540001200000C000000008F440074936800818A -:104550003409FA002D07000710E00005008910213A -:10456000936C0081240B01F4018B50040144102151 -:10457000AF62000C8F4E095C01C5682319A00004CE -:104580008FBF00148F4F095CAF8F005C8FBF00148A -:104590008FB000100A00005E27BD00188F840064F1 -:1045A0008F8300548F820050AF640044AF6300508B -:1045B00003E00008AF6200543C03800034620070E6 -:1045C0008C43000027BDFFF8308700FF30A900FFB3 -:1045D00030C800FFAF8300308F4401780480FFFEB5 -:1045E0003C028000345900708F380000A3A70003FC -:1045F0003C0708008CE700748FAC00003C06080004 -:104600008CC60070030378233C0E7FFF00EFC821A7 -:1046100035CDFFFF00005021018D282400CA18214C -:10462000000847C0032F202B00A810250064C021DC -:10463000AFA200003C010800AC3900743C01080046 -:10464000AC380070934F010AA3A000023C0E80FF1B -:10465000A3AF00018FAC0000312B007F35CDFFFFF1 -:10466000018D4824000B5600012A40252407300004 -:104670002406FF803C05100027BD0008AF48014C10 -:10468000AF470154A7400158A346015203E0000878 -:10469000AF45017827BDFFE8AFBF0014AFB00010F1 -:1046A0008F6500743C068000309000FF00A6202536 -:1046B0000E00005CAF640074936300053462000870 -:1046C0000E00005EA3620005020020218FBF0014CF -:1046D0008FB0001024050005240600010A0005968D -:1046E00027BD001827BDFFE03C038000AFB00010DD -:1046F000AFBF0018AFB10014346200708C470000E7 -:10470000309000FF30A800FFAF8700308F44017861 -:104710000480FFFE3C188000371100708E2F0000CF -:104720003C0D08008DAD00743C0A08008D4A0070F5 -:1047300001E7702301AE28210000582100AE302B84 -:10474000014B4821012638213C010800AC250074AA -:10475000000088213C010800AC2700701100000F08 -:10476000000000008F6200742619FFFF3208007FEE -:104770000002FE0233E5007F15000006332200FF31 -:104780002407FF800207202624A3FFFF0083802543 -:10479000320200FF00408021241110080E00005C4E -:1047A000000000008F4908183125000414A0FFFD07 -:1047B0003218007F001878C00018714001CF6821BE -:1047C00025AC0088AF4C0818274A09808D4B002083 -:1047D000AF4B01448D460024AF460148A350015021 -:1047E0000E00005EA7400158022010218FBF001864 -:1047F0008FB100148FB0001003E0000827BD002027 -:1048000027BDFFE8308400FFAFBF00100E0005E1B8 -:1048100030A500FF8F8300548FBF00103445004047 -:104820002404FF903C02100027BD0018AF43014C48 -:10483000A3440152AF45015403E00008AF420178A0 -:1048400027BDFFE8AFBF0014AFB000109345093F8C -:10485000240200063C08080095083B2230A300FF14 -:104860002487FFD8240500041062003624060002C5 -:10487000974E093C3C0D02040006340031CCFFFF8A -:10488000018D5825AC8B0000934A093E3149002028 -:104890001120000800000000935F09363C19010355 -:1048A0003738030033F000FF02187825240500088C -:1048B000AC8F000493580934934D09213C104000FB -:1048C000330E00FF000E608231AB00FF000C56007B -:1048D000000B1400014218250068F82503F0C825D4 -:1048E000AC99FFD8935809378F4C09488F4D094030 -:1048F00000057882330E00FF01CF5821018D282357 -:10490000000B57000146102530A3FFFF0043402550 -:10491000000F488001273021ACE800200E00005C29 -:1049200024D00028240400040E00005EA364003F8D -:10493000020010218FBF00148FB0001003E00008A8 -:1049400027BD00180A0006442406001227BDFFD028 -:1049500024090010AFB50024AFB40020AFB3001C91 -:10496000AFB10014AFB000103C010800A0293B2CEF -:10497000AFBF0028AFB2001897480908309400FF75 -:104980003C02000E3107FFFF000731C0AF46002C8C -:10499000974409089344010B30B300FF0342802180 -:1049A000308300300000A821106000E4000088215E -:1049B000240C00043C010800A02C3B2C934B093E26 -:1049C000000B5600000A2E0304A001310000000075 -:1049D000AF4000489352010B324F002011E0000617 -:1049E00000000000935F093E001FCE000019C603BF -:1049F00007000148000000009346010B30C2004050 -:104A0000104000038F9200548F87005424F2FFFF60 -:104A1000960A002C9345093493490937A78A005810 -:104A200030A600FF312700FF00071080004620213C -:104A30000091F8213C010800A43F3B22920300189A -:104A40003C010800A4203B1C3C010800A4203B18AA -:104A5000307000FF03F04021250B000A3170FFFF8A -:104A60003C010800A4283B243C010800A4283B2664 -:104A70000E00009A020020210E0004C500402021F3 -:104A80008F4B002C975809083C19000E0359402100 -:104A9000330FFFFF000F71C0AF4E002C9743090882 -:104AA000950D001A241100010040382131ACFFFFA0 -:104AB000AC4C00008D0A001CAC4A00048D0500209F -:104AC000AC4500089109001931230003107100BDA5 -:104AD0002871000216200103240C0002106C00F55E -:104AE000240D0003106D00CA000000003C090800FE -:104AF00095293B1C93430934935809213C0A08002B -:104B0000954A3B22306400FF950C002A0004F8828D -:104B1000331900FF97980058001F760000197C0099 -:104B20003126FFFF01CF402501466821010D882570 -:104B3000019828213C0840000228102500054C005F -:104B4000ACE90004ACE20000934309203C040006F9 -:104B500024E900140003FE0003E4C825ACF90008B2 -:104B60008F4E092C270F000131E67FFFACEE000CC1 -:104B70008F4D0930A786005824E60028ACED0010C0 -:104B80008F4C0938ACEC0014AD3200048F51094051 -:104B9000AD310008934209373C05080090A53B2C35 -:104BA000AD2000100002270000051C000083F8253E -:104BB00037F2FFFFAD32000CAF4B002C12A00033D8 -:104BC000000000009352093F24150006240500044C -:104BD000324B00FF117500CD24090002974F093CAC -:104BE0003C0E020431EDFFFF01AE6025ACEC002865 -:104BF0009351093E322200201040000800000000BE -:104C0000934409363C180103371F0300309900FF15 -:104C1000033F2825ACC5000424050008935209343D -:104C20009343092100056082324B00FF000BA882EC -:104C3000306400FF0015FE000004C40003F8C8251E -:104C4000032A782501E87025ACCEFFD8934D0937AB -:104C50008F5209488F42094031B100FF022C582180 -:104C600002423023000B1F000009AC0000754825EC -:104C700030C8FFFF012850250E00005CACEA002080 -:104C8000240700040E00005EA367003F0E0000C36F -:104C9000020020213C05080090A53B2C30B0000309 -:104CA0001200000F028020218F8800542509000186 -:104CB000AF890054AF6900508F6A0054014938230E -:104CC00018E00002012020218F640054AF640054DA -:104CD0008F420074244601F4AF66000C028020214C -:104CE00002602821A76000680E0005E13C13100057 -:104CF0008F8E005434540006AF4E014C8F8D004C03 -:104D00008FBF00288FB5002431B100FF25AC000112 -:104D1000AF8C004C8FB20018A35101528FB000101D -:104D2000AF5401548FB10014AF5301788FB40020F9 -:104D30008FB3001C03E0000827BD00309359093EE3 -:104D40000019C6000018960306420048241100020C -:104D500093420923304400021080FF1E8F870060B9 -:104D60008F86005414E6FF1B000000000E00005C5C -:104D7000000000009365003F2408001630A900FFE2 -:104D80001128000C240A00083C0D080091AD3B2CB2 -:104D900035AC00013C010800A02C3B2C936B003F7C -:104DA000316300FF106A0065240E000A106E005E79 -:104DB0002402000C0E00005E000000000A00069DA8 -:104DC000000000003C09080095293B1C3C19080024 -:104DD00097393B263C18080097183B18950E00247D -:104DE000313FFFFF033F782101F86823000E8C005C -:104DF00025ACFFF2022C502524050800244700189A -:104E0000AC4A000CAC4500140A0006E5AC400010AA -:104E10003C09080095293B1C3C18080097183B26C4 -:104E20003C0F080095EF3B18950D00243139FFFF2A -:104E3000950C00280319702101CF8823000D2C0048 -:104E4000000C54002622FFEE0142302534A48100DC -:104E500024030800ACE4000CACE60010ACE300183E -:104E6000ACE000140A0006E524E7001C3C01080041 -:104E7000A0313B2C9343093E24150001307F0020D4 -:104E800017E0FED4241100080A00069D2411000436 -:104E90008F6E00848F4D094011A0FECDAF8E00545F -:104EA000240F00143C010800A02F3B2C0A00069C94 -:104EB0000000000095020024950600283C09080027 -:104EC00095293B1C0002240000061C00349F810031 -:104ED00034790800ACFF000CACF900100A0006E5BC -:104EE00024E700141460FF0100000000951800245E -:104EF0003C09080095293B1C2447001000187C0041 -:104F000035EE08000A0006E5AC4E000C0A00071F4B -:104F1000240900128F64004CAF6400548F63005466 -:104F20000A0006A6AF630050A362003F0E00005EB9 -:104F3000000000000A00069D00000000240200148A -:104F40000A0007F3A362003F27BDFFE8308400FF9B -:104F5000AFBF00100E0005E130A500FF9378007E82 -:104F60009379007F936E00809368007A332F00FF5F -:104F700000186600000F6C0031CB00FF018D482542 -:104F8000000B52008FBF0010012A3825310600FFA8 -:104F90003444700000E628252402FF813C03100001 -:104FA00027BD0018AF45014CAF440154A342015244 -:104FB00003E00008AF43017827BDFFD8AFB2001867 -:104FC000AFB10014AFB00010AFBF0020AFB3001CF2 -:104FD00093420109308600FF30B000FF000618C27E -:104FE000320400023071000114800005305200FFCD -:104FF0009367000530E5000810A0000D30C80010D0 -:10500000024020210E0005CD0220282124040001A9 -:105010008FBF00208FB3001C8FB200188FB1001417 -:105020008FB000100080102103E0000827BD002889 -:105030001500003200000000934301090000282100 -:105040003062007F000220C00002F94003E4982192 -:1050500026790088033B98218E7800248E6F000803 -:10506000130F0046000000008F6400842418000223 -:105070000004FD8233F900031338007C00000000B7 -:1050800093660083934A0109514600043205007C6F -:1050900010A00060000000003205007C14A0005346 -:1050A0000240202116200006320400018E7F0024D9 -:1050B0008F59010417F9FFD60000202132040001A6 -:1050C0001080000A024020218F4209408F93006423 -:1050D00010530006000000000E00067B022028216D -:1050E0008F430940AF630044024020210E00062890 -:1050F000022028210A00082C240400013C09080091 -:105100008D290064252600013C010800AC260064BE -:1051100016000012000000008F6D00843C0E00C0DD -:1051200001AE602415800005024020210E0007FA20 -:10513000022028210A00082C240400012405000470 -:105140000E00059624060001024020210E0007FAF9 -:10515000022028210A00082C240400010E00003D32 -:1051600024040001936B007D020B50250E00005EAD -:10517000A36A007D0A00086F8F6D00848F6600743B -:105180008F4801048E67002400064E021507FFB603 -:105190003126007F936B008326440001308A007F14 -:1051A00011460043316300FF5464FFB08F640084F4 -:1051B0002645000130B1007F30A200FF1226000416 -:1051C00024050001004090210A000842241100013A -:1051D000240FFF80024F702401CF9026324200FF3F -:1051E000004090210A000842241100010E00067BB5 -:1051F00002202821321800301300FFAA321000824A -:10520000024020210E0005CD022028210A00082C92 -:10521000240400018F6E00743C0F800024050003FD -:1052200001CF9025AF7200749371008324060001B2 -:105230000E000596322400FF0E00003D24040001FC -:10524000936D007D020D60250E00005EA36C007D55 -:105250003C0B08008D6B0054257000013C010800D8 -:10526000AC3000540A00082C240400018F6800743C -:105270003C0980002405000401093825AF6700744B -:1052800093630083240600010E000596306400FF3E -:105290000E00003D240400019362007D0202982567 -:1052A0000E00005EA373007D0A00082C2404000198 -:1052B000324D008039AC0080546CFF6C8F640084E8 -:1052C0000A0008952645000127BDFFD03C0A0008CA -:1052D000AFBF002CAFB40028AFB30024AFB20020A2 -:1052E000AFB1001CAFB00018034AD8212409004018 -:1052F000AF490814AF4008108F4209448F4309504A -:105300008F4609548F47095C8F48094C9344010824 -:105310009345010BAF820064308400FF30A500FF8D -:10532000AF830054AF860050AF87005C0E000816B4 -:10533000AF8800601440015A8FBF002CA76000683E -:10534000934D0900240B00503C14080026943C3077 -:1053500031AC00FF3C12080026523C40118B000388 -:10536000000000000000A02100009021934F0109DF -:105370008F8800542402001031F1007F001170C0AA -:105380000011694001AE282124B80088AF580818E0 -:105390008F4A01048F4B09A43C0C000E034CC8211A -:1053A000014B48233C010800AC293B088F440958B5 -:1053B0003C010800A0223B2C9746090800881823CE -:1053C0003C010800AC233B0C30C7FFFF0007F9C0CD -:1053D0003C010800AC283B30AF5F002C9742090825 -:1053E0009730002C8E910000932F0018037898219D -:1053F000A7900058AF9300480220F80931F000FF51 -:10540000304E000215C0018E30530001126001427F -:10541000000000008F4F09A4241300013C01080084 -:10542000AC2F3B3493510934934E0937322500FF9A -:1054300031CD00FF000D60800185502101505821C1 -:105440003C010800A42B3B243C010800A42A3B2279 -:1054500093490934312200FF0202202124900010D8 -:105460003C010800A4303B20240800068F9900541A -:105470003C010800AC283B288F9F005C8F580958DE -:105480000000802103F9282304A0013C03192023F4 -:105490000480013A00A4382B10E0013C0000000019 -:1054A0003C010800AC253B0C8E4200000040F8098E -:1054B000000000003046000214C000DD00408821DA -:1054C00030430001546000108E4200043C04080088 -:1054D0008C843B103C09C00000898025AF500E0031 -:1054E0008F4B0000316A00081140FFFD00000000F2 -:1054F00097450E0824100001A78500408F4C0E042C -:10550000AF8C00348E4200040040F8090000000017 -:1055100002228825322D000215A00159000000004A -:105520003C09080095293B183C06080094C63B241A -:105530003C04080094843B1A3C1908008F393B1046 -:10554000012658213C1808008F183B343C1F0800E6 -:1055500097FF3B2E016418218F4E09400329282113 -:10556000246F00020319682100BF60213C0108007C -:10557000A42B3B26AF8E00643C010800AC2D3B34CD -:105580003C010800A42C3B1C0E00009A31E4FFFFF4 -:105590008F87004C004020213C010800A0273B2DB4 -:1055A0008E42000824E80001AF88004C0040F80952 -:1055B000000000008F4B002C974909083C0A000EA0 -:1055C000034A38213124FFFF000419C08F8A005498 -:1055D000AF43002C9743090894E6001A004040218D -:1055E00030DFFFFFAC5F00008CF9001CAC590004F9 -:1055F0008CF80020AC58000890EF001931E300034C -:10560000107300E60000000028620002144001024E -:10561000240C0002106C00F4240D0003106D00A790 -:10562000000000003C09080095293B1C9345093403 -:10563000934C09213C0F080095EF3B2230BF00FF3F -:1056400094EE002A001F6882319900FF978C005861 -:10565000000D16000019C4003124FFFF01E43021C1 -:10566000005848250126382501CC28213C0340005C -:1056700000E3F82500056C00AD0D0004AD1F00002F -:10568000935909203C180006250D001400197E00CE -:1056900001F87025AD0E00088F42092C2586000107 -:1056A0008E4C000CAD02000C8F44093030C97FFFD6 -:1056B000A7890058AD0400108F4709382504002839 -:1056C000AD070014ADAA00048F450940ADA5000840 -:1056D000934309373C1F080093FF3B2CADA00010FB -:1056E0000003C700001FCC000319782535EEFFFF2B -:1056F000ADAE000CAF4B002C0180F809000000009B -:105700003C06080094C63B263C02080094423B1A23 -:1057100000C24821252B00020E0000C33164FFFFA8 -:105720003C0808008D083B083C0708008CE73B104C -:10573000010750233C010800AC2A3B081540000635 -:10574000000000003C0808008D083B28350A004096 -:105750003C010800AC2A3B28120000848F830048DB -:105760008F470E108F900048AE0700208F4B0E1809 -:10577000AE0B00243C10080096103B1C0E00005C91 -:1057800000000000240F0040AF4F08148F86005423 -:105790008F89005000D018210069702319C00004BF -:1057A000AF830054AF6300548F640054AF84005043 -:1057B0001200000C000000008F44007493780081F8 -:1057C0003419FA002F020007104000050099182133 -:1057D000937F0081240C01F403EC680401A41821D8 -:1057E000AF63000C8F4A095C8F88005C0148282356 -:1057F00018A00003000000008F50095CAF90005C0F -:105800000E00005E000000008F8300548E470010E1 -:105810003C010800AC233B3000E0F8090000000028 -:105820003C0B08008D6B3B081560FF102408000638 -:105830008F590024975F09088F8900648F8E005468 -:105840003C0C001F978400588F8F002C8F930050C2 -:1058500033F8FFFF358DFF80032D3024001811C071 -:1058600032320010AF420024A5E4002CAF460024E1 -:10587000AF690044AF6E0050AF7300545640007CD7 -:105880008E850004322A0040554000318E91000878 -:105890008E88000C0100F809000000008FBF002C6A -:1058A0008FB400288FB300248FB200208FB1001C6A -:1058B0008FB0001803E0000827BD00303C09080045 -:1058C00095293B1C3C03080094633B263C040800DC -:1058D00094843B1894F900243125FFFF94F80028A4 -:1058E0000065F82103E478230019640000186C00B7 -:1058F00025EEFFEE01AE302535828100240308003D -:10590000AD02000CAD060010AD030018AD00001490 -:105910000A0009B32508001C934301098F8600384B -:1059200000033E0000E64025AF4800808F5F09A0DD -:105930008F5809A4AFBF0010AF5F0E148FB90010CD -:10594000AF590E10AF580E1C0A00092DAF580E1893 -:105950000220F809000000008E88000C0100F80900 -:10596000000000000A000A508FBF002CA460002035 -:10597000A47300220A000A05AC7300243C0108004D -:10598000AC203B0C0A0009538E4200003C01080089 -:10599000AC243B0C0A0009538E4200003C0908006D -:1059A00095293B1C3C1F080097FF3B263C0508003F -:1059B00094A53B1894F800243124FFFF03E4C82188 -:1059C0000325782300186C0025EEFFF201AE602558 -:1059D000AC4C000C24020800AD020014AD00001015 -:1059E0000A0009B32508001894E6002494E300286F -:1059F0003C09080095293B1C000624000003FC001C -:105A00003485810037F90800AD05000CAD19001090 -:105A10000A0009B3250800141460FF02000000000A -:105A200094F800243C09080095293B1C00187C00D0 -:105A300035EE0800AD0E000C0A0009B32508001071 -:105A400093520109000028210E000628324400FF6D -:105A50008FBF002C8FB400288FB300248FB200209A -:105A60008FB1001C8FB0001803E0000827BD003084 -:105A700000A0F809000000000A000A4A322A00408B -:105A80001200FF6B000000008F4E0E148F92004832 -:105A9000AE4E00208F530E1C0A000A34AE53002471 -:105AA0008F820018008040213C040100904700854F -:105AB00030E3002010600009000000003C070800EF -:105AC0008CE73B308F83001400E320230480000820 -:105AD0009389000014E300030100202103E0000883 -:105AE000008010213C04010003E000080080102128 -:105AF0001120000B006738238F8C001C2409003410 -:105B0000918B00BC316A0002514000012409003031 -:105B100000E9682B15A0FFF10100202100E93823DE -:105B20002419FFFC00B9C02400F9782400F8702B78 -:105B300015C0FFEA01E8202130C20003000218234B -:105B400014C00012306900030000302100A9702148 -:105B500001C6682100ED602B1180FFE03C040100CC -:105B60002D2F00010006482B0105382101E93024C2 -:105B700014C0FFDA24E4FFFC2419FFFC00B9C024A0 -:105B80000308202103E00008008010218F8B001CF7 -:105B900024060004916A00BC314400041480FFEC28 -:105BA00000A970210A000AFC0000302127BDFFE88F -:105BB000AFBF00108F460100934A01093C1F080047 -:105BC0008FFF00902407FF80314F00FF31E8007FF6 -:105BD0000008614003E6C821032CC02127090120E9 -:105BE000012770243C010800A02F3B6CAF4E080C2D -:105BF0003C0D08008DAD00903C0400803482000311 -:105C000001A65821016C18212465012030AA0078D2 -:105C100001424025AF48081C3C1F08008FFF009040 -:105C20008F88004403E6C021331900070307482486 -:105C3000033A7821AF49002825E909C0952E0002D2 -:105C40003C0D08008DAD008C3C0A08008D4A009088 -:105C500031CC3FFF01A61821000C5980006B282190 -:105C600000A72024AF44002C952200023C1F08000E -:105C70008FFF008C9107008530593FFF03E67821A4 -:105C80000019C1800146702101F8682131CC007FE4 -:105C900031AB007F019A2821017A50213C03000C8E -:105CA0003C04000E00A328210144102130E600200E -:105CB00027470980AF820028AF880018AF890020ED -:105CC000AF85001C10C00006AF8700248D02005075 -:105CD0008CA4010C0044302318C0007700000000A1 -:105CE000910C0085240DFFDF018D3824A10700856C -:105CF0008F8B00188F8900208F8700248D65004CC2 -:105D0000AF850014912F000D31EE002011C0001757 -:105D10000000000024090001A3890000AF800008F2 -:105D20008CE400248F850008240A0008AF8000045A -:105D3000AF80000C3C010800A42A3B1A3C0108007B -:105D4000A4203B2E0E000AD0000030218F850020B9 -:105D50008FBF0010AF82001090A8000D27BD001863 -:105D60000008394203E0000830E20001913F0002E0 -:105D70002418000133F900FF00192182109800391E -:105D8000240800021088005B8F8600288CE5002420 -:105D900014A0001B8F9F001C91220000240A000504 -:105DA0003046003F10CA0047240400018F860004DB -:105DB000A3840000AF86000CAF8600088CE40024AA -:105DC0008F850008240A00083C010800A42A3B1A19 -:105DD0003C010800A4203B2E0E000AD00000000069 -:105DE0008F8500208FBF0010AF82001090A8000D9B -:105DF00027BD00180008394203E0000830E2000126 -:105E00008CF800088CF900248FEE00C4A3800000F9 -:105E10008CE40024AF8E00088F8500088F86000474 -:105E200003197823240A0008AF8F000C3C010800F6 -:105E3000A42A3B1A3C010800A4203B2E0E000AD0E5 -:105E4000000000008F8500208FBF0010AF8200107F -:105E500090A8000D27BD00180008394203E0000893 -:105E600030E20001912300003062003F104400271F -:105E70008F85001C8CE400241480002100000000A9 -:105E80008D2E00183C187FFF8F85001C370FFFFFF9 -:105E900001CF1824AF8300048F9F00048CA80084D6 -:105EA00003E8C82B1720000203E020218CA4008403 -:105EB0000A000B8BAF8400048CA3010C0A000B6951 -:105EC000AF8300148D2C00188F8600043C0D7FFFDB -:105ED0008F89001C35A3FFFF01835824240400018F -:105EE000AF8B000CAD2000CCA38400000A000B9700 -:105EF000AF8600088CCA00140A000B8BAF8A00041E -:105F00008CA300C80A000BCEAF8300048F84002846 -:105F10008CAC00648C8D0014018D582B1160000432 -:105F2000000000008CA200640A000BCEAF820004C7 -:105F30008C8200140A000BCEAF8200048F8500080B -:105F400027BDFFE0AFBF0018AFB1001414A00007D9 -:105F5000AFB000108F8600202402000590C400001E -:105F60003083003F106200B68F84001C8F910004C4 -:105F700000A080218F8C00243C0508008CA53B0CE0 -:105F80008D8B000431663FFF00C5502B554000014A -:105F900000C02821938D000011A0007300B0F82BE1 -:105FA0008F98001C24040034930F00BC31EE0002D3 -:105FB00051C000012404003000A4C82B172000D1D8 -:105FC0000000000000A4282300B0F82B3C010800CA -:105FD000A4243B1817E00068020020213C030800BD -:105FE0008C633B080083102B544000010080182173 -:105FF0008F8800203C010800AC233B1000004821A2 -:106000009104000D30830020506000018F490E186C -:106010008F8300100123382B10E00059000000008E -:106020003C0408008C843B1000895821006B502BE5 -:10603000114000560090602B0069302300C02021E1 -:106040003C010800AC263B1012000003241FFFFC9B -:106050001090008A32270003009FC8243C010800EA -:10606000AC393B103C010800A4203B2E8F84000873 -:10607000120400078F83001CAF910004020020214E -:106080008C7100CCAF90000826300001AC7000CCC1 -:106090003C0208008C423B108F8A000C2407001839 -:1060A0000082202301422823AF84000810800002D0 -:1060B000AF85000C240700108F8600183C010800F3 -:1060C000A0273B2C2407004090CC0085318B00C0DA -:1060D000116700408F8D001014A0001500002021D2 -:1060E000934A01098F420974314500FF00022602DC -:1060F00024A300013090007F3071007F1230007ABD -:106100002407FF80A0C300833C0908008D293B2899 -:106110008F880020240D0002352C00083C01080067 -:10612000A02D3B6D3C010800AC2C3B282404001042 -:10613000910E000D31C6002010C00005008018210E -:10614000240800013C010800AC283B103483000106 -:106150008FBF00188FB100148FB0001000601021A5 -:1061600003E0000827BD00203C010800A4203B18E4 -:1061700013E0FF9A020020210A000C1F00A020213A -:106180003C0408008C843B100090602B1180FFAE13 -:10619000000000003C0F080095EF3B1801E470215F -:1061A00001C6682B11A000072C8200043C1F600070 -:1061B0008FF954043338003F1700FFE524030042F1 -:1061C0002C8200041040FFA0240300420A000C7D32 -:1061D0008FBF0018152DFFC0000000008CDF007479 -:1061E0003C0380002405FF8003E3C825ACD900747C -:1061F00090D80085240E000424040010330F003FC3 -:1062000001E54025A0C800858F8800203C010800DA -:10621000A02E3B6D240300019106000D30C9002023 -:1062200015200003000000003C0308008C633B10B5 -:106230003C010800AC233B080A000C74000000007D -:106240008F87000C8C88008400E8282B14A00002A3 -:1062500000E088218C91008424090001A3890000BA -:106260008F440E18022028210E000AD0022030216F -:10627000022080210A000C05AF82001000071823BD -:10628000306600033C010800A4263B2E12200005C6 -:106290008F8C001C918B00BC316A000415400015E6 -:1062A00024CD00043C0F080095EF3B2E01E4702143 -:1062B00000AE302B50C0FF6E8F8400082C85000587 -:1062C00014A0FFA32403004230980003170000022B -:1062D000009818232483FFFC3C010800AC233B10EA -:1062E0000A000C410000000000A758240A000C69B5 -:1062F000016718263C010800A42D3B2E0A000CD192 -:10630000000000003C010800AC203B100A000C7C9F -:10631000240300428F83000C14600007000010214A -:106320008F880020240500059106000030C400FF7E -:10633000108500030000000003E0000800000000DA -:10634000910A0018314900FF000939C214E0FFFA30 -:106350008F8500183C04080094843B183C03080017 -:106360008C633B303C1908008F393B103C0F080010 -:1063700095EF3B2E0064C0218CAD005403197021B1 -:1063800001CF6021018D58231960001D000000001D -:10639000910E001C8F8C0028974B0E1031CD00FF02 -:1063A0008D850004016D30238D88000030CEFFFF05 -:1063B000000E510000AAC821000038210107202149 -:1063C000032A182B0083C021AD990004AD9800006A -:1063D000918F000A01CF6821A18D000A8F880028C3 -:1063E000974B0E12A50B0008950A003825490001AD -:1063F000A50900389107000D34E60008A106000D3C -:1064000003E000080000000027BDFFE093870000C4 -:106410008F8F00208FAD00143C0E7FFF8F89000806 -:1064200035C8FFFFAFBF001CAFB0001801A818248B -:1064300091EA000D000717C03C1FBFFF00625825FE -:106440002D2E00018F90001437F9FFFF3C18080033 -:106450008F183B303C0F080095EF3B2601796824EC -:10646000000E47803C07EFFF3C05F0FF01A8182510 -:106470003149002034E2FFFF34ACFFFF0310582302 -:1064800027A500102406000225EA00020062182455 -:106490000080802115200002000040218F480E1C42 -:1064A000A7AA0012056000372407000030FF00FF94 -:1064B000001FCF008F8B001800793825AFA700147C -:1064C000916F00853C08080091083B2D3C18DFFFC8 -:1064D00031EE00C0370AFFFF000E182B3C1F0800EA -:1064E00097FF3B2000EA6824A3A80011000317408F -:1064F00001A248258FB90010AFA900143C0A08007A -:10650000914A3B2FA7BF00168FA80014032CC0246C -:106510003C0B01003C0F0FFF030B18253147000314 -:1065200035EEFFFF010C682400071600006EF8240A -:106530003C09700001A2C82503E95825AFB9001431 -:10654000AFAB00100E000072A3A000158F8C0020CE -:10655000260200089186000D30C40020108000063D -:106560008FBF001C3C05080094A53B1C24B0FFFF16 -:106570003C010800A4303B1C8FB0001803E0000869 -:1065800027BD00208F9800100118502B5540FFC7E1 -:10659000240700010A000D5430FF00FF9382000021 -:1065A00027BDFFE0AFBF00181040000F0080502152 -:1065B0008F880020240B00058F89000491070000BC -:1065C0008F84001C0100282130E3003F8F860028C3 -:1065D000106B000800003821AFA900100E0004392C -:1065E000AFAA0014A38000008FBF001803E00008CA -:1065F00027BD00208D1900183C0F08008DEF3B10BF -:106600008F98000C3C027FFF8D080014345FFFFF61 -:10661000033F682401F8702101AE6023018838210E -:10662000AFA900100E000439AFAA00140A000DA291 -:10663000A38000008F8700203C05080094A53B2E16 -:106640003C0208008C423B2890E6000D0005240027 -:1066500030C300201060002C004440258F850018B6 -:1066600000006021240B000190A300850000482158 -:10667000240A00013C0F800035EE00708DC7000039 -:10668000AF8700308F5801780700FFFE3C03800081 -:10669000347900708F3800003C0508008CA5007428 -:1066A0003C0D08008DAD00700307782300AF382142 -:1066B0000000102100EF302B01A2202100861821BC -:1066C0003C010800AC2700743C010800AC230070BA -:1066D000AF4B01483C1908008F393B30A7490144B2 -:1066E000A74A0146AF59014C3C0B0800916B3B2D6A -:1066F000A34B0152AF4801543C081000A74C01586D -:1067000003E00008AF4801788F4B0E1C3C0A0800DC -:106710008D4A3B1097490E16974D0E140145602186 -:10672000312AFFFF0A000DC531A9FFFF8F8300202A -:106730009064000D3082002010400029000000000D -:106740000000482100005021000040213C0780004B -:1067500034EB00708D670000AF8700308F4C0178FC -:106760000580FFFE3C0D800035AC00708D8B000075 -:106770003C0508008CA500743C0408008C84007063 -:106780000167302300A678210000102101E6C82B04 -:106790000082C021031970213C010800AC2F007455 -:1067A0003C010800AC2E0070AF4901483C0D0800C8 -:1067B0008DAD3B30A748014424090040A74A01465B -:1067C0003C081000240AFF91AF4D014CA34A01522E -:1067D000AF490154A740015803E00008AF480178D1 -:1067E0008F490E1897460E1297450E1030CAFFFFBC -:1067F0000A000DFB30A8FFFF8F83002027BDFFF8A4 -:106800009064000D308200201040003A000000002B -:10681000240B000100004821240A00013C088000EC -:10682000350700708CE30000AF8300308F4C017897 -:106830000580FFFE3C0E80003C04080090843B6C09 -:1068400035C700708CEC00003C0508008CA5007476 -:10685000A3A400033C1908008F3900708FAD00001D -:106860000183302300A63821000010210322782163 -:1068700000E6C02B01F8602101AE4025AFA8000062 -:106880003C010800AC2700743C010800AC2C0070EF -:106890009346010A3C04080090843B6DA3A00002CB -:1068A000A3A600018FA300003C0580FF3099007F64 -:1068B00034A2FFFF006278240019C60001F8702599 -:1068C000240D3000AF4E014C27BD0008AF4D0154E0 -:1068D000A7400158AF4B0148A7490144A74A0146C8 -:1068E0003C091000240AFF80A34A015203E000087B -:1068F000AF4901788F4B0E1897460E1297450E1030 -:1069000030CAFFFF0A000E2F30A9FFFF8F85001845 -:106910002402008090A40085308300C0106200052E -:106920008F86001C8F8800048F870008ACC800C8C1 -:10693000ACC700C403E00008000000003C0A0800E7 -:10694000254A37CC3C090800252938983C0808001E -:1069500025082C4C3C07080024E739AC3C0608000D -:1069600024C6363C3C05080024A533B43C0408008A -:1069700024842FDC3C030800246336D43C02080046 -:10698000244234A83C010800AC2A3C383C010800F1 -:10699000AC293C343C010800AC283C303C010800E8 -:1069A000AC273C3C3C010800AC263C4C3C010800B8 -:1069B000AC253C443C010800AC243C403C010800B0 -:1069C000AC233C503C010800AC223C4803E00008EA -:0469D00000000000C3 -:00000001FF -/* - * This file contains firmware data derived from proprietary unpublished - * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. - * - * Permission is hereby granted for the distribution of this firmware data - * in hexadecimal or equivalent format, provided this copyright notice is - * accompanying it. - */ diff --git a/firmware/bnx2/bnx2-mips-06-5.0.0.j3.fw.ihex b/firmware/bnx2/bnx2-mips-06-5.0.0.j3.fw.ihex new file mode 100644 index 0000000..652e6c8 --- /dev/null +++ b/firmware/bnx2/bnx2-mips-06-5.0.0.j3.fw.ihex @@ -0,0 +1,5841 @@ +:10000000080001100800000000004CC8000000C8F3 +:1000100000000000000000000000000008004CC8C4 +:100020000000001400004D90080000880800000047 +:10003000000058D000004DA408005A400000008481 +:100040000000A674080058D0000001540000A6F873 +:10005000080031D808000000000070F00000A84C33 +:10006000000000000000000000000000080070F028 +:10007000000000240001193C080004880800040066 +:100080000000175C00011960000000000000000083 +:100090000000000000000000000000000000000060 +:1000A000080000A80800000000003B38000130BC38 +:1000B0000000000000000000000000000000000040 +:0800C000000000000000000038 +:0800C8000A00004400000000E2 +:1000D000000000000000000D636F6D352E302E30E3 +:1000E0006A33000005000002000000000000000369 +:1000F00000000014000000320000000300000000B7 +:1001000000000000000000000000000000000000EF +:1001100000000010000001360000EA600000000549 +:1001200000000000000000000000000000000008C7 +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000020000000000000000000000008D +:10017000000000000000000000000000000000007F +:10018000000000000000000000000010000000005F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000100000030C +:1001E000000000000000000D0000000D3C020800AF +:1001F00024424D003C03080024634DFCAC40000049 +:100200000043202B1480FFFD244200043C1D080005 +:1002100037BD7FFC03A0F0213C1008002610011020 +:100220003C1C0800279C4D000E000214000000003A +:100230000000000D27BDFFE8AFBF0014AFB00010F5 +:100240009742010830437000240220001062000B26 +:10025000286220011440002F0000102124024000D9 +:1002600010620025000000002402600010620026D9 +:10027000000010210A0000948FBF001427500100D5 +:10028000920200091040001A240300013C020800F9 +:100290008C42002010400016000018210E00052B93 +:1002A00000000000960300083C06080094C64DBEFE +:1002B0008E0400188F8200209605000C00031C009D +:1002C00000661825AC440000AC450004240400017D +:1002D000AC400008AC40000CAC400010AC40001436 +:1002E000AC4000180E000550AC43001C0000182163 +:1002F0000A000093006010210E0003BD0000000002 +:100300000A000093000010210E000F810000000081 +:10031000000010218FBF00148FB0001003E0000810 +:1003200027BD001827BDFFE0AFB00010AFBF001819 +:10033000AFB10014275001009203000B2402001AF1 +:10034000961100081462005B00002821322200018F +:1003500010400008000000008E0200009603001408 +:10036000000211C200021040005A10210A0000DBF6 +:10037000A44300803C0208008C420020104000286A +:10038000000000000E00052B00000000974201084D +:100390009743010C8F8500203042003E3063FFFF01 +:1003A0000002140000431025ACA200008F4201009F +:1003B0003C06080094C64DBEACA20004974301164B +:1003C0009744010E3C02200000031C003084FFFF14 +:1003D00000641825ACA3000800C230259742011024 +:1003E0009743011224040001000214003063FFFF50 +:1003F00000431025ACA2000C974201143042FFFFCD +:10040000ACA200108F420118ACA200149342010B61 +:10041000304200FFACA200180E000550ACA6001C34 +:100420003C0208008C420040244200013C010800CC +:10043000AC2200403C0308008C63004432220002DE +:1004400032240004246300013C010800AC23004472 +:10045000108000180002282B8F4202B804430008C5 +:100460008E0200203C0208008C4200602442000101 +:100470003C010800AC2200600A0000FB24050001DA +:100480009603001600002821AF4202808E0200046D +:10049000A7430284AF4202883C021000AF4202B878 +:1004A0003C0208008C42005C244200013C01080030 +:1004B000AC22005C8FBF00188FB100148FB0001009 +:1004C00000A0102103E0000827BD002027BDFFE0A9 +:1004D000AFB00010AFBF0018AFB10014275001003B +:1004E0009203000B24020003961100081462006DB1 +:1004F000000020213222000110400008000000000E +:100500008E02000096030014000211C20002104087 +:10051000005A10210A000142A44300803C02080056 +:100520008C42002010400025000000000E00052B2A +:1005300000000000974201089743010C8F850020BE +:100540003042003E3063FFFF0002140000431025DC +:10055000ACA200008F4201003C06080094C64DBECC +:10056000ACA20004974301169744010E3C02200000 +:1005700000031C003084FFFF00641825ACA30008B2 +:1005800000C2302597420110974301122404000154 +:10059000000214003063FFFF00431025ACA2000CE2 +:1005A000974201143042FFFFACA20010ACA000142F +:1005B000ACA000180E000550ACA6001C3C020800C0 +:1005C0008C420040244200013C010800AC22004063 +:1005D0003C0208008C420044322300042442000103 +:1005E0003C010800AC2200441060001A32220002D4 +:1005F0008F4202B8044300088E0200203C0208002B +:100600008C420060244200013C010800AC220060E2 +:100610000A0001772404000196030016000020213F +:10062000AF4202808E020004A7430284AF420288D8 +:100630003C021000AF4202B83C0208008C42005C51 +:10064000244200013C010800AC22005C0A00017851 +:100650008FBF001810400013000020218F430104B9 +:100660003C026020AC4300148C420004240301FED1 +:10067000304203FF1443000B000020218F42010091 +:10068000000211C02442FFFC2C420008104000026E +:100690002403000200031F403C026000AC436914C5 +:1006A000000020218FBF00188FB100148FB0001000 +:1006B0000080102103E0000827BD00208F430100C7 +:1006C0002402010050620003000311C20000000D6B +:1006D000000311C200021040005A1021A440008003 +:1006E00003E00008000010219362000003E000080E +:1006F000AF80000003E000080000102103E00008C4 +:1007000000001021240201001482000800000000F3 +:100710003C0208008C4200FC244200013C0108001D +:10072000AC2200FC0A00019F30A200203C0208001D +:100730008C420084244200013C010800AC22008469 +:1007400030A200201040000830A300103C02080036 +:100750008C420108244200013C010800AC2201083F +:1007600003E0000800000000106000080000000026 +:100770003C0208008C420104244200013C010800B4 +:10078000AC22010403E00008000000003C02080065 +:100790008C420100244200013C010800AC2201000F +:1007A00003E000080000000027BDFFE8AFBF001015 +:1007B0002744010094830008306200041040001BAD +:1007C000306600028F4202B804410008240500018F +:1007D0003C0208008C420060244200013C010800F9 +:1007E000AC2200600A0001EB8FBF00108C82002059 +:1007F0009483001600002821AF4202808C820004FE +:10080000A7430284AF4202883C021000AF4202B804 +:100810003C0208008C42005C244200013C010800BC +:10082000AC22005C0A0001EB8FBF001010C0000674 +:10083000006028218F4401000E00018F000000009D +:100840000A0001EA240500018F8200088F43010499 +:1008500050430007000028218F4401000E00018F43 +:10086000000000008F420104AF8200080000282130 +:100870008FBF001000A0102103E0000827BD001862 +:100880003C0208008C420088274301009465000C5C +:10089000244200013C010800AC2200888C6400184E +:1008A0000345102190454000AF4400388C62001C85 +:1008B0002403FFF800052E000043102434420004F6 +:1008C000AF42003C3C020005AF4200300000000097 +:1008D0000000000000000000AF450404000000001C +:1008E00000000000000000003C020006344200014D +:1008F000AF420030000000000000000000000000D7 +:100900008F420000304200101040FFFD0000102117 +:1009100003E000080000000027BDFFE0AFB20018B0 +:100920003C036010AFBF001CAFB10014AFB00010AB +:100930008C6450002402FF7F3C1A80000082202437 +:100940003484380C24020037AC6450003C12080098 +:1009500026524D38AF42000824020C80AF420024DA +:100960003C1B80083C06080024C6062C02401021CF +:100970002404001C2484FFFFAC4600000481FFFD1A +:10098000244200043C0208002442016C3C0108009F +:10099000AC224D403C020800244204043C01080003 +:1009A000AC224D443C020800244207B83C01080038 +:1009B000AC224D883C0208002442025C3C03080043 +:1009C000246306343C040800248406E03C05080047 +:1009D00024A53B503C010800AC224DA03C0208007D +:1009E000244205F43C010800AC264D843C0108007B +:1009F000AC254D943C010800AC234D9C3C01080003 +:100A0000AC244DA43C010800AC224DA83C010800D8 +:100A1000AC234D3C3C010800AC204D483C01080093 +:100A2000AC204D4C3C010800AC204D503C0108006E +:100A3000AC204D543C010800AC204D583C0108004E +:100A4000AC204D5C3C010800AC204D603C0108002E +:100A5000AC244D643C010800AC204D683C0108000A +:100A6000AC204D6C3C010800AC204D703C010800EE +:100A7000AC204D743C010800AC204D783C010800CE +:100A8000AC264D7C3C010800AC264D803C010800A2 +:100A9000AC204D8C3C010800AC254D903C01080079 +:100AA000AC234D980E0006BB000000003C02800005 +:100AB000344200708C420000AF8200143C030800F6 +:100AC0008C6300208F820004104300043C028000ED +:100AD0000E0004F3AF8300043C0280003446007033 +:100AE0003C0308008C6300A03C0208008C4200A478 +:100AF000104300048F8400143C010800AC2300A4C0 +:100B0000A743009E8CCA00003C0308008C6300BC15 +:100B10003C0208008C4200B80144202300641821E4 +:100B2000000040210064202B0048102100441021C7 +:100B30003C010800AC2300BC3C010800AC2200B81A +:100B40008F510000322200071040FFDCAF8A0014F2 +:100B50008CC600003C0508008CA500BC3C040800C5 +:100B60008C8400B800CA302300A628210000102180 +:100B700000A6302B00822021008620213227000190 +:100B80003C010800AC2500BC3C010800AC2400B8C6 +:100B900010E0001F322200028F420100AF4200200D +:100BA0008F420104AF4200A89342010B0E0001885E +:100BB000305000FF2E02001D544000040010108031 +:100BC0000E00018B0A0002C5000000000052102137 +:100BD0008C4200000040F8090000000010400005B1 +:100BE0003C0240008F4301043C026020AC430014EF +:100BF0003C024000AF4201383C0208008C42003405 +:100C0000244200013C010800AC22003432220002E0 +:100C10001040000E322200048F4201400E00018875 +:100C2000AF4200200E00034B000000003C024000D9 +:100C3000AF4201783C0208008C4200382442000197 +:100C40003C010800AC220038322200041040FF981A +:100C50003C0280008F4201800E000188AF420020DC +:100C60008F43018024020F00146200050000000081 +:100C70008F420188A742009C0A0002FA3C02400011 +:100C80009362000024030050304200FF1443000828 +:100C90003C0240000E00032D000000005440000400 +:100CA0003C0240000E000E0D000000003C0240001F +:100CB000AF4201B83C0208008C42003C24420001D3 +:100CC0003C010800AC22003C0A00027A3C02800091 +:100CD0003C0290003442000100822025AF440020F5 +:100CE0008F4200200440FFFE0000000003E00008E7 +:100CF000000000003C0280003442000100822025F8 +:100D000003E00008AF44002027BDFFE0AFB10014AE +:100D1000AFB0001000808821AFBF00180E000302A2 +:100D200030B000FF9362007D022020210202802566 +:100D3000A370007D8F7000743C0280000E00030BD6 +:100D400002028024160000098FBF00188F4201F8AC +:100D50000440FFFE24020002AF5101C0A34201C4BF +:100D60003C021000AF4201F88FBF00188FB1001491 +:100D70008FB0001003E0000827BD002027BDFFE86A +:100D8000AFBF0010974201843042020010400005BE +:100D9000000020210E001042000000000A00034164 +:100DA000240400018F420188044000098FBF001015 +:100DB0008F4201883C03FF00004310243C030400E1 +:100DC00014430003240400019362003E8FBF00100F +:100DD0000080102103E0000827BD00182402000154 +:100DE000A3600022A76200168F4401400A0003108E +:100DF0002405000127BDFFE8AFBF0014AFB000100D +:100E000093620000304400FF3883002038820030B5 +:100E10000003182B0002102B00621824106000033E +:100E200024020050148200628FBF001493420148D4 +:100E3000304200FF2443FFFF2C6200051040005C9D +:100E40008FBF0014000310803C03080024634CC8CB +:100E5000004310218C420000004000080000000008 +:100E60000E0003028F4401408F70000C8F4201443A +:100E70001602000224020001AF62000C0E00030BF8 +:100E80008F4401408F420144145000048FBF00146E +:100E90008FB000100A000FB827BD00188F62000C39 +:100EA0000A0003B300000000976200108F43014462 +:100EB0003042FFFF1462000900000000240200011C +:100EC000A76200108F420140AF4202003C021000B6 +:100ED000AF4202380A0003BA8FBF001497620010B5 +:100EE0000A0003B3000000000E0003028F4401401B +:100EF000976200128F4301443050FFFF1603000237 +:100F000024020001A76200120E00030B8F4401406F +:100F10008F420144160200048FBF00148FB00010EE +:100F20000A00034527BD0018976200120A0003B3A8 +:100F300000000000976200148F4301443042FFFF1D +:100F4000146200068FBF0014240200018FB000104D +:100F5000A76200140A0012E227BD0018976200146D +:100F60000A0003B300000000976200168F4301449B +:100F70003042FFFF14620006240200018FBF0014FC +:100F80008FB00010A76200160A000BAA27BD001838 +:100F900097620016144000068FBF00143C02080040 +:100FA0008C420070244200013C010800AC22007019 +:100FB0008FB0001003E0000827BD001827BDFFE830 +:100FC000AFBF0014AFB000108F500100936200005B +:100FD00093430109304400FF2402001F106200A562 +:100FE0002862002010400018240200382862000AFD +:100FF0001040000C2402000B286200081040002C56 +:1010000000000000046000E528620002144000288F +:1010100024020006106200268FBF00140A0004B7E5 +:101020008FB000101062005E2862000B144000DCDC +:101030008FBF00142402000E106200738FB00010E6 +:101040000A0004B700000000106200C028620039E6 +:101050001040000A2402008024020036106200CAF8 +:1010600028620037104000B424020035106200C12D +:101070008FBF00140A0004B78FB000101062002B5D +:101080002862008110400006240200C824020039B2 +:10109000106200B48FBF00140A0004B78FB00010B4 +:1010A000106200998FBF00140A0004B78FB00010BF +:1010B0003C0208008C420020104000B98FBF001491 +:1010C0000E00052B000000008F4201008F830020DE +:1010D0009745010C97460108AC6200008F4201045D +:1010E0003C04080094844DBE00052C00AC62000452 +:1010F0008F4201180006340000C43025AC6200089D +:101100008F42011C24040001AC62000C9342010ACE +:1011100000A22825AC650010AC600014AC6000187B +:10112000AC66001C0A00048D8FBF00143C0208004E +:101130008C4200201040009A8FBF00140E00052B37 +:1011400000000000974401083C03080094634DBE72 +:101150009745010C000422029746010E8F82002061 +:10116000000426000083202500052C003C0300809D +:1011700000A6282500832025AC400000AC400004D8 +:10118000AC400008AC40000CAC450010AC40001472 +:10119000AC400018AC44001C0A00048C240400017C +:1011A0009742010C144000150000000093620005F6 +:1011B0003042001014400011000000000E00030235 +:1011C0000200202193620005020020213442001019 +:1011D0000E00030BA36200059362000024030020AD +:1011E000304200FF1043006D020020218FBF001429 +:1011F0008FB000100A00105827BD00180000000D25 +:101200000A0004B68FBF00143C0208008C42002084 +:10121000104000638FBF00140E00052B000000007B +:101220008F4201048F8300209744010C3C05080085 +:1012300094A54DBEAC6200009762002C000424000F +:101240003042FFFF008220253C02400E00A22825EC +:10125000AC640004AC600008AC60000CAC60001032 +:10126000AC600014AC600018AC65001C0A00048C73 +:10127000240400010E00030202002021A7600008E0 +:101280000E00030B02002021020020210E0003109B +:10129000240500013C0208008C4200201040004060 +:1012A0008FBF00140E00052B000000009742010CB8 +:1012B0008F8300203C05080094A54DBE0002140059 +:1012C000AC700000AC620004AC6000088F64004C9D +:1012D0003C02401F00A22825AC64000C8F62005025 +:1012E00024040001AC6200108F620054AC62001450 +:1012F000AC600018AC65001C8FBF00148FB00010EC +:101300000A00055027BD0018240200205082002545 +:101310008FB000100E000FA202002021104000200C +:101320008FBF0014020020218FB000100000282180 +:101330000A00031027BD0018020020218FBF0014EF +:101340008FB000100A00061827BD00189745010C41 +:10135000020020218FBF00148FB000100A00063851 +:1013600027BD0018020020218FB000100A00065D82 +:1013700027BD00189345010D020020218FB00010F9 +:101380000A0006A727BD0018020020218FBF001405 +:101390008FB000100A00068327BD00188FBF00140D +:1013A0008FB0001003E0000827BD00188F420278BC +:1013B0000440FFFE2402000234840080AF44024057 +:1013C000A34202443C02100003E00008AF4202784E +:1013D0003C04080094844DCA3C0208008C424DD461 +:1013E0003083FFFF000318C000431021AF42003CD0 +:1013F0003C0208008C424DD0AF4200383C02005005 +:1014000034420008AF42003000000000000000003D +:10141000000000008F420000304200201040FFFD1D +:10142000000000008F4204003C010800AC224DC0C7 +:101430008F4204043C010800AC224DC43C02002051 +:10144000AF420030000000003C02080094424DC84A +:101450003C03080094634DCC3C05080094A54DCE98 +:1014600024840001004310213083FFFF3C01080069 +:10147000A4224DC83C010800A4244DCA14650003F1 +:10148000000000003C010800A4204DCA03E0000851 +:10149000000000003C05000A27BDFFE803452821A5 +:1014A0003C04080024844DB0AFBF00100E0005B509 +:1014B0002406000A3C02080094424DB23C03080096 +:1014C00094634DCE3042000F2442000300431804C1 +:1014D00024027FFF0043102B10400002AF83001C4A +:1014E0000000000D0E0004C2000000003C020800D5 +:1014F00094424DBA8FBF001027BD001803E00008CA +:10150000A74200A23C02000A0342102194430006B5 +:101510003C02080094424DBA3C010800A4234DB699 +:10152000004310238F83001C0002140000021403E8 +:101530000043102B03E000083842000127BDFFE8FC +:10154000AFBF00103C02000A034210219442000683 +:101550003C010800A4224DB60E00050F000000005B +:101560005440FFF93C02000A8FBF001003E000085E +:1015700027BD001827BDFFE8AFBF00100E00050F04 +:101580000000000010400003000000000E00051DD8 +:10159000000000003C0208008C424DC08FBF0010CC +:1015A00027430400AF4200383C0208008C424DC47F +:1015B00027BD0018AF830020AF42003C3C0200056D +:1015C000AF42003003E00008AF8000188F8200189F +:1015D0003C0300060002114000431025AF420030DA +:1015E0000000000000000000000000008F4200002A +:1015F000304200101040FFFD27420400AF8200205F +:1016000003E00008AF8000183C0608008CC64DC4FB +:101610008F8500188F8300203C02080094424DBA49 +:1016200027BDFFE024A5000124630020244200011F +:1016300024C70020AFB10014AFB00010AFBF001836 +:10164000AF850018AF8300203C010800A4224DBAEA +:10165000309000FF3C010800AC274DC404C10008D5 +:101660000000882104E00006000000003C020800A1 +:101670008C424DC0244200013C010800AC224DC008 +:101680003C02080094424DBA3C03080094634DC8E4 +:101690000010202B004310262C420001004410258E +:1016A000144000048F830018240200101462000FFD +:1016B000000000000E000541241100013C03080059 +:1016C00094634DBA3C02080094424DC81462000372 +:1016D000000000000E0004C200000000160000031D +:1016E000000000000E00052B000000003C03080075 +:1016F00094634DBE3C02080094424DBC246300013B +:101700003064FFFF3C010800A4234DBE1482000397 +:10171000000000003C010800A4204DBE120000069D +:10172000000000003C02080094424DBAA74200A20B +:101730000A0005A3022010210E00050F0000000082 +:1017400010400004022010210E00051D00000000C2 +:10175000022010218FBF00188FB100148FB000102D +:1017600003E0000827BD00203084FFFF30A5FFFF05 +:1017700000001821108000070000000030820001E6 +:101780001040000200042042006518210A0005AB49 +:101790000005284003E000080060102110C000068A +:1017A00024C6FFFF8CA2000024A50004AC82000028 +:1017B0000A0005B52484000403E0000800000000CE +:1017C00010A0000824A3FFFFAC860000000000006A +:1017D000000000002402FFFF2463FFFF1462FFFAF1 +:1017E0002484000403E0000800000000240200013B +:1017F000AF62000CA7620010A7620012A76200147B +:1018000003E00008A76200163082007F0342102127 +:101810003C08000E004818213C0208008C420020C1 +:1018200027BDFFD82407FF80AFB3001CAFB200185C +:10183000AFB10014AFB00010AFBF00200080802116 +:1018400030B100FF0087202430D200FF1040002F6D +:1018500000009821AF44002C906200002403005047 +:10186000304200FF1443000E000000003C0208005C +:101870008C4200E00202102100471024AF42002CED +:101880003C0208008C4200E0020210213042007F3E +:101890000342102100481021944200D43053FFFF2E +:1018A0000E00052B000000003C02080094424DBED3 +:1018B0008F8300200011340000C2302500122C005C +:1018C0003C02400000C2302534A50001AC7000008D +:1018D0008FBF0020AC6000048FB20018AC7300080A +:1018E0008FB10014AC60000C8FB3001CAC6500100D +:1018F0008FB00010AC60001424040001AC6000182C +:1019000027BD00280A000550AC66001C8FBF0020D0 +:101910008FB3001C8FB200188FB100148FB000106D +:1019200003E0000827BD00289343010F24020010A4 +:101930001062000E2865001110A00007240200129A +:10194000240200082405003A10620006000030213D +:1019500003E0000800000000240500351462FFFCCD +:10196000000030210A0005D0000000008F42007402 +:1019700024420FA003E00008AF62000C27BDFFE87F +:10198000AFBF00100E000310240500018FBF001030 +:1019900024020001A762001227BD001824020001E2 +:1019A00003E00008A360002227BDFFE0AFB10014F0 +:1019B000AFB00010AFBF001830B1FFFF0E00030240 +:1019C000008080219362003F24030004304200FF26 +:1019D0001443000C02002021122000082402000AF7 +:1019E0000E0005C900000000936200052403FFFEFD +:1019F00000431024A362000524020012A362003FEA +:101A0000020020210E00030BA360008116200003BA +:101A1000020020210E00062D0000000002002021FF +:101A2000322600FF8FBF00188FB100148FB0001056 +:101A3000240500380A0005D027BD002027BDFFE09F +:101A4000AFBF001CAFB20018AFB10014AFB00010B0 +:101A50000E000302008080210E0005C90000000076 +:101A60009362003F24120018305100FF123200032D +:101A70000200202124020012A362003F93620005AD +:101A80002403FFFE004310240E00030BA362000595 +:101A9000020020212405002016320007000030211A +:101AA0008FBF001C8FB200188FB100148FB00010D0 +:101AB0000A00031027BD00208FBF001C8FB2001842 +:101AC0008FB100148FB00010240500390A0005D032 +:101AD00027BD002027BDFFE8AFB00010AFBF001446 +:101AE0009742010C2405003600808021144000102C +:101AF000304600FF0E000302000000002402001226 +:101B0000A362003F93620005344200100E0005C935 +:101B1000A36200050E00030B020020210200202119 +:101B20000E000310240500200A00069C000000009F +:101B30000E0005D0000000000E000302020020216C +:101B4000936200232403FF9F0200202100431024FE +:101B50008FBF00148FB00010A36200230A00030B94 +:101B600027BD001827BDFFE0AFBF0018AFB10014BC +:101B7000AFB0001030B100FF0E00030200808021E2 +:101B8000240200120E0005C9A362003F0E00030BE1 +:101B90000200202102002021022030218FBF0018E6 +:101BA0008FB100148FB00010240500350A0005D055 +:101BB00027BD0020A380002C03E00008A380002D97 +:101BC0008F4202780440FFFE8F820034AF42024011 +:101BD00024020002A34202443C02100003E0000879 +:101BE000AF4202783C0360008C625400304200082F +:101BF0001440FFFD000000008C625408AF82000C0E +:101C000024020052AC605408AC645430AC625434CA +:101C10002402000803E00008AC6254003C026000AB +:101C20008C42540030420008104000053C03600024 +:101C30008C625400304200081440FFFD0000000098 +:101C40008F83000C3C02600003E00008AC435408A2 +:101C500090A3000024020005008040213063003F73 +:101C600000004821146200050000502190A2001CD1 +:101C700094A3001E304900FF306AFFFFAD00000C46 +:101C8000AD000010AD000024950200148D05001C6D +:101C90008D0400183042FFFF00491023000211009C +:101CA000000237C3004038210086202300A2102BF9 +:101CB0000082202300A72823AD05001CAD040018D6 +:101CC000A5090014A5090020A50A001603E00008D4 +:101CD000A50A00228F4201F80440FFFE2402000200 +:101CE000AF4401C0A34201C43C02100003E000085D +:101CF000AF4201F83C0208008C4200B427BDFFE867 +:101D0000AFBF001424420001AFB000103C01080036 +:101D1000AC2200B48F4300243C02001F30AA00FF15 +:101D20003442FF8030D800FF006280240080F82118 +:101D300030EF00FF1158003B01405821240CFF8078 +:101D40003C19000A3163007F000310C000031940F2 +:101D5000006218213C0208008C4200DC256800016A +:101D6000310D007F03E21021004310213043007F3A +:101D700003431821004C102400794821AF4200246D +:101D80008D220024016C1824006C7026AD22000CFA +:101D90008D220024310800FFAD220010952200148E +:101DA000952300208D27001C3042FFFF3063FFFF8A +:101DB0008D2600180043102300021100000227C3E3 +:101DC0000040282100C4302300E2102B00C2302341 +:101DD00000E53823AD27001CAD2600189522002011 +:101DE000A522001495220022154B000AA5220016F8 +:101DF0008D2300248D2200082546000131450080F6 +:101E00001462000430C4007F108F000238AA0080E2 +:101E100000C0502151AF000131C800FF1518FFC9A3 +:101E2000010058218F8400343082007F0342182142 +:101E30003C02000A006218212402FF800082202454 +:101E4000AF440024A06A0079A06A00838C6200502D +:101E50008F840034AC6200708C6500743C027FFF9C +:101E60003442FFFF00A228240E000703AC65007473 +:101E7000AF5000248FBF00148FB0001003E00008A3 +:101E800027BD001827BDFFC0AFBE0038AFB7003474 +:101E9000AFB5002CAFB20020AFB1001CAFB000183E +:101EA000AFBF003CAFB60030AFB40028AFB30024E2 +:101EB0008F4500248F4600288F43002C3C02001FD2 +:101EC0003442FF800062182400C230240080A82120 +:101ED000AFA3001400A2F0240E0006C7AFA60010A6 +:101EE0003C0208008C4200E02410FF80036088213F +:101EF00002A2102100501024AF4200243C0208002E +:101F00008C4200E002A210213042007F03421821DF +:101F10003C02000A00629021924200D29363008446 +:101F2000305700FF306300FF2402000110620034CC +:101F30000360202124020002146200360000000029 +:101F40000E0012AE024028219223008392220083C9 +:101F50003063007F3042007F000210C00003194050 +:101F6000006218213C0208008C4200DC02A2102111 +:101F70000043382100F01024AF4200289225007859 +:101F80009224008330E2007F034218213C02000CBF +:101F900014850007006280212402FFFFA24200F1A5 +:101FA0002402FFFFA64200F20A0007BF2402FFFF3F +:101FB00096020020A24200F196020022A64200F200 +:101FC0008E020024AE4200F492220083A24200F06E +:101FD0008E4200C8AE4200FC8E4200C4AE4200F801 +:101FE0008E220050AE4201008E4200CCAE4201046F +:101FF000922200853042003F0A00081A3442004015 +:102000000E0012D102402821922200850A00081AEF +:102010003042003F936200852403FFDF3042003FDF +:10202000A36200859362008500431024A3620085AB +:102030009363008393620078307400FF304200FFA6 +:1020400010540036240AFF803C0C000C3283007FC1 +:10205000000310C000031940006218213C02080070 +:102060008C4200DC268800013109007F02A2102189 +:102070000043382130E2007F0342182100EA102497 +:10208000AF420028006C80218E020024028A1824AE +:10209000006A5826AE02000C8E020024310800FFB0 +:1020A000AE02001096020014960300208E07001C5A +:1020B0003042FFFF3063FFFF8E06001800431023FD +:1020C00000021100000227C30040282100C4302371 +:1020D00000E2102B00C2302300E53823AE07001CBD +:1020E000AE06001896020020A602001496020022F6 +:1020F000A602001692220079304200FF1054000719 +:102100000000000051370001316800FF9222007882 +:10211000304200FF1448FFCD0100A021922200832D +:10212000A22200798E2200500A00087AAE220070A6 +:10213000A22200858E22004C2405FF80AE42010CB5 +:102140009222008534420020A2220085924200D1D2 +:102150003C0308008C6300DC305400FF3C020800A4 +:102160008C4200E400143140001420C002A3182166 +:1021700000C4202102A21021006438210046102151 +:102180000045182400E52824AF450028AF43002C63 +:102190003042007F924400D030E3007F0342282188 +:1021A000034318213C02000C006280213C02000E17 +:1021B000309600FF00A298211296002A000000002D +:1021C0008E02000C02002021026028211040002510 +:1021D000261000280E0006E2000000009262000DAA +:1021E00026830001307400FF3042007FA262000DA0 +:1021F0002404FF801697FFF0267300203C0208009D +:102200008C4200DC0000A02102A210210044102416 +:10221000AF4200283C0208008C4200E43C03080066 +:102220008C6300DC02A2102100441024AF42002C79 +:102230003C0208008C4200E402A318213063007FB6 +:1022400002A210213042007F0342202103431821C3 +:102250003C02000C006280213C02000E0A00083C97 +:10226000008298218E4200D8AE2200508E4200D8C3 +:10227000AE22007092250083924600D19223008303 +:10228000924400D12402FF8000A228243063007F02 +:10229000308400FF00A628250064182A1060000280 +:1022A00030A500FF38A50080A2250083A225007973 +:1022B0000E0006D5000000009222007E02A0202120 +:1022C000A222007A8E2300743C027FFF3442FFFF7B +:1022D000006218240E000703AE2300748FA20010C2 +:1022E000AF5E00248FBF003CAF4200288FBE003895 +:1022F0008FA200148FB700348FB600308FB5002C3A +:102300008FB400288FB300248FB200208FB1001C3F +:102310008FB0001827BD004003E00008AF42002C3A +:1023200090A2000024420001A0A200003C0308008B +:102330008C6300F4304200FF1443000F0080302112 +:10234000A0A000003C0208008C4200E48F8400340E +:10235000008220213082007F034218213C02000CC1 +:10236000006218212402FF8000822024ACC30000F8 +:1023700003E00008AF4400288C82000024420020C3 +:1023800003E00008AC82000094C200003C08080092 +:10239000950800CA30E7FFFF0080482101021021A4 +:1023A000A4C2000094C200003042FFFF00E2102BE4 +:1023B00054400001A4C7000094A200003C030800A0 +:1023C0008C6300CC24420001A4A2000094A200006F +:1023D0003042FFFF544300078F8600280107102B6F +:1023E000A4A000005440000101003821A4C700004F +:1023F0008F8600288CC4001CAF44003C94A20000CF +:102400008F43003C3042FFFF000210C000621821E1 +:10241000AF43003C8F42003C008220231880000420 +:10242000000000008CC200180A0008DB24420001F2 +:102430008CC20018AF4200383C02005034420010F9 +:10244000AF4200300000000000000000000000006B +:102450008F420000304200201040FFFD00000000CD +:102460008F420404AD2200048F420400AD2200001C +:102470003C020020AF42003003E0000800000000F2 +:1024800027BDFFE0AFB20018AFB10014AFB000102D +:10249000AFBF001C94C2000000C080213C120800A5 +:1024A000965200C624420001A602000096030000D6 +:1024B00094E2000000E03021144300058FB10030A9 +:1024C0000E0008B0024038210A00090D000000008B +:1024D0008C8300048C8200042442004004610007C5 +:1024E000AC8200048C820004044000040000000060 +:1024F0008C82000024420001AC82000096020000A1 +:102500003042FFFF50520001A6000000962200005A +:1025100024420001A62200008F820028962300009A +:1025200094420016144300048FBF001C24020001D3 +:10253000A62200008FBF001C8FB200188FB10014BC +:102540008FB0001003E0000827BD00208F8900280D +:1025500027BDFFE0AFBF00188D22002827480400E8 +:1025600030E700FFAF4200388D22002CAF880030EA +:10257000AF42003C3C020005AF42003000000000CA +:10258000000000000000000000000000000000004B +:10259000000000008C82000C8C82000CAD02000058 +:1025A0008C820010AD0200048C820018AD0200087D +:1025B0008C82001CAD02000C8CA20014AD02001035 +:1025C0008C820020AD02001490820005304200FF92 +:1025D00000021200AD0200188CA20018AD02001C0F +:1025E0008CA2000CAD0200208CA20010AD020024D1 +:1025F0008CA2001CAD0200288CA20020AD02002C91 +:10260000AD060030AD000034978300263402FFFF92 +:1026100014620002006020213404FFFF10E000116A +:10262000AD040038952300369524003624020001BD +:102630003063FFFF000318C2006918219065004055 +:10264000308400070082100400451025A06200407D +:102650008F820028944200563042FFFF0A0009741E +:10266000AD02003C9523003695240036240200017B +:102670003063FFFF000318C2006918219065004015 +:102680003084000700821004000210270045102447 +:10269000A0620040AD00003C00000000000000000F +:1026A000000000003C02000634420040AF4200300F +:1026B0000000000000000000000000008F42000049 +:1026C000304200101040FFFD8F860028AF88003098 +:1026D00024C2005624C7003C24C4002824C500326C +:1026E00024C600360E0008EEAFA200108FBF0018FF +:1026F00003E0000827BD00208F8300243C0608006B +:102700008CC600E88F82003430633FFF00031980DD +:1027100000461021004310212403FF803046007F33 +:1027200000431024AF420028034618213C02000C4D +:102730000062302190C2000D30A500FF000038215A +:1027400034420010A0C2000D8F8900288F8A002417 +:1027500095230036000A138230480003240200014A +:10276000A4C3000E1102000B290200021040000554 +:10277000240200021100000C240300010A0009B821 +:102780000000182111020006000000000A0009B82C +:10279000000018218CC2002C0A0009B82443000153 +:1027A0008CC20014244300018CC200180043102B7B +:1027B00050400009240700012402002714A200034E +:1027C000000000000A0009C4240700019522003E11 +:1027D00024420001A522003E000A13823043000378 +:1027E0002C620002104000090080282114600004BF +:1027F0000000000094C200360A0009D43046FFFFF2 +:102800008CC600380A0009D400802821000030213D +:102810003C04080024844DD80A000921000000006F +:10282000274901008D22000C95230006012020215C +:10283000000216023046003F3063FFFF24020027EB +:1028400000C0282128C7002810C2000EAF83002432 +:1028500010E00008240200312402002110C2000907 +:102860002402002510C200079382002D0A0009F3FC +:102870000000000010C200059382002D0A0009F339 +:10288000000000000A00098C000000000A0006BEDB +:102890000000000095230006912400058D25000C02 +:1028A0008D2600108D2700188D28001C8D290020F2 +:1028B000244200013C010800A4234DDE3C01080035 +:1028C000A0244DDD3C010800AC254DE43C0108008E +:1028D000AC264DE83C010800AC274DF03C01080057 +:1028E000AC284DF43C010800AC294DF803E0000889 +:1028F000A382002D8F87002827BDFFC0AFB300340F +:10290000AFB20030AFB1002CAFB00028AFBF00387D +:102910003C0208008C4200D094E3003030B0FFFF4E +:10292000005010073045FFFF3063FFFF00C09821C3 +:10293000A7A200103C110800963100C614A300069F +:102940003092FFFF8CE2002424420030AF42003C72 +:102950000A000A2C8CE2002094E200323042FFFF91 +:1029600054A2000827A400188CE2002C2442003056 +:10297000AF42003C8CE20028AF4200380A000A3A1D +:102980008F84002827A5001027A6002002203821C8 +:102990000E0008B0A7A000208FA20018244200302B +:1029A000AF4200388FA2001CAF42003C8F84002849 +:1029B0003C020005AF4200309482003427430400FB +:1029C0003042FFFF0202102B14400007AF8300309B +:1029D0009482005494830034020210210043102397 +:1029E0000A000A4E3043FFFF94830054948200345F +:1029F0000223182100501023006218233063FFFFC8 +:102A0000948200163042FFFF1443000300000000D0 +:102A10000A000A5C24030001948200163042FFFF82 +:102A20000043102B104000058F8200309482001666 +:102A3000006210233043FFFF8F820030AC53000050 +:102A4000AC400004AC520008AC43000C3C02000651 +:102A500034420010AF4200300000000000000000CF +:102A6000000000008F420000304200101040FFFDC7 +:102A7000001018C20064182190650040320400075D +:102A8000240200018FBF00388FB300348FB20030B2 +:102A90008FB1002C8FB00028008210040045102553 +:102AA00027BD004003E00008A062004027BDFFA84A +:102AB000AFB60050AFB5004CAFB40048AFB3004460 +:102AC000AFB1003CAFBF0054AFB20040AFB0003870 +:102AD0008C9000003C0208008C4200E88F86003495 +:102AE000960300022413FF8000C2302130633FFFB1 +:102AF0000003198000C3382100F3102490B20000B5 +:102B0000AF42002C9203000230E2007F03423021EA +:102B10003C02000E00C28821306300C02402004045 +:102B20000080A82100A0B021146200260000A0218E +:102B30008E3400388E220018144000022402000156 +:102B4000AE2200189202000D304200201440001501 +:102B50008F8200343C0308008C6300DC001238C014 +:102B6000001231400043102100C7302100463821B7 +:102B700030E300073C02008030E6007800C23025D8 +:102B80000343182100F31024AF4208002463090016 +:102B9000AF4608108E2200188C63000800431021F5 +:102BA000AE2200188E22002C8E2300182442000131 +:102BB0000062182B1060003D000000000A000B109E +:102BC00000000000920300022402FFC00043102412 +:102BD000304200FF1440000524020001AE2200181C +:102BE000962200360A000AF93054FFFF8E220014A4 +:102BF00024420001AE2200189202000000021600DA +:102C000000021603044100290000000096020002A1 +:102C100027A4001000802821A7A200169602000217 +:102C200024070001000030213042FFFFAF82002462 +:102C30000E000921AFA0001C960300023C0408000E +:102C40008C8400E88F82003430633FFF00031980DA +:102C500000441021004310213043007F3C05000C4C +:102C60000053102403431821AF42002800651821A7 +:102C70009062000D001221403042007FA062000DE2 +:102C80003C0308008C6300E48F8200340043102171 +:102C90000044382130E2007F03421021004510211A +:102CA00000F31824AF430028AEA200009222000DCA +:102CB000304200101040001302A020218F83002812 +:102CC0008EA40000028030219462003E2442FFFF67 +:102CD000A462003E948400029625000E3084FFFF1B +:102CE0000E000A0B30A5FFFF8F82002894430034AA +:102CF0009622000E1443000302A0202124020001AA +:102D0000A382002C02C028210E00089600000000BB +:102D10008FBF00548FB600508FB5004C8FB4004861 +:102D20008FB300448FB200408FB1003C8FB00038A9 +:102D300003E0000827BD00588F82002827BDFFD080 +:102D4000AFB40028AFB20020AFBF002CAFB3002457 +:102D5000AFB1001CAFB00018904400D0904300D138 +:102D60000000A021309200FFA3A30010306300FFF9 +:102D70008C5100D88C5300DC1072002B240200010F +:102D80003C0308008C6300E493A400108F8200349D +:102D90002406FF800004214000431021004410213C +:102DA0003043007F00461024AF420028034318211F +:102DB0003C02000C006218218C62000427A400145D +:102DC00027A5001002228021027010230440001564 +:102DD000AFA300149062000D00C21024304200FF27 +:102DE00014400007020088219062000D3442004028 +:102DF0000E000896A062000D0A000B5593A2001069 +:102E00000E000A79241400018F830028AC7000D8CA +:102E100093A20010A06200D193A200101452FFD818 +:102E20000000000024020001168200048FBF002C65 +:102E30000E0006BE000000008FBF002C8FB40028DB +:102E40008FB300248FB200208FB1001C8FB0001808 +:102E500003E0000827BD003027BDFFD8AFB3001C3A +:102E6000AFB20018AFB10014AFB00010AFBF002078 +:102E70000080982100E0802130B1FFFF0E00052B7B +:102E800030D200FF00000000000000000000000041 +:102E90008F820020AC510000AC520004AC530008FB +:102EA000AC40000CAC400010AC400014AC4000182A +:102EB0003C03080094634DBE02038025AC50001C07 +:102EC00000000000000000000000000024040001D9 +:102ED0008FBF00208FB3001C8FB200188FB1001479 +:102EE0008FB000100A00055027BD002827BDFFE85D +:102EF000AFB00010AFBF001430A5FFFF30C600FF19 +:102F00000080802124020C80AF42002400000000D9 +:102F100000000000000000000000000000000000B1 +:102F20000E000B64000000003C040800248400E054 +:102F30008C8200002403FF808FBF00140202102146 +:102F400000431024AF4200248C8200003C03000A9E +:102F5000020280213210007F035010218FB0001038 +:102F60000043102127BD001803E00008AF820028AD +:102F700027BDFFE8AFBF00108F4401403C030800AD +:102F80008C6300E02402FF80AF84003400831821AA +:102F900000621024AF4200243C020008034240219A +:102FA000950500023063007F3C02000A03431821AC +:102FB0000062182130A5FFFF3402FFFF000030211E +:102FC0003C07602010A20006AF8300282402FFFF08 +:102FD000A5020002946500D40E000B8930A5FFFF06 +:102FE0008FBF001024020C8027BD001803E00008EA +:102FF000AF4200243C020008034240219502000237 +:103000003C0A0800954A00C63046FFFF14C000077E +:103010003402FFFF8F8200288F8400343C07602039 +:10302000944500D40A000BF230A5FFFF10C2002423 +:103030008F87002894E2005494E400163045FFFF87 +:1030400000A6102300A6182B3089FFFF1060000493 +:103050003044FFFF00C51023012210233044FFFF3E +:10306000008A102B1040000C012A102324020001BA +:10307000A50200162402FFFFA502000294E500D479 +:103080008F8400340000302130A5FFFF3C07602012 +:103090000A000B89000000000044102A10400008BC +:1030A00000000000950200163042000110400004AC +:1030B000000000009742007E24420014A502001682 +:1030C00003E00008000000008F84002827BDFFE017 +:1030D000AFBF0018948200349483003E1060001A41 +:1030E0003048FFFF9383002C240200011462002764 +:1030F0008FBF00188F820028000818C2310800070F +:10310000006218212447003A244900542444002036 +:10311000244500302446003490620040304200FFD5 +:103120000102100730420001104000168FBF001846 +:103130000E0008EEAFA900108F82002894420034E0 +:103140000A000C0B3048FFFF948300369482003451 +:103150001043000E8FBF001894820036A482003402 +:1031600094820056A48200548C82002CAC820024ED +:1031700094820032A48200309482003CA482003AFF +:103180008FBF00180A000BCB27BD002003E000080A +:1031900027BD002027BDFFE8AFBF00108F4A010008 +:1031A0003C0508008CA500E03C02080090424DE47C +:1031B0003C0C0800958C4DDE01452821304B003F2A +:1031C00030A2007F03424021396900323C02000AEC +:1031D0003963003F2C630001010240212D290001C9 +:1031E0002402FF8000A2282401234825AF8A00344E +:1031F00000801821AF4500240000302100802821E4 +:1032000024070001AF8800283C04080024844DD81E +:10321000AF8C002415200007A380002D240200207D +:103220005562000F006020213402FFFF5582000C20 +:10323000006020212402002015620005000000002B +:103240008C6300142402FFFF1062000700000000DE +:103250000E000921000000000A000C6800000000B8 +:103260000E00098C016028210E000C0000000000F7 +:103270008FBF001024020C8027BD001803E0000857 +:10328000AF4200243C0208008C4200E027BDFFA0B2 +:10329000AFB1003C008210212411FF80AFBE005866 +:1032A000AFB70054AFB20040AFB00038AFBF005C62 +:1032B000AFB60050AFB5004CAFB40048AFB3004458 +:1032C000005110248F4800248F4900288F47002880 +:1032D000AF4200243C0208008C4200E000809021B4 +:1032E00024060006008210213042007F034218218C +:1032F0003C02000A006280213C02001F3442FF8031 +:1033000000E2382427A40010260500F00122F02452 +:103310000102B8240E0005B5AFA700308FA2001837 +:10332000AE0200C48FA2001CAE0200C88FA200240F +:10333000AE0200CC93A40010920300D12402FF80BF +:103340000082102400431025304900FF3083007FA5 +:103350003122007F0062102A10400004000310C0D8 +:1033600001311026304900FF000310C0000319404E +:10337000006218213C0208008C4200DC920400D25A +:10338000024210210043102100511024AF420028B6 +:1033900093A300103063007F000310C000031940A6 +:1033A000006218213C0208008C4200DC024210211D +:1033B000004310213042007F034218213C02000CE0 +:1033C000006240218FA300142402FFFF106200302E +:1033D000309500FF93A2001195030014304400FFC4 +:1033E0003063FFFF0064182B1060000D0000000028 +:1033F000950400148D07001C8D0600183084FFFF13 +:1034000000442023000421000000102100E43821A2 +:1034100000E4202B00C230210A000CE200C430215D +:10342000950400148D07001C8D0600183084FFFFE2 +:1034300000822023000421000000102100801821B8 +:1034400000C2302300E4202B00C4302300E33823E3 +:10345000AD07001CAD06001893A20011A5020014D0 +:1034600097A20012A50200168FA20014AD02001050 +:103470008FA20014AD02000C93A20011A50200203F +:1034800097A20012A50200228FA20014AD02002410 +:103490002406FF80024610243256007FAF420024EB +:1034A000035618213C02000A006280218E02004C63 +:1034B0008FA200203124007F000428C0AE020050FB +:1034C0008FA200200004214000852821AE02007058 +:1034D00093A2001001208821A202008393A2001071 +:1034E000A2020079920200853042003FA2020085CC +:1034F0003C0208008C4200DC0242102100451021F1 +:1035000000461024AF42002C3C0208008C4200E42C +:103510003C0308008C6300DC0242102100441021AF +:1035200000461024AF4200283C0208008C4200E410 +:103530000243182100651821024210210044102185 +:103540003042007F3063007F93A5001003422021AA +:10355000034318213C02000E006240213C02000C93 +:1035600010B1008C008248213233007F16600019B0 +:103570002404FF803C0208008C4200DC024210213F +:1035800000441024AF42002C3C0208008C4200E4AE +:103590003C0308008C6300DC02421021004410242C +:1035A000AF4200283C0208008C4200E4024318218C +:1035B0003063007F024210213042007F034220210D +:1035C000034318213C02000E006240213C02000C23 +:1035D000008248219124000D2414FF800000102156 +:1035E00000942025A124000D9504000295050014E7 +:1035F0008D07001C3084FFFF30A5FFFF8D060018EB +:10360000008520230004210000E4382100C230217D +:1036100000E4202B00C43021AD07001CAD060018CB +:1036200095020002A5020014A50000168D020008F4 +:10363000AD0200108D020008AD02000C95020002E0 +:10364000A5020020A50000228D020008AD02002482 +:103650009122000D3042004010400042262200011D +:103660003C0208008C4200E0A3B300283C10000A92 +:103670000242102100541024AF4200243C020800F2 +:103680008C4200E0A380002C27A4002C02421021D1 +:103690003042007F03421821007018218C6200D84C +:1036A0008D26000427A50028AFA9002C0046102174 +:1036B000AC6200D80E000A79AF83002893A30028DB +:1036C0008F8200280E0006BEA04300D10E000C0021 +:1036D0000000000002541024AF4200243C02080005 +:1036E0008C4200DC00132940001320C000A42021DC +:1036F000024210210044102100541024AF42002C3B +:103700003C0208008C4200E43C0308008C6300DCAF +:10371000035630210242102100451021005410248C +:10372000AF4200283C0208008C4200E4024318210A +:103730000064182102421021004510213042007F10 +:103740003063007F03422021034318213C02000E16 +:10375000006240213C02000C00D080210082482100 +:10376000262200013043007F14750005304400FF1D +:103770002403FF800223102400431026304400FF5E +:1037800093A2001000808821250800281444FF76A9 +:103790002529002093A400108FA300142402FFFF0A +:1037A0001062000A308900FF248200012483000196 +:1037B0003042007F14550005306900FF2403FF806C +:1037C0000083102400431026304900FF9202007845 +:1037D000305300FF11330032012088213C020800E1 +:1037E0008C4200DC3225007F000520C00005294006 +:1037F00000A42021024210212406FF800044102151 +:1038000000461024AF42002C3C0308008C6300DC0F +:103810003C0208008C4200E40243182102421021BD +:103820000045102100641821004610243063007FF9 +:10383000AF420028034318213C02000E00624021E1 +:103840003C0208008C4200E48D06000C010020219F +:1038500002421021004510213042007F034218210E +:103860003C02000C0062482110C0000D01202821FC +:103870000E0006E2000000002402FF80022218244D +:1038800026240001006228263082007F14550002A1 +:10389000308300FF30A300FF1473FFD00060882145 +:1038A0008E0300743C027FFF3442FFFF0062182445 +:1038B000AE0300740E00070302402021AF5700241E +:1038C0008FA20030AF5E00288FBF005C8FBE005813 +:1038D0008FB700548FB600508FB5004C8FB400489E +:1038E0008FB300448FB200408FB1003C8FB00038DE +:1038F00027BD006003E00008AF42002C27BDFFD8C1 +:10390000AFB1001CAFBF0020AFB000182751018835 +:10391000922200032408FF803C03000A3047007F06 +:10392000A3A700108F4601803C0208008C4200E0F3 +:10393000AF86003400C2282100A81024AF42002422 +:103940009224000030A2007F034210210043102186 +:10395000AF8200283084007F2402000214820025F8 +:10396000000719403C0208008C4200E400C210210C +:103970000043282130A2007F0342182100A8102410 +:10398000AF4200283C02000C006218219062000D3A +:10399000AFA3001400481025A062000D8FA30014EF +:1039A0009062000D304200405040006A8FBF0020FE +:1039B0008F860028A380002C27A400148CC200D876 +:1039C0008C63000427A50010004310210E000A7923 +:1039D000ACC200D893A300108F8200280E0006BE50 +:1039E000A04300D10E000C00000000000A000EA34E +:1039F0008FBF00200E0006C700C020210E0006D594 +:103A0000000000003C0200080342802192230001D4 +:103A10009202007B1443004F8FBF002092220000CF +:103A20003044007F24020004108200172882000521 +:103A30001040000624020005240200031082000743 +:103A40008FB1001C0A000EA40000000010820012BA +:103A50008FBF00200A000EA48FB1001C92050083C6 +:103A6000920600788E0700748F84003430A500FF22 +:103A700000073E0230C600FF0E00070B30E7007F54 +:103A80000A000EA38FBF00200E000C6F8F8400343D +:103A90000A000EA38FBF002024020C80AF42002436 +:103AA0009202003E30420040104000200000000022 +:103AB0009202003E000216000002160304410006B6 +:103AC000000000008F8400340E00063824050093A7 +:103AD0000A000EA38FBF00209202003F24030018AB +:103AE000304200FF1443000C8F8400342405003959 +:103AF0000E0005D0000030210E0003028F84003438 +:103B000024020012A202003F0E00030B8F84003437 +:103B10000A000EA38FBF0020240500360E0005D03A +:103B2000000030210A000EA38FBF00200E00030208 +:103B30008F8400349202000534420020A202000566 +:103B40000E00030B8F8400340E0010588F84003455 +:103B50008FBF00208FB1001C8FB0001824020C8092 +:103B600027BD002803E00008AF42002427BDFFE87E +:103B7000AFB00010AFBF00142743010094620008EB +:103B8000000214000002140304410002000080211E +:103B90002410000194620008304200801040001A96 +:103BA00002001021946200083042200010400016EC +:103BB000020010218C6300183C021C2D344219EDC8 +:103BC000240600061062000F3C0760213C0208003A +:103BD0008C4200D4104000078F8200288F83002879 +:103BE000906200623042000F34420040A0620062E6 +:103BF0008F8200288F840034944500D40E000B89F6 +:103C000030A5FFFF020010218FBF00148FB00010FD +:103C100003E0000827BD001827BDFFE0AFB1001486 +:103C2000AFB00010A380002CAFBF00188F4501007B +:103C30003C0308008C6300E02402FF80AF85003461 +:103C400000A318213064007F03442021006218245F +:103C50003C02000A00822021AF43002427500100CB +:103C60008E0200148C8300DCAF84002800431023F4 +:103C700018400004000088218E0200140E000B1C66 +:103C8000AC8200DC9202000B24030002304200FFF1 +:103C90001443002F0000000096020008304300FF8C +:103CA0002402008214620005240200840E0009D65A +:103CB000000000000A000F2F00000000146200093D +:103CC000240200818F8200288F8400343C07602109 +:103CD000944500D49206000530A5FFFF0A000F1E90 +:103CE00030C600FF14620027000000009202000AA4 +:103CF000304300FF3062002010400004306200407A +:103D00008F8400340A000F1A24060040104000047B +:103D1000000316008F8400340A000F1A24060041A5 +:103D200000021603044100178F8400342406004269 +:103D30008F8200283C076019944500D430A5FFFF0E +:103D40000E000B89000000000A000F2F0000000089 +:103D50009202000B24030016304200FF10430006BD +:103D6000000000009202000B24030017304200FF05 +:103D700014430004000000000E000EA90000000023 +:103D8000004088210E000C00000000009202000A92 +:103D9000304200081040000624020C808F85002865 +:103DA0003C0400080E0012860344202124020C80EB +:103DB000AF4200248FBF0018022010218FB00010E6 +:103DC0008FB1001403E0000827BD002027BDFFE8E5 +:103DD000AFBF0014AFB000108F5000243C030800A8 +:103DE0008C6300E08F4501002402FF8000A31821AE +:103DF0003064007F03442021006218243C02000A42 +:103E000000822021AF850034AF43002490820062FD +:103E1000AF8400283042000F34420050A08200627C +:103E20003C02001F3442FF800E0006BE02028024C6 +:103E3000AF5000248FBF00148FB0001003E00008C3 +:103E400027BD00183C0208008C4200201040001DD5 +:103E50002745010090A300093C02000803422021ED +:103E600024020018546200033C0200080A000F708C +:103E700024020008034220212402001614620005D7 +:103E80002402001724020012A082003F0A000F7AC9 +:103E900094A700085462000694A7000893620005E6 +:103EA0002403FFFE00431024A362000594A700082A +:103EB00090A6001B8CA4000094A500060A000B64C9 +:103EC00000073C0003E00008000000002744010058 +:103ED00094820008304500FF38A3008238A2008495 +:103EE0002C6300012C4200010062182510600006BE +:103EF000240200839382002D1040000D000000007A +:103F00000A000C330000000014A2000524A2FF8068 +:103F10008F4301043C02602003E00008AC4300141E +:103F2000304200FF2C420002104000032402002215 +:103F30000A000ED40000000014A2000300000000DC +:103F40000A000F41000000000A000F5F000000009F +:103F50009363007E9362007A1443000900002021DD +:103F60009362000024030050304200FF1443000419 +:103F7000240400019362007E24420001A362007EBB +:103F800003E00008008010218F4201F80440FFFE8A +:103F900024020002AF4401C0A34201C43C0210004D +:103FA00003E00008AF4201F827BDFFE8AFBF0010F3 +:103FB0009362003F2403000A304200FF144300468E +:103FC000000000008F6300548F62004C1062007D7F +:103FD000036030219362000024030050304200FF50 +:103FE0001443002F000000008F4401403C020800F1 +:103FF0008C4200E02403FF80008210210043102443 +:10400000AF4200243C0208008C4200E08F6500545F +:104010003C03000A008220213084007F03441021E9 +:1040200000431021AC4501089762003C8F63004CAF +:104030003042FFFF0002104000621821AF63005CB5 +:104040008F6300548F64004C9762003C0064182317 +:104050003042FFFF00031843000210400043102AC3 +:1040600010400006000000008F6200548F63004C77 +:10407000004310230A000FF0000210439762003C37 +:104080003042FFFF00021040ACC200642402000175 +:10409000A0C0007CA0C2008424020C80AF42002497 +:1040A0000E000FA28F440140104000478FBF001048 +:1040B0008F4301408F4201F80440FFFE24020002BA +:1040C000AF4301C0A34201C43C021000AF4201F85B +:1040D0000A0010408FBF00109362003F24030010BD +:1040E000304200FF14430004000000008F440140F0 +:1040F0000A00102C000028219362003F24030016C0 +:10410000304200FF1443000424020014A362003F65 +:104110000A00103A000000008F62004C8F630050CC +:1041200000431023044100288FBF001093620081D8 +:1041300024420001A3620081936200812C420004AA +:1041400014400010000000009362003F24030004AC +:10415000304200FF14430006000000008F4401407D +:104160008FBF0010240500930A00063827BD0018F1 +:104170008F440140240500938FBF00100A0006A75A +:1041800027BD00188F4401400E000302000000000C +:104190008F6200542442FFFFAF6200548F620050D0 +:1041A0002442FFFFAF6200500E00030B8F4401401A +:1041B0008F4401408FBF0010240500040A00031043 +:1041C00027BD00188FBF001003E0000827BD0018AE +:1041D0008F4201889363007E00021402304400FF86 +:1041E000306300FF1464000D000000009362008043 +:1041F000304200FF1044000900000000A36400806A +:104200009362000024030050304200FF1443000476 +:10421000000000000A00076F8F440180A364008043 +:1042200003E000080000000027BDFFE8AFB0001069 +:10423000AFBF001493620005240300303042003009 +:1042400014430089008080213C0208008C42002039 +:1042500010400080020020210E00052B000000000D +:104260008F850020ACB000009362003E9363003F56 +:10427000304200FF00021200306300FF00431025AF +:10428000ACA2000493620082000216000002160332 +:1042900004410005000000003C0308008C63004856 +:1042A0000A00107E000000009362003E3042004091 +:1042B000144000030000182193620081304300FF86 +:1042C0009362008200031E00304200FF00021400CF +:1042D00000621825ACA300088F620040ACA2000C5D +:1042E0008F620048ACA200108F62004CACA2001498 +:1042F0008F6200508F63004C004310230441000381 +:10430000000000000A0010928F62004C8F62005083 +:10431000ACA200183C02080094424DBE3C03C00B06 +:1043200000002021004310250E000550ACA2001C07 +:104330008F6200548F840020AC8200008F6200588E +:10434000AC8200048F62005CAC8200088F62006067 +:104350008F43007400431021AC82000C8F62006414 +:10436000AC820010976300689762006A00031C002B +:104370003042FFFF00621825AC8300149362008274 +:1043800024030080304200FF1443000300000000BB +:104390000A0010C6AC8000188F63000C24020001D4 +:1043A0001062000E2402FFFF9362003E3042004084 +:1043B0001440000A2402FFFF8F63000C8F42007438 +:1043C000006218233C02080000621024144000021E +:1043D000000028210060282100051043AC8200184D +:1043E0003C02080094424DBE3C03C00C000020215A +:1043F000004310258F8300200E000550AC62001C86 +:104400008F6200188F8300203C05080094A54DBEE4 +:1044100024040001AC620000AC6000048F66006CF4 +:104420003C02400D00A22825AC6600088F6200DC2B +:10443000AC62000CAC600010936200050002160034 +:10444000AC620014AC6000180E000550AC65001C96 +:10445000020020218FBF00148FB00010A360000560 +:104460000A0004B927BD00188FBF00148FB00010D8 +:1044700003E0000827BD00189742007C30C600FF0B +:10448000A08600843047FFFF2402000514C2000B01 +:1044900024E3465090A201122C420007104000076E +:1044A00024E30A0090A30112240200140062100405 +:1044B00000E210210A0010FE3047FFFF3067FFFFC7 +:1044C00003E00008A4870014AC87004C8CA201080C +:1044D0000080402100A0482100E2102330C600FFE8 +:1044E0001840000393AA001324E2FFFCACA20108C9 +:1044F00030C2000110400008000000008D02005092 +:1045000000E2102304410013240600058D0200542C +:1045100010E20010000000008D02005414E2001AA6 +:10452000000000003C0208008C4200D8304200200D +:104530001040000A240200019103007891020083D8 +:10454000144300062402000101002021012028213B +:10455000240600040A0010EC00000000A100008402 +:1045600011400009A50200148F4301008F4201F899 +:104570000440FFFE24020002AF4301C0A34201C475 +:104580003C021000AF4201F803E000080000000008 +:1045900027BDFFE88FA90028AFBF00100080402191 +:1045A00000E918231860007330C600FFA080007C6B +:1045B000A08000818CA2010800E210230440004D7D +:1045C000000000008C8200509483003C8C840064C6 +:1045D000004748233063FFFF012318210083202B6D +:1045E00010800004000000008D0200640A00114FDA +:1045F00000E210219502003C3042FFFF0122102111 +:1046000000E21021AD02005C9502003C8D03005CCD +:104610003042FFFF0002104000E210210043102B47 +:1046200010400003000000000A00115E8D02005CD3 +:104630009502003C3042FFFF0002104000E21021D2 +:10464000AD02005CA1000084AD07004C8CA2010803 +:1046500000E210231840000224E2FFFCACA2010893 +:1046600030C200011040000A000000008D0200501E +:1046700000E2102304410004010020218D020054B7 +:1046800014E20003000000000A0011802406000567 +:104690008D02005414E200478FBF00103C02080056 +:1046A0008C4200D8304200201040000A2402000151 +:1046B0009103007891020083144300062402000154 +:1046C00001002021240600048FBF00100A0010EC16 +:1046D00027BD0018A1000084A50200148F4301002B +:1046E0008F4201F80440FFFE240200020A0011A5D7 +:1046F000000000008C82005C004910230043102B56 +:1047000054400001AC87005C9502003C3042FFFF42 +:104710000062102B14400007240200029502003CA6 +:104720008D03005C3042FFFF00621821AD03005C86 +:1047300024020002AD07004CA10200840E000FA26B +:104740008F4401001040001B8FBF00108F430100F9 +:104750008F4201F80440FFFE24020002AF4301C073 +:10476000A34201C43C021000AF4201F80A0011BB91 +:104770008FBF001030C200101040000E8FBF00101D +:104780008C83005C9482003C006918233042FFFF58 +:10479000006218213C023FFF3444FFFF0083102BCE +:1047A000544000010080182101231021AD02005C5B +:1047B0008FBF001003E0000827BD001827BDFFE8E9 +:1047C0008FAA0028AFBF00100080402100EA4823D4 +:1047D0001920002130C600FF8C83005C8C820064AD +:1047E000006A18230043102B504000100069182164 +:1047F00094A2011001221021A4A2011094A2011080 +:104800003042FFFF0043102B1440000A3C023FFFE0 +:1048100094A2011000431023A4A201109482003C32 +:104820003042FFFF0A0011DA00621821A4A0011033 +:104830003C023FFF3444FFFF0083102B5440000133 +:104840000080182100671021AD02005CA100007CEF +:104850000A001222A100008130C200101040003C6A +:10486000000000008C820050004A102318400038DD +:10487000000000009082007C24420001A082007CA5 +:104880009082007C3C0308008C630024304200FFCF +:104890000043102B1440005C8FBF00108CA2010855 +:1048A00000E2102318400058000000008C830054E0 +:1048B0009482003C006A18233042FFFF0003184333 +:1048C000000210400043102A1040000500000000C4 +:1048D0008C820054004A10230A001209000210437F +:1048E0009482003C3042FFFF00021040AD020064A1 +:1048F0009502003C8D0400649503003C3042FFFFAC +:1049000000021040008220213063FFFF0083182145 +:1049100001431021AD02005C8D020054ACA20108DD +:1049200024020002A10200840E000FA28F440100A5 +:10493000104000358FBF00108F4301008F4201F8F7 +:104940000440FFFE240200020A00124B0000000097 +:10495000AD07004C8CA2010800E2102318400002B1 +:1049600024E2FFFCACA2010830C200011040000AA2 +:10497000000000008D02005000E2102304410004FA +:10498000010020218D02005414E200030000000009 +:104990000A001242240600058D02005414E2001A97 +:1049A0008FBF00103C0208008C4200D8304200202B +:1049B0001040000A24020001910300789102008354 +:1049C00014430006240200010100202124060004F3 +:1049D0008FBF00100A0010EC27BD0018A100008452 +:1049E000A50200148F4301008F4201F80440FFFE2E +:1049F00024020002AF4301C0A34201C43C021000E4 +:104A0000AF4201F88FBF001003E0000827BD001877 +:104A10008FAA00108C8200500080402130C600FF19 +:104A2000004A102300A048211840000700E0182188 +:104A300024020001A0800084A0A00112A48200141E +:104A40000A0011BDAFAA0010A0800081AD07004C84 +:104A50008CA2010800E210231840000224E2FFFCAF +:104A6000ACA2010830C200011040000800000000A4 +:104A70008D0200500062102304410013240600053B +:104A80008D02005410620010000000008D020054DE +:104A900014620011000000003C0208008C4200D8A3 +:104AA000304200201040000A2402000191030078E7 +:104AB000910200831443000624020001010020211A +:104AC00001202821240600040A0010EC0000000048 +:104AD000A1000084A502001403E00008000000000B +:104AE00027BDFFE0AFBF0018274201009046000A33 +:104AF0008C4800148C8B004C9082008430C900FFDD +:104B000001681823304A00FF1C60001A2D46000679 +:104B1000240200010142100410C0001630430003BB +:104B2000012030210100382114600007304C000CB6 +:104B300015800009304200301440000B8FBF001870 +:104B40000A0012AC000000000E0011BDAFAB001057 +:104B50000A0012AC8FBF00180E001132AFAB00106C +:104B60000A0012AC8FBF0018AFAB00100E0012523B +:104B7000AFAA00148FBF001803E0000827BD002073 +:104B800024020003A08200848C82005403E0000809 +:104B9000ACA201083C020008034218219062008187 +:104BA000240600433C07601924420001A0620081F2 +:104BB000906300813C0208008C4200C0306300FF1B +:104BC000146200102403FF803C0208008C4200E0C5 +:104BD0000082102100431024AF4200243C02080050 +:104BE0008C4200E03C03000A008210213042007F2A +:104BF0000342102100431021944500D40A000B8980 +:104C000030A5FFFF03E000080000000027BDFFE023 +:104C1000AFBF0018AFB10014AFB000108F420180D9 +:104C20000080802100A088210E0012B300402021C6 +:104C3000A20000848E0200548FBF00188FB00010B5 +:104C4000AE2201088FB1001403E0000827BD002048 +:104C500027BDFFE03C020008AFB00010AFBF001856 +:104C6000AFB10014034280218F51014092030084B0 +:104C70008E0400508E02004C14820040306600FF0B +:104C80003C0208008C4200E02403FF800222102135 +:104C900000431024AF4200243C0208008C4200E094 +:104CA0009744007C92050081022210213042007F4F +:104CB000034218213C02000A0062182114A0000BD4 +:104CC0003084FFFF2402000554C20014248205DC56 +:104CD0009062011224420001A062011224020C80A1 +:104CE000AF4200240A00130B24020005A060011249 +:104CF0002402000514C20009248205DC920200810E +:104D00002C4200075040000524820A0092030081D3 +:104D10002402001400621004008210213044FFFFBE +:104D2000A60400140E0012B3022020219602003CBB +:104D30008E03004C022020213042FFFF0002104071 +:104D4000006218210E000302AE03005C9202007D97 +:104D500002202021344200400E00030BA202007DFD +:104D60008F4201F80440FFFE24020002AF5101C04F +:104D7000A34201C43C021000AF4201F88FBF0018EB +:104D80008FB100148FB0001003E0000827BD002091 +:104D900008000D9808000DE008000E2008000E6CB9 +:044DA00008000EA059 +:0C4DA4000A0000220000000000000000D7 +:104DB0000000000D6370352E302E306A3300000085 +:104DC00005000004000000000000000000000000DA +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000020A3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000191 +:104E20000000002B00000000000000000000000057 +:104E300010000003000000000000000D0000000D45 +:104E40003C02080024425AC43C03080024636190D9 +:104E5000AC4000000043202B1480FFFD24420004DE +:104E60003C1D080037BD7FFC03A0F0213C1008006A +:104E7000261000883C1C0800279C5AC40E0001A67E +:104E8000000000000000000D27BDFFE83C0960188D +:104E9000AFBF00108D2C5000240DFF7F240800317F +:104EA000018D5824356A380C24070C003C1A800008 +:104EB000AD2A50003C04800AAF4800083C1B800823 +:104EC000AF4700240E000938AF8400100E0008FB25 +:104ED000000000000E000848000000000E0012DF75 +:104EE000000000003C0460168C8500003C06FFFFBB +:104EF0003C02535300A618241062004734867C00FD +:104F000094C201F2A780002C10400003A78000CCBF +:104F100038581E1EA798002C94C201F810400004B7 +:104F2000978300CC38591E1EA79900CC978300CCDC +:104F30002C7F006753E00001240300669784002C57 +:104F40002C82040114400002006028212404040083 +:104F50003C0760008CE904382403103C3128FFFF33 +:104F60001103001F30B9FFFF57200010A38000CEAF +:104F700024020050A38200CE939F00CE53E0000F86 +:104F8000A78500CCA78000CC978500CC8FBF0010F0 +:104F9000A780002CA7800034A78000E63C01080011 +:104FA000AC25008003E0000827BD0018939F00CEC9 +:104FB00057E0FFF5A78000CCA78500CC978500CCF3 +:104FC0008FBF0010A784002CA7800034A78000E6C4 +:104FD0003C010800AC25008003E0000827BD001854 +:104FE000A38000CE8CCB003C316A00011140000E42 +:104FF0000000000030A7FFFF10E0FFDE2402005099 +:105000008CCC00C83186000114C0FFDC939F00CE19 +:105010000A000074240200518C8F00043C0E6000D2 +:105020000A00005701EE30218CEF0808240D5708C4 +:10503000000F740211CD000430B8FFFF2405006694 +:105040000A000075240404001700FFCC939F00CED3 +:105050000A000074240200508F8600103089FFFF80 +:10506000000939408CC300103C08005000E820259E +:10507000AF4300388CC5001427420400AF82001CE7 +:10508000AF45003CAF4400300000000000000000CD +:105090000000000000000000000000000000000010 +:1050A00000000000000000008F4B0000316A00206B +:1050B0001140FFFD0000000003E0000800000000B8 +:1050C0008F840010948A001A8C8700243149FFFFD6 +:1050D000000940C000E83021AF46003C8C85002428 +:1050E0008F43003C00A3102318400029000000005B +:1050F0008C8B0020256200013C0D005035AC00086F +:10510000AF420038AF4C003000000000000000004B +:10511000000000000000000000000000000000008F +:1051200000000000000000008F4F000031EE002062 +:1051300011C0FFFD000000008F4A04003C08002061 +:10514000AC8A00108F490404AC890014AF480030C9 +:1051500000000000948600189487001C00C71821E6 +:10516000A48300189485001A24A20001A482001AC6 +:105170009498001A9499001E133800030000000050 +:1051800003E000080000000003E00008A480001A0B +:105190008C8200200A0000D63C0D00500A0000C797 +:1051A000000000003C0308008C6300208F82001880 +:1051B00027BDFFE810620008AFBF00100E0000FE20 +:1051C000AF8300183C0308008C6300202404000116 +:1051D000106400048F8900108FBF001003E00008E6 +:1051E00027BD00188FBF00103C076012A520000AE1 +:1051F0009528000A34E5001027BD00183106FFFF8E +:1052000003E00008ACA600903C0208008C4200209D +:1052100027BDFFC8AFBF0034AFBE0030AFB7002C12 +:10522000AFB60028AFB50024AFB40020AFB3001C68 +:10523000AFB20018AFB1001410400050AFB0001072 +:105240008F840010948600069483000A00C32823EC +:1052500030B6FFFF12C0004A8FBF00349489001897 +:10526000948A000A012A40233102FFFF02C2382B30 +:1052700014E0000202C02021004020212C8C0005F7 +:10528000158000020080A021241400040E0000AD4F +:10529000028020218F87001002809821AF800014A7 +:1052A00094ED000A028088211280004E31B2FFFF87 +:1052B0003C1770003C1540003C1E60008F8F001CA6 +:1052C0008DEE000001D718245075005002202021D7 +:1052D00002A3802B160000353C18200050780047B0 +:1052E00002202021241000018F8300141460003953 +:1052F000029158230230F8230250C82133F1FFFFF6 +:105300001620FFEE3332FFFF8F8700103C11002084 +:10531000AF5100300000000094E6000A3C1E60120D +:1053200037D5001002662821A4E5000A94E2000A9D +:1053300094F2000A94F400183057FFFF1292003BD9 +:10534000AEB700908CED00148CE400100013714097 +:1053500001AE4021000E5FC3010E502B008B48218F +:10536000012A1821ACE80014ACE3001002D3382362 +:1053700030F6FFFF16C0FFB98F8400108FBF0034D6 +:105380008FBE00308FB7002C8FB600288FB5002459 +:105390008FB400208FB3001C8FB200188FB100149F +:1053A0008FB0001003E0000827BD0038107E001BFE +:1053B000000000001477FFCC241000010E00162A14 +:1053C000000000008F8300141060FFCB0230F82330 +:1053D000029158238F870010017020210A0001914B +:1053E0003093FFFF8F8300141460FFCB3C1100202B +:1053F000AF5100300A00015D000000000E0007A15F +:10540000024028210A000151004080210E00034B78 +:10541000024028210A000151004080210E0014F2B0 +:10542000022020210A000151004080210E0000C707 +:10543000000000000A00017302D3382327BDFFE8F3 +:10544000AFB00010AFBF00140E0000390000000024 +:105450003C028000345000700A0001B48E06000047 +:105460008F4F000039EE000131C2000110400024CE +:105470008F8600A88E0700003C0C08008D8C003C35 +:105480003C0908008D29003800E66823018D282199 +:105490000000502100AD302B012A402101062021BF +:1054A0003C010800AC25003CAF8700A83C01080087 +:1054B000AC2400380E000100000000003C0308008E +:1054C0008C6300701060FFE6006020213C0508003E +:1054D0008CA500683C0608008CC6006C0E0015B94F +:1054E000000000003C010800AC2000708F4F00005D +:1054F00039EE000131C200011440FFDE8F8600A8A2 +:105500008E0A00008F8B00A83C0508008CA5003C8B +:105510003C0408008C840038014B482300A9382142 +:105520000082182100E9402B006810213C0108008E +:10553000AC27003C3C010800AC2200388F5F010022 +:105540002419FF0024180C0003F9202410980012DD +:10555000AF840000AF440020936D0000240C0020B5 +:1055600031A600FF10CC0012240E005010CE000413 +:105570003C194000AF5901380A0001AD000000009D +:105580000E001255000000003C194000AF590138D0 +:105590000A0001AD000000000E000119000000002B +:1055A0003C194000AF5901380A0001AD000000006D +:1055B0008F58010000802821330F00FF01E02021D7 +:1055C0000E0002F8AF8F00043C194000AF590138BB +:1055D0000A0001AD0000000000A4102B240300010C +:1055E00010400009000030210005284000A4102BC5 +:1055F00004A00003000318405440FFFC00052840AD +:105600005060000A0004182B0085382B54E0000479 +:105610000003184200C330250085202300031842F0 +:105620001460FFF9000528420004182B03E000086D +:1056300000C310213084FFFF30A5FFFF8F4201B867 +:105640000440FFFE3C074080008730253C031000EB +:10565000AF400180AF450184AF46018803E00008F8 +:10566000AF4301B83084FFFF8F4201B80440FFFE12 +:105670003C0740388CA60000008728253C0310001A +:10568000AF460180AF45018803E00008AF4301B891 +:105690008F8300388F8600301066000B0080402119 +:1056A0003C07080024E75C38000328C000A710214D +:1056B0008C44000024630001108800053063000F53 +:1056C0005466FFFA000328C003E000080000102120 +:1056D0003C07080024E75C3C00A7302103E00008F9 +:1056E0008CC200003C03900034620001008220253F +:1056F000AF4400208F45002004A0FFFE0000000002 +:1057000003E00008000000003C0380003462000158 +:105710000082202503E00008AF44002027BDFFE001 +:10572000AFB100143091FFFFAFB00010AFBF001851 +:105730001220001500A080218CA5000010A00013ED +:10574000240400020E000C7F24060140AE0000007D +:105750008F4201B80440000D000028213C064000A3 +:10576000022620258FBF00188FB100148FB00010C3 +:105770003C03100027BD0020AF450180AF440188E5 +:1057800003E00008AF4301B88CA500008F4201B8C8 +:105790000440FFFE3C064000022620258FBF001873 +:1057A0008FB100148FB000103C03100027BD002003 +:1057B000AF450180AF44018803E00008AF4301B862 +:1057C0003086FFFF8F4201B80440FFFE3C094006CF +:1057D0008CA8000000C93825AF4801808CA40004C3 +:1057E0003C031000AF440184AF47018803E0000888 +:1057F000AF4301B827BDFFE0AFB00010AFBF001846 +:10580000AFB100149363003E008080210080282106 +:1058100030620040000020211040000F8E11000077 +:105820000E00087402202021936700002404005019 +:1058300030E500FF50A400128E0F0000022020214E +:105840008FBF00188FB100148FB00010A762013C09 +:105850000A00093427BD00200E0002870000000066 +:105860000E000874022020219367000024040050D9 +:1058700030E500FF14A4FFF2022020218E0F00006B +:105880003C1008008E1000503C0D000C240BFF80D3 +:1058900001F05021314E007F01DA6021018D40215D +:1058A000014B4824AF490028022020218FBF001857 +:1058B0008FB100148FB00010A50200D627BD0020C4 +:1058C0000A000934AF8800D027BDFFE0AFBF001841 +:1058D000AFB10014AFB000109366000100808021CA +:1058E0000E00025030D1000493640005001029C25C +:1058F000A765000034830040A36300050E00025931 +:10590000020020210E00093602002021240200019D +:10591000AF62000C02002821A762001024040002DC +:10592000A762001224060140A76200140E000C7F3B +:10593000A76200161620000F8FBF0018978C003446 +:105940003C0B08008D6B00782588FFFF3109FFFFB5 +:10595000256A0001012A382B10E00006A7880034D0 +:105960003C0F6006240E001635ED0010ADAE005061 +:105970008FBF00188FB100148FB0001003E0000833 +:1059800027BD002027BDFFE0AFB10014AFBF001856 +:10599000AFB0001000A088211080000A3C03600016 +:1059A0002402008010820012000000000000000DA0 +:1059B0008FBF00188FB100148FB0001003E00008F3 +:1059C00027BD00208C682BF80500FFFE00000000BA +:1059D000AC712BC08FBF00188FB100148FB00010B6 +:1059E0003C09100027BD002003E00008AC692BF83B +:1059F0000E00025000A02021936500050220202106 +:105A00000E00025930B000FF2403003E1603FFE7EA +:105A1000000000008F4401780480FFFE2407000787 +:105A20003C061000AF51014002202021A347014451 +:105A30008FBF00188FB100148FB00010AF460178EF +:105A40000A0002C927BD002027BDFFE8AFBF001430 +:105A5000AFB000108F500020000000000E0009368B +:105A6000AF440020AF5000208FBF00148FB0001053 +:105A700003E0000827BD00183084FFFF8F4201B803 +:105A80000440FFFE3C074035008730253C031000F2 +:105A9000AF450180AF400184AF46018803E00008B4 +:105AA000AF4301B83084FFFF8F4201B80440FFFECE +:105AB0003C074036008730253C031000AF4501808D +:105AC000AF400184AF46018803E00008AF4301B84E +:105AD00027BDFFD0AFB3001C3093FFFFAFB500244C +:105AE000AFB20018AFBF0028AFB40020AFB10014B0 +:105AF000AFB0001030B5FFFF12600027000090210A +:105B00008F90001C8E0300003C06800024020040A1 +:105B100000033E0200032C0230E4007F006688246C +:105B20001482001D30A500FF8F8300282C68000A16 +:105B3000510000108F910014000358803C0C0800A5 +:105B4000258C58D0016C50218D490000012000089F +:105B50000000000002B218213065FFFF0E00022491 +:105B600024040084162000028F90001CAF800028BF +:105B70008F910014260C0020264B0001018080210B +:105B80003172FFFF16200004AF8C001C0253282B3B +:105B900014A0FFDC00000000024010218FBF00288D +:105BA0008FB500248FB400208FB3001C8FB2001873 +:105BB0008FB100148FB0001003E0000827BD003043 +:105BC000240D003414AD00F600000000920B000E0E +:105BD000240A16803C07000CA36B00219203000DE1 +:105BE0000347F8213C066000A363002096110012D1 +:105BF0003C057FFF34ACFFFFA771003C960200100C +:105C0000240B00053054FFFFAF7400848E19001C74 +:105C1000AF4A00288FF800008CCF44480319702643 +:105C200001EE3021AF66004C8F69004C24CD00019D +:105C30003C197F00AF6900508F640050AF6400547E +:105C4000AF660070AF6D00588F6800582404005094 +:105C5000AF68005CA3600023AF6C0064A36B0037E7 +:105C60008E030014AF6300488F710048AF710024A9 +:105C70008E020018AF62006C9214000CA374003600 +:105C8000936A003E355F0020A37F003E8F7800744A +:105C90000319782435EE4000AF6E0074936900005C +:105CA000313000FF1204022B2418FF803C0408004E +:105CB00024845CB80E000294000000002406000456 +:105CC000240700013C0408008C845CB8A366007DB6 +:105CD000A36700058F4A01780540FFFE24020002F9 +:105CE000AF440140A34201448F90001C3C141000BB +:105CF000AF5401780A000373AF8000282CAD003741 +:105D000051A0FF9C8F9100140005A0803C18080052 +:105D1000271858F8029878218DEE000001C000087D +:105D2000000000002406000614A600110000000078 +:105D30003C1F08008FFF5CB824040005AF5F002003 +:105D40008E190018AF7900188F78004CAF78001CBE +:105D50008F6F0050122000C2AF6F00700A000373F3 +:105D6000AF840028240A000710AA00842403000638 +:105D70003C05080024A55CB80E00025E24040081E6 +:105D80008F90001C0011102B0A000373AF820028B3 +:105D90002402000414A2FFF6240A00503C09080063 +:105DA0008D295CB8AF4900208E040008AF64004024 +:105DB0008E060008AF6600448E07000CAF670048EF +:105DC0008E0D0010AF6D004C8E080010AF6800847F +:105DD0008E050014AF6500508E0C0018AF6C005497 +:105DE0008E0B001CAF6B005893740000328300FFD1 +:105DF000106A01ED000000008F6700488F660040C8 +:105E000000E6682305A000042404008C1620FFDEB1 +:105E100024020003240400823C05080024A55CB889 +:105E20000E000287000000008F90001C000010216F +:105E30000A000373AF8200282404000514A4FFCCD9 +:105E4000240520003C1F08008FFF5CB8AF5F0020D6 +:105E50008E190004AF79005C921800082410000825 +:105E6000A37800218F8F001C91EE0009A36E002003 +:105E70008F86001C90C9000A312400FF109000108A +:105E8000288A00091540006C24020002240C00201E +:105E9000108C000B340580002885002114A0000818 +:105EA0002405400024080040108800053C0500013E +:105EB000240D0080108D00023C05000224054000E6 +:105EC0008F6E00743C0FFF0001CF48240125802510 +:105ED000AF70007490C4000BA36400818F84001C19 +:105EE0009487000C10E0019300000000948E000CD9 +:105EF000241FFFBF24060004A76E003C9089000EFB +:105F0000A369003E8F90001C9204000FA364003F21 +:105F10008F94001C8E8D00108F47007401A74023C2 +:105F2000AF6800608E850014AF650064968C001821 +:105F3000A76C0068968B001AA76B006A8E83001C02 +:105F4000AF63006C96820002A762013E928A000E47 +:105F5000A36A003E9379003E033FC02412200166ED +:105F6000A378003E8F90001C0A000373AF860028C0 +:105F70002414002214B4FF7E240300073C0208000E +:105F80008C425CB81220000CAF4200200A00037360 +:105F9000AF830028240C003310AC00142405002823 +:105FA0003C05080024A55CB80E00023024040081E2 +:105FB0000A0003F88F90001C3C04080024845CB89D +:105FC0000E00029400000000936B000024110050AA +:105FD000316300FF10710150000000008F90001C21 +:105FE000000018210A000373AF8300283C08080052 +:105FF0008D085CB824040081AF480020A3650034FC +:106000003C05080024A55CB80E000230000000002A +:106010008F90001C240200090A000373AF8200283D +:1060200002B288213225FFFF0E00022424040084DE +:106030000A0003738F90001C1082FFA12405040046 +:10604000288300031060016E240B00042414000157 +:106050005494FF9B240540000A00044724050100D6 +:106060003C04080024845CB88F62004C0E0002944B +:106070008F6300508F90001C000020210A000373E2 +:10608000AF8400288E1000042404008AAF50002042 +:10609000936E000531C900021520015D0200282120 +:1060A0009378002302002821330F002015E00158C7 +:1060B0002404008D9362003F24190012305F00FF1A +:1060C00013F90153240400810E0002500200202124 +:1060D00093740023240A0004020020213683004226 +:1060E000A36300230E000259A36A007D8F4B017841 +:1060F0000560FFFE24050002AF500140A3450144A6 +:106100008F90001C3C0C1000AF4C01780A0003F982 +:106110000011102B8E100004AF500020936D00056D +:1061200031A80002550001782404008A9364003FDE +:106130002407000402002821308600FF10C7001049 +:10614000240400810E00025002002021937F0023CE +:1061500024180012240FFFFE37F90020A379002332 +:10616000A378003F936E00050200202101CF482450 +:106170000E000259A3690005020028210000202119 +:106180000E000340000000000A0003F88F90001C7E +:106190008E0500043C0F0008034F4021AF4500204E +:1061A000910E00002406005031C900FF1126017A2B +:1061B000240400888F5901B80720FFFE3C0C400ED4 +:1061C000008C58253C031000AF450180AF4001848E +:1061D000AF4B0188AF4301B891020000240AFF8051 +:1061E00024040004004AF825A11F00000E000C7FC3 +:1061F000240600300A0003F88F90001C8E0F000464 +:106200003C14080026945CB83C010800AC2F5CB834 +:10621000AF4F0020920E000331C90004112000028C +:106220002402001224020006A362003F9203001B16 +:10623000240AFFC03062003F004AF825A37F003ED9 +:1062400092190003333800011700012200000000FA +:106250008E020008AE8200083C0208008C425CC03E +:106260001040012D00000000000221C2A7640008B8 +:106270008E0D000C240B000124140014AF6D002CB3 +:106280008E080010AF68003096050016A76500382C +:10629000960C0014A76C003AAF6B000CA76B0010B3 +:1062A000A76B0012A76B0014A76B00161220014AFF +:1062B000A37400349206000330C700022CF00001E2 +:1062C000260200088F90001C0A000373AF8200288A +:1062D0008E14000424030081AF540020936800232F +:1062E0003105001010A00113000000008F4401B818 +:1062F0000480FFFE3C06401F0011382B006610256D +:106300003C111000AF540180AF870028AF400184DA +:10631000AF420188AF5101B80A0003748F91001495 +:106320008E0600043C19000803592021AF460020C6 +:106330008E07000890980000240F0050331400FFCF +:10634000128F0106240500888F4401B80480FFFEE7 +:106350003C0D40090011602B00AD10253C111000D0 +:10636000AF460180AF8C0028AF470184AF4201885F +:10637000AF5101B80A0003748F9100148E04001C01 +:106380000E00023B00000000104000D700404821F2 +:106390008F90001C240500898F4D01B805A0FFFED9 +:1063A00000000000AF4901808E0F001C3C1440012A +:1063B0000011702B00B448253C111000AF4F018430 +:1063C000AF8E0028AF490188AF5101B80A000374AD +:1063D0008F910014961900023C14080026945CB8B2 +:1063E000333800041300008E3C0260008E1F001C36 +:1063F0003C010800AC3F5CB8AF5F0020920C00107D +:10640000240B0014318400FF148B00AC000000004A +:1064100096090002312D000115A001520000000074 +:106420008E020004AE8200083C0E08008DCE5CC0D7 +:1064300011C00148000000008F6900743C0E80000C +:1064400024040001012E6825AF6D0074A3600005CF +:10645000AF64000C3C0C08008D8C5CC08F88001C65 +:10646000A7640010000C59C2A7640012A7640014AE +:10647000A7640016A76B00088D030008240400021F +:10648000AF63002C8D0A000CAF6A0030910700103A +:10649000A36700348F82001C90450011A36500356E +:1064A0008F86001C90D00012A37000368F9F001CB6 +:1064B00093F90013A37900378F90001C96180014ED +:1064C000A778003896140016A774003A8E0F0018AB +:1064D000AF6F00245620FDA6AF8400283C050800BD +:1064E00024A55CB80E00025E000020218F90001CE5 +:1064F0000A0004B6000020213C05080024A55CB871 +:106500000E000287240400828F90001C00003021BE +:106510000A000373AF8600283C0408008C845CB832 +:106520000E001577000000008F90001C0A000490F8 +:10653000000018213C05080024A55CB80E00028765 +:106540002404008B8F90001C0011302B0A00037371 +:10655000AF8600283C1908008F395CB83C1F080042 +:106560008FFF005024CCFFFE033F782101F87024F8 +:10657000AF4E00283C0408008C845CB83C0908003D +:106580008D2900500089682131A8007F011A282137 +:1065900000A78021AE0600D8AF9000D0AE0000DC8E +:1065A0000A0003C2AE0C0108AF6000843C0508007D +:1065B0008CA55CB83C0808008D080050240CFF80B6 +:1065C0003C02000C00A8A021028C5824AF4B0028EC +:1065D0008E1F00143283007F007A50210142702107 +:1065E000ADDF00D88E190014AF8E00D0ADD900DC1D +:1065F0008E180010270FFFFE0A000415ADCF01080A +:10660000548BFE2F240540000A0004472405100087 +:106610000E000335000000000A0003F88F90001CF4 +:106620008C46442C3C056C6234B079703C01080007 +:10663000AC205CB814D00008240400029788003411 +:10664000978A002C02802821010A382B10E00011C3 +:1066500024040092240400020E000C9D2405014035 +:106660003C010800AC225CB8AF4200203C030800AB +:106670008C635CB810600005240400830E00086879 +:106680000000000010400009240400833C050800BD +:1066900024A55CB80E00025E000000008F90001C74 +:1066A0000011202B0A000373AF8400280E00086C31 +:1066B000000000000A0005968F90001C0E00087074 +:1066C000000000003C05080024A55CB80A00063C58 +:1066D0002404008B8E0400080E00023B0000000022 +:1066E0000A00052DAE820008240400040E000C9D53 +:1066F000240500301440003F004048218F90001CCA +:106700000A00057D240500830E00034002002821B5 +:106710000A0004E2000000003C05080024A55CB863 +:106720000E000230240400878F90001C0A000549E7 +:106730000011102B0E0002500280202193700023C4 +:1067400002802021360D00100E000259A36D002397 +:106750008F90001C0A000552000018219205000CC1 +:1067600030BF000113E00003000000009602000E9D +:10677000A482002C920A000C314800021100FEF2A3 +:1067800000002821960B00128E030014A48B001A1F +:106790000A000569AC83001C8F8300388F870030A6 +:1067A0001067FE84000020213C09080025295C3C7C +:1067B000000320C0008930218CD400001285005EC7 +:1067C000247800013303000F5467FFFA000320C050 +:1067D0000A000504000020213C05080024A55CB83F +:1067E0000E000287240400828F90001C0A000549D5 +:1067F000000010213C0B0008034B20212403005013 +:10680000240A0001AF420020A0830000A08A0001FA +:106810008F88001C91070004A08700188F82001C3D +:1068200090450005A08500198F86001C90DF0006AA +:10683000A09F001A8F99001C93380007A098001B96 +:106840008F94001C928F0008A08F001C8F90001C5A +:10685000920E0009A08E001D8F8D001C91AC000AC5 +:10686000A08C001E8F8B001C3C0C0800258C5C3C0F +:106870009163000B3C0B0800256B5C38A083001F64 +:106880008F8A001C9148000CA08800208F87001C74 +:1068900090E5000DA08500218F82001C240546464E +:1068A0009046000EA08600228F9F001C93F9000FD7 +:1068B000A09900238F98001C93140010A09400242A +:1068C0008F8F001C91F00011A09000258F90001C6C +:1068D0008F8E00308F990038960D0014000E18C06E +:1068E00025C80001A48D0028960A0016006C3021EE +:1068F000006BF821A48A002A960700183108000FBF +:10690000A487002CA485002E8E02001CACC90000B8 +:10691000AF88003011190003AFE200000A00057DC6 +:1069200000002821250C00013184000F00002821DF +:106930000A00057DAF8400383C07080024E75C3876 +:106940000087802100002021ACC000000A0005045F +:10695000AE0000003C05080024A55CB80A00063C17 +:10696000240400878E0400040E00023B0000000097 +:106970000A0005A1AE8200083084FFFF30C600FF88 +:106980008F4201B80440FFFE000644000104302598 +:106990003C07200000C720253C031000AF400180C9 +:1069A000AF450184AF44018803E00008AF4301B85C +:1069B00027BDFFE8AFB00010AFBF00143C07600078 +:1069C000240600021080000600A080210010102B79 +:1069D0008FBF00148FB0001003E0000827BD00181F +:1069E0003C09600EAD2000348CE5201C8F82001C19 +:1069F0002408FFFC00A81824ACE3201C0E0006F5B8 +:106A00008C45000C0010102B8FBF00148FB00010AD +:106A100003E0000827BD00183C02600E3447010067 +:106A200024090018274A04000000000000000000AC +:106A3000000000003C06005034C30200AF440038A0 +:106A4000AF45003CAF430030014018218F4B0000A0 +:106A5000316800201100FFFD2406007F2408FFFF9D +:106A60008C6C000024C6FFFF24630004ACEC000023 +:106A700014C8FFFB24E70004000000000000000031 +:106A8000000000003C0F0020AF4F0030000000006D +:106A900024AD020001A5702B2529FFFF008E2021C7 +:106AA0001520FFE101A0282103E0000800000000FC +:106AB00027BDFFE0AFB10014AFBF0018AFB00010AA +:106AC0003C05600E8CA20034008088211440000632 +:106AD0003C0460008C87201C2408FFFC00E8302464 +:106AE00034C30001AC83201C8F8B001C24090001DF +:106AF000ACA90034956900028D6500148D70000CFE +:106B00002D2400818D6700048D6600081080000729 +:106B10008D6A00102D2C00041580000E30CE000769 +:106B2000312D000311A0000B000000002404008B95 +:106B3000020028210E0006F5240600030011102B88 +:106B40008FBF00188FB100148FB0001003E0000851 +:106B500027BD002015C0FFF62404008B3C03002055 +:106B6000AF4300300000000024020001AF82001497 +:106B70000000000000000000000000003C1F015069 +:106B8000013FC825253800033C0F600EAF47003891 +:106B900000181882AF46003C35E8003CAF59003081 +:106BA000274704008F4400003086002010C0FFFDFE +:106BB00000000000106000082466FFFF2403FFFFB0 +:106BC0008CEB000024C6FFFF24E70004AD0B00009F +:106BD00014C3FFFB250800043C08600EAD09003813 +:106BE0000000000000000000000000003C07002042 +:106BF000AF470030000000000E00071D01402021BB +:106C000002002821000020210E0006F524060003C2 +:106C10000011102B8FBF00188FB100148FB000101F +:106C200003E0000827BD002027BDFFD8AFB2001841 +:106C30003092FFFFAFB10014AFBF0020AFB3001C14 +:106C4000AFB000101240002C000088210A0007B5E8 +:106C50002413000150B300408CE5000C0000000D2F +:106C6000263900013331FFFF24F800200232382B8F +:106C700010E00021AF98001C8F8200141440001E09 +:106C80008F87001C3C0670003C0320008CE4000051 +:106C90000086282414A300188F85003C00044402B9 +:106CA0003C0980000089802414A0FFEA310600FF1F +:106CB000240A000210CA002E28CB0003116000161F +:106CC000240C000314D3FFE7263900010200282119 +:106CD0000E000703240400018F87001CAF82003CD4 +:106CE000263900013331FFFF24F800200232382B0F +:106CF00014E0FFE1AF98001C022010218FBF00209C +:106D00008FB3001C8FB200188FB100148FB0001029 +:106D100003E0000827BD002810CC001A240D000451 +:106D200014CDFFD026390001308EFFFF000E19C0B0 +:106D30008F4401B80480FFFE3C0F10003C1020047B +:106D4000AF430180AF400184AF500188AF4F01B81D +:106D50000A0007B0263900010E0006F5240400845D +:106D60001600FFBF8F87001C0A0007AFAF80003CF2 +:106D7000020028210E000703000020210A0007CE90 +:106D80008F87001C0E000743020020218F87001C04 +:106D90000A0007CFAF82003C3082FFFF144000039F +:106DA000000018210004240224030010308500FF95 +:106DB00014A000053087000F24660008000422029A +:106DC00030C300FF3087000F14E000053089000356 +:106DD0002468000400042102310300FF308900030D +:106DE00015200005388B0001246A0002000420826F +:106DF000314300FF388B0001316400011080000234 +:106E0000246C0001318300FF03E0000800601021C2 +:106E1000308BFFFF000B394230E600FF3C090800D1 +:106E200025295BB800064080010960218D8700009C +:106E30003164001F240A0001008A180430A500FFF5 +:106E400000E3202514A000020003102700E2202404 +:106E5000240F000100CF700401096821000E2827CB +:106E600014800005ADA400008F86000C00A610243D +:106E700003E00008AF82000C8F88000C01C81025C9 +:106E800003E00008AF82000C3C06001F3C036000DA +:106E90003084FFFF34C5FF8024020020AC6020084E +:106EA000AC60200CAC602010AC652014AC642018E1 +:106EB000AC622000000000000000000003E00008B9 +:106EC0000000000027BDFFE82402FFFFAFBF001055 +:106ED000AF82000C000020213C06080024C65BB8ED +:106EE0002405FFFF24890001000440803124FFFFB6 +:106EF000010618212C87002014E0FFFAAC65000081 +:106F00000E00083900002021240200013C0460002A +:106F100024050020AC822018AC8520000000000071 +:106F20000000000000000000244A00013142FFFF81 +:106F30002C46040014C0FFF78FBF001003E00008C8 +:106F400027BD00188F8300082C62040003E00008AE +:106F5000384200018F8300082462000103E000082A +:106F6000AF8200088F8300082462FFFF03E000085F +:106F7000AF82000827BDFFE0AFB10014AFBF00181B +:106F8000AFB000108F6B00303C066000008088219D +:106F9000ACCB20088F6A002C3C0280002403000840 +:106FA000ACCA200C9769003A9768003800092C0099 +:106FB0003107FFFF00A72025ACC42010ACC220146D +:106FC000ACC3200000000000000000000000000032 +:106FD0003C0360008C6D200031AC00081580FFF987 +:106FE000000000008C6E201405C00020000000008E +:106FF0000E0007FD8F84000C000240803C09080051 +:1070000025295BB8010938218CE400000E0007FD3A +:1070100000028140020220213090FFFF0200202167 +:107020000E00081B000028213C0C8000022C582573 +:107030003210FFFF3C116000240A0020AE2B201408 +:10704000AE302018AE2A2000000000000000000032 +:1070500000000000020010218FBF00188FB1001443 +:107060008FB0001003E0000827BD00208C662014BC +:107070003C02001F3443FF803C1FFFE800C3C024D4 +:1070800037F9080003198021001079C23C0C8000F8 +:10709000022C582531F0FFFF3C116000240A00202B +:1070A000AE2B2014AE302018AE2A200000000000C5 +:1070B0000000000000000000020010218FBF001837 +:1070C0008FB100148FB0001003E0000827BD00202E +:1070D00027BDFFE8AFB000103402FFFF3090FFFF84 +:1070E000AFBF001412020006020020210E00083972 +:1070F00000000000020020210E00081B24050001F2 +:107100008F8400088FBF00148FB000102483FFFF0E +:1071100027BD001803E00008AF830008000439C24F +:1071200030E6003F00043B420007184024021000F4 +:107130002CC4002024C8FFE0AF42002C24630001CF +:107140001480000330A900FF00071840310600FF3B +:107150000003608024080001019A58213C0A000EB7 +:1071600000C82804016A38211120000500053027D5 +:107170008CE900000125302503E00008ACE60000A2 +:107180008CEE000001C6682403E00008ACED0000AE +:1071900027BDFFE8AFBF0014AFB000103C04600093 +:1071A0008C8508083403F00030A2F000504300063C +:1071B000240200018C8708083404E00030E6F00067 +:1071C00010C4001E24020002AF8200403C10600088 +:1071D0003C0A0200AE0A0814240910003C08000E04 +:1071E0008E03440003482021AF49002C24050120D0 +:1071F0000E000CE3000030218F830040106000047B +:107200003C021691240B0001106B000E3C023D6CF9 +:10721000344F0090AE0F44088FBF00148FB00010A1 +:107220003C0C6000240E10003C0D020027BD00182D +:10723000AD8E442003E00008AD8D08100A00090A55 +:10724000AF8000403C0218DA344F0090AE0F440883 +:107250008FBF00148FB000103C0C6000240E100093 +:107260003C0D020027BD0018AD8E442003E000084D +:10727000AD8D08100A0008DE240500010A0008DEB2 +:10728000000028213C08080025085FC42404FFFFF3 +:10729000010018212402001E2442FFFFAC640000FC +:1072A0000441FFFD246300043C07080024E760401C +:1072B0008CE5FFFC2404001C24060001308A001F1A +:1072C0000146480424840001000910272C83002073 +:1072D0001460FFFA00A22824ACE5FFFC3C056666BA +:1072E00034A4616E3C06080024C66100AF840058D7 +:1072F000AF88009C2404FFFF00C018212402001F57 +:107300002442FFFFAC6400000441FFFD246300043D +:107310003C0766663C05080024A560C0AF860048AF +:1073200034E6616EAF8600982404FFFF00A01821A8 +:107330002402000F2442FFFFAC6400000441FFFD63 +:10734000246300043C0B66663C06080024C66040CB +:107350003568616EAF8500A4AF8800702404FFFF1C +:1073600000C018212402001F2442FFFFAC6400006B +:107370000441FFFD246300043C0D66663C0A0800DE +:10738000254A618035AC616EAF860090AF8C005CA1 +:107390002404FFFF01401821240200032442FFFFC0 +:1073A000AC6400000441FFFD246300043C090800B4 +:1073B000252961908D27FFFC240400062405000187 +:1073C0003099001F0325C004248400010018782789 +:1073D0002C8E002015C0FFFA00EF3824AD27FFFCEB +:1073E0003C09666624030400240403DC240502002F +:1073F000240600663522616E3C08080025085CC43E +:10740000AF820074AF830044AF83006CAF83005041 +:10741000AF830084AF8A008CAF840064AF85004CDA +:10742000AF860054AF840078AF850060AF860080DF +:1074300001001821240200022442FFFFAC6000007A +:107440000441FFFD24630004240400032403000C12 +:107450003C0A0800254A5CD0AF8A00680A0009B1DE +:107460002405FFFF000418802484000100685821CF +:107470002C8700C014E0FFFBAD6500003C0E666683 +:1074800035CD616E240C17A024081800AF8D00883C +:10749000AF8C009403E00008AF88007C2484007F58 +:1074A000000421C2000040210000302100003821EA +:1074B000000028210A0009C8AF8400A0106000065F +:1074C00024E7000100C4302124A500012CC20BF5E3 +:1074D0001440FFFA2CA300663C09080025296180AE +:1074E00001201821240200032442FFFFAC600000A9 +:1074F0000441FFFD2463000410E0001A24E3FFFFB1 +:107500000003294210A0000A000020212406FFFFEA +:107510003C03080024636180248400010085502B13 +:10752000AC660000250800011540FFFB2463000441 +:1075300030E2001F1040000800086880240C0001A1 +:10754000004C3804000858800169282124E6FFFF18 +:1075500003E00008ACA6000001A940212409FFFFB8 +:10756000AD09000003E0000800000000AF4400285F +:107570003C04000C03442021000528820A000CE38F +:1075800000003021000421803C036000AC6410083E +:107590000000000000052980AC65100C0000000010 +:1075A00003E000088C62100C27BDFFE80080282152 +:1075B00024040038AFBF00140E0009F8AFB000106B +:1075C00024040E00AF4400283C10000C035020217E +:1075D000240500100E000CE30000302103501021A0 +:1075E000AC400000AC400004240400388FBF0014FD +:1075F0008FB0001024053FFF27BD00180A0009F8CE +:107600008C430000000421803C036000AC6410083F +:10761000000000008C62100C03E0000800021182E0 +:1076200027BDFFC8AFB400208F940068AFBE003004 +:10763000AFB7002CAFB600280000B8210080B02101 +:10764000241E00C0AFBF0034AFB50024AFB3001C90 +:10765000AFB20018AFB10014AFB000100A000A3585 +:10766000AFA5003C504000018F94006827DEFFFF6B +:1076700013C00028269400048E9200003C030800EA +:1076800024635FC01240FFF70283102B3C04080004 +:1076900024845CC4028410230002A8C00000982146 +:1076A0000A000A442411000100118840122000261B +:1076B0000000000002B38021025128240200202192 +:1076C00010A0FFF9267300010E000A01000000005F +:1076D0000016684032EC000101AC20210E0009F8D0 +:1076E000020028218F89009426F700018FA6003C14 +:1076F0003AEB0001316A00012528FFFF001138270D +:1077000002CAB021AF88009416E6FFE70247902432 +:10771000AE92000002E010218FBF00348FBE003017 +:107720008FB7002C8FB600288FB500248FB40020AF +:107730008FB3001C8FB200188FB100148FB00010EF +:1077400003E0000827BD00383C0E080025CE5FC0CE +:10775000028E102B0A000A30AE92000027BDFFD81F +:10776000AFB10014AFB00010AFBF0020AFB3001C2A +:10777000AFB2001800A0882110A0001F00048040B4 +:107780003C13080026735CC40A000A7D2412000121 +:1077900012200019261000010E000A1802002021F4 +:1077A000000231422444FFA0000618803045001F2B +:1077B0002C8217A1007318212631FFFF1040FFF41F +:1077C00000B230048C6900000200202124053FFF34 +:1077D000012640241500FFEE012638250E0009F889 +:1077E000AC6700008F8A0094261000012547000135 +:1077F0001620FFE9AF8700948FBF00208FB3001CD5 +:107800008FB200188FB100148FB0001003E0000891 +:1078100027BD00288F85009C008058210000402152 +:1078200000004821240A001F3C0C0800258C603C05 +:107830003C0D080025AD5FC48CA6000050C00014AC +:107840000000402100AD1023000238C024030001D5 +:107850000A000AB6000020211500000300E41021F0 +:10786000244820240000482125290001512B001321 +:107870002506DFDC106000062484000100C37024AC +:1078800015C0FFF5000318400A000AB400004021AB +:1078900010AC002624A3000400602821254AFFFF25 +:1078A0001540FFE5AF85009C512B00042506DFDC69 +:1078B0000000402103E000080100102100066142A1 +:1078C00030C5001F000C50803C07080024E75FC44F +:1078D00024040001014730211120000F00A42004DE +:1078E0003C05080024A56040148000052529FFFF01 +:1078F00024C6000410C5001100000000240400018B +:107900008CCF00000004C0270004204001F8682448 +:107910001520FFF5ACCD00008F99007801001021F3 +:10792000032B482303E00008AF8900783C050800DA +:1079300024A55FC40A000ABE000040213C060800DE +:1079400024C65FC40A000AD724040001308800FF5F +:10795000240200021102000A240300031103005C48 +:107960008F8900A4240400041104005F240500058D +:10797000110500670000182103E0000800601021D5 +:107980008F8900483C0C0800258C61003C040800ED +:1079900024846180240300201060000F000058211F +:1079A000240D0002240E00033C0F080025EF6100A7 +:1079B0008D27000014E0000B30F9FFFF252900049B +:1079C0000124C02B53000001018048212463FFFFE4 +:1079D0005460FFF88D2700000160182103E00008C3 +:1079E00000601021132000323C0500FF30E200FF50 +:1079F00000403021104000420000502124050001C9 +:107A0000000020210005C84000A6C0241700000384 +:107A1000332500FF14A0FFFB24840001012CC023A8 +:107A2000001828C000AA6021008C50213144001F9A +:107A3000240C0001008C18040003102700E23024FD +:107A4000110D0041AD260000110E004C000A184037 +:107A5000110D00368F87006C510E00568F8C006020 +:107A6000240D0004110D005A8F8E0084240E000591 +:107A7000150EFFDA01601821240B143011400006A6 +:107A8000000018218F8400A024630001006A402BAD +:107A90001500FFFD016458218F8A0080AF89008C9A +:107AA000016018212549FFFF0A000B0EAF890080F5 +:107AB00000E52024000736021080FFD0240A0018B9 +:107AC00000075402314600FF0A000B16240A00107A +:107AD0003C0C0800258C60C03C0408002484610034 +:107AE0000A000AFD240300103C0C0800258C6040AD +:107AF0003C040800248460C00A000AFC8F890090BE +:107B000000071A02306600FF0A000B16240A00085C +:107B10008F89008C3C0C0800258C61803C04080097 +:107B2000248461900A000AFD24030004000A4080B6 +:107B3000250B003024E6FFFF01601821AF890048C3 +:107B40000A000B0EAF86006C000AC982001978800B +:107B50003C07080024E760C001E72021000A184222 +:107B60008C8F00003079001F032C38040007C027D9 +:107B700001F860240A000B2BAC8C0000000331429A +:107B80000006288000AF28213062001F8CB800005A +:107B900024630001004CC804000321420019382767 +:107BA0000004108003073024004F20210A000B6FCF +:107BB000ACA60000000A68C025AB0032258AFFFF92 +:107BC00001601821AF8900A40A000B0EAF8A006083 +:107BD000254B1030AF8900900160182125C9FFFFA7 +:107BE0000A000B0EAF890084308600072CC2000605 +:107BF0001040001400000000000640803C03080014 +:107C0000246359D4010338218CE40000008000086B +:107C1000000000002409000310A9000E000000006D +:107C2000240A000510AA000B00000000240B00012C +:107C300010AB0008000000008F8C00A010AC000505 +:107C40000000000003E00008000010210A000A9C68 +:107C500000A020210A000AEA00C0202127BDFFE879 +:107C6000308400FF240300021083000BAFBF00101C +:107C7000240600031086003A2408000410880068D7 +:107C8000240E0005108E007F2CAF14308FBF001023 +:107C900003E0000827BD00182CA200301440FFFCB0 +:107CA0008FBF001024A5FFD0000531C200066880F8 +:107CB0003C07080024E7610001A730218CC90000BF +:107CC0000005288230AC001F240B0001018B5004FA +:107CD0008F840048012A4025ACC800008C83000036 +:107CE00050600001AF8600488F98006C30AE0001F4 +:107CF00024A6FFFF270F000115C00002AF8F006C04 +:107D000024A60001000641420008208000871821B7 +:107D10008C79000030C2001F240600010046F804E0 +:107D2000033F382410E0FFDA8FBF00100005C18246 +:107D3000001870803C0F080025EF60C001CF48217B +:107D40008D2B00000005684231A5001F00A66004CD +:107D5000016C502527BD001803E00008AD2A000083 +:107D60002CA7003014E0FFCA8FBF001030B9000705 +:107D70001723FFC724A8FFCE00086A02000D608009 +:107D80003C0B0800256B60C0018B30218CC40000C7 +:107D9000000828C230AA001F240800010148480436 +:107DA0008F8200A400891825ACC300008C5F0000FE +:107DB00053E00001AF8600A400057040000E794238 +:107DC000000F28803C0408002484610000A41821CE +:107DD0008C6B000025DF000131CD001F001F5142D8 +:107DE00001A86004016C4825000A1080AC690000FD +:107DF000004428218CA600008F98006033F9001FF2 +:107E00008FBF00100328380400C77825270E000113 +:107E100027BD0018ACAF000003E00008AF8E006083 +:107E200024A5EFD02CB804001300FF998FBF0010D9 +:107E300000053142000658803C0A0800254A60408F +:107E4000016A30218CC4000030A3001F2409000106 +:107E5000006910048F9900900082F825ACDF0000C3 +:107E60008F27000050E00001AF8600908F8D0084C6 +:107E70008FBF001027BD001825AC000103E00008EB +:107E8000AF8C008415E0FF828FBF00108F8600A0AA +:107E9000000610400046F821001F210003E4C8211D +:107EA0000019384024F8143000B8402B1100FF7836 +:107EB0008FBF001024A4EBD00E00020D00C02821BB +:107EC00000027942000F70803C0D080025AD6180F2 +:107ED00001CD20218C8B0000304C001F24060001B6 +:107EE000018618048F89008C01635025AC8A00003C +:107EF0008D25000050A00001AF84008C8F98008079 +:107F00008FBF001027BD00182708000103E00008FC +:107F1000AF88008030A500072403000310A30010E1 +:107F200028A20004144000082407000224030004CF +:107F300010A300152408000510A8000F8F8500A0CD +:107F400003E000080000000014A7FFFD00802821C6 +:107F500014C3FFFB240400020A000BAE0000000063 +:107F6000240900050080282110C9FFFB2404000318 +:107F700003E000080000000014C5FFF10080282184 +:107F80000A000BAE24040005240A00010080282109 +:107F900010CAFFF12404000403E000080000000000 +:107FA00027BDFFE0AFB00010000581C22603FFD05F +:107FB00024C5003F2C6223D024C6007FAFB2001836 +:107FC000AFB10014AFBF001C309100FF000691C29A +:107FD0000005298202002021104000082403FFFF31 +:107FE0000E000A6E0000000002002021022028215D +:107FF0000E000C5C02403021000018218FBF001CD5 +:108000008FB200188FB100148FB0001000601021E3 +:1080100003E0000827BD002027BDFFD824A2007F71 +:10802000AFB3001CAFB20018000299C2309200FF3B +:1080300024A3003F0240202102602821AFB1001498 +:10804000AFB00010AFBF00200E000B91000389827B +:1080500000408021004020210220282114400009F6 +:10806000000018218FBF00208FB3001C8FB20018B2 +:108070008FB100148FB000100060102103E00008E1 +:1080800027BD00280E000A1F000000000040282124 +:10809000020020211051FFF3001019C00E000A6EDB +:1080A0000000000002002021024028210E000C5C8C +:1080B000026030218FBF00208FB3001C8FB20018E8 +:1080C0008FB100148FB00010000018210060102143 +:1080D00003E0000827BD00283084FFFF30A5FFFF24 +:1080E00010800007000018213082000110400002BB +:1080F00000042042006518211480FFFB0005284081 +:1081000003E000080060102110C00007000000001C +:108110008CA2000024C6FFFF24A50004AC8200004E +:1081200014C0FFFB2484000403E0000800000000EA +:1081300010A0000824A3FFFFAC8600000000000090 +:10814000000000002402FFFF2463FFFF1462FFFA17 +:108150002484000403E000080000000030A5FFFFB5 +:108160008F4201B80440FFFE3C07601500A7302590 +:108170003C031000AF440180AF400184AF4601884A +:1081800003E00008AF4301B88F8500D02C86400083 +:10819000008018218CA700840087102B1440001049 +:1081A000000000008CA800842D06400050C0000F85 +:1081B000240340008CAA0084008A482B512000012F +:1081C0008CA3008400035A42000B20803C05080069 +:1081D00024A55A400085182103E000088C620000A5 +:1081E00014C0FFF4000000002403400000035A42C2 +:1081F000000B20803C05080024A55A40008518216A +:1082000003E000088C6200008F8300D0906600D0ED +:1082100024C50001A06500D08F8500D0906400D0F7 +:1082200090A200D21044001700000000936C007868 +:108230008F8B00BC318A00FFA16A000C2549000128 +:10824000938700C4312200FF3048007F1107000BE4 +:1082500000026827A36200788F4E017805C0FFFEF8 +:108260008F9900B0241800023C0F1000AF59014054 +:10827000A358014403E00008AF4F01780A000D2C19 +:1082800031A20080A0A000D00A000D220000000052 +:1082900027BDFFD8AFB200188F9200B8AFBF002043 +:1082A000AFB3001CAFB00010AFB100148F9300B497 +:1082B0008E5900283C1000803C0EFFEFAE79000084 +:1082C0008E580024A260000A35CDFFFFAE7800046E +:1082D0009251002C3C0BFF9F356AFFFFA271000CEE +:1082E0008E6F000C3C080040A271000B01F060256D +:1082F000018D4824012A382400E83025AE66000CA0 +:108300008E450004AE6000183C0400FFAE6500140A +:108310008E43002C3482FFFFA66000080062F82420 +:10832000AE7F00108E5900088F9000B0964E00125C +:10833000AE7900208E51000C31D83FFF00187980B3 +:10834000AE7100248E4D001401F0602131CB00018C +:10835000AE6D00288E4A0018000C41C2000B4B8005 +:10836000AE6A002C8E46001C01093821A667001C4D +:10837000AE660030964500028E440020A665001EC1 +:10838000AE64003492430033306200045440000570 +:10839000924600008F8300D08C7F007CAE7F00303F +:1083A000924600008F8500BCA0A6000092440033D6 +:1083B0003082000250400007924E00018F8700BCBF +:1083C000240AFF8090E90000012A4025A0E800006F +:1083D000924E00018F8D00BC2409FFBF2404FFDFF3 +:1083E000A1AE00018F8A00BC914C000D318B007F43 +:1083F000A14B000D8F8600BC90C8000D01093824E8 +:10840000A0C7000D8F9100BC8E6500149223000D53 +:108410002CA200010002F9400064C824033FC025DB +:10842000A238000D8F8800BC965000128F8700D0B4 +:10843000A51000028E45000490ED00BC30AF000393 +:10844000000F702331CC000300AC102131AB0002CF +:1084500015600002244400342444003090F100BC34 +:1084600000B18024320F000415E0000224830004D0 +:10847000008018218F8900AC240A0002AD0300049B +:10848000A12A00009248003F8F8700ACA0E80001BD +:108490008F9100AC9246003F8E440004A626000255 +:1084A0009765003C0E000CF930B0FFFF000213800E +:1084B000005020253C0342000083F825AE3F000415 +:1084C0008F8500AC8E590038ACB900188E58003436 +:1084D000ACB8001CACA0000CACA00010A4A0001410 +:1084E000A4A00016A4A00020A4A00022ACA00024F8 +:1084F0008E62001450400001240200018FBF002052 +:108500008FB3001C8FB200188FB100148FB0001011 +:10851000ACA200080A000D1927BD00288F8600D0E4 +:1085200027BDFFD0AFBF002CAFB60028AFB50024E9 +:10853000AFB40020AFB3001CAFB20018AFB100144D +:10854000AFB0001094C300E094C200E210430041B9 +:108550002405FFFF3C16000E90C400D090C800D147 +:10856000309200FF310400FF0244382B10E0004439 +:1085700026490001108900378F9800B03C0508009B +:108580008CA5005C2414FF8000B86021019468244D +:10859000AF4D002C94CA00E2318B007F017A482154 +:1085A00031447FFF01364021000410400048A821DB +:1085B00096A700003C1F08008FFF005830F53FFFD2 +:1085C0000015198003E3C821031988213233007F85 +:1085D000027A782102348024AF50002C01F69821D1 +:1085E000926E000D31C5000410A00048000000008C +:1085F00094C300E294C300E294D800E22404800013 +:10860000307F7FFF27F9000133317FFF030480248F +:1086100002117825A4CF00E294CE00E23C120800BB +:108620008E52006031D47FFF129200DF0000000004 +:108630008E720018000028212646FFFFAE66002C2F +:108640008F8600D094C800E094C900E21528FFC2CC +:10865000000000008FBF002C8FB600288FB50024CB +:108660008FB400208FB3001C8FB200188FB100149C +:108670008FB0001000A0102103E0000827BD0030DB +:1086800090CD00D2264A000131AC00FF008C582169 +:10869000116AFFF08F9800B03C0508008CA5005CC3 +:1086A0002414FF8000B8602101946824AF4D002C91 +:1086B00094CA00E2318B007F017A482131447FFF68 +:1086C00001364021000410400048A82196A7000070 +:1086D0003C1F08008FFF005830F53FFF0015198040 +:1086E00003E3C821031988213233007F027A7821FD +:1086F00002348024AF50002C01F69821926E000DB8 +:1087000031C5000414A0FFBA000000008E660010FE +:108710000012C0C08E6E00300012914002587821C5 +:10872000036F582100CE6823256C008824020002C4 +:10873000AE6D0010AF8C00ACA1620088976A003C5F +:108740008E6400308F9100AC0E000CF93150FFFFA9 +:1087500000022380009048253C034200012340256D +:10876000AE2800048E6700048F8C00AC8E7F000062 +:10877000240D0008AD87001CAD9F0018AD80000CD3 +:10878000AD8000109265000A30B900FFA599001471 +:10879000967800083C05000CA59800169271000A16 +:1087A000322F00FFA58F00209670000824110005CD +:1087B000A5900022AD800024926E000B2410C00012 +:1087C00031C600FFA5860002A18D00018E6B00302E +:1087D0008F8200AC8F8800B0AC4B00083C0A0800C8 +:1087E0008D4A00540148202100944824AF490028B4 +:1087F0003C0308008C6300540068382130FF007F80 +:1088000003FAC8210325C02102587821AF8F00BC8C +:10881000AF9800C0A1F100008F8B00BC2403FFBF04 +:108820002405FFDF956E000201D0A024029590255B +:10883000A57200029166000230CD003F35AC0040C9 +:10884000A16C00028F8800BC8F8200D03C0C7FFF9F +:10885000AD0000048C4A007C358BFFFF3C02800099 +:10886000AD0A00089104000D3089007FA109000DB8 +:108870008F9F00BC93F5000D02A33824A3E7000DE1 +:108880008F9100BC9239000D0325C024A238000D41 +:108890008E6F00348F8D00BCADAF00108E6E002C3B +:1088A0008E70003001D0A023ADB4001491B2001836 +:1088B0003246007FA1A600188F8700BC8E6A003068 +:1088C0008CE40018014B4824008240240109A825AB +:1088D000ACF500189263000AA0E3001C967F000824 +:1088E0008F8500BC8F9900D0A4BF001E8E70003011 +:1088F0008E6400300E00020D8F2500848F8500D01D +:10890000000289400002C10090AE00BC023878210C +:108910000040302131D4000212800003020F802178 +:108920000002A8800215802190B200BC32540004DD +:10893000128000020006C880021980218E6F00306C +:108940008F8B00BC2406800031EE0003000E6823EC +:1089500031AC0003020C1021AD62000494A400E2CB +:1089600094AA00E294A300E231507FFF26040001A4 +:1089700030897FFF0066402401098825A4B100E208 +:1089800094A700E23C1308008E73006030FF7FFF65 +:1089900013F30012000000000E000D19000000008B +:1089A0000A000E270000282194CD00E201A46024D3 +:1089B000A4CC00E290CB00E290C200E2316A00FF5A +:1089C000000A49C200092027000441C03055007F39 +:1089D00002A838250A000E23A0C700E294B100E2E5 +:1089E00002263824A4A700E290BF00E290B400E27F +:1089F00033F300FF0013C9C2001990273298007F9B +:108A00000012A9C0031530250E000D19A0A600E222 +:108A10000A000E27000028213084FFFF30A5FFFF49 +:108A2000AF440018AF45001C03E000088F4200145B +:108A300027BDFFB0AFB000288F9000D0AFB4003892 +:108A4000AFBF004CAFBE0048AFB70044AFB6004068 +:108A5000AFB5003CAFB30034AFB20030AFB1002CC3 +:108A6000A7A00014920600D1920500D03094FFFF19 +:108A700030C400FF30A300FF0064102BA7A0001E2D +:108A800010400071AFA00010920900D00014982B84 +:108A9000312800FF0088382324F2FFFF0012882BC2 +:108AA0000233782451E000758FB20010961800123E +:108AB000961900100014F4000319B8230017B4002D +:108AC000001614030282A82A16A00002001E240326 +:108AD000004020210244F82B13E0000200801821FE +:108AE000024018210003340000061C033065FFFF1C +:108AF0002CA20009144000020060982124130008F1 +:108B00008E090008001359808E08000C3164FFFFA5 +:108B10003C0A0010008A3825274A0400AF49003873 +:108B2000AF8A00B8AF48003CAF47003000000000FB +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000008F4D000049 +:108B500031AC00201180FFFD0013702A01D11024D8 +:108B60000000A821104001C0000000008F9800B054 +:108B70003C0B08008D6B00542411FF80921E00D026 +:108B80000178202100911024921900D0AF420028D2 +:108B90008D4500103C0608008CC600583C170800A4 +:108BA0008EF7005430A73FFF0007198000C3402113 +:108BB000030820210091F824920B00D0AF5F002C15 +:108BC0009148000033D600FF332F00FF02F87021D8 +:108BD00000166140000F68C031C9007F018D382147 +:108BE000013A2821316300FF3086007F3C02000CEF +:108BF00000A2B021000389400367C82100DAF821F0 +:108C00003108003F3C1E000E0236B821273800888C +:108C100003FE88212D0F0008AF9800ACAF9700BC71 +:108C2000AF9600C011E0018FAF9100B400086880DA +:108C30003C0E080025CE59EC01AE60218D89000064 +:108C40000120000800000000920E00D2920D00D01A +:108C50000014982B31CA00FF31AC00FF008C582360 +:108C6000014B20212492FFFF0012882B023378242D +:108C700015E0FF8E000000008FB200108FBF004C87 +:108C80008FBE00483A4200018FB700448FB60040C3 +:108C90008FB5003C8FB400388FB300348FB20030F2 +:108CA0008FB1002C8FB0002803E0000827BD0050D2 +:108CB000915800013317002012E00204241600012D +:108CC000921F00BC0000B02133F900011320000DF9 +:108CD000241E00018D4800148E0300840103B02B74 +:108CE00016C00002010030218E0600848E0500644B +:108CF00000C5382B14E0000200C020218E0400645F +:108D00000080B0218D4200148E0B0064004B302B8C +:108D100014C00002004020218E0400640096B82395 +:108D200056E00001241E0002025E202B1480014840 +:108D3000000018218D5900388E2F000C3C1800803F +:108D4000AE3900008D5000343C0EFF9F01F86025C5 +:108D5000AE3000049149003F35CDFFFF018D202446 +:108D60003C0A00203C0BFFEFA229000B008A3825AB +:108D70003562FFFF00E228243C0600088F8700B818 +:108D800000A6C825AE39000C8CE30014AE200018F4 +:108D90003C08FFFBAE2300148CF80018351FFFFFC2 +:108DA000033F7024AE38001C8CEF000802D78021EE +:108DB000AE2F00248CED000CAE30002CAE2E000C3B +:108DC000AE2D0020AE200028A6200038A620003AB4 +:108DD0008CEC0014019648230137502311400011F8 +:108DE000AE2A001090EE003D8E2C00048E24000070 +:108DF000000E6900018D28210000502100AD302BAC +:108E0000008A582101661021AE250004AE22000020 +:108E100090E3003DA223000A8F8800B8951F00064A +:108E2000A63F00088F8B00AC2406000202C0202160 +:108E3000A16600009765003C8F9000AC30A2FFFF58 +:108E40000E000CF9AFA200208FA300200002438087 +:108E50008F8500B80103C8253C1F4200033FC02591 +:108E6000AE1800048F8400AC8CAF0038AC8F0018B3 +:108E70008CB00034AC90001CAC80000CAC800010B6 +:108E8000A4800014A4800016A4800020A4800022E6 +:108E9000AC80002490A7003FA487000212C00210FB +:108EA000240D000152E0000290A2003D90A2003E7D +:108EB000244A0001A08A00018F8400ACAC9600080F +:108EC0008F8300D024070034906F00BC31EE000285 +:108ED00051C00001240700308F8200B88F9900BC78 +:108EE000906800BC905F00002410000432CF0003A3 +:108EF000A33F00008F9800B88F8C00BC020F702336 +:108F0000930D00012405C00031CA0003A18D0001AA +:108F10008F9000BC8F8900B800F6382196040002BB +:108F20009526001200EA38210085582430C33FFFFF +:108F300001631025A6020002921F000231080004FE +:108F400033F9003F37380040A218000212C0000277 +:108F50008F8500BC00E838218F8600D0ACA70004C4 +:108F6000241FFFBF8CC3007C2ECB0001240FFFDF2A +:108F7000ACA3000890A8000D000B69403102007FEF +:108F8000A0A2000D8F9000BC9219000D033FC024D9 +:108F9000A218000D8F8A00BC914E000D01CF6024F5 +:108FA000018D4825A149000D8F8600B88F8B00BC2C +:108FB0008CC70020AD6700108CC50024AD6500147F +:108FC0008CC40028AD6400188CC3002C0E000D1951 +:108FD000AD63001C2408000257C8009C8F9000D08D +:108FE0008F8F00D08F8A00C002E0202191E800D04E +:108FF00091EB00D091E700D0311000FF316E00FFFF +:1090000000106940000E28C001A5182130E900FFBA +:109010000363C8210009314000CAF82127220088D3 +:10902000AF8200ACAF9F00BCA33E00880E000CF9DD +:109030008F9000AC8FB80020000263803C0F42008C +:10904000019840258F8C00B8010F5825AE0B000405 +:109050008D8400388F8B00AC00002821000539007A +:10906000AD6400188D8E00343C0F7FFF35E8FFFFA4 +:10907000AD6E001C9183003E8D69001C8D6600184A +:109080000003510000036F02012AC02100ED1025EA +:10909000030AF82B00C2C821033F8021AD78001CD1 +:1090A000AD700018AD60000CAD6000109184003E02 +:1090B000241F00052410C000A5640014958E000430 +:1090C00002E8402402E02021A56E00169185003EB2 +:1090D000A5650020958D0004A56D0022AD600024DB +:1090E0009187003FA56700029183003E9189003D72 +:1090F0000123502325460001A16600018F8200ACA8 +:109100008F9900BCAC570008A33F00008F8A00BCB9 +:109110008F9800B8954F0002970E00122418FFBFD9 +:10912000020F682431C53FFF01A53825A54700027D +:10913000914C00022405FFDF3189003F35230040B8 +:10914000A14300028F9900BC8F8600D02409FFFF45 +:10915000AF2000048CCB007C2403FF80AF2B0008E1 +:109160009322000D3C0B8000305F007FA33F000D79 +:109170008F8E00BC91D0000D02187824A1CF000D75 +:109180008F8C00BC918D000D01A53824A187000DA6 +:109190008F8600BCACC90010ACD6001490CA001871 +:1091A0000143B025A0D600188F8F00BC8F9800B85F +:1091B0008DE20018004BF82403E8C825ADF900182B +:1091C0009310003EA1F0001C8F8E00B88F8D00BC64 +:1091D0008F8700D095C50004A5A5001E0E00020DC6 +:1091E0008CE500848F8700D00002614000022100DE +:1091F00090EA00BC01844821004028213156000239 +:1092000012C0000302E930210002B08000D63021F4 +:1092100090EC00BC318400041080000332EA0003AB +:109220000005C08000D83021240900048F9700BCBD +:10923000012A1023305F000300DFC821AEF90004CB +:109240000E000D19A62500388F9000D003C01821FC +:10925000146000020060B0210000902156C000861A +:109260008F9700B80012882B9609001002955023A2 +:109270003C14002002A91021A6020010AF540030B7 +:109280003154FFFF0000000096130010961F0012DB +:1092900013F30011000000008E17000C8E0C000864 +:1092A0000015C98002F94021001927C30119B02B0C +:1092B0000184782101F65821AE08000CAE0B00089D +:1092C0000014A82B023580241200FE6B8F9000D072 +:1092D0000A000F4200000000960B00148E050004E7 +:1092E0003163FFFF000370C000AE3821AF47003C80 +:1092F0008E0600048F4D003C00CDF0231BC00036CD +:10930000000000008E080000250200013C1600103D +:1093100036CF0008AF420038AF4F003000000000E9 +:10932000000000000000000000000000000000003D +:109330000000000000000000000000008F4400005A +:10934000308C00201180FFFD000000008F590400C8 +:109350003C170020AE1900088F550404AE15000C10 +:10936000AF570030000000003C0608008CC60044E7 +:109370002418000110D800D3000000009607001246 +:109380003C0508008CA5004000A76821A60D00122E +:10939000961E001427C90001A609001496020014A5 +:1093A0003044FFFF5486FFC70014A82B30A5FFFFF1 +:1093B0000E000F1DA60000143C0308008C6300245F +:1093C000960500120043702300AE3023A60600125B +:1093D0000A0011480014A82B8E0200000A00115B3D +:1093E0003C1600109156000124100001001678422E +:1093F00015F0001C97A8001E8D5F00142411C000FA +:1094000033FE3FFF0111C8243C1808008F1800608C +:10941000033EB82532E53FFF00B8502B1140001144 +:10942000A7B7001E3C1008008E1000588F8F00B0A8 +:1094300000057180240CFF80020F682101AE4821D5 +:109440003124007F012C5824009A28213C02000E70 +:10945000AF4B002C00A2302190C7000D34E3000474 +:10946000A0C3000D0E000D3B000000008F9000D047 +:10947000240300018F9700B826B900010019AC0041 +:10948000024390230015AC0326F8004002B3202AC3 +:109490000012882B240C000103005021009110249D +:1094A000AF9800B80A000F70AFAC001095560012CC +:1094B0008F8400B032C5FFFF0E000CEEA7B600147B +:1094C0008F9000D00A0011B4000018218D59003887 +:1094D000A620000824040003AE3900008D57003494 +:1094E000A220000A8F9800B8AE3700043C0F00801D +:1094F000930C003FA224000C8E28000C3C0BFF9F15 +:10950000A22C000B010F1825356EFFFF3C05FFEF65 +:109510008F9700B8006E682434A7FFFF01A730249E +:10952000AE26000C8EFE001496FF00128F8200B053 +:10953000AE3E00108EF00014AE200018AE200020C9 +:10954000AE300014AE2000248EE9001833F03FFF47 +:1095500000105180AE2900288EF900080142C02178 +:1095600033EC0001AE3900308EEB000C8F8500AC7F +:10957000001879C2000C238001E44021240E00026F +:10958000A628001CA6200036AE2B002CA0AE0000A2 +:109590009767003C8F8A00AC3C03420030EDFFFF30 +:1095A00001A33025AD4600048F9E00B824020001BF +:1095B0002408C0008FD1003824060034AD510018B3 +:1095C0008FC90034AD49001CAD40000CAD40001007 +:1095D000A5400014A5400016A5400020A54000228B +:1095E000AD400024A5560002A14200018F9F00ACAF +:1095F0008F9900B88F9800BCAFF600089337000031 +:10960000A31700008F8C00B88F8F00BC91840001DD +:10961000A1E400018F8D00BC95AB000201687024AD +:1096200001D02825A5A5000291A7000230E3003F44 +:10963000A1A300028F8300D08F8400BC907100BC76 +:10964000323E000253C0000124060030AC86000404 +:109650008C6F007C2403FFBFAC8F00089088000D46 +:10966000310B007FA08B000D8F8700BC90EE000DAA +:1096700001C32824A0E5000D8F9E00BC93CD000DF2 +:1096800035A60020A3C6000D8F8A00B88F9100BCBC +:109690008D500020AE3000108D490024AE290014FA +:1096A0008D420028AE2200188D5F002CAE3F001CBA +:1096B0000E000D19000000008F9000D00A00112E3E +:1096C00002C01821960A00123C1F08008FFF0024D8 +:1096D00003EA9821A61300120A0011480014A82BCF +:1096E000A08D00018F8900AC240C0001AD2C000876 +:1096F0000A0010488F8300D027BDFFE03C18080007 +:109700008F180050AFB00010AFBF0018AFB10014F9 +:10971000AF8400B093710074030478212410FF809B +:1097200031EE007F3225007F01F0582401DA6821F4 +:109730003C0C000AA38500C401AC2821AF4B0024D7 +:1097400094A900109768000690A600620080382156 +:10975000240200300109202330C300F0AF8500D07F +:10976000106200193090FFFF90AE0062240DFFF0F0 +:10977000240A005001AE6024318B00FF116A002FD3 +:109780000000000016000007241F0C00AF5F00243B +:109790008FB100148FBF00188FB0001003E00008D5 +:1097A00027BD00200E000F2302002021241F0C00E3 +:1097B000AF5F00248FB100148FBF00188FB000106E +:1097C00003E0000827BD002094A200E094A400E27A +:1097D00090BF0113008218263079FFFF33E700C0E5 +:1097E00014E000092F3100011600003800000000CD +:1097F0005620FFE6241F0C000E000DDE00000000C6 +:109800000A00127A241F0C001620FFDE0000000060 +:109810000E000DDE000000001440FFDC241F0C00D1 +:10982000160000228F8300D0906901133122003F7F +:10983000A06201130A00127A241F0C0094AF00D416 +:109840008F8600D400E02821240400050E000C7F40 +:1098500031F0FFFF1440000524030003979100E658 +:10986000000018212625FFFFA78500E68F5801B8C4 +:109870000700FFFE3C196013AF400180241F0C005D +:10988000AF500184007938253C101000AF470188A3 +:109890008FB10014AF5001B8AF5F00248FB000103B +:1098A0008FBF001803E0000827BD00200E000F2323 +:1098B000020020215040FFB5241F0C008F8300D0F0 +:1098C000906901130A0012A33122003F0E000F23FA +:1098D000020020211440FFAD241F0C0012200007BD +:1098E0008F8300D0906801133106003F34C20040DE +:1098F000A06201130A00127A241F0C000E000DDE74 +:10990000000000005040FFA1241F0C008F8300D0F6 +:10991000906801133106003F0A0012D334C20040A0 +:10992000AF9B00C803E00008AF8000EC3089FFFF68 +:10993000000940422D020041000929801440000224 +:109940000009504024080040000879400008C0C0C9 +:1099500001F85821256701A800EF702125CC007F70 +:10996000240DFF80018D18240065302100CA2821B4 +:1099700025640088240A00883C010800AC2A004CB9 +:109980003C010800AC240050AF8500D43C01080025 +:10999000AC2900603C010800AC2800643C010800D0 +:1099A000AC2700543C010800AC2300583C010800DF +:1099B000AC26005C03E0000800000000308300FFDC +:1099C00030C6FFFF30E400FF8F4201B80440FFFEC5 +:1099D00000034C00012438253C08600000E82025E5 +:1099E0003C031000AF450180AF460184AF440188BD +:1099F00003E00008AF4301B88F86001C3C096012E9 +:109A0000352700108CCB00043C0C600E358500100F +:109A1000316A00062D480001ACE800C48CC4000483 +:109A2000ACA431808CC2000894C30002ACA2318483 +:109A300003E00008A78300E43C0308008C630050A7 +:109A40008F8400E88F86001C2402FF800064C02100 +:109A50000302C824AF5900288CCD00043305007FD1 +:109A600000BA78213C0E000C01EE2821ACAD005864 +:109A70008CC80008AF8500D03C076012ACA8005C21 +:109A80008CCC001034E80010ACAC000C8CCB000C7B +:109A9000ACAB000894AA00143C0208008C420044BD +:109AA00025490001A4A9001494A400143083FFFFE9 +:109AB000106200178F8400D03C0A08008D4A0040D5 +:109AC000A4AA00128CCE0018AC8E00248CCD0014F9 +:109AD000AC8D00208CC70018AC87002C8CCC0014F7 +:109AE00024060001AC8C00288D0B00BC5166001AC6 +:109AF0008D0200B48D0200B8A482003A948F003A1F +:109B0000A48F003C948800D403E000083102FFFFDA +:109B10003C0908008D290024A4A000148F8400D0E3 +:109B2000A4A900128CCE0018AC8E00248CCD001499 +:109B3000AC8D00208CC70018AC87002C8CCC001496 +:109B400024060001AC8C00288D0B00BC5566FFEA92 +:109B50008D0200B88D0200B4A482003A948F003ABE +:109B6000A48F003C948800D403E000083102FFFF7A +:109B70008F86001C3C0C08008D8C0050240BFF804D +:109B80008CCD00083C03000C000D51C0018A40211F +:109B9000010B4824AF8A00E8AF49002890C70007AE +:109BA0003105007F00BA10210043282130E4000471 +:109BB0001080002FAF8500D090CF000731EE000855 +:109BC00011C0003C000000008CD9000C8CC40014B3 +:109BD0000324C02B13000026000000008CC2000CE0 +:109BE000ACA200648CCD00182402FFF8ACAD006874 +:109BF0008CCC0010ACAC00808CCB000CACAB0084E7 +:109C00008CCA001CACAA007C90A900BC0122402494 +:109C1000A0A800BC90C300073067000810E0000453 +:109C20008F8500D090AF00BC35EE0001A0AE00BC27 +:109C300090D90007333800011300000F8F8400D043 +:109C400024070020908200BC34490002A08900BC97 +:109C50008F8400D090880062310300F01467000602 +:109C6000240A0034AC8A00C00A0013B500000000CA +:109C70000A00138F8CC2001490CB000731660002DB +:109C800010C0000500000000908D00BC35AC000441 +:109C9000A08C00BC8F8400D090980113330F003F3C +:109CA000A08F01138F8E00D095C500D403E000086B +:109CB00030A2FFFFACA000640A0013900000000077 +:109CC00027BDFFD8AFB000108F90001CAFBF00249D +:109CD000AFB40020AFB20018AFB10014AFB3001C96 +:109CE0009613000E3C07600A3C1460063264FFFFC6 +:109CF000369300100E0012E234F404108F8400D466 +:109D00003C11600E0E0009BE36310010920E001597 +:109D10003C0708008CE700603C12601231CD000F58 +:109D2000A38D00F08E0E00048E0D00089608001220 +:109D3000961F00109619001A9618001E960F001C08 +:109D4000310CFFFF33EBFFFF332AFFFF3309FFFF27 +:109D500031E6FFFF3C010800AC2B00403C0108004D +:109D6000AC2C00243C010800AC2A0044AE29317818 +:109D7000AE26317C92020015960300163652001072 +:109D8000304400FF3065FFFF3C0608008CC60064CD +:109D9000AE243188AE4500B492080014961900181C +:109DA000241F0001011FC004332FFFFF3C050800E2 +:109DB0008CA50058AE5800B8AE4F00BC920C0014F1 +:109DC000AF8E00D8AF8D00DC318B00FFAE4B00C0F2 +:109DD000920A0015AE670048AE66004C314900FF9C +:109DE000AE4900C8AE65007C3C0308008C6300509F +:109DF0003C0408008C84004C3C0808008D0800548A +:109E00003C0208008C42005C8FBF0024AE630080DF +:109E10008FB00010AE8300748FB3001CAE22319C53 +:109E2000AE4200DCAE2731A0AE2631A4AE24318C88 +:109E3000AE233190AE283194AE253198AE870050D4 +:109E4000AE860054AE8500708FB10014AE4700E0BE +:109E5000AE4600E4AE4400CCAE4300D0AE4800D4E1 +:109E6000AE4500D88FB400208FB2001803E0000880 +:109E700027BD002827BDFFE0AFB10014AFBF001819 +:109E8000241100010E000868AFB000101051000549 +:109E9000978400E6978300CC0083102B14400008C1 +:109EA0008F8500D4240700028FBF00188FB10014E3 +:109EB0008FB0001000E0102103E0000827BD002053 +:109EC0000E000C9D24040005AF8200E81040FFF650 +:109ED000240700020E00086C8F90001C979F00E67C +:109EE0008F9900E88F8D00C827EF0001240E0050E5 +:109EF000AF590020A78F00E6A1AE00003C0C08007F +:109F00008D8C00648F8600C8240A8000000C5E00DF +:109F1000ACCB0074A4C0000694C9000A241FFF80C3 +:109F20003C0D000C012AC024A4D8000A90C8000AE5 +:109F300024182000011F1825A0C3000A8F8700C81D +:109F4000A0E000788F8500C800003821A0A0008321 +:109F50003C0208008C4200508F8400E800447821C5 +:109F600001FFC824AF590028960B000231EE007F94 +:109F700001DA6021018D3021A4CB00D4960A0002C1 +:109F8000AF8600D03C0E000425492401A4C900E698 +:109F90008E080004ACC800048E030008ACC30000A7 +:109FA000A4C00010A4C00014A0C000D08F8500D0B1 +:109FB0002403FFBFA0A000D13C0408008C840064EF +:109FC0008F8200D0A04400D28E1F000C8F8A00D058 +:109FD000978F00E4AD5F001C8E1900102410003034 +:109FE000AD590018A5400030A5510054A5510056A8 +:109FF000A54F0016AD4E0068AD580080AD580084E6 +:10A00000914D006231AC000F358B0010A14B006206 +:10A010008F8600D090C900633128007FA0C80063FC +:10A020008F8400D02406FFFF9085006300A31024D6 +:10A03000A08200638F9100D000E01021923F00BC0D +:10A0400037F90001A23900BC8F8A00D0938F00F04D +:10A05000AD580064AD5000C0914E00D3000F6900B0 +:10A0600031CC000F018D5825A14B00D38F8500D036 +:10A070008F8900DCACA900E88F8800D88FBF00185A +:10A080008FB100148FB0001027BD0020ACA800ECE9 +:10A09000A4A600D6A4A000E0A4A000E203E000086B +:10A0A0000000000027BDFFE0AFB000108F90001C43 +:10A0B000AFB10014AFBF00188E1900043C1808009F +:10A0C0008F180050240FFF80001989C002387021BA +:10A0D00031CD007F01CF602401BA50213C0B000C30 +:10A0E000AF4C0028014B4021950900D4950400D6BF +:10A0F0008E0700043131FFFFAF8800D00E00093613 +:10A10000000721C08E0600048F8300C8000629C006 +:10A11000AF4500209064003E3082004014400006AD +:10A120008F8400D0341FFFFF948300D63062FFFF7E +:10A13000145F000400000000948400D60E0008CBD9 +:10A140003084FFFF8E050004022030218FBF0018ED +:10A150008FB100148FB000102404002200003821B9 +:10A16000000529C00A00130627BD002027BDFFE017 +:10A17000AFB100143091FFFFAFB00010AFBF0018B7 +:10A180001220001D000080218F86001C8CC500005D +:10A190002403000600053F020005140230E4000716 +:10A1A00014830015304500FF2CA800061100004D57 +:10A1B000000558803C0C0800258C5A0C016C50217D +:10A1C0008D49000001200008000000008F8E00EC87 +:10A1D000240D000111CD005900000000260B0001E4 +:10A1E0003170FFFF24CA00200211202B01403021D2 +:10A1F0001480FFE6AF8A001C020010218FBF0018F8 +:10A200008FB100148FB0001003E0000827BD0020BC +:10A21000938700CE14E00038240400140E0013C706 +:10A22000000000008F86001C240200010A00150EA9 +:10A23000AF8200EC8F8900EC240800021128003B5B +:10A24000240400130000282100003021240700010D +:10A250000E001306000000000A00150E8F86001C79 +:10A260008F8700EC2405000214E5FFF62404001299 +:10A270000E001373000000008F8500E800403021BD +:10A28000240400120E001306000038210A00150EE7 +:10A290008F86001C8F8300EC241F0003147FFFD0E7 +:10A2A000260B00010E001325000000008F8500E83A +:10A2B0000040302124020002240400100000382154 +:10A2C000AF8200EC0E001306000000000A00150E1D +:10A2D0008F86001C8F8F00EC2406000211E6000B15 +:10A2E000000000002404001000002821000030219C +:10A2F0000A00152B24070001000028210E00130678 +:10A30000000030210A00150E8F86001C0E00143448 +:10A3100000000000144000128F99001C8F86001C62 +:10A32000240200030A00150EAF8200EC0E0014C0D8 +:10A33000000000000A00150E8F86001C0E00131589 +:10A340000000000024020002240400140000282160 +:10A3500000003021000038210A001548AF8200ECCF +:10A360000040382124040010973800020000282102 +:10A370000E0013063306FFFF0A00150E8F86001C21 +:10A380008F8400C83C077FFF34E6FFFF8C85007494 +:10A390002402000100A61824AC83007403E0000826 +:10A3A000A082000510A000362CA20080274A0400DD +:10A3B0003C0B0005240900801040000724080080A1 +:10A3C00030A6000F00C540212D030081146000025B +:10A3D00000A0482124080080AF4B0030000000009E +:10A3E00000000000000000001100000900003821FA +:10A3F000014030218C8D000024E7000400E8602B30 +:10A40000ACCD0000248400041580FFFA24C60004AB +:10A410000000000000000000000000003C0E0006EC +:10A42000010E3825AF47003000000000000000009A +:10A43000000000008F4F000031E800101100FFFD08 +:10A44000000000008F42003C8F43003C0049C821BF +:10A450000323C02B13000004000000008F4C0038C1 +:10A4600025860001AF4600388F47003C00A928230D +:10A4700000E96821AF4D003C14A0FFCE2CA2008063 +:10A4800003E000080000000027BDFFD03C020002EE +:10A49000AFB100143C11000CAF450038AFB3001C45 +:10A4A000AF46003C00809821AF4200302405008870 +:10A4B000AF44002803512021AFBF0028AFB50024CE +:10A4C000AFB40020AFB200180E001580AFB000107E +:10A4D0003C1F08008FFF004C3C1808008F180064D8 +:10A4E0002410FF8003F3A82132B9007F02B0782442 +:10A4F0000018A0C0033A70210018914001D120211A +:10A50000AF4F00280E001580025428213C0D080092 +:10A510008DAD00502405012001B35821316C007F1E +:10A5200001705024019A4821013120210E0015802C +:10A53000AF4A00283C0808008D0800543C0508007C +:10A540008CA500640113382130E6007F00F0182448 +:10A5500000DA202100912021AF4300280E00158051 +:10A56000000529403C0208008C4200583C100800BD +:10A570008E1000601200001C005388212415FF80FB +:10A580000A0016033C14000C3226007F0235182402 +:10A5900000DA202102402821AF4300280094202126 +:10A5A0000E0015802610FFC01200000F0232882115 +:10A5B0002E05004110A0FFF4241210003226007F67 +:10A5C000001091800235182400DA20210240282151 +:10A5D000AF430028009420210E0015800000802148 +:10A5E0001600FFF3023288213C0B08008D6B005CE3 +:10A5F000240AFF802405000201734021010A482437 +:10A60000AF4900283C040800948400623110007FA8 +:10A61000021A88213C07000C0E000CCD022798215D +:10A6200000402821026020218FBF00288FB5002420 +:10A630008FB400208FB3001C8FB200188FB10014AC +:10A640008FB000100A00158027BD00308F83001CDA +:10A650008C620004104000030000000003E00008CA +:10A66000000000008C6400108C6500080A0015B919 +:04A670008C66000CE8 +:0CA67400000000000000001B0000000FB0 +:10A680000000000A000000080000000600000005AD +:10A6900000000005000000040000000400000003AA +:10A6A000000000030000000300000003000000039E +:10A6B0000000000200000002000000020000000292 +:10A6C0000000000200000002000000020000000282 +:10A6D0000000000200000002000000020000000272 +:10A6E0000000000200000002000000020000000163 +:08A6F000000000010000000160 +:08A6F80008000F5808000DB026 +:10A7000008000FEC0800109408000F8008000FC02C +:10A71000080011CC08000DCC080011F008000E1C38 +:10A7200008001630080015D808000DCC08000DCC24 +:10A7300008000DCC0800127C0800127C08000DCC2B +:10A7400008000DCC0800157C08000DCC08000DCCCD +:10A7500008000DCC08000DCC080013EC08000DCC4F +:10A7600008000DCC08000DCC08000DCC08000DCC65 +:10A7700008000DCC08000DCC08000DCC08000DCC55 +:10A7800008000DCC08000DCC08000DCC08000DCC45 +:10A7900008000DCC08000FE008000DCC08000DCC1F +:10A7A0000800152C08000DCC08000DCC08000DCCBD +:10A7B00008000DCC08000DCC08000DCC08000DCC15 +:10A7C00008000DCC08000DCC08000DCC08000DCC05 +:10A7D00008000DCC08000DCC08000DCC08000DCCF5 +:10A7E00008000DCC08000DCC0800145808000DCC52 +:10A7F00008000DCC08001370080012E008002EA01D +:10A8000008002EA808002E7008002E7C08002E8854 +:10A8100008002E94080046C008003F0C080046407F +:10A82000080046C0080046C0080044C0080046C0F2 +:10A830000800470808005530080054F0080054BCD0 +:0CA84000080054900800546C08005428D4 +:04A84C000A000C767C +:10A8500000000000000000000000000D727870355C +:10A860002E302E306A330000050000030000000087 +:10A8700000000001000000000000000000000000D7 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000001000000300000000E3 +:10DA30000000000D0000000D3C020800244271406F +:10DA40003C030800246375E0AC4000000043202B39 +:10DA50001480FFFD244200043C1D080037BD7FFCFC +:10DA600003A0F0213C100800261031D83C1C08000F +:10DA7000279C71400E0010ED000000000000000D1A +:10DA800030A5FFFF30C600FF274301808F4201B859 +:10DA90000440FFFE24020002AC640000A4650008FC +:10DAA000A066000AA062000B3C021000AC670018E0 +:10DAB00003E00008AF4201B83C0360008C624FF8FD +:10DAC0000440FFFE3C020200AC644FC0AC624FC495 +:10DAD0003C02100003E00008AC624FF89482000C96 +:10DAE0002486001400A038210002130200021080D6 +:10DAF0000082402100C8102B104000570000000099 +:10DB000090C300002C6200095040005190C20001F7 +:10DB1000000310803C030800246370F000431021D0 +:10DB20008C420000004000080000000090C300018B +:10DB30002402000A1462003A0000000001061023CB +:10DB40002C42000A1440003624C600028CE2000079 +:10DB500034420100ACE2000090C2000090C300011A +:10DB600090C4000290C5000300031C0000021600D0 +:10DB70000043102500042200004410250045102514 +:10DB800024C60004ACE2000490C2000090C300016F +:10DB900090C4000290C500030002160000031C00A0 +:10DBA00000431025000422000044102500451025E4 +:10DBB00024C600040A000CAAACE2000890C30001CD +:10DBC000240200041462001624C6000290C2000061 +:10DBD00090C400018CE300000002120000441025F4 +:10DBE0003463000424C60002ACE2000C0A000CAA54 +:10DBF000ACE3000090C3000124020003146200089B +:10DC000024C600028CE2000090C3000024C600017C +:10DC100034420008A0E300100A000CAAACE20000A5 +:10DC200003E000082402000190C300012402000266 +:10DC30001062000224C40002010020210A000CAA84 +:10DC4000008030210A000CAA24C6000190C2000105 +:10DC50000A000CAA00C2302103E0000800001021D5 +:10DC600027BDFFE8AFBF0014AFB000100E0011FEDB +:10DC700000808021936200052403FFFE0200202122 +:10DC8000004310248FBF00148FB00010A362000562 +:10DC90000A00120727BD001827BDFFE8AFB000102B +:10DCA000AFBF00140E000F180080802193620000A7 +:10DCB00024030050304200FF1443000424020100FA +:10DCC000AF4201800A000D2202002021AF400180F6 +:10DCD000020020218FBF00148FB000100A000F79BE +:10DCE00027BD001827BDFF80AFBE0078AFB7007416 +:10DCF000AFB30064AFBF007CAFB60070AFB5006CCF +:10DD0000AFB40068AFB20060AFB1005CAFB0005814 +:10DD10008F5001289363003F936200050000F021BB +:10DD2000307300FF00021027304200010000B821CC +:10DD300014400066AFA000509342011693430112B5 +:10DD4000304200FF306300FF0342202103431021D3 +:10DD5000244540008F820018104000182491400094 +:10DD60008F4201043C0300010043102410400013C3 +:10DD7000000000008CA3000C8F620030146201B51B +:10DD8000240200018CA300108F62002C146201B1E8 +:10DD9000240200019762003A948340003042FFFF62 +:10DDA000146201AC2402000197620038962300023D +:10DDB0003042FFFF146201A72402000193620000B9 +:10DDC000304300FF240200201062000524020050AE +:10DDD00010620006000000000A000D6C0000000048 +:10DDE0000000000D0A000D75AFA000303C1E0800B9 +:10DDF00027DE71A00A000D75AFA000303C020800BC +:10DE00008C4200DC244200013C010800AC2200DC12 +:10DE10000E0012C8000000000A000F038FBF007C34 +:10DE20008F4201043C0300209234000D0043102473 +:10DE30000002202B00042140AFA400308F430104D6 +:10DE40003C02004000621824146000023487004045 +:10DE50000080382132820020AFA700301440000239 +:10DE600034E6008000E0302110C0000BAFA6003087 +:10DE700093C500088F67004C0200202100052B008D +:10DE800034A5008130A5F0810E000C8D30C600FF56 +:10DE90000A000F00000000009362003E3042004084 +:10DEA0001040000E240200045662000624020012F4 +:10DEB000020020210E0013D6022030210A000F0399 +:10DEC0008FBF007C16620005000000000E000D13DD +:10DED000000020210A000F038FBF007C9743011A26 +:10DEE0009624000E93620035328500043076FFFFE1 +:10DEF00000442004AFA400548E32000410A000158A +:10DF00008E3500089362003E30420040104000070A +:10DF1000000000000E001318024020211040000DE8 +:10DF2000000000000A000F00000000008F620044A3 +:10DF30000242102304400145000000008F620048A7 +:10DF40000242102304410141240400160A000E037A +:10DF50008FC200048F620048024210230440000870 +:10DF6000000000003C0208008C4231002442000105 +:10DF70003C010800AC2231000A000EF50000000050 +:10DF80008F62004002421023184000092402000C56 +:10DF90003C0208008C423100329400FC0000B021A9 +:10DFA000244200013C010800AC2231002402000C94 +:10DFB000AFA200308F620040005220231880000D75 +:10DFC00002C4102A14400116000000001496000636 +:10DFD00002C410233A8200013042000114400110B3 +:10DFE0000000000002C41023024490210A000DEB3F +:10DFF0003056FFFF00002021328200021040001A3C +:10E00000328200109362003E3042004050400011C6 +:10E010008FC200040E0011FE02002021240200180D +:10E02000A362003F936200052403FFFE020020214B +:10E03000004310240E001207A362000524040039D7 +:10E04000000028210E001301240600180A000F0208 +:10E0500024020001240400170040F8090000000019 +:10E060000A000F0224020001104000F80000000026 +:10E070008F63004C8F62005402A210231C4000F3F7 +:10E0800002A31023044200010060A821AFA40018DD +:10E09000AFB20010AFB60014934201208F6500406C +:10E0A0009763003C304200FF0342102100441021DE +:10E0B0008FA400543063FFFF244240000083182BDC +:10E0C0008FA40030AFA20020AFA500280083202538 +:10E0D000AFA40030AFA50024AFA0002CAFB5003432 +:10E0E0009362003E30420008504000118FC2000091 +:10E0F0000220202127A500380E000CA4AFA0003874 +:10E100005440000B8FC200008FA200383042010043 +:10E11000504000078FC200008FA3003C8F62006058 +:10E120000062102304430001AF6300608FC200004F +:10E130000040F80927A400108FA2003030420002EE +:10E1400054400001329400FE9362003E3042004091 +:10E15000104000378FA300148F62005416A2001ADB +:10E160003282000124020014126200102A6200159B +:10E1700010400006240200162402000C1262000760 +:10E18000328200010A000E5F0000000012620005EA +:10E19000328200010A000E5F000000000A000E5AE1 +:10E1A0002417000E0A000E5A241700100A000E5EF3 +:10E1B00024170012936200232403FFBD00431024A0 +:10E1C000A362002332820001104000198FA30014C3 +:10E1D0002402000C1262000E2A62000D104000069C +:10E1E0002402000E2402000A126200078FA20024FB +:10E1F0000A000E7724420001126200088FA2002458 +:10E200000A000E77244200010A000E752417000848 +:10E210002402000E16E20002241700162417001034 +:10E220008FA2002424420001AFA200248FA3001477 +:10E230008FA200248F73004000431021AF62004082 +:10E240008FA20054936400368F63004002A288219D +:10E250003402FFFF0082100400621821AF630048FF +:10E260008FA6003030C200081040000E00000000F1 +:10E270008F6200581622000430C600FF9742011A30 +:10E280005040000134C6001093C500088FA7003429 +:10E290000200202100052B0034A500800E000C8D0B +:10E2A00030A5F0808F620040005310231840001703 +:10E2B0008FA200183C0208008C42319830420010B6 +:10E2C0001040000924020001976200681440000613 +:10E2D00024020001A76200689742007A2442000AE3 +:10E2E0000A000EBBA7620012A76200120E0011FE08 +:10E2F000020020219362007D2403000102002021FE +:10E30000344200010A000EB9AFA300501840000AC1 +:10E31000000000000E0011FE020020219362007D2B +:10E320002403000102002021AFA300503442000466 +:10E330000E001207A362007D9362003E304200404F +:10E340001440000C328200011040000A000000005E +:10E350008F6300408FC2000424040018246300016E +:10E360000040F809AF6300408FA200300A000F029E +:10E37000304200048F62005810510010000000006D +:10E380008F620018024210231C4000082404000180 +:10E390008F62001816420009000000008F62001C06 +:10E3A00002A210230440000500000000AF710058D5 +:10E3B000AFA40050AF720018AF75001C12E0000B44 +:10E3C0008FA200500E0011FE02002021A377003F13 +:10E3D0000E0012070200202102E030212404003741 +:10E3E0000E001301000028218FA2005010400003EE +:10E3F000000000000E000C9B0200202112C000054E +:10E40000000018218FA2003030420004504000115B +:10E4100000601021240300010A000F020060102197 +:10E420000E0011FE020020219362007D02002021D7 +:10E43000344200040E001207A362007D0E000C9B04 +:10E44000020020210A000F0224020001AF40004414 +:10E45000240200018FBF007C8FBE00788FB700744C +:10E460008FB600708FB5006C8FB400688FB30064F6 +:10E470008FB200608FB1005C8FB0005803E00008DD +:10E4800027BD00808C8700048C86000000001021CE +:10E4900000E5382100E5282B00C2302100C53021DD +:10E4A000AC87000403E00008AC8600008F4201B88E +:10E4B0000440FFFE24020800AF4201B803E0000858 +:10E4C000000000003C0200080342282194A20048FA +:10E4D0003084FFFF1040001B2484001294A20048E7 +:10E4E0003042FFFF0044102A1040001724020003AE +:10E4F0002402001A93430120A342018B8F82000063 +:10E50000306300FF30424000104000092463FFFEEA +:10E5100094A200483042FFFF0043102B1440000536 +:10E520008F820004A74301940A000F3C344200018B +:10E530008F8200042403FFFE0043102403E0000840 +:10E54000AF8200042402000303E00008A342018B11 +:10E5500027BDFFE0AFB20018AFB10014AFB000109C +:10E56000AFBF001C30B1FFFF30D0FFFF30F2FFFF24 +:10E570008F4201B80440FFFE00000000AF4401805C +:10E58000AF4400200E000F1E020020218F830000E8 +:10E590008F840004A751018CA750018EA7430190DE +:10E5A0008F83000830828000AF4301A8A752018802 +:10E5B0001040000E8F82000493420116304200FC8E +:10E5C00024420004005A10218C4240003042FFFFD8 +:10E5D000144000068F8200043C02FFFF34427FFF9C +:10E5E00000821024AF8200048F8200042403BFFF46 +:10E5F00000431024A74201A69743010C8F42010457 +:10E6000000031C003042FFFF00621825AF4301AC3D +:10E610003C021000AF4201B88FBF001C8FB200183F +:10E620008FB100148FB0001003E0000827BD002058 +:10E630003C0208008C42003827BDFFC8AFB200285A +:10E64000AFBF0030AFB3002CAFB10024AFB000209B +:10E65000000090213C0E080025CE00381440000236 +:10E66000244DFFFF000068218F84000030824000AD +:10E670001040000A308280003C02002000821024FA +:10E6800050400006308280008F8200042403BFFFC8 +:10E69000008318240A000F9D344210001040000A25 +:10E6A0003C02002000821024104000078F820004EA +:10E6B0003C03FFFF34637FFF008318243442800053 +:10E6C000AF820004AF8300008F48007093420112B4 +:10E6D0008F860000304200FF0002288230C2010015 +:10E6E0001040004324A4000330C24000104000103A +:10E6F00030C2200000041080005A10218C434000DA +:10E7000024A4000400041080AFA30010005A1021BC +:10E710008C424000AFA2001493420116304200FC2C +:10E72000005A10218C4240000A000FC4AFA200180A +:10E730001040002F00041080005A10218C4340002C +:10E7400024A4000400041080AFA30010005A10217C +:10E750008C424000AFA00018AFA200148FA900188F +:10E760000000382100002021240C000827AB0010F5 +:10E770003C0A0800254A010001641021148C0003A2 +:10E7800000042A001120000A00000000904200004E +:10E79000248400012C83000C00A2102100021080B0 +:10E7A000004A10218C4200001460FFF300E238267A +:10E7B0003C0408008C8431048F4200702C830020BC +:10E7C00010600009004840233C030800246331081E +:10E7D000000410800043102124830001AC48000095 +:10E7E0003C010800AC2331040A000FEFAF8700089A +:10E7F0009743011E9742011C3063FFFF0002140083 +:10E8000000621825AF8300089742010C8F43400037 +:10E810003044FFFF3402FFFF1462000300000000D9 +:10E820000A000FFB241200208F42400030420100FA +:10E83000544000012412001030C210005040001457 +:10E840003652000130C200201440000B3C02100080 +:10E8500000C210245040000E365200013C030E004E +:10E860003C020DFF00C318243442FFFF0043102B6D +:10E8700050400007365200013C0208008C42002C38 +:10E88000244200013C010800AC22002C3652000555 +:10E890003C0508008CA5003454A000248F8400009F +:10E8A0008F82000C544000218F8400008F8200046E +:10E8B000304240005440001D8F8400003C021F0184 +:10E8C00000C288243C021000562200188F840000E9 +:10E8D00030820200144000158F8400009750010E12 +:10E8E000AF400180AF400020261000043210FFFF2F +:10E8F0000E000F1E020020218F8300042402BFFFA0 +:10E90000364400020062182424020002A742018C4F +:10E910008F820000A750018EA7440188A74301A65B +:10E92000A7420190AF5101B80A0010D93C02000182 +:10E93000008210241040000C3C0210003C02080031 +:10E940008C4200D89746010E240400802442000126 +:10E9500030C6FFFF240500023C010800AC2200D8AD +:10E960000A0010E324070003008210241040004531 +:10E97000000000003C0208008C4200301040000DF6 +:10E980008F820004304240001040000A3C030F0018 +:10E99000008318243C0201000043102B14400005A2 +:10E9A000000000009746010E364700020A0010E002 +:10E9B0002404008010A0000D308201001040000BE4 +:10E9C0003C020F00008210243C03020010430007A9 +:10E9D0008F820008004D1024004E10219042000448 +:10E9E000244200040A00108B000221C00000000035 +:10E9F0008F8600003C0508008CA500D0000616029A +:10EA00003050000F38A200012C4200012E03000CF0 +:10EA10000043102414400018001021C02602FFFCFF +:10EA20002C420004544000140000202138A20002AF +:10EA30002C42000100431024104000030006124243 +:10EA40000A00108B000020210010182B0043102416 +:10EA500050400009001021C09746010E00002021FF +:10EA60002405000224C6000430C6FFFF0E000F413B +:10EA70003247FFFB001021C09746010E0A0010E04C +:10EA8000364700028F4240003C1108008E310024BE +:10EA90003042010010400048322200010220802153 +:10EAA00010A00017325300043082010010400015FE +:10EAB000240200013C020F00008210243C030200EB +:10EAC0001043000F8F8200089746010E0240382144 +:10EAD000004D1024004E10219044000424C6000470 +:10EAE00030C6FFFF24840004000421C00E000F4143 +:10EAF000240500022402FFFE022280243252FFFB82 +:10EB00002402000116020007320200013242000412 +:10EB100050400001365200029746010E0A0010DFF5 +:10EB2000024038211040000A320200049746010ECC +:10EB3000024038210000202124C6000430C6FFFF17 +:10EB40000E000F41240500023252FFFB3202000486 +:10EB50001040000B8F820000304208001040000877 +:10EB6000000000009746010E0240382124040100F5 +:10EB700024C6000430C6FFFF0E000F41240500022A +:10EB8000166000188FBF0030274301808F4201B804 +:10EB90000440FFFE24022000A462000824020002B8 +:10EBA000A062000BA46000103C021000AF4201B84C +:10EBB0000A0010E68FBF00301040000A8FBF0030FF +:10EBC0009746010E364700020000202124C60004AB +:10EBD00030C6FFFF240500020E000F4100000000B8 +:10EBE0008FBF00308FB3002C8FB200288FB100246C +:10EBF0008FB000200000102103E0000827BD00387E +:10EC000027BDFFE8AFB000103C04600CAFBF00149C +:10EC10008C8250002403FF7F3C1A800000431024A4 +:10EC20003442380CAC825000240200033C106000D7 +:10EC3000AF4200088E0208083C1B80083C01080017 +:10EC4000AC2000203042FFF0384200102C4200017E +:10EC50000E001B35AF8200183C04FFFF3C0204008D +:10EC6000348308063442000CAE021948AE03194C36 +:10EC70003C0560168E0219808CA30000344202000D +:10EC800000641824AE0219803C025353146200033E +:10EC900034A47C008CA20004005020218C82007CD3 +:10ECA0008C830078AF820014AF8300103C02800098 +:10ECB000344200708C43000000403821AF83001CB8 +:10ECC000006030218CE800003C0508008CA500FCA9 +:10ECD0003C0408008C8400F8010630230000102159 +:10ECE00000A6282100A6302B0082202100862021AA +:10ECF0003C010800AC2500FC3C010800AC2400F8F5 +:10ED00008F500000320200031040FFEE010030215E +:10ED10008CE600003C0508008CA500FC3C040800C3 +:10ED20008C8400F800C8302300A6282100001021A0 +:10ED300000A6302B0082202100862021320700010E +:10ED40003C010800AC2500FCAF88001C3C01080019 +:10ED5000AC2400F810E00064320200028F42012867 +:10ED6000AF4200208F4201048F430100AF820000B8 +:10ED70000E000F18AF8300048F4340003402FFFFE2 +:10ED800014620006000000009745010E3C040800D4 +:10ED9000248400F00A00115B000000008F42400054 +:10EDA000304201001040000B000000009745010EAA +:10EDB0003C040800248400E80E000F0E30A5FFFF7D +:10EDC0009745010E3C040800248431C80A001172E2 +:10EDD000000000008F4340008F8200101462000A80 +:10EDE000000000008F4340048F820014146200066C +:10EDF000000000009745010E3C040800248431B84F +:10EE00000A001172000000009745010E3C04080042 +:10EE1000248400E00E000F0E30A5FFFF3C02080026 +:10EE20008C4200C0104000088F8400003C020800A3 +:10EE30008C4200C4244200013C010800AC2200C402 +:10EE40000A00119F000000003C0200100082102404 +:10EE50001440000A8F8300043C0208008C4200200A +:10EE6000244200013C010800AC2200200E000F7972 +:10EE7000000020210A00119D000000002402BFFFB5 +:10EE8000006210241040000800000000240287FFE8 +:10EE900000621024144000083C020060008210242C +:10EEA00010400005000000000E000D2600000000CC +:10EEB0000A00119D000000000E0011E80000000093 +:10EEC000104000063C0240008F4301243C026020B9 +:10EED000AC430014000000003C024000AF42013887 +:10EEE00000000000320200021040FF713C0280006E +:10EEF0008F4201403C044000AF4200208F43014854 +:10EF00003C027000006218241064002D0000000014 +:10EF10000083102B144000063C0260003C022000DD +:10EF2000106200073C0240000A0011E400000000EB +:10EF300010620027000000000A0011E43C024000BB +:10EF40008F4201482403000400021402304200FFF3 +:10EF50001443000B274401808F4301408F4201B8C6 +:10EF60000440FFFE2402001CAC830000A082000BC2 +:10EF70003C021000AF4201B80A0011E43C0240001C +:10EF80008F4201B80440FFFE000000008F4201489C +:10EF900000021402A482000824020002A082000BD6 +:10EFA0008F420148A48200108F420144AC820024A9 +:10EFB0003C021000AF4201B80A0011E43C024000DC +:10EFC0000E00120C000000000A0011E43C02400098 +:10EFD0000E001B42000000003C024000AF420178DE +:10EFE000000000000A0011193C0280008F4201005D +:10EFF0003042003E1440001124020001AF4000489E +:10F000008F420100304207C01040000500000000A0 +:10F01000AF40004CAF40005003E000082402000164 +:10F02000AF400054AF4000408F42010030423800F2 +:10F0300054400001AF4000442402000103E00008F6 +:10F04000000000003C0290003442000100822025B4 +:10F05000AF4400208F4200200440FFFE000000006B +:10F0600003E00008000000003C0280003442000180 +:10F070000082202503E00008AF44002027BDFFE008 +:10F08000AFB20018AFBF001CAFB10014AFB000109A +:10F090008F5001408F5101483C02800000119402C2 +:10F0A00002222024324300FF2402000E1062008A54 +:10F0B0002862000F10400012286200372402000668 +:10F0C0001062003B2862000710400007240200097C +:10F0D0001060001A240200011062002500000000E8 +:10F0E0000A0012C1000000001062007B2402000B25 +:10F0F0001062005B3222FFFF0A0012C10000000014 +:10F1000010400008240200382862003510400080BA +:10F110002402001F1062007E000000000A0012C1DD +:10F12000000000001062007A240200801062004299 +:10F13000000000000A0012C1000000008F4201B868 +:10F140000440FFFE24020001AF500180AF40018463 +:10F15000A7520188A342018A24020002A342018B24 +:10F16000A75101908F4201440A0012BCAF4201A492 +:10F170001080000A240200023C010800A0227190C5 +:10F180003C010800AC3071988F4201443C010800FA +:10F19000AC2271940A0012C38FBF001C8F4201B8C9 +:10F1A0000440FFFE240200020A0012A60000000034 +:10F1B0008F4201B80440FFFE00000000AF50018004 +:10F1C0003C0208009042719010400003000018219A +:10F1D0003C0308008C637198AF430184A7520188F7 +:10F1E0003C02080090427190000018213442000156 +:10F1F000A342018A24020002A342018BA75101907D +:10F200008F420144AF4201A43C0208009042719039 +:10F21000104000033C0210003C0308008C63719412 +:10F22000AF4301A8AF4201B83C010800A020719093 +:10F230000A0012C38FBF001C8F4201B80440FFFEBA +:10F2400024020002A342018BA7520188A75101901A +:10F250008F420144A74201920A0012BE3C021000F4 +:10F260001440001D000000009362000530420004BD +:10F2700014400037000000000E0011FE02002021A3 +:10F280009362000502002021344200040E001207A0 +:10F29000A36200059362000530420004144000029E +:10F2A000000000000000000D936200002403002015 +:10F2B000304200FF14430008000000008F4201B8F4 +:10F2C0000440FFFE24020005AF500180A342018BE1 +:10F2D0003C021000AF4201B88F4201B80440FFFE6B +:10F2E00024020002AF400180AF500184A752018880 +:10F2F000A342018AA342018BA7510190AF4001A410 +:10F300008F420144AF4201A80A0012BE3C02100025 +:10F310008F4201B80440FFFE24020001AF5001807B +:10F32000AF400184A7520188A342018A240200024F +:10F33000A342018BA7510190AF4001A4AF4001A8A7 +:10F340003C021000AF4201B80A0012C38FBF001C7C +:10F350000000000D8FBF001C8FB200188FB1001489 +:10F360008FB0001003E0000827BD002027BDFFE894 +:10F37000AFBF00100E000F1800000000AF4001806A +:10F380008FBF0010000020210A000F7927BD001850 +:10F390003084FFFF30A5FFFF000018211080000718 +:10F3A00000000000308200011040000200042042F2 +:10F3B000006518210A0012D40005284003E0000867 +:10F3C0000060102110C0000624C6FFFF8CA20000C0 +:10F3D00024A50004AC8200000A0012DE248400048C +:10F3E00003E000080000000010A0000824A3FFFFB5 +:10F3F000AC86000000000000000000002402FFFFB7 +:10F400002463FFFF1462FFFA2484000403E0000871 +:10F410000000000027BDFFE8AFBF0014AFB0001030 +:10F420000E0011FE008080219362007D02002021E9 +:10F43000344200200E001207A362007D020020214A +:10F440008FBF00148FB000100A000C9B27BD00185E +:10F45000308300FF30A500FF30C600FF2747018042 +:10F460008F4201B80440FFFE000000008F420128D7 +:10F4700034634000ACE2000024020001ACE0000470 +:10F48000A4E30008A0E2000A24020002A0E2000BAC +:10F490003C021000A4E50010ACE00024ACE0002821 +:10F4A000A4E6001203E00008AF4201B827BDFFE860 +:10F4B000AFBF00109362003F24030012304200FFF0 +:10F4C0001043000D008030218F6200440082102321 +:10F4D0000440000A8FBF00108F62004824040039E6 +:10F4E0000000282100C21023044100042406001259 +:10F4F0000E001301000000008FBF00102402000165 +:10F5000003E0000827BD001827BDFFC8AFB1002CDD +:10F5100000A08821AFB2003027A500100080902104 +:10F5200002202021AFBF0034AFB000280E000CA491 +:10F53000AFA0001010400009024020218E220008D8 +:10F54000AF6200840E0012F2AF6000402404003865 +:10F550002405008D0A0013CD240600129362003E9C +:10F56000304200081040000F8FA20010304201000E +:10F57000104000078FA300148F6200600062102308 +:10F5800004430008AF6300600A0013560000000047 +:10F59000AF6000609362003E2403FFF70043102435 +:10F5A000A362003E9362003E304200081440000215 +:10F5B0002406000300003021936200349363003777 +:10F5C0008F640084304200FF306300FF0066182122 +:10F5D000000318800043282100A4202B1080000B7A +:10F5E000000000009763003C8F6200843063FFFFDF +:10F5F000004510230062182B146000040000000076 +:10F600008F6200840A001372004580239762003CD9 +:10F610003050FFFF8FA30010306200041040000440 +:10F62000000628808FA2001C0A00137A0202102B09 +:10F630002E02021850400003240202180A0013830D +:10F6400002051023306300041060000300451023FE +:10F650008FA2001C00451023004080212C42008016 +:10F6600054400001241000800E0011FE02402021B1 +:10F6700024020001AF62000C9362003E00102040A3 +:10F680003042007FA362003E8E220004244200012B +:10F69000AF620040A770003C8F6200509623000EBE +:10F6A00000431021AF6200588F62005000441021C7 +:10F6B000AF62005C8E220004AF6200188E22000848 +:10F6C000AF62001C8FA20010304200085440000AB4 +:10F6D00093A20020A3600036936200362403FFDF6C +:10F6E000A36200359362003E00431024A362003EF3 +:10F6F0000A0013AD8E220008A36200358E22000896 +:10F70000AF62004C8F6200248F63004000431021E1 +:10F71000AF6200489362000024030050304200FFB3 +:10F72000144300122403FF803C0208008C4231A0E5 +:10F730000242102100431024AF4200283C0208007E +:10F740008C4231A08E2400083C03000C02421021A0 +:10F750003042007F0342102100431021AC4400D806 +:10F760008E230008AF820024AC4300DC0E00120799 +:10F770000240202124040038000028212406000A29 +:10F780000E001301000000008FBF00348FB2003064 +:10F790008FB1002C8FB000282402000103E0000884 +:10F7A00027BD003827BDFFE8AFBF001090C7000D90 +:10F7B00000C0282130E6001010C0000A30E200042A +:10F7C0008CA300088F6200541062000630E200042F +:10F7D000144000178FBF0010000020210A000D13F5 +:10F7E00027BD00181040000D30E3001210C00010BB +:10F7F0008FBF00108CA300088F6200541462000DAC +:10F8000024020001240400382405008D0E00130199 +:10F81000240600120A0013F98FBF00102402001200 +:10F82000146200038FBF00100A00132F27BD0018B9 +:10F830002402000103E0000827BD001827BDFFF8DF +:10F8400027420180AFA20000308A00FF8F4201B83A +:10F850000440FFFE000000008F4601283C02080023 +:10F860008C4231A02403FF80AF86004C00C21021DF +:10F8700000431024AF4200243C0208008C4231A017 +:10F880008FA900008FA8000000C210213042007F25 +:10F89000034218213C02000A00621821946400D43B +:10F8A0008FA700008FA5000024020002AF83002470 +:10F8B000A0A2000B8FA30000354260003084FFFF40 +:10F8C000A4E200083C021000AD260000AD040004D4 +:10F8D000AC60002427BD0008AF4201B803E0000877 +:10F8E000240200018C8200048F8300240045102331 +:10F8F000AC820004906200633042007FA06200632B +:10F900008C8200209383002C8F85002434420002D7 +:10F91000AF830040A780003EAC820020A4A000E49A +:10F9200090A200632403FFBF0043102403E00008FB +:10F93000A0A20063274301808F4201B80440FFFE6C +:10F940008F82004CAC6200008F420124AC62000444 +:10F9500024026083A462000824020002A062000B5B +:10F960003C02100003E00008AF4201B88F8800405D +:10F970009382002C8F8300243C07080024E775AC99 +:10F9800000481023304200FF304900FC2465008805 +:10F990008F860044304A0003112000090000202116 +:10F9A000248200048CA30000304400FF0089102A48 +:10F9B000ACE3000024A500041440FFF924E7000490 +:10F9C00011400009000020212482000190A30000C2 +:10F9D000304400FF008A102BA0E3000024A50001A2 +:10F9E0001440FFF924E7000130C200031440000472 +:10F9F0008F850040310200031040000D0000000020 +:10FA000010A00009000020212482000190C3000002 +:10FA1000304400FF0085102BA0E3000024C6000145 +:10FA20001440FFF924E7000103E000080000000093 +:10FA30001100FFFD00002021248200048CC300007F +:10FA4000304400FF0088102BACE3000024C6000403 +:10FA50001440FFF924E7000403E000080000000060 +:10FA60008F8300409382002C30C600FF30A500FF3A +:10FA700000431023304300FF8F8200240080382190 +:10FA80000043102114C0000224480088008338215C +:10FA900030E200031440000530A2000314400003CC +:10FAA000306200031040000D0000000010A00009AB +:10FAB000000020212482000190E30000304400FF78 +:10FAC0000085102BA103000024E700011440FFF97A +:10FAD0002508000103E000080000000010A0FFFD61 +:10FAE00000002021248200048CE30000304400FF49 +:10FAF0000085102BAD03000024E700041440FFF93B +:10FB00002508000403E000080000000027BDFFF8FE +:10FB10002402FFFFAFA20000008038212405002F3F +:10FB20003C090800252971AC240800FF2406FFFFCA +:10FB300090E2000024A3FFFF0006220200C210266C +:10FB4000304200FF00021080004910218C4200006A +:10FB5000306500FF24E7000114A8FFF5008230267D +:10FB600000061027AFA20004AFA200000000282169 +:10FB700027A6000400C510239044000324A200011E +:10FB800000BD1821304500FF2CA200041440FFF9ED +:10FB9000A06400008FA2000003E0000827BD000859 +:10FBA0000080482130AAFFFF30C600FF30E7FFFF8A +:10FBB000274801808F4201B80440FFFE8F82004C2D +:10FBC000AD0200008F420124AD0200048D2200200E +:10FBD000A5070008A102000A24020016A102000BDA +:10FBE000934301208D2200088D240004306300FF20 +:10FBF000004310219783003E004410218D250024EE +:10FC0000004310233C0308008C6331A08F84002440 +:10FC1000A502000C246300E82402FFFFA50A000EE1 +:10FC2000A5030010A5060012AD050018AD020024C2 +:10FC3000948201142403FFF73042FFFFAD02002835 +:10FC40008C820118AD02002C3C021000AD00003087 +:10FC5000AF4201B88D2200200043102403E00008C9 +:10FC6000AD2200208F82002430E7FFFF0080482172 +:10FC7000904200D330A5FFFF30C600FF0002110004 +:10FC800030420F0000E23825274801808F4201B83A +:10FC90000440FFFE8F82004CAD0200008F42012421 +:10FCA000AD0200048D220020A5070008A102000A71 +:10FCB00024020017A102000B934301208D220008AB +:10FCC0008D240004306300FF004310219783003E21 +:10FCD000004410218F840024004310233C030800BB +:10FCE0008C6331A0A502000CA505000E246300E87A +:10FCF000A5030010A5060012AD0000148D220024FB +:10FD0000AD0200188C82005CAD02001C8C82005891 +:10FD1000AD0200202402FFFFAD020024948200E621 +:10FD20003042FFFFAD02002894820060948300BE41 +:10FD300030427FFF3063FFFF0002120000431021BA +:10FD4000AD02002C3C021000AD000030AF4201B803 +:10FD5000948200BE2403FFF700A21021A48200BEFB +:10FD60008D2200200043102403E00008AD22002073 +:10FD7000274301808F4201B80440FFFE240200188F +:10FD8000AC640000A062000B8F820024944200E665 +:10FD9000A46200103C021000AC60003003E00008D8 +:10FDA000AF4201B8274301808F4201B80440FFFEF3 +:10FDB0008F8200289442001C3042FFFF000211C0D5 +:10FDC000AC62000024020019A062000B3C0210008B +:10FDD000AC60003003E00008AF4201B88F8700300C +:10FDE00030C300FF8F4201B80440FFFE8F82004CF9 +:10FDF00034636000ACA2000093820048A0A200051A +:10FE00008CE20010A4A20006A4A300088C820020AB +:10FE10002403FFF7A0A2000A24020002A0A2000B04 +:10FE20008CE20000ACA200108CE20004ACA2001432 +:10FE30008CE2001CACA200248CE20020ACA20028C2 +:10FE40008CE2002CACA2002C8C820024ACA2001806 +:10FE50003C021000AF4201B88C8200200043102405 +:10FE600003E00008AC8200209382004824030001D4 +:10FE700027BDFFE8004330042C420020AFB0001043 +:10FE8000AFBF00142410FFFE10400005274501807D +:10FE90003C0208008C4231900A001598004610245C +:10FEA0003C0208008C4231940046102414400007A4 +:10FEB000240600848F8300242410FFFF90620062D8 +:10FEC0003042000F34420040A06200620E00156410 +:10FED00000000000020010218FBF00148FB000103E +:10FEE00003E0000827BD00188F83002827BDFFE02E +:10FEF000AFB20018AFB10014AFB00010AFBF001C1C +:10FF00009062000D00A0902130D100FF3042007FB0 +:10FF1000A062000D8F8500248E4300180080802190 +:10FF20008CA2007C146200052402000E90A20063E3 +:10FF3000344200200A0015C1A0A200630E001587FC +:10FF4000A38200482403FFFF104300472404FFFF5F +:10FF500052200045000020218E4300003C0200108A +:10FF600000621024504000043C02000802002021DE +:10FF70000A0015D024020015006210245040000928 +:10FF80008E45000002002021240200140E00158777 +:10FF9000A38200482403FFFF104300332404FFFF23 +:10FFA0008E4500003C02000200A210241040001602 +:10FFB0003C0200048F8600288CC200148CC3001001 +:10FFC0008CC40014004310230044102B5040000543 +:10FFD000020020218E43002C8CC20010106200030E +:10FFE000020020210A001601240200123C02000433 +:10FFF00000A210245040001C0000202102002021FB +:020000040001F9 +:100000000A0016012402001300A21024104000066A +:100010008F8300288C6200105040001300002021C4 +:100020000A0015FB020020218C62001050400004E1 +:100030008E42002C020020210A0016012402001129 +:100040005040000900002021020020212402001756 +:100050000E001587A38200482403FFFF104300020F +:100060002404FFFF000020218FBF001C8FB2001866 +:100070008FB100148FB000100080102103E0000841 +:1000800027BD00209383002C27BDFFE0240200340D +:10009000AFB20018AFB10014AFBF001CAFB000107A +:1000A000008088211462000C00A090218F84003011 +:1000B0000E0014B08C9000301202000724020005DC +:1000C000022020210E001587A38200482403FFFF91 +:1000D0001043005F2404FFFF924200041040000917 +:1000E0008F820024022020212402000C0E0015879C +:1000F000A38200482403FFFF104300552404FFFFA0 +:100100008F820024A38000208E4300048C44008052 +:100110003C0200FF3442FFFF006218240083202BC2 +:1001200010800008AF83003802202021240200192B +:100130000E001587A38200482403FFFF10430044EC +:100140002404FFFF9782003E8F8700408F8800388D +:100150000047102311000039A782003E8F8600243B +:100160003045FFFF8F84004C90C300BC3C02080068 +:100170008C4231A0000318823070000100822021DF +:10018000001010800102102100A2282B10A00010E6 +:10019000248200888F8400301082000D3C033F01D0 +:1001A0008E420000004310243C0325001443000647 +:1001B00030E500FF8C820000ACC200888C82001009 +:1001C0000A001661ACC200980E00148500003021B0 +:1001D0008F850038938300208F86002430A200038F +:1001E000000210233042000300433821A38700207F +:1001F00094C400E400A228218F8300408F82004431 +:1002000034841000A4C400E400431021AF820044F1 +:100210001200000EAF85004024E20004A3820020FB +:1002200094C200E424A30004AF83004034422000C1 +:10023000A4C200E40A001681000020218F8200443D +:10024000AF80004000471021AF8200440000202111 +:100250008FBF001C8FB200188FB100148FB0001038 +:100260000080102103E0000827BD00208F860024B5 +:1002700027BDFFE8AFBF0014AFB0001090C200630D +:10028000304200201040000830A500FF8CC2007CE6 +:100290002403FFDF24420001ACC2007C90C2006353 +:1002A00000431024A0C2006310A000238F83002409 +:1002B00027500180020028210E00156424060082C8 +:1002C0008F82002490420063304200405040001969 +:1002D000A38000488F8300308F4201B80440FFFEA6 +:1002E0008F82004CAE02000024026082A602000849 +:1002F00024020002A202000B8C620008AE02001071 +:100300008C62000CAE0200148C620014AE02001865 +:100310008C620018AE0200248C620024AE02002819 +:100320008C620028AE02002C3C021000AF4201B8E3 +:10033000A38000488F8300248FBF00148FB000106B +:100340009062006327BD00183042007FA062006306 +:100350009782003E8F8600408F8500249383002C77 +:1003600000461023A782003EA4A000E490A40063EE +:100370008F820044AF8300402403FFBF004610215A +:1003800000832024AF820044A0A400638F82002455 +:10039000A04000BD8F82002403E00008A44000BEFE +:1003A0008F8A002427BDFFE0AFB10014AFB000106A +:1003B0008F880040AFBF001893890020954200E469 +:1003C00030D100FF0109182B0080802130AC00FFE4 +:1003D0003047FFFF0000582114600003310600FF82 +:1003E00001203021010958239783003E0068102B1B +:1003F00014400032000000001468000724020001CD +:100400008E0200202403FFFB34E780000043102409 +:10041000AE0200202402000134E7088015820005A6 +:100420003165FFFF0E0014D5020020210A001716C7 +:10043000020020210E001506020020210E001549A1 +:100440008F84004C8F840024948200602442000139 +:10045000A4820060948200603C0308008C633188B1 +:1004600030427FFF5443000F02002021948200603D +:100470002403800000431024A48200609082006066 +:1004800090830060304200FF000211C2000210277A +:10049000000211C03063007F00621825A083006055 +:1004A00002002021022028218FBF00188FB10014E4 +:1004B0008FB000100A00168827BD0020914200630B +:1004C0002403FF8000431025A14200639782003E71 +:1004D0003048FFFF11000020938300208F84002408 +:1004E000004B1023304600FF948300E42402EFFF0A +:1004F0000168282B00621824A48300E414A00003E0 +:100500008E02002001005821000030212403FFFB4F +:1005100034E7800000431024AE02002024020001D2 +:10052000158200053165FFFF0E0014D50200202161 +:100530000A00173E9783003E0E0015060200202198 +:100540009783003E8F820040A780003E0043102327 +:10055000AF820040938300208F8200248FBF001859 +:100560008FB100148FB0001027BD002003E00008F9 +:10057000A04300BD8F82002490430088904500BDB9 +:10058000244900883063003F2463FFE02402000117 +:10059000006238042C63002030E80019A385002095 +:1005A00010600010AF8900303C028000344200022D +:1005B00024050001240600011500000800E21824AB +:1005C000000028211460000530E2002010400005E2 +:1005D000240500019126000130C600010A0016D54D +:1005E0000000000003E000080000000027BDFFD865 +:1005F000AFB000108F900030AFB40020AFB1001446 +:10060000AFBF0024AFB3001CAFB200188E050010BE +:100610003C0208008C4231B08F86003430A33FFF8B +:100620000062182B8CD30014008088218CD200200B +:10063000106000780000A02190C3000D2402FF800C +:1006400000431024304200FF50400073022020215C +:1006500000051382304200035440006F0220202125 +:1006600094C3001C8F8200248E050028A44301142B +:100670008CC2001002621823146500072402001FB8 +:100680008F820038006210210262102B1040000897 +:100690008F830028240200180E001587A3820048CB +:1006A0002403FFFF1043006F2404FFFF8F83002803 +:1006B0008F8400388C620010024490210044102383 +:1006C000AC6200108F820024AC7200208C42006863 +:1006D0000052102B104000098F830034022020218B +:1006E0002402001D0E001587A38200482403FFFF8B +:1006F0001043005C2404FFFF8F8300348E0200242B +:100700008C63002410430007022020212402001CD7 +:100710000E001587A38200482403FFFF10430051F9 +:100720002404FFFF8F8400288C82002424420001CF +:10073000AC820024125300048F8200248C42006893 +:100740005642000E8E0200008E0200003C03008024 +:10075000004310241440000D2402001A022020211E +:100760000E001587A38200482403FFFF1043003DBD +:100770002404FFFF0A0017D28E0200143C030080FD +:1007800000431024504000038E020014AC8000206F +:100790008E0200142412FFFF105200062402001BD8 +:1007A000022020210E001587A38200481052002D40 +:1007B0002404FFFF8E0300003C02000100621024AD +:1007C0001040001F3C02008000621024144000080A +:1007D000022020212402001A0E001587A38200485F +:1007E0002403FFFF1043001F2404FFFF02202021E9 +:1007F000020028210E0015A7240600012403FFFF94 +:100800002404FFFF1443000E241400010A001807FB +:100810008FBF0024022020212402000D8FBF00245E +:100820008FB400208FB3001C8FB200188FB100145A +:100830008FB0001027BD00280A001587A38200484A +:100840008F8300280220202102803021946200360C +:1008500024050001244200010E0016D5A4620036D2 +:10086000000020218FBF00248FB400208FB3001C14 +:100870008FB200188FB100148FB0001000801021CB +:1008800003E0000827BD00288F83002427BDFFD880 +:10089000AFB40020AFB3001CAFB20018AFB100146A +:1008A000AFB00010AFBF0024906200638F910030A2 +:1008B0002412FFFF3442004092250000A062006332 +:1008C0008E2200100080982130B0003F10520006A8 +:1008D0000360A0212402000D0E001587A3820048AA +:1008E000105200522404FFFF8F8300248E22001830 +:1008F0008C63007C10430007026020212402000E5C +:100900000E001587A38200482403FFFF1043004711 +:100910002404FFFF24040020120400048F83002419 +:100920009062006334420020A06200638F8500382B +:1009300010A0001E00000000560400048F82002456 +:10094000026020210A0018512402000A9683000A3E +:100950002404FFFD944200603042FFFF1043003446 +:100960008FBF00243C0208008C42318C0045102BC4 +:100970001440000602602021000028210E0016D538 +:10098000240600010A001878000020212402002D0E +:100990000E001587A38200482403FFFF10430023A5 +:1009A0002404FFFF0A001878000020211604000527 +:1009B0008F8400248E2300142402FFFF506200184D +:1009C000026020219482006024420001A482006021 +:1009D000948200603C0308008C63318830427FFFC2 +:1009E0005443000F026020219482006024038000A1 +:1009F00000431024A4820060908200609083006015 +:100A0000304200FF000211C200021027000211C094 +:100A10003063007F00621825A083006002602021FF +:100A20000E00168824050001000020218FBF00243D +:100A30008FB400208FB3001C8FB200188FB1001448 +:100A40008FB000100080102103E0000827BD0028AF +:100A50008F83002427BDFFE8AFB00010AFBF0014A4 +:100A6000906200638F870030008080213442004014 +:100A70008CE60010A06200633C0308008C6331B078 +:100A800030C23FFF0043102B1040004E8F850034D2 +:100A90002402FF8090A3000D00431024304200FF89 +:100AA0005040004902002021000613823048000314 +:100AB00024020002550200440200202194A2001CDE +:100AC0008F85002424030023A4A201148CE60000D7 +:100AD000000616023042003F104300103C03008322 +:100AE0008CE300188CA2007C106200062402000E29 +:100AF0000E001587A38200482403FFFF104300382F +:100B00002404FFFF8F83002490620063344200209E +:100B1000A06200630A0018BD8F83002800C3102460 +:100B2000144300078F83002890A200623042000F18 +:100B300034420020A0A20062A388003C8F830028DA +:100B40009062000D3042007FA062000D8F8300385C +:100B500010600018020020218F8400348C82001065 +:100B60000043102B1040000924020018020020212D +:100B70000E001587A38200482403FFFF10430018CE +:100B80002404FFFF0A0018E5000020218C820010D9 +:100B90002405000102002021004310238F83002838 +:100BA000240600010E0016D5AC6200100A0018E5FC +:100BB000000020210E001688240500010A0018E517 +:100BC00000002021020020212402000D8FBF00140C +:100BD0008FB0001027BD00180A001587A3820048B7 +:100BE0008FBF00148FB000100080102103E00008B8 +:100BF00027BD001827BDFFD8AFB000108F90003080 +:100C0000AFB3001CAFBF0020AFB20018AFB10014EB +:100C10008E1200103C0308008C6331B032423FFF5B +:100C20000043102B1040007C008098218F850034F9 +:100C30002402FF8090A3000D00431024304200FFE7 +:100C400050400076026020210012138230420003DF +:100C500024030001544300710260202190A2000D82 +:100C600030420008544000038F8200380A001915F2 +:100C700024020024504000038E03000C0A001915C2 +:100C8000240200278CA20020146200052402002008 +:100C90008E0300088CA200241062000824020020A9 +:100CA0000E001587A38200482403FFFF1043006A4B +:100CB0002404FFFF0A0019408F8400288E020014CC +:100CC0002411FFFF145100038F8700240A00193BF1 +:100CD000240200258E0300188CE2007C14620016AA +:100CE0002402000E8E0300248CA20028146200123D +:100CF000240200218E0600288CA2002C14C2000EB3 +:100D00002402001F8E03002C1060000B240200231D +:100D10008CE200680043102B1440000724020026D8 +:100D20008CA20014006618210043102B50400007CD +:100D30008F840028240200220E001587A382004819 +:100D4000105100452404FFFF8F8400282403FFF77F +:100D50009082000D00431024A082000D8F86002495 +:100D60003C0308008C6331AC8F82004C94C400E0DB +:100D70008F8500280043102130847FFF000420402D +:100D8000004410213043007F034320213C03000E28 +:100D9000008320212403FF8000431024AF42002C55 +:100DA000A49200008CA2002824420001ACA20028DA +:100DB0008CA2002C8E03002C00431021ACA2002C2E +:100DC0008E02002CACA200308E020014ACA20034C3 +:100DD00094A2003A24420001A4A2003A94C600E082 +:100DE0003C0208008C4231B024C4000130837FFFF4 +:100DF000146200130080302124028000008230241D +:100E000030C2FFFF000213C2304200FF0002102771 +:100E10000A00197D000233C0026020212402000D67 +:100E20008FBF00208FB3001C8FB200188FB1001449 +:100E30008FB0001027BD00280A001587A382004844 +:100E40008F82002402602021240500010E001688F4 +:100E5000A44600E0000020218FBF00208FB3001CBB +:100E60008FB200188FB100148FB0001000801021D5 +:100E700003E0000827BD002827BDFFE0AFB1001444 +:100E80008F910030AFB00010AFBF00188E26001059 +:100E90003C0308008C6331B030C23FFF0043102B8D +:100EA0001040005E008080218F8500342402FF8086 +:100EB00090A3000D00431024304200FF5040005822 +:100EC000020020218F8200381040000800061382A3 +:100ED0008F8200249763000A2404FFFD944200607F +:100EE0003042FFFF104300550006138230420003DA +:100EF0001440000E00000000922200021040000585 +:100F00008E23002450600015922300030A0019B6B6 +:100F1000020020218CA200245062001092230003C2 +:100F2000020020210A0019BE2402000F90A2000D29 +:100F3000304200085440000992230003020020219F +:100F4000240200100E001587A38200482403FFFF2F +:100F50001043003A2404FFFF9223000324020002FE +:100F60005462000C922200038F8200385440000922 +:100F700092220003020020212402002C0E0015877B +:100F8000A38200482403FFFF1043002C2404FFFF2A +:100F9000922200030220282102002021384600105E +:100FA0002CC600012C4200010E0015A7004630257A +:100FB0002411FFFF105100212404FFFF8F8300380C +:100FC00010600012020020213C0208008C42318C8B +:100FD0000043102B144000060000000000002821F0 +:100FE0000E0016D5240600010A0019FC000020217D +:100FF0002402002D0E001587A38200481051000F17 +:101000002404FFFF0A0019FC000020210E001688AE +:10101000240500010A0019FC000020210200202103 +:101020002402000D8FBF00188FB100148FB0001084 +:1010300027BD00200A001587A38200488FBF001833 +:101040008FB100148FB000100080102103E0000861 +:1010500027BD00209383003C27BDFFE0240200024F +:10106000AFB10014AFB0001000808821AFBF0018EE +:10107000000080211062008C2404FFFD9785003E53 +:101080008F83004030A2FFFF0043102B5440007DAF +:101090008F8400440E001448000000003C02080049 +:1010A000244275AC02202021004028210E00160E9B +:1010B000AF8200302409FFFF1049007B2404FFFFAA +:1010C0003C0808008D0875BC3C0208008C4231B019 +:1010D0003C030800906375AC31043FFF0082102B85 +:1010E0001040001B3067003F3C0208008C4231A8D2 +:1010F0008F83004C000421800062182100641821B5 +:101100003062007F034228213C02000C00A228210B +:101110003C020080344200013066007800C2302575 +:101120002402FF8000621024AF42002830640007D0 +:10113000AF4208048F820024034420212484094004 +:10114000AF460814AF850028AF840034AC430118C3 +:101150009383003C240200031462003B240200013C +:101160002402002610E2003D28E200271040001370 +:10117000240200322402002210E2003828E2002378 +:1011800010400008240200242402002010E2002461 +:101190002402002110E2001E022020210A001A7BF6 +:1011A0002402000B10E2002D2402002510E20010A2 +:1011B000022020210A001A7B2402000B10E2001AF0 +:1011C00028E20033104000062402003F24020031D0 +:1011D00010E2000B022020210A001A7B2402000BDF +:1011E00010E20011022020210A001A7B2402000BC9 +:1011F0000E001768022020210A001A960040802164 +:101200000E0018EA022020210A001A9600408021D0 +:101210000E00198B022020210A001A96004080211E +:101220001509000E000000000E00180F02202021FA +:101230000A001A96004080210E001587A3820048FC +:101240000A001A9600408021146200170200202133 +:101250002402002314E200052402000B0E00188172 +:10126000022020210A001A9600408021022020211D +:10127000A38200480E0015872410FFFF0A001A976A +:101280000200202130A500FF0E0014852406000175 +:101290009783003E8F820040A780003E00431023CA +:1012A000AF820040020020218FBF00188FB10014D0 +:1012B0008FB000100080102103E0000827BD00203F +:1012C00027BDFFE0AFB10014AFBF0018AFB00010F2 +:1012D0008F4601283C0308008C6331A02402FF8064 +:1012E000AF86004C00C318213065007F03452821DC +:1012F000006218243C02000AAF43002400A2282107 +:1013000090A2006200808821AF850024304200FF57 +:1013100000021102A382003C90A200BC30420002F5 +:101320001440000224030034240300308F82002480 +:10133000A383002C9383003C8C4200C0A380004810 +:10134000AF82004024020004106200308F8400400D +:101350008E2400045080002D8F8400408E220010C7 +:101360003083FFFFA784003E1060001FAF8200445F +:101370008F8300242405FF800220202190620063D7 +:1013800000A21024304200FF1440000D00000000B5 +:101390000E001A029790003E1040001000401821E5 +:1013A0002402FFFD546200118E2300200200282138 +:1013B0000E001426022020210A001AE88E230020A5 +:1013C0009062006300A21024304200FF104000032E +:1013D000022020210E00174A000000009782003EE4 +:1013E0001440FFE48F8300248E2300203062000429 +:1013F000104000068F8400402402FFFB006210248E +:101400000E00143AAE2200208F8400408F83002407 +:101410008FBF00188FB100148FB00010240200019C +:1014200027BD002003E00008AC6400C030A500FF29 +:101430002403000124A900010069102B1040000CB6 +:1014400000004021240A000100A31023004A3804B0 +:1014500024630001308200010069302B104000023B +:10146000000420420107402554C0FFF800A31023C8 +:1014700003E000080100102127BDFFE03C021EDC54 +:10148000AFB20018AFB10014AFBF001CAFB0001076 +:1014900034526F4100008821240500080E001AF81C +:1014A00002202021001180803C07080024E771AC55 +:1014B0000002160002071821AC620000000028217B +:1014C00024A200013045FFFF8C6200002CA600081A +:1014D00004410002000220400092202614C0FFF8C0 +:1014E000AC640000020780218E0400000E001AF890 +:1014F00024050020262300013071FFFF2E23010068 +:101500001460FFE5AE0200008FBF001C8FB2001810 +:101510008FB100148FB0001003E0000827BD002039 +:101520003C02080024426A743C010800AC2271A00D +:101530003C02080024424FF03C010800AC2271A498 +:10154000240200063C010800A02271A80A001B0B1F +:101550000000000027BDFFD8AFB3001CAFB20018D9 +:10156000AFBF0020AFB10014AFB000108F510140E9 +:101570008F48014800089402324300FF311300FFF6 +:101580008F4201B80440FFFE27500180AE110000D9 +:101590008F420144AE02000424020002A612000899 +:1015A000A202000B24020014AE13002410620025D6 +:1015B00028620015104000082402001524020010C3 +:1015C0001062003024020012106200098FBF002058 +:1015D0000A001C358FB3001C106200702402002228 +:1015E000106200378FBF00200A001C358FB3001C2B +:1015F0003C0208008C4231A02403FF80022210210B +:1016000000431024AF4200243C0208008C4231A069 +:10161000022210213042007F034218213C02000ABE +:1016200000621821166000BCAF8300249062006243 +:101630003042000F34420030A06200620A001C34C5 +:101640008FBF00203C0460008C832C083C02F00318 +:101650003442FFFF00621824AC832C083C020800CF +:101660008C4231A08C832C0824420074000210822A +:101670000002148000621825AC832C080A001C3478 +:101680008FBF00203C0208008C4231A02403FF8061 +:101690000222102100431024AF4200243C02080023 +:1016A0008C4231A03C03000A022210213042007F0C +:1016B00003421021004310210A001C33AF82002492 +:1016C0003C0208008C4231A02405FF800222102138 +:1016D00000451024AF4200243C0208008C4231A097 +:1016E000022210213042007F034218213C02000AEE +:1016F000006218219062006300A21024304200FFB3 +:1017000010400085AF8300242462008894430012B7 +:101710003C0208008C4231A830633FFF000319806F +:1017200002221021004310213043007F0343202177 +:10173000004510243C03000C00832021AF42002808 +:101740009082000D00A21024304200FF1040007271 +:10175000AF8400289082000D304200101440006FCA +:101760008FBF00200E001556000000008F4201B808 +:101770000440FFFE00000000AE1100008F42014453 +:10178000AE02000424020002A6120008A202000B0E +:10179000AE1300240A001C348FBF00202406FF80F3 +:1017A00002261024AF4200203C0208008C4231A0E7 +:1017B00031043FFF00042180022210210046102442 +:1017C000AF4200243C0308008C6331A83C020800AF +:1017D0008C4231A03227007F0223182102221021DF +:1017E000006418213042007F3064007F03422821CA +:1017F0003C02000A0066182400A22821034420218C +:101800003C02000C00822021AF4300283C0200086B +:101810000347182100629021AF850024AF8400287F +:101820000E001556010080218F4201B80440FFFED2 +:101830008F8200288F840024274501809042000D6C +:10184000ACB10000A4B000060002160000021603AE +:1018500000021027000237C214C00016248200883C +:101860009442001232033FFF30423FFF1443001204 +:1018700024026082908300632402FF8000431024CE +:10188000304200FF5040000C2402608290820062CF +:101890003042000F34420040A08200622402608483 +:1018A000A4A200082402000DA0A200050A001C1E2C +:1018B0003C02270024026082A4A20008A0A0000528 +:1018C0003C02270000061C000062182524020002CA +:1018D000A0A2000BACA30010ACA00014ACA000248C +:1018E000ACA00028ACA0002C8E42004C8F840028B5 +:1018F000ACA200189083000D2402FF800043102446 +:10190000304200FF104000058FBF00209082000D84 +:101910003042007FA082000D8FBF00208FB3001CDB +:101920008FB200188FB100148FB000103C0210006D +:0C19300027BD002803E00008AF4201B80A +:04193C00080033F874 +:10194000080033F808003370080033A8080033DCBF +:10195000080034000800340008003400080032E0B9 +:101960000A00012200000000000000000000000D3D +:10197000747061352E302E306A330000050000018E +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000010000003E4 +:1019F000000000000000000D0000000D3C02080087 +:101A000024421B803C03080024632014AC400000E7 +:101A10000043202B1480FFFD244200043C1D0800DD +:101A200037BD2FFC03A0F0213C10080026100488CD +:101A30003C1C0800279C1B800E00015A000000007F +:101A40000000000D3084FFFF308200078F850018F2 +:101A500010400002248300073064FFF80085302125 +:101A600030C41FFF03441821247B4000AF85001CB5 +:101A7000AF84001803E00008AF4400843084FFFF07 +:101A8000308200078F8500208F86002810400002DA +:101A9000248300073064FFF8008520210086182B7E +:101AA00014600002AF85002400862023034428210F +:101AB00034068000AF840020AF44008000A62021BF +:101AC00003E00008AF84003827BDFFD8AFB3001C87 +:101AD000AFB20018AFB00010AFBF0024AFB4002009 +:101AE000AFB100143C0860088D1450002418FF7F2B +:101AF0003C1A8000029898243672380CAD125000BF +:101B00008F5100083C07601C3C0860003630000123 +:101B1000AF500008AF800018AF400080AF40008495 +:101B20008CE600088D0F08083C0760168CEC00005E +:101B300031EEFFF039CA00103C0DFFFF340B80007E +:101B40003C030080034B48212D440001018D2824D3 +:101B50003C0253533C010800AC230420AF890038F9 +:101B6000AF860028AF840010275B400014A200035A +:101B700034E37C008CF90004032818218C7F007C5E +:101B80008C6500783C02800034520070AF85003CC8 +:101B9000AF9F00403C13080026731BC40240A021E5 +:101BA0008E4800008F46000038C3000130640001F9 +:101BB00010800017AF880034028048218D2D00006E +:101BC0003C1908008F39045C3C1108008E31045820 +:101BD00001A8F823033F7821000040210228382182 +:101BE00001FF802B00F070213C010800AC2F045C49 +:101BF0003C010800AC2E04588F4C0000398B0001CA +:101C0000316A00011540FFED01A04021AF8D003485 +:101C10008E4E00003C0C08008D8C045C3C0A0800D1 +:101C20008D4A045801C86823018D282100005821DD +:101C300000AD302B014B2021008610213C01080013 +:101C4000AC25045C3C010800AC2204588F45010817 +:101C50008F44010030A92000AF850000AF84000C44 +:101C60001120000A00A030213C0708008CE7042C5A +:101C700024EF00013C010800AC2F042C3C10400074 +:101C8000AF5001380A0001900000000030B002009F +:101C90001600001424110F001091001224070D00EB +:101CA0001087023330B000065200FFF53C104000B0 +:101CB000936D0000240C001031A600F010CC0269D6 +:101CC000240E007010CE02DD8F8B001425670001FA +:101CD000AF8700143C104000AF5001380A0001905B +:101CE00000000000974801041100FFE53C1040008F +:101CF00030B84000170000A2000000008F590178A2 +:101D00000720FFFE8F8700382409000824050800FB +:101D10008CE30008AF450178A7490140A740014284 +:101D2000974201048F8600003049FFFF30DF000139 +:101D300013E002D5012040212524FFFE240A0002E1 +:101D4000A74A01463088FFFFA74401483C0B080022 +:101D50008D6B043C156002C48F8F000C30C30020D3 +:101D600014600002240400092404000130CD0C009A +:101D7000240C040051AC000134840004A744014A3F +:101D80003C0508008CA504203C0200483C190001D9 +:101D900000A2F82530D8000203F92825130000041A +:101DA000000018213C04010000A4282524030001A0 +:101DB00030CA000451400005AF8300083C06001003 +:101DC00000A6282524030001AF830008AF451000BA +:101DD0000000000000000000000000000000000003 +:101DE0008F83000810600023000000008F4B10005C +:101DF0000561FFFE000000001060001E00000000F2 +:101E00008F4D10003C03002001A3602411800019B5 +:101E10008F8F000031EE000211C00016000000009C +:101E2000975010141600001300000000974510088A +:101E300030BFFFFF27F800060018C8820019308065 +:101E400000C72821331100013303000312200320AF +:101E50008CA200000000000D00C7F821AFE20000D6 +:101E60003C1908008F390430272600013C01080086 +:101E7000AC2604308F6A00003405FFFFAF8A0004EF +:101E80008CE200001045029A000020218CE5000041 +:101E900030BF010013E0027E010020213C07080052 +:101EA0008CE704743C1008008E10044C00E85821A4 +:101EB0003C1808008F1804700168882B3C08080043 +:101EC0008D0804480000782102046021030F1821C6 +:101ED0000184702B010F68210071502101AE102187 +:101EE0003C010800AC2C044C3C010800AC22044826 +:101EF0003C010800AC2B04743C010800AC2A0470BF +:101F00008F8D0018012030213129000725AE0008EF +:101F100031C21FFF03426021AF8D001CAF82001849 +:101F2000259B4000AF420084112000038F900020C9 +:101F300024C800073106FFF88F84002800D028212C +:101F400000A4782B15E00002AF90002400A4282301 +:101F50000345202134038000008310213C0610003B +:101F6000AF850020AF820038AF450080AF460178D2 +:101F70008F8B0014256700010A0001DDAF87001474 +:101F80008F6200088F670000241100300007C6022E +:101F9000330300F0107100A2241900401479FF4BA4 +:101FA0008F8B00148F4A01780540FFFE30A7020096 +:101FB00014E00003000512820000000D00051282EB +:101FC000305000030010490001307021000E68807D +:101FD00001B06021000C5880017380218E08000040 +:101FE00015000002000000000000000D8F6F0004CB +:101FF00005E202B19203000692070005920F000469 +:102000003C0200010007288000B060218D89001883 +:102010002771000825EE000501226821000E30829C +:10202000AD8D0018022020210E0005802605001429 +:10203000920B00068F7F00043C087FFF000B20807E +:10204000009130218CC30004350AFFFF03EAC82445 +:102050000079C021ACD80004920700059209000461 +:10206000960D00080007288000B1F8218FEF0000CE +:10207000974201043C07FFFF01E75024304EFFFF69 +:1020800001C96021018D58233168FFFF01482025D7 +:10209000AFE40000920300072419000110790269DF +:1020A0002406000310660279000000008E1900105B +:1020B000241F000AA75F0140A759014292030004B0 +:1020C0008F86000024070001A7430144A740014672 +:1020D0009758010430D100023C050041A75801483F +:1020E00000001821A747014A1220000330CA00044B +:1020F0003C0501412403000151400005AF83000865 +:102100003C08001000A8282524030001AF83000824 +:10211000AF451000000000000000000000000000BB +:10212000000000008F8B0008116000040000000018 +:102130008F4410000481FFFE000000008F6A000041 +:10214000920700043C0508008CA50444AF8A0004F3 +:10215000975F01043C0F08008DEF044030E300FF5F +:1021600033F9FFFF0079C02100B868210000102179 +:1021700024E6000A30C8FFFF01B8482B01E27021B5 +:1021800001C96021311000073C010800AC2D044456 +:102190003C010800AC2C0440120000038F8D001895 +:1021A000250B00073168FFF8010D702131CC1FFFAE +:1021B000AF8D001CAF8C0018AF4C00849744010415 +:1021C000034C80213084FFFF30880007110000039A +:1021D000261B4000248900073124FFF88F8200204D +:1021E0008F850028008220210085782B15E00002D1 +:1021F000AF82002400852023034488213405800019 +:10220000022510213C061000AF840020AF82003868 +:10221000AF440080AF4601780A0002858F8B00141E +:102220008F5F017807E0FFFE30AA0200154000032F +:10223000000542820000000D0005428231020003C9 +:102240000002710001C26821000D608001824821F6 +:102250000009288000B380218E0B0000116000026D +:10226000000000000000000D8F6F000C05E001F37E +:102270008F87003824190001AE1900008CE3000894 +:10228000A20000078F78000400181C02306600FFCF +:1022900024D10005001130822CC4004114800002BA +:1022A000A20300040000000D8F6B00043C0EFFFF32 +:1022B00000E028213164FFFF248F000B000F4082D3 +:1022C00000081080004748218D2D000026040014CE +:1022D000A60B000801AE60240E000580AD2C0000A6 +:1022E0008F5F01083C0A100003EA382410E001A3C4 +:1022F00000000000974601049203000724D1FFEC80 +:10230000346500023224FFFFA2050007960600088C +:102310002CC7001354E0000592030007920A00073F +:10232000355F0001A21F000792030007240B000184 +:10233000106B01BA24090003106901CD8F880038A1 +:1023400030CFFFFF25E400020004C883333F00FFC5 +:10235000001F2880A219000500A858218D780000D0 +:10236000975101043C03FFFF030360243222FFFF67 +:10237000004F702325CDFFFE018D4825AD6900007B +:10238000920600053C02FFF6344EFFFF30CA00FF04 +:10239000000A388000F02021909900143C1FFF7F34 +:1023A00037E7FFFF3323000F0066782131F800FF85 +:1023B0000018288000B088218E2D002000A8602100 +:1023C000A20F000601AE4824AE0D000CAD89000C32 +:1023D000920B00068E04000C0127F824000B50809D +:1023E0000150C821972600260148C02100874024BB +:1023F000AF260024AE08000CAF3F0020AF0600104F +:102400008F860000240C001024090002A74C014014 +:10241000A7400142A7400144A7490146974B010448 +:102420002407000130C80002256AFFFEA74A0148C0 +:102430003C050009A747014A1100000300001821CC +:102440003C0501092403000130CD000451A0000522 +:10245000AF8300083C06001000A6282524030001D5 +:10246000AF830008AF45100000000000000000002E +:102470000000000000000000921800042711000274 +:10248000322F0007000F1023304E0007AE0E001051 +:102490008F90000812000004000000008F4310001D +:1024A0000461FFFE000000008F7800008F8F00188D +:1024B0003C1008008E100444AF98000497510104AA +:1024C00025E6001030CA1FFF3222FFFFAF8F001C2D +:1024D000AF8A0018AF4A00842449FFFE3C0B080075 +:1024E0008D6B0440974E010401206821000967C3E9 +:1024F000020D282131C9FFFF00AD402B016C3821AE +:1025000000E82021034AF821313900073C01080086 +:10251000AC2504443C010800AC2404401320000313 +:1025200027FB4000252300073069FFF88F9F00201C +:102530008F840028013F382100E4C82B17200002B7 +:10254000AF9F002400E43823034720213405800096 +:10255000008510213C061000AF870020AF820038B4 +:10256000AF470080AF4601780A0002858F8B0014C8 +:10257000975801041300FDC23C1040008F430178BE +:102580000460FFFE30B94000132000033C04000843 +:102590000000000D3C040008AF440140240808007E +:1025A000AF4801788F8B0000974A0104317F00010A +:1025B00013E000E93146FFFF24D0FFFE240C0002A7 +:1025C000A74C0146A75001488F8F00182405000D25 +:1025D000A745014A8F71000025E2000830491FFF1E +:1025E0000349702130CD0007AF910004AF8F001C6C +:1025F000AF89001800C03821AF49008411A0000342 +:1026000025DB400024C6000730C7FFF88F98002064 +:102610008F84002800F8302100C4382B14E0000219 +:10262000AF98002400C430238F8A00140346582139 +:10263000340880000168F821255900013C0310008E +:102640003C104000AF860020AF9F0038AF460080AE +:10265000AF430178AF990014AF5001380A000190E0 +:10266000000000008F690000974401043127FFFF3C +:102670003088FFFF8F4F017805E0FFFE30FF000735 +:10268000001F18233078000724E6FFFE2419000AF3 +:10269000A7590140A7580142A7460144A740014657 +:1026A000A74801488F42010830510020162000023F +:1026B000240300092403000130AA0002A743014AB1 +:1026C0003C04004111400003000018213C0401417A +:1026D0002403000130AB000451600005AF83000803 +:1026E0003C0500100085202524030001AF8300086D +:1026F000AF441000000000000000000000000000D7 +:10270000000000008F90000812000004000000008C +:102710008F4C10000581FFFE000000008F78000044 +:10272000276200088F8D003CAF9800049446000893 +:102730009451000A944F000C30CEFFFF001124008A +:1027400031E9FFFF11CD00A2008920253C030800DC +:102750008C6304443C1808008F18044000E85021A2 +:10276000255FFFFE007F78210000102101FF302B44 +:1027700003028821022648213C010800AC2F0444B2 +:102780003C010800AC29044024EB00083162FFFF43 +:102790003047000710E000038F8500182450000721 +:1027A0003202FFF83106FFFF30C8000700457021F4 +:1027B00031CD1FFF034D6021AF85001CAF8D001888 +:1027C000259B4000AF4D0084110000038F8F002037 +:1027D00024C400073086FFF88F84002800CF28210A +:1027E00000A4482B15200002AF8F002400A428234A +:1027F000AF850020AF4500803C1108008E310434C5 +:102800000345C0213402800003023021122000055C +:10281000AF860038938300172419000E1079000D3D +:10282000241F043F3C0A1000AF4A01788F8B00142C +:10283000256700010A0001DDAF8700140E0005A620 +:102840003C1040008F8B0014256700010A0001DE58 +:10285000AF8700143C0A1000A75F0148AF4A017817 +:102860000A0004B48F8B0014240E0F0011EE003DFB +:1028700030D10020162000022403000924030001A7 +:102880000A000208A743014A0A0001FBA7400146CB +:1028900094E5000894E2000A94EB000C8F86003C5B +:1028A0000002FC00316AFFFF30B9FFFF132600373A +:1028B00003EA20253C0508008CA504443C1F0800C1 +:1028C0008FFF04400000502100A8382100E8302B81 +:1028D00003EAC8210326C0213C010800AC270444B8 +:1028E0003C010800AC3804400A0002698F8D0018D2 +:1028F0003C1908008F39047C3C0308008C630454A5 +:102900003C0608008CC604783C0F08008DEF04508C +:10291000032838210068682100E8C02B00C4882102 +:1029200001A8402B01E470210238582101C8602120 +:102930003C010800AC2D04543C010800AC2C0450B0 +:102940003C010800AC27047C3C010800AC2B047857 +:102950000A0002698F8D0018A74001460A00041B77 +:102960008F8F001830D000201600FFC52403000D03 +:10297000240300050A000208A743014A97590104ED +:102980002738FFF00A00036B3304FFFF8F8C0040F1 +:10299000148CFFC8000080213C1108008E31046CAB +:1029A0003C0408008C8404680228702101C8782B3C +:1029B00000904021010F68213C010800AC2E046CFE +:1029C0003C010800AC2D04680A0002698F8D0018D4 +:1029D0008F9900401499FF5D000060213C050800BC +:1029E0008CA5046C3C1008008E10046800E82021BF +:1029F000248EFFFE00AEF82103EE582B020C50216E +:102A0000014B18213C010800AC3F046C3C0108005C +:102A1000AC2304680A00048B24EB00088F8800387C +:102A20003C02FFFF8D0E000C01C2682401A460254A +:102A3000AD0C000C0A00037930CFFFFF0A0003A998 +:102A4000AE000000974B0104920400048E2A000C93 +:102A500001644021251FFFF20147182433F9FFFFCD +:102A60000079C025AE38000C0A0002D48E1900107F +:102A70003C03FFFF8D1100100223282400A47825B9 +:102A8000AD0F00100A00037930CFFFFF9745010416 +:102A9000920600048E2F001000A610212449FFEE9C +:102AA00001E76824312EFFFF01AE6025AE2C001037 +:102AB0000A0002D48E1900108E06000CAE00000031 +:102AC0000003C080031088210A0002A6AE26002061 +:102AD0001460000D3050FFFF3C04FFFF00446024F1 +:102AE00001846826000D582B000C502B014B10243C +:102AF00010400002000000000000000D8CA3000048 +:102B00000A00023E006410253A11FFFF0011782BE5 +:102B10000010702B01CF2024108000020000000064 +:102B20000000000D8CB800000A00023E3702FFFFD3 +:102B30003084FFFF30A5FFFF108000070000182140 +:102B4000308200011040000200042042006518217C +:102B50001480FFFB0005284003E0000800601021FE +:102B600010C00007000000008CA2000024C6FFFF78 +:102B700024A50004AC82000014C0FFFB24840004E0 +:102B800003E000080000000010A0000824A3FFFFDD +:102B9000AC86000000000000000000002402FFFFDF +:102BA0002463FFFF1462FFFA2484000403E000089A +:102BB00000000000308EFFFF30D8FFFF00057C00D2 +:102BC00001F8602539CDFFFF01AC5021014C582B95 +:102BD000014B4821000944023127FFFF00E8302162 +:102BE0000006240230C5FFFF00A418213862FFFF51 +:102BF00003E000083042FFFF3C0C08008D8C048489 +:102C0000240BFF8027BDFFD001845021014B4824B5 +:102C1000AF4900203C0808008D080484AFB20020B2 +:102C2000AFB00018AFBF0028AFB30024AFB1001C95 +:102C3000936600040104382130E4007F009A1021DB +:102C40003C0300080043902130C500200360802130 +:102C50003C080111277B000814A0000226460070E2 +:102C60002646006C9213000497510104920F000451 +:102C70003267000F322EFFFF31ED004001C72823DD +:102C800011A0000500004821925900BC333800040F +:102C90001700009000000000924300BC307F000449 +:102CA00013E0000F0000000010A0000D0000000065 +:102CB000960E0002240AFF8000A7602125CDFFFEAA +:102CC000A74D1016920B0004014B2024308200FF08 +:102CD00010400085010C40253C0F0400010F4025E9 +:102CE0008F5301780660FFFE2404000AA7440140C8 +:102CF000960D00022404000931AC0007000C582393 +:102D0000316A0007A74A0142960200022443FFFEEF +:102D1000A7430144A7400146975F0104A75F01480C +:102D20008F590108333800205300000124040001AA +:102D3000920F000431EE001015C000023483001021 +:102D400000801821A743014A000000000000000095 +:102D50000000000000000000AF481000000000006C +:102D60000000000000000000000000008F51100073 +:102D70000621FFFE3113FFFF126000030000000078 +:102D80008F481018ACC8000096030006307FFFFF84 +:102D900027F900020019988200138880023B302135 +:102DA0008CD800001520005700183402920300044C +:102DB0002405FF8000A3F82433F100FF1220002C2B +:102DC00000000000924700BC30F2000212400028D0 +:102DD00000000000974B100C2562FFFEA742101662 +:102DE000000000003C0A040035490030AF491000E3 +:102DF00000000000000000000000000000000000D3 +:102E00008F4C10000581FFFE000000009749100C58 +:102E10008F51101C00C020213127FFFF24F2003009 +:102E2000001218820003288000BBF8213226FFFF21 +:102E3000AFF100000E00059500112C020013C880B0 +:102E4000033B98218E78000000027400AFB8001098 +:102E50008FA80010310FFFFFAFAF00108FA400103C +:102E600001C46825AFAD00108FA60010AE6600004B +:102E700097730008976D000A9766000C8F8A003CD4 +:102E8000000D5C0030CCFFFF3262FFFF104A0036BD +:102E9000016C2025960600023C10100024D3000887 +:102EA0000E0001393264FFFF974C01040E00014708 +:102EB0003184FFFFAF5001788FBF00288FB300240B +:102EC0008FB200208FB1001C8FB0001803E0000803 +:102ED00027BD003010A0FF700000000024A5FFFCFB +:102EE0000A0005CE240900048CD10000AF5110184F +:102EF0008F5301780660FF7A2404000A0A0005E374 +:102F00000000000000A7C8218F8800388F4E101CD9 +:102F10000019C0820018788001E82021AC8E0000E2 +:102F2000000E2C0200C020210E00059531C6FFFFC7 +:102F3000023B28218CAD00000002540000403021EB +:102F4000AFAD00108FAC0010318BFFFFAFAB0010A6 +:102F50008FA2001001424825AFA900108FA70010D2 +:102F60000A000613ACA700008F8F0040148FFFC922 +:102F70000000000097420104960B00023C05080087 +:102F80008CA5046C3049FFFF316AFFFF3C1108003B +:102F90008E310468012A382124F2FFFE00B240215C +:102FA0000012FFC30112C82B023FC02103192021C8 +:102FB0003C010800AC28046C3C010800AC24046807 +:102FC0000A00064D0000000000A4102B104000096C +:102FD000240300010005284000A4102B04A00003D6 +:102FE000000318405440FFFC000528401060000713 +:102FF000000000000085302B14C0000200031842BE +:10300000008520231460FFFB0005284203E0000830 +:10301000008010218F85002C27BDFFE80005302798 +:103020002CC300012CA400020083102510400003D3 +:10303000AFBF00102405007FAF85002C00052827B6 +:1030400030A5FFFF0E000574240426F58F830030A1 +:10305000240402BD004030210083382B10E0000919 +:1030600024050001000420400083102B048000038D +:10307000000528405440FFFC0004204010A0000838 +:1030800000C350210064402B1500000200052842B7 +:103090000064182314A0FFFB0004204200C3502149 +:1030A0008FBF0010000A4C02312200FF27BD00181C +:0C30B000AF8A002C03E00008AF8900305C +:0430BC000A00002ADC +:1030C00000000000000000000000000D7478703562 +:1030D0002E302E306A330000050000000000000A88 +:1030E000000001360000EA6000000000000000005F +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:103110000000000000000000000000000000001699 +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000138800000000000005DCF3 +:10316000000000000000000010000003000000004C +:103170000000000D0000000D3C02080024423B60EE +:103180003C03080024633D14AC4000000043202BA6 +:103190001480FFFD244200043C1D080037BD7FFC65 +:1031A00003A0F0213C100800261000A83C1C0800D9 +:1031B000279C3B600E0002BA000000000000000DDA +:1031C0008F8300383C088000350700708CE50000D4 +:1031D000008330253C02900000C22025AF850030DE +:1031E000AF4400208F4900200520FFFE3C038000F3 +:1031F000346200708C4500008F8600303C19080056 +:103200008F39007C3C0E08008DCE007800A620236C +:1032100003245821000078210164682B01CF60212C +:10322000018D50213C010800AC2B007C3C010800C2 +:10323000AC2A007803E00008000000000A0000410A +:10324000240400018F8400383C05800034A2000172 +:103250000082182503E00008AF43002003E00008C7 +:10326000000010213084FFFF30A5FFFF1080000711 +:1032700000001821308200011040000200042042AA +:10328000006518211480FFFB0005284003E00008BA +:103290000060102110C00007000000008CA2000098 +:1032A00024C6FFFF24A50004AC82000014C0FFFB6D +:1032B0002484000403E000080000000010A00008BF +:1032C00024A3FFFFAC860000000000000000000007 +:1032D0002402FFFF2463FFFF1462FFFA248400042A +:1032E00003E0000800000000308AFFFF93A80013ED +:1032F000A74A014497490E1630C600FF3C02100051 +:10330000A7490146AF450148A3460152A748015AC3 +:10331000AF4701608FA400188FA30014A744015881 +:10332000AF43015403E00008AF42017803E0000816 +:10333000000000003C038000346200708C490000F3 +:103340008F8800002484000727BDFFF83084FFF831 +:10335000AF890030974D008A31ACFFFFAFAC000061 +:103360008FAB0000016850232547FFFF30E61FFFA9 +:1033700000C4282B14A0FFF73C0C8000358B007094 +:103380008D6A00003C0708008CE700843C060800BA +:103390008CC6008000081082014918230002788042 +:1033A00000E370210000202101C3C82B00C4C0210C +:1033B00001FA4021031948212502400027BD0008D9 +:1033C0003C010800AC2E00843C010800AC290080C0 +:1033D00003E00008000000008F8200002486000740 +:1033E00030C5FFF800A2182130641FFF03E0000879 +:1033F000AF8400008F8700388F8A004027BDFFB858 +:103400008F860044AFB60040AFBF0044AFB5003C6C +:10341000AFB40038AFB30034AFB20030AFB1002C5E +:10342000AFB000288F4501048D4900ACAF47008044 +:103430008CC8002000A938230000B021AF480E102E +:103440008F440E1000004821AF440E148CC200249B +:10345000AF420E188F430E18AF430E1C10E001252B +:103460002D230001936B0008116000D400000000C0 +:10347000976E001031CDFFFF00ED602B158000CF5F +:103480000000000097700010320FFFFFAF4F0E00DA +:103490008F520000325100081220FFFD0000000092 +:1034A00097540E088F460E043285FFFF30B300019B +:1034B00012600132000000000000000D30B8A04092 +:1034C00024150040131500C030A9A0001120012DC3 +:1034D00000000000937F000813E0000800000000D7 +:1034E00097630010306BFFFF00CB402B11000003EF +:1034F00030AC00401180012300000000A785003C93 +:10350000AF8600349366000800E02821AFA70020B2 +:1035100014C0012427B30020AF60000C9782003C48 +:103520003047400014E00002240300162403000E7C +:1035300024194007A363000AAF790014938A003E60 +:103540008F740014315800070018AA400295902586 +:10355000AF7200149784003C8F70001430910010FB +:1035600002117825AF6F0014978E003C31CD000812 +:1035700011A00147000028218F6700143C021000B1 +:103580003C0C810000E22825AF65001497460E0A26 +:103590002408000E3405FFFC30C3FFFF006C5825E3 +:1035A000AF6B0004A3680002937F000A27E90004C0 +:1035B000A369000A9786003C9363000A30CC1F0081 +:1035C000000C598301634021251F0028A37F0009B7 +:1035D00097490E0CA769001093790009272A000269 +:1035E000315800070018A82332B10007A371000B5F +:1035F00093740009976400108F910034978F003CFA +:10360000329200FF024480210205702131ED00401A +:1036100011A0000531C4FFFF0091282B3C1280004F +:1036200010A000140000A0210224382B14E0011B7C +:103630008FA500208F4D0E14AF4D0E108F420E1C23 +:10364000AF420E18AF440E008F4F000031EE00085D +:1036500011C0FFFD0000000097540E080080882173 +:1036600000009021A794003C8F500E042414000108 +:10367000AF900034976400103095FFFF8E68000013 +:103680000111F82317E00009AE7F00008F650014D8 +:103690008F8B004434A60040AF6600148F4C0E1090 +:1036A000AD6C00208F430E18AD63002493670008B3 +:1036B00014E000D2000000000E00009E2404001060 +:1036C0008F8900483C08320000402821312600FF45 +:1036D0000006FC0003E8502525390001AF99004899 +:1036E000AC4A0000937800099370000A330400FF8D +:1036F00000047400320F00FF01CF6825AC4D0004B8 +:103700008F820048064000EAACA20008ACA0000C82 +:103710009783003C306B00081560000226280006E5 +:1037200026280002974E0E148F450E1C8F6700044A +:10373000936D000231C4FFFF31A200FFAFA2001061 +:103740008F6C0014AFA800180E00008BAFAC0014F3 +:10375000240400100E0000C7000000008E7200005C +:1037600016400005000000008F6400142405FFBF10 +:1037700000859824AF7300148F79000C033538212D +:10378000AF67000C9375000816A000080000000049 +:1037900012800006000000008F7F00143C0BEFFF3A +:1037A0003568FFFE03E84824AF690014A3740008DD +:1037B0008FA500200A00024602202021AF470E00FC +:1037C0000A0000F5000000008F5901780720FFFE75 +:1037D000241F08008F840000AF5F0178974B008A98 +:1037E000316AFFFF014448232528FFFF31021FFFF4 +:1037F0002C4300081460FFF9000000008F8E004881 +:103800008F8D003800C048210344202125C60001C7 +:10381000240C0F00AF86004800E9382324864000BE +:1038200031CA00FF11AC0005240800019391003E4D +:103830003230000700107A4035E80001000AAC0081 +:103840003C18010002B8A025AC9440008F930048BA +:1038500030B2003630A40008ACD3000410800097CA +:1038600001123025974E0E0A8F8D00003C02810018 +:1038700031CCFFFF25AB0008018240253C0310003E +:1038800031651FFF25390006241F000EAF48016077 +:1038900000C33025A75F015AAF850000A759015822 +:1038A00014E0000A8F93003824120F0052720002B5 +:1038B0002416000134C600408F580E108F94004427 +:1038C000AE9800208F550E18AE9500248F450E142B +:1038D000AF4501448F590E1CAF590148A34A01520C +:1038E0003C0A1000AF460154AF4A017814E0FEDDF7 +:1038F0002D2300010076A025128000178FBF004401 +:103900008F84003824160F001096008400000000F9 +:103910008F45017804A0FFFE24150F001095006E5E +:10392000000000008F470E14240202403C1F1000CC +:10393000AF4701448F440E1CAF440148A3400152DD +:10394000A740015AAF400160A7400158AF4201545F +:10395000AF5F01788FBF00448FB600408FB5003C49 +:103960008FB400388FB300348FB200308FB1002C89 +:103970008FB0002803E0000827BD004814C0FED027 +:1039800030B8A0408F420E148F84004400004821BC +:10399000AC8200208F510E1CAC9100240A00020E54 +:1039A0002D2300018F910034978A003C3C12800047 +:1039B0000220A821315800401700FF300000A0214C +:1039C000976900108F9200343139FFFF13320035B0 +:1039D00000002021008048211480FEA000A0382192 +:1039E0008F420E148F840044AC8200208F510E1C35 +:1039F000AC9100240A00020E2D230001936A0009F5 +:103A00009378000B315000FF330F00FF020F70213D +:103A100025C2000A3050FFFF0E00009E0200202148 +:103A20008F8600483C1F410024CD0001AF8D004827 +:103A3000936C000930C600FF00064400318300FF8C +:103A4000246B0002010B4825013FC825AC5900003A +:103A50008F67000C97440E1400F22825AC45000433 +:103A60008F450E1C8F670004936A00023084FFFFAD +:103A7000315800FFAFB800108F6F0014AFB10018BD +:103A80000E00008BAFAF00140A0001A60200202137 +:103A9000AF6000040A00013EA36000020A00024673 +:103AA00000002021000090210A0001702414000170 +:103AB0003C1280000A000195ACB2000C8F9100000E +:103AC00025240002A744015826300008320F1FFFAA +:103AD0000A0001F9AF8F0000AF40014C1120002C0B +:103AE000000000008F590E10AF5901448F430E188B +:103AF000240200403C1F1000AF430148A340015284 +:103B0000A740015AAF400160A7400158AF4201549D +:103B1000AF5F01780A0002278FBF00441120000622 +:103B20000000000097460E0830CC004015800002CF +:103B3000000000000000000D8F4D017805A0FFFE81 +:103B40000000000097530E103C120500240E2000C8 +:103B5000326AFFFF0152C025AF58014C8F4F0E143F +:103B60003C021000AF4F01448F500E1CAF50014873 +:103B7000A34001528F840038A740015AAF40016032 +:103B8000A7400158AF4E01540A000215AF42017818 +:103B90008F490E14AF4901448F430E1C0A00028E58 +:103BA000240200403C0E20FF27BDFFE03C1A8000AD +:103BB0003C0F800835CDFFFDAFBF001CAFB2001831 +:103BC000AFB10014AFB00010AF8F0040AF4D0E008A +:103BD00000000000000000000000000000000000E5 +:103BE000000000003C0C00FF358BFFFDAF4B0E00CA +:103BF0003C0660048CC95000240AFF7F3C11600021 +:103C0000012A40243507380CACC750008E240438F4 +:103C100024050009AF4500083083FFFF38622F718B +:103C20002450C0B3AF8000480E000068AF80000091 +:103C300052000001AE20442C0E0004353C118000DF +:103C40000E000EA8363000708F8A00403C1208002B +:103C500026523BC8020088218E0800008F5F0000BA +:103C60003BF900013338000113000017AF88003022 +:103C7000022048218D2700003C0F08008DEF006CCA +:103C80003C0C08008D8C006800E8C02301F8282156 +:103C90000000682100B8302B018D582101664021B9 +:103CA0003C010800AC25006C3C010800AC28006811 +:103CB0008F44000038830001306200011440FFEDA2 +:103CC00000E04021AF8700308E0C00003C0508006A +:103CD0008CA5006C3C0408008C84006801883023AB +:103CE00000A638210000102100E6402B0082182198 +:103CF0000068F8213C010800AC27006C3C0108007A +:103D0000AC3F00688F49010025590088AF990044F5 +:103D1000AF890038AF4900208E070000AF87003020 +:103D20008F4D017805A0FFFE000000008E06000008 +:103D30003C0B08008D6B00743C0408008C84007000 +:103D400000C728230165F8210000102103E5402B5E +:103D50000082382100E8C821240908003C0108003D +:103D6000AC3F00743C010800AC390070AF490178E9 +:103D700093580108A398003E938F003E31EE000156 +:103D800015C000158F830038240E0D00106E001929 +:103D9000240F0F00106F001D00000000915900005B +:103DA00024180050332900FF113800043C1F400044 +:103DB000AF5F01380A0002E7000000000E0008EEC5 +:103DC000000000008F8A00403C1F4000AF5F0138B8 +:103DD0000A0002E700000000938D003E31AC0006AF +:103DE000000C51000E0000CE0152D8210A000343FE +:103DF0008F8A00403C1B0800277B3C480E0000CE09 +:103E0000000000000A0003438F8A00403C1B0800AA +:103E1000277B3C680E0000CE000000000A00034330 +:103E20008F8A004090AA00018FAB00108CAC00106C +:103E30003C0300FF8D680004AD6C00208CAD0014C5 +:103E400000E060213462FFFFAD6D00248CA70018F4 +:103E50003C09FF000109C024AD6700288CAE001C9E +:103E60000182C82403197825AD6F0004AD6E002CC3 +:103E70008CAD0008314A00FFAD6D001C94A9000212 +:103E80003128FFFFAD68001090A70000A560000278 +:103E9000A1600004A167000090A30002306200FF4F +:103EA0000002198210600005240500011065000E53 +:103EB0000000000003E00008A16A00018CD800287F +:103EC000354A0080AD7800188CCF0014AD6F001417 +:103ED0008CCE0030AD6E00088CC4002CA16A0001AD +:103EE00003E00008AD64000C8CCD001CAD6D001823 +:103EF0008CC90014AD6900148CC80024AD6800089A +:103F00008CC70020AD67000C8CC200148C83006449 +:103F10000043C82B13200007000000008CC20014CF +:103F2000144CFFE400000000354A008003E0000864 +:103F3000A16A00018C8200640A000399000000005D +:103F400090AA000027BDFFF88FA9001CA3AA0000BB +:103F50008FAE00003C0FFF808FA8001835E2FFFFF6 +:103F60008CCD002C01C26024AFAC0000A120000465 +:103F700000E06021A7A000028FB800008D27000498 +:103F80000188182100A0582100C05021006D28266A +:103F90003C06FF7F3C0F00FF2CAD000135EEFFFF1C +:103FA00034D9FFFF3C02FF0003193024000D1DC06F +:103FB000010EC82400E2C02400C37025031978252F +:103FC000AD2E0000AD2F00048D450024AFAE0000E3 +:103FD000AD2500088D4D00202405FFFFAD2D000C00 +:103FE000956800023107FFFFAD27001091660018A9 +:103FF00030C200FF000219C2506000018D4500343C +:10400000AD2500148D67000827BD0008AD27001CF2 +:104010008C8B00CCAD2C0028AD20002CAD2B0024C7 +:10402000AD20001803E00008AD20002027BDFFE010 +:10403000AFB20018AFB10014AFB00010AFBF001C9A +:104040009098000000C088213C0D00FF330F007FD6 +:10405000A0CF0000908E000135ACFFFF3C0AFF00AE +:10406000A0CE000194A6001EA22000048CAB001478 +:104070008E29000400A08021016C2824012A4024FC +:104080000080902101052025A6260002AE24000410 +:1040900026050020262400080E00007624060002D3 +:1040A00092470000260500282624001400071E0061 +:1040B0000003160324060004044000032403FFFF4A +:1040C000965900023323FFFF0E000076AE23001046 +:1040D000262400248FBF001C8FB200188FB100145B +:1040E0008FB0001024050003000030210A0000807A +:1040F00027BD002027BDFFD8AFB1001CAFB000180E +:10410000AFBF002090A80000240200018FB0003C47 +:104110003103003F00808821106200148FAA00380C +:10412000240B0005506B0016AFAA001000A0202140 +:1041300000C028210E0003DC02003021922400BCC4 +:10414000308300021060000326060030ACC000007F +:1041500024C600048FBF00208FB1001C8FB0001850 +:1041600000C0102103E0000827BD002801403821CD +:104170000E00035AAFB000100A0004200000000037 +:104180000E0003A1AFB000140A00042000000000DC +:104190003C02000A034218213C04080024843CAC81 +:1041A0002405001A000030210A000080AF8300546B +:1041B0003C038000346200708C48000000A058214D +:1041C00000C04821308A00FFAF8800308F4401785A +:1041D0000480FFFE3C0C8000358600708CC500001A +:1041E0003C0308008C6300743C1808008F180070B2 +:1041F00000A82023006468210000C82101A4782BB6 +:104200000319702101CF60213C010800AC2D00741E +:104210003C010800AC2C00708F480E14AF480144DC +:10422000AF47014CA34A0152A74B015893460108DE +:1042300030C5000854A0000135291000934B090037 +:1042400024070050316A00FF1147000700000000FA +:104250008F450E1CAF450148AF4901543C09100081 +:1042600003E00008AF490178934D010831A8000828 +:104270001100001000000000934F010831EE001003 +:1042800051C00001352900083C04080090843D100D +:10429000A34401508F4309A4AF4301488F4209A0B2 +:1042A000AF420144AF4901543C09100003E000084B +:1042B000AF4901783C1908008F393CCC33380008ED +:1042C0005700FFF1352900080A00047300000000C0 +:1042D00024070040AF470814AF4008108F4209443C +:1042E0008F4309508F4409548F45095C8F46094C10 +:1042F000AF820064AF830050AF84004CAF85005C98 +:1043000003E00008AF8600609346010930C5007FD6 +:10431000000518C0000521400083102103E00008BB +:10432000244200883C0A0800914A3CD13C0908001C +:1043300095293CCA3C051100000A3C0025280002D2 +:1043400000E8302500C5182524820008AC83000051 +:1043500003E00008AC8000048F4A002C974E090847 +:104360003C0F000E034F382131CDFFFF000D41C03F +:10437000AF48002C9743090894EC001A00804021B4 +:1043800024020001318BFFFFAC8B00008CE9001C84 +:1043900000A0582100C06021AC8900048CE40020FA +:1043A000AD04000890E30019306300031062004080 +:1043B000000000002865000214A00073240600021B +:1043C0001066004E0000000024180003107800570B +:1043D000000000003C09080095293CC093450934C1 +:1043E000934609213C0E080095CE3CC630A200FF42 +:1043F0000002C88294E5002A30C400FF9787005865 +:104400000019C60000041C00312FFFFF0303102514 +:1044100001CF6821004DC82500A720213C0640009F +:104420000326C02500044C00AD090004AD180000AF +:10443000934F09203C03000625090014000F760065 +:1044400001C36825AD0D00088F42092C24E5000149 +:1044500030A67FFFAD02000C8F59093025020028DD +:10446000A7860058AD1900108F440938AD04001418 +:10447000AD2B00048F580940AD380008934F093721 +:104480003C0D080091AD3CD0AD20001031EE00FF96 +:1044900001CC182100036700000D44000188582555 +:1044A0003567FFFFAD27000C03E00008AF4A002C82 +:1044B0003C09080095293CC03C05080094A53CCA6D +:1044C0003C0F080095EF3CBC94E400243126FFFF2C +:1044D00000A6702101CF682300041C0025A2FFF272 +:1044E0000062C82524180800AD19000CAD1800148E +:1044F000AD0000100A0004C82508001894E6002446 +:1045000094E500283C09080095293CC000067C0081 +:104510000005740035ED810035C40800AD0D000CB8 +:10452000AD0400100A0004C8250800143C09080066 +:1045300095293CC03C02080094423CCA3C06080055 +:1045400094C63CBC94E400243125FFFF94F8002875 +:104550000045C8210326782300181C0000046C00C5 +:1045600025EEFFEE006EC82535A281002418080054 +:10457000AD02000CAD190010AD180018AD0000140C +:104580000A0004C82508001C1460FF920000000007 +:1045900094E300243C09080095293CC00003140062 +:1045A00034590800AD19000C0A0004C82508001091 +:1045B00003E00008240201F427BDFFE8AFB00010BB +:1045C000AFBF00140E000060008080212405004071 +:1045D000AF4508148F8300508F84004C8F85005C9A +:1045E000007018210064102318400004AF830050AD +:1045F000AF6300548F660054AF86004C1200000C6D +:10460000000000008F440074936800813409FA00B0 +:104610002D07000710E0000500891021936C008130 +:10462000240B01F4018B500401441021AF62000CF3 +:104630008F4E095C01C5682319A000048FBF0014C8 +:104640008F4F095CAF8F005C8FBF00148FB00010DC +:104650000A00006227BD00188F8400648F83005019 +:104660008F82004CAF640044AF63005003E0000849 +:10467000AF6200543C038000346200708C43000041 +:1046800027BDFFF8308700FF30A900FF30C800FFCA +:10469000AF8300308F4401780480FFFE3C0280002D +:1046A000345900708F380000A3A700033C070800AE +:1046B0008CE700748FAC00003C0608008CC60070CC +:1046C000030378233C0E7FFF00EFC82135CDFFFFA9 +:1046D00000005021018D282400CA1821000847C07D +:1046E000032F202B00A810250064C021AFA20000DA +:1046F0003C010800AC3900743C010800AC38007083 +:10470000934F010AA3A000023C0E80FFA3AF00015B +:104710008FAC0000312B007F35CDFFFF018D482489 +:10472000000B5600012A4025240730002406FF8094 +:104730003C05100027BD0008AF48014CAF470154AD +:10474000A7400158A346015203E00008AF45017895 +:1047500027BDFFE8AFBF0014AFB000108F65007435 +:104760003C068000309000FF00A620250E0000606F +:10477000AF64007493630005346200080E000062A9 +:10478000A3620005020020218FBF00148FB000102B +:1047900024050005240600010A00056E27BD001847 +:1047A00027BDFFE03C038000AFB00010AFBF001892 +:1047B000AFB10014346200708C470000309000FFED +:1047C00030A800FFAF8700308F4401780480FFFEDF +:1047D0003C188000371100708E2F00003C0D08003F +:1047E0008DAD00743C0A08008D4A007001E770230B +:1047F00001AE28210000582100AE302B014B48218A +:10480000012638213C010800AC25007400008821F5 +:104810003C010800AC2700701100000F00000000F0 +:104820008F6200742619FFFF3208007F0002FE022B +:1048300033E5007F15000006332200FF2407FF80C8 +:104840000207202624A3FFFF00838025320200FFF9 +:1048500000408021241110080E00006000000000BC +:104860008F4908183125000414A0FFFD3218007F7D +:10487000001878C00018714001CF682125AC00886D +:10488000AF4C0818274A09808D4B0020AF4B0144DC +:104890008D460024AF460148A35001500E0000622F +:1048A000A7400158022010218FBF00188FB10014BB +:1048B0008FB0001003E0000827BD002027BDFFE8EF +:1048C000308400FFAFBF00100E0005B930A500FF17 +:1048D0008F8300508FBF0010344500402404FF90A8 +:1048E0003C02100027BD0018AF43014CA344015205 +:1048F000AF45015403E00008AF4201789343093EFD +:10490000306200081040000D3C0901013528080AFA +:10491000AC8800008F470074AC8700043C06080098 +:1049200090C63CD030C5001050A00006AC800008F6 +:104930008F6A0060AC8A00082484000C03E0000841 +:10494000008010210A0006202484000C27BDFFE807 +:10495000AFBF0014AFB000109346093F00A0502134 +:10496000000528800085382330C200FF240300069C +:104970003C09080095293CC624E8FFD8240500041A +:1049800010430037240600029750093C3C0F0204F4 +:1049900000063400320EFFFF01CF6825AC8D000009 +:1049A000934C093E318B002011600008000000008C +:1049B000934309363C020103345F0300307900FF62 +:1049C000033FC02524050008AC9800049343093434 +:1049D000935909210005F882306200FF0002C0826D +:1049E000332F00FF00186E00000F740001AE602529 +:1049F000018920253C09400000898025ACF0FFD8C2 +:104A0000934309378F4F09488F580940306200FFA0 +:104A1000004AC821033F702101F86023000E6F0097 +:104A200001A650253185FFFF001F5880014548250C +:104A300001683821AD0900200E00006024F0002834 +:104A4000240400040E000062A364003F0200102151 +:104A50008FBF00148FB0001003E0000827BD0018BE +:104A60000A0006332406001227BDFFD024090010D7 +:104A7000AFB60028AFB50024AFB40020AFB100142A +:104A8000AFB000103C010800A0293CD0AFBF002C03 +:104A9000AFB3001CAFB2001897480908309500FF6B +:104AA0003C02000E3107FFFF000731C0AF46002C6B +:104AB000974409089344010B30B400FF034280215E +:104AC000308300300000B021106001070000882111 +:104AD000240C00043C010800A02C3CD0934B093E60 +:104AE000000B5600000A2E0304A0014B000000003A +:104AF000AF400048934F010B31EE002011C000067B +:104B0000000000009358093E00189E000013960311 +:104B10000640016B000000009344010B308300400D +:104B2000106000038F9300508F8200502453FFFFCA +:104B30009347093E30E6000814C000022412000327 +:104B4000000090219619002C93580934934F09378F +:104B5000A7990058330C00FF31EE00FF024E682188 +:104B6000000D5880016C5021015140213C0108008A +:104B7000A4283CC69205001830A900FF010918219D +:104B80003C010800A4233CC8921100181620000321 +:104B90002467000A0000000D2467000A30F0FFFFC0 +:104BA0003C010800A4233CCA3C010800A4203CC0EE +:104BB0003C010800A4203CBC0E00009E0200202105 +:104BC0000E00049A004020218F4B002C974A0908C0 +:104BD0003C0C000E034C38213145FFFF000549C055 +:104BE000AF49002C9743090894F1001A0040402176 +:104BF000241F00013226FFFFAC4600008CE2001C9F +:104C0000AD0200048CE40020AD04000890E300191C +:104C100030630003107F00D6286D000215A0011C30 +:104C2000240E0002106E010E240F0003106F00E32B +:104C3000000000003C09080095293CC0934E09344F +:104C4000935109213C0A0800954A3CC631CD00FF2A +:104C500094F9002A000D188297870058322C00FF23 +:104C600000032E00000C24003126FFFF3142FFFF1D +:104C700000A4F8250046482103E978250327702180 +:104C80003C18400001F86825000E8C00AD0D0000B6 +:104C9000AD110004934C09203C03000625110014BB +:104CA000000C2E0000A31025AD0200088F49092C2E +:104CB00024E40001309F7FFFAD09000C8F460930CE +:104CC00025090028A79F0058AD0600108F59093804 +:104CD00001203021AD190014AE3300048F58094073 +:104CE000AE380008934F09373C0C0800918C3CD03B +:104CF000AE20001031EE00FF01D26821000D2F0020 +:104D0000000C1C0000A310253447FFFFAE27000C49 +:104D1000AF4B002C934B093E317300081260000D1D +:104D20003C0F010135E7080AAD0700288F4B0074DE +:104D3000AD2B00043C13080092733CD03268001085 +:104D400051000003AD2000088F780060AD380008E6 +:104D50002526000C12C0003800000000935F093FB8 +:104D6000241600062407000433F900FF133600D28E +:104D7000240800029743093C3C0C02043064FFFF06 +:104D8000008C2825ACC500009342093E3049002024 +:104D90001120000800000000934B09363C1301036A +:104DA000366E0300316D00FF01AE8825ACD10004E2 +:104DB000240700089349093493590921314BFFFF17 +:104DC000313F00FF001FB082333800FF001656004D +:104DD00000187C00014F982500122880026B68257E +:104DE0003C0E400000C5502301AE8825AD51FFD8D0 +:104DF000934309378F5F09488F490940306C00FFA2 +:104E000001921021000720820044C82103E9782381 +:104E10000019C7000008B4000316402531E7FFFF62 +:104E2000010730250E000060AD46FFF82412000493 +:104E30000E000062A372003F0E0000C70200202196 +:104E40003C12080092523CD0325000031200000F76 +:104E500002A020218F82005024470001AF8700501C +:104E6000AF6700508F6800540107302318C000025C +:104E700000E020218F640054AF6400548F4C007414 +:104E8000258401F4AF64000C02A0202102802821B7 +:104E9000A76000680E0005B93C1410008F8D00500B +:104EA00034550006AF4D014C8F9100488FBF002C48 +:104EB0008FB6002826230001AF8300488FB3001C63 +:104EC000A35101528FB20018AF5501548FB1001495 +:104ED000AF5401788FB500248FB400208FB000103C +:104EE00003E0000827BD00309358093E00189E00DB +:104EF0000013960306420051241100029344092333 +:104F0000308300021060FEFB8F8600608F820050AD +:104F100014C2FEF8000000000E0000600000000057 +:104F20009369003F24070016312800FF1107000C89 +:104F3000240500083C0C0800918C3CD0358B000106 +:104F40003C010800A02B3CD0936A003F314300FF96 +:104F500010650065240D000A106D005E2402000C2F +:104F60000E000062000000000A00068E0000000033 +:104F70003C09080095293CC03C04080094843CCAC4 +:104F80003C1F080097FF3CBC94F800243123FFFF2E +:104F90000083C821033F782300186C0025EEFFF240 +:104FA00001AE6025240A0800AD0C000CAD0A001407 +:104FB000AD0000100A0006E0250800183C090800B2 +:104FC00095293CC03C1F080097FF3CCA3C190800CB +:104FD00097393CBC94EF00243124FFFF94EE002865 +:104FE00003E4C02103196823000F2C00000E5400B5 +:104FF00025ACFFEE014C882534A281002406080070 +:10500000AD02000CAD110010AD060018AD0000148B +:105010000A0006E02508001C8F6E00848F4D0940B1 +:1050200011A0FEB3AF8E0050240F00143C01080005 +:10503000A02F3CD00A00068D000000003C010800B3 +:10504000A0313CD0935F093E2416000133F90020C3 +:105050001720FEA8241100080A00068E241100045F +:1050600094E5002494F100283C09080095293CC0EF +:1050700000051400001134003444810034C30800DA +:10508000AD04000CAD0300100A0006E02508001472 +:105090001460FEE80000000094FF00243C090800B2 +:1050A00095293CC0001FCC0037380800AD18000C13 +:1050B0000A0006E0250800100A00072E2408001246 +:1050C0008F7F004CAF7F00548F7900540A00069701 +:1050D000AF790050A362003F0E00006200000000A4 +:1050E0000A00068E00000000240200140A000807CF +:1050F000A362003F27BDFFE8308400FFAFBF001070 +:105100000E0005B930A500FF9378007E9379007FEB +:10511000936E00809368007A332F00FF00186600BA +:10512000000F6C0031CB00FF018D4825000B5200B1 +:105130008FBF0010012A3825310600FF344470006B +:1051400000E628252402FF813C03100027BD00183B +:10515000AF45014CAF440154A342015203E00008A3 +:10516000AF43017827BDFFD8AFB20018AFB100142C +:10517000AFB00010AFBF0020AFB3001C93420109D5 +:10518000308600FF30B000FF000618C23204000273 +:105190003071000114800005305200FF9367000554 +:1051A00030E5000810A0000D30C80010024020219A +:1051B0000E0005A502202821240400018FBF002035 +:1051C0008FB3001C8FB200188FB100148FB0001085 +:1051D0000080102103E0000827BD002815000032E0 +:1051E0000000000093430109000028213062007F85 +:1051F000000220C00002F94003E4982126790088CB +:10520000033B98218E7800248E6F0008130F004610 +:10521000000000008F640084241800020004FD8256 +:1052200033F900031338007C00000000936600830C +:10523000934A0109514600043205007C10A0006029 +:10524000000000003205007C14A000530240202121 +:1052500016200006320400018E7F00248F590104BD +:1052600017F9FFD600002021320400011080000A47 +:10527000024020218F4209408F93006410530006A2 +:10528000000000000E00066B022028218F43094019 +:10529000AF630044024020210E00060002202821B6 +:1052A0000A000840240400013C0908008D2900641C +:1052B000252600013C010800AC26006416000012FF +:1052C000000000008F6D00843C0E00C001AE602421 +:1052D00015800005024020210E00080E0220282122 +:1052E0000A00084024040001240500040E00056E95 +:1052F00024060001024020210E00080E0220282171 +:105300000A000840240400010E00004124040001AA +:10531000936B007D020B50250E000062A36A007D96 +:105320000A0008838F6D00848F6600748F48010423 +:105330008E67002400064E021507FFB63126007F57 +:10534000936B008326440001308A007F114600439E +:10535000316300FF5464FFB08F6400842645000170 +:1053600030B1007F30A200FF1226000424050001A6 +:10537000004090210A00085624110001240FFF80EC +:10538000024F702401CF9026324200FF004090214E +:105390000A000856241100010E00066B0220282185 +:1053A000321800301300FFAA321000820240202180 +:1053B0000E0005A5022028210A000840240400014F +:1053C0008F6E00743C0F80002405000301CF9025F0 +:1053D000AF72007493710083240600010E00056E05 +:1053E000322400FF0E00004124040001936D007D73 +:1053F000020D60250E000062A36C007D3C0B0800CE +:105400008D6B0054257000013C010800AC30005445 +:105410000A000840240400018F6800743C098000E1 +:105420002405000401093825AF67007493630083E5 +:10543000240600010E00056E306400FF0E000041DE +:10544000240400019362007D020298250E00006290 +:10545000A373007D0A00084024040001324D00803F +:1054600039AC0080546CFF6C8F6400840A0008A97A +:105470002645000127BDFFC83C0A0008AFBF003029 +:10548000AFB5002CAFB40028AFB30024AFB20020FA +:10549000AFB1001CAFB00018034AD8212409004066 +:1054A000AF490814AF4008108F4209448F43095098 +:1054B0008F4609548F47095C8F48094C9344010873 +:1054C0009345010BAF820064308400FF30A500FFDC +:1054D000AF830050AF86004CAF87005C0E00082AF7 +:1054E000AF880060144001748FBF0030A76000686F +:1054F000934D0900240B00503C15080026B53C884C +:1055000031AC00FF3C12080026523C98118B00037E +:10551000000000000000A821000090219351010923 +:105520008F9F005024040010322E007F000E68C0B0 +:10553000000E6140018D282124B40088AF54081862 +:105540008F4901048F4A09A43C0B000E034BC02174 +:10555000012A10233C010800AC223CAC8F430958BF +:105560003C010800A0243CD097470908007F302365 +:105570003C010800AC263CB030E8FFFF0008C9C081 +:105580003C010800AC3F3CD4AF59002C97420908BD +:105590009710002C8EB10000930F0018037498210F +:1055A000A7900058AF9300440220F80931F000FFA3 +:1055B000304E000215C001A9304F000111E0015D1D +:1055C000000000009343093E3066000814C000024A +:1055D000241400030000A0218F5809A42413000103 +:1055E0003C010800AC383CD8934F0934935109373B +:1055F00031EC00FF322E00FF028E6821000D288062 +:1056000000AC5021015058213C010800A42B3CC89B +:105610003C010800A42A3CC693490934312200FF0A +:1056200002022021249000103C010800A4303CC458 +:10563000240700068F9F00503C010800AC273CCC9B +:105640008F88005C8F59095800008021011F282392 +:1056500004A00151033F20230480014F00A4302BFC +:1056600010C00151000000003C010800AC253CB016 +:105670008E4200000040F8090000000030430002A4 +:10568000146000F100408821304400015480001073 +:105690008E4200043C0908008D293CB43C0AC0003D +:1056A000012A8025AF500E008F45000030AB000866 +:1056B0001160FFFD00000000974D0E08241000014E +:1056C000A78D003C8F4C0E04AF8C00348E4200043A +:1056D0000040F8090000000002228825322E000256 +:1056E00015C0016F000000003C09080095293CBC72 +:1056F0003C06080094C63CC83C04080094843CBEA8 +:105700003C1808008F183CB4012658213C0F0800B3 +:105710008DEF3CD83C1F080097FF3CD20164182154 +:105720008F4D09400309C821246E0002033F282140 +:1057300001F860213C010800A42B3CCAAF8D006435 +:105740003C010800AC2C3CD83C010800A4253CC01E +:105750000E00009E31C4FFFF8F87004800402021CB +:105760003C010800A0273CD18E42000824E800013B +:10577000AF8800480040F809000000008F4B002C63 +:10578000974909083C0A000E034A38213124FFFFDB +:10579000000419C08F8A0050AF43002C97430908BA +:1057A00094E6001A0040402130DFFFFFAC5F0000AC +:1057B0008CF9001CAC5900048CF80020AC5800088F +:1057C00090EF001931E30003107300FB00000000AC +:1057D0002862000214400117240500021065010927 +:1057E000240C0003106C00BC000000003C09080001 +:1057F00095293CC0935F0934934C09213C0D080066 +:1058000095AD3CC633F900FF94E5002A0019C0822B +:10581000318F00FF978C005800181600000F74009D +:105820003124FFFF004E382501A4302100E6F82581 +:1058300000ACC8213C03400003E3C02500194C0024 +:10584000AD180000AD090004934F09203C0E00067E +:1058500025090014000F6E0001AE2825AD050008D3 +:105860008F46092C2582000130477FFFAD06000CD2 +:105870008F440930A787005825060028AD04001082 +:105880008F43093800C02021AD030014AD2A000465 +:105890008F5F0940AD3F0008935909373C0E08005F +:1058A00091CE3CD0AD200010333800FF0314782196 +:1058B000000F6700000E6C00018D282534A2FFFF49 +:1058C000AD22000CAF4B002C9347093E30EA000894 +:1058D0005140000F8E58000C3C0301013469080A46 +:1058E000AD0900288F4A0074ACCA00043C0B0800C4 +:1058F000916B3CD03168001051000003ACC000082F +:105900008F650060ACC5000824C4000C8E58000CE4 +:105910000300F809000000003C0F080095EF3CCAA6 +:105920003C02080094423CBE01E2702125C4000202 +:105930000E0000C73084FFFF3C0608008CC63CAC5C +:105940003C0D08008DAD3CB400CD38233C0108006F +:10595000AC273CAC14E00006000000003C19080035 +:105960008F393CCC372C00403C010800AC2C3CCC9F +:10597000120000858F8B00448F480E108F900044DA +:10598000AE0800208F5F0E18AE1F00243C100800E8 +:1059900096103CC00E00006000000000240500408E +:1059A000AF4508148F8300508F89004C0070182178 +:1059B0000069502319400004AF830050AF630054C6 +:1059C0008F670054AF87004C1200000C00000000ED +:1059D0008F440074936D0081340EFA002DA60007E9 +:1059E00010C00005008E182193780081240201F474 +:1059F0000302780401E41821AF63000C8F4C095CAA +:105A00008F99005C0199202318800003000000009A +:105A10008F50095CAF90005C0E0000620000000037 +:105A20008F8B00508E4800103C010800AC2B3CD4FA +:105A30000100F809000000003C1F08008FFF3CAC8B +:105A400017E0FEFC240700068F4500249742090852 +:105A50008F8A00648F9400503C0F001F9787005876 +:105A60008F8300548F93004C304DFFFF35EEFF8045 +:105A700000AE4824000D31C032320010AF46002481 +:105A8000A467002CAF490024AF6A0044AF740050F3 +:105A9000AF7300545640007E8EB80004322400409C +:105AA000548000328EB100088EAC000C0180F809E1 +:105AB000000000008FBF00308FB5002C8FB400288D +:105AC0008FB300248FB200208FB1001C8FB000185C +:105AD00003E0000827BD00383C09080095293CC0B8 +:105AE0003C04080094843CCA3C1F080097FF3CBC5F +:105AF00094F800243123FFFF94EF00280083C8218D +:105B0000033F702300182C00000F640025CDFFEE2A +:105B1000018D302534A2810024030800AD02000C61 +:105B2000AD060010AD030018AD0000140A0009CE48 +:105B30002508001C934701098F8800380007FE00E4 +:105B400003E8C825AF5900808F5809A08F5309A4D6 +:105B5000AFB80010AF580E148FB40010AF540E1031 +:105B6000AF530E1C0A000942AF530E180220F80969 +:105B7000000000008EAC000C0180F809000000005D +:105B80000A000A7F8FBF0030A5600020A5730022A5 +:105B90000A000A34AD7300243C010800AC203CB07C +:105BA0000A00096E8E4200003C010800AC243CB0A3 +:105BB0000A00096E8E4200003C09080095293CC08D +:105BC0003C1F080097FF3CCA3C19080097393CBCB1 +:105BD00094EF00243124FFFF03E4C0210319702354 +:105BE000000F640025CDFFF2018D2825AC45000C87 +:105BF00024020800AD020014AD0000100A0009CE16 +:105C00002508001894E6002494E300283C090800C5 +:105C100095293CC0000624000003FC003499810053 +:105C200037F80800AD19000CAD1800100A0009CEB5 +:105C3000250800141460FEED0000000094EF00241D +:105C40003C09080095293CC0000F740035CD0800C0 +:105C5000AD0D000C0A0009CE250800109352010971 +:105C6000000028210E000600324400FF8FBF0030E4 +:105C70008FB5002C8FB400288FB300248FB2002082 +:105C80008FB1001C8FB0001803E0000827BD00385A +:105C90000300F809000000000A000A7932240040DD +:105CA0001200FF69000000008F540E148F92004410 +:105CB000AE5400208F530E1C0A000A63AE5300241A +:105CC0008F82001C008040213C0401009047008529 +:105CD00030E3002010600009000000003C070800CD +:105CE0008CE73CD48F83001800E320230480000855 +:105CF0009389000414E300030100202103E000085D +:105D0000008010213C04010003E000080080102105 +:105D10001120000B006738238F8C002024090034E9 +:105D2000918B00BC316A000251400001240900300F +:105D300000E9682B15A0FFF10100202100E93823BC +:105D40002419FFFC00B9C02400F9782400F8702B56 +:105D500015C0FFEA01E8202130C200030002182329 +:105D600014C00012306900030000302100A9702126 +:105D700001C6682100ED602B1180FFE03C040100AA +:105D80002D2F00010006482B0105382101E93024A0 +:105D900014C0FFDA24E4FFFC2419FFFC00B9C0247E +:105DA0000308202103E00008008010218F8B0020D1 +:105DB00024060004916A00BC314400041480FFEC06 +:105DC00000A970210A000B2D0000302127BDFFE83B +:105DD000AFBF00108F460100934A01093C1F080025 +:105DE0008FFF00902407FF80314F00FF31E8007FD4 +:105DF0000008614003E6C821032CC02127090120C7 +:105E0000012770243C010800A02F3D10AF4E080C64 +:105E10003C0D08008DAD00903C04008034820003EE +:105E200001A65821016C18212465012030AA0078B0 +:105E300001424025AF48081C3C1F08008FFF00901E +:105E40008F88004003E6C021331900070307482468 +:105E5000033A7821AF49002825E909C0952E0002B0 +:105E60003C0D08008DAD008C3C0A08008D4A009066 +:105E700031CC3FFF01A61821000C5980006B28216E +:105E800000A72024AF44002C952200023C1F0800EC +:105E90008FFF008C9107008530593FFF03E6782182 +:105EA0000019C1800146702101F8682131CC007FC2 +:105EB00031AB007F019A2821017A50213C03000C6C +:105EC0003C04000E00A328210144102130E60020EC +:105ED00027470980AF82002CAF88001CAF890024BF +:105EE000AF85002010C00006AF8700288D0200504B +:105EF0008CA4010C0044302318C00077000000007F +:105F0000910C0085240DFFDF018D3824A107008549 +:105F10008F8B001C8F8900248F8700288D65004C93 +:105F2000AF850018912F000D31EE002011C0001731 +:105F30000000000024090001A3890004AF80000CC8 +:105F40008CE400248F85000C240A0008AF80000830 +:105F5000AF8000103C010800A42A3CBE3C010800B0 +:105F6000A4203CD20E000B01000030218F850024BC +:105F70008FBF0010AF82001490A8000D27BD00183D +:105F80000008394203E0000830E20001913F0002BE +:105F90002418000133F900FF0019218210980039FC +:105FA000240800021088005B8F86002C8CE50024FA +:105FB00014A0001B8F9F002091220000240A0005DE +:105FC0003046003F10CA0047240400018F860008B5 +:105FD000A3840004AF860010AF86000C8CE400247C +:105FE0008F85000C240A00083C010800A42A3CBE4E +:105FF0003C010800A4203CD20E000B010000000070 +:106000008F8500248FBF0010AF82001490A8000D70 +:1060100027BD00180008394203E0000830E2000103 +:106020008CF800088CF900248FEE00C4A3800004D3 +:106030008CE40024AF8E000C8F85000C8F86000846 +:1060400003197823240A0008AF8F00103C010800D0 +:10605000A42A3CBE3C010800A4203CD20E000B0147 +:10606000000000008F8500248FBF0010AF82001455 +:1060700090A8000D27BD00180008394203E0000871 +:1060800030E20001912300003062003F10440027FD +:106090008F8500208CE40024148000210000000083 +:1060A0008D2E00183C187FFF8F850020370FFFFFD3 +:1060B00001CF1824AF8300088F9F00088CA80084AC +:1060C00003E8C82B1720000203E020218CA40084E1 +:1060D0000A000BBCAF8400088CA3010C0A000B9AC9 +:1060E000AF8300188D2C00188F8600083C0D7FFFB1 +:1060F0008F89002035A3FFFF018358242404000169 +:10610000AF8B0010AD2000CCA38400040A000BC8A4 +:10611000AF86000C8CCA00140A000BBCAF8A0008C2 +:106120008CA300C80A000BFFAF8300088F84002CEB +:106130008CAC00648C8D0014018D582B1160000410 +:10614000000000008CA200640A000BFFAF82000870 +:106150008C8200140A000BFFAF8200088F85000CB0 +:1061600027BDFFE0AFBF0018AFB1001414A00007B7 +:10617000AFB000108F8600242402000590C40000F8 +:106180003083003F106200B68F8400208F9100089A +:1061900000A080218F8C00283C0508008CA53CB015 +:1061A0008D8B000431663FFF00C5502B5540000128 +:1061B00000C02821938D000411A0007300B0F82BBB +:1061C0008F98002024040034930F00BC31EE0002AD +:1061D00051C000012404003000A4C82B172000D1B6 +:1061E0000000000000A4282300B0F82B3C010800A8 +:1061F000A4243CBC17E00068020020213C030800F6 +:106200008C633CAC0083102B5440000100801821AB +:106210008F8800243C010800AC233CB400004821D6 +:106220009104000D30830020506000018F490E184A +:106230008F8300140123382B10E000590000000068 +:106240003C0408008C843CB400895821006B502B1E +:10625000114000560090602B0069302300C02021BF +:106260003C010800AC263CB412000003241FFFFCD4 +:106270001090008A32270003009FC8243C010800C8 +:10628000AC393CB43C010800A4203CD28F84000C03 +:10629000120400078F830020AF9100080200202124 +:1062A0008C7100CCAF90000C26300001AC7000CC9B +:1062B0003C0208008C423CB48F8A0010240700186E +:1062C0000082202301422823AF84000C10800002AA +:1062D000AF850010240700108F86001C3C010800C9 +:1062E000A0273CD02407004090CC0085318B00C013 +:1062F000116700408F8D001414A0001500002021AC +:10630000934A01098F420974314500FF00022602B9 +:1063100024A300013090007F3071007F1230007A9A +:106320002407FF80A0C300833C0908008D293CCCD2 +:106330008F880024240D0002352C00083C01080041 +:10634000A02D3D113C010800AC2C3CCC24040010D5 +:10635000910E000D31C6002010C0000500801821EC +:10636000240800013C010800AC283CB4348300013F +:106370008FBF00188FB100148FB000100060102183 +:1063800003E0000827BD00203C010800A4203CBC1D +:1063900013E0FF9A020020210A000C5000A02021E7 +:1063A0003C0408008C843CB40090602B1180FFAE4C +:1063B000000000003C0F080095EF3CBC01E4702198 +:1063C00001C6682B11A000072C8200043C1F60004E +:1063D0008FF954043338003F1700FFE524030042CF +:1063E0002C8200041040FFA0240300420A000CAEDF +:1063F0008FBF0018152DFFC0000000008CDF007457 +:106400003C0380002405FF8003E3C825ACD9007459 +:1064100090D80085240E000424040010330F003FA0 +:1064200001E54025A0C800858F8800243C010800B4 +:10643000A02E3D11240300019106000D30C900205B +:1064400015200003000000003C0308008C633CB4EE +:106450003C010800AC233CAC0A000CA50000000085 +:106460008F8700108C88008400E8282B14A000027D +:1064700000E088218C91008424090001A389000494 +:106480008F440E18022028210E000B01022030211B +:10649000022080210A000C36AF8200140007182366 +:1064A000306600033C010800A4263CD212200005FF +:1064B0008F8C0020918B00BC316A000415400015C0 +:1064C00024CD00043C0F080095EF3CD201E470217C +:1064D00000AE302B50C0FF6E8F84000C2C85000561 +:1064E00014A0FFA324030042309800031700000209 +:1064F000009818232483FFFC3C010800AC233CB423 +:106500000A000C720000000000A758240A000C9A30 +:10651000016718263C010800A42D3CD20A000D0298 +:10652000000000003C010800AC203CB40A000CADA7 +:10653000240300428F830010146000070000102124 +:106540008F880024240500059106000030C400FF58 +:10655000108500030000000003E0000800000000B8 +:10656000910A0018314900FF000939C214E0FFFA0E +:106570008F85001C3C04080094843CBC3C0308004C +:106580008C633CD43C1908008F393CB43C0F0800A4 +:1065900095EF3CD20064C0218CAD005403197021EA +:1065A00001CF6021018D58231960001D00000000FB +:1065B000910E001C8F8C002C974B0E1031CD00FFDC +:1065C0008D850004016D30238D88000030CEFFFFE3 +:1065D000000E510000AAC821000038210107202127 +:1065E000032A182B0083C021AD990004AD98000048 +:1065F000918F000A01CF6821A18D000A8F88002C9D +:10660000974B0E12A50B0008950A0038254900018A +:10661000A50900389107000D34E60008A106000D19 +:1066200003E000080000000027BDFFE0938700049E +:106630008F8F00248FAD00143C0E7FFF8F89000CDC +:1066400035C8FFFFAFBF001CAFB0001801A8182469 +:1066500091EA000D000717C03C1FBFFF00625825DC +:106660002D2E00018F90001837F9FFFF3C1808000D +:106670008F183CD43C0F080095EF3CCA0179682480 +:10668000000E47803C07EFFF3C05F0FF01A81825EE +:106690003149002034E2FFFF34ACFFFF03105823E0 +:1066A00027A500102406000225EA00020062182433 +:1066B0000080802115200002000040218F480E1C20 +:1066C000A7AA0012056000372407000030FF00FF72 +:1066D000001FCF008F8B001C00793825AFA7001456 +:1066E000916F00853C08080091083CD13C18DFFF01 +:1066F00031EE00C0370AFFFF000E182B3C1F0800C8 +:1067000097FF3CC400EA6824A3A8001100031740C7 +:1067100001A248258FB90010AFA900143C0A080057 +:10672000914A3CD3A7BF00168FA80014032CC024A5 +:106730003C0B01003C0F0FFF030B182531470003F2 +:1067400035EEFFFF010C682400071600006EF824E8 +:106750003C09700001A2C82503E95825AFB900140F +:10676000AFAB00100E000076A3A000158F8C0024A4 +:10677000260200089186000D30C40020108000061B +:106780008FBF001C3C05080094A53CC024B0FFFF4F +:106790003C010800A4303CC08FB0001803E00008A2 +:1067A00027BD00208F9800140118502B5540FFC7BB +:1067B000240700010A000D8530FF00FF93820004CA +:1067C00027BDFFE0AFBF00181040000F0080502130 +:1067D0008F880024240B00058F8900089107000092 +:1067E0008F8400200100282130E3003F8F86002C99 +:1067F000106B000800003821AFA900100E00040E35 +:10680000AFAA0014A38000048FBF001803E00008A3 +:1068100027BD00208D1900183C0F08008DEF3CB4F7 +:106820008F9800103C027FFF8D080014345FFFFF3B +:10683000033F682401F8702101AE602301883821EC +:10684000AFA900100E00040EAFAA00140A000DD369 +:10685000A38000048F8700243C05080094A53CD247 +:106860003C0208008C423CCC90E6000D0005240060 +:1068700030C300201060002C004440258F85001C90 +:1068800000006021240B000190A300850000482136 +:10689000240A00013C0F800035EE00708DC7000017 +:1068A000AF8700308F5801780700FFFE3C0380005F +:1068B000347900708F3800003C0508008CA5007406 +:1068C0003C0D08008DAD00700307782300AF382120 +:1068D0000000102100EF302B01A22021008618219A +:1068E0003C010800AC2700743C010800AC23007098 +:1068F000AF4B01483C1908008F393CD4A7490144EB +:10690000A74A0146AF59014C3C0B0800916B3CD1A2 +:10691000A34B0152AF4801543C081000A74C01584A +:1069200003E00008AF4801788F4B0E1C3C0A0800BA +:106930008D4A3CB497490E16974D0E1401456021BF +:10694000312AFFFF0A000DF631A9FFFF8F830024D3 +:106950009064000D308200201040002900000000EB +:106960000000482100005021000040213C07800029 +:1069700034EB00708D670000AF8700308F4C0178DA +:106980000580FFFE3C0D800035AC00708D8B000053 +:106990003C0508008CA500743C0408008C84007041 +:1069A0000167302300A678210000102101E6C82BE2 +:1069B0000082C021031970213C010800AC2F007433 +:1069C0003C010800AC2E0070AF4901483C0D0800A6 +:1069D0008DAD3CD4A748014424090040A74A014694 +:1069E0003C081000240AFF91AF4D014CA34A01520C +:1069F000AF490154A740015803E00008AF480178AF +:106A00008F490E1897460E1297450E1030CAFFFF99 +:106A10000A000E2C30A8FFFF8F83002427BDFFF84B +:106A20009064000D308200201040003A0000000009 +:106A3000240B000100004821240A00013C088000CA +:106A4000350700708CE30000AF8300308F4C017875 +:106A50000580FFFE3C0E80003C04080090843D1041 +:106A600035C700708CEC00003C0508008CA5007454 +:106A7000A3A400033C1908008F3900708FAD0000FB +:106A80000183302300A63821000010210322782141 +:106A900000E6C02B01F8602101AE4025AFA8000040 +:106AA0003C010800AC2700743C010800AC2C0070CD +:106AB0009346010A3C04080090843D11A3A0000203 +:106AC000A3A600018FA300003C0580FF3099007F42 +:106AD00034A2FFFF006278240019C60001F8702577 +:106AE000240D3000AF4E014C27BD0008AF4D0154BE +:106AF000A7400158AF4B0148A7490144A74A0146A6 +:106B00003C091000240AFF80A34A015203E0000858 +:106B1000AF4901788F4B0E1897460E1297450E100D +:106B200030CAFFFF0A000E6030A9FFFF8F85001CEE +:106B30002402008090A40085308300C0106200050C +:106B40008F8600208F8800088F87000CACC800C893 +:106B5000ACC700C403E00008000000003C0A0800C5 +:106B6000254A38903C0908002529395C3C08080072 +:106B700025082D103C07080024E73A703C06080061 +:106B800024C637003C05080024A534783C040800DE +:106B9000248430A03C030800246337983C0208009A +:106BA0002442356C3C010800AC2A3C903C010800B2 +:106BB000AC293C8C3C010800AC283C883C01080016 +:106BC000AC273C943C010800AC263CA43C010800E6 +:106BD000AC253C9C3C010800AC243C983C010800DE +:106BE000AC233CA83C010800AC223CA003E0000818 +:046BF00000000000A1 +:00000001FF +/* + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ diff --git a/firmware/bnx2/bnx2-mips-09-4.6.17.fw.ihex b/firmware/bnx2/bnx2-mips-09-4.6.17.fw.ihex deleted file mode 100644 index 7667c66..0000000 --- a/firmware/bnx2/bnx2-mips-09-4.6.17.fw.ihex +++ /dev/null @@ -1,5816 +0,0 @@ -:10000000080000F80800000000004AC8000000C80E -:1000100000000000000000000000000008004AC8C6 -:100020000000003000004B90080000800800000035 -:10003000000053A800004BC0080055400000008499 -:1000400000009F68080053A80000016C00009FECAE -:10005000080031D808000000000079080000A1580D -:100060000000000000000000000000000800790807 -:100070000000012400011A60080004880800040040 -:10008000000013A400011B84000000000000000019 -:1000900000000000080017A40000000400012F2841 -:1000A000080000980800000000003AFC00012F2C16 -:1000B00000000000000000000000000008003AFC02 -:0800C0000000003000016A2875 -:0800C8000A00003E00000000E8 -:1000D000000000000000000D636F6D342E362E31DD -:1000E00036000000040610020000000000000003BB -:1000F00000000014000000320000000300000000B7 -:1001000000000000000000000000000000000000EF -:1001100000000010000001360000EA60000000014D -:1001200000000000000000000000000000000008C7 -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000020000000000000000000000008D -:10017000000000000000000000000000000000007F -:10018000000000000000000000000010000000005F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C0000000000010000003000000000000000D0F -:1001D0000000000D3C02080024424B203C030800B4 -:1001E00024634C18AC4000000043202B1480FFFD1A -:1001F000244200043C1D080037BD9FFC03A0F021F1 -:100200003C100800261000F83C1C0800279C4B20DE -:100210000E000273000000000000000D27BDFFE883 -:100220003C028000AFB00010AFBF0014345001009A -:10023000920200091040001A240300013C02080049 -:100240008C42002010400016000018210E000D7195 -:1002500000000000960300083C06080094C64BFE10 -:100260008E0400188F82002C9605000C00031C00E1 -:1002700000661825AC440000AC45000424040001CD -:10028000AC400008AC40000CAC400010AC40001486 -:10029000AC4000180E000D98AC43001C0000182163 -:1002A0008FBF00148FB000100060102103E0000821 -:1002B00027BD001827BDFFE8AFBF00103C0280003B -:1002C0009442010830437000240220001062000AAA -:1002D00028642001548000128FBF001024024000C7 -:1002E00010620008240260001062000A8FBF001034 -:1002F0000A000097000010218FBF00100A0000556F -:1003000027BD00180E000433000000000A0000960C -:100310008FBF00100E000C81000000008FBF001086 -:100320000000102103E0000827BD00183C0208006F -:100330008C42002027BDFFE810400028AFBF00100E -:100340000E000D71000000003C05800094A2010821 -:1003500094A3010C8F86002C3042003E3063FFFFD7 -:100360000002140000431025ACC200008CA2010062 -:100370003C07080094E74BFE8FBF0010ACC200049E -:1003800094A3011694A4010E3C02200000031C005B -:100390003084FFFF00641825ACC3000800E2382554 -:1003A00094A2011094A3011224040001000214007D -:1003B0003063FFFF00431025ACC2000C94A201146F -:1003C00027BD00183042FFFFACC20010ACC00014C3 -:1003D000ACC000180A000D98ACC7001C8FBF0010FD -:1003E00003E0000827BD00183C0680008CC202B85C -:1003F0002403000104410008008028213C02080079 -:100400008C420060244200013C010800AC220060E4 -:1004100003E00008006010218C8300209482001605 -:10042000ACC302802442FFFCA4C202843C02080048 -:100430008C42005C8C84000494A3000E24420001D2 -:100440003C010800AC22005C3C021000A4C3028600 -:10045000ACC4028800001821ACC202B803E0000856 -:10046000006010213C0208008C42002027BDFFE8FC -:100470001040002BAFBF00100E000D7100000000F7 -:100480003C05800094A2010894A3010C8F86002CE7 -:100490003042003E3063FFFF00021400004310258D -:1004A000ACC200008CA201003C07080094E74BFEA0 -:1004B0008FBF0010ACC2000494A3011694A4010ED7 -:1004C0003C02200000031C003084FFFF006418255C -:1004D000ACC3000800E2382594A2011094A30112D5 -:1004E00024040001000214003063FFFF00431025C4 -:1004F000ACC2000C94A2011427BD00183042FFFFCB -:10050000ACC200108CA20118ACC2001490A2010B66 -:10051000304200FFACC200180A000D98ACC7001CA6 -:100520008FBF001003E0000827BD001827BDFFE0C3 -:10053000AFB000103C108000AFB20018AFBF001C7D -:10054000AFB10014361201009243000B2402001ACE -:10055000965100081462005B00002821322200013D -:1005600010400018000000008E42000000022340EE -:100570003C02003F3442FFFF0044102B10400004B7 -:100580003C030040964200140A00013B00832021F6 -:100590008E030100240201005462000696420014FA -:1005A0003C028008944200043042000F0002250003 -:1005B0009642001400821025AE0200800A00016FEE -:1005C000000000003C0208008C420020104000287F -:1005D000000000000E000D710000000096020108EE -:1005E0009603010C8F85002C3042003E3063FFFFE4 -:1005F0000002140000431025ACA200008E0201008E -:100600003C06080094C64BFEACA2000496030116FB -:100610009604010E3C02200000031C003084FFFF02 -:1006200000641825ACA3000800C230259602011012 -:100630009603011224040001000214003063FFFF3E -:1006400000431025ACA2000C960201143042FFFFBB -:10065000ACA200108E020118ACA200149202010B91 -:10066000304200FFACA200180E000D98ACA6001C92 -:100670003C0208008C420040244200013C0108007A -:10068000AC2200403C0308008C630044322200028C -:1006900032240004246300013C010800AC23004420 -:1006A000108000080002282B024020218FBF001C70 -:1006B0008FB200188FB100148FB000100A0000C86C -:1006C00027BD00208FBF001C8FB200188FB100140F -:1006D0008FB0001000A0102103E0000827BD00200B -:1006E00027BDFFE03C058000AFB10014AFBF00188C -:1006F000AFB0001034B101009223000B24020003BC -:1007000014620043963000083202000110400016C7 -:100710003C02003F8E2300003442FFFF00032340D1 -:100720000044102B504000052402010096220014C2 -:100730003C0300400A0001A400832021546200060B -:10074000962200143C028008944200043042000FBC -:10075000000225009622001400821025ACA2008021 -:100760000A0001AF000000000E0000990000000028 -:100770003C0208008C420040244200013C01080079 -:10078000AC2200403C0208008C42004432030004CA -:10079000244200013C010800AC2200441060000724 -:1007A00032020002022020218FBF00188FB10014F6 -:1007B0008FB000100A0000C827BD002010400015AF -:1007C0008FBF00183C0480008C8301043C02602031 -:1007D000AC4300148C420004240301FE304203FFAA -:1007E0001443000C8FBF00188C820100000219C254 -:1007F0002462FFFC2C420008104000032404000285 -:100800002462FFFD004420043C026000AC446914F3 -:100810008FBF00188FB100148FB00010000010219E -:1008200003E0000827BD00203C0480008C83010009 -:1008300024020100506200033C0280080000000D09 -:100840003C02800894430004000010213063000F34 -:1008500000031D0003E00008AC8300803C02800818 -:10086000344200809042000003E00008AF800000A6 -:1008700003E000080000102127BDFFE83C028000D3 -:10088000AFBF0014AFB000108C430100AC43002098 -:100890008C430104AC4300A89050010B0E0001E50D -:1008A000321000FF3C02080024424B580010188010 -:1008B0002E10001D16000005006210210E0001EA36 -:1008C000004018210A000205000000008C420000D0 -:1008D0000040F80900000000004018213C02080018 -:1008E0008C42003410600005244400013C0280006A -:1008F0008C4301043C026020AC4300148FBF001401 -:100900008FB000103C0340003C02800027BD00185F -:10091000AC4301383C010800AC24003403E000087B -:100920000000000027BDFFE8AFBF0014AFB000100B -:100930003C1080008E0201400E0001E5AE02002056 -:100940000E000399000000003C04080024840038D5 -:100950008C8200003C034000AE0301788FBF00147E -:100960008FB000102442000127BD001803E00008EA -:10097000AC82000027BDFFE8AFB00010AFBF00148D -:100980003C1080008E0201800E0001E5AE020020C6 -:100990008E03018024020F00546200083C0280088C -:1009A0008E0201883C0300E03042FFFF0043102527 -:1009B000AE0200800A00024A3C02800034420080FD -:1009C0009042000024030050304200FF144300080E -:1009D0003C0280000E000379000000001440000477 -:1009E0003C0280000E000967000000003C0280000D -:1009F0003C034000AC4301B83C0208008C42003C80 -:100A00008FBF00148FB00010244200013C01080089 -:100A1000AC22003C03E0000827BD001803E00008FA -:100A2000000010213C05800034A4010094820008DD -:100A30003043000230420004104000030000000078 -:100A40000A0000C800000000106000052404000136 -:100A50003C0208008C4200840A00026F244200011C -:100A60008CA301048F82000C104300080000202199 -:100A70008CA301043C0208008C420084AF83000C6C -:100A8000244200013C010800AC22008403E000087D -:100A90000080102127BDFFE83C036010AFBF0014A9 -:100AA000AFB000108C6550002402FF7F3C04800032 -:100AB00000A2282434A5380C24020037AC6550006D -:100AC000AC82000824020C80AC8200243C060800A2 -:100AD00024C607A83C02080024424B582405001CE9 -:100AE00024A5FFFFAC46000004A1FFFD2442000442 -:100AF0003C020800244201EC3C010800AC224B609F -:100B00003C020800244206183C010800AC224B6459 -:100B10003C02080024420D103C010800AC224BA00E -:100B20003C020800244204643C0308002463095486 -:100B30003C0408002484095C3C05080024A52C948E -:100B40003C010800AC224BC03C0208002442076074 -:100B50003C010800AC264BA83C010800AC254BB476 -:100B60003C010800AC234BBC3C010800AC244BC446 -:100B70003C010800AC224BC83C010800AC234B5C94 -:100B80003C010800AC204B683C010800AC204B6CD9 -:100B90003C010800AC204B703C010800AC204B74B9 -:100BA0003C010800AC204B783C010800AC204B7C99 -:100BB0003C010800AC204B803C010800AC244B8475 -:100BC0003C010800AC204B883C010800AC204B8C59 -:100BD0003C010800AC204B903C010800AC204B9439 -:100BE0003C010800AC204B983C010800AC264B9C13 -:100BF0003C010800AC264BA43C010800AC204BACE7 -:100C00003C010800AC254BB03C010800AC234BB8BC -:100C10000E00055A000000003C02800034420070C3 -:100C20008C420000AF8200103C0308008C6300205F -:100C30008F820004104300043C0580000E000D3735 -:100C4000AF8300043C05800034A900708D280000AB -:100C50008F8400103C0708008CE700BC3C060800AD -:100C60008CC600B8010420230000102100E43821C4 -:100C700000C2302100E4202B00C430213C010800D8 -:100C8000AC2700BC3C010800AC2600B88CB00000CA -:100C9000320200071040FFE4AF8800108D260000EC -:100CA0003C0508008CA500BC3C0408008C8400B8FE -:100CB00000C8302300A628210000102100A6302BF8 -:100CC0000082202100862021320700013C0108001B -:100CD000AC2500BC3C010800AC2400B810E00004C6 -:100CE000320200020E0001EC00000000320200029D -:100CF00010400004320200040E0002170000000041 -:100D0000320200045040FFC53C0280000E00022B5E -:100D1000000000000A0002D53C0280003C02900066 -:100D200034420001008220253C028000AC440020B7 -:100D30003C0380008C6200200440FFFE00000000A5 -:100D400003E00008000000003C0280003443000182 -:100D50000083202503E00008AC44002027BDFFE00D -:100D6000AFB10014AFB0001000808821AFBF0018F1 -:100D70000E00031530B000FF8F83FFAC022020214E -:100D80009062002502028025A07000258C7000185A -:100D90003C0280000E000320020280241600000A9C -:100DA0008FBF00183C0380008C6201F80440FFFEF6 -:100DB00024020002AC7101C0A06201C43C02100018 -:100DC000AC6201F88FBF00188FB100148FB0001013 -:100DD00003E0000827BD002027BDFFB8AFBF0044D7 -:100DE000AFB000403C0780008CE601048F82FFA872 -:100DF000AFA600288C450020AFA5002C8C44003CF9 -:100E0000AFA400308C430040AFA300348C42004CB0 -:100E1000AFA60010AFA50014AFA20020AFA200380B -:100E20003C0208008C420020AFA40018AFA3001CB5 -:100E30008CF00100104000198FBF00440E000D71AE -:100E4000000000008F83002C3C05080094A54BFE99 -:100E50003C024018AC70000000A228258FA20010B0 -:100E600024040001AC6200048FA20014AC620008EC -:100E70008FA20018AC62000C8FA2001CAC620010A4 -:100E80008FA20020AC6200148FA20024AC62001874 -:100E90000E000D98AC65001C8FBF00448FB0004061 -:100EA0000000102103E0000827BD004827BDFFE82F -:100EB000AFBF00103C038000946201843042020006 -:100EC00010400005000020210E000FE3000000008C -:100ED0000A00038F240400018C6201880440000A88 -:100EE0008FBF00108C6201883C03FF000043102478 -:100EF0003C03040014430004240400018F82FFAC6F -:100F0000904200088FBF00100080102103E000080D -:100F100027BD00188F82FFB024050001A040001AF1 -:100F20003C0280000A0003258C44014027BDFFE0FD -:100F3000AFB100148F91FFACAFBF001CAFB200186F -:100F4000AFB000109222000024030020304200FFC6 -:100F50001043000C3C028000922200002403003069 -:100F6000304200FF104300073C0280009222000044 -:100F700024030050304200FF144300818FBF001C47 -:100F80003C02800090420148304200FF2443FFFFB2 -:100F90002C6200051040007A8FBF001C00031080F7 -:100FA0003C03080024634AD8004310218C4200000F -:100FB00000400008000000003C1180008E24014029 -:100FC0000E0003158F92FFAC8E50000C8E22014450 -:100FD0001602000224020001AE42000C0E000320A3 -:100FE0008E2401408E220144145000068FBF001C45 -:100FF0008FB200188FB100148FB000100A000F518B -:1010000027BD00208E42000C0A00042700000000CB -:10101000962200103C0480008C8301443042FFFF84 -:10102000146200090000000024020001A622001042 -:101030008C820140AC8202003C021000AC8202387B -:101040000A00042E8FBF001C962200100A000427FD -:10105000000000009222000024030020304200FF24 -:101060001443000B3C128000962200123C038000C7 -:101070008C6301443042FFFF14620018000000003E -:1010800024020001A62200120A0004008FBF001CE7 -:101090008E4401400E00031500000000962200124D -:1010A0008E4301443050FFFF16030002240200016A -:1010B000A62200120E0003208E4401408E420144FD -:1010C000160200068FBF001C8FB200188FB10014EB -:1010D0008FB000100A00039327BD00209622001253 -:1010E0000A00042700000000962200143C03800040 -:1010F0008C6301443042FFFF1462000900000000CD -:1011000024020001A62200148FBF001C8FB2001819 -:101110008FB100148FB000100A00126827BD0020A4 -:10112000962200140A0004270000000096220016F0 -:101130003C0380008C6301443042FFFF14620008CE -:1011400024020001A62200168FBF001C8FB20018D7 -:101150008FB100148FB000100A000B0B27BD0020C8 -:1011600096220016144000068FBF001C3C020800A7 -:101170008C420070244200013C010800AC22007047 -:101180008FB200188FB100148FB0001003E0000878 -:1011900027BD002027BDFFE03C028000AFB1001456 -:1011A000AFBF001CAFB20018AFB000103451010047 -:1011B000922300098C5001002402001F106200AA33 -:1011C0002862002010400018240200382862000A1B -:1011D0001040000C2402000B286200081040002C74 -:1011E0000000000004600100286200021440002892 -:1011F00024020006106200268FBF001C0A00054A68 -:101200008FB20018106200602862000B144000F7D3 -:101210008FBF001C2402000E106200778FB20018EE -:101220000A00054A00000000106200D3286200395D -:101230001040000A2402008024020036106200E3FD -:1012400028620037104000C524020035106200D823 -:101250008FBF001C0A00054A8FB200181062002DD3 -:101260002862008110400006240200C824020039D0 -:10127000106200C98FBF001C0A00054A8FB2001817 -:10128000106200A28FBF001C0A00054A8FB200182E -:101290003C0208008C420020104000D48FBF001C8C -:1012A0000E000D71000000003C028000344201007D -:1012B0008C4400008F83002C944700083C050800F4 -:1012C00094A54BFEAC6400008C44000400073C0075 -:1012D00000E53825AC6400048C4400189446000CEA -:1012E000AC6400088C45001C000634002404000196 -:1012F000AC65000C9042000A00C23025AC660010BC -:10130000AC600014AC600018AC67001C0A00050C4F -:101310008FBF001C3C0208008C420020104000B32C -:101320008FBF001C0E000D71000000009624000805 -:101330003C03080094634BFE9625000C0004220237 -:101340009626000E8F82002C0004260000832025A4 -:1013500000052C003C03008000A6282500832025E2 -:10136000AC400000AC400004AC400008AC40000CB5 -:10137000AC450010AC400014AC400018AC44001C5C -:101380000A00050B240400019622000C14400017EB -:101390008F91FFAC922200053042001014400013E0 -:1013A000000000000E00031502002021922200051B -:1013B00002002021344200100E000320A22200056A -:1013C0009222000024030020304200FF10430086D8 -:1013D000020020218FBF001C8FB200188FB10014B3 -:1013E0008FB000100A00104C27BD00200000000D37 -:1013F0000A0005498FBF001C3C0208008C420020F7 -:101400001040007A8FBF001C0E000D71000000001C -:101410008E2200048F83002C9624000C3C050800CB -:1014200094A54BFEAC6200003C0280089442002C64 -:10143000000424003042FFFF008220253C02400EC1 -:1014400000A22825AC640004AC600008AC60000C6D -:10145000AC600010AC600014AC600018AC65001CFF -:101460000A00050B240400010E00031502002021D0 -:101470008F92FFB0020020210E000320A640000C36 -:10148000020020210E000325240500013C02080073 -:101490008C420020104000558FBF001C0E000D71C3 -:1014A000000000009622000C8F83002C8F84FFAC7C -:1014B00000021400AC700000AC620004AC600008D4 -:1014C0008C8200383C05080094A54BFEAC62000CF1 -:1014D0008C86003C3C02401F00A22825AC66001010 -:1014E0008E42000424040001AC620014AC600018B9 -:1014F000AC65001C8FBF001C8FB200188FB10014A8 -:101500008FB000100A000D9827BD00208F82FFAC1D -:101510002403002090420000304200FF10430033BB -:101520008FBF001C0E000F37000000001040002F7E -:101530008FBF001C3C0380008C6201F80440FFFE5A -:1015400024020002AC7001C0A06201C43C02100081 -:10155000AC6201F80A0005498FBF001C020020217F -:101560008FBF001C8FB200188FB100148FB0001015 -:101570000A000E8027BD00209625000C02002021C5 -:101580008FBF001C8FB200188FB100148FB00010F5 -:101590000A000EA527BD0020020020218FB20018EE -:1015A0008FB100148FB000100A000ED027BD0020AC -:1015B0009225000D020020218FB200188FB1001477 -:1015C0008FB000100A000F2127BD0020020020214B -:1015D0008FBF001C8FB200188FB100148FB00010A5 -:1015E0000A000EF827BD00208FBF001C8FB2001824 -:1015F0008FB100148FB0001003E0000827BD002059 -:101600003C0380008C6202780440FFFE240200024A -:10161000AC640240A06202443C02100003E00008F7 -:10162000AC620278000411C003E0000824420240CA -:10163000A380001803E00008A38000193C03800089 -:101640008C6202780440FFFE8F82001CAC62024074 -:1016500024020002A06202443C02100003E00008E1 -:10166000AC62027803E000080000000090830030C4 -:1016700024020005008040213063003F0000482123 -:1016800014620005000050219082004C9483004EAB -:10169000304900FF306AFFFFAD00000CAD000010C4 -:1016A000AD000024950200148D05001C8D04001867 -:1016B0003042FFFF0049102300021100000237C32F -:1016C000004038210086202300A2102B0082202316 -:1016D00000A72823AD05001CAD040018A5090014BF -:1016E000A5090020A50A001603E00008A50A0022AB -:1016F00003E000080000000027BDFFD8AFB20018CB -:101700003C128008AFB40020AFB3001CAFB100148E -:10171000AFBF0024AFB00010365101009222000C80 -:101720003C140800929400F7304300FF24020001AB -:1017300010620031008098212402000214620034FB -:10174000365000800E001242000000009204004C4F -:101750000E0005573084007F026210212403FF80B1 -:10176000004318243C048000AC8300949245000898 -:101770009204004C3042007F3C0380061485000731 -:10178000004380212402FFFFA22200112402FFFF58 -:10179000A62200120A0005BA2402FFFF96020020CA -:1017A000A222001196020022A62200128E0200241C -:1017B0003C048008AE2200143485008090A2004CC6 -:1017C00034830100A06200108CA2003CAC620018BF -:1017D0008C820068AC6200E48C820064AC6200E041 -:1017E0008C82006CAC6200E824020001A0A20068B8 -:1017F0000A0005D63C0480080E00125B00000000C1 -:1018000036420080A04000680A0005D63C048008EB -:10181000A2000068A20000690A0006123C028008CB -:10182000348300808C62003834850100AC62006C27 -:1018300024020001A062006990A200C59083000804 -:10184000305100FF3072007F1232001B3C088008CC -:101850000E00055702202021026210212403FF8080 -:10186000004318243C048000AC8300943042007F85 -:101870003C038006004380218E02000C1040000DC6 -:10188000020020210E000569000000002622000150 -:10189000305100FF9203003C023410260002102B4E -:1018A000000210233063007F022288240A0005E032 -:1018B000A203003C3C088008350401008C8200D063 -:1018C00035070080ACE2003C8C8200D0AD02000005 -:1018D00090E5004C908600C590E3004C908400C5D4 -:1018E0002402FF8000A228243063007F308400FFA0 -:1018F00000A628250064182A1060000230A500FF09 -:1019000038A50080A0E5004CA10500093C02800834 -:101910009043000E344400803C058000A043000A40 -:101920008C8300183C027FFF3442FFFF00621824C2 -:10193000AC8300188CA201F80440FFFE00000000F8 -:10194000ACB301C08FBF00248FB400208FB3001C44 -:101950008FB200188FB100148FB000102402000263 -:10196000A0A201C427BD00283C02100003E000082B -:10197000ACA201F890A2000027BDFFE0AFB20018B2 -:1019800024420001A0A200003C0308008C6300F484 -:10199000304200FFAFB10014AFBF001CAFB0001069 -:1019A00000A088211443000200809021A0A0000024 -:1019B0000E000557922400008F90001C2403FF8026 -:1019C00002021021004310243C038000AC6200247A -:1019D0000E00055792240000020280213210007F81 -:1019E0003C02800A02028021AE5000008FBF001C22 -:1019F0008FB200188FB100148FB0001003E0000800 -:101A000027BD002094820006908300058C85000C81 -:101A10008C8600108C8700188C88001C8C84002019 -:101A20003C010800A4224BD23C010800A0234BD16A -:101A30003C010800AC254BD83C010800AC264BDC2F -:101A40003C010800AC274BE43C010800AC284BE803 -:101A50003C010800AC244BEC03E00008000000004F -:101A60003C028008344201008C4400343C03800076 -:101A700034650400AC6400388C420038AF85003017 -:101A8000AC62003C3C020005AC620030000000008B -:101A90000000000003E00008000000003C02000617 -:101AA000308400FF008220253C028000AC440030DE -:101AB0000000000000000000000000003C03800067 -:101AC0008C620000304200101040FFFD34620400C0 -:101AD00003E00008AF82003094C200003C08080018 -:101AE000950800CA30E7FFFF00804821010210215D -:101AF000A4C2000094C200003042FFFF00E2102B9D -:101B000054400001A4C7000094A200003C03080058 -:101B10008C6300CC24420001A4A2000094A2000027 -:101B20003042FFFF144300073C0280080107102BDE -:101B3000A4A000005440000101003821A4C7000007 -:101B40003C028008344601008CC3002894A20000A7 -:101B50003C0480003042FFFE000210C000621021F1 -:101B6000AC82003C8C82003C0062182318600004A8 -:101B7000000000008CC200240A0006AF24420001CD -:101B80008CC20024AC8200383C0200503442001069 -:101B90003C038000AC620030000000000000000048 -:101BA000000000008C620000304200201040FFFD69 -:101BB0000000000094A200003C04800030420001BC -:101BC000000210C0004410218C430400AD2300002B -:101BD0008C420404AD2200043C02002003E0000813 -:101BE000AC82003027BDFFE0AFB20018AFB10014E7 -:101BF000AFB00010AFBF001C94C2000000C0802135 -:101C00003C120800965200C624420001A6020000C1 -:101C10009603000094E2000000E030211443000528 -:101C20008FB100300E000684024038210A0006E61B -:101C3000000000008C8300048C82000424420040D9 -:101C400004610007AC8200048C820004044000049C -:101C5000000000008C82000024420001AC820000E1 -:101C6000960200003042FFFF50520001A600000023 -:101C70009622000024420001A62200003C028008B7 -:101C800034420100962300009442003C14430004B7 -:101C90008FBF001C24020001A62200008FBF001C81 -:101CA0008FB200188FB100148FB0001003E000084D -:101CB00027BD002027BDFFE03C028008AFBF001811 -:101CC000344201008C4800343C0380003469040035 -:101CD000AC6800388C42003830E700FFAF89003034 -:101CE000AC62003C3C020005AC6200300000000029 -:101CF00000000000000000000000000000000000E4 -:101D0000000000008C82000C8C82000C978300166F -:101D1000AD2200008C82001000604021AD22000442 -:101D20008C820018AD2200088C82001CAD22000CB1 -:101D30008CA20014AD2200108C820020AD22001471 -:101D400090820005304200FF00021200AD22001810 -:101D50008CA20018AD22001C8CA2000CAD22002029 -:101D60008CA20010AD2200248CA2001CAD22002801 -:101D70008CA20020AD22002C3402FFFFAD260030E3 -:101D8000AD200034506200013408FFFFAD28003858 -:101D900050E000113C0280083C04800834840100BB -:101DA000948200503042FFFFAD22003C94830044F7 -:101DB00094850044240200013063FFFF000318C231 -:101DC000006418219064005430A5000700A210049C -:101DD0000A0007510044102534420100AD20003CA8 -:101DE00094430044944400443063FFFF000318C24E -:101DF000006218213084000790650054240200011D -:101E0000008210040002102700451024A062005434 -:101E10000000000000000000000000003C0200067E -:101E2000344200403C038000AC62003000000000FF -:101E300000000000000000008C6200003042001032 -:101E40001040FFFD3C06800834C20150346304009A -:101E500034C7014A34C4013434C5014034C6014496 -:101E6000AFA200100E0006C7AF8300308FBF00186E -:101E700003E0000827BD00208F8300143C05080004 -:101E80008CA500E88F82001C30633FFF000319809F -:101E900000451021004310212403FF800043182433 -:101EA0003C058000ACA300283042007F3C03800C3E -:101EB0000043302190C2000D000038213442001050 -:101EC000A0C2000D8F8900143C028008344201003A -:101ED00094430044000913823048000324020001A7 -:101EE000A4C3000E1102000B2902000210400005DD -:101EF000240200021100000C240300010A000798CC -:101F00000000182111020006000000000A000798D6 -:101F1000000018218CC2002C0A00079824430001FD -:101F20008CC20014244300018CC200180043102B03 -:101F3000144000033C0380080A0007A224070001A4 -:101F4000346301009462004C24420001A462004CFE -:101F500000091382304300032C6200021040000984 -:101F600000802821146000040000000094C20034A6 -:101F70000A0007B23046FFFF8CC600380A0007B2DD -:101F800000802821000030213C04080024844BCC30 -:101F90000A0006FB0000000027BDFF90AFB60068F6 -:101FA000AFB50064AFB40060AFB3005CAFB200582F -:101FB000AFB10054AFBF006CAFB000508C900000C8 -:101FC0000080B0213C0208008C4200E896040032F8 -:101FD0008F83001C2414FF8030843FFF006218218F -:101FE0000004218000641821007410243C13800038 -:101FF00000A0902190A50000AE620028920400325B -:102000003C02800C3063007F00628821308400C075 -:10201000240200401482002D0000A8218E350038D3 -:102020008E2200181440000224020001AE22001883 -:102030009202003C304200201440000F00000000DB -:102040000E00055700A020218F83001C006218217C -:10205000306400783C02008000822025007418243F -:10206000AE630800AE6408108E2200188E030008CC -:1020700000431021AE2200188E22002C8E2300185F -:10208000244200010062182B1060003D0000000097 -:102090009242000024420001A24200003C030800DA -:1020A0008C6300F4304200FF50430001A240000066 -:1020B0000E000557924400008F90001C0202102170 -:1020C000005410240A0008B8AE62002492030032C3 -:1020D0002402FFC000431024304200FF14400005DA -:1020E00024020001AE220018962200340A00082EB5 -:1020F0003055FFFF8E22001424420001AE2200184A -:102100009202003000021600000216030441001C77 -:10211000000000009602003227A400100080282151 -:10212000A7A2001696020032000030212407000109 -:102130003042FFFFAF8200140E0006FBAFA0001C70 -:10214000960200328F83001C3C0408008C8400E857 -:1021500030423FFF00021180006418210062182104 -:1021600000741024AE62002C3063007F3C02800EAD -:10217000006218219062000D3042007FA062000DC5 -:102180009222000D30420010504000789242000030 -:102190003C028008344401009482004C8EC300004D -:1021A0003C130800967300C62442FFFFA482004C33 -:1021B000946200329623000E3054FFFF3070FFFF10 -:1021C0003C0308008C6300D000701807A7A30038F8 -:1021D0009482003E3063FFFF3042FFFF146200072D -:1021E000000000008C8200303C038000244200305C -:1021F000AC62003C0A0008568C82002C948200409D -:102200003042FFFF5462000927A400408C8200384E -:102210003C03800024420030AC62003C8C820034DD -:10222000AC6200380A0008653C03800027A500382E -:1022300027A60048026038210E000684A7A00048A7 -:102240008FA300403C02800024630030AC43003880 -:102250008FA30044AC43003C3C0380003C020005DB -:10226000AC6200303C028008344401009482004299 -:10227000346304003042FFFF0202102B14400007B9 -:10228000AF8300309482004E9483004202021021FA -:10229000004310230A00087B3043FFFF9483004E65 -:1022A0009482004202631821005010230062182318 -:1022B0003063FFFF3C028008344401009482003CFC -:1022C0003042FFFF14430003000000000A00088BA7 -:1022D000240300019482003C3042FFFF0062102B77 -:1022E000144000058F8200309482003C006210236D -:1022F0003043FFFF8F820030AC550000AC4000043B -:10230000AC540008AC43000C3C0200063442001000 -:102310003C038000AC6200300000000000000000C0 -:10232000000000008C620000304200101040FFFDF1 -:102330003C04800834840100001018C20064182195 -:102340009065005432020007240600010046100484 -:1023500000451025A0620054948300429622000E8E -:1023600050430001A386001892420000244200015D -:10237000A24200003C0308008C6300F4304200FFDE -:1023800050430001A24000000E0005579244000097 -:102390008F90001C2403FF800202102100431024B0 -:1023A0003C038000AC6200240E00055792440000FC -:1023B000020280213210007F3C02800A020280214A -:1023C000AED000008FBF006C8FB600688FB5006480 -:1023D0008FB400608FB3005C8FB200588FB100548F -:1023E0008FB0005003E0000827BD007027BDFFD864 -:1023F000AFB3001CAFB20018AFB10014AFB0001003 -:10240000AFBF00200080982100E0802130B1FFFFA5 -:102410000E000D7130D200FF00000000000000002F -:10242000000000008F82002CAC510000AC52000470 -:10243000AC530008AC40000CAC400010AC400014A1 -:10244000AC4000183C03080094634BFE0203802557 -:10245000AC50001C00000000000000000000000064 -:10246000240400018FBF00208FB3001C8FB200181E -:102470008FB100148FB000100A000D9827BD0028FE -:1024800030A5FFFF30C600FF24030C803C02800013 -:10249000AC43002400000000000000000000000029 -:1024A00000000000000000000A0008C90000000051 -:1024B0003C028008344301009462000E3C0808008E -:1024C000950800C63046FFFF14C000043402FFFF29 -:1024D000946500DA0A00091F8F84001C10C20027CF -:1024E000000000009462004E9464003C3045FFFF01 -:1024F00000A6102300A6182B3087FFFF10600004F1 -:102500003044FFFF00C5102300E210233044FFFFDA -:102510000088102B1040000E00E810233C028008B9 -:10252000344401002403000134420080A443001617 -:102530002402FFFFA482000E948500DA8F84001C21 -:102540000000302130A5FFFF0A0008EE3C076020A4 -:102550000044102A104000093C02800834430080E7 -:102560009462001630420001104000043C028000DA -:102570009442007E24420014A462001603E0000886 -:102580000000000027BDFFE03C028008AFBF001C38 -:10259000AFB0001834420100944300429442004C12 -:1025A000104000193068FFFF9383001824020001D7 -:1025B000146200298FBF001C3C06800834D0010043 -:1025C000000810C20050102190420054310300074F -:1025D00034C70148304200FF00621007304200015A -:1025E00034C9014E34C4012C34C5013E10400016DC -:1025F00034C601420E0006C7AFA900109602004281 -:102600000A00093C3048FFFF3C02800834440100C6 -:1026100094830044948200421043000F8FBF001C3B -:1026200094820044A482004294820050A482004E0E -:102630008C820038AC82003094820040A482003E3C -:102640009482004AA48200488FBF001C8FB00018FB -:102650000A0008FA27BD00208FB0001803E0000828 -:1026600027BD002027BDFFA0AFB1004C3C1180006A -:10267000AFBF0058AFB30054AFB20050AFB0004886 -:102680003626018890C200033044007FA3A40010C6 -:102690008E32018090C200003043007F240200038C -:1026A0001062003BAF92001C28620004104000063C -:1026B0002402000424020002106200098FBF0058A7 -:1026C0000A000B038FB300541062004B2402000574 -:1026D0001062014C8FBF00580A000B038FB30054E7 -:1026E000000411C0024210212404FF802442024051 -:1026F0000044102426430040AE2200243063007FB3 -:102700003C02800A006218219062003CAFA3003CAA -:1027100000441025A062003C8FA3003C9062003C66 -:10272000304200401040016A8FBF00583C108008C2 -:10273000A3800018361001008E0200D08C63003494 -:1027400027A4003C27A50010004310210E0007B469 -:10275000AE0200D093A200103C038000A20200C58C -:102760008C6202780440FFFE8F82001CAC62024043 -:1027700024020002A06202443C021000AC62027813 -:102780000E00092F000000000A000B028FBF005846 -:102790003C05800890C3000190A2000B1443014C3B -:1027A0008FBF005834A400808C8200189082004CA7 -:1027B00090A200088C8300183C027FFF3442FFFF88 -:1027C000006218243C0208008C4200B4AC8300185C -:1027D0003C038000244200013C010800AC2200B40C -:1027E0008C6201F80440FFFE8F82001CAC6201C0C5 -:1027F0000A000ACA240200023C10800890C30001AB -:102800009202000B144301328FBF005836050110AD -:1028100027A400180E000E202406000327A4002879 -:10282000360501E00E000E20240600038FA20028CA -:1028300036030100AE0200648FA2002CAE020068D5 -:102840008FA20030AE02006C93A40018906300C504 -:102850002402FF800082102400431025305000FF26 -:102860003084007F3202007F0082102A5440000131 -:102870003A1000800E0005570000000002421021AF -:102880002403FF8000431024AE22009493A4001878 -:102890003C130800927300F70E0005573084007F48 -:1028A000024210213042007F3C0380060043402159 -:1028B0008FA3001C2402FFFF10620034AFA8004069 -:1028C00093A2001995030014304400FF3063FFFF0A -:1028D0000064182B10600010000000009504001424 -:1028E0008D07001C8D0600183084FFFF0044202354 -:1028F0000004210000E438210000102100E4202B16 -:1029000000C2302100C43021AD07001CAD06001804 -:102910000A000A2393A20019950400148D07001CD5 -:102920008D0600183084FFFF008220230004210060 -:10293000000010210080182100C2302300E4202B69 -:1029400000C4302300E33823AD07001CAD06001897 -:1029500093A200198FA30040A462001497A2001A4A -:10296000A46200168FA2001CAC6200108FA2001C93 -:10297000AC62000C93A20019A462002097A2001A76 -:10298000A46200228FA2001CAC6200243C048008D8 -:10299000348300808C6200388FA2002002008821DE -:1029A000AC62003C8FA20020AC82000093A2001811 -:1029B000A062004C93A20018A0820009A0600068E9 -:1029C00093A200181051005293A400183230007FD7 -:1029D0000E00055702002021024210212407FF802B -:1029E0003046007F3C03800000471024AC62009416 -:1029F0003C02800600C2302190C2003CAFA60040DD -:102A00000000202100471025A0C2003C8FA80040F4 -:102A100095020002950300148D07001C3042FFFF51 -:102A20003063FFFF8D0600180043102300021100E1 -:102A300000E2382100E2102B00C4302100C2302116 -:102A4000AD07001CAD06001895020002A502001497 -:102A5000A50000168D020008AD0200108D020008CE -:102A6000AD02000C95020002A5020020A500002284 -:102A70008D020008AD0200249102003C304200406B -:102A80001040001A26220001A3B000383C10800834 -:102A9000A3800018361001008E0200D08D03003490 -:102AA00027A4004027A50038004310210E0007B4DA -:102AB000AE0200D093A200383C038000A20200C501 -:102AC0008C6202780440FFFE8F82001CAC620240E0 -:102AD00024020002A06202443C021000AC620278B0 -:102AE0000E00092F00000000262200013043007F65 -:102AF00014730004004020212403FF8002231024CB -:102B00000043202693A200180A000A3F309100FFDC -:102B10008FA3001C2402FFFF1062000A309000FF08 -:102B200024820001248300013042007F14530005F9 -:102B3000307000FF2403FF80008310240043102620 -:102B4000305000FF3C0280089042000802008821BB -:102B5000305000FF123000193222007F000211C0F5 -:102B600002421021244202402403FF800043182423 -:102B70003C048000AC8300943042007F3C0380061C -:102B8000004310218C43000C004020211060000BFA -:102B9000AFA200400E0005690000000026230001DE -:102BA0002405FF803062007F145300020225202498 -:102BB000008518260A000AA3307100FF3C04800833 -:102BC000348400808C8300183C027FFF3442FFFF76 -:102BD00000621824AC8300183C0380008C6201F86A -:102BE0000440FFFE00000000AC7201C0240200029D -:102BF000A06201C43C021000AC6201F80A000B02A2 -:102C00008FBF00583C04800890C300019082000BE5 -:102C10001443002F8FBF00583490008092020008A8 -:102C200030420040104000200000000092020008E6 -:102C30000002160000021603044100050240202194 -:102C40000E000EA5240500930A000B028FBF00584A -:102C50009202000924030018304200FF1443000DC3 -:102C600002402021240500390E000E3D00003021D5 -:102C70000E0003158F84001C8F82FFAC240300120A -:102C8000A04300090E0003208F84001C0A000B02E1 -:102C90008FBF0058240500360E000E3D0000302185 -:102CA0000A000B028FBF00580E00031502402021BE -:102CB000920200058F84001C344200200E00032085 -:102CC000A20200050E00104C8F84001C8FBF00581C -:102CD0008FB300548FB200508FB1004C8FB00048BA -:102CE00024030C803C02800027BD006003E0000844 -:102CF000AC43002427BDFFE83C028008AFB00010C1 -:102D0000AFBF0014344501003C1080008E0201402A -:102D100094A3000E0000302100402021AF82001C4F -:102D20003063FFFF3402FFFF106200063C076020A3 -:102D30002402FFFFA4A2000E94A500DA0E0008EE04 -:102D400030A5FFFF24020C80AE0200248FBF0014C8 -:102D50008FB0001003E0000827BD001827BDFFC09A -:102D60003C0980003C058008AFB70034AFB20020BA -:102D7000AFBF0038AFB60030AFB5002CAFB40028FD -:102D8000AFB30024AFB1001CAFB000183532010062 -:102D900034A801008D2701008E4200148D0300D459 -:102DA0000000B821A38000180043102318400055EC -:102DB000AF87001C8E4200142403FF8024E40040EF -:102DC000AD0200D490A60008910500C53084007FB4 -:102DD00030D3007F30A200FF000211C000E21021BA -:102DE00024420240A3A50010004310248D1400D0FB -:102DF0008D1500D4AD22002493A300103C02800A5C -:102E000000822021AFA40014107300330000B02111 -:102E10008FA3001427A4001427A500108C6200348F -:102E20000282802102B010230440002B2411FF8075 -:102E30009062003C02221024304200FF1440001B2C -:102E40000200A0219062003C34420040A062003C9D -:102E500093A2001024420001304300FFA3A20010FF -:102E60003C0208008C4200F450620001A3A0001054 -:102E70000E00055793A400108F90001C3C038000A7 -:102E80000202102100511024AC6200240E000557EC -:102E900093A40010020280213210007F3C02800ABD -:102EA000020280210A000B81AFB000140E0007B4AB -:102EB000000000003C02800834420100AC5000D009 -:102EC00093A3001024160001A04300C593A2001094 -:102ED0001453FFD08FA300142402000116C200096E -:102EE0003C0380008C6202780440FFFE8F82001C4D -:102EF000AC62024024020002A06202443C021000C4 -:102F0000AC6202789242000B24030002304200FFC0 -:102F1000144300720000000096420008304300FF96 -:102F20002402008214620040240200843C028000DB -:102F3000344901008D22000C952300060002160280 -:102F40003063FFFF3044003F240200271082000F4F -:102F5000AF830014288200281040000824020031AA -:102F6000240200211082000924020025108200079B -:102F7000938200190A000BC00000000010820007B5 -:102F8000938200190A000BC0000000000E00076CBD -:102F9000012020210A000C40000000003C038000BA -:102FA0008C6202780440FFFE8F82001CAC620240FB -:102FB00024020002A06202443C021000AC620278CB -:102FC0000A000C4000000000952300069124000533 -:102FD0008D25000C8D2600108D2700188D28001CD3 -:102FE0008D290020244200013C010800A4234BD27B -:102FF0003C010800A0244BD13C010800AC254BD873 -:103000003C010800AC264BDC3C010800AC274BE43B -:103010003C010800AC284BE83C010800AC294BEC13 -:103020000A000C40A38200191462000A24020081E5 -:103030003C02800834420100944500DA92460005C3 -:103040008F84001C30A5FFFF30C600FF0A000C0172 -:103050003C0760211462005C000000009242000AFC -:10306000304300FF30620020104000073062004013 -:103070003C02800834420100944500DA8F84001C31 -:103080000A000BFF24060040104000070003160052 -:103090003C02800834420100944500DA8F84001C11 -:1030A0000A000BFF240600410002160304410046FB -:1030B0003C02800834420100944500DA8F84001CF1 -:1030C0002406004230A5FFFF3C0760190E0008EE01 -:1030D000000000000A000C40000000009242000BBB -:1030E00024040016304200FF104400063C06800015 -:1030F0009242000B24030017304200FF14430032B9 -:103100000000000034C5010090A2000B304200FF17 -:103110001444000B000080218CA200208CA400200D -:103120002403FF8000431024000211403084007FFC -:10313000004410253C03200000431025ACC2083099 -:1031400094A20008000214000002140304420001CB -:103150002410000194A20008304200805040001A60 -:103160000200B82194A2000830422000504000160E -:103170000200B8218CA300183C021C2D344219ED2A -:10318000106200110200B8213C0208008C4200D4F9 -:10319000104000053C028008240300043442010072 -:1031A000A04300EC3C02800834420100944500DA60 -:1031B0008F84001C2406000630A5FFFF0E0008EED9 -:1031C0003C0760210200B8210E00092F000000001A -:1031D0009242000A30420008104000043C02800085 -:1031E0000E00121F000000003C02800024030C802F -:1031F000AC4300248FBF003802E010218FB60030AE -:103200008FB700348FB5002C8FB400288FB3002403 -:103210008FB200208FB1001C8FB0001803E00008AF -:1032200027BD00402402FF80008220243C02900041 -:1032300034420007008220253C028000AC4400207C -:103240003C0380008C6200200440FFFE0000000070 -:1032500003E00008000000003C0380002402FF801F -:10326000008220243462000700822025AC64002004 -:103270008C6200200440FFFE0000000003E0000814 -:10328000000000003C0280082403000534420100D5 -:10329000A04300EC3C0280008C4201003C03800013 -:1032A000AF82001C8C6202780440FFFE8F82001CFB -:1032B000AC62024024020002A06202443C02100000 -:1032C000AC62027803E000080000000027BDFFE8C0 -:1032D0003C068000AFBF001034C5010094A2000876 -:1032E000304400FF38830082388200842C63000160 -:1032F0002C42000100621825106000302402008377 -:1033000093820019504000398FBF00103C02080022 -:1033100090424BD88CC401003C07080094E74BD284 -:103320003046003F38C3003238C2003F2C630001F2 -:103330002C42000100621825AF84001CAF870014E6 -:10334000A38000191460000600A0202124020020A0 -:1033500014C200113402FFFF14E2000F000000004D -:103360002402002014C20005000000008CA30014F9 -:103370002402FFFF1062000A000000003C04080065 -:1033800024844BCC000030210E0006FB24070001F2 -:103390000A000CB6000000000E00076C00000000E0 -:1033A0000E00092F0000000024030C803C02800066 -:1033B000AC4300240A000CEF8FBF001014820006FB -:1033C0002482FF808CC301043C026020AC430014C3 -:1033D0000A000CEF8FBF0010304200FF2C420002A9 -:1033E00010400004240200228FBF00100A000B25A9 -:1033F00027BD0018148200038FBF00100A000C6F55 -:1034000027BD00183C0208008C4200201040001D1F -:103410002402001890A3000914620003240200167D -:103420000A000CDB240300081462000724020017C2 -:10343000240300123C02800834420080A0430009AB -:103440000A000CE894A700085462000794A700083B -:103450008F82FFAC2404FFFE904300050064182413 -:10346000A043000594A7000890A6001B8CA40000B0 -:1034700094A500068FBF001000073C000A0008C991 -:1034800027BD001803E0000827BD00183C05080010 -:1034900094A54C0A3C0308008C634C143C04800047 -:1034A00030A2FFFF000230C02402FFF000C210244F -:1034B00000621821AC83003C3C0208008C424C1096 -:1034C0003C038000AC8200383C02005034420010C3 -:1034D000AC620030000000000000000000000000AE -:1034E0008C620000304200201040FFFD30C2000816 -:1034F000104000093C0280008C6204088C63040CBC -:103500003C010800AC224C003C010800AC234C04F8 -:103510000A000D1B3C0300208C4304008C42040471 -:103520003C010800AC234C003C010800AC224C04D8 -:103530003C0300203C028000AC4300303C0780008C -:103540008CE20030004310241440FFFD0000000016 -:103550003C03080094634C083C02080094424C0C65 -:103560003C06080094C64C0E24A5000100621821F8 -:1035700030A4FFFF3C020040ACE200303C010800F8 -:10358000A4234C083C010800A4254C0A148600031F -:10359000000000003C010800A4204C0A03E00008E1 -:1035A0000000000027BDFFE83C04080024844BF025 -:1035B0003C05800AAFBF00100E000E202406000A52 -:1035C0003C02080094424BF23C03080094634C0E0A -:1035D0003042000F244200030043180424027FFFFE -:1035E0000043102B10400002AF8300280000000DA4 -:1035F0000E000CF1000000003C02080094424BF465 -:103600003C03080094634BFA8FBF00103042000F58 -:10361000000215000062182527BD00183C0280003A -:1036200003E00008AC4300A03C02800A944300067B -:103630003C02080094424BFA3C010800A4234BF6DC -:10364000004310238F8300283042FFFF0043102BDC -:1036500003E000083842000127BDFFE8AFBF0010BB -:103660003C02800A944200063C010800A4224BF66A -:103670000E000D58000000005440FFFA3C02800A82 -:103680008FBF001003E0000827BD001827BDFFE82A -:10369000AFBF00100E000D580000000010400003E6 -:1036A000000000000E000D64000000003C02080055 -:1036B0008C424C003C0380008FBF0010AC6200388D -:1036C0003C0208008C424C043464040027BD0018FE -:1036D000AC62003C3C020005AC620030AF84002CC0 -:1036E00003E00008AF8000248F8200243C03000622 -:1036F00000021140004310253C038000AC62003002 -:103700000000000000000000000000008C620000CB -:10371000304200101040FFFD34620400AF82002CE4 -:1037200003E00008AF8000243C0608008CC64C046F -:103730008F8500248F83002C3C02080094424BFAB2 -:1037400027BDFFE024A500012463002024420001DE -:1037500024C70020AFB10014AFB00010AFBF0018F5 -:10376000AF850024AF83002C3C010800A4224BFA53 -:10377000309000FF3C010800AC274C0404C1000855 -:103780000000882104E00006000000003C02080060 -:103790008C424C00244200013C010800AC224C0049 -:1037A0003C04080094844C083C02080094424BFA04 -:1037B0002E030001004410262C440001008318242D -:1037C000106000040010102B24020001AF820020C2 -:1037D0000010102B00821025144000068F8200205C -:1037E000144000048F830024240200101462000F90 -:1037F000000000000E000D88241100013C030800A9 -:1038000094634BFA3C02080094424C081462000393 -:10381000000000000E000CF1000000001600000384 -:10382000000000000E000D71000000003C030800C5 -:1038300094634BFE3C02080094424BFC246300015D -:103840003064FFFF3C010800A4234BFE14820003F8 -:10385000000000003C010800A4204BFE1200000BF9 -:10386000000000003C02080094424BF43C030800B6 -:1038700094634BFA00021500006218253C02800098 -:10388000AC4300A00A000DF7AF8000200E000D58D9 -:103890000000000010400004022010210E000D6402 -:1038A00000000000022010218FBF00188FB100140B -:1038B0008FB0001003E0000827BD002003E00008DF -:1038C000000000008F8200343C030006000211401B -:1038D000004310253C038000AC6200300000000073 -:1038E00000000000000000008C6200003042001068 -:1038F0001040FFFD34620400AF82003003E0000896 -:10390000AF80003403E000080000102103E000084D -:10391000000000003084FFFF30A5FFFF00001821E9 -:1039200010800007000000003082000110400002FB -:1039300000042042006518210A000E1600052840E8 -:1039400003E000080060102110C0000624C6FFFF3D -:103950008CA2000024A50004AC8200000A000E2006 -:103960002484000403E000080000000010A0000808 -:1039700024A3FFFFAC860000000000000000000050 -:103980002402FFFF2463FFFF1462FFFA2484000473 -:1039900003E00008000000003C0280083442008080 -:1039A00024030001AC43000CA4430010A443001204 -:1039B000A443001403E00008A443001627BDFFD869 -:1039C000248200802407FF803043007FAFB00010C6 -:1039D00000808021004720243C0208008C42002007 -:1039E0003C08800EAFB3001CAFB20018AFB100149A -:1039F000AFBF00203C0980000068182130B100FFF3 -:103A000030D200FF1040002900009821260201005A -:103A1000AD24002C004728243042007F004820219C -:103A20009062000024030050304200FF1443000461 -:103A300000000000AD25002C948200DA3053FFFF17 -:103A40000E000D71000000003C03080094634BFE63 -:103A50008F82002C00112C0000A3282500122400C6 -:103A60003C0340003484000100A32825AC50000032 -:103A70008FBF0020AC4000048FB20018AC53000888 -:103A80008FB10014AC40000C8FB3001CAC4400108C -:103A90008FB00010AC40001424040001AC400018AA -:103AA00027BD00280A000D98AC45001C8FBF0020E0 -:103AB0008FB3001C8FB200188FB100148FB00010AC -:103AC00003E0000827BD00283C06800034C2010046 -:103AD0009043000F240200101062000E28650011B0 -:103AE00010A0000724020012240200082405003A56 -:103AF000106200060000302103E000080000000012 -:103B0000240500351462FFFC000030210A000E3D40 -:103B1000000000008CC200748F83FFAC24420FA011 -:103B200003E00008AC62000C27BDFFE8AFBF001047 -:103B30000E000325240500013C0480088FBF0010FF -:103B40002402000134830080A462001227BD001803 -:103B50002402000103E00008A080001A27BDFFE056 -:103B6000AFB20018AFB10014AFB00010AFBF001C6F -:103B700030B2FFFF0E000315008088213C02800850 -:103B8000345000809202000924030004304200FFF8 -:103B90001443000C3C028008124000082402000A72 -:103BA0000E000E3400000000920200052403FFFE08 -:103BB00000431024A202000524020012A202000900 -:103BC0003C02800834420080022020210E000320A5 -:103BD000A040002716400003022020210E000E986E -:103BE0000000000002202021324600FF8FBF001C91 -:103BF0008FB200188FB100148FB000102405003868 -:103C00000A000E3D27BD002027BDFFE0AFBF001C0E -:103C1000AFB20018AFB10014AFB000100E00031522 -:103C2000008080210E000E34000000003C0280085D -:103C30003445008090A2000924120018305100FF82 -:103C4000123200030200202124020012A0A2000967 -:103C500090A200052403FFFE004310240E00032061 -:103C6000A0A2000502002021240500201632000732 -:103C7000000030218FBF001C8FB200188FB10014DC -:103C80008FB000100A00032527BD00208FBF001C45 -:103C90008FB200188FB100148FB0001024050039C6 -:103CA0000A000E3D27BD002027BDFFE83C02800032 -:103CB000AFB00010AFBF0014344201009442000CBA -:103CC000240500360080802114400012304600FF99 -:103CD0000E000315000000003C0280083442008002 -:103CE00024030012A0430009904300053463001030 -:103CF0000E000E34A04300050E0003200200202118 -:103D0000020020210E000325240500200A000F15C3 -:103D1000000000000E000E3D000000000E00031524 -:103D2000020020213C0280089043001B2405FF9FD5 -:103D300002002021006518248FBF00148FB00010EE -:103D4000A043001B0A00032027BD001827BDFFE089 -:103D5000AFBF0018AFB10014AFB0001030B100FF1A -:103D60000E000315008080213C028008240300120D -:103D7000344200800E000E34A04300090E000320E0 -:103D80000200202102002021022030218FBF0018D4 -:103D90008FB100148FB00010240500350A000E3DCD -:103DA00027BD00203C0480089083000E9082000A0A -:103DB0001443000B000028218F82FFAC2403005025 -:103DC0002405000190420000304200FF144300042B -:103DD000000000009082000E24420001A082000E2C -:103DE00003E0000800A010213C0380008C6201F871 -:103DF0000440FFFE24020002AC6401C0A06201C4C2 -:103E00003C02100003E00008AC6201F827BDFFE0AF -:103E1000AFB200183C128008AFB10014AFBF001C55 -:103E2000AFB0001036510080922200092403000A2E -:103E3000304200FF1443003A000000008E430004AB -:103E40008E2200385062007E8FBF001C922200003C -:103E500024030050304200FF144300253C02800040 -:103E60008C4201408E43000436420100022028218A -:103E7000AC43001C9622005C8E2300383042FFFFCA -:103E80000002104000621821AE23001C8E43000483 -:103E90008E2400389622005C006418233042FFFF15 -:103EA00000031843000210400043102A104000068F -:103EB000000000008E4200048E23003800431023CF -:103EC0000A000F83000220439622005C3042FFFF6D -:103ED000000220403C02800834430100344200804C -:103EE000ACA4002CA040002424020001A062000C1D -:103EF0000E000F3700000000104000518FBF001C63 -:103F00003C0280008C4401408FBF001C8FB200181F -:103F10008FB100148FB000100A000F4827BD002099 -:103F20009222000924030010304200FF14430004D1 -:103F30003C0280008C4401400A000FC5000028218B -:103F40009222000924030016304200FF14430006A9 -:103F500024020014A22200093C0280008C4401408B -:103F60000A000FD88FBF001C8E2200388E23003C21 -:103F700000431023044100328FBF001C922200270F -:103F800024420001A2220027922200273C030800BD -:103F90008C630048304200FF144300163C10800040 -:103FA0009222000924030004304200FF1443000958 -:103FB0003C0280008C4401408FBF001C8FB200186F -:103FC0008FB100148FB00010240500930A000EA5D5 -:103FD00027BD00208C440140240500938FBF001CA6 -:103FE0008FB200188FB100148FB000100A000F219B -:103FF00027BD00208E0401400E00031500000000C4 -:104000008E4200042442FFFFAE4200048E22003C98 -:104010002442FFFFAE22003C0E0003208E0401402C -:104020008E0401408FBF001C8FB200188FB10014A6 -:104030008FB00010240500040A00032527BD0020CE -:104040008FB200188FB100148FB0001003E0000889 -:1040500027BD00203C0680008CC201883C038008FC -:10406000346500809063000E00021402304400FFAB -:10407000306300FF1464000E3C02800890A200260A -:10408000304200FF104400098F82FFACA0A400263C -:104090002403005090420000304200FF1443000609 -:1040A000000000000A00058C8CC401803C028008DE -:1040B00034420080A044002603E000080000000015 -:1040C00027BDFFE030E700FFAFB20018AFBF001C14 -:1040D000AFB10014AFB000100080902114E00006D2 -:1040E00030C600FF000000000000000D00000000CE -:1040F0000A001037240001173C0380089062000E6C -:10410000304200FF144600233462008090420026B3 -:10411000304200FF1446001F000000009062000FB4 -:10412000304200FF1446001B000000009062000AAD -:10413000304200FF144600038F90FFAC0000000DDA -:104140008F90FFAC8F82FFB03C118000AE05003C29 -:10415000AC450000A066000A0E0003158E24010085 -:10416000A20000240E0003208E2401003C038000E6 -:104170008C6201F80440FFFE24020002AC7201C010 -:10418000A06201C43C021000AC6201F80A001038C1 -:104190008FBF001C000000000000000D00000000A8 -:1041A000240001408FBF001C8FB200188FB1001493 -:1041B0008FB0001003E0000827BD00208F83FFAC04 -:1041C0003C0280008C440100344201008C65003CBC -:1041D0009046001B0A000FFE240700013C028008E5 -:1041E0009043000E9042000A00431026304200FF28 -:1041F00003E000080002102B27BDFFE03C0280080E -:10420000AFB10014AFB00010AFBF00183450008041 -:104210009202000524030030304200301443008431 -:10422000008088213C0208008C4200201040008160 -:104230008FBF00180E000D71000000008F86002C4B -:10424000ACD100009202000892030009304200FF46 -:1042500000021200306300FF00431025ACC20004CE -:104260009202004D000216000002160304410005F0 -:10427000000000003C0308008C6300480A00107630 -:104280003C108008920200083042004014400003B5 -:104290000000182192020027304300FF3C108008E4 -:1042A000361100809222004D00031E003C050800DC -:1042B00094A54BFE304200FF000214000062182556 -:1042C000ACC300088E2300303C02C00B00A228259E -:1042D000ACC3000C8E22003400002021ACC20010C0 -:1042E0008E220038ACC200148E22003CACC20018F2 -:1042F0000E000D98ACC5001C8E0200048F84002CAB -:104300003C058000AC8200008E220020AC820004BC -:104310008E22001CAC8200088E2200588CA30074F0 -:1043200000431021AC82000C8E22002CAC820010C5 -:104330008E2200408E23004400021400004310250A -:10434000AC8200149222004D24030080304200FF12 -:1043500014430003000000000A0010B8AC800018ED -:104360008E23000C240200011062000E2402FFFFC5 -:1043700092220008304200401440000A2402FFFF4D -:104380008E23000C8CA20074006218233C020800EB -:10439000006210241440000200002821006028213F -:1043A00000051043AC8200183C02080094424BFE0A -:1043B0003C03C00C00002021004310258F83002CFB -:1043C0000E000D98AC62001C3C0480083482010091 -:1043D0008C4200008F83002C348400803C0608004F -:1043E00094C64BFEAC620000AC6000048C850048B3 -:1043F0003C02400D00C23025AC650008AC60000CEA -:10440000AC600010908200058FBF00188FB10014BF -:1044100000021600AC6200148FB00010AC600018EF -:1044200024040001AC66001C0A000D9827BD002082 -:104430008FBF00188FB100148FB0001003E0000888 -:1044400027BD00203C0280009443007C3C02800891 -:1044500034460100308400FF3065FFFF2402000570 -:1044600024A34650A0C4000C5482000C3065FFFF0A -:1044700090C2000D2C4200071040000724A30A0040 -:1044800090C3000D240200140062100400A2102149 -:104490000A0010F53045FFFF3065FFFF3C02800841 -:1044A0003442008003E00008A44500143C03800867 -:1044B00034680080AD050038346701008CE2001CD0 -:1044C000308400FF00A210231840000330C600FF14 -:1044D00024A2FFFCACE2001C308200015040000826 -:1044E0003C0380088D02003C00A21023044100120E -:1044F000240400058C62000410A2000F3C03800815 -:104500008C62000414A20018000000003C020800A5 -:104510008C4200D830420020104000093C02800844 -:1045200034620080906300089042004C1443000401 -:104530003C028008240400040A0010DF0000000090 -:104540003443008034420100A040000C24020001EA -:10455000A462001410C000043C0280008C440100DE -:104560000A000F480000000003E0000800000000FF -:1045700027BDFFE800A61823AFBF00101860004E4B -:10458000308800FF3C02800834470080A0E000240F -:1045900034440100A0E000278C82001C00A21023FC -:1045A0000440002B000000008CE2003C94E3005C1F -:1045B0008CE4002C004530233063FFFF00C318213A -:1045C0000083202B1080000400E018218CE2002CD6 -:1045D0000A00114800A2102194E2005C3042FFFF63 -:1045E00000C2102100A21021AC62001C3C02800815 -:1045F0003447008094E2005C8CE3001C3042FFFFF3 -:104600000002104000A210210043102B10400003B4 -:10461000000000000A0011598CE2001C94E2005CCA -:104620003042FFFF0002104000A21021ACE2001C4B -:104630003C028008344201008FBF0010010020219D -:1046400024060001A040000C0A0010F927BD001844 -:104650008CE2001C004610230043102B5440000144 -:10466000ACE5001C94E2005C3042FFFF0062102BBE -:10467000144000072402000294E2005C8CE3001C5A -:104680003042FFFF00621821ACE3001C240200024C -:10469000ACE500380E000F37A082000C1040001867 -:1046A0008FBF00103C0280008C4401008FBF0010BF -:1046B0000A000F4827BD00183102001010400010FA -:1046C0008FBF00103C028008344500808CA3001C82 -:1046D00094A2005C006618233042FFFF006218219C -:1046E0003C023FFF3444FFFF0083102B5440000185 -:1046F0000080182100C31021ACA2001C8FBF001045 -:1047000003E0000827BD001827BDFFE800C04021D6 -:1047100000A63023AFBF001018C00026308A00FF6B -:104720003C028008344900808D24001C8D23002C1D -:10473000008820230064182B1060000F344701000C -:104740008CE2002000461021ACE200208CE2002028 -:104750000044102B1440000B3C023FFF8CE2002071 -:1047600000441023ACE200209522005C3042FFFFA1 -:104770000A0011AE00822021ACE00020008620213A -:104780003C023FFF3443FFFF0064102B5440000104 -:10479000006020213C0280083442008000851821FE -:1047A000AC43001CA0400024A04000270A0011FDDB -:1047B0008FBF001031420010104000408FBF00102A -:1047C0003C06800834C400808C82003C00481023E2 -:1047D0005840003B014020219082002424420001E7 -:1047E000A0820024908200243C0308008C630024F3 -:1047F000304200FF0043102B544000348FBF0010A4 -:1048000034C201008C42001C00A210231840002F6B -:104810008FBF00108CC300049482005C00681823D2 -:104820003042FFFF00031843000210400043102AEB -:1048300010400005000000008CC200040048102356 -:104840000A0011E3000210439482005C3042FFFF33 -:10485000000210403C068008AC82002C34C5008069 -:1048600094A2005C8CA4002C94A3005C3042FFFF57 -:1048700000021040008220213063FFFF00832021CE -:1048800001041021ACA2001C8CC2000434C601003B -:10489000ACC2001C240200020E000F37A0C2000CA4 -:1048A0001040000A8FBF00103C0280008C440100C1 -:1048B0008FBF00100A000F4827BD001801402021BB -:1048C000240600010A0010F927BD001803E00008C3 -:1048D00027BD00183C098008352A00808D42003C25 -:1048E000308300FF352B01000046102330E700FF26 -:1048F000184000060060202124020001A160000C85 -:10490000A160000D0A001190A542001424020005C8 -:10491000352901000000302114E20008A1400027E1 -:104920009122000D2C4200061040000400000000FF -:104930009122000D24420001A122000D0A0010F96D -:10494000000000003C0380083C028000344201006B -:1049500034640080346301009045000A8C480014E0 -:104960008C8900389062000C30AA00FF01281823BF -:10497000304700FF1C60000E2CE4000624020001FA -:1049800000E210041080000A30430003014020219F -:10499000010028210120302114600007304B000C59 -:1049A000156000073042003014400007000000008E -:1049B00003E00008000000000A0011900000000061 -:1049C0000A00112A000000000A0012030000000083 -:1049D0003C0380083464010024020003A082000C20 -:1049E0008C62000403E00008AC82001C3C058008D7 -:1049F00034A300809062002734A501002406004300 -:104A000024420001A0620027906300273C020800B6 -:104A10008C420048306300FF146200043C076021B0 -:104A200094A500DA0A0008EE30A5FFFF03E00008B5 -:104A30000000000027BDFFE8AFBF00103C0280006F -:104A40000E0012498C4401803C028008344301006E -:104A5000A060000C8C4200048FBF001027BD00181E -:104A600003E00008AC62001C27BDFFE03C028008A8 -:104A7000AFBF0018AFB10014AFB0001034450080D4 -:104A8000344601003C0880008D09014090C3000CB1 -:104A90008CA4003C8CA2003814820038306700FFE0 -:104AA0009502007C90A30027146000093045FFFFA9 -:104AB0002402000554E200083C04800890C2000D66 -:104AC00024420001A0C2000D0A0012843C048008A8 -:104AD000A0C0000D3C048008348201009042000C0C -:104AE00024030005304200FF1443000A24A205DC21 -:104AF00034830080906200272C420007504000055C -:104B000024A20A009063002724020014006210040B -:104B100000A210213C108008361000803045FFFFB5 -:104B2000012020210E001249A60500149602005C07 -:104B30008E0300383C1180003042FFFF000210401D -:104B400000621821AE03001C0E0003158E240140E4 -:104B50009202002534420040A20200250E000320EC -:104B60008E2401408E2401408FBF00188FB10014A5 -:104B70008FB000100A000F4827BD00208FBF00181B -:104B80008FB100148FB0001003E0000827BD002093 -:104B90008008010080080080800800008008024032 -:104BA00008000EF008000F4808000F8C08001020C5 -:104BB0000800106480080100800800808008000060 -:104BC0000A00002000000000000000000000000DAE -:104BD0006370342E362E31370000000004061104B5 -:104BE00000000000000000000000000000000000C5 -:104BF0000000000038003C00000000000000000041 -:104C00000000000000000000000000200000000084 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000021003800000000010000002BEF -:104C40000000000010000003000000000000000D44 -:104C50000000000D3C020800244255C43C0308003B -:104C6000246357F4AC4000000043202B1480FFFD68 -:104C7000244200043C1D080037BD9FFC03A0F02126 -:104C80003C100800261000803C1C0800279C55C4DE -:104C90000E00026A000000000000000D00A01821B4 -:104CA00000801021008028213C0460003C07600047 -:104CB0002406000810600006348420788C4200002E -:104CC000ACE220088C63000003E00008ACE3200C99 -:104CD0000A000E1C00000000240300403C0260009B -:104CE00003E00008AC4320003C0760008F86000012 -:104CF0008CE520740086102100A2182B1460000798 -:104D0000000028218F8AFDEC24050001A144001336 -:104D10008F89000001244021AF88000003E00008D3 -:104D200000A010218F84FDEC8F8500009086001379 -:104D300030C300FF00A31023AF82000003E000088F -:104D4000A08000138F84FDEC27BDFFE8AFB00010FA -:104D5000AFBF001490890011908700112402002831 -:104D6000312800FF3906002830E300FF2485002C9D -:104D70002CD00001106200162484001C0E000037A5 -:104D8000000000008F8FFDEC3C056000240202044F -:104D900095EE003E95ED003C000E5C0031ACFFFF4F -:104DA000016C5025ACAA201052000001240200041E -:104DB000ACA2200000000000000000000000000085 -:104DC0008FBF00148FB0001003E0000827BD00184B -:104DD0000A00006F000028218F85FDEC27BDFFD859 -:104DE000AFBF0020AFB3001CAFB20018AFB10014CA -:104DF000AFB000100080982190A4001124B0001CD6 -:104E000024B1002C308300FF386200280E000059C6 -:104E10002C5200010E000061000000000200202161 -:104E20001240000202202821000028210E00003735 -:104E3000000000008F8DFDEC3C0880003C05600008 -:104E400095AC003E95AB003C02683025000C4C0050 -:104E5000316AFFFF012A3825ACA720102402020284 -:104E6000ACA6201452400001240200028FBF002093 -:104E70008FB3001C8FB200188FB100148FB00010D8 -:104E800027BD002803E00008ACA2200027BDFFE0FA -:104E9000AFB20018AFB10014AFB00010AFBF001C2C -:104EA0003C1160008E2320748F82000030D0FFFF01 -:104EB00030F2FFFF1062000C2406008F0E00003756 -:104EC000000000003C06801F0010440034C5FF00B5 -:104ED0000112382524040002AE27201000003021E2 -:104EE000AE252014AE2420008FBF001C8FB2001806 -:104EF0008FB100148FB0001000C0102103E0000833 -:104F000027BD002027BDFFE0AFB0001030D0FFFF6D -:104F1000AFBF0018AFB100140E00003730F1FFFF33 -:104F200000102400009180253C036000AC7020102C -:104F30008FBF00188FB100148FB00010240200043E -:104F4000AC62200027BD002003E000080000102113 -:104F500027BDFFE83C0C6018AFBF00108D985000D3 -:104F60002419FF7F3C0880000319782435EE380CA3 -:104F7000340D8071240A003124090C00AD8E5000DC -:104F80003C0B800AAD8D53BCAD0A0008AD0900246E -:104F90000E00048DAF8B002C0E00044B00000000AF -:104FA0000E000046000000003C0760008CE5080889 -:104FB0002406FFF03C03570900A620243462F000C9 -:104FC00010820048241F0001AF8000380E000BAE95 -:104FD000000000003C0660168CC700003C0860140E -:104FE0008D0500A03C03FFFF00E320243C02535347 -:104FF00000051FC21082003534C57C0094A201F266 -:10500000A780005010400003A7800060384C1E1E8F -:10501000A78C005094A201F8104000048F8E003835 -:10502000384D1E1EA78D00608F8E003811C0000401 -:1050300097840060240F0020A78F005097840060A1 -:105040002C980081530000012404008097850050B3 -:105050002CB9040153200001240504003C03600026 -:105060008C670438241F103C30E2FFFF105F000300 -:105070003088FFFF5100000B24060050A38000621F -:10508000938900621120000B8FBF001027BD00180C -:10509000A7800060A7800050A780005803E00008A8 -:1050A000A7800076A3860062938900621520FFF72F -:1050B0008FBF001027BD0018A7840060A78500508F -:1050C000A780005803E00008A780007600035880FE -:1050D000016650218D4900043C0660000A00010F62 -:1050E000012628210A000103AF9F00383083FFFF0B -:1050F0008F88002C8F870028000321403C0580000A -:105100003C020050008248253C0660003C0A010039 -:1051100034AC04008CCD08E001AA582411600005CD -:10512000000000008CCF08E024E7000101EA7025B0 -:10513000ACCE08E08D19001001805821ACB90038C0 -:105140008D180014ACB8003CACA900300000000081 -:10515000000000000000000000000000000000004F -:105160000000000000000000000000003C03800080 -:105170008C640000308200201040FFFD3C0F600076 -:105180008DED08E03C0E010001AE18241460FFE133 -:1051900000000000AF87002803E00008AF8B003C50 -:1051A0008F85002C240BFFF03C06800094A7001A8A -:1051B0008CA9002430ECFFFF000C38C000EB502419 -:1051C000012A4021ACC8003C8CA400248CC3003CC4 -:1051D0000083102318400033000000008CAD002035 -:1051E00025A200013C0F0050ACC2003835EE001083 -:1051F0003C068000ACCE0030000000000000000043 -:10520000000000000000000000000000000000009E -:1052100000000000000000003C0480008C990000A9 -:10522000333800201300FFFD30E200081040001763 -:105230003C0980008C880408ACA800108C83040C06 -:10524000ACA300143C1900203C188000AF190030BA -:1052500094AE001894AF001C01CF3021A4A6001812 -:1052600094AD001A25A70001A4A7001A94AB001A58 -:1052700094AC001E118B00030000000003E0000846 -:105280000000000003E00008A4A0001A8D2A04001A -:10529000ACAA00108D240404ACA400140A0001A2DE -:1052A0003C1900208CA200200A00018A3C0F00500B -:1052B0000A000178000000003C0308008C63002015 -:1052C0008F82003427BDFFE810620008AFBF0010D6 -:1052D0000E0001BCAF8300343C0308008C63002047 -:1052E00024040001106400048F8C002C8FBF001078 -:1052F00003E0000827BD00188FBF00103C058000A8 -:10530000A580000A958B000A958A000427BD001825 -:105310003167FFFF3149000F0009450000E83025E3 -:1053200003E00008ACA600803C0208008C4200208C -:1053300027BDFFC8AFBF0034AFBE0030AFB7002CF1 -:10534000AFB60028AFB50024AFB40020AFB3001C47 -:10535000AFB20018AFB1001410400053AFB000104E -:105360008F84002C948600069483000A00C32823AF -:1053700030B6FFFF12C0004D8FBF00349489001873 -:10538000948A000A012A40233102FFFF02C2382B0F -:1053900014E0000202C02021004020212C8C0005D6 -:1053A000158000020080A021241400040E00014B8F -:1053B000028020218F87002C02809821AF8000304E -:1053C00094ED000A028088211280005131B2FFFF63 -:1053D0003C1770003C1540003C1E60008F8F003C65 -:1053E0008DEE000001D718245075005302202021B3 -:1053F00002A3802B160000383C1820001078004AC9 -:1054000000000000241000018F8300301460003C75 -:10541000029158230230F8230250C82133F1FFFFD4 -:105420001620FFEE3332FFFF8F87002C3C12002046 -:105430003C118000AE32003094EA000A3C17800034 -:10544000026A4821A4E9000A94E3000A94E80004EF -:105450003065FFFF3106000F0006150000A2F025A1 -:10546000AEFE008094F4000A94F5001812B4003ADD -:105470000013C9408CF800148CEE00100319582159 -:10548000000078210179682B01CF6021018D202156 -:10549000ACEB0014ACE4001002D3382330F6FFFF6D -:1054A00016C0FFB68F84002C8FBF00348FBE003033 -:1054B0008FB7002C8FB600288FB500248FB4002042 -:1054C0008FB3001C8FB200188FB100148FB0001082 -:1054D00003E0000827BD0038107E001B000000001C -:1054E0001477FFC9241000010E0014E00000000032 -:1054F0008F8300301060FFC80230F82302915823D8 -:105500008F87002C017020210A0002553093FFFF85 -:105510008F8300301460FFC83C1200203C118000D3 -:105520000A00021EAE3200300E0003CE02202021FF -:105530000A000212004080210E0007C60240282106 -:105540000A000212004080210E000D7D0220202161 -:105550000A000212004080210E00017800000000C5 -:105560000A00023702D3382327BDFFD0AFB500248D -:10557000AFB40020AFB3001CAFB20018AFB100143D -:10558000AFB00010AFBF00280E0000E43C14800054 -:105590003C0280083C0320003C010800AC20007065 -:1055A00034550080347200032413000136900070DB -:1055B0002411FF800A0002858E0600003C1980003D -:1055C0008F3800003B0F000131E200011040002540 -:1055D0008F8600848E0700003C0D08008DAD003CD6 -:1055E0003C0A08008D4A003800E6702301AE4021D5 -:1055F00000005821010E302B014B482101262021AB -:105600003C010800AC28003CAF8700843C01080046 -:10561000AC2400380E0001BE000000003C0508006C -:105620008CA5007010A0FFE500A020213C0508001B -:105630008CA500683C0608008CC6006C0E00148324 -:10564000000000003C010800AC2000703C19800004 -:105650008F3800003B0F000131E200011440FFDDF4 -:105660008F8600848E0C00008F8D00843C0708001C -:105670008CE7003C3C0608008CC60038018D58239E -:1056800000EB282100AB202B00C24821012410216F -:105690003C010800AC25003C3C0880003C010800AF -:1056A000AC2200388D030100241F0C00107F00265F -:1056B000000000008D180100240E0020AD1800200D -:1056C00092AF000031E300FF106E00232419005058 -:1056D00010790026000000003C0480008C88010046 -:1056E0001500000300000000566000143C04400058 -:1056F0008C9901008C8F0100000098210331C02497 -:105700000018694031EE007F01AE602501925825F6 -:10571000AC8B08308C8701008C89010024EA0100E1 -:1057200001513024000629403123007F00A31025B9 -:105730000052F825AC9F08303C044000AE8401388C -:105740000A00027D000000000E0001DA00000000E7 -:105750000A0002C73C0480008D0401000E00077F90 -:10576000000000000A0002C73C0480008D04010014 -:105770000E00139B000000000A0002C73C048000DA -:1057800000A4102B24030001104000090000302168 -:105790000005284000A4102B04A0000300031840BB -:1057A0005440FFFC000528405060000A0004182BFC -:1057B0000085382B54E000040003184200C3302554 -:1057C00000852023000318421460FFF900052842D9 -:1057D0000004182B03E0000800C310213084FFFFF1 -:1057E00030C600FF3C0780008CE201B80440FFFE99 -:1057F00000064C00012430253C08200000C820256C -:105800003C031000ACE00180ACE50184ACE401880D -:1058100003E00008ACE301B83C0660008CC5201C26 -:105820002402FFF030830200308601001060000E79 -:1058300000A2282434A500013087300010E00005C4 -:1058400030830C0034A500043C04600003E0000831 -:10585000AC85201C1060FFFD3C04600034A50008EE -:1058600003E00008AC85201C54C0FFF334A50002FF -:105870000A00031F3087300027BDFFE8AFB00010DB -:10588000AFBF00143C076000240600021080001126 -:1058900000A080218F83003C0E0003168C6400184A -:1058A0008F82003C00002021240600018C45000C62 -:1058B0000E0003070000000016000002240200038F -:1058C000000010218FBF00148FB0001003E000080B -:1058D00027BD00188CE8201C2409FFF001092824AA -:1058E000ACE5201C8F87003C0A00033C8CE5000CD3 -:1058F0003C02600E0080402134460100240900185B -:105900000000000000000000000000003C0A005001 -:105910003C03800035470200AC6800383464040062 -:10592000AC65003CAC6700308C6C0000318B002013 -:105930001160FFFD2407FFFF2403007F8C8D000012 -:105940002463FFFF24840004ACCD00001467FFFB38 -:1059500024C6000400000000000000000000000059 -:1059600024A402000085282B3C0300203C0E80006C -:105970002529FFFF01054021ADC300301520FFE0C0 -:105980000080282103E00008000000008F82003C16 -:1059900027BDFFD8AFB3001CAFBF0020AFB20018C7 -:1059A000AFB10014AFB000109446000200809821FF -:1059B0008C5200182CC300818C4800048C470008CE -:1059C0008C51000C8C490010106000078C4A0014A8 -:1059D0002CC400041480001330EB000730C5000312 -:1059E00010A00010000000002410008B02002021F5 -:1059F000022028210E00030724060003166000027F -:105A000024020003000010218FBF00208FB3001C70 -:105A10008FB200188FB100148FB0001003E000089F -:105A200027BD00281560FFF12410008B3C0C80007E -:105A30003C030020241F0001AD830030AF9F0030E5 -:105A40000000000000000000000000002419FFF02A -:105A500024D8000F031978243C1000D0AD880038FA -:105A600001F0702524CD00033C08600EAD87003C9A -:105A700035850400AD8E0030000D38823504003CC1 -:105A80003C0380008C6B0000316200201040FFFD61 -:105A90000000000010E0000824E3FFFF2407FFFFE0 -:105AA0008CA800002463FFFF24A50004AC8800003C -:105AB0001467FFFB248400043C04600EAC860038AD -:105AC0000000000000000000000000003C07002073 -:105AD0003C0680000120202101402821ACC7003075 -:105AE0000E00034C000080210E000316024020210E -:105AF0000A00038C0200202127BDFFD8AFB2001896 -:105B00003092FFFFAFB10014AFBF0020AFB3001C55 -:105B1000AFB000101240002D000088210A0003E2FF -:105B20002413000350B300428CE5000C0000000D6C -:105B3000263900013331FFFF24F800200232382BD0 -:105B400010E00022AF98003C8F8200301440001F0C -:105B50008F87003C3C0670003C0320008CE4000072 -:105B60000086282414A300198F85004400044402F1 -:105B70003C0980000089802414A0FFEA310600FF60 -:105B8000240A000210CA003028CB0003116000175D -:105B9000000000002404000114C4FFE626390001BF -:105BA000020028210E00032E240400018F87003CF0 -:105BB000AF820044263900013331FFFF24F8002072 -:105BC0000232382B14E0FFE0AF98003C0220102195 -:105BD0008FBF00208FB3001C8FB200188FB100144C -:105BE0008FB0001003E0000827BD002810D3001B71 -:105BF000240C000414CCFFCF26390001308DFFFFA8 -:105C0000000D19C03C0480008C8E01B805C0FFFE59 -:105C10003C0F10003C102004AC830180AC80018458 -:105C2000AC900188AC8F01B80A0003DD2639000171 -:105C30000E000307240400841600FFBD8F87003C7C -:105C40000A0003DCAF800044020028210E00032E6E -:105C5000000020210A0003FC8F87003C0E00037324 -:105C6000020020218F87003C0A0003FDAF82004420 -:105C7000000449C23127003F000443423C02800037 -:105C800000082040240316802CE60020AC43002CA2 -:105C900024EAFFE02482000114C0000330A900FFC1 -:105CA00000801021314700FF000260803C0D800021 -:105CB000240A0001018D20213C0B000E00EA28047B -:105CC000008B302111200005000538278CCE000004 -:105CD00001C5382503E00008ACC700008CD80000DF -:105CE0000307782403E00008ACCF000027BDFFE0E5 -:105CF000AFB10014AFB00010AFBF00183C07600098 -:105D00008CE408083402F0003C1160003083F0009D -:105D1000240501C03C04800E000030211062000602 -:105D2000241000018CEA08083149F0003928E0000D -:105D30000008382B000780403C0D0200AE2D0814EF -:105D4000240C16803C0B80008E2744000E000E268B -:105D5000AD6C002C120000043C02169124050001D9 -:105D6000120500103C023D6C345800E0AE38440887 -:105D70003C1108008E31007C8FBF00183C0660008B -:105D800000118540360F16808FB100148FB00010BF -:105D90003C0E020027BD0020ACCF442003E00008E9 -:105DA000ACCE08103C0218DA345800E0AE38440893 -:105DB0003C1108008E31007C8FBF00183C0660004B -:105DC00000118540360F16808FB100148FB000107F -:105DD0003C0E020027BD0020ACCF442003E00008A9 -:105DE000ACCE08100A00042C240500010A00042C83 -:105DF0000000282124020400A782000CA7800004D0 -:105E0000000020213C06080024C656582405FFFF48 -:105E100024890001000440803124FFFF010618217D -:105E20002C87002014E0FFFAAC6500002404040075 -:105E3000A784000EA7800006000020213C06080071 -:105E400024C656D82405FFFF248D0001000460807D -:105E500031A4FFFF018658212C8A00201540FFFA4B -:105E6000AD650000A7800010A7800008A780000A89 -:105E7000000020213C06080024C657582405FFFFD7 -:105E8000249900010004C0803324FFFF0306782119 -:105E90002C8E000415C0FFFAADE500003C05600043 -:105EA0008CA73D002403E08F00E31024344601401A -:105EB00003E00008ACA63D002487007F000731C244 -:105EC00024C5FFFF000518C2246400013082FFFFD3 -:105ED000000238C0A78400183C010800AC2700303D -:105EE000AF80001400002821000020210000302194 -:105EF0002489000100A728213124FFFF2CA81701C5 -:105F0000110000032C8300801460FFF924C60001F7 -:105F100000C02821AF86001410C0001DA786001203 -:105F200024CAFFFF000A11423C0808002508575800 -:105F30001040000A00002021004030212407FFFF0C -:105F4000248E00010004688031C4FFFF01A8602195 -:105F50000086582B1560FFFAAD87000030A2001FA5 -:105F60005040000800043080240300010043C804AE -:105F700000041080004878212738FFFF03E0000864 -:105F8000ADF8000000C820212405FFFFAC8500000B -:105F900003E000080000000030A5FFFF30C6FFFF4F -:105FA00030A8001F0080602130E700FF0005294273 -:105FB0000000502110C0001D24090001240B000125 -:105FC00025180001010B2004330800FF0126782664 -:105FD000390E00202DED00012DC2000101A218256F -:105FE0001060000D014450250005C880032C40219D -:105FF0000100182110E0000F000A20278D04000086 -:10600000008A1825AD03000024AD000100004021E6 -:106010000000502131A5FFFF252E000131C9FFFFEF -:1060200000C9102B1040FFE72518000103E000080D -:10603000000000008D0A0000014440240A000512FF -:10604000AC68000027BDFFE830A5FFFF30C6FFFFAA -:10605000AFB00010AFBF001430E7FFFF00005021C9 -:106060003410FFFF0000602124AF001F00C0482152 -:10607000241800012419002005E0001601E0102179 -:106080000002F943019F682A0009702B01AE4024E9 -:1060900011000017000C18800064102110E00005AA -:1060A0008C4B000000F84004000838230167582496 -:1060B00000003821154000410000402155600016C5 -:1060C0003169FFFF258B0001316CFFFF05E1FFEC1B -:1060D00001E0102124A2003E0002F943019F682A3A -:1060E0000009702B01AE40241500FFEB000C188056 -:1060F000154600053402FFFF020028210E0004F6B9 -:1061000000003821020010218FBF00148FB0001052 -:1061100003E0000827BD00181520000301601821C6 -:10612000000B1C0224080010306A00FF1540000517 -:10613000306E000F250D000800031A0231A800FF81 -:10614000306E000F15C00005307F000325100004DD -:1061500000031902320800FF307F000317E000053A -:10616000386900012502000200031882304800FF50 -:10617000386900013123000110600004310300FF81 -:10618000250A0001314800FF310300FF000C69407F -:1061900001A34021240A000110CAFFD53110FFFFDE -:1061A000246E000131C800FF1119FFC638C9000173 -:1061B0002D1F002053E0001C258B0001240D000141 -:1061C0000A000589240E002051460017258B000186 -:1061D00025090001312800FF2D090020512000125F -:1061E000258B000125430001010D5004014B1024B3 -:1061F000250900011440FFF4306AFFFF3127FFFF3B -:1062000010EE000C2582FFFF304CFFFF00005021F4 -:106210003410FFFF312800FF2D0900205520FFF228 -:1062200025430001258B0001014648260A0005434D -:10623000316CFFFF00003821000050210A00059555 -:106240003410FFFF27BDFFD8AFB0001030F0FFFFC4 -:10625000AFB10014001039423211FFE00007108086 -:10626000AFB3001C00B1282330D3FFFFAFB200183A -:1062700030A5FFFF008090210260302100442021E2 -:10628000AFBF00200E0005213207001F0222882127 -:106290003403FFFF02402021020028210260302148 -:1062A00000003821104300093231FFFF0220102185 -:1062B0008FBF00208FB3001C8FB200188FB1001465 -:1062C0008FB0001003E0000827BD00280E00052154 -:1062D0000000000000408821022010218FBF002014 -:1062E0008FB3001C8FB200188FB100148FB0001054 -:1062F00003E0000827BD0028000424003C036000E0 -:10630000AC603D0810A000023482100634821016E2 -:1063100003E00008AC623D0427BDFFE0AFB0001011 -:10632000309000FF2E020006AFBF0018104000089A -:10633000AFB10014001030803C030800246353B454 -:1063400000C328218CA40000008000080000000089 -:10635000000020218FBF00188FB100148FB00010F3 -:106360000080102103E0000827BD00209791001253 -:1063700016200051000020213C020800904200330A -:106380000A0005FC00000000978D000E15A00031EA -:10639000000020210A0005FC240200089787000C59 -:1063A00014E0001A000018210060202124020001DE -:1063B0001080FFE98FBF0018000429C2004530217A -:1063C00000A6582B1160FFE43C0880003C07200029 -:1063D000000569C001A76025AD0C00203C038008C2 -:1063E0002402001F2442FFFFAC6000000441FFFDB7 -:1063F0002463000424A5000100A6702B15C0FFF53E -:10640000000569C00A0005E68FBF001897870004E1 -:106410003C04080024845658240504000E0005A1FD -:1064200024060001978B000C24440001308AFFFFF2 -:106430002569FFFF2D480400004028211500004079 -:10644000A789000C24AC3800000C19C00A0005FA1A -:10645000A7800004978700063C040800248456D8CF -:10646000240504000E0005A1240600019799000EE2 -:10647000244400013098FFFF272FFFFF2F0E040058 -:106480000040882115C0002CA78F000EA7800006B1 -:106490003A020003262401003084FFFF0E0005CEDF -:1064A0002C4500010011F8C027F00100001021C0A8 -:1064B0000A0005FC24020008978500169787000A49 -:1064C0003C040800248457580E0005A1240600014E -:1064D000978700128F8900142445000130A8FFFF20 -:1064E00024E3FFFF0109302B0040802114C0001875 -:1064F000A7830012A780000A978500180E000E10CF -:1065000002002021244A05003144FFFF0E0005CE81 -:10651000240500013C05080094A500320E000E1071 -:1065200002002021244521003C0208009042003353 -:106530000A0005FC000521C00A000634A7840006F5 -:1065400024AC3800000C19C00A0005FAA784000426 -:106550000A00064EA785000A308400FF27BDFFE829 -:106560002C820006AFBF0014AFB000101040001521 -:1065700000A03821000440803C030800246353CC71 -:10658000010328218CA40000008000080000000006 -:1065900024CC007F000751C2000C59C23170FFFFAC -:1065A0002547C40030E5FFFF2784000402003021A6 -:1065B0000E0004F624070001978600100206202131 -:1065C000A78400108FBF00148FB0001003E00008F4 -:1065D00027BD00183C0508008CA50030000779C2D3 -:1065E0000E0002F025E4DF003045FFFF3C04080008 -:1065F00024845758240600010E0004F624070001E5 -:10660000978E00128FBF00148FB0001025CD0001AF -:1066100027BD001803E00008A78D00120007C9C2BB -:106620002738FF00001878C231F0FFFF3C04080053 -:10663000248456D802002821240600010E0004F606 -:1066400024070001978D000E260E0100000E840025 -:1066500025AC00013C0B6000A78C000EAD603D082E -:1066600036040006000030213C0760008CE23D0447 -:10667000305F000617E0FFFD24C9000100061B0083 -:10668000312600FF006440252CC50004ACE83D0421 -:1066900014A0FFF68FBF00148FB0001003E00008B5 -:1066A00027BD0018000751C22549C8002406000173 -:1066B000240700013C040800248456580E0004F608 -:1066C0003125FFFF9787000C8FBF00148FB000109B -:1066D00024E6000127BD001803E00008A786000C8F -:1066E0003084FFFF30A5FFFF3C0680008CC201B85C -:1066F0000440FFFE3C084080008838253C03100021 -:10670000ACC00180ACC50184ACC7018803E00008BF -:10671000ACC301B83084FFFF3C0680008CC201B8D6 -:106720000440FFFE3C0840388CA700000088282564 -:106730003C031000ACC70180ACC5018803E0000831 -:10674000ACC301B88F83005C8F8600541066000BC9 -:10675000008040213C07080024E75768000328C058 -:1067600000A710218C44000024630001108800055C -:106770003063000F5466FFFA000328C003E00008EE -:10678000000010213C07080024E7576C00A73021C7 -:1067900003E000088CC200003C039000346200015A -:1067A000008220253C038000AC6400208C65002022 -:1067B00004A0FFFE0000000003E00008000000004D -:1067C0003C028000344300010083202503E00008E0 -:1067D000AC44002027BDFFE0AFB100143091FFFFB3 -:1067E000AFB00010AFBF00181220001200A080212F -:1067F0008CA5000014A00011240400023C068000B7 -:106800008CC201B80440FFFE3C074000022720254F -:106810008FBF00188FB100148FB000103C03100020 -:1068200027BD0020ACC50180ACC4018803E000088E -:10683000ACC301B80A00070F8CA500000E00066665 -:1068400024060200000028210A00070FAE00000005 -:106850003087FFFF3C0680008CC201B80440FFFE79 -:106860003C0A40068CA9000000EA4025ACC9018022 -:106870008CA400043C031000ACC40184ACC80188A3 -:1068800003E00008ACC301B88F83FDE827BDFFE833 -:10689000AFBF0014AFB00010906700080080102157 -:1068A0000080282130E600400000202110C00008B0 -:1068B0008C5000000E0000860200202102002021E2 -:1068C0008FBF00148FB000100A00048927BD001884 -:1068D0000E000724000000000E00008602002021A8 -:1068E000020020218FBF00148FB000100A0004891D -:1068F00027BD001827BDFFE0AFB000108F90FDE866 -:10690000AFBF001CAFB20018AFB100149206000177 -:10691000008088210E0006F630D2000492040005A3 -:10692000001129C2A605000034830040A20300051F -:106930000E000700022020210E00048B02202021DF -:1069400024020001AE02000C02202821A602001041 -:1069500024040002A602001224060200A60200146B -:106960000E000666A60200161640000F8FBF001C20 -:10697000978C00583C0B08008D6B00782588FFFF32 -:106980003109FFFF256A0001012A382B10E00006BB -:10699000A78800583C0F6006240E001635ED001045 -:1069A000ADAE00508FBF001C8FB200188FB1001425 -:1069B0008FB0001003E0000827BD002027BDFFE0D6 -:1069C000AFBF0018AFB10014AFB000100E0006F654 -:1069D000008088218F85FDE80220202190A30005FA -:1069E0000E000700307000FF2402003E1202000576 -:1069F0008FBF00188FB100148FB0001003E00008A3 -:106A000027BD00203C0580008CA401780480FFFE97 -:106A1000240700073C061000ACB1014002202021F1 -:106A2000A0A701448FBF00188FB100148FB00010D1 -:106A3000ACA601780A00074D27BD002027BDFFE066 -:106A4000AFB00010AFBF0018AFB100143C10800011 -:106A50008E110020000000000E00048BAE04002008 -:106A6000AE1100208FBF00188FB100148FB000103E -:106A700003E0000827BD00203084FFFF3C068000B3 -:106A80008CC201B80440FFFE3C0840350088382520 -:106A90003C031000ACC50180ACC00184ACC70188C8 -:106AA00003E00008ACC301B83084FFFF3C0680005F -:106AB0008CC201B80440FFFE3C08403600883825EF -:106AC0003C031000ACC50180ACC00184ACC7018898 -:106AD00003E00008ACC301B827BDFFD0AFB5002468 -:106AE0003095FFFFAFB60028AFB40020AFBF002C39 -:106AF000AFB3001CAFB20018AFB10014AFB00010BC -:106B000030B6FFFF12A000270000A0218F92003CAA -:106B10008E4300003C0680002402004000033E0239 -:106B200000032C0230E4007F006698241482001DCC -:106B300030A500FF8F83004C2C68000A5100001024 -:106B40008F860030000358803C0C0800258C53E8E9 -:106B5000016C50218D490000012000080000000058 -:106B600002D448213125FFFF0E0006C8240400840A -:106B7000166000028F92003CAF80004C8F86003080 -:106B800026580020268F00010300902131F4FFFFDA -:106B900014C00004AF98003C0295282B14A0FFDC21 -:106BA00000000000028010218FBF002C8FB600284B -:106BB0008FB500248FB400208FB3001C8FB2001853 -:106BC0008FB100148FB0001003E0000827BD003023 -:106BD0002407003414A70146000000009247000E6D -:106BE0008F99FDEC8F90FDE824181600A32700195B -:106BF000924A000D3C0880003C07800CA32A001834 -:106C0000964400123C0F60003C117FFFA604005C1C -:106C1000965F00103622FFFF240A000533E5FFFFD0 -:106C2000AE0500548E46001CAD1800288CE900000B -:106C30008DEE44480126682601CD3021AE0600388D -:106C40008E03003824CB00013C0E7F00AE03003CD5 -:106C50008E0C003CAF2C0004AE0B00208E130020E5 -:106C6000AE13001CA320001BAE02002CA32A0012AE -:106C70008E44001424130050AE0400348E1F0034E0 -:106C8000AF3F00148E450018AE0500489258000C26 -:106C9000A218004E920F000835E90020A209000852 -:106CA0008E0D001801AE1824346C4000AE0C001894 -:106CB000920B0000317200FF125302AD2413FF80CB -:106CC0003C040800248457E80E000732000000004E -:106CD00024030004240800013C0508008CA557E8A3 -:106CE0003C048000A2030025A20800058C900178D6 -:106CF0000600FFFE8F92003C240E00023C0D1000A7 -:106D0000AC850140A08E0144AC8D01780A0007EFEC -:106D1000AF80004C2CAD003711A0FF998F8600305A -:106D2000000580803C1108002631541002117821A2 -:106D30008DEE000001C000080000000024100004D7 -:106D400014B0008E3C0780003C0C08008D8C57E886 -:106D50008F86FDE8ACEC00208E4B00088F98FDEC90 -:106D600024090050ACCB00308E430008ACC3005067 -:106D70008E42000CACC200348E4A0010ACCA0038FF -:106D80008E440010ACC400548E5F0014ACDF003C95 -:106D90008E590018AF1900048E4F001CACCF002094 -:106DA00090D10000322500FF10A9027D00000000F4 -:106DB0008CD100348CCF0030022F302304C000F37C -:106DC0002404008C126000F0240200030A0007EF84 -:106DD000AF82004C2418000514B800683C0B8000FA -:106DE0003C0C08008D8C57E88F86FDE8AD6C0020C8 -:106DF0008E4300048F9FFDEC24072000ACC3001CD1 -:106E00009242000824120008A3E200198F8A003C75 -:106E100091440009A3E400188F85003C90B9000A52 -:106E2000332400FF1092001028880009150000BCD0 -:106E3000240D0002240900201089000B3407800073 -:106E4000289100211620000824074000240F00404C -:106E5000108F00053C0700012418008010980002E4 -:106E60003C070002240740008CC400183C0AFF00C5 -:106E7000008AF82403E7C825ACD9001890B2000BAB -:106E8000A0D200278F83003C9465000C10A0023133 -:106E9000000000009467000C3C1F8000A4C7005C49 -:106EA0009062000E2403FFBF24070004A0C2000864 -:106EB0008F8A003C9144000FA0C400098F88003CD9 -:106EC0008D1200108FF9007402592823ACC50058A8 -:106ED0008D180014ACD8002C950F001831F1FFFF6D -:106EE000ACD100409509001A3130FFFFACD000440E -:106EF0008D0E001CACCE0048950D0002A4CD00788C -:106F0000910C000EA0CC000890CB00080163102467 -:106F1000126001D7A0C200088F92003C0A0007EF60 -:106F2000AF87004C2406000614A600143C0E800017 -:106F30003C1008008E1057E88F8CFDE4ADD0002087 -:106F40008E4D00188F86FDE88F8BFDECAD8D000017 -:106F50008CC8003824040005AD8800048CC3003CB4 -:106F600012600081AD6300000A0007EFAF84004C9F -:106F70002409000710A9004B240400063C05080062 -:106F800024A557E80E000705240400818F92003CD9 -:106F90000013102B0A0007EFAF82004C241F0023C0 -:106FA00014BFFFF63C0C80003C0308008C6357E8DC -:106FB0008F8BFDECAD8300208F91FDE88E460004A1 -:106FC0002564002026450014AE2600282406000370 -:106FD0000E000E1C257000308F87003C020020211F -:106FE000240600030E000E1C24E500083C040800E3 -:106FF000248457E80E0007320000000092220000AF -:1070000024040050304A00FF5544FFE18F92003CB9 -:107010000E000E07000000000A0008F48F92003CEA -:107020002408003314A800323C0280003C11080000 -:107030008E3157E88F89FDECAC5100208E4A000854 -:10704000240F00288F8DFDE8AD2A00308E44000CFF -:1070500024060009AD2400348E5F0010AD3F0038D7 -:107060008E590014AD3900208E450018AD2500243E -:107070008E58001CAD380028A12F00118E4E000440 -:1070800012600031ADAE00288F92003C0A0007EF7D -:10709000AF86004C2411002214B1FFB8000000009C -:1070A000240400073C1808008F1857E83C0F8000A4 -:1070B000ADF800205660FEB1AF84004C3C040800DF -:1070C000248457E80E000732241300508F99FDE8FE -:1070D00093320000324500FF10B3016C0000000045 -:1070E0008F92003C000020210A0007EFAF84004C83 -:1070F0003C05080024A557E80E0006D524040081AD -:107100000A0008F48F92003C02D498213265FFFFF8 -:107110000E0006C8240400840A0007EF8F92003C8A -:10712000108DFF51240704002887000310E001AAF6 -:1071300024100004240E0001548EFF4B240740004D -:107140000A0008AA240701003C05080024A557E806 -:107150000E000724240400828F92003C000030219E -:107160000A0007EFAF86004C3C040800248457E86F -:107170008CC200380E0007328CC3003C8F92003C5A -:107180000A00094A00002021240400823C0508006E -:1071900024A557E80E000724000000008F92003C51 -:1071A000000010210A0007EFAF82004C8E5000044F -:1071B0008F91FDE83C0A8000AD500020922200052E -:1071C000020028213046000214C001872404008AEE -:1071D0008F92FDEC020028212404008D924B001BAD -:1071E000316300201460018000000000922D00092E -:1071F000240C001231A800FF110C017B2404008133 -:107200000E0006F6020020219245001B240E000409 -:107210000200202134A90042A249001B0E000700F1 -:10722000A22E00253C0480008C9101780620FFFEF0 -:1072300024180002AC900140A09801448F92003CB9 -:107240003C0F1000AC8F01780A0008F50013102BDA -:107250008E5000048F91FDE83C1F8000AFF00020AD -:1072600092390005020028213327000214E0001A99 -:107270002404008A922600092412001230C400FF60 -:10728000109201110000000092230009240A00045A -:10729000306200FF104A010C000000000E0006F6EC -:1072A000020020218F88FDEC240CFFFE020020212B -:1072B000910E001B35CD0020A10D001BA23200094C -:1072C000922B0005016C90240E000700A2320005ED -:1072D00002002821000020210E0007BA0000000053 -:1072E0000A0008F48F92003C8E5100043C0280009A -:1072F0003C100800261057E8AC5100203C01080063 -:10730000AC3157E89246000330C400041080016994 -:107310008F84FDE824020006A0820009924D001B24 -:107320002408FFC031AC003F01885825A08B00081D -:1073300092430003306A0001154001600000000024 -:107340008E420008AE0200083C0208008C4257F052 -:107350001040015F8F8EFDEC000281C28F85FDE839 -:10736000A5D0000C8E5F000C240F0001240900142E -:10737000ADDF002C8E590010ADD9001C96470016C9 -:10738000A5C7003C96580014A5D8003EACAF000C31 -:10739000A4AF0010A4AF0012A4AF0014A4AF001655 -:1073A00012600163A1C900119244000330920002EF -:1073B0002E5300018F92003C266200080A0007EF5E -:1073C000AF82004C8E4600043C0580003C048008DF -:1073D000ACA600208E4700089089000024110050C0 -:1073E000312200FF105100BC240500883C048000BD -:1073F0008C8F01B805E0FFFE0013802B3C1840097C -:1074000000B81025AF90004C3C101000AC860180F5 -:10741000AC870184AC820188AC9001B80A0007F007 -:107420008F8600308E4500043C0680003C098008B1 -:10743000ACC50020913F00002404005033F900FF48 -:10744000132400B4240600883C0480008C8A01B810 -:107450000540FFFE3C0E400E00CE68253C081000A3 -:10746000AC850180AC800184AC8D0188AC8801B80A -:10747000912B0000240CFF8024040004016C1825CB -:10748000240600300E000666A12300000A0008F45E -:107490008F92003C8E5000048F91FDEC3C0F8000D9 -:1074A000ADF000209225001B30A900101120007CB7 -:1074B000240300813C0480008C8701B804E0FFFEB7 -:1074C0003C1F401FAC900180007F10250013C82B8B -:1074D0003C101000AC800184AF99004CAC82018854 -:1074E000AC9001B80A0007F08F8600308E44001C73 -:1074F0000E0006E100000000104000FC00403821B2 -:107500008F92003C240600893C0580008CAE01B8B7 -:1075100005C0FFFE00000000ACA701808E50001CDB -:107520003C1140010013782B00D138253C1310008A -:10753000ACB00184AF8F004CACA70188ACB301B8EC -:107540000A0007F08F860030965900023C100800B0 -:10755000261057E833380004130000A73C046000ED -:107560008E5F001C3C068000ACDF00203C01080060 -:10757000AC3F57E8964F000231E7000114E000E706 -:10758000000000008E420004AE0200083C1008001B -:107590008E1057F0120000DD3C0680008F85FDE85C -:1075A000241000018CBF00188F91FDEC8F89FDE441 -:1075B00003E6C825ACB90018A0A00005ACB0000CCB -:1075C0003C1808008F1857F08F87003CA4B00010BB -:1075D000001879C2A4B00012A4B00014A4B0001620 -:1075E000A62F000C8CEE00088F8D003C8F8C003C89 -:1075F000AE2E002C8DA8000C24070002AE28001C23 -:10760000918B0010A22B00118F83003C906A001117 -:10761000A12A00088F82003C90440012A0A4004ED2 -:107620008F92003C92460013A22600128F92003CDB -:10763000965F0014A63F003C96590016A639003EFE -:107640008E580018AE3800145660FD4CAF87004CC1 -:107650003C05080024A557E80E000705000020217E -:107660008F92003C000038210A0007EFAF87004CE2 -:107670003C05080024A557E80E00072424040082D6 -:107680008F92003C0A0008D7000038210E000E0738 -:10769000000000008F92003C0A00094A00002021EF -:1076A0000E0006F6020020219232001B020020216B -:1076B000365800100E000700A238001B8F92003CC5 -:1076C0000A000A3D000018210E0007BA24040081B8 -:1076D0000A0008F48F92003C9243000C306A0001CB -:1076E0001140000300000000964B000EA48B002CFC -:1076F0009248000C310C00021180FF3C0000282150 -:10770000964E00128E4D0014A48E001A0A000A0B29 -:10771000AC8D001C8F83005C8F8700541067FF4A7C -:10772000000030213C0808002508576C000320C0E9 -:10773000008830218CD10000122500C8246200018D -:107740003043000F1467FFFA000320C00A000A222A -:10775000000030213C05080024A557E80E0007244E -:107760002404008B8F92003C0A0008D70013382BAA -:107770003C0C08008D8C57E824D9FFFE25910100B0 -:10778000322B007F0167902102331024AD020028C4 -:10779000AE4600D0AE4000D40A000840AE59001CEE -:1077A000ACC000543C0908008D2957E83C05800C0A -:1077B00034A80100ACE900288E500014AD1000D0B0 -:1077C0008E4E0014AD0E00D48E4D001025A7FFFE86 -:1077D0000A00087CAD07001C5490FDA3240740005C -:1077E0000A0008AA240710000E0007AE00000000DF -:1077F0000A0008F48F92003C8C83442C3C05DEADDB -:1078000034B2BEEF3C010800AC2057E81072004FC4 -:10781000000000003C046C6234827970146200083D -:1078200024040002978A0058978300500200282100 -:107830000143482B11200019240400922404000263 -:107840000E0005D6240502003C0B8000AD6200202E -:107850003C010800AC2257E81040000D8F8E003C20 -:10786000240C00282404000391CD001031A800FF4F -:10787000550C0001240400010E00004A0000000025 -:1078800010400004240400830A000A6D8F92003C1B -:10789000240400833C05080024A557E80E000705D2 -:1078A000000000008F92003C0013382B0A0007EF05 -:1078B000AF87004C0A0009D6240200128E4400084B -:1078C0000E0006E1000000000A0009E2AE02000816 -:1078D0003C05080024A557E80E0006D524040087BF -:1078E0008F92003C0A0009FF0013102B24040004AF -:1078F0000E0005D624050030144000170040382142 -:107900008F92003C0A000A52240600833C050800BE -:1079100024A557E80A000B37240400878E4400048E -:107920000E0006E1000000000A000A73AE02000823 -:107930003C05080024A557E80E0007242404008213 -:107940008F92003C0A0009FF000010218C83442C18 -:107950000A000B163C046C628F92003C3C088008C5 -:107960003C0C8000240B0050240A0001AD82002052 -:10797000A10B0000A10A000192490004A10900180E -:1079800092440005A1040019924300063C0408003B -:107990002484576CA103001A924200073C0308009C -:1079A00024635768A102001B92450008A105001C32 -:1079B00092460009A106001D925F000AA11F001E49 -:1079C0009259000BA119001F9258000CA118002019 -:1079D0009251000DA11100219250000EA110002221 -:1079E000924F000FA10F0023924E0010A10E002411 -:1079F000924D0011A10D0025964C0014A50C0028F5 -:107A0000964B00168F8A00548F98005CA50B002AB5 -:107A100096490018000A10C025450001A509002C50 -:107A20008E46001C0044C8210043F82130A5000FF9 -:107A3000AFE60000AF27000010B80003AF85005488 -:107A40000A000A520000302124AD000131A8000FC5 -:107A5000000030210A000A52AF88005C3C07080091 -:107A600024E7576800879021ACC000000000302157 -:107A70000A000A22AE4000003C0482013C03600080 -:107A800034820E02AC603D68AF80007C03E00008E9 -:107A9000AC623D6C27BDFFE8AFB000103090FFFF37 -:107AA000001018422C620041AFBF001414400002C5 -:107AB00024040080240300403C010800AC30006036 -:107AC0003C010800AC2300640E000E100060282169 -:107AD000244802BF2409FF800109282400103980AE -:107AE000001030408FBF00148FB0001000A720217D -:107AF00000861821AF8300643C010800AC250058C3 -:107B00003C010800AC24005C03E0000827BD00181D -:107B1000308300FF30C6FFFF30E400FF3C088000E8 -:107B20008D0201B80440FFFE0003540001443825D3 -:107B30003C09600000E920253C031000AD050180F0 -:107B4000AD060184AD04018803E00008AD0301B86F -:107B50008F86003C3C096012352700108CCB000456 -:107B60003C0C600E35850010316A00062D4800017E -:107B7000ACE800C48CC40004ACA431808CC2000802 -:107B800094C30002ACA2318403E00008A783007410 -:107B90008F85003C8F87FF408F86FF488CAE0004A6 -:107BA0003C0F601235E80010ACEE00688CAD0008A8 -:107BB000ACED006C8CAC0010ACCC004C8CAB000C71 -:107BC000ACCB004894CA00543C0208008C420044EC -:107BD00025490001A4C9005494C400543083FFFF18 -:107BE00010620017000000003C0208008C420040B8 -:107BF000A4C200528CA30018ACE300308CA2001485 -:107C0000ACE2002C8CB90018ACF900388CB8001428 -:107C100024050001ACF800348D0600BC50C50019E5 -:107C20008D0200B48D0200B8A4E2004894E400483C -:107C3000A4E4004A94E800DA03E000083102FFFF00 -:107C40003C0208008C420024A4C00054A4C200528C -:107C50008CA30018ACE300308CA20014ACE2002C22 -:107C60008CB90018ACF900388CB800142405000158 -:107C7000ACF800348D0600BC54C5FFEB8D0200B893 -:107C80008D0200B4A4E2004894E40048A4E4004A51 -:107C900094E800DA03E000083102FFFF8F86003C21 -:107CA0003C0480008CC900088CC80008000929C069 -:107CB000000839C0AC87002090C300073062000480 -:107CC0001040003AAF85007890CB0007316A000879 -:107CD000114000398F87FF448CCD000C8CCE0014EE -:107CE00001AE602B11800032000000008CC2000C3D -:107CF000ACE200708CCB00188F85FF408F88FF4866 -:107D0000ACEB00748CCA00102402FFF8ACAA00C8C7 -:107D10008CC9000CAD0900608CC4001CACA400C070 -:107D200090E3007C0062C824A0F9007C90D8000792 -:107D3000330F000811E000040000000090ED007C0B -:107D400035AC0001A0EC007C90CF000731EE0001C3 -:107D500011C000090000000090E4007C241800021B -:107D600034820002A0E2007C90A300EC307900FF96 -:107D7000133800132408003490C90007312600028C -:107D800010C000040000000090EB007C356A000485 -:107D9000A0EA007C90ED007D31AC003FA0EC007DBE -:107DA00094A700DA03E0000830E2FFFF8F87FF446A -:107DB0000A000C4C8CC200140A000C4DACE00070A0 -:107DC0000A000C6EACA800CC8F8C003C27BDFFD8FD -:107DD000AFB3001CAFB20018AFB00010AFBF0020AF -:107DE000AFB10014918F00153C13600E3673001074 -:107DF00031EB000FA38B00808D8F00048D8B00086A -:107E0000959F0012959900109584001A9598001E70 -:107E1000958E001C33EDFFFF332AFFFF3089FFFFF3 -:107E20003308FFFF31C7FFFF3C010800AC2D0024E1 -:107E30003C010800AC2900443C010800AC2A004089 -:107E4000AE683178AE67317C91850015959100164A -:107E50003C1260123652001030A200FF3230FFFF99 -:107E6000AE623188AE5000B491830014959F001823 -:107E7000240600010066C80433F8FFFFAE5900B8BD -:107E8000AE5800BC918E0014AF8F00683C086006AD -:107E900031CD00FFAE4D00C0918A00159584000ED3 -:107EA0003C07600A314900FFAF8B006C3084FFFF54 -:107EB000AE4900C8351100100E000BB534F00410A7 -:107EC0003C0208008C4200603C0308008C630064A4 -:107ED0003C0608008CC600583C0508008CA5005CD8 -:107EE0008F8400648FBF0020AE23004CAE65319CB0 -:107EF000AE030054AE4500DCAE6231A0AE6331A4E7 -:107F0000AE663198AE2200488FB3001CAE0200501E -:107F10008FB10014AE4200E0AE4300E4AE4600D89C -:107F20008FB000108FB200180A0004BE27BD0028D1 -:107F3000978500769783006027BDFFE8AFB00010FB -:107F400000A3102BAFBF0014240400058F90003C49 -:107F500010400055240900020E0005D68F850064EC -:107F6000AF820078240400031040004F240900026F -:107F70003C0680000E00004AACC20020240700012D -:107F8000240820001040004D24040005978E007640 -:107F90008F8AFF442409005025C50001A78500767B -:107FA000A14900003C0D08008DAD00642403800051 -:107FB0008F84FF40000D6600AD4C0018A540000600 -:107FC000954B000A8F85FF482402FF80016330240F -:107FD000A546000A915F000A0000482103E2C82577 -:107FE000A159000AA0A00008A140004CA08000C533 -:107FF00096180002978300743C020004A49800DAEB -:10800000960F00022418FFBF25EE2401A48E00AEB7 -:108010008E0D0004ACAD00448E0C0008ACAC0040EA -:10802000A4A00050A4A000548E0B000C240C00301F -:10803000AC8B00288E060010AC860024A480003E85 -:10804000A487004EA4870050A483003CAD42007476 -:10805000AC8800C8ACA80060A08700EC909F00C46A -:1080600033F9007FA09900C4909000C402187824CE -:10807000A08F00C4914E007C35CD0001A14D007C45 -:10808000938B0080AD480070AC8C00CCA08B00C6F8 -:108090008F88006C8F870068AC8800B4AC8700B80C -:1080A000A5400078A540007A8FBF00148FB0001063 -:1080B0000120102103E0000827BD00188F850078FB -:1080C0000E0006668F8600640A000D3A240900023D -:1080D00027BDFFE0AFB000108F90003CAFB100149F -:1080E000AFBF00188E0900040E00048B000921C0E8 -:1080F0008E0800048F84FF408F82FF48000839C03B -:108100003C068000ACC70020948500DA9043001341 -:108110001460001C30B1FFFF8F8CFF44918B00086E -:10812000316A00401540000B000000008E0D000475 -:10813000022030218FBF00188FB100148FB00010C3 -:108140002404002200003821000D29C00A000BD4AD -:1081500027BD00200E000061000000008E0D00040D -:10816000022030218FBF00188FB100148FB0001093 -:108170002404002200003821000D29C00A000BD47D -:1081800027BD00200E000059000000008E0D0004E5 -:10819000022030218FBF00188FB100148FB0001063 -:1081A0002404002200003821000D29C00A000BD44D -:1081B00027BD002027BDFFE0AFB200183092FFFFBF -:1081C000AFB00010AFBF001CAFB100141240001ED2 -:1081D000000080218F86003C8CC50000240300062F -:1081E00000053F020005140230E400071483001666 -:1081F000304500FF2CA80006110000400005588003 -:108200003C0C0800258C54EC016C50218D49000079 -:1082100001200008000000008F8E007C240D00016A -:1082200011CD005024020002AF82007C260900011B -:108230003130FFFF24C800200212202B0100302122 -:108240001480FFE5AF88003C020010218FBF001CA6 -:108250008FB200188FB100148FB0001003E0000837 -:1082600027BD00209387006254E0003400003021D5 -:108270000E000C82000000008F86003C0A000D9A60 -:10828000240200018F87007C2405000210E50031E4 -:1082900024040013000028210000302124070001DD -:1082A0000E000BD4000000000A000D9B8F86003CDE -:1082B0008F83007C240200021462FFF62404001263 -:1082C0000E000C37000000008F8500780040302140 -:1082D000240400120E000BD4000038210A000D9B6C -:1082E0008F86003C8F83007C2411000310710029CD -:1082F000241F0002107FFFCE260900012404001075 -:1083000000002821000030210A000DB824070001D8 -:108310008F91007C240600021626FFF92404001029 -:108320000E000CDC00000000144000238F98003C7D -:108330008F86003C0A000D9A2402000324040014D6 -:108340000E000BD4000028218F86003C0A000D9AF5 -:10835000240200020E000D44000000000A000D9BE4 -:108360008F86003C0E000BE4000000002419000280 -:1083700024040014000028210000302100003821CE -:10838000AF99007C0E000BD4000000000A000D9B8A -:108390008F86003C0E000BF4000000008F850078F3 -:1083A000241900020040302124040010000038216C -:1083B0000A000DF1AF99007C004038212404001020 -:1083C000970F0002000028210E000BD431E6FFFFBA -:1083D0008F86003C0A000D9BAF91007C8F84FF4488 -:1083E0003C077FFF34E6FFFF8C8500182402000164 -:1083F00000A61824AC83001803E00008A082000542 -:108400003084FFFF30A5FFFF108000070000182117 -:108410003082000110400002000420420065182153 -:108420001480FFFB0005284003E0000800601021D5 -:1084300010C00007000000008CA2000024C6FFFF4F -:1084400024A50004AC82000014C0FFFB24840004B7 -:1084500003E000080000000010A0000824A3FFFFB4 -:10846000AC86000000000000000000002402FFFFB6 -:108470002463FFFF1462FFFA2484000403E0000871 -:1084800000000000000411C003E000082442024084 -:1084900027BDFFE8AFB0001000808021AFBF0014FF -:1084A0000E000E3100A0202100504821240AFF8038 -:1084B0008FBF00148FB00010012A30243127007FB5 -:1084C0003C08800A3C04210000E8102100C4282553 -:1084D0003C03800027BD0018AC650024AF8200205B -:1084E000AC400000AC65002403E00008AC40004054 -:1084F0003C0D08008DAD005800056180240AFF8006 -:1085000001A45821016C4821012A30243127007F21 -:108510003C08800C3C04210000E8102100C4282500 -:108520003C038000AC650028AF82001C03E000081B -:10853000AC40002430A5FFFF3C0680008CC201B88F -:108540000440FFFE3C08601500A838253C031000DD -:10855000ACC40180ACC00184ACC7018803E0000852 -:10856000ACC301B83C0D08008DAD0058000561801A -:10857000240AFF8001A45821016C4021010A4824EB -:10858000000931403107007F00C728253C04200046 -:1085900000A418253C028000AC43083003E000082A -:1085A000AF80001C27BDFFE8AFB000100080802125 -:1085B000AFBF00140E000E3100A020210050482152 -:1085C000240BFF80012B5024000A39403128007F02 -:1085D0003C0620008FBF00148FB0001000E8282553 -:1085E00034C2000100A218253C04800027BD0018F9 -:1085F000AC83083003E00008AF8000203C05800811 -:108600008CA700603C0680080087102B14400011E6 -:108610002C8340008CA800602D0340001060000FE8 -:10862000240340008CC900600089282B14A000029C -:10863000008018218CC3006000035A42000B308078 -:108640003C0A0800254A554000CA202103E00008E2 -:108650008C8200001460FFF32403400000035A42A0 -:10866000000B30803C0A0800254A554000CA2021F2 -:1086700003E000088C8200003C05800890A60008FA -:108680009384009024C20001304200FF3043007FF9 -:108690001064000C00023827A0A200083C048000EF -:1086A0008C85017804A0FFFE8F8A008824090002CF -:1086B0003C081000AC8A0140A089014403E0000896 -:1086C000AC8801780A000EB630E2008027BDFFC8F2 -:1086D0003C05800834A40080AFBF0034AFBE00303A -:1086E000AFB7002CAFB60028AFB50024AFB4002060 -:1086F000AFB3001CAFB20018AFB10014AFB00010A0 -:10870000948300789482007A104300CD2405FFFF03 -:108710003C1E80080080B8210A000F923C168000A1 -:10872000108A00C88FBF00348F8400883C0B08007B -:108730008D6B005C240AFF803C07800E01644021A1 -:10874000010A4824AEC9002C96E6007A3102007F67 -:108750000047182130C57FFF000580400203A82193 -:1087600096BF00003C1908008F390058240FFF8085 -:1087700033F53FFF032488210015C1800238902182 -:10878000024F58243C0C0100016C5025324E007FF2 -:108790003C0D800C01CD9021028028210E000E346A -:1087A000AECA00288E4800108E4900308F86002007 -:1087B0002402000201093823AE470010A0C20000C5 -:1087C00096E3005C8E4400308F9100200E000E8FE7 -:1087D0003070FFFF00022B800205C8253C1F4200BD -:1087E000033FC025AE3800048E5100048F8700205F -:1087F0008E4F000024080008ACF1001CACEF0018FC -:10880000ACE0000CACE000109250000A2406000519 -:108810002405C000320E00FFA4EE0014964D00089F -:1088200002E09821A4ED0016924C000A3C0D80084D -:10883000318B00FFA4EB00209644000835AC01000A -:10884000A4E40022ACE00024924A000B314900FF6E -:10885000A4E90002A0E800018E4200308F830020CE -:108860002408FFBFAC620008A06600308F8E002095 -:108870002403FFDF95DF003203E5C8240335C0255C -:10888000A5D8003291D10032322F003F35F00040A0 -:10889000A1D000328F890020AD2000348D8B00C024 -:1088A000AD2B00389124003C3C0B7FFF308A007FC9 -:1088B000A12A003C8F8600203564FFFF90C7003C52 -:1088C00000E81024A0C2003C8F9900209325003CB2 -:1088D00000A3F824A33F003C8E5800348F8C002066 -:1088E000AD9800408E4F002C8E51003001F1802356 -:1088F000AD900044918E004831CD007FA18D00489D -:108900008F8500208E4A00308CA900480144402405 -:108910000136382400E83025ACA600489242000A0F -:10892000A0A2004C964300088F9F0020A7E3004EB2 -:108930008E5000308E4400300E0002F08FC5006073 -:1089400092F1007C0002C1400002C90003197821A5 -:10895000322E00020040282111C00003020F8021A6 -:108960000002208002048021926D007C31AC000462 -:108970001180000200057080020E80218E440030BC -:108980008F87002024058000308B0003000B5023CC -:108990003149000302094021ACE800349664007AB2 -:1089A0009662007A9670007A30467FFF24C30001F9 -:1089B000307F7FFF0205C824033FC025A678007AD8 -:1089C0009671007A3C1208008E520060322F7FFFB1 -:1089D00011F20028000000008F8400880E000E694C -:1089E00002A028218F8400880E000E7902802821A1 -:1089F0000E000EAE0000000096F3007896F4007AA8 -:108A00001293000F000028213C0980083524010042 -:108A100093C80008908700C53114007F30E400FF40 -:108A20000284302B14C0FF3E268A0001938D0090F3 -:108A3000268B0001008D6021158BFF3C8F84008800 -:108A40008FBF00348FBE00308FB7002C8FB6002848 -:108A50008FB500248FB400208FB3001C8FB2001894 -:108A60008FB100148FB0001000A0102103E00008A7 -:108A700027BD0038967F007A03E5C824A679007ADE -:108A80009278007A926E007A331100FF001179C259 -:108A9000000F9027001269C031CC007F018D28257E -:108AA000A265007A0A000F878F8400883C0380004B -:108AB0003084FFFF30A5FFFFAC640018AC65001CDC -:108AC00003E000088C62001427BDFFA83C06800864 -:108AD000AFBF0054AFBE0050AFB7004CAFB60048B8 -:108AE000AFB50044AFB40040AFB3003CAFB2003804 -:108AF000AFB10034AFB0003034C80100910500C5FB -:108B000090C700083084FFFF30A500FF30E2007FEF -:108B10000045182AAFA40010A7A000181060009C00 -:108B2000AFA0001490CA00083149007F00A930238B -:108B300024D4FFFF0014882B8FB300100013902B58 -:108B400002328024520000858FB400143C03800858 -:108B500094790052947E00508FB60010033EC023DB -:108B60000018BC00001714030016FC0002C2A82A5B -:108B700016A00002001F2C030040282100143C0016 -:108B80000007240300A4102A5440000100A0202163 -:108B90002885000914A000020080B02124160008D6 -:108BA0003C0C80088D860048001659808D88004C4A -:108BB0003C0380003169FFFF3C0A0010012A202598 -:108BC00034700400AC660038AF90008CAC68003C98 -:108BD000AC64003000000000000000000000000055 -:108BE0000000000000000000000000000000000085 -:108BF000000000008C6E000031CD002011A0FFFDB0 -:108C00000016902A0251782411E000360000B821A5 -:108C10003C1580003C118008922200088EA40100BF -:108C200000008821305E007F0E000E3403C0282132 -:108C30008E1F00108EA4010033F93FFF032028216E -:108C40000E000E4CAFB9001C921800003302003F1A -:108C50002C5300085260000D000080212405000103 -:108C6000004518043067005D14E000B18F92008C5D -:108C7000306400021480014D8F86008C30680080C3 -:108C80005500004A96180012000080218EA40100B1 -:108C90000E000E698FA5001C8EA401000E000E7937 -:108CA00003C028211200004F3C07800826E4000181 -:108CB0008F8C008C0004BC000291A0230017BC0321 -:108CC00002F6302A0014882B259F00402412000150 -:108CD00000D1F02403E08021AF9F008C17C0FFCDAE -:108CE000AFB200143C07800894E800508FB3001026 -:108CF0003C05800002E810213C0D0020A4E2005059 -:108D0000ACAD003094F5005094F600520277502339 -:108D10003149FFFF12D50041AFA900108CF6004C7D -:108D2000001749808CF7004802C9F8210000202173 -:108D300003E9302B02E4602101868021ACFF004C66 -:108D4000ACF000488FB300100013902B0232802447 -:108D50001600FF7F3C0380088FB400148FBF0054BF -:108D60008FBE00503A8200018FB7004C8FB600488A -:108D70008FB500448FB400408FB3003C8FB20038F1 -:108D80008FB100348FB0003003E0000827BD0058D9 -:108D900090CF0008938C009031EE007F00AE6823E6 -:108DA000018D58210A000FDD2574FFFF8F84008894 -:108DB00024100001A7B800180E000E5D97A500183A -:108DC0008EA401000E000E698FA5001C8EA4010068 -:108DD0000E000E7903C028211600FFB526E400011D -:108DE0003C07800894E800508FB300103C058000D9 -:108DF00002E810213C0D0020A4E20050ACAD003090 -:108E000094F5005094F60052027750233149FFFF49 -:108E10000014882B16D5FFC1AFA9001094FE005492 -:108E20008CF0004433D8FFFE001878C0020F702188 -:108E3000ACAE003C8CF900448CA3003C03235823C7 -:108E4000196002EA000000008CF200402642000196 -:108E5000ACA200383C05005034A700103C03800051 -:108E6000AC670030000000000000000000000000BF -:108E700000000000000000000000000000000000F2 -:108E8000000000008C7F000033E6002010C0FFFDD2 -:108E90003C108008960D00543C1780003C0680086A -:108EA00031B30001001350C00157B0218EC9040036 -:108EB0003C0708008CE700443C040020ACC9004893 -:108EC0008ED50404240C0001ACD5004C10EC02D06B -:108ED000AEE40030961800523C0508008CA5004016 -:108EE00000B87821A60F0052960E005425C3000149 -:108EF000A6030054961900543324FFFF5487FF0F34 -:108F00008FB3001030A5FFFF0E000FBBA60000546A -:108F10003C0508008CA50024961200520045382319 -:108F20000247F023A61E00520A000FDF8FB3001085 -:108F30008F93001C3C0700808E4400283C1FFFEFED -:108F400037F9FFFFAE6400008E420024A260000AE1 -:108F50003C0FFF9FAE6200049245002C35EEFFFFF0 -:108F60003C0C0040A265000C8E71000CA265000B49 -:108F70003C0600FF0227C0250319682401AE5824CF -:108F8000016C5025AE6A000C8E490004AE600018DA -:108F900034D0FFFFAE6900148E48002C8F82008809 -:108FA000A660000801102024AE6400108E51000855 -:108FB00096470012AE7100208E58000C30E33FFF40 -:108FC00000032980AE7800248E4C001400A2F82102 -:108FD00030F90001AE6C00288E4B0018001F71C2E2 -:108FE00000197B80AE6B002C8E49001C01CF6821DC -:108FF000A66D001CAE690030964A00028E46002025 -:10900000A66A001EAE66003492430033307000043E -:1090100056000006924B00003C06800834D0010048 -:109020008E0800C0AE680030924B00008F8A00208E -:10903000A14B0030924900333123000250600007F9 -:10904000924400018F8C0020240FFF80918E00300D -:1090500001CF6825A18D0030924400018F8200204D -:109060002418FFBF240AFFDFA04400318F9900209D -:109070003C088008350400809331003C323F007F7B -:10908000A33F003C8F8D002091AF003C01F870247D -:10909000A1AE003C8F8700208E6C001490E3003C52 -:1090A0002D8B0001000B4940006A302400C9802547 -:1090B000A0F0003C964500128F870020A4E5003206 -:1090C0008E450004909F007C30A20003000288239C -:1090D0003239000300B9102133F8000217000002F2 -:1090E00024440034244400303C038008346600806B -:1090F00090C9007C00A980243208000415000002F9 -:1091000024830004008018218F840020240800029A -:10911000ACE30034A08800009242003F8F9F002003 -:109120003C188008370F0080A3E200018F910020D7 -:109130009259003F8E440004A639000295EE005C6F -:109140000E000E8F31D0FFFF00026B80020D5825FC -:109150003C0C4200016C2825AE2500048E4A0038E4 -:109160008F850020ACAA00188E470034ACA7001CE5 -:10917000ACA0000CACA00010A4A00014A4A0001689 -:10918000A4A00020A4A00022ACA000248E620014A1 -:109190005040000124020001ACA200080E000EAEF7 -:1091A000241100010A0010332410000190D30001A3 -:1091B000327200201240018A241000013C0A80080B -:1091C0003547008090E3007C8F93001CAFA0002403 -:1091D0003069000111200011AFB000203C0580086B -:1091E0008CCB00148CAC0060016C882B1620000323 -:1091F000016028213C1080088E0500603C0F80082B -:1092000035E300808C6E007000AE682B15A0000264 -:1092100000A020218C640070AFA400248F82FF4C3A -:109220008CC400148C5900700099C02B53000001AD -:109230008C4400708FA200240082F82313E0000306 -:10924000AFBF002824040002AFA400208FB200208A -:109250000292402B1500015B000018218CC50038DC -:109260008E6B000C3C0C0080AE6500008CC9003495 -:109270003C11FF9F016C5025AE69000490C8003F6F -:109280003623FFFF014310243C1200203C04FFEF73 -:10929000A268000B00523825349FFFFF00FFC02456 -:1092A0003C1900088F87008C03197825AE6F000CDD -:1092B0008CED0014AE6000188FB10024AE6D001468 -:1092C0008CF000188FAE0028AE70001C8CE50008F2 -:1092D000022E6021AE6500248CEB000CA6600038E5 -:1092E000A660003AAE6C002CAE600028AE6B002089 -:1092F0008CEA00148FA30028015148230123302356 -:1093000010C00011AE66001090E9003D8E620004AE -:109310008E7F00000009910000527821000020217A -:1093200001F2C82B03E4C02103197021AE6F0004C1 -:10933000AE6E000090ED003DA26D000A8F90008C93 -:1093400096060006A66600088F98002024190002E1 -:109350003C0F80088FA4002435EE0080A319000084 -:1093600095CD005C8F9200200E000E8F31B0FFFF74 -:1093700000022B80020560253C0642008F85008C90 -:1093800001865825AE4B00048F8400208CB1003834 -:10939000AC9100188CA30034AC83001CAC80000C92 -:1093A000AC800010A4800014A4800016A4800020CB -:1093B000A4800022AC80002490AA003F8FA7002444 -:1093C000A48A000210E0000C240900018FBF0028CD -:1093D00053E0018890A2003D90A2003E2448000185 -:1093E000A08800018F8500208FA40024ACA4000871 -:1093F0000A0012133C118008A08900018F8500200B -:1094000024020001ACA200083C1180083623008031 -:10941000906A007C3147000214E000022406003408 -:10942000240600308F8D008C3C0F800835EE0080C4 -:1094300091AC000091C8007C8FB00024A0AC00303B -:109440008F91008C8F8200208FAA00249227000128 -:1094500032120003240B0004A047003101721823CC -:109460008F84008C8F8B0020241FC00094980012E2 -:109470009579003230690003330F3FFF033F7024BA -:1094800001CF6825A56D00329165003200CA3021F8 -:1094900000C9302130B0003F360C0040A16C0032D2 -:1094A0008FB2002431070004124000028F85002093 -:1094B00000C730213C048008ACA600343488010089 -:1094C0008D1900C08FBF0024240DFFBFACB9003838 -:1094D00090AF003C2FF800012412FFDF31EE007F37 -:1094E000A0AE003C8F8B0020001889409170003C9A -:1094F000020D6024A16C003C8F87002090E3003CAB -:109500000072502401511025A0E2003C8F88008C8D -:109510008F9900208D090020AF2900408D0600247E -:10952000AF2600448D040028AF2400488D1F002C76 -:10953000AF3F004C0E000EAE000000008FB80020C0 -:10954000240500025705009F8FA300203C1F8000C8 -:109550003C1280088FE40100925800088F92FF4C63 -:109560000E000E343305007F8F8E00208FAF002059 -:109570008FA40028A1CF00009659005C8F91002095 -:109580000E000E8F3330FFFF00025B80020B682558 -:109590003C0842008F8B008C01A83025AE260004C9 -:1095A0008D7000388F8600200000282100051100F2 -:1095B000ACD000188D6C00343C047FFF3488FFFF72 -:1095C000ACCC001C9171003E8CCA001C8CDF0018D2 -:1095D0000011390000111F02014770210043482586 -:1095E00001C7C02B03E9782101F8C821ACCE001CCB -:1095F000ACD90018ACC0000CACC00010916D003E9E -:109600008FAA002824070005A4CD0014957000043B -:109610002418C0000148C824A4D00016916C003E54 -:1096200001402021A4CC002095650004A4C500229F -:10963000ACC000249163003FA4C300029171003DBF -:1096400026220001A0C200018F8900203C02800870 -:1096500034460100AD2A0008A12700308F91002078 -:109660008F9F008C2402FF80962F003297EE00120D -:10967000030F802431CD3FFF020D6025A62C003260 -:10968000922500322418FFBF2410FFDF30AB003FCB -:1096900035630040A22300328F9F00202403FFFF88 -:1096A000AFE000348CCA00C0AFEA003893E7003C5A -:1096B00030E9007FA3E9003C8F8D00203C09800049 -:1096C00091AF003C01F87024A1AE003C8F8B0020CC -:1096D000916C003C01902824A165003C8F870020FC -:1096E000ACE300408FB100243C038008ACF100449F -:1096F00090EA004801423025A0E600488F90002003 -:109700008F8E008C8E1F004803E9C0240319782532 -:10971000AE0F004891CD003EA20D004C8F8C008C06 -:109720008F8B002095850004A565004E0E0002F089 -:109730008C650060924A007C004028218FA600289A -:109740000002114000058900005138213149000212 -:109750001120000300C71821000520800064182193 -:109760003C028008344A00809147007C30E90004C4 -:10977000112000038FB9002800056080006C1821BB -:10978000240B00048F91002033300003017040232C -:10979000310D0003006D3021AE2600343C038008FB -:1097A000A66500383C0580008CA401009073000879 -:1097B0000E000E793265007F0E000EAE0000000034 -:1097C0008FA300200003782B000F80230290A02499 -:1097D00000608021006088210A0010330010802B77 -:1097E0008F91001C8CD8003824190003A620000893 -:1097F000AE3800008CCF0034A220000A8F8E008C7F -:10980000AE2F00043C05008091CB003FA239000C34 -:109810008E28000C3C0DFF9FA22B000B010510258C -:1098200035A3FFFF3C13FFEF8F8E008C00433824DD -:10983000366AFFFF00EA4824AE29000C8DC40014EC -:1098400095D800128F860088AE2400108DCC0014AD -:10985000AE200018AE200020AE2C0014AE20002454 -:109860008DDF0018330C3FFF000C9180AE3F0028C5 -:109870008DCF00080246C821330B0001AE2F003007 -:109880008DC3000C8F930020001941C2000B2B8068 -:1098900001056821240200023C0A8008A62D001C54 -:1098A000A6200034AE23002C35470080A2620000C1 -:1098B00094E9005C8F9900203C044200313FFFFF97 -:1098C00003E43025AF2600048F98008C240E00019D -:1098D0002402C0008F12003824060034AF32001872 -:1098E0008F0F00343C12800836580080AF2F001CC8 -:1098F000AF20000CAF200010A7200014A7200016F6 -:10990000A7200020A7200022AF200024A7300002BB -:10991000A32E00018F8D00208F8B008CADB000082E -:1099200091680000A1A800308F91008C8F830020E7 -:1099300092250001A06500318F9F002097F300322F -:1099400002625024014C3825A7E7003293E9003227 -:109950003124003FA3E40032930F007C31EE00027B -:1099600015C000028F840020240600303C0E8008C1 -:10997000AC86003435D101008E3900C02403FFBF0E -:1099800002008821AC990038908B003C0010802B9D -:109990003165007FA085003C8F8D002091A8003CA0 -:1099A00001031024A1A2003C8F87002090F3003C0B -:1099B000366A0020A0EA003C8F9F008C8F92002026 -:1099C0008FE90020AE4900408FE40024AE440044FB -:1099D0008FEC0028AE4C00488FE6002C0E000EAE37 -:1099E000AE46004C0A001033000000000A0010A42C -:1099F0008CE2004024480001A08800018F850020EF -:109A00008FA40024ACA400080A0012133C118008A3 -:109A100094CB00523C0808008D080024010B102153 -:109A2000A4C200520A000FDF8FB3001027BDFFE071 -:109A30003C0D8008AFB20018AFB00010AFBF001CE3 -:109A4000AFB1001435B200808E4C001835A801006B -:109A5000964B000695A70050910900EC000C5602A9 -:109A6000016728233143007F312600FF24020003D1 -:109A7000A3830090AF84008810C2001B30B0FFFFAA -:109A8000910600EC2412000530C200FF1052003392 -:109A900000000000160000098FBF001C8FB20018E4 -:109AA0008FB100148FB00010240D0C003C0C80000E -:109AB00027BD002003E00008AD8D00240E000FC27A -:109AC000020020218FBF001C8FB200188FB100143C -:109AD0008FB00010240D0C003C0C800027BD00202E -:109AE00003E00008AD8D0024965800789651007A66 -:109AF000924E007D0238782631E8FFFF31C400C065 -:109B0000148000092D11000116000037000000002C -:109B10005620FFE28FBF001C0E000EC300000000A5 -:109B20000A0013B78FBF001C1620FFDA00000000E8 -:109B30000E000EC3000000001440FFD88FBF001CB1 -:109B40001600002200000000925F007D33E2003F1B -:109B5000A242007D0A0013B78FBF001C950900DAEE -:109B60008F86006400802821240400050E0006660C -:109B70003130FFFF978300763C0480002465FFFFAF -:109B8000A78500768C8A01B80540FFFE0000000022 -:109B9000AC8001808FBF001CAC9001848FB2001894 -:109BA0008FB100148FB000103C0760133C0B100005 -:109BB000240D0C003C0C800027BD0020AC870188E0 -:109BC000AC8B01B803E00008AD8D00240E000FC27D -:109BD000020020215040FFB18FBF001C925F007D2A -:109BE0000A0013E433E2003F0E000FC202002021FE -:109BF0001440FFAA8FBF001C1220000700000000C5 -:109C00009259007D3330003F36020040A242007D71 -:109C10000A0013B78FBF001C0E000EC30000000027 -:109C20005040FF9E8FBF001C9259007D3330003F93 -:109C30000A00141336020040000411C003E00008BB -:109C4000244202403C050006008510253C038000AC -:109C5000AC620030000000000000000000000000C6 -:109C60003C0580008CA7000030E6001010C0FFFD0E -:109C7000000000008CAB003C8CAA003C0164482131 -:109C8000012A402B110000043C0680008CAD0038F6 -:109C900025AC0001ACAC00388CCF003C01E4702155 -:109CA00003E00008ACCE003C27BDFFD0AFB20018E7 -:109CB000AFB00010AFBF0028AFB50024AFB4002094 -:109CC000AFB3001CAFB1001400A0902114A000128B -:109CD000008080218F8200240002188014600037E9 -:109CE000240400100E001421000000008FBF002883 -:109CF0008FB500248FB400208FB3001C8FB20018E2 -:109D00008FB100148FB000100000102127BD00306B -:109D100003E00008AF80002410A0001E000088218E -:109D20003C138000241400200A0014603C15000538 -:109D3000263100040232502B11400017024010213E -:109D40008F8800248E0700002404008000084880CB -:109D50000133182125060001AC6704002610000419 -:109D600014D4FFF3AF8600240E001421000000007D -:109D7000AE75003000000000000000000000000090 -:109D800000000000263100040232502B1540FFEC89 -:109D9000AF800024024010218FBF00288FB500241F -:109DA0008FB400208FB3001C8FB200188FB1001445 -:109DB0008FB0001003E0000827BD0030000320230F -:109DC0003085000F0A0014490065202127BDFFD807 -:109DD0003C03800000A03821AC670038AFB100140C -:109DE000AC66003C008088213C060022AC66003056 -:109DF000AFB00010AC7100283C10800C3C04800C0B -:109E000024050070AFBF0024AFB40020AFB3001C26 -:109E10000E00143AAFB20018260400800E00143A67 -:109E200024050080260401000E00143A240500F0E9 -:109E30003C0208008C4200641040001300008021A6 -:109E40003C1480002413FF803C12800C0E00141E72 -:109E50000200202100514821312A007F0133402493 -:109E60000152202124050050AE8800280E00143A2B -:109E7000261000013C0508008CA500640205202B7B -:109E80001480FFF2000000003C0608008CC6006051 -:109E900010C00015000080213C1480002413FF80B6 -:109EA0003C12800C3C1908008F3900580010C1800A -:109EB000240500400331782101F8682131AE007F8C -:109EC00001B3602401D22021AE8C00280E00143A88 -:109ED000261000013C0608008CC600600206582BC4 -:109EE0001560FFF0000000003C1008008E10005CC0 -:109EF0002414FF803C1F800C0211982102749024CE -:109F00003262007F3C118000005F2021AE320028C9 -:109F10000E00143A000628408FBF00248FB40020A2 -:109F20008FB3001C8FB200188FB100148FB00010D7 -:109F300000002021000028210A00143A27BD002833 -:109F40008F83003C8C62000410400003000000007E -:109F500003E00008000000008C6400108C6500081D -:089F60000A0014838C66000C5A -:089F6800000000000000001BD6 -:109F70000000000F0000000A0000000800000006BA -:109F800000000005000000050000000400000004BF -:109F900000000003000000030000000300000003B5 -:109FA00000000003000000020000000200000002A8 -:109FB0000000000200000002000000020000000299 -:109FC0000000000200000002000000020000000289 -:109FD0000000000200000002000000020000000279 -:0C9FE00000000001000000010000000172 -:049FEC0080080100E8 -:109FF0008008008080080000080017900800179073 -:10A00000080017C8080017C8080017DC080017ACBC -:10A0100008001A04080019D008001A5C08001A5C2D -:10A0200008001AE408001A148008024008002154AD -:10A0300008001FA00800217C0800221408002364E7 -:10A04000080023B0080024D4080023DC08002460A2 -:10A0500008002010080029880800292C08001FBCCF -:10A0600008001FBC08001FBC080025480800254840 -:10A0700008001FBC08001FBC0800280408001FBC03 -:10A0800008001FBC08001FBC08001FBC0800286493 -:10A0900008001FBC08001FBC08001FBC08001FBC34 -:10A0A00008001FBC08001FBC08001FBC08001FBC24 -:10A0B00008001FBC08001FBC08001FBC08001FBC14 -:10A0C00008001FBC08001FBC080023D008001FBCEC -:10A0D00008001FBC080028D408001FBC08001FBCD3 -:10A0E00008001FBC08001FBC08001FBC08001FBCE4 -:10A0F00008001FBC08001FBC08001FBC08001FBCD4 -:10A1000008001FBC08001FBC08001FBC08001FBCC3 -:10A1100008001FBC08001FBC08001FBC080027283F -:10A1200008001FBC08001FBC08002690080025EC92 -:10A130000800375008003724080036F0080036C4FD -:10A14000080036A408003658800801008008008006 -:08A15000800800008008008077 -:08A158000A000C760000000073 -:10A16000000000000000000D727870342E362E3191 -:10A17000360000000406100300000000000000018B -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D330000000000010000003000000000000000DCD -:10D340000000000D3C02080024427A603C03080003 -:10D3500024637AD8AC4000000043202B1480FFFDEA -:10D36000244200043C1D080037BD9FFC03A0F021AF -:10D370003C100800261031D83C1C0800279C7A601D -:10D380000E001253000000000000000D3C0280005F -:10D3900030A5FFFF30C600FF344301803C08800009 -:10D3A0008D0901B80520FFFE00000000AC640000FC -:10D3B00024040002A4650008A066000AA064000B13 -:10D3C000AC6700183C03100003E00008AD0301B88F -:10D3D0003C0560008CA24FF80440FFFE00000000F6 -:10D3E000ACA44FC03C0310003C040200ACA44FC4EA -:10D3F00003E00008ACA34FF827BDFFE8AFBF00145F -:10D40000AFB000100E0012A5008080213C048008FF -:10D410003485008090A600052403FFFE0200202131 -:10D4200000C310248FBF00148FB00010A0A200050D -:10D430000A0012AF27BD001827BDFFE8AFB00010EB -:10D44000AFBF00140E000ED6008080213C0680087D -:10D4500034C5008090A4000024020050308300FFF7 -:10D46000106200073C098000020020218FBF0014D9 -:10D470008FB00010AD2001800A000FC527BD001835 -:10D48000240801003C078000020020218FBF001407 -:10D490008FB00010ACE801800A000FC527BD00184E -:10D4A00027BDFF883C088008AFBE0070AFB600689B -:10D4B000AFB40060AFB00050AFBF0074AFB7006C46 -:10D4C000AFB50064AFB3005CAFB20058AFB1005469 -:10D4D000350500803C0780008CF1012890A40009EC -:10D4E000ACE0008490A60005309000FF0000A02171 -:10D4F00000061827306200010000B02114400067C8 -:10D500000000F02190A9000024050020312400FF34 -:10D5100010850016240A0050108A008D00000000BB -:10D520003C0C08008D8C00DC258B00013C010800C0 -:10D53000AC2B00DC0E00139B000000008FBF0074BA -:10D540008FBE00708FB7006C8FB600688FB5006417 -:10D550008FB400608FB3005C8FB200588FB100545D -:10D560008FB0005003E0000827BD00780000000DD8 -:10D570003C158000AFA0003096A201168EB90104C0 -:10D580003C1F002036B20C00033FC0240018B82B0B -:10D5900000173140AFA600308EAE01043053FFFFBC -:10D5A0003C0F00400272382101CF682490F2000D38 -:10D5B00011A0004834C4004032430020146000022F -:10D5C000348600800080302114C00094AFA6003063 -:10D5D0003C0980083525008090A8000831060040ED -:10D5E00050C000063C088008240A0004120A00A368 -:10D5F000240B0012120B00293C088008351501008D -:10D600003C17800096F3011A94EE000E92AF0008CA -:10D61000324C00043275FFFF01EE6804AFAD003CF0 -:10D620008CF30004118000318CF700083503008072 -:10D63000907800083307004014E000280000000044 -:10D640008C72005002728823062000063C0680007F -:10D650008C7F0034027FC823072200848E8200085A -:10D660003C068000ACC00044240200018FBF00745F -:10D670008FBE00708FB7006C8FB600688FB50064E6 -:10D680008FB400608FB3005C8FB200588FB100542C -:10D690008FB0005003E0000827BD00780E000CB8E2 -:10D6A000000020218FBF00748FBE00708FB7006C08 -:10D6B0008FB600688FB500648FB400608FB3005CD4 -:10D6C0008FB200588FB100548FB0005003E00008B3 -:10D6D00027BD00780A000D1800C020210E00146C30 -:10D6E000026020211440FFDF3C0680003C038008DC -:10D6F000346300808C6400340264102304400018FA -:10D70000000000003C1408008E94310026900001B7 -:10D710003C010800AC3031000E0012A5022020218F -:10D720003C048008349F008093FE002502202021C5 -:10D7300037C90004A3E900250E0012AF0000000065 -:10D740000E000C9E022020210A000D45240200013B -:10D750003C14080026947AC80A000D073C15800086 -:10D760008C6800300268302318C00008240B000CBD -:10D770003C0908008D293100325200FC0000A8212C -:10D78000252500013C010800AC253100AFAB00307D -:10D790008C6A003001534023190000E002A8602A7F -:10D7A0001580FFDD0000000012A8002A02A87823DF -:10D7B0000268982131F5FFFF3247000210E0003483 -:10D7C000325900103C13800836700080921E000809 -:10D7D00033D6004052C000D38E82000802202021A0 -:10D7E0000E0012A524120018A212000992170005BB -:10D7F0002418FFFE0220202102F8A8240E0012AFF8 -:10D80000A215000524040039000028210E00144749 -:10D81000240600180A000D45240200019296000C0F -:10D820003C048008349E00808FC700380016A30097 -:10D830003690008130C600FF022020210E000C8DA2 -:10D840003205F0813C068000ACC000440A000D4562 -:10D85000240200013A4E000131CD000115A0FFAEB7 -:10D86000026898210A000D97000000000040F809A6 -:10D87000240400160A000D45240200010220202184 -:10D880000E00152900E028210A000CFA8FBF007451 -:10D890001320FF733C048008348900808D230038F6 -:10D8A0008C82000402E2F8231FE0FF6E3C06800039 -:10D8B00002E3302304C200010060B821AFA80018C1 -:10D8C0003C198000AFB30010AFB5001497260120BB -:10D8D0008D2A00309524005C8FB8003C8FAD00305D -:10D8E0003087FFFF30DFFFFF03E87021372F400054 -:10D8F0000307282B8E82000401CF602101A5582543 -:10D90000AFA90048AFAC0020AFAA0028AFAB0030F1 -:10D91000AFAA0024AFA0002CAFB700340040F80934 -:10D9200027A400108FA8003031030002106000020D -:10D930008FA90048325200FE912300083069004050 -:10D94000512000138FA400243C0280088C4800045E -:10D95000111700A4240A0014325800015300000CCF -:10D960008FA400242419000C121900C02A1F000DD6 -:10D9700013E000BA2406000E2404000A5204000139 -:10D98000241600088FA9002425240001AFA4002438 -:10D990003C188008370500808FA700148CAF00303A -:10D9A000340CFFFF00877021ACAE0030AFAF003801 -:10D9B00090AD004E8CAB00308FA8003C01AC100441 -:10D9C00001625021ACAA00348FA6003002E8202169 -:10D9D00030C300081060000BAFA400408CB90020D9 -:10D9E0001324008F30C600FF9289000C8FA70034EB -:10D9F00000098300360400803085F0800E000C8D15 -:10DA0000022020213C0A8008355000808E0300301F -:10DA10008FA800380068302318C00065262F0080CA -:10DA20003C0E08008DCE31982407FF8001E7682462 -:10DA300031EC007F3C0680003C02800431CB0010BA -:10DA4000ACCD00901160003B0182282190B8006BA2 -:10DA5000570000393C048008241F0001A0BF006B60 -:10DA600094C5007A24B9000AA61900123C0A80085D -:10DA70003545008090A800083110004016000004D1 -:10DA80003C038008324B00011560006B0000000071 -:10DA9000346400808C8C00208FB200401192000909 -:10DAA000346301008C6D0000026D102318400012D9 -:10DAB0008FB80040241E0001AC980020AC73000019 -:10DAC000AC77000416C0002D0000000017C000272E -:10DAD0000000000012A00005000018218FA50030F2 -:10DAE00030B5000452A0FE9500601021240300010F -:10DAF0000A000CF9006010218C6E000015D3FFF1B4 -:10DB0000000000008C67000402E7782305E1FFE9CC -:10DB10008FB800400A000E5B000000000A000D985C -:10DB2000000040210040F809240400170A000D45B8 -:10DB3000240200013C04800834900080241E00016F -:10DB4000022020210E0012A5A61E00129209002517 -:10DB500002202021241E0001352200010E0012AFF8 -:10DB6000A20200250A000E463C0A80080E000C9E08 -:10DB7000022020210A000E5F000000000E0012A506 -:10DB8000022020213C198008373700800220202104 -:10DB90000E0012AFA2F6000902C0302124040037A3 -:10DBA0000E001447000028210A000E5D000000004E -:10DBB0008FA6001858C0FFAE3C0A80080E0012A5C0 -:10DBC000022020219203002502202021241E000192 -:10DBD000346200040E0012AFA20200250A000E46B5 -:10DBE0003C0A8008120A00302A0B0015116000243C -:10DBF000240D0016240C000C560CFF58325800015E -:10DC00003C05800890AF001B2407FFBD2416000EC2 -:10DC100001E77024A0AE001B0A000E01325800017B -:10DC20003C1F800097E5011A50A0FF6F34C600101A -:10DC30000A000E259289000C8CB300308E960008E5 -:10DC4000240400182674000102C0F809ACB40030A6 -:10DC50008FB100300A000CF9322200041606FF4A88 -:10DC60008FA900240A000E0C241600102410000EA8 -:10DC700052D0FF44241600100A000E0B2416001682 -:10DC8000560DFF36325800013C05800890AF001B4E -:10DC90002407FFBD2416001001E77024A0AE001B6E -:10DCA0000A000E01325800010A000E00241600126C -:10DCB0003C0380008C6201B80440FFFE240408008D -:10DCC000AC6401B803E00008000000003C058008D7 -:10DCD00094A200483084FFFF1040001924840012F1 -:10DCE00094A900483C0380003128FFFF0104382A32 -:10DCF00010E0001334660180946D01208F8C0004C5 -:10DD0000240B001A31AAFFFF31834000A0CB000B87 -:10DD1000106000102544FFFE94AF004831EEFFFF75 -:10DD200001C4282B14A0000C8F98000CA4C400146C -:10DD30008F86000C34C2000103E00008AF82000CA3 -:10DD40003C0780002404000334E2018003E0000863 -:10DD5000A044000B8F98000C2419FFFE0319102417 -:10DD600003E00008AF82000C27BDFFD8AFB400204D -:10DD7000AFB3001CAFB20018AFB10014AFBF0024A6 -:10DD8000AFB000100080182130B3FFFF30D2FFFF8A -:10DD900030F4FFFF3C1180008E2201B80440FFFEEA -:10DDA00036300180AE030000024020210E000EDD5F -:10DDB000AE2300208F86000C8F8500048F83000027 -:10DDC00030C48000A613000CA612000EA605001099 -:10DDD000AE030028A61400081080000E3C0F80003F -:10DDE000962C0116318BFFFC256A00040151482155 -:10DDF0008D2840003107FFFF14E000072414BFFF07 -:10DE00003C0EFFFF35CD7FFF00CD3024AF86000CE8 -:10DE10003C0F80002414BFFF35F1018000D498240A -:10DE2000A63300268DF20104AE32002C3C06100011 -:10DE3000ADE601B88FBF00248FB400208FB3001C63 -:10DE40008FB200188FB100148FB0001003E00008EB -:10DE500027BD002827BDFFD8AFB100143C118000BA -:10DE600000804021AFB40020AFB0001030D4FFFFDD -:10DE70003630018002802021AE080000AE2800204C -:10DE8000AFB3001CAFB2001830F3FFFFAFBF0024E8 -:10DE90000E000EDD30B2FFFF8F85000C8F83000473 -:10DEA0002406BFFF00A62024A612000CA614000E14 -:10DEB000A6130008A6040026A60300103C021000CA -:10DEC000AE2201B88FBF00248FB400208FB3001C96 -:10DED0008FB200188FB100148FB0001003E000085B -:10DEE00027BD00283C028000344501803C048000AE -:10DEF0008C8301B80460FFFE240720002406000282 -:10DF0000A4A70008A0A6000BA4A000103C051000C8 -:10DF1000AC8501B803E00008000000003C0580006B -:10DF200034A400708C8A000090A601128F84000433 -:10DF300027BDFFF030C300FF0003188230820100CC -:10DF4000000038211040003924660003308740006B -:10DF500050E0003930882000000610800045C821BC -:10DF60008F2F40002478000400187080AFAF0000AD -:10DF700001C568218DAC4000AFAC000494AB011624 -:10DF80003169FFFC012540218D054000AFA5000847 -:10DF90008FA9000800003021000028213C0708005C -:10DFA00024E701000A000F9E2408000890420000A8 -:10DFB00024A500012CAD000C0062C8210019C0800E -:10DFC000030778218DEE000011A0000600CE302658 -:10DFD00003A5102114A8FFF500051A005520FFF431 -:10DFE000904200003C048000348700703C0508002B -:10DFF0008CA531048CE300002CA80020110000093E -:10E00000006A3823000558803C0C0800258C310834 -:10E01000016C482124AA0001AD2700003C01080042 -:10E02000AC2A3104AF8600002407000100E0102173 -:10E0300003E0000827BD00101100FFFC000038219C -:10E0400000066080018558218D6440002469000429 -:10E0500000093880AFA4000000E518218C6640005C -:10E06000AFA000080A000F8EAFA600043C02080013 -:10E070008C42003827BDFFD8AFB40020AFB20018E3 -:10E08000AFBF0024AFB3001CAFB10014AFB000109D -:10E090003C14080026940038144000022452FFFF6C -:10E0A000000090218F85000430A340001060000F15 -:10E0B00030A980003C06002000A620241080000B20 -:10E0C0008F87000C2408BFFF00A8282434E3100029 -:10E0D000AF85000430AF200015E0000A3C110004B9 -:10E0E0002413FFBF0A000FEF0073102415200062F5 -:10E0F0003C0B002030AF200011E0FFF98F83000CB3 -:10E100003C11000400B180241200FFF62413FFBF6D -:10E110003462004030B801001300000FAF82000CE1 -:10E120003C1F002000BFC824132000053C0A8000CB -:10E130003C03000400A31024104000C800000000AD -:10E140009549011E9548011C3126FFFF00083C003F -:10E1500000C72025AF8400003C0D800095AC010C69 -:10E1600030AB1000116000083186FFFF30AE002098 -:10E1700015C00006241100053C10100000B07824E2 -:10E1800015E000733C1F0C002411000130A20100B7 -:10E19000544000093C0C00018F83001454600006B9 -:10E1A0003C0C00018F87000C30E440001080009A86 -:10E1B0003C0A1F013C0C000100AC302414C0006C70 -:10E1C0003C1080008F84000C3093400012600006E9 -:10E1D0003C0310003C190F0000B9C0241300008B51 -:10E1E0003C1F80003C03100000A310241040002CB2 -:10E1F0003C0680003C0708008CE7003014E0007308 -:10E200003088400030A6010010C000983C0E0F007E -:10E2100000AE68243C0C020011AC00948F93000007 -:10E22000027280240214782191F4000426920004E2 -:10E23000001221C03C0E800095C6010E3627000258 -:10E2400024D400043286FFFF240500020E000F04D0 -:10E25000000000008FBF00248FB400208FB3001C8B -:10E260008FB200188FB100148FB000100000102181 -:10E2700003E0000827BD002800AB50241140FF9E9A -:10E2800030AF20008F8C000C3C0EFFFF35CD7FFFA0 -:10E2900000AD2824358380000A000FDFAF8500041D -:10E2A0008CD04000320F010011E0003C30B801007A -:10E2B0003C1008008E1000241300001432330004B8 -:10E2C0003C020F0000A2F8243C19020013F9000FD1 -:10E2D0008F83000094C9010E022038210072582457 -:10E2E0000174502191480004252400043086FFFF6A -:10E2F00025140004001421C0240500020E000F04A0 -:10E300002412FFFE021280243231FFFB2407000199 -:10E310001207006F3206000114C000903C0E80000E -:10E32000320F000411E000048F980004331008003D -:10E33000160000783C1F80005660FFC78FBF002486 -:10E340000E000F63000000000A0010408FBF002481 -:10E350003C190BFF00BFC0243733FFFF0278882B26 -:10E360005220FF8A241100010A00100D241100051B -:10E370003C0E08008DCE00D8960F010E24040080BC -:10E3800025CD000131E6FFFF240500023C01080015 -:10E39000AC2D00D80A00103D240700033C120800F1 -:10E3A0008E520024324200011040FFAB8FBF002488 -:10E3B00094C6010E362700020000202124D4000458 -:10E3C0003286FFFF0A00103D240500021100FF8E77 -:10E3D00030A601003C0B0F0000AB50243C090100AB -:10E3E000012A202B1480FF88000000003C058000DB -:10E3F00094A6010E362700022404008024D40004D1 -:10E400003286FFFF0A00103D2405000297E3011643 -:10E410000A0010243C03100000AA48243C08100005 -:10E420001528FF653C0C000130CB02001560FF632E -:10E4300000AC30243C1480009692010E3627000276 -:10E44000000020212645000430A6FFFF0E000F3FEC -:10E45000240500020A0010408FBF00240E000F7137 -:10E46000000000000A0010008F850004000000007A -:10E470003C0608008CC600D0000516023050000F84 -:10E4800038DF00012FF900012E03000C0323C02404 -:10E490001700FF68001021C02608FFFC2D070004AC -:10E4A00014E000073C0E800038CA00022D4900012C -:10E4B000012320245080000E000532423C0E8000D3 -:10E4C00095C6010E000020210A00103A36270002EE -:10E4D0003233000452600001363100023C0C8000EF -:10E4E0009586010E022038210A0010990000202193 -:10E4F0000010182B00C358241560000F3C05800045 -:10E50000001021C03C0E800095C6010E0A00103A92 -:10E510003627000297F9010E022038212404010059 -:10E52000273100043226FFFF0E000F0424050002ED -:10E530000A0010780000000094AD010E00002021B8 -:10E540002405000225AC00043186FFFF0E000F04F5 -:10E550003227FFFB0A0010EB001021C095C5010E09 -:10E56000022038210000202124AD000431A6FFFF45 -:10E570000E000F04240500020A0010723231FFFB66 -:10E580003C0580008CA701482403000434A60180C8 -:10E5900000072402308200FF104300103C0480007A -:10E5A0008C8901B80520FFFE000000008C8F014817 -:10E5B000240D00023C0A1000000F7402A4CE0008D3 -:10E5C000A0CD000B8C8C0148A4CC00108C8B014496 -:10E5D000ACCB002403E00008AC8A01B88CA4014055 -:10E5E0003C03800000C028218C6601B804C0FFFEF7 -:10E5F0002408001CACA40000A0A8000B3C051000DF -:10E60000AC6501B803E000080000000027BDFFE88A -:10E61000AFB00010AFBF00143C10600C8E0D500066 -:10E62000240EFF7F2406000301AE60243588380CD9 -:10E630003C058000AE085000ACA600083C01080074 -:10E64000AC2000200E001555000000003C086016AC -:10E650008D0A00003C0BFFFF3C0900103523805160 -:10E660003C046000014B38243C025353AE03537CFE -:10E67000348420203C05080024A579082406000ADB -:10E6800010E2000935037C008C7F007C8C790078D7 -:10E690008FB00010AF9F00108FBF001427BD00186F -:10E6A0000A0013B1AF9900088D0F00043C186000F8 -:10E6B0008FB0001001F818218C7F007C8C790078D5 -:10E6C000AF9F00108FBF001427BD00180A0013B1C0 -:10E6D000AF9900083C0480008C8340003402FFFFA7 -:10E6E0001062003A000000008C87400030E5010015 -:10E6F00010A00021000000009487010E3C020800D9 -:10E700008C4200EC9485010E3C0D08008DAD31CC9F -:10E7100030E3FFFF3C1808008F1800E83C090800B0 -:10E720008D2931C80043602130ABFFFF0183782B76 -:10E730000000C82101AB18210000502103197021ED -:10E74000006B302B012A402101CF2021010610212E -:10E750003C010800AC2C00EC3C010800AC2400E8B3 -:10E760003C010800AC2331CC3C010800AC2231C88C -:10E7700003E00008000000008C8840008F8C000837 -:10E78000110C00323C0D800095AB010E3C0A0800D4 -:10E790008D4A00E43C0808008D0800E03169FFFF65 -:10E7A000014928210000302100A9602B01063821F1 -:10E7B00000EC10213C010800AC2500E43C010800FD -:10E7C000AC2200E003E00008000000009483010E8A -:10E7D0009482010E3C1908008F3900F43C090800AE -:10E7E0008D2931CC3C0E08008DCE00F03C0808008D -:10E7F0008D0831C83078FFFF304BFFFF03382821E8 -:10E80000012B1821000078210000502100B8682B4E -:10E8100001CF6021006B302B010A3821018D2021AE -:10E8200000E610213C010800AC2500F43C01080082 -:10E83000AC2400F03C010800AC2331CC3C010800C2 -:10E84000AC2231C803E00008000000008C894004BD -:10E850008F8600101526FFCC3C0D80009483010E9E -:10E860003C1908008F3931BC3C0E08008DCE31B800 -:10E870003078FFFF03385821000078210178202BE1 -:10E8800001CF682101A450213C010800AC2B31BC10 -:10E890003C010800AC2A31B803E000080000000089 -:10E8A00027BDFFE83C058000AFBF0014AFB00010EB -:10E8B0008CB00128ACB000208CA301048CA4010012 -:10E8C000AF8300040E000ED6AF84000C0E00115F63 -:10E8D000000000003C0208008C4200C010400026EE -:10E8E0008F8400043C0708008CE700C424E6000184 -:10E8F0003C010800AC2600C43C0280008C4401248A -:10E900003C1F6020AFE40014000000003C068000C3 -:10E910003C034000ACC301380000000012000013AB -:10E920008FBF0014260F0140261900802404FF80A9 -:10E9300001E4C0240324F824001F6940332E007F23 -:10E940000018594031EC007F3C0A20003548000295 -:10E9500001AE3825016C48250128802500E82825CE -:10E96000ACC50830ACD008308FBF00148FB0001099 -:10E9700003E0000827BD00183C090010008940246E -:10E980001100000F8F83000C240DBFFF006D602469 -:10E9900011800007240F87FF006F702415C000133B -:10E9A0003C1900600099C024130000100000000012 -:10E9B0000E000CD2000000000A001221000000002E -:10E9C0003C0B08008D6B0020256A00013C0108000B -:10E9D000AC2A00200E000FC5000020211040FFCC03 -:10E9E0003C0680000A0011E93C0280000E00128EF5 -:10E9F000000000000A0012210000000027BDFFE80F -:10EA00003C028000AFBF00108C4601403C03700008 -:10EA10003C054000AC4600208C4401480083202483 -:10EA20001085001300A4102B1040000B3C072000A1 -:10EA30003C08600010880017000000003C0A4000FD -:10EA40003C098000AD2A0178000000008FBF001053 -:10EA500003E0000827BD00185487FFF93C0A400076 -:10EA60000E00110A000000000A00123A3C0A4000A1 -:10EA70000E0012B4000000003C0A40003C09800077 -:10EA8000AD2A0178000000008FBF001003E00008ED -:10EA900027BD00180E001D6F000000000A00123A8A -:10EAA0003C0A400027BDFFE0AFB200183C128000D6 -:10EAB000AFB10014AFBF001CAFB000100E00112D9D -:10EAC000365100708E260000AF8600188E28000098 -:10EAD0003C0B08008D6B00FC3C0708008CE700F83D -:10EAE00001066023016C28210000482100AC302B76 -:10EAF00000E91821006620213C010800AC2500FC3B -:10EB00003C010800AC2400F88E50000032020003E3 -:10EB10001040FFEE010030218E2600003C05080069 -:10EB20008CA500FC3C1F08008FFF00F800C81823CC -:10EB300000A378210000102101E3C82B03E2C021CB -:10EB400003197021320D00013C010800AC2F00FCBC -:10EB5000AF8800183C010800AC2E00F815A0000892 -:10EB600000000000320800021100FFD60000000083 -:10EB70000E001229000000000A00125B00000000D5 -:10EB80000E0011D2000000000A00128432080002B8 -:10EB90003C0380008C6401003082003E1440000879 -:10EBA00000000000AC6000488C66010030C507C062 -:10EBB00010A0000500000000AC60004CAC600050EC -:10EBC00003E0000824020001AC600054AC60004087 -:10EBD0008C6801003107380010E0FFF900000000E8 -:10EBE0002402000103E00008AC6000443C039000F4 -:10EBF00034620001008220253C038000AC640020C8 -:10EC00008C65002004A0FFFE0000000003E0000867 -:10EC1000000000003C0280003443000100832025F6 -:10EC200003E00008AC44002027BDFFD8AFB10014BA -:10EC30003C048000AFBF0020AFB3001CAFB200188F -:10EC4000AFB000108C9201408C9001482402000E5D -:10EC500000108C02322300FF1062005902042824A5 -:10EC60002866000F10C00013286A0037240700062A -:10EC70001067008E286800075100002D2404000949 -:10EC8000106000783C06800024090001106900B083 -:10EC9000000000000000000D8FBF00208FB3001C9B -:10ECA0008FB200188FB100148FB0001003E000087D -:10ECB00027BD002811400059240D0038286B00356D -:10ECC000116000053C058000240C001F146CFFF14E -:10ECD000000000003C0580008CB801B80700FFFE72 -:10ECE00034B90180AF320000241F00012412000259 -:10ECF0003C021000AF200004A7310008A33F000A27 -:10ED0000A332000BA7300010AF200024AF20002852 -:10ED1000ACA201B88FBF00208FB3001C8FB20018C7 -:10ED20008FB100148FB0001003E0000827BD002849 -:10ED3000106400232405000B1465FFD63218FFFF72 -:10ED4000170000203C0580008F93FED4927F0005C1 -:10ED500033F900041720FFCF000000000E0012A5B9 -:10ED6000024020219269000502402021352800043C -:10ED70000E0012AFA26800059267000530E20004A1 -:10ED800014400002000000000000000D926B000023 -:10ED900024060020316A00FF1546000A3C05800069 -:10EDA0008CA401B80480FFFE34AD0180240E000560 -:10EDB0003C0C1000ADB20000A1AE000BACAC01B831 -:10EDC0003C0580008CA301B80460FFFE34AF0180D5 -:10EDD00024130002ADE00000ADF20004A5F100082C -:10EDE000A1F3000AA1F3000BA5F00010ADE0002490 -:10EDF0008CB101443C101000ADF10028ACB001B85A -:10EE00008FBF00208FB3001C8FB200188FB1001489 -:10EE10008FB0001003E0000827BD0028106DFFAD83 -:10EE2000240E0080146EFF9B000000003C05800053 -:10EE30008CA301B80460FFFE34AF018024120002ED -:10EE4000A1F2000BA5F10008A5F000108CB301445D -:10EE50003C021000A5F30012ACA201B80A0012F0A7 -:10EE60008FBF00208CC301B80460FFFE34D3018043 -:10EE7000AE720000AE60000424120001A67100080A -:10EE800024110002A272000AA271000BA6700010E9 -:10EE90008CD001443C0F1000AE700024AE600028FE -:10EEA000ACCF01B80A00132B8FBF00203C038000B9 -:10EEB0008C6601B804C0FFFE346201803C06080085 -:10EEC00090C67AB8AC52000010C000030000382190 -:10EED0003C0708008CE77AC03C05800034AA01801A -:10EEE0002404000234CC0001AC470004A551000802 -:10EEF000A14C000AA144000BA55000108CAB0144AA -:10EF00000000202101402821AD4B002410C0000347 -:10EF10008FBF00203C0408008C847ABC8FB3001C97 -:10EF20008FB200188FB100148FB000103C0E10008B -:10EF30003C0D800027BD0028ACA40028ADAE01B870 -:10EF40003C010800A0207AB803E00008000000009F -:10EF500010A0000B3C0680008C980144241900028C -:10EF60003C010800A0397AB83C010800AC327AC0F4 -:10EF70003C010800AC387ABC0A00132B8FBF00207C -:10EF80008CDF01B807E0FFFE34C7018024090002CE -:10EF9000ACE00000ACF20004A4F10008A0E9000A13 -:10EFA000A0E9000BA4F00010ACE000248CC80144E0 -:10EFB0003C021000ACE80028ACC201B80A00132BD8 -:10EFC0008FBF002027BDFFE8AFBF00100E000ED698 -:10EFD000000000003C0280008FBF001000002021D4 -:10EFE000AC4001800A000FC527BD00183084FFFF28 -:10EFF00030A5FFFF108000070000182130820001BB -:10F000001040000200042042006518211480FFFB1C -:10F010000005284003E000080060102110C0000730 -:10F02000000000008CA2000024C6FFFF24A50004FD -:10F03000AC82000014C0FFFB2484000403E000083D -:10F040000000000010A0000824A3FFFFAC86000011 -:10F0500000000000000000002402FFFF2463FFFF07 -:10F060001462FFFA2484000403E00008000000009A -:10F0700027BDFFE0AFB20018AFB10014AFB0001071 -:10F08000AFBF001C9486000C00A0902124900014B7 -:10F0900000061B020003108000448821000030217C -:10F0A00000A020210E0013BB240500050211202B17 -:10F0B0001080001200001021920300002C6500094E -:10F0C00050A0000992020001000348803C0A080099 -:10F0D000254A793C012A40218D07000000E0000804 -:10F0E0000000000092020001020280210211202B88 -:10F0F0005480FFF292030000000010218FBF001C1B -:10F100008FB200188FB100148FB0001003E0000818 -:10F1100027BD00200A0013D526100001920C000123 -:10F12000240B000C158B0040023070232DCD000AFB -:10F1300015A0003D260800068E43000026020002AE -:10F1400034640100AE440000921F00029059000197 -:10F15000904E0002904B0003001F7E000019C40077 -:10F1600001F86025000E6A00018D5025014B4825ED -:10F17000AE490004920700069105000191040002C7 -:10F180009119000300071E00000534000066F825F1 -:10F190000004120003E2C025031978252610000A96 -:10F1A0000A0013D5AE4F0008921F0001260400028A -:10F1B0002410000257F00001022020210A0013D57C -:10F1C00000808021920E0001240D000315CDFFCB9D -:10F1D000240200018E59000092180002261000033C -:10F1E000372F0008A25800100A0013D5AE4F0000B8 -:10F1F000920500012406000414A6FFC024020001A9 -:10F20000920C0002920B00038E490000000C520089 -:10F21000014B40253527000426100004AE48000CA1 -:10F220000A0013D5AE4700000A0013E924020001CA -:10F2300027BDFFE8AFBF0014AFB000100E0012A54D -:10F24000008080213C048008348300809065002584 -:10F250000200202134A200200E0012AFA06200257F -:10F26000020020218FBF00148FB000100A000C9EF6 -:10F2700027BD00183C03800027BDFFF834620180E1 -:10F28000AFA20000308C00FF30AD00FF30CE00FF99 -:10F290003C0B80008D6401B80480FFFE000000007C -:10F2A0008FA900008D6801288FAA00008FA7000099 -:10F2B0008FA400002405000124020002A085000A9A -:10F2C0008FA30000359940003C051000A062000BA0 -:10F2D0008FB800008FAC00008FA600008FAF000039 -:10F2E00027BD0008AD280000AD400004AD8000241B -:10F2F000ACC00028A4F90008A70D0010A5EE00126C -:10F3000003E00008AD6501B83C06800827BDFFE8B2 -:10F3100034C50080AFBF001090A70009240200127E -:10F3200030E300FF1062000B008030218CA80050F9 -:10F3300000882023048000088FBF00108CAA0034AE -:10F34000240400390000282100CA482305200005B4 -:10F35000240600128FBF00102402000103E0000801 -:10F3600027BD00180E001447000000008FBF0010DA -:10F370002402000103E0000827BD001827BDFFC8D4 -:10F38000AFB1002C00A08821AFB2003027A500103B -:10F390000080902102202021AFBF00340E0013C650 -:10F3A000AFB00028144000813C0C8008918B001104 -:10F3B000918A0012358600808CC80054316500FFA8 -:10F3C000314900FF00A9282100A8382B14E0004F84 -:10F3D0008FA3001094DF005C3066000410C000565C -:10F3E00033E4FFFF8FA2001C0082102B5440000565 -:10F3F0002C8300803067000414E0007E240402188F -:10F400002C83008010600002008080212410008086 -:10F410000E0012A5024020213C03800834660080C3 -:10F4200024070001ACC7000C90C200080010604027 -:10F4300034670100305F007FA0DF00088E390004D0 -:10F4400027380001ACD80030A4D0005C8CCE003C42 -:10F45000962F000E01CF6821ACCD00208CCB003C54 -:10F46000016C5021ACCA001C8E290004ACE90000DC -:10F470008E250008ACE500048FA8001031040008B8 -:10F480005480002F93A60020A0C0004E90C5004ECF -:10F490002408FFDF3C188008A0E5000890C400089D -:10F4A000370C00802409005000888024A0D0000878 -:10F4B0008E390008AD9900388F0E00148D8F003002 -:10F4C00001CF6821AD8D0034918B0000316A00FFBF -:10F4D00011490029264801000E0012AF02402021E8 -:10F4E00024040038000028210E0014472406000AD6 -:10F4F0008FBF00348FB200308FB1002C8FB0002846 -:10F500002402000103E0000827BD003894D8005C05 -:10F510008CD00054330EFFFF0205782301CF682BF7 -:10F5200015A0FFAC8FA300108CD9005430660004E6 -:10F5300014C0FFAC032520230A0014A52C82021856 -:10F540003C188008370C0080A0E600088E390008BF -:10F5500024090050AD9900388F0E00148D8F0030B3 -:10F5600001CF6821AD8D0034918B0000316A00FF1E -:10F570001549FFD9264801002406FF8001062824EA -:10F580003C048000AC8500288E2700083103007FF2 -:10F590003C10800C0070F821AFE700D08E220008EC -:10F5A000AF9F00240A0014E0AFE200D48E230008CD -:10F5B0003C04800834820080AC4300540240202187 -:10F5C0000E001436AC400030240400382405008DB1 -:10F5D0000E001447240600128FBF00348FB2003093 -:10F5E0008FB1002C8FB000282402000103E0000836 -:10F5F00027BD00380A0014AA8FA4001C27BDFFE80D -:10F60000AFBF001090A6000D30C7001010E0000C36 -:10F61000008040213C0280088C4400048CA3000838 -:10F620001064000830C9000430C5000410A0001C9C -:10F630008FBF00102402000103E0000827BD00185E -:10F6400030C900041120001030CB001210E0FFF987 -:10F650008FBF00103C0880088CA700088D060004AE -:10F6600014E6FFF524020001240400382405008D6F -:10F670000E001447240600128FBF00102402000160 -:10F6800003E0000827BD0018240A0012156AFFE9EC -:10F690008FBF0010010020210A00148927BD001827 -:10F6A000000020210A000CB827BD00183C05080006 -:10F6B00024A555983C040800248473583C02080093 -:10F6C000244255A0240300063C010800AC257AC85A -:10F6D0003C010800AC247ACC3C010800AC227AD072 -:10F6E0003C010800A0237AD403E0000800000000D9 -:10F6F00003E00008240200013C028000308800FF83 -:10F70000344701803C0680008CC301B80460FFFED2 -:10F71000000000008CC501282418FF803C0D800AE1 -:10F7200024AF010001F8702431EC007FACCE00243E -:10F73000018D2021ACE50000948B00DA35096000D2 -:10F7400024080002316AFFFFACEA00042402000131 -:10F75000A4E90008A0E8000BACE000243C0710007E -:10F76000ACC701B8AF84002403E00008AF850054A3 -:10F770008C9900048F8D00242409FFBF0325C0232A -:10F78000AC98000491AF00C42403FFEF31EE007F7A -:10F79000A1AE00C48C8C0020938B00308F86002497 -:10F7A000358A0002AF8B0048A7800044AC8A002055 -:10F7B000A4C000AC90C800C401093824A0C700C48C -:10F7C0008F840024AC8000DC908500C400A310244A -:10F7D00003E00008A08200C43C02800034450180A0 -:10F7E0003C0480008C8301B80460FFFE8F890054C4 -:10F7F0002407608324060002ACA900008C88012441 -:10F80000ACA80004A4A70008A0A6000B3C051000AB -:10F8100003E00008AC8501B8938800308F89004868 -:10F820008F82002430C600FF0109382330E900FF31 -:10F830000122182130A500FF2468007810C00002C2 -:10F84000012438210080382130E4000314800003B3 -:10F8500030AA00031140000D312B000310A0000955 -:10F860000000102190ED0000244E000131C200FF85 -:10F870000045602BA10D000024E700011580FFF971 -:10F880002508000103E00008000000001560FFF3F8 -:10F890000000000010A0FFFB000010218CF8000009 -:10F8A00024590004332200FF0045782BAD180000D6 -:10F8B00024E7000415E0FFF92508000403E0000830 -:10F8C0000000000093850030938800408F87004837 -:10F8D000000432003103007F00E5102B30C47F00AC -:10F8E0001040000F006428258F8400243C0980000C -:10F8F0008C8A00DCAD2A00A43C03800000A35825BC -:10F90000AC6B00A08C6C00A00580FFFE0000000026 -:10F910008C6D00ACAC8D00DC03E000088C6200A8AC -:10F920000A0015E88F840024938800413C0280007F -:10F9300000805021310300FEA383004130ABFFFF64 -:10F9400030CC00FF30E7FFFF344801803C098000E5 -:10F950008D2401B80480FFFE8F8D005424180016FA -:10F96000AD0D00008D2201248F8D0024AD02000416 -:10F970008D590020A5070008240201B4A119000A2E -:10F98000A118000B952F01208D4E00088D47000413 -:10F99000978300448D59002401CF302100C72821CE -:10F9A00000A320232418FFFFA504000CA50B000EC4 -:10F9B000A5020010A50C0012AD190018AD18002406 -:10F9C00095AF00D83C0B10002407FFF731EEFFFF86 -:10F9D000AD0E00288DAC0074AD0C002CAD2B01B821 -:10F9E0008D46002000C7282403E00008AD45002014 -:10F9F0008F8800240080582130E7FFFF910900C65E -:10FA00003C02800030A5FFFF312400FF00041A00F3 -:10FA10000067502530C600FF344701803C09800054 -:10FA20008D2C01B80580FFFE8F820054240F001733 -:10FA3000ACE200008D390124ACF900048D7800207F -:10FA4000A4EA0008241901B4A0F8000AA0EF000BF2 -:10FA5000952301208D6E00088D6D0004978400446D -:10FA600001C35021014D602101841023A4E2000C48 -:10FA7000A4E5000EA4F90010A4E60012ACE0001406 -:10FA80008D780024240DFFFFACF800188D0F006C5A -:10FA9000ACEF001C8D0E00683C0F1000ACEE002097 -:10FAA000ACED0024950A00AE240DFFF73146FFFFB0 -:10FAB000ACE60028950C00709504007231837FFF3E -:10FAC0000003CA003082FFFF0322C021ACF8002CE3 -:10FAD000AD2F01B8950E00728D6A002000AE302166 -:10FAE000014D2824A506007203E00008AD65002042 -:10FAF0003C028000344601803C0580008CA301B8A4 -:10FB00000460FFFE24090018ACC40000A0C9000B6B -:10FB10008F8800243C041000950700AEA4C7001095 -:10FB2000ACC0003003E00008ACA401B83C02800087 -:10FB3000344501803C0480008C8301B80460FFFEE2 -:10FB40008F8A002C240600199549001C3128FFFFDC -:10FB5000000839C0ACA70000A0A6000B3C051000AF -:10FB600003E00008AC8501B88F8700340080402195 -:10FB700030C400FF3C0680008CC201B80440FFFE88 -:10FB80008F8900549383005034996000ACA9000021 -:10FB9000A0A300058CE20010240F00022403FFF74D -:10FBA000A4A20006A4B900088D180020A0B8000A7D -:10FBB000A0AF000B8CEE0000ACAE00108CED00048A -:10FBC000ACAD00148CEC001CACAC00248CEB002021 -:10FBD000ACAB00288CEA002C3C071000ACAA002C2F -:10FBE0008D090024ACA90018ACC701B88D05002010 -:10FBF00000A3202403E00008AD04002093850050FA -:10FC00002403000127BDFFE800A330042CA200203C -:10FC1000AFB00010AFBF001400C018211040001397 -:10FC20002410FFFE3C0708008CE7319000E610240A -:10FC30003C0880003505018014400005240600843E -:10FC40008F890024240A00042410FFFFA12A00EC5D -:10FC50000E00168400000000020010218FBF001467 -:10FC60008FB0001003E0000827BD00183C06080014 -:10FC70008CC631940A0016B600C310248F87002C5E -:10FC800027BDFFE0AFB20018AFB10014AFB0001055 -:10FC9000AFBF001C30D000FF90E6000D00A088210F -:10FCA0000080902130C5007FA0E5000D8F850024E5 -:10FCB0008E2300188CA200C01062002E240A000EB1 -:10FCC0000E0016A9A38A00502409FFFF1049002244 -:10FCD0002404FFFF52000020000020218E26000097 -:10FCE0003C0C001000CC5824156000393C0E000874 -:10FCF00000CE682455A0003F024020213C1800029D -:10FD000000D880241200001F3C0A00048F87002CBA -:10FD10008CE200148CE300108CE500140043F823FF -:10FD200003E5C82B13200005024020218E24002C5F -:10FD30008CF10010109100310240202124020012A9 -:10FD4000A38200500E0016A92412FFFF10520002D9 -:10FD50002404FFFF000020218FBF001C8FB2001879 -:10FD60008FB100148FB000100080102103E0000854 -:10FD700027BD002090A800C4350400200A0016DF2B -:10FD8000A0A400C400CA48241520000B8F8B002CAF -:10FD90008F8D002C8DAC00101580000B02402021AF -:10FDA0008E2E002C51C0FFEC0000202102402021AB -:10FDB0000A0016FA240200178D66001050C0FFE6F4 -:10FDC00000002021024020210A0016FA240200111E -:10FDD00002402021240200150E0016A9A382005023 -:10FDE000240FFFFF104FFFDC2404FFFF0A0016E979 -:10FDF0008E2600000A001720240200143C0800048C -:10FE000000C8382450E0FFD4000020210240202107 -:10FE10000A0016FA240200138F86002427BDFFE093 -:10FE2000AFB10014AFBF0018AFB0001090C300C452 -:10FE300030A500FF306200201040000800808821BB -:10FE40008CCB00C02409FFDF256A0001ACCA00C0CA -:10FE500090C800C401093824A0C700C414A0004001 -:10FE60003C0C80008F840024908700C42418FFBFBE -:10FE70002406FFEF30E3007FA08300C4979F004477 -:10FE80008F8200488F8D002403E2C823A799004485 -:10FE9000A5A000AC91AF00C401F87024A1AE00C4CD -:10FEA0008F8C0024A18000C78F8A0024A540007297 -:10FEB000AD4000DC914500C400A65824A14B00C40D -:10FEC0008F9000208F8400489786004402042821E8 -:10FED00010C0000FAF850020A38000403C078000C9 -:10FEE0008E2C000894ED01208E2B0004018D5021F2 -:10FEF000014B8021020620233086FFFF30C8000F0F -:10FF0000390900013131000116200009A3880040A1 -:10FF1000938600308FBF00188FB100148FB000108F -:10FF200027BD0020AF85004C03E00008AF860048E5 -:10FF300000C870238FBF0018938600308FB1001463 -:10FF40008FB0001034EF0C00010F282127BD0020D6 -:10FF5000ACEE0084AF85004C03E00008AF8600489B -:10FF600035900180020028210E00168424060082AC -:10FF70008F840024908600C430C5004050A0FFBA92 -:10FF8000A38000508F8500343C0680008CCD01B8E2 -:10FF900005A0FFFE8F890054240860822407000218 -:10FFA000AE090000A6080008A207000B8CA30008F9 -:10FFB0003C0E1000AE0300108CA2000CAE02001428 -:10FFC0008CBF0014AE1F00188CB90018AE190024A5 -:10FFD0008CB80024AE1800288CAF0028AE0F002C7F -:10FFE000ACCE01B80A001744A38000508F8A0024C9 -:10FFF00027BDFFE0AFB10014AFB000108F880048FC -:020000040001F9 -:10000000AFBF001893890028954200AC30D100FFA3 -:100010000109182B0080802130AC00FF3047FFFF22 -:100020000000582114600003310600FF0120302138 -:1000300001095823978300440068202B1480001B7B -:100040000000000010680043240A0001118A0048E3 -:1000500034E708803165FFFF0E00162602002021DC -:100060000E0016668F8400548F840024948D0070D7 -:1000700025AC0001A48C0070948B00703C06080035 -:100080008CC6318831677FFF10E6004F000000000A -:1000900002002021022028218FBF00188FB10014F8 -:1000A0008FB000100A00173027BD0020914400C413 -:1000B0002406FF8000868825A15100C4978400444F -:1000C0003088FFFF1100001C938900288F8E0024C8 -:1000D0002419EFFF008BF82395D800AC0168682B3A -:1000E00033E900FF03197824A5CF00AC51A0002A02 -:1000F000010058218E0500202408FFFB2403000185 -:1001000000A81024AE0200201183002534E78000EF -:10011000020020213165FFFF0E001626012030214C -:10012000978B00448F870048A780004400EB802312 -:10013000AF900048938900288F8C00248FBF00184F -:100140008FB100148FB0001027BD002003E000081D -:10015000A18900C78E0800202409FFFB34E7800036 -:1001600001092824AE050020158AFFBA34E708806B -:10017000020020210E0015F43165FFFF020020214E -:10018000022028218FBF00188FB100148FB00010FB -:100190000A00173027BD00200A0017E70000482199 -:1001A000020020213165FFFF0E0015F401203021EF -:1001B000978B00448F870048A780004400EB802382 -:1001C0000A0017F7AF90004894890070240A800055 -:1001D000012A4024A48800709085007090990070D6 -:1001E00030A200FF000219C20003F827001FC1C09F -:1001F000332F007F01F87025A08E00700A0017CF02 -:10020000020020218F88002424030001910A007835 -:10021000910500C7250900783147003F24E6FFE03B -:1002200000C318042CC2002030670019A3850028E1 -:100230001040001AAF8900343C0A8000354B0002A0 -:10024000240500012406000114E00016006B1024B0 -:10025000000028211440000F306300201060000FC0 -:10026000240500018D0600748D1900742403FF809D -:1002700000C31024000279403338007F01F868255C -:100280003C0E100001AE6025AD4C083091280001F5 -:10029000310600010A0017A50000000003E0000875 -:1002A000000000008D0F00748D0D00742418FF8075 -:1002B00001F87024000E414031AC007F010C502544 -:1002C0003C0B1000014B38253C0980000A0017A5A3 -:1002D000AD27083027BDFFD8AFB000108F90003495 -:1002E000AFB40020AFB10014AFBF0024AFB3001C07 -:1002F000AFB200188E0500103C0208008C4231B0ED -:100300008F86003830A73FFF00E2182B8CD20014F4 -:10031000008088218CD30020106000070000A021FD -:1003200090CB000D240AFF80014B4824312800FFA8 -:100330001500000C00056382022020212411000D0D -:10034000A39100508FBF00248FB400208FB3001CF6 -:100350008FB200188FB100148FB000100A0016A9D8 -:1003600027BD00283185000354A0FFF4022020217E -:1003700094CF001C8F8E00248E070028A5CF00D8B4 -:100380008CCD0010024D302310E6005C2402001FCB -:100390000E0016A9A3820050241FFFFF105F004E1D -:1003A0002404FFFF8F83003C8F88002C0263982178 -:1003B0008D090010012310238F83001CAD02001053 -:1003C000AD1300208C67007400F3202B14800062B2 -:1003D000022020218F8600388E0C00248CC500243A -:1003E0001185000702202021240E001C0E0016A9F2 -:1003F000A38E0050240DFFFF104D00372404FFFF93 -:100400008F84002C8C980024270F0001AC8F0024CF -:10041000127200448F99001C8F32007412530041F5 -:100420003C0A00808E090000012A10241440003A82 -:10043000000000008E0400142412FFFF109200063A -:10044000240B001B022020210E0016A9A38B0050B4 -:10045000105200212404FFFF8E0300003C0C000119 -:10046000006C282410A000133C0600800066A02425 -:10047000168000090200282102202021240E001AE3 -:100480000E0016A9A38E0050240DFFFF104D001280 -:100490002404FFFF02002821022020210E0016C99B -:1004A000240600012410FFFF2404FFFF1050000A5F -:1004B000241400018F8F002C022020210280302183 -:1004C00095F2003424050001265800010E0017A5FE -:1004D000A5F80034000020218FBF00248FB4002035 -:1004E0008FB3001C8FB200188FB100148FB00010B2 -:1004F0000080102103E0000827BD00288F83003C06 -:1005000000E3C8210259C02B1300FFA88F88002CDC -:100510000A00188E24020018AC8000200A0018B8C7 -:100520008E0400148E1F00003C07008003E798240F -:100530001660FFF92408001A022020210E0016A9D7 -:10054000A38800502403FFFF1443FFBA2404FFFFD5 -:100550000A0018E18FBF0024240B001D0E0016A90D -:10056000A38B0050240AFFFF144AFF9A2404FFFFC4 -:100570000A0018E18FBF00248F85002427BDFFD813 -:10058000AFB3001CAFB20018AFB10014AFB0001091 -:10059000AFBF002090A700C48F9000342412FFFF4B -:1005A00034E2004092060000A0A200C48E030010B6 -:1005B000008098211072000630D1003F2408000D01 -:1005C0000E0016A9A3880050105200262406FFFF33 -:1005D0008F8A00248E0900188D4400C01124000762 -:1005E000240C000E026020210E0016A9A38C0050DE -:1005F000240BFFFF104B001B2406FFFF24040020E8 -:10060000122400048F8D002491AF00C435EE002029 -:10061000A1AE00C48F85003C10A0001A00000000AD -:100620001224004B8F9800248F92FED42406FFFDE5 -:10063000971000709651000A1230000B8FBF0020F7 -:100640003C1F08008FFF318C03E5C82B1720001ECC -:1006500002602021000028210E0017A524060001B9 -:10066000000030218FBF00208FB3001C8FB2001814 -:100670008FB100148FB0001000C0102103E00008FB -:1006800027BD00285224002A8E0300148F840024E2 -:100690009489007025280001A48800709487007058 -:1006A0003C0508008CA5318830E27FFF1045000E24 -:1006B00000000000026020210E0017302405000118 -:1006C0000A001943000030212402002DA3820050AB -:1006D0000E0016A92413FFFF1453FFE12406FFFFA9 -:1006E0000A0019448FBF00209498007024198000DC -:1006F0002405000103199024A492007090910070C9 -:10070000908D0070323000FF001079C2000F70270A -:10071000000E61C031AB007F016C5025A08A0070D3 -:100720000E001730026020210A001943000030211A -:100730002406FFFF1466FFD68F8400240260202168 -:100740000E001730240500010A0019430000302173 -:10075000026020210A00195D2402000A8F8800240B -:1007600027BDFFE8AFB00010AFBF0014910A00C46E -:100770008F87003400808021354900408CE60010CE -:10078000A10900C43C0208008C4231B030C53FFFD3 -:1007900000A2182B106000078F850038240DFF8001 -:1007A00090AE000D01AE6024318B00FF1560000893 -:1007B0000006C382020020212403000D8FBF001415 -:1007C0008FB0001027BD00180A0016A9A38300509F -:1007D00033060003240F000254CFFFF7020020214C -:1007E00094A2001C8F85002424190023A4A200D801 -:1007F0008CE8000000081E02307F003F13F900352E -:100800003C0A00838CE800188CA600C01106000882 -:10081000000000002405000E0E0016A9A38500505C -:100820002407FFFF104700182404FFFF8F850024D2 -:1008300090A900C435240020A0A400C48F8C002CF3 -:10084000918E000D31CD007FA18D000D8F83003C76 -:100850001060001C020020218F8400388C9800104A -:100860000303782B11E0000D241900180200202149 -:10087000A39900500E0016A92410FFFF105000028B -:100880002404FFFF000020218FBF00148FB0001050 -:100890000080102103E0000827BD00188C8600109E -:1008A0008F9F002C0200202100C31023AFE2001014 -:1008B000240500010E0017A5240600010A0019CC2A -:1008C000000020210E001730240500010A0019CC79 -:1008D00000002021010A5824156AFFD98F8C002CB2 -:1008E000A0A600EC0A0019B9A386004227BDFFD8D4 -:1008F000AFB000108F900034AFB20018AFBF00202F -:10090000AFB3001CAFB100148E1100103C030800FF -:100910008C6331B032253FFF00A3102B104000083C -:10092000008090218F8600382409FF8090CA000D36 -:10093000012A4024310700FF14E0000B00116B82F4 -:10094000024020212412000DA39200508FBF0020EE -:100950008FB3001C8FB200188FB100148FB000103D -:100960000A0016A927BD002831AC0003240B0001A2 -:10097000558BFFF40240202190CF000D31EE00088E -:1009800011C000608F93003C16600009240200270C -:100990008E19000C8CD80020173800052402002086 -:1009A0008E0200088CDF0024105F0040240200202B -:1009B0000E0016A9A38200502406FFFF1046003344 -:1009C0002404FFFF8F99002C240AFFF73C13800EAC -:1009D0009329000D2404FF803C0D8000012AF82497 -:1009E000A33F000D8F99001C3C0808008D0831AC16 -:1009F0008F830054972700788F9F002C01031021CC -:100A000030E57FFF000530400046782131F8007F57 -:100A10000313602101E47024ADAE002CA591000009 -:100A20008FEB0028256A0001AFEA00288FE3002C35 -:100A30008E09002C00694021AFE8002C8E07002CA5 -:100A4000AFE700308E050014AFE5003497E6003ABA -:100A500024C20001A7E2003A973300783C10080056 -:100A60008E1031B02663000130717FFF12300027F5 -:100A7000006030218F8F001C0240202124050001DE -:100A80000E001730A5E60078000020218FBF00205F -:100A90008FB3001C8FB200188FB100148FB00010FC -:100AA0000080102103E0000827BD00288E050014F7 -:100AB0002413FFFF10B3001D8F8300248E0800183D -:100AC0008C6700C0150700092402000E8E0A00245E -:100AD0008CC9002815490005240200218E07002832 -:100AE0008CCB002C10EB00132402001F0E0016A963 -:100AF000A38200501453FFB32404FFFF0A001A4ED0 -:100B00008FBF00200A001A1624020024240E800041 -:100B1000006E682431ACFFFF000C5BC2317100FF36 -:100B2000001180270A001A47001033C00A001A6516 -:100B3000240200258E05002C10A0FFEC24020023C7 -:100B40008F8E001C8DCD007401A5602B1580FFE7F2 -:100B5000240200268CCF001400A7C02101F8202B0E -:100B60001080FF998F99002C024020210A001A65FD -:100B70002402002227BDFFE0AFB000108F900034A8 -:100B8000AFB10014AFBF00188E0500103C03080081 -:100B90008C6331B00080882130A43FFF0083102B8C -:100BA000104000078F8600382409FF8090CA000D8E -:100BB000012A4024310700FF14E000098F8B003C1C -:100BC0002410000D02202021A39000508FBF001898 -:100BD0008FB100148FB000100A0016A927BD0020A5 -:100BE000116000080005C3828F8F00248F8EFED411 -:100BF0002407FFFD95EC007095CD000A11AC00387C -:100C00008FBF00183305000314A00010000000007F -:100C10009219000213200041000000008E060024FB -:100C200050C0000F92040003022020212402000F74 -:100C30000E0016A9A38200502408FFFF14480007E5 -:100C40002407FFFF0A001AE28FBF001890C3000DAF -:100C50003064000810800037022020219204000335 -:100C600024070002308900FF15270005308F00FFA0 -:100C70008F8A003C11400031240C002C308F00FF83 -:100C800039E500102CAD00012DEE000102002821F5 -:100C900001CD30250E0016C9022020212410FFFFAF -:100CA0001050000E2407FFFF8F83003C10600017D8 -:100CB000022020213C1908008F39318C0323C02BDE -:100CC0005700000C2411002D0220202100002821B3 -:100CD0000E0017A524060001000038218FBF001860 -:100CE0008FB100148FB0001000E0102103E0000865 -:100CF00027BD00200E0016A9A39100501450FFF646 -:100D00002407FFFF0A001AE28FBF00180E001730F9 -:100D1000240500010A001AE1000038218CDF0024BC -:100D20008E020024545FFFC1022020210A001AC253 -:100D3000920400030A001AB62402001002202021A7 -:100D40000E0016A9A38C0050240BFFFF104BFFE3ED -:100D50002407FFFF0A001AC99204000330A500FF10 -:100D60002406000124A9000100C9102B1040000C2A -:100D700000004021240A000100A61823308B000146 -:100D800024C60001006A38040004204211600002F9 -:100D900000C9182B010740251460FFF800A618238E -:100DA00003E000080100102127BDFFD8AFB00018F4 -:100DB0008F900034AFB1001CAFBF00202403FFFFB1 -:100DC0002411002FAFA30010920600002405000894 -:100DD00026100001006620260E001B01308400FF53 -:100DE00000021E003C021EDC34466F410A001B2933 -:100DF0000000102110A000090080182124450001E6 -:100E000030A2FFFF2C4500080461FFFA00032040D8 -:100E10000086202614A0FFF9008018210E001B0177 -:100E2000240500208FA300102629FFFF313100FF89 -:100E300000034202240700FF1627FFE201021826E2 -:100E400000035027AFAA0014AFAA00100000302101 -:100E500027A8001027A7001400E6782391ED0003CF -:100E600024CE000100C8602131C600FF2CCB000455 -:100E70001560FFF9A18D00008FA200108FBF002028 -:100E80008FB1001C8FB0001803E0000827BD0028B8 -:100E90009383003027BDFFE024020034AFB100147B -:100EA000AFB00010AFBF001CAFB2001800808821A7 -:100EB0001062006200A080219204000414800045AA -:100EC0008F880024A38000288E0500048D0600C8AA -:100ED0003C0700FF34E3FFFF00A3282400C5102BCC -:100EE0001440004DAF85003C978A00448F8700482E -:100EF0000147102310A00032A78200448F98001CE5 -:100F0000304CFFFF9312007C0012788231F1000117 -:100F10000011708001C56821018D582B116000619E -:100F20008F8600248F8900208F84004C1089005EFA -:100F30003C023F018E1F00003C10250003E2C82444 -:100F40001730007A8F8400348F8700348F86002416 -:100F50008CE30000ACC300788CE50010ACC50088C1 -:100F60008F8700488F85003C938D002830AE0003AA -:100F7000000E4023310A0003014D4021A3880028C0 -:100F800094CB00AC01276021AF8C002035691000A4 -:100F9000A4C900AC1620005101452021AF840048AF -:100FA000000020218FBF001C8FB200188FB10014E9 -:100FB0008FB000100080102103E0000827BD002042 -:100FC0008F840020AF800048008730210A001B92E8 -:100FD000AF860020241F000CA39F00500E0016A90E -:100FE000022020212419FFFF1059FFEE2404FFFFE7 -:100FF0008F880024A38000288E0500048D0600C879 -:101000003C0700FF34E3FFFF00A3282400C5102B9A -:101010001040FFB5AF85003C0220202124090019B3 -:10102000A38900500E0016A92411FFFF1051FFDD07 -:101030002404FFFF0A001B648F85003C8F8400247A -:101040008F8700348CF20030908600C430C50010C9 -:1010500014A000108F8300482C680005150000289C -:1010600000000000908A00C4246BFFFC314900108E -:1010700015200008316400FF8F8D004C8F8C0020FC -:1010800011AC0004388F000131EE000115C0002FB3 -:10109000000000000E001B14000000000A001BEB03 -:1010A000000000008F890020938D002830AE0003DF -:1010B000000E4023310A0003014D4021A38800287F -:1010C00094CB00AC01276021AF8C00203569100063 -:1010D000A4C900AC1220FFB101452021251800044D -:1010E000A398002894CF00AC24920004AF9200484B -:1010F00035F12000A4D100AC0A001B930000202190 -:101100008C8200DC1242FF6C022020212418000592 -:10111000A39800500E0016A92412FFFF1452FF6678 -:101120002404FFFF0A001B948FBF001C30E500FF62 -:101130000E0015B0000030218F8600248F870048F4 -:101140008F8900200A001B848F85003C0E0015DB70 -:10115000000000000A001BEB000000009383004227 -:1011600027BDFFE024020002AFB20018AFB10014A7 -:10117000AFBF001C00808821AFB00010000090219C -:10118000106200552404FFFD978300448F850048BA -:101190003066FFFF00C5202B1480005B9387003072 -:1011A0003C0880009504012010E500528F8A002041 -:1011B0008F84004C30A500FF0E0015B024060001FE -:1011C0008F9F00543C0580003C19408027ED01783A -:1011D00031B00078240EFF800219582534AF090081 -:1011E00031B8000701AE6024ACAC0800030F8021C9 -:1011F000ACAB081002202021020028210E001B4E5B -:10120000AF9000342403FFFF104300332404FFFF9A -:101210008E0C00103C0708008CE731B092060000ED -:1012200031843FFF0087102B1040002330CD003F5A -:101230008F980054000471803C0408008C8431A80D -:101240002409FF809390004100984021010E202145 -:1012500000897024000E51403C0980003099007FC5 -:101260003C0F00808F8800243525094035E20001BD -:1012700001593825308B0078308600073C03100078 -:101280003C1F800C00C5C0210162582500E3502599 -:10129000033F782136050001AD2E0804AF980038D1 -:1012A000AD2B0814AF8F002CAD2E0028AD040074B8 -:1012B000AD2A0830A3850041938300422410000327 -:1012C0005070002725A3FFE0240C0001106C001CC7 -:1012D00024060023024020218FBF001C8FB200187B -:1012E0008FB100148FB000100080102103E00008BF -:1012F00027BD0020314900035520FFAE8F84004CEC -:101300000A001C278F90004C8F84004C306500FF32 -:101310000E0015B024060001938B00302405003424 -:1013200011650018978300448F8500483062FFFFE5 -:1013300000A25823AF8B00480A001C5FA78000441E -:1013400011A6003700000000022020212411000B0C -:101350000E0016A9A39100500A001C5F00409021C6 -:101360002C7200201240FFF80003F8803C070800B0 -:1013700024E7796003E7C8218F2D000001A0000851 -:10138000000000008F8500482CA200055440001D7D -:10139000A7800044978A00443148FFFF00A84823F3 -:1013A0002D2F000511E00003314400FF24AEFFFCA7 -:1013B00031C400FF8F90004C8F9800201218000459 -:1013C00038990001332D000115A00029000000000C -:1013D0008F910024922500C434A30010A22300C4DE -:1013E000978300448F8500488F8400243062FFFF7C -:1013F00000A25823AC8000DCA78000440A001C5FD8 -:10140000AF8B00483062FFFF00A258230A001C5F28 -:10141000AF8B00482403FFFF11830005000000008C -:101420000E001981022020210A001C5F004090213B -:101430000E001908022020210A001C5F00409021A4 -:101440000E0019E5022020210A001C5F00409021B7 -:101450000E00185F022020210A001C5F004090212E -:101460000E001A87022020210A001C5F00409021F4 -:101470000E0015DB00000000978300448F850048B4 -:10148000306CFFFF00AC38232CFF000553E0FFA8B1 -:101490003062FFFF8F860024A7800044ACC200DCCE -:1014A0003062FFFF00A258230A001C5FAF8B004888 -:1014B00027BDFFD0AFB20018AFB00010AFBF0028FB -:1014C000AFB50024AFB40020AFB3001CAFB100141F -:1014D0003C0C80008D880128240FFF803C07800A87 -:1014E00025100100250B0080020F68243205007FC3 -:1014F000016F7024AD8E009000A72821AD8D0024CF -:1015000090A700EC3169007F3C0A8004012A182171 -:10151000A38700429066007C00809021AF83001C6E -:1015200030C20002AF880054AF85002400A018210B -:10153000144000022404003424040030A38400304A -:101540008C6600CC30F100FF24040004AF86004814 -:1015500012240004A38000508E5300041660001D66 -:101560003C0880009387004130F200011240000FD8 -:101570008FBF00288CB800748CA400742419FF80DD -:101580000319882400117140308F007F01CF60253E -:101590003C0D2000018D582530F500FE3C0A8000EE -:1015A000AD4B0830A39500418FBF00288FB50024B4 -:1015B0008FB400208FB3001C8FB200188FB10014BD -:1015C0008FB000102402000127BD003003E00008A6 -:1015D000ACA600CC8E590008951F01208E46001045 -:1015E000033FC0213307FFFF30F5000F32B4000185 -:1015F000AF8600201680003BA395004035060C0006 -:1016000002A6102100F51823AD030084AF82004C20 -:101610008E4900043128FFFF1100002BA7890044E8 -:101620002410FF803C1580003C1420000A001D4D52 -:101630002413FFFE90AE00C4020E682431AC00FFFC -:101640001580002A0240202193840041978600449F -:10165000308F000111E0000B026428248F890024E0 -:101660008D2300748D280074A38500410070102420 -:101670000002C940311F007F033FC02503148825A5 -:10168000AEB1083010C000108F85002490A700C4B0 -:1016900002075824316A00FF1540FFE6024020216E -:1016A0000E001C01979100441040FFE89384004114 -:1016B0002405FFFD544500058E430020022028210B -:1016C0000E001586024020218E4300203070000459 -:1016D0001600000A2414FFFB8F8500240A001D0356 -:1016E0008F8600480A001D2EAF86004C0E00182B76 -:1016F000000000000A001D3D9384004100749824FE -:101700000E0015A0AE5300208F8500240A001D0393 -:101710008F86004827BDFFD8AFB3001CAFB10014BF -:10172000AFBF0020AFB20018AFB000103C02800085 -:101730008C5201408C4B01483C048000000B8C0211 -:10174000322300FF317300FF8C8501B804A0FFFE37 -:1017500034900180AE1200008C8701442464FFF0B5 -:10176000240600022C830013AE070004A611000813 -:10177000A206000BAE1300241060004F8FBF0020A4 -:10178000000448803C0A0800254A79E0012A4021EB -:101790008D04000000800008000000003C100800DC -:1017A0008E1031A831733FFF001389800212282167 -:1017B000240CFF8000B12021264D01002647008027 -:1017C0003C0F80003C03800431A8007F30E9007F9B -:1017D000308A007F3C0E800A3C02800C008CC024C2 -:1017E00001AC302400ECC82401239821014280215F -:1017F000ADE60024010EF821ADF90090ADF8002807 -:10180000AF90002CAF9F0024AF93001C0E00167504 -:10181000016080213C0380008C6B01B80560FFFEF5 -:101820008F87002C8F8600243465018090F9000D8D -:10183000ACB2000024C200780019C60000187E0374 -:10184000000F9027001227C2A4B00006108000707D -:10185000240E6082A4AE0008A0A00005240F0002A0 -:10186000A0AF000B0004C4008F8B001C3C192700A4 -:1018700003199025ACB20010ACA00014ACA0002459 -:10188000ACA00028ACA0002C8D7300382411FF8080 -:10189000ACB3001890F0000D0230282430A400FFF3 -:1018A000108000058FBF002090EC000D319F007F5D -:1018B000A0FF000D8FBF00208FB3001C8FB2001857 -:1018C0008FB100148FB000103C0A10003C0D800056 -:1018D00027BD002803E00008ADAA01B8265F01007B -:1018E0002405FF8033F8007F3C06800003E5782460 -:1018F0003C19800A03192021ACCF0024908E00C42B -:1019000000AE682431AC00FF1180FFEAAF840024F0 -:10191000248E007895CD00123C0C08008D8C31A8E7 -:101920003C03800C31AB3FFF01924821000B5180FA -:10193000012A40213104007F010510240083382151 -:10194000ACC200280E001675AF87002C3C03800047 -:101950008C6501B804A0FFFE00000000AE1200007C -:101960008C720144AE120004A6110008241100027A -:10197000A211000BAE1300240A001DD88FBF002057 -:101980003C1260008E452C083C03F0033462FFFFDC -:1019900000A2F824AE5F2C088E582C083C1901B028 -:1019A00003199825AE532C080A001DD88FBF0020BC -:1019B000264D010031AF007F3C10800A240EFF80CD -:1019C00001F0282101AE60243C0B8000AD6C0024A6 -:1019D0001660FFB8AF85002424110003A0B100EC0D -:1019E0000A001DD88FBF002026480100310A007F61 -:1019F0003C0B800A2409FF80014B3021010920247F -:101A00003C078000ACE400240A001DD7AF86002408 -:101A1000944D0012321F3FFF31AC3FFF159FFF8DE9 -:101A2000240E608290C300C42409FF800123102487 -:101A3000304A00FF1140FF87000000002407000427 -:101A4000A0C700EC8F87002C240860842406000DBA -:101A5000A4A80008A0A600050A001DC2240F0002C9 -:101A60005F865437E4AC62CC50103A453662198533 -:101A7000BF14C0E81BC27A1E84F4B556094EA6FEF8 -:101A80007DDA01E7C04D7481800801008008008084 -:101A90008008000008004FBC08004FBC08005098A8 -:101AA0000800506C0800505008004F8C08004F8C04 -:101AB00008004F8C08004FC4080072BC080073086F -:101AC000080072C8080071F0080072C8080072F8B7 -:101AD000080072C8080071F0080071F0080071F089 -:101AE000080071F0080071F0080071F0080071F052 -:101AF000080071F0080071F0080071F0080072E849 -:101B0000080072D8080071F0080071F0080071F048 -:101B1000080071F0080071F0080071F0080071F021 -:101B2000080071F0080071F0080071F0080071F011 -:101B3000080071F0080072D8080078900800775CFF -:101B4000080078580800775C080078280800764478 -:101B50000800775C0800775C0800775C0800775C19 -:101B60000800775C0800775C0800775C0800775C09 -:101B70000800775C0800775C0800775C0800775CF9 -:041B8000080077845E -:0C1B84000A000122000000000000000028 -:101B90000000000D747061342E362E3135000000C7 -:101BA00004060F010000000000000000000000001B -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100010000003000000000000000D0000000D97 -:101C20003C020800244217C03C03080024632AB485 -:101C3000AC4000000043202B1480FFFD2442000430 -:101C40003C1D080037BD2FFC03A0F0213C1008000C -:101C5000261004883C1C0800279C17C00E00025E5A -:101C6000000000000000000D2402FF8027BDFFE0FF -:101C700000821024AFB00010AF420020AFBF0018A8 -:101C8000AFB10014936500043084007F0344182131 -:101C90003C0200080062182130A50020036080216A -:101CA0003C080111277B000814A000022466005C98 -:101CB0002466005892020004974301049204000431 -:101CC0003047000F3063FFFF308400400067282357 -:101CD00010800009000048219202000530420004F3 -:101CE000104000050000000010A0000300000000EC -:101CF00024A5FFFC240900049202000530420004E0 -:101D0000104000120000000010A0001000000000B1 -:101D10009602000200A72021010440252442FFFE74 -:101D2000A7421016920300042402FF8000431024EF -:101D3000304200FF104000033C0204000A00017220 -:101D4000010240258CC20000AF4210188F4201787A -:101D50000440FFFE2402000AA7420140960200024E -:101D6000240400093042000700021023304200071B -:101D7000A7420142960200022442FFFEA74201440C -:101D8000A740014697420104A74201488F4201083B -:101D9000304200205040000124040001920200045F -:101DA00030420010144000023483001000801821DB -:101DB000A743014A000000000000000000000000EE -:101DC00000000000AF48100000000000000000000C -:101DD00000000000000000008F4210000441FFFEE0 -:101DE0003102FFFF104000070000000092020004D3 -:101DF0003042004014400003000000008F421018E1 -:101E0000ACC20000960200063042FFFF24420002EE -:101E10000002104300021040036288219622000055 -:101E20001120000D3044FFFF00A710218F83003CDC -:101E30008F45101C00021082000210800043102108 -:101E4000AC45000030A6FFFF0E0005B700052C02D0 -:101E500000402021A6220000920300042402FF80FB -:101E600000431024304200FF1040001F000000001B -:101E700092020005304200021040001B00000000EA -:101E80009742100C2442FFFEA742101600000000EB -:101E90003C02040034420030AF4210000000000059 -:101EA0000000000000000000000000008F42100051 -:101EB0000441FFFE000000009742100C8F45101CEB -:101EC0003042FFFF244200300002108200021080E6 -:101ED000005B1021AC45000030A6FFFF0E0005B7E7 -:101EE00000052C02A62200009604000224840008AB -:101EF0000E0001E73084FFFF974401040E0001F556 -:101F00003084FFFF8FBF00188FB100148FB0001016 -:101F10003C02100027BD002003E00008AF4201781A -:101F20003084FFFF308200078F85002410400002BC -:101F3000248300073064FFF800A4102130421FFF03 -:101F400003421821247B4000AF850028AF82002483 -:101F500003E00008AF4200843084FFFF3082000FAE -:101F60008F85002C8F860034104000022483000FE0 -:101F70003064FFF000A410210046182BAF8500301C -:101F80000046202314600002AF82002CAF84002C96 -:101F90008F82002C34048000034218210064182131 -:101FA000AF83003C03E00008AF4200808F82001442 -:101FB000104000088F8200048F82FFE41440000567 -:101FC0008F8200043C02FFBF3442FFFF00822024C6 -:101FD0008F82000430430006240200021062000FCA -:101FE0003C0201012C620003504000052402000461 -:101FF0001060000F3C0200010A00022E00000000E9 -:1020000010620005240200061462000C3C0201115B -:102010000A000227008210253C02001100821025D0 -:10202000AF421000240200010A00022EAF82000C11 -:1020300000821025AF421000AF80000C00000000AD -:10204000000000000000000003E0000800000000A5 -:102050008F82000C10400004000000008F4210002E -:102060000441FFFE0000000003E000080000000043 -:102070008F820010000229C224A3FFF0000318423F -:102080002444F80000031140004310210002108096 -:1020900000431021000210803C0308002463180054 -:1020A0002C84030114800013004330218F84001816 -:1020B00000A4102B1440000F0000302100A41023B6 -:1020C00000021940006218210003188000621821E4 -:1020D0008F82001C008210212442FFFF0045102B3C -:1020E00014400004000318803C02080024421A1423 -:1020F0000062302103E0000800C0102127BDFFE08E -:10210000AFBF0018AFB10014AFB000103C046008BE -:102110008C8250002403FF7F3C06600000431024A3 -:102120003442380CAC8250008CC24C1C3C1A8000EB -:10213000000216023042000F10400007AF82001C60 -:102140008CC34C1C3C02001F3442FC00006218246B -:10215000000319C2AF8300188F420008275B4000BC -:1021600034420001AF420008AF8000243C02601CF2 -:10217000AF400080AF4000848C4500088CC3080845 -:1021800034028000034220212402FFF00062182460 -:102190003C0200803C010800AC2204203C025709AC -:1021A000AF84003C14620004AF85003424020001B7 -:1021B0000A00028EAF820014AF8000143C0280003F -:1021C000344400708C8300008F42000038420001CC -:1021D0003042000110400018AF83003800804021D9 -:1021E000006030218D0700003C0508008CA5045CD0 -:1021F0003C0408008C84045800E6302300001021C1 -:1022000000A6282100A6302B008220210086202154 -:102210003C010800AC25045C3C010800AC240458D7 -:102220008F42000038420001304200011440FFEDAF -:1022300000E03021AF8700383C028000344200705B -:102240008C4700008F8600383C0508008CA5045C94 -:102250003C0408008C84045800E638230000102158 -:1022600000A72821008220218F82001400A7302B94 -:10227000008620213C010800AC25045C3C010800DC -:10228000AC240458104000160000000097420104DE -:10229000104000058F830000146000072462FFFFD8 -:1022A0000A0002D02C62000A2C6200105040000488 -:1022B0008F83000024620001AF8200008F83000042 -:1022C0002C62000A144000032C6200070A0002D7A7 -:1022D000AF80FFE41040000224020001AF82FFE45F -:1022E0008F4301088F44010030622000AF83000457 -:1022F00010400008AF8400103C0208008C42042CFF -:10230000244200013C010800AC22042C0A0005B361 -:102310003C0240003065020014A0000324020F00BC -:102320001482026024020D0097420104104002C88A -:102330003C02400030624000144000AD8F82003CFF -:102340008C4400088F4201780440FFFE24020800FC -:10235000AF42017824020008A7420140A740014291 -:10236000974201048F8400043051FFFF3082000146 -:1023700010400007022080212623FFFE24020002D5 -:102380003070FFFFA74201460A000304A74301483B -:10239000A74001463C0208008C42043C1440000D5A -:1023A0008F830010308200201440000224030009B3 -:1023B00024030001006020218F8300102402090003 -:1023C0005062000134840004A744014A0A00031F3C -:1023D0000000000024020F0014620005308200207B -:1023E000144000062403000D0A00031E2403000508 -:1023F000144000022403000924030001A743014AFA -:102400003C0208008C4204203C0400480E00020AF2 -:10241000004420250E000233000000008F82000CD3 -:102420001040003E000000008F4210003C030020DE -:1024300000431024104000398F8200043042000213 -:102440001040003600000000974210141440003382 -:1024500000000000974210088F88003C3042FFFFC8 -:1024600024420006000218820003388000E8302170 -:10247000304300018CC400001060000430420003AF -:102480000000000D0A00036000E810215440001015 -:102490003084FFFF3C05FFFF0085202400851826BF -:1024A0000003182B0004102B0043102410400005DB -:1024B00000000000000000000000000D000000000F -:1024C000240001CB8CC200000A00035F00452025D8 -:1024D0003883FFFF0003182B0004102B0043102447 -:1024E0001040000500000000000000000000000D8A -:1024F00000000000240001D48CC200003444FFFF1F -:1025000000E81021AC4400003C0208008C4204307A -:10251000244200013C010800AC2204308F6200001C -:102520008F84003CAF8200088C8300003402FFFFE0 -:102530001462000F000010213C0508008CA5045413 -:102540003C0408008C84045000B0282100B0302BDB -:1025500000822021008620213C010800AC25045483 -:102560003C010800AC2404500A0005A9240400081A -:102570008C820000304201001040000F000010214A -:102580003C0508008CA5044C3C0408008C840448DD -:1025900000B0282100B0302B0082202100862021AD -:1025A0003C010800AC25044C3C010800AC24044864 -:1025B0000A0005A9240400083C0508008CA5044471 -:1025C0003C0408008C84044000B0282100B0302B6B -:1025D00000822021008620213C010800AC25044413 -:1025E0003C010800AC2404400A0005A924040008AA -:1025F0008F6200088F62000000021602304300F074 -:10260000240200301062000524020040106200E045 -:102610008F8200200A0005B12442000114A00005A9 -:1026200000000000000000000000000D000000009D -:10263000240001FE8F4201780440FFFE00000000EC -:102640000E00023B00000000144000050040802105 -:10265000000000000000000D000000002400020542 -:102660008E02000010400005000000000000000085 -:102670000000000D00000000240002088F62000C22 -:1026800004430003240200010A000457AE000000C6 -:10269000AE0200008F82003C8C480008A2000007B8 -:1026A0008F65000C8F64000430A3FFFF0004240238 -:1026B00000852023308200FF0043102124420005C2 -:1026C000000230832CC20081A605000A14400005D8 -:1026D000A2040004000000000000000D0000000043 -:1026E000240002208F85003C0E0005D5260400142E -:1026F0008F6200048F430108A60200083C0210000C -:1027000000621824106000080000000097420104D5 -:10271000920300072442FFEC346300023045FFFFC0 -:102720000A0003ECA2030007974201042442FFF0D1 -:102730003045FFFF960600082CC2001354400005E8 -:10274000920300079202000734420001A202000730 -:102750009203000724020001106200052402000316 -:102760001062000B8F82003C0A00040930C6FFFF94 -:102770008F82003C3C04FFFF8C43000C0064182453 -:1027800000651825AC43000C0A00040930C6FFFFA1 -:102790003C04FFFF8C4300100064182400651825DA -:1027A000AC43001030C6FFFF24C2000200021083B9 -:1027B000A20200058F83003C304200FF000210801F -:1027C000004328218CA800008CA2000024030004F0 -:1027D0000002170214430012000000009742010497 -:1027E0003C03FFFF010318243042FFFF0046102383 -:1027F0002442FFFE00624025ACA8000092030005C1 -:10280000306200FF0002108000501021904200143E -:102810003042000F004310210A00043EA2020006CD -:102820008CA40004974201049603000A3088FFFF3D -:102830003042FFFF004610232442FFD6000214005E -:1028400001024025ACA80004920200079204000592 -:102850002463002800031883006418213442000414 -:10286000A2030006A20200078F8200042403FFFBDC -:102870003442000200431024AF8200049203000699 -:102880008F87003C00031880007010218C440020CA -:102890003C02FFF63442FFFF00824024006718210B -:1028A000AE04000CAC68000C920500063C03FF7FF0 -:1028B0008E02000C0005288000B020213463FFFF49 -:1028C000010330249488002600A728210043102407 -:1028D000AE02000CAC860020AC880024ACA800102E -:1028E00024020010A742014024020002A740014236 -:1028F000A7400144A7420146974201043C04000856 -:102900002442FFFEA7420148240200010E00020AF1 -:10291000A742014A9603000A9202000400431021D4 -:102920002442000230420007000210233042000718 -:102930000E000233AE0200108F6200003C0308005C -:102940008C63044424040010AF8200089742010401 -:102950003042FFFF2442FFFE00403821000237C30F -:102960003C0208008C420440006718210067282BB5 -:1029700000461021004510213C010800AC2304440E -:102980003C010800AC2204400A00053E00000000A3 -:1029900014A0000500000000000000000000000D71 -:1029A000000000002400029E8F4201780440FFFED8 -:1029B000000000000E00023B000000001440000573 -:1029C00000408021000000000000000D0000000019 -:1029D000240002A58E020000544000069202000767 -:1029E000000000000000000D00000000240002A80C -:1029F0009202000730420004104000058F8200045C -:102A00002403FFFB3442000200431024AF82000481 -:102A10008F6200040443000892020007920200063D -:102A20008E03000CAE000000000210800050102148 -:102A3000AC430020920200073042000454400009D9 -:102A40009602000A920200053C0300010002108079 -:102A5000005010218C46001800C33021AC460018ED -:102A60009602000A92060004277100080220202125 -:102A700000C2302124C60005260500140E0005D52D -:102A800000063082920400068F6500043C027FFF3E -:102A900000042080009120218C8300043442FFFF39 -:102AA00000A2282400651821AC83000492020007CC -:102AB0009204000592030004304200041040001408 -:102AC00096070008308400FF000420800091202138 -:102AD0008C860004974201049605000A306300FFCB -:102AE0003042FFFF004310210045102130E3FFFF7B -:102AF000004310232442FFD830C6FFFF0002140019 -:102B000000C23025AC8600040A0004F292030007DC -:102B1000308500FF0005288000B128218CA400002A -:102B200097420104306300FF3042FFFF0043102151 -:102B3000004710233C03FFFF008320243042FFFFA7 -:102B400000822025ACA400009203000724020001AB -:102B50001062000600000000240200031062001151 -:102B6000000000000A0005158E03001097420104C2 -:102B7000920300049605000A8E24000C00431021E5 -:102B8000004510212442FFF23C03FFFF0083202474 -:102B90003042FFFF00822025AE24000C0A000515FC -:102BA0008E03001097420104920300049605000A68 -:102BB0008E24001000431021004510212442FFEE16 -:102BC0003C03FFFF008320243042FFFF00822025CA -:102BD000AE2400108E0300102402000AA742014018 -:102BE000A74301429603000A920200043C040040FD -:102BF00000431021A7420144A74001469742010427 -:102C0000A7420148240200010E00020AA742014A1D -:102C10000E000233000000008F62000092030004E7 -:102C200000002021AF820008974201049606000AA6 -:102C30003042FFFF00621821006028213C03080099 -:102C40008C6304443C0208008C4204400065182157 -:102C5000004410210065382B004710213C0108007A -:102C6000AC2304443C010800AC220440920400045C -:102C7000008620212484000A3084FFFF0E0001E733 -:102C800000000000974401043084FFFF0E0001F5AE -:102C9000000000003C021000AF4201780A0005B0BD -:102CA0008F820020148200273062000697420104C0 -:102CB000104000673C0240003062400010400005B8 -:102CC00000000000000000000000000D00000000F7 -:102CD000240003968F4201780440FFFE240208007E -:102CE000AF42017824020008A7420140A7400142F8 -:102CF0008F82000497430104304200011040000716 -:102D00003070FFFF2603FFFE24020002A7420146A7 -:102D1000A74301480A0005682402000DA7400146A8 -:102D20002402000DA742014A8F620000240400081B -:102D3000AF8200080E0001E7000000000A00054213 -:102D400002002021104000423C024000936200003B -:102D5000304300F0240200101062000524020070CD -:102D600010620035000000000A0005B08F820020CC -:102D70008F620000974301043050FFFF3071FFFF66 -:102D80008F4201780440FFFE320200070002102348 -:102D9000304200072403000A2604FFFEA743014037 -:102DA000A7420142A7440144A7400146A751014858 -:102DB0008F42010830420020144000022403000921 -:102DC00024030001A743014A0E00020A3C0400400C -:102DD0000E000233000000003C0708008CE70444AA -:102DE000021110212442FFFE3C0608008CC604405C -:102DF0000040182100E33821000010218F650000F9 -:102E000000E3402B00C230212604000800C8302116 -:102E10003084FFFFAF8500083C010800AC27044464 -:102E20003C010800AC2604400E0001E70000000051 -:102E30000A000542022020210E0001390000000096 -:102E40008F82002024420001AF8200203C0240001B -:102E5000AF420138000000000A00028F3C028000EF -:102E60003084FFFF30C6FFFF00052C0000A6282598 -:102E70003882FFFF004510210045282B0045102116 -:102E800000021C023042FFFF0043102100021C021E -:102E90003042FFFF004310213842FFFF03E00008EB -:102EA0003042FFFF3084FFFF30A5FFFF00001821F4 -:102EB0001080000700000000308200011040000276 -:102EC00000042042006518210A0005CB00052840B7 -:102ED00003E000080060102110C0000624C6FFFFB8 -:102EE0008CA2000024A50004AC8200000A0005D5D5 -:102EF0002484000403E000080000000010A0000883 -:102F000024A3FFFFAC8600000000000000000000CA -:102F10002402FFFF2463FFFF1462FFFA24840004ED -:082F200003E0000800000000BE -:042F280000000001A4 -:042F2C000A00002671 -:102F300000000000000000000000000D74787034F4 -:102F40002E362E3136000000040610000000000A64 -:102F5000000001360000EA600000000000000000F0 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000001D24 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC00000000000000000001000000300000000EE -:102FD0000000000D0000000D3C02080024423B6090 -:102FE0003C03080024633E18AC4000000043202B43 -:102FF0001480FFFD244200043C1D080037BD7FFC07 -:1030000003A0F0213C100800261000983C1C08008A -:10301000279C3B600E0004AE000000000000000D85 -:103020003C0580008F83003034A800708D070000BD -:10303000008330253C02900000C22025ACA4002073 -:10304000AF8700243C0480008C8900200520FFFE0F -:1030500000000000348400708C8500003C180800DB -:103060008F18007C3C0D08008DAD007800A7C823A8 -:1030700003195021000070210159602B01AE582125 -:10308000016C38213C010800AC2A007C3C0108009E -:10309000AC27007803E00008000000000A00003DB3 -:1030A000240400018F8500303C048000348300013B -:1030B00000A3102503E00008AC82002003E0000814 -:1030C000000010213084FFFF30A5FFFF10800007B3 -:1030D000000018213082000110400002000420424C -:1030E000006518211480FFFB0005284003E000085C -:1030F0000060102110C00007000000008CA200003A -:1031000024C6FFFF24A50004AC82000014C0FFFB0E -:103110002484000403E000080000000010A0000860 -:1031200024A3FFFFAC8600000000000000000000A8 -:103130002402FFFF2463FFFF1462FFFA24840004CB -:1031400003E000080000000090AA00318FAB0010DF -:103150008CAC00403C0300FF8D680004AD6C002087 -:103160008CAD004400E060213462FFFFAD6D0024AF -:103170008CA700483C09FF000109C024AD67002866 -:103180008CAE004C0182C82403197825AD6F000471 -:10319000AD6E002C8CAD0038314A00FFAD6D001CC7 -:1031A00094A900323128FFFFAD68001090A70030CD -:1031B000A5600002A1600004A167000090A3003296 -:1031C000306200FF00021982106000052405000132 -:1031D0001065000E0000000003E00008A16A000175 -:1031E0008CD80028354A0080AD7800188CCF0014A8 -:1031F000AD6F00148CCE0030AD6E00088CC4002C76 -:10320000A16A000103E00008AD64000C8CCD001C35 -:10321000AD6D00188CC90014AD6900148CC8002471 -:10322000AD6800088CC70020AD67000C8CC200148C -:103230008C8300700043C82B13200007000000009F -:103240008CC20014144CFFE400000000354A0080DA -:1032500003E00008A16A00018C8200700A0000C629 -:10326000000000009089003027BDFFF88FA8001CE7 -:10327000A3A900008FA300003C0DFF8035A2FFFF33 -:103280008CAC002C00625824AFAB0000A1000004FD -:1032900000C05821A7A000028D06000400A048210C -:1032A0000167C8218FA50000008050213C18FF7FD6 -:1032B000032C20263C0E00FF2C8C0001370FFFFF53 -:1032C00035CDFFFF3C02FF0000AFC82400EDC02455 -:1032D00000C27824000C1DC00323682501F8702566 -:1032E000AD0D0000AD0E00048D240024AFAD000034 -:1032F000AD0400088D2C00202404FFFFAD0C000C51 -:103300009547003230E6FFFFAD06001091450048BA -:1033100030A200FF000219C2506000018D24003469 -:10332000AD0400148D4700388FAA001827BD00088F -:10333000AD0B0028AD0A0024AD07001CAD00002C29 -:10334000AD00001803E00008AD00002027BDFFE03D -:10335000AFB20018AFB10014AFB00010AFBF001C87 -:103360009098003000C088213C0D00FF330F007F93 -:10337000A0CF0000908E003135ACFFFF3C0AFF006B -:10338000A0CE000194A6001EA22000048CAB001465 -:103390008E29000400A08021016C2824012A4024E9 -:1033A0000080902101052025A6260002AE240004FD -:1033B00026050020262400080E00007224060002C4 -:1033C00092470030260500282624001400071E001E -:1033D0000003160324060004044000032403FFFF37 -:1033E000965900323323FFFF0E000072AE23001007 -:1033F000262400248FBF001C8FB200188FB1001448 -:103400008FB0001024050003000030210A00007C6A -:1034100027BD002027BDFFD8AFB1001CAFB00018FA -:10342000AFBF002090A900302402000100E050212D -:103430003123003F00A040218FB000400080882150 -:1034400000C04821106200148FA70038240B00052B -:1034500000A0202100C02821106B001302003021A1 -:103460000E000108000000009225007C30A400023C -:103470001080000326030030AE0000302603003425 -:103480008FBF00208FB1001C8FB00018006010218A -:1034900003E0000827BD00280E000087AFB0001031 -:1034A0000A00014F000000008FA3003C0100202112 -:1034B0000120282101403021AFA300100E0000CED2 -:1034C000AFB000140A00014F000000008F820050CE -:1034D00024430001304200FFAF83005003E00008A6 -:1034E000000000003C0580008CA30E108F84004477 -:1034F000AC8300208CA20E1803E00008AC820024EC -:103500003C0580008CA30E148F840044AC83002003 -:103510008CA20E1C03E00008AC82002493820038C9 -:103520001040001B2483000F2404FFF000643824A3 -:1035300010E00019978B002C9784004C9389002E83 -:103540003C0A601C0A0001900164402301037021C1 -:10355000006428231126000231C2FFFF30A2FFFFC2 -:103560000047302B50C0000E00E448218D4D000C68 -:1035700031A3FFFF00036400000C2C0304A1FFF340 -:103580000000302130637FFF0A000188240600011B -:1035900003E00008000000009784004C00E448218C -:1035A0003123FFFF3168FFFF0068382B54E0FFF83C -:1035B000A783004C938A002E11400005240F0001C0 -:1035C000006BC023A380002E03E00008A798004CE6 -:1035D000006BC023A38F002E03E00008A798004CC7 -:1035E00003E000080000000027BDFFE8AFB00010B6 -:1035F0003084FFFF3C10800093A8002BAFBF001465 -:10360000A6040144960A0E1630C600FF8FA90030AA -:10361000A60A0146AE050148A2060152A608015AB3 -:10362000AE0701608FA3002CA609015801202021BC -:103630000E00017CAE0301543C021000AE02017882 -:103640008FBF00148FB0001003E0000827BD0018E2 -:103650003C038000346200708C4900008F87003C7E -:103660002484000727BDFFF83084FFF8AF890024C9 -:103670003C088000950E008A31CDFFFFAFAD000001 -:103680008FAC000001875823256AFFFF31461FFFDA -:1036900000C4282B14A0FFF7350D00708DAC00007E -:1036A0003C0508008CA500843C0A08008D4A008077 -:1036B000018958230000102100ABC0210007C882F7 -:1036C00001422021030B302B0019388035094000BE -:1036D0000086782100E9102127BD00083C01080080 -:1036E000AC3800843C010800AC2F008003E00008E7 -:1036F000000000008F82003C2486000730C5FFF8E0 -:1037000000A2182130641FFF03E00008AF84003CD2 -:103710003C0320FF27BDFFE83C0760003C08800019 -:10372000240500103464FFFDACE53008AFBF001085 -:10373000AD040E00000000000000000000000000CA -:1037400000000000000000003C0200FF345FFFFDAD -:10375000AD1F0E003C0B60048D7850002419FF7FD4 -:103760003C0E00020319782435EC380C35CD0109E4 -:10377000ACED4C1824060009AD6C50008CEA0438FE -:10378000AD060008AD0000148CE94C1C3145FFFF6C -:103790003C06570900091E0238A42F713062000F41 -:1037A00034C80010AF820048104000072485C0B321 -:1037B0008CEB4C1C3C0D001F35ACFC00016C502404 -:1037C000000A49C2AF8900348CF90808241FF000B0 -:1037D000033FC02403087026030678262DE8000165 -:1037E0002DC600010106382550E00009A3800038ED -:1037F0003C09601C8D24000824030001A3830038C9 -:1038000030827C00A780004CA380002EA782002C71 -:10381000AF80005014A00003AF80003C3C05600066 -:10382000ACA0442C0E000559000000008FBF001012 -:103830000A000E9927BD001827BDFFC8AFB3002CA2 -:10384000AFB20028AFBF0030AFB10024AFB000204E -:10385000936200080080982100A090211440003558 -:10386000240400100E0001C9000000000E000168D1 -:10387000004080210002C4003C1932000319882551 -:10388000AE110000936F0009976E0012936A000A50 -:1038900031EC00FF31CDFFFF018D5821000B4400BA -:1038A000314900FF01093825AE0700048F8500501B -:1038B0009784004000403021308320001460004D88 -:1038C000AE050008AE00000C3C0580009784004067 -:1038D0000662004F8E03000C3090000816000002B4 -:1038E000264800062648000294A40E148CA50E1C3F -:1038F0008F670004936A00023084FFFF314900FFA4 -:10390000AFA900108F720014AFA800180E0001AF0D -:10391000AFB200148FBF00308FB3002C8FB20028DD -:103920008FB100248FB00020240400100A0001F29F -:1039300027BD00389365000997710012936C000B46 -:1039400030AD00FF01B13021318B00FF00CB802171 -:103950002602000A3050FFFF0E0001C9020020219C -:103960000E000168004088219368000997640012E6 -:103970000002FC00310900FF308AFFFF012A3821D4 -:1039800024E3000203E3C0253C1941000319782514 -:10399000AE2F00008F6E000C3C0D800095AC0E1415 -:1039A00001D32825AE2500048DA50E1C8F670004C9 -:1039B000936B00023184FFFF316600FFAFA6001059 -:1039C0008F68001400403021AFB200180E0001AF24 -:1039D000AFA80014020020218FBF00308FB3002C4D -:1039E0008FB200288FB100248FB000200A0001F2AE -:1039F00027BD0038976200123C0580009784004084 -:103A0000305FFFFF0661FFB4AE1F000C8E03000C99 -:103A10003C078000006798250A00026BAE13000C7B -:103A200027BDFFD8AFB40020AFBF0024AFB3001C48 -:103A3000AFB20018AFB10014AFB00010936200082D -:103A4000144000940080A021AF60000C97850040D6 -:103A500030A440001080009E24030016241040076C -:103A6000A363000AAF700014938F00428F6C0014A0 -:103A700031EE0001000E6A40018D5825AF6B001435 -:103A8000978A00408F6800143149001001093825D9 -:103A9000AF6700149786004030C300081060009F95 -:103AA000000000008F6600143C0310003C048000FE -:103AB00000C32825AF65001494820E0A3C1F8100C4 -:103AC0002413000E3059FFFF033FC025AF780004D8 -:103AD000A37300029372000A3406FFFC265100040F -:103AE000A371000A978800403107200010E0009180 -:103AF000000000003C0B80009789004095680E0C88 -:103B000097840040000918423107C0003065000367 -:103B100000071303309F100000A2C025001FCA0336 -:103B200003199825001390C0A772001297910040C6 -:103B3000936F000A00118182320E003C01CF682190 -:103B400025AC003CA36C0009956A0E0C31493FFF7F -:103B5000A7690010976D0012936C0009018D582120 -:103B6000256A00023149000700094023310300079C -:103B7000A363000B93670009976400129765001018 -:103B800030E200FF8F900028979800400044F82111 -:103B900003E5C82103269821331200401240000596 -:103BA0003266FFFF00D0702B3C11800011C0001660 -:103BB000000090210206782B15E0002D0000202146 -:103BC0003C1080008E120E143C058000AE120E10C8 -:103BD0008E110E1CAE110E18AE060E008CB8000031 -:103BE000331300081260FFFD0000000094B90E08B6 -:103BF00000C0802100008821A79900408CA60E04F7 -:103C000024120001AF860028977F001033F3FFFFD6 -:103C10008E8900000130202310800058AE840000FF -:103C2000022020210E000243020028218E8C000079 -:103C300015800005000000008F6D0014240EFFBFEA -:103C400001AEA024AF7400148F78000C03138821F8 -:103C5000AF71000C936F000815E000030000000036 -:103C60001640004000000000A3720008020020215E -:103C70008FBF00248FB400208FB3001C8FB20018B8 -:103C80008FB100148FB000100080102103E00008F5 -:103C900027BD00288F900028978200403C118000AB -:103CA000020098213045004014A0FFD90000902167 -:103CB000976800108F8700283103FFFF1467FFEC1F -:103CC00000002021000088210A000339241200018D -:103CD0002403000E24104007A363000AAF700014F1 -:103CE000938F00428F6C001431EE0001000E6A4089 -:103CF000018D5825AF6B0014978A00408F6800141F -:103D00003149001001093825AF670014978600403B -:103D100030C300081460FF6300000000AF600004BF -:103D2000A3600002978800403107200014E0FF7173 -:103D300000003021A760001297910040936F000AA5 -:103D40003C0B800032301F000010718301CF6821CE -:103D500025AC0028A36C0009956A0E0C0A00030A22 -:103D6000A76A00108F6600143C1FEFFF37F9FFFEB3 -:103D700000D998240A00034FAF7300148F6B00140E -:103D8000356A00400E00016EAF6A00140A00033E5F -:103D9000022020218F8500448F8A003027BDFFC07C -:103DA0003C048000AFB70034AFB40028AFB1001CB2 -:103DB000AFBF0038AFB60030AFB5002CAFB30024B2 -:103DC000AFB20020AFB000188C8701048CA900248A -:103DD000AC8A00808CA8002000E988230000B8216C -:103DE000AC880E108CA600240000A021AC860E1812 -:103DF0008C820E10AC820E148C830E18AC830E1CB9 -:103E0000122000333C168000936B000811600054B0 -:103E100000000000976E001031CDFFFF022D602BD7 -:103E20001580004F0000000097700010320FFFFF58 -:103E3000AECF0E003C0580008CB30000327200084B -:103E40001240FFFD0000000094B50E088CA50E0482 -:103E500032B0FFFF32140001128000440000000065 -:103E60000000000D3219A04024180040133800450E -:103E70003214A0001280003F00000000937300087D -:103E80001260000927A4001097620010305FFFFF46 -:103E900000BFC82B53200005AFB10010320800400E -:103EA0001100003400000000AFB10010A7900040E6 -:103EB000AF8500280E0002BD000000000040A021D8 -:103EC000104000BE8FB100101620FFCF0000000090 -:103ED0002E96000102D78825122000178FBF0038C8 -:103EE0008F85003024170F0010B700713C0480004C -:103EF0008C8F017805E0FFFE24180F0050B8008F6A -:103F00003C0480008C990E14241402403C051000DF -:103F1000AC9901448C930E1CAC930148A0800152D3 -:103F2000A480015AAC800160A4800158AC94015473 -:103F3000AC8501788FBF00388FB700348FB6003062 -:103F40008FB5002C8FB400288FB300248FB20020CF -:103F50008FB1001C8FB0001803E0000827BD00409F -:103F6000AED10E000A0003C33C05800014A0FFBEC2 -:103F70003219A0400E0001750000A0210A0003EADA -:103F80002E9600013C0380008C7F017807E0FFFE45 -:103F9000240208008F84003CAC6201783C0380005E -:103FA000946B008A316AFFFF0144382324E9FFFF44 -:103FB00031281FFF2D06000814C0FFF9346C4000A3 -:103FC00000A0A0210E000168008C90218F8300309A -:103FD00024040F000040A821023488233C068000FE -:103FE0001064000524050001938E004231C50001D4 -:103FF00000056A4035A500010015FC003C020100E7 -:1040000003E2C825AE5900008F93005032180036E5 -:10401000320F0008AE53000411E0004100B89825AB -:1040200094C30E0A8F84003C3C0B8100306AFFFF72 -:104030002492000832481FFF014B48253C0710001E -:10404000269200062410000EACC901600267982574 -:10405000A4D0015AAF88003CA4D201581620000811 -:104060003C1080008F8E003024050F0051C50002E7 -:1040700024170001367300400E00016E3C108000D2 -:104080008E180E1402402021AE1801448E0F0E1C13 -:10409000AE0F0148A2150152AE1301540E00017C6F -:1040A0003C151000AE1501780A0003E7000000007F -:1040B000128000053C07800094F20E08324900404F -:1040C00011200042000000008C8A01780540FFFEAC -:1040D0000000000094950E103C1005002403200001 -:1040E00032AEFFFF01D06825AC8D014C8C8C0E14D4 -:1040F0003C0B1000AC8C01448C860E1CAC86014835 -:10410000A0800152A480015AAC800160A4800158B3 -:10411000AC830154AC8B01780A0003F13C048000AD -:104120008F8D003C26920002A4D2015825AC0008D5 -:1041300031861FFF0A00044CAF86003CAC80014C66 -:1041400012800019000000008C9F0E10AC9F0144EB -:104150008C830E183C08800024110040AC83014879 -:104160008FBF0038A10001528FB70034A500015A5B -:104170008FB60030AD0001608FB5002CA50001584E -:104180008FB40028AD1101548FB300248FB20020EA -:104190008FB1001C8FB000183C04100027BD0040F8 -:1041A00003E00008AD0401788C820E14AC82014457 -:1041B0008C830E1C0A00048B3C0880000E000175E5 -:1041C0002E9600010A0003EB02D7882500000000AC -:1041D0000000000D000000002400033A0A000467FC -:1041E0003C04800027BDFFD8AFB100143C11800013 -:1041F000AFB00010AFB40020AFB3001CAFB20018D6 -:10420000AFBF00243C13080026733C340E0001F9B4 -:10421000363000703C14080026943CB40200902113 -:104220008E0800008E2400003883000130620001F7 -:10423000104000163C0A8000024048218D270000F3 -:104240003C1F08008FFF006C3C0F08008DEF0068DA -:1042500000E8102303E260210000C0210182702BDE -:1042600001F8682101AE40213C010800AC2C006C33 -:104270003C010800AC2800688D4B00003966000145 -:1042800030C5000114A0FFED00E040218E1F0000AA -:104290003C1808008F18006C3C0D08008DAD0068BC -:1042A00003E8C823031938210000702100F9602BAE -:1042B00001AE4021010C58213C010800AC27006CE4 -:1042C0003C010800AC2B00688E2801002406FF800A -:1042D0003C04800A2505024000A64824AE280020A0 -:1042E000AE2900248E09000030A3007F0064502115 -:1042F0003C078000AF8A0044AF880030AF890024BB -:104300008CE201780440FFFE000000008E1F0000D8 -:104310003C1808008F1800743C0D08008DAD00702B -:1043200003E9C82303195821000070210179302BBB -:1043300001AE602101864821240508003C010800E7 -:10434000AC2B00743C010800AC290070ACE501788E -:1043500090E40108A384004293830042306A000184 -:104360001140000F240E0D002502F8002C47030118 -:1043700010E0001C000819C22464FFF00004504241 -:10438000000A41400E00039A0113D8213C0A400064 -:104390003C088000AD0A01380A0004BD000000009E -:1043A000110E0026240F0F00110F002A3C02800876 -:1043B0003447008090FF00002418005033F900FFBC -:1043C0001738FFF33C0A40000E0009A3000000006C -:1043D0003C0A40003C088000AD0A01380A0004BDD8 -:1043E000000000008F8400340064282B14A0000B10 -:1043F0008F86004800866021258BFFFF0163482BD4 -:104400001520000600646823000D19400E00039A71 -:104410000074D8210A0005193C0A40000000000081 -:104420000000000D00000000240003AD0E00039A00 -:10443000000000000A0005193C0A40003C1B08006F -:10444000277B3DB40E00039A000000000A00051906 -:104450003C0A40003C1B0800277B3DD40E00039A19 -:10446000000000000A0005193C0A40008F8200503D -:1044700024430001304200FFAF83005003E00008F6 -:1044800000000000000411C003E0000824420240C4 -:104490003C04080024843BCC2405001A0A00007C5C -:1044A0000000302127BDFFE0AFBF001CAFB20018F5 -:1044B000AFB10014AFB000103C108000920B0109A6 -:1044C0002412FF800E0005563164007F8F9100306A -:1044D0000051502101524024AE08002492030109EA -:1044E0000E0005563064007F24060080240700C0BB -:1044F00024040040AE000810AE040814AE060818EC -:10450000AE07081C920C01090051F82133F8007F16 -:104510003C19800A031910213184007F0E000556D2 -:10452000AF8200448E1101003C0C008035850001F3 -:104530000222782101F24824AE0908048E0E0100FF -:10454000359800023609090001C2682131AB0078B4 -:1045500001655025AE0A08208E0501008E08010075 -:10456000360509800102182124640040009230249D -:10457000AE0608088E07010000E2F82127F9004086 -:104580003332007802588825AE1108248E040100C9 -:10459000952F000C8FBF001C8FB2001831EEFFFF6B -:1045A000000E69C0AE0D0800AE0C0828952B000C5B -:1045B0008FB10014316AFFFF000A41C0AE08002C21 -:1045C0008CA300508FB000108CA2003C8D240004FE -:1045D0008CA6001C8CA7003827BD0020AF83006884 -:1045E000AF820058AF840054AF86006003E000083B -:1045F000AF8700643C0A0800914A3BF13C0908007F -:1046000095293BEA3C051100000A3C0025280002E0 -:1046100000E8302500C5182524820008AC8300007E -:1046200003E00008AC8000043C0880003507090066 -:1046300090E60011240200280080502130C300FFC2 -:1046400000A0602110620002340B86DD240B0800FC -:104650003C07800034E20A9A9459000034EF0A9C27 -:1046600034ED0AA03338FFFFAD5800008DEE000096 -:1046700034E80A8024040001AD4E00048DA9000036 -:10468000AD4900089105001930A3000310640043F0 -:104690002866000214C000B0240400021064008BDD -:1046A000240500031065009634E60AA43C090800BE -:1046B00095293BE0240208005162004D3C0E800029 -:1046C0003C0E800035C5090090A6001290B9001973 -:1046D00035CB09808D68002830C700FF000778803F -:1046E0003138FFFF332300FF01F8102100032500BC -:1046F0000088702500025C003C0D600001CD302573 -:10470000356906FFAD490004AD4600008CA7002CBA -:1047100025490028AD4700088CB90030AD59000C80 -:104720008CB80034AD5800108CAF0038AD4F001479 -:104730008CA3001CAD4300188CA800203C03800013 -:104740003462093CAD48001C8CA40024346F09007D -:10475000AD4400208CAD0028AD4D00248C590000E4 -:10476000AD2C000425220014AD3900008C78010C1A -:10477000AD38000891E800123C04080090843BF03A -:10478000AD20001000082F0000046C0000AD602573 -:10479000358AFFFF03E00008AD2A000C3C09080041 -:1047A00095293BE03C0F080095EF3BEA34F90AA459 -:1047B0003C0E080095CE3BDC972800003138FFFF07 -:1047C00001F8682101AE382300082C0024E3FFF231 -:1047D00000A3202524020800AD44000CAD400010C9 -:1047E000AD4B00141562FFB6254A00183C0E800040 -:1047F00035CD090091A2001191A700193C050800D0 -:1048000094A53BE6304600FF35CB0A80956E002A22 -:104810000006C88230F800FF9787005C00191E0070 -:1048200000187C003128FFFF00A82021006F4825D8 -:104830000124102501C730213C0B4000004BC82546 -:104840000006C400AD590000AD58000491AF001837 -:104850003C03000624E90001000F46000103702517 -:10486000AD4E00088DA5002C3C0380003462093C4D -:10487000AD45000C8DAB001C31247FFF2549001491 -:10488000AD4B00108C590000AD2C0004346F0900B2 -:10489000AD3900008C78010CA784005C252200143F -:1048A000AD38000891E800123C04080090843BF009 -:1048B000AD20001000082F0000046C0000AD602542 -:1048C000358AFFFF03E00008AD2A000C34E20AA499 -:1048D00094460000951900283C09080095293BE002 -:1048E0000006C40000197C00370E810001EB68252A -:1048F000AD4E000CAD4D00100A0005E2254A001433 -:104900003C09080095293BE03C18080097183BEA51 -:104910003C0F080095EF3BDC94CE00003139FFFFDF -:10492000950D002803194021010F3823000E2400A3 -:10493000000D2C0024E3FFEE00A33025348281001B -:10494000AD42000CAD460010AD400014AD4B001858 -:104950000A0005E2254A001C1460FF5434E90AA449 -:10496000952800003C09080095293BE000083C0020 -:1049700000EB1825AD43000C0A0005E2254A0010A3 -:1049800003E00008240207D027BDFFE0AFB2001803 -:10499000AFB10014AFB00010AFBF001C0E00005C40 -:1049A000008088218F8800588F8700543C0580083C -:1049B00034B20080011128213C10800024020080C4 -:1049C000240300C000A72023AE0208183C0680087C -:1049D000AE03081C18800004AF850058ACC5000465 -:1049E0008CC90004AF8900541220000936040980E4 -:1049F0000E00069500000000924C00278E0B0074FC -:104A000001825004014B3021AE46000C360409806F -:104A10008C8E001C8F8F006001CF682319A00004CA -:104A20008FBF001C8C90001CAF9000608FBF001CDB -:104A30008FB200188FB100148FB000100A00005E12 -:104A400027BD00208F8600688F8300588F82005416 -:104A50003C05800834A40080AC860050AC83003C48 -:104A600003E00008ACA200043C038000346700703F -:104A70008CE30000308700FF3C0408008C84005465 -:104A800027BDFFF830AA00FF248200013C01080086 -:104A9000AC22005430C800FFAF8300243C098000E2 -:104AA0008D25017804A0FFFE352B00708D65000078 -:104AB000A3A700033C1808008F1800748FB90000EA -:104AC0003C0D08008DAD007000A338233C047FFF2F -:104AD00000E078213482FFFF0307382100007021B5 -:104AE0000322582401AE302100EF602B000847C09C -:104AF00000CC182101682825AFA500003C01080062 -:104B0000AC2700743C010800AC2300709124010A1A -:104B1000A3A000023C0280FFA3A400018FB8000004 -:104B2000314F007F3459FFFF03196824000F7600CE -:104B30003C0B002001AE6025356A20002408FF8070 -:104B40003C06100027BD0008AD2C014CAD2A0154D5 -:104B5000A5200158A128015203E00008AD260178E4 -:104B60003C038000346200708C480000308A00FFF3 -:104B700030A900FFAF8800243C0480008C850178B8 -:104B800004A0FFFE348700708CEB00003C05080099 -:104B90008CA500743C1908008F390070016820232F -:104BA00000A470210000102101C4C02B0322782131 -:104BB0003C07800001F868213C010800AC2E00741D -:104BC00034E60A003C010800AC2D00708CCC0020BB -:104BD0000009582B34E80980ACEC01448CC900244E -:104BE000000B1540ACE90148A0EA01509104004CCB -:104BF000A0E4016D03E00008A4E0015827BDFFE830 -:104C0000308400FFAFBF00100E00070D30A500FF7D -:104C10008F8300588FBF00103C0580003446004051 -:104C20002404FF903C02100027BD0018ACA3014CE7 -:104C3000A0A40152ACA6015403E00008ACA2017884 -:104C400027BDFFE03C088008AFBF001CAFB20018D2 -:104C5000AFB10014AFB00010351000808E06001800 -:104C60003C078000309200FF00C72025AE040018EA -:104C70000E00005C30B100FF9203000534620008B2 -:104C80000E00005EA2020005024020210E00073443 -:104C900002202821024020218FBF001C8FB2001863 -:104CA0008FB100148FB00010240500052406000108 -:104CB0000A0006CF27BD00203C08800027BDFFE882 -:104CC000AFB0001035050980AFBF001490A70009F0 -:104CD000240200063506090030E300FF241000041A -:104CE000106200722408000294AE005C3C0D0204C5 -:104CF00031CCFFFF018D5825AC8B000090AA000835 -:104D000031490020112000080000000090BF004E33 -:104D10003C1901033738030033EF00FF01F8282561 -:104D200024100008AC85000490CC001190C900113B -:104D3000318A00FF000A5882312700FF256A0005EA -:104D4000000A108038E300281460002900824823FC -:104D500090CF00123C1980003722090031E500FF96 -:104D60000005708001D06821000D340034C406FFB6 -:104D7000AD240004904C001190580012373F098078 -:104D80008FE400348F2F010C00105882330500FF90 -:104D900000AB702100083400008F1823000E6F0054 -:104DA00001A61025319F00FC3067FFFF03E9C021F9 -:104DB0000047C825014B7821000F2880AF19000C4F -:104DC0000E00005C012580213C0A800824090004B3 -:104DD000354800800E00005EA10900090200102184 -:104DE0008FBF00148FB0001003E0000827BD00182B -:104DF00090CE001190CD00193C07080094E73BE6E7 -:104E000031C600FF0006208231AC00FF00045E00C6 -:104E1000000C1C00016310250047C8253C1F400002 -:104E2000033FC0253C198000AD380000372209003F -:104E3000904C001190580012373F09808FE40034E5 -:104E40008F2F010C00105882330500FF00AB70213A -:104E500000083400008F1823000E6F0001A61025F3 -:104E6000319F00FC3067FFFF03E9C0210047C825E0 -:104E7000014B7821000F2880AF19000C0E00005C58 -:104E8000012580213C0A800824090004354800805F -:104E90000E00005EA1090009020010218FBF00145E -:104EA0008FB0001003E0000827BD00180A00076F4C -:104EB0002408001227BDFFD8AFB40020AFB3001CF8 -:104EC000AFB20018AFB10014AFBF0024AFB00010F4 -:104ED0003C06800090C3010B309200FF30B300FF0E -:104EE000306200300000A0211040007000008821D6 -:104EF00034C409809088000800083E0000072E0393 -:104F000004A00097240400048F8800583C01080086 -:104F1000A0243BF03C0C8000AD8000483C038000A6 -:104F2000906E010B31C5002010A000073C028000EC -:104F300034790980933800080018860000107E0339 -:104F400005E2009C3C0280083450090034470A8086 -:104F5000904D010B94EB002C92030011921F001254 -:104F600090E50018307800FF33F900FF00197880D1 -:104F700001F8702101D1502130B100FF01514821C9 -:104F80002524000A31AC00403091FFFF000C302B8B -:104F900002202021A78B005C3C010800A42A3BE6EC -:104FA0003C010800A4293BE83C010800A4293BEA95 -:104FB0003C010800A4203BE03C010800A4203BDCAD -:104FC0000E0001C9010680230E0005B20040202119 -:104FD000004020210E0005BF020028211680005C41 -:104FE000000000000E0001F2022020213C08080011 -:104FF00091083BF031140003128000163C1F80081A -:105000008F8400583C0C800835860080248B00017A -:10501000ACCB003C3C0580088CAA00040160202138 -:10502000014B482319200002AF8B00588CA40004C8 -:105030000E000695ACA400043C0F80008DEE0074B9 -:105040003C05800834AD0080004E8821ADB1000CD5 -:105050003C1F800837F9008002402021026028218F -:10506000A320006B0E00070D3C1280008F980058A3 -:1050700034500006AE58014C0E0005503C13100091 -:10508000A24201528FBF0024AE5001548FB40020C1 -:10509000AE5301788FB100148FB3001C8FB200188B -:1050A0008FB0001003E0000827BD002834C309803A -:1050B000906F0008000F7600000E6E0305A000330D -:1050C00034C209009059001B241F00103C01080045 -:1050D000A03F3BF0333800021300FF908F88005848 -:1050E0008F8300641468FF8E3C0380000E00005C18 -:1050F000000000003C0980083525008090A40009CC -:1051000024070016308800FF1107000D0000000082 -:1051100090A600093C0C0800918C3BF0240A000882 -:1051200030C400FF358B00013C010800A02B3BF090 -:10513000108A002F240D000A108D00282402000C74 -:105140000E00005E000000000A0007FC8F88005877 -:105150000E000763004020210A00082E0000000016 -:105160003C0B8008356A00808D4800548CC9010CC6 -:105170001120FF66AF880058240600143C01080087 -:10518000A0263BF00A0007FB3C0C80009071000851 -:10519000241400023C010800A0343BF0323000200F -:1051A0001200000B241400018F8800580A0007FC2D -:1051B00024110008345F00808FE70038AC470004FA -:1051C0008C430004AFE3003C0A0008073C02800067 -:1051D0008F8800580A0007FC24110004A0A20009CF -:1051E0000E00005E000000000A0007FC8F880058D7 -:1051F000240200140A0008ADA0A2000927BDFFE8A0 -:10520000AFBF0014AFB000103C1080009202010943 -:10521000240500010E00070D304400FF3C1F8008EC -:1052200093F8000E37E3008093F9000F906E00268C -:1052300093E9000A332F00FF00186600000F6C008E -:1052400031CB00FF018D5025000B3200014638257F -:10525000312800FF3445600000E820252402FF814A -:105260003C031000AE04014C8FBF0014AE05015486 -:10527000A2020152AE0301788FB0001003E00008D3 -:1052800027BD001827BDFFE8308400FFAFBF001026 -:105290000E00070D30A500FF344600403C0480009E -:1052A0002405FF92AC860154A08501528F830058DB -:1052B0008FBF00103C02100027BD0018AC83014CCA -:1052C00003E00008AC82017827BDFFD8AFB2001818 -:1052D000AFB10014AFB00010AFBF0020AFB3001CDF -:1052E0003C07800090E20109308600FF30B000FFEB -:1052F000000618C232040002307100011480000759 -:10530000305200FF3C098008353300809268000568 -:105310003105000810A0000C30CA00100240202106 -:105320000E00074502202821240200018FBF002023 -:105330008FB3001C8FB200188FB100148FB0001013 -:1053400003E0000827BD00281540003034E50A00BE -:105350008CB900248CB800081338004700004021A5 -:105360003C0E800835D30080926D0068240B00024B -:1053700031AC00FF118B00803C068000927F004C16 -:1053800090C40109509F00043213007C1100006793 -:10539000000000003213007C1660005A02402021F9 -:1053A00016200008320C00013C07800034EB0A0094 -:1053B0008D6500248CE8010414A8FFDC0000102196 -:1053C000320C00011180000D024020213C108000B1 -:1053D0008E0E010C8F8D006811CD000800000000BA -:1053E0000E0007E2022028218E0F010C3C188008D5 -:1053F00037100080AE0F0050024020210E0007340D -:10540000022028210A000900240200013C070800AC -:105410008CE7006424E600013C010800AC2600642F -:105420001600000D00000000022028210E000734A5 -:1054300002402021926F0068240D000231EE00FF2F -:1054400011CD0022024020210E0008B4000000000F -:105450000A000900240200010E00003D240400019E -:10546000926C0025020C58250E00005EA26B0025F0 -:105470000A000940022028218E6300188CE40104F0 -:105480008CBF002400031602149FFFB53045007F37 -:105490009269004C264400013093007F1265004061 -:1054A000312300FF1464FFAF3C0E80082648000142 -:1054B0003111007F310200FF1225000B240800018A -:1054C000004090210A00090D241100012405000468 -:1054D0000E0006CF240600010E0008B400000000F4 -:1054E0000A000900240200012407FF800247282443 -:1054F00000A79026324200FF004090210A00090DCB -:10550000241100010E0007E202202821320600309B -:1055100010C0FFA332100082024020210E00074578 -:10552000022028210A000900240200018E630018CD -:105530000240202102202821006610250E0008D6F6 -:10554000AE6200189264004C24050003240600019A -:105550000E0006CF308400FF0E00003D2404000141 -:10556000926A0025020A48250E00005EA269002505 -:105570000A000900240200018E7800183C198000FE -:105580000240202103197825022028210E0007342B -:10559000AE6F00189264004C0A00098824050004CC -:1055A0003246008038CA0080146AFF6E3C0E8008C4 -:1055B0000A0009612648000127BDFFC0AFB00018EE -:1055C0003C108000AFBF0038AFB70034AFB600303A -:1055D000AFB5002CAFB40028AFB30024AFB20020A9 -:1055E0000E00055EAFB1001C920401089205010B8C -:1055F000308400FF0E0008E730A500FF144000D6FD -:105600008FBF00383C09800835280080A100006B5E -:105610003607098090E60000240200503C1708007D -:1056200026F73DF430C300FF3C14080026943E04E6 -:10563000106200033C1080000000B8210000A0218F -:10564000241F001036110A00361309808E1601043B -:105650008F8D00588E38002436190A808E720020F3 -:105660003C010800A03F3BF0972C002C8EF5000079 -:10567000932B0018024D702302D878233C010800B8 -:10568000AC2F3BCC3C010800AC2E3BD03C010800C9 -:10569000AC2D3BF4A78C005C02A0F809317200FF2E -:1056A000304A0002154000DA3045000110A000B475 -:1056B00000000000360509008E2B002490BF001169 -:1056C00090B9001290B6001133EF00FF333800FF9D -:1056D00032CD00FF0018708001CF8021024D602183 -:1056E0000212A821258A00103C010800A4353BE8DD -:1056F0003C010800AC2B3BF83C010800A42A3BE429 -:105700003C010800A4303BE60260B0213C1580005B -:105710008F9200588F8400608ED3002024110006E1 -:1057200000923023027228233C010800AC313BEC8C -:1057300004C000AF0000982104A000AD00C5102BEC -:10574000104000AF000000003C010800AC263BD038 -:105750008E9000000200F8090000000030430002B3 -:105760001460006F004088213046000154C00011D1 -:105770008E9200043C0808008D083BD43C09C00010 -:105780003C04800001093825AEA70E008C8B000078 -:10579000316A00081140FFFD00000000948D0E08E2 -:1057A00024130001A78D00408C8C0E04AF8C0028C0 -:1057B0008E9200040240F8090000000002228825B1 -:1057C000322E000215C000A5000000003C180800A1 -:1057D00097183BDC3C12080096523BE83C19080045 -:1057E00097393BDE3C0708008CE73BD4031240218D -:1057F0003C0B08008D6B3BF83C0E080095CE3BF24D -:105800003C128000011978218E46010C00F86821B5 -:1058100025EC000201AE482101675021AF860068E7 -:105820003C010800AC2A3BF83C010800A4293BE0FD -:105830003C010800A4283BEA0E0001C93184FFFFA7 -:105840000E000550004080213C010800A0223BF1E1 -:105850008E8200080040F809020020218F85005840 -:105860000E0005BF004020218E90000C0200F809B8 -:10587000004020213C03080094633BEA3C020800FE -:1058800094423BDE00622021248500020E0001F2DA -:1058900030A4FFFF3C1908008F393BCC3C1F0800A7 -:1058A0008FFF3BD4033FC0233C010800AC383BCC06 -:1058B00017000006000000003C0508008CA53BEC2A -:1058C00034BF00403C010800AC3F3BEC126000429A -:1058D0008F8200448E430E108F930044AE630020ED -:1058E0008E440E18AE6400243C04080094843BE00F -:1058F0000E000697000000008F8600588E8A001068 -:105900003C010800AC263BF40140F809000000000F -:105910003C0908008D293BCC1520FF7E8F92005852 -:105920009796005C3C14800E323500100E0006C6BF -:10593000A696002C56A000458EEB000432270040AE -:1059400054E0001E8EF100088EEC000C0180F80976 -:10595000000000008FBF00388FB700348FB60030D2 -:105960008FB5002C8FB400288FB300248FB2002095 -:105970008FB1001C8FB0001803E0000827BD004065 -:10598000920901098F88003000093E0000E83025A7 -:10599000AE0600808E2300208E240024AFA30010CA -:1059A000AE030E148FA20010AE020E10AE040E1C39 -:1059B000AE040E180A0009E3360509000220F809B2 -:1059C000000000008EEC000C0180F80900000000CF -:1059D0000A000A8B8FBF0038240800012410000140 -:1059E000A4400020A44800220A000A6FAC50002402 -:1059F0003C010800AC203BD00A000A0A8E9000004F -:105A00003C010800AC253BD00A000A0A8E90000039 -:105A100092110109000028210E000734322400FFF2 -:105A20008FBF00388FB700348FB600308FB5002C91 -:105A30008FB400288FB300248FB200208FB1001CD8 -:105A40008FB0001803E0000827BD00400160F8098E -:105A5000000000000A000A85322700405260FFB1B2 -:105A60009796005C8EB60E148F940044AE9600207C -:105A70008EAF0E1CAE8F00240A000A7E9796005C43 -:105A80008F8200000004218003E0000800821021C2 -:105A90003C07800834E20080904300690080402188 -:105AA000106000093C0401003C0708008CE73BF44F -:105AB0008F83001C00E320230480000893890008E2 -:105AC00014E300030100202103E0000800801021FE -:105AD0003C04010003E00008008010211120000BAD -:105AE000006738233C0D800035AC0980918B007C29 -:105AF000316A0002114000202409003400E9702BB3 -:105B000015C0FFF10100202100E938232403FFFC28 -:105B100000A3C82400E3C02400F9782B15E0FFEAB5 -:105B20000308202130C400030004102314C0001413 -:105B3000304900030000302100A9782101E67021DE -:105B400000EE682B11A0FFE03C0401002D3800019D -:105B50000006C82B010548210319382414E0FFDA98 -:105B60002524FFFC2402FFFC00A218240068202149 -:105B700003E00008008010210A000AF42409003024 -:105B80003C0C80003586098090CB007C316A000493 -:105B90001540FFE9240600040A000B030000302131 -:105BA0003C0308008C63005C8F82000427BDFFE883 -:105BB000AFBF001410620005AFB00010000329C091 -:105BC00024A40280AF840000AF8300043C10800056 -:105BD00036030A00946500320E000AD530A43FFF58 -:105BE0008E0401003C180080370F00030082C8219A -:105BF0002402FF80032260243329007F000CF94037 -:105C000003E94025332E00783C0D1000010D50258E -:105C100001CF5825AE0C002836080980AE0C080CC0 -:105C2000AE0B082CAE0A0830910300693C06800CCC -:105C30000126382110600006AF8700208D09003C46 -:105C40008D06006C0126382318E0007F000000005C -:105C50003C0C8008358B00803C0A8000A160006904 -:105C6000355009808E0200383C06800034C50A0099 -:105C700090AD003C31A8002011000019AF82001C3B -:105C8000240E00013C19800037300A00A38E000862 -:105C9000AF8000108E0400248F85001024180008A7 -:105CA000AF80000CAF8000143C010800A4383BDE3C -:105CB0003C010800A4203BF20E000AD9000030216C -:105CC000920F003C8FBF00148FB00010000F714284 -:105CD000AF82001827BD001803E0000831C20001A0 -:105CE00090B90032240F0001333800FF00182182E0 -:105CF000108F003F241F0002109F006234C20AC0B0 -:105D00003C03800034640A008C9900241720001D95 -:105D10003466090090830030241F00053062003F84 -:105D2000105F004C240500018F86000CA38500083D -:105D3000AF860014AF8600103C19800037300A008F -:105D40008E0400248F850010241800083C010800F0 -:105D5000A4383BDE3C010800A4203BF20E000AD927 -:105D600000000000920F003C8FBF00148FB00010A5 -:105D7000000F7142AF82001827BD001803E0000831 -:105D800031C200018C8800088C8D00248CCB00640B -:105D90003C19800037300A00AF8B0010A380000848 -:105DA0008E0400248F86000C8F850010010D602367 -:105DB00024180008AF8C00143C010800A4383BDE16 -:105DC0003C010800A4203BF20E000AD900000000AC -:105DD000920F003C8FBF00148FB00010000F714273 -:105DE000AF82001827BD001803E0000831C200018F -:105DF00090A7003030E3003F5064002834C50AC04B -:105E00008CAA00241540002234C809008CAB00483D -:105E10003C0C7FFF3585FFFF016510243C18800096 -:105E2000AF82000C370509008F8E000C8CAF00602C -:105E300001CF682B15A0000201C020218CA40060B6 -:105E40000A000B75AF84000C8D02006C0A000B5029 -:105E50003C0680008C8900488F86000C3C0A7FFF3E -:105E60003550FFFF013038243C0480082405000130 -:105E7000AF870014AC80006CA38500080A000B8378 -:105E8000AF8600108C4400140A000B75AF84000C20 -:105E90008D0200680A000BBD3C18800034C40980E4 -:105EA0008C8600708CB0001400D0482B11200004A8 -:105EB000000000008C8200700A000BBD3C188000BE -:105EC0008CA200140A000BBD3C1880008F850010C6 -:105ED00027BDFFE0AFBF0018AFB1001414A0000849 -:105EE000AFB000103C04800034870A0090E6003018 -:105EF0002402000530C3003F106200B7348409005B -:105F00008F91000C00A080213C048000348E0A0098 -:105F10008DCD00043C0608008CC63BD031A73FFF66 -:105F200000E6602B5580000100E03021938F0008CF -:105F300011E0007600D0102B349909809338007C52 -:105F400033040002108000772403003400C3F82BD0 -:105F500017E000D600C3302300D0102B3C0108000E -:105F6000A4233BDC1440006D020018213C0408000F -:105F70008C843BCC0064282B54A0000100602021BD -:105F80003C05800034A90A009128003C3C0108002F -:105F9000AC243BD4310300201460000200004821EF -:105FA0008CA90E188F8800180128502B1140005F13 -:105FB000000000003C0508008CA53BD400A960212E -:105FC000010C582B1160005C00B0682B01093823CC -:105FD00000E028213C010800AC273BD4120000035C -:105FE0002402FFFC10B0008C322A000300A2F82427 -:105FF0003C010800A4203BF23C010800AC3F3BD42C -:1060000003E028218F840010120400063C0380085E -:106010008C6A006C02002021AF91000C2550000119 -:10602000AC70006C8F8B001400858823AF9100103A -:1060300001652023AF8400141220000224070018F9 -:10604000240700103C0E800835C6008090CD006803 -:10605000240C00013C010800A0273BF031A700FF01 -:1060600010EC0047000000001480001800002821F8 -:106070003C0B800091650109357109808E23001861 -:1060800030A500FF0003560224A300013146007F23 -:106090003070007F1206007E240CFF803C0F8008C9 -:1060A00035E90080A123004C3C0808008D083BEC3A -:1060B000240E00023C010800A02E3C31350D0008E2 -:1060C0003C010800AC2D3BEC240500103C1F800077 -:1060D00037E40A009099003C333800201300000593 -:1060E00000A02021240200013C010800AC223BD486 -:1060F00034A400018FBF00188FB100148FB00010BE -:106100000080102103E0000827BD00203C010800AA -:10611000A4203BDC1040FF95020018210A000C105F -:1061200000C018210A000C08240300303C050800B8 -:106130008CA53BD400B0682B11A0FFA80000000084 -:106140003C04080094843BDC0085782101E7702B37 -:1061500011C000072CA200043C1F60008FF95404FA -:106160003338003F1700FFE3240400422CA2000450 -:106170001040FF9A240400420A000C738FBF0018DD -:106180001528FFB9000000008CC200183C188000E0 -:10619000241900020058F825ACDF001837040A0063 -:1061A000A0D900689089003C240F000400A01021B1 -:1061B000312800203C010800A02F3C3111000002D2 -:1061C00024050010240200013C010800AC223BCC55 -:1061D0000A000C693C1F80008F8800148C890060C5 -:1061E0000109282B14A00002010088218C91006075 -:1061F0003C0B80008D640E18240A00010220282127 -:1062000002203021A38A00080E000AD90220802132 -:106210000A000BF7AF820018000A182312200007AB -:10622000306400033C0D800035A7098090EC007CB1 -:10623000318B000415600019248E00043C01080015 -:10624000A4243BF23C18080097183BF203052021D8 -:1062500000C4782B11E0FF6C8F8400102CA6000581 -:1062600014C0FFA42404004230B900031720000228 -:1062700000B9182324A3FFFC3C010800AC233BD445 -:106280003C010800A4203BF20A000C3600602821E3 -:1062900000AC38240A000C5C00EC18263C01080015 -:1062A000A42E3BF20A000CC6000000003C010800CE -:1062B000AC203BD40A000C72240400428F830014EB -:1062C0003C0B8000356A0A001460000600001021B3 -:1062D000914600302405000530C400FF10850003FE -:1062E0000000000003E000080000000091490048A1 -:1062F000312800FF000839C214E0FFFA3C0480088E -:106300003C06080094C63BDC3C0308008C633BF46D -:106310003C0508008CA53BD43C18080097183BF2BC -:106320000066C8218C8E00040325782101F86821BD -:1063300001AE60231980001D000000009158004C40 -:106340008F8D0020956E0E10330F00FF8DA9000475 -:1063500001CF30238DAA000030CFFFFF000F610076 -:10636000012C2821000038210147202100AC182BE6 -:106370000083C821ADA50004ADB9000091B8000AA2 -:1063800001F87021A1AE000A956C0E128F8A0020D0 -:10639000A54C00089549003825280001A54800387B -:1063A0009147000D34EB0008A14B000D03E00008FD -:1063B0000000000027BDFFD8AFB00018938F000881 -:1063C0008FB000143C087FFF8F8700103C0C8000CA -:1063D0003518FFFFAFBF0020AFB1001C35990A0090 -:1063E00002181824932A003C000F5FC03C02BFFF34 -:1063F0002CF000013449FFFF006BF8253C08080031 -:106400008D083BF48F99001C3C18080097183BEA54 -:1064100003E9582400107F803C07EFFF3C05F0FFA4 -:10642000016F18253C1180003149002034E2FFFF44 -:1064300034ADFFFF362E098027A500102406000288 -:1064400001194023270A00020062182400808021DD -:1064500015200002000058218D8B0E1CA7AA0012E7 -:106460000500003A2407000030EF00FF000F3F0056 -:10647000006740253C028008AFA80014344B008020 -:10648000916A00683C0F080091EF3BF13C09DFFF87 -:10649000353FFFFF000A602B3C02080094423BE4BA -:1064A000A3AF0011011FC024000CCF400319182511 -:1064B0008FA70010AFA300143C1F080093FF3BF30D -:1064C000A7A200168FA8001400ED48243C0B010081 -:1064D0003C0A0FFF012BC82533F80003354CFFFFA2 -:1064E000010D78243C027000032C382400181E0093 -:1064F00000E2482501E35825AFAB0014AFA9001016 -:1065000091DF007CA3BF00150E00007200000000A8 -:10651000362D0A0091A6003C30C4002010800006F1 -:10652000260200083C11080096313BE0262EFFFFB2 -:106530003C010800A42E3BE08FBF00208FB1001C5F -:106540008FB0001803E0000827BD00288F8A0018CC -:10655000016A602B5580FFC4240700010A000D501A -:1065600030EF00FF938300083C02800027BDFFD876 -:1065700034480A0000805021AFBF002034460AC0D2 -:10658000010028211060000E34440980910700307A -:10659000240B00058F89000C30EC003F118B000BA1 -:1065A00000003821AFA900103C0B80088D69006CF9 -:1065B000AFAA00180E00013AAFA90014A38000088A -:1065C0008FBF002003E0000827BD00288D1F004872 -:1065D0003C1808008F183BD48F9900143C027FFFB1 -:1065E0008D0800443443FFFFAFA900103C0B800826 -:1065F0008D69006C03E370240319782101CF6823AF -:1066000001A83821AFAA00180E00013AAFA9001462 -:106610000A000DA5A38000083C05800034A60A00EE -:1066200090C7003C3C06080094C63BF23C020800C0 -:106630008C423BEC30E30020000624001060003167 -:10664000004448253C0880083505008090A3006878 -:1066500000006821240C000100005021240B0001DF -:106660003C188000370F00708DE800003C07800068 -:10667000AF8800248CF901780720FFFE34E5007014 -:106680008CA200003C0308008C6300743C0F0800DF -:106690008DEF007000482023006428210000C021F5 -:1066A00000A4302B01F8702101C640213C010800F4 -:1066B000AC2500743C010800AC280070ACEC01482B -:1066C0003C0208008C423BF4A4EA0144A4EB0146DE -:1066D000ACE2014C3C04080090843BF13C03800890 -:1066E000A0E40152ACE90154A4ED0158346D0080DE -:1066F00091AC004C3C091000A0EC016D03E00008D7 -:10670000ACE901788CAC0E1C3C0B08008D6B3BD4C3 -:1067100094AA0E1694AE0E1401666821314BFFFF49 -:106720000A000DCD31CAFFFF3C04800034830A000B -:106730009065003C30A200201040002B00000000BB -:106740000000582100005021000048213C08800032 -:10675000350400708C8800003C078000AF8800245E -:106760008CEC01780580FFFE34EE00708DCD0000CA -:106770003C0508008CA500743C0408008C84007063 -:1067800001A8602300ACC02100001021030C302BB5 -:106790000082C821032678213C010800AC3800742F -:1067A0003C010800AC2F0070ACEB01483C0E080027 -:1067B0008DCE3BF4240DFF91240B0040A4E901444D -:1067C000A4EA0146ACEE014CA0ED0152ACEB015441 -:1067D000A4E0015890EA01093C091000A0EA016D0B -:1067E00003E00008ACE901788C8B0E1894870E1238 -:1067F00094860E1030EAFFFF0A000E0830C9FFFF32 -:106800003C04800034830A009065003C30A20020E4 -:106810001040003927BDFFF8240C00010000502172 -:10682000240B00013C088000350400708C890000B6 -:106830003C088000AF8900248D0D017805A0FFFE83 -:10684000350E00708DC700003C0508008CA5007453 -:106850003C0408008C84007000E9682300ADC0216E -:1068600000001021030D302B0082C821032678215F -:106870003C010800AC3800743C010800AC2F0070EB -:10688000910901093C0E080091CE3C313C0380FF88 -:10689000A3A900038FAD000031C7007F3462FFFF62 -:1068A00001A82025AFA400009106010AA3A00002C0 -:1068B0000007CE00A3A600018FA50000240E300023 -:1068C0003C09100000A2C02403197825AD0F014C2B -:1068D00027BD0008AD0E0154A5000158AD0C0148BC -:1068E000A50A0144240AFF80A50B0146A10A015212 -:1068F00003E00008AD0901788C8C0E1894870E1205 -:1069000094860E1030EBFFFF0A000E3E30CAFFFFE8 -:1069100027BDFFE8AFB000103C108000AFBF0014EF -:1069200036180A00970F00320E000AD531E43FFFF7 -:106930008E0E0100240DFF803C04200001C258216E -:10694000016D6024000C4940316A007F012A402516 -:10695000010438253C048008AE07083034860080E6 -:1069600090C500682403000230A200FF1043000419 -:106970008F9F000C8F990010AC9F0068AC99006449 -:106980008FBF00148FB0001003E0000827BD00186F -:106990003C0A0800254A37FC3C090800252938D460 -:1069A0003C08080025082C743C07080024E739E45B -:1069B0003C06080024C636383C05080024A5339060 -:1069C0003C04080024842FA03C030800246336EC18 -:1069D0003C020800244234883C010800AC2A3DFCFB -:1069E0003C010800AC293DF83C010800AC283DF40E -:1069F0003C010800AC273E003C010800AC263E10DC -:106A00003C010800AC253E083C010800AC243E04D3 -:106A10003C010800AC233E143C010800AC223E0CB3 -:086A200003E000080000000083 -:086A2800800009408000090014 -:106A3000800801008008008080080000800E0000AF -:106A4000800800808008000080000A8080000A0022 -:086A50008000098080000900AC -:00000001FF -/* - * This file contains firmware data derived from proprietary unpublished - * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. - * - * Permission is hereby granted for the distribution of this firmware data - * in hexadecimal or equivalent format, provided this copyright notice is - * accompanying it. - */ diff --git a/firmware/bnx2/bnx2-mips-09-5.0.0.j3.fw.ihex b/firmware/bnx2/bnx2-mips-09-5.0.0.j3.fw.ihex new file mode 100644 index 0000000..92e2204 --- /dev/null +++ b/firmware/bnx2/bnx2-mips-09-5.0.0.j3.fw.ihex @@ -0,0 +1,6051 @@ +:100000000800011008000000000051C4000000C8F2 +:10001000000000000000000000000000080051C4C3 +:10002000000000380000528C080000880800000022 +:10003000000051B4000052C4080053A00000008426 +:100040000000A478080051B4000001C00000A4FC26 +:10005000080031D808000000000080E40000A6BCC1 +:10006000000000000000000000000000080080E424 +:1000700000000124000127A00800048808000400F3 +:10008000000017EC000128C4000000000000000080 +:100090000000000008001BEC00000004000140B05C +:1000A000080000A80800000000003814000140B457 +:1000B00000000000000000000000000008003814EC +:0800C00000000030000178C8C7 +:0800C8000A00004400000000E2 +:1000D000000000000000000D636F6D352E302E30E3 +:1000E0006A33000005000002000000000000000369 +:1000F00000000014000000320000000300000000B7 +:1001000000000000000000000000000000000000EF +:1001100000000010000001360000EA600000000549 +:1001200000000000000000000000000000000008C7 +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000020000000000000000000000008D +:10017000000000000000000000000000000000007F +:10018000000000000000000000000010000000005F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000100000030C +:1001E000000000000000000D0000000D3C020800AF +:1001F000244252203C03080024635354AC400000C6 +:100200000043202B1480FFFD244200043C1D080005 +:1002100037BD9FFC03A0F0213C1008002610011000 +:100220003C1C0800279C52200E00025F00000000CA +:100230000000000D27BDFFE0AFBF0018AFB10014F4 +:10024000AFB000103C04800094820108304370007D +:10025000240220001062000B2862200114400036A6 +:1002600000001021240240001062002C0000000059 +:10027000240260001062002D000010210A00009D81 +:100280008FBF001834910100922400098E300018AD +:1002900010800020240300012402000914820006BB +:1002A0008F82001C3C0280089442001A0002140055 +:1002B000020280258F82001C8C42000C1040001529 +:1002C000000018210E000D45000000008F83001C67 +:1002D000962400088F8200189463001E9625000C57 +:1002E0000004240000832025AC500000AC4500042D +:1002F000AC400008AC40000CAC400010AC40001416 +:10030000AC400018AC44001C0E000D792404000120 +:10031000000018210A00009C006010210E00042E2D +:10032000000000000A00009C000010210E000C6577 +:1003300000000000000010218FBF00188FB10014D2 +:100340008FB0001003E0000827BD00208F82001C42 +:1003500027BDFFE0AFB00010AFBF0018AFB1001471 +:100360008C42000C3C1080008E11010010400034C3 +:100370008FBF00180E000D45000000008F8500188B +:1003800024047FFF0091202BACB100008E030104F8 +:100390009602010800031C003042FFFF006218258E +:1003A000ACA300049202010A96030114304200FF3C +:1003B0003063FFFF0002140000431025ACA20008C8 +:1003C0009603010C9602010E00031C003042FFFF51 +:1003D00000621825ACA3000C9603011096020112CE +:1003E00000031C003042FFFF00621825ACA3001080 +:1003F0008E020118ACA200148E02011CACA20018DF +:10040000148000088F82001C978200003C042005A5 +:100410000044182524420001ACA3001C0A0000DBA4 +:10042000A78200003C0340189442001E00431025A0 +:10043000ACA2001C0E000D79240400018FBF00182F +:100440008FB100148FB000100000102103E00008ED +:1004500027BD00203C0680008CC202B824030001A6 +:1004600004410008008028213C0208008C42006002 +:10047000244200013C010800AC22006003E00008B7 +:10048000006010218C83002094820016ACC302808F +:100490002442FFFCA4C202843C0208008C42005C9F +:1004A0008C84000494A3000E244200013C01080047 +:1004B000AC22005C3C021000A4C30286ACC40288DB +:1004C00000001821ACC202B803E00008006010214F +:1004D00027BDFFE0AFB000103C108000AFB20018A5 +:1004E000AFBF001CAFB10014361201009243000BE5 +:1004F0002402001A965100081462005A00002821B4 +:1005000032220001104000188F82001C8E42000031 +:10051000000223403C02003F3442FFFF0044102B06 +:10052000104000043C030040964200140A000124DD +:10053000008320218E030100240201005462000682 +:10054000964200143C028008904200043042000FA2 +:10055000000225009642001400821025AE020080A1 +:100560000A000157000000008C42000C10400028D7 +:10057000000000000E000D4500000000960201087A +:100580009603010C8F8500183042003E3063FFFF58 +:100590000002140000431025ACA200008E020100EE +:1005A000ACA20004960301169604010E8F82001C73 +:1005B00000031C003084FFFF00641825ACA3000872 +:1005C00096030110960401129446001E00031C00BD +:1005D0003084FFFF00641825ACA3000C3C0220000F +:1005E00000C2302596020114240400013042FFFFAE +:1005F000ACA200108E020118ACA200149202010BF2 +:10060000304200FFACA200180E000D79ACA6001C11 +:100610003C0208008C420040244200013C010800DA +:10062000AC2200403C0308008C63004432220002EC +:1006300032240004246300013C010800AC23004480 +:10064000108000080002282B024020218FBF001CD0 +:100650008FB200188FB100148FB000100A0000E3B1 +:1006600027BD00208FBF001C8FB200188FB100146F +:100670008FB0001000A0102103E0000827BD00206B +:1006800027BDFFE0AFB000103C108000AFB20018F3 +:10069000AFBF001CAFB10014361201009243000B33 +:1006A000240200031462006A9651000832220001FD +:1006B000104000178F82001C8E4300003C02003F58 +:1006C0003442FFFF000323400044102B504000053C +:1006D00024020100964200143C0300400A00018EEF +:1006E0000083202154620006964200143C028008D8 +:1006F000904200043042000F000225009642001490 +:1007000000821025AE0200800A0001BE0000000039 +:100710008C42000C10400025000000000E000D452A +:1007200000000000960201089603010C8F85001856 +:100730003042003E3063FFFF0002140000431025EA +:10074000ACA200008E020100ACA2000496030116C8 +:100750009604010E8F82001C00031C003084FFFFF2 +:1007600000641825ACA3000896030110960401123A +:100770009446001E00031C003084FFFF006418250F +:10078000ACA3000C3C02200000C2302596020114EC +:10079000240400013042FFFFACA20010ACA0001402 +:1007A000ACA000180E000D79ACA6001C3C0208009D +:1007B0008C420040244200013C010800AC22004071 +:1007C0003C0208008C420044322300042442000111 +:1007D0003C010800AC2200441060000832220002F4 +:1007E000024020218FBF001C8FB200188FB100146F +:1007F0008FB000100A0000E327BD00201040001554 +:100800008FBF001C3C0480008C8301043C026020EC +:10081000AC4300148C420004240301FE304203FF69 +:100820001443000C8FBF001C8C820100000219C20F +:100830002462FFFC2C420008104000032404000244 +:100840002462FFFD004420043C026000AC446914B3 +:100850008FBF001C8FB200188FB100148FB0001032 +:100860000000102103E0000827BD00203C048000A8 +:100870008C83010024020100506200033C028008C6 +:100880000000000D3C02800890430004000010218D +:100890003063000F00031D0003E00008AC830080FC +:1008A0002C8407811080000A000028213C0280006F +:1008B00094420108240320003042700014430005D4 +:1008C0002783FFB03C02800890420005304500FFBE +:1008D0002783FFB00005208000832021000510C081 +:1008E000004510238C8400003C030800246352E47C +:1008F000000210C0004310213C038000AC64009053 +:1009000003E00008AF82001C03E000080000102193 +:1009100003E00008000010212402010014820008F6 +:10092000000000003C0208008C4200FC2442000150 +:100930003C010800AC2200FC0A00022430A2002086 +:100940003C0208008C420084244200013C01080063 +:10095000AC22008430A200201040000830A3001018 +:100960003C0208008C420108244200013C010800BE +:10097000AC22010803E0000800000000106000083D +:10098000000000003C0208008C42010424420001E7 +:100990003C010800AC22010403E000080000000054 +:1009A0003C0208008C420100244200013C01080086 +:1009B000AC22010003E000080000000027BDFFE8B2 +:1009C000AFB000103C108000AFBF0014360401002F +:1009D0009483000830620004104000053066000275 +:1009E0008FBF00148FB000100A0000E327BD00186D +:1009F00010C00006006028218E0401000E000214C1 +:100A0000000000000A00025B240200018F8200083F +:100A10008E03010410430007000010218E04010022 +:100A20000E000214000000008E020104AF820008D4 +:100A3000000010218FBF00148FB0001003E00008E9 +:100A400027BD001827BDFFD83C036010AFB3001CC2 +:100A5000AFBF0020AFB20018AFB10014AFB00010AC +:100A60008C6450002402FF7F3C1308002673524818 +:100A7000008220243484380CAC6450003C02800096 +:100A800024030037AC4300083C06080024C6084095 +:100A9000026010212404001C2484FFFFAC460000E7 +:100AA0000481FFFD244200043C0208002442016C42 +:100AB0003C010800AC2252503C020800244205B818 +:100AC0003C010800AC2252543C020800244202843B +:100AD0003C010800AC2252903C0208002442040869 +:100AE0003C030800246308483C040800248408F4FC +:100AF0003C05080024A52C4C3C010800AC2252B057 +:100B00003C020800244207A43C010800AC2652988D +:100B10003C010800AC2552A43C010800AC2352ACB7 +:100B20003C010800AC2452B43C010800AC2252B88D +:100B30003C010800AC23524C3C010800AC20525848 +:100B40003C010800AC20525C3C010800AC20526023 +:100B50003C010800AC2052643C010800AC20526803 +:100B60003C010800AC20526C3C010800AC205270E3 +:100B70003C010800AC2452743C010800AC205278BF +:100B80003C010800AC20527C3C010800AC205280A3 +:100B90003C010800AC2052843C010800AC20528883 +:100BA0003C010800AC26528C3C010800AC26529453 +:100BB0003C010800AC20529C3C010800AC2552A02E +:100BC0003C010800AC2352A80E00055A00000000AA +:100BD0008F8300043C0208008C4200201062001F3A +:100BE000000088212792FFB03C100800261052E434 +:100BF0003C0208008C420020240500010225180454 +:100C0000004320248F820004004310245044000C31 +:100C10002631000110800008AF90001C8E430000B8 +:100C20003C028000AC4300900E000D0CAE05000CA1 +:100C30000A0002DE26310001AE00000C2631000160 +:100C40002E220002261000381440FFE9265200042C +:100C50003C0208008C420020AF8200043C1080005F +:100C60008E110000322200071040FFDA8F8300044B +:100C70003222000110400021322200028E020100C7 +:100C8000AE0200208E020104AE0200A80E0001F6A2 +:100C90008E0401009202010B304300FF2C62001D04 +:100CA00054400004000310800E0002100A0002FFEE +:100CB00000000000005310218C4200000040F809A1 +:100CC00000000000104000043C0280008C4301043E +:100CD0003C026020AC4300143C0208008C4200340B +:100CE0003C0440003C03800024420001AC64013815 +:100CF0003C010800AC2200343222000210400010F7 +:100D0000322200043C1080008E020140AE0200201E +:100D10000E0001F68E0401400E0003970000000053 +:100D20003C024000AE0201783C0208008C420038D0 +:100D3000244200013C010800AC22003832220004A9 +:100D40001040FFA48F8300043C1080008E020180BD +:100D5000AE0200200E0001F68E0401808E03018099 +:100D600024020F00146200073C0280088E020188F2 +:100D70003C0300E03042FFFF004310250A00033B24 +:100D8000AE020080344200809042000024030050F4 +:100D9000304200FF14430007000000000E000374FF +:100DA0000000000014400003000000000E00095D78 +:100DB000000000003C0208008C42003C3C04400063 +:100DC0003C03800024420001AC6401B83C010800EF +:100DD000AC22003C0A0002C38F8300043C02900056 +:100DE00034420001008220253C028000AC440020F7 +:100DF0003C0380008C6200200440FFFE00000000E5 +:100E000003E00008000000003C02800034430001C1 +:100E10000083202503E00008AC44002027BDFFE04C +:100E2000AFB10014AFB0001000808821AFBF001830 +:100E30000E00034530B000FF8F83FFA80220202161 +:100E40009062002502028025A07000258C70001899 +:100E50003C0280000E000350020280241600000AAB +:100E60008FBF00183C0380008C6201F80440FFFE35 +:100E700024020002AC7101C0A06201C43C02100057 +:100E8000AC6201F88FBF00188FB100148FB0001052 +:100E900003E0000827BD002027BDFFE8AFBF00101A +:100EA0003C0380009462018430420200104000053F +:100EB000000020210E000FCD000000000A00038A70 +:100EC000240400018C6201880440000A8FBF0010D6 +:100ED0008C6201883C03FF00004310243C030400A3 +:100EE00014430004240400018F82FFA890420008EC +:100EF0008FBF00100080102103E0000827BD0018FC +:100F00008F82FFAC2403000124050001A040001AD9 +:100F10008F82FFA8A44300163C0280000A000355FC +:100F20008C4401408F85FFA827BDFFE0AFBF001CA8 +:100F3000AFB20018AFB10014AFB0001090A2000023 +:100F4000304400FF38830020388200300003182B23 +:100F50000002102B00621824106000053C02800083 +:100F600024020050148200818FBF001C3C028000CC +:100F700090420148304200FF2443FFFF2C620005ED +:100F80001040007A8FBF001C000310803C03080053 +:100F9000246351DC004310218C4200000040000813 +:100FA000000000003C1180008E2401400E0003452B +:100FB0008F92FFA88E50000C8E2201441602000270 +:100FC00024020001AE42000C0E0003508E240140AA +:100FD0008E220144145000068FBF001C8FB20018EF +:100FE0008FB100148FB000100A000F3927BD002008 +:100FF0008E42000C0A0004220000000094A200109F +:101000003C0480008C8301443042FFFF14620009DD +:101010000000000024020001A4A200108C82014004 +:10102000AC8202003C021000AC8202380A000429A3 +:101030008FBF001C94A200100A00042200000000D0 +:10104000240200201482000E3C11800094A20012A1 +:101050003C0380008C6301443042FFFF14620005B2 +:101060000000000024020001A4A200120A0003FCF8 +:101070008FBF001C94A200120A000422000000008E +:101080008E2401400E0003458F92FFA89642001265 +:101090008E2301443050FFFF16030002240200019A +:1010A000A64200120E0003508E2401408E220144FD +:1010B000160200068FBF001C8FB200188FB10014FB +:1010C0008FB000100A00038E27BD00209642001248 +:1010D0000A0004220000000094A200143C038000D7 +:1010E0008C6301443042FFFF146200088FBF001C74 +:1010F000240200018FB200188FB100148FB00010CD +:10110000A4A200140A00142427BD002094A20014F5 +:101110000A0004220000000094A200163C03800094 +:101120008C6301443042FFFF146200082402000176 +:101130008FBF001C8FB200188FB100148FB0001049 +:10114000A4A200160A000B0027BD002094A20016DE +:10115000144000068FBF001C3C0208008C42007047 +:10116000244200013C010800AC2200708FB200183C +:101170008FB100148FB0001003E0000827BD0020DD +:1011800027BDFFD8AFB200188F92FFA8AFB10014EF +:10119000AFBF0020AFB3001CAFB000103C02800016 +:1011A000345101008C50010092420000922300094A +:1011B000304400FF2402001F106200AB28620020B0 +:1011C00010400019240200382862000A1040000D67 +:1011D0002402000B286200081040002E8F82001CA1 +:1011E00004600103286200021440002A8F82001C60 +:1011F00024020006106200268FBF00200A00054C62 +:101200008FB3001C106200602862000B144000F9CC +:101210008FBF00202402000E106200788F82001C15 +:101220000A00054C8FB3001C106200D128620039FF +:101230001040000A2402008024020036106200E4FC +:1012400028620037104000C224020035106200D826 +:101250008FBF00200A00054C8FB3001C1062002DC8 +:101260002862008110400006240200C824020039D0 +:10127000106200C88FBF00200A00054C8FB3001C0D +:10128000106200A28FBF00200A00054C8FB3001C23 +:101290008F82001C8C42000C104000D68FBF0020B3 +:1012A0000E000D45000000003C0380003463010087 +:1012B0008C6200008F850018946700089466000C0B +:1012C000ACA200008C6400048F82001C0006340075 +:1012D000ACA400049448001E8C62001800073C0077 +:1012E00000E83825ACA200088C62001C2404000130 +:1012F000ACA2000C9062000A00C23025ACA600101F +:10130000ACA00014ACA00018ACA7001C0A00050B90 +:101310008FBF00208F82001C8C42000C104000B553 +:101320008FBF00200E000D45000000008F82001CC2 +:10133000962400089625000C9443001E0004220207 +:101340009626000E8F8200180004260000832025B8 +:1013500000052C003C03008000A6282500832025E2 +:10136000AC400000AC400004AC400008AC40000CB5 +:10137000AC450010AC400014AC400018AC44001C5C +:101380000A00050A240400019622000C14400018EB +:10139000000000009242000530420010144000148A +:1013A000000000000E0003450200202192420005CB +:1013B00002002021344200100E000350A24200051A +:1013C0009242000024030020304200FF10430088B6 +:1013D000020020218FBF00208FB3001C8FB20018A5 +:1013E0008FB100148FB000100A00103627BD0028FE +:1013F0000000000D0A00054B8FBF00208C42000C3E +:101400001040007C8FBF00200E000D450000000042 +:101410008E2200048F8400189623000CAC820000FA +:101420003C0280089445002C8F82001C00031C00A5 +:1014300030A5FFFF9446001E3C02400E00651825B3 +:1014400000C23025AC830004AC800008AC80000CE6 +:10145000AC800010AC800014AC800018AC86001C7E +:101460000A00050A240400010E00034502002021A1 +:101470008F93FFAC020020210E000350A660000CE9 +:10148000020020210E000355240500018F82001C5C +:101490008C42000C104000578FBF00200E000D45FD +:1014A000000000009622000C8F8300180002140038 +:1014B000AC700000AC620004AC6000088E440038E0 +:1014C0008F82001CAC64000C8E46003C9445001ECC +:1014D0003C02401FAC66001000A228258E6200046A +:1014E00024040001AC620014AC600018AC65001C60 +:1014F0008FBF00208FB3001C8FB200188FB1001473 +:101500008FB000100A000D7927BD002824020020AA +:10151000108200398FB3001C0E000F1F0000000066 +:10152000104000348FBF00203C0380008C6201F823 +:101530000440FFFE24020002AC7001C0A06201C49E +:101540003C021000AC6201F80A00054B8FBF00207E +:10155000020020218FBF00208FB3001C8FB2001823 +:101560008FB100148FB000100A000E6827BD00284C +:101570009625000C020020218FBF00208FB3001C95 +:101580008FB200188FB100148FB000100A000E8DBA +:1015900027BD0028020020218FB3001C8FB2001845 +:1015A0008FB100148FB000100A000EB827BD0028BC +:1015B0009225000D020020218FB3001C8FB200186D +:1015C0008FB100148FB000100A000F0927BD00284A +:1015D000020020218FBF00208FB3001C8FB20018A3 +:1015E0008FB100148FB000100A000EE027BD002854 +:1015F0008FBF00208FB3001C8FB200188FB1001472 +:101600008FB0001003E0000827BD00283C038000D5 +:101610008C6202780440FFFE24020002AC640240A7 +:10162000A06202443C02100003E00008AC620278B1 +:10163000A380001003E00008A38000113C03800099 +:101640008C6202780440FFFE8F820014AC6202407C +:1016500024020002A06202443C02100003E00008E1 +:10166000AC6202783C02600003E000088C42540443 +:101670009083003024020005008040213063003F49 +:101680000000482114620005000050219082004CA7 +:101690009483004E304900FF306AFFFFAD00000C1C +:1016A000AD000010AD000024950200148D05001C53 +:1016B0008D0400183042FFFF004910230002110082 +:1016C000000237C3004038210086202300A2102BDF +:1016D0000082202300A72823AD05001CAD040018BC +:1016E000A5090014A5090020A50A001603E00008BA +:1016F000A50A002203E000080000000027BDFFD873 +:10170000AFB200183C128008AFB40020AFB3001C89 +:10171000AFB10014AFBF0024AFB0001036510100CC +:101720003C0260008C4254049222000C3C140800DD +:10173000929400F7304300FF24020001106200324F +:101740000080982124020002146200353650008087 +:101750000E0013FE000000009202004C2403FF80E4 +:101760003C0480003042007F000211C0244202404D +:101770000262102100431824AC83009492450008B3 +:101780009204004C3042007F3C0380061485000721 +:10179000004380212402FFFFA22200112402FFFF48 +:1017A000A62200120A0005BE2402FFFF96020020B6 +:1017B000A222001196020022A62200128E0200240C +:1017C0003C048008AE2200143485008090A2004CB6 +:1017D00034830100A06200108CA2003CAC620018AF +:1017E0008C820068AC6200E48C820064AC6200E031 +:1017F0008C82006CAC6200E824020001A0A20068A8 +:101800000A0005DA3C0480080E00141700000000EE +:1018100036420080A04000680A0005DA3C048008D7 +:10182000A2000068A20000690A0006153C028008B8 +:10183000348300808C62003834850100AC62006C17 +:1018400024020001A062006990A200C590830008F4 +:10185000305100FF3072007F12320019001111C0A8 +:1018600024420240026210212403FF800043182416 +:101870003C048000AC8300943042007F3C0380062F +:10188000004380218E02000C1040000D0200202138 +:101890000E00056A0000000026220001305100FF02 +:1018A0009203003C023410260002102B0002102389 +:1018B0003063007F022288240A0005E4A203003C72 +:1018C0003C088008350401008C8200D03507008078 +:1018D000ACE2003C8C8200D0AD02000090E5004CF0 +:1018E000908600C590E3004C908400C52402FF80E0 +:1018F00000A228243063007F308400FF00A6282542 +:101900000064182A1060000230A500FF38A500808E +:10191000A0E5004CA10500093C0280089043000EA0 +:10192000344400803C058000A043000A8C830018EA +:101930003C027FFF3442FFFF00621824AC83001892 +:101940008CA201F80440FFFE00000000ACB301C00F +:101950008FBF00248FB400208FB3001C8FB20018FB +:101960008FB100148FB0001024020002A0A201C4A5 +:1019700027BD00283C02100003E00008ACA201F8DB +:1019800090A2000024420001A0A200003C03080035 +:101990008C6300F4304200FF1443000200803021C9 +:1019A000A0A0000090A200008F840014000211C0CB +:1019B0002442024024830040008220212402FF8030 +:1019C000008220243063007F3C02800A00621821DC +:1019D0003C028000AC44002403E00008ACC30000DB +:1019E00094820006908300058C85000C8C86001084 +:1019F0008C8700188C88001C8C8400203C01080017 +:101A0000A42252C63C010800A02352C53C01080094 +:101A1000AC2552CC3C010800AC2652D03C01080059 +:101A2000AC2752D83C010800AC2852DC3C0108002D +:101A3000AC2452E003E00008000000003C028008F3 +:101A4000344201008C4400343C03800034650400BF +:101A5000AC6400388C420038AF850020AC62003C9A +:101A60003C020005AC6200300000000000000000F5 +:101A700003E00008000000003C020006308400FF84 +:101A8000008220253C028000AC44003000000000B1 +:101A900000000000000000003C0380008C62000099 +:101AA000304200101040FFFD3462040003E00008E3 +:101AB000AF82002094C200003C080800950800CACC +:101AC00030E7FFFF0080482101021021A4C200007E +:101AD00094C200003042FFFF00E2102B544000018E +:101AE000A4C7000094A200003C0308008C6300CC53 +:101AF00024420001A4A2000094A200003042FFFF93 +:101B0000144300073C0280080107102BA4A000002A +:101B10005440000101003821A4C700003C028008A5 +:101B2000344601008CC3002894A200003C048000CD +:101B30003042FFFE000210C000621021AC82003C67 +:101B40008C82003C00621823186000040000000032 +:101B50008CC200240A0006A6244200018CC2002484 +:101B6000AC8200383C020050344200103C0380003C +:101B7000AC62003000000000000000000000000027 +:101B80008C620000304200201040FFFD0000000089 +:101B900094A200003C04800030420001000210C00A +:101BA000004410218C430400AD2300008C42040447 +:101BB000AD2200043C02002003E00008AC820030AB +:101BC00027BDFFE0AFB20018AFB10014AFB00010F6 +:101BD000AFBF001C94C2000000C080213C1208006E +:101BE000965200C624420001A6020000960300009F +:101BF00094E2000000E03021144300058FB1003072 +:101C00000E00067B024038210A0006DD00000000BD +:101C10008C8300048C82000424420040046100078D +:101C2000AC8200048C820004044000040000000028 +:101C30008C82000024420001AC8200009602000069 +:101C40003042FFFF50520001A60000009622000023 +:101C500024420001A62200003C0280083442010018 +:101C6000962300009442003C144300048FBF001CE4 +:101C700024020001A62200008FBF001C8FB20018B2 +:101C80008FB100148FB0001003E0000827BD0020C2 +:101C900027BDFFE03C028008AFBF001834420100BE +:101CA0008C4800343C03800034690400AC68003880 +:101CB0008C42003830E700FFAF890020AC62003C66 +:101CC0003C020005AC620030000000000000000093 +:101CD0000000000000000000000000000000000004 +:101CE0008C82000C8C82000C9783000EAD220000C9 +:101CF0008C82001000604021AD2200048C8200180C +:101D0000AD2200088C82001CAD22000C8CA20014B5 +:101D1000AD2200108C820020AD22001490820005BC +:101D2000304200FF00021200AD2200188CA2001801 +:101D3000AD22001C8CA2000CAD2200208CA2001051 +:101D4000AD2200248CA2001CAD2200288CA2002011 +:101D5000AD22002C3402FFFFAD260030AD20003450 +:101D6000506200013408FFFFAD28003850E0001138 +:101D70003C0280083C0480083484010094820050B6 +:101D80003042FFFFAD22003C948300449485004420 +:101D9000240200013063FFFF000318C20064182111 +:101DA0009064005430A5000700A210040A00074800 +:101DB0000044102534420100AD20003C944300440F +:101DC000944400443063FFFF000318C200621821EE +:101DD0003084000790650054240200010082100442 +:101DE0000002102700451024A062005400000000EB +:101DF00000000000000000003C02000634420040E9 +:101E00003C038000AC6200300000000000000000D5 +:101E1000000000008C620000304200101040FFFD06 +:101E20003C06800834C201503463040034C7014AC0 +:101E300034C4013434C5014034C60144AFA200109B +:101E40000E0006BEAF8300208FBF001803E000081D +:101E500027BD00208F83000C3C0608008CC600E8DC +:101E60008F82001430633FFF000319800046102169 +:101E7000004310212403FF80004318243C06800007 +:101E8000ACC300283042007F3C03800C004330216B +:101E900090C2000D30A500FF000038213442001030 +:101EA000A0C2000D8F89000C3C0280083442010062 +:101EB00094430044000913823048000324020001C7 +:101EC000A4C3000E1102000B2902000210400005FD +:101ED000240200021100000C240300010A000790F4 +:101EE0000000182111020006000000000A000790FF +:101EF000000018218CC2002C0A0007902443000126 +:101F00008CC20014244300018CC200180043102B23 +:101F10005040000A240700012402002714A20003F5 +:101F20003C0380080A00079D240700013463010078 +:101F30009462004C24420001A462004C0009138208 +:101F4000304300032C620002104000090080282169 +:101F5000146000040000000094C200340A0007ADC1 +:101F60003046FFFF8CC600380A0007AD00802821EC +:101F7000000030213C040800248452C00A0006F20C +:101F80000000000027BDFF90AFB60068AFB5006449 +:101F9000AFB40060AFB3005CAFB20058AFB1005453 +:101FA000AFBF006CAFB000508C9000000080B0213B +:101FB0003C0208008C4200E8960400328F83001433 +:101FC0002414FF8030843FFF006218210004218028 +:101FD00000641821007410243C13800000A090219C +:101FE00090A50000AE620028920400323C02800CF2 +:101FF0003063007F00628821308400C024020040EA +:10200000148200320000A8218E3500388E2200187C +:102010001440000224020001AE2200189202003C8B +:10202000304200201440000E8F830014000511C0C0 +:102030002442024000621821306400783C02008093 +:102040000082202500741824AE630800AE640810D6 +:102050008E2200188E03000800431021AE220018C3 +:102060008E22002C8E230018244200010062182BBF +:102070001060004300000000924200002442000172 +:10208000A24200003C0308008C6300F4304200FFD1 +:1020900050430001A2400000924200008F840014CF +:1020A000000211C024420240248300403063007FBC +:1020B000008220213C02800A009420240062182122 +:1020C000AE6400240A0008BEAEC3000092030032D2 +:1020D0002402FFC000431024304200FF14400005DA +:1020E00024020001AE220018962200340A00082EB5 +:1020F0003055FFFF8E22001424420001AE2200184A +:102100009202003000021600000216030441001C77 +:10211000000000009602003227A400100080282151 +:10212000A7A2001696020032000030212407000109 +:102130003042FFFFAF82000C0E0006F2AFA0001C81 +:10214000960200328F8300143C0408008C8400E85F +:1021500030423FFF00021180006418210062182104 +:1021600000741024AE62002C3063007F3C02800EAD +:10217000006218219062000D3042007FA062000DC5 +:102180009222000D30420010504000789242000030 +:102190003C028008344401009482004C8EC300004D +:1021A0003C130800967300C62442FFFFA482004C33 +:1021B000946200329623000E3054FFFF3070FFFF10 +:1021C0003C0308008C6300D000701807A7A30038F8 +:1021D0009482003E3063FFFF3042FFFF146200072D +:1021E000000000008C8200303C038000244200305C +:1021F000AC62003C0A0008568C82002C948200409D +:102200003042FFFF5462000927A400408C8200384E +:102210003C03800024420030AC62003C8C820034DD +:10222000AC6200380A0008653C03800027A500382E +:1022300027A60048026038210E00067BA7A00048B0 +:102240008FA300403C02800024630030AC43003880 +:102250008FA30044AC43003C3C0380003C020005DB +:10226000AC6200303C028008344401009482004299 +:10227000346304003042FFFF0202102B14400007B9 +:10228000AF8300209482004E94830042020210210A +:10229000004310230A00087B3043FFFF9483004E65 +:1022A0009482004202631821005010230062182318 +:1022B0003063FFFF3C028008344401009482003CFC +:1022C0003042FFFF14430003000000000A00088BA7 +:1022D000240300019482003C3042FFFF0062102B77 +:1022E000144000058F8200209482003C006210237D +:1022F0003043FFFF8F820020AC550000AC4000044B +:10230000AC540008AC43000C3C0200063442001000 +:102310003C038000AC6200300000000000000000C0 +:10232000000000008C620000304200101040FFFDF1 +:102330003C04800834840100001018C20064182195 +:102340009065005432020007240600010046100484 +:1023500000451025A0620054948300429622000E8E +:1023600050430001A3860010924200002442000165 +:10237000A24200003C0308008C6300F4304200FFDE +:1023800050430001A2400000924200008F840014DC +:10239000000211C024420240248300400082202118 +:1023A0002402FF80008220243063007F3C02800AE8 +:1023B000006218213C028000AC440024AEC300003F +:1023C0008FBF006C8FB600688FB500648FB400605B +:1023D0008FB3005C8FB200588FB100548FB00050A3 +:1023E00003E0000827BD007027BDFFD8AFB3001C75 +:1023F000AFB20018AFB10014AFB00010AFBF0020F3 +:102400000080982100E0802130B1FFFF0E000D45D3 +:1024100030D200FF000000000000000000000000BB +:102420008F8200188F83001CAC510000AC52000456 +:10243000AC530008AC40000CAC400010AC400014A1 +:10244000AC4000189463001E02038025AC50001CB1 +:102450000000000000000000000000002404000153 +:102460008FBF00208FB3001C8FB200188FB10014F3 +:102470008FB000100A000D7927BD002830A5FFFF9E +:102480000A0008C830C600FF3C028008344301003F +:102490009462000E3C080800950800C63046FFFF15 +:1024A00014C000043402FFFF946500DA0A00091525 +:1024B0008F84001410C20027000000009462004EB8 +:1024C0009464003C3045FFFF00A6102300A6182BA3 +:1024D0003087FFFF106000043044FFFF00C5102369 +:1024E00000E210233044FFFF0088102B1040000E44 +:1024F00000E810233C02800834440100240300015A +:1025000034420080A44300162402FFFFA482000E80 +:10251000948500DA8F8400140000302130A5FFFF7D +:102520000A0008ED3C0760200044102A1040000912 +:102530003C0280083443008094620016304200015F +:10254000104000043C0280009442007E24420014AB +:10255000A462001603E000080000000027BDFFE0B1 +:102560003C028008AFBF001CAFB00018344201002D +:10257000944300429442004C104000193068FFFF21 +:102580009383001024020001146200298FBF001CF5 +:102590003C06800834D00100000810C20050102111 +:1025A000904200543103000734C70148304200FF15 +:1025B000006210073042000134C9014E34C4012CBE +:1025C00034C5013E1040001634C601420E0006BE5E +:1025D000AFA90010960200420A0009323048FFFFFE +:1025E0003C028008344401009483004494820042F9 +:1025F0001043000F8FBF001C94820044A48200424D +:1026000094820050A482004E8C820038AC8200304C +:1026100094820040A482003E9482004AA482004832 +:102620008FBF001C8FB000180A0008F027BD0020E3 +:102630008FB0001803E0000827BD002027BDFFA0D1 +:10264000AFB1004C3C118000AFBF0058AFB3005495 +:10265000AFB20050AFB000483626018890C20003E8 +:102660003044007FA3A400108E32018090C200008D +:102670003043007F240200031062003BAF9200143D +:102680002862000410400006240200042402000214 +:10269000106200098FBF00580A000AFB8FB3005474 +:1026A0001062004D240200051062014E8FBF0058D9 +:1026B0000A000AFB8FB30054000411C0024210212B +:1026C0002404FF802442024000441024264300409A +:1026D000AE2200243063007F3C02800A0062182191 +:1026E0009062003CAFA3003C00441025A062003C77 +:1026F0008FA3003C9062003C304200401040016CCF +:102700008FBF00583C108008A380001036100100D5 +:102710008E0200D08C63003427A4003C27A5001053 +:10272000004310210E0007AFAE0200D093A20010AC +:102730003C038000A20200C58C6202780440FFFEC8 +:102740008F820014AC62024024020002A0620244A4 +:102750003C021000AC6202780E0009250000000067 +:102760000A000AFA8FBF00583C05800890C3000198 +:1027700090A2000B1443014E8FBF005834A4008078 +:102780008C8200189082004C90A200083C026000ED +:102790008C4254048C8300183C027FFF3442FFFFBC +:1027A000006218243C0208008C4200B4AC8300187C +:1027B0003C038000244200013C010800AC2200B42C +:1027C0008C6201F80440FFFE8F820014AC6201C0ED +:1027D0000A000AC2240200023C10800890C30001D3 +:1027E0009202000B144301328FBF005827A4001837 +:1027F00036050110240600033C0260008C4254049C +:102800000E000E080000000027A40028360501E095 +:102810000E000E08240600038FA2002836030100D4 +:10282000AE0200648FA2002CAE0200688FA20030BE +:10283000AE02006C93A40018906300C52402FF80D0 +:102840000082102400431025304900FF3084007FAF +:102850003122007F0082102A544000013929008073 +:10286000000411C0244202402403FF8002421021D0 +:1028700000431024AE220094264200403042007FE4 +:102880003C038006004340218FA3001C2402FFFF6D +:10289000AFA800403C130800927300F710620033A9 +:1028A00093A2001995030014304400FF3063FFFF2A +:1028B0000064182B10600010000000009504001444 +:1028C0008D07001C8D0600183084FFFF0044202374 +:1028D0000004210000E438210000102100E4202B36 +:1028E00000C2302100C43021AD07001CAD06001825 +:1028F0000A000A1B93A20019950400148D07001CFE +:102900008D0600183084FFFF008220230004210080 +:10291000000010210080182100C2302300E4202B89 +:1029200000C4302300E33823AD07001CAD060018B7 +:1029300093A200198FA30040A462001497A2001A6A +:10294000A46200168FA2001CAC6200108FA2001CB3 +:10295000AC62000C93A20019A462002097A2001A96 +:10296000A46200228FA2001CAC6200243C048008F8 +:10297000348300808C6200388FA2002001208821DF +:10298000AC62003C8FA20020AC82000093A2001831 +:10299000A062004C93A20018A0820009A060006809 +:1029A00093A20018105100512407FF803229007FA4 +:1029B000000911C024420240024210213046007F2B +:1029C0003C03800000471024AC6200943C02800667 +:1029D00000C2302190C2003CAFA600400000202180 +:1029E00000471025A0C2003C8FA8004095020002BD +:1029F000950300148D07001C3042FFFF3063FFFF7A +:102A00008D060018004310230002110000E2382157 +:102A100000E2102B00C4302100C23021AD07001CA1 +:102A2000AD06001895020002A5020014A5000016CC +:102A30008D020008AD0200108D020008AD02000CEE +:102A400095020002A5020020A50000228D020008C8 +:102A5000AD0200249102003C304200401040001AB8 +:102A6000262200013C108008A3A90038A380001092 +:102A7000361001008E0200D08D03003427A40040E0 +:102A800027A50038004310210E0007AFAE0200D08A +:102A900093A200383C038000A20200C58C62027839 +:102AA0000440FFFE8F820014AC6202402402000248 +:102AB000A06202443C021000AC6202780E000925BC +:102AC00000000000262200013043007F1473000440 +:102AD000004020212403FF800223102400432026ED +:102AE00093A200180A000A37309100FF93A400183F +:102AF0008FA3001C2402FFFF1062000A308900FF30 +:102B000024820001248300013042007F1453000519 +:102B1000306900FF2403FF80008310240043102647 +:102B2000304900FF3C0280089042000801208821C3 +:102B3000305000FF123000193222007F000211C015 +:102B400002421021244202402403FF800043182443 +:102B50003C048000AC8300943042007F3C0380063C +:102B6000004310218C43000C004020211060000B1A +:102B7000AFA200400E00056A0000000026230001FD +:102B80002405FF803062007F1453000202252024B8 +:102B9000008518260A000A9B307100FF3C0480085B +:102BA000348400808C8300183C027FFF3442FFFF96 +:102BB00000621824AC8300183C0380008C6201F88A +:102BC0000440FFFE00000000AC7201C024020002BD +:102BD000A06201C43C021000AC6201F80A000AFACB +:102BE0008FBF00583C04800890C300019082000B06 +:102BF0001443002F8FBF00583490008092020008C9 +:102C00003042004010400020000000009202000806 +:102C100000021600000216030441000502402021B4 +:102C20000E000E8D240500930A000AFA8FBF00588B +:102C30009202000924030018304200FF1443000DE3 +:102C400002402021240500390E000E25000030210D +:102C50000E0003458F8400148F82FFA82403001206 +:102C6000A04300090E0003508F8400140A000AFAE2 +:102C70008FBF0058240500360E000E2500003021BD +:102C80000A000AFA8FBF00580E00034502402021B7 +:102C9000920200058F840014344200200E0003507D +:102CA000A20200050E0010368F8400148FBF00585A +:102CB0008FB300548FB200508FB1004C8FB00048DA +:102CC00003E0000827BD00603C0280083445010095 +:102CD0003C0280008C42014094A3000E0000302191 +:102CE00000402021AF8200143063FFFF3402FFFF59 +:102CF000106200063C0760202402FFFFA4A2000E21 +:102D000094A500DA0A0008ED30A5FFFF03E00008F3 +:102D10000000000027BDFFC83C0280003C06800880 +:102D2000AFB5002CAFB1001CAFBF0030AFB400286E +:102D3000AFB30024AFB20020AFB00018345101008F +:102D400034C501008C4301008E2200148CA400D4F1 +:102D50000000A821AF830014004410231840005243 +:102D6000A38000108E22001400005021ACA200D4D9 +:102D700090C3000890A200C53073007FA3A200108A +:102D80008CB200D08CB400D4304200FF1053003B12 +:102D900093A200108F8300142407FF80000211C04B +:102DA00000621021244202402463004000471024A6 +:102DB0003063007F3C0980003C08800A00681821CD +:102DC000AD2200248C62003427A4001427A5001033 +:102DD000024280210290102304400028AFA3001477 +:102DE0009062003C00E21024304200FF14400019C1 +:102DF000020090219062003C34420040A062003CFE +:102E00008F86001493A3001024C200403042007F3C +:102E1000004828213C0208008C4200F42463000191 +:102E2000306400FF14820002A3A30010A3A00010CE +:102E300093A20010AFA50014000211C0244202406A +:102E400000C2102100471024AD2200240A000B31DB +:102E500093A200100E0007AF000000003C028008A3 +:102E600034420100AC5000D093A30010240A0001AA +:102E7000A04300C50A000B3193A2001024020001F8 +:102E8000154200093C0380008C6202780440FFFE7A +:102E90008F820014AC62024024020002A06202444D +:102EA0003C021000AC6202789222000B2403000264 +:102EB000304200FF14430072000000009622000818 +:102EC000304300FF24020082146200402402008488 +:102ED0003C028000344901008D22000C952300063D +:102EE000000216023063FFFF3045003F2402002736 +:102EF00010A2000FAF83000C28A200281040000889 +:102F0000240200312402002110A20009240200251D +:102F100010A20007938200110A000BA90000000014 +:102F200010A20007938200110A000BA90000000004 +:102F30000E000763012020210A000C290000000078 +:102F40003C0380008C6202780440FFFE8F820014F4 +:102F5000AC62024024020002A06202443C02100063 +:102F6000AC6202780A000C290000000095230006DC +:102F7000912400058D25000C8D2600108D2700184A +:102F80008D28001C8D290020244200013C010800EE +:102F9000A42352C63C010800A02452C53C010800ED +:102FA000AC2552CC3C010800AC2652D03C010800B4 +:102FB000AC2752D83C010800AC2852DC3C01080088 +:102FC000AC2952E00A000C29A38200111462000A05 +:102FD000240200813C02800834420100944500DA5A +:102FE000922600058F84001430A5FFFF30C600FF35 +:102FF0000A000BEA3C0760211462005C000000003C +:103000009222000A304300FF306200201040000787 +:10301000306200403C02800834420100944500DAEE +:103020008F8400140A000BE82406004010400007BB +:10303000000316003C02800834420100944500DA87 +:103040008F8400140A000BE82406004100021603D6 +:10305000044100463C02800834420100944500DAF5 +:103060008F8400142406004230A5FFFF3C0760193E +:103070000E0008ED000000000A000C29000000000E +:103080009222000B24040016304200FF1044000678 +:103090003C0680009222000B24030017304200FF00 +:1030A000144300320000000034C5010090A2000B60 +:1030B000304200FF1444000B000080218CA200204D +:1030C0008CA400202403FF80004310240002114040 +:1030D0003084007F004410253C032000004310256D +:1030E000ACC2083094A200080002140000021403CD +:1030F000044200012410000194A200083042008024 +:103100005040001A0200A82194A20008304220007A +:10311000504000160200A8218CA300183C021C2D70 +:10312000344219ED106200110200A8213C0208008F +:103130008C4200D4104000053C02800824030004A7 +:1031400034420100A04300EC3C02800834420100FC +:10315000944500DA8F8400142406000630A5FFFF92 +:103160000E0008ED3C0760210200A8210E00092591 +:10317000000000009222000A3042000810400004C3 +:1031800002A010210E00133A0000000002A010213E +:103190008FBF00308FB5002C8FB400288FB3002470 +:1031A0008FB200208FB1001C8FB0001803E0000820 +:1031B00027BD00382402FF80008220243C029000BA +:1031C00034420007008220253C028000AC440020ED +:1031D0003C0380008C6200200440FFFE00000000E1 +:1031E00003E00008000000003C0380002402FF8090 +:1031F000008220243462000700822025AC64002075 +:103200008C6200200440FFFE0000000003E0000884 +:10321000000000003C028008240300053442010045 +:10322000A04300EC3C0280008C4201003C03800083 +:10323000AF8200148C6202780440FFFE8F8200147B +:10324000AC62024024020002A06202443C02100070 +:10325000AC62027803E000080000000027BDFFE830 +:103260003C068000AFBF001034C7010094E20008A4 +:10327000304400FF38830082388200842C630001D0 +:103280002C420001006218251060002D24020083EA +:1032900093820011504000368FBF00103C0208009E +:1032A000904252CC8CC401003C06080094C652C621 +:1032B0003045003F38A3003238A2003F2C630001A4 +:1032C0002C42000100621825AF840014AF86000C68 +:1032D000A38000111460000700E0202124020020D8 +:1032E00014A20012000000003402FFFF14C2000FFD +:1032F000000000002402002014A2000500E02821A4 +:103300008CE300142402FFFF5062000B8FBF0010FB +:103310003C040800248452C0000030210E0006F254 +:10332000240700010A000C9C8FBF00100E000763E9 +:10333000000000008FBF00100A00092527BD0018FB +:10334000148200062482FF808CC301043C026020AA +:10335000AC4300140A000CD28FBF0010304200FFB3 +:103360002C42000210400004240200228FBF0010F3 +:103370000A000B1327BD0018148200048F82001C62 +:103380008FBF00100A000C5327BD00188C42000CA0 +:103390001040001E00E0282190E3000924020018DC +:1033A00014620003240200160A000CBD2403000866 +:1033B0001462000724020017240300123C02800854 +:1033C00034420080A04300090A000CCA94A70008F8 +:1033D0005462000794A700088F82FFA82404FFFE10 +:1033E0009043000500641824A043000594A700083A +:1033F00090A6001B8CA4000094A500068FBF0010AF +:1034000000073C000A0008C827BD00188FBF001045 +:1034100003E0000827BD00188F85001C3C048000D5 +:1034200094A2002A8CA30034000230C02402FFF0D2 +:1034300000C2102400621821AC83003C8CA2003032 +:103440003C038000AC8200383C0200503442001043 +:10345000AC6200300000000000000000000000002E +:103460008C620000304200201040FFFD30C2000896 +:10347000104000063C0280008C620408ACA20020D0 +:103480008C62040C0A000CF5ACA200248C430400EE +:10349000ACA300208C420404ACA200243C03002016 +:1034A0003C028000AC4300303C0480008C82003041 +:1034B000004310241440FFFD8F86001C3C02004096 +:1034C000AC82003094C3002A94C2002894C4002C1B +:1034D00094C5002E24630001004410213064FFFFD6 +:1034E000A4C2002814850002A4C3002AA4C0002A94 +:1034F00003E00008000000008F84001C27BDFFE8E7 +:103500003C05800424840010AFBF00100E000E089C +:103510002406000A8F84001C948200129483002EDB +:103520003042000F244200030043180424027FFFAE +:103530000043102B10400002AC8300000000000D7F +:103540000E000CD4000000008F83001C8FBF001001 +:1035500027BD0018946200149463001A3042000FD3 +:1035600000021500006218253C02800003E00008FC +:10357000AC4300A08F83001C3C02800494440006EE +:103580009462001A8C650000A464001600441023A5 +:103590003042FFFF0045102B03E0000838420001D5 +:1035A0008F84001C3C0780049486001A8C850000E0 +:1035B00094E20006A482001694E3000600C31023E0 +:1035C0003042FFFF0045102B384200011440FFF845 +:1035D000A483001603E00008000000008F84001C94 +:1035E0003C028004944200069483001A8C850000FB +:1035F000A4820016006210233042FFFF0045102B0A +:10360000384200015040000D8F85001C00603021C1 +:103610003C07800494E20006A482001694E30006AE +:1036200000C310233042FFFF0045102B3842000139 +:103630001440FFF8A48300168F85001C3C03800013 +:10364000346204008CA40020AF820018AC640038FF +:103650008CA20024AC62003C3C020005AC6200304D +:1036600003E00008ACA000048F84001C3C030006AB +:103670008C82000400021140004310253C038000AE +:10368000AC620030000000000000000000000000FC +:103690008C620000304200101040FFFD34620400D4 +:1036A000AC80000403E00008AF8200188F86001C85 +:1036B00027BDFFE0AFB10014AFB00010AFBF0018DE +:1036C0008CC300048CC500248F820018309000FF4A +:1036D00094C4001A246300012442002024840001C1 +:1036E00024A70020ACC30004AF820018A4C4001AB1 +:1036F000ACC7002404A100060000882104E20005F4 +:1037000094C2001A8CC2002024420001ACC20020E6 +:1037100094C2001A94C300282E040001004310260E +:103720002C420001004410245040000594C2001AAD +:1037300024020001ACC2000894C2001A94C30028FD +:103740000010202B004310262C42000100441025BD +:1037500014400007000000008CC200081440000460 +:10376000240200108CC300041462000F8F85001C1B +:103770000E000D68241100018F82001C9443002864 +:103780009442001A14430003000000000E000CD401 +:1037900000000000160000048F85001C0E000D457F +:1037A000000000008F85001C94A2001E94A4001C41 +:1037B000244200013043FFFF14640002A4A2001E53 +:1037C000A4A0001E1200000A3C02800494A200146F +:1037D00094A3001A3042000F000215000062182561 +:1037E0003C028000AC4300A00A000DDFACA0000842 +:1037F0009442000694A3001A8CA40000A4A2001610 +:10380000006210233042FFFF0044102B38420001B9 +:103810001040000D02201021006030213C07800480 +:1038200094E20006A4A2001694E3000600C310234D +:103830003042FFFF0044102B384200011440FFF8D3 +:10384000A4A30016022010218FBF00188FB100140E +:103850008FB0001003E0000827BD002003E000083F +:10386000000000008F8200243C030006000211408B +:10387000004310253C038000AC62003000000000D3 +:1038800000000000000000008C62000030420010C8 +:103890001040FFFD34620400AF82002003E0000806 +:1038A000AF80002403E000080000102103E00008BE +:1038B000000000003084FFFF30A5FFFF000018214A +:1038C000108000070000000030820001104000025C +:1038D00000042042006518210A000DFE0005284062 +:1038E00003E000080060102110C0000624C6FFFF9E +:1038F0008CA2000024A50004AC8200000A000E087F +:103900002484000403E000080000000010A0000868 +:1039100024A3FFFFAC8600000000000000000000B0 +:103920002402FFFF2463FFFF1462FFFA24840004D3 +:1039300003E00008000000003C02800834420080E0 +:1039400024030001AC43000CA4430010A443001264 +:10395000A443001403E00008A44300168F82001C57 +:1039600027BDFFD8AFB3001CAFB20018AFB1001431 +:10397000AFB00010AFBF00208C47000C2482008045 +:103980002409FF803C08800E3043007F00808021A6 +:103990003C0A8000004920240068182130B100FF53 +:1039A00030D200FF10E0002900009821260201001B +:1039B000AD44002C004928243042007F00482021DB +:1039C0009062000024030050304200FF14430004C2 +:1039D00000000000AD45002C948200DA3053FFFF58 +:1039E0000E000D45000000008F82001C8F83001820 +:1039F00000112C009442001E0012240034840001A7 +:103A000000A228253C02400000A22825AC7000003E +:103A10008FBF0020AC6000048FB20018AC730008A8 +:103A20008FB10014AC60000C8FB3001CAC640010AC +:103A30008FB00010AC60001424040001AC600018CA +:103A400027BD00280A000D79AC65001C8FBF00203F +:103A50008FB3001C8FB200188FB100148FB000100C +:103A600003E0000827BD00283C06800034C20100A6 +:103A70009043000F240200101062000E2865001110 +:103A800010A0000724020012240200082405003AB6 +:103A9000106200060000302103E000080000000072 +:103AA000240500351462FFFC000030210A000E25B9 +:103AB000000000008CC200748F83FFA824420FA076 +:103AC00003E00008AC62000C27BDFFE8AFBF0010A8 +:103AD0000E000355240500013C0480088FBF001030 +:103AE0002402000134830080A462001227BD001864 +:103AF0002402000103E00008A080001A27BDFFE0B7 +:103B0000AFB20018AFB10014AFB00010AFBF001CCF +:103B100030B2FFFF0E000345008088213C02800880 +:103B2000345000809202000924030004304200FF58 +:103B30001443000C3C028008124000082402000AD2 +:103B40000E000E1C00000000920200052403FFFE80 +:103B500000431024A202000524020012A202000960 +:103B60003C02800834420080022020210E000350D5 +:103B7000A040002716400003022020210E000E80E6 +:103B80000000000002202021324600FF8FBF001CF1 +:103B90008FB200188FB100148FB0001024050038C8 +:103BA0000A000E2527BD002027BDFFE0AFBF001C87 +:103BB000AFB20018AFB10014AFB000100E00034553 +:103BC000008080210E000E1C000000003C028008D6 +:103BD0003445008090A2000924120018305100FFE3 +:103BE000123200030200202124020012A0A20009C8 +:103BF00090A200052403FFFE004310240E00035092 +:103C0000A0A2000502002021240500201632000792 +:103C1000000030218FBF001C8FB200188FB100143C +:103C20008FB000100A00035527BD00208FBF001C75 +:103C30008FB200188FB100148FB000102405003926 +:103C40000A000E2527BD002027BDFFE83C028000AA +:103C5000AFB00010AFBF0014344201009442000C1A +:103C6000240500360080802114400012304600FFF9 +:103C70000E000345000000003C0280083442008032 +:103C800024030012A0430009904300053463001090 +:103C90000E000E1CA04300050E0003500200202160 +:103CA000020020210E000355240500200A000EFD0D +:103CB000000000000E000E25000000000E0003456D +:103CC000020020213C0280089043001B2405FF9F36 +:103CD00002002021006518248FBF00148FB000104F +:103CE000A043001B0A00035027BD001827BDFFE0BA +:103CF000AFBF0018AFB10014AFB0001030B100FF7B +:103D00000E000345008080213C028008240300123D +:103D1000344200800E000E1CA04300090E00035028 +:103D20000200202102002021022030218FBF001834 +:103D30008FB100148FB00010240500350A000E2545 +:103D400027BD00203C0480089083000E9082000A6A +:103D50001443000B000028218F82FFA82403005089 +:103D60002405000190420000304200FF144300048B +:103D7000000000009082000E24420001A082000E8C +:103D800003E0000800A010213C0380008C6201F8D1 +:103D90000440FFFE24020002AC6401C0A06201C422 +:103DA0003C02100003E00008AC6201F827BDFFE010 +:103DB000AFB200183C128008AFB10014AFBF001CB6 +:103DC000AFB0001036510080922200092403000A8F +:103DD000304200FF1443003E000000008E43000408 +:103DE0008E220038506200808FBF001C922200009B +:103DF00024030050304200FF144300253C028000A1 +:103E00008C4201408E4300043642010002202821EA +:103E1000AC43001C9622005C8E2300383042FFFF2A +:103E20000002104000621821AE23001C8E430004E3 +:103E30008E2400389622005C006418233042FFFF75 +:103E400000031843000210400043102A10400006EF +:103E5000000000008E4200048E230038004310232F +:103E60000A000F6B000220439622005C3042FFFFE5 +:103E7000000220403C0280083443010034420080AC +:103E8000ACA4002CA040002424020001A062000C7D +:103E90000E000F1F00000000104000538FBF001CD9 +:103EA0003C0280008C4401403C0380008C6201F89D +:103EB0000440FFFE24020002AC6401C0A06201C401 +:103EC0003C021000AC6201F80A000FC88FBF001C52 +:103ED0009222000924030010304200FF1443000422 +:103EE0003C0280008C4401400A000FAF00002821F2 +:103EF0009222000924030016304200FF14430006FA +:103F000024020014A22200093C0280008C440140DB +:103F10000A000FC28FBF001C8E2200388E23003C87 +:103F200000431023044100308FBF001C9222002761 +:103F300024420001A2220027922200272C420004E2 +:103F4000144000163C108000922200092403000453 +:103F5000304200FF144300093C0280008C440140C1 +:103F60008FBF001C8FB200188FB100148FB00010EB +:103F7000240500930A000E8D27BD00208C440140CB +:103F8000240500938FBF001C8FB200188FB100145E +:103F90008FB000100A000F0927BD00208E040140D9 +:103FA0000E000345000000008E4200042442FFFF83 +:103FB000AE4200048E22003C2442FFFFAE22003CB1 +:103FC0000E0003508E0401408E0401408FBF001C80 +:103FD0008FB200188FB100148FB0001024050004B8 +:103FE0000A00035527BD00208FB200188FB10014BE +:103FF0008FB0001003E0000827BD00203C068000C1 +:104000008CC201883C038008346500809063000EF8 +:1040100000021402304400FF306300FF1464000EFD +:104020003C02800890A20026304200FF10440009A4 +:104030008F82FFA8A0A40026240300509042000015 +:10404000304200FF14430006000000000A00058D06 +:104050008CC401803C02800834420080A0440026C9 +:1040600003E000080000000027BDFFE030E700FF8C +:10407000AFB20018AFBF001CAFB10014AFB000105A +:104080000080902114E0000630C600FF0000000010 +:104090000000000D000000000A0010212400010EA5 +:1040A0003C0380089062000E304200FF144600235B +:1040B0003462008090420026304200FF1446001F08 +:1040C000000000009062000F304200FF1446001B09 +:1040D000000000009062000A304200FF1446000316 +:1040E0008F90FFA80000000D8F90FFA88F82FFAC7B +:1040F0003C118000AE05003CAC450000A066000A03 +:104100000E0003458E240100A20000240E0003507F +:104110008E2401003C0380008C6201F80440FFFE05 +:1041200024020002AC7201C0A06201C43C02100073 +:10413000AC6201F80A0010228FBF001C00000000D2 +:104140000000000D00000000240001378FBF001C9C +:104150008FB200188FB100148FB0001003E0000878 +:1041600027BD00208F83FFA83C0280008C44010003 +:10417000344201008C65003C9046001B0A000FE8A9 +:10418000240700013C0280089043000E9042000A80 +:1041900000431026304200FF03E000080002102B0D +:1041A00027BDFFE03C028008AFB10014AFB00010A3 +:1041B000AFBF001834500080920200052403003085 +:1041C0003042003014430085008088218F82001C1B +:1041D0008C42000C104000828FBF00180E000D456D +:1041E000000000008F860018ACD100009202000889 +:1041F00092030009304200FF00021200306300FF0A +:1042000000431025ACC200049202004D00021600CB +:104210000002160304410005000000003C030800F2 +:104220008C6300480A0010603C108008920200086D +:104230003042004014400003000018219202002781 +:10424000304300FF3C108008361100809222004D60 +:1042500000031E00304200FF000214000062182517 +:10426000ACC300088E2400308F82001CACC4000C4C +:104270008E2500349443001E3C02C00BACC50010D8 +:10428000006218258E22003800002021ACC20014E4 +:104290008E22003CACC200180E000D79ACC3001C8D +:1042A0008E0200048F8400183C058000AC82000060 +:1042B0008E220020AC8200048E22001CAC820008FA +:1042C0008E2200588CA3007400431021AC82000C95 +:1042D0008E22002CAC8200108E2200408E230044DF +:1042E0000002140000431025AC8200149222004DFD +:1042F00024030080304200FF14430004000000004B +:10430000AC8000180A0010A48F82001C8E23000CC1 +:10431000240200011062000E2402FFFF9222000816 +:10432000304200401440000A2402FFFF8E23000C9C +:104330008CA20074006218233C0208000062102462 +:1043400014400002000028210060282100051043CD +:10435000AC8200188F82001C000020219443001EB4 +:104360003C02C00C006218258F8200180E000D79E7 +:10437000AC43001C3C038008346201008C42000006 +:104380008F850018346300808FBF0018ACA2000036 +:10439000ACA000048C6400488F82001C8FB1001414 +:1043A000ACA40008ACA0000CACA000109063000509 +:1043B0009446001E3C02400D00031E0000C2302542 +:1043C000ACA300148FB00010ACA0001824040001AE +:1043D000ACA6001C0A000D7927BD00208FBF001875 +:1043E0008FB100148FB0001003E0000827BD00203B +:1043F0003C0280009443007C3C028008344601006B +:10440000308400FF3065FFFF2402000524A34650DE +:10441000A0C4000C5482000C3065FFFF90C2000D58 +:104420002C4200071040000724A30A0090C3000D8F +:10443000240200140062100400A210210A0010E0FF +:104440003045FFFF3065FFFF3C02800834420080AA +:1044500003E00008A44500143C0380083468008091 +:10446000AD050038346701008CE2001C308400FF89 +:1044700000A210231840000330C600FF24A2FFFC56 +:10448000ACE2001C30820001504000083C03800870 +:104490008D02003C00A210230441001224040005F8 +:1044A0008C62000410A2000F3C0380088C620004A0 +:1044B00014A2001E000000003C0208008C4200D83C +:1044C00030420020104000093C0280083462008025 +:1044D000906300089042004C144300043C028008A2 +:1044E000240400040A0010CA0000000034430080C5 +:1044F00034420100A040000C24020001A462001418 +:1045000010C0000A3C0280008C4401003C03800083 +:104510008C6201F80440FFFE24020002AC6401C07A +:10452000A06201C43C021000AC6201F803E0000884 +:104530000000000027BDFFE800A61823AFBF001051 +:1045400018600080308800FF3C02800834470080FB +:10455000A0E0002434440100A0E000278C82001C6D +:1045600000A2102304400056000000008CE2003C32 +:1045700094E3005C8CE4002C004530233063FFFFA3 +:1045800000C318210083202B1080000400E01821B4 +:104590008CE2002C0A00113900A2102194E2005C88 +:1045A0003042FFFF00C2102100A21021AC62001CAB +:1045B0003C028008344400809482005C8C83001CA0 +:1045C0003042FFFF0002104000A210210043102BD8 +:1045D00010400004000000008C82001C0A00114CF6 +:1045E0003C0680089482005C3042FFFF00021040CD +:1045F00000A210213C06800834C3010034C70080AB +:10460000AC82001CA060000CACE500388C62001C81 +:1046100000A210231840000224A2FFFCAC62001C80 +:1046200031020001104000083C0380088CE2003C8D +:1046300000A2102304410012240400058CC20004CF +:1046400010A200108FBF00108C62000414A2004F53 +:104650008FBF00103C0208008C4200D8304200207E +:104660001040000A3C028008346200809063000819 +:104670009042004C144300053C02800824040004CE +:104680008FBF00100A0010CA27BD001834430080F5 +:1046900034420100A040000C24020001A462001476 +:1046A0003C0280008C4401003C0380008C6201F8D5 +:1046B0000440FFFE240200020A00119900000000DD +:1046C0008CE2001C004610230043102B54400001D4 +:1046D000ACE5001C94E2005C3042FFFF0062102B4E +:1046E000144000072402000294E2005C8CE3001CEA +:1046F0003042FFFF00621821ACE3001C24020002DC +:10470000ACE500380E000F1FA082000C1040001F07 +:104710008FBF00103C0280008C4401003C038000ED +:104720008C6201F80440FFFE24020002AC6401C068 +:10473000A06201C43C021000AC6201F80A0011B191 +:104740008FBF001031020010104000108FBF00100A +:104750003C028008344500808CA3001C94A2005CBD +:10476000006618233042FFFF006218213C023FFF21 +:104770003444FFFF0083102B5440000100801821B7 +:1047800000C31021ACA2001C8FBF001003E0000882 +:1047900027BD001827BDFFE800C0402100A6302338 +:1047A000AFBF001018C00026308A00FF3C0280080E +:1047B000344900808D24001C8D23002C0088202388 +:1047C0000064182B1060000F344701008CE20020B9 +:1047D00000461021ACE200208CE200200044102BA7 +:1047E0001440000B3C023FFF8CE2002000441023E9 +:1047F000ACE200209522005C3042FFFF0A0011D19C +:1048000000822021ACE00020008620213C023FFFF6 +:104810003443FFFF0064102B54400001006020214E +:104820003C0280083442008000851821AC43001C03 +:10483000A0400024A04000270A0012233C03800867 +:1048400031420010104000433C0380083C068008C1 +:1048500034C400808C82003C004810235840003E45 +:10486000346600809082002424420001A08200244B +:10487000908200243C0308008C630024304200FF37 +:104880000043102B144000688FBF001034C2010099 +:104890008C42001C00A2102318400063000000009E +:1048A0008CC300049482005C006818233042FFFF30 +:1048B00000031843000210400043102A1040000576 +:1048C000000000008CC20004004810230A001206F9 +:1048D000000210439482005C3042FFFF000210404F +:1048E0003C068008AC82002C34C5008094A2005C99 +:1048F0008CA4002C94A3005C3042FFFF0002104007 +:10490000008220213063FFFF008320210104102159 +:10491000ACA2001C8CC2000434C60100ACC2001C56 +:10492000240200020E000F1FA0C2000C1040003E27 +:104930008FBF00103C0280008C4401003C038000CB +:104940008C6201F80440FFFE240200020A001253A8 +:104950000000000034660080ACC5003834640100FB +:104960008C82001C00A210231840000224A2FFFC2D +:10497000AC82001C314200015040000A3C03800818 +:104980008CC2003C00A21023044300142404000540 +:104990008C62000414A200033C0380080A00124544 +:1049A000240400058C62000414A2001F8FBF0010B5 +:1049B0003C0208008C4200D8304200201040000A1F +:1049C0003C02800834620080906300089042004CF2 +:1049D000144300053C028008240400048FBF00102B +:1049E0000A0010CA27BD0018344300803442010079 +:1049F000A040000C24020001A46200143C028000CC +:104A00008C4401003C0380008C6201F80440FFFEEE +:104A100024020002AC6401C0A06201C43C02100088 +:104A2000AC6201F88FBF001003E0000827BD00183A +:104A300027BDFFE83C0A8008AFBF00103549008061 +:104A40008D22003C00C04021308400FF004610232E +:104A50001840009D30E700FF3547010024020001A7 +:104A600000A63023A0E0000CA0E0000DA522001459 +:104A700018C00024308200108D23001C8D22002CD1 +:104A8000006818230043102B1040000F00000000A6 +:104A90008CE2002000461021ACE200208CE20020D5 +:104AA0000043102B1440000B3C023FFF8CE200201F +:104AB00000431023ACE200209522005C3042FFFF4F +:104AC0000A00128200621821ACE000200066182162 +:104AD0003C023FFF3446FFFF00C3102B544000014F +:104AE00000C018213C028008344200800065182173 +:104AF000AC43001CA0400024A04000270A0012D0B4 +:104B00003C038008104000403C0380088D22003C9C +:104B1000004810235840003D346700809122002453 +:104B200024420001A1220024912200243C03080019 +:104B30008C630024304200FF0043102B1440009A85 +:104B40008FBF00108CE2001C00A2102318400096BA +:104B5000000000008D4300049522005C00681823CB +:104B60003042FFFF00031843000210400043102AA8 +:104B700010400005012020218D4200040048102330 +:104B80000A0012B3000210439522005C3042FFFF7E +:104B9000000210403C068008AC82002C34C5008026 +:104BA00094A2005C8CA4002C94A3005C3042FFFF14 +:104BB00000021040008220213063FFFF0083182193 +:104BC00001031021ACA2001C8CC2000434C60100F9 +:104BD000ACC2001C240200020E000F1FA0C2000C79 +:104BE000104000718FBF00103C0280008C44010017 +:104BF0003C0380008C6201F80440FFFE24020002A6 +:104C00000A0012FA0000000034670080ACE50038AA +:104C1000346601008CC2001C00A210231840000260 +:104C200024A2FFFCACC2001C3082000150400008EE +:104C30003C0380088CE2003C00A210230443005196 +:104C4000240400058C62000410A2003E3C0380088E +:104C50008C62000454A200548FBF00103C02080074 +:104C60008C4200D830420020104000063C028008F0 +:104C700034620080906300089042004C1043004072 +:104C80003C0280083443008034420100A040000C04 +:104C900024020001A46200143C0280008C44010044 +:104CA0003C0380008C6201F80440FFFE24020002F5 +:104CB000AC6401C0A06201C43C021000AC6201F807 +:104CC0000A0013388FBF001024020005A12000271E +:104CD00014E2000A3C038008354301009062000D95 +:104CE0002C420006504000053C0380089062000DF5 +:104CF00024420001A062000D3C038008346700805C +:104D0000ACE50038346601008CC2001C00A2102300 +:104D10001840000224A2FFFCACC2001C308200013B +:104D20005040000A3C0380088CE2003C00A21023A3 +:104D300004410014240400058C62000414A2000342 +:104D40003C0380080A00132F240400058C62000431 +:104D500014A200158FBF00103C0208008C4200D83E +:104D6000304200201040000A3C028008346200807B +:104D7000906300089042004C144300053C028008F8 +:104D8000240400048FBF00100A0010CA27BD0018B9 +:104D90003443008034420100A040000C2402000192 +:104DA000A46200148FBF001003E0000827BD0018A4 +:104DB0003C0B800827BDFFE83C028000AFBF00101D +:104DC00034420100356A00809044000A35690100D0 +:104DD0008C4500148D4800389123000C308400FF6E +:104DE000010510231C4000B3306700FF2CE20006D1 +:104DF000504000B18FBF00102402000100E23004D7 +:104E000030C200035440000800A8302330C2000C18 +:104E1000144000A130C20030144000A38FBF001026 +:104E20000A0013FC0000000018C0002430820010AB +:104E30008D43001C8D42002C006818230043102B6A +:104E40001040000F000000008D22002000461021BD +:104E5000AD2200208D2200200043102B1440000BB7 +:104E60003C023FFF8D22002000431023AD22002092 +:104E70009542005C3042FFFF0A0013700062182167 +:104E8000AD200020006618213C023FFF3446FFFFA2 +:104E900000C3102B5440000100C018213C028008C0 +:104EA0003442008000651821AC43001CA04000245F +:104EB000A04000270A0013BE3C03800810400040B9 +:104EC0003C0380088D42003C004810231840003D00 +:104ED000346700809142002424420001A142002452 +:104EE000914200243C0308008C630024304200FF00 +:104EF0000043102B144000708FBF00108D22001C47 +:104F000000A210231840006C000000008D63000414 +:104F10009542005C006818233042FFFF00031843ED +:104F2000000210400043102A1040000501402021DB +:104F30008D620004004810230A0013A100021043F0 +:104F40009542005C3042FFFF000210403C068008A2 +:104F5000AC82002C34C5008094A2005C8CA4002C90 +:104F600094A3005C3042FFFF000210400082202129 +:104F70003063FFFF0083182101031021ACA2001C45 +:104F80008CC2000434C60100ACC2001C2402000222 +:104F90000E000F1FA0C2000C104000478FBF001072 +:104FA0003C0280008C4401003C0380008C6201F8CC +:104FB0000440FFFE240200020A0013EE000000007D +:104FC00034670080ACE50038346601008CC2001CF8 +:104FD00000A210231840000224A2FFFCACC2001C57 +:104FE000308200015040000A3C0380088CE2003C03 +:104FF00000A2102304430014240400058C62000462 +:1050000014A200033C0380080A0013E024040005F6 +:105010008C62000414A200288FBF00103C0208001C +:105020008C4200D8304200201040000A3C02800828 +:1050300034620080906300089042004C14430005E5 +:105040003C028008240400048FBF00100A0010CA2C +:1050500027BD00183443008034420100A040000CFA +:1050600024020001A46200143C0280008C44010070 +:105070003C0380008C6201F80440FFFE2402000221 +:10508000AC6401C0A06201C43C021000AC6201F833 +:105090000A0013FC8FBF00108FBF001001003021E9 +:1050A0000A00111B27BD0018010030210A00125A06 +:1050B00027BD00188FBF001003E0000827BD0018AF +:1050C0003C0380083464010024020003A082000C29 +:1050D0008C62000403E00008AC82001C3C058008E0 +:1050E00034A300809062002734A501002406004309 +:1050F00024420001A0620027906300273C020800C0 +:105100008C420048306300FF146200043C076021B9 +:1051100094A500DA0A0008ED30A5FFFF03E00008BF +:105120000000000027BDFFE8AFBF00103C02800078 +:105130000E0014058C4401803C02800834430100B9 +:10514000A060000C8C4200048FBF001027BD001827 +:1051500003E00008AC62001C27BDFFE03C028008B1 +:10516000AFBF0018AFB10014AFB0001034450080DD +:10517000344601003C0880008D09014090C3000CBA +:105180008CA4003C8CA200381482003B306700FFE6 +:105190009502007C90A30027146000093045FFFFB2 +:1051A0002402000554E200083C04800890C2000D6F +:1051B00024420001A0C2000D0A0014403C048008F3 +:1051C000A0C0000D3C048008348201009042000C15 +:1051D00024030005304200FF1443000A24A205DC2A +:1051E00034830080906200272C4200075040000565 +:1051F00024A20A0090630027240200140062100415 +:1052000000A210213C108008361000803045FFFFBE +:10521000012020210E001405A60500149602005C52 +:105220008E0300383C1180003042FFFF0002104026 +:1052300000621821AE03001C0E0003458E240140BD +:105240009202002534420040A20200250E000350C5 +:105250008E2401408E2401403C0380008C6201F8C2 +:105260000440FFFE24020002AC6401C0A06201C43D +:105270003C021000AC6201F88FBF00188FB100141F +:0C5280008FB0001003E0000827BD0020E4 +:04528C008008010095 +:10529000800800808008000000000C8000003200C0 +:1052A0008008024008000EDC08000F3408000F7868 +:1052B00008001010080010508008010080080080CD +:0452C0008008000062 +:0C52C4000A0000220000000000000000B2 +:1052D0000000000D6370352E302E306A3300000060 +:1052E00005000004000000000000000000000000B5 +:1052F000000000000000000038003C00000000003A +:10530000000000000000000000000000000000207D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:105330000000000000000000210038000000000113 +:105340000000002B00000000000000000000000032 +:1053500010000003000000000000000D0000000D20 +:105360003C020800244254243C0308002463564CA9 +:10537000AC4000000043202B1480FFFD24420004B9 +:105380003C1D080037BD9FFC03A0F0213C10080025 +:10539000261000883C1C0800279C54240E0002881C +:1053A000000000000000000D00A018210080102166 +:1053B000008028213C0460003C07600024060008AF +:1053C00010600006348420788C420000ACE2200893 +:1053D0008C63000003E00008ACE3200C0A000E2AF6 +:1053E00000000000240300403C02600003E00008CD +:1053F000AC4320003C0760008F8600008CE52074E1 +:105400000086102100A2182B14600007000028213C +:105410008F8AFD9824050001A14400138F890000A4 +:1054200001244021AF88000003E0000800A0102103 +:105430008F84FD988F8500009086001330C300FF95 +:1054400000A31023AF82000003E00008A080001337 +:105450008F84FD9827BDFFE8AFB00010AFBF0014E8 +:10546000908900119087001124020028312800FF44 +:105470003906002830E300FF2485002C2CD00001E1 +:10548000106200162484001C0E0000390000000089 +:105490008F8FFD983C0560002402020495EE003ECB +:1054A00095ED003C000E5C0031ACFFFF016C502517 +:1054B000ACAA20105200000124020004ACA220007B +:1054C0000000000000000000000000008FBF00147A +:1054D0008FB0001003E0000827BD00180A0000711B +:1054E000000028218F85FD9827BDFFD8AFBF002081 +:1054F000AFB3001CAFB20018AFB10014AFB00010D2 +:105500000080982190A4001124B0001C24B1002C2C +:10551000308300FF386200280E00005B2C5200012F +:105520000E00006300000000020020211240000273 +:1055300002202821000028210E0000390000000070 +:105540008F8DFD983C0880003C05600095AC003EC6 +:1055500095AB003C02683025000C4C00316AFFFF1F +:10556000012A3825ACA7201024020202ACA6201480 +:1055700052400001240200028FBF00208FB3001CA4 +:105580008FB200188FB100148FB0001027BD002813 +:1055900003E00008ACA2200027BDFFE0AFB2001876 +:1055A000AFB10014AFB00010AFBF001C3C116000E1 +:1055B0008E2320748F82000030D0FFFF30F2FFFF77 +:1055C0001062000C2406008F0E000039000000005D +:1055D0003C06801F0010440034C5FF00011238252E +:1055E00024040002AE27201000003021AE25201434 +:1055F000AE2420008FBF001C8FB200188FB10014A2 +:105600008FB0001000C0102103E0000827BD00206B +:1056100027BDFFE0AFB0001030D0FFFFAFBF0018D4 +:10562000AFB100140E00003930F1FFFF001024006C +:10563000009180253C036000AC7020108FBF0018E3 +:105640008FB100148FB0001024020004AC6220005F +:1056500027BD002003E000080000102127BDFFE85F +:105660003C0B6018AFBF00108D6F50002418FF7FF7 +:10567000340C807101F8702435CD380C240A0031C7 +:105680003C098000AD6D50003C08800AAD6C53BCF5 +:10569000AD2A00080E00049BAF88002C0E000459B0 +:1056A000000000000E000048000000003C07600001 +:1056B0008CE508082406FFF03C03570900A62024C7 +:1056C0003462F0001082005024190001AF800034D1 +:1056D0000E000BBC000000003C0660168CC40000ED +:1056E0003C0760148CE500A03C03FFFF00831024FE +:1056F0003C1F535300051FC2105F003D34C57C00A2 +:1057000094A201F2A780004C10400003A780005C27 +:10571000384B1E1EA78B004C94A201F810400004C9 +:105720008F8D0034384C1E1EA78C005C8F8D00348A +:1057300011A000049784005C240E0020A78E004C6A +:105740009784005C2C8F008151E0000124040080CC +:105750009785004C2CB80401530000012405040077 +:105760003C0260008C4304382419103C307FFFFF5A +:1057700013F900033087FFFF50E0000F24060050AC +:10578000A380005E9388005E51000010A784005C37 +:10579000A780005C9785005C8FBF0010A780004C3D +:1057A000A7800054A78000723C010800AC2500804F +:1057B00003E0000827BD0018A386005E9388005E02 +:1057C0005500FFF4A780005CA784005CA785004C0F +:1057D0008FBF00109785005CA7800054A7800072DF +:1057E0003C010800AC25008003E0000827BD00183C +:1057F00000035080014648218D2800043C066000CB +:105800000A00010F010628210A000103AF990034A4 +:105810003083FFFF8F88002C8F87002800032140F2 +:105820003C0580003C020050008248253C06600098 +:105830003C0A010034AC04008CCD08E001AA5824D5 +:1058400011600005000000008CCF08E024E7000193 +:1058500001EA7025ACCE08E08D19001001805821B6 +:10586000ACB900388D180014ACB8003CACA90030BD +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890003C0380008C640000308200201040FFFD3B +:1058A0003C0F60008DED08E03C0E010001AE1824B5 +:1058B0001460FFE100000000AF87002803E000084B +:1058C000AF8B00388F85002C240BFFF03C06800046 +:1058D00094A7001A8CA9002430ECFFFF000C38C0FC +:1058E00000EB5024012A4021ACC8003C8CA40024C9 +:1058F0008CC3003C008310231840003300000000DC +:105900008CAD002025A200013C0F0050ACC2003835 +:1059100035EE00103C068000ACCE003000000000E8 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000003C048000A7 +:105940008C990000333800201300FFFD30E200087E +:10595000104000173C0980008C880408ACA8001097 +:105960008C83040CACA300143C1900203C1880006C +:10597000AF19003094AE001894AF001C01CF302155 +:10598000A4A6001894AD001A25A70001A4A7001A28 +:1059900094AB001A94AC001E118B000300000000B1 +:1059A00003E000080000000003E00008A4A0001AC3 +:1059B0008D2A0400ACAA00108D240404ACA40014A9 +:1059C0000A0001AA3C1900208CA200200A000192C2 +:1059D0003C0F00500A0001800000000027BDFFE8D6 +:1059E000AFBF00100E0001C4000000008F89002C22 +:1059F0008FBF00103C038000A520000A9528000AF4 +:105A00009527000427BD00183105FFFF30E6000F81 +:105A10000006150000A2202503E00008AC64008009 +:105A20003C0508008CA500208F83000427BDFFE8FB +:105A3000AFB00010AFBF001410A300100000802111 +:105A4000240400010204300400A6202400C3102412 +:105A50005044000626100001001018802787FD9C86 +:105A60001480000A00671821261000012E09000288 +:105A70005520FFF38F830004AF8500048FBF00140F +:105A80008FB0001003E0000827BD00188C680000EC +:105A90003C058000ACA800240E0001C626100001C1 +:105AA0003C0508008CA500200A0001EB2E0900022D +:105AB00024050001008518043C0408008C840020A3 +:105AC00027BDFFC8AFBF003400831024AFBE003035 +:105AD000AFB7002CAFB60028AFB50024AFB400209C +:105AE000AFB3001CAFB20018AFB1001410400051AA +:105AF000AFB000108F84002C948700069488000AB1 +:105B000000E8302330D5FFFF12A0004B8FBF0034D8 +:105B1000948B0018948C000A016C50233142FFFFD3 +:105B200002A2482B1520000202A0202100402021C3 +:105B30002C8F000515E0000200809821241300043A +:105B40000E000153026020218F87002C02609021FB +:105B5000AF80003094F4000A026080211260004E91 +:105B60003291FFFF3C1670003C1440003C1E2000A8 +:105B70003C1760008F9900388F38000003161824F6 +:105B80001074004F0283F82B17E00036000000006D +:105B9000107E00478F86003014C0003A24030001B5 +:105BA00002031023022320213050FFFF1600FFF1D3 +:105BB0003091FFFF8F87002C3C1100203C108000AB +:105BC000AE11003094EB000A3C178000024B5021CC +:105BD000A4EA000A94E9000A94E800043123FFFFD4 +:105BE0003106000F00062D000065F025AEFE008096 +:105BF00094F3000A94F6001812D3003600122140E4 +:105C00008CFF00148CF4001003E468210000C02114 +:105C100001A4782B0298702101CF6021ACED001413 +:105C2000ACEC001002B2382330F5FFFF16A0FFB82D +:105C30008F84002C8FBF00348FBE00308FB7002CB4 +:105C40008FB600288FB500248FB400208FB3001CBE +:105C50008FB200188FB100148FB0001003E000085D +:105C600027BD00381477FFCC8F8600300E000D8BD7 +:105C700002002021004018218F86003010C0FFC98B +:105C800002031023027070238F87002C01C3682148 +:105C90000A00027631B2FFFF8F86003014C0FFC9C0 +:105CA0003C1100203C1080000A000240AE11003080 +:105CB0000E0003C4020020210A00026D00401821DA +:105CC000020020210E0007DB022028210A00026DBD +:105CD000004018210E000180000000000A00025957 +:105CE00002B2382327BDFFD8AFB40020AFB3001CE9 +:105CF000AFB20018AFB10014AFB00010AFBF0024B6 +:105D00000E0000E6241300013C0280083C03200042 +:105D10003C010800AC200070345400803472000351 +:105D20003C1080002411FF800E0001D7000000000D +:105D30008E06000038C5000130A400011480FFFA6F +:105D4000000000008E07010024030C0010E300098E +:105D50003C0580008E0901002D2830805500001080 +:105D60003C0480008E0B01002D6A31811140000C33 +:105D70003C0480008CAC0100118300040000202151 +:105D80008CAE010025CDFF8131A400FF8E0F0100F4 +:105D90000E0001FBAE0F00240A0002C13C0480008B +:105DA0008C9F010024180020AC9F002092990000D5 +:105DB000332300FF1078001F2402005010620022DD +:105DC000000000003C0480008C830100146000038C +:105DD00000000000566000143C0440008C8201006A +:105DE0008C990100000098210051F824001F79408F +:105DF0003338007F01F8702501D26825AC8D08305A +:105E00008C8C01008C890100258B010001715024CC +:105E1000000A39403128007F00E8302500D22825CB +:105E2000AC8508303C044000AE0401380A000299F9 +:105E3000000000008C8501000E00078D2404008006 +:105E40000A0002C13C0480008C8401000E0013EAA9 +:105E5000000000000A0002C13C04800000A4102BD6 +:105E600024030001104000090000302100052840F3 +:105E700000A4102B04A00003000318405440FFFCB2 +:105E8000000528405060000A0004182B0085382BBC +:105E900054E000040003184200C33025008520238D +:105EA000000318421460FFF9000528420004182B73 +:105EB00003E0000800C310213084FFFF30C600FF5C +:105EC0003C0780008CE201B80440FFFE00064C0055 +:105ED000012430253C08200000C820253C03100088 +:105EE000ACE00180ACE50184ACE4018803E000088B +:105EF000ACE301B83C0660008CC5201C2402FFF016 +:105F000030830200308601001060000E00A22824B9 +:105F100034A500013087300010E0000530830C000C +:105F200034A500043C04600003E00008AC85201C9C +:105F30001060FFFD3C04600034A5000803E0000889 +:105F4000AC85201C54C0FFF334A500020A000315E1 +:105F50003087300027BDFFE8AFB00010AFBF00149E +:105F60003C076000240600021080001100A0802180 +:105F70008F8300380E00030C8C6400188F82003869 +:105F800000002021240600018C45000C0E0002FDBB +:105F9000000000001600000224020003000010218F +:105FA0008FBF00148FB0001003E0000827BD001859 +:105FB0008CE8201C2409FFF001092824ACE5201CF2 +:105FC0008F8700380A0003328CE5000C3C02600E1B +:105FD0000080402134460100240900180000000020 +:105FE00000000000000000003C0A00503C0380005C +:105FF00035470200AC68003834640400AC65003CEE +:10600000AC6700308C6C0000318B00201160FFFD0C +:106010002407FFFF2403007F8C8D00002463FFFF13 +:1060200024840004ACCD00001467FFFB24C60004E8 +:1060300000000000000000000000000024A4020096 +:106040000085282B3C0300203C0E80002529FFFF03 +:1060500001054021ADC300301520FFE0008028215C +:1060600003E00008000000008F82003827BDFFD841 +:10607000AFB3001CAFBF0020AFB20018AFB1001427 +:10608000AFB0001094460002008098218C52001896 +:106090002CC300818C4800048C4700088C51000CF4 +:1060A0008C490010106000078C4A00142CC40004B6 +:1060B0001480001330EB000730C5000310A000105F +:1060C000000000002410008B020020210220282163 +:1060D0000E0002FD240600031660000224020003E5 +:1060E000000010218FBF00208FB3001C8FB200185A +:1060F0008FB100148FB0001003E0000827BD002806 +:106100001560FFF12410008B3C0C80003C03002044 +:10611000241F0001AD830030AF9F0030000000005D +:1061200000000000000000002419FFF024D8000F38 +:10613000031978243C1000D0AD88003801F0702598 +:1061400024CD00033C08600EAD87003C358504007B +:10615000AD8E0030000D38823504003C3C038000D9 +:106160008C6B0000316200201040FFFD0000000039 +:1061700010E0000824E3FFFF2407FFFF8CA80000C5 +:106180002463FFFF24A50004AC8800001467FFFB14 +:10619000248400043C04600EAC860038000000003B +:1061A00000000000000000003C0700203C068000CA +:1061B0000120202101402821ACC700300E000342FD +:1061C000000080210E00030C024020210A000382FF +:1061D0000200202127BDFFE0AFB200183092FFFF80 +:1061E000AFB10014AFBF001CAFB000101640000DDF +:1061F000000088210A0003F1022010212405000379 +:10620000508500278CE5000C0000000D262C0001B5 +:106210003191FFFF24EB00200232502B1140001976 +:10622000AF8B00388F820030144000168F87003803 +:106230003C0670003C0320008CE5000000A62024F2 +:10624000148300108F840040000544023C09800044 +:1062500000A980241480FFE9310600FF2CCA000B3E +:106260001140FFEB262C0001000668803C0E080060 +:1062700025CE51C801AE60218D8B00000160000861 +:1062800000000000022010218FBF001C8FB20018F8 +:106290008FB100148FB0001003E0000827BD00206C +:1062A0000E0002FD240400841600FFD88F870038FA +:1062B0000A0003D2AF800040020028210E00032410 +:1062C000240400018F8700380A0003D2AF82004007 +:1062D000020028210E000324000020210A000401EE +:1062E0008F8700380E000369020020218F87003855 +:1062F0000A0003D2AF82004030AFFFFF000F19C089 +:106300003C0480008C9001B80600FFFE3C1920047C +:106310003C181000AC830180AC800184AC990188EA +:10632000AC9801B80A0003D3262C000190E20002C9 +:1063300090FF00030000202100023A0000FF282502 +:10634000240600080E0002FD000000001600FFDD1C +:10635000240200038F870038000010210A0003D2B6 +:10636000AF82004090E50002000020210A000420D6 +:106370002406000994E5000490E9000390E300027C +:10638000000534000009420000C8202500832825AC +:106390002406000A0A0004200000202190E50002E3 +:1063A000000020210A0004202406000B000449C23A +:1063B0003127003F000443423C0280000008204097 +:1063C000240316802CE60020AC43002C24EAFFE0D6 +:1063D0002482000114C0000330A900FF00801021B6 +:1063E000314700FF000260803C0D8000240A00015C +:1063F000018D20213C0B000E00EA2804008B302187 +:1064000011200005000538278CCE000001C5382575 +:1064100003E00008ACC700008CD800000307782414 +:1064200003E00008ACCF000027BDFFE0AFB10014CF +:10643000AFB00010AFBF00183C0760008CE4080844 +:106440003402F0003C1160003083F000240501C0EC +:106450003C04800E00003021106200062410000170 +:106460008CEA08083149F0003928E0000008382B90 +:10647000000780403C0D0200AE2D0814240C16804D +:106480003C0B80008E2744000E000E34AD6C002CB7 +:10649000120000043C0216912405000112050010B0 +:1064A0003C023D6C345800E0AE3844083C11080012 +:1064B0008E31007C8FBF00183C06600000118540C3 +:1064C000360F16808FB100148FB000103C0E020002 +:1064D00027BD0020ACCF442003E00008ACCE08105C +:1064E0003C0218DA345800E0AE3844083C11080089 +:1064F0008E31007C8FBF00183C0660000011854083 +:10650000360F16808FB100148FB000103C0E0200C1 +:1065100027BD0020ACCF442003E00008ACCE08101B +:106520000A00043A240500010A00043A0000282168 +:1065300024020400A7820010A78000080000202188 +:106540003C06080024C654B02405FFFF248900013E +:10655000000440803124FFFF010618212C87002011 +:1065600014E0FFFAAC65000024040400A7840012C4 +:10657000A780000A000020213C06080024C65530F0 +:106580002405FFFF248D00010004608031A4FFFF7B +:10659000018658212C8A00201540FFFAAD650000C5 +:1065A000A7800014A780000CA780000E0000202107 +:1065B0003C06080024C655B02405FFFF24990001BD +:1065C0000004C0803324FFFF030678212C8E0004D2 +:1065D00015C0FFFAADE500003C0560008CA73D004A +:1065E0002403E08F00E310243446014003E0000858 +:1065F000ACA63D002487007F000731C224C5FFFF01 +:10660000000518C2246400013082FFFF000238C078 +:10661000A784001C3C010800AC270030AF800018A4 +:1066200000002821000020210000302124890001E1 +:1066300000A728213124FFFF2CA817011100000317 +:106640002C8300801460FFF924C6000100C02821BB +:10665000AF86001810C0001DA786001624CAFFFFD1 +:10666000000A11423C080800250855B01040000AF5 +:1066700000002021004030212407FFFF248E00016C +:106680000004688031C4FFFF01A860210086582BF8 +:106690001560FFFAAD87000030A2001F50400008CF +:1066A00000043080240300010043C804000410806B +:1066B000004878212738FFFF03E00008ADF800000C +:1066C00000C820212405FFFFAC85000003E000087E +:1066D0000000000030A5FFFF30C6FFFF30A8001FFC +:1066E0000080602130E700FF0005294200005021B2 +:1066F00010C0001D24090001240B00012518000111 +:10670000010B2004330800FF01267826390E0020F3 +:106710002DED00012DC2000101A218251060000D11 +:10672000014450250005C880032C40210100182198 +:1067300010E0000F000A20278D040000008A1825B1 +:10674000AD03000024AD00010000402100005021F5 +:1067500031A5FFFF252E000131C9FFFF00C9102B15 +:106760001040FFE72518000103E0000800000000CA +:106770008D0A0000014440240A000520AC68000096 +:1067800027BDFFE830A5FFFF30C6FFFFAFB0001008 +:10679000AFBF001430E7FFFF000050213410FFFFAF +:1067A0000000602124AF001F00C048212418000110 +:1067B0002419002005E0001601E010210002F94331 +:1067C000019F682A0009702B01AE402411000017B8 +:1067D000000C18800064102110E000058C4B0000B4 +:1067E00000F84004000838230167582400003821CD +:1067F0001540004100004021556000163169FFFF3F +:10680000258B0001316CFFFF05E1FFEC01E0102159 +:1068100024A2003E0002F943019F682A0009702B60 +:1068200001AE40241500FFEB000C18801546000552 +:106830003402FFFF020028210E0005040000382169 +:10684000020010218FBF00148FB0001003E0000879 +:1068500027BD00181520000301601821000B1C0241 +:1068600024080010306A00FF15400005306E000F4C +:10687000250D000800031A0231A800FF306E000F3A +:1068800015C00005307F0003251000040003190225 +:10689000320800FF307F000317E00005386900016F +:1068A0002502000200031882304800FF3869000109 +:1068B0003123000110600004310300FF250A0001AC +:1068C000314800FF310300FF000C694001A3402163 +:1068D000240A000110CAFFD53110FFFF246E000109 +:1068E00031C800FF1119FFC638C900012D1F002053 +:1068F00053E0001C258B0001240D00010A000597C0 +:10690000240E002051460017258B000125090001A7 +:10691000312800FF2D09002051200012258B000195 +:1069200025430001010D5004014B102425090001ED +:106930001440FFF4306AFFFF3127FFFF10EE000C18 +:106940002582FFFF304CFFFF000050213410FFFF75 +:10695000312800FF2D0900205520FFF225430001BA +:10696000258B0001014648260A000551316CFFFFC6 +:1069700000003821000050210A0005A33410FFFF59 +:1069800027BDFFD8AFB0001030F0FFFFAFB100144B +:10699000001039423211FFE000071080AFB3001C35 +:1069A00000B1282330D3FFFFAFB2001830A5FFFF9E +:1069B000008090210260302100442021AFBF0020E0 +:1069C0000E00052F3207001F022288213403FFFF2B +:1069D00002402021020028210260302100003821DD +:1069E000104300093231FFFF022010218FBF002029 +:1069F0008FB3001C8FB200188FB100148FB000103D +:106A000003E0000827BD00280E00052F000000004D +:106A100000408821022010218FBF00208FB3001C6E +:106A20008FB200188FB100148FB0001003E000087F +:106A300027BD0028000424003C036000AC603D0832 +:106A400010A00002348210063482101603E0000801 +:106A5000AC623D0427BDFFE0AFB00010309000FFF6 +:106A60002E020006AFBF001810400008AFB100149E +:106A7000001030803C030800246351F400C3282137 +:106A80008CA400000080000800000000000020210D +:106A90008FBF00188FB100148FB00010008010213C +:106AA00003E0000827BD0020979100161620005132 +:106AB000000020213C020800904200330A00060A30 +:106AC00000000000978D001215A000310000202169 +:106AD0000A00060A240200089787001014E0001A32 +:106AE0000000182100602021240200011080FFE92D +:106AF0008FBF0018000429C20045302100A6582B82 +:106B00001160FFE43C0880003C072000000569C0DC +:106B100001A76025AD0C00203C0380082402001F63 +:106B20002442FFFFAC6000000441FFFD2463000429 +:106B300024A5000100A6702B15C0FFF5000569C053 +:106B40000A0005F48FBF0018978700083C0408006E +:106B5000248454B0240504000E0005AF240600016F +:106B6000978B001024440001308AFFFF2569FFFF46 +:106B70002D4804000040282115000040A78900107E +:106B800024AC3800000C19C00A000608A7800008D1 +:106B90009787000A3C04080024845530240504002B +:106BA0000E0005AF2406000197990012244400014D +:106BB0003098FFFF272FFFFF2F0E04000040882191 +:106BC00015C0002CA78F0012A780000A3A0200030C +:106BD000262401003084FFFF0E0005DC2C45000157 +:106BE0000011F8C027F00100001021C00A00060AB9 +:106BF000240200089785001A9787000E3C040800BD +:106C0000248455B00E0005AF2406000197870016B6 +:106C10008F8900182445000130A8FFFF24E3FFFFFF +:106C20000109302B0040802114C00018A7830016F2 +:106C3000A780000E9785001C0E000E1E020020216A +:106C4000244A05003144FFFF0E0005DC2405000145 +:106C50003C05080094A500320E000E1E0200202103 +:106C6000244521003C020800904200330A00060A35 +:106C7000000521C00A000642A784000A24AC38009F +:106C8000000C19C00A000608A78400080A00065C68 +:106C9000A785000E308400FF27BDFFE82C82000688 +:106CA000AFBF0014AFB000101040001500A0382195 +:106CB000000440803C0308002463520C0103282197 +:106CC0008CA40000008000080000000024CC007F9D +:106CD000000751C2000C59C23170FFFF2547C400A4 +:106CE00030E5FFFF27840008020030210E00050474 +:106CF000240700019786001402062021A7840014AF +:106D00008FBF00148FB0001003E0000827BD0018EB +:106D10003C0508008CA50030000779C20E0002E691 +:106D200025E4DF003045FFFF3C040800248455B013 +:106D3000240600010E00050424070001978E0016AA +:106D40008FBF00148FB0001025CD000127BD0018A3 +:106D500003E00008A78D00160007C9C22738FF000E +:106D6000001878C231F0FFFF3C040800248455303D +:106D700002002821240600010E000504240700015A +:106D8000978D0012260E0100000E840025AC000134 +:106D90003C0B6000A78C0012AD603D083604000675 +:106DA000000030213C0760008CE23D04305F0006AB +:106DB00017E0FFFD24C9000100061B00312600FF7B +:106DC000006440252CC50004ACE83D0414A0FFF687 +:106DD0008FBF00148FB0001003E0000827BD00181B +:106DE000000751C22549C8002406000124070001FC +:106DF0003C040800248454B00E0005043125FFFF34 +:106E0000978700108FBF00148FB0001024E6000198 +:106E100027BD001803E00008A78600103084FFFF9C +:106E200030A5FFFF3C0680008CC201B80440FFFE85 +:106E30003C084080008838253C031000ACC001802D +:106E4000ACC50184ACC7018803E00008ACC301B83D +:106E50003084FFFF3C0680008CC201B80440FFFE76 +:106E60003C0840388CA70000008828253C0310000F +:106E7000ACC70180ACC5018803E00008ACC301B811 +:106E80008F8300588F8600501066000B00804021D1 +:106E90003C07080024E755C0000328C000A71021C4 +:106EA0008C44000024630001108800053063000F4B +:106EB0005466FFFA000328C003E000080000102118 +:106EC0003C07080024E755C400A7302103E0000870 +:106ED0008CC200003C039000346200010082202537 +:106EE0003C038000AC6400208C65002004A0FFFE01 +:106EF0000000000003E00008000000003C028000E9 +:106F0000344300010083202503E00008AC44002046 +:106F100027BDFFE0AFB100143091FFFFAFB000100C +:106F2000AFBF00181220001200A080218CA5000025 +:106F300014A00011240400023C0680008CC201B899 +:106F40000440FFFE3C074000022720258FBF0018A9 +:106F50008FB100148FB000103C03100027BD00203B +:106F6000ACC50180ACC4018803E00008ACC301B823 +:106F70000A00071D8CA500000E00067424060200FE +:106F8000000028210A00071DAE0000003087FFFF27 +:106F90003C0680008CC201B80440FFFE3C0A40065B +:106FA0008CA9000000EA4025ACC901808CA4000433 +:106FB0003C031000ACC40184ACC8018803E00008A5 +:106FC000ACC301B88F83FD9427BDFFE8AFBF0014A9 +:106FD000AFB00010906700080080102100802821C9 +:106FE00030E600400000202110C000088C50000056 +:106FF0000E00008802002021020020218FBF001413 +:107000008FB000100A00049727BD00180E00073249 +:10701000000000000E000088020020210200202154 +:107020008FBF00148FB000100A00049727BD00180E +:1070300027BDFFE0AFB000108F90FD94AFBF001CE4 +:10704000AFB20018AFB10014920600010080882191 +:107050000E00070430D2000492040005001129C27A +:10706000A605000034830040A20300050E00070EB1 +:10707000022020210E000499022020212402000178 +:10708000AE02000C02202821A602001024040002F7 +:10709000A602001224060200A60200140E000674C6 +:1070A000A60200161640000F8FBF001C978C0054DC +:1070B0003C0B08008D6B00782588FFFF3109FFFF2E +:1070C000256A0001012A382B10E00006A788005429 +:1070D0003C0F6006240E001635ED0010ADAE0050DA +:1070E0008FBF001C8FB200188FB100148FB000103A +:1070F00003E0000827BD002027BDFFE0AFB100146A +:10710000AFBF0018AFB000101080000400A08821AD +:107110002402008010820007000000000000000D23 +:107120008FBF00188FB100148FB0001003E000086B +:1071300027BD00200E00070400A020218F86FD94AB +:107140000220202190C500050E00070E30B000FF80 +:107150002403003E1603FFF1000000003C05800000 +:107160008CA401780480FFFE240800073C0710006F +:10717000ACB1014002202021A0A801448FBF00181B +:107180008FB100148FB00010ACA701780A00075B24 +:1071900027BD002027BDFFE0AFB00010AFBF001833 +:1071A000AFB100143C1080008E11002000000000E0 +:1071B0000E000499AE040020AE1100208FBF00180D +:1071C0008FB100148FB0001003E0000827BD00202D +:1071D0003084FFFF3C0680008CC201B80440FFFEF3 +:1071E0003C084035008838253C031000ACC50180C0 +:1071F000ACC00184ACC7018803E00008ACC301B88F +:107200003084FFFF3C0680008CC201B80440FFFEC2 +:107210003C084036008838253C031000ACC501808E +:10722000ACC00184ACC7018803E00008ACC301B85E +:1072300027BDFFD0AFB500243095FFFFAFB60028C3 +:10724000AFB40020AFBF002CAFB3001CAFB200182A +:10725000AFB10014AFB0001030B6FFFF12A000278E +:107260000000A0218F9200388E4300003C06800071 +:107270002402004000033E0200032C0230E4007FA1 +:10728000006698241482001D30A500FF8F830048FB +:107290002C68000A510000108F86003000035880CF +:1072A0003C0C0800258C5228016C50218D490000AF +:1072B000012000080000000002D4702131C5FFFF4A +:1072C0000E0006D624040084166000028F92003857 +:1072D000AF8000488F860030264F002026890001AD +:1072E00001E090213134FFFF14C00004AF8F00385B +:1072F0000295282B14A0FFDC000000000280102162 +:107300008FBF002C8FB600288FB500248FB40020CB +:107310008FB3001C8FB200188FB100148FB0001013 +:1073200003E0000827BD00302407003414A70146FD +:10733000000000009247000E8F98FD988F90FD94FA +:10734000240F1600A30700199244000D3C0880008A +:107350003C07800CA3040018965F00123C096000F3 +:107360003C117FFFA61F005C965900103622FFFFDC +:10737000240400053325FFFFAE0500548E46001C93 +:10738000AD0F00288CEE00008D2D444801C6182654 +:1073900001A33021AE0600388E0C003824CA00014B +:1073A0003C0D7F00AE0C003C8E0B003CAF0B00048C +:1073B000AE0A00208E130020AE13001CA300001B99 +:1073C000AE02002CA30400128E5F001424130050A0 +:1073D000AE1F00348E190034AF1900148E4500180A +:1073E000AE050048924F000CA20F004E9209000813 +:1073F000352E0020A20E00088E030018006D6024B8 +:10740000358B4000AE0B0018920A0000315200FF8D +:10741000125302A62413FF803C0408002484564023 +:107420000E00074000000000240C000424080001A6 +:107430003C0508008CA556403C048000A20C0025A9 +:10744000A20800058C9001780600FFFE8F9200389C +:10745000240D00023C031000AC850140A08D0144C6 +:10746000AC8301780A000804AF8000482CAD0037D7 +:1074700011A0FF998F860030000580803C11080024 +:1074800026315250021178218DEE000001C0000813 +:10749000000000002410000414B0008E3C0780009F +:1074A0003C0B08008D6B56408F86FD94ACEB0020A2 +:1074B0008E4300088F8FFD98240E0050ACC300301F +:1074C0008E4A0008ACCA00508E42000CACC2003498 +:1074D0008E440010ACC400388E5F0010ACDF005446 +:1074E0008E590014ACD9003C8E580018ADF8000439 +:1074F0008E51001CACD1002090C5000030A900FFC7 +:10750000112E0276000000008CC500348CD10030B2 +:1075100000B1302304C000F32404008C126000F09A +:10752000240200030A000804AF820048240F00056B +:1075300014AF00683C0B80003C0308008C6356408D +:107540008F86FD94AD6300208E4A00048F99FD98CC +:1075500024072000ACCA001C924200082412000834 +:10756000A32200198F840038909F0009A33F0018C0 +:107570008F85003890B8000A330400FF1092001085 +:10758000288C0009158000BC24080002240E00206D +:10759000108E000B34078000288900211520000878 +:1075A0002407400024110040109100053C07000111 +:1075B000240F0080108F00023C07000224074000C7 +:1075C0008CDF00183C04FF0003E4C8240327C02517 +:1075D000ACD8001890B2000BA0D200278F830038DF +:1075E0009465000C10A0022A000000009467000CB3 +:1075F0003C198000240BFFBFA4C7005C9062000E02 +:1076000024070004A0C200088F840038909F000F58 +:10761000A0DF00098F8C00388D9200108F38007425 +:1076200002582823ACC500588D8F0014ACCF002C15 +:10763000959100183229FFFFACC90040958E001AC1 +:1076400031D0FFFFACD000448D8D001CACCD004884 +:1076500095880002A4C800789183000EA0C300089A +:1076600090CA0008014B1024126001D4A0C2000887 +:107670008F9200380A000804AF87004824060006ED +:1076800014A600143C0D80003C1008008E105640DB +:107690008F8CFD90ADB000208E4800188F86FD9431 +:1076A0008F8AFD98AD8800008CC300382404000543 +:1076B000AD8300048CCB003C12600081AD4B000018 +:1076C0000A000804AF840048240E000710AE004BE7 +:1076D000240400063C05080024A556400E000713AC +:1076E000240400818F9200380013102B0A00080434 +:1076F000AF8200482419002314B9FFF63C0B800028 +:107700003C0C08008D8C56408F8AFD98AD6C002093 +:107710008F91FD948E4600042544002026450014D8 +:10772000AE260028240600030E000E2A2550003045 +:107730008F87003802002021240600030E000E2A45 +:1077400024E500083C040800248456400E0007404D +:107750000000000092220000241F0050304400FF6F +:10776000549FFFE18F9200380E000E1500000000BC +:107770000A0009098F9200382403003314A3003251 +:107780003C0280003C1108008E3156408F8EFD98DF +:10779000AC5100208E440008240900288F88FD94F5 +:1077A000ADC400308E5F000C24060009ADDF00344C +:1077B0008E590010ADD900388E580014ADD8002075 +:1077C0008E450018ADC500248E4F001CADCF00289B +:1077D000A1C900118E4D000412600031AD0D0028CA +:1077E0008F9200380A000804AF860048240900225E +:1077F00014A9FFB800000000240400073C0F080093 +:107800008DEF56403C118000AE2F00205660FEB137 +:10781000AF8400483C040800248456400E00074012 +:10782000241300508F98FD9493120000324500FFFE +:1078300010B30169000000008F9200380000202181 +:107840000A000804AF8400483C05080024A55640FF +:107850000E0006E3240400810A0009098F92003813 +:1078600002D498213265FFFF0E0006D6240400845E +:107870000A0008048F9200381088FF512407040082 +:107880002887000310E001A324100004240D000148 +:10789000548DFF4B240740000A0008BF2407010055 +:1078A0003C05080024A556400E000732240400823F +:1078B0008F920038000030210A000804AF8600488B +:1078C0003C040800248456408CC200380E00074057 +:1078D0008CC3003C8F9200380A00095F0000202111 +:1078E000240400823C05080024A556400E000732FF +:1078F000000000008F920038000010210A000804E8 +:10790000AF8200488E5000048F91FD943C0A8000A5 +:10791000AD500020922200050200282130460002CE +:1079200014C001802404008A8F92FD98020028214F +:107930002404008D924B001B3163002014600179F8 +:1079400000000000922D0009240C001231A800FF55 +:10795000110C0174240400810E0007040200202190 +:107960009245001B240E00040200202134A900428D +:10797000A249001B0E00070EA22E00253C04800029 +:107980008C9101780620FFFE24180002AC90014083 +:10799000A09801448F9200383C0F1000AC8F017802 +:1079A0000A00090A0013102B8E5000048F91FD94D9 +:1079B0003C1F8000AFF00020923900050200282112 +:1079C0003327000214E000172404008A92240009DF +:1079D0002412000402002821308600FF10D200117A +:1079E000240400810E000704020020218F8CFD98E2 +:1079F000240B00122403FFFE918D001B02002021A6 +:107A000035A80020A188001BA22B0009922A00059E +:107A1000014310240E00070EA222000502002821B7 +:107A2000000020210E0007CF000000000A00090915 +:107A30008F9200388E5100043C0280003C100800F8 +:107A400026105640AC5100203C010800AC31564095 +:107A50009246000330C40004108001658F84FD94B9 +:107A600024020006A0820009924D001B2408FFC0DA +:107A700031AC003F01885825A08B000892430003D9 +:107A8000306A00011540015C000000008E420008D1 +:107A9000AE0200083C0208008C4256481040015BD0 +:107AA0008F8EFD98000281C28F85FD94A5D0000CB9 +:107AB0008E5F000C240F000124090014ADDF002CA0 +:107AC0008E590010ADD9001C96470016A5C7003C82 +:107AD00096580014A5D8003EACAF000CA4AF00101F +:107AE000A4AF0012A4AF0014A4AF00161260015F8F +:107AF000A1C9001192440003309200022E530001EC +:107B00008F920038266200080A000804AF820048FD +:107B10008E4600043C0580003C048008ACA6002092 +:107B20008E4700089089000024110050312200FF88 +:107B3000105100B8240500883C0480008C8F01B8E7 +:107B400005E0FFFE0013802B3C18400900B810250B +:107B5000AF9000483C101000AC860180AC870184D7 +:107B6000AC820188AC9001B80A0008058F8600300D +:107B70008E4500043C0680003C098008ACC500200E +:107B8000913F00002404005033F900FF132400B09B +:107B9000240600883C0480008C8A01B80540FFFE62 +:107BA0003C0E400E00CE68253C081000AC850180DC +:107BB000AC800184AC8D0188AC8801B8912B0000A9 +:107BC000240CFF8024040004016C182524060030D6 +:107BD0000E000674A12300000A0009098F920038E4 +:107BE0008E5000048F91FD983C0F8000ADF0002076 +:107BF0009225001B30A900101120007C2403008175 +:107C00003C0480008C8701B804E0FFFE3C1F401F4D +:107C1000AC900180007F10250013C82B3C10100091 +:107C2000AC800184AF990048AC820188AC9001B867 +:107C30000A0008058F8600308E44001C0E0006EFF7 +:107C400000000000104000F8004038218F920038FA +:107C5000240600893C0580008CAE01B805C0FFFEFB +:107C600000000000ACA701808E50001C3C114001B8 +:107C70000013782B00D138253C131000ACB00184E0 +:107C8000AF8F0048ACA70188ACB301B80A00080563 +:107C90008F860030965900023C100800261056408E +:107CA00033380004130000A33C0460008E5F001C06 +:107CB0003C068000ACDF00203C010800AC3F564091 +:107CC000964F000231E7000114E000E300000000DD +:107CD0008E420004AE0200083C1008008E10564888 +:107CE000120000D93C0680008F85FD94241000010D +:107CF0008CBF00188F91FD988F89FD9003E6C825F1 +:107D0000ACB90018A0A00005ACB0000C3C180800ED +:107D10008F1856488F870038A4B00010001879C219 +:107D2000A4B00012A4B00014A4B00016A62F000C3A +:107D30008CEE00088F8D00388F8C0038AE2E002C12 +:107D40008DA8000C24070002AE28001C918B0010A7 +:107D5000A22B00118F830038906A0011A12A00081D +:107D60008F82003890440012A0A4004E8F920038F9 +:107D700092460013A22600128F920038965F0014DC +:107D8000A63F003C96590016A639003E8E580018B2 +:107D9000AE3800145660FD4FAF8700483C05080020 +:107DA00024A556400E000713000020218F920038B2 +:107DB000000038210A000804AF8700483C0508008D +:107DC00024A556400E000732240400828F9200380A +:107DD0000A0008EC000038210E000E15000000001B +:107DE0008F9200380A00095F000020210E0007046E +:107DF000020020219232001B020020213658001080 +:107E00000E00070EA238001B8F9200380A000A4F9E +:107E1000000018219243000C306A00011140000359 +:107E200000000000964B000EA48B002C9248000C22 +:107E3000310C00021180FF4000002821964E0012F4 +:107E40008E4D0014A48E001A0A000A1DAC8D001C71 +:107E50008F8300588F8700501067FF4E000030213D +:107E60003C080800250855C4000320C000883021C4 +:107E70008CD10000122500C8246200013043000F9D +:107E80001467FFFA000320C00A000A340000302102 +:107E90003C05080024A556400E0007322404008B40 +:107EA0008F9200380A0008EC0013382B3C0B0800B6 +:107EB0008D6B564024D8FFFE25710100322A007FC9 +:107EC0000147902102331024AD020028AE4600D0B5 +:107ED000AE4000D40A000855AE58001CACC0005497 +:107EE0003C0E08008DCE56403C09800C352C01001C +:107EF000ACEE00288E500014AD9000D08E4D0014D2 +:107F0000AD8D00D48E4800102507FFFE0A000891B1 +:107F1000AD87001C5490FDAA240740000A0008BF4A +:107F2000240710000E0007C3000000000A00090922 +:107F30008F9200388C83442C3C05DEAD34B2BEEF0A +:107F40003C010800AC205640107200900000000078 +:107F50003C046C62348279701462000824040002CC +:107F6000978A00549783004C020028210143482B34 +:107F70001120001924040092240400020E0005E4DC +:107F8000240502003C0B8000AD6200203C0108008B +:107F9000AC2256401040000D8F8E0038240C002873 +:107FA0002404000391CD001031A800FF550C0001FE +:107FB000240400010E00004C0000000010400004EA +:107FC000240400830A000A7F8F920038240400836F +:107FD0003C05080024A556400E00071300000000D1 +:107FE0008F9200380013382B0A000804AF8700482E +:107FF0000A0009E8240200128E4400080E0006EF71 +:10800000000000000A0009F4AE0200083C05080068 +:1080100024A556400E0006E3240400878F92003802 +:108020000A000A110013102B240400040E0005E4BA +:108030002405003014400014004038218F9200388D +:108040000A000A64240600833C05080024A5564063 +:108050000A000B45240400878E4400040E0006EF3E +:10806000000000000A000A85AE0200083C05080076 +:1080700024A556400E000732240400828F92003857 +:108080000A000A11000010218F9200383C08800875 +:108090003C0C8000240B0050240A0001AD8200201B +:1080A000A10B0000A10A000192490004A1090018D7 +:1080B00092440005A1040019924300063C04080004 +:1080C000248455C4A103001A924200073C0308000F +:1080D000246355C0A102001B92450008A105001CA5 +:1080E00092460009A106001D925F000AA11F001E12 +:1080F0009259000BA119001F9258000CA1180020E2 +:108100009251000DA11100219250000EA1100022E9 +:10811000924F000FA10F0023924E0010A10E0024D9 +:10812000924D0011A10D0025964C0014A50C0028BD +:10813000964B00168F8A00508F980058A50B002A86 +:1081400096490018000A10C025450001A509002C19 +:108150008E46001C0044C8210043F82130A5000FC2 +:10816000AFE60000AF27000010B80003AF85005055 +:108170000A000A640000302124AD000131A8000F7C +:10818000000030210A000A64AF8800588C83442C18 +:108190000A000B243C046C623C07080024E755C02D +:1081A00000879021ACC00000000030210A000A3492 +:1081B000AE4000003C0482013C03600034820E02A9 +:1081C000AC603D68AF80007803E00008AC623D6CB5 +:1081D00027BDFFE8AFB000103090FFFF001018423D +:1081E0002C620041AFBF0014144000022404008040 +:1081F000240300403C010800AC3000603C01080052 +:10820000AC2300640E000E1E00602821244802BF2B +:108210002409FF8001092824001039800010304013 +:108220008FBF00148FB0001000A7202100861821F6 +:10823000AF8300603C010800AC2500583C010800F9 +:10824000AC24005C03E0000827BD0018308300FF69 +:1082500030C6FFFF30E400FF3C0880008D0201B80B +:108260000440FFFE00035400014438253C0960002F +:1082700000E920253C031000AD050180AD06018416 +:10828000AD04018803E00008AD0301B88F86003813 +:108290003C096012352700108CCB00043C0C600EAA +:1082A00035850010316A00062D480001ACE800C495 +:1082B0008CC40004ACA431808CC2000894C30002BA +:1082C000ACA2318403E00008A78300708F850038DA +:1082D0008F87FF208F86FF288CAE00043C0F601232 +:1082E00035E80010ACEE00688CAD0008ACED006C19 +:1082F0008CAC0010ACCC004C8CAB000CACCB004870 +:1083000094CA00543C0208008C42004425490001F4 +:10831000A4C9005494C400543083FFFF10620017B6 +:10832000000000003C0208008C420040A4C2005241 +:108330008CA30018ACE300308CA20014ACE2002C3B +:108340008CB90018ACF900388CB800142405000171 +:10835000ACF800348D0600BC50C500198D0200B485 +:108360008D0200B8A4E2004894E40048A4E4004A66 +:1083700094E800DA03E000083102FFFF3C02080045 +:108380008C420024A4C00054A4C200528CA3001844 +:10839000ACE300308CA20014ACE2002C8CB90018C5 +:1083A000ACF900388CB8001424050001ACF8003496 +:1083B0008D0600BC54C5FFEB8D0200B88D0200B4E1 +:1083C000A4E2004894E40048A4E4004A94E800DAF7 +:1083D00003E000083102FFFF8F8600383C04800074 +:1083E0008CC900088CC80008000929C0000839C0E1 +:1083F000AC87002090C30007306200041040003AB0 +:10840000AF85007490CB0007316A00081140003935 +:108410008F87FF248CCD000C8CCE001401AE602B16 +:1084200011800032000000008CC2000CACE2007031 +:108430008CCB00188F85FF208F88FF28ACEB007451 +:108440008CCA00102402FFF8ACAA00C88CC9000C2A +:10845000AD0900608CC4001CACA400C090E3007C9B +:108460000062C824A0F9007C90D80007330F0008F0 +:1084700011E000040000000090ED007C35AC00012C +:10848000A0EC007C90CF000731EE000111C0000984 +:108490000000000090E4007C2418000234820002F6 +:1084A000A0E2007C90A300EC307900FF13380013A9 +:1084B0002408003490C900073126000210C00004CF +:1084C0000000000090EB007C356A0004A0EA007C0C +:1084D00090ED007D31AC003FA0EC007D94A700DA68 +:1084E00003E0000830E2FFFF8F87FF240A000C5AE8 +:1084F0008CC200140A000C5BACE000700A000C7C1B +:10850000ACA800CC8F8C003827BDFFD8AFB3001CBF +:10851000AFB20018AFB00010AFBF0020AFB1001471 +:10852000918F00153C13600E3673001031EB000F75 +:10853000A38B007C8D8F00048D8B0008959F00120B +:10854000959900109584001A9598001E958E001C30 +:1085500033EDFFFF332AFFFF3089FFFF3308FFFFB2 +:1085600031C7FFFF3C010800AC2D00243C0108008E +:10857000AC2900443C010800AC2A0040AE683178C8 +:10858000AE67317C91850015959100163C12601202 +:108590003652001030A200FF3230FFFFAE62318849 +:1085A000AE5000B491830014959F0018240600017A +:1085B0000066C80433F8FFFFAE5900B8AE5800BCDF +:1085C000918E0014AF8F00643C08600631CD00FF2F +:1085D000AE4D00C0918A00159584000E3C07600ADC +:1085E000314900FFAF8B00683084FFFFAE4900C8FF +:1085F000351100100E000BC334F004103C020800CB +:108600008C4200603C0308008C6300643C06080058 +:108610008CC600583C0508008CA5005C8F84006067 +:108620008FBF0020AE23004CAE65319CAE030054DA +:10863000AE4500DCAE6231A0AE6331A4AE663198C7 +:10864000AE2200488FB3001CAE0200508FB1001460 +:10865000AE4200E0AE4300E4AE4600D88FB000105A +:108660008FB200180A0004CC27BD0028978500723D +:108670009783005C27BDFFE8AFB0001000A3102B6C +:10868000AFBF0014240400058F900038104000553F +:10869000240900020E0005E48F850060AF8200749B +:1086A000240400031040004F240900023C0680000F +:1086B0000E00004CACC2002024070001240820005A +:1086C0001040004D24040005978E00728F8AFF240D +:1086D0002409005025C50001A7850072A1490000AA +:1086E0003C0D08008DAD0064240380008F84FF20C2 +:1086F000000D6600AD4C0018A5400006954B000A21 +:108700008F85FF282402FF8001633024A546000ADC +:10871000915F000A0000482103E2C825A159000A20 +:10872000A0A00008A140004CA08000C5961800023F +:10873000978300703C020004A49800DA960F0002B0 +:108740002418FFBF25EE2401A48E00AE8E0D000478 +:10875000ACAD00448E0C0008ACAC0040A4A00050AE +:10876000A4A000548E0B000C240C0030AC8B00280D +:108770008E060010AC860024A480003EA487004E24 +:10878000A4870050A483003CAD420074AC8800C8AC +:10879000ACA80060A08700EC909F00C433F9007F74 +:1087A000A09900C4909000C402187824A08F00C43F +:1087B000914E007C35CD0001A14D007C938B007C57 +:1087C000AD480070AC8C00CCA08B00C68F880068D0 +:1087D0008F870064AC8800B4AC8700B8A5400078EF +:1087E000A540007A8FBF00148FB000100120102127 +:1087F00003E0000827BD00188F8500740E00067482 +:108800008F8600600A000D482409000227BDFFE0A2 +:10881000AFB000108F900038AFB10014AFBF001898 +:108820008E0900040E000499000921C08E0800047E +:108830008F84FF208F82FF28000839C03C0680000B +:10884000ACC70020948500DA904300131460001C2C +:1088500030B1FFFF8F8CFF24918B0008316A0040FC +:108860001540000B000000008E0D00040220302196 +:108870008FBF00188FB100148FB0001024040022A5 +:1088800000003821000D29C00A000BE227BD00209E +:108890000E000063000000008E0D00040220302155 +:1088A0008FBF00188FB100148FB000102404002275 +:1088B00000003821000D29C00A000BE227BD00206E +:1088C0000E00005B000000008E0D0004022030212D +:1088D0008FBF00188FB100148FB000102404002245 +:1088E00000003821000D29C00A000BE227BD00203E +:1088F00027BDFFE0AFB200183092FFFFAFB000100D +:10890000AFBF001CAFB100141240001E0000802158 +:108910008F8600388CC500002403000600053F0246 +:108920000005140230E4000714830016304500FFF0 +:108930002CA8000611000040000558803C0C0800DF +:10894000258C532C016C50218D490000012000081A +:10895000000000008F8E0078240D000111CD005022 +:1089600024020002AF820078260900013130FFFFA7 +:1089700024C800200212202B010030211480FFE5C2 +:10898000AF880038020010218FBF001C8FB2001882 +:108990008FB100148FB0001003E0000827BD002045 +:1089A0009387005E54E00034000030210E000C90EC +:1089B000000000008F8600380A000DA82402000184 +:1089C0008F8700782405000210E50031240400138D +:1089D0000000282100003021240700010E000BE2D6 +:1089E000000000000A000DA98F8600388F830078F0 +:1089F000240200021462FFF6240400120E000C454B +:108A0000000000008F850074004030212404001213 +:108A10000E000BE2000038210A000DA98F860038F5 +:108A20008F8300782411000310710029241F000295 +:108A3000107FFFCE26090001240400100000282129 +:108A4000000030210A000DC6240700018F91007834 +:108A5000240600021626FFF9240400100E000CEA7A +:108A600000000000144000238F9800388F860038E3 +:108A70000A000DA824020003240400140E000BE2D7 +:108A8000000028218F8600380A000DA82402000269 +:108A90000E000D52000000000A000DA98F8600385C +:108AA0000E000BF200000000241900022404001440 +:108AB000000028210000302100003821AF99007803 +:108AC0000E000BE2000000000A000DA98F8600389E +:108AD0000E000C02000000008F85007424190002B3 +:108AE0000040302124040010000038210A000DFF4E +:108AF000AF9900780040382124040010970F00023D +:108B0000000028210E000BE231E6FFFF8F860038BF +:108B10000A000DA9AF9100788F84FF243C077FFFE6 +:108B200034E6FFFF8C8500182402000100A61824FB +:108B3000AC83001803E00008A08200053084FFFF2A +:108B400030A5FFFF108000070000182130820001CF +:108B50001040000200042042006518211480FFFB31 +:108B60000005284003E000080060102110C0000745 +:108B7000000000008CA2000024C6FFFF24A5000412 +:108B8000AC82000014C0FFFB2484000403E0000852 +:108B90000000000010A0000824A3FFFFAC86000026 +:108BA00000000000000000002402FFFF2463FFFF1C +:108BB0001462FFFA2484000403E0000800000000AF +:108BC000000411C003E000082442024027BDFFE872 +:108BD000AFB0001000808021AFBF00140E000E3F28 +:108BE00000A0202100504821240AFF808FBF0014DC +:108BF0008FB00010012A30243127007F3C08800A02 +:108C00003C04210000E8102100C428253C0380001A +:108C100027BD0018AC650024AF820024AC400000E2 +:108C2000AC65002403E00008AC4000403C0D0800A7 +:108C30008DAD005800056180240AFF8001A45821F1 +:108C4000016C4821012A30243127007F3C08800C28 +:108C50003C04210000E8102100C428253C038000CA +:108C6000AC650028AF82002003E00008AC4000247F +:108C700030A5FFFF3C0680008CC201B80440FFFE17 +:108C80003C08601500A838253C031000ACC40180E6 +:108C9000ACC00184ACC7018803E00008ACC301B8D4 +:108CA0003C0D08008DAD005800056180240AFF804E +:108CB00001A45821016C4021010A482400093140D7 +:108CC0003107007F00C728253C04200000A4182598 +:108CD0003C028000AC43083003E00008AF80002075 +:108CE00027BDFFE8AFB0001000808021AFBF0014A7 +:108CF0000E000E3F00A0202100504821240BFF80D1 +:108D0000012B5024000A39403128007F3C06200006 +:108D10008FBF00148FB0001000E8282534C2000176 +:108D200000A218253C04800027BD0018AC83083041 +:108D300003E00008AF8000243C0580088CA7006099 +:108D40003C0680080087102B144000112C83400043 +:108D50008CA800602D0340001060000F2403400029 +:108D60008CC900600089282B14A000020080182103 +:108D70008CC3006000035A42000B30803C0A08009C +:108D8000254A53A000CA202103E000088C8200007D +:108D90001460FFF32403400000035A42000B3080AC +:108DA0003C0A0800254A53A000CA202103E000081D +:108DB0008C8200003C05800890A6000893840088FF +:108DC00024C20001304200FF3043007F1064000CD9 +:108DD00000023827A0A200083C0480008C8501789E +:108DE00004A0FFFE8F8A0080240900023C081000C6 +:108DF000AC8A0140A089014403E00008AC880178F6 +:108E00000A000EC430E2008027BDFFD8AFB20018C0 +:108E10008F920084AFBF0020AFB3001CAFB0001032 +:108E2000AFB100148F9300208E5900283C100080B1 +:108E30003C0EFFEFAE7900008E580024A260000ABD +:108E400035CDFFFFAE7800049251002C3C0BFF9F04 +:108E5000356AFFFFA271000C8E6F000C3C080040C9 +:108E6000A271000B01F06025018D4824012A3824ED +:108E700000E83025AE66000C8E450004AE60001898 +:108E80003C0400FFAE6500148E43002C3482FFFFCB +:108E9000A66000080062F824AE7F00108E5900081A +:108EA0008F900080964E0012AE7900208E51000CFB +:108EB00031D83FFF00187980AE7100248E4D001428 +:108EC00001F0602131CB0001AE6D00288E4A001800 +:108ED000000C41C2000B4B80AE6A002C8E46001C79 +:108EE00001093821A667001CAE66003096450002D5 +:108EF0008E440020A665001EAE6400349243003309 +:108F00003062000454400006924700003C02800892 +:108F1000344301008C7F00C0AE7F003092470000D8 +:108F20008F860024A0C700309245003330A4000291 +:108F300050800007925100018F880024240BFF808D +:108F4000910A0030014B4825A109003092510001DF +:108F50008F900024240CFFBF2404FFDFA2110031F6 +:108F60008F8D00243C1880083711008091AF003CA1 +:108F700031EE007FA1AE003C8F890024912B003C94 +:108F8000016C5024A12A003C8F9F00248E6800149D +:108F900093E6003C2D0700010007114000C428247F +:108FA00000A21825A3E3003C8F87002496590012E5 +:108FB000A4F900328E450004922E007C30B00003EC +:108FC0000010782331ED000300AD102131CC0002F8 +:108FD0001580000224460034244600303C028008FC +:108FE00034430080907F007C00BFC82433380004E5 +:108FF0001700000224C2000400C010218F98002432 +:1090000024190002ACE20034A3190000924F003F83 +:109010008F8E00243C0C8008358B0080A1CF00018E +:109020008F910024924D003F8E440004A62D000233 +:10903000956A005C0E000E9D3150FFFF00024B80D0 +:10904000013038253C08420000E82825AE25000400 +:109050008E4400388F850024ACA400188E4600345E +:10906000ACA6001CACA0000CACA00010A4A0001486 +:10907000A4A00016A4A00020A4A00022ACA000245C +:109080008E62001450400001240200018FBF0020B6 +:109090008FB3001C8FB200188FB100148FB0001076 +:1090A000ACA200080A000EBC27BD002827BDFFC8DF +:1090B0003C05800834A40080AFBF0034AFBE003050 +:1090C000AFB7002CAFB60028AFB50024AFB4002076 +:1090D000AFB3001CAFB20018AFB10014AFB00010B6 +:1090E000948300789482007A104300512405FFFF96 +:1090F0000080F0210A000FCC0080B821108B004DB9 +:109100008FBF00348F8600803C1808008F18005CE9 +:109110002411FF803C1680000306782101F1802491 +:10912000AED0002C96EE007A31EC007F3C0D800E24 +:1091300031CB7FFF018D5021000B4840012AA8212F +:1091400096A400003C0808008D0800582405FF8004 +:1091500030953FFF01061821001539800067C821AE +:109160000325F8243C02010003E290253338007FF8 +:109170003C11800CAED20028031190219250000DBA +:10918000320F000411E0003702E0982196E3007AE4 +:1091900096E8007A96E5007A2404800031077FFF84 +:1091A00024E3000130627FFF00A4F82403E2C82515 +:1091B000A6F9007A96E6007A3C1408008E940060C6 +:1091C00030D67FFF12D400C1000000008E58001876 +:1091D0008F84008002A028212713FFFF0E000E7746 +:1091E000AE53002C97D5007897D4007A12950010D2 +:1091F000000028213C098008352401003C0A800831 +:1092000091480008908700C53114007F30E400FFCA +:109210000284302B14C0FFB9268B0001938E008886 +:10922000268C0001008E682115ACFFB78F86008068 +:109230008FBF00348FBE00308FB7002C8FB6002850 +:109240008FB500248FB400208FB3001C8FB200189C +:109250008FB100148FB0001000A0102103E00008AF +:1092600027BD003800C020210E000E4202802821B8 +:109270008E4B00108E4C00308F8400242409000295 +:10928000016C5023AE4A0010A089000096E3005CF8 +:109290008E4400308F9100240E000E9D3070FFFF31 +:1092A00000024380011028253C07420000A710253A +:1092B000AE2200048E5F00048F8A00248E590000C5 +:1092C000240B0008AD5F001CAD590018AD40000C28 +:1092D000AD4000109246000A240400052408C00096 +:1092E00030D000FFA550001496580008A55800166D +:1092F0009251000A3C188008322F00FFA54F002031 +:10930000964E000837110100A54E0022AD40002402 +:10931000924D000B31AC00FFA54C0002A14B0001A7 +:109320008E4900308F830024240BFFBFAC690008F6 +:10933000A06400308F9000242403FFDF96070032E2 +:1093400000E8282400B51025A6020032921F003242 +:1093500033F9003F37260040A20600328F8C0024EC +:10936000AD8000348E2F00C0AD8F0038918E003C50 +:109370003C0F7FFF31CD007FA18D003C8F84002406 +:1093800035EEFFFF908A003C014B4824A089003C49 +:109390008F85002490A8003C01033824A0A7003C3E +:1093A0008E4200348F9100243C038008AE2200409E +:1093B0008E59002C8E5F0030033F3023AE260044D0 +:1093C000923000483218007FA23800488F8800246D +:1093D0008E4D00308D0C004801AE5824019650246B +:1093E000014B4825AD0900489244000AA104004CF5 +:1093F000964700088F850024A4A7004E8E500030A9 +:109400008E4400300E0002E68C65006092F9007C0C +:109410000002F940004028210002110003E230213F +:109420003336000212C00003020680210005B0801E +:1094300002168021926D007C31B30004126000029C +:1094400000057080020E80218E4B003024058000C4 +:10945000316A0003000A4823312400030204182162 +:109460008F900024AE03003496E4007A96E8007AE8 +:1094700096F1007A31077FFF24E20001305F7FFF21 +:109480000225C824033F3025A6E6007A96F8007A24 +:109490003C1208008E520060330F7FFF11F200185B +:1094A000000000008F8400800E000E7702A02821AB +:1094B0008F8400800E000E87028028210E000EBCD3 +:1094C000000000000A000FC80000000096F1007ABA +:1094D00002248024A6F0007A92EF007A92EB007AC0 +:1094E00031EE00FF000E69C2000D6027000C51C074 +:1094F0003169007F012A20250A000FC2A2E4007A08 +:1095000096E6007A00C5C024A6F8007A92EF007AA9 +:1095100092F3007A31F200FF001271C2000E682748 +:10952000000DB1C0326C007F01962825A2E5007ABB +:109530000A0010798F8400803C0380003084FFFF94 +:1095400030A5FFFFAC640018AC65001C03E0000808 +:109550008C62001427BDFFA83C068008AFBE0050F7 +:10956000AFBF0054AFB7004CAFB60048AFB5004432 +:10957000AFB40040AFB3003CAFB20038AFB100347D +:10958000AFB0003034C80100910500C590C7000895 +:10959000309EFFFF30A500FF30E2007F0045182A13 +:1095A000A7A00014A7A0001E10600053AFA00010D9 +:1095B00090C900083126007F00A620232493FFFFD6 +:1095C0000013802B001E882B0211782451E00084A8 +:1095D0008FB300103C19800897360052973700501F +:1095E000001EC40002D7A8230015A4000014140311 +:1095F00003C2902A1640000200182C0300402821C4 +:10960000001314000002240300A4F82A57E000010C +:1096100000A0202128830009146000020080A021FE +:10962000241400083C0A80088D4500480014498035 +:109630008D48004C3C0380003124FFFF3C060010A5 +:109640000086382534710400AC650038AF91008481 +:10965000AC68003CAC670030000000000000000077 +:1096600000000000000000000000000000000000FA +:1096700000000000000000008C6C0000318B002016 +:109680001160FFFD0014682A01B010241040003959 +:109690000000A8213C16800892D700083C128000E8 +:1096A0008E44010032F6007F0E000E4202C02821D7 +:1096B0008E2F00108E4401000000902131F73FFFF3 +:1096C0000E000E5A02E02821922E000031C2003F07 +:1096D0002C50000852000010000088210002F88081 +:1096E0003C0308002463535403E3C8218F3800006F +:1096F000030000080000000090CE0008938B008853 +:1097000031CD007F00AD6023016C50210A0010BFF5 +:109710002553FFFF000088213C1080008E040100CB +:109720000E000E7702E028218E0401000E000E8745 +:1097300002C028211220000F0013802B8F8A008482 +:1097400026A900010009AC00027298230015AC03A1 +:109750002545004002B4B02A0013802B24170001D5 +:1097600000A0882102D01024AF8500841440FFC9D6 +:10977000AFB700103C07800894F100503C05800012 +:109780003C06002002B1C821A4F90050ACA600306C +:1097900094F4005094E3005203D560231074001D2C +:1097A000319EFFFF8CE5004C8CE90048001561807C +:1097B00000ACB0210000A02102CCA82B0134502124 +:1097C0000155B821ACF6004CACF70048001E882BC0 +:1097D0000211782415E0FF803C1980088FB3001037 +:1097E0008FBF00548FBE00503A6200018FB7004C0B +:1097F0008FB600488FB500448FB400408FB3003C53 +:109800008FB200388FB100348FB0003003E0000811 +:1098100027BD005894F200548CEF0044325FFFFEE5 +:10982000001FC0C001F87021ACAE003C8CEB0044BE +:109830008CAD003C016D40231900003B000000008E +:109840008CE20040244200013C07005034E4001048 +:109850003C038000ACA20038AC6400300000000083 +:1098600000000000000000000000000000000000F8 +:109870000000000000000000000000008C760000E6 +:1098800032D7002012E0FFFD3C11800896280054DA +:109890003C0A80003C06800831190001001960C0B4 +:1098A000018AA0218E8304003C0708008CE7004455 +:1098B0003C150020ACC300488E8904042405000137 +:1098C000ACC9004C10E50259AD550030963F00522E +:1098D0003C0508008CA5004000BFC021A6380052FE +:1098E000962F005425EE0001A62E00549626005413 +:1098F00030C4FFFF5487FF34001E882B30A5FFFFC4 +:109900000E00109DA62000543C0408008C84002406 +:10991000962700520044102300E29023A632005202 +:109920000A0010C1001E882B8CE200400A00116260 +:109930003C07005092280001240700013102007FFB +:109940001447001C97AC001E8E2A0014240BC00084 +:1099500031443FFF018B48243C0608008CC6006060 +:109960000124282530A43FFF0086882B12200011F7 +:10997000A7A5001E3C1108008E3100588F82008080 +:10998000000441802407FF80022218210068F8218A +:1099900003E7C82433EF007F3C1880003C12800EA0 +:1099A000AF19002C01F2682191AE000D35D00004F2 +:1099B000A1B0000D0E000ED12412000124110001EF +:1099C0003C1080008E0401000E000E7702E028217A +:1099D0008E0401000E000E8702C028211620FF58B9 +:1099E0008F8A00840A00112C0013802B8F8600843C +:1099F00090C900013125002010A0018A2410000127 +:109A00003C048008348C0080918B007C8F91002076 +:109A100000009021316A00011140000FAFB000201A +:109A20008CD000148C8E0060020E682B15A00003F1 +:109A3000020038218C8700603C0480083483008059 +:109A40008C72007000F2782B15E0000200E02021FB +:109A50008C640070008090213C07800834E5008011 +:109A60008CD900148CBF0070033FC02B170000027C +:109A7000032020218CA400700092182310600003A2 +:109A8000AFA3002824080002AFA800208FA5002063 +:109A90000265102B144000B5000018218CC400385A +:109AA0008E2F000C3C180080AE2400008CCE0034B9 +:109AB0003C10FF9F01F86025AE2E000490CB003FC4 +:109AC000360DFFFF018D48243C0A00203C06FFEFC5 +:109AD000A22B000B012A382534C5FFFF00E54024E6 +:109AE0003C0200088F87008401022025AE24000C70 +:109AF0008CE30014AE2000188FAF0028AE230014B2 +:109B00008CF800183C1FFFFB37F9FFFFAE38001C34 +:109B10008CEE000800996824024F8021AE2E0024AC +:109B20008CEC000CAE2D000CA6200038A620003ACC +:109B3000AE30002CAE2C0020AE2000288CEB0014A0 +:109B40008FAA002801724823012A302310C0001177 +:109B5000AE26001090F0003D8E2C00048E2A0000EE +:109B600000106900018D28210000102100AD302B6C +:109B70000142482101264021AE250004AE28000004 +:109B800090E3003DA223000A8F9F008497F900060E +:109B9000A63900088F8A0024240200023C068008AF +:109BA000A142000034C900809525005C02402021BC +:109BB0008F90002430A8FFFF0E000E9DAFA8002458 +:109BC0008FA300240002FB808F8500843C044200A8 +:109BD00003E3C8250324C025AE1800048F840024A5 +:109BE0008CAF0038AC8F00188CAE0034AC8E001CEB +:109BF000AC80000CAC800010A4800014A48000167F +:109C0000A4800020A4800022AC80002490A7003F04 +:109C1000A48700025240018C240700018FAB00286A +:109C20005160000290A2003D90A2003E244C000131 +:109C3000A08C00018F840024AC9200083C1880089E +:109C400037100080920F007C31EE000215C0000238 +:109C500024070034240700308F8500843C088008E6 +:109C60003509008090A300009128007C3259000340 +:109C7000A08300308F9F00848F9000242404000470 +:109C800093F8000100997823240DC000A218003138 +:109C90008F9900248F8E008431E50003972C0032C9 +:109CA00095CB001200F24821018D502431623FFF14 +:109CB00001423025A72600329323003201253821A6 +:109CC00031080004307F003F37E40040A324003215 +:109CD000124000028F85002400E838213C0C8008E7 +:109CE000ACA70034358B01008D6200C02E4400010A +:109CF0002403FFDFACA2003890AA003C0004C94056 +:109D00003146007FA0A6003C8F8900242405FFBFB8 +:109D10009127003C00E54024A128003C8F8F0024BF +:109D200091FF003C03E3C02403198025A1F0003C0F +:109D30008F8B00848F8A00248D6E0020AD4E0040F2 +:109D40008D6D0024AD4D00448D6C0028AD4C004855 +:109D50008D62002C0E000EBCAD42004C8FA6002080 +:109D60002407000210C700118FA300200003202B3E +:109D700000048023027098240060802100609021FC +:109D80000A0011150010882B962700128F8400807E +:109D90000000902130E5FFFFA7A700140E000E6B16 +:109DA000241100010A0011C03C1080003C19800001 +:109DB0003C0280088F240100905800080E000E42DB +:109DC0003305007F8F8E00248FAF00208FA40028E2 +:109DD000A1CF00000E000E9D8F9000248FAD0024B7 +:109DE00000023B803C0B420000ED40258F87008441 +:109DF000010B2025AE0400048CE500388F90002470 +:109E000000005021000A1900AE0500188CEC003447 +:109E10003C087FFF3504FFFFAE0C001C90E9003EBC +:109E20008E1F001C8E1800180009C9000009370297 +:109E300003F968210066102501B9782B030270210F +:109E400001CF5821AE0D001CAE0B0018AE00000C67 +:109E5000AE00001090E5003E8FAF0028240E0005F4 +:109E6000A605001494EC00042405C00001E4582465 +:109E7000A60C001690EA003E01E02021A60A002070 +:109E800094E60004A6060022AE00002490E3003F02 +:109E9000A603000290E9003E90FF003D03E9C823BD +:109EA00027380001A21800018F8D00243C10800883 +:109EB000ADAF0008A1AE00308F9800248F820084DF +:109EC000360F0100970C0032944A00122410FF80D4 +:109ED00000AC382431463FFF00E61825A7030032C6 +:109EE000930900322405FFBF2403FFDF313F003F09 +:109EF00037F90040A31900328F8C00242418FFFF8B +:109F0000AD8000348DEE00C0AD8E0038918D003CE8 +:109F100031A2007FA182003C8F87002490EA003CA0 +:109F200001453024A0E6003C8F9900249329003C91 +:109F30000123F824A33F003C8F8D00243C1F8008A0 +:109F4000ADB80040ADB2004491AF00483C12800073 +:109F500001F07025A1AE00488F8700248F86008411 +:109F60008CEC004801921024004B5025ACEA0048CC +:109F700090C5003EA0E5004C8F8800848F830024AC +:109F800095090004A469004E8FE500600E0002E60A +:109F9000000000008F99FF2C8FAE00280002814046 +:109FA000932F007C0002C1000218682131F20002E8 +:109FB00000402821164000AA01CD30213C0A80082B +:109FC000354300809069007C313F000413E00003BA +:109FD0008FAE00280005608000CC3021240D0004E5 +:109FE0008F90002431C7000301A758233168000374 +:109FF00000C82021AE0400343C068008A6250038A5 +:10A000003C0580008CA4010090D100080E000E8752 +:10A010003225007F0E000EBC000000000A0012AACC +:10A020008FA300208F8500208CC2003824180003E5 +:10A03000A4A00008ACA200008CDF0034A0A0000A9D +:10A040008F920084ACBF00043C040080924F003F1C +:10A05000A0B8000C8CAE000C3C0DFF9FA0AF000B15 +:10A0600001C4402535ABFFFF3C11FFEF8F98008402 +:10A07000010B30243639FFFF00D96024ACAC000C52 +:10A080008F030014971F00128F870080ACA300106D +:10A090008F090014ACA00018ACA00020ACA90014DB +:10A0A000ACA000248F0A001833E93FFF000911809B +:10A0B000ACAA00288F1200080047782133EE000177 +:10A0C000ACB200308F08000C8F990024000F69C2D9 +:10A0D000000E238001A45821241100023C068008B0 +:10A0E000A4AB001CA4A00034ACA8002CA331000039 +:10A0F00034D90080972C005C8F8F00243C034200F1 +:10A10000318AFFFF01433825ADE700048F820084C8 +:10A11000241800012411C0008C5F0038240700348B +:10A12000ADFF00188C520034ADF2001CADE0000C05 +:10A13000ADE00010A5E00014A5E00016A5E00020A9 +:10A14000A5E00022ADE00024A5F00002A1F8000186 +:10A150008F8B00248F8E0084AD70000891CD00009D +:10A16000A16D00308F8800848F8400249105000148 +:10A17000A08500318F920024964C0032019150242A +:10A1800001491825A6430032925F003233E2003FB6 +:10A19000A24200329338007C330F000215E0000227 +:10A1A0008F840024240700303C028008AC870034F0 +:10A1B000345201008E5F00C0240EFFBF02009021C8 +:10A1C000AC9F00389098003C330F007FA08F003C7C +:10A1D0008F880024910D003C01AE5824A10B003C57 +:10A1E0008F86002490D1003C36390020A0D9003C55 +:10A1F0008F8A00848F8500240010882B8D4C0020CE +:10A20000ACAC00408D430024ACA300448D49002831 +:10A21000ACA900488D47002CACA7004C0E000EBC2A +:10A220003C1080000A0011160000000094CD00527E +:10A230003C0B08008D6B0024016D8821A4D10052D5 +:10A240000A0010C1001E882BA08700018F84002403 +:10A25000240D0001AC8D00080A00125F3C18800834 +:10A26000000290800A00133E00D2302127BDFFE09B +:10A270003C0D8008AFB20018AFB00010AFBF001C9B +:10A28000AFB1001435B200808E4C001835A8010023 +:10A29000964B000695A70050910900EC000C560261 +:10A2A000016728233143007F312600FF2402000389 +:10A2B000A3830088AF84008010C2001B30B0FFFF72 +:10A2C000910600EC2412000530C200FF105200334A +:10A2D00000000000160000098FBF001C8FB200189C +:10A2E0008FB100148FB00010240D0C003C0C8000C6 +:10A2F00027BD002003E00008AD8D00240E0010A44F +:10A30000020020218FBF001C8FB200188FB10014F3 +:10A310008FB00010240D0C003C0C800027BD0020E5 +:10A3200003E00008AD8D0024965800789651007A1D +:10A33000924E007D0238782631E8FFFF31C400C01C +:10A34000148000092D1100011600003700000000E4 +:10A350005620FFE28FBF001C0E000F7A00000000A5 +:10A360000A0014068FBF001C1620FFDA0000000050 +:10A370000E000F7A000000001440FFD88FBF001CB1 +:10A380001600002200000000925F007D33E2003FD3 +:10A39000A242007D0A0014068FBF001C950900DA56 +:10A3A0008F86006000802821240400050E000674BA +:10A3B0003130FFFF978300723C0480002465FFFF6B +:10A3C000A78500728C8A01B80540FFFE00000000DE +:10A3D000AC8001808FBF001CAC9001848FB200184C +:10A3E0008FB100148FB000103C0760133C0B1000BD +:10A3F000240D0C003C0C800027BD0020AC87018898 +:10A40000AC8B01B803E00008AD8D00240E0010A451 +:10A41000020020215040FFB18FBF001C925F007DE1 +:10A420000A00143333E2003F0E0010A40200202182 +:10A430001440FFAA8FBF001C12200007000000007C +:10A440009259007D3330003F36020040A242007D29 +:10A450000A0014068FBF001C0E000F7A00000000D7 +:10A460005040FF9E8FBF001C9259007D3330003F4B +:08A470000A00146236020040EC +:08A47800000000000000001BC1 +:10A480000000000F0000000A0000000800000006A5 +:10A4900000000005000000050000000400000004AA +:10A4A00000000003000000030000000300000003A0 +:10A4B0000000000300000002000000020000000293 +:10A4C0000000000200000002000000020000000284 +:10A4D0000000000200000002000000020000000274 +:10A4E0000000000200000002000000020000000264 +:0CA4F0000000000100000001000000015D +:04A4FC0080080100D3 +:10A50000800800808008000000000C0000003080FF +:10A5100008000F4808000FF40800100C0800102075 +:10A520000800103408000F4808000F4808001068A1 +:10A53000080010A0080010B0080010D8080017C8C4 +:10A54000080017C8080018000800180008001814B0 +:10A55000080017E408001A3C08001A0808001A94BA +:10A5600008001A9408001B1C08001A4C80080240BE +:10A57000080021A808001FF4080021D00800226864 +:10A58000080023B808002404080025280800243007 +:10A59000080024B408002064080029D008002974A9 +:10A5A0000800201008002010080020100800259C3A +:10A5B0000800259C08002010080020100800284CE6 +:10A5C00008002010080020100800201008002010AB +:10A5D000080028AC080020100800201008002010F7 +:10A5E000080020100800201008002010080020108B +:10A5F000080020100800201008002010080020107B +:10A600000800201008002010080020100800242452 +:10A6100008002010080020100800291C0800201045 +:10A62000080020100800201008002010080020104A +:10A63000080020100800201008002010080020103A +:10A64000080020100800201008002010080020102A +:10A65000080020100800201008002010080020101A +:10A66000080027700800201008002010080026E4C9 +:10A6700008002640080037880800375C08003728A3 +:10A68000080036FC080036DC08003690800801001F +:10A69000800800808008000080080080080046F0E4 +:10A6A0000800472808004670080046F0080046F0F9 +:0CA6B00008004450080046F008004AC4AE +:04A6BC000A000C760E +:10A6C00000000000000000000000000D72787035EE +:10A6D0002E302E306A330000050000030000000019 +:10A6E0000000000100000000000000000000000069 +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000100000030000000075 +:10D8A0000000000D0000000D3C020801244282200F +:10D8B0003C030801246382E0AC4000000043202BBD +:10D8C0001480FFFD244200043C1D080037BD9FFC6E +:10D8D00003A0F0213C100800261031D83C1C0801A0 +:10D8E000279C82200E0011EA000000000000000DBD +:10D8F0003C02800030A5FFFF30C600FF34430180AA +:10D900003C0880008D0901B80520FFFE00000000E2 +:10D91000AC64000024040002A4650008A066000AAC +:10D92000A064000BAC6700183C03100003E0000883 +:10D93000AD0301B83C0560008CA24FF80440FFFE27 +:10D9400000000000ACA44FC03C0310003C040200E7 +:10D95000ACA44FC403E00008ACA34FF89486000CBD +:10D9600000A050212488001400062B02000510801E +:10D97000004448210109182B10600011000000002C +:10D98000910300002C6400095080000991190001E6 +:10D99000000360803C0D080125AD80E4018D582115 +:10D9A0008D67000000E000080000000091190001F0 +:10D9B000011940210109302B54C0FFF291030000EE +:10D9C00003E00008000010210A000CBE2508000139 +:10D9D000910F0001240E000A15EE00400128C82313 +:10D9E0002F38000A1700003D250D00028D58000059 +:10D9F000250F0006370E0100AD4E0000910C00020D +:10DA000091AB000191A4000291A60003000C2E002E +:10DA1000000B3C0000A7102500041A000043C82595 +:10DA20000326C025AD580004910E000691ED0001BB +:10DA300091E7000291E50003000E5E00000D640016 +:10DA4000016C30250007220000C410250045182570 +:10DA50002508000A0A000CBEAD430008910F000122 +:10DA6000250400022408000255E8000101202021BD +:10DA70000A000CBE00804021910C0001240B000321 +:10DA8000158B0016000000008D580000910E00025A +:10DA900025080003370D0008A14E00100A000CBE37 +:10DAA000AD4D000091190001240F0004172F000B49 +:10DAB0000000000091070002910400038D43000064 +:10DAC00000072A0000A4102534660004250800047D +:10DAD000AD42000C0A000CBEAD46000003E0000899 +:10DAE0002402000127BDFFE8AFBF0014AFB0001053 +:10DAF0000E0014E0008080213C0480083485008002 +:10DB000090A600052403FFFE0200202100C310247C +:10DB10008FBF00148FB00010A0A200050A0014EA05 +:10DB200027BD001827BDFFE8AFB00010AFBF00143D +:10DB30000E000F4E008080213C06800834C5008016 +:10DB400090A4000024020050308300FF1062000700 +:10DB50003C098000020020218FBF00148FB000100C +:10DB6000AD2001800A00101027BD00182408010014 +:10DB70003C078000020020218FBF00148FB00010EE +:10DB8000ACE801800A00101027BD001827BDFF7007 +:10DB90003C088008AFB60080AFB5007CAFB1006C28 +:10DBA000AFBF008CAFBE0088AFB70084AFB40078C1 +:10DBB000AFB30074AFB20070AFB00068350500803D +:10DBC0003C0780008CF2012890A40009ACE000849E +:10DBD00090A60005309100FF0000A821000618273C +:10DBE000306200010000B02114400067AFA0005077 +:10DBF00090A9000024050020312400FF10850016A4 +:10DC0000240A0050108A008C000000003C0C080020 +:10DC10008D8C00DC258B00013C010800AC2B00DC66 +:10DC20000E0015D6000000008FBF008C8FBE00884C +:10DC30008FB700848FB600808FB5007C8FB40078DA +:10DC40008FB300748FB200708FB1006C8FB000681A +:10DC500003E0000827BD00900000000D3C1080008C +:10DC6000AFA00030961F01168E1901043C1E002043 +:10DC700036130C00033EC0240018B82B00173140A7 +:10DC8000AFA600308E0E010433F4FFFF3C0F0040BE +:10DC90000293802101CF68249213000D11A0004847 +:10DCA00034C40040326200201440000234860080F8 +:10DCB0000080302114C00093AFA600303C058008DE +:10DCC00034A800809107000830E6004050C00006EC +:10DCD0003C06800824090004122900A2240A00122C +:10DCE000122A00293C06800834D401003C17800029 +:10DCF00096EF011A960D000E928E0008326B00040A +:10DD000031F7FFFF01CD6004AFAC00548E14000466 +:10DD1000116000318E1E000834C300809079000825 +:10DD20003338004017000028000000008C730050BA +:10DD300002939023064000063C0C80008C7E003449 +:10DD4000029E8023060200838EA200083C0C800005 +:10DD5000AD800044240200018FBF008C8FBE00887C +:10DD60008FB700848FB600808FB5007C8FB40078A9 +:10DD70008FB300748FB200708FB1006C8FB00068E9 +:10DD800003E0000827BD00900E000D1A00002021BE +:10DD90008FBF008C8FBE00888FB700848FB6008045 +:10DDA0008FB5007C8FB400788FB300748FB2007091 +:10DDB0008FB1006C8FB0006803E0000827BD0090B1 +:10DDC0000A000D7A00C020210E00163702802021A3 +:10DDD0001440FFDF3C0C80003C038008346300806B +:10DDE0008C6200340282F82307E000170000000074 +:10DDF0003C1508008EB5310026B100013C01080039 +:10DE0000AC3131000E0014E0024020213C0B8008B0 +:10DE100035700080920A002502402021354200041E +:10DE20000E0014EAA20200250E000C9E02402021E2 +:10DE30000A000DA7240200013C15080126B582D076 +:10DE40000A000D693C1080008C6600300286202399 +:10DE5000188000082409000C3C0808008D083100D7 +:10DE6000327300FC0000B821250700013C010800C6 +:10DE7000AC273100AFA900308C65003000B43823E6 +:10DE800018E000DB02E7502A1540FFDE000000002A +:10DE900012E7002A02E768230287A02131B7FFFFBB +:10DEA000326E000211C00034327F00103C14800832 +:10DEB00036900080920F000831F6004052C000CE2C +:10DEC0008EA20008024020210E0014E02413001846 +:10DED000A2130009921800052419FFFE0240202118 +:10DEE0000319B8240E0014EAA2170005240400390F +:10DEF000000028210E001612240600180A000DA7A3 +:10DF00002402000192B6000C3C0480083483008097 +:10DF10008C6700380016AB0036B10081024020212A +:10DF20003225F0810E000C8D30C600FF3C0C8000C5 +:10DF3000AD8000440A000DA7240200013A6C0001E4 +:10DF4000318B00011560FFAF0287A0210A000DF898 +:10DF5000000000000040F809240400160A000DA784 +:10DF600024020001024020210E0017170200282180 +:10DF70000A000D5C8FBF008C13E0FF743C03800827 +:10DF8000346800808D0400388C66000403C61023BA +:10DF90001C40FF6F3C0C800003C4282304A2000136 +:10DFA0000080F021AFB40010AFB70014AFA7001885 +:10DFB0003C1F800097E301208D0900309506005C2E +:10DFC0008FB900548FAC00303062FFFF30D8FFFFB4 +:10DFD0000047702137EF40000338682B01CF5821EC +:10DFE000018D5025AFAB0020AFA90028AFAA0030AB +:10DFF000AFA90024AFA0002CAFBE003491070008E9 +:10E0000030E400081480008F020020218EA200045A +:10E010000040F80927A400108FA900303128000221 +:10E0200055000001327300FE3C048008348C0080EF +:10E03000918B0008316A0040514000128FA40024E7 +:10E040008C8D000411BE00BE240E00143265000148 +:10E0500010A0000C8FA400242404000C122400D46F +:10E060002A27000D10E000CE2409000E2408000A23 +:10E0700052280001241600088FA200242444000125 +:10E08000AFA400248FA600143C03800834650080F0 +:10E090000086F8218CB10030ACBF003090B9004E42 +:10E0A0008CAE00303418FFFF0338780401CF6821AC +:10E0B000ACAD00348FA600308FAC005430CA0008DD +:10E0C00003CC58211140000CAFAB00588CA40020A9 +:10E0D0008FB000581090009430C600FF92A2000C40 +:10E0E0008FA700340240202100024B003528008019 +:10E0F0000E000C8D3105F0803C0C800835900080BE +:10E100008E0B003001715023194000702659008099 +:10E110003C1808008F183198241FFF80033F782493 +:10E12000332D007F3C0680003C0E8004331100102C +:10E13000ACCF00901220003401AE282190A3006BD8 +:10E14000546000323C10800824070001A0A7006B37 +:10E1500094C4007A2486000AA60600123C0D8008AA +:10E1600035A5008090B10008322C004015800004D5 +:10E170003C038008326E000115C000620000000000 +:10E18000346400808C8F00208FB3005811F3000A94 +:10E19000346301008C7900000299C0231B000077D2 +:10E1A0008FA80058AC880020AC7400002414000133 +:10E1B000AC7E0004AFB4005016C000370000000071 +:10E1C0008FA40050148000300000000012E0000511 +:10E1D000000018218FA900303137000452E0FE9270 +:10E1E00000601021240300010A000D5B0060102173 +:10E1F0000A000DF9000038210040F8092404001736 +:10E200000A000DA7240200013C108008361000808F +:10E2100024090001024020210E0014E0A60900128A +:10E220009208002524050001AFA500503502000129 +:10E23000024020210E0014EAA20200250A000EA9C5 +:10E240003C0D800827A50038AFA800600E000CA880 +:10E25000AFA000381440FF6D8FA800608FA5003874 +:10E2600030B001005200FF6A8EA200048FA3003C70 +:10E270008D070058006720230483FF64AD03005816 +:10E280000A000E558EA200040E000C9E02402021B2 +:10E290000A000EC4000000000E0014E0024020211D +:10E2A0003C05800834A30080024020210E0014EABF +:10E2B000A076000902C03021240400370E00161297 +:10E2C000000028210A000EC28FA400508FA200185F +:10E2D0005840FFA33C0D80080E0014E002402021AE +:10E2E000920A0025240B0001AFAB00503542000418 +:10E2F000024020210E0014EAA20200250A000EA905 +:10E300003C0D80088CB600308EBE00082404001836 +:10E3100026D5000103C0F809ACB500308FB200303B +:10E320000A000D5B324200043C07800094E5011AAC +:10E3300050A0FF6A34C600100A000E8992A2000C99 +:10E34000122E002A2A2F001511E0001E2419001693 +:10E350002418000C5638FF3E326500013C1F80082F +:10E3600093E3001B2410FFBD2416000E0070302420 +:10E37000A3E6001B0A000E65326500018C7F0000D9 +:10E3800017F4FF8D000000008C67000403C73023E2 +:10E3900004C1FF848FA800580A000EBF00000000CF +:10E3A0001629FF368FA200240A000E7024160010D2 +:10E3B0002411000E52D1FF30241600100A000E6FF7 +:10E3C000241600165639FF22326500013C1F8008D2 +:10E3D00093E3001B2410FFBD2416001000703024AE +:10E3E000A3E6001B0A000E65326500010A000E64F8 +:10E3F000241600123C0380008C6201B80440FFFE2A +:10E4000024040800AC6401B803E000080000000028 +:10E4100030A5FFFF30C6FFFF3C0780008CE201B84B +:10E420000440FFFE34E80180AD040000ACE40020AD +:10E430003C048008948300483063FFFF1060001D97 +:10E440003C0B800024AA0012006A482B5120001ABD +:10E45000240A000394F901208F890000240C001A7B +:10E460003338FFFF2707FFFE0067782B39EE0001E6 +:10E4700000096B8201AE5824A10C000B116000470B +:10E480008F830004A50700148F880004350700015E +:10E49000AF87000430CC00405580000F3C0880005E +:10E4A0003C0C800035840180A485000E0A000F9882 +:10E4B0008F8F000C240A00033564018030CC0040AB +:10E4C0008F8900008F870004A08A000B5180FFF520 +:10E4D0003C0C80003C088000950301203C0880082B +:10E4E000951800403079FFFF272EFFFE330FFFFF06 +:10E4F00001CF682B11A0000301C02021950200402C +:10E500003044FFFF3C0B800000A4502335650180A0 +:10E51000A4A4000EA4AA00248F8F000C3C05800048 +:10E5200034AE01802418000230ED8000A5D8000C24 +:10E53000A5C90010ADCF0028A5C6000811A0000E87 +:10E540003C04800094AA01163142FFFC24480004D8 +:10E55000010518218C7940003326FFFF14C0000705 +:10E56000240EBFFF3C0BFFFF35657FFF00E538241D +:10E57000AF8700043C048000240EBFFF348C018070 +:10E5800000EE6824A58D0026AD89002C3C07100004 +:10E59000AC8701B803E00008000000002402FFFE81 +:10E5A000006238240A000F76AF8700043C05800023 +:10E5B00034A400708C8A000090A601128F840000A1 +:10E5C00027BDFFF030C300FF000318823082010036 +:10E5D00000003821104000392466000330874000D5 +:10E5E00050E0003930882000000610800045C82126 +:10E5F0008F2F40002478000400187080AFAF000017 +:10E6000001C568218DAC4000AFAC000494AB01168D +:10E610003169FFFC012540218D054000AFA50008B0 +:10E620008FA9000800003021000028213C070800C5 +:10E6300024E701000A000FE92408000890420000C6 +:10E6400024A500012CAD000C0062C8210019C08077 +:10E65000030778218DEE000011A0000600CE3026C1 +:10E6600003A5102114A8FFF500051A005520FFF49A +:10E67000904200003C048000348700703C05080094 +:10E680008CA531048CE300002CA8002011000009A7 +:10E69000006A3823000558803C0C0800258C31089E +:10E6A000016C482124AA0001AD2700003C010800AC +:10E6B000AC2A3104AF86000C2407000100E01021D1 +:10E6C00003E0000827BD00101100FFFC0000382106 +:10E6D00000066080018558218D6440002469000493 +:10E6E00000093880AFA4000000E518218C664000C6 +:10E6F000AFA000080A000FD9AFA6000427BDFFD8BD +:10E70000AFB20018AFB00010AFBF0024AFB400200C +:10E71000AFB3001CAFB100148F8700003C04800031 +:10E720009483010E30E24000000080211040001070 +:10E730003072FFFF3C06002000E6282410A0000DE8 +:10E7400030EA80008F8800042409BFFF00E93824E4 +:10E7500035031000AF87000030F120001620000BB9 +:10E760003C1400042418FFBF0A001038007810245D +:10E7700030EA8000154000863C0C002030F120007B +:10E780001220FFF88F8300043C14000400F4982446 +:10E790001260FFF52418FFBF3462004030F9010019 +:10E7A0001320000FAF8200043C02002000E2F82496 +:10E7B00013E000053C0B80003C04000400E4182436 +:10E7C000106000CF00000000956A011E9569011CD1 +:10E7D0003146FFFF0009440000C82825AF85000C22 +:10E7E0003C0E800095CD010C8DC44000340CFFFF21 +:10E7F000108C00B031A5FFFF308F010055E0000103 +:10E800002410001030F110005220000836110001D1 +:10E8100030F300201660009F3C18100000F8A02480 +:10E82000168000963C040C003611000130E801000F +:10E830001500000B3C0A00018F88000431094000DC +:10E840001520000800EA30243C0C1F0100EC58247D +:10E850003C0A1000516A00AE30AD02003C0A0001D3 +:10E8600000EA302414C000953C05100000E5202487 +:10E8700000004021108000070000902100079E0248 +:10E880003272000F001278803C0E080125CE828083 +:10E8900001EE40218F940018128000470220802151 +:10E8A00010800091000000003C0980009539010EA5 +:10E8B00091030000022030213338FFFF27050004B8 +:10E8C000106000080000A021241F0003107F013AFF +:10E8D00024040002910C00011184011830EA004068 +:10E8E0000012A1C08F92001C524000013626004049 +:10E8F0003C1380008E6F400031F10100122000CBEC +:10E9000030D1FFFB3C1808008F18002430D20004DF +:10E910003306000414C000CC30B0FFFF56400001A5 +:10E920003631000402802021020028210E000F55FC +:10E93000022030211640000D0000202136650180A4 +:10E940003C0480008C9301B80660FFFE241920006F +:10E9500024140002A4B90008A0B4000BA4A0001065 +:10E960003C051000AC8501B8000020218FBF0024B9 +:10E970008FB400208FB3001C8FB200188FB1001429 +:10E980008FB000100080102103E0000827BD002890 +:10E9900000EC58241160FF7A30F120008F8D0004C4 +:10E9A0003C0FFFFF35EE7FFF00EE382435A38000DB +:10E9B0000A001027AF8700003C0208008C42003894 +:10E9C0003C040800248400381040004B2449FFFF19 +:10E9D0003C038000946C010E318BFFFF110000A0FE +:10E9E000257300043C1008008E1000301200000A4D +:10E9F00030E601008F8A00043143400010600006B9 +:10EA00003C0F0F0000EF70243C0D010001AE402BC5 +:10EA1000110000DF3265FFFF10C000693C140F00D9 +:10EA200000F428243C18020010B800658F99000CEF +:10EA30003270FFFF03299824026490219249000458 +:10EA400025270004000721C00200282136260002E5 +:10EA50000E000F55000000008FBF00248FB400206F +:10EA60008FB3001C8FB200188FB100148FB000104C +:10EA70000000102103E0000827BD00283C020BFF26 +:10EA800000E41824345FFFFF03E3C82B5320FF6723 +:10EA9000361100013C0608008CC6002C361100051A +:10EAA00024D000013C010800AC30002C0A00105DAD +:10EAB00030E801000A0010522410002002402821F2 +:10EAC0003C1208008E5200D824040080264D00011C +:10EAD0003C010800AC2D00D80E000F5524060003A1 +:10EAE0000A0010E88FBF00243C0808012508828036 +:10EAF0000A00107C3C0980000A0010C50000482173 +:10EB00000E000FBC000000000A0010498F870000B3 +:10EB100015A0FF533C0A00012645000430AAFFFF60 +:10EB2000362600023C0380008C7201B80640FFFECE +:10EB30008F85000834690180AD20000010A000AF6F +:10EB40003C048000254F001200AF702B51C000AC78 +:10EB500024030003947801202414001A30F14000AB +:10EB60003313FFFFA134000B122000B62663FFFE13 +:10EB700000A3C82B572000B4241FFFFE3508000156 +:10EB8000A5230014AF8800043C108000240CBFFFB4 +:10EB9000010C4824240B000236080180A50B000C50 +:10EBA000A50A000EA5060008A5090026A507001065 +:10EBB0003C071000AE0701B80A0010E88FBF002420 +:10EBC0003C0308008C6300D02E45000C001221C0CD +:10EBD000386B00012D6200010045F82417E0FF9A10 +:10EBE0003270FFFF264CFFFC2D840004548000503F +:10EBF00000002021386A00022D43000100658024B6 +:10EC00001600004A3270FFFF00076A420012702BA4 +:10EC100001AE40245500006300002021001221C0F5 +:10EC2000020028210A0010E53626000234DF000227 +:10EC30000280202133E6FFFF0E000F5530A5FFFFB5 +:10EC40000A0010AC00002021240401000200282149 +:10EC50000E000F55022030210A001098000000001D +:10EC60008C66400030CF010011E0003D30F801001B +:10EC70003C1208008E5200241300001132340004AC +:10EC80003C1F0F0000FFC8243C0502001325000CA8 +:10EC90008F8C000C022030213265FFFF018958243F +:10ECA00001641021904900043230FFFB2411FFFE63 +:10ECB000252700040E000F55000721C002519024A3 +:10ECC0002404000112440052324300011460005831 +:10ECD00002003021324A0004114000048F8D0000F0 +:10ECE00031A808001500005A3265FFFF1680FF5B4F +:10ECF0008FBF00243C138000366501803C048000F7 +:10ED00008C9001B80600FFFE24062000240F0002AC +:10ED1000A4A60008A0AF000BA4A000103C0E100099 +:10ED2000AC8E01B80A0010E88FBF0024000020213B +:10ED3000020028210A0010E5362600021140FEE9F3 +:10ED40000000A021952E0110950D000231C8FFFF93 +:10ED500051A8FEE40012A1C00A00108B8F92001C83 +:10ED60003C0508008CA5002430B800015300FF3B8F +:10ED70008FBF00243265FFFF3626000200002021ED +:10ED80000E000F55000000000A0010E88FBF00249D +:10ED9000362600020E000F55240400800A0010E8F9 +:10EDA0008FBF0024020028210E000F553226FFFBE2 +:10EDB0000A001159001221C0910300012402000130 +:10EDC0001062FEEA24040001241000021470FEC543 +:10EDD0000000A02130E300401060FEC38F92001CB1 +:10EDE000952B0110950900023167FFFF1127FEE006 +:10EDF0008FBF00240A00108B0000000024030003D2 +:10EE000034820180A043000B0A0011343C108000C2 +:10EE100032140004168000033265FFFF3612000230 +:10EE20003250FFFF020030210A0011B10000202102 +:10EE3000000020210E000F553265FFFF0A001186E9 +:10EE40003210FFFB241FFFFE0A001132011F402475 +:10EE5000020030210E000F55240401000A00118C1D +:10EE60000000000027BDFFC8AFB00010AFBF0034E6 +:10EE70003C10600CAFBE0030AFB7002CAFB600281E +:10EE8000AFB50024AFB40020AFB3001CAFB2001880 +:10EE9000AFB100148E0C5000240DFF7F3C058000A4 +:10EEA000018D5824356A380C24090003AE0A50003D +:10EEB000ACA900083C010800AC2000200E0017435C +:10EEC000000000003C0560168CA700003C08FFFF16 +:10EED0003C06001034C3805100E820243C02535308 +:10EEE000AE03537C1082026134A37C008C74007CDE +:10EEF0008C7500783C116000362420203C05080108 +:10EF000024A581142406000A3C1180003C13000251 +:10EF10003C12600CAF950010AF9400140E0015EC7D +:10EF2000363E0180AE5353FC8E3000003216000393 +:10EF300012C0FFFD3217000116E000583206000231 +:10EF400010C0FFF93C0480008C8F01402410004069 +:10EF5000AC8F00208C9201480012760231C3007001 +:10EF60001070013D2C67004150E00008240400604F +:10EF7000241500201075000E3C0340003C07800063 +:10EF8000ACE301780A00121B000000001464FFFBD0 +:10EF90003C0340000E001F5D000000003C034000E9 +:10EFA0003C078000ACE301780A00121B000000005F +:10EFB0008C830148241400043487018000034C0230 +:10EFC000312500FF8C83014010B4017124BFFFFA8A +:10EFD0002FF90006532000123C0580008C86014466 +:10EFE000241600FF30A500FF30CB00FF30CA00FF21 +:10EFF000115601BC256800042402000910A201AAD0 +:10F0000028AC000A118001962413000A240D000880 +:10F0100010AD00148F850018000819C03C05800051 +:10F020008CA801B80500FFFE24170002ACE3000025 +:10F03000A4E90008A0F7000B8CB401483C091000BB +:10F040003C034000A4F400108CA40144ACE4002470 +:10F050003C078000ACA901B8ACE301780A00121BA0 +:10F060000000000000067A020008A8803C040801A5 +:10F070002484828024AE000102A4902131E500FFA7 +:10F0800024100001A24F000014B0FFE3AF8E00185F +:10F09000000819C00A001258AF85001C8E340128E0 +:10F0A0003C028008AE3400208E2401048E2301002F +:10F0B000945F0048AF840000AF83000433F9FFFF82 +:10F0C0000E000F4EAF9900083C1808008F1800C0C2 +:10F0D000130000248F8700003C0708008CE700C461 +:10F0E00024E600013C010800AC2600C43C0380007B +:10F0F0008C6401243C076020ACE400140000000094 +:10F100003C0680003C154000ACD5013800000000F2 +:10F110005280FF8B32060002268C0140268D008033 +:10F120002409FF800189282401A99824001359404B +:10F1300031A2007F0005B140318A007F3C1F2000D2 +:10F1400037E800020162C02502CAC8250328A025AD +:10F150000308B825ACD70830ACD408300A00122117 +:10F16000320600023C05001000E54024150000A610 +:10F170008F8300043C0C08008D8C00203C0D800027 +:10F1800095AA010E258B000130E940003C010800E2 +:10F19000AC2B00203155FFFF112000B6000090215C +:10F1A0003C0F002000EF702411C000B330F7800046 +:10F1B0008F9300042416BFFF00F638243663100036 +:10F1C000AF87000030E22000104000B62405FFBFEA +:10F1D0003C08000400E8302410C000020065102440 +:10F1E0003462004030E901001120000EAF820004BB +:10F1F0003C0B002000EB5024114000043C0D0004A7 +:10F2000000ED602411800139000000009637011ED6 +:10F210009636011C32EFFFFF00169C0001F37025AB +:10F22000AF8E000C9639010C8E2440003418FFFF7D +:10F23000109800CA3325FFFF309F010057E00001FE +:10F240002412001030E31000106000133653000148 +:10F2500030E400201480000A3C06100000E6102470 +:10F260001040000D3C0C0C003C0B0BFF00EC50243C +:10F270003569FFFF012A402B1100000830EE010024 +:10F280003C0D08008DAD002C3653000525B2000161 +:10F290003C010800AC32002C30EE010015C0000B20 +:10F2A0003C0600018F880004310F400055E0000843 +:10F2B00000E628243C181F0100F8B8243C16100072 +:10F2C00052F6010E30B902003C06000100E6282487 +:10F2D00014A000A43C1F100000FF202400004021C7 +:10F2E000108000070000A82100075E023175000FA2 +:10F2F000001550803C0208012442828001424021D6 +:10F300008F8C001811800069026090211480000326 +:10F310003C0980003C080801250882809532010ED6 +:10F3200091030000026030213244FFFF2485000475 +:10F33000106000080000B821240D0003106D0122A8 +:10F34000241600029117000112F6002630F8004042 +:10F350000015B9C08F82001C504000013666004085 +:10F360003C1680008ECA400031530100126000C775 +:10F3700030D500043C0B08008D6B002430D3FFFB1C +:10F380003166000414C0010A30B2FFFF56A000012C +:10F390003673000402E02021024028210E000F55A0 +:10F3A0000260302116A0000D0000202136C501802A +:10F3B0003C0480008C8C01B80580FFFE240D2000E9 +:10F3C00024120002A4AD0008A0B2000BA4A00010FB +:10F3D0003C051000AC8501B8000020210A00135F35 +:10F3E000008010211300FFDB0000B821953F0110C1 +:10F3F0009519000233E8FFFF5328FFD60015B9C066 +:10F400000A0013278F82001C2413BFFF0073682497 +:10F4100011A00007240E87FF006E48241520000A63 +:10F420003C0F006000EF9024124000070000000035 +:10F430000E000D34000000001040FF323C0680003A +:10F440000A00128D3C0380000E0014C90000000069 +:10F450000A00135F000000000E0014EF000000001F +:10F460003C0340003C078000ACE301780A00121B1B +:10F470000000000030F7800012E0FF528F8300048C +:10F480003C19002000F9C0241300FF4E8F9F000498 +:10F490003C04FFFF34837FFF00E338240A0012C1DD +:10F4A00037E380000A0012CA006510243C040800FB +:10F4B0008C840038148000022489FFFF000048215A +:10F4C0003C038000946F010E31EEFFFF110000EB52 +:10F4D00025D600043C0308008C6300301060000A4D +:10F4E00030EA01008F9800043317400012E0000654 +:10F4F0003C020F0000E2F8243C190100033F402BBE +:10F50000110000D532C5FFFF114000303C0C0F0048 +:10F5100000EC58243C0602001166002C000000009C +:10F520008F95000C3C0D080025AD003832D2FFFF4E +:10F5300002A9282400ADB02192C7000424E90004E8 +:10F54000000921C002402821366600020E000F5536 +:10F55000000000000A00135F000010210A0012E200 +:10F56000241200203C1908008F3900D802A028215D +:10F5700024040080273800013C010800AC3800D882 +:10F580000E000F55240600030A00135F000010212F +:10F590008C84014000E028213C0380008C7701B876 +:10F5A00006E0FFFE2408001CACA40000A0A8000B8D +:10F5B0003C181000AC7801B83C0340003C078000C8 +:10F5C000ACE301780A00121B000000003C030800B5 +:10F5D0008C6300D02EA5000C001521C0386F0001EF +:10F5E0002DF200010245702415C0FFD632D2FFFF74 +:10F5F00026B7FFFC2EE40004148000080000202140 +:10F60000386800022D180001030518241060000658 +:10F610000007FA4232D2FFFF0000202102402821D9 +:10F620000A0013A4366600020015102B03E2C8245A +:10F630001720000532D2FFFF001521C0024028210B +:10F640000A0013A43666000200002021024028218F +:10F650000E000F553266FFFB0A0013E0001521C0B3 +:10F6600010B3006A000860802406000B14A6FE6B2D +:10F67000000819C0000828803C15080126B58280C2 +:10F6800000B530210A001258A0C0000134D5000294 +:10F6900002E0202130A5FFFF0E000F5532A6FFFF2C +:10F6A0000A001348000020210008B8803C0308012C +:10F6B0002463828002E31021905400001280FE57E0 +:10F6C000000819C0A04000008F9900182738FFFFDC +:10F6D0001700FE52AF980018000819C00A0012580F +:10F6E000AF80001C0A00124F240800030E000FBC5C +:10F6F000000000000A0012DA8F8700001720FEF3D6 +:10F700003C06000126BF000433E5FFFF3666000219 +:10F710003C0380008C7501B806A0FFFE8F890008AD +:10F720003C04800034930180AE60000011200099F9 +:10F73000240F000324AA0012012A102B1040009568 +:10F7400000000000946D01203C1280002403001A88 +:10F7500031ACFFFF364A018030EB4000A143000B83 +:10F760001160008F2583FFFE0123702B15C0008DD3 +:10F770002409FFFE35080001A5430014AF880004EA +:10F780002417BFFF0117B02424080002A7C8000CEB +:10F79000A7C5000EA7C60008A7D60026A7C7001059 +:10F7A0003C071000AE2701B80A00135F00001021CB +:10F7B00024040100024028210E000F550260302170 +:10F7C0000A00133400000000910300012415000119 +:10F7D0001075FF0224040001240E0002146EFEDDE9 +:10F7E0000000B82130E300401060FEDB8F82001C77 +:10F7F00095270110950F000230E9FFFF11E9FF0E78 +:10F80000008010210A0013278F82001C3C0F080182 +:10F8100025EF8280018F702100069202A1D20001A3 +:10F820003C1F60008FED1820241000010110980487 +:10F830003C0208012442828201B3B025018250219A +:10F8400000065C02000819C0A54B0000AFF61820A6 +:10F850000A0012593C058000366600020E000F5562 +:10F86000240400800A00135F000010218CAE000405 +:10F870003C0F60000A00120C01CF18218C6640007A +:10F8800030CA01001140003730EB01003C15080080 +:10F890008EB5002411600013327700043C0D0F0078 +:10F8A00000ED28243C0C020010AC000E8F84000CEC +:10F8B0003C0F080025EF00380260302100899024B9 +:10F8C000024F702191C7000432C5FFFF3272FFFB67 +:10F8D00024E90004000921C00E000F552413FFFE87 +:10F8E00002B3A8242403000112A3003032B800019F +:10F8F0001300000732A8000402403021000020213C +:10F900000E000F5532C5FFFF3252FFFB32A8000434 +:10F91000110000048F9F000033F908005720002BCE +:10F9200032C5FFFF16E0FEC4000010213C16800027 +:10F9300036C401803C0580008CA201B80440FFFE63 +:10F94000240B200024060002A48B0008A086000BD4 +:10F95000A48000103C0A1000ACAA01B80A00135F92 +:10F96000000010213C0508008CA5002430AC0001EB +:10F970005180FEB10000102132C5FFFF3666000243 +:10F98000000020210E000F55000000000A00135F48 +:10F9900000001021A3CF000B0A0014322417BFFF70 +:10F9A0002409FFFE0A0014300109402432550004E6 +:10F9B00016A0000332C5FFFF3657000232F2FFFFE8 +:10F9C000024030210A0014B2000020210240302100 +:10F9D0000E000F55240401000A00149A00000000D4 +:10F9E0003C0380008C6401003082003E144000081B +:10F9F00000000000AC6000488C66010030C507C004 +:10FA000010A0000500000000AC60004CAC6000508D +:10FA100003E0000824020001AC600054AC60004028 +:10FA20008C6801003107380010E0FFF90000000089 +:10FA30002402000103E00008AC6000443C03900095 +:10FA400034620001008220253C038000AC64002069 +:10FA50008C65002004A0FFFE0000000003E0000809 +:10FA6000000000003C028000344300010083202598 +:10FA700003E00008AC44002027BDFFD8AFB100145C +:10FA80003C048000AFBF0020AFB3001CAFB2001831 +:10FA9000AFB000108C9201408C9001482402000EFF +:10FAA00000108C02322300FF106200590204282447 +:10FAB0002866000F10C00013286A003724070006CC +:10FAC0001067008E286800075100002D24040009EB +:10FAD000106000783C06800024090001106900B025 +:10FAE000000000000000000D8FBF00208FB3001C3D +:10FAF0008FB200188FB100148FB0001003E000081F +:10FB000027BD002811400059240D0038286B00350E +:10FB1000116000053C058000240C001F146CFFF1EF +:10FB2000000000003C0580008CB801B80700FFFE13 +:10FB300034B90180AF320000241F000124120002FA +:10FB40003C021000AF200004A7310008A33F000AC8 +:10FB5000A332000BA7300010AF200024AF200028F4 +:10FB6000ACA201B88FBF00208FB3001C8FB2001869 +:10FB70008FB100148FB0001003E0000827BD0028EB +:10FB8000106400232405000B1465FFD63218FFFF14 +:10FB9000170000203C0580008F93FEEC927F00054B +:10FBA00033F900041720FFCF000000000E0014E01E +:10FBB00002402021926900050240202135280004DE +:10FBC0000E0014EAA26800059267000530E2000406 +:10FBD00014400002000000000000000D926B0000C5 +:10FBE00024060020316A00FF1546000A3C0580000B +:10FBF0008CA401B80480FFFE34AD0180240E000502 +:10FC00003C0C1000ADB20000A1AE000BACAC01B8D2 +:10FC10003C0580008CA301B80460FFFE34AF018076 +:10FC200024130002ADF20000ADF20004A5F10008BB +:10FC3000A1F3000AA1F3000BA5F00010ADE0002431 +:10FC40008CB101443C101000ADF10028ACB001B8FB +:10FC50008FBF00208FB3001C8FB200188FB100142B +:10FC60008FB0001003E0000827BD0028106DFFAD25 +:10FC7000240E0080146EFF9B000000003C058000F5 +:10FC80008CA301B80460FFFE34AF0180241200028F +:10FC9000A1F2000BA5F10008A5F000108CB30144FF +:10FCA0003C021000A5F30012ACA201B80A00152B0B +:10FCB0008FBF00208CC301B80460FFFE34D30180E5 +:10FCC000AE720000AE60000424120001A6710008AC +:10FCD00024110002A272000AA271000BA67000108B +:10FCE0008CD001443C0F1000AE700024AE600028A0 +:10FCF000ACCF01B80A0015668FBF00203C0380001E +:10FD00008C6601B804C0FFFE346201803C06080125 +:10FD100090C682C0AC52000010C000030000382121 +:10FD20003C0708018CE782C83C05800034AA0180AA +:10FD30002404000234CC0001AC470004A5510008A3 +:10FD4000A14C000AA144000BA55000108CAB01444B +:10FD50000000202101402821AD4B002410C00003E9 +:10FD60008FBF00203C0408018C8482C48FB3001C28 +:10FD70008FB200188FB100148FB000103C0E10002D +:10FD80003C0D800027BD0028ACA40028ADAE01B812 +:10FD90003C010801A02082C003E000080000000030 +:10FDA00010A0000B3C0680008C980144241900022E +:10FDB0003C010801A03982C03C010801AC3282C874 +:10FDC0003C010801AC3882C40A0015668FBF0020D0 +:10FDD0008CDF01B807E0FFFE34C701802409000270 +:10FDE000ACF20000ACF20004A4F10008A0E9000AA3 +:10FDF000A0E9000BA4F00010ACE000248CC8014482 +:10FE00003C021000ACE80028ACC201B80A0015663C +:10FE10008FBF002027BDFFE8AFBF00100E000F4EC0 +:10FE2000000000003C0280008FBF00100000202175 +:10FE3000AC4001800A00101027BD00183084FFFF7D +:10FE400030A5FFFF1080000700001821308200015C +:10FE50001040000200042042006518211480FFFBBE +:10FE60000005284003E000080060102110C00007D2 +:10FE7000000000008CA2000024C6FFFF24A500049F +:10FE8000AC82000014C0FFFB2484000403E00008DF +:10FE90000000000010A0000824A3FFFFAC860000B3 +:10FEA00000000000000000002402FFFF2463FFFFA9 +:10FEB0001462FFFA2484000403E00008000000003C +:10FEC00027BDFFE8AFBF0014AFB000100E0014E074 +:10FED000008080213C0480083483008090650025E8 +:10FEE0000200202134A200200E0014EAA0620025A6 +:10FEF000020020218FBF00148FB000100A000C9E5A +:10FF000027BD00183C03800027BDFFF83462018044 +:10FF1000AFA20000308C00FF30AD00FF30CE00FFFC +:10FF20003C0B80008D6401B80480FFFE00000000DF +:10FF30008FA900008D6801288FAA00008FA70000FC +:10FF40008FA400002405000124020002A085000AFD +:10FF50008FA30000359940003C051000A062000B03 +:10FF60008FB800008FAC00008FA600008FAF00009C +:10FF700027BD0008AD280000AD400004AD8000247E +:10FF8000ACC00028A4F90008A70D0010A5EE0012CF +:10FF900003E00008AD6501B83C06800827BDFFE816 +:10FFA00034C50080AFBF001090A7000924020012E2 +:10FFB00030E300FF1062000B008030218CA800505D +:10FFC00000882023048000088FBF00108CAA003412 +:10FFD000240400390000282100CA48230520000518 +:10FFE000240600128FBF00102402000103E0000865 +:10FFF00027BD00180E001612000000008FBF001071 +:020000040001F9 +:100000002402000103E0000827BD001827BDFFC837 +:10001000AFB1002C00A08821AFB2003027A500109E +:100020000080902102202021AFBF0034AFB0002813 +:100030000E000CA8AFA000101440009B3C078008E5 +:1000400034E400809086000830C5000814A00069E0 +:100050008FA700103C18800837100080920F00080E +:1000600031EE000815C00002240800030000402102 +:100070003C0B800891650011916A00123566008082 +:100080008CDF0054314900FF0128202130A300FFFC +:10009000000410800062282100BFC82B1320000834 +:1000A0000000000094D0005C8CCF0054320DFFFFA4 +:1000B00001E5702301AE602B118000940000000068 +:1000C00094D9005C3323FFFF30FF000413E0007479 +:1000D000000830808FA8001C0068102B5040004F93 +:1000E00030E30004006610232C46008010C000029C +:1000F00000408021241000800E0014E002402021E6 +:100100003C0380083466008024070001ACC7000C63 +:1001100090C800080010684034670100311F007F5C +:10012000A0DF00088E39000427380001ACD8003069 +:10013000A4D0005C8CCF003C9630000E01F0702102 +:10014000ACCE00208CCC003C018D5821ACCB001CE7 +:100150008E2A0004ACEA00008E290008ACE90004F5 +:100160008FA5001030A400085480003293A6002010 +:10017000A0C0004E90C9004E2402FFDF3C1880084A +:10018000A0E9000890C50008370D0080240A00503F +:1001900000A22024A0C400088E390008ADB90038A0 +:1001A0008F0F00148DB0003001F07021ADAE00341F +:1001B00091AC0000318B00FF116A002C2645010034 +:1001C0000E0014EA024020212404003800002821F7 +:1001D0000E0016122406000A8FBF00348FB20030C2 +:1001E0008FB1002C8FB000282402000103E000082A +:1001F00027BD003830E801001100003D8FA3001436 +:100200008C8A0058006A48230520FF933C18800818 +:10021000AC8300580A0016668FA700102407021846 +:100220001060FFB100E610238FA2001C0A00168B9D +:10023000004610233C188008370D0080A0E6000817 +:100240008E390008240A0050ADB900388F0F001411 +:100250008DB0003001F07021ADAE003491AC0000E3 +:10026000318B00FF156AFFD6264501002406FF806A +:1002700000A610243C098000AD2200288E2700082B +:1002800030A3007F3C04800C0064F821AFE700D06D +:100290008E280008AF9F00280A0016C1AFE800D4DE +:1002A0000A0016882C6202188E2300083C0480087D +:1002B00034820080AC430054024020210E0016011D +:1002C000AC400030240400382405008D0E001612C6 +:1002D000240600128FBF00348FB200308FB1002C83 +:1002E0008FB000282402000103E0000827BD003879 +:1002F000AC800058908C0008240DFFF7018D582425 +:10030000A08B00080A0016668FA700108CD8005436 +:100310000A0016830305182327BDFFE8AFBF0010AE +:1003200090A6000D30C7001010E0000C00804021A6 +:100330003C0280088C4400048CA300081064000870 +:1003400030C9000430C5000410A0001C8FBF00108D +:100350002402000103E0000827BD001830C9000492 +:100360001120001030CB001210E0FFF98FBF0010F9 +:100370003C0880088CA700088D06000414E6FFF5F1 +:1003800024020001240400382405008D0E001612FA +:10039000240600128FBF00102402000103E00008B1 +:1003A00027BD0018240A0012156AFFE98FBF00104C +:1003B000010020210A00165427BD0018000020214A +:1003C0000A000D1A27BD00183C05080024A55D5041 +:1003D0003C04080024847B103C02080024425D5841 +:1003E000240300063C010801AC2582D03C01080131 +:1003F000AC2482D43C010801AC2282D83C01080123 +:10040000A02382DC03E000080000000003E00008F5 +:10041000240200013C028000308800FF3447018044 +:100420003C0680008CC301B80460FFFE00000000A1 +:100430008CC501282418FF803C0D800A24AF0100E0 +:1004400001F8702431EC007FACCE0024018D202116 +:10045000ACE50000948B00DA350960002408000246 +:10046000316AFFFFACEA000424020001A4E900089D +:10047000A0E8000BACE000243C071000ACC701B8BA +:10048000AF84002803E00008AF8500588C99000471 +:100490008F8D00282409FFBF0325C023AC980004DA +:1004A00091AF00C42403FFEF31EE007FA1AE00C482 +:1004B0008C8C0020938B00348F860028358A0002B4 +:1004C000AF8B004CA7800048AC8A0020A4C000ACD1 +:1004D00090C800C401093824A0C700C48F84002834 +:1004E000AC8000DC908500C400A3102403E0000869 +:1004F000A08200C43C028000344501803C0480009E +:100500008C8301B80460FFFE8F8900582407608344 +:1005100024060002ACA900008C880124ACA80004C9 +:10052000A4A70008A0A6000B3C05100003E00008EB +:10053000AC8501B8938800348F89004C8F820028E5 +:1005400030C600FF0109382330E900FF01221821DD +:1005500030A500FF2468007810C000020124382173 +:100560000080382130E400031480000330AA000327 +:100570001140000D312B000310A0000900001021D4 +:1005800090ED0000244E000131C200FF0045602BB9 +:10059000A10D000024E700011580FFF925080001E6 +:1005A00003E00008000000001560FFF300000000F9 +:1005B00010A0FFFB000010218CF80000245900045B +:1005C000332200FF0045782BAD18000024E700041B +:1005D00015E0FFF92508000403E000080000000012 +:1005E00093850034938800448F87004C00043200C8 +:1005F0003103007F00E5102B30C47F001040000F56 +:10060000006428258F8400283C0980008C8A00DC47 +:10061000AD2A00A43C03800000A35825AC6B00A0C9 +:100620008C6C00A00580FFFE000000008C6D00AC0B +:10063000AC8D00DC03E000088C6200A80A0017D62D +:100640008F840028938800453C0280000080502160 +:10065000310300FEA383004530ABFFFF30CC00FF29 +:1006600030E7FFFF344801803C0980008D2401B849 +:100670000480FFFE8F8D005824180016AD0D000079 +:100680008D2201248F8D0028AD0200048D59002099 +:10069000A5070008240201B4A119000AA118000B43 +:1006A000952F01208D4E00088D4700049783004848 +:1006B0008D59002401CF302100C7282100A3202319 +:1006C0002418FFFFA504000CA50B000EA5020010C6 +:1006D000A50C0012AD190018AD18002495AF00D874 +:1006E0003C0B10002407FFF731EEFFFFAD0E002892 +:1006F0008DAC0074AD0C002CAD2B01B88D460020E4 +:1007000000C7282403E00008AD4500208F8800289A +:100710000080582130E7FFFF910900C63C028000AD +:1007200030A5FFFF312400FF00041A0000675025A8 +:1007300030C600FF344701803C0980008D2C01B891 +:100740000580FFFE8F820058240F0017ACE20000E6 +:100750008D390124ACF900048D780020A4EA00084A +:10076000241901B4A0F8000AA0EF000B9523012082 +:100770008D6E00088D6D00049784004801C35021E0 +:10078000014D602101841023A4E2000CA4E5000EB9 +:10079000A4F90010A4E60012ACE000148D78002447 +:1007A000240DFFFFACF800188D0F006CACEF001C9F +:1007B0008D0E00683C0F1000ACEE0020ACED002464 +:1007C000950A00AE240DFFF73146FFFFACE6002886 +:1007D000950C00709504007231837FFF0003CA00FE +:1007E0003082FFFF0322C021ACF8002CAD2F01B8EE +:1007F000950E00728D6A002000AE3021014D282434 +:10080000A506007203E00008AD6500203C028000F0 +:10081000344601803C0580008CA301B80460FFFED3 +:1008200024090018ACC40000A0C9000B8F88002860 +:100830003C041000950700AEA4C70010ACC0003007 +:1008400003E00008ACA401B83C02800034450180FC +:100850003C0480008C8301B80460FFFE8F8A003066 +:10086000240600199549001C3128FFFF000839C0F3 +:10087000ACA70000A0A6000B3C05100003E0000898 +:10088000AC8501B88F8700380080402130C400FF5C +:100890003C0680008CC201B80440FFFE8F890058DE +:1008A0009383005434996000ACA90000A0A3000514 +:1008B0008CE20010240F00022403FFF7A4A200061C +:1008C000A4B900088D180020A0B8000AA0AF000B42 +:1008D0008CEE0000ACAE00108CED0004ACAD00144A +:1008E0008CEC001CACAC00248CEB0020ACAB0028E2 +:1008F0008CEA002C3C071000ACAA002C8D090024C7 +:10090000ACA90018ACC701B88D05002000A32024B5 +:1009100003E00008AD040020938500542403000187 +:1009200027BDFFE800A330042CA20020AFB00010C8 +:10093000AFBF001400C01821104000132410FFFEA8 +:100940003C0708008CE7319000E610243C0880004A +:100950003505018014400005240600848F89002895 +:10096000240A00042410FFFFA12A00EC0E001872D4 +:1009700000000000020010218FBF00148FB0001093 +:1009800003E0000827BD00183C0608008CC631941F +:100990000A0018A400C310248F87003027BDFFE091 +:1009A000AFB20018AFB10014AFB00010AFBF001C61 +:1009B00030D000FF90E6000D00A08821008090213B +:1009C00030C5007FA0E5000D8F8500288E2300181C +:1009D0008CA200C01062002E240A000E0E00189790 +:1009E000A38A00542409FFFF104900222404FFFFBA +:1009F00052000020000020218E2600003C0C001038 +:100A000000CC5824156000393C0E000800CE682444 +:100A100055A0003F024020213C18000200D880244D +:100A20001200001F3C0A00048F8700308CE2001483 +:100A30008CE300108CE500140043F82303E5C82B79 +:100A400013200005024020218E24002C8CF1001080 +:100A5000109100310240202124020012A382005490 +:100A60000E0018972412FFFF105200022404FFFF0B +:100A7000000020218FBF001C8FB200188FB100141E +:100A80008FB000100080102103E0000827BD002077 +:100A900090A800C4350400200A0018CDA0A400C40A +:100AA00000CA48241520000B8F8B00308F8D00303A +:100AB0008DAC00101580000B024020218E2E002CE2 +:100AC00051C0FFEC00002021024020210A0018E85C +:100AD000240200178D66001050C0FFE600002021A0 +:100AE000024020210A0018E82402001102402021BF +:100AF000240200150E001897A3820054240FFFFF54 +:100B0000104FFFDC2404FFFF0A0018D78E260000D8 +:100B10000A00190E240200143C08000400C83824FE +:100B200050E0FFD400002021024020210A0018E8F4 +:100B3000240200138F86002827BDFFE0AFB1001408 +:100B4000AFBF0018AFB0001090C300C430A500FFC5 +:100B50003062002010400008008088218CCB00C04B +:100B60002409FFDF256A0001ACCA00C090C800C498 +:100B700001093824A0C700C414A000403C0C800028 +:100B80008F840028908700C42418FFBF2406FFEF3D +:100B900030E3007FA08300C4979F00488F82004C01 +:100BA0008F8D002803E2C823A7990048A5A000ACB8 +:100BB00091AF00C401F87024A1AE00C48F8C00284E +:100BC000A18000C78F8A0028A5400072AD4000DCDC +:100BD000914500C400A65824A14B00C48F90002466 +:100BE0008F84004C978600480204282110C0000F13 +:100BF000AF850024A38000443C0780008E2C0008B1 +:100C000094ED01208E2B0004018D5021014B802199 +:100C1000020620233086FFFF30C8000F390900018B +:100C20003131000116200009A38800449386003466 +:100C30008FBF00188FB100148FB0001027BD0020A7 +:100C4000AF85005003E00008AF86004C00C8702359 +:100C50008FBF0018938600348FB100148FB000103E +:100C600034EF0C00010F282127BD0020ACEE0084DA +:100C7000AF85005003E00008AF86004C359001803E +:100C8000020028210E001872240600828F8400289A +:100C9000908600C430C5004050A0FFBAA380005425 +:100CA0008F8500383C0680008CCD01B805A0FFFE82 +:100CB0008F8900582408608224070002AE090000D2 +:100CC000A6080008A207000B8CA300083C0E100029 +:100CD000AE0300108CA2000CAE0200148CBF0014F6 +:100CE000AE1F00188CB90018AE1900248CB800246F +:100CF000AE1800288CAF0028AE0F002CACCE01B887 +:100D00000A001932A38000548F8A002827BDFFE013 +:100D1000AFB10014AFB000108F88004CAFBF001807 +:100D20009389002C954200AC30D100FF0109182BAB +:100D30000080802130AC00FF3047FFFF00005821C9 +:100D400014600003310600FF0120302101095823FF +:100D5000978300480068202B1480001B00000000CF +:100D600010680043240A0001118A004834E7088013 +:100D70003165FFFF0E001814020020210E001854E8 +:100D80008F8400588F840028948D007025AC00015A +:100D9000A48C0070948B00703C0608008CC63188CF +:100DA00031677FFF10E6004F0000000002002021A5 +:100DB000022028218FBF00188FB100148FB00010BF +:100DC0000A00191E27BD0020914400C42406FF809C +:100DD00000868825A15100C4978400483088FFFF11 +:100DE0001100001C9389002C8F8E00282419EFFF1E +:100DF000008BF82395D800AC0168682B33E900FF1D +:100E000003197824A5CF00AC51A0002A0100582175 +:100E10008E0500202408FFFB2403000100A81024F5 +:100E2000AE0200201183002534E78000020020215B +:100E30003165FFFF0E00181401203021978B004808 +:100E40008F87004CA780004800EB8023AF90004CB8 +:100E50009389002C8F8C00288FBF00188FB100144D +:100E60008FB0001027BD002003E00008A18900C753 +:100E70008E0800202409FFFB34E7800001092824A4 +:100E8000AE050020158AFFBA34E708800200202151 +:100E90000E0017E23165FFFF020020210220282109 +:100EA0008FBF00188FB100148FB000100A00191EF8 +:100EB00027BD00200A0019D500004821020020218A +:100EC0003165FFFF0E0017E201203021978B0048AB +:100ED0008F87004CA780004800EB80230A0019E5AB +:100EE000AF90004C94890070240A8000012A4024AD +:100EF000A4880070908500709099007030A200FF67 +:100F0000000219C20003F827001FC1C0332F007F61 +:100F100001F87025A08E00700A0019BD0200202182 +:100F20008F88002824030001910A0078910500C7EA +:100F3000250900783147003F24E6FFE000C318048C +:100F40002CC2002030670019A385002C1040001A25 +:100F5000AF8900383C0A8000354B000224050001AF +:100F60002406000114E00016006B10240000282164 +:100F70001440000F306300201060000F24050001B2 +:100F80008D0600748D1900742403FF8000C31024A3 +:100F9000000279403338007F01F868253C0E1000CC +:100FA00001AE6025AD4C08309128000131060001EA +:100FB0000A0019930000000003E000080000000090 +:100FC0008D0F00748D0D00742418FF8001F87024BB +:100FD000000E414031AC007F010C50253C0B10004D +:100FE000014B38253C0980000A001993AD270830D1 +:100FF00027BDFFD8AFB000108F900038AFB40020ED +:10100000AFB10014AFBF0024AFB3001CAFB20018E3 +:101010008E0500103C0208008C4231B08F86003CE7 +:1010200030A73FFF00E2182B8CD2001400808821EB +:101030008CD30020106000070000A02190CB000D91 +:10104000240AFF80014B4824312800FF1500000CC2 +:1010500000056382022020212411000DA391005479 +:101060008FBF00248FB400208FB3001C8FB20018F4 +:101070008FB100148FB000100A00189727BD002808 +:101080003185000354A0FFF40220202194CF001CDE +:101090008F8E00288E070028A5CF00D88CCD001099 +:1010A000024D302310E6005C2402001F0E0018974A +:1010B000A3820054241FFFFF105F004E2404FFFF93 +:1010C0008F8300408F880030026398218D090010C3 +:1010D000012310238F830020AD020010AD130020E8 +:1010E0008C67007400F3202B148000620220202102 +:1010F0008F86003C8E0C00248CC5002411850007CF +:1011000002202021240E001C0E001897A38E0054EC +:10111000240DFFFF104D00372404FFFF8F840030A3 +:101120008C980024270F0001AC8F00241272004419 +:101130008F9900208F320074125300413C0A0080C6 +:101140008E090000012A10241440003A000000001B +:101150008E0400142412FFFF10920006240B001BC3 +:10116000022020210E001897A38B0054105200215A +:101170002404FFFF8E0300003C0C0001006C2824B7 +:1011800010A000133C0600800066A0241680000911 +:101190000200282102202021240E001A0E00189798 +:1011A000A38E0054240DFFFF104D00122404FFFFF6 +:1011B00002002821022020210E0018B72406000179 +:1011C0002410FFFF2404FFFF1050000A2414000124 +:1011D0008F8F0030022020210280302195F20034D0 +:1011E00024050001265800010E001993A5F80034CB +:1011F000000020218FBF00248FB400208FB3001C7B +:101200008FB200188FB100148FB000100080102131 +:1012100003E0000827BD00288F83004000E3C821B9 +:101220000259C02B1300FFA88F8800300A001A7CD7 +:1012300024020018AC8000200A001AA68E040014B4 +:101240008E1F00003C07008003E798241660FFF91A +:101250002408001A022020210E001897A3880054A9 +:101260002403FFFF1443FFBA2404FFFF0A001ACF30 +:101270008FBF0024240B001D0E001897A38B005471 +:10128000240AFFFF144AFF9A2404FFFF0A001ACF22 +:101290008FBF00248F85002827BDFFD8AFB3001C67 +:1012A000AFB20018AFB10014AFB00010AFBF002054 +:1012B00090A700C48F9000382412FFFF34E2004052 +:1012C00092060000A0A200C48E03001000809821A6 +:1012D0001072000630D1003F2408000D0E00189750 +:1012E000A3880054105200262406FFFF8F8A00288E +:1012F0008E0900188D4400C011240007240C000E34 +:10130000026020210E001897A38C0054240BFFFFCD +:10131000104B001B2406FFFF2404002012240004AD +:101320008F8D002891AF00C435EE0020A1AE00C41F +:101330008F85004010A0001A000000001224004B0E +:101340008F9800288F92FEEC2406FFFD9710007006 +:101350009651000A1230000B8FBF00203C1F08007E +:101360008FFF318C03E5C82B1720001E026020215F +:10137000000028210E0019932406000100003021EE +:101380008FBF00208FB3001C8FB200188FB10014E4 +:101390008FB0001000C0102103E0000827BD002816 +:1013A0005224002A8E0300148F8400289489007030 +:1013B00025280001A4880070948700703C0508006F +:1013C0008CA5318830E27FFF1045000E0000000040 +:1013D000026020210E00191E240500010A001B31A5 +:1013E000000030212402002DA38200540E00189723 +:1013F0002413FFFF1453FFE12406FFFF0A001B32F2 +:101400008FBF0020949800702419800024050001EB +:1014100003199024A492007090910070908D007038 +:10142000323000FF001079C2000F7027000E61C03B +:1014300031AB007F016C5025A08A00700E00191E90 +:10144000026020210A001B31000030212406FFFF2A +:101450001466FFD68F840028026020210E00191E1A +:10146000240500010A001B31000030210260202108 +:101470000A001B4B2402000A8F88002827BDFFE8C2 +:10148000AFB00010AFBF0014910A00C48F870038BE +:1014900000808021354900408CE60010A10900C47D +:1014A0003C0208008C4231B030C53FFF00A2182B2F +:1014B000106000078F85003C240DFF8090AE000D6A +:1014C00001AE6024318B00FF156000080006C38266 +:1014D000020020212403000D8FBF00148FB00010E4 +:1014E00027BD00180A001897A38300543306000391 +:1014F000240F000254CFFFF70200202194A2001C09 +:101500008F85002824190023A4A200D88CE80000AD +:1015100000081E02307F003F13F900353C0A0083AB +:101520008CE800188CA600C011060008000000001E +:101530002405000E0E001897A38500542407FFFF12 +:10154000104700182404FFFF8F85002890A900C4CD +:1015500035240020A0A400C48F8C0030918E000D93 +:1015600031CD007FA18D000D8F8300401060001CE5 +:10157000020020218F84003C8C9800100303782BFC +:1015800011E0000D2419001802002021A399005435 +:101590000E0018972410FFFF105000022404FFFFD4 +:1015A000000020218FBF00148FB000100080102198 +:1015B00003E0000827BD00188C8600108F9F0030C4 +:1015C0000200202100C31023AFE200102405000117 +:1015D0000E001993240600010A001BBA0000202106 +:1015E0000E00191E240500010A001BBA000020216C +:1015F000010A5824156AFFD98F8C0030A0A600EC90 +:101600000A001BA7A386004627BDFFD8AFB0001075 +:101610008F900038AFB20018AFBF0020AFB3001CEE +:10162000AFB100148E1100103C0308008C6331B080 +:1016300032253FFF00A3102B1040000800809021AE +:101640008F86003C2409FF8090CA000D012A4024A7 +:10165000310700FF14E0000B00116B8202402021D3 +:101660002412000DA39200548FBF00208FB3001CE2 +:101670008FB200188FB100148FB000100A001897B5 +:1016800027BD002831AC0003240B0001558BFFF46B +:101690000240202190CF000D31EE000811C0006003 +:1016A0008F93004016600009240200278E19000C59 +:1016B0008CD8002017380005240200208E02000874 +:1016C0008CDF0024105F0040240200200E001897D9 +:1016D000A38200542406FFFF104600332404FFFFBA +:1016E0008F990030240AFFF73C13800E9329000DD8 +:1016F0002404FF803C0D8000012AF824A33F000D44 +:101700008F9900203C0808008D0831AC8F83005869 +:10171000972700788F9F00300103102130E57FFF6D +:10172000000530400046782131F8007F0313602126 +:1017300001E47024ADAE002CA59100008FEB0028D1 +:10174000256A0001AFEA00288FE3002C8E09002CE7 +:1017500000694021AFE8002C8E07002CAFE7003075 +:101760008E050014AFE5003497E6003A24C200016C +:10177000A7E2003A973300783C1008008E1031B091 +:101780002663000130717FFF123000270060302196 +:101790008F8F002002402021240500010E00191E19 +:1017A000A5E60078000020218FBF00208FB3001C29 +:1017B0008FB200188FB100148FB00010008010217C +:1017C00003E0000827BD00288E0500142413FFFF46 +:1017D00010B3001D8F8300288E0800188C6700C08E +:1017E000150700092402000E8E0A00248CC9002867 +:1017F00015490005240200218E0700288CCB002CFF +:1018000010EB00132402001F0E001897A38200544F +:101810001453FFB32404FFFF0A001C3C8FBF0020B9 +:101820000A001C0424020024240E8000006E682498 +:1018300031ACFFFF000C5BC2317100FF001180274B +:101840000A001C35001033C00A001C532402002576 +:101850008E05002C10A0FFEC240200238F8E0020A8 +:101860008DCD007401A5602B1580FFE724020026B2 +:101870008CCF001400A7C02101F8202B1080FF9905 +:101880008F990030024020210A001C5324020022BC +:1018900027BDFFE0AFB000108F900038AFB100144B +:1018A000AFBF00188E0500103C0308008C6331B0F8 +:1018B0000080882130A43FFF0083102B10400007D8 +:1018C0008F86003C2409FF8090CA000D012A402425 +:1018D000310700FF14E000098F8B00402410000D39 +:1018E00002202021A39000548FBF00188FB1001454 +:1018F0008FB000100A00189727BD00201160000863 +:101900000005C3828F8F00288F8EFEEC2407FFFD19 +:1019100095EC007095CD000A11AC00388FBF00180F +:101920003305000314A0001000000000921900020B +:1019300013200041000000008E06002450C0000F5C +:1019400092040003022020212402000F0E001897A9 +:10195000A38200542408FFFF144800072407FFFF58 +:101960000A001CD08FBF001890C3000D306400081F +:101970001080003702202021920400032407000277 +:10198000308900FF15270005308F00FF8F8A004047 +:1019900011400031240C002C308F00FF39E500107D +:1019A0002CAD00012DEE00010200282101CD3025D3 +:1019B0000E0018B7022020212410FFFF1050000E47 +:1019C0002407FFFF8F8300401060001702202021B2 +:1019D0003C1908008F39318C0323C02B5700000CB1 +:1019E0002411002D02202021000028210E0019932F +:1019F00024060001000038218FBF00188FB10014A9 +:101A00008FB0001000E0102103E0000827BD002087 +:101A10000E001897A39100541450FFF62407FFFFFF +:101A20000A001CD08FBF00180E00191E24050001EB +:101A30000A001CCF000038218CDF00248E02002415 +:101A4000545FFFC1022020210A001CB09204000351 +:101A50000A001CA424020010022020210E00189766 +:101A6000A38C0054240BFFFF104BFFE32407FFFF60 +:101A70000A001CB79204000330A500FF24060001F1 +:101A800024A9000100C9102B1040000C00004021C7 +:101A9000240A000100A61823308B000124C600018F +:101AA000006A3804000420421160000200C9182BAB +:101AB000010740251460FFF800A6182303E0000882 +:101AC0000100102127BDFFD8AFB000188F9000385B +:101AD000AFB1001CAFBF00202403FFFF2411002F73 +:101AE000AFA3001092060000240500082610000194 +:101AF000006620260E001CEF308400FF00021E004E +:101B00003C021EDC34466F410A001D170000102104 +:101B100010A00009008018212445000130A2FFFF19 +:101B20002C4500080461FFFA0003204000862026AF +:101B300014A0FFF9008018210E001CEF24050020DE +:101B40008FA300102629FFFF313100FF000342025E +:101B5000240700FF1627FFE2010218260003502782 +:101B6000AFAA0014AFAA00100000302127A800106F +:101B700027A7001400E6782391ED000324CE00018E +:101B800000C8602131C600FF2CCB00041560FFF9AE +:101B9000A18D00008FA200108FBF00208FB1001C0C +:101BA0008FB0001803E0000827BD0028938300349D +:101BB00027BDFFE024020034AFB10014AFB0001025 +:101BC000AFBF001CAFB20018008088211062006215 +:101BD00000A0802192040004148000458F88002812 +:101BE000A380002C8E0500048D0600C83C0700FF72 +:101BF00034E3FFFF00A3282400C5102B1440004D40 +:101C0000AF850040978A00488F87004C014710231A +:101C100010A00032A78200488F980020304CFFFFB0 +:101C20009312007C0012788231F100010011708063 +:101C300001C56821018D582B116000618F86002835 +:101C40008F8900248F8400501089005E3C023F0180 +:101C50008E1F00003C10250003E2C8241730007AD4 +:101C60008F8400388F8700388F8600288CE300002F +:101C7000ACC300788CE50010ACC500888F87004CA1 +:101C80008F850040938D002C30AE0003000E402362 +:101C9000310A0003014D4021A388002C94CB00ACF5 +:101CA00001276021AF8C002435691000A4C900AC65 +:101CB0001620005101452021AF84004C0000202156 +:101CC0008FBF001C8FB200188FB100148FB00010AE +:101CD0000080102103E0000827BD00208F8400242D +:101CE000AF80004C008730210A001D80AF860024A1 +:101CF000241F000CA39F00540E00189702202021DF +:101D00002419FFFF1059FFEE2404FFFF8F880028DD +:101D1000A380002C8E0500048D0600C83C0700FF40 +:101D200034E3FFFF00A3282400C5102B1040FFB5AB +:101D3000AF8500400220202124090019A389005406 +:101D40000E0018972411FFFF1051FFDD2404FFFF40 +:101D50000A001D528F8500408F8400288F8700382D +:101D60008CF20030908600C430C5001014A0001022 +:101D70008F83004C2C68000515000028000000002F +:101D8000908A00C4246BFFFC314900101520000824 +:101D9000316400FF8F8D00508F8C002411AC000443 +:101DA000388F000131EE000115C0002F0000000047 +:101DB0000E001D02000000000A001DD900000000F6 +:101DC0008F890024938D002C30AE0003000E402339 +:101DD000310A0003014D4021A388002C94CB00ACB4 +:101DE00001276021AF8C002435691000A4C900AC24 +:101DF0001220FFB10145202125180004A398002CD2 +:101E000094CF00AC24920004AF92004C35F1200036 +:101E1000A4D100AC0A001D81000020218C8200DCCE +:101E20001242FF6C0220202124180005A3980054C0 +:101E30000E0018972412FFFF1452FF662404FFFFC0 +:101E40000A001D828FBF001C30E500FF0E00179EA8 +:101E5000000030218F8600288F87004C8F89002456 +:101E60000A001D728F8500400E0017C90000000097 +:101E70000A001DD9000000009383004627BDFFE043 +:101E800024020002AFB20018AFB10014AFBF001CB3 +:101E900000808821AFB00010000090211062005532 +:101EA0002404FFFD978300488F85004C3066FFFFB8 +:101EB00000C5202B1480005B938700343C08800011 +:101EC0009504012010E500528F8A00248F84005071 +:101ED00030A500FF0E00179E240600018F9F0058BA +:101EE0003C0580003C19408027ED017831B0007836 +:101EF000240EFF800219582534AF090031B80007BD +:101F000001AE6024ACAC0800030F8021ACAB08101C +:101F100002202021020028210E001D3CAF90003835 +:101F20002403FFFF104300332404FFFF8E0C001036 +:101F30003C0708008CE731B09206000031843FFF77 +:101F40000087102B1040002330CD003F8F980058A1 +:101F5000000471803C0408008C8431A82409FF80AF +:101F60009390004500984021010E202100897024A3 +:101F7000000E51403C0980003099007F3C0F0080EA +:101F80008F8800283525094035E2000101593825A0 +:101F9000308B0078308600073C0310003C1F800C1B +:101FA00000C5C0210162582500E35025033F782178 +:101FB00036050001AD2E0804AF98003CAD2B081487 +:101FC000AF8F0030AD2E0028AD040074AD2A08306C +:101FD000A38500459383004624100003507000271A +:101FE00025A3FFE0240C0001106C001C2406002334 +:101FF000024020218FBF001C8FB200188FB1001447 +:102000008FB000100080102103E0000827BD0020E1 +:10201000314900035520FFAE8F8400500A001E1581 +:102020008F9000508F840050306500FF0E00179E87 +:1020300024060001938B0034240500341165001838 +:10204000978300488F85004C3062FFFF00A2582321 +:10205000AF8B004C0A001E4DA780004811A6003728 +:1020600000000000022020212411000B0E00189710 +:10207000A39100540A001E4D004090212C720020B4 +:102080001240FFF80003F8803C07080124E7813C78 +:1020900003E7C8218F2D000001A000080000000008 +:1020A0008F85004C2CA200055440001DA7800048DD +:1020B000978A00483148FFFF00A848232D2F0005CC +:1020C00011E00003314400FF24AEFFFC31C400FFE7 +:1020D0008F9000508F980024121800043899000146 +:1020E000332D000115A00029000000008F91002869 +:1020F000922500C434A30010A22300C49783004893 +:102100008F85004C8F8400283062FFFF00A2582387 +:10211000AC8000DCA78000480A001E4DAF8B004C4D +:102120003062FFFF00A258230A001E4DAF8B004C07 +:102130002403FFFF11830005000000000E001B6F49 +:10214000022020210A001E4D004090210E001AF6A8 +:10215000022020210A001E4D004090210E001BD3BA +:10216000022020210A001E4D004090210E001A4D31 +:10217000022020210A001E4D004090210E001C75F7 +:10218000022020210A001E4D004090210E0017C998 +:1021900000000000978300488F85004C306CFFFFE3 +:1021A00000AC38232CFF000553E0FFA83062FFFF8E +:1021B0008F860028A7800048ACC200DC3062FFFF99 +:1021C00000A258230A001E4DAF8B004C27BDFFD044 +:1021D000AFB20018AFB00010AFBF0028AFB50024F9 +:1021E000AFB40020AFB3001CAFB100143C0C8000B2 +:1021F0008D880128240FFF803C07800A25100100EC +:10220000250B0080020F68243205007F016F7024C7 +:10221000AD8E009000A72821AD8D002490A700EC82 +:102220003169007F3C0A8004012A1821A3870046F7 +:102230009066007C00809021AF83002030C20002B5 +:10224000AF880058AF85002800A018211440000274 +:102250002404003424040030A38400348C6600CCB1 +:1022600030F100FF24040004AF86004C1224000467 +:10227000A38000548E5300041660001D3C088000AB +:102280009387004530F200011240000F8FBF0028F5 +:102290008CB800748CA400742419FF80031988245E +:1022A00000117140308F007F01CF60253C0D200070 +:1022B000018D582530F500FE3C0A8000AD4B0830FA +:1022C000A39500458FBF00288FB500248FB4002050 +:1022D0008FB3001C8FB200188FB100148FB00010A4 +:1022E0002402000127BD003003E00008ACA600CCAA +:1022F0008E590008951F01208E460010033FC02113 +:102300003307FFFF30F5000F32B40001AF86002421 +:102310001680003BA395004435060C0002A6102150 +:1023200000F51823AD030084AF8200508E490004ED +:102330003128FFFF1100002BA78900482410FF80DF +:102340003C1580003C1420000A001F3B2413FFFEB4 +:1023500090AE00C4020E682431AC00FF1580002A44 +:10236000024020219384004597860048308F000169 +:1023700011E0000B026428248F8900288D2300744B +:102380008D280074A3850045007010240002C94008 +:10239000311F007F033FC02503148825AEB10830EC +:1023A00010C000108F85002890A700C40207582491 +:1023B000316A00FF1540FFE6024020210E001DEFAC +:1023C000979100481040FFE8938400452405FFFDE5 +:1023D000544500058E430020022028210E0017746A +:1023E000024020218E430020307000041600000AB5 +:1023F0002414FFFB8F8500280A001EF18F86004CF5 +:102400000A001F1CAF8600500E001A1900000000C1 +:102410000A001F2B93840045007498240E00178E29 +:10242000AE5300208F8500280A001EF18F86004CD5 +:1024300027BDFFD8AFB3001CAFB10014AFBF002061 +:10244000AFB20018AFB000103C0280008C520140C7 +:102450008C4B01483C048000000B8C02322300FFAF +:10246000317300FF8C8501B804A0FFFE3490018019 +:10247000AE1200008C8701442464FFF024060002A1 +:102480002C830013AE070004A6110008A206000B5F +:10249000AE1300241060004F8FBF0020000448805E +:1024A0003C0A0801254A81BC012A40218D04000014 +:1024B00000800008000000003C1008008E1031A8C9 +:1024C00031733FFF001389800212C8212405FF8069 +:1024D00003312021264C0100264700803C1F80004C +:1024E00000E51824318F007F30E9007F308A007FBB +:1024F0003C18800A3C0E80043C0D800C00851024A2 +:1025000001853024014D8021AFE6002401F84021EF +:10251000AFE30090012E9821AFE20028AF90003089 +:10252000AF880028AF9300200E001863016080215F +:102530003C0380008C6B01B80560FFFE8F87003084 +:10254000346501808F86002890E3000DACB2000056 +:10255000A4B00006000316000002FE03001F90272F +:10256000001227C21080007A24C2007824196082E9 +:10257000A4B90008A0A00005241F0002A0BF000B02 +:1025800000041C008F8B00203C0227000062902575 +:10259000ACB20010ACA00014ACA00024ACA0002889 +:1025A000ACA0002C8D7300382410FF80ACB3001851 +:1025B00090E4000D02048824322500FF10A00005DD +:1025C0008FBF002090EC000D3188007FA0E8000D47 +:1025D0008FBF00208FB3001C8FB200188FB1001482 +:1025E0008FB000103C0D10003C0A800027BD002871 +:1025F00003E00008AD4D01B8265F01002405FF800F +:1026000033F8007F3C06800003E578243C19800AFB +:1026100003192021ACCF0024908E00C400AE6824A2 +:1026200031AC00FF1180FFEAAF840028248E0078CF +:1026300095CD00123C0C08008D8C31A831AB3FFFCA +:1026400001924821000B5180012A402101052024DC +:10265000ACC400283107007F3C06800C00E6202136 +:102660009083000D00A31024304500FF10A0FFD878 +:10267000AF8400309098000D330F001015E0FFD5A7 +:102680008FBF00200E001863000000003C03800094 +:102690008C7901B80720FFFE00000000AE12000098 +:1026A0008C720144AE120004A6110008241100022D +:1026B000A211000BAE1300240A001FC68FBF00201A +:1026C0003C1260008E452C083C03F0033462FFFF8F +:1026D00000A2F824AE5F2C088E582C083C1901B0DB +:1026E00003199825AE532C080A001FC68FBF00207F +:1026F000264D010031AF007F3C10800A240EFF8080 +:1027000001F0282101AE60243C0B8000AD6C002458 +:102710001660FFAFAF85002824110003A0B100ECC4 +:102720000A001FC68FBF002026480100310A007F23 +:102730003C0B800A2409FF80014B30210109202431 +:102740003C078000ACE400240A001FC5AF860028C7 +:10275000944A001232083FFF314C3FFF1588FF8436 +:102760002419608290CF00C4240EFF8001CF48243A +:10277000312D00FF11A0FF7E00000000240700049F +:10278000A0C700EC8F870030241860842406000D59 +:10279000A4B80008A0A600050A001FB0241F00026C +:1027A0000800330C0800330C080033E8080033BC81 +:1027B000080033A0080032F0080032F0080032F0C0 +:1027C00008003314800801008008008080080000A1 +:1027D0005F865437E4AC62CC50103A4536621985B6 +:1027E000BF14C0E81BC27A1E84F4B556094EA6FE7B +:1027F0007DDA01E7C04D748108007A7408007AC060 +:1028000008007A80080079A808007A8008007AB069 +:1028100008007A80080079A8080079A8080079A83B +:10282000080079A8080079A8080079A8080079A804 +:10283000080079A8080079A8080079A808007AA0FB +:1028400008007A90080079A8080079A8080079A8FB +:10285000080079A8080079A8080079A8080079A8D4 +:10286000080079A8080079A8080079A8080079A8C4 +:10287000080079A808007A900800806C08007F148E +:102880000800803408007F140800800408007DFCE4 +:1028900008007F1408007F1408007F1408007F14CC +:1028A00008007F1408007F1408007F1408007F14BC +:1028B00008007F1408007F1408007F1408007F14AC +:0428C00008007F3C51 +:0C28C4000A0001220000000000000000DB +:1028D0000000000D747061352E302E306A33000018 +:1028E00005000001000000000000000000000000E2 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:1029500010000003000000000000000D0000000D4A +:102960003C02080024421C203C03080024631FA0F2 +:10297000AC4000000043202B1480FFFD24420004E3 +:102980003C1D080037BD2FFC03A0F0213C100800BF +:10299000261004883C1C0800279C1C200E0002E224 +:1029A000000000000000000D2402FF8027BDFFE0B2 +:1029B00000821024AFB00010AF420020AFBF00185B +:1029C000AFB10014936500043084007F03441821E4 +:1029D0003C0200080062182130A50020036080211D +:1029E0003C080111277B000814A000022466005C4B +:1029F00024660058920200049743010492040004E4 +:102A00003047000F3063FFFF308400400067282309 +:102A100010800009000048219202000530420004A5 +:102A2000104000050000000010A00003000000009E +:102A300024A5FFFC24090004920200053042000492 +:102A4000104000120000000010A000100000000064 +:102A50009602000200A72021010440252442FFFE27 +:102A6000A7421016920300042402FF8000431024A2 +:102A7000304200FF104000033C0204000A000172D3 +:102A8000010240258CC20000AF4210188F4201782D +:102A90000440FFFE2402000AA74201409602000201 +:102AA00024040009304200070002102330420007CE +:102AB000A7420142960200022442FFFEA7420144BF +:102AC000A740014697420104A74201488F420108EE +:102AD0003042002050400001240400019202000412 +:102AE000304200101440000234830010008018218E +:102AF000A743014A000000000000000000000000A1 +:102B000000000000AF4810000000000000000000BE +:102B100000000000000000008F4210000441FFFE92 +:102B20003102FFFF10400007000000009202000485 +:102B30003042004014400003000000008F42101893 +:102B4000ACC20000960200063042FFFF24420002A1 +:102B50000002104300021040036288219622000008 +:102B60001120000D3044FFFF00A710218F83003893 +:102B70008F45101C000210820002108000431021BB +:102B8000AC45000030A6FFFF0E0002D100052C026C +:102B900000402021A6220000920300042402FF80AE +:102BA00000431024304200FF1040001F00000000CE +:102BB00092020005304200021040001B000000009D +:102BC0009742100C2442FFFEA7421016000000009E +:102BD0003C02040034420030AF421000000000000C +:102BE0000000000000000000000000008F42100004 +:102BF0000441FFFE000000009742100C8F45101C9E +:102C00003042FFFF24420030000210820002108098 +:102C1000005B1021AC45000030A6FFFF0E0002D182 +:102C200000052C02A622000096040002248400085D +:102C30000E0001E73084FFFF974401040E0001F508 +:102C40003084FFFF8FBF00188FB100148FB00010C9 +:102C50003C02100027BD002003E00008AF420178CD +:102C60003084FFFF308200078F850024104000026F +:102C7000248300073064FFF800A4102130421FFFB6 +:102C800003421821247B4000AF850028AF82002436 +:102C900003E00008AF4200843084FFFF3082000F61 +:102CA0008F85002C8F860034104000022483000F93 +:102CB0003064FFF000A410210046182BAF850030CF +:102CC0000046202314600002AF82002CAF84002C49 +:102CD0008F82002C340480000342182100641821E4 +:102CE000AF83003803E00008AF4200808F820014F9 +:102CF000104000088F8200048F82FFCC1440000532 +:102D00008F8200043C02FFBF3442FFFF0082202478 +:102D10008F82000430430006240200021062000F7C +:102D20003C0201012C620003504000052402000413 +:102D30001060000F3C0200010A00022E000000009B +:102D400010620005240200061462000C3C0201110E +:102D50000A000227008210253C0200110082102583 +:102D6000AF421000240200010A00022EAF82000CC4 +:102D700000821025AF421000AF80000C0000000060 +:102D8000000000000000000003E000080000000058 +:102D90008F82000C10400004000000008F421000E1 +:102DA0000441FFFE0000000003E0000800000000F6 +:102DB0008F8200102443F800000229C224A2FFF0F1 +:102DC0002C63030110600003000210420A00025548 +:102DD000AC8200008F83001800A3102B1440000B5E +:102DE0000000382100A31023244600018F82001C1C +:102DF000006210212442FFFF0045102B54400004C4 +:102E00002402FFFF0A000255AC8600002402FFFFE7 +:102E10000A00025AAC8200008C8200003C030800C9 +:102E200024631C5C000211400043382103E00008C9 +:102E300000E010213C0908008D291D80000451404C +:102E40003C19080027391C5C00C0782100806021F3 +:102E5000240EFFFF000038210159402111200036C7 +:102E6000000030213C18080027181D983C0D080070 +:102E700025AD1D9C000F582B000611800046102127 +:102E8000000218C0007810218C420000158200203A +:102E9000006D20218CA20000544000098D02001812 +:102EA0003C0208008C421D8424420001AC820000D8 +:102EB0003C010800AC221D840A0002CF0000202142 +:102EC0008F47002000003021000211C01160004A2D +:102ED000AF4200208D08001C3C0900088CA30000B4 +:102EE0000066182100031880007A10210049102183 +:102EF0008C44000024C600010068182100CF102B6C +:102F00001440FFF6AC6400000A0002CD000000008F +:102F10008C840000008E102B5040000424C6000159 +:102F20000080702100C0382124C6000100C9102B88 +:102F30001440FFD20006118024020001ACA2000060 +:102F40003C0208008C421D7C3C0308008C631D8001 +:102F50000043102B1440002A2404FFFE01591021C5 +:102F60008C420018104000262404FFFF0007218037 +:102F70003C0508008CA51D84008720218D060018C3 +:102F8000000420C03C02080024421D980082102149 +:102F90003C03080024631D9CAC4C000024A50001E8 +:102FA000008318213C02080024421DA0AC650000EB +:102FB000000631C03C010800AC251D8400822021A0 +:102FC0008F470020AD04001CAF46002011E0000A2E +:102FD000000030213C020008034228218CA200009E +:102FE00024C6000100CF182BAC82000024A50004E9 +:102FF0001460FFFA24840004AF4700200000202161 +:1030000003E00008008010213084FFFF30C6FFFF7E +:1030100000052C0000A628253882FFFF004510215E +:103020000045282B0045102100021C023042FFFF02 +:103030000043102100021C023042FFFF0043102118 +:103040003842FFFF03E000083042FFFF27BDFFC802 +:10305000AFBF0030AFB3002CAFB20028AFB1002437 +:10306000AFB000203C0460088C8250002403FF7F36 +:103070003C066000004310243442380CAC825000FF +:103080008CC24C1C3C1A8000000216023042000F19 +:1030900010400007AF82001C8CC34C1C3C02001F78 +:1030A0003442FC0000621824000319C2AF830018E8 +:1030B0008F420008275B400034420001AF42000805 +:1030C000AF8000243C02601CAF400080AF40008411 +:1030D0008C4500088CC3080834028000034220217C +:1030E0002402FFF0006218243C0200803C0108002A +:1030F000AC2204203C025709AF840038146200045B +:10310000AF850034240200010A000314AF820014CA +:10311000AF8000142403003D240200043C01080099 +:10312000AC221D943C010800AC231D903C0108001A +:10313000AC231D8C3C010800AC231D883C13080007 +:1031400026731C5C240400043C02080024421C7406 +:10315000240300082463FFFFAC400004AC400000DF +:103160000461FFFC24420020000410C00044102130 +:103170002442003D3C010800AC221D9024020001C5 +:103180003C010800AC221D7C2402FFFF3C0108002A +:10319000AC221D983C010800AC201D848F42000029 +:1031A00038420001304200011440FFFC8F820014BD +:1031B0001040001600000000974201041040000576 +:1031C0008F830000146000072462FFFF0A00034B96 +:1031D0002C62000A2C620010504000048F83000013 +:1031E00024620001AF8200008F8300002C62000A7D +:1031F000144000032C6200070A000352AF80FFCC8A +:103200001040000224020001AF82FFCC8F4301086E +:103210008F44010030622000AF830004104000089A +:10322000AF8400103C0208008C42042C24420001B0 +:103230003C010800AC22042C0A0006D73C024000E6 +:103240003065020014A0000324020F001482030959 +:1032500024020D0097420104104003713C0240001B +:1032600030624000144000AD8F8200388C4400086A +:103270008F4201780440FFFE24020800AF4201782B +:1032800024020008A7420140A740014297420104DE +:103290008F8400043051FFFF30820001104000078E +:1032A000022080212623FFFE240200023070FFFF4F +:1032B000A74201460A00037FA7430148A7400146F1 +:1032C0003C0208008C42043C1440000D8F83001027 +:1032D000308200201440000224030009240300016E +:1032E000006020218F830010240209005062000139 +:1032F00034840004A744014A0A00039A0000000035 +:1033000024020F00146200053082002014400006E1 +:103310002403000D0A000399240300051440000251 +:103320002403000924030001A743014A3C020800CA +:103330008C4204203C0400480E00020A0044202570 +:103340000E000233000000008F82000C1040003E8F +:10335000000000008F4210003C03002000431024B6 +:10336000104000398F8200043042000210400036C5 +:1033700000000000974210141440003300000000C9 +:10338000974210088F8800383042FFFF2442000621 +:10339000000218820003388000E830213043000129 +:1033A0008CC4000010600004304200030000000DD7 +:1033B0000A0003DB00E81021544000103084FFFFB6 +:1033C0003C05FFFF00852024008518260003182BEC +:1033D0000004102B004310241040000500000000E2 +:1033E000000000000000000D000000002400021C8E +:1033F0008CC200000A0003DA004520253883FFFF55 +:103400000003182B0004102B00431024104000056B +:1034100000000000000000000000000D000000009F +:10342000240002258CC200003444FFFF00E8102174 +:10343000AC4400003C0208008C42043024420001ED +:103440003C010800AC2204308F6200008F840038F9 +:10345000AF8200088C8300003402FFFF1462000F6B +:10346000000010213C0508008CA504543C04080011 +:103470008C84045000B0282100B0302B0082202121 +:10348000008620213C010800AC2504543C010800C2 +:10349000AC2404500A0006CD240400088C820000ED +:1034A000304201001040000F000010213C050800D0 +:1034B0008CA5044C3C0408008C84044800B02821EE +:1034C00000B0302B00822021008620213C01080022 +:1034D000AC25044C3C010800AC2404480A0006CD8D +:1034E000240400083C0508008CA504443C040800A2 +:1034F0008C84044000B0282100B0302B00822021B1 +:10350000008620213C010800AC2504443C01080051 +:10351000AC2404400A0006CD240400088F62000891 +:103520008F62000000021602304300F024020030D7 +:1035300010620005240200401062016B8F8200209F +:103540000A0006D52442000114A000050000000076 +:10355000000000000000000D0000000024000250E8 +:103560008F4201780440FFFE000000000E00023B85 +:1035700027A4001014400005004080210000000036 +:103580000000000D00000000240002578E02000021 +:103590001040000500000000000000000000000DC9 +:1035A000000000002400025A8F62000C0443000354 +:1035B000240200010A00055DAE000000AE0200001A +:1035C0008F8200388C450008A20000078F65000C30 +:1035D0008F64000430A3FFFF000424020085202331 +:1035E000308200FF0043102124420005000288833E +:1035F0002E220081A605000A14400005A204000442 +:10360000000000000000000D000000002400027215 +:103610003C0708008CE71D808FA800102409FFFFDD +:103620000000502110E00013000030213C0C080085 +:10363000258C1D9C01802821000018218CA2FFFCF4 +:103640005102002F006C18218CA400002463020892 +:103650000089102B1040000324A502080080482197 +:1036600000C0502124C6000100C7102B5440FFF4B5 +:103670008CA2FFFC3C0508008CA51D803C020800C4 +:103680008C421D7C3C09080025291C603C03080075 +:1036900024631D9800A2102B3C0C0800258C1D9C57 +:1036A0003C0408008C841D843C0B0800256B1DA085 +:1036B0001040001A0008314000051180004510211B +:1036C000000210C000C9382124840001004B3021C1 +:1036D0000043182124A50001004C1021AC68000013 +:1036E000ACE600183C010800AC241D84AC4400008A +:1036F0003C010800AC251D800A0004A88E04001CB3 +:103700003C0208008C421D84244200013C01080058 +:10371000AC221D840A0004A7AC620000000A1180DC +:10372000004A1021000210C0004328218CA3000091 +:10373000004C3821248400010003194000C93021C5 +:1037400000691821004B1021ACA80000AC600018E3 +:103750003C010800AC241D84ACC20018ACE400009D +:103760008E04001C8F8500380E0006E702203021F1 +:103770008F6200048F430108A60200083C0210007B +:103780000062182410600008000000009742010445 +:10379000920300072442FFEC346300023045FFFF30 +:1037A0000A0004BCA2030007974201042442FFF070 +:1037B0003045FFFF960600082CC200135440000558 +:1037C000920300079202000734420001A2020007A0 +:1037D0009203000724020001106200052402000386 +:1037E0001062000B30C7FFFF0A0004DB24E2000276 +:1037F0008F8200383C04FFFF8C43000C00641824C7 +:1038000000651825AC43000C0A0004DA30C7FFFF3E +:103810008F8200383C04FFFF8C43001000641824A2 +:1038200000651825AC43001030C7FFFF24E20002FA +:1038300000021083A20200058F830038304200FF8F +:1038400000021080004330218CC500008CC20000B3 +:1038500024030004000217021443001300000000B8 +:10386000974201043C03FFFF00A318243042FFFFEE +:10387000004710232442FFFE00622825ACC500004B +:10388000920400058E03001C308200FF00021080AD +:1038900000431021904200003042000F00441021EC +:1038A0000A000510A20200068CC40004974201041D +:1038B0009603000A3085FFFF3042FFFF00471023C8 +:1038C0002442FFD60002140000A22825ACC5000443 +:1038D0009202000792040005246300280003188365 +:1038E0000064182134420004A2030006A20200076B +:1038F0008F8200042403FFFB3442000200431024A3 +:10390000AF820004920300068E07001C8F860038E9 +:1039100000031880006710218C44000C3C02FFF665 +:103920003442FFFF0082282400661821AE04000CF8 +:10393000AC65000C920300068E04000C3C02FF7F75 +:103940003442FFFF0003188000A2282400822024B4 +:1039500000671821AE04000CAC65000C9202000652 +:10396000000210800047102194450012AC45001061 +:10397000920200060002108000461021AC450010A3 +:103980008FA200109203000500021140000318806E +:1039900000671821005320218C6200048C830018DA +:1039A0001460000EAE0200143C0308008C631D8CF2 +:1039B000AC8300183C0208008C421D900062102B62 +:1039C00010400019000000003C0208008C421D94C9 +:1039D000006210213C010800AC221D8C8E020018F0 +:1039E0008F48002000003021000211C01220000B7F +:1039F000AF4200203C0200080342282100E02021C1 +:103A00008C82000024C6000100D1182BACA200005B +:103A1000248400041460FFFA24A50004AF480020A9 +:103A20000A00055E24020010000000000000000DE6 +:103A300000000000240002D424020010A74201402C +:103A400024020002A7400142A7400144A7420146C8 +:103A5000974201043C0400082442FFFEA7420148AB +:103A6000240200010E00020AA742014A9603000A3E +:103A70009202000400431021244200023042000759 +:103A800000021023304200070E000233AE02001085 +:103A90008F6200003C0308008C630444240400107F +:103AA000AF820008974201043042FFFF2442FFFE2C +:103AB00000403821000237C33C0208008C42044019 +:103AC000006718210067282B0046102100451021AF +:103AD0003C010800AC2304443C010800AC22044033 +:103AE0000A0006620000000014A0000500000000AB +:103AF000000000000000000D00000000240003048E +:103B00008F4201780440FFFE000000000E00023BDF +:103B100027A400141440000500408021000000008C +:103B20000000000D000000002400030B92060004BA +:103B30008FA4001427A50018000630820E00025C36 +:103B4000AFA00018504000068E02000000000000E8 +:103B50000000000D00000000240003118E02000090 +:103B60005440000692020007000000000000000D13 +:103B700000000000240003169202000730420004F7 +:103B8000104000058F8200042403FFFB3442000232 +:103B900000431024AF8200048F6200040443000934 +:103BA00092020007920200068E03001C8E04000C95 +:103BB0000002108000431021AC44000CAE00000055 +:103BC00092020007304200045440000B92030004AC +:103BD000920300058E0400148E05001C000318805B +:103BE0003C0200010082202100651821AE0400146F +:103BF000AC640004920300049602000A00621021E3 +:103C000024420005000290838FA200181040000D8E +:103C1000277100088FA40014000310820242302391 +:103C200027A500180E00025CAFA200185040000645 +:103C30008E05001C000000000000000D00000000C8 +:103C40002400033F8E05001C022020210E0006E701 +:103C500002403021920400068F6500043C027FFF81 +:103C600000042080009120218C8300043442FFFF57 +:103C700000A2282400651821AC83000492020007EA +:103C80009203000492050005304200041040001425 +:103C90009607000830A500FF0005288000B1282104 +:103CA0008CA40004974201049606000A306300FFCA +:103CB0003042FFFF004310210046102130E3FFFF98 +:103CC000004310232442FFD83084FFFF0002140079 +:103CD00000822025ACA400040A0006169203000707 +:103CE00030A500FF0005288000B128218CA4000029 +:103CF00097420104306300FF3042FFFF0043102170 +:103D0000004710233C03FFFF008320243042FFFFC5 +:103D100000822025ACA400009203000724020001C9 +:103D2000106200060000000024020003106200116F +:103D3000000000000A0006398E03001097420104BB +:103D4000920300049605000A8E24000C0043102103 +:103D5000004510212442FFF23C03FFFF0083202492 +:103D60003042FFFF00822025AE24000C0A000639F5 +:103D70008E03001097420104920300049605000A86 +:103D80008E24001000431021004510212442FFEE34 +:103D90003C03FFFF008320243042FFFF00822025E8 +:103DA000AE2400108E0300102402000AA742014036 +:103DB000A74301429603000A920200043C0400401B +:103DC00000431021A7420144A74001469742010445 +:103DD000A7420148240200010E00020AA742014A3C +:103DE0000E000233000000008F6200009203000406 +:103DF00000002021AF820008974201049606000AC5 +:103E00003042FFFF00621821006028213C030800B7 +:103E10008C6304443C0208008C4204400065182175 +:103E2000004410210065382B004710213C01080098 +:103E3000AC2304443C010800AC220440920400047A +:103E4000008620212484000A3084FFFF0E0001E751 +:103E500000000000974401043084FFFF0E0001F5CC +:103E6000000000003C021000AF4201780A0006D4B6 +:103E70008F820020148200273062000697420104DE +:103E8000104000673C0240003062400010400005D6 +:103E900000000000000000000000000D0000000015 +:103EA0002400041A8F4201780440FFFE2402080017 +:103EB000AF42017824020008A7420140A740014216 +:103EC0008F82000497430104304200011040000734 +:103ED0003070FFFF2603FFFE24020002A7420146C6 +:103EE000A74301480A00068C2402000DA7400146A2 +:103EF0002402000DA742014A8F620000240400083A +:103F0000AF8200080E0001E7000000000A0006660C +:103F100002002021104000423C0240009362000059 +:103F2000304300F0240200101062000524020070EB +:103F3000106200358F8200200A0006D5244200015D +:103F40008F620000974301043050FFFF3071FFFF84 +:103F50008F4201780440FFFE320200070002102366 +:103F6000304200072403000A2604FFFEA743014055 +:103F7000A7420142A7440144A7400146A751014876 +:103F80008F4201083042002014400002240300093F +:103F900024030001A743014A0E00020A3C0400402A +:103FA0000E000233000000003C0708008CE70444C8 +:103FB000021110212442FFFE3C0608008CC604407A +:103FC0000040182100E33821000010218F65000017 +:103FD00000E3402B00C230212604000800C8302135 +:103FE0003084FFFFAF8500083C010800AC27044483 +:103FF0003C010800AC2604400E0001E70000000070 +:104000000A000666022020210E000139000000008F +:104010008F82002024420001AF8200203C02400039 +:10402000AF4201380A000336000000003084FFFF71 +:1040300030A5FFFF000018211080000700000000DD +:104040003082000110400002000420420065182167 +:104050000A0006DD0005284003E00008006010218A +:1040600010C0000624C6FFFF8CA2000024A5000497 +:10407000AC8200000A0006E72484000403E0000884 +:104080000000000010A0000824A3FFFFAC86000081 +:1040900000000000000000002402FFFF2463FFFF77 +:1040A0001462FFFA2484000403E00008000000000A +:0440B000000000010B +:0C40B4000A00002A0000000000000000CC +:1040C0000000000D747870352E302E306A330000F9 +:1040D000050000000000000A000001360000EA6050 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:104110000000000000000016000000000000000089 +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:1041400000000000000000000000000000001388D4 +:1041500000000000000005DC00000000000000007E +:1041600010000003000000000000000D0000000D22 +:104170003C020800244238603C03080024633B14DE +:10418000AC4000000043202B1480FFFD24420004BB +:104190003C1D080037BD7FFC03A0F0213C10080047 +:1041A000261000A83C1C0800279C38600E0004075D +:1041B000000000000000000D8F86003C3C039000D2 +:1041C0003C0280000086282500A32025AC44002066 +:1041D0003C0380008C67002004E0FFFE000000002C +:1041E00003E00008000000000A0000412404000170 +:1041F0008F85003C3C0480003483000100A310251F +:1042000003E00008AC82002003E000080000102159 +:104210003084FFFF30A5FFFF108000070000182149 +:104220003082000110400002000420420065182185 +:104230001480FFFB0005284003E000080060102107 +:1042400010C00007000000008CA2000024C6FFFF81 +:1042500024A50004AC82000014C0FFFB24840004E9 +:1042600003E000080000000010A0000824A3FFFFE6 +:10427000AC86000000000000000000002402FFFFE8 +:104280002463FFFF1462FFFA2484000403E00008A3 +:104290000000000090AA00318FAB00108CAC0040F1 +:1042A0003C0300FF8D680004AD6C00208CAD004421 +:1042B00000E060213462FFFFAD6D00248CA7004850 +:1042C0003C09FF000109C024AD6700288CAE004CFA +:1042D0000182C82403197825AD6F0004AD6E002C4F +:1042E0008CAD0038314A00FFAD6D001C94A900323E +:1042F0003128FFFFAD68001090A70030A5600002D4 +:10430000A1600004A167000090A30032306200FFAA +:104310000002198210600005240500011065000EDE +:104320000000000003E00008A16A00018CD800280A +:10433000354A0080AD7800188CCF0014AD6F0014A2 +:104340008CCE0030AD6E00088CC4002CA16A000138 +:1043500003E00008AD64000C8CCD001CAD6D0018AE +:104360008CC90014AD6900148CC80024AD68000825 +:104370008CC70020AD67000C8CC200148C830070C9 +:104380000043C82B13200007000000008CC200145B +:10439000144CFFE400000000354A008003E00008F0 +:1043A000A16A00018C8200700A0000B700000000C2 +:1043B0009089003027BDFFF88FA8001CA3A900003A +:1043C0008FA300003C0DFF8035A2FFFF8CAC002CBA +:1043D00000625824AFAB0000A100000400C05821C7 +:1043E000A7A000028D06000400A048210167C82193 +:1043F0008FA50000008050213C18FF7F032C202651 +:104400003C0E00FF2C8C0001370FFFFF35CDFFFF66 +:104410003C02FF0000AFC82400EDC02400C2782495 +:10442000000C1DC00323682501F87025AD0D0000A8 +:10443000AD0E00048D240024AFAD0000AD040008D3 +:104440008D2C00202404FFFFAD0C000C954700329A +:1044500030E6FFFFAD0600109145004830A200FF96 +:10446000000219C2506000018D240034AD04001414 +:104470008D4700388FAA001827BD0008AD0B002813 +:10448000AD0A0024AD07001CAD00002CAD000018E3 +:1044900003E00008AD00002027BDFFE0AFB2001828 +:1044A000AFB10014AFB00010AFBF001C9098003047 +:1044B00000C088213C0D00FF330F007FA0CF00001B +:1044C000908E003135ACFFFF3C0AFF00A0CE00010A +:1044D00094A6001EA22000048CAB00148E290004B8 +:1044E00000A08021016C2824012A40240080902112 +:1044F00001052025A6260002AE2400042605002082 +:10450000262400080E0000632406000292470030B3 +:10451000260500282624001400071E0000031603A9 +:1045200024060004044000032403FFFF96590032D0 +:104530003323FFFF0E000063AE2300102624002467 +:104540008FBF001C8FB200188FB100148FB0001005 +:1045500024050003000030210A00006D27BD002063 +:1045600027BDFFD8AFB1001CAFB00018AFBF00200F +:1045700090A900302402000100E050213123003FC7 +:1045800000A040218FB000400080882100C0482159 +:10459000106200148FA70038240B000500A0202112 +:1045A00000C02821106B0013020030210E0000F91A +:1045B000000000009225007C30A40002108000035F +:1045C00026030030AE000030260300348FBF0020E9 +:1045D0008FB1001C8FB000180060102103E00008AC +:1045E00027BD00280E000078AFB000100A0001407F +:1045F000000000008FA3003C0100202101202821A1 +:1046000001403021AFA300100E0000BFAFB0001476 +:104610000A000140000000003C0580008CA30E1041 +:104620008F840044AC8300208CA20E1803E00008A5 +:10463000AC8200243C0580008CA30E148F840044BF +:10464000AC8300208CA20E1C03E00008AC82002486 +:104650009382000C1040001B2483000F2404FFF001 +:104660000064382410E00019978B00109784000E26 +:104670009389000D3C0A601C0A00017B0164402301 +:1046800001037021006428231126000231C2FFFFBC +:1046900030A2FFFF0047302B50C0000E00E448213D +:1046A0008D4D000C31A3FFFF00036400000C2C03B0 +:1046B00004A1FFF30000302130637FFF0A00017383 +:1046C0002406000103E00008000000009784000EAB +:1046D00000E448213123FFFF3168FFFF0068382BD9 +:1046E00054E0FFF8A783000E938A000D11400005E7 +:1046F000240F0001006BC023A380000D03E000081D +:10470000A798000E006BC023A38F000D03E00008E4 +:10471000A798000E03E000080000000027BDFFE896 +:10472000AFB000103084FFFF3C10800093A8002B36 +:10473000AFBF0014A6040144960A0E1630C600FF4F +:104740008FA90030A60A0146AE050148A206015213 +:10475000A608015AAE0701608FA3002CA6090158D4 +:10476000012020210E000167AE0301543C0210001D +:10477000AE0201788FBF00148FB0001003E0000874 +:1047800027BD00188F8500002484000727BDFFF88F +:104790003084FFF83C06800094CB008A316AFFFF2A +:1047A000AFAA00008FA90000012540232507FFFFC5 +:1047B00030E31FFF0064102B1440FFF700056882F0 +:1047C000000D288034CC400000AC102103E000082C +:1047D00027BD00088F8200002486000730C5FFF83F +:1047E00000A2182130641FFF03E00008AF8400001E +:1047F0008F8500448F8A003C27BDFFB03C048000B9 +:10480000AFB70044AFB40038AFB1002CAFBF004821 +:10481000AFB60040AFB5003CAFB30034AFB200302C +:10482000AFB000288C8701048CA90024AC8A0080DA +:104830008CA8002000E988230000B821AC880E1065 +:104840008CA600240000A021AC860E188C820E10CD +:10485000AC820E148C830E18AC830E1C122000FB4D +:104860003C168000936B0008116000F1000000000E +:10487000976E001031CDFFFF022D602B158000ECEC +:104880000000000097700010320FFFFFAECF0E0047 +:104890003C0580008CB30000327200081240FFFD1E +:1048A0000000000094B50E088CA70E0432A5FFFF8F +:1048B00030B40001128000E1000000000000000D93 +:1048C00030B9A040241800401338011730B4A000BC +:1048D000128000DC000000009373000812600008E2 +:1048E00000000000976900103122FFFF00E2202B3A +:1048F0001080000330A6004010C000D2000000006D +:10490000A7850040AF870038936A0008022038214D +:10491000AFB10020154000F127B40020AF60000CBB +:104920009785004030B14000162000022403001695 +:104930002403000E24154007A363000AAF7500147A +:10494000939000428F6F0014321900010019C24089 +:1049500001F84025AF680014978700408F6300146A +:1049600030EE0010006E6825AF6D0014978C00408B +:10497000318B000811600165000000008F65001494 +:104980003C0B10003C0A800000AB8825AF7100147E +:1049900095460E0A3C0981002413000E30C2FFFF29 +:1049A00000492025AF640004A3730002937F000A2E +:1049B0003406FFFC27F20004A372000A978D004022 +:1049C00031AC200011800157000000003C0780003E +:1049D000978D004094EC0E0C97910040000D5842CA +:1049E0003185C000316A000300051303322910002D +:1049F00001429825000922030264F825001F90C097 +:104A0000A7720012979500409379000A00158182E1 +:104A10003218003C0319782125E8003CA3680009FE +:104A200094EE0E0C31C33FFFA76300109763001292 +:104A30009367000900E3702125CD000231AC000727 +:104A4000000C582331650007A365000B9371000922 +:104A500097640012976A0010322200FF8F9100388D +:104A6000979F004000444821012A98210266902126 +:104A700033F5004012A000053246FFFF00D1402B65 +:104A80003C12800011000016000098210226782BAD +:104A900015E001368FA700203C1880008F100E14FF +:104AA0003C058000AF100E108F190E1CAF190E18A8 +:104AB000AF060E008CB200003255000812A0FFFDB8 +:104AC0000000000094BF0E0800C088210000902163 +:104AD000A79F00408CA60E0424130001AF86003867 +:104AE000976900103135FFFF8E8C00000191202363 +:104AF00010800118AE8400009367000814E000D80D +:104B0000000000000E0001B4240400108F8E004845 +:104B10003C0332000040282131C600FF00063C0063 +:104B200000E3602525CD0001AF8D0048AC4C0000AE +:104B30009362000997640012937F000A304A00FFD5 +:104B4000308BFFFF014B48210009CC0033F000FF00 +:104B50000330C025ACB800048F8F00489788004010 +:104B60003103200010600103ACAF0008976F001202 +:104B700031E8FFFF06400101ACA8000C979000400F +:104B80003205000814A0000226280006262800028C +:104B90003C048000948B0E148C850E1C8F670004DF +:104BA000936A00023164FFFF314900FFAFA9001092 +:104BB0008F7F0014AFA80018AFBF00140E00019A39 +:104BC00000000000240400100E0001C800000000D6 +:104BD0008E92000016400005000000008F7900143E +:104BE0002405FFBF0325A024AF7400148F69000CB7 +:104BF0000135F821AF7F000C9375000816A000085E +:104C00000000000012600006000000008F6B00141E +:104C10003C0CEFFF3584FFFE01645024AF6A0014A2 +:104C2000A37300088FA700200A000316022020218A +:104C3000AED10E000A0001F83C05800014E0FF210F +:104C400030B9A0400E0001600000A0212E910001AB +:104C50000237B02512C000178FBF00488F85003C77 +:104C600024170F0010B700CD3C0480008C99017808 +:104C70000720FFFE24150F0050B500EB3C04800018 +:104C80008C890E14240502403C141000AC890144A8 +:104C90008C9F0E1CAC9F0148A0800152A480015A39 +:104CA000AC800160A4800158AC850154AC940178BB +:104CB0008FBF00488FB700448FB600408FB5003CCF +:104CC0008FB400388FB300348FB200308FB1002C16 +:104CD0008FB0002803E0000827BD00508F910038F6 +:104CE000979300403C1280000220A821326A0040C5 +:104CF0001540FF7D00009821976B00108F850038CC +:104D00003162FFFF104500A2000020210080A02199 +:104D1000108000E500E088211620FED2000000008F +:104D20000A0002E72E9100013C0380008C7F01788D +:104D300007E0FFFE240408008F860000AC640178C1 +:104D40003C038000946C008A318BFFFF0166502386 +:104D50002549FFFF31281FFF2D0200081440FFF9ED +:104D6000000000008F8E0048346F40008F83003CAD +:104D700000E0A021240D0F0025C70001AF870048E7 +:104D800000CF3021023488233C08800031D500FF59 +:104D9000106D000524070001939300423272000158 +:104DA0000012824036070001001514003C09010082 +:104DB00000492025ACC400008F9F004830B9003660 +:104DC00030B80008ACDF00041300009000F998250B +:104DD00095070E0A8F8E00003C03810030EDFFFF27 +:104DE00025CB000801A328253C0C1000316A1FFFC9 +:104DF000269200062406000EAD050160026C98257F +:104E0000A506015AAF8A0000A51201581620000815 +:104E10003C1080008F99003C24180F00533800028A +:104E200024170001367300400E0001593C10800029 +:104E30008E1F0E1402402021AE1F01448E120E1C44 +:104E4000AE120148A2150152AE1301540E000167C3 +:104E50003C151000AE1501780A000319000000008F +:104E600093780009976300129368000B330F00FFDB +:104E700001E33821310200FF00E2702125D0000A51 +:104E80003210FFFF0E0001B4020020218F8600487F +:104E90003C1941003C07800024CD0001AF8D004843 +:104EA000936C00099764001230C600FF318A00FF3E +:104EB000308BFFFF014B482100062C00253F0002EC +:104EC00000BFC02503197825AC4F00008F68000C87 +:104ED00094EE0E1401121825AC4300048CE50E1C50 +:104EE0008F670004936D000231C4FFFF31AC00FFF7 +:104EF000AFAC00108F620014AFB100180E00019A21 +:104F0000AFA200140A0002C502002021AF60000415 +:104F1000A3600002978D004031AC20001580FEABED +:104F200000003021A7600012979000409378000A9B +:104F30003C03800032191F000019798301F84021D9 +:104F400025070028A3670009946E0E0C0A00025E74 +:104F5000A76E00108F6E001435CD00400E00015971 +:104F6000AF6D00140A000291000000000A00031651 +:104F7000000020210641FF01ACA0000C8CB8000C01 +:104F80003C198000031990250A0002B2ACB2000C53 +:104F9000000090210A00028D2413000112800005F8 +:104FA0003C0D800095A60E0830D3004012600042F0 +:104FB000000000008C9001780600FFFE0000000059 +:104FC00094920E103C030500240720003258FFFF86 +:104FD00003037825AC8F014C8C880E143C0E100016 +:104FE000AC8801448C820E1CAC820148A080015226 +:104FF000A480015AAC800160A4800158AC870154A0 +:10500000AC8E01780A0002EE3C0480008F90000014 +:1050100026920002A5120158260F000831E81FFF52 +:105020000A000356AF880000AC80014C12800019C2 +:10503000000000008C8A0E10AC8A01448C830E188C +:105040003C0C800024160040AC8301488FBF004810 +:10505000A18001528FB70044A580015A8FB5003C52 +:10506000AD8001608FB40038A58001588FB3003443 +:10507000AD9601548FB200308FB600408FB1002C36 +:105080008FB000283C04100027BD005003E000084A +:10509000AD8401788C8B0E14AC8B01448C830E1C78 +:1050A0000A0003E43C0C80000E0001602E91000118 +:1050B0000A0002E80237B025000000000000000DE1 +:1050C000000000002400033A0A0003C03C048000F2 +:1050D00027BDFFE0AFBF001C3C1F20FF3C07600066 +:1050E0003C0980002402001037F9FFFDACE23008D3 +:1050F000AFB20018AFB10014AFB00010AD390E0060 +:10510000000000000000000000000000000000009F +:10511000000000003C1800FF3712FFFDAD320E000A +:105120003C0B60048D7050002411FF7F3C0E000288 +:105130000211782435EC380C35CD0109ACED4C1852 +:10514000240A0009AD6C50008CE80438AD2A000830 +:10515000AD2000148CE54C1C3106FFFF38C42F71C4 +:1051600000051E023062000F2486C0B31040000705 +:10517000AF8200088CE54C1C3C09001F3528FC0060 +:1051800000A81824000321C2AF8400048CF1080891 +:105190003C0F57092412F0000232702435F0001041 +:1051A00001D0602601CF68262DAA00012D8B0001B9 +:1051B000014B382550E00009A380000C3C02601C24 +:1051C0008C590008241F0001A39F000C33387C0079 +:1051D000A7980010A780000EA380000DAF800048A4 +:1051E00014C00003AF8000003C066000ACC0442C3B +:1051F0000E0004B63C1080000E000DDF0000000021 +:105200003C110800263138C83C12080026523948A3 +:105210008E05000038A30001306400011480FFFCFB +:10522000000000008E0601003C0C800A240AFF806A +:1052300024C7024030EB007F016C482100EA402483 +:10524000AE060020AF890044AE0800243C03800075 +:10525000AF86003C8C6D017805A0FFFE2419080084 +:10526000AC79017890780108A3980042938F0042AE +:1052700031EE000111C0000F240D0D0024C2F80012 +:105280002C5F030113E0001C000629C224A3FFF0D9 +:1052900000032042000431400E0001CF00D1D8218C +:1052A0003C0440003C068000ACC401380A000457AE +:1052B0000000000010CD0026240E0F0010CE002AA2 +:1052C0003C028008345F008093F90000240F0050F6 +:1052D000333800FF170FFFF33C0440000E000912A3 +:1052E000000000003C0440003C068000ACC40138D3 +:1052F0000A000457000000008F83000400A3402B25 +:105300001500000B8F8B0008006B50212547FFFF15 +:1053100000E5482B1520000600A36023000C29405F +:105320000E0001CF00B2D8210A00047C3C044000EA +:10533000000000000000000D00000000240003AD8C +:105340000E0001CF000000000A00047C3C04400075 +:105350003C1B0800277B3A480E0001CF00000000EC +:105360000A00047C3C0440003C1B0800277B3A6890 +:105370000E0001CF000000000A00047C3C04400045 +:10538000000411C003E00008244202403C0408006D +:1053900024843AAC2405001A0A00006D0000302174 +:1053A00027BDFFE0AFBF001CAFB20018AFB10014C3 +:1053B000AFB000103C108000920B01092412FF8056 +:1053C0000E0004B33164007F8F91003C00515021E6 +:1053D00001524024AE080024920301090E0004B3D8 +:1053E0003064007F24060080240700C024040040AD +:1053F000AE000810AE040814AE060818AE07081C6C +:10540000920C01090051F82133F8007F3C19800A01 +:10541000031910213184007F0E0004B3AF820044D1 +:105420008E1101003C0C008035850001022278219C +:1054300001F24824AE0908048E0E010035980002DE +:105440003609090001C2682131AB00780165502599 +:10545000AE0A08208E0501008E080100360509807D +:10546000010218212464004000923024AE0608088E +:105470008E07010000E2F82127F90040333200785E +:1054800002588825AE1108248E040100952F000CC7 +:105490008FBF001C8FB2001831EEFFFF000E69C0F5 +:1054A000AE0D0800AE0C0828952B000C8FB100142F +:1054B000316AFFFF000A41C0AE08002C8CA30050E7 +:1054C0008FB000108CA2003C8D2400048CA6001C20 +:1054D0008CA7003827BD0020AF830060AF8200504A +:1054E000AF84004CAF86005803E00008AF87005C33 +:1054F0003C0A0800914A3AD13C09080095293ACA69 +:105500003C051100000A3C002528000200E8302577 +:1055100000C5182524820008AC83000003E00008C1 +:10552000AC8000043C098000352809009107001177 +:10553000240200280080502130E300FF00A06821F1 +:1055400000C0602110620002340B86DD240B0800CD +:105550003C07800034E20A9A9443000034F80A9C25 +:1055600034E60AA03079FFFFAD5900008F0F00002C +:1055700034E80A8024040001AD4F00048CCE000002 +:10558000AD4E00089105001930A3000310640046D9 +:1055900028690002152000B5240400021064009060 +:1055A000240500031065009B34E40AA43C090800AC +:1055B00095293AC024070800516700503C18800024 +:1055C0003C0280003459090093280012932E0019E0 +:1055D00034580980310F00FF8F06002801EC182194 +:1055E000000338803124FFFF31CB00FF00E410219D +:1055F000000B2D0000A6C02500027C003C086000C6 +:105600000308182535E906FFAD430000AD49000445 +:105610008F2E002C3C0380003478093CAD4E0008EE +:105620008F27003025490028346E0900AD47000C53 +:105630008F2B0034AD4B00108F240038AD44001484 +:105640008F25001CAD4500188F220020AD42001CA4 +:105650008F26002425220014AD4600208F28002824 +:10566000AD4800248F0F0000AD2D0004AD2F0000C9 +:105670008C64010CAD24000891C700123C050800A1 +:1056800090A53AD0AD20001030EB00FF016C302126 +:1056900000066F000005CC0001B96025358AFFFFC8 +:1056A00003E00008AD2A000C3C09080095293AC027 +:1056B0003C19080097393ACA34E20AA43C060800AB +:1056C00094C63ABC944F00003123FFFF0323C0214E +:1056D00003067023000F3C0025C8FFF200E82825D0 +:1056E00024070800AD45000CAD400010AD4B001480 +:1056F0001567FFB3254A00183C18800037080900D9 +:10570000910F00119107001937030A8031EE00FF55 +:105710003C19080097393AC6946F002A000E588247 +:1057200030E400FF97870054000B160000042C00A3 +:105730003126FFFF0326C02100454825013870258A +:1057400001E758213C03400001C32025000B2C0039 +:10575000AD440000AD450004910200183C0600066F +:105760003C0380000002CE000326C025AD5800088F +:105770008D0F002C3478093C24E90001AD4F000C5A +:105780008D0B001C312E7FFF25490014AD4B0010FE +:105790008F0F0000AD2D0004A78E0054AD2F000028 +:1057A0008C64010C346E090025220014AD2400081D +:1057B00091C700123C05080090A53AD0AD2000101A +:1057C00030EB00FF016C302100066F000005CC00BB +:1057D00001B96025358AFFFF03E00008AD2A000CFF +:1057E00034E90AA495240000950200283C09080029 +:1057F00095293AC000041C000002CC0034788100D6 +:10580000032B7825AD58000CAD4F00100A00054061 +:10581000254A00143C09080095293AC03C050800B7 +:1058200094A53ACA3C06080094C63ABC9499000074 +:105830003123FFFF9518002800A31021004678238C +:1058400000193C000018440025EEFFEE010E28254B +:1058500034E48100AD44000CAD450010AD400014AF +:10586000AD4B00180A000540254A001C1460FF4F8C +:1058700034E60AA494CE00003C09080095293AC0F9 +:10588000000E4400010B3825AD47000C0A0005400E +:10589000254A001003E00008240207D027BDFFE0DE +:1058A000AFB20018AFB10014AFB00010AFBF001C12 +:1058B0000E00004D008088218F8800508F87004C9B +:1058C0003C05800834B20080011128213C10800082 +:1058D00024020080240300C000A72023AE02081881 +:1058E0003C068008AE03081C18800004AF850050F9 +:1058F000ACC500048CC90004AF89004C122000091B +:10590000360409800E0005F800000000924C0027C4 +:105910008E0B007401825004014B3021AE46000C06 +:10592000360409808C8E001C8F8F005801CF6823AD +:1059300019A000048FBF001C8C90001CAF90005871 +:105940008FBF001C8FB200188FB100148FB00010F1 +:105950000A00004F27BD00208F8600608F83005013 +:105960008F82004C3C05800834A40080AC86005037 +:10597000AC83003C03E00008ACA200043C03080038 +:105980008C63005427BDFFF8308400FF24620001BF +:1059900030A500FF3C010800AC22005430C600FFD7 +:1059A0003C0780008CE801780500FFFE3C0A7FFF81 +:1059B000A3A400038FA400003549FFFF0089182429 +:1059C000000647C000681025AFA2000090F9010A48 +:1059D000A3A000023C1880FFA3B900018FAE000015 +:1059E00030AD007F370FFFFF01CF5824000D660058 +:1059F0003C090020016C5025352620002405FF803D +:105A00003C04100027BD0008ACEA014CACE6015490 +:105A1000A4E00158A0E5015203E00008ACE40178DD +:105A2000308800FF3C03800030A400FF8C620178C6 +:105A30000440FFFE000000003C03800034660A00C2 +:105A40008CCA0020346709800004482BAC6A0144EA +:105A50008CC5002400091540AC650148A0680150C0 +:105A600090E4004CA064016D03E00008A4600158BC +:105A700027BDFFE8308400FFAFBF00100E00065BBB +:105A800030A500FF8F8300508FBF00103C058000C1 +:105A9000344600402404FF903C02100027BD00184B +:105AA000ACA3014CA0A40152ACA6015403E0000831 +:105AB000ACA2017827BDFFE03C088008AFBF001C06 +:105AC000AFB20018AFB10014AFB0001035100080B5 +:105AD0008E0600183C078000309200FF00C720258A +:105AE000AE0400180E00004D30B100FF9203000517 +:105AF000346200080E00004FA2020005024020217F +:105B00000E00066F02202821024020218FBF001CBA +:105B10008FB200188FB100148FB00010240500055B +:105B2000240600010A00063227BD00203C05800043 +:105B300034A309809066000830C200081040000FAE +:105B40003C0A01013549080AAC8900008CA80074A0 +:105B5000AC8800043C07080090E73AD030E500101C +:105B600050A00008AC8000083C0D800835AC0080D7 +:105B70008D8B0058AC8B00082484000C03E00008D7 +:105B8000008010210A0006B22484000C27BDFFE823 +:105B90003C088000AFB00010AFBF0014350609808C +:105BA00090C70009240200063509090030E300FF10 +:105BB0000080802100A06021240B00041062007985 +:105BC0002407000294CF005C3C0E020431EDFFFF7D +:105BD00001AE5025AE0A000090C5000830A4002098 +:105BE000108000080000000090C2004E3C1F01031E +:105BF00037F90300305800FF03193025240B000843 +:105C0000AE06000491390011912600129124001172 +:105C1000333800FF0018708230CF00FF01CF5021D1 +:105C2000014C6821308800FF31AAFFFF39030028AA +:105C3000000A28801460002B0205402391240012E2 +:105C40003C0E800035D90980308500FF00AC18215A +:105C500000031080004BF821001F8400360906FF66 +:105C6000AD09000435C9090091260011912F0012D9 +:105C7000000BC0828F2B003431ED00FF8DC4010C6E +:105C800001AC282100B810210164F823000784002A +:105C900000021F000070C82533E9FFFF30CF00FC71 +:105CA000032970250158202101E868210004508053 +:105CB000ADAE000C0E00004D010A80213C078008AB +:105CC000240C000434EB00800E00004FA16C00098E +:105CD000020010218FBF00148FB0001003E00008F5 +:105CE00027BD001891250011912300193C180800C8 +:105CF00097183AC630A200FF0002F882307000FF09 +:105D0000001FCE0000104C000329302500D870255C +:105D10003C0F400001CF68253C0E8000AD0D000017 +:105D200035C9090091260011912F001235D909803B +:105D3000000BC08231ED00FF8F2B00348DC4010CAD +:105D400001AC282100B810210164F8230007840069 +:105D500000021F000070C82533E9FFFF30CF00FCB0 +:105D6000032970250158202101E868210004508092 +:105D7000ADAE000C0E00004D010A80213C078008EA +:105D8000240C000434EB00800E00004FA16C0009CD +:105D9000020010218FBF00148FB0001003E0000834 +:105DA00027BD00180A0006C42407001227BDFFD033 +:105DB000AFB50024AFB40020AFB3001CAFB00010EB +:105DC000AFBF0028AFB20018AFB100143C0680008E +:105DD00090C3010B309300FF30B400FF30620030FD +:105DE0000000A821104000820000802134C40980F6 +:105DF0009088000800083E0000072E0304A000A9B8 +:105E0000240400048F8700503C010800A0243AD0ED +:105E10003C0C8000AD8000483C038000906E010B7C +:105E200031C5002010A000073C0C800034780980A8 +:105E30009312000800128E0000117E0305E000AEF0 +:105E40003C028008918B010B3586098090C40008C4 +:105E5000316A0040000A482B3088000824110003F2 +:105E60001500000200E99023000088213C03800017 +:105E700034780A80346A09009707002C9144001195 +:105E80009149001293050018309F00FF312800FF50 +:105E9000022810210002C880930D0018033F7821CA +:105EA00001F0702130B000FF01D01821A787005405 +:105EB0003C010800A42E3AC63C010800A4233AC8BD +:105EC00015A00003246B000A0000000D246B000ADB +:105ED0003170FFFF3C010800A4233ACA3C010800CE +:105EE000A4203AC03C010800A4203ABC0E0001B432 +:105EF000020020210E00050F00402021004020213B +:105F0000024028210E00051C022030210E00069EB2 +:105F10000040202116A0005F004020210E0001C893 +:105F2000020020213C11080092313AD032350003A2 +:105F300012A000163C0A80088F8700503C0E800893 +:105F400035CD008024EC0001ADAC003C3C05800860 +:105F50008CA600040180202100CC90231A4000026E +:105F6000AF8C00508CA400040E0005F8ACA4000413 +:105F70003C1980008F3800743C0F800835F0008099 +:105F800000582821AE05000C3C0A800835420080EC +:105F90000260202102802821A040006B0E00065BD9 +:105FA0003C1380008F840050345F0006AE64014CC7 +:105FB0008F8800483C1410008FB50024250900018B +:105FC000AF8900488FB20018A26801528FB1001447 +:105FD000AE7F01548FB00010AE7401788FBF0028DF +:105FE0008FB400208FB3001C03E0000827BD0030F1 +:105FF00034C30980906F0008000F7600000E6E0316 +:1060000005A0003334C209009059001B241F001062 +:106010003C010800A03F3AD0333800021300FF7E55 +:106020008F8700508F83005C1467FF7C3C038000E7 +:106030000E00004D000000003C098008352500805E +:1060400090A4000924070016308800FF1107000DF6 +:106050000000000090A600093C0C0800918C3AD08A +:10606000240A000830C400FF358B00013C01080001 +:10607000A02B3AD0108A002F240D000A108D002882 +:106080002402000C0E00004F000000000A00075917 +:106090008F8700500E0006B6022028210A00079ABA +:1060A000000000003C0B8008356A00808D470054DA +:1060B0008CC9010C1120FF54AF8700502406001436 +:1060C0003C010800A0263AD00A0007583C0C80008A +:1060D00090710008241200023C010800A0323AD05E +:1060E000323000201200000B241500018F87005071 +:1060F0000A00075924100008345900808F23003803 +:10610000AC4300048C5F0004AF3F003C0A0007640E +:106110003C0C80008F8700500A00075924100004AF +:10612000A0A200090E00004F000000000A0007595D +:106130008F870050240200140A00081CA0A2000946 +:1061400027BDFFE8AFBF0014AFB000103C108000C7 +:1061500092020109240500010E00065B304400FF95 +:106160003C1F800893F8000E37E3008093F9000F7E +:10617000906E002693E9000A332F00FF0018660096 +:10618000000F6C0031CB00FF018D5025000B320059 +:1061900001463825312800FF3445600000E82025FD +:1061A0002402FF813C031000AE04014C8FBF001499 +:1061B000AE050154A2020152AE0301788FB0001067 +:1061C00003E0000827BD001827BDFFE8308400FF6A +:1061D000AFBF00100E00065B30A500FF3446004044 +:1061E0003C0480002405FF92AC860154A085015236 +:1061F0008F8300508FBF00103C02100027BD001895 +:10620000AC83014C03E00008AC82017827BDFFD8C5 +:10621000AFB20018AFB10014AFB00010AFBF002094 +:10622000AFB3001C3C07800090E20109308600FFFC +:1062300030B000FF000618C23204000230710001C5 +:1062400014800007305200FF3C098008353300807D +:10625000926800053105000810A0000C30CA00103B +:10626000024020210E000680022028212402000185 +:106270008FBF00208FB3001C8FB200188FB10014A5 +:106280008FB0001003E0000827BD00281540003043 +:1062900034E50A008CB900248CB800081338004794 +:1062A000000040213C0E800835D30080926D0068CC +:1062B000240B000231AC00FF118B00803C068000F3 +:1062C000927F004C90C40109509F00043213007C5F +:1062D00011000067000000003213007C1660005AB5 +:1062E0000240202116200008320C00013C078000EB +:1062F00034EB0A008D6500248CE8010414A8FFDC4F +:1063000000001021320C00011180000D02402021FC +:106310003C1080008E0E010C8F8D006011CD0008A6 +:10632000000000000E00073E022028218E0F010C05 +:106330003C18800837100080AE0F0050024020212A +:106340000E00066F022028210A00086F24020001B7 +:106350003C0708008CE7006424E600013C010800CB +:10636000AC2600641600000D000000000220282169 +:106370000E00066F02402021926F0068240D00027B +:1063800031EE00FF11CD0022024020210E00082333 +:10639000000000000A00086F240200010E00004106 +:1063A00024040001926C0025020C58250E00004FB9 +:1063B000A26B00250A0008AF022028218E63001876 +:1063C0008CE401048CBF002400031602149FFFB567 +:1063D0003045007F9269004C264400013093007FD5 +:1063E00012650040312300FF1464FFAF3C0E8008AB +:1063F000264800013111007F310200FF1225000BF9 +:1064000024080001004090210A00087C24110001AA +:10641000240500040E000632240600010E000823A5 +:10642000000000000A00086F240200012407FF801A +:106430000247282400A79026324200FF0040902106 +:106440000A00087C241100010E00073E02202821CA +:106450003206003010C0FFA332100082024020211B +:106460000E000680022028210A00086F2402000185 +:106470008E6300180240202102202821006610258A +:106480000E000845AE6200189264004C240500031B +:10649000240600010E000632308400FF0E00004189 +:1064A00024040001926A0025020A48250E00004FCC +:1064B000A26900250A00086F240200018E780018E6 +:1064C0003C19800002402021031978250220282150 +:1064D0000E00066FAE6F00189264004C0A0008F7B9 +:1064E000240500043246008038CA0080146AFF6E1A +:1064F0003C0E80080A0008D02648000127BDFFC0D6 +:10650000AFB000183C108000AFBF0038AFB7003408 +:10651000AFB60030AFB5002CAFB40028AFB3002445 +:10652000AFB200200E0004BBAFB1001C9204010802 +:106530009205010B308400FF0E00085630A500FFC5 +:10654000144000E38FBF00383C09800835280080E4 +:10655000A100006B3607098090E60000240200507D +:106560003C17080026F73A8830C300FF3C130800A8 +:1065700026733A98106200033C1080000000B82196 +:1065800000009821241F001036110A0036140980DB +:106590008E1601048F8D00508E38002436190A8023 +:1065A0008E9200203C010800A03F3AD0972C002C8E +:1065B0008EF50000932B0018024D702302D878232B +:1065C0003C010800AC2F3AAC3C010800AC2E3AB0BC +:1065D0003C010800AC2D3AD4A78C005402A0F80965 +:1065E000317200FF304A0002154000E630450001DC +:1065F00010A000C100000000928A0008315000087D +:1066000016000002241400030000A0213C068000B4 +:1066100034C4090034C30A008C6E00249085001134 +:10662000908200129099001130B800FF305100FFA5 +:106630000291F821001FB080332F00FF02D85821AB +:10664000024FA82126AC0010017268213C15800081 +:106650003C010800AC2E3AD83C010800A42D3AC8F1 +:106660003C010800A42C3AC43C010800A42B3AC603 +:1066700036B609808F8700508F8900588ED200204F +:106680002408000601273023024728233C01080084 +:10669000AC283ACC04C000B30000902104A000B1A3 +:1066A00000C5802B120000B3000000003C01080070 +:1066B000AC263AB08E7100000220F80900000000FC +:1066C000304A00021540007400408021304B000128 +:1066D000556000118E7100043C0D08008DAD3AB478 +:1066E0003C0EC0003C04800001AE6025AEAC0E0044 +:1066F0008C980000330F000811E0FFFD000000003F +:10670000949F0E0824120001A79F00408C990E044C +:10671000AF9900388E7100040220F80900000000D3 +:106720000202802532020002144000A9000000008D +:106730003C08080095083ABC3C11080096313AC85C +:106740003C09080095293ABE3C0308008C633AB422 +:10675000011168213C1F08008FFF3AD83C07080050 +:1067600094E73AD23C11800001A920218E38010C17 +:10677000006828212499000200A7702103E37821F2 +:10678000AF9800603C010800AC2F3AD83C010800EB +:10679000A42E3AC03C010800A42D3ACA0E0001B450 +:1067A0003324FFFF8F8C0048004020213C0108006B +:1067B000A02C3AD18E620008258B0001AF8B0048D7 +:1067C0000040F809000000008F8500500280302151 +:1067D0000E00051C004020210E00069E00402021D6 +:1067E0008E6A000C0140F809004020213C08080096 +:1067F00095083ACA3C09080095293ABE0109382192 +:1068000024E600020E0001C830C4FFFF3C0408006B +:106810008C843AAC3C0308008C633AB40083282390 +:106820003C010800AC253AAC14A0000600000000B2 +:106830003C0A08008D4A3ACC354600403C0108002D +:10684000AC263ACC124000418F8C00448E2B0E10A7 +:106850008F920044AE4B00208E220E18AE420024D0 +:106860003C04080094843AC00E0005FA00000000C1 +:106870008F9900508E7800103C010800AC393AD452 +:106880000300F809000000003C0F08008DEF3AAC4F +:1068900015E0FF798F870050979400543C13800EC9 +:1068A000321500100E000629A674002C56A00044D4 +:1068B0008EF60004321F004057E0001D8EF00008E5 +:1068C0008EE3000C0060F809000000008FBF003864 +:1068D0008FB700348FB600308FB5002C8FB40028EE +:1068E0008FB300248FB200208FB1001C8FB000182E +:1068F00003E0000827BD0040920901098F88003C91 +:1069000000093E0000E83025AE0600808E230020FE +:106910008E240024AFA30010AE030E148FA200102B +:10692000AE020E10AE040E1C0A000951AE040E1881 +:106930000200F809000000008EE3000C0060F80976 +:10694000000000000A000A078FBF0038240E000173 +:10695000240D0001A5800020A58E00220A0009EB6D +:10696000AD8D00243C010800AC203AB00A0009813A +:106970008E7100003C010800AC253AB00A00098184 +:106980008E71000092110109000028210E00066F8F +:10699000322400FF8FBF00388FB700348FB600302D +:1069A0008FB5002C8FB400288FB300248FB2002045 +:1069B0008FB1001C8FB0001803E0000827BD004015 +:1069C00002C0F809000000000A000A01321F00405E +:1069D0005240FFB2979400548EB60E148F93004429 +:1069E000AE7600208EB40E1CAE7400240A0009FAA4 +:1069F000979400548F8200140004218003E0000863 +:106A0000008210213C07800834E200809043006936 +:106A100000804021106000093C0401003C07080090 +:106A20008CE73AD48F83003000E3202304800008F1 +:106A30009389001C14E300030100202103E00008F7 +:106A4000008010213C04010003E0000800801021B8 +:106A50001120000B006738233C0D800035AC098005 +:106A6000918B007C316A000211400020240900341F +:106A700000E9702B15C0FFF10100202100E9382347 +:106A80002403FFFC00A3C82400E3C02400F9782BF2 +:106A900015E0FFEA0308202130C40003000410239E +:106AA00014C00014304900030000302100A97821EF +:106AB00001E6702100EE682B11A0FFE03C0401000C +:106AC0002D3800010006C82B010548210319382480 +:106AD00014E0FFDA2524FFFC2402FFFC00A21824A6 +:106AE0000068202103E00008008010210A000A6FDE +:106AF000240900303C0C80003586098090CB007C56 +:106B0000316A00041540FFE9240600040A000A7EE9 +:106B1000000030213C0308008C63005C8F82001869 +:106B200027BDFFE8AFBF001410620005AFB0001032 +:106B3000000329C024A40280AF840014AF8300188E +:106B40003C10800036030A00946500320E000A50A3 +:106B500030A43FFF8E0401003C180080370F000373 +:106B60000082C8212402FF80032260243329007F91 +:106B7000000CF94003E94025332E00783C0D10004D +:106B8000010D502501CF5825AE0C0028360809808C +:106B9000AE0C080CAE0B082CAE0A0830910300694D +:106BA0003C06800C0126382110600006AF870034B7 +:106BB0008D09003C8D06006C0126382318E0007F0B +:106BC000000000003C0C8008358B00803C0A8000EF +:106BD000A1600069355009808E0200383C068000B3 +:106BE00034C50A0090AD003C31A800201100001906 +:106BF000AF820030240E00013C19800037300A00BB +:106C0000A38E001CAF8000248E0400248F850024F6 +:106C100024180008AF800020AF8000283C01080045 +:106C2000A4383ABE3C010800A4203AD20E000A540F +:106C300000003021920F003C8FBF00148FB0001075 +:106C4000000F7142AF82002C27BD001803E000083E +:106C500031C2000190B90032240F0001333800FF27 +:106C600000182182108F003F241F0002109F006235 +:106C700034C20AC03C03800034640A008C990024AA +:106C80001720001D3466090090830030241F000582 +:106C90003062003F105F004C240500018F86002009 +:106CA000A385001CAF860028AF8600243C19800015 +:106CB00037300A008E0400248F8500242418000831 +:106CC0003C010800A4383ABE3C010800A4203AD296 +:106CD0000E000A5400000000920F003C8FBF001409 +:106CE0008FB00010000F7142AF82002C27BD00183A +:106CF00003E0000831C200018C8800088C8D00245C +:106D00008CCB00643C19800037300A00AF8B002424 +:106D1000A380001C8E0400248F8600208F85002411 +:106D2000010D602324180008AF8C00283C010800E6 +:106D3000A4383ABE3C010800A4203AD20E000A54FE +:106D400000000000920F003C8FBF00148FB00010B5 +:106D5000000F7142AF82002C27BD001803E000082D +:106D600031C2000190A7003030E3003F506400289A +:106D700034C50AC08CAA00241540002234C809007A +:106D80008CAB00483C0C7FFF3585FFFF016510246C +:106D90003C188000AF820020370509008F8E00204C +:106DA0008CAF006001CF682B15A0000201C020212C +:106DB0008CA400600A000AF0AF8400208D02006CF1 +:106DC0000A000ACB3C0680008C8900488F86002090 +:106DD0003C0A7FFF3550FFFF013038243C04800817 +:106DE00024050001AF870028AC80006CA385001C3F +:106DF0000A000AFEAF8600248C4400140A000AF040 +:106E0000AF8400208D0200680A000B383C18800017 +:106E100034C409808C8600708CB0001400D0482BDC +:106E200011200004000000008C8200700A000B3862 +:106E30003C1880008CA200140A000B383C1880001B +:106E40008F85002427BDFFE0AFBF0018AFB100144D +:106E500014A00008AFB000103C04800034870A0082 +:106E600090E600302402000530C3003F106200B7F6 +:106E7000348409008F91002000A080213C04800010 +:106E8000348E0A008DCD00043C0608008CC63AB052 +:106E900031A73FFF00E6602B5580000100E0302164 +:106EA000938F001C11E0007600D0102B34990980DC +:106EB0009338007C330400021080007724030034F0 +:106EC00000C3F82B17E000D600C3302300D0102BEE +:106ED0003C010800A4233ABC1440006D02001821B4 +:106EE0003C0408008C843AAC0064282B54A00001B8 +:106EF000006020213C05800034A90A009128003C54 +:106F00003C010800AC243AB43103002014600002B4 +:106F1000000048218CA90E188F88002C0128502BC6 +:106F20001140005F000000003C0508008CA53AB449 +:106F300000A96021010C582B1160005C00B0682B87 +:106F40000109382300E028213C010800AC273AB4AD +:106F5000120000032402FFFC10B0008C322A000350 +:106F600000A2F8243C010800A4203AD23C01080009 +:106F7000AC3F3AB403E028218F84002412040006B9 +:106F80003C0380088C6A006C02002021AF91002035 +:106F900025500001AC70006C8F8B00280085882381 +:106FA000AF91002401652023AF8400281220000245 +:106FB00024070018240700103C0E800835C6008006 +:106FC00090CD0068240C00013C010800A0273AD0B5 +:106FD00031A700FF10EC00470000000014800018EB +:106FE000000028213C0B8000916501093571098062 +:106FF0008E23001830A500FF0003560224A30001D1 +:107000003146007F3070007F1206007E240CFF8026 +:107010003C0F800835E90080A123004C3C080800A3 +:107020008D083ACC240E00023C010800A02E3B1132 +:10703000350D00083C010800AC2D3ACC24050010A9 +:107040003C1F800037E40A009099003C3338002050 +:107050001300000500A02021240200013C010800CB +:10706000AC223AB434A400018FBF00188FB10014D1 +:107070008FB000100080102103E0000827BD002021 +:107080003C010800A4203ABC1040FF9502001821E2 +:107090000A000B8B00C018210A000B832403003068 +:1070A0003C0508008CA53AB400B0682B11A0FFA8DD +:1070B000000000003C04080094843ABC008578215C +:1070C00001E7702B11C000072CA200043C1F6000D8 +:1070D0008FF954043338003F1700FFE324040042C3 +:1070E0002CA200041040FF9A240400420A000BEE78 +:1070F0008FBF00181528FFB9000000008CC20018CF +:107100003C188000241900020058F825ACDF001854 +:1071100037040A00A0D900689089003C240F0004BD +:1071200000A01021312800203C010800A02F3B11B5 +:107130001100000224050010240200013C01080097 +:10714000AC223AAC0A000BE43C1F80008F88002878 +:107150008C8900600109282B14A0000201008821FD +:107160008C9100603C0B80008D640E18240A000195 +:107170000220282102203021A38A001C0E000A547C +:10718000022080210A000B72AF82002C000A182313 +:1071900012200007306400033C0D800035A70980F1 +:1071A00090EC007C318B000415600019248E0004E3 +:1071B0003C010800A4243AD23C18080097183AD29F +:1071C0000305202100C4782B11E0FF6C8F8400247C +:1071D0002CA6000514C0FFA42404004230B900030B +:1071E0001720000200B9182324A3FFFC3C0108006B +:1071F000AC233AB43C010800A4203AD20A000BB1F7 +:107200000060282100AC38240A000BD700EC1826B7 +:107210003C010800A42E3AD20A000C4100000000F4 +:107220003C010800AC203AB40A000BED24040042F3 +:107230008F8300283C0B8000356A0A00146000062A +:1072400000001021914600302405000530C400FFE5 +:10725000108500030000000003E0000800000000AB +:1072600091490048312800FF000839C214E0FFFAB4 +:107270003C0480083C06080094C63ABC3C03080065 +:107280008C633AD43C0508008CA53AB43C1808003D +:1072900097183AD20066C8218C8E00040325782105 +:1072A00001F8682101AE60231980001D0000000074 +:1072B0009158004C8F8D0034956E0E10330F00FFE7 +:1072C0008DA9000401CF30238DAA000030CFFFFF2D +:1072D000000F6100012C28210000382101472021E6 +:1072E00000AC182B0083C821ADA50004ADB9000087 +:1072F00091B8000A01F87021A1AE000A956C0E1237 +:107300008F8A0034A54C00089549003825280001D3 +:10731000A54800389147000D34EB0008A14B000D43 +:1073200003E000080000000027BDFFD8AFB0001840 +:10733000938F001C8FB000143C087FFF8F870024C0 +:107340003C0C80003518FFFFAFBF0020AFB1001C20 +:1073500035990A0002181824932A003C000F5FC0D8 +:107360003C02BFFF2CF000013449FFFF006BF82501 +:107370003C0808008D083AD48F9900303C1808006A +:1073800097183ACA03E9582400107F803C07EFFFA2 +:107390003C05F0FF016F18253C11800031490020A9 +:1073A00034E2FFFF34ADFFFF362E098027A5001021 +:1073B0002406000201194023270A00020062182453 +:1073C0000080802115200002000058218D8B0E1CAA +:1073D000A7AA00120500003A2407000030EF00FFC2 +:1073E000000F3F00006740253C028008AFA8001452 +:1073F000344B0080916A00683C0F080091EF3AD14D +:107400003C09DFFF353FFFFF000A602B3C0208000C +:1074100094423AC4A3AF0011011FC024000CCF4016 +:10742000031918258FA70010AFA300143C1F0800F4 +:1074300093FF3AD3A7A200168FA8001400ED4824AA +:107440003C0B01003C0A0FFF012BC82533F8000359 +:10745000354CFFFF010D78243C027000032C3824CA +:1074600000181E0000E2482501E35825AFAB0014C8 +:10747000AFA9001091DF007CA3BF00150E000063D0 +:1074800000000000362D0A0091A6003C30C4002008 +:1074900010800006260200083C11080096313AC010 +:1074A000262EFFFF3C010800A42E3AC08FBF00200B +:1074B0008FB1001C8FB0001803E0000827BD002822 +:1074C0008F8A002C016A602B5580FFC424070001BD +:1074D0000A000CCB30EF00FF9383001C3C028000BD +:1074E00027BDFFD834480A0000805021AFBF0020DC +:1074F00034460AC0010028211060000E344409807F +:1075000091070030240B00058F89002030EC003FEC +:10751000118B000B00003821AFA900103C0B800834 +:107520008D69006CAFAA00180E00012BAFA90014E2 +:10753000A380001C8FBF002003E0000827BD0028A7 +:107540008D1F00483C1808008F183AB48F99002806 +:107550003C027FFF8D0800443443FFFFAFA90010B9 +:107560003C0B80088D69006C03E3702403197821BB +:1075700001CF682301A83821AFAA00180E00012B03 +:10758000AFA900140A000D20A380001C3C05800058 +:1075900034A60A0090C7003C3C06080094C63AD2C4 +:1075A0003C0208008C423ACC30E300200006240064 +:1075B0001060001E004438253C0880083505008016 +:1075C00090A3006800003021240800010000202161 +:1075D000240300013C0580008CAC01780580FFFE8F +:1075E00000000000ACA80148A4A40144A4A30146E3 +:1075F0003C0308008C633AD43C188008370F0080A5 +:10760000ACA3014C3C19080093393AD13C0D100051 +:10761000A0B90152ACA70154A4A6015891EE004CA8 +:10762000A0AE016D03E00008ACAD01788CA80E1C83 +:107630003C0B08008D6B3AB494AA0E1694A90E1454 +:10764000016630213143FFFF0A000D483124FFFF5E +:107650003C04800034830A009065003C30A2002086 +:107660001040001C0000000000003021000020211C +:10767000000018213C0580008CA901780520FFFE40 +:1076800000000000ACA601483C0E08008DCE3AD4A4 +:10769000240DFF91240C00403C0B8008A4A301445E +:1076A000356A0080A4A40146ACAE014CA0AD0152E5 +:1076B000ACAC0154A4A0015890A301099144004C22 +:1076C00090A601093C041000A0A6016D03E000088B +:1076D000ACA401788C860E1894880E1294870E1034 +:1076E0003104FFFF0A000D7030E3FFFF3C0480000F +:1076F00034830A009065003C30A200201040002630 +:1077000027BDFFF8240900010000382124080001EA +:107710003C0680008CC401780480FFFE000000005D +:1077200090CA01093C04080090843B113C1880FF7A +:10773000A3AA00038FA300003085007F370FFFFF4F +:1077400000661025AFA2000090D9010AA3A0000294 +:1077500000056E00A3B900018FAE0000240A3000BE +:1077600027BD000801CF6024018D5825ACCB014C0A +:10777000ACCA0154A4C00158ACC90148A4C7014413 +:107780002409FF80A4C801463C081000A0C901528A +:1077900003E00008ACC801788C890E1894870E129B +:1077A00094860E1030E8FFFF0A000D9730C7FFFFE8 +:1077B00027BDFFE8AFB000103C108000AFBF001441 +:1077C00036180A00970F00320E000A5031E43FFFCE +:1077D0008E0E0100240DFF803C04200001C25821C0 +:1077E000016D6024000C4940316A007F012A402568 +:1077F000010438253C048008AE0708303486008038 +:1078000090C500682403000230A200FF104300046A +:107810008F9F00208F990024AC9F0068AC99006472 +:107820008FBF00148FB0001003E0000827BD0018C0 +:107830003C0A0800254A359C3C09080025293638B1 +:107840003C08080025082A603C07080024E736FCAD +:107850003C06080024C634243C05080024A5317CDD +:107860003C04080024842D8C3C030800246334D895 +:107870003C020800244232743C010800AC2A3A90D1 +:107880003C010800AC293A8C3C010800AC283A883D +:107890003C010800AC273A943C010800AC263AA40D +:1078A0003C010800AC253A9C3C010800AC243A9805 +:1078B0003C010800AC233AA83C010800AC223AA0E5 +:0878C00003E0000800000000D5 +:0878C800800009408000090066 +:1078D000800801008008008080080000800E000001 +:1078E000800800808008000080000A8080000A0074 +:0878F0008000098080000900FE +:00000001FF +/* + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ diff --git a/firmware/bnx2/bnx2-rv2p-06-4.6.16.fw.ihex b/firmware/bnx2/bnx2-rv2p-06-4.6.16.fw.ihex deleted file mode 100644 index 871de9e..0000000 --- a/firmware/bnx2/bnx2-rv2p-06-4.6.16.fw.ihex +++ /dev/null @@ -1,441 +0,0 @@ -:100000000000000000000CA00000005800000000EC -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000DE000000CF80000000500000000CA -:1000400000000000000000000000000000000000B0 -:080050000000000000000000A8 -:0800580000000010B18000025D -:100060000000001F0103010000000008AC000001B7 -:1000700000000000050000000000000C2F800001BF -:10008000000000002B000000000000002B8000009A -:1000900000000010203F006300000010213F00031B -:1000A0000000001020BF0032000000188000FFFD9B -:1000B00000000010B1B8B00D0000000B2FDF0002EF -:1000C0000000000003D80000000000002C380000F1 -:1000D0000000001091D400000000000806005555F3 -:1000E0000000001880000075000000188000010B5F -:1000F00000000008020000020000000F42E0001CA7 -:100100000000001091840A11000000102C62000B06 -:10011000000000188000001E00000008020000021D -:100120000000000F42E0001C0000001091840A183B -:10013000000000082C8000B1000000082D0000091C -:100140000000001091D40000000000082D8001077D -:10015000000000188000006F0000001880000015EB -:1001600000000008B1000001000000082C8000B071 -:10017000000000082D000008000000082D8000018C -:1001800000000018800000690000000B2FDF000253 -:100190000000000C1F800002000000002C0700007F -:1001A0000000001091DE00000000000005000000CB -:1001B000000000188000FFDC0000000B2FDF0002B1 -:1001C0000000000C1F800000000000002C07000051 -:1001D0000000001091DE000000000000050000009B -:1001E000000000188000FFD60000000C1F800002F5 -:1001F0000000000005000000000000188000FFD390 -:100200000000000C298000020000000C1F8000028A -:10021000000000002ADF0000000000082A0000059E -:100220000000000805005555000000188000FFCDB3 -:10023000000000080224003C000000180004000038 -:10024000000000188000001C000000188000001E44 -:100250000000001880000052000000188000009E7E -:10026000000000188000009D0000001880000000C1 -:10027000000000188000000000000018800000004E -:10028000000000188000000000000018800000003E -:10029000000000188000000000000018800000002E -:1002A000000000188000000000000018800000DF3F -:1002B000000000188000000000000018800000000E -:1002C0000000001880000015000000188000001BCE -:1002D000000000188000000000000018800000B43A -:1002E000000000188000002E00000018800000DFD1 -:1002F000000000188000010A00000018800000D5EE -:10030000000000188000012E000000188000003B53 -:10031000000000188000000000000018800000713C -:100320000000000C1F80000100000000050000001C -:10033000000000188000FFAC0000001091D4000005 -:100340000000000C298000010000000C1F8000014B -:10035000000000082A000002000000000500000064 -:10036000000000188000FFA60000001091D40000DB -:100370000000000C298000010000000C1F8000011B -:100380000000000029420000000000082A000002CE -:100390000000000005000000000000188000FF9F22 -:1003A000000000188000FF9E00000010B1BCB00AE1 -:1003B0000000000B2FDF00020000000003D8000047 -:1003C000000000002C3C00000000001091D4000050 -:1003D00000000008060055550000001880000016B7 -:1003E00000000018800000AC000000102C6201BA70 -:1003F0000000001880000005000000082C8000B1FB -:10040000000000082D0000090000001091D4000039 -:10041000000000082D8001070000000C298000006A -:100420000000000C1F8000000000001091DE0000A2 -:10043000000000002ADF0000000000082A0000067B -:100440000000000805005555000000188000FF89D5 -:100450000000001091D400000000000C2980000171 -:100460000000000C1F800001000000082A00000BA3 -:100470000000000005000000000000188000FF835D -:1004800000000018000200000000000006820000CA -:1004900000000010B18A000600000000860C140065 -:1004A00000000010B18C00040000000005000000F6 -:1004B000000000082A0000010000001091D4000094 -:1004C00000000018000D0000000000000502000000 -:1004D0000000001091DE000000000018000A00007B -:1004E00000000010B1A0B0130000000B2FDF0002CD -:1004F000000000002C200000000000082C800000FC -:10050000000000082D0000000000001091D4000041 -:100510000000000806005555000000188000FFEE9E -:10052000000000082D80011C00000010001F0000CA -:100530000000001091DE00000000000F476000087E -:100540000000000F060E0001000000000F58000020 -:10055000000000000A640000000000000AE500003E -:10056000000000090B66FFFF000000000D610000A5 -:1005700000000018800000130000000F4760000812 -:100580000000000B2FDF0002000000082C8000009C -:10059000000000082D0000000000001091D40000B1 -:1005A000000000082D80011C0000000F060E000155 -:1005B00000000010001F0000000000000F580000A5 -:1005C0000000001091DE0000000000000A6400003E -:1005D000000000000AE50000000000090B66FFFFB4 -:1005E000000000000D610000000000000262000039 -:1005F0000000000B2FDF00020000000031040000AB -:1006000000000000309A0000000000000C96180066 -:10061000000000090C99FFFF00000004CC99340091 -:1006200000000010B1963202000000080F800000A8 -:100630000000000C298000010000001000220002D0 -:100640000000000C295200010000000C295200009B -:10065000000000080200000E000000080280001ADE -:1006600000000010B1C40A020000000802000003EC -:1006700000000008220000010000000C1F800001A3 -:10068000000000002ADF0000000000002A0008002F -:100690000000000805005555000000188000FF3FCD -:1006A0000000000B2FDF00020000001091D40000BA -:1006B000000000082A000001000000002C200000BB -:1006C000000000082C800000000000082D00000041 -:1006D000000000082D80011C0000001091D40000D3 -:1006E0000000001091DE0000000000082C800006D1 -:1006F000000000082D00000600000000308000000F -:100700000000000031000000000000082D800006FD -:100710000000000C298000010000000C1F80000177 -:100720000000001091DE0000000000002ADF000041 -:10073000000000082A000010000000000500000072 -:10074000000000188000FF2A0000001091A0B009EE -:10075000000000082C8000B1000000082D000009F6 -:100760000000001091D40000000000082D80010757 -:10077000000000188000FFAB00000018800000108F -:1007800000000008AC000001000000188000000B11 -:10079000000000000380B0000000000B2FDF00020B -:1007A000000000002C0040000000001091D4000068 -:1007B0000000000806005555000000188000FF9A50 -:1007C00000000018800000300000001880000006C3 -:1007D0000000000B2FDF0002000000002C000E00C4 -:1007E000000000082A000007000000080500555519 -:1007F000000000188000FF140000000006820000C6 -:100800000000000C298000010000000C1F80000186 -:10081000000000100CE70007000000090562FFFF60 -:1008200000000010BA6C1405000000002ADF000070 -:100830000000000021000000000000082A00000560 -:100840000000001091D40000000000082C8000B0CF -:10085000000000082D0000080000000C31620018A4 -:10086000000000082D800001000000188000FF8CAF -:1008700000000018000D000000000010B1A0B00E34 -:100880000000000B2FDF00020000000003D8000072 -:10089000000000002C2000000000001091D4000097 -:1008A0000000001880000014000000102C620002FC -:1008B000000000188000000B0000000B2FDF00027A -:1008C000000000002C0700000000000C1F80000149 -:1008D0000000001091DE0000000000000500000094 -:1008E000000000188000FEF6000000082C8000B117 -:1008F000000000082D0000090000001091D4000045 -:10090000000000082D8001070000000C2980000174 -:100910000000000C1F8000010000001091DE0000AC -:10092000000000002ADF0000000000082A00000A82 -:100930000000000005000000000000188000FEEB31 -:100940000000000005020000000000082C8000B03C -:10095000000000082D000008000000082D80015054 -:10096000000000000000000000000010205F0000F8 -:10097000000000082C800000000000082D0000008E -:10098000000000082D8001080000000000000000A9 -:100990000000001091DE000000000018000A0000B6 -:1009A0000000001091D40000000000080600AAAA70 -:1009B000000000188000FF5B0000000C298000018F -:1009C0000000000C1F800001000000082A00000940 -:1009D000000000080500AAAA000000188000FED749 -:1009E0000000001091D400000000000806005555DA -:1009F000000000188000FF530000001091A03C028E -:100A000000000010B1E662070000000B2FDF0002BB -:100A1000000000002C310000000000092CB1007F14 -:100A2000000000082CD90000000000082D00000084 -:100A3000000000082D80010D00000010B1A8000684 -:100A400000000010205F0000000000002C200000CB -:100A5000000000002CA70000000000082D0000107E -:100A6000000000082D800108000000188000FF4CE5 -:100A700000000010B1A6001000000010001F0000D0 -:100A80000000000F0F300007000000000A600000A7 -:100A9000000000000AE100000000000F4B620008A7 -:100AA000000000090B1600FF000000000D620000AE -:100AB000000000090D1A00FF0000001007300003BD -:100AC0000000000C0D1A00080000000C0B160008B6 -:100AD0000000000F4CE30018000000000C992C00EF -:100AE00000000004CC993400000000080F800000D2 -:100AF0000000000C298000010000000033310000DC -:100B00000000000822000016000000002ADF00009C -:100B1000000000082A00000C00000010009F0000E8 -:100B2000000000000F2000000000000C1F800001EA -:100B30000000000805005555000000188000FEABBD -:100B40000000001091D40000000000080600AAAACE -:100B5000000000188000FF270000000F4722000857 -:100B600000000009070E000F00000008070E000833 -:100B700000000008028000010000000702851C0040 -:100B800000000008828500010000000002854C0082 -:100B90000000000742851C0000000003C3AA5200A9 -:100BA0000000000003B10E00000000074B071C000E -:100BB0000000000F0F3000070000000F0A9600032E -:100BC000000000000A955C00000000004A005A0086 -:100BD000000000000C960A00000000090C99FFFFBD -:100BE000000000080D00FFFF00000010B196320267 -:100BF000000000080F80000500000010B1A80008E8 -:100C000000000010205F00000000000B2FDF00023A -:100C1000000000002C200000000000002CA70000B5 -:100C2000000000082D000010000000082D800108C1 -:100C3000000000188000FF130000000C2980000154 -:100C400000000010001F00000000000C1F800001C9 -:100C5000000000002ADF0000000000082A00000D4C -:100C6000000000080500AAAA000000188000FE8508 -:100C70000000001091D40000000000080600555547 -:100C8000000000188000FF010000000C2980000116 -:100C90000000000C1F800001000000082A0000076F -:100CA0000000000805005555000000188000FE7D7A -:100CB00000000008030500040000000683040C0087 -:100CC00000000008028502000000000086050C00FC -:100CD00000000001860C0E00000000080204000461 -:100CE00000000000020418000000000083871800C4 -:080CF0000000001800020000E2 -:080CF80000000010B1800004AF -:100D00000000001F0103010000000008050000FFB3 -:100D10000000001800020000000000002A0000008F -:100D200000000010B1D400000000000C2980000178 -:100D30000000000802540008000000180004000031 -:100D40000000001880000010000000188000001152 -:100D5000000000188000003A000000188000010424 -:100D6000000000188000010300000018800001024C -:100D70000000001880000102000000188000000040 -:100D8000000000188000011400000018800000FE20 -:100D9000000000188000000C0000001880000118FE -:100DA000000000188000016A000000188000006741 -:100DB00000000018800000DA00000018800000E742 -:100DC000000000002A000000000000188000FFEB77 -:100DD000000000002A0000000000000C2980000034 -:100DE0000000001020530000000000188000FFE702 -:100DF000000000002A000000000000188000FFE54D -:100E000000000018000200000000000005020000C1 -:100E1000000000109196342100000010205F0000B7 -:100E2000000000002C1E0000000000082C800006BE -:100E3000000000082D000006000000082D800102BF -:100E400000000000000000000000001091DE000023 -:100E5000000000000D61000000000018000A000002 -:100E600000000000050200000000001091963416FA -:100E700000000010205F00000000000009D8000002 -:100E8000000000002C1E0000000000082C8000B2B2 -:100E9000000000082D00000A000000082D8001025B -:100EA00000000000000000000000001091DE0000C3 -:100EB000000000000D620000000000002C13000084 -:100EC00000000018000A00000000000005020000F9 -:100ED000000000109196340900000010205F00000F -:100EE000000000002C1E0000000000082C800006FE -:100EF000000000082D00006A000000082D8001029B -:100F000000000000000000000000001091DE000062 -:100F1000000000000D7A000000000018000A000028 -:100F20000000001091DE000000000010001F000013 -:100F3000000000002F80AA00000000002A0000002E -:100F4000000000000D6100000000000003620000CE -:100F5000000000002C4000000000000002638C0034 -:100F600000000000264600000000000802040012F5 -:100F700000000010B9060827000000000F5800000C -:100F8000000000000A640000000000000AE5000004 -:100F9000000000090B66FFFF000000000C000000CD -:100FA000000000000B800000000000080CC60012CA -:100FB000000000188000FFCB000000080F80000335 -:100FC000000000000000000000000010009F000072 -:100FD00000000008271100120000000066900000C9 -:100FE00000000008A31B001200000010B1980003CD -:100FF00000000010001F0000000000080F80000427 -:101000000000000822000003000000082C80000CF3 -:10101000000000082D00000C00000010009F0000E0 -:1010200000000000259600000000000C2980000050 -:101030000000000006660000000000008661180045 -:10104000000000090260000F0000000F020400020F -:1010500000000010B60C08030000000C1FBF0000C9 -:101060000000000C33660010000000003214000085 -:1010700000000000329500000000000573662C009F -:101080000000000031E32E00000000082D80001059 -:1010900000000010205300000000001091DE00004E -:1010A000000000188000FF900000000023000000F6 -:1010B0000000000925E6FFFF000000082200000BE9 -:1010C0000000000C695200000000000C29800000A4 -:1010D0000000001020530000000000188000FF896D -:1010E0000000001091DE000000000010001F000052 -:1010F000000000002F80AA00000000002A0000006D -:10110000000000002C400000000000082C8000407F -:10111000000000082D000020000000082D80011CA8 -:1011200000000000000000000000001091DE000040 -:101130000000000F42EA001000000010004F000401 -:1011400000000010B746920000000008024900129B -:1011500000000010B5840A00000000000D610000CE -:1011600000000010BA66345A00000000036200005C -:1011700000000010B8630C5800000008830500123E -:1011800000000010004F00020000000003490000B2 -:101190000000000183068C000000000083C60C00E4 -:1011A00000000010B1870010000000000B6E00006E -:1011B000000000188000FF6B0000000106691400A9 -:1011C00000000010918C000200000008B4E900014A -:1011D00000000010B1E92C4C0000000086692C00D2 -:1011E00000000000020000000000000902EAFFFF0A -:1011F00000000010000C00020000000002040A00C1 -:101200000000000F460C00010000000F02850001E5 -:1012100000000010918C01FC00000010B7040E4388 -:10122000000000002C400000000000000F40000003 -:10123000000000000D610000000000000A640000D2 -:10124000000000000AE50000000000090B66FFFF37 -:10125000000000000C000000000000000B800000F7 -:10126000000000080C860012000000080F80000338 -:101270000000000C2952000000000010009F000038 -:101280000000000827110012000000006690000016 -:1012900000000000264600000000000023060000B9 -:1012A00000000010B198000500000010001F0000B1 -:1012B000000000080F800004000000000000000093 -:1012C00000000010001F00000000000032140000A9 -:1012D00000000000329500000000000031E32E0005 -:1012E0000000000573662C00000000002596000039 -:1012F00000000010B18700160000000C29800000DB -:101300000000000F0F6B0007000000000D690000D7 -:10131000000000000A6C0000000000000AED000060 -:10132000000000000B6E0000000000000B800000B9 -:10133000000000000C870000000000080F80000380 -:1013400000000010205300000000000C6952000152 -:1013500000000010001F00000000000022C58C00EB -:1013600000000000231B0000000000002711000007 -:10137000000000002690000000000010B8170E03C7 -:101380000000000C29800000000000188000FFF61B -:1013900000000010B1980002000000080F80000457 -:1013A000000000082200001A000000082C80000C39 -:1013B000000000082D00000C000000082D80001027 -:1013C00000000010001F0000000000000D6E000073 -:1013D00000000003E7CF34000000000C298000006B -:1013E0000000001091DE000000000010B18700072F -:1013F00000000000361400000000000036950000D8 -:101400000000000037160000000000082C8000508B -:10141000000000082D000030000000082D80000CA6 -:101420000000001020530000000000188000FF1F83 -:10143000000000002646000000000000230000001D -:101440000000000925E6FFFF000000000B6E000011 -:1014500000000003E7CF2C00000000082200001B62 -:101460000000000C695200000000000C2980000000 -:101470000000001020530000000000188000FF153D -:10148000000000002FD50000000000002A0000002E -:1014900000000010003F000B000000000666000086 -:1014A000000000008661180000000009026000F0E2 -:1014B00000000010B70C08070000000C7366001055 -:1014C000000000082C800018000000082D00001803 -:1014D000000000082D8000020000000C5FBF00002B -:1014E0000000001091DE0000000000188000FF07DF -:1014F000000000002FD50000000000002A000000BE -:10150000000000002C4000000000000C29800000BA -:101510000000001091DE0000000000082C80001A7E -:10152000000000082D00001A000000003300000039 -:10153000000000082D800002000000003180000043 -:101540000000001091DE0000000000082C80000C5C -:10155000000000082D00000C000000082D80000491 -:1015600000000010205300000000001091DE000079 -:10157000000000188000FEF6000000188000FEF554 -:10158000000000002A00000000000010001F000002 -:10159000000000000F008000000000080F8000071E -:1015A0000000001880000014000000000502000088 -:1015B000000000082200000900000000286D000063 -:1015C00000000000290000000000000F6568001006 -:1015D00000000003F66C940000000010B972A00433 -:1015E0000000000C73E700190000000C2142000409 -:1015F000000000003BF600000000000C2980000005 -:101600000000001020530000000000082200000825 -:101610000000000C6142000400000018000A0000F5 -:10162000000000002A00000000000010001F000061 -:101630000000000F0F470007000000080F8000089F -:101640000000000C29800000000000102053000062 -:10165000000000188000FEDA0000001091DE00009B -:10166000000000002FD5000000000010001F000047 -:101670000000000033510000000000002A000000BC -:1016800000000010B1C600230000000F0F5000073B -:10169000000000000A600000000000000AE10000F5 -:1016A0000000000F4B620008000000090B1600FF4D -:1016B0000000000F4C620010000000000D620000EE -:1016C000000000090D1A00FF000000100750000381 -:1016D0000000000C0D1A00080000000C0B1600089A -:1016E000000000000CC60000000000000B8000009D -:1016F0000000000006980000000000080F800003B2 -:101700000000001006C200040000000C29000002C6 -:1017100000000010264200020000000C29520003C5 -:10172000000000082200000100000010009F0000DF -:1017300000000000231B00000000000027111A0019 -:1017400000000000669000000000000C295200001C -:1017500000000010B19732090000000C2980000041 -:101760000000000006980000000000102053000058 -:101770000000000C295200030000000022C58C006C -:1017800000000010001F0000000000080F80000390 -:10179000000000188000FFF300000010B1C8001323 -:1017A00000000010B1C600030000000C29800000FA -:1017B00000000010205300000000000C295200001F -:1017C0000000000C295200030000001006C20002B5 -:1017D0000000000C295200020000000022C58C000D -:1017E00000000000276500000000000026E4000063 -:1017F000000000082200001600000010B1C600031F -:10180000000000002348000000000010B180000527 -:1018100000000000234800000000000C29800000A8 -:101820000000000F0F500007000000188000001299 -:1018300000000008220000160000000C29800000B3 -:10184000000000003014000000000000309500008F -:101850000000001007500003000000090B1600FFF5 -:10186000000000090D1A00FF0000000F31160008EB -:10187000000000003162340000000003F16230001B -:1018800000000010205F0000000000002C5100004C -:10189000000000092CD1007F000000082CD90000B6 -:1018A000000000082D000000000000082D80000C42 -:1018B00000000000000000000000001091DE0000A9 -:1018C0000000001005C2000300000000330000000B -:1018D000000000080F8000070000001020530000E7 -:1018E00000000010009F0000000000188000FE872C -:1018F000000000002FD50000000000002A000000BA -:101900000000000F0F50000700000010B1C6002DAE -:101910000000000F4742000800000009070E000FFA -:1019200000000008070E000800000010001F000063 -:1019300000000008090000010000000709121C0057 -:1019400000000003CBCA9200000000000B97A20029 -:101950000000000742171C00000000000B040000FC -:101960000000000F0A840003000000000A959C009C -:10197000000000004A009A000000000882120001E6 -:10198000000000010C170800000000000C978C00FC -:101990000000000002180000000000080D00FFFF1A -:1019A000000000080F8000060000000C2900000065 -:1019B0000000001006C200040000000C29520002C2 -:1019C00000000010264200020000000C2952000313 -:1019D000000000082200000100000010009F00002D -:1019E00000000010B197320C00000000231B000023 -:1019F00000000000271108000000000066900000B1 -:101A00000000000C29800000000000000218000007 -:101A100000000010205300000000000C29520003B9 -:101A20000000000022C5360000000010001F00006A -:101A3000000000080F800006000000188000FFF47E -:101A400000000000231B0000000000002711080018 -:101A5000000000006690000000000010B1C8000BFC -:101A60000000000C2980000000000010205300003E -:101A70000000000C295200000000000C2952000355 -:101A80000000001006C200020000000C29520002F3 -:101A90000000000022C58C00000000002765000047 -:101AA0000000000026E400000000000023480000C1 -:101AB00000000008220000170000000C2980000030 -:101AC00000000010001F0000000000102053000064 -:081AD000000000188000FE4A2E -:00000001FF -/* - * This file contains firmware data derived from proprietary unpublished - * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. - * - * Permission is hereby granted for the distribution of this firmware data - * in hexadecimal or equivalent format, provided this copyright notice is - * accompanying it. - */ diff --git a/firmware/bnx2/bnx2-rv2p-06-5.0.0.j3.fw.ihex b/firmware/bnx2/bnx2-rv2p-06-5.0.0.j3.fw.ihex new file mode 100644 index 0000000..52c4963 --- /dev/null +++ b/firmware/bnx2/bnx2-rv2p-06-5.0.0.j3.fw.ihex @@ -0,0 +1,424 @@ +:100000000000000000000C900000005800000009F3 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000CE000000CE80000000500000000DB +:1000400000000000000000000000000000000000B0 +:080050000000000000000000A8 +:0800580000000010B180000659 +:100060000000001F01030300000000080500FFFF5F +:10007000000000180002000000000008050000FF5A +:10008000000000180002000000000008AC000001A1 +:1000900000000000050000000000000C2F8000019F +:1000A000000000002B000000000000002B8000007A +:1000B0000000001091E0000200000008AC00000108 +:1000C00000000010203F004D00000010213F000301 +:1000D0000000001020BF001C000000188000FFFD81 +:1000E00000000008B1000001000000082C8000B0F2 +:1000F000000000082D000008000000082D8000010D +:10010000000000188000006C0000000B2FDF0002D0 +:100110000000000C1F800002000000002C070000FF +:100120000000001091DE0000000000080500555599 +:10013000000000188000FFF00000000B2FDF00021D +:100140000000000C1F800000000000002C070000D1 +:100150000000001091DE0000000000080500555569 +:10016000000000188000FFEA0000000C1F80000261 +:100170000000000805005555000000188000FFE74A +:100180000000000C298000020000000C1F8000020B +:10019000000000002ADF0000000000082A0000051F +:1001A0000000000805005555000000188000FFE120 +:1001B000000000080224002C0000001800040000C9 +:1001C000000000188000001C000000188000001EC5 +:1001D000000000188000006500000018800000B0DA +:1001E00000000018800000AF000000188000000030 +:1001F00000000018800000000000001880000000CF +:1002000000000018800000000000001880000000BE +:1002100000000018800000000000001880000000AE +:10022000000000188000000000000018800000F6A8 +:10023000000000188000000000000018800000008E +:100240000000001880000015000000188000001B4E +:10025000000000188000000000000018800000C6A8 +:10026000000000188000002F00000018800000F639 +:10027000000000188000012100000018800000EC40 +:100280000000001880000145000000188000004EAA +:1002900000000018800000000000001880000083AB +:1002A0000000000C1F80000100000000050000009D +:1002B000000000188000FFC00000001091D4000072 +:1002C0000000000C298000010000000C1F800001CC +:1002D000000000082A0000020000000005000000E5 +:1002E000000000188000FFBA0000001091D4000048 +:1002F0000000000C298000010000000C1F8000019C +:100300000000000029420000000000082A0000024E +:100310000000000005000000000000188000FFB38E +:10032000000000188000FFB200000010B1BCB00A4D +:100330000000000B2FDF00020000000003D80000C7 +:10034000000000002C3C00000000001091D40000D0 +:100350000000000806005555000000188000001736 +:1003600000000018800000BF000000102C6201BADD +:100370000000001880000006000000082C8000B17A +:10038000000000082D0000090000001091D40000BA +:10039000000000082D8001070000001880000024E4 +:1003A0000000000C298000000000000C1F800000ED +:1003B0000000001091DE0000000000002ADF0000B5 +:1003C000000000082A00000600000008050055553E +:1003D000000000188000FF9C0000001091D4000075 +:1003E0000000000C298000010000000C1F800001AB +:1003F000000000082A00000B0000000005000000BB +:10040000000000188000FF960000001800020000A5 +:10041000000000000682000000000010B18A000801 +:1004200000000010B18C14070000000B050AFFFF4C +:1004300000000010B18A000300000000860A1800C6 +:1004400000000010918C0000000000082A0000014C +:100450000000001091D4000000000018000D000002 +:1004600000000000050200000000001091DE000006 +:1004700000000018000A00000000000006820000D2 +:100480000000001091DE000000000010BEE1000539 +:10049000000000188000FF7D0000000105611400CD +:1004A00000000010918A000200000008B0E1000185 +:1004B00000000018000D000000000000068200008F +:1004C0000000001091DE000000000010BEE20005F8 +:1004D000000000188000FF75000000010562140094 +:1004E00000000010918A000200000008B1620001C3 +:1004F00000000018000D000000000010B1A0B013B3 +:100500000000000B2FDF0002000000002C20000084 +:10051000000000082C800000000000082D000000F2 +:100520000000001091D4000000000008060055559E +:10053000000000188000FFDC000000082D80011C76 +:1005400000000010001F0000000000188000FFE6FF +:100550000000000F476000080000000F060E0001B9 +:10056000000000000F580000000000000A640000B6 +:10057000000000000AE50000000000090B66FFFF14 +:10058000000000000D610000000000188000001352 +:100590000000000F476000080000000B2FDF000282 +:1005A000000000082C800000000000082D00000062 +:1005B0000000001091D40000000000082D80011CF4 +:1005C0000000000F060E000100000010001F0000D8 +:1005D000000000000F580000000000188000FFD449 +:1005E000000000000A640000000000000AE50000AE +:1005F000000000090B66FFFF000000000D61000015 +:1006000000000000026200000000000B2FDF00026B +:10061000000000003104000000000000309A0000DB +:10062000000000000C961800000000090C99FFFF64 +:1006300000000004CC99340000000010B196320292 +:10064000000000080F8000000000000C298000015D +:100650000000000C295200010000000C295200008B +:10066000000000080200000E000000080280001ACE +:1006700000000010B1C40A020000000802000003DC +:1006800000000008220000010000000C1F80000193 +:10069000000000002ADF0000000000002A0008001F +:1006A0000000000805005555000000188000FF41BB +:1006B0000000000B2FDF00020000001091D40000AA +:1006C000000000082A000001000000002C200000AB +:1006D0000000001091D40000000000082C800000F1 +:1006E000000000082D000000000000082D80011C03 +:1006F000000000188000FFAE000000082C800006FB +:10070000000000082D0000060000000030800000FE +:100710000000000031000000000000082D800006ED +:100720000000000C298000010000000C1F80000167 +:100730000000001091DE0000000000002ADF000031 +:10074000000000082A000010000000000500000062 +:10075000000000188000FF2C0000001091A0B009DC +:10076000000000082C8000B1000000082D000009E6 +:100770000000001091D40000000000082D80010747 +:10078000000000188000FFA7000000188000001083 +:1007900000000008AC000001000000188000000B01 +:1007A000000000000380B0000000000B2FDF0002FB +:1007B000000000002C0040000000001091D4000058 +:1007C0000000000806005555000000188000FF8951 +:1007D00000000018800000310000001880000006B2 +:1007E0000000000B2FDF0002000000002C000E00B4 +:1007F000000000082A000007000000080500555509 +:10080000000000188000FF160000000006820000B3 +:100810000000000C298000010000000C1F80000176 +:10082000000000100CE70007000000090562FFFF50 +:1008300000000010BA6C1405000000002ADF000060 +:100840000000000021000000000000082A00000550 +:100850000000001091D40000000000082C8000B0BF +:10086000000000082D0000080000000C3162001894 +:10087000000000082D800001000000188000FF7DAE +:1008800000000018000D000000000010B1A0B00E24 +:100890000000000B2FDF00020000000003D8000062 +:1008A000000000002C2000000000001091D4000087 +:1008B0000000001880000015000000102C620002EB +:1008C000000000188000000C0000000B2FDF000269 +:1008D000000000002C0700000000000C1F80000139 +:1008E0000000001091DE0000000000080500FFFF7E +:1008F000000000188000FEF8000000082C8000B105 +:10090000000000082D0000090000001091D4000034 +:10091000000000082D800107000000188000FF740F +:100920000000000C298000010000000C1F80000165 +:100930000000001091DE0000000000002ADF00002F +:10094000000000082A00000A000000000500000066 +:10095000000000188000FEEC00000000068200008D +:10096000000000082C8000B0000000082D000008E6 +:10097000000000082D800150000000000000000071 +:100980000000001091DE0000000000082C80000034 +:10099000000000082D000000000000082D80010567 +:1009A00000000010BEE20005000000188000FEDA22 +:1009B000000000010562140000000010918A00028E +:1009C00000000008B16200010000001091DE00008C +:1009D00000000018000D00000000001091D400007D +:1009E000000000080600AAAA000000188000FF45C9 +:1009F0000000000C298000010000000C1F80000195 +:100A0000000000082A000009000000080500AAAA4A +:100A1000000000188000FED40000001091D40000F7 +:100A20000000000806005555000000188000FF3D3A +:100A30000000001091A03C0200000010B1E6620727 +:100A40000000000B2FDF0002000000002C3100002E +:100A5000000000092CB1007F000000082CD9000024 +:100A6000000000082D000000000000082D80010D8E +:100A700000000010B1A8000600000010205F000078 +:100A8000000000002C200000000000002CA7000047 +:100A9000000000082D000010000000082D80010853 +:100AA000000000188000FF3800000010B1A6001000 +:100AB00000000010001F00000000000F0F300007B2 +:100AC000000000000A600000000000000AE10000D1 +:100AD0000000000F4B620008000000090B1600FF29 +:100AE000000000000D620000000000090D1A00FF68 +:100AF00000000010073000030000000C0D1A000871 +:100B00000000000C0B1600080000000F4CE300185A +:100B1000000000000C992C0000000004CC99340067 +:100B2000000000080F8000000000000C2980000178 +:100B30000000000033310000000000082200001611 +:100B4000000000002ADF0000000000082A00000C5E +:100B500000000010009F0000000000000F200000B7 +:100B60000000000C1F800001000000080500555522 +:100B7000000000188000FEA80000001091D40000C2 +:100B8000000000080600AAAA000000188000FF115B +:100B90000000000F4722000800000009070E000FA8 +:100BA00000000008070E0008000000080280000195 +:100BB0000000000702851C0000000008828500017B +:100BC0000000000002854C000000000742851C0068 +:100BD00000000003C3AA52000000000003B10E0091 +:100BE000000000074B071C000000000F0F3000073B +:100BF0000000000F0A960003000000000A955C0048 +:100C0000000000004A005A00000000000C960A0094 +:100C1000000000090C99FFFF000000080D00FFFF15 +:100C200000000010B1963202000000080F8000059D +:100C300000000010B1A8000800000010205F0000B4 +:100C40000000000B2FDF0002000000002C2000003D +:100C5000000000002CA70000000000082D0000107C +:100C6000000000082D800108000000188000FEFF31 +:100C70000000000C2980000100000010001F00008F +:100C80000000000C1F800001000000002ADF0000AF +:100C9000000000082A00000D000000080500AAAAB4 +:100CA000000000188000FE820000001091D40000B7 +:100CB0000000000806005555000000188000FEEBFB +:100CC0000000000C298000010000000C1F800001C2 +:100CD000000000082A000007000000080500555524 +:080CE000000000188000FE7AFC +:080CE80000000010B1800004BF +:100CF0000000001F0103030000000008050000FFC2 +:100D00000000001800020000000000002A0000009F +:100D100000000010B1D400000000001091DE0000BF +:100D2000000000102053000000000010001F000011 +:100D3000000000002F80AA000000000C29800001A4 +:100D4000000000080254000D000000002C400000CC +:100D500000000018000400000000001880000010CF +:100D60000000001880000011000000188000003909 +:100D700000000018800000DF00000018800000DE86 +:100D800000000018800000DD00000018800000DD79 +:100D9000000000188000000000000018800000F52E +:100DA00000000018800000D9000000188000000B2F +:100DB00000000018800000F90000001880000147C2 +:100DC000000000188000005900000018800000C4D6 +:100DD00000000018800000C5000000002A0000008C +:100DE000000000188000FFE6000000002A0000005C +:100DF0000000000C29800000000000188000FFE3C4 +:100E0000000000002A000000000000188000FFE140 +:100E100000000018000200000000000005020000B1 +:100E2000000000109196342100000010205F0000A7 +:100E3000000000002C1E0000000000082C800006AE +:100E4000000000082D000006000000082D800102AF +:100E500000000000000000000000001091DE000013 +:100E6000000000000D61000000000018000A0000F2 +:100E700000000000050200000000001091963416EA +:100E800000000010205F00000000000009D80000F2 +:100E9000000000002C1E0000000000082C8000B2A2 +:100EA000000000082D00000A000000082D8001024B +:100EB00000000000000000000000001091DE0000B3 +:100EC000000000000D620000000000002C13000074 +:100ED00000000018000A00000000000005020000E9 +:100EE000000000109196340900000010205F0000FF +:100EF000000000002C1E0000000000082C800006EE +:100F0000000000082D00006A000000082D8001028A +:100F100000000000000000000000001091DE000052 +:100F2000000000000D7A000000000018000A000018 +:100F3000000000002A000000000000000D61000019 +:100F4000000000000362000000000010234200A324 +:100F50000000000002638C00000000002646000034 +:100F6000000000080204001200000010B906081E6C +:100F7000000000000F580000000000000A6400009C +:100F8000000000000AE50000000000090B66FFFFFA +:100F9000000000000C000000000000000B800000BA +:100FA000000000080CC60012000000188000FFCEF0 +:100FB000000000080F800003000000000000000097 +:100FC00000000010009F0000000000082711001220 +:100FD000000000006690000000000008A31B001243 +:100FE00000000010B198000300000010001F000076 +:100FF000000000080F800004000000082200000329 +:10100000000000082C80000C000000082D00000CDF +:1010100000000010009F0000000000002596000066 +:101020000000000C298000000000000032140000C5 +:1010300000000000329500000000000573662C00DF +:101040000000000031E32E00000000082D80001099 +:10105000000000188000FF9800000000230000003E +:101060000000000925E6FFFF000000082200000B39 +:101070000000000C695200000000000C29800000F4 +:10108000000000188000FF92000000002A0000000D +:10109000000000082C800040000000082D00002007 +:1010A000000000082D80011C00000000000000006E +:1010B0000000001091DE00000000000F42EA001066 +:1010C00000000010004F000400000010B74692001E +:1010D000000000080249001200000010B5840A0058 +:1010E000000000000D61000000000010BA663457D7 +:1010F000000000088305001200000010004F0002ED +:1011000000000000034900000000000183068C007D +:101110000000000083C60C0000000010B187001121 +:10112000000000000B6E000000000010BEE900058A +:10113000000000188000FF7900000001056914001C +:1011400000000010918A000200000008B4E90001CC +:1011500000000010B1E92C4A0000000086692C0054 +:1011600000000000020000000000000902EAFFFF8A +:1011700000000010000C00020000000002040A0041 +:101180000000000F460C00010000000F0285000166 +:1011900000000010918C01FC00000010B7040E410B +:1011A000000000000F400000000000000D61000082 +:1011B000000000000A640000000000000AE50000D2 +:1011C000000000090B66FFFF000000000C0000009B +:1011D000000000000B800000000000080C860012D8 +:1011E000000000080F8000030000000C29520000DE +:1011F00000000010009F00000000000827110012EE +:10120000000000006690000000000000264600007C +:10121000000000002306000000000010B198000547 +:1012200000000010001F0000000000080F800004F4 +:10123000000000000000000000000010001F00007F +:101240000000000032140000000000003295000091 +:101250000000000031E32E000000000573662C0042 +:10126000000000002596000000000010B187001665 +:101270000000000C298000000000000F0F6B000729 +:10128000000000000D690000000000000A6C000072 +:10129000000000000AED0000000000000B6E0000DE +:1012A000000000000B800000000000000C87000020 +:1012B000000000080F800003000000102053000011 +:1012C0000000000C6952000100000010001F000027 +:1012D0000000000022C58C0000000000231B00005D +:1012E0000000000027110000000000002690000010 +:1012F00000000010B8170E030000000C2980000049 +:10130000000000188000FFF600000010B1980002F5 +:10131000000000080F800004000000082200001AEE +:10132000000000082C80000C000000082D00000CBC +:10133000000000082D80001000000010001F0000B9 +:10134000000000000D6E000000000003E7CF340035 +:101350000000000C298000000000001091DE000059 +:1013600000000010B18700070000000036140000E4 +:101370000000000036950000000000003716000055 +:10138000000000082C800050000000082D000030F4 +:10139000000000082D80000C000000188000FF2FC6 +:1013A00000000000264600000000000023000000AE +:1013B0000000000925E6FFFF000000000B6E0000A2 +:1013C00000000003E7CF2C00000000082200001BF3 +:1013D0000000000C695200000000000C2980000091 +:1013E000000000188000FF26000000002A00000016 +:1013F000000000188000FF24000000002A00000008 +:101400000000000C298000000000001091DE0000A8 +:10141000000000082C80001A000000082D00001AAF +:101420000000000573660000000000082D80000227 +:1014300000000000318000000000001091DE00007C +:10144000000000082C80000C000000082D00000C9B +:10145000000000082D800004000000188000FF1725 +:101460000000001800020000000000188000FF15B6 +:10147000000000002A00000000000010001F000013 +:10148000000000000F008000000000080F8000072F +:10149000000000188000001A00000000280A000068 +:1014A0000000000005020000000000082200000902 +:1014B00000000000290000000000000F6568001017 +:1014C00000000003F66C940000000010B972A00444 +:1014D0000000000C73E700190000000C214200041A +:1014E000000000003CF800000000000C2980000013 +:1014F0000000001020530000000000082200000837 +:101500000000000C6142000400000018000A000006 +:1015100000000000050200000000000C6142000015 +:1015200000000010014200030000000C33E7001D22 +:101530000000000C6142000200000018000A0000D8 +:10154000000000002A00000000000010001F000042 +:101550000000000F0F470007000000080F80000880 +:101560000000000C2980000000000010009F000017 +:10157000000000188000FEF400000000335100005D +:10158000000000002A00000000000010B1C6002387 +:101590000000000F0F500007000000000A6000006C +:1015A000000000000AE100000000000F4B6200088C +:1015B000000000090B1600FF0000000F4C62001035 +:1015C000000000000D620000000000090D1A00FF7D +:1015D00000000010075000030000000C0D1A000866 +:1015E0000000000C0B160008000000000CC60000F4 +:1015F000000000000B8000000000000006980000C2 +:10160000000000080F8000030000001006C2000464 +:101610000000000C29000002000000102642000219 +:101620000000000C29520003000000082200000105 +:1016300000000010009F000000000000231B0000BD +:101640000000000027111A00000000006690000052 +:101650000000000C2952000000000010B197320970 +:101660000000000C29800000000000000698000027 +:1016700000000010205300000000000C295200035D +:101680000000000022C58C0000000010001F0000B8 +:10169000000000080F800003000000188000FFF326 +:1016A00000000010B1C8001300000010B1C6000314 +:1016B0000000000C298000000000001020530000F2 +:1016C0000000000C295200000000000C2952000309 +:1016D0000000001006C200020000000C29520002A7 +:1016E0000000000022C58C000000000027650000FB +:1016F0000000000026E400000000000822000016A0 +:1017000000000010B1C600030000000023480000E4 +:1017100000000010B1800005000000002348000018 +:101720000000000C298000000000000F0F5000078F +:1017300000000018800000120000000822000016BF +:101740000000000C298000000000000030140000A0 +:10175000000000003095000000000010075000035A +:10176000000000090B1600FF000000090D1A00FF21 +:101770000000000F31160008000000003162340044 +:1017800000000003F162300000000010205F000044 +:10179000000000002C510000000000092CD1007F47 +:1017A000000000082CD90000000000082D000000F7 +:1017B000000000082D80000C000000000000000068 +:1017C0000000001091DE00000000001005C20004BF +:1017D000000000080F800007000000003300000038 +:1017E00000000010009F0000000000188000FEA50F +:1017F000000000002A0000000000000F0F5000074A +:1018000000000010B1C6002D0000000F4742000884 +:1018100000000009070E000F00000008070E000876 +:1018200000000010001F0000000000080900000177 +:101830000000000709121C0000000003CBCA920040 +:10184000000000000B97A2000000000742171C00D8 +:10185000000000000B0400000000000F0A840003D9 +:10186000000000000A959C00000000004A009A0059 +:101870000000000882120001000000010C1708009F +:10188000000000000C978C0000000000021800000F +:10189000000000080D00FFFF000000080F80000698 +:1018A0000000000C290000000000001006C2000427 +:1018B0000000000C29520002000000102642000225 +:1018C0000000000C29520003000000082200000163 +:1018D00000000010009F000000000010B197320CC3 +:1018E00000000000231B000000000000271108007A +:1018F00000000000669000000000000C298000003D +:10190000000000000218000000000010205300003A +:101910000000000C295200030000000022C5360020 +:1019200000000010001F0000000000080F800006EB +:10193000000000188000FFF400000000231B0000DE +:101940000000000027110800000000006690000061 +:1019500000000010B1C8000B0000000C298000003E +:1019600000000010205300000000000C295200006D +:101970000000000C295200030000001006C2000203 +:101980000000000C295200020000000022C58C005B +:1019900000000000276500000000000026E40000B1 +:1019A000000000002348000000000008220000178B +:1019B0000000000C2980000000000010001F000043 +:0819C000000000188000FE6A1F +:00000001FF +/* + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ diff --git a/firmware/bnx2/bnx2-rv2p-09-4.6.15.fw.ihex b/firmware/bnx2/bnx2-rv2p-09-4.6.15.fw.ihex deleted file mode 100644 index 63995bb..0000000 --- a/firmware/bnx2/bnx2-rv2p-09-4.6.15.fw.ihex +++ /dev/null @@ -1,490 +0,0 @@ -:100000000000000000000D88000000580000000003 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:100030000000101800000DE00000000500000000A6 -:1000400000000000000000000000000000000000B0 -:080050000000000000000000A8 -:0800580000000010B18000025D -:100060000000001F0303010000000008AC000001B5 -:1000700000000000050000000000000C2F800001BF -:10008000000000002B000000000000002B8000009A -:1000900000000010203F006C00000010213F000312 -:1000A0000000001020BF003B000000188000FFFD92 -:1000B00000000010B1B8B0150000000B2FDF0002E7 -:1000C0000000000003D80000000000002C380000F1 -:1000D000000000082C800000000000082D00000037 -:1000E0000000001091D400000000000806005555E3 -:1000F000000000188000008F000000082D80011C07 -:1001000000000008020000010000001091DE000065 -:100110000000000F42E0001C0000001091840A174C -:1001200000000010086600160000000C2980000284 -:100130000000000C1F800002000000002ADF000009 -:10014000000000082A00000F0000000805005555B7 -:10015000000000188000FFE8000000080200000115 -:100160000000000F42E0001C0000001091840A19FA -:10017000000000082C800006000000082D0000068A -:100180000000001091D40000000000082D8001063E -:1001900000000018800000830000001008660013B3 -:1001A000000000188000FFF100000008B10000010D -:1001B000000000082C80010C000000082D00000841 -:1001C000000000082D800001000000188000007C65 -:1001D0000000000B2FDF00020000000C1F80000257 -:1001E000000000002C0700000000001091DE00005D -:1001F0000000000005000000000000188000FFD390 -:100200000000000B2FDF00020000000C1F80000028 -:10021000000000002C0700000000001091DE00002C -:100220000000000005000000000000188000FFCD65 -:100230000000000C1F80000200000000050000000C -:10024000000000188000FFCA0000000C2980000296 -:100250000000000C1F800002000000002ADF0000E8 -:10026000000000082A0000050000000805005555A0 -:10027000000000188000FFC40000000802240045B0 -:100280000000001800040000000000188000001C9E -:10029000000000188000001E0000001880000065AB -:1002A00000000018800000AD00000018800000ACC5 -:1002B000000000188000000000000018800000000E -:1002C00000000018800000000000001880000000FE -:1002D00000000018800000000000001880000000EE -:1002E00000000018800000000000001880000000DE -:1002F00000000018800000F30000001880000000DB -:1003000000000018800000000000001880000015A8 -:10031000000000188000001B000000188000000092 -:1003200000000018800000C3000000188000002EAC -:1003300000000018800000F3000000188000011E7B -:1003400000000018800000E9000000188000014251 -:10035000000000188000004E00000018800000001F -:1003600000000018800000800000000C1F800001C9 -:100370000000000005000000000000188000FFA33E -:100380000000001091D400000000000C2980000142 -:100390000000000C1F800001000000082A0000027D -:1003A0000000000005000000000000188000FF9D14 -:1003B0000000001091D400000000000C2980000112 -:1003C0000000000C1F800001000000002942000016 -:1003D000000000082A0000020000000005000000E4 -:1003E000000000188000FF96000000188000FF95B4 -:1003F00000000010B1BCB00A0000000B2FDF0002AB -:100400000000000003D80000000000002C3C0000A9 -:100410000000001091D400000000000806005555AF -:10042000000000188000002900000018800000BBB8 -:10043000000000102C6201BA0000001880000005C6 -:10044000000000082C80010D000000082D000009AC -:100450000000001091D40000000000082D8001076A -:100460000000000C298000000000000C1F8000002C -:100470000000001091DE0000000000002ADF0000F4 -:10048000000000082A00000600000008050055557D -:10049000000000188000FF800000001091D40000D0 -:1004A0000000000C298000010000000C1F800001EA -:1004B000000000082A00000B0000000005000000FA -:1004C000000000188000FF7A000000000202000017 -:1004D00000000000029A000000000000060C2C0042 -:1004E00000000004C60C340000000010001F0000D3 -:1004F00000000010B196180C0000000806960004D9 -:1005000000000009068DFFFC00000004CD051A0064 -:1005100000000004CC9A18000000001020D7000052 -:100520000000000C2B56000000000000000000003E -:1005300000000000000000000000001020D70000B4 -:10054000000000080F80000100000010B18001F4DD -:1005500000000010001F00000000000C6B5600009F -:1005600000000018000400000000000006820000E7 -:1005700000000010B18A000600000000860C140084 -:1005800000000010B18C0004000000000500000015 -:10059000000000082A0000010000001091D40000B3 -:1005A00000000018000D000000000000050200001F -:1005B0000000001091DE000000000018000A00009A -:1005C00000000010B1A0B0130000000B2FDF0002EC -:1005D000000000002C200000000000082C8000001B -:1005E000000000082D0000000000001091D4000061 -:1005F0000000000806005555000000188000FFEEBE -:10060000000000082D80011C00000010001F0000E9 -:100610000000001091DE00000000000F476000089D -:100620000000000F060E0001000000000F5800003F -:10063000000000000A640000000000000AE500005D -:10064000000000090B66FFFF000000000D610000C4 -:1006500000000018800000130000000F4760000831 -:100660000000000B2FDF0002000000082C800000BB -:10067000000000082D0000000000001091D40000D0 -:10068000000000082D80011C0000000F060E000174 -:1006900000000010001F0000000000000F580000C4 -:1006A0000000001091DE0000000000000A6400005D -:1006B000000000000AE50000000000090B66FFFFD3 -:1006C000000000000D610000000000000262000058 -:1006D0000000000B2FDF00020000000031040000CA -:1006E00000000000309A0000000000188000FFBCED -:1006F0000000000C29800001000000100022000210 -:100700000000000C295200010000000C29520000DA -:10071000000000080200000E000000080280001A1D -:1007200000000010B1C40A0200000008020000032B -:1007300000000008220000010000000C1F800001E2 -:10074000000000002ADF0000000000002A0008006E -:100750000000000805005555000000188000FF2724 -:100760000000000B2FDF00020000001091D40000F9 -:10077000000000082A000001000000002C200000FA -:10078000000000082C800000000000082D00000080 -:10079000000000082D80011C0000001091D4000012 -:1007A0000000001091DE0000000000082C80000610 -:1007B000000000082D00000600000000308000004E -:1007C0000000000031000000000000082D8000063D -:1007D0000000000C298000010000000C1F800001B7 -:1007E0000000001091DE0000000000002ADF000081 -:1007F000000000082A0000100000000005000000B2 -:10080000000000188000FF120000001091A0B00945 -:10081000000000082C80010D000000082D000009D8 -:100820000000001091D40000000000082D80010796 -:10083000000000188000FFAF0000001880000010CA -:1008400000000008AC000001000000188000000B50 -:10085000000000000380B0000000000B2FDF00024A -:10086000000000002C0040000000001091D40000A7 -:100870000000000806005555000000188000FF9E8B -:100880000000001880000030000000188000000602 -:100890000000000B2FDF0002000000002C000E0003 -:1008A000000000082A000007000000080500555558 -:1008B000000000188000FEFC00000000068200001E -:1008C0000000000C298000010000000C1F800001C6 -:1008D000000000100CE70007000000090562FFFFA0 -:1008E00000000010BA6C1405000000002ADF0000B0 -:1008F0000000000021000000000000082A000005A0 -:100900000000001091D40000000000082C80010CB1 -:10091000000000082D0000080000000C31620018E3 -:10092000000000082D800001000000188000FF90EA -:1009300000000018000D000000000010B1A0B00E73 -:100940000000000B2FDF00020000000003D80000B1 -:10095000000000002C2000000000001091D40000D6 -:100960000000001880000014000000102C6200023B -:10097000000000188000000B0000000B2FDF0002B9 -:10098000000000002C0700000000000C1F80000188 -:100990000000001091DE00000000000005000000D3 -:1009A000000000188000FEDE000000082C80010D11 -:1009B000000000082D0000090000001091D4000084 -:1009C000000000082D8001070000000C29800001B4 -:1009D0000000000C1F8000010000001091DE0000EC -:1009E000000000002ADF0000000000082A00000AC2 -:1009F0000000000005000000000000188000FED389 -:100A00000000000005020000000000082C80010C1E -:100A1000000000082D000008000000082D800134AF -:100A2000000000000000000000000010205F000037 -:100A3000000000082C800140000000082D00003C50 -:100A4000000000082D80011C0000000000000000D4 -:100A500000000010205F0000000000082C800080D3 -:100A6000000000082D000000000000082D80010893 -:100A700000000000000000000000001091DE0000F7 -:100A800000000018000A00000000001091D40000CF -:100A9000000000080600AAAA000000188000FF5A03 -:100AA0000000000C298000010000000C1F800001E4 -:100AB000000000082A000009000000080500AAAA9A -:100AC000000000188000FEBA0000001091D4000061 -:100AD0000000000806005555000000188000FF5275 -:100AE0000000001091A03C0200000010B1E6620777 -:100AF0000000000B2FDF0002000000002C3100007E -:100B0000000000092CB1007F000000082CD9000073 -:100B1000000000082D000000000000082D80010DDD -:100B200000000010B1A8000600000010205F0000C7 -:100B3000000000002C200000000000002CA7000096 -:100B4000000000082D000010000000082D800108A2 -:100B5000000000188000FF4B00000010B1A600103C -:100B600000000010001F00000000000F0F30000701 -:100B7000000000000A600000000000000AE1000020 -:100B80000000000F4B620008000000090B1600FF78 -:100B9000000000000D620000000000090D1A00FFB7 -:100BA00000000010073000030000000C0D1A0008C0 -:100BB0000000000C0B1600080000000F4CE30018AA -:100BC000000000000C992C0000000004CC993400B7 -:100BD000000000080F8000000000000C29800001C8 -:100BE0000000000033310000000000082200001661 -:100BF000000000002ADF0000000000082A00000CAE -:100C000000000010009F0000000000000F20000006 -:100C10000000000C1F800001000000080500555571 -:100C2000000000188000FE8E0000001091D400002B -:100C3000000000080600AAAA000000188000FF2695 -:100C40000000000F4722000800000009070E000FF7 -:100C500000000008070E00080000000802800001E4 -:100C60000000000702851C000000000882850001CA -:100C70000000000002854C000000000742851C00B7 -:100C800000000003C3AA52000000000003B10E00E0 -:100C9000000000074B071C000000000F0F3000078A -:100CA0000000000F0A960003000000000A955C0097 -:100CB000000000004A005A00000000000C960A00E4 -:100CC000000000090C99FFFF000000080D00FFFF65 -:100CD00000000010B1963202000000080F800005ED -:100CE00000000010B1A8000800000010205F000004 -:100CF0000000000B2FDF0002000000002C2000008D -:100D0000000000002CA70000000000082D000010CB -:100D1000000000082D800108000000188000FF126C -:100D20000000000C2980000100000010001F0000DE -:100D30000000000C1F800001000000002ADF0000FE -:100D4000000000082A00000D000000080500AAAA03 -:100D5000000000188000FE680000001091D4000020 -:100D60000000000806005555000000188000FF0034 -:100D70000000000C298000010000000C1F80000111 -:100D8000000000082A000007000000080500555573 -:100D9000000000188000FE60000000080305000449 -:100DA0000000000683040C00000000080285020019 -:100DB0000000000086050C0000000001860C0E00FB -:100DC00000000008020400040000000002041800F3 -:100DD00000000000838718000000001800020000D7 -:100DE00000000010B18000040000001F0303010098 -:100DF00000000008050000FF0000001800020000CD -:100E0000000000002A00000000000010B1D4000023 -:100E10000000000C298000010000000802540009B5 -:100E2000000000092952003F0000001800040000E3 -:100E30000000001880000010000000188000001161 -:100E4000000000188000004B000000188000013CEA -:100E5000000000188000013B000000188000013AEB -:100E6000000000188000013A000000188000000017 -:100E7000000000188000014D0000001880000136BD -:100E8000000000188000000C0000001880000152D3 -:100E900000000018800001AC0000001880000080F5 -:100EA00000000018800001070000001880000115F4 -:100EB000000000002A000000000000188000FFEA87 -:100EC000000000002A0000000000000C2980000043 -:100ED0000000001020530000000000188000FFE612 -:100EE000000000002A000000000000188000FFE45D -:100EF0000000000003820000000000188000FFDFF7 -:100F0000000000010C161400000000008C181400F2 -:100F10000000001091980003000000080C960002E9 -:100F200000000010B1800003000000080C960001D2 -:100F3000000000000C000000000000000D1900007F -:100F400000000010205600000000000C2BD700010C -:100F5000000000080F8000010000000000000000F9 -:100F600000000010001F00000000000C6BD7000103 -:100F700000000010011301F100000018000700003C -:100F800000000000050200000000001091963421CE -:100F900000000010205F0000000000002C1E000078 -:100FA000000000082C800006000000082D0000064C -:100FB000000000082D800102000000000000000079 -:100FC0000000001091DE0000000000000D61000034 -:100FD00000000018000A00000000000005020000E8 -:100FE000000000109196341600000010205F0000F1 -:100FF0000000000009D80000000000002C1E0000C6 -:10100000000000082C80010E000000082D00000ADE -:10101000000000082D800102000000000000000018 -:101020000000001091DE0000000000000D620000D2 -:10103000000000002C13000000000018000A00004F -:101040000000000005020000000000109196340925 -:1010500000000010205F0000000000002C1E0000B7 -:10106000000000082C800006000000082D00006A27 -:10107000000000082D8001020000000000000000B8 -:101080000000001091DE0000000000000D7A00005A -:1010900000000018000A00000000001091DE0000AF -:1010A00000000010001F00000000000C6BD70001C2 -:1010B000000000002F80AA00000000002A000000AD -:1010C000000000000D61000000000000036200004D -:1010D000000000002C4000000000000002638C00B3 -:1010E0000000000026460000000000080204001274 -:1010F00000000010B906082E000000000F58000084 -:10110000000000000A640000000000000AE5000082 -:10111000000000090B66FFFF000000000C0000004B -:10112000000000000B800000000000080CC6001248 -:10113000000000188000FFCA0000001020560000C8 -:101140000000000C2BD70001000000080F800003F6 -:10115000000000000000000000000010001F000060 -:101160000000000C6BD700010000000827110012DE -:10117000000000006690000000000008A31B0012A1 -:1011800000000010B198000600000010001F0000D1 -:101190000000000C6BD7000100000010205600007A -:1011A0000000000C2BD70001000000080F80000495 -:1011B0000000000822000003000000082C80000C42 -:1011C000000000082D00000C00000010001F0000AF -:1011D0000000000C6BD70001000000002596000005 -:1011E0000000000C298000000000000006660000DE -:1011F0000000000086611800000000090260000F76 -:101200000000000F0204000200000010B60C0803EA -:101210000000000C1FBF00000000000C336600102F -:1012200000000000321400000000000032950000B1 -:101230000000000573662C000000000031E32E0062 -:10124000000000082D800010000000102053000056 -:101250000000001091DE0000000000188000FF7602 -:1012600000000000230000000000000925E6FFFF49 -:10127000000000082200000B0000000C6952000072 -:101280000000000C29800000000000102053000026 -:10129000000000188000FF6F0000001091DE0000C9 -:1012A00000000010001F00000000000C6BD70001C0 -:1012B000000000002F80AA00000000002A000000AB -:1012C000000000002C400000000000082C800040BE -:1012D000000000082D000020000000082D80011CE7 -:1012E00000000000000000000000001091DE00007F -:1012F0000000000F42EA001000000010004F000440 -:1013000000000010B74692000000000802490012D9 -:1013100000000010B5840A00000000000D6100000C -:1013200000000010BA66346D000000000362000087 -:1013300000000010B8630C6B000000088305001269 -:1013400000000010004F00020000000003490000F0 -:101350000000000183068C000000000083C60C0022 -:1013600000000010B1870010000000000B6E0000AC -:10137000000000188000FF50000000010669140002 -:1013800000000010918C000200000008B4E9000188 -:1013900000000010B1E92C5F0000000086692C00FD -:1013A00000000000020000000000000902EAFFFF48 -:1013B00000000010000C00020000000002040A00FF -:1013C0000000000F460C00010000000F0285000124 -:1013D00000000010918C01FC00000010B7040E56B4 -:1013E000000000002C400000000000000F40000042 -:1013F000000000000D610000000000000A64000011 -:10140000000000000AE50000000000090B66FFFF75 -:10141000000000000C000000000000000B80000035 -:10142000000000080C86001200000010205600008A -:101430000000000C2BD70001000000080F80000303 -:101440000000000C2952000000000010001F0000E6 -:101450000000000C6BD700010000000827110012EB -:10146000000000006690000000000000264600001A -:10147000000000002306000000000010B1980009E1 -:1014800000000010001F00000000000C6BD70001DE -:1014900000000010205600000000000C2BD70001B7 -:1014A000000000080F8000040000000000000000A1 -:1014B00000000010001F00000000000C6BD70001AE -:1014C000000000003214000000000000329500000F -:1014D0000000000031E32E000000000573662C00C0 -:1014E000000000002596000000000010B1870021D8 -:1014F0000000000C298000000000000F0F6B0007A7 -:10150000000000000D690000000000000A6C0000EF -:10151000000000000AED0000000000000B6E00005B -:10152000000000000B800000000000000C8700009D -:10153000000000188000FF18000000010C161400C5 -:10154000000000008C181400000000080C96000138 -:101550000000001091980002000000080C990001A2 -:10156000000000000D190000000000000C00000049 -:1015700000000010205600000000000C2BD70001D6 -:10158000000000080F800001000000102053000040 -:101590000000000C6952000100000010001F000054 -:1015A0000000000C6BD700010000000022C58C0079 -:1015B00000000000231200000000000027110000BE -:1015C000000000002690000000000010B8170E0375 -:1015D0000000000C29800000000000188000FFEBD4 -:1015E0000000000082970E0000000000A3120A0015 -:1015F000000000082200001A000000082C80000CE7 -:10160000000000082D00000C000000082D800010D4 -:1016100000000010001F00000000000C6BD700014C -:10162000000000000D6E000000000003E7CF340052 -:101630000000000C298000000000001091DE000076 -:1016400000000010B1870007000000003614000001 -:101650000000000036950000000000003716000072 -:10166000000000082C800050000000082D00003011 -:10167000000000082D80000C000000102053000026 -:10168000000000188000FEF1000000002646000067 -:1016900000000000230000000000000925E6FFFF15 -:1016A000000000000B6E000000000003E7CF2C00DC -:1016B000000000082200001B0000000C695200001E -:1016C0000000000C298000000000001020530000E2 -:1016D000000000188000FEE7000000002FD5000089 -:1016E000000000002A00000000000010003F000C75 -:1016F000000000000666000000000000866118007F -:1017000000000009026000F000000010B70C08089B -:10171000000000002C4000000000000C7366001068 -:10172000000000082C800018000000082D000018A0 -:10173000000000082D8000020000000C5FBF0000C8 -:101740000000001091DE0000000000188000FED8AC -:10175000000000002FD50000000000002A0000005B -:10176000000000002C4000000000000C7366001018 -:10177000000000082C800018000000082D00001850 -:10178000000000082D8000020000000C5FBF000078 -:101790000000001091DE0000000000082C80000313 -:1017A000000000082D000003000000093060FFF079 -:1017B000000000082D8000010000000C29800000BE -:1017C0000000001091DE0000000000082C80001ACC -:1017D000000000082D00001A000000003300000087 -:1017E000000000082D800002000000003180000091 -:1017F0000000001091DE0000000000082C80000CAA -:10180000000000082D00000C000000082D800004DE -:1018100000000010205300000000001091DE0000C6 -:10182000000000188000FEBD000000188000FEBC13 -:10183000000000002A00000000000010001F00004F -:101840000000000C6BD70001000000000F008000BA -:10185000000000080F80000700000018800000153D -:10186000000000000502000000000008220000093E -:1018700000000000286D00000000000029000000AA -:101880000000000F6568001000000003F66C940073 -:1018900000000010B972A0040000000C73E70019EA -:1018A0000000000C21420004000000003BF6000094 -:1018B0000000000C298000000000001020530000F0 -:1018C00000000008220000080000000C6142000433 -:1018D00000000018000A0000000000002A000000BC -:1018E00000000010001F00000000000C6BD700017A -:1018F0000000000F0F470007000000080F800008DD -:101900000000000C2980000000000010205300009F -:10191000000000188000FE9F0000001091DE000013 -:10192000000000002FD5000000000010001F000084 -:101930000000000C6BD700010000000033510000D4 -:10194000000000002A00000000000010B1C60029BD -:101950000000000F0F500007000000000A600000A8 -:10196000000000000AE100000000000F4B620008C8 -:10197000000000090B1600FF0000000F4C62001071 -:10198000000000000D620000000000090D1A00FFB9 -:1019900000000010075000030000000C0D1A0008A2 -:1019A0000000000C0B160008000000000CC6000030 -:1019B000000000000B8000000000000006980000FE -:1019C00000000010205600000000000C2BD7000182 -:1019D000000000080F8000030000001006C2000491 -:1019E0000000000C29000002000000102642000246 -:1019F0000000000C29520003000000082200000132 -:101A000000000010001F00000000000C6BD7000158 -:101A100000000000231B00000000000027111A0036 -:101A200000000000669000000000000C2952000039 -:101A300000000010B197320C0000000C298000005B -:101A40000000000006980000000000102053000075 -:101A50000000000C295200030000000022C58C0089 -:101A600000000010001F00000000000C6BD70001F8 -:101A700000000010205600000000000C2BD70001D1 -:101A8000000000080F800003000000188000FFEF36 -:101A900000000010B1C8001300000010B1C6000320 -:101AA0000000000C298000000000001020530000FE -:101AB0000000000C295200000000000C2952000315 -:101AC0000000001006C200020000000C29520002B3 -:101AD0000000000022C58C00000000002765000007 -:101AE0000000000026E400000000000822000016AC -:101AF00000000010B1C600030000000023480000F1 -:101B000000000010B1800005000000002348000024 -:101B10000000000C298000000000000F0F5000079B -:101B200000000018800000120000000822000016CB -:101B30000000000C298000000000000030140000AC -:101B40000000000030950000000000100750000366 -:101B5000000000090B1600FF000000090D1A00FF2D -:101B60000000000F31160008000000003162340050 -:101B700000000003F162300000000010205F000050 -:101B8000000000002C510000000000092CD1007F53 -:101B9000000000082CD90000000000082D00000003 -:101BA000000000082D80000C000000000000000074 -:101BB0000000001091DE00000000001005C20003CC -:101BC0000000000033000000000000080F80000744 -:101BD000000000102053000000000010001F000053 -:101BE0000000000C6BD70001000000188000FE44CC -:101BF000000000002FD50000000000002A000000B7 -:101C00000000000F0F50000700000010B1C60030A8 -:101C10000000000F4742000800000009070E000FF7 -:101C200000000008070E000800000010001F000060 -:101C30000000000C6BD70001000000080900000143 -:101C40000000000709121C0000000003CBCA92002C -:101C5000000000000B97A2000000000742171C00C4 -:101C6000000000000B0400000000000F0A840003C5 -:101C7000000000000A959C00000000004A009A0045 -:101C80000000000882120001000000010C1708008B -:101C9000000000000C978C000000000002180000FB -:101CA000000000080D00FFFF000000080F80000684 -:101CB0000000000C290000000000001006C2000413 -:101CC0000000000C29520002000000102642000211 -:101CD0000000000C2952000300000008220000014F -:101CE00000000010001F00000000000C6BD7000176 -:101CF00000000010B197320D00000000231B00000F -:101D0000000000002711080000000000669000009D -:101D10000000000C298000000000000002180000F4 -:101D200000000010205300000000000C29520003A6 -:101D30000000000022C5360000000010001F000057 -:101D40000000000C6BD70001000000080F800006A7 -:101D5000000000188000FFF200000000231B0000BC -:101D6000000000002711080000000000669000003D -:101D700000000010B1C8000B0000000C298000001A -:101D800000000010205300000000000C2952000049 -:101D90000000000C295200030000001006C20002DF -:101DA0000000000C295200020000000022C58C0037 -:101DB00000000000276500000000000026E400008D -:101DC0000000000023480000000000082200001767 -:101DD0000000000C2980000000000010001F00001F -:101DE0000000000C6BD70001000000102053000021 -:081DF000000000188000FE0352 -:00000001FF -/* - * This file contains firmware data derived from proprietary unpublished - * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. - * - * Permission is hereby granted for the distribution of this firmware data - * in hexadecimal or equivalent format, provided this copyright notice is - * accompanying it. - */ diff --git a/firmware/bnx2/bnx2-rv2p-09-5.0.0.j3.fw.ihex b/firmware/bnx2/bnx2-rv2p-09-5.0.0.j3.fw.ihex new file mode 100644 index 0000000..69f5e95 --- /dev/null +++ b/firmware/bnx2/bnx2-rv2p-09-5.0.0.j3.fw.ihex @@ -0,0 +1,462 @@ +:100000000000000000000E00000000580000000981 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000DD800000E58000000050000000070 +:1000400000000000000000000000000000000000B0 +:080050000000000000000000A8 +:0800580000000010B180000659 +:100060000000001F05030300000000080500FFFF5B +:10007000000000180002000000000008050000FF5A +:10008000000000180002000000000008AC000001A1 +:1000900000000000050000000000000C2F8000019F +:1000A000000000002B000000000000002B8000007A +:1000B0000000001091E0000200000008AC00000108 +:1000C00000000010203F006B00000010213F0003E3 +:1000D0000000001020BF003A000000188000FFFD63 +:1000E00000000010B1B8B0150000000B2FDF0002B7 +:1000F0000000000003D80000000000002C380000C1 +:10010000000000082C800000000000082D00000006 +:100110000000001091D400000000000806005555B2 +:10012000000000188000007C000000082D80011CE9 +:1001300000000008020000010000001091DE000035 +:100140000000000F42E0001C0000001091840A161D +:1001500000000018800000830000000C29800002CD +:100160000000000C1F800002000000002ADF0000D9 +:10017000000000082A00000F000000000500000039 +:10018000000000188000FFE60000000802000001E7 +:100190000000000F42E0001C0000001091840A18CB +:1001A000000000082C800006000000082D0000065A +:1001B0000000001091D40000000000082D8001060E +:1001C0000000001880000072000000188000FFF19D +:1001D00000000008B1000001000000082C80010CA4 +:1001E000000000082D000008000000082D8000011C +:1001F000000000188000006C0000000B2FDF0002E0 +:100200000000000C1F800002000000002C0700000E +:100210000000001091DE00000000000805005555A8 +:10022000000000188000FFD20000000B2FDF00024A +:100230000000000C1F800000000000002C070000E0 +:100240000000001091DE0000000000080500555578 +:10025000000000188000FFCC0000000C1F8000028E +:100260000000000805005555000000188000FFC977 +:100270000000000C298000020000000C1F8000021A +:10028000000000002ADF0000000000082A0000052E +:100290000000000805005555000000188000FFC34D +:1002A000000000080224004A0000001800040000BA +:1002B000000000188000001C000000188000001ED4 +:1002C000000000188000006500000018800000BBDE +:1002D00000000018800000BA000000188000000034 +:1002E00000000018800000000000001880000000DE +:1002F00000000018800000000000001880000000CE +:1003000000000018800000000000001880000000BD +:1003100000000018800000000000001880000106A6 +:10032000000000188000000000000018800000009D +:100330000000001880000015000000188000001B5D +:10034000000000188000000000000018800000D1AC +:10035000000000188000002F000000188000010637 +:10036000000000188000013100000018800000FC2F +:100370000000001880000155000000188000004EA9 +:100380000000001880000000000000188000008EAF +:100390000000000C1F8000010000000005000000AC +:1003A000000000188000FFA20000001091D400009F +:1003B0000000000C298000010000000C1F800001DB +:1003C000000000082A0000020000000005000000F4 +:1003D000000000188000FF9C0000001091D4000075 +:1003E0000000000C298000010000000C1F800001AB +:1003F0000000000029420000000000082A0000025E +:100400000000000005000000000000188000FF95BB +:10041000000000188000FF9400000010B1BCB00A7A +:100420000000000B2FDF00020000000003D80000D6 +:10043000000000002C3C00000000001091D40000DF +:100440000000000806005555000000188000001745 +:1004500000000018800000CA000000102C6201BAE1 +:100460000000001880000006000000082C80010D2C +:10047000000000082D0000090000001091D40000C9 +:10048000000000082D8001070000001880000024F3 +:100490000000000C298000000000000C1F800000FC +:1004A0000000001091DE0000000000002ADF0000C4 +:1004B000000000082A00000600000008050055554D +:1004C000000000188000FF7E0000001091D40000A2 +:1004D0000000000C298000010000000C1F800001BA +:1004E000000000082A00000B0000000005000000CA +:1004F000000000188000FF780000001800020000D3 +:10050000000000000682000000000010B18A000810 +:1005100000000010B18C14070000000B050AFFFF5B +:1005200000000010B18A000300000000860A1800D5 +:1005300000000010918C0000000000082A0000015B +:100540000000001091D4000000000018000D000011 +:1005500000000000050200000000001091DE000015 +:1005600000000018000A00000000000006820000E1 +:100570000000001091DE000000000010BEE1000548 +:10058000000000188000FF5F0000000105611400FA +:1005900000000010918A000200000008B0E1000194 +:1005A00000000018000D000000000000068200009E +:1005B0000000001091DE000000000010BEE2000507 +:1005C000000000188000FF570000000105621400C1 +:1005D00000000010918A000200000008B1620001D2 +:1005E00000000018000D000000000010B1A0B013C2 +:1005F0000000000B2FDF0002000000002C20000094 +:10060000000000082C800000000000082D00000001 +:100610000000001091D400000000000806005555AD +:10062000000000188000FFDC000000082D80011C85 +:1006300000000010001F0000000000188000FFE60E +:100640000000000F476000080000000F060E0001C8 +:10065000000000000F580000000000000A640000C5 +:10066000000000000AE50000000000090B66FFFF23 +:10067000000000000D610000000000188000001361 +:100680000000000F476000080000000B2FDF000291 +:10069000000000082C800000000000082D00000071 +:1006A0000000001091D40000000000082D80011C03 +:1006B0000000000F060E000100000010001F0000E7 +:1006C000000000000F580000000000188000FFD458 +:1006D000000000000A640000000000000AE50000BD +:1006E000000000090B66FFFF000000000D61000024 +:1006F00000000000026200000000000B2FDF00027B +:10070000000000003104000000000000309A0000EA +:10071000000000090560000F00000010B18A000A07 +:100720000000000005634C0000000008050A0012EC +:1007300000000010B9621403000000000300000074 +:100740000000001880000005000000188000FF2451 +:1007500000000010B60614030000000803060001A4 +:10076000000000188000FF2A000000000C9618000E +:10077000000000090C99FFFF00000004CC99340030 +:1007800000000010B1963202000000080F80000047 +:100790000000000C298000010000000C295200011B +:1007A0000000000C29520000000000080200000EAA +:1007B000000000080280001A00000010B1C40A0204 +:1007C00000000008020000030000000822000001F1 +:1007D0000000000C1F800001000000002ADF000064 +:1007E000000000002A000800000000080500555520 +:1007F000000000188000FF180000000B2FDF00022F +:100800000000001091D40000000000082A00000140 +:10081000000000002C2000000000001091D4000017 +:10082000000000082C800000000000082D000000DF +:10083000000000082D80011C000000188000FFA3AC +:10084000000000082C800006000000082D000006B3 +:1008500000000000308000000000000031000000B7 +:10086000000000082D8000060000000C2980000117 +:100870000000000C1F8000010000001091DE00004D +:10088000000000002ADF0000000000082A0000101D +:100890000000000005000000000000188000FF03B9 +:1008A0000000001091A0B009000000082C80010D8C +:1008B000000000082D0000090000001091D4000085 +:1008C000000000082D800107000000188000FF9C38 +:1008D000000000188000001000000008AC000001BB +:1008E000000000188000000B000000000380B00032 +:1008F0000000000B2FDF0002000000002C00400071 +:100900000000001091D400000000000806005555BA +:10091000000000188000FF7E0000001880000031F9 +:1009200000000018800000060000000B2FDF00020E +:10093000000000002C000E00000000082A00000744 +:100940000000000805005555000000188000FEED6D +:1009500000000000068200000000000C2980000159 +:100960000000000C1F800001000000100CE70007D1 +:10097000000000090562FFFF00000010BA6C1405BA +:10098000000000002ADF000000000000210000003D +:10099000000000082A0000050000001091D40000AB +:1009A000000000082C80010C000000082D00000849 +:1009B0000000000C31620018000000082D800001CA +:1009C000000000188000FF7200000018000D0000F9 +:1009D00000000010B1A0B00E0000000B2FDF0002DD +:1009E0000000000003D80000000000002C200000E0 +:1009F0000000001091D400000000001880000015D5 +:100A0000000000102C620002000000188000000CA2 +:100A10000000000B2FDF0002000000002C07000088 +:100A20000000000C1F8000010000001091DE00009B +:100A3000000000080500FFFF000000188000FECF46 +:100A4000000000082C80010D000000082D000009A6 +:100A50000000001091D40000000000082D80010764 +:100A6000000000188000FF690000000C29800001D0 +:100A70000000000C1F8000010000001091DE00004B +:100A8000000000002ADF0000000000082A00000A21 +:100A90000000000005000000000000188000FEC3F8 +:100AA0000000000006820000000000082C80010CFD +:100AB000000000082D000008000000082D8001340F +:100AC000000000000000000000000010205F000097 +:100AD000000000082C800140000000082D00003CB0 +:100AE000000000082D80012400000000000000002C +:100AF0000000001091DE0000000000082C80008043 +:100B0000000000082D000000000000082D800105F5 +:100B100000000010BEE20005000000188000FEACDE +:100B2000000000010562140000000010918A00021C +:100B300000000008B16200010000001091DE00001A +:100B400000000018000D00000000001091D400000B +:100B5000000000080600AAAA000000188000FF3567 +:100B60000000000C298000010000000C1F80000123 +:100B7000000000082A000009000000080500AAAAD9 +:100B8000000000188000FEA60000001091D40000B4 +:100B90000000000806005555000000188000FF2DD9 +:100BA0000000001091A03C0200000010B1E66207B6 +:100BB0000000000B2FDF0002000000002C310000BD +:100BC000000000092CB1007F000000082CD90000B3 +:100BD000000000082D000000000000082D80010D1D +:100BE00000000010B1A8000600000010205F000007 +:100BF000000000002C200000000000002CA70000D6 +:100C0000000000082D000010000000082D800108E1 +:100C1000000000188000FF2800000010B1A600109E +:100C200000000010001F00000000000F0F30000740 +:100C3000000000000A600000000000000AE100005F +:100C40000000000F4B620008000000090B1600FFB7 +:100C5000000000000D620000000000090D1A00FFF6 +:100C600000000010073000030000000C0D1A0008FF +:100C70000000000C0B1600080000000F4CE30018E9 +:100C8000000000000C992C0000000004CC993400F6 +:100C9000000000080F8000000000000C2980000107 +:100CA00000000000333100000000000822000016A0 +:100CB000000000002ADF0000000000082A00000CED +:100CC00000000010009F0000000000000F20000046 +:100CD0000000000C1F8000010000000805005555B1 +:100CE000000000188000FE7A0000001091D400007F +:100CF000000000080600AAAA000000188000FF01FA +:100D00000000000F4722000800000009070E000F36 +:100D100000000008070E0008000000080280000123 +:100D20000000000702851C00000000088285000109 +:100D30000000000002854C000000000742851C00F6 +:100D400000000003C3AA52000000000003B10E001F +:100D5000000000074B071C000000000F0F300007C9 +:100D60000000000F0A960003000000000A955C00D6 +:100D7000000000004A005A00000000000C960A0023 +:100D8000000000090C99FFFF000000080D00FFFFA4 +:100D900000000010B1963202000000080F8000052C +:100DA00000000010B1A8000800000010205F000043 +:100DB0000000000B2FDF0002000000002C200000CC +:100DC000000000002CA70000000000082D0000100B +:100DD000000000082D800108000000188000FEEFD0 +:100DE0000000000C2980000100000010001F00001E +:100DF0000000000C1F800001000000002ADF00003E +:100E0000000000082A00000D000000080500AAAA42 +:100E1000000000188000FE540000001091D4000073 +:100E20000000000806005555000000188000FEDB99 +:100E30000000000C298000010000000C1F80000150 +:100E4000000000082A0000070000000805005555B2 +:080E5000000000188000FE4CB8 +:080E580000000010B18000044D +:100E60000000001F0503030000000008050000FF4C +:100E70000000001800020000000000002A0000002E +:100E800000000010B1D400000000001091DE00004E +:100E9000000000102053000000000010001F0000A0 +:100EA000000000002F80AA000000000C2980000133 +:100EB000000000080254000E000000002C4000005A +:100EC000000000092952003F000000180004000043 +:100ED00000000018800000100000001880000011C1 +:100EE000000000188000003900000018800000FD9C +:100EF00000000018800000FC00000018800000FBCB +:100F000000000018800000FB0000001880000000B6 +:100F1000000000188000011300000018800000F796 +:100F2000000000188000000B00000018800001176E +:100F300000000018800001650000001880000063B8 +:100F400000000018800000CE00000018800000DEC5 +:100F5000000000002A000000000000188000FFE5EB +:100F6000000000002A0000000000000C29800000A2 +:100F7000000000188000FFE2000000002A000000CE +:100F8000000000188000FFE00000001800020000D0 +:100F900000000000050200000000001091963421BE +:100FA00000000010205F0000000000002C1E000068 +:100FB000000000082C800006000000082D0000063C +:100FC000000000082D800102000000000000000069 +:100FD0000000001091DE0000000000000D61000024 +:100FE00000000018000A00000000000005020000D8 +:100FF000000000109196341600000010205F0000E1 +:101000000000000009D80000000000002C1E0000B5 +:10101000000000082C80010E000000082D00000ACE +:10102000000000082D800102000000000000000008 +:101030000000001091DE0000000000000D620000C2 +:10104000000000002C13000000000018000A00003F +:101050000000000005020000000000109196340915 +:1010600000000010205F0000000000002C1E0000A7 +:10107000000000082C800006000000082D00006A17 +:10108000000000082D8001020000000000000000A8 +:101090000000001091DE0000000000000D7A00004A +:1010A00000000018000A0000000000002A000000F4 +:1010B000000000000D61000000000000036200005D +:1010C00000000010234200C10000000002638C00F9 +:1010D0000000000026460000000000080204001284 +:1010E00000000010B9060827000000000F5800009B +:1010F000000000000A640000000000000AE5000093 +:10110000000000090B66FFFF000000000C0000005B +:10111000000000000B800000000000080CC6001258 +:10112000000000188000FFCE000000080F800003C0 +:10113000000000000000000000000010009F000000 +:101140000000000827110012000000006690000057 +:1011500000000008A31B001200000010B19800035B +:1011600000000010001F0000000000080F800004B5 +:101170000000000822000003000000082C80000C82 +:10118000000000082D00000C00000010009F00006F +:1011900000000000259600000000000C29800000DF +:1011A00000000000066600000000000086611800D4 +:1011B000000000090260000F0000000F020400029E +:1011C00000000010B60C08050000000C1FBF000056 +:1011D000000000102866000300000008078F0001CF +:1011E0000000000C33660010000000003214000004 +:1011F00000000000329500000000000573662C001E +:101200000000000031E32E00000000082D800010D7 +:10121000000000188000FF8E000000002300000086 +:101220000000000925E6FFFF000000082200000B77 +:101230000000000C695200000000000C2980000032 +:101240000000001028660075000000188000FF876D +:10125000000000002A000000000000082C80004070 +:10126000000000082D000020000000082D80011C57 +:1012700000000000000000000000001091DE0000EF +:101280000000000F42EA001000000010004F0004B0 +:1012900000000010B746920000000008024900124A +:1012A00000000010B5840A00000000000D6100007D +:1012B00000000010BA6634570000000883050012D1 +:1012C00000000010004F0002000000000349000071 +:1012D0000000000183068C000000000083C60C00A3 +:1012E00000000010B1870011000000000B6E00002C +:1012F00000000010BEE90005000000188000FF6E2D +:10130000000000010569140000000010918A00022D +:1013100000000008B4E9000100000010B1E92C4A07 +:101320000000000086692C000000000002000000A0 +:101330000000000902EAFFFF00000010000C00029C +:101340000000000002040A000000000F460C00012B +:101350000000000F0285000100000010918C01FCCC +:1013600000000010B7040E41000000000F40000014 +:10137000000000000D610000000000000A64000091 +:10138000000000000AE50000000000090B66FFFFF6 +:10139000000000000C000000000000000B800000B6 +:1013A000000000080C860012000000080F800003F7 +:1013B0000000000C2952000000000010009F0000F7 +:1013C00000000008271100120000000066900000D5 +:1013D0000000000026460000000000002306000078 +:1013E00000000010B198000500000010001F000070 +:1013F000000000080F800004000000000000000052 +:1014000000000010001F0000000000003214000067 +:1014100000000000329500000000000031E32E00C3 +:101420000000000573662C000000000025960000F7 +:1014300000000010B18700160000000C2980000099 +:101440000000000F0F6B0007000000000D69000096 +:10145000000000000A6C0000000000000AED00001F +:10146000000000000B6E0000000000000B80000078 +:10147000000000000C870000000000080F8000033F +:1014800000000010205300000000000C6952000111 +:1014900000000010001F00000000000022C58C00AA +:1014A00000000000231B00000000000027110000C6 +:1014B000000000002690000000000010B8170E0386 +:1014C0000000000C29800000000000188000FFF6DA +:1014D00000000010B1980002000000080F80000416 +:1014E000000000082200001A000000082C80000CF8 +:1014F000000000082D00000C000000082D800010E6 +:1015000000000010001F0000000000000D6E000031 +:1015100000000003E7CF34000000000C2980000029 +:101520000000001091DE000000000010B1870007ED +:101530000000000036140000000000003695000096 +:101540000000000037160000000000082C8000504A +:10155000000000082D000030000000082D80000C65 +:10156000000000188000FF24000000002646000054 +:1015700000000000230000000000000925E6FFFF36 +:10158000000000000B6E000000000003E7CF2C00FD +:10159000000000082200001B0000000C695200003F +:1015A0000000000C29800000000000188000FF1BD4 +:1015B000000000002A00000000000010086600057E +:1015C00000000000066600000000000086611800B0 +:1015D00000000009026000F000000010B60C0802D4 +:1015E000000000188000FF140000000006820000C8 +:1015F00000000010B18F000000000008878F00017C +:101600000000000C73660010000000082C80001819 +:10161000000000082D000018000000082D800002C6 +:101620000000000C5FBF00000000001091DE000011 +:1016300000000018000D0000000000002A0000005B +:1016400000000010286601F5000000082C8000034F +:10165000000000082D000003000000093060FFF0CA +:10166000000000082D8000010000000C298000000F +:101670000000001091DE0000000000082C80001A1D +:10168000000000082D00001A00000005736600002D +:10169000000000082D8000020000000031800000E2 +:1016A0000000001091DE0000000000082C80000CFB +:1016B000000000082D00000C000000082D80000430 +:1016C000000000188000FEF8000000180002000072 +:1016D000000000188000FEF6000000002A00000054 +:1016E00000000010001F0000000000000F0080003C +:1016F000000000080F800007000000188000001A9A +:1017000000000000280A00000000000005020000A0 +:10171000000000082200000900000000290000006D +:101720000000000F6568001000000003F66C9400D4 +:1017300000000010B972A0040000000C73E700194B +:101740000000000C21420004000000003CF80000F2 +:101750000000000C29800000000000102053000051 +:1017600000000008220000080000000C6142000494 +:1017700000000018000A0000000000000502000040 +:101780000000000C61420000000000100142000354 +:101790000000000C33E7001D0000000C6142000255 +:1017A00000000018000A0000000000002A000000ED +:1017B00000000010001F00000000000F0F4700078E +:1017C000000000080F8000080000000C29800000C5 +:1017D00000000010009F0000000000188000FED5EF +:1017E0000000000033510000000000002A0000004B +:1017F00000000010B1C600230000000F0F500007CA +:10180000000000000A600000000000000AE1000083 +:101810000000000F4B620008000000090B1600FFDB +:101820000000000F4C620010000000000D6200007C +:10183000000000090D1A00FF00000010075000030F +:101840000000000C0D1A00080000000C0B16000828 +:10185000000000000CC60000000000000B8000002B +:101860000000000006980000000000080F80000340 +:101870000000001006C200040000000C2900000255 +:1018800000000010264200020000000C2952000354 +:10189000000000082200000100000010009F00006E +:1018A00000000000231B00000000000027111A00A8 +:1018B00000000000669000000000000C29520000AB +:1018C00000000010B19732090000000C29800000D0 +:1018D00000000000069800000000001020530000E7 +:1018E0000000000C295200030000000022C58C00FB +:1018F00000000010001F0000000000080F8000031F +:10190000000000188000FFF300000010B1C80013B1 +:1019100000000010B1C600030000000C2980000088 +:1019200000000010205300000000000C29520000AD +:101930000000000C295200030000001006C2000243 +:101940000000000C295200020000000022C58C009B +:1019500000000000276500000000000026E40000F1 +:10196000000000082200001600000010B1C60003AD +:10197000000000002348000000000010B1800005B6 +:1019800000000000234800000000000C2980000037 +:101990000000000F0F500007000000188000001228 +:1019A00000000008220000160000000C2980000042 +:1019B000000000003014000000000000309500001E +:1019C0000000001007500003000000090B1600FF84 +:1019D000000000090D1A00FF0000000F311600087A +:1019E000000000003162340000000003F1623000AA +:1019F00000000010205F0000000000002C510000DB +:101A0000000000092CD1007F000000082CD9000044 +:101A1000000000082D000000000000082D80000CD0 +:101A200000000000000000000000001091DE000037 +:101A30000000001005C20004000000080F8000072D +:101A4000000000003300000000000010009F0000B4 +:101A5000000000188000FE86000000002A00000040 +:101A60000000000F0F50000700000010B1C6002D4D +:101A70000000000F4742000800000009070E000F99 +:101A800000000008070E000800000010001F000002 +:101A900000000008090000010000000709121C00F6 +:101AA00000000003CBCA9200000000000B97A200C8 +:101AB0000000000742171C00000000000B0400009B +:101AC0000000000F0A840003000000000A959C003B +:101AD000000000004A009A00000000088212000185 +:101AE000000000010C170800000000000C978C009B +:101AF0000000000002180000000000080D00FFFFB9 +:101B0000000000080F8000060000000C2900000003 +:101B10000000001006C200040000000C2952000260 +:101B200000000010264200020000000C29520003B1 +:101B3000000000082200000100000010009F0000CB +:101B400000000010B197320C00000000231B0000C1 +:101B5000000000002711080000000000669000004F +:101B60000000000C298000000000000002180000A6 +:101B700000000010205300000000000C2952000358 +:101B80000000000022C5360000000010001F000009 +:101B9000000000080F800006000000188000FFF41D +:101BA00000000000231B00000000000027110800B7 +:101BB000000000006690000000000010B1C8000B9B +:101BC0000000000C298000000000001020530000DD +:101BD0000000000C295200000000000C29520003F4 +:101BE0000000001006C200020000000C2952000292 +:101BF0000000000022C58C000000000027650000E6 +:101C00000000000026E4000000000000234800005F +:101C100000000008220000170000000C29800000CE +:101C200000000010001F0000000000188000FE4BA4 +:00000001FF +/* + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ diff --git a/firmware/bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw.ihex b/firmware/bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw.ihex new file mode 100644 index 0000000..533dbea --- /dev/null +++ b/firmware/bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw.ihex @@ -0,0 +1,498 @@ +:100000000000000000000E78000000580000000909 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000FA800000ED0000000050000000026 +:1000400000000000000000000000000000000000B0 +:080050000000000000000000A8 +:0800580000000010B180000659 +:100060000000001F03030300000000080500FFFF5D +:10007000000000180002000000000008050000FF5A +:10008000000000180002000000000008AC000001A1 +:1000900000000000050000000000000C2F8000019F +:1000A000000000002B000000000000002B8000007A +:1000B0000000001091E0000200000008AC00000108 +:1000C00000000010203F006B00000010213F0003E3 +:1000D0000000001020BF003A000000188000FFFD63 +:1000E00000000010B1B8B0150000000B2FDF0002B7 +:1000F0000000000003D80000000000002C380000C1 +:10010000000000082C800000000000082D00000006 +:100110000000001091D400000000000806005555B2 +:10012000000000188000008F000000082D80011CD6 +:1001300000000008020000010000001091DE000035 +:100140000000000F42E0001C0000001091840A161D +:1001500000000018800000960000000C29800002BA +:100160000000000C1F800002000000002ADF0000D9 +:10017000000000082A00000F000000000500000039 +:10018000000000188000FFE60000000802000001E7 +:100190000000000F42E0001C0000001091840A18CB +:1001A000000000082C800006000000082D0000065A +:1001B0000000001091D40000000000082D8001060E +:1001C0000000001880000085000000188000FFF18A +:1001D00000000008B1000001000000082C80010CA4 +:1001E000000000082D000008000000082D8000011C +:1001F000000000188000007F0000000B2FDF0002CD +:100200000000000C1F800002000000002C0700000E +:100210000000001091DE00000000000805005555A8 +:10022000000000188000FFD20000000B2FDF00024A +:100230000000000C1F800000000000002C070000E0 +:100240000000001091DE0000000000080500555578 +:10025000000000188000FFCC0000000C1F8000028E +:100260000000000805005555000000188000FFC977 +:100270000000000C298000020000000C1F8000021A +:10028000000000002ADF0000000000082A0000052E +:100290000000000805005555000000188000FFC34D +:1002A000000000080224004A0000001800040000BA +:1002B000000000188000001C000000188000001ED4 +:1002C000000000188000007800000018800000CABC +:1002D00000000018800000C9000000188000000025 +:1002E00000000018800000000000001880000000DE +:1002F00000000018800000000000001880000000CE +:1003000000000018800000000000001880000000BD +:100310000000001880000000000000188000011597 +:10032000000000188000000000000018800000009D +:100330000000001880000015000000188000001B5D +:10034000000000188000000000000018800000E09D +:10035000000000188000002F000000188000011528 +:100360000000001880000140000000188000010B10 +:100370000000001880000164000000188000006187 +:100380000000001880000000000000188000009DA0 +:100390000000000C1F8000010000000005000000AC +:1003A000000000188000FFA20000001091D400009F +:1003B0000000000C298000010000000C1F800001DB +:1003C000000000082A0000020000000005000000F4 +:1003D000000000188000FF9C0000001091D4000075 +:1003E0000000000C298000010000000C1F800001AB +:1003F0000000000029420000000000082A0000025E +:100400000000000005000000000000188000FF95BB +:10041000000000188000FF9400000010B1BCB00A7A +:100420000000000B2FDF00020000000003D80000D6 +:10043000000000002C3C00000000001091D40000DF +:100440000000000806005555000000188000002A32 +:1004500000000018800000D9000000102C6201BAD2 +:100460000000001880000006000000082C80010D2C +:10047000000000082D0000090000001091D40000C9 +:10048000000000082D8001070000001880000037E0 +:100490000000000C298000000000000C1F800000FC +:1004A0000000001091DE0000000000002ADF0000C4 +:1004B000000000082A00000600000008050055554D +:1004C000000000188000FF7E0000001091D40000A2 +:1004D0000000000C298000010000000C1F800001BA +:1004E000000000082A00000B0000000005000000CA +:1004F000000000188000FF780000000002020000E9 +:1005000000000000029A000000000000060C2C0011 +:1005100000000004C60C340000000010001F0000A2 +:1005200000000010B196180C0000000806960004A8 +:1005300000000009068DFFFC00000004CD051A0034 +:1005400000000004CC9A18000000001020D7000022 +:100550000000000C2B56000000000000000000000E +:1005600000000000000000000000001020D7000084 +:10057000000000080F80000100000010B18001F4AD +:1005800000000010001F00000000000C6B5600006F +:1005900000000018000400000000000006820000B7 +:1005A00000000010B18A000800000010B18C140790 +:1005B0000000000B050AFFFF00000010B18A0003D5 +:1005C00000000000860A180000000010918C000056 +:1005D000000000082A0000010000001091D4000073 +:1005E00000000018000D00000000000005020000DF +:1005F0000000001091DE000000000018000A00005A +:1006000000000000068200000000001091DE0000E3 +:1006100000000010BEE10005000000188000FF4C43 +:10062000000000010561140000000010918A000222 +:1006300000000008B0E1000100000018000D0000FB +:1006400000000000068200000000001091DE0000A3 +:1006500000000010BEE20005000000188000FF440A +:10066000000000010562140000000010918A0002E1 +:1006700000000008B162000100000018000D000039 +:1006800000000010B1A0B0130000000B2FDF00022B +:10069000000000002C200000000000082C8000005A +:1006A000000000082D0000000000001091D40000A0 +:1006B0000000000806005555000000188000FFDC0F +:1006C000000000082D80011C00000010001F000029 +:1006D000000000188000FFE60000000F47600008DF +:1006E0000000000F060E0001000000000F5800007F +:1006F000000000000A640000000000000AE500009D +:10070000000000090B66FFFF000000000D61000003 +:1007100000000018800000130000000F4760000870 +:100720000000000B2FDF0002000000082C800000FA +:10073000000000082D0000000000001091D400000F +:10074000000000082D80011C0000000F060E0001B3 +:1007500000000010001F0000000000000F58000003 +:10076000000000188000FFD4000000000A640000B0 +:10077000000000000AE50000000000090B66FFFF12 +:10078000000000000D610000000000000262000097 +:100790000000000B2FDF0002000000003104000009 +:1007A00000000000309A0000000000090560000F02 +:1007B00000000010B18A000A0000000005634C0030 +:1007C00000000008050A001200000010B9621403BE +:1007D0000000000003000000000000188000000579 +:1007E000000000188000FF1100000010B60614037E +:1007F0000000000803060001000000188000FF1739 +:10080000000000188000FF9F0000000C29800001FC +:100810000000000C295200010000000C29520000C9 +:10082000000000080200000E000000080280001A0C +:1008300000000010B1C40A0200000008020000031A +:1008400000000008220000010000000C1F800001D1 +:10085000000000002ADF0000000000002A0008005D +:100860000000000805005555000000188000FF0931 +:100870000000000B2FDF00020000001091D40000E8 +:10088000000000082A000001000000002C200000E9 +:100890000000001091D40000000000082C8000002F +:1008A000000000082D000000000000082D80011C41 +:1008B000000000188000FFA7000000082C80000640 +:1008C000000000082D00000600000000308000003D +:1008D0000000000031000000000000082D8000062C +:1008E0000000000C298000010000000C1F800001A6 +:1008F0000000001091DE0000000000002ADF000070 +:10090000000000082A0000100000000005000000A0 +:10091000000000188000FEF40000001091A0B00953 +:10092000000000082C80010D000000082D000009C7 +:100930000000001091D40000000000082D80010785 +:10094000000000188000FFA00000001880000010C8 +:1009500000000008AC000001000000188000000B3F +:10096000000000000380B0000000000B2FDF000239 +:10097000000000002C0040000000001091D4000096 +:100980000000000806005555000000188000FF8296 +:1009900000000018800000310000001880000006F0 +:1009A0000000000B2FDF0002000000002C000E00F2 +:1009B000000000082A000007000000080500555547 +:1009C000000000188000FEDE00000000068200002B +:1009D0000000000C298000010000000C1F800001B5 +:1009E000000000100CE70007000000090562FFFF8F +:1009F00000000010BA6C1405000000002ADF00009F +:100A00000000000021000000000000082A0000058E +:100A10000000001091D40000000000082C80010CA0 +:100A2000000000082D0000080000000C31620018D2 +:100A3000000000082D800001000000188000FF76F3 +:100A400000000018000D000000000010B1A0B00E62 +:100A50000000000B2FDF00020000000003D80000A0 +:100A6000000000002C2000000000001091D40000C5 +:100A70000000001880000015000000102C62000229 +:100A8000000000188000000C0000000B2FDF0002A7 +:100A9000000000002C0700000000000C1F80000177 +:100AA0000000001091DE0000000000080500FFFFBC +:100AB000000000188000FEC0000000082C80010D1E +:100AC000000000082D0000090000001091D4000073 +:100AD000000000082D800107000000188000FF6D55 +:100AE0000000000C298000010000000C1F800001A4 +:100AF0000000001091DE0000000000002ADF00006E +:100B0000000000082A00000A0000000005000000A4 +:100B1000000000188000FEB4000000000682000003 +:100B2000000000082C80010C000000082D000008C7 +:100B3000000000082D8001340000000000000000CB +:100B400000000010205F0000000000082C80014021 +:100B5000000000082D00003C000000082D80011C52 +:100B600000000000000000000000001091DE000006 +:100B7000000000082C800080000000082D0000000C +:100B8000000000082D80010500000010BEE20005F5 +:100B9000000000188000FE9D0000000105621400A6 +:100BA00000000010918A000200000008B1620001FC +:100BB0000000001091DE000000000018000D000091 +:100BC0000000001091D40000000000080600AAAA4E +:100BD000000000188000FF390000000C298000018F +:100BE0000000000C1F800001000000082A0000091E +:100BF000000000080500AAAA000000188000FE9767 +:100C00000000001091D400000000000806005555B7 +:100C1000000000188000FF310000001091A03C028D +:100C200000000010B1E662070000000B2FDF000299 +:100C3000000000002C310000000000092CB1007FF2 +:100C4000000000082CD90000000000082D00000062 +:100C5000000000082D80010D00000010B1A8000662 +:100C600000000010205F0000000000002C200000A9 +:100C7000000000002CA70000000000082D0000105C +:100C8000000000082D800108000000188000FF2CE3 +:100C900000000010B1A6001000000010001F0000AE +:100CA0000000000F0F300007000000000A60000085 +:100CB000000000000AE100000000000F4B62000885 +:100CC000000000090B1600FF000000000D6200008C +:100CD000000000090D1A00FF00000010073000039B +:100CE0000000000C0D1A00080000000C0B16000894 +:100CF0000000000F4CE30018000000000C992C00CD +:100D000000000004CC993400000000080F800000AF +:100D10000000000C298000010000000033310000B9 +:100D20000000000822000016000000002ADF00007A +:100D3000000000082A00000C00000010009F0000C6 +:100D4000000000000F2000000000000C1F800001C8 +:100D50000000000805005555000000188000FE6BDB +:100D60000000001091D40000000000080600AAAAAC +:100D7000000000188000FF050000000F4722000857 +:100D800000000009070E000F00000008070E000811 +:100D900000000008028000010000000702851C001E +:100DA00000000008828500010000000002854C0060 +:100DB0000000000742851C0000000003C3AA520087 +:100DC0000000000003B10E00000000074B071C00EC +:100DD0000000000F0F3000070000000F0A9600030C +:100DE000000000000A955C00000000004A005A0064 +:100DF000000000000C960A00000000090C99FFFF9B +:100E0000000000080D00FFFF00000010B196320244 +:100E1000000000080F80000500000010B1A80008C5 +:100E200000000010205F00000000000B2FDF000218 +:100E3000000000002C200000000000002CA7000093 +:100E4000000000082D000010000000082D8001089F +:100E5000000000188000FEF30000000C2980000153 +:100E600000000010001F00000000000C1F800001A7 +:100E7000000000002ADF0000000000082A00000D2A +:100E8000000000080500AAAA000000188000FE4526 +:100E90000000001091D40000000000080600555525 +:100EA000000000188000FEDF0000000C2980000117 +:100EB0000000000C1F800001000000082A0000074D +:100EC0000000000805005555000000188000FE3D98 +:100ED00000000010B18000040000001F03030300A5 +:100EE00000000008050000FF0000001800020000DC +:100EF000000000002A00000000000010B1D4000033 +:100F00000000001091DE00000000001020530000DF +:100F100000000010001F00000000000C6BD7000153 +:100F2000000000002F80AA000000000C29800001B2 +:100F3000000000080254000F000000002C400000D8 +:100F4000000000092952003F0000001800040000C2 +:100F50000000001880000010000000188000001140 +:100F6000000000188000004A0000001880000128DE +:100F700000000018800001270000001880000126F2 +:100F8000000000188000012600000018800000000A +:100F9000000000188000013F0000001880000122BE +:100FA000000000188000000B0000001880000145C0 +:100FB000000000188000019A000000188000007BEB +:100FC00000000018800000F90000001880000109EE +:100FD000000000002A000000000000188000FFE46C +:100FE000000000002A0000000000000C2980000022 +:100FF000000000188000FFE1000000002A0000004F +:10100000000000188000FFDF0000000003820000E5 +:10101000000000188000FFDA000000010C16140028 +:10102000000000008C1814000000001091980003CC +:10103000000000080C96000200000010B1800003C0 +:10104000000000080C960001000000000C000000E9 +:10105000000000000D1900000000001020560000E4 +:101060000000000C2BD70001000000080F800001D9 +:10107000000000000000000000000010001F000041 +:101080000000000C6BD7000100000010011301F1FB +:10109000000000180007000000000000050200002A +:1010A000000000109196342100000010205F000025 +:1010B000000000002C1E0000000000082C8000062C +:1010C000000000082D000006000000082D8001022D +:1010D00000000000000000000000001091DE000091 +:1010E000000000000D61000000000018000A000070 +:1010F0000000000005020000000000109196341668 +:1011000000000010205F00000000000009D800006F +:10111000000000002C1E0000000000082C80010EC2 +:10112000000000082D00000A000000082D800102C8 +:1011300000000000000000000000001091DE000030 +:10114000000000000D620000000000002C130000F1 +:1011500000000018000A0000000000000502000066 +:10116000000000109196340900000010205F00007C +:10117000000000002C1E0000000000082C8000066B +:10118000000000082D00006A000000082D80010208 +:1011900000000000000000000000001091DE0000D0 +:1011A000000000000D7A000000000018000A000096 +:1011B000000000002A000000000000000D61000097 +:1011C000000000000362000000000010234200DB6A +:1011D0000000000002638C000000000026460000B2 +:1011E000000000080204001200000010B906082EDA +:1011F000000000000F580000000000000A6400001A +:10120000000000000AE50000000000090B66FFFF77 +:10121000000000000C000000000000000B80000037 +:10122000000000080CC60012000000188000FFCE6D +:1012300000000010205600000000000C2BD7000119 +:10124000000000080F800003000000000000000004 +:1012500000000010001F00000000000C6BD7000110 +:101260000000000827110012000000006690000036 +:1012700000000008A31B001200000010B198000637 +:1012800000000010001F00000000000C6BD70001E0 +:1012900000000010205600000000000C2BD70001B9 +:1012A000000000080F800004000000082200000376 +:1012B000000000082C80000C000000082D00000C2D +:1012C00000000010001F00000000000C6BD70001A0 +:1012D00000000000259600000000000C298000009E +:1012E0000000000006660000000000008661180093 +:1012F000000000090260000F0000000F020400025D +:1013000000000010B60C08050000000C1FBF000014 +:10131000000000102866000300000008078F00018D +:101320000000000C336600100000000032140000C2 +:1013300000000000329500000000000573662C00DC +:101340000000000031E32E00000000082D80001096 +:10135000000000188000FF7500000000230000005E +:101360000000000925E6FFFF000000082200000B36 +:101370000000000C695200000000000C29800000F1 +:101380000000001028660088000000188000FF6E32 +:10139000000000002A000000000000082C8000402F +:1013A000000000082D000020000000082D80011C16 +:1013B00000000000000000000000001091DE0000AE +:1013C0000000000F42EA001000000010004F00046F +:1013D00000000010B7469200000000080249001209 +:1013E00000000010B5840A00000000000D6100003C +:1013F00000000010BA66346A00000008830500127D +:1014000000000010004F000200000000034900002F +:101410000000000183068C000000000083C60C0061 +:1014200000000010B1870011000000000B6E0000EA +:1014300000000010BEE90005000000188000FF5504 +:10144000000000010569140000000010918A0002EC +:1014500000000008B4E9000100000010B1E92C5DB3 +:101460000000000086692C0000000000020000005F +:101470000000000902EAFFFF00000010000C00025B +:101480000000000002040A000000000F460C0001EA +:101490000000000F0285000100000010918C01FC8B +:1014A00000000010B7040E54000000000F400000C0 +:1014B000000000000D610000000000000A64000050 +:1014C000000000000AE50000000000090B66FFFFB5 +:1014D000000000000C000000000000000B80000075 +:1014E000000000080C8600120000001020560000CA +:1014F0000000000C2BD70001000000080F80000343 +:101500000000000C2952000000000010001F000025 +:101510000000000C6BD7000100000008271100122A +:101520000000000066900000000000002646000059 +:10153000000000002306000000000010B198000920 +:1015400000000010001F00000000000C6BD700011D +:1015500000000010205600000000000C2BD70001F6 +:10156000000000080F8000040000000000000000E0 +:1015700000000010001F00000000000C6BD70001ED +:10158000000000003214000000000000329500004E +:101590000000000031E32E000000000573662C00FF +:1015A000000000002596000000000010B187002117 +:1015B0000000000C298000000000000F0F6B0007E6 +:1015C000000000000D690000000000000A6C00002F +:1015D000000000000AED0000000000000B6E00009B +:1015E000000000000B800000000000000C870000DD +:1015F000000000188000FF1E000000010C161400FF +:10160000000000008C181400000000080C96000177 +:101610000000001091980002000000080C990001E1 +:10162000000000000D190000000000000C00000088 +:1016300000000010205600000000000C2BD7000115 +:10164000000000080F80000100000010205300007F +:101650000000000C6952000100000010001F000093 +:101660000000000C6BD700010000000022C58C00B8 +:1016700000000000231200000000000027110000FD +:10168000000000002690000000000010B8170E03B4 +:101690000000000C29800000000000188000FFEB13 +:1016A0000000000082970E0000000000A3120A0054 +:1016B000000000082200001A000000082C80000C26 +:1016C000000000082D00000C000000082D80001014 +:1016D00000000010001F00000000000C6BD700018C +:1016E000000000000D6E000000000003E7CF340092 +:1016F0000000000C298000000000001091DE0000B6 +:1017000000000010B1870007000000003614000040 +:1017100000000000369500000000000037160000B1 +:10172000000000082C800050000000082D00003050 +:10173000000000082D80000C000000188000FEF85A +:10174000000000002646000000000000230000000A +:101750000000000925E6FFFF000000000B6E0000FE +:1017600000000003E7CF2C00000000082200001B4F +:101770000000000C695200000000000C29800000ED +:10178000000000188000FEEF000000002A000000AA +:10179000000000100866000500000000066600005A +:1017A000000000008661180000000009026000F0DF +:1017B00000000010B60C0802000000188000FEE8CF +:1017C000000000000682000000000010B18F000041 +:1017D00000000008878F00010000000C73660010F5 +:1017E000000000082C800018000000082D000018E0 +:1017F000000000082D8000020000000C5FBF000008 +:101800000000001091DE000000000018000D000034 +:10181000000000002A00000000000010286601F50A +:10182000000000082C800003000000082D000003C9 +:10183000000000093060FFF0000000082D8000016A +:101840000000000C298000000000001091DE000064 +:10185000000000082C80001A000000082D00001A6B +:101860000000000573660000000000082D800002E3 +:1018700000000000318000000000001091DE000038 +:10188000000000082C80000C000000082D00000C57 +:10189000000000082D800004000000188000FECC2D +:1018A0000000001800020000000000188000FECABE +:1018B000000000002A00000000000010001F0000CF +:1018C0000000000C6BD70001000000000F0080003A +:1018D000000000080F800007000000188000001BB7 +:1018E00000000000280A00000000000005020000BF +:1018F000000000082200000900000000290000008C +:101900000000000F6568001000000003F66C9400F2 +:1019100000000010B972A0040000000C73E7001969 +:101920000000000C21420004000000003CF8000010 +:101930000000000C2980000000000010205300006F +:1019400000000008220000080000000C61420004B2 +:1019500000000018000A000000000000050200005E +:101960000000000C61420000000000100142000372 +:101970000000000C33E7001D0000000C6142000273 +:1019800000000018000A0000000000002A0000000B +:1019900000000010001F00000000000C6BD70001C9 +:1019A0000000000F0F470007000000080F8000082C +:1019B0000000000C2980000000000010001F000043 +:1019C0000000000C6BD70001000000188000FEA68C +:1019D0000000000033510000000000002A00000059 +:1019E00000000010B1C600290000000F0F500007D2 +:1019F000000000000A600000000000000AE1000092 +:101A00000000000F4B620008000000090B1600FFE9 +:101A10000000000F4C620010000000000D6200008A +:101A2000000000090D1A00FF00000010075000031D +:101A30000000000C0D1A00080000000C0B16000836 +:101A4000000000000CC60000000000000B80000039 +:101A50000000000006980000000000102056000062 +:101A60000000000C2BD70001000000080F800003CD +:101A70000000001006C200040000000C2900000253 +:101A800000000010264200020000000C2952000352 +:101A9000000000082200000100000010001F0000EC +:101AA0000000000C6BD7000100000000231B0000A9 +:101AB0000000000027111A000000000066900000DE +:101AC0000000000C2952000000000010B197320CF9 +:101AD0000000000C298000000000000006980000B3 +:101AE00000000010205300000000000C29520003E9 +:101AF0000000000022C58C0000000010001F000044 +:101B00000000000C6BD70001000000102056000000 +:101B10000000000C2BD70001000000080F8000031C +:101B2000000000188000FFEF00000010B1C8001393 +:101B300000000010B1C600030000000C2980000066 +:101B400000000010205300000000000C295200008B +:101B50000000000C295200030000001006C2000221 +:101B60000000000C295200020000000022C58C0079 +:101B700000000000276500000000000026E40000CF +:101B8000000000082200001600000010B1C600038B +:101B9000000000002348000000000010B180000594 +:101BA00000000000234800000000000C2980000015 +:101BB0000000000F0F500007000000188000001206 +:101BC00000000008220000160000000C2980000020 +:101BD00000000000301400000000000030950000FC +:101BE0000000001007500003000000090B1600FF62 +:101BF000000000090D1A00FF0000000F3116000858 +:101C0000000000003162340000000003F162300087 +:101C100000000010205F0000000000002C510000B8 +:101C2000000000092CD1007F000000082CD9000022 +:101C3000000000082D000000000000082D80000CAE +:101C400000000000000000000000001091DE000015 +:101C50000000001005C20005000000080F8000070A +:101C6000000000003300000000000010001F000012 +:101C70000000000C6BD70001000000188000FE502F +:101C8000000000002A0000000000000F0F500007B5 +:101C900000000010B1C600300000000F47420008ED +:101CA00000000009070E000F00000008070E0008E2 +:101CB00000000010001F00000000000C6BD70001A6 +:101CC00000000008090000010000000709121C00C4 +:101CD00000000003CBCA9200000000000B97A20096 +:101CE0000000000742171C00000000000B04000069 +:101CF0000000000F0A840003000000000A959C0009 +:101D0000000000004A009A00000000088212000152 +:101D1000000000010C170800000000000C978C0068 +:101D20000000000002180000000000080D00FFFF86 +:101D3000000000080F8000060000000C29000000D1 +:101D40000000001006C200040000000C295200022E +:101D500000000010264200020000000C295200037F +:101D6000000000082200000100000010001F000019 +:101D70000000000C6BD7000100000010B197320D7D +:101D800000000000231B00000000000027110800D5 +:101D900000000000669000000000000C2980000098 +:101DA0000000000002180000000000102053000096 +:101DB0000000000C295200030000000022C536007C +:101DC00000000010001F00000000000C6BD7000195 +:101DD000000000080F800006000000188000FFF2DD +:101DE00000000000231B0000000000002711080075 +:101DF000000000006690000000000010B1C8000B59 +:101E00000000000C2980000000000010205300009A +:101E10000000000C295200000000000C29520003B1 +:101E20000000001006C200020000000C295200024F +:101E30000000000022C58C000000000027650000A3 +:101E40000000000026E4000000000000234800001D +:101E500000000008220000170000000C298000008C +:101E600000000010001F00000000000C6BD70001F4 +:081E7000000000188000FE11C3 +:00000001FF +/* + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004 - 2009 Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 21556a2..52e15e0 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -115,7 +115,7 @@ #define IEEE80211_MAX_SSID_LEN 32 #define IEEE80211_MAX_MESH_ID_LEN 32 -#define IEEE80211_MESH_CONFIG_LEN 19 +#define IEEE80211_MESH_CONFIG_LEN 24 #define IEEE80211_QOS_CTL_LEN 2 #define IEEE80211_QOS_CTL_TID_MASK 0x000F diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index b554300..282eb37 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h @@ -87,7 +87,6 @@ #define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */ #define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */ #define ARPHRD_IEEE802154 804 -#define ARPHRD_IEEE802154_PHY 805 #define ARPHRD_PHONET 820 /* PhoNet media type */ #define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ diff --git a/include/linux/nl802154.h b/include/linux/nl802154.h index 9a1af5f8..b7d9435 100644 --- a/include/linux/nl802154.h +++ b/include/linux/nl802154.h @@ -64,6 +64,8 @@ enum { IEEE802154_ATTR_COORD_REALIGN, IEEE802154_ATTR_SEC, + IEEE802154_ATTR_PAGE, + __IEEE802154_ATTR_MAX, }; diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index fdc3110..8549254 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -2064,7 +2064,6 @@ #define PCI_DEVICE_ID_TIGON3_5787M 0x1693 #define PCI_DEVICE_ID_TIGON3_5782 0x1696 #define PCI_DEVICE_ID_TIGON3_5784 0x1698 -#define PCI_DEVICE_ID_TIGON3_5785 0x1699 #define PCI_DEVICE_ID_TIGON3_5786 0x169a #define PCI_DEVICE_ID_TIGON3_5787 0x169b #define PCI_DEVICE_ID_TIGON3_5788 0x169c diff --git a/include/linux/rds.h b/include/linux/rds.h index d91dc91..89d46e1a 100644 --- a/include/linux/rds.h +++ b/include/linux/rds.h @@ -147,6 +147,18 @@ struct rds_info_socket { u_int64_t inum; } __attribute__((packed)); +struct rds_info_tcp_socket { + __be32 local_addr; + __be16 local_port; + __be32 peer_addr; + __be16 peer_port; + u_int64_t hdr_rem; + u_int64_t data_rem; + u_int32_t last_sent_nxt; + u_int32_t last_expected_una; + u_int32_t last_seen_una; +} __attribute__((packed)); + #define RDS_IB_GID_LEN 16 struct rds_info_rdma_connection { __be32 src_addr; diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h index d3b1d18..4e27acf 100644 --- a/include/linux/ssb/ssb_driver_chipcommon.h +++ b/include/linux/ssb/ssb_driver_chipcommon.h @@ -629,5 +629,15 @@ extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc, /* PMU support */ extern void ssb_pmu_init(struct ssb_chipcommon *cc); +enum ssb_pmu_ldo_volt_id { + LDO_PAREF = 0, + LDO_VOLT1, + LDO_VOLT2, + LDO_VOLT3, +}; + +void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc, + enum ssb_pmu_ldo_volt_id id, u32 voltage); +void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); #endif /* LINUX_SSB_CHIPCO_H_ */ diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index e2506af..5dc6a61 100644 --- a/include/net/ieee802154_netdev.h +++ b/include/net/ieee802154_netdev.h @@ -80,7 +80,7 @@ static inline int mac_cb_type(struct sk_buff *skb) struct ieee802154_mlme_ops { int (*assoc_req)(struct net_device *dev, struct ieee802154_addr *addr, - u8 channel, u8 cap); + u8 channel, u8 page, u8 cap); int (*assoc_resp)(struct net_device *dev, struct ieee802154_addr *addr, u16 short_addr, u8 status); @@ -89,10 +89,10 @@ struct ieee802154_mlme_ops { u8 reason); int (*start_req)(struct net_device *dev, struct ieee802154_addr *addr, - u8 channel, u8 bcn_ord, u8 sf_ord, + u8 channel, u8 page, u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, u8 coord_realign); int (*scan_req)(struct net_device *dev, - u8 type, u32 channels, u8 duration); + u8 type, u32 channels, u8 page, u8 duration); /* * FIXME: these should become the part of PIB/MIB interface. diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h index 2b3fbbb..e9054a2 100644 --- a/include/net/iw_handler.h +++ b/include/net/iw_handler.h @@ -416,13 +416,13 @@ struct iw_spy_data * data (i.e. valid as long as struct net_device exist, same locking rules). */ /* Forward declaration */ -struct ieee80211_device; +struct libipw_device; /* The struct */ struct iw_public_data { /* Driver enhanced spy support */ struct iw_spy_data * spy_data; - /* Structure managed by the in-kernel IEEE 802.11 layer */ - struct ieee80211_device * ieee80211; + /* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */ + struct libipw_device * libipw; }; /**************************** PROTOTYPES ****************************/ diff --git a/include/net/mac80211.h b/include/net/mac80211.h index aac84d7b..466859b 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -1657,12 +1657,6 @@ void ieee80211_free_hw(struct ieee80211_hw *hw); */ void ieee80211_restart_hw(struct ieee80211_hw *hw); -/* - * trick to avoid symbol clashes with the ieee80211 subsystem, - * use the inline below instead - */ -void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb); - /** * ieee80211_rx - receive frame * @@ -1678,10 +1672,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb); * @hw: the hardware this frame came in on * @skb: the buffer to receive, owned by mac80211 after this call */ -static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) -{ - __ieee80211_rx(hw, skb); -} +void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb); /** * ieee80211_rx_irqsafe - receive frame diff --git a/include/net/nl802154.h b/include/net/nl802154.h index e554ecd..99d2ba1 100644 --- a/include/net/nl802154.h +++ b/include/net/nl802154.h @@ -95,7 +95,7 @@ int ieee802154_nl_disassoc_confirm(struct net_device *dev, * Note: This API does not permit the return of an active scan result. */ int ieee802154_nl_scan_confirm(struct net_device *dev, - u8 status, u8 scan_type, u32 unscanned, + u8 status, u8 scan_type, u32 unscanned, u8 page, u8 *edl/*, struct list_head *pan_desc_list */); /** diff --git a/include/net/tcp.h b/include/net/tcp.h index 88af843..cbb2a48 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1007,6 +1007,11 @@ static inline int keepalive_time_when(const struct tcp_sock *tp) return tp->keepalive_time ? : sysctl_tcp_keepalive_time; } +static inline int keepalive_probes(const struct tcp_sock *tp) +{ + return tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; +} + static inline int tcp_fin_time(const struct sock *sk) { int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout; diff --git a/include/net/wpan-phy.h b/include/net/wpan-phy.h new file mode 100644 index 0000000..547b1e2 --- /dev/null +++ b/include/net/wpan-phy.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2007, 2008, 2009 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> + */ + +#ifndef WPAN_PHY_H +#define WPAN_PHY_H + +#include <linux/netdevice.h> +#include <linux/mutex.h> + +struct wpan_phy { + struct mutex pib_lock; + + /* + * This is a PIB acording to 802.15.4-2006. + * We do not provide timing-related variables, as they + * aren't used outside of driver + */ + u8 current_channel; + u8 current_page; + u32 channels_supported; + u8 transmit_power; + u8 cca_mode; + + struct device dev; + int idx; + + char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); +}; + +struct wpan_phy *wpan_phy_alloc(size_t priv_size); +int wpan_phy_register(struct device *parent, struct wpan_phy *phy); +void wpan_phy_unregister(struct wpan_phy *phy); +void wpan_phy_free(struct wpan_phy *phy); + +static inline void *wpan_phy_priv(struct wpan_phy *phy) +{ + BUG_ON(!phy); + return &phy->priv; +} + +struct wpan_phy *wpan_phy_find(const char *str); +static inline const char *wpan_phy_name(struct wpan_phy *phy) +{ + return dev_name(&phy->dev); +} +#endif diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 49da79a..05071bf 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -485,6 +485,7 @@ void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t clock_id, debug_object_init_on_stack(timer, &hrtimer_debug_descr); __hrtimer_init(timer, clock_id, mode); } +EXPORT_SYMBOL_GPL(hrtimer_init_on_stack); void destroy_hrtimer_on_stack(struct hrtimer *timer) { @@ -1477,6 +1478,7 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) sl->timer.function = hrtimer_wakeup; sl->task = task; } +EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) { diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index 9a2f19b..019f380 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig @@ -234,17 +234,6 @@ config BOOT_TRACER You must pass in initcall_debug and ftrace=initcall to the kernel command line to enable this on bootup. -config SKB_SOURCES_TRACER - bool "Trace skb source information" - depends on NET - select GENERIC_TRACER - help - This tracer helps developers/sysadmins correlate skb allocation and - consumption. The idea being that some processes will primarily consume data - that was allocated on certain numa nodes. By being able to visualize which - nodes the data was allocated on, a sysadmin or developer can optimize the - scheduling of those processes to cut back on cross node chatter. - config TRACE_BRANCH_PROFILING bool select GENERIC_TRACER diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile index ee5e5b1..844164d 100644 --- a/kernel/trace/Makefile +++ b/kernel/trace/Makefile @@ -49,7 +49,6 @@ obj-$(CONFIG_BLK_DEV_IO_TRACE) += blktrace.o ifeq ($(CONFIG_BLOCK),y) obj-$(CONFIG_EVENT_TRACING) += blktrace.o endif -obj-$(CONFIG_SKB_SOURCES_TRACER) += trace_skb_sources.o obj-$(CONFIG_EVENT_TRACING) += trace_events.o obj-$(CONFIG_EVENT_TRACING) += trace_export.o obj-$(CONFIG_FTRACE_SYSCALLS) += trace_syscalls.o diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 8a6281b..8b9f4f6 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -11,7 +11,6 @@ #include <trace/boot.h> #include <linux/kmemtrace.h> #include <trace/power.h> -#include <trace/events/skb.h> #include <linux/trace_seq.h> #include <linux/ftrace_event.h> @@ -41,7 +40,6 @@ enum trace_type { TRACE_KMEM_FREE, TRACE_POWER, TRACE_BLK, - TRACE_SKB_SOURCE, __TRACE_LAST_TYPE, }; @@ -173,21 +171,6 @@ struct trace_power { struct power_trace state_data; }; -struct skb_record { - pid_t pid; /* pid of the copying process */ - int anid; /* node where skb was allocated */ - int cnid; /* node to which skb was copied in userspace */ - char ifname[IFNAMSIZ]; /* Name of the receiving interface */ - int rx_queue; /* The rx queue the skb was received on */ - int ccpu; /* Cpu the application got this frame from */ - int len; /* length of the data copied */ -}; - -struct trace_skb_event { - struct trace_entry ent; - struct skb_record event_data; -}; - enum kmemtrace_type_id { KMEMTRACE_TYPE_KMALLOC = 0, /* kmalloc() or kfree(). */ KMEMTRACE_TYPE_CACHE, /* kmem_cache_*(). */ @@ -340,8 +323,6 @@ extern void __ftrace_bad_type(void); TRACE_SYSCALL_ENTER); \ IF_ASSIGN(var, ent, struct syscall_trace_exit, \ TRACE_SYSCALL_EXIT); \ - IF_ASSIGN(var, ent, struct trace_skb_event, \ - TRACE_SKB_SOURCE); \ __ftrace_bad_type(); \ } while (0) diff --git a/kernel/trace/trace_skb_sources.c b/kernel/trace/trace_skb_sources.c deleted file mode 100644 index 40eb071..0000000 --- a/kernel/trace/trace_skb_sources.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * ring buffer based tracer for analyzing per-socket skb sources - * - * Neil Horman <nhorman@tuxdriver.com> - * Copyright (C) 2009 - * - * - */ - -#include <linux/init.h> -#include <linux/debugfs.h> -#include <trace/events/skb.h> -#include <linux/kallsyms.h> -#include <linux/module.h> -#include <linux/hardirq.h> -#include <linux/netdevice.h> -#include <net/sock.h> - -#include "trace.h" -#include "trace_output.h" - -EXPORT_TRACEPOINT_SYMBOL_GPL(skb_copy_datagram_iovec); - -static struct trace_array *skb_trace; -static int __read_mostly trace_skb_source_enabled; - -static void probe_skb_dequeue(const struct sk_buff *skb, int len) -{ - struct ring_buffer_event *event; - struct trace_skb_event *entry; - struct trace_array *tr = skb_trace; - struct net_device *dev; - - if (!trace_skb_source_enabled) - return; - - if (in_interrupt()) - return; - - event = trace_buffer_lock_reserve(tr, TRACE_SKB_SOURCE, - sizeof(*entry), 0, 0); - if (!event) - return; - entry = ring_buffer_event_data(event); - - entry->event_data.pid = current->pid; - entry->event_data.anid = page_to_nid(virt_to_page(skb->data)); - entry->event_data.cnid = cpu_to_node(smp_processor_id()); - entry->event_data.len = len; - entry->event_data.rx_queue = skb->queue_mapping; - entry->event_data.ccpu = smp_processor_id(); - - dev = dev_get_by_index(sock_net(skb->sk), skb->iif); - if (dev) { - memcpy(entry->event_data.ifname, dev->name, IFNAMSIZ); - dev_put(dev); - } else { - strcpy(entry->event_data.ifname, "Unknown"); - } - - trace_buffer_unlock_commit(tr, event, 0, 0); -} - -static int tracing_skb_source_register(void) -{ - int ret; - - ret = register_trace_skb_copy_datagram_iovec(probe_skb_dequeue); - if (ret) - pr_info("skb source trace: Couldn't activate dequeue tracepoint"); - - return ret; -} - -static void start_skb_source_trace(struct trace_array *tr) -{ - trace_skb_source_enabled = 1; -} - -static void stop_skb_source_trace(struct trace_array *tr) -{ - trace_skb_source_enabled = 0; -} - -static void skb_source_trace_reset(struct trace_array *tr) -{ - trace_skb_source_enabled = 0; - unregister_trace_skb_copy_datagram_iovec(probe_skb_dequeue); -} - - -static int skb_source_trace_init(struct trace_array *tr) -{ - int cpu; - skb_trace = tr; - - trace_skb_source_enabled = 1; - tracing_skb_source_register(); - - for_each_cpu(cpu, cpu_possible_mask) - tracing_reset(tr, cpu); - return 0; -} - -static enum print_line_t skb_source_print_line(struct trace_iterator *iter) -{ - int ret = 0; - struct trace_entry *entry = iter->ent; - struct trace_skb_event *event; - struct skb_record *record; - struct trace_seq *s = &iter->seq; - - trace_assign_type(event, entry); - record = &event->event_data; - if (entry->type != TRACE_SKB_SOURCE) - return TRACE_TYPE_UNHANDLED; - - ret = trace_seq_printf(s, " %d %d %d %s %d %d %d\n", - record->pid, - record->anid, - record->cnid, - record->ifname, - record->rx_queue, - record->ccpu, - record->len); - - if (!ret) - return TRACE_TYPE_PARTIAL_LINE; - - return TRACE_TYPE_HANDLED; -} - -static void skb_source_print_header(struct seq_file *s) -{ - seq_puts(s, "# PID ANID CNID IFC RXQ CCPU LEN\n"); - seq_puts(s, "# | | | | | | |\n"); -} - -static struct tracer skb_source_tracer __read_mostly = -{ - .name = "skb_sources", - .init = skb_source_trace_init, - .start = start_skb_source_trace, - .stop = stop_skb_source_trace, - .reset = skb_source_trace_reset, - .print_line = skb_source_print_line, - .print_header = skb_source_print_header, -}; - -static int init_skb_source_trace(void) -{ - return register_tracer(&skb_source_tracer); -} -device_initcall(init_skb_source_trace); diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 756ccaf..cb8a112 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -25,6 +25,7 @@ #include <linux/kallsyms.h> #include <linux/uaccess.h> #include <linux/ioport.h> +#include <net/addrconf.h> #include <asm/page.h> /* for PAGE_SIZE */ #include <asm/div64.h> @@ -630,60 +631,156 @@ static char *resource_string(char *buf, char *end, struct resource *res, } static char *mac_address_string(char *buf, char *end, u8 *addr, - struct printf_spec spec) + struct printf_spec spec, const char *fmt) { - char mac_addr[6 * 3]; /* (6 * 2 hex digits), 5 colons and trailing zero */ + char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")]; char *p = mac_addr; int i; for (i = 0; i < 6; i++) { p = pack_hex_byte(p, addr[i]); - if (!(spec.flags & SPECIAL) && i != 5) + if (fmt[0] == 'M' && i != 5) *p++ = ':'; } *p = '\0'; - spec.flags &= ~SPECIAL; return string(buf, end, mac_addr, spec); } -static char *ip6_addr_string(char *buf, char *end, u8 *addr, - struct printf_spec spec) +static char *ip4_string(char *p, const u8 *addr, bool leading_zeros) +{ + int i; + + for (i = 0; i < 4; i++) { + char temp[3]; /* hold each IP quad in reverse order */ + int digits = put_dec_trunc(temp, addr[i]) - temp; + if (leading_zeros) { + if (digits < 3) + *p++ = '0'; + if (digits < 2) + *p++ = '0'; + } + /* reverse the digits in the quad */ + while (digits--) + *p++ = temp[digits]; + if (i < 3) + *p++ = '.'; + } + + *p = '\0'; + return p; +} + +static char *ip6_compressed_string(char *p, const struct in6_addr *addr) { - char ip6_addr[8 * 5]; /* (8 * 4 hex digits), 7 colons and trailing zero */ - char *p = ip6_addr; int i; + int j; + int range; + unsigned char zerolength[8]; + int longest = 1; + int colonpos = -1; + u16 word; + u8 hi; + u8 lo; + bool needcolon = false; + bool useIPv4 = ipv6_addr_v4mapped(addr) || ipv6_addr_is_isatap(addr); + + memset(zerolength, 0, sizeof(zerolength)); + + if (useIPv4) + range = 6; + else + range = 8; + + /* find position of longest 0 run */ + for (i = 0; i < range; i++) { + for (j = i; j < range; j++) { + if (addr->s6_addr16[j] != 0) + break; + zerolength[i]++; + } + } + for (i = 0; i < range; i++) { + if (zerolength[i] > longest) { + longest = zerolength[i]; + colonpos = i; + } + } + + /* emit address */ + for (i = 0; i < range; i++) { + if (i == colonpos) { + if (needcolon || i == 0) + *p++ = ':'; + *p++ = ':'; + needcolon = false; + i += longest - 1; + continue; + } + if (needcolon) { + *p++ = ':'; + needcolon = false; + } + /* hex u16 without leading 0s */ + word = ntohs(addr->s6_addr16[i]); + hi = word >> 8; + lo = word & 0xff; + if (hi) { + if (hi > 0x0f) + p = pack_hex_byte(p, hi); + else + *p++ = hex_asc_lo(hi); + } + if (hi || lo > 0x0f) + p = pack_hex_byte(p, lo); + else + *p++ = hex_asc_lo(lo); + needcolon = true; + } + + if (useIPv4) { + if (needcolon) + *p++ = ':'; + p = ip4_string(p, &addr->s6_addr[12], false); + } + *p = '\0'; + return p; +} + +static char *ip6_string(char *p, const struct in6_addr *addr, const char *fmt) +{ + int i; for (i = 0; i < 8; i++) { - p = pack_hex_byte(p, addr[2 * i]); - p = pack_hex_byte(p, addr[2 * i + 1]); - if (!(spec.flags & SPECIAL) && i != 7) + p = pack_hex_byte(p, addr->s6_addr[2 * i]); + p = pack_hex_byte(p, addr->s6_addr[2 * i + 1]); + if (fmt[0] == 'I' && i != 7) *p++ = ':'; } + *p = '\0'; - spec.flags &= ~SPECIAL; + return p; +} + +static char *ip6_addr_string(char *buf, char *end, const u8 *addr, + struct printf_spec spec, const char *fmt) +{ + char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")]; + + if (fmt[0] == 'I' && fmt[2] == 'c') + ip6_compressed_string(ip6_addr, (const struct in6_addr *)addr); + else + ip6_string(ip6_addr, (const struct in6_addr *)addr, fmt); return string(buf, end, ip6_addr, spec); } -static char *ip4_addr_string(char *buf, char *end, u8 *addr, - struct printf_spec spec) +static char *ip4_addr_string(char *buf, char *end, const u8 *addr, + struct printf_spec spec, const char *fmt) { - char ip4_addr[4 * 4]; /* (4 * 3 decimal digits), 3 dots and trailing zero */ - char temp[3]; /* hold each IP quad in reverse order */ - char *p = ip4_addr; - int i, digits; + char ip4_addr[sizeof("255.255.255.255")]; - for (i = 0; i < 4; i++) { - digits = put_dec_trunc(temp, addr[i]) - temp; - /* reverse the digits in the quad */ - while (digits--) - *p++ = temp[digits]; - if (i != 3) - *p++ = '.'; - } - *p = '\0'; - spec.flags &= ~SPECIAL; + ip4_string(ip4_addr, addr, fmt[0] == 'i'); return string(buf, end, ip4_addr, spec); } @@ -702,11 +799,15 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, * addresses (not the name nor the flags) * - 'M' For a 6-byte MAC address, it prints the address in the * usual colon-separated hex notation - * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way (dot-separated - * decimal for v4 and colon separated network-order 16 bit hex for v6) - * - 'i' [46] for 'raw' IPv4/IPv6 addresses, IPv6 omits the colons, IPv4 is - * currently the same - * + * - 'm' For a 6-byte MAC address, it prints the hex address without colons + * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way + * IPv4 uses dot-separated decimal without leading 0's (1.2.3.4) + * IPv6 uses colon separated network-order 16 bit hex with leading 0's + * - 'i' [46] for 'raw' IPv4/IPv6 addresses + * IPv6 omits the colons (01020304...0f) + * IPv4 uses dot-separated decimal with leading 0's (010.123.045.006) + * - 'I6c' for IPv6 addresses printed as specified by + * http://www.ietf.org/id/draft-kawamura-ipv6-text-representation-03.txt * Note: The difference between 'S' and 'F' is that on ia64 and ppc64 * function pointers are really function descriptors, which contain a * pointer to the real address. @@ -726,20 +827,24 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, return symbol_string(buf, end, ptr, spec, *fmt); case 'R': return resource_string(buf, end, ptr, spec); - case 'm': - spec.flags |= SPECIAL; - /* Fallthrough */ - case 'M': - return mac_address_string(buf, end, ptr, spec); - case 'i': - spec.flags |= SPECIAL; - /* Fallthrough */ - case 'I': - if (fmt[1] == '6') - return ip6_addr_string(buf, end, ptr, spec); - if (fmt[1] == '4') - return ip4_addr_string(buf, end, ptr, spec); - spec.flags &= ~SPECIAL; + case 'M': /* Colon separated: 00:01:02:03:04:05 */ + case 'm': /* Contiguous: 000102030405 */ + return mac_address_string(buf, end, ptr, spec, fmt); + case 'I': /* Formatted IP supported + * 4: 1.2.3.4 + * 6: 0001:0203:...:0708 + * 6c: 1::708 or 1::1.2.3.4 + */ + case 'i': /* Contiguous: + * 4: 001.002.003.004 + * 6: 000102...0f + */ + switch (fmt[1]) { + case '6': + return ip6_addr_string(buf, end, ptr, spec, fmt); + case '4': + return ip4_addr_string(buf, end, ptr, spec, fmt); + } break; } spec.flags |= SMALL; diff --git a/net/can/bcm.c b/net/can/bcm.c index 72720c7..597da4f 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -46,6 +46,7 @@ #include <linux/hrtimer.h> #include <linux/list.h> #include <linux/proc_fs.h> +#include <linux/seq_file.h> #include <linux/uio.h> #include <linux/net.h> #include <linux/netdevice.h> @@ -146,23 +147,18 @@ static char *bcm_proc_getifname(int ifindex) return "???"; } -static int bcm_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int bcm_proc_show(struct seq_file *m, void *v) { - int len = 0; - struct sock *sk = (struct sock *)data; + struct sock *sk = (struct sock *)m->private; struct bcm_sock *bo = bcm_sk(sk); struct bcm_op *op; - len += snprintf(page + len, PAGE_SIZE - len, ">>> socket %p", - sk->sk_socket); - len += snprintf(page + len, PAGE_SIZE - len, " / sk %p", sk); - len += snprintf(page + len, PAGE_SIZE - len, " / bo %p", bo); - len += snprintf(page + len, PAGE_SIZE - len, " / dropped %lu", - bo->dropped_usr_msgs); - len += snprintf(page + len, PAGE_SIZE - len, " / bound %s", - bcm_proc_getifname(bo->ifindex)); - len += snprintf(page + len, PAGE_SIZE - len, " <<<\n"); + seq_printf(m, ">>> socket %p", sk->sk_socket); + seq_printf(m, " / sk %p", sk); + seq_printf(m, " / bo %p", bo); + seq_printf(m, " / dropped %lu", bo->dropped_usr_msgs); + seq_printf(m, " / bound %s", bcm_proc_getifname(bo->ifindex)); + seq_printf(m, " <<<\n"); list_for_each_entry(op, &bo->rx_ops, list) { @@ -172,71 +168,62 @@ static int bcm_read_proc(char *page, char **start, off_t off, if (!op->frames_abs) continue; - len += snprintf(page + len, PAGE_SIZE - len, - "rx_op: %03X %-5s ", + seq_printf(m, "rx_op: %03X %-5s ", op->can_id, bcm_proc_getifname(op->ifindex)); - len += snprintf(page + len, PAGE_SIZE - len, "[%d]%c ", - op->nframes, + seq_printf(m, "[%d]%c ", op->nframes, (op->flags & RX_CHECK_DLC)?'d':' '); if (op->kt_ival1.tv64) - len += snprintf(page + len, PAGE_SIZE - len, - "timeo=%lld ", + seq_printf(m, "timeo=%lld ", (long long) ktime_to_us(op->kt_ival1)); if (op->kt_ival2.tv64) - len += snprintf(page + len, PAGE_SIZE - len, - "thr=%lld ", + seq_printf(m, "thr=%lld ", (long long) ktime_to_us(op->kt_ival2)); - len += snprintf(page + len, PAGE_SIZE - len, - "# recv %ld (%ld) => reduction: ", + seq_printf(m, "# recv %ld (%ld) => reduction: ", op->frames_filtered, op->frames_abs); reduction = 100 - (op->frames_filtered * 100) / op->frames_abs; - len += snprintf(page + len, PAGE_SIZE - len, "%s%ld%%\n", + seq_printf(m, "%s%ld%%\n", (reduction == 100)?"near ":"", reduction); - - if (len > PAGE_SIZE - 200) { - /* mark output cut off */ - len += snprintf(page + len, PAGE_SIZE - len, "(..)\n"); - break; - } } list_for_each_entry(op, &bo->tx_ops, list) { - len += snprintf(page + len, PAGE_SIZE - len, - "tx_op: %03X %s [%d] ", + seq_printf(m, "tx_op: %03X %s [%d] ", op->can_id, bcm_proc_getifname(op->ifindex), op->nframes); if (op->kt_ival1.tv64) - len += snprintf(page + len, PAGE_SIZE - len, "t1=%lld ", + seq_printf(m, "t1=%lld ", (long long) ktime_to_us(op->kt_ival1)); if (op->kt_ival2.tv64) - len += snprintf(page + len, PAGE_SIZE - len, "t2=%lld ", + seq_printf(m, "t2=%lld ", (long long) ktime_to_us(op->kt_ival2)); - len += snprintf(page + len, PAGE_SIZE - len, "# sent %ld\n", - op->frames_abs); - - if (len > PAGE_SIZE - 100) { - /* mark output cut off */ - len += snprintf(page + len, PAGE_SIZE - len, "(..)\n"); - break; - } + seq_printf(m, "# sent %ld\n", op->frames_abs); } + seq_putc(m, '\n'); + return 0; +} - len += snprintf(page + len, PAGE_SIZE - len, "\n"); - - *eof = 1; - return len; +static int bcm_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, bcm_proc_show, PDE(inode)->data); } +static const struct file_operations bcm_proc_fops = { + .owner = THIS_MODULE, + .open = bcm_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + /* * bcm_can_tx - send the (next) CAN frame to the appropriate CAN interface * of the given bcm tx op @@ -1515,9 +1502,9 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len, if (proc_dir) { /* unique socket address as filename */ sprintf(bo->procname, "%p", sock); - bo->bcm_proc_read = create_proc_read_entry(bo->procname, 0644, - proc_dir, - bcm_read_proc, sk); + bo->bcm_proc_read = proc_create_data(bo->procname, 0644, + proc_dir, + &bcm_proc_fops, sk); } return 0; diff --git a/net/can/proc.c b/net/can/proc.c index 1463653..9b9ad29 100644 --- a/net/can/proc.c +++ b/net/can/proc.c @@ -196,8 +196,8 @@ void can_stat_update(unsigned long data) * */ -static int can_print_rcvlist(char *page, int len, struct hlist_head *rx_list, - struct net_device *dev) +static void can_print_rcvlist(struct seq_file *m, struct hlist_head *rx_list, + struct net_device *dev) { struct receiver *r; struct hlist_node *n; @@ -208,199 +208,188 @@ static int can_print_rcvlist(char *page, int len, struct hlist_head *rx_list, " %-5s %08X %08x %08x %08x %8ld %s\n" : " %-5s %03X %08x %08lx %08lx %8ld %s\n"; - len += snprintf(page + len, PAGE_SIZE - len, fmt, - DNAME(dev), r->can_id, r->mask, + seq_printf(m, fmt, DNAME(dev), r->can_id, r->mask, (unsigned long)r->func, (unsigned long)r->data, r->matches, r->ident); - - /* does a typical line fit into the current buffer? */ - - /* 100 Bytes before end of buffer */ - if (len > PAGE_SIZE - 100) { - /* mark output cut off */ - len += snprintf(page + len, PAGE_SIZE - len, - " (..)\n"); - break; - } } rcu_read_unlock(); - - return len; } -static int can_print_recv_banner(char *page, int len) +static void can_print_recv_banner(struct seq_file *m) { /* * can1. 00000000 00000000 00000000 * ....... 0 tp20 */ - len += snprintf(page + len, PAGE_SIZE - len, - " device can_id can_mask function" + seq_puts(m, " device can_id can_mask function" " userdata matches ident\n"); - - return len; } -static int can_proc_read_stats(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int can_stats_proc_show(struct seq_file *m, void *v) { - int len = 0; + seq_putc(m, '\n'); + seq_printf(m, " %8ld transmitted frames (TXF)\n", can_stats.tx_frames); + seq_printf(m, " %8ld received frames (RXF)\n", can_stats.rx_frames); + seq_printf(m, " %8ld matched frames (RXMF)\n", can_stats.matches); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld transmitted frames (TXF)\n", - can_stats.tx_frames); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld received frames (RXF)\n", can_stats.rx_frames); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld matched frames (RXMF)\n", can_stats.matches); - - len += snprintf(page + len, PAGE_SIZE - len, "\n"); + seq_putc(m, '\n'); if (can_stattimer.function == can_stat_update) { - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld %% total match ratio (RXMR)\n", + seq_printf(m, " %8ld %% total match ratio (RXMR)\n", can_stats.total_rx_match_ratio); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld frames/s total tx rate (TXR)\n", + seq_printf(m, " %8ld frames/s total tx rate (TXR)\n", can_stats.total_tx_rate); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld frames/s total rx rate (RXR)\n", + seq_printf(m, " %8ld frames/s total rx rate (RXR)\n", can_stats.total_rx_rate); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); + seq_putc(m, '\n'); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld %% current match ratio (CRXMR)\n", + seq_printf(m, " %8ld %% current match ratio (CRXMR)\n", can_stats.current_rx_match_ratio); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld frames/s current tx rate (CTXR)\n", + seq_printf(m, " %8ld frames/s current tx rate (CTXR)\n", can_stats.current_tx_rate); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld frames/s current rx rate (CRXR)\n", + seq_printf(m, " %8ld frames/s current rx rate (CRXR)\n", can_stats.current_rx_rate); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); + seq_putc(m, '\n'); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld %% max match ratio (MRXMR)\n", + seq_printf(m, " %8ld %% max match ratio (MRXMR)\n", can_stats.max_rx_match_ratio); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld frames/s max tx rate (MTXR)\n", + seq_printf(m, " %8ld frames/s max tx rate (MTXR)\n", can_stats.max_tx_rate); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld frames/s max rx rate (MRXR)\n", + seq_printf(m, " %8ld frames/s max rx rate (MRXR)\n", can_stats.max_rx_rate); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); + seq_putc(m, '\n'); } - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld current receive list entries (CRCV)\n", + seq_printf(m, " %8ld current receive list entries (CRCV)\n", can_pstats.rcv_entries); - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld maximum receive list entries (MRCV)\n", + seq_printf(m, " %8ld maximum receive list entries (MRCV)\n", can_pstats.rcv_entries_max); if (can_pstats.stats_reset) - len += snprintf(page + len, PAGE_SIZE - len, - "\n %8ld statistic resets (STR)\n", + seq_printf(m, "\n %8ld statistic resets (STR)\n", can_pstats.stats_reset); if (can_pstats.user_reset) - len += snprintf(page + len, PAGE_SIZE - len, - " %8ld user statistic resets (USTR)\n", + seq_printf(m, " %8ld user statistic resets (USTR)\n", can_pstats.user_reset); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); - - *eof = 1; - return len; + seq_putc(m, '\n'); + return 0; } -static int can_proc_read_reset_stats(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int can_stats_proc_open(struct inode *inode, struct file *file) { - int len = 0; + return single_open(file, can_stats_proc_show, NULL); +} + +static const struct file_operations can_stats_proc_fops = { + .owner = THIS_MODULE, + .open = can_stats_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +static int can_reset_stats_proc_show(struct seq_file *m, void *v) +{ user_reset = 1; if (can_stattimer.function == can_stat_update) { - len += snprintf(page + len, PAGE_SIZE - len, - "Scheduled statistic reset #%ld.\n", + seq_printf(m, "Scheduled statistic reset #%ld.\n", can_pstats.stats_reset + 1); } else { if (can_stats.jiffies_init != jiffies) can_init_stats(); - len += snprintf(page + len, PAGE_SIZE - len, - "Performed statistic reset #%ld.\n", + seq_printf(m, "Performed statistic reset #%ld.\n", can_pstats.stats_reset); } + return 0; +} - *eof = 1; - return len; +static int can_reset_stats_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, can_reset_stats_proc_show, NULL); } -static int can_proc_read_version(char *page, char **start, off_t off, - int count, int *eof, void *data) +static const struct file_operations can_reset_stats_proc_fops = { + .owner = THIS_MODULE, + .open = can_reset_stats_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int can_version_proc_show(struct seq_file *m, void *v) { - int len = 0; + seq_printf(m, "%s\n", CAN_VERSION_STRING); + return 0; +} - len += snprintf(page + len, PAGE_SIZE - len, "%s\n", - CAN_VERSION_STRING); - *eof = 1; - return len; +static int can_version_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, can_version_proc_show, NULL); } -static int can_proc_read_rcvlist(char *page, char **start, off_t off, - int count, int *eof, void *data) +static const struct file_operations can_version_proc_fops = { + .owner = THIS_MODULE, + .open = can_version_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int can_rcvlist_proc_show(struct seq_file *m, void *v) { /* double cast to prevent GCC warning */ - int idx = (int)(long)data; - int len = 0; + int idx = (int)(long)m->private; struct dev_rcv_lists *d; struct hlist_node *n; - len += snprintf(page + len, PAGE_SIZE - len, - "\nreceive list '%s':\n", rx_list_name[idx]); + seq_printf(m, "\nreceive list '%s':\n", rx_list_name[idx]); rcu_read_lock(); hlist_for_each_entry_rcu(d, n, &can_rx_dev_list, list) { if (!hlist_empty(&d->rx[idx])) { - len = can_print_recv_banner(page, len); - len = can_print_rcvlist(page, len, &d->rx[idx], d->dev); + can_print_recv_banner(m); + can_print_rcvlist(m, &d->rx[idx], d->dev); } else - len += snprintf(page + len, PAGE_SIZE - len, - " (%s: no entry)\n", DNAME(d->dev)); - - /* exit on end of buffer? */ - if (len > PAGE_SIZE - 100) - break; + seq_printf(m, " (%s: no entry)\n", DNAME(d->dev)); } rcu_read_unlock(); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); + seq_putc(m, '\n'); + return 0; +} - *eof = 1; - return len; +static int can_rcvlist_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, can_rcvlist_proc_show, PDE(inode)->data); } -static int can_proc_read_rcvlist_sff(char *page, char **start, off_t off, - int count, int *eof, void *data) +static const struct file_operations can_rcvlist_proc_fops = { + .owner = THIS_MODULE, + .open = can_rcvlist_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int can_rcvlist_sff_proc_show(struct seq_file *m, void *v) { - int len = 0; struct dev_rcv_lists *d; struct hlist_node *n; /* RX_SFF */ - len += snprintf(page + len, PAGE_SIZE - len, - "\nreceive list 'rx_sff':\n"); + seq_puts(m, "\nreceive list 'rx_sff':\n"); rcu_read_lock(); hlist_for_each_entry_rcu(d, n, &can_rx_dev_list, list) { @@ -413,46 +402,38 @@ static int can_proc_read_rcvlist_sff(char *page, char **start, off_t off, } if (!all_empty) { - len = can_print_recv_banner(page, len); + can_print_recv_banner(m); for (i = 0; i < 0x800; i++) { - if (!hlist_empty(&d->rx_sff[i]) && - len < PAGE_SIZE - 100) - len = can_print_rcvlist(page, len, - &d->rx_sff[i], - d->dev); + if (!hlist_empty(&d->rx_sff[i])) + can_print_rcvlist(m, &d->rx_sff[i], + d->dev); } } else - len += snprintf(page + len, PAGE_SIZE - len, - " (%s: no entry)\n", DNAME(d->dev)); - - /* exit on end of buffer? */ - if (len > PAGE_SIZE - 100) - break; + seq_printf(m, " (%s: no entry)\n", DNAME(d->dev)); } rcu_read_unlock(); - len += snprintf(page + len, PAGE_SIZE - len, "\n"); + seq_putc(m, '\n'); + return 0; +} - *eof = 1; - return len; +static int can_rcvlist_sff_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, can_rcvlist_sff_proc_show, NULL); } +static const struct file_operations can_rcvlist_sff_proc_fops = { + .owner = THIS_MODULE, + .open = can_rcvlist_sff_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + /* * proc utility functions */ -static struct proc_dir_entry *can_create_proc_readentry(const char *name, - mode_t mode, - read_proc_t *read_proc, - void *data) -{ - if (can_dir) - return create_proc_read_entry(name, mode, can_dir, read_proc, - data); - else - return NULL; -} - static void can_remove_proc_readentry(const char *name) { if (can_dir) @@ -474,24 +455,24 @@ void can_init_proc(void) } /* own procfs entries from the AF_CAN core */ - pde_version = can_create_proc_readentry(CAN_PROC_VERSION, 0644, - can_proc_read_version, NULL); - pde_stats = can_create_proc_readentry(CAN_PROC_STATS, 0644, - can_proc_read_stats, NULL); - pde_reset_stats = can_create_proc_readentry(CAN_PROC_RESET_STATS, 0644, - can_proc_read_reset_stats, NULL); - pde_rcvlist_err = can_create_proc_readentry(CAN_PROC_RCVLIST_ERR, 0644, - can_proc_read_rcvlist, (void *)RX_ERR); - pde_rcvlist_all = can_create_proc_readentry(CAN_PROC_RCVLIST_ALL, 0644, - can_proc_read_rcvlist, (void *)RX_ALL); - pde_rcvlist_fil = can_create_proc_readentry(CAN_PROC_RCVLIST_FIL, 0644, - can_proc_read_rcvlist, (void *)RX_FIL); - pde_rcvlist_inv = can_create_proc_readentry(CAN_PROC_RCVLIST_INV, 0644, - can_proc_read_rcvlist, (void *)RX_INV); - pde_rcvlist_eff = can_create_proc_readentry(CAN_PROC_RCVLIST_EFF, 0644, - can_proc_read_rcvlist, (void *)RX_EFF); - pde_rcvlist_sff = can_create_proc_readentry(CAN_PROC_RCVLIST_SFF, 0644, - can_proc_read_rcvlist_sff, NULL); + pde_version = proc_create(CAN_PROC_VERSION, 0644, can_dir, + &can_version_proc_fops); + pde_stats = proc_create(CAN_PROC_STATS, 0644, can_dir, + &can_stats_proc_fops); + pde_reset_stats = proc_create(CAN_PROC_RESET_STATS, 0644, can_dir, + &can_reset_stats_proc_fops); + pde_rcvlist_err = proc_create_data(CAN_PROC_RCVLIST_ERR, 0644, can_dir, + &can_rcvlist_proc_fops, (void *)RX_ERR); + pde_rcvlist_all = proc_create_data(CAN_PROC_RCVLIST_ALL, 0644, can_dir, + &can_rcvlist_proc_fops, (void *)RX_ALL); + pde_rcvlist_fil = proc_create_data(CAN_PROC_RCVLIST_FIL, 0644, can_dir, + &can_rcvlist_proc_fops, (void *)RX_FIL); + pde_rcvlist_inv = proc_create_data(CAN_PROC_RCVLIST_INV, 0644, can_dir, + &can_rcvlist_proc_fops, (void *)RX_INV); + pde_rcvlist_eff = proc_create_data(CAN_PROC_RCVLIST_EFF, 0644, can_dir, + &can_rcvlist_proc_fops, (void *)RX_EFF); + pde_rcvlist_sff = proc_create(CAN_PROC_RCVLIST_SFF, 0644, can_dir, + &can_rcvlist_sff_proc_fops); } /* diff --git a/net/core/dev.c b/net/core/dev.c index 09fb03f..4b83789 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -269,7 +269,7 @@ static const unsigned short netdev_lock_type[] = ARPHRD_IRDA, ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL, ARPHRD_FCFABRIC, ARPHRD_IEEE802_TR, ARPHRD_IEEE80211, ARPHRD_IEEE80211_PRISM, ARPHRD_IEEE80211_RADIOTAP, ARPHRD_PHONET, - ARPHRD_PHONET_PIPE, ARPHRD_IEEE802154, ARPHRD_IEEE802154_PHY, + ARPHRD_PHONET_PIPE, ARPHRD_IEEE802154, ARPHRD_VOID, ARPHRD_NONE}; static const char *const netdev_lock_name[] = @@ -287,7 +287,7 @@ static const char *const netdev_lock_name[] = "_xmit_IRDA", "_xmit_FCPP", "_xmit_FCAL", "_xmit_FCPL", "_xmit_FCFABRIC", "_xmit_IEEE802_TR", "_xmit_IEEE80211", "_xmit_IEEE80211_PRISM", "_xmit_IEEE80211_RADIOTAP", "_xmit_PHONET", - "_xmit_PHONET_PIPE", "_xmit_IEEE802154", "_xmit_IEEE802154_PHY", + "_xmit_PHONET_PIPE", "_xmit_IEEE802154", "_xmit_VOID", "_xmit_NONE"}; static struct lock_class_key netdev_xmit_lock_key[ARRAY_SIZE(netdev_lock_type)]; diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 19b8c20..2001cb1 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -131,6 +131,7 @@ #include <linux/ioport.h> #include <linux/interrupt.h> #include <linux/capability.h> +#include <linux/hrtimer.h> #include <linux/freezer.h> #include <linux/delay.h> #include <linux/timer.h> @@ -162,14 +163,13 @@ #include <asm/byteorder.h> #include <linux/rcupdate.h> #include <linux/bitops.h> -#include <asm/io.h> +#include <linux/io.h> +#include <linux/timex.h> +#include <linux/uaccess.h> #include <asm/dma.h> -#include <asm/uaccess.h> #include <asm/div64.h> /* do_div */ -#include <asm/timex.h> - -#define VERSION "pktgen v2.70: Packet Generator for packet performance testing.\n" +#define VERSION "2.72" #define IP_NAME_SZ 32 #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */ #define MPLS_STACK_BOTTOM htonl(0x00000100) @@ -206,7 +206,7 @@ #define PKTGEN_MAGIC 0xbe9be955 #define PG_PROC_DIR "pktgen" #define PGCTRL "pgctrl" -static struct proc_dir_entry *pg_proc_dir = NULL; +static struct proc_dir_entry *pg_proc_dir; #define MAX_CFLOWS 65536 @@ -231,9 +231,9 @@ struct pktgen_dev { */ struct proc_dir_entry *entry; /* proc file */ struct pktgen_thread *pg_thread;/* the owner */ - struct list_head list; /* Used for chaining in the thread's run-queue */ + struct list_head list; /* chaining in the thread's run-queue */ - int running; /* if this changes to false, the test will stop */ + int running; /* if false, the test will stop */ /* If min != max, then we will either do a linear iteration, or * we will do a random selection from within the range. @@ -246,33 +246,37 @@ struct pktgen_dev { int max_pkt_size; /* = ETH_ZLEN; */ int pkt_overhead; /* overhead for MPLS, VLANs, IPSEC etc */ int nfrags; - __u32 delay_us; /* Default delay */ - __u32 delay_ns; + u64 delay; /* nano-seconds */ + __u64 count; /* Default No packets to send */ __u64 sofar; /* How many pkts we've sent so far */ __u64 tx_bytes; /* How many bytes we've transmitted */ - __u64 errors; /* Errors when trying to transmit, pkts will be re-sent */ + __u64 errors; /* Errors when trying to transmit, + pkts will be re-sent */ /* runtime counters relating to clone_skb */ - __u64 next_tx_us; /* timestamp of when to tx next */ - __u32 next_tx_ns; __u64 allocated_skbs; __u32 clone_count; int last_ok; /* Was last skb sent? - * Or a failed transmit of some sort? This will keep - * sequence numbers in order, for example. + * Or a failed transmit of some sort? + * This will keep sequence numbers in order */ - __u64 started_at; /* micro-seconds */ - __u64 stopped_at; /* micro-seconds */ - __u64 idle_acc; /* micro-seconds */ + ktime_t next_tx; + ktime_t started_at; + ktime_t stopped_at; + u64 idle_acc; /* nano-seconds */ + __u32 seq_num; - int clone_skb; /* Use multiple SKBs during packet gen. If this number - * is greater than 1, then that many copies of the same - * packet will be sent before a new packet is allocated. - * For instance, if you want to send 1024 identical packets - * before creating a new packet, set clone_skb to 1024. + int clone_skb; /* + * Use multiple SKBs during packet gen. + * If this number is greater than 1, then + * that many copies of the same packet will be + * sent before a new packet is allocated. + * If you want to send 1024 identical packets + * before creating a new packet, + * set clone_skb to 1024. */ char dst_min[IP_NAME_SZ]; /* IP, ie 1.2.3.4 */ @@ -304,8 +308,10 @@ struct pktgen_dev { __u16 udp_dst_max; /* exclusive, dest UDP port */ /* DSCP + ECN */ - __u8 tos; /* six most significant bits of (former) IPv4 TOS are for dscp codepoint */ - __u8 traffic_class; /* ditto for the (former) Traffic Class in IPv6 (see RFC 3260, sec. 4) */ + __u8 tos; /* six MSB of (former) IPv4 TOS + are for dscp codepoint */ + __u8 traffic_class; /* ditto for the (former) Traffic Class in IPv6 + (see RFC 3260, sec. 4) */ /* MPLS */ unsigned nr_labels; /* Depth of stack, 0 = no MPLS */ @@ -346,15 +352,17 @@ struct pktgen_dev { */ __u16 pad; /* pad out the hh struct to an even 16 bytes */ - struct sk_buff *skb; /* skb we are to transmit next, mainly used for when we + struct sk_buff *skb; /* skb we are to transmit next, used for when we * are transmitting the same one multiple times */ - struct net_device *odev; /* The out-going device. Note that the device should - * have it's pg_info pointer pointing back to this - * device. This will be set when the user specifies - * the out-going device name (not when the inject is - * started as it used to do.) - */ + struct net_device *odev; /* The out-going device. + * Note that the device should have it's + * pg_info pointer pointing back to this + * device. + * Set when the user specifies the out-going + * device name (not when the inject is + * started as it used to do.) + */ struct flow_state *flows; unsigned cflows; /* Concurrent flows (config) */ unsigned lflow; /* Flow length (config) */ @@ -379,13 +387,14 @@ struct pktgen_hdr { }; struct pktgen_thread { - spinlock_t if_lock; + spinlock_t if_lock; /* for list of devices */ struct list_head if_list; /* All device here */ struct list_head th_list; struct task_struct *tsk; char result[512]; - /* Field for thread to receive "posted" events terminate, stop ifs etc. */ + /* Field for thread to receive "posted" events terminate, + stop ifs etc. */ u32 control; int cpu; @@ -397,24 +406,22 @@ struct pktgen_thread { #define REMOVE 1 #define FIND 0 -/** Convert to micro-seconds */ -static inline __u64 tv_to_us(const struct timeval *tv) +static inline ktime_t ktime_now(void) { - __u64 us = tv->tv_usec; - us += (__u64) tv->tv_sec * (__u64) 1000000; - return us; + struct timespec ts; + ktime_get_ts(&ts); + + return timespec_to_ktime(ts); } -static __u64 getCurUs(void) +/* This works even if 32 bit because of careful byte order choice */ +static inline int ktime_lt(const ktime_t cmp1, const ktime_t cmp2) { - struct timeval tv; - do_gettimeofday(&tv); - return tv_to_us(&tv); + return cmp1.tv64 < cmp2.tv64; } -/* old include end */ - -static char version[] __initdata = VERSION; +static const char version[] = + "pktgen " VERSION ": Packet Generator for packet performance testing.\n"; static int pktgen_remove_device(struct pktgen_thread *t, struct pktgen_dev *i); static int pktgen_add_device(struct pktgen_thread *t, const char *ifname); @@ -424,7 +431,7 @@ static int pktgen_device_event(struct notifier_block *, unsigned long, void *); static void pktgen_run_all_threads(void); static void pktgen_reset_all_threads(void); static void pktgen_stop_all_threads_ifs(void); -static int pktgen_stop_device(struct pktgen_dev *pkt_dev); + static void pktgen_stop(struct pktgen_thread *t); static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); @@ -432,10 +439,10 @@ static unsigned int scan_ip6(const char *s, char ip[16]); static unsigned int fmt_ip6(char *s, const char ip[16]); /* Module parameters, defaults. */ -static int pg_count_d = 1000; /* 1000 pkts by default */ -static int pg_delay_d; -static int pg_clone_skb_d; -static int debug; +static int pg_count_d __read_mostly = 1000; +static int pg_delay_d __read_mostly; +static int pg_clone_skb_d __read_mostly; +static int debug __read_mostly; static DEFINE_MUTEX(pktgen_thread_lock); static LIST_HEAD(pktgen_threads); @@ -451,12 +458,12 @@ static struct notifier_block pktgen_notifier_block = { static int pgctrl_show(struct seq_file *seq, void *v) { - seq_puts(seq, VERSION); + seq_puts(seq, version); return 0; } -static ssize_t pgctrl_write(struct file *file, const char __user * buf, - size_t count, loff_t * ppos) +static ssize_t pgctrl_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) { int err = 0; char data[128]; @@ -509,10 +516,9 @@ static const struct file_operations pktgen_fops = { static int pktgen_if_show(struct seq_file *seq, void *v) { - struct pktgen_dev *pkt_dev = seq->private; - __u64 sa; - __u64 stopped; - __u64 now = getCurUs(); + const struct pktgen_dev *pkt_dev = seq->private; + ktime_t stopped; + u64 idle; seq_printf(seq, "Params: count %llu min_pkt_size: %u max_pkt_size: %u\n", @@ -520,9 +526,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v) pkt_dev->max_pkt_size); seq_printf(seq, - " frags: %d delay: %u clone_skb: %d ifname: %s\n", - pkt_dev->nfrags, - 1000 * pkt_dev->delay_us + pkt_dev->delay_ns, + " frags: %d delay: %llu clone_skb: %d ifname: %s\n", + pkt_dev->nfrags, (unsigned long long) pkt_dev->delay, pkt_dev->clone_skb, pkt_dev->odev->name); seq_printf(seq, " flows: %u flowlen: %u\n", pkt_dev->cflows, @@ -549,11 +554,14 @@ static int pktgen_if_show(struct seq_file *seq, void *v) " daddr: %s min_daddr: %s max_daddr: %s\n", b1, b2, b3); - } else + } else { + seq_printf(seq, + " dst_min: %s dst_max: %s\n", + pkt_dev->dst_min, pkt_dev->dst_max); seq_printf(seq, - " dst_min: %s dst_max: %s\n src_min: %s src_max: %s\n", - pkt_dev->dst_min, pkt_dev->dst_max, pkt_dev->src_min, - pkt_dev->src_max); + " src_min: %s src_max: %s\n", + pkt_dev->src_min, pkt_dev->src_max); + } seq_puts(seq, " src_mac: "); @@ -565,7 +573,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v) seq_printf(seq, "%pM\n", pkt_dev->dst_mac); seq_printf(seq, - " udp_src_min: %d udp_src_max: %d udp_dst_min: %d udp_dst_max: %d\n", + " udp_src_min: %d udp_src_max: %d" + " udp_dst_min: %d udp_dst_max: %d\n", pkt_dev->udp_src_min, pkt_dev->udp_src_max, pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); @@ -581,23 +590,21 @@ static int pktgen_if_show(struct seq_file *seq, void *v) i == pkt_dev->nr_labels-1 ? "\n" : ", "); } - if (pkt_dev->vlan_id != 0xffff) { + if (pkt_dev->vlan_id != 0xffff) seq_printf(seq, " vlan_id: %u vlan_p: %u vlan_cfi: %u\n", - pkt_dev->vlan_id, pkt_dev->vlan_p, pkt_dev->vlan_cfi); - } + pkt_dev->vlan_id, pkt_dev->vlan_p, + pkt_dev->vlan_cfi); - if (pkt_dev->svlan_id != 0xffff) { + if (pkt_dev->svlan_id != 0xffff) seq_printf(seq, " svlan_id: %u vlan_p: %u vlan_cfi: %u\n", - pkt_dev->svlan_id, pkt_dev->svlan_p, pkt_dev->svlan_cfi); - } + pkt_dev->svlan_id, pkt_dev->svlan_p, + pkt_dev->svlan_cfi); - if (pkt_dev->tos) { + if (pkt_dev->tos) seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos); - } - if (pkt_dev->traffic_class) { + if (pkt_dev->traffic_class) seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); - } seq_printf(seq, " Flags: "); @@ -654,17 +661,21 @@ static int pktgen_if_show(struct seq_file *seq, void *v) seq_puts(seq, "\n"); - sa = pkt_dev->started_at; - stopped = pkt_dev->stopped_at; - if (pkt_dev->running) - stopped = now; /* not really stopped, more like last-running-at */ + /* not really stopped, more like last-running-at */ + stopped = pkt_dev->running ? ktime_now() : pkt_dev->stopped_at; + idle = pkt_dev->idle_acc; + do_div(idle, NSEC_PER_USEC); seq_printf(seq, - "Current:\n pkts-sofar: %llu errors: %llu\n started: %lluus stopped: %lluus idle: %lluus\n", + "Current:\n pkts-sofar: %llu errors: %llu\n", (unsigned long long)pkt_dev->sofar, - (unsigned long long)pkt_dev->errors, (unsigned long long)sa, - (unsigned long long)stopped, - (unsigned long long)pkt_dev->idle_acc); + (unsigned long long)pkt_dev->errors); + + seq_printf(seq, + " started: %lluus stopped: %lluus idle: %lluus\n", + (unsigned long long) ktime_to_us(pkt_dev->started_at), + (unsigned long long) ktime_to_us(stopped), + (unsigned long long) idle); seq_printf(seq, " seq_num: %d cur_dst_mac_offset: %d cur_src_mac_offset: %d\n", @@ -696,7 +707,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v) } -static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, __u32 *num) +static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, + __u32 *num) { int i = 0; *num = 0; @@ -846,9 +858,9 @@ static ssize_t pktgen_if_write(struct file *file, /* Read variable name */ len = strn_len(&user_buffer[i], sizeof(name) - 1); - if (len < 0) { + if (len < 0) return len; - } + memset(name, 0, sizeof(name)); if (copy_from_user(name, &user_buffer[i], len)) return -EFAULT; @@ -872,9 +884,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "min_pkt_size")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value < 14 + 20 + 8) value = 14 + 20 + 8; @@ -889,9 +901,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "max_pkt_size")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value < 14 + 20 + 8) value = 14 + 20 + 8; @@ -908,9 +920,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "pkt_size")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value < 14 + 20 + 8) value = 14 + 20 + 8; @@ -925,9 +937,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "debug")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; debug = value; sprintf(pg_result, "OK: debug=%u", debug); @@ -936,9 +948,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "frags")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; pkt_dev->nfrags = value; sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags); @@ -946,26 +958,24 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "delay")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; - if (value == 0x7FFFFFFF) { - pkt_dev->delay_us = 0x7FFFFFFF; - pkt_dev->delay_ns = 0; - } else { - pkt_dev->delay_us = value / 1000; - pkt_dev->delay_ns = value % 1000; - } - sprintf(pg_result, "OK: delay=%u", - 1000 * pkt_dev->delay_us + pkt_dev->delay_ns); + if (value == 0x7FFFFFFF) + pkt_dev->delay = ULLONG_MAX; + else + pkt_dev->delay = (u64)value * NSEC_PER_USEC; + + sprintf(pg_result, "OK: delay=%llu", + (unsigned long long) pkt_dev->delay); return count; } if (!strcmp(name, "udp_src_min")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value != pkt_dev->udp_src_min) { pkt_dev->udp_src_min = value; @@ -976,9 +986,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "udp_dst_min")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value != pkt_dev->udp_dst_min) { pkt_dev->udp_dst_min = value; @@ -989,9 +999,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "udp_src_max")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value != pkt_dev->udp_src_max) { pkt_dev->udp_src_max = value; @@ -1002,9 +1012,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "udp_dst_max")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value != pkt_dev->udp_dst_max) { pkt_dev->udp_dst_max = value; @@ -1015,9 +1025,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "clone_skb")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; pkt_dev->clone_skb = value; @@ -1026,9 +1036,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "count")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; pkt_dev->count = value; sprintf(pg_result, "OK: count=%llu", @@ -1037,9 +1047,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "src_mac_count")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (pkt_dev->src_mac_count != value) { pkt_dev->src_mac_count = value; @@ -1051,9 +1061,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "dst_mac_count")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (pkt_dev->dst_mac_count != value) { pkt_dev->dst_mac_count = value; @@ -1067,9 +1077,9 @@ static ssize_t pktgen_if_write(struct file *file, char f[32]; memset(f, 0, 32); len = strn_len(&user_buffer[i], sizeof(f) - 1); - if (len < 0) { + if (len < 0) return len; - } + if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; i += len; @@ -1168,9 +1178,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); - if (len < 0) { + if (len < 0) return len; - } if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; @@ -1190,9 +1199,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "dst_max")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); - if (len < 0) { + if (len < 0) return len; - } + if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; @@ -1303,9 +1312,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "src_min")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); - if (len < 0) { + if (len < 0) return len; - } + if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; @@ -1324,9 +1333,9 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "src_max")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); - if (len < 0) { + if (len < 0) return len; - } + if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; @@ -1350,9 +1359,9 @@ static ssize_t pktgen_if_write(struct file *file, memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN); len = strn_len(&user_buffer[i], sizeof(valstr) - 1); - if (len < 0) { + if (len < 0) return len; - } + memset(valstr, 0, sizeof(valstr)); if (copy_from_user(valstr, &user_buffer[i], len)) return -EFAULT; @@ -1392,9 +1401,9 @@ static ssize_t pktgen_if_write(struct file *file, memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN); len = strn_len(&user_buffer[i], sizeof(valstr) - 1); - if (len < 0) { + if (len < 0) return len; - } + memset(valstr, 0, sizeof(valstr)); if (copy_from_user(valstr, &user_buffer[i], len)) return -EFAULT; @@ -1435,9 +1444,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "flows")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value > MAX_CFLOWS) value = MAX_CFLOWS; @@ -1449,9 +1458,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "flowlen")) { len = num_arg(&user_buffer[i], 10, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; pkt_dev->lflow = value; sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); @@ -1460,9 +1469,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "queue_map_min")) { len = num_arg(&user_buffer[i], 5, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; pkt_dev->queue_map_min = value; sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); @@ -1471,9 +1480,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "queue_map_max")) { len = num_arg(&user_buffer[i], 5, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; pkt_dev->queue_map_max = value; sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); @@ -1505,9 +1514,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "vlan_id")) { len = num_arg(&user_buffer[i], 4, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (value <= 4095) { pkt_dev->vlan_id = value; /* turn on VLAN */ @@ -1532,9 +1541,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "vlan_p")) { len = num_arg(&user_buffer[i], 1, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { pkt_dev->vlan_p = value; @@ -1547,9 +1556,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "vlan_cfi")) { len = num_arg(&user_buffer[i], 1, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { pkt_dev->vlan_cfi = value; @@ -1562,9 +1571,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "svlan_id")) { len = num_arg(&user_buffer[i], 4, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { pkt_dev->svlan_id = value; /* turn on SVLAN */ @@ -1589,9 +1598,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "svlan_p")) { len = num_arg(&user_buffer[i], 1, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { pkt_dev->svlan_p = value; @@ -1604,9 +1613,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "svlan_cfi")) { len = num_arg(&user_buffer[i], 1, &value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { pkt_dev->svlan_cfi = value; @@ -1620,9 +1629,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "tos")) { __u32 tmp_value = 0; len = hex32_arg(&user_buffer[i], 2, &tmp_value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (len == 2) { pkt_dev->tos = tmp_value; @@ -1636,9 +1645,9 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "traffic_class")) { __u32 tmp_value = 0; len = hex32_arg(&user_buffer[i], 2, &tmp_value); - if (len < 0) { + if (len < 0) return len; - } + i += len; if (len == 2) { pkt_dev->traffic_class = tmp_value; @@ -1670,7 +1679,7 @@ static const struct file_operations pktgen_if_fops = { static int pktgen_thread_show(struct seq_file *seq, void *v) { struct pktgen_thread *t = seq->private; - struct pktgen_dev *pkt_dev; + const struct pktgen_dev *pkt_dev; BUG_ON(!t); @@ -1873,8 +1882,10 @@ static void pktgen_change_name(struct net_device *dev) remove_proc_entry(pkt_dev->entry->name, pg_proc_dir); - pkt_dev->entry = create_proc_entry(dev->name, 0600, - pg_proc_dir); + pkt_dev->entry = proc_create_data(dev->name, 0600, + pg_proc_dir, + &pktgen_if_fops, + pkt_dev); if (!pkt_dev->entry) printk(KERN_ERR "pktgen: can't move proc " " entry for '%s'\n", dev->name); @@ -1908,13 +1919,14 @@ static int pktgen_device_event(struct notifier_block *unused, return NOTIFY_DONE; } -static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev, const char *ifname) +static struct net_device *pktgen_dev_get_by_name(struct pktgen_dev *pkt_dev, + const char *ifname) { char b[IFNAMSIZ+5]; int i = 0; - for(i=0; ifname[i] != '@'; i++) { - if(i == IFNAMSIZ) + for (i = 0; ifname[i] != '@'; i++) { + if (i == IFNAMSIZ) break; b[i] = ifname[i]; @@ -1981,7 +1993,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) printk(KERN_WARNING "pktgen: WARNING: Requested " "queue_map_min (zero-based) (%d) exceeds valid range " "[0 - %d] for (%d) queues on %s, resetting\n", - pkt_dev->queue_map_min, (ntxq ?: 1)- 1, ntxq, + pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq, pkt_dev->odev->name); pkt_dev->queue_map_min = ntxq - 1; } @@ -1989,7 +2001,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) printk(KERN_WARNING "pktgen: WARNING: Requested " "queue_map_max (zero-based) (%d) exceeds valid range " "[0 - %d] for (%d) queues on %s, resetting\n", - pkt_dev->queue_map_max, (ntxq ?: 1)- 1, ntxq, + pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq, pkt_dev->odev->name); pkt_dev->queue_map_max = ntxq - 1; } @@ -2030,7 +2042,8 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) */ rcu_read_lock(); - if ((idev = __in6_dev_get(pkt_dev->odev)) != NULL) { + idev = __in6_dev_get(pkt_dev->odev); + if (idev) { struct inet6_ifaddr *ifp; read_lock_bh(&idev->lock); @@ -2089,27 +2102,40 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) pkt_dev->nflows = 0; } -static void spin(struct pktgen_dev *pkt_dev, __u64 spin_until_us) + +static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) { - __u64 start; - __u64 now; + ktime_t start; + s32 remaining; + struct hrtimer_sleeper t; + + hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_set_expires(&t.timer, spin_until); + + remaining = ktime_to_us(hrtimer_expires_remaining(&t.timer)); + if (remaining <= 0) + return; - start = now = getCurUs(); - while (now < spin_until_us) { - /* TODO: optimize sleeping behavior */ - if (spin_until_us - now > jiffies_to_usecs(1) + 1) - schedule_timeout_interruptible(1); - else if (spin_until_us - now > 100) { - if (!pkt_dev->running) - return; - if (need_resched()) + start = ktime_now(); + if (remaining < 100) + udelay(remaining); /* really small just spin */ + else { + /* see do_nanosleep */ + hrtimer_init_sleeper(&t, current); + do { + set_current_state(TASK_INTERRUPTIBLE); + hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS); + if (!hrtimer_active(&t.timer)) + t.task = NULL; + + if (likely(t.task)) schedule(); - } - now = getCurUs(); + hrtimer_cancel(&t.timer); + } while (t.task && pkt_dev->running && !signal_pending(current)); + __set_current_state(TASK_RUNNING); } - - pkt_dev->idle_acc += now - start; + pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_now(), start)); } static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev) @@ -2120,13 +2146,9 @@ static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev) pkt_dev->pkt_overhead += SVLAN_TAG_SIZE(pkt_dev); } -static inline int f_seen(struct pktgen_dev *pkt_dev, int flow) +static inline int f_seen(const struct pktgen_dev *pkt_dev, int flow) { - - if (pkt_dev->flows[flow].flags & F_INIT) - return 1; - else - return 0; + return !!(pkt_dev->flows[flow].flags & F_INIT); } static inline int f_pick(struct pktgen_dev *pkt_dev) @@ -2174,7 +2196,7 @@ static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow) if (x) { pkt_dev->flows[flow].x = x; set_pkt_overhead(pkt_dev); - pkt_dev->pkt_overhead+=x->props.header_len; + pkt_dev->pkt_overhead += x->props.header_len; } } @@ -2313,18 +2335,18 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) if (!(pkt_dev->flags & F_IPV6)) { - if ((imn = ntohl(pkt_dev->saddr_min)) < (imx = - ntohl(pkt_dev-> - saddr_max))) { + imn = ntohl(pkt_dev->saddr_min); + imx = ntohl(pkt_dev->saddr_max); + if (imn < imx) { __u32 t; if (pkt_dev->flags & F_IPSRC_RND) t = random32() % (imx - imn) + imn; else { t = ntohl(pkt_dev->cur_saddr); t++; - if (t > imx) { + if (t > imx) t = imn; - } + } pkt_dev->cur_saddr = htonl(t); } @@ -2435,14 +2457,14 @@ static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev) if (err) goto error; - x->curlft.bytes +=skb->len; + x->curlft.bytes += skb->len; x->curlft.packets++; error: spin_unlock(&x->lock); return err; } -static inline void free_SAs(struct pktgen_dev *pkt_dev) +static void free_SAs(struct pktgen_dev *pkt_dev) { if (pkt_dev->cflows) { /* let go of the SAs if we have them */ @@ -2457,7 +2479,7 @@ static inline void free_SAs(struct pktgen_dev *pkt_dev) } } -static inline int process_ipsec(struct pktgen_dev *pkt_dev, +static int process_ipsec(struct pktgen_dev *pkt_dev, struct sk_buff *skb, __be16 protocol) { if (pkt_dev->flags & F_IPSEC_ON) { @@ -2467,11 +2489,11 @@ static inline int process_ipsec(struct pktgen_dev *pkt_dev, int ret; __u8 *eth; nhead = x->props.header_len - skb_headroom(skb); - if (nhead >0) { + if (nhead > 0) { ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); if (ret < 0) { printk(KERN_ERR "Error expanding " - "ipsec packet %d\n",ret); + "ipsec packet %d\n", ret); goto err; } } @@ -2481,13 +2503,13 @@ static inline int process_ipsec(struct pktgen_dev *pkt_dev, ret = pktgen_output_ipsec(skb, pkt_dev); if (ret) { printk(KERN_ERR "Error creating ipsec " - "packet %d\n",ret); + "packet %d\n", ret); goto err; } /* restore ll */ eth = (__u8 *) skb_push(skb, ETH_HLEN); memcpy(eth, pkt_dev->hh, 12); - *(u16 *) & eth[12] = protocol; + *(u16 *) ð[12] = protocol; } } return 1; @@ -2500,9 +2522,9 @@ err: static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) { unsigned i; - for (i = 0; i < pkt_dev->nr_labels; i++) { + for (i = 0; i < pkt_dev->nr_labels; i++) *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; - } + mpls--; *mpls |= MPLS_STACK_BOTTOM; } @@ -2543,8 +2565,9 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, mod_cur_headers(pkt_dev); datalen = (odev->hard_header_len + 16) & ~0xf; - skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + datalen + - pkt_dev->pkt_overhead, GFP_ATOMIC); + skb = __netdev_alloc_skb(odev, + pkt_dev->cur_pkt_size + 64 + + datalen + pkt_dev->pkt_overhead, GFP_NOWAIT); if (!skb) { sprintf(pkt_dev->result, "No memory"); return NULL; @@ -2668,8 +2691,9 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, } } - /* Stamp the time, and sequence number, convert them to network byte order */ - + /* Stamp the time, and sequence number, + * convert them to network byte order + */ if (pgh) { struct timeval timestamp; @@ -2882,8 +2906,9 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, queue_map = pkt_dev->cur_queue_map; mod_cur_headers(pkt_dev); - skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16 + - pkt_dev->pkt_overhead, GFP_ATOMIC); + skb = __netdev_alloc_skb(odev, + pkt_dev->cur_pkt_size + 64 + + 16 + pkt_dev->pkt_overhead, GFP_NOWAIT); if (!skb) { sprintf(pkt_dev->result, "No memory"); return NULL; @@ -2922,7 +2947,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, udph = udp_hdr(skb); memcpy(eth, pkt_dev->hh, 12); - *(__be16 *) & eth[12] = protocol; + *(__be16 *) ð[12] = protocol; /* Eth + IPh + UDPh + mpls */ datalen = pkt_dev->cur_pkt_size - 14 - @@ -3016,8 +3041,10 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, } } - /* Stamp the time, and sequence number, convert them to network byte order */ - /* should we update cloned packets too ? */ + /* Stamp the time, and sequence number, + * convert them to network byte order + * should we update cloned packets too ? + */ if (pgh) { struct timeval timestamp; @@ -3033,8 +3060,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, return skb; } -static inline struct sk_buff *fill_packet(struct net_device *odev, - struct pktgen_dev *pkt_dev) +static struct sk_buff *fill_packet(struct net_device *odev, + struct pktgen_dev *pkt_dev) { if (pkt_dev->flags & F_IPV6) return fill_packet_ipv6(odev, pkt_dev); @@ -3072,9 +3099,9 @@ static void pktgen_run(struct pktgen_thread *t) pktgen_clear_counters(pkt_dev); pkt_dev->running = 1; /* Cranke yeself! */ pkt_dev->skb = NULL; - pkt_dev->started_at = getCurUs(); - pkt_dev->next_tx_us = getCurUs(); /* Transmit immediately */ - pkt_dev->next_tx_ns = 0; + pkt_dev->started_at = + pkt_dev->next_tx = ktime_now(); + set_pkt_overhead(pkt_dev); strcpy(pkt_dev->result, "Starting"); @@ -3101,17 +3128,14 @@ static void pktgen_stop_all_threads_ifs(void) mutex_unlock(&pktgen_thread_lock); } -static int thread_is_running(struct pktgen_thread *t) +static int thread_is_running(const struct pktgen_thread *t) { - struct pktgen_dev *pkt_dev; - int res = 0; + const struct pktgen_dev *pkt_dev; list_for_each_entry(pkt_dev, &t->if_list, list) - if (pkt_dev->running) { - res = 1; - break; - } - return res; + if (pkt_dev->running) + return 1; + return 0; } static int pktgen_wait_thread_run(struct pktgen_thread *t) @@ -3168,7 +3192,8 @@ static void pktgen_run_all_threads(void) mutex_unlock(&pktgen_thread_lock); - schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */ + /* Propagate thread->control */ + schedule_timeout_interruptible(msecs_to_jiffies(125)); pktgen_wait_all_threads_run(); } @@ -3186,35 +3211,29 @@ static void pktgen_reset_all_threads(void) mutex_unlock(&pktgen_thread_lock); - schedule_timeout_interruptible(msecs_to_jiffies(125)); /* Propagate thread->control */ + /* Propagate thread->control */ + schedule_timeout_interruptible(msecs_to_jiffies(125)); pktgen_wait_all_threads_run(); } static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) { - __u64 total_us, bps, mbps, pps, idle; + __u64 bps, mbps, pps; char *p = pkt_dev->result; - - total_us = pkt_dev->stopped_at - pkt_dev->started_at; - - idle = pkt_dev->idle_acc; - - p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags)\n", - (unsigned long long)total_us, - (unsigned long long)(total_us - idle), - (unsigned long long)idle, + ktime_t elapsed = ktime_sub(pkt_dev->stopped_at, + pkt_dev->started_at); + ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); + + p += sprintf(p, "OK: %llu(c%llu+d%llu) nsec, %llu (%dbyte,%dfrags)\n", + (unsigned long long)ktime_to_us(elapsed), + (unsigned long long)ktime_to_us(ktime_sub(elapsed, idle)), + (unsigned long long)ktime_to_us(idle), (unsigned long long)pkt_dev->sofar, pkt_dev->cur_pkt_size, nr_frags); - pps = pkt_dev->sofar * USEC_PER_SEC; - - while ((total_us >> 32) != 0) { - pps >>= 1; - total_us >>= 1; - } - - do_div(pps, total_us); + pps = div64_u64(pkt_dev->sofar * NSEC_PER_SEC, + ktime_to_ns(elapsed)); bps = pps * 8 * pkt_dev->cur_pkt_size; @@ -3228,7 +3247,6 @@ static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) } /* Set stopped-at timer, remove from running list, do counters & statistics */ - static int pktgen_stop_device(struct pktgen_dev *pkt_dev) { int nr_frags = pkt_dev->skb ? skb_shinfo(pkt_dev->skb)->nr_frags : -1; @@ -3239,7 +3257,9 @@ static int pktgen_stop_device(struct pktgen_dev *pkt_dev) return -EINVAL; } - pkt_dev->stopped_at = getCurUs(); + kfree_skb(pkt_dev->skb); + pkt_dev->skb = NULL; + pkt_dev->stopped_at = ktime_now(); pkt_dev->running = 0; show_results(pkt_dev, nr_frags); @@ -3258,7 +3278,7 @@ static struct pktgen_dev *next_to_run(struct pktgen_thread *t) continue; if (best == NULL) best = pkt_dev; - else if (pkt_dev->next_tx_us < best->next_tx_us) + else if (ktime_lt(pkt_dev->next_tx, best->next_tx)) best = pkt_dev; } if_unlock(t); @@ -3275,9 +3295,6 @@ static void pktgen_stop(struct pktgen_thread *t) list_for_each_entry(pkt_dev, &t->if_list, list) { pktgen_stop_device(pkt_dev); - kfree_skb(pkt_dev->skb); - - pkt_dev->skb = NULL; } if_unlock(t); @@ -3348,30 +3365,37 @@ static void pktgen_rem_thread(struct pktgen_thread *t) mutex_unlock(&pktgen_thread_lock); } -static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) +static void idle(struct pktgen_dev *pkt_dev) +{ + ktime_t idle_start = ktime_now(); + + if (need_resched()) + schedule(); + else + cpu_relax(); + + pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_now(), idle_start)); +} + + +static void pktgen_xmit(struct pktgen_dev *pkt_dev) { struct net_device *odev = pkt_dev->odev; int (*xmit)(struct sk_buff *, struct net_device *) = odev->netdev_ops->ndo_start_xmit; struct netdev_queue *txq; - __u64 idle_start = 0; u16 queue_map; int ret; - if (pkt_dev->delay_us || pkt_dev->delay_ns) { - u64 now; - - now = getCurUs(); - if (now < pkt_dev->next_tx_us) - spin(pkt_dev, pkt_dev->next_tx_us); + if (pkt_dev->delay) { + spin(pkt_dev, pkt_dev->next_tx); /* This is max DELAY, this has special meaning of * "never transmit" */ - if (pkt_dev->delay_us == 0x7FFFFFFF) { - pkt_dev->next_tx_us = getCurUs() + pkt_dev->delay_us; - pkt_dev->next_tx_ns = pkt_dev->delay_ns; - goto out; + if (pkt_dev->delay == ULLONG_MAX) { + pkt_dev->next_tx = ktime_add_ns(ktime_now(), ULONG_MAX); + return; } } @@ -3383,47 +3407,32 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) } txq = netdev_get_tx_queue(odev, queue_map); - if (netif_tx_queue_stopped(txq) || - netif_tx_queue_frozen(txq) || - need_resched()) { - idle_start = getCurUs(); - - if (!netif_running(odev)) { + /* Did we saturate the queue already? */ + if (netif_tx_queue_stopped(txq) || netif_tx_queue_frozen(txq)) { + /* If device is down, then all queues are permnantly frozen */ + if (netif_running(odev)) + idle(pkt_dev); + else pktgen_stop_device(pkt_dev); - kfree_skb(pkt_dev->skb); - pkt_dev->skb = NULL; - goto out; - } - if (need_resched()) - schedule(); - - pkt_dev->idle_acc += getCurUs() - idle_start; - - if (netif_tx_queue_stopped(txq) || - netif_tx_queue_frozen(txq)) { - pkt_dev->next_tx_us = getCurUs(); /* TODO */ - pkt_dev->next_tx_ns = 0; - goto out; /* Try the next interface */ - } + return; } - if (pkt_dev->last_ok || !pkt_dev->skb) { - if ((++pkt_dev->clone_count >= pkt_dev->clone_skb) - || (!pkt_dev->skb)) { - /* build a new pkt */ - kfree_skb(pkt_dev->skb); + if (!pkt_dev->skb || (pkt_dev->last_ok && + ++pkt_dev->clone_count >= pkt_dev->clone_skb)) { + /* build a new pkt */ + kfree_skb(pkt_dev->skb); - pkt_dev->skb = fill_packet(odev, pkt_dev); - if (pkt_dev->skb == NULL) { - printk(KERN_ERR "pktgen: ERROR: couldn't " - "allocate skb in fill_packet.\n"); - schedule(); - pkt_dev->clone_count--; /* back out increment, OOM */ - goto out; - } - pkt_dev->allocated_skbs++; - pkt_dev->clone_count = 0; /* reset counter */ + pkt_dev->skb = fill_packet(odev, pkt_dev); + if (pkt_dev->skb == NULL) { + printk(KERN_ERR "pktgen: ERROR: couldn't " + "allocate skb in fill_packet.\n"); + schedule(); + pkt_dev->clone_count--; /* back out increment, OOM */ + return; } + + pkt_dev->allocated_skbs++; + pkt_dev->clone_count = 0; /* reset counter */ } /* fill_packet() might have changed the queue */ @@ -3431,73 +3440,53 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) txq = netdev_get_tx_queue(odev, queue_map); __netif_tx_lock_bh(txq); - if (!netif_tx_queue_stopped(txq) && - !netif_tx_queue_frozen(txq)) { - + if (unlikely(netif_tx_queue_stopped(txq) || netif_tx_queue_frozen(txq))) + pkt_dev->last_ok = 0; + else { atomic_inc(&(pkt_dev->skb->users)); - retry_now: + + retry_now: ret = (*xmit)(pkt_dev->skb, odev); - if (likely(ret == NETDEV_TX_OK)) { + switch (ret) { + case NETDEV_TX_OK: txq_trans_update(txq); pkt_dev->last_ok = 1; pkt_dev->sofar++; pkt_dev->seq_num++; pkt_dev->tx_bytes += pkt_dev->cur_pkt_size; - - } else if (ret == NETDEV_TX_LOCKED - && (odev->features & NETIF_F_LLTX)) { + break; + case NETDEV_TX_LOCKED: cpu_relax(); goto retry_now; - } else { /* Retry it next time */ - - atomic_dec(&(pkt_dev->skb->users)); - - if (debug && net_ratelimit()) - printk(KERN_INFO "pktgen: Hard xmit error\n"); - + default: /* Drivers are not supposed to return other values! */ + if (net_ratelimit()) + pr_info("pktgen: %s xmit error: %d\n", + odev->name, ret); pkt_dev->errors++; + /* fallthru */ + case NETDEV_TX_BUSY: + /* Retry it next time */ + atomic_dec(&(pkt_dev->skb->users)); pkt_dev->last_ok = 0; } - pkt_dev->next_tx_us = getCurUs(); - pkt_dev->next_tx_ns = 0; - - pkt_dev->next_tx_us += pkt_dev->delay_us; - pkt_dev->next_tx_ns += pkt_dev->delay_ns; - - if (pkt_dev->next_tx_ns > 1000) { - pkt_dev->next_tx_us++; - pkt_dev->next_tx_ns -= 1000; - } + if (pkt_dev->delay) + pkt_dev->next_tx = ktime_add_ns(ktime_now(), + pkt_dev->delay); } - - else { /* Retry it next time */ - pkt_dev->last_ok = 0; - pkt_dev->next_tx_us = getCurUs(); /* TODO */ - pkt_dev->next_tx_ns = 0; - } - __netif_tx_unlock_bh(txq); /* If pkt_dev->count is zero, then run forever */ if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) { - if (atomic_read(&(pkt_dev->skb->users)) != 1) { - idle_start = getCurUs(); - while (atomic_read(&(pkt_dev->skb->users)) != 1) { - if (signal_pending(current)) { - break; - } - schedule(); - } - pkt_dev->idle_acc += getCurUs() - idle_start; + while (atomic_read(&(pkt_dev->skb->users)) != 1) { + if (signal_pending(current)) + break; + idle(pkt_dev); } /* Done with this */ pktgen_stop_device(pkt_dev); - kfree_skb(pkt_dev->skb); - pkt_dev->skb = NULL; } -out:; } /* @@ -3516,7 +3505,8 @@ static int pktgen_thread_worker(void *arg) init_waitqueue_head(&t->queue); complete(&t->start_done); - pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current)); + pr_debug("pktgen: starting pktgen/%d: pid=%d\n", + cpu, task_pid_nr(current)); set_current_state(TASK_INTERRUPTIBLE); @@ -3651,8 +3641,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) pkt_dev->max_pkt_size = ETH_ZLEN; pkt_dev->nfrags = 0; pkt_dev->clone_skb = pg_clone_skb_d; - pkt_dev->delay_us = pg_delay_d / 1000; - pkt_dev->delay_ns = pg_delay_d % 1000; + pkt_dev->delay = pg_delay_d; pkt_dev->count = pg_count_d; pkt_dev->sofar = 0; pkt_dev->udp_src_min = 9; /* sink port */ @@ -3864,10 +3853,15 @@ static void __exit pg_cleanup(void) module_init(pg_init); module_exit(pg_cleanup); -MODULE_AUTHOR("Robert Olsson <robert.olsson@its.uu.se"); +MODULE_AUTHOR("Robert Olsson <robert.olsson@its.uu.se>"); MODULE_DESCRIPTION("Packet Generator tool"); MODULE_LICENSE("GPL"); +MODULE_VERSION(VERSION); module_param(pg_count_d, int, 0); +MODULE_PARM_DESC(pg_count_d, "Default number of packets to inject"); module_param(pg_delay_d, int, 0); +MODULE_PARM_DESC(pg_delay_d, "Default delay between packets (nanoseconds)"); module_param(pg_clone_skb_d, int, 0); +MODULE_PARM_DESC(pg_clone_skb_d, "Default number of copies of the same packet"); module_param(debug, int, 0); +MODULE_PARM_DESC(debug, "Enable debugging of pktgen module"); diff --git a/net/ieee802154/Makefile b/net/ieee802154/Makefile index f99338a..4068a9f 100644 --- a/net/ieee802154/Makefile +++ b/net/ieee802154/Makefile @@ -1,4 +1,4 @@ -obj-$(CONFIG_IEEE802154) += nl802154.o af_802154.o +obj-$(CONFIG_IEEE802154) += nl802154.o af_802154.o wpan-class.o nl802154-y := netlink.o nl_policy.o af_802154-y := af_ieee802154.o raw.o dgram.o diff --git a/net/ieee802154/af_ieee802154.c b/net/ieee802154/af_ieee802154.c index d504c34..cd949d5 100644 --- a/net/ieee802154/af_ieee802154.c +++ b/net/ieee802154/af_ieee802154.c @@ -147,9 +147,7 @@ static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg, dev_load(sock_net(sk), ifr.ifr_name); dev = dev_get_by_name(sock_net(sk), ifr.ifr_name); - if ((dev->type == ARPHRD_IEEE802154 || - dev->type == ARPHRD_IEEE802154_PHY) && - dev->netdev_ops->ndo_do_ioctl) + if (dev->type == ARPHRD_IEEE802154 && dev->netdev_ops->ndo_do_ioctl) ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, cmd); if (!ret && copy_to_user(arg, &ifr, sizeof(struct ifreq))) diff --git a/net/ieee802154/netlink.c b/net/ieee802154/netlink.c index cd0567f..2106ecb 100644 --- a/net/ieee802154/netlink.c +++ b/net/ieee802154/netlink.c @@ -232,7 +232,7 @@ nla_put_failure: EXPORT_SYMBOL(ieee802154_nl_beacon_indic); int ieee802154_nl_scan_confirm(struct net_device *dev, - u8 status, u8 scan_type, u32 unscanned, + u8 status, u8 scan_type, u32 unscanned, u8 page, u8 *edl/* , struct list_head *pan_desc_list */) { struct sk_buff *msg; @@ -251,6 +251,7 @@ int ieee802154_nl_scan_confirm(struct net_device *dev, NLA_PUT_U8(msg, IEEE802154_ATTR_STATUS, status); NLA_PUT_U8(msg, IEEE802154_ATTR_SCAN_TYPE, scan_type); NLA_PUT_U32(msg, IEEE802154_ATTR_CHANNELS, unscanned); + NLA_PUT_U8(msg, IEEE802154_ATTR_PAGE, page); if (edl) NLA_PUT(msg, IEEE802154_ATTR_ED_LIST, 27, edl); @@ -349,6 +350,7 @@ static int ieee802154_associate_req(struct sk_buff *skb, { struct net_device *dev; struct ieee802154_addr addr; + u8 page; int ret = -EINVAL; if (!info->attrs[IEEE802154_ATTR_CHANNEL] || @@ -374,8 +376,14 @@ static int ieee802154_associate_req(struct sk_buff *skb, } addr.pan_id = nla_get_u16(info->attrs[IEEE802154_ATTR_COORD_PAN_ID]); + if (info->attrs[IEEE802154_ATTR_PAGE]) + page = nla_get_u8(info->attrs[IEEE802154_ATTR_PAGE]); + else + page = 0; + ret = ieee802154_mlme_ops(dev)->assoc_req(dev, &addr, nla_get_u8(info->attrs[IEEE802154_ATTR_CHANNEL]), + page, nla_get_u8(info->attrs[IEEE802154_ATTR_CAPABILITY])); dev_put(dev); @@ -458,6 +466,7 @@ static int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info) struct ieee802154_addr addr; u8 channel, bcn_ord, sf_ord; + u8 page; int pan_coord, blx, coord_realign; int ret; @@ -488,13 +497,19 @@ static int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info) blx = nla_get_u8(info->attrs[IEEE802154_ATTR_BAT_EXT]); coord_realign = nla_get_u8(info->attrs[IEEE802154_ATTR_COORD_REALIGN]); + if (info->attrs[IEEE802154_ATTR_PAGE]) + page = nla_get_u8(info->attrs[IEEE802154_ATTR_PAGE]); + else + page = 0; + + if (addr.short_addr == IEEE802154_ADDR_BROADCAST) { ieee802154_nl_start_confirm(dev, IEEE802154_NO_SHORT_ADDRESS); dev_put(dev); return -EINVAL; } - ret = ieee802154_mlme_ops(dev)->start_req(dev, &addr, channel, + ret = ieee802154_mlme_ops(dev)->start_req(dev, &addr, channel, page, bcn_ord, sf_ord, pan_coord, blx, coord_realign); dev_put(dev); @@ -508,6 +523,7 @@ static int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info) u8 type; u32 channels; u8 duration; + u8 page; if (!info->attrs[IEEE802154_ATTR_SCAN_TYPE] || !info->attrs[IEEE802154_ATTR_CHANNELS] || @@ -522,7 +538,13 @@ static int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info) channels = nla_get_u32(info->attrs[IEEE802154_ATTR_CHANNELS]); duration = nla_get_u8(info->attrs[IEEE802154_ATTR_DURATION]); - ret = ieee802154_mlme_ops(dev)->scan_req(dev, type, channels, + if (info->attrs[IEEE802154_ATTR_PAGE]) + page = nla_get_u8(info->attrs[IEEE802154_ATTR_PAGE]); + else + page = 0; + + + ret = ieee802154_mlme_ops(dev)->scan_req(dev, type, channels, page, duration); dev_put(dev); diff --git a/net/ieee802154/nl_policy.c b/net/ieee802154/nl_policy.c index 83cb4cc..2363ebe 100644 --- a/net/ieee802154/nl_policy.c +++ b/net/ieee802154/nl_policy.c @@ -33,6 +33,7 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = { [IEEE802154_ATTR_HW_ADDR] = { .type = NLA_HW_ADDR, }, [IEEE802154_ATTR_PAN_ID] = { .type = NLA_U16, }, [IEEE802154_ATTR_CHANNEL] = { .type = NLA_U8, }, + [IEEE802154_ATTR_PAGE] = { .type = NLA_U8, }, [IEEE802154_ATTR_COORD_SHORT_ADDR] = { .type = NLA_U16, }, [IEEE802154_ATTR_COORD_HW_ADDR] = { .type = NLA_HW_ADDR, }, [IEEE802154_ATTR_COORD_PAN_ID] = { .type = NLA_U16, }, diff --git a/net/ieee802154/raw.c b/net/ieee802154/raw.c index 60dee69..4681501 100644 --- a/net/ieee802154/raw.c +++ b/net/ieee802154/raw.c @@ -74,8 +74,7 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int len) goto out; } - if (dev->type != ARPHRD_IEEE802154_PHY && - dev->type != ARPHRD_IEEE802154) { + if (dev->type != ARPHRD_IEEE802154) { err = -ENODEV; goto out_put; } diff --git a/net/ieee802154/wpan-class.c b/net/ieee802154/wpan-class.c new file mode 100644 index 0000000..f306604 --- /dev/null +++ b/net/ieee802154/wpan-class.c @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2007, 2008, 2009 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/device.h> + +#include <net/wpan-phy.h> + +#define MASTER_SHOW_COMPLEX(name, format_string, args...) \ +static ssize_t name ## _show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + struct wpan_phy *phy = container_of(dev, struct wpan_phy, dev); \ + int ret; \ + \ + mutex_lock(&phy->pib_lock); \ + ret = sprintf(buf, format_string "\n", args); \ + mutex_unlock(&phy->pib_lock); \ + return ret; \ +} + +#define MASTER_SHOW(field, format_string) \ + MASTER_SHOW_COMPLEX(field, format_string, phy->field) + +MASTER_SHOW(current_channel, "%d"); +MASTER_SHOW(current_page, "%d"); +MASTER_SHOW(channels_supported, "%#x"); +MASTER_SHOW_COMPLEX(transmit_power, "%d +- %d dB", + ((signed char) (phy->transmit_power << 2)) >> 2, + (phy->transmit_power >> 6) ? (phy->transmit_power >> 6) * 3 : 1 ); +MASTER_SHOW(cca_mode, "%d"); + +static struct device_attribute pmib_attrs[] = { + __ATTR_RO(current_channel), + __ATTR_RO(current_page), + __ATTR_RO(channels_supported), + __ATTR_RO(transmit_power), + __ATTR_RO(cca_mode), + {}, +}; + +static void wpan_phy_release(struct device *d) +{ + struct wpan_phy *phy = container_of(d, struct wpan_phy, dev); + kfree(phy); +} + +static struct class wpan_phy_class = { + .name = "ieee802154", + .dev_release = wpan_phy_release, + .dev_attrs = pmib_attrs, +}; + +static DEFINE_MUTEX(wpan_phy_mutex); +static int wpan_phy_idx; + +static int wpan_phy_match(struct device *dev, void *data) +{ + return !strcmp(dev_name(dev), (const char *)data); +} + +struct wpan_phy *wpan_phy_find(const char *str) +{ + struct device *dev; + + if (WARN_ON(!str)) + return NULL; + + dev = class_find_device(&wpan_phy_class, NULL, + (void *)str, wpan_phy_match); + if (!dev) + return NULL; + + return container_of(dev, struct wpan_phy, dev); +} +EXPORT_SYMBOL(wpan_phy_find); + +static int wpan_phy_idx_valid(int idx) +{ + return idx >= 0; +} + +struct wpan_phy *wpan_phy_alloc(size_t priv_size) +{ + struct wpan_phy *phy = kzalloc(sizeof(*phy) + priv_size, + GFP_KERNEL); + + mutex_lock(&wpan_phy_mutex); + phy->idx = wpan_phy_idx++; + if (unlikely(!wpan_phy_idx_valid(phy->idx))) { + wpan_phy_idx--; + mutex_unlock(&wpan_phy_mutex); + kfree(phy); + return NULL; + } + mutex_unlock(&wpan_phy_mutex); + + mutex_init(&phy->pib_lock); + + device_initialize(&phy->dev); + dev_set_name(&phy->dev, "wpan-phy%d", phy->idx); + + phy->dev.class = &wpan_phy_class; + + return phy; +} +EXPORT_SYMBOL(wpan_phy_alloc); + +int wpan_phy_register(struct device *parent, struct wpan_phy *phy) +{ + phy->dev.parent = parent; + + return device_add(&phy->dev); +} +EXPORT_SYMBOL(wpan_phy_register); + +void wpan_phy_unregister(struct wpan_phy *phy) +{ + device_del(&phy->dev); +} +EXPORT_SYMBOL(wpan_phy_unregister); + +void wpan_phy_free(struct wpan_phy *phy) +{ + put_device(&phy->dev); +} +EXPORT_SYMBOL(wpan_phy_free); + +static int __init wpan_phy_class_init(void) +{ + return class_register(&wpan_phy_class); +} +subsys_initcall(wpan_phy_class_init); + +static void __exit wpan_phy_class_exit(void) +{ + class_unregister(&wpan_phy_class); +} +module_exit(wpan_phy_class_exit); + +MODULE_DESCRIPTION("IEEE 802.15.4 device class"); +MODULE_LICENSE("GPL v2"); + diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 197d024..6c30a73 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -124,7 +124,6 @@ static struct list_head inetsw[SOCK_MAX]; static DEFINE_SPINLOCK(inetsw_lock); struct ipv4_config ipv4_config; - EXPORT_SYMBOL(ipv4_config); /* New destruction routine */ @@ -139,12 +138,12 @@ void inet_sock_destruct(struct sock *sk) sk_mem_reclaim(sk); if (sk->sk_type == SOCK_STREAM && sk->sk_state != TCP_CLOSE) { - printk("Attempt to release TCP socket in state %d %p\n", + pr_err("Attempt to release TCP socket in state %d %p\n", sk->sk_state, sk); return; } if (!sock_flag(sk, SOCK_DEAD)) { - printk("Attempt to release alive inet socket %p\n", sk); + pr_err("Attempt to release alive inet socket %p\n", sk); return; } @@ -157,6 +156,7 @@ void inet_sock_destruct(struct sock *sk) dst_release(sk->sk_dst_cache); sk_refcnt_debug_dec(sk); } +EXPORT_SYMBOL(inet_sock_destruct); /* * The routines beyond this point handle the behaviour of an AF_INET @@ -219,6 +219,7 @@ out: release_sock(sk); return err; } +EXPORT_SYMBOL(inet_listen); u32 inet_ehash_secret __read_mostly; EXPORT_SYMBOL(inet_ehash_secret); @@ -435,9 +436,11 @@ int inet_release(struct socket *sock) } return 0; } +EXPORT_SYMBOL(inet_release); /* It is off by default, see below. */ int sysctl_ip_nonlocal_bind __read_mostly; +EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) { @@ -519,6 +522,7 @@ out_release_sock: out: return err; } +EXPORT_SYMBOL(inet_bind); int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, int addr_len, int flags) @@ -532,6 +536,7 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, return -EAGAIN; return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); } +EXPORT_SYMBOL(inet_dgram_connect); static long inet_wait_for_connect(struct sock *sk, long timeo) { @@ -641,6 +646,7 @@ sock_error: sock->state = SS_DISCONNECTING; goto out; } +EXPORT_SYMBOL(inet_stream_connect); /* * Accept a pending connection. The TCP layer now gives BSD semantics. @@ -668,6 +674,7 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags) do_err: return err; } +EXPORT_SYMBOL(inet_accept); /* @@ -699,6 +706,7 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr, *uaddr_len = sizeof(*sin); return 0; } +EXPORT_SYMBOL(inet_getname); int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size) @@ -711,9 +719,11 @@ int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, return sk->sk_prot->sendmsg(iocb, sk, msg, size); } +EXPORT_SYMBOL(inet_sendmsg); -static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags) +static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, + size_t size, int flags) { struct sock *sk = sock->sk; @@ -780,6 +790,7 @@ int inet_shutdown(struct socket *sock, int how) release_sock(sk); return err; } +EXPORT_SYMBOL(inet_shutdown); /* * ioctl() calls you can issue on an INET socket. Most of these are @@ -798,44 +809,45 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) struct net *net = sock_net(sk); switch (cmd) { - case SIOCGSTAMP: - err = sock_get_timestamp(sk, (struct timeval __user *)arg); - break; - case SIOCGSTAMPNS: - err = sock_get_timestampns(sk, (struct timespec __user *)arg); - break; - case SIOCADDRT: - case SIOCDELRT: - case SIOCRTMSG: - err = ip_rt_ioctl(net, cmd, (void __user *)arg); - break; - case SIOCDARP: - case SIOCGARP: - case SIOCSARP: - err = arp_ioctl(net, cmd, (void __user *)arg); - break; - case SIOCGIFADDR: - case SIOCSIFADDR: - case SIOCGIFBRDADDR: - case SIOCSIFBRDADDR: - case SIOCGIFNETMASK: - case SIOCSIFNETMASK: - case SIOCGIFDSTADDR: - case SIOCSIFDSTADDR: - case SIOCSIFPFLAGS: - case SIOCGIFPFLAGS: - case SIOCSIFFLAGS: - err = devinet_ioctl(net, cmd, (void __user *)arg); - break; - default: - if (sk->sk_prot->ioctl) - err = sk->sk_prot->ioctl(sk, cmd, arg); - else - err = -ENOIOCTLCMD; - break; + case SIOCGSTAMP: + err = sock_get_timestamp(sk, (struct timeval __user *)arg); + break; + case SIOCGSTAMPNS: + err = sock_get_timestampns(sk, (struct timespec __user *)arg); + break; + case SIOCADDRT: + case SIOCDELRT: + case SIOCRTMSG: + err = ip_rt_ioctl(net, cmd, (void __user *)arg); + break; + case SIOCDARP: + case SIOCGARP: + case SIOCSARP: + err = arp_ioctl(net, cmd, (void __user *)arg); + break; + case SIOCGIFADDR: + case SIOCSIFADDR: + case SIOCGIFBRDADDR: + case SIOCSIFBRDADDR: + case SIOCGIFNETMASK: + case SIOCSIFNETMASK: + case SIOCGIFDSTADDR: + case SIOCSIFDSTADDR: + case SIOCSIFPFLAGS: + case SIOCGIFPFLAGS: + case SIOCSIFFLAGS: + err = devinet_ioctl(net, cmd, (void __user *)arg); + break; + default: + if (sk->sk_prot->ioctl) + err = sk->sk_prot->ioctl(sk, cmd, arg); + else + err = -ENOIOCTLCMD; + break; } return err; } +EXPORT_SYMBOL(inet_ioctl); const struct proto_ops inet_stream_ops = { .family = PF_INET, @@ -862,6 +874,7 @@ const struct proto_ops inet_stream_ops = { .compat_getsockopt = compat_sock_common_getsockopt, #endif }; +EXPORT_SYMBOL(inet_stream_ops); const struct proto_ops inet_dgram_ops = { .family = PF_INET, @@ -887,6 +900,7 @@ const struct proto_ops inet_dgram_ops = { .compat_getsockopt = compat_sock_common_getsockopt, #endif }; +EXPORT_SYMBOL(inet_dgram_ops); /* * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without @@ -1016,6 +1030,7 @@ out_illegal: p->type); goto out; } +EXPORT_SYMBOL(inet_register_protosw); void inet_unregister_protosw(struct inet_protosw *p) { @@ -1031,6 +1046,7 @@ void inet_unregister_protosw(struct inet_protosw *p) synchronize_net(); } } +EXPORT_SYMBOL(inet_unregister_protosw); /* * Shall we try to damage output packets if routing dev changes? @@ -1141,7 +1157,6 @@ int inet_sk_rebuild_header(struct sock *sk) return err; } - EXPORT_SYMBOL(inet_sk_rebuild_header); static int inet_gso_send_check(struct sk_buff *skb) @@ -1369,7 +1384,6 @@ int inet_ctl_sock_create(struct sock **sk, unsigned short family, } return rc; } - EXPORT_SYMBOL_GPL(inet_ctl_sock_create); unsigned long snmp_fold_field(void *mib[], int offt) @@ -1676,19 +1690,3 @@ static int __init ipv4_proc_init(void) MODULE_ALIAS_NETPROTO(PF_INET); -EXPORT_SYMBOL(inet_accept); -EXPORT_SYMBOL(inet_bind); -EXPORT_SYMBOL(inet_dgram_connect); -EXPORT_SYMBOL(inet_dgram_ops); -EXPORT_SYMBOL(inet_getname); -EXPORT_SYMBOL(inet_ioctl); -EXPORT_SYMBOL(inet_listen); -EXPORT_SYMBOL(inet_register_protosw); -EXPORT_SYMBOL(inet_release); -EXPORT_SYMBOL(inet_sendmsg); -EXPORT_SYMBOL(inet_shutdown); -EXPORT_SYMBOL(inet_sock_destruct); -EXPORT_SYMBOL(inet_stream_connect); -EXPORT_SYMBOL(inet_stream_ops); -EXPORT_SYMBOL(inet_unregister_protosw); -EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index fe3c846..291bdf5 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -48,7 +48,7 @@ * Patrick McHardy <kaber@trash.net> */ -#define VERSION "0.408" +#define VERSION "0.409" #include <asm/uaccess.h> #include <asm/system.h> @@ -325,10 +325,7 @@ static inline void check_tnode(const struct tnode *tn) static const int halve_threshold = 25; static const int inflate_threshold = 50; static const int halve_threshold_root = 15; -static const int inflate_threshold_root = 25; - -static int inflate_threshold_root_fix; -#define INFLATE_FIX_MAX 10 /* a comment in resize() */ +static const int inflate_threshold_root = 30; static void __alias_free_mem(struct rcu_head *head) { @@ -516,14 +513,14 @@ static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n, rcu_assign_pointer(tn->child[i], n); } +#define MAX_WORK 10 static struct node *resize(struct trie *t, struct tnode *tn) { int i; - int err = 0; struct tnode *old_tn; int inflate_threshold_use; int halve_threshold_use; - int max_resize; + int max_work; if (!tn) return NULL; @@ -538,18 +535,7 @@ static struct node *resize(struct trie *t, struct tnode *tn) } /* One child */ if (tn->empty_children == tnode_child_length(tn) - 1) - for (i = 0; i < tnode_child_length(tn); i++) { - struct node *n; - - n = tn->child[i]; - if (!n) - continue; - - /* compress one level */ - node_set_parent(n, NULL); - tnode_free_safe(tn); - return n; - } + goto one_child; /* * Double as long as the resulting node has a number of * nonempty nodes that are above the threshold. @@ -618,15 +604,17 @@ static struct node *resize(struct trie *t, struct tnode *tn) /* Keep root node larger */ - if (!tn->parent) - inflate_threshold_use = inflate_threshold_root + - inflate_threshold_root_fix; - else + if (!node_parent((struct node*) tn)) { + inflate_threshold_use = inflate_threshold_root; + halve_threshold_use = halve_threshold_root; + } + else { inflate_threshold_use = inflate_threshold; + halve_threshold_use = halve_threshold; + } - err = 0; - max_resize = 10; - while ((tn->full_children > 0 && max_resize-- && + max_work = MAX_WORK; + while ((tn->full_children > 0 && max_work-- && 50 * (tn->full_children + tnode_child_length(tn) - tn->empty_children) >= inflate_threshold_use * tnode_child_length(tn))) { @@ -643,47 +631,19 @@ static struct node *resize(struct trie *t, struct tnode *tn) } } - if (max_resize < 0) { - if (!tn->parent) { - /* - * It was observed that during large updates even - * inflate_threshold_root = 35 might be needed to avoid - * this warning; but it should be temporary, so let's - * try to handle this automatically. - */ - if (inflate_threshold_root_fix < INFLATE_FIX_MAX) - inflate_threshold_root_fix++; - else - pr_warning("Fix inflate_threshold_root." - " Now=%d size=%d bits fix=%d\n", - inflate_threshold_root, tn->bits, - inflate_threshold_root_fix); - } else { - pr_warning("Fix inflate_threshold." - " Now=%d size=%d bits\n", - inflate_threshold, tn->bits); - } - } else if (max_resize > 3 && !tn->parent && inflate_threshold_root_fix) - inflate_threshold_root_fix--; - check_tnode(tn); + /* Return if at least one inflate is run */ + if( max_work != MAX_WORK) + return (struct node *) tn; + /* * Halve as long as the number of empty children in this * node is above threshold. */ - - /* Keep root node larger */ - - if (!tn->parent) - halve_threshold_use = halve_threshold_root; - else - halve_threshold_use = halve_threshold; - - err = 0; - max_resize = 10; - while (tn->bits > 1 && max_resize-- && + max_work = MAX_WORK; + while (tn->bits > 1 && max_work-- && 100 * (tnode_child_length(tn) - tn->empty_children) < halve_threshold_use * tnode_child_length(tn)) { @@ -698,19 +658,10 @@ static struct node *resize(struct trie *t, struct tnode *tn) } } - if (max_resize < 0) { - if (!tn->parent) - pr_warning("Fix halve_threshold_root." - " Now=%d size=%d bits\n", - halve_threshold_root, tn->bits); - else - pr_warning("Fix halve_threshold." - " Now=%d size=%d bits\n", - halve_threshold, tn->bits); - } /* Only one child remains */ - if (tn->empty_children == tnode_child_length(tn) - 1) + if (tn->empty_children == tnode_child_length(tn) - 1) { +one_child: for (i = 0; i < tnode_child_length(tn); i++) { struct node *n; @@ -724,7 +675,7 @@ static struct node *resize(struct trie *t, struct tnode *tn) tnode_free_safe(tn); return n; } - + } return (struct node *) tn; } diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index 61283f9..13f0781 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c @@ -218,8 +218,8 @@ void inet_twdr_hangman(unsigned long data) /* We purged the entire slot, anything left? */ if (twdr->tw_count) need_timer = 1; + twdr->slot = ((twdr->slot + 1) & (INET_TWDR_TWKILL_SLOTS - 1)); } - twdr->slot = ((twdr->slot + 1) & (INET_TWDR_TWKILL_SLOTS - 1)); if (need_timer) mod_timer(&twdr->tw_timer, jiffies + twdr->period); out: diff --git a/net/ipv4/route.c b/net/ipv4/route.c index fafbe16..91867d3 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -1514,13 +1514,17 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) void ip_rt_send_redirect(struct sk_buff *skb) { struct rtable *rt = skb_rtable(skb); - struct in_device *in_dev = in_dev_get(rt->u.dst.dev); + struct in_device *in_dev; + int log_martians; - if (!in_dev) + rcu_read_lock(); + in_dev = __in_dev_get_rcu(rt->u.dst.dev); + if (!in_dev || !IN_DEV_TX_REDIRECTS(in_dev)) { + rcu_read_unlock(); return; - - if (!IN_DEV_TX_REDIRECTS(in_dev)) - goto out; + } + log_martians = IN_DEV_LOG_MARTIANS(in_dev); + rcu_read_unlock(); /* No redirected packets during ip_rt_redirect_silence; * reset the algorithm. @@ -1533,7 +1537,7 @@ void ip_rt_send_redirect(struct sk_buff *skb) */ if (rt->u.dst.rate_tokens >= ip_rt_redirect_number) { rt->u.dst.rate_last = jiffies; - goto out; + return; } /* Check for load limit; set rate_last to the latest sent @@ -1547,7 +1551,7 @@ void ip_rt_send_redirect(struct sk_buff *skb) rt->u.dst.rate_last = jiffies; ++rt->u.dst.rate_tokens; #ifdef CONFIG_IP_ROUTE_VERBOSE - if (IN_DEV_LOG_MARTIANS(in_dev) && + if (log_martians && rt->u.dst.rate_tokens == ip_rt_redirect_number && net_ratelimit()) printk(KERN_WARNING "host %pI4/if%d ignores redirects for %pI4 to %pI4.\n", @@ -1555,8 +1559,6 @@ void ip_rt_send_redirect(struct sk_buff *skb) &rt->rt_dst, &rt->rt_gateway); #endif } -out: - in_dev_put(in_dev); } static int ip_error(struct sk_buff *skb) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 9114524..59f69a6 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2336,13 +2336,13 @@ static int do_tcp_getsockopt(struct sock *sk, int level, val = !!(tp->nonagle&TCP_NAGLE_CORK); break; case TCP_KEEPIDLE: - val = (tp->keepalive_time ? : sysctl_tcp_keepalive_time) / HZ; + val = keepalive_time_when(tp) / HZ; break; case TCP_KEEPINTVL: - val = (tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl) / HZ; + val = keepalive_intvl_when(tp) / HZ; break; case TCP_KEEPCNT: - val = tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; + val = keepalive_probes(tp); break; case TCP_SYNCNT: val = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries; diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index f8d67cc..6c8b422 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -657,29 +657,6 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb, child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL); if (child == NULL) goto listen_overflow; -#ifdef CONFIG_TCP_MD5SIG - else { - /* Copy over the MD5 key from the original socket */ - struct tcp_md5sig_key *key; - struct tcp_sock *tp = tcp_sk(sk); - key = tp->af_specific->md5_lookup(sk, child); - if (key != NULL) { - /* - * We're using one, so create a matching key on the - * newsk structure. If we fail to get memory then we - * end up not copying the key across. Shucks. - */ - char *newkey = kmemdup(key->key, key->keylen, - GFP_ATOMIC); - if (newkey) { - if (!tcp_alloc_md5sig_pool()) - BUG(); - tp->af_specific->md5_add(child, child, newkey, - key->keylen); - } - } - } -#endif inet_csk_reqsk_queue_unlink(sk, req, prev); inet_csk_reqsk_queue_removed(sk, req); diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index b144a26..c520fb6 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -499,8 +499,7 @@ static void tcp_keepalive_timer (unsigned long data) elapsed = tcp_time_stamp - tp->rcv_tstamp; if (elapsed >= keepalive_time_when(tp)) { - if ((!tp->keepalive_probes && icsk->icsk_probes_out >= sysctl_tcp_keepalive_probes) || - (tp->keepalive_probes && icsk->icsk_probes_out >= tp->keepalive_probes)) { + if (icsk->icsk_probes_out >= keepalive_probes(tp)) { tcp_send_active_reset(sk, GFP_ATOMIC); tcp_write_err(sk); goto out; diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 1ba42bd..44b4c87 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1151,10 +1151,6 @@ static void ndisc_router_discovery(struct sk_buff *skb) skb->dev->name); return; } - if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) { - in6_dev_put(in6_dev); - return; - } if (!ndisc_parse_options(opt, optlen, &ndopts)) { in6_dev_put(in6_dev); @@ -1163,6 +1159,10 @@ static void ndisc_router_discovery(struct sk_buff *skb) return; } + /* skip route and link configuration on routers */ + if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) + goto skip_linkparms; + #ifdef CONFIG_IPV6_NDISC_NODETYPE /* skip link-specific parameters from interior routers */ if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) @@ -1283,9 +1283,7 @@ skip_defrtr: } } -#ifdef CONFIG_IPV6_NDISC_NODETYPE skip_linkparms: -#endif /* * Process options. @@ -1312,6 +1310,10 @@ skip_linkparms: NEIGH_UPDATE_F_ISROUTER); } + /* skip route and link configuration on routers */ + if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) + goto out; + #ifdef CONFIG_IPV6_ROUTE_INFO if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) { struct nd_opt_hdr *p; diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index d335a30..1d25a4d 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -778,7 +778,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) iph->version = 4; iph->ihl = sizeof(struct iphdr)>>2; if (mtu > IPV6_MIN_MTU) - iph->frag_off = htons(IP_DF); + iph->frag_off = tiph->frag_off; else iph->frag_off = 0; diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index d231c93..020a94a 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -12,7 +12,11 @@ static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb) static inline int drv_start(struct ieee80211_local *local) { - int ret = local->ops->start(&local->hw); + int ret; + + local->started = true; + smp_mb(); + ret = local->ops->start(&local->hw); trace_drv_start(local, ret); return ret; } @@ -21,6 +25,14 @@ static inline void drv_stop(struct ieee80211_local *local) { local->ops->stop(&local->hw); trace_drv_stop(local); + + /* sync away all work on the tasklet before clearing started */ + tasklet_disable(&local->tasklet); + tasklet_enable(&local->tasklet); + + barrier(); + + local->started = false; } static inline int drv_add_interface(struct ieee80211_local *local, diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 93e618a..dbd8411 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -367,6 +367,10 @@ struct ieee80211_if_mesh { u8 mesh_pm_id[4]; /* Congestion Control Mode Identifier */ u8 mesh_cc_id[4]; + /* Synchronization Protocol Identifier */ + u8 mesh_sp_id[4]; + /* Authentication Protocol Identifier */ + u8 mesh_auth_id[4]; /* Local mesh Destination Sequence Number */ u32 dsn; /* Last used PREQ ID */ @@ -663,6 +667,9 @@ struct ieee80211_local { */ bool quiescing; + /* device is started */ + bool started; + int tx_headroom; /* required headroom for hardware/radiotap */ /* Tasklet and skb queue to process calls from IRQ mode. All frames @@ -1082,6 +1089,7 @@ void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, /* Suspend/resume and hw reconfiguration */ int ieee80211_reconfig(struct ieee80211_local *local); +void ieee80211_stop_device(struct ieee80211_local *local); #ifdef CONFIG_PM int __ieee80211_suspend(struct ieee80211_hw *hw); diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index b161301..f6005ad 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -277,11 +277,6 @@ static int ieee80211_open(struct net_device *dev) } } - if (local->open_count == 0) { - tasklet_enable(&local->tx_pending_tasklet); - tasklet_enable(&local->tasklet); - } - /* * set_multicast_list will be invoked by the networking core * which will check whether any increments here were done in @@ -502,30 +497,8 @@ static int ieee80211_stop(struct net_device *dev) } /* fall through */ default: - if (local->scan_sdata == sdata) { - if (!local->ops->hw_scan) - cancel_delayed_work_sync(&local->scan_work); - /* - * The software scan can no longer run now, so we can - * clear out the scan_sdata reference. However, the - * hardware scan may still be running. The complete - * function must be prepared to handle a NULL value. - */ - local->scan_sdata = NULL; - /* - * The memory barrier guarantees that another CPU - * that is hardware-scanning will now see the fact - * that this interface is gone. - */ - smp_mb(); - /* - * If software scanning, complete the scan but since - * the scan_sdata is NULL already don't send out a - * scan event to userspace -- the scan is incomplete. - */ - if (test_bit(SCAN_SW_SCANNING, &local->scanning)) - ieee80211_scan_completed(&local->hw, true); - } + if (local->scan_sdata == sdata) + ieee80211_scan_cancel(local); /* * Disable beaconing for AP and mesh, IBSS can't @@ -552,14 +525,8 @@ static int ieee80211_stop(struct net_device *dev) ieee80211_recalc_ps(local, -1); if (local->open_count == 0) { - drv_stop(local); - - ieee80211_led_radio(local, false); - - flush_workqueue(local->workqueue); - - tasklet_disable(&local->tx_pending_tasklet); - tasklet_disable(&local->tasklet); + ieee80211_clear_tx_pending(local); + ieee80211_stop_device(local); /* no reconfiguring after stop! */ hw_reconf_flags = 0; diff --git a/net/mac80211/main.c b/net/mac80211/main.c index dd3b081..797f539 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -715,12 +715,10 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, skb_queue_head_init(&local->pending[i]); tasklet_init(&local->tx_pending_tasklet, ieee80211_tx_pending, (unsigned long)local); - tasklet_disable(&local->tx_pending_tasklet); tasklet_init(&local->tasklet, ieee80211_tasklet_handler, (unsigned long) local); - tasklet_disable(&local->tasklet); skb_queue_head_init(&local->skb_queue); skb_queue_head_init(&local->skb_queue_unreliable); diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 3185e18..f7364e5 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c @@ -18,8 +18,11 @@ #define PP_OFFSET 1 /* Path Selection Protocol */ #define PM_OFFSET 5 /* Path Selection Metric */ #define CC_OFFSET 9 /* Congestion Control Mode */ -#define CAPAB_OFFSET 17 -#define ACCEPT_PLINKS 0x80 +#define SP_OFFSET 13 /* Synchronization Protocol */ +#define AUTH_OFFSET 17 /* Authentication Protocol */ +#define CAPAB_OFFSET 22 +#define CAPAB_ACCEPT_PLINKS 0x80 +#define CAPAB_FORWARDING 0x10 #define TMR_RUNNING_HK 0 #define TMR_RUNNING_MP 1 @@ -84,7 +87,9 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 && memcmp(ifmsh->mesh_pp_id, ie->mesh_config + PP_OFFSET, 4) == 0 && memcmp(ifmsh->mesh_pm_id, ie->mesh_config + PM_OFFSET, 4) == 0 && - memcmp(ifmsh->mesh_cc_id, ie->mesh_config + CC_OFFSET, 4) == 0) + memcmp(ifmsh->mesh_cc_id, ie->mesh_config + CC_OFFSET, 4) == 0 && + memcmp(ifmsh->mesh_sp_id, ie->mesh_config + SP_OFFSET, 4) == 0 && + memcmp(ifmsh->mesh_auth_id, ie->mesh_config + AUTH_OFFSET, 4) == 0) return true; return false; @@ -97,7 +102,7 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_dat */ bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie) { - return (*(ie->mesh_config + CAPAB_OFFSET) & ACCEPT_PLINKS) != 0; + return (*(ie->mesh_config + CAPAB_OFFSET) & CAPAB_ACCEPT_PLINKS) != 0; } /** @@ -123,11 +128,18 @@ void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata) void mesh_ids_set_default(struct ieee80211_if_mesh *sta) { - u8 def_id[4] = {0x00, 0x0F, 0xAC, 0xff}; - - memcpy(sta->mesh_pp_id, def_id, 4); - memcpy(sta->mesh_pm_id, def_id, 4); - memcpy(sta->mesh_cc_id, def_id, 4); + u8 oui[3] = {0x00, 0x0F, 0xAC}; + + memcpy(sta->mesh_pp_id, oui, sizeof(oui)); + memcpy(sta->mesh_pm_id, oui, sizeof(oui)); + memcpy(sta->mesh_cc_id, oui, sizeof(oui)); + memcpy(sta->mesh_sp_id, oui, sizeof(oui)); + memcpy(sta->mesh_auth_id, oui, sizeof(oui)); + sta->mesh_pp_id[sizeof(oui)] = 0; + sta->mesh_pm_id[sizeof(oui)] = 0; + sta->mesh_cc_id[sizeof(oui)] = 0xff; + sta->mesh_sp_id[sizeof(oui)] = 0xff; + sta->mesh_auth_id[sizeof(oui)] = 0x0; } int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) @@ -245,7 +257,7 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) if (sdata->u.mesh.mesh_id_len) memcpy(pos, sdata->u.mesh.mesh_id, sdata->u.mesh.mesh_id_len); - pos = skb_put(skb, 21); + pos = skb_put(skb, 2 + IEEE80211_MESH_CONFIG_LEN); *pos++ = WLAN_EID_MESH_CONFIG; *pos++ = IEEE80211_MESH_CONFIG_LEN; /* Version */ @@ -263,15 +275,22 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) memcpy(pos, sdata->u.mesh.mesh_cc_id, 4); pos += 4; - /* Channel precedence: - * Not running simple channel unification protocol - */ - memset(pos, 0x00, 4); + /* Synchronization protocol identifier */ + memcpy(pos, sdata->u.mesh.mesh_sp_id, 4); pos += 4; + /* Authentication Protocol identifier */ + memcpy(pos, sdata->u.mesh.mesh_auth_id, 4); + pos += 4; + + /* Mesh Formation Info */ + memset(pos, 0x00, 1); + pos += 1; + /* Mesh capability */ sdata->u.mesh.accepting_plinks = mesh_plink_availables(sdata); - *pos++ = sdata->u.mesh.accepting_plinks ? ACCEPT_PLINKS : 0x00; + *pos = CAPAB_FORWARDING; + *pos++ |= sdata->u.mesh.accepting_plinks ? CAPAB_ACCEPT_PLINKS : 0x00; *pos++ = 0x00; return; diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index c374d2d..97a278a 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -2123,25 +2123,9 @@ static void ieee80211_sta_work(struct work_struct *work) } } - list_for_each_entry(wk, &ifmgd->work_list, list) { - if (wk->state != IEEE80211_MGD_STATE_IDLE) { - anybusy = true; - break; - } - } ieee80211_recalc_idle(local); - if (!anybusy) { - mutex_unlock(&ifmgd->mtx); - - if (test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request)) - ieee80211_queue_delayed_work(&local->hw, - &local->scan_work, - round_jiffies_relative(0)); - return; - } - list_for_each_entry_safe(wk, tmp, &ifmgd->work_list, list) { if (time_is_after_jiffies(wk->timeout)) { /* @@ -2187,6 +2171,18 @@ static void ieee80211_sta_work(struct work_struct *work) } } + list_for_each_entry(wk, &ifmgd->work_list, list) { + if (wk->state != IEEE80211_MGD_STATE_IDLE) { + anybusy = true; + break; + } + } + if (!anybusy && + test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request)) + ieee80211_queue_delayed_work(&local->hw, + &local->scan_work, + round_jiffies_relative(0)); + mutex_unlock(&ifmgd->mtx); list_for_each_entry_safe(wk, tmp, &free_work, list) { diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index a5d2f1f..e535f1c 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c @@ -107,17 +107,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw) } /* stop hardware - this must stop RX */ - if (local->open_count) { - ieee80211_led_radio(local, false); - drv_stop(local); - } - - /* - * flush again, in case driver queued work -- it - * shouldn't be doing (or cancel everything in the - * stop callback) that but better safe than sorry. - */ - flush_workqueue(local->workqueue); + if (local->open_count) + ieee80211_stop_device(local); local->suspended = true; /* need suspended to be visible before quiescing is false */ diff --git a/net/mac80211/rc80211_minstrel.h b/net/mac80211/rc80211_minstrel.h index 869fe0e..38bf4168 100644 --- a/net/mac80211/rc80211_minstrel.h +++ b/net/mac80211/rc80211_minstrel.h @@ -33,7 +33,6 @@ struct minstrel_rate { /* per-rate throughput */ u32 cur_tp; - u32 throughput; u64 succ_hist; u64 att_hist; diff --git a/net/mac80211/rc80211_minstrel_debugfs.c b/net/mac80211/rc80211_minstrel_debugfs.c index 98f4807..3d72ec5 100644 --- a/net/mac80211/rc80211_minstrel_debugfs.c +++ b/net/mac80211/rc80211_minstrel_debugfs.c @@ -83,7 +83,7 @@ minstrel_stats_open(struct inode *inode, struct file *file) p += sprintf(p, "%3u%s", mr->bitrate / 2, (mr->bitrate & 1 ? ".5" : " ")); - tp = ((mr->cur_tp * 96) / 18000) >> 10; + tp = mr->cur_tp / ((18000 << 10) / 96); prob = mr->cur_prob / 18; eprob = mr->probability / 18; diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 7065fd7..c01588f 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -2440,24 +2440,20 @@ static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local, * This is the receive path handler. It is called by a low level driver when an * 802.11 MPDU is received from the hardware. */ -void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) +void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) { struct ieee80211_local *local = hw_to_local(hw); struct ieee80211_rate *rate = NULL; struct ieee80211_supported_band *sband; struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); - if (status->band < 0 || - status->band >= IEEE80211_NUM_BANDS) { - WARN_ON(1); - return; - } + if (WARN_ON(status->band < 0 || + status->band >= IEEE80211_NUM_BANDS)) + goto drop; sband = local->hw.wiphy->bands[status->band]; - if (!sband) { - WARN_ON(1); - return; - } + if (WARN_ON(!sband)) + goto drop; /* * If we're suspending, it is possible although not too likely @@ -2466,16 +2462,21 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) * that might, for example, cause stations to be added or other * driver callbacks be invoked. */ - if (unlikely(local->quiescing || local->suspended)) { - kfree_skb(skb); - return; - } + if (unlikely(local->quiescing || local->suspended)) + goto drop; + + /* + * The same happens when we're not even started, + * but that's worth a warning. + */ + if (WARN_ON(!local->started)) + goto drop; if (status->flag & RX_FLAG_HT) { /* rate_idx is MCS index */ if (WARN_ON(status->rate_idx < 0 || status->rate_idx >= 76)) - return; + goto drop; /* HT rates are not in the table - use the highest legacy rate * for now since other parts of mac80211 may not yet be fully * MCS aware. */ @@ -2483,7 +2484,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) } else { if (WARN_ON(status->rate_idx < 0 || status->rate_idx >= sband->n_bitrates)) - return; + goto drop; rate = &sband->bitrates[status->rate_idx]; } @@ -2522,8 +2523,12 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) __ieee80211_rx_handle_packet(hw, skb, rate); rcu_read_unlock(); + + return; + drop: + kfree_skb(skb); } -EXPORT_SYMBOL(__ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx); /* This is a version of the rx handler that can be called from hard irq * context. Post the skb on the queue and schedule the tasklet */ diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 1e04be6..0399011 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@ -280,6 +280,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted) if (local->scan_req != local->int_scan_req) cfg80211_scan_done(local->scan_req, aborted); local->scan_req = NULL; + local->scan_sdata = NULL; was_hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning); local->scanning = 0; @@ -660,6 +661,7 @@ void ieee80211_scan_work(struct work_struct *work) int rc; local->scan_req = NULL; + local->scan_sdata = NULL; rc = __ieee80211_start_scan(sdata, req); mutex_unlock(&local->scan_mtx); @@ -742,7 +744,7 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, void ieee80211_scan_cancel(struct ieee80211_local *local) { - bool swscan; + bool abortscan; cancel_delayed_work_sync(&local->scan_work); @@ -751,9 +753,10 @@ void ieee80211_scan_cancel(struct ieee80211_local *local) * queued -- mostly at suspend under RTNL. */ mutex_lock(&local->scan_mtx); - swscan = test_bit(SCAN_SW_SCANNING, &local->scanning); + abortscan = test_bit(SCAN_SW_SCANNING, &local->scanning) || + (!local->scanning && local->scan_req); mutex_unlock(&local->scan_mtx); - if (swscan) + if (abortscan) ieee80211_scan_completed(&local->hw, true); } diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 5eb3063..dd65643 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -1007,6 +1007,16 @@ u32 ieee80211_sta_get_rates(struct ieee80211_local *local, return supp_rates; } +void ieee80211_stop_device(struct ieee80211_local *local) +{ + ieee80211_led_radio(local, false); + + cancel_work_sync(&local->reconfig_filter); + drv_stop(local); + + flush_workqueue(local->workqueue); +} + int ieee80211_reconfig(struct ieee80211_local *local) { struct ieee80211_hw *hw = &local->hw; diff --git a/net/rds/Kconfig b/net/rds/Kconfig index 796773b..ec753b3 100644 --- a/net/rds/Kconfig +++ b/net/rds/Kconfig @@ -1,14 +1,28 @@ config RDS - tristate "Reliable Datagram Sockets (RDS) (EXPERIMENTAL)" - depends on INET && INFINIBAND_IPOIB && EXPERIMENTAL - depends on INFINIBAND && INFINIBAND_ADDR_TRANS + tristate "The RDS Protocol (EXPERIMENTAL)" + depends on INET && EXPERIMENTAL ---help--- - RDS provides reliable, sequenced delivery of datagrams - over Infiniband. + The RDS (Reliable Datagram Sockets) protocol provides reliable, + sequenced delivery of datagrams over Infiniband, iWARP, + or TCP. + +config RDS_RDMA + tristate "RDS over Infiniband and iWARP" + depends on RDS && INFINIBAND && INFINIBAND_ADDR_TRANS + ---help--- + Allow RDS to use Infiniband and iWARP as a transport. + This transport supports RDMA operations. + +config RDS_TCP + tristate "RDS over TCP" + depends on RDS + ---help--- + Allow RDS to use TCP as a transport. + This transport does not support RDMA operations. config RDS_DEBUG - bool "Debugging messages" + bool "RDS debugging messages" depends on RDS default n diff --git a/net/rds/Makefile b/net/rds/Makefile index 51f2758..b46eca1 100644 --- a/net/rds/Makefile +++ b/net/rds/Makefile @@ -1,13 +1,20 @@ obj-$(CONFIG_RDS) += rds.o rds-y := af_rds.o bind.o cong.o connection.o info.o message.o \ recv.o send.o stats.o sysctl.o threads.o transport.o \ - loop.o page.o rdma.o \ - rdma_transport.o \ + loop.o page.o rdma.o + +obj-$(CONFIG_RDS_RDMA) += rds_rdma.o +rds_rdma-objs := rdma_transport.o \ ib.o ib_cm.o ib_recv.o ib_ring.o ib_send.o ib_stats.o \ ib_sysctl.o ib_rdma.o \ iw.o iw_cm.o iw_recv.o iw_ring.o iw_send.o iw_stats.o \ iw_sysctl.o iw_rdma.o + +obj-$(CONFIG_RDS_TCP) += rds_tcp.o +rds_tcp-objs := tcp.o tcp_connect.o tcp_listen.o tcp_recv.o \ + tcp_send.o tcp_stats.o + ifeq ($(CONFIG_RDS_DEBUG), y) EXTRA_CFLAGS += -DDEBUG endif diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index b11e7e5..108ed2e 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -39,7 +39,6 @@ #include "rds.h" #include "rdma.h" -#include "rdma_transport.h" /* this is just used for stats gathering :/ */ static DEFINE_SPINLOCK(rds_sock_lock); @@ -509,7 +508,6 @@ out: static void __exit rds_exit(void) { - rds_rdma_exit(); sock_unregister(rds_family_ops.family); proto_unregister(&rds_proto); rds_conn_exit(); @@ -549,14 +547,8 @@ static int __init rds_init(void) rds_info_register_func(RDS_INFO_SOCKETS, rds_sock_info); rds_info_register_func(RDS_INFO_RECV_MESSAGES, rds_sock_inc_info); - /* ib/iwarp transports currently compiled-in */ - ret = rds_rdma_init(); - if (ret) - goto out_sock; goto out; -out_sock: - sock_unregister(rds_family_ops.family); out_proto: proto_unregister(&rds_proto); out_stats: diff --git a/net/rds/bind.c b/net/rds/bind.c index c17cc39..5d95fc0 100644 --- a/net/rds/bind.c +++ b/net/rds/bind.c @@ -187,6 +187,9 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) if (trans == NULL) { ret = -EADDRNOTAVAIL; rds_remove_bound(rs); + if (printk_ratelimit()) + printk(KERN_INFO "RDS: rds_bind() could not find a transport, " + "load rds_tcp or rds_rdma?\n"); goto out; } diff --git a/net/rds/cong.c b/net/rds/cong.c index 710e459..dd2711d 100644 --- a/net/rds/cong.c +++ b/net/rds/cong.c @@ -254,6 +254,7 @@ void rds_cong_map_updated(struct rds_cong_map *map, uint64_t portmask) read_unlock_irqrestore(&rds_cong_monitor_lock, flags); } } +EXPORT_SYMBOL_GPL(rds_cong_map_updated); int rds_cong_updated_since(unsigned long *recent) { diff --git a/net/rds/connection.c b/net/rds/connection.c index b420a20..cc8b568 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -255,12 +255,14 @@ struct rds_connection *rds_conn_create(__be32 laddr, __be32 faddr, { return __rds_conn_create(laddr, faddr, trans, gfp, 0); } +EXPORT_SYMBOL_GPL(rds_conn_create); struct rds_connection *rds_conn_create_outgoing(__be32 laddr, __be32 faddr, struct rds_transport *trans, gfp_t gfp) { return __rds_conn_create(laddr, faddr, trans, gfp, 1); } +EXPORT_SYMBOL_GPL(rds_conn_create_outgoing); void rds_conn_destroy(struct rds_connection *conn) { @@ -303,6 +305,7 @@ void rds_conn_destroy(struct rds_connection *conn) rds_conn_count--; } +EXPORT_SYMBOL_GPL(rds_conn_destroy); static void rds_conn_message_info(struct socket *sock, unsigned int len, struct rds_info_iterator *iter, @@ -406,6 +409,7 @@ void rds_for_each_conn_info(struct socket *sock, unsigned int len, spin_unlock_irqrestore(&rds_conn_lock, flags); } +EXPORT_SYMBOL_GPL(rds_for_each_conn_info); static int rds_conn_info_visitor(struct rds_connection *conn, void *buffer) @@ -481,6 +485,7 @@ void rds_conn_drop(struct rds_connection *conn) atomic_set(&conn->c_state, RDS_CONN_ERROR); queue_work(rds_wq, &conn->c_down_w); } +EXPORT_SYMBOL_GPL(rds_conn_drop); /* * An error occurred on the connection diff --git a/net/rds/ib.c b/net/rds/ib.c index 868559a..536ebe5 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c @@ -282,6 +282,7 @@ struct rds_transport rds_ib_transport = { .flush_mrs = rds_ib_flush_mrs, .t_owner = THIS_MODULE, .t_name = "infiniband", + .t_type = RDS_TRANS_IB }; int __init rds_ib_init(void) diff --git a/net/rds/info.c b/net/rds/info.c index 62aeef3..814a91a 100644 --- a/net/rds/info.c +++ b/net/rds/info.c @@ -79,6 +79,7 @@ void rds_info_register_func(int optname, rds_info_func func) rds_info_funcs[offset] = func; spin_unlock(&rds_info_lock); } +EXPORT_SYMBOL_GPL(rds_info_register_func); void rds_info_deregister_func(int optname, rds_info_func func) { @@ -91,6 +92,7 @@ void rds_info_deregister_func(int optname, rds_info_func func) rds_info_funcs[offset] = NULL; spin_unlock(&rds_info_lock); } +EXPORT_SYMBOL_GPL(rds_info_deregister_func); /* * Typically we hold an atomic kmap across multiple rds_info_copy() calls @@ -137,6 +139,7 @@ void rds_info_copy(struct rds_info_iterator *iter, void *data, } } } +EXPORT_SYMBOL_GPL(rds_info_copy); /* * @optval points to the userspace buffer that the information snapshot diff --git a/net/rds/iw.c b/net/rds/iw.c index f5e9a29..db224f7 100644 --- a/net/rds/iw.c +++ b/net/rds/iw.c @@ -284,6 +284,7 @@ struct rds_transport rds_iw_transport = { .flush_mrs = rds_iw_flush_mrs, .t_owner = THIS_MODULE, .t_name = "iwarp", + .t_type = RDS_TRANS_IWARP, .t_prefer_loopback = 1, }; diff --git a/net/rds/message.c b/net/rds/message.c index 5a15dc8..ca50a8e 100644 --- a/net/rds/message.c +++ b/net/rds/message.c @@ -50,6 +50,7 @@ void rds_message_addref(struct rds_message *rm) rdsdebug("addref rm %p ref %d\n", rm, atomic_read(&rm->m_refcount)); atomic_inc(&rm->m_refcount); } +EXPORT_SYMBOL_GPL(rds_message_addref); /* * This relies on dma_map_sg() not touching sg[].page during merging. @@ -92,6 +93,7 @@ void rds_message_put(struct rds_message *rm) kfree(rm); } } +EXPORT_SYMBOL_GPL(rds_message_put); void rds_message_inc_free(struct rds_incoming *inc) { @@ -108,6 +110,7 @@ void rds_message_populate_header(struct rds_header *hdr, __be16 sport, hdr->h_sequence = cpu_to_be64(seq); hdr->h_exthdr[0] = RDS_EXTHDR_NONE; } +EXPORT_SYMBOL_GPL(rds_message_populate_header); int rds_message_add_extension(struct rds_header *hdr, unsigned int type, const void *data, unsigned int len) @@ -133,6 +136,7 @@ int rds_message_add_extension(struct rds_header *hdr, dst[len] = RDS_EXTHDR_NONE; return 1; } +EXPORT_SYMBOL_GPL(rds_message_add_extension); /* * If a message has extension headers, retrieve them here. @@ -208,6 +212,7 @@ int rds_message_add_rdma_dest_extension(struct rds_header *hdr, u32 r_key, u32 o ext_hdr.h_rdma_offset = cpu_to_be32(offset); return rds_message_add_extension(hdr, RDS_EXTHDR_RDMA_DEST, &ext_hdr, sizeof(ext_hdr)); } +EXPORT_SYMBOL_GPL(rds_message_add_rdma_dest_extension); struct rds_message *rds_message_alloc(unsigned int nents, gfp_t gfp) { @@ -399,4 +404,5 @@ void rds_message_unmapped(struct rds_message *rm) if (waitqueue_active(&rds_message_flush_waitq)) wake_up(&rds_message_flush_waitq); } +EXPORT_SYMBOL_GPL(rds_message_unmapped); diff --git a/net/rds/page.c b/net/rds/page.c index c460743..55c21ef 100644 --- a/net/rds/page.c +++ b/net/rds/page.c @@ -81,6 +81,7 @@ int rds_page_copy_user(struct page *page, unsigned long offset, return 0; } +EXPORT_SYMBOL_GPL(rds_page_copy_user); /* * Message allocation uses this to build up regions of a message. diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index 7a6c748..9ece910 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c @@ -203,6 +203,7 @@ err_iw_init: out: return ret; } +module_init(rds_rdma_init); void rds_rdma_exit(void) { @@ -211,4 +212,9 @@ void rds_rdma_exit(void) rds_ib_exit(); rds_iw_exit(); } +module_exit(rds_rdma_exit); + +MODULE_AUTHOR("Oracle Corporation <rds-devel@oss.oracle.com>"); +MODULE_DESCRIPTION("RDS: IB/iWARP transport"); +MODULE_LICENSE("Dual BSD/GPL"); diff --git a/net/rds/rds.h b/net/rds/rds.h index 290566c..85d6f89 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -311,11 +311,17 @@ struct rds_notifier { * flag and header. */ +#define RDS_TRANS_IB 0 +#define RDS_TRANS_IWARP 1 +#define RDS_TRANS_TCP 2 +#define RDS_TRANS_COUNT 3 + struct rds_transport { char t_name[TRANSNAMSIZ]; struct list_head t_item; struct module *t_owner; unsigned int t_prefer_loopback:1; + unsigned int t_type; int (*laddr_check)(__be32 addr); int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp); diff --git a/net/rds/recv.c b/net/rds/recv.c index 86bc1a0..fdff33c 100644 --- a/net/rds/recv.c +++ b/net/rds/recv.c @@ -46,12 +46,14 @@ void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn, inc->i_saddr = saddr; inc->i_rdma_cookie = 0; } +EXPORT_SYMBOL_GPL(rds_inc_init); void rds_inc_addref(struct rds_incoming *inc) { rdsdebug("addref inc %p ref %d\n", inc, atomic_read(&inc->i_refcount)); atomic_inc(&inc->i_refcount); } +EXPORT_SYMBOL_GPL(rds_inc_addref); void rds_inc_put(struct rds_incoming *inc) { @@ -62,6 +64,7 @@ void rds_inc_put(struct rds_incoming *inc) inc->i_conn->c_trans->inc_free(inc); } } +EXPORT_SYMBOL_GPL(rds_inc_put); static void rds_recv_rcvbuf_delta(struct rds_sock *rs, struct sock *sk, struct rds_cong_map *map, @@ -237,6 +240,7 @@ out: if (rs) rds_sock_put(rs); } +EXPORT_SYMBOL_GPL(rds_recv_incoming); /* * be very careful here. This is being called as the condition in diff --git a/net/rds/send.c b/net/rds/send.c index a4a7f42..28c88ff 100644 --- a/net/rds/send.c +++ b/net/rds/send.c @@ -439,6 +439,7 @@ void rds_rdma_send_complete(struct rds_message *rm, int status) sock_put(rds_rs_to_sk(rs)); } } +EXPORT_SYMBOL_GPL(rds_rdma_send_complete); /* * This is the same as rds_rdma_send_complete except we @@ -494,6 +495,7 @@ out: return found; } +EXPORT_SYMBOL_GPL(rds_send_get_message); /* * This removes messages from the socket's list if they're on it. The list @@ -610,6 +612,7 @@ void rds_send_drop_acked(struct rds_connection *conn, u64 ack, /* now remove the messages from the sock list as needed */ rds_send_remove_from_sock(&list, RDS_RDMA_SUCCESS); } +EXPORT_SYMBOL_GPL(rds_send_drop_acked); void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in *dest) { diff --git a/net/rds/stats.c b/net/rds/stats.c index 91d8c58..7598eb0 100644 --- a/net/rds/stats.c +++ b/net/rds/stats.c @@ -37,6 +37,7 @@ #include "rds.h" DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_statistics, rds_stats); +EXPORT_PER_CPU_SYMBOL_GPL(rds_stats); /* :.,$s/unsigned long\>.*\<s_\(.*\);/"\1",/g */ @@ -90,6 +91,7 @@ void rds_stats_info_copy(struct rds_info_iterator *iter, rds_info_copy(iter, &ctr, sizeof(ctr)); } } +EXPORT_SYMBOL_GPL(rds_stats_info_copy); /* * This gives global counters across all the transports. The strings diff --git a/net/rds/tcp.c b/net/rds/tcp.c new file mode 100644 index 0000000..b5198ae --- /dev/null +++ b/net/rds/tcp.c @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2006 Oracle. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ +#include <linux/kernel.h> +#include <linux/in.h> +#include <net/tcp.h> + +#include "rds.h" +#include "tcp.h" + +/* only for info exporting */ +static DEFINE_SPINLOCK(rds_tcp_tc_list_lock); +static LIST_HEAD(rds_tcp_tc_list); +unsigned int rds_tcp_tc_count; + +/* Track rds_tcp_connection structs so they can be cleaned up */ +static DEFINE_SPINLOCK(rds_tcp_conn_lock); +static LIST_HEAD(rds_tcp_conn_list); + +static struct kmem_cache *rds_tcp_conn_slab; + +#define RDS_TCP_DEFAULT_BUFSIZE (128 * 1024) + +/* doing it this way avoids calling tcp_sk() */ +void rds_tcp_nonagle(struct socket *sock) +{ + mm_segment_t oldfs = get_fs(); + int val = 1; + + set_fs(KERNEL_DS); + sock->ops->setsockopt(sock, SOL_TCP, TCP_NODELAY, (char __user *)&val, + sizeof(val)); + set_fs(oldfs); +} + +void rds_tcp_tune(struct socket *sock) +{ + struct sock *sk = sock->sk; + + rds_tcp_nonagle(sock); + + /* + * We're trying to saturate gigabit with the default, + * see svc_sock_setbufsize(). + */ + lock_sock(sk); + sk->sk_sndbuf = RDS_TCP_DEFAULT_BUFSIZE; + sk->sk_rcvbuf = RDS_TCP_DEFAULT_BUFSIZE; + sk->sk_userlocks |= SOCK_SNDBUF_LOCK|SOCK_RCVBUF_LOCK; + release_sock(sk); +} + +u32 rds_tcp_snd_nxt(struct rds_tcp_connection *tc) +{ + return tcp_sk(tc->t_sock->sk)->snd_nxt; +} + +u32 rds_tcp_snd_una(struct rds_tcp_connection *tc) +{ + return tcp_sk(tc->t_sock->sk)->snd_una; +} + +void rds_tcp_restore_callbacks(struct socket *sock, + struct rds_tcp_connection *tc) +{ + rdsdebug("restoring sock %p callbacks from tc %p\n", sock, tc); + write_lock_bh(&sock->sk->sk_callback_lock); + + /* done under the callback_lock to serialize with write_space */ + spin_lock(&rds_tcp_tc_list_lock); + list_del_init(&tc->t_list_item); + rds_tcp_tc_count--; + spin_unlock(&rds_tcp_tc_list_lock); + + tc->t_sock = NULL; + + sock->sk->sk_write_space = tc->t_orig_write_space; + sock->sk->sk_data_ready = tc->t_orig_data_ready; + sock->sk->sk_state_change = tc->t_orig_state_change; + sock->sk->sk_user_data = NULL; + + write_unlock_bh(&sock->sk->sk_callback_lock); +} + +/* + * This is the only path that sets tc->t_sock. Send and receive trust that + * it is set. The RDS_CONN_CONNECTED bit protects those paths from being + * called while it isn't set. + */ +void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + + rdsdebug("setting sock %p callbacks to tc %p\n", sock, tc); + write_lock_bh(&sock->sk->sk_callback_lock); + + /* done under the callback_lock to serialize with write_space */ + spin_lock(&rds_tcp_tc_list_lock); + list_add_tail(&tc->t_list_item, &rds_tcp_tc_list); + rds_tcp_tc_count++; + spin_unlock(&rds_tcp_tc_list_lock); + + /* accepted sockets need our listen data ready undone */ + if (sock->sk->sk_data_ready == rds_tcp_listen_data_ready) + sock->sk->sk_data_ready = sock->sk->sk_user_data; + + tc->t_sock = sock; + tc->conn = conn; + tc->t_orig_data_ready = sock->sk->sk_data_ready; + tc->t_orig_write_space = sock->sk->sk_write_space; + tc->t_orig_state_change = sock->sk->sk_state_change; + + sock->sk->sk_user_data = conn; + sock->sk->sk_data_ready = rds_tcp_data_ready; + sock->sk->sk_write_space = rds_tcp_write_space; + sock->sk->sk_state_change = rds_tcp_state_change; + + write_unlock_bh(&sock->sk->sk_callback_lock); +} + +static void rds_tcp_tc_info(struct socket *sock, unsigned int len, + struct rds_info_iterator *iter, + struct rds_info_lengths *lens) +{ + struct rds_info_tcp_socket tsinfo; + struct rds_tcp_connection *tc; + unsigned long flags; + struct sockaddr_in sin; + int sinlen; + + spin_lock_irqsave(&rds_tcp_tc_list_lock, flags); + + if (len / sizeof(tsinfo) < rds_tcp_tc_count) + goto out; + + list_for_each_entry(tc, &rds_tcp_tc_list, t_list_item) { + + sock->ops->getname(sock, (struct sockaddr *)&sin, &sinlen, 0); + tsinfo.local_addr = sin.sin_addr.s_addr; + tsinfo.local_port = sin.sin_port; + sock->ops->getname(sock, (struct sockaddr *)&sin, &sinlen, 1); + tsinfo.peer_addr = sin.sin_addr.s_addr; + tsinfo.peer_port = sin.sin_port; + + tsinfo.hdr_rem = tc->t_tinc_hdr_rem; + tsinfo.data_rem = tc->t_tinc_data_rem; + tsinfo.last_sent_nxt = tc->t_last_sent_nxt; + tsinfo.last_expected_una = tc->t_last_expected_una; + tsinfo.last_seen_una = tc->t_last_seen_una; + + rds_info_copy(iter, &tsinfo, sizeof(tsinfo)); + } + +out: + lens->nr = rds_tcp_tc_count; + lens->each = sizeof(tsinfo); + + spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags); +} + +static int rds_tcp_laddr_check(__be32 addr) +{ + if (inet_addr_type(&init_net, addr) == RTN_LOCAL) + return 0; + return -EADDRNOTAVAIL; +} + +static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp) +{ + struct rds_tcp_connection *tc; + + tc = kmem_cache_alloc(rds_tcp_conn_slab, gfp); + if (tc == NULL) + return -ENOMEM; + + tc->t_sock = NULL; + tc->t_tinc = NULL; + tc->t_tinc_hdr_rem = sizeof(struct rds_header); + tc->t_tinc_data_rem = 0; + + conn->c_transport_data = tc; + + spin_lock_irq(&rds_tcp_conn_lock); + list_add_tail(&tc->t_tcp_node, &rds_tcp_conn_list); + spin_unlock_irq(&rds_tcp_conn_lock); + + rdsdebug("alloced tc %p\n", conn->c_transport_data); + return 0; +} + +static void rds_tcp_conn_free(void *arg) +{ + struct rds_tcp_connection *tc = arg; + rdsdebug("freeing tc %p\n", tc); + kmem_cache_free(rds_tcp_conn_slab, tc); +} + +static void rds_tcp_destroy_conns(void) +{ + struct rds_tcp_connection *tc, *_tc; + LIST_HEAD(tmp_list); + + /* avoid calling conn_destroy with irqs off */ + spin_lock_irq(&rds_tcp_conn_lock); + list_splice(&rds_tcp_conn_list, &tmp_list); + INIT_LIST_HEAD(&rds_tcp_conn_list); + spin_unlock_irq(&rds_tcp_conn_lock); + + list_for_each_entry_safe(tc, _tc, &tmp_list, t_tcp_node) { + if (tc->conn->c_passive) + rds_conn_destroy(tc->conn->c_passive); + rds_conn_destroy(tc->conn); + } +} + +void rds_tcp_exit(void) +{ + rds_info_deregister_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info); + rds_tcp_listen_stop(); + rds_tcp_destroy_conns(); + rds_trans_unregister(&rds_tcp_transport); + rds_tcp_recv_exit(); + kmem_cache_destroy(rds_tcp_conn_slab); +} +module_exit(rds_tcp_exit); + +struct rds_transport rds_tcp_transport = { + .laddr_check = rds_tcp_laddr_check, + .xmit_prepare = rds_tcp_xmit_prepare, + .xmit_complete = rds_tcp_xmit_complete, + .xmit_cong_map = rds_tcp_xmit_cong_map, + .xmit = rds_tcp_xmit, + .recv = rds_tcp_recv, + .conn_alloc = rds_tcp_conn_alloc, + .conn_free = rds_tcp_conn_free, + .conn_connect = rds_tcp_conn_connect, + .conn_shutdown = rds_tcp_conn_shutdown, + .inc_copy_to_user = rds_tcp_inc_copy_to_user, + .inc_purge = rds_tcp_inc_purge, + .inc_free = rds_tcp_inc_free, + .stats_info_copy = rds_tcp_stats_info_copy, + .exit = rds_tcp_exit, + .t_owner = THIS_MODULE, + .t_name = "tcp", + .t_type = RDS_TRANS_TCP, + .t_prefer_loopback = 1, +}; + +int __init rds_tcp_init(void) +{ + int ret; + + rds_tcp_conn_slab = kmem_cache_create("rds_tcp_connection", + sizeof(struct rds_tcp_connection), + 0, 0, NULL); + if (rds_tcp_conn_slab == NULL) { + ret = -ENOMEM; + goto out; + } + + ret = rds_tcp_recv_init(); + if (ret) + goto out_slab; + + ret = rds_trans_register(&rds_tcp_transport); + if (ret) + goto out_recv; + + ret = rds_tcp_listen_init(); + if (ret) + goto out_register; + + rds_info_register_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info); + + goto out; + +out_register: + rds_trans_unregister(&rds_tcp_transport); +out_recv: + rds_tcp_recv_exit(); +out_slab: + kmem_cache_destroy(rds_tcp_conn_slab); +out: + return ret; +} +module_init(rds_tcp_init); + +MODULE_AUTHOR("Oracle Corporation <rds-devel@oss.oracle.com>"); +MODULE_DESCRIPTION("RDS: TCP transport"); +MODULE_LICENSE("Dual BSD/GPL"); + diff --git a/net/rds/tcp.h b/net/rds/tcp.h new file mode 100644 index 0000000..844fa6b --- /dev/null +++ b/net/rds/tcp.h @@ -0,0 +1,93 @@ +#ifndef _RDS_TCP_H +#define _RDS_TCP_H + +#define RDS_TCP_PORT 16385 + +struct rds_tcp_incoming { + struct rds_incoming ti_inc; + struct sk_buff_head ti_skb_list; +}; + +struct rds_tcp_connection { + + struct list_head t_tcp_node; + struct rds_connection *conn; + struct socket *t_sock; + void *t_orig_write_space; + void *t_orig_data_ready; + void *t_orig_state_change; + + struct rds_tcp_incoming *t_tinc; + size_t t_tinc_hdr_rem; + size_t t_tinc_data_rem; + + /* XXX error report? */ + struct work_struct t_conn_w; + struct work_struct t_send_w; + struct work_struct t_down_w; + struct work_struct t_recv_w; + + /* for info exporting only */ + struct list_head t_list_item; + u32 t_last_sent_nxt; + u32 t_last_expected_una; + u32 t_last_seen_una; +}; + +struct rds_tcp_statistics { + uint64_t s_tcp_data_ready_calls; + uint64_t s_tcp_write_space_calls; + uint64_t s_tcp_sndbuf_full; + uint64_t s_tcp_connect_raced; + uint64_t s_tcp_listen_closed_stale; +}; + +/* tcp.c */ +int __init rds_tcp_init(void); +void rds_tcp_exit(void); +void rds_tcp_tune(struct socket *sock); +void rds_tcp_nonagle(struct socket *sock); +void rds_tcp_set_callbacks(struct socket *sock, struct rds_connection *conn); +void rds_tcp_restore_callbacks(struct socket *sock, + struct rds_tcp_connection *tc); +u32 rds_tcp_snd_nxt(struct rds_tcp_connection *tc); +u32 rds_tcp_snd_una(struct rds_tcp_connection *tc); +u64 rds_tcp_map_seq(struct rds_tcp_connection *tc, u32 seq); +extern struct rds_transport rds_tcp_transport; + +/* tcp_connect.c */ +int rds_tcp_conn_connect(struct rds_connection *conn); +void rds_tcp_conn_shutdown(struct rds_connection *conn); +void rds_tcp_state_change(struct sock *sk); + +/* tcp_listen.c */ +int __init rds_tcp_listen_init(void); +void rds_tcp_listen_stop(void); +void rds_tcp_listen_data_ready(struct sock *sk, int bytes); + +/* tcp_recv.c */ +int __init rds_tcp_recv_init(void); +void rds_tcp_recv_exit(void); +void rds_tcp_data_ready(struct sock *sk, int bytes); +int rds_tcp_recv(struct rds_connection *conn); +void rds_tcp_inc_purge(struct rds_incoming *inc); +void rds_tcp_inc_free(struct rds_incoming *inc); +int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iovec *iov, + size_t size); + +/* tcp_send.c */ +void rds_tcp_xmit_prepare(struct rds_connection *conn); +void rds_tcp_xmit_complete(struct rds_connection *conn); +int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, + unsigned int hdr_off, unsigned int sg, unsigned int off); +void rds_tcp_write_space(struct sock *sk); +int rds_tcp_xmit_cong_map(struct rds_connection *conn, + struct rds_cong_map *map, unsigned long offset); + +/* tcp_stats.c */ +DECLARE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats); +#define rds_tcp_stats_inc(member) rds_stats_inc_which(rds_tcp_stats, member) +unsigned int rds_tcp_stats_info_copy(struct rds_info_iterator *iter, + unsigned int avail); + +#endif diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c new file mode 100644 index 0000000..211522f --- /dev/null +++ b/net/rds/tcp_connect.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2006 Oracle. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ +#include <linux/kernel.h> +#include <linux/in.h> +#include <net/tcp.h> + +#include "rds.h" +#include "tcp.h" + +void rds_tcp_state_change(struct sock *sk) +{ + void (*state_change)(struct sock *sk); + struct rds_connection *conn; + struct rds_tcp_connection *tc; + + read_lock(&sk->sk_callback_lock); + conn = sk->sk_user_data; + if (conn == NULL) { + state_change = sk->sk_state_change; + goto out; + } + tc = conn->c_transport_data; + state_change = tc->t_orig_state_change; + + rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state); + + switch(sk->sk_state) { + /* ignore connecting sockets as they make progress */ + case TCP_SYN_SENT: + case TCP_SYN_RECV: + break; + case TCP_ESTABLISHED: + rds_connect_complete(conn); + break; + case TCP_CLOSE: + rds_conn_drop(conn); + default: + break; + } +out: + read_unlock(&sk->sk_callback_lock); + state_change(sk); +} + +int rds_tcp_conn_connect(struct rds_connection *conn) +{ + struct socket *sock = NULL; + struct sockaddr_in src, dest; + int ret; + + ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); + if (ret < 0) + goto out; + + rds_tcp_tune(sock); + + src.sin_family = AF_INET; + src.sin_addr.s_addr = (__force u32)conn->c_laddr; + src.sin_port = (__force u16)htons(0); + + ret = sock->ops->bind(sock, (struct sockaddr *)&src, sizeof(src)); + if (ret) { + rdsdebug("bind failed with %d at address %u.%u.%u.%u\n", + ret, NIPQUAD(conn->c_laddr)); + goto out; + } + + dest.sin_family = AF_INET; + dest.sin_addr.s_addr = (__force u32)conn->c_faddr; + dest.sin_port = (__force u16)htons(RDS_TCP_PORT); + + /* + * once we call connect() we can start getting callbacks and they + * own the socket + */ + rds_tcp_set_callbacks(sock, conn); + ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), + O_NONBLOCK); + sock = NULL; + + rdsdebug("connect to address %u.%u.%u.%u returned %d\n", + NIPQUAD(conn->c_faddr), ret); + if (ret == -EINPROGRESS) + ret = 0; + +out: + if (sock) + sock_release(sock); + return ret; +} + +/* + * Before killing the tcp socket this needs to serialize with callbacks. The + * caller has already grabbed the sending sem so we're serialized with other + * senders. + * + * TCP calls the callbacks with the sock lock so we hold it while we reset the + * callbacks to those set by TCP. Our callbacks won't execute again once we + * hold the sock lock. + */ +void rds_tcp_conn_shutdown(struct rds_connection *conn) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + struct socket *sock = tc->t_sock; + + rdsdebug("shutting down conn %p tc %p sock %p\n", conn, tc, sock); + + if (sock) { + sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); + lock_sock(sock->sk); + rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */ + + release_sock(sock->sk); + sock_release(sock); + }; + + if (tc->t_tinc) { + rds_inc_put(&tc->t_tinc->ti_inc); + tc->t_tinc = NULL; + } + tc->t_tinc_hdr_rem = sizeof(struct rds_header); + tc->t_tinc_data_rem = 0; +} diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c new file mode 100644 index 0000000..24b743e --- /dev/null +++ b/net/rds/tcp_listen.c @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2006 Oracle. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ +#include <linux/kernel.h> +#include <linux/in.h> +#include <net/tcp.h> + +#include "rds.h" +#include "tcp.h" + +/* + * cheesy, but simple.. + */ +static void rds_tcp_accept_worker(struct work_struct *work); +static DECLARE_WORK(rds_tcp_listen_work, rds_tcp_accept_worker); +static struct socket *rds_tcp_listen_sock; + +static int rds_tcp_accept_one(struct socket *sock) +{ + struct socket *new_sock = NULL; + struct rds_connection *conn; + int ret; + struct inet_sock *inet; + + ret = sock_create_lite(sock->sk->sk_family, sock->sk->sk_type, + sock->sk->sk_protocol, &new_sock); + if (ret) + goto out; + + new_sock->type = sock->type; + new_sock->ops = sock->ops; + ret = sock->ops->accept(sock, new_sock, O_NONBLOCK); + if (ret < 0) + goto out; + + rds_tcp_tune(new_sock); + + inet = inet_sk(new_sock->sk); + + rdsdebug("accepted tcp %u.%u.%u.%u:%u -> %u.%u.%u.%u:%u\n", + NIPQUAD(inet->saddr), ntohs(inet->sport), + NIPQUAD(inet->daddr), ntohs(inet->dport)); + + conn = rds_conn_create(inet->saddr, inet->daddr, &rds_tcp_transport, + GFP_KERNEL); + if (IS_ERR(conn)) { + ret = PTR_ERR(conn); + goto out; + } + + /* + * see the comment above rds_queue_delayed_reconnect() + */ + if (!rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) { + if (rds_conn_state(conn) == RDS_CONN_UP) + rds_tcp_stats_inc(s_tcp_listen_closed_stale); + else + rds_tcp_stats_inc(s_tcp_connect_raced); + rds_conn_drop(conn); + ret = 0; + goto out; + } + + rds_tcp_set_callbacks(new_sock, conn); + rds_connect_complete(conn); + new_sock = NULL; + ret = 0; + +out: + if (new_sock) + sock_release(new_sock); + return ret; +} + +static void rds_tcp_accept_worker(struct work_struct *work) +{ + while (rds_tcp_accept_one(rds_tcp_listen_sock) == 0) + cond_resched(); +} + +void rds_tcp_listen_data_ready(struct sock *sk, int bytes) +{ + void (*ready)(struct sock *sk, int bytes); + + rdsdebug("listen data ready sk %p\n", sk); + + read_lock(&sk->sk_callback_lock); + ready = sk->sk_user_data; + if (ready == NULL) { /* check for teardown race */ + ready = sk->sk_data_ready; + goto out; + } + + /* + * ->sk_data_ready is also called for a newly established child socket + * before it has been accepted and the accepter has set up their + * data_ready.. we only want to queue listen work for our listening + * socket + */ + if (sk->sk_state == TCP_LISTEN) + queue_work(rds_wq, &rds_tcp_listen_work); + +out: + read_unlock(&sk->sk_callback_lock); + ready(sk, bytes); +} + +int __init rds_tcp_listen_init(void) +{ + struct sockaddr_in sin; + struct socket *sock = NULL; + int ret; + + ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); + if (ret < 0) + goto out; + + sock->sk->sk_reuse = 1; + rds_tcp_nonagle(sock); + + write_lock_bh(&sock->sk->sk_callback_lock); + sock->sk->sk_user_data = sock->sk->sk_data_ready; + sock->sk->sk_data_ready = rds_tcp_listen_data_ready; + write_unlock_bh(&sock->sk->sk_callback_lock); + + sin.sin_family = PF_INET, + sin.sin_addr.s_addr = (__force u32)htonl(INADDR_ANY); + sin.sin_port = (__force u16)htons(RDS_TCP_PORT); + + ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); + if (ret < 0) + goto out; + + ret = sock->ops->listen(sock, 64); + if (ret < 0) + goto out; + + rds_tcp_listen_sock = sock; + sock = NULL; +out: + if (sock) + sock_release(sock); + return ret; +} + +void rds_tcp_listen_stop(void) +{ + struct socket *sock = rds_tcp_listen_sock; + struct sock *sk; + + if (sock == NULL) + return; + + sk = sock->sk; + + /* serialize with and prevent further callbacks */ + lock_sock(sk); + write_lock_bh(&sk->sk_callback_lock); + if (sk->sk_user_data) { + sk->sk_data_ready = sk->sk_user_data; + sk->sk_user_data = NULL; + } + write_unlock_bh(&sk->sk_callback_lock); + release_sock(sk); + + /* wait for accepts to stop and close the socket */ + flush_workqueue(rds_wq); + sock_release(sock); + rds_tcp_listen_sock = NULL; +} diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c new file mode 100644 index 0000000..c00daff --- /dev/null +++ b/net/rds/tcp_recv.c @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2006 Oracle. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ +#include <linux/kernel.h> +#include <net/tcp.h> + +#include "rds.h" +#include "tcp.h" + +static struct kmem_cache *rds_tcp_incoming_slab; + +void rds_tcp_inc_purge(struct rds_incoming *inc) +{ + struct rds_tcp_incoming *tinc; + tinc = container_of(inc, struct rds_tcp_incoming, ti_inc); + rdsdebug("purging tinc %p inc %p\n", tinc, inc); + skb_queue_purge(&tinc->ti_skb_list); +} + +void rds_tcp_inc_free(struct rds_incoming *inc) +{ + struct rds_tcp_incoming *tinc; + tinc = container_of(inc, struct rds_tcp_incoming, ti_inc); + rds_tcp_inc_purge(inc); + rdsdebug("freeing tinc %p inc %p\n", tinc, inc); + kmem_cache_free(rds_tcp_incoming_slab, tinc); +} + +/* + * this is pretty lame, but, whatever. + */ +int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iovec *first_iov, + size_t size) +{ + struct rds_tcp_incoming *tinc; + struct iovec *iov, tmp; + struct sk_buff *skb; + unsigned long to_copy, skb_off; + int ret = 0; + + if (size == 0) + goto out; + + tinc = container_of(inc, struct rds_tcp_incoming, ti_inc); + iov = first_iov; + tmp = *iov; + + skb_queue_walk(&tinc->ti_skb_list, skb) { + skb_off = 0; + while (skb_off < skb->len) { + while (tmp.iov_len == 0) { + iov++; + tmp = *iov; + } + + to_copy = min(tmp.iov_len, size); + to_copy = min(to_copy, skb->len - skb_off); + + rdsdebug("ret %d size %zu skb %p skb_off %lu " + "skblen %d iov_base %p iov_len %zu cpy %lu\n", + ret, size, skb, skb_off, skb->len, + tmp.iov_base, tmp.iov_len, to_copy); + + /* modifies tmp as it copies */ + if (skb_copy_datagram_iovec(skb, skb_off, &tmp, + to_copy)) { + ret = -EFAULT; + goto out; + } + + size -= to_copy; + ret += to_copy; + skb_off += to_copy; + if (size == 0) + goto out; + } + } +out: + return ret; +} + +/* + * We have a series of skbs that have fragmented pieces of the congestion + * bitmap. They must add up to the exact size of the congestion bitmap. We + * use the skb helpers to copy those into the pages that make up the in-memory + * congestion bitmap for the remote address of this connection. We then tell + * the congestion core that the bitmap has been changed so that it can wake up + * sleepers. + * + * This is racing with sending paths which are using test_bit to see if the + * bitmap indicates that their recipient is congested. + */ + +static void rds_tcp_cong_recv(struct rds_connection *conn, + struct rds_tcp_incoming *tinc) +{ + struct sk_buff *skb; + unsigned int to_copy, skb_off; + unsigned int map_off; + unsigned int map_page; + struct rds_cong_map *map; + int ret; + + /* catch completely corrupt packets */ + if (be32_to_cpu(tinc->ti_inc.i_hdr.h_len) != RDS_CONG_MAP_BYTES) + return; + + map_page = 0; + map_off = 0; + map = conn->c_fcong; + + skb_queue_walk(&tinc->ti_skb_list, skb) { + skb_off = 0; + while (skb_off < skb->len) { + to_copy = min_t(unsigned int, PAGE_SIZE - map_off, + skb->len - skb_off); + + BUG_ON(map_page >= RDS_CONG_MAP_PAGES); + + /* only returns 0 or -error */ + ret = skb_copy_bits(skb, skb_off, + (void *)map->m_page_addrs[map_page] + map_off, + to_copy); + BUG_ON(ret != 0); + + skb_off += to_copy; + map_off += to_copy; + if (map_off == PAGE_SIZE) { + map_off = 0; + map_page++; + } + } + } + + rds_cong_map_updated(map, ~(u64) 0); +} + +struct rds_tcp_desc_arg { + struct rds_connection *conn; + gfp_t gfp; + enum km_type km; +}; + +static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, + unsigned int offset, size_t len) +{ + struct rds_tcp_desc_arg *arg = desc->arg.data; + struct rds_connection *conn = arg->conn; + struct rds_tcp_connection *tc = conn->c_transport_data; + struct rds_tcp_incoming *tinc = tc->t_tinc; + struct sk_buff *clone; + size_t left = len, to_copy; + + rdsdebug("tcp data tc %p skb %p offset %u len %zu\n", tc, skb, offset, + len); + + /* + * tcp_read_sock() interprets partial progress as an indication to stop + * processing. + */ + while (left) { + if (tinc == NULL) { + tinc = kmem_cache_alloc(rds_tcp_incoming_slab, + arg->gfp); + if (tinc == NULL) { + desc->error = -ENOMEM; + goto out; + } + tc->t_tinc = tinc; + rdsdebug("alloced tinc %p\n", tinc); + rds_inc_init(&tinc->ti_inc, conn, conn->c_faddr); + /* + * XXX * we might be able to use the __ variants when + * we've already serialized at a higher level. + */ + skb_queue_head_init(&tinc->ti_skb_list); + } + + if (left && tc->t_tinc_hdr_rem) { + to_copy = min(tc->t_tinc_hdr_rem, left); + rdsdebug("copying %zu header from skb %p\n", to_copy, + skb); + skb_copy_bits(skb, offset, + (char *)&tinc->ti_inc.i_hdr + + sizeof(struct rds_header) - + tc->t_tinc_hdr_rem, + to_copy); + tc->t_tinc_hdr_rem -= to_copy; + left -= to_copy; + offset += to_copy; + + if (tc->t_tinc_hdr_rem == 0) { + /* could be 0 for a 0 len message */ + tc->t_tinc_data_rem = + be32_to_cpu(tinc->ti_inc.i_hdr.h_len); + } + } + + if (left && tc->t_tinc_data_rem) { + clone = skb_clone(skb, arg->gfp); + if (clone == NULL) { + desc->error = -ENOMEM; + goto out; + } + + to_copy = min(tc->t_tinc_data_rem, left); + pskb_pull(clone, offset); + pskb_trim(clone, to_copy); + skb_queue_tail(&tinc->ti_skb_list, clone); + + rdsdebug("skb %p data %p len %d off %u to_copy %zu -> " + "clone %p data %p len %d\n", + skb, skb->data, skb->len, offset, to_copy, + clone, clone->data, clone->len); + + tc->t_tinc_data_rem -= to_copy; + left -= to_copy; + offset += to_copy; + } + + if (tc->t_tinc_hdr_rem == 0 && tc->t_tinc_data_rem == 0) { + if (tinc->ti_inc.i_hdr.h_flags == RDS_FLAG_CONG_BITMAP) + rds_tcp_cong_recv(conn, tinc); + else + rds_recv_incoming(conn, conn->c_faddr, + conn->c_laddr, &tinc->ti_inc, + arg->gfp, arg->km); + + tc->t_tinc_hdr_rem = sizeof(struct rds_header); + tc->t_tinc_data_rem = 0; + tc->t_tinc = NULL; + rds_inc_put(&tinc->ti_inc); + tinc = NULL; + } + } +out: + rdsdebug("returning len %zu left %zu skb len %d rx queue depth %d\n", + len, left, skb->len, + skb_queue_len(&tc->t_sock->sk->sk_receive_queue)); + return len - left; +} + +/* the caller has to hold the sock lock */ +int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp, enum km_type km) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + struct socket *sock = tc->t_sock; + read_descriptor_t desc; + struct rds_tcp_desc_arg arg; + + /* It's like glib in the kernel! */ + arg.conn = conn; + arg.gfp = gfp; + arg.km = km; + desc.arg.data = &arg; + desc.error = 0; + desc.count = 1; /* give more than one skb per call */ + + tcp_read_sock(sock->sk, &desc, rds_tcp_data_recv); + rdsdebug("tcp_read_sock for tc %p gfp 0x%x returned %d\n", tc, gfp, + desc.error); + + return desc.error; +} + +/* + * We hold the sock lock to serialize our rds_tcp_recv->tcp_read_sock from + * data_ready. + * + * if we fail to allocate we're in trouble.. blindly wait some time before + * trying again to see if the VM can free up something for us. + */ +int rds_tcp_recv(struct rds_connection *conn) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + struct socket *sock = tc->t_sock; + int ret = 0; + + rdsdebug("recv worker conn %p tc %p sock %p\n", conn, tc, sock); + + lock_sock(sock->sk); + ret = rds_tcp_read_sock(conn, GFP_KERNEL, KM_USER0); + release_sock(sock->sk); + + return ret; +} + +void rds_tcp_data_ready(struct sock *sk, int bytes) +{ + void (*ready)(struct sock *sk, int bytes); + struct rds_connection *conn; + struct rds_tcp_connection *tc; + + rdsdebug("data ready sk %p bytes %d\n", sk, bytes); + + read_lock(&sk->sk_callback_lock); + conn = sk->sk_user_data; + if (conn == NULL) { /* check for teardown race */ + ready = sk->sk_data_ready; + goto out; + } + + tc = conn->c_transport_data; + ready = tc->t_orig_data_ready; + rds_tcp_stats_inc(s_tcp_data_ready_calls); + + if (rds_tcp_read_sock(conn, GFP_ATOMIC, KM_SOFTIRQ0) == -ENOMEM) + queue_delayed_work(rds_wq, &conn->c_recv_w, 0); +out: + read_unlock(&sk->sk_callback_lock); + ready(sk, bytes); +} + +int __init rds_tcp_recv_init(void) +{ + rds_tcp_incoming_slab = kmem_cache_create("rds_tcp_incoming", + sizeof(struct rds_tcp_incoming), + 0, 0, NULL); + if (rds_tcp_incoming_slab == NULL) + return -ENOMEM; + return 0; +} + +void rds_tcp_recv_exit(void) +{ + kmem_cache_destroy(rds_tcp_incoming_slab); +} diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c new file mode 100644 index 0000000..ab545e0 --- /dev/null +++ b/net/rds/tcp_send.c @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2006 Oracle. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ +#include <linux/kernel.h> +#include <linux/in.h> +#include <net/tcp.h> + +#include "rds.h" +#include "tcp.h" + +static void rds_tcp_cork(struct socket *sock, int val) +{ + mm_segment_t oldfs; + + oldfs = get_fs(); + set_fs(KERNEL_DS); + sock->ops->setsockopt(sock, SOL_TCP, TCP_CORK, (char __user *)&val, + sizeof(val)); + set_fs(oldfs); +} + +void rds_tcp_xmit_prepare(struct rds_connection *conn) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + + rds_tcp_cork(tc->t_sock, 1); +} + +void rds_tcp_xmit_complete(struct rds_connection *conn) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + + rds_tcp_cork(tc->t_sock, 0); +} + +/* the core send_sem serializes this with other xmit and shutdown */ +int rds_tcp_sendmsg(struct socket *sock, void *data, unsigned int len) +{ + struct kvec vec = { + .iov_base = data, + .iov_len = len, + }; + struct msghdr msg = { + .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL, + }; + + return kernel_sendmsg(sock, &msg, &vec, 1, vec.iov_len); +} + +/* the core send_sem serializes this with other xmit and shutdown */ +int rds_tcp_xmit_cong_map(struct rds_connection *conn, + struct rds_cong_map *map, unsigned long offset) +{ + static struct rds_header rds_tcp_map_header = { + .h_flags = RDS_FLAG_CONG_BITMAP, + }; + struct rds_tcp_connection *tc = conn->c_transport_data; + unsigned long i; + int ret; + int copied = 0; + + /* Some problem claims cpu_to_be32(constant) isn't a constant. */ + rds_tcp_map_header.h_len = cpu_to_be32(RDS_CONG_MAP_BYTES); + + if (offset < sizeof(struct rds_header)) { + ret = rds_tcp_sendmsg(tc->t_sock, + (void *)&rds_tcp_map_header + offset, + sizeof(struct rds_header) - offset); + if (ret <= 0) + return ret; + offset += ret; + copied = ret; + if (offset < sizeof(struct rds_header)) + return ret; + } + + offset -= sizeof(struct rds_header); + i = offset / PAGE_SIZE; + offset = offset % PAGE_SIZE; + BUG_ON(i >= RDS_CONG_MAP_PAGES); + + do { + ret = tc->t_sock->ops->sendpage(tc->t_sock, + virt_to_page(map->m_page_addrs[i]), + offset, PAGE_SIZE - offset, + MSG_DONTWAIT); + if (ret <= 0) + break; + copied += ret; + offset += ret; + if (offset == PAGE_SIZE) { + offset = 0; + i++; + } + } while (i < RDS_CONG_MAP_PAGES); + + return copied ? copied : ret; +} + +/* the core send_sem serializes this with other xmit and shutdown */ +int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, + unsigned int hdr_off, unsigned int sg, unsigned int off) +{ + struct rds_tcp_connection *tc = conn->c_transport_data; + int done = 0; + int ret = 0; + + if (hdr_off == 0) { + /* + * m_ack_seq is set to the sequence number of the last byte of + * header and data. see rds_tcp_is_acked(). + */ + tc->t_last_sent_nxt = rds_tcp_snd_nxt(tc); + rm->m_ack_seq = tc->t_last_sent_nxt + + sizeof(struct rds_header) + + be32_to_cpu(rm->m_inc.i_hdr.h_len) - 1; + smp_mb__before_clear_bit(); + set_bit(RDS_MSG_HAS_ACK_SEQ, &rm->m_flags); + tc->t_last_expected_una = rm->m_ack_seq + 1; + + rdsdebug("rm %p tcp nxt %u ack_seq %llu\n", + rm, rds_tcp_snd_nxt(tc), + (unsigned long long)rm->m_ack_seq); + } + + if (hdr_off < sizeof(struct rds_header)) { + /* see rds_tcp_write_space() */ + set_bit(SOCK_NOSPACE, &tc->t_sock->sk->sk_socket->flags); + + ret = rds_tcp_sendmsg(tc->t_sock, + (void *)&rm->m_inc.i_hdr + hdr_off, + sizeof(rm->m_inc.i_hdr) - hdr_off); + if (ret < 0) + goto out; + done += ret; + if (hdr_off + done != sizeof(struct rds_header)) + goto out; + } + + while (sg < rm->m_nents) { + ret = tc->t_sock->ops->sendpage(tc->t_sock, + sg_page(&rm->m_sg[sg]), + rm->m_sg[sg].offset + off, + rm->m_sg[sg].length - off, + MSG_DONTWAIT|MSG_NOSIGNAL); + rdsdebug("tcp sendpage %p:%u:%u ret %d\n", (void *)sg_page(&rm->m_sg[sg]), + rm->m_sg[sg].offset + off, rm->m_sg[sg].length - off, + ret); + if (ret <= 0) + break; + + off += ret; + done += ret; + if (off == rm->m_sg[sg].length) { + off = 0; + sg++; + } + } + +out: + if (ret <= 0) { + /* write_space will hit after EAGAIN, all else fatal */ + if (ret == -EAGAIN) { + rds_tcp_stats_inc(s_tcp_sndbuf_full); + ret = 0; + } else { + printk(KERN_WARNING "RDS/tcp: send to %u.%u.%u.%u " + "returned %d, disconnecting and reconnecting\n", + NIPQUAD(conn->c_faddr), ret); + rds_conn_drop(conn); + } + } + if (done == 0) + done = ret; + return done; +} + +/* + * rm->m_ack_seq is set to the tcp sequence number that corresponds to the + * last byte of the message, including the header. This means that the + * entire message has been received if rm->m_ack_seq is "before" the next + * unacked byte of the TCP sequence space. We have to do very careful + * wrapping 32bit comparisons here. + */ +static int rds_tcp_is_acked(struct rds_message *rm, uint64_t ack) +{ + if (!test_bit(RDS_MSG_HAS_ACK_SEQ, &rm->m_flags)) + return 0; + return (__s32)((u32)rm->m_ack_seq - (u32)ack) < 0; +} + +void rds_tcp_write_space(struct sock *sk) +{ + void (*write_space)(struct sock *sk); + struct rds_connection *conn; + struct rds_tcp_connection *tc; + + read_lock(&sk->sk_callback_lock); + conn = sk->sk_user_data; + if (conn == NULL) { + write_space = sk->sk_write_space; + goto out; + } + + tc = conn->c_transport_data; + rdsdebug("write_space for tc %p\n", tc); + write_space = tc->t_orig_write_space; + rds_tcp_stats_inc(s_tcp_write_space_calls); + + rdsdebug("tcp una %u\n", rds_tcp_snd_una(tc)); + tc->t_last_seen_una = rds_tcp_snd_una(tc); + rds_send_drop_acked(conn, rds_tcp_snd_una(tc), rds_tcp_is_acked); + + queue_delayed_work(rds_wq, &conn->c_send_w, 0); +out: + read_unlock(&sk->sk_callback_lock); + + /* + * write_space is only called when data leaves tcp's send queue if + * SOCK_NOSPACE is set. We set SOCK_NOSPACE every time we put + * data in tcp's send queue because we use write_space to parse the + * sequence numbers and notice that rds messages have been fully + * received. + * + * tcp's write_space clears SOCK_NOSPACE if the send queue has more + * than a certain amount of space. So we need to set it again *after* + * we call tcp's write_space or else we might only get called on the + * first of a series of incoming tcp acks. + */ + write_space(sk); + + if (sk->sk_socket) + set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); +} diff --git a/net/rds/tcp_stats.c b/net/rds/tcp_stats.c new file mode 100644 index 0000000..d5898d0 --- /dev/null +++ b/net/rds/tcp_stats.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2006 Oracle. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ +#include <linux/percpu.h> +#include <linux/seq_file.h> +#include <linux/proc_fs.h> + +#include "rds.h" +#include "tcp.h" + +DEFINE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats) + ____cacheline_aligned; + +static const char const *rds_tcp_stat_names[] = { + "tcp_data_ready_calls", + "tcp_write_space_calls", + "tcp_sndbuf_full", + "tcp_connect_raced", + "tcp_listen_closed_stale", +}; + +unsigned int rds_tcp_stats_info_copy(struct rds_info_iterator *iter, + unsigned int avail) +{ + struct rds_tcp_statistics stats = {0, }; + uint64_t *src; + uint64_t *sum; + size_t i; + int cpu; + + if (avail < ARRAY_SIZE(rds_tcp_stat_names)) + goto out; + + for_each_online_cpu(cpu) { + src = (uint64_t *)&(per_cpu(rds_tcp_stats, cpu)); + sum = (uint64_t *)&stats; + for (i = 0; i < sizeof(stats) / sizeof(uint64_t); i++) + *(sum++) += *(src++); + } + + rds_stats_info_copy(iter, (uint64_t *)&stats, rds_tcp_stat_names, + ARRAY_SIZE(rds_tcp_stat_names)); +out: + return ARRAY_SIZE(rds_tcp_stat_names); +} diff --git a/net/rds/threads.c b/net/rds/threads.c index 828a1bf..dd7e0ca 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c @@ -68,6 +68,7 @@ * (TCP, IB/RDMA) to provide the necessary synchronisation. */ struct workqueue_struct *rds_wq; +EXPORT_SYMBOL_GPL(rds_wq); void rds_connect_complete(struct rds_connection *conn) { @@ -89,6 +90,7 @@ void rds_connect_complete(struct rds_connection *conn) queue_delayed_work(rds_wq, &conn->c_send_w, 0); queue_delayed_work(rds_wq, &conn->c_recv_w, 0); } +EXPORT_SYMBOL_GPL(rds_connect_complete); /* * This random exponential backoff is relied on to eventually resolve racing diff --git a/net/rds/transport.c b/net/rds/transport.c index 767da61..7e10679 100644 --- a/net/rds/transport.c +++ b/net/rds/transport.c @@ -37,7 +37,7 @@ #include "rds.h" #include "loop.h" -static LIST_HEAD(rds_transports); +static struct rds_transport *transports[RDS_TRANS_COUNT]; static DECLARE_RWSEM(rds_trans_sem); int rds_trans_register(struct rds_transport *trans) @@ -46,36 +46,44 @@ int rds_trans_register(struct rds_transport *trans) down_write(&rds_trans_sem); - list_add_tail(&trans->t_item, &rds_transports); - printk(KERN_INFO "Registered RDS/%s transport\n", trans->t_name); + if (transports[trans->t_type]) + printk(KERN_ERR "RDS Transport type %d already registered\n", + trans->t_type); + else { + transports[trans->t_type] = trans; + printk(KERN_INFO "Registered RDS/%s transport\n", trans->t_name); + } up_write(&rds_trans_sem); return 0; } +EXPORT_SYMBOL_GPL(rds_trans_register); void rds_trans_unregister(struct rds_transport *trans) { down_write(&rds_trans_sem); - list_del_init(&trans->t_item); + transports[trans->t_type] = NULL; printk(KERN_INFO "Unregistered RDS/%s transport\n", trans->t_name); up_write(&rds_trans_sem); } +EXPORT_SYMBOL_GPL(rds_trans_unregister); struct rds_transport *rds_trans_get_preferred(__be32 addr) { - struct rds_transport *trans; struct rds_transport *ret = NULL; + int i; if (IN_LOOPBACK(ntohl(addr))) return &rds_loop_transport; down_read(&rds_trans_sem); - list_for_each_entry(trans, &rds_transports, t_item) { - if (trans->laddr_check(addr) == 0) { - ret = trans; + for (i = 0; i < RDS_TRANS_COUNT; i++) + { + if (transports[i] && (transports[i]->laddr_check(addr) == 0)) { + ret = transports[i]; break; } } @@ -97,12 +105,15 @@ unsigned int rds_trans_stats_info_copy(struct rds_info_iterator *iter, struct rds_transport *trans; unsigned int total = 0; unsigned int part; + int i; rds_info_iter_unmap(iter); down_read(&rds_trans_sem); - list_for_each_entry(trans, &rds_transports, t_item) { - if (trans->stats_info_copy == NULL) + for (i = 0; i < RDS_TRANS_COUNT; i++) + { + trans = transports[i]; + if (!trans || !trans->stats_info_copy) continue; part = trans->stats_info_copy(iter, avail); diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 693df7a..6f7aebd 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -406,18 +406,38 @@ static const u8 prio2band[TC_PRIO_MAX+1] = #define PFIFO_FAST_BANDS 3 -static inline struct sk_buff_head *prio2list(struct sk_buff *skb, - struct Qdisc *qdisc) +/* + * Private data for a pfifo_fast scheduler containing: + * - queues for the three band + * - bitmap indicating which of the bands contain skbs + */ +struct pfifo_fast_priv { + u32 bitmap; + struct sk_buff_head q[PFIFO_FAST_BANDS]; +}; + +/* + * Convert a bitmap to the first band number where an skb is queued, where: + * bitmap=0 means there are no skbs on any band. + * bitmap=1 means there is an skb on band 0. + * bitmap=7 means there are skbs on all 3 bands, etc. + */ +static const int bitmap2band[] = {-1, 0, 1, 0, 2, 0, 1, 0}; + +static inline struct sk_buff_head *band2list(struct pfifo_fast_priv *priv, + int band) { - struct sk_buff_head *list = qdisc_priv(qdisc); - return list + prio2band[skb->priority & TC_PRIO_MAX]; + return priv->q + band; } static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc) { - struct sk_buff_head *list = prio2list(skb, qdisc); + int band = prio2band[skb->priority & TC_PRIO_MAX]; + struct pfifo_fast_priv *priv = qdisc_priv(qdisc); + struct sk_buff_head *list = band2list(priv, band); if (skb_queue_len(list) < qdisc_dev(qdisc)->tx_queue_len) { + priv->bitmap |= (1 << band); qdisc->q.qlen++; return __qdisc_enqueue_tail(skb, qdisc, list); } @@ -427,14 +447,18 @@ static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc) static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc) { - int prio; - struct sk_buff_head *list = qdisc_priv(qdisc); + struct pfifo_fast_priv *priv = qdisc_priv(qdisc); + int band = bitmap2band[priv->bitmap]; - for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { - if (!skb_queue_empty(list + prio)) { - qdisc->q.qlen--; - return __qdisc_dequeue_head(qdisc, list + prio); - } + if (likely(band >= 0)) { + struct sk_buff_head *list = band2list(priv, band); + struct sk_buff *skb = __qdisc_dequeue_head(qdisc, list); + + qdisc->q.qlen--; + if (skb_queue_empty(list)) + priv->bitmap &= ~(1 << band); + + return skb; } return NULL; @@ -442,12 +466,13 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc) static struct sk_buff *pfifo_fast_peek(struct Qdisc* qdisc) { - int prio; - struct sk_buff_head *list = qdisc_priv(qdisc); + struct pfifo_fast_priv *priv = qdisc_priv(qdisc); + int band = bitmap2band[priv->bitmap]; + + if (band >= 0) { + struct sk_buff_head *list = band2list(priv, band); - for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { - if (!skb_queue_empty(list + prio)) - return skb_peek(list + prio); + return skb_peek(list); } return NULL; @@ -456,11 +481,12 @@ static struct sk_buff *pfifo_fast_peek(struct Qdisc* qdisc) static void pfifo_fast_reset(struct Qdisc* qdisc) { int prio; - struct sk_buff_head *list = qdisc_priv(qdisc); + struct pfifo_fast_priv *priv = qdisc_priv(qdisc); for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) - __qdisc_reset_queue(qdisc, list + prio); + __qdisc_reset_queue(qdisc, band2list(priv, prio)); + priv->bitmap = 0; qdisc->qstats.backlog = 0; qdisc->q.qlen = 0; } @@ -480,17 +506,17 @@ nla_put_failure: static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt) { int prio; - struct sk_buff_head *list = qdisc_priv(qdisc); + struct pfifo_fast_priv *priv = qdisc_priv(qdisc); for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) - skb_queue_head_init(list + prio); + skb_queue_head_init(band2list(priv, prio)); return 0; } static struct Qdisc_ops pfifo_fast_ops __read_mostly = { .id = "pfifo_fast", - .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head), + .priv_size = sizeof(struct pfifo_fast_priv), .enqueue = pfifo_fast_enqueue, .dequeue = pfifo_fast_dequeue, .peek = pfifo_fast_peek, diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index a7a3677..327011f 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -119,7 +119,7 @@ int tipc_register_media(u32 media_type, warn("Media <%s> rejected, no broadcast address\n", name); goto exit; } - if ((bearer_priority < TIPC_MIN_LINK_PRI) && + if ((bearer_priority < TIPC_MIN_LINK_PRI) || (bearer_priority > TIPC_MAX_LINK_PRI)) { warn("Media <%s> rejected, illegal priority (%u)\n", name, bearer_priority); diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig index c6031d5..aea7e68 100644 --- a/net/wireless/Kconfig +++ b/net/wireless/Kconfig @@ -17,6 +17,23 @@ config NL80211_TESTMODE Say N. +config CFG80211_DEVELOPER_WARNINGS + bool "enable developer warnings" + depends on CFG80211 + default n + help + This option enables some additional warnings that help + cfg80211 developers and driver developers, but that can + trigger due to races with userspace. + + For example, when a driver reports that it was disconnected + from the AP, but the user disconnects manually at the same + time, the warning might trigger spuriously due to races. + + Say Y only if you are developing cfg80211 or a driver based + on it (or mac80211). + + config CFG80211_REG_DEBUG bool "cfg80211 regulatory debugging" depends on CFG80211 diff --git a/net/wireless/core.c b/net/wireless/core.c index 154e1e2..45b2be3 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -294,69 +294,17 @@ static void cfg80211_rfkill_sync_work(struct work_struct *work) cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill)); } -static void cfg80211_process_events(struct wireless_dev *wdev) -{ - struct cfg80211_event *ev; - unsigned long flags; - - spin_lock_irqsave(&wdev->event_lock, flags); - while (!list_empty(&wdev->event_list)) { - ev = list_first_entry(&wdev->event_list, - struct cfg80211_event, list); - list_del(&ev->list); - spin_unlock_irqrestore(&wdev->event_lock, flags); - - wdev_lock(wdev); - switch (ev->type) { - case EVENT_CONNECT_RESULT: - __cfg80211_connect_result( - wdev->netdev, is_zero_ether_addr(ev->cr.bssid) ? - NULL : ev->cr.bssid, - ev->cr.req_ie, ev->cr.req_ie_len, - ev->cr.resp_ie, ev->cr.resp_ie_len, - ev->cr.status, - ev->cr.status == WLAN_STATUS_SUCCESS, - NULL); - break; - case EVENT_ROAMED: - __cfg80211_roamed(wdev, ev->rm.bssid, - ev->rm.req_ie, ev->rm.req_ie_len, - ev->rm.resp_ie, ev->rm.resp_ie_len); - break; - case EVENT_DISCONNECTED: - __cfg80211_disconnected(wdev->netdev, - ev->dc.ie, ev->dc.ie_len, - ev->dc.reason, true); - break; - case EVENT_IBSS_JOINED: - __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid); - break; - } - wdev_unlock(wdev); - - kfree(ev); - - spin_lock_irqsave(&wdev->event_lock, flags); - } - spin_unlock_irqrestore(&wdev->event_lock, flags); -} - static void cfg80211_event_work(struct work_struct *work) { struct cfg80211_registered_device *rdev; - struct wireless_dev *wdev; rdev = container_of(work, struct cfg80211_registered_device, event_work); rtnl_lock(); cfg80211_lock_rdev(rdev); - mutex_lock(&rdev->devlist_mtx); - - list_for_each_entry(wdev, &rdev->netdev_list, list) - cfg80211_process_events(wdev); - mutex_unlock(&rdev->devlist_mtx); + cfg80211_process_rdev_events(rdev); cfg80211_unlock_rdev(rdev); rtnl_unlock(); } @@ -664,7 +612,7 @@ static void wdev_cleanup_work(struct work_struct *work) if (WARN_ON(rdev->scan_req && rdev->scan_req->dev == wdev->netdev)) { rdev->scan_req->aborted = true; - ___cfg80211_scan_done(rdev); + ___cfg80211_scan_done(rdev, true); } cfg80211_unlock_rdev(rdev); @@ -755,6 +703,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, default: break; } + break; + case NETDEV_DOWN: dev_hold(dev); schedule_work(&wdev->cleanup_work); break; diff --git a/net/wireless/core.h b/net/wireless/core.h index f565432..2a33d8b 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h @@ -370,8 +370,12 @@ void cfg80211_sme_scan_done(struct net_device *dev); void cfg80211_sme_rx_auth(struct net_device *dev, const u8 *buf, size_t len); void cfg80211_sme_disassoc(struct net_device *dev, int idx); void __cfg80211_scan_done(struct work_struct *wk); -void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev); +void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak); void cfg80211_upload_connect_keys(struct wireless_dev *wdev); +int cfg80211_change_iface(struct cfg80211_registered_device *rdev, + struct net_device *dev, enum nl80211_iftype ntype, + u32 *flags, struct vif_params *params); +void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev); struct ieee80211_channel * rdev_fixed_channel(struct cfg80211_registered_device *rdev, @@ -380,4 +384,15 @@ int rdev_set_freq(struct cfg80211_registered_device *rdev, struct wireless_dev *for_wdev, int freq, enum nl80211_channel_type channel_type); +#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS +#define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond) +#else +/* + * Trick to enable using it as a condition, + * and also not give a warning when it's + * not used that way. + */ +#define CFG80211_DEV_WARN_ON(cond) ({bool __r = (cond); __r; }) +#endif + #endif /* __NET_WIRELESS_CORE_H */ diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c index 42840a0..c883389 100644 --- a/net/wireless/ibss.c +++ b/net/wireless/ibss.c @@ -22,7 +22,7 @@ void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid) if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) return; - if (WARN_ON(!wdev->ssid_len)) + if (!wdev->ssid_len) return; bss = cfg80211_get_bss(wdev->wiphy, NULL, bssid, @@ -58,6 +58,8 @@ void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp) struct cfg80211_event *ev; unsigned long flags; + CFG80211_DEV_WARN_ON(!wdev->ssid_len); + ev = kzalloc(sizeof(*ev), gfp); if (!ev) return; diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index a8aaade..eddab09 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -977,12 +977,6 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) } } - if (!rdev->ops->change_virtual_intf || - !(rdev->wiphy.interface_modes & (1 << ntype))) { - err = -EOPNOTSUPP; - goto unlock; - } - if (info->attrs[NL80211_ATTR_MESH_ID]) { if (ntype != NL80211_IFTYPE_MESH_POINT) { err = -EINVAL; @@ -1008,18 +1002,10 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) } if (change) - err = rdev->ops->change_virtual_intf(&rdev->wiphy, dev, - ntype, flags, ¶ms); + err = cfg80211_change_iface(rdev, dev, ntype, flags, ¶ms); else err = 0; - WARN_ON(!err && dev->ieee80211_ptr->iftype != ntype); - - if (!err && (ntype != otype)) { - if (otype == NL80211_IFTYPE_ADHOC) - cfg80211_clear_ibss(dev, false); - } - unlock: dev_put(dev); cfg80211_unlock_rdev(rdev); @@ -2195,7 +2181,7 @@ static int nl80211_dump_mpath(struct sk_buff *skb, if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) { err = -EOPNOTSUPP; - goto out; + goto out_err; } while (1) { diff --git a/net/wireless/scan.c b/net/wireless/scan.c index fe575a2..7043de6 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -18,7 +18,7 @@ #define IEEE80211_SCAN_RESULT_EXPIRE (15 * HZ) -void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev) +void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak) { struct cfg80211_scan_request *request; struct net_device *dev; @@ -26,8 +26,13 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev) union iwreq_data wrqu; #endif + ASSERT_RDEV_LOCK(rdev); + request = rdev->scan_req; + if (!request) + return; + dev = request->dev; /* @@ -53,7 +58,17 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev) dev_put(dev); rdev->scan_req = NULL; - kfree(request); + + /* + * OK. If this is invoked with "leak" then we can't + * free this ... but we've cleaned it up anyway. The + * driver failed to call the scan_done callback, so + * all bets are off, it might still be trying to use + * the scan request or not ... if it accesses the dev + * in there (it shouldn't anyway) then it may crash. + */ + if (!leak) + kfree(request); } void __cfg80211_scan_done(struct work_struct *wk) @@ -64,7 +79,7 @@ void __cfg80211_scan_done(struct work_struct *wk) scan_done_wk); cfg80211_lock_rdev(rdev); - ___cfg80211_scan_done(rdev); + ___cfg80211_scan_done(rdev, false); cfg80211_unlock_rdev(rdev); } diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 4a8289f9..6830788 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c @@ -351,7 +351,7 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION)) return; - if (WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTING)) + if (wdev->sme_state != CFG80211_SME_CONNECTING) return; nl80211_send_connect_result(wiphy_to_dev(wdev->wiphy), dev, @@ -445,6 +445,8 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, struct cfg80211_event *ev; unsigned long flags; + CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTING); + ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp); if (!ev) return; @@ -481,7 +483,7 @@ void __cfg80211_roamed(struct wireless_dev *wdev, const u8 *bssid, if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION)) return; - if (WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED)) + if (wdev->sme_state != CFG80211_SME_CONNECTED) return; /* internal error -- how did we get to CONNECTED w/o BSS? */ @@ -540,6 +542,8 @@ void cfg80211_roamed(struct net_device *dev, const u8 *bssid, struct cfg80211_event *ev; unsigned long flags; + CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED); + ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp); if (!ev) return; @@ -575,7 +579,7 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION)) return; - if (WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED)) + if (wdev->sme_state != CFG80211_SME_CONNECTED) return; if (wdev->current_bss) { @@ -639,6 +643,8 @@ void cfg80211_disconnected(struct net_device *dev, u16 reason, struct cfg80211_event *ev; unsigned long flags; + CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED); + ev = kzalloc(sizeof(*ev) + ie_len, gfp); if (!ev) return; diff --git a/net/wireless/util.c b/net/wireless/util.c index 693275a..3fc2df8 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -574,3 +574,111 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev) kfree(wdev->connect_keys); wdev->connect_keys = NULL; } + +static void cfg80211_process_wdev_events(struct wireless_dev *wdev) +{ + struct cfg80211_event *ev; + unsigned long flags; + const u8 *bssid = NULL; + + spin_lock_irqsave(&wdev->event_lock, flags); + while (!list_empty(&wdev->event_list)) { + ev = list_first_entry(&wdev->event_list, + struct cfg80211_event, list); + list_del(&ev->list); + spin_unlock_irqrestore(&wdev->event_lock, flags); + + wdev_lock(wdev); + switch (ev->type) { + case EVENT_CONNECT_RESULT: + if (!is_zero_ether_addr(ev->cr.bssid)) + bssid = ev->cr.bssid; + __cfg80211_connect_result( + wdev->netdev, bssid, + ev->cr.req_ie, ev->cr.req_ie_len, + ev->cr.resp_ie, ev->cr.resp_ie_len, + ev->cr.status, + ev->cr.status == WLAN_STATUS_SUCCESS, + NULL); + break; + case EVENT_ROAMED: + __cfg80211_roamed(wdev, ev->rm.bssid, + ev->rm.req_ie, ev->rm.req_ie_len, + ev->rm.resp_ie, ev->rm.resp_ie_len); + break; + case EVENT_DISCONNECTED: + __cfg80211_disconnected(wdev->netdev, + ev->dc.ie, ev->dc.ie_len, + ev->dc.reason, true); + break; + case EVENT_IBSS_JOINED: + __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid); + break; + } + wdev_unlock(wdev); + + kfree(ev); + + spin_lock_irqsave(&wdev->event_lock, flags); + } + spin_unlock_irqrestore(&wdev->event_lock, flags); +} + +void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev) +{ + struct wireless_dev *wdev; + + ASSERT_RTNL(); + ASSERT_RDEV_LOCK(rdev); + + mutex_lock(&rdev->devlist_mtx); + + list_for_each_entry(wdev, &rdev->netdev_list, list) + cfg80211_process_wdev_events(wdev); + + mutex_unlock(&rdev->devlist_mtx); +} + +int cfg80211_change_iface(struct cfg80211_registered_device *rdev, + struct net_device *dev, enum nl80211_iftype ntype, + u32 *flags, struct vif_params *params) +{ + int err; + enum nl80211_iftype otype = dev->ieee80211_ptr->iftype; + + ASSERT_RDEV_LOCK(rdev); + + /* don't support changing VLANs, you just re-create them */ + if (otype == NL80211_IFTYPE_AP_VLAN) + return -EOPNOTSUPP; + + if (!rdev->ops->change_virtual_intf || + !(rdev->wiphy.interface_modes & (1 << ntype))) + return -EOPNOTSUPP; + + if (ntype != otype) { + switch (otype) { + case NL80211_IFTYPE_ADHOC: + cfg80211_leave_ibss(rdev, dev, false); + break; + case NL80211_IFTYPE_STATION: + cfg80211_disconnect(rdev, dev, + WLAN_REASON_DEAUTH_LEAVING, true); + break; + case NL80211_IFTYPE_MESH_POINT: + /* mesh should be handled? */ + break; + default: + break; + } + + cfg80211_process_rdev_events(rdev); + } + + err = rdev->ops->change_virtual_intf(&rdev->wiphy, dev, + ntype, flags, params); + + WARN_ON(!err && dev->ieee80211_ptr->iftype != ntype); + + return err; +} diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index c12029b..429dd06 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c @@ -70,18 +70,8 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, enum nl80211_iftype type; int ret; - if (!wdev) - return -EOPNOTSUPP; - rdev = wiphy_to_dev(wdev->wiphy); - if (!rdev->ops->change_virtual_intf) - return -EOPNOTSUPP; - - /* don't support changing VLANs, you just re-create them */ - if (wdev->iftype == NL80211_IFTYPE_AP_VLAN) - return -EOPNOTSUPP; - switch (*mode) { case IW_MODE_INFRA: type = NL80211_IFTYPE_STATION; @@ -104,9 +94,9 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, memset(&vifparams, 0, sizeof(vifparams)); - ret = rdev->ops->change_virtual_intf(wdev->wiphy, dev, type, - NULL, &vifparams); - WARN_ON(!ret && wdev->iftype != type); + cfg80211_lock_rdev(rdev); + ret = cfg80211_change_iface(rdev, dev, type, NULL, &vifparams); + cfg80211_unlock_rdev(rdev); return ret; } |