slmodem-2.9.11-20110321/0000755000175000000620000000000011420700264012754 5ustar marvstaffslmodem-2.9.11-20110321/b/0000755000175000017500000000000011420700264013044 5ustar marvmarvslmodem-2.9.11-20110321/b/drivers/0000755000175000017500000000000011420700264014522 5ustar marvmarvslmodem-2.9.11-20110321/b/drivers/kernel-ver.c.orig0000644000175000017500000000000011420700264017665 0ustar marvmarvslmodem-2.9.11-20110321/b/drivers/Makefile.orig0000644000175000017500000000000011420700264017107 0ustar marvmarvslmodem-2.9.11-20110321/b/drivers/Makefile.rej0000644000175000017500000000071511420700264016744 0ustar marvmarv--- a/drivers/Makefile +++ b/drivers/Makefile @@ -82,7 +82,7 @@ $(RM) ${DESTDIR}/dev/slusb$(minor) ; ) echo -n else -ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) +ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/generated/utsrelease.h $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) slusb-objs:= old_st7554.o obj:=. slmodem-2.9.11-20110321/b/drivers/kernel-ver.c.rej0000644000175000017500000000060311420700264017516 0ustar marvmarv--- a/drivers/kernel-ver.c +++ b/drivers/kernel-ver.c @@ -5,9 +5,13 @@ #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33) +#include +#else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) #include -#endif +#endif // KERNEL_VERSION(2,6,18) +#endif // KERNEL_VERSION(2,6,33) int main() { slmodem-2.9.11-20110321/patches/0000755000175000000620000000000011542156632014414 5ustar marvstaffslmodem-2.9.11-20110321/patches/alsa-linux-2.6.0.patch0000644000175000000620000014144310773430100020150 0ustar marvstaffdiff -Nru linux-2.6.0_orig/include/sound/ac97_codec.h linux-2.6.0/include/sound/ac97_codec.h --- linux-2.6.0_orig/include/sound/ac97_codec.h 2003-12-28 22:18:44.000000000 +0200 +++ linux-2.6.0/include/sound/ac97_codec.h 2003-12-28 22:29:43.000000000 +0200 @@ -180,6 +180,24 @@ #define AC97_MEA_PRG 0x4000 /* HADC power down (high) */ #define AC97_MEA_PRH 0x8000 /* HDAC power down (high) */ +/* modem gpio status defines */ +#define AC97_GPIO_LINE1_OH 0x0001 /* Off Hook Line1 */ +#define AC97_GPIO_LINE1_RI 0x0002 /* Ring Detect Line1 */ +#define AC97_GPIO_LINE1_CID 0x0004 /* Caller ID path enable Line1 */ +#define AC97_GPIO_LINE1_LCS 0x0008 /* Loop Current Sense Line1 */ +#define AC97_GPIO_LINE1_PULSE 0x0010 /* Opt./ Pulse Dial Line1 (out) */ +#define AC97_GPIO_LINE1_HL1R 0x0020 /* Opt./ Handset to Line1 relay control (out) */ +#define AC97_GPIO_LINE1_HOHD 0x0040 /* Opt./ Handset off hook detect Line1 (in) */ +#define AC97_GPIO_LINE12_AC 0x0080 /* Opt./ Int.bit 1 / Line1/2 AC (out) */ +#define AC97_GPIO_LINE12_DC 0x0100 /* Opt./ Int.bit 2 / Line1/2 DC (out) */ +#define AC97_GPIO_LINE12_RS 0x0200 /* Opt./ Int.bit 3 / Line1/2 RS (out) */ +#define AC97_GPIO_LINE2_OH 0x0400 /* Off Hook Line2 */ +#define AC97_GPIO_LINE2_RI 0x0800 /* Ring Detect Line2 */ +#define AC97_GPIO_LINE2_CID 0x1000 /* Caller ID path enable Line2 */ +#define AC97_GPIO_LINE2_LCS 0x2000 /* Loop Current Sense Line2 */ +#define AC97_GPIO_LINE2_PULSE 0x4000 /* Opt./ Pulse Dial Line2 (out) */ +#define AC97_GPIO_LINE2_HL1R 0x8000 /* Opt./ Handset to Line2 relay control (out) */ + /* specific - SigmaTel */ #define AC97_SIGMATEL_ANALOG 0x6c /* Analog Special */ #define AC97_SIGMATEL_DAC2INVERT 0x6e diff -Nru linux-2.6.0_orig/sound/pci/ac97/ac97_codec.c linux-2.6.0/sound/pci/ac97/ac97_codec.c --- linux-2.6.0_orig/sound/pci/ac97/ac97_codec.c 2003-12-28 22:18:44.000000000 +0200 +++ linux-2.6.0/sound/pci/ac97/ac97_codec.c 2003-12-28 22:29:43.000000000 +0200 @@ -143,7 +143,7 @@ { 0x4e534331, 0xffffffff, "LM4549", NULL, NULL }, { 0x4e534350, 0xffffffff, "LM4550", NULL, NULL }, { 0x50534304, 0xffffffff, "UCB1400", NULL, NULL }, -{ 0x53494c20, 0xffffffe0, "Si3036/8", NULL, NULL }, +{ 0x53494c20, 0xffffffe0, "Si3036/8", NULL, mpatch_si3036 }, { 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, { 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, { 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99] @@ -1492,6 +1492,12 @@ static int snd_ac97_modem_build(snd_card_t * card, ac97_t * ac97) { /* TODO */ + //printk("AC97_GPIO_CFG = %x\n",snd_ac97_read(ac97,AC97_GPIO_CFG)); + snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH)); + snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH)); + snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff); + snd_ac97_write(ac97, AC97_GPIO_WAKEUP, 0x0); + snd_ac97_write(ac97, AC97_MISC_AFE, 0x0); return 0; } diff -Nru linux-2.6.0_orig/sound/pci/ac97/ac97_patch.c linux-2.6.0/sound/pci/ac97/ac97_patch.c --- linux-2.6.0_orig/sound/pci/ac97/ac97_patch.c 2003-12-28 22:18:44.000000000 +0200 +++ linux-2.6.0/sound/pci/ac97/ac97_patch.c 2003-12-28 22:29:43.000000000 +0200 @@ -1099,3 +1099,14 @@ ac97->build_ops = &patch_vt1616_ops; return 0; } + +/* Si3036/8 specific registers */ +#define AC97_SI3036_CHIP_ID 0x5a + +int mpatch_si3036(ac97_t * ac97) +{ + //printk("mpatch_si3036: chip id = %x\n", snd_ac97_read(ac97, 0x5a)); + snd_ac97_write_cache(ac97, 0x5c, 0xf210 ); + snd_ac97_write_cache(ac97, 0x68, 0); + return 0; +} diff -Nru linux-2.6.0_orig/sound/pci/ac97/ac97_patch.h linux-2.6.0/sound/pci/ac97/ac97_patch.h --- linux-2.6.0_orig/sound/pci/ac97/ac97_patch.h 2003-12-28 22:18:44.000000000 +0200 +++ linux-2.6.0/sound/pci/ac97/ac97_patch.h 2003-12-28 22:29:43.000000000 +0200 @@ -47,3 +47,5 @@ int patch_cm9738(ac97_t * ac97); int patch_cm9739(ac97_t * ac97); int patch_vt1616(ac97_t * ac97); +int mpatch_si3036(ac97_t * ac97); + diff -Nru linux-2.6.0_orig/sound/pci/intel8x0m.c linux-2.6.0/sound/pci/intel8x0m.c --- linux-2.6.0_orig/sound/pci/intel8x0m.c 1970-01-01 02:00:00.000000000 +0200 +++ linux-2.6.0/sound/pci/intel8x0m.c 2003-12-28 22:30:09.000000000 +0200 @@ -0,0 +1,1488 @@ +/* + * ALSA modem driver for Intel ICH (i8x0) chipsets + * + * Copyright (c) 2000 Jaroslav Kysela + * + * This is modified (by Sasha Khapyorsky ) version + * of ALSA ICH sound driver intel8x0.c . + * + * + * 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 + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define SNDRV_GET_ID +#include + +MODULE_AUTHOR("Jaroslav Kysela "); +MODULE_DESCRIPTION("Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440 modem"); +MODULE_LICENSE("GPL"); +MODULE_CLASSES("{sound}"); +MODULE_DEVICES("{{Intel,82801AA-ICH}," + "{Intel,82901AB-ICH0}," + "{Intel,82801BA-ICH2}," + "{Intel,82801CA-ICH3}," + "{Intel,82801DB-ICH4}," + "{Intel,ICH5}," + "{Intel,MX440}}"); + + +static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ +static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ +static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ +static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; + +MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(index, "Index value for Intel i8x0 modemcard."); +MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC); +MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s"); +MODULE_PARM_DESC(id, "ID string for Intel i8x0 modemcard."); +MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC); +MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(enable, "Enable Intel i8x0 modemcard."); +MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); +MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (0 = auto-detect)."); +MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:0"); + +/* + * Direct registers + */ + +#ifndef PCI_DEVICE_ID_INTEL_82801_6 +#define PCI_DEVICE_ID_INTEL_82801_6 0x2416 +#endif +#ifndef PCI_DEVICE_ID_INTEL_82901_6 +#define PCI_DEVICE_ID_INTEL_82901_6 0x2426 +#endif +#ifndef PCI_DEVICE_ID_INTEL_82801BA_6 +#define PCI_DEVICE_ID_INTEL_82801BA_6 0x2446 +#endif +#ifndef PCI_DEVICE_ID_INTEL_440MX_6 +#define PCI_DEVICE_ID_INTEL_440MX_6 0x7196 +#endif +#ifndef PCI_DEVICE_ID_INTEL_ICH3_6 +#define PCI_DEVICE_ID_INTEL_ICH3_6 0x2486 +#endif +#ifndef PCI_DEVICE_ID_INTEL_ICH4_6 +#define PCI_DEVICE_ID_INTEL_ICH4_6 0x24c6 +#endif +#ifndef PCI_DEVICE_ID_INTEL_ICH5_6 +#define PCI_DEVICE_ID_INTEL_ICH5_6 0x24d6 +#endif +#ifndef PCI_DEVICE_ID_SI_7013 +#define PCI_DEVICE_ID_SI_7013 0x7013 +#endif +#if 0 +#ifndef PCI_DEVICE_ID_NVIDIA_MCP_AUDIO +#define PCI_DEVICE_ID_NVIDIA_MCP_AUDIO 0x01b1 +#endif +#ifndef PCI_DEVICE_ID_NVIDIA_MCP2_AUDIO +#define PCI_DEVICE_ID_NVIDIA_MCP2_AUDIO 0x006a +#endif +#ifndef PCI_DEVICE_ID_NVIDIA_MCP3_AUDIO +#define PCI_DEVICE_ID_NVIDIA_MCP3_AUDIO 0x00da +#endif +#endif + +enum { DEVICE_INTEL, DEVICE_SIS, DEVICE_ALI, DEVICE_NFORCE }; + +#define ICHREG(x) ICH_REG_##x + +#define DEFINE_REGSET(name,base) \ +enum { \ + ICH_REG_##name##_BDBAR = base + 0x0, /* dword - buffer descriptor list base address */ \ + ICH_REG_##name##_CIV = base + 0x04, /* byte - current index value */ \ + ICH_REG_##name##_LVI = base + 0x05, /* byte - last valid index */ \ + ICH_REG_##name##_SR = base + 0x06, /* byte - status register */ \ + ICH_REG_##name##_PICB = base + 0x08, /* word - position in current buffer */ \ + ICH_REG_##name##_PIV = base + 0x0a, /* byte - prefetched index value */ \ + ICH_REG_##name##_CR = base + 0x0b, /* byte - control register */ \ +}; + +/* busmaster blocks */ +DEFINE_REGSET(OFF, 0); /* offset */ + +/* values for each busmaster block */ + +/* LVI */ +#define ICH_REG_LVI_MASK 0x1f + +/* SR */ +#define ICH_FIFOE 0x10 /* FIFO error */ +#define ICH_BCIS 0x08 /* buffer completion interrupt status */ +#define ICH_LVBCI 0x04 /* last valid buffer completion interrupt */ +#define ICH_CELV 0x02 /* current equals last valid */ +#define ICH_DCH 0x01 /* DMA controller halted */ + +/* PIV */ +#define ICH_REG_PIV_MASK 0x1f /* mask */ + +/* CR */ +#define ICH_IOCE 0x10 /* interrupt on completion enable */ +#define ICH_FEIE 0x08 /* fifo error interrupt enable */ +#define ICH_LVBIE 0x04 /* last valid buffer interrupt enable */ +#define ICH_RESETREGS 0x02 /* reset busmaster registers */ +#define ICH_STARTBM 0x01 /* start busmaster operation */ + + +/* global block */ +#define ICH_REG_GLOB_CNT 0x3c /* dword - global control */ +#define ICH_TRIE 0x00000040 /* tertiary resume interrupt enable */ +#define ICH_SRIE 0x00000020 /* secondary resume interrupt enable */ +#define ICH_PRIE 0x00000010 /* primary resume interrupt enable */ +#define ICH_ACLINK 0x00000008 /* AClink shut off */ +#define ICH_AC97WARM 0x00000004 /* AC'97 warm reset */ +#define ICH_AC97COLD 0x00000002 /* AC'97 cold reset */ +#define ICH_GIE 0x00000001 /* GPI interrupt enable */ +#define ICH_REG_GLOB_STA 0x40 /* dword - global status */ +#define ICH_TRI 0x20000000 /* ICH4: tertiary (AC_SDIN2) resume interrupt */ +#define ICH_TCR 0x10000000 /* ICH4: tertiary (AC_SDIN2) codec ready */ +#define ICH_BCS 0x08000000 /* ICH4: bit clock stopped */ +#define ICH_SPINT 0x04000000 /* ICH4: S/PDIF interrupt */ +#define ICH_P2INT 0x02000000 /* ICH4: PCM2-In interrupt */ +#define ICH_M2INT 0x01000000 /* ICH4: Mic2-In interrupt */ +#define ICH_SAMPLE_CAP 0x00c00000 /* ICH4: sample capability bits (RO) */ +#define ICH_MULTICHAN_CAP 0x00300000 /* ICH4: multi-channel capability bits (RO) */ +#define ICH_MD3 0x00020000 /* modem power down semaphore */ +#define ICH_AD3 0x00010000 /* audio power down semaphore */ +#define ICH_RCS 0x00008000 /* read completion status */ +#define ICH_BIT3 0x00004000 /* bit 3 slot 12 */ +#define ICH_BIT2 0x00002000 /* bit 2 slot 12 */ +#define ICH_BIT1 0x00001000 /* bit 1 slot 12 */ +#define ICH_SRI 0x00000800 /* secondary (AC_SDIN1) resume interrupt */ +#define ICH_PRI 0x00000400 /* primary (AC_SDIN0) resume interrupt */ +#define ICH_SCR 0x00000200 /* secondary (AC_SDIN1) codec ready */ +#define ICH_PCR 0x00000100 /* primary (AC_SDIN0) codec ready */ +#define ICH_MCINT 0x00000080 /* MIC capture interrupt */ +#define ICH_POINT 0x00000040 /* playback interrupt */ +#define ICH_PIINT 0x00000020 /* capture interrupt */ +#define ICH_NVSPINT 0x00000010 /* nforce spdif interrupt */ +#define ICH_MOINT 0x00000004 /* modem playback interrupt */ +#define ICH_MIINT 0x00000002 /* modem capture interrupt */ +#define ICH_GSCI 0x00000001 /* GPI status change interrupt */ +#define ICH_REG_ACC_SEMA 0x44 /* byte - codec write semaphore */ +#define ICH_CAS 0x01 /* codec access semaphore */ + +#define ICH_MAX_FRAGS 32 /* max hw frags */ + + +/* + * + */ + +enum { ICHD_MDMIN, ICHD_MDMOUT, ICHD_MDMLAST = ICHD_MDMOUT }; +enum { ALID_MDMIN, ALID_MDMOUT, ALID_MDMLAST = ALID_MDMOUT }; + +#define get_ichdev(substream) (ichdev_t *)(substream->runtime->private_data) + +typedef struct { + unsigned int ichd; /* ich device number */ + unsigned long reg_offset; /* offset to bmaddr */ + u32 *bdbar; /* CPU address (32bit) */ + unsigned int bdbar_addr; /* PCI bus address (32bit) */ + snd_pcm_substream_t *substream; + unsigned int physbuf; /* physical address (32bit) */ + unsigned int size; + unsigned int fragsize; + unsigned int fragsize1; + unsigned int position; + int frags; + int lvi; + int lvi_frag; + int civ; + int ack; + int ack_reload; + unsigned int ack_bit; + unsigned int roff_sr; + unsigned int roff_picb; + unsigned int int_sta_mask; /* interrupt status mask */ + unsigned int ali_slot; /* ALI DMA slot */ + ac97_t *ac97; +} ichdev_t; + +typedef struct _snd_intel8x0m intel8x0_t; +#define chip_t intel8x0_t + +struct _snd_intel8x0m { + unsigned int device_type; + char ac97_name[64]; + char ctrl_name[64]; + + int irq; + + unsigned int mmio; + unsigned long addr; + unsigned long remap_addr; + struct resource *res; + unsigned int bm_mmio; + unsigned long bmaddr; + unsigned long remap_bmaddr; + struct resource *res_bm; + + struct pci_dev *pci; + snd_card_t *card; + + int pcm_devs; + snd_pcm_t *pcm[2]; + ichdev_t ichd[2]; + + int in_ac97_init: 1; + + ac97_t *ac97[3]; + + spinlock_t reg_lock; + spinlock_t ac97_lock; + + u32 bdbars_count; + u32 *bdbars; + dma_addr_t bdbars_addr; + u32 int_sta_reg; /* interrupt status register */ + u32 int_sta_mask; /* interrupt status mask */ + unsigned int pcm_pos_shift; + +#ifdef CONFIG_PM + int in_suspend; +#endif +}; + +static struct pci_device_id snd_intel8x0m_ids[] = { + { 0x8086, 0x2416, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801AA */ + { 0x8086, 0x2426, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82901AB */ + { 0x8086, 0x2446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801BA */ + { 0x8086, 0x2486, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH3 */ + { 0x8086, 0x24c6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH4 */ + { 0x8086, 0x24d6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH5 */ + { 0x8086, 0x7196, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 440MX */ + { 0x1022, 0x7446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */ +#if 0 + /* TODO: support needed */ + { 0x1039, 0x7013, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_SIS }, /* SI7013 */ + { 0x10de, 0x01b1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE */ + { 0x10de, 0x006a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE2 */ + { 0x10de, 0x00da, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */ + { 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */ + { 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */ +#endif + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, snd_intel8x0m_ids); + +/* + * Lowlevel I/O - busmaster + */ + +static u8 igetbyte(intel8x0_t *chip, u32 offset) +{ + if (chip->bm_mmio) + return readb(chip->remap_bmaddr + offset); + else + return inb(chip->bmaddr + offset); +} + +static u16 igetword(intel8x0_t *chip, u32 offset) +{ + if (chip->bm_mmio) + return readw(chip->remap_bmaddr + offset); + else + return inw(chip->bmaddr + offset); +} + +static u32 igetdword(intel8x0_t *chip, u32 offset) +{ + if (chip->bm_mmio) + return readl(chip->remap_bmaddr + offset); + else + return inl(chip->bmaddr + offset); +} + +static void iputbyte(intel8x0_t *chip, u32 offset, u8 val) +{ + if (chip->bm_mmio) + writeb(val, chip->remap_bmaddr + offset); + else + outb(val, chip->bmaddr + offset); +} + +static void iputdword(intel8x0_t *chip, u32 offset, u32 val) +{ + if (chip->bm_mmio) + writel(val, chip->remap_bmaddr + offset); + else + outl(val, chip->bmaddr + offset); +} + +/* + * Lowlevel I/O - AC'97 registers + */ + +static u16 iagetword(intel8x0_t *chip, u32 offset) +{ + if (chip->mmio) + return readw(chip->remap_addr + offset); + else + return inw(chip->addr + offset); +} + +static void iaputword(intel8x0_t *chip, u32 offset, u16 val) +{ + if (chip->mmio) + writew(val, chip->remap_addr + offset); + else + outw(val, chip->addr + offset); +} + +/* + * Basic I/O + */ + +/* + * access to AC97 codec via normal i/o (for ICH and SIS7013) + */ + +/* return the GLOB_STA bit for the corresponding codec */ +static unsigned int get_ich_codec_bit(intel8x0_t *chip, unsigned int codec) +{ + static unsigned int codec_bit[3] = { + ICH_PCR, ICH_SCR, ICH_TCR + }; + snd_assert(codec < 3, return ICH_PCR); + return codec_bit[codec]; +} + +static int snd_intel8x0m_codec_semaphore(intel8x0_t *chip, unsigned int codec) +{ + int time; + + if (codec > 1) + return -EIO; + codec = get_ich_codec_bit(chip, codec); + + /* codec ready ? */ + if ((igetdword(chip, ICHREG(GLOB_STA)) & codec) == 0) + return -EIO; + + /* Anyone holding a semaphore for 1 msec should be shot... */ + time = 100; + do { + if (!(igetbyte(chip, ICHREG(ACC_SEMA)) & ICH_CAS)) + return 0; + udelay(10); + } while (time--); + + /* access to some forbidden (non existant) ac97 registers will not + * reset the semaphore. So even if you don't get the semaphore, still + * continue the access. We don't need the semaphore anyway. */ + snd_printk("codec_semaphore: semaphore is not ready [0x%x][0x%x]\n", + igetbyte(chip, ICHREG(ACC_SEMA)), igetdword(chip, ICHREG(GLOB_STA))); + iagetword(chip, 0); /* clear semaphore flag */ + /* I don't care about the semaphore */ + return -EBUSY; +} + +static void snd_intel8x0_codec_write(ac97_t *ac97, + unsigned short reg, + unsigned short val) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, ac97->private_data, return); + + spin_lock(&chip->ac97_lock); + if (snd_intel8x0m_codec_semaphore(chip, ac97->num) < 0) { + if (! chip->in_ac97_init) + snd_printk("codec_write %d: semaphore is not ready for register 0x%x\n", ac97->num, reg); + } + iaputword(chip, reg + ac97->num * 0x80, val); + spin_unlock(&chip->ac97_lock); +} + +static unsigned short snd_intel8x0_codec_read(ac97_t *ac97, + unsigned short reg) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, ac97->private_data, return ~0); + unsigned short res; + unsigned int tmp; + + spin_lock(&chip->ac97_lock); + if (snd_intel8x0m_codec_semaphore(chip, ac97->num) < 0) { + if (! chip->in_ac97_init) + snd_printk("codec_read %d: semaphore is not ready for register 0x%x\n", ac97->num, reg); + res = 0xffff; + } else { + res = iagetword(chip, reg + ac97->num * 0x80); + if ((tmp = igetdword(chip, ICHREG(GLOB_STA))) & ICH_RCS) { + /* reset RCS and preserve other R/WC bits */ + iputdword(chip, ICHREG(GLOB_STA), tmp & ~(ICH_SRI|ICH_PRI|ICH_TRI|ICH_GSCI)); + if (! chip->in_ac97_init) + snd_printk("codec_read %d: read timeout for register 0x%x\n", ac97->num, reg); + res = 0xffff; + } + } + spin_unlock(&chip->ac97_lock); + return res; +} + + +/* + * DMA I/O + */ +static void snd_intel8x0_setup_periods(intel8x0_t *chip, ichdev_t *ichdev) +{ + int idx; + u32 *bdbar = ichdev->bdbar; + unsigned long port = ichdev->reg_offset; + + iputdword(chip, port + ICH_REG_OFF_BDBAR, ichdev->bdbar_addr); + if (ichdev->size == ichdev->fragsize) { + ichdev->ack_reload = ichdev->ack = 2; + ichdev->fragsize1 = ichdev->fragsize >> 1; + for (idx = 0; idx < (ICH_REG_LVI_MASK + 1) * 2; idx += 4) { + bdbar[idx + 0] = cpu_to_le32(ichdev->physbuf); + bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */ + ichdev->fragsize1 >> chip->pcm_pos_shift); + bdbar[idx + 2] = cpu_to_le32(ichdev->physbuf + (ichdev->size >> 1)); + bdbar[idx + 3] = cpu_to_le32(0x80000000 | /* interrupt on completion */ + ichdev->fragsize1 >> chip->pcm_pos_shift); + } + ichdev->frags = 2; + } else { + ichdev->ack_reload = ichdev->ack = 1; + ichdev->fragsize1 = ichdev->fragsize; + for (idx = 0; idx < (ICH_REG_LVI_MASK + 1) * 2; idx += 2) { + bdbar[idx + 0] = cpu_to_le32(ichdev->physbuf + (((idx >> 1) * ichdev->fragsize) % ichdev->size)); + bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */ + ichdev->fragsize >> chip->pcm_pos_shift); + // printk("bdbar[%i] = 0x%x [0x%x]\n", idx + 0, bdbar[idx + 0], bdbar[idx + 1]); + } + ichdev->frags = ichdev->size / ichdev->fragsize; + } + iputbyte(chip, port + ICH_REG_OFF_LVI, ichdev->lvi = ICH_REG_LVI_MASK); + ichdev->civ = 0; + iputbyte(chip, port + ICH_REG_OFF_CIV, 0); + ichdev->lvi_frag = ICH_REG_LVI_MASK % ichdev->frags; + ichdev->position = 0; +#if 0 + printk("lvi_frag = %i, frags = %i, period_size = 0x%x, period_size1 = 0x%x\n", + ichdev->lvi_frag, ichdev->frags, ichdev->fragsize, ichdev->fragsize1); +#endif + /* clear interrupts */ + iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); +} + +/* + * Interrupt handler + */ + +static inline void snd_intel8x0_update(intel8x0_t *chip, ichdev_t *ichdev) +{ + unsigned long port = ichdev->reg_offset; + int civ, i, step; + int ack = 0; + + civ = igetbyte(chip, port + ICH_REG_OFF_CIV); + if (civ == ichdev->civ) { + // snd_printd("civ same %d\n", civ); + step = 1; + ichdev->civ++; + ichdev->civ &= ICH_REG_LVI_MASK; + } else { + step = civ - ichdev->civ; + if (step < 0) + step += ICH_REG_LVI_MASK + 1; + // if (step != 1) + // snd_printd("step = %d, %d -> %d\n", step, ichdev->civ, civ); + ichdev->civ = civ; + } + + ichdev->position += step * ichdev->fragsize1; + ichdev->position %= ichdev->size; + ichdev->lvi += step; + ichdev->lvi &= ICH_REG_LVI_MASK; + iputbyte(chip, port + ICH_REG_OFF_LVI, ichdev->lvi); + for (i = 0; i < step; i++) { + ichdev->lvi_frag++; + ichdev->lvi_frag %= ichdev->frags; + ichdev->bdbar[ichdev->lvi * 2] = cpu_to_le32(ichdev->physbuf + ichdev->lvi_frag * ichdev->fragsize1); + // printk("new: bdbar[%i] = 0x%x [0x%x], prefetch = %i, all = 0x%x, 0x%x\n", ichdev->lvi * 2, ichdev->bdbar[ichdev->lvi * 2], ichdev->bdbar[ichdev->lvi * 2 + 1], inb(ICH_REG_OFF_PIV + port), inl(port + 4), inb(port + ICH_REG_OFF_CR)); + if (--ichdev->ack == 0) { + ichdev->ack = ichdev->ack_reload; + ack = 1; + } + } + if (ack && ichdev->substream) { + spin_unlock(&chip->reg_lock); + snd_pcm_period_elapsed(ichdev->substream); + spin_lock(&chip->reg_lock); + } + iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); +} + +static irqreturn_t snd_intel8x0_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, dev_id, return IRQ_NONE); + ichdev_t *ichdev; + unsigned int status; + unsigned int i; + + spin_lock(&chip->reg_lock); + status = igetdword(chip, chip->int_sta_reg); + if ((status & chip->int_sta_mask) == 0) { + if (status) + iputdword(chip, chip->int_sta_reg, status); + spin_unlock(&chip->reg_lock); + return IRQ_NONE; + } + + for (i = 0; i < chip->bdbars_count; i++) { + ichdev = &chip->ichd[i]; + if (status & ichdev->int_sta_mask) + snd_intel8x0_update(chip, ichdev); + } + + /* ack them */ + iputdword(chip, chip->int_sta_reg, status & chip->int_sta_mask); + spin_unlock(&chip->reg_lock); + + return IRQ_HANDLED; +} + +/* + * PCM part + */ + +static int snd_intel8x0_pcm_trigger(snd_pcm_substream_t *substream, int cmd) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + ichdev_t *ichdev = get_ichdev(substream); + unsigned char val = 0; + unsigned long port = ichdev->reg_offset; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + val = ICH_IOCE | ICH_STARTBM; + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + val = 0; + break; + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + val = ICH_IOCE; + break; + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + val = ICH_IOCE | ICH_STARTBM; + break; + default: + return -EINVAL; + } + iputbyte(chip, port + ICH_REG_OFF_CR, val); + if (cmd == SNDRV_PCM_TRIGGER_STOP) { + /* wait until DMA stopped */ + while (!(igetbyte(chip, port + ichdev->roff_sr) & ICH_DCH)) ; + /* reset whole DMA things */ + iputbyte(chip, port + ICH_REG_OFF_CR, ICH_RESETREGS); + } + return 0; +} + +static int snd_intel8x0_hw_params(snd_pcm_substream_t * substream, + snd_pcm_hw_params_t * hw_params) +{ + return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); +} + +static int snd_intel8x0_hw_free(snd_pcm_substream_t * substream) +{ + return snd_pcm_lib_free_pages(substream); +} + +static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(snd_pcm_substream_t * substream) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + ichdev_t *ichdev = get_ichdev(substream); + size_t ptr1, ptr; + + ptr1 = igetword(chip, ichdev->reg_offset + ichdev->roff_picb) << chip->pcm_pos_shift; + if (ptr1 != 0) + ptr = ichdev->fragsize1 - ptr1; + else + ptr = 0; + ptr += ichdev->position; + if (ptr >= ichdev->size) + return 0; + return bytes_to_frames(substream->runtime, ptr); +} + +static int snd_intel8x0m_pcm_trigger(snd_pcm_substream_t *substream, int cmd) +{ + ichdev_t *ichdev = get_ichdev(substream); + /* hook off/on on start/stop */ + /* TODO: move it to ac97 controls */ + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + snd_ac97_update_bits(ichdev->ac97, AC97_GPIO_STATUS, + AC97_GPIO_LINE1_OH, AC97_GPIO_LINE1_OH); + break; + case SNDRV_PCM_TRIGGER_STOP: + snd_ac97_update_bits(ichdev->ac97, AC97_GPIO_STATUS, + AC97_GPIO_LINE1_OH, ~AC97_GPIO_LINE1_OH); + break; + default: + return -EINVAL; + } + return snd_intel8x0_pcm_trigger(substream,cmd); +} + +static int snd_intel8x0m_pcm_prepare(snd_pcm_substream_t * substream) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + snd_pcm_runtime_t *runtime = substream->runtime; + ichdev_t *ichdev = get_ichdev(substream); + + ichdev->physbuf = runtime->dma_addr; + ichdev->size = snd_pcm_lib_buffer_bytes(substream); + ichdev->fragsize = snd_pcm_lib_period_bytes(substream); + snd_ac97_write(ichdev->ac97, AC97_LINE1_RATE, runtime->rate); + snd_ac97_write(ichdev->ac97, AC97_LINE1_LEVEL, 0); + snd_intel8x0_setup_periods(chip, ichdev); + return 0; +} + +static snd_pcm_hardware_t snd_intel8x0m_stream = +{ + .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_PAUSE | + SNDRV_PCM_INFO_RESUME), + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_KNOT, + .rate_min = 8000, + .rate_max = 16000, + .channels_min = 1, + .channels_max = 1, + .buffer_bytes_max = 32 * 1024, + .period_bytes_min = 32, + .period_bytes_max = 32 * 1024, + .periods_min = 1, + .periods_max = 1024, + .fifo_size = 0, +}; + + +static int snd_intel8x0m_pcm_open(snd_pcm_substream_t * substream, ichdev_t *ichdev) +{ + static unsigned int rates[] = { 8000, 9600, 12000, 16000 }; + static snd_pcm_hw_constraint_list_t hw_constraints_rates = { + .count = ARRAY_SIZE(rates), + .list = rates, + .mask = 0, + }; + snd_pcm_runtime_t *runtime = substream->runtime; + int err; + + ichdev->substream = substream; + runtime->hw = snd_intel8x0m_stream; + err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates); + if ( err < 0 ) + return err; + runtime->private_data = ichdev; + return 0; +} + +static int snd_intel8x0m_playback_open(snd_pcm_substream_t * substream) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + + return snd_intel8x0m_pcm_open(substream, &chip->ichd[ICHD_MDMOUT]); +} + +static int snd_intel8x0m_playback_close(snd_pcm_substream_t * substream) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + + chip->ichd[ICHD_MDMOUT].substream = NULL; + return 0; +} + +static int snd_intel8x0m_capture_open(snd_pcm_substream_t * substream) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + + return snd_intel8x0m_pcm_open(substream, &chip->ichd[ICHD_MDMIN]); +} + +static int snd_intel8x0m_capture_close(snd_pcm_substream_t * substream) +{ + intel8x0_t *chip = snd_pcm_substream_chip(substream); + + chip->ichd[ICHD_MDMIN].substream = NULL; + return 0; +} + + +static snd_pcm_ops_t snd_intel8x0m_playback_ops = { + .open = snd_intel8x0m_playback_open, + .close = snd_intel8x0m_playback_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = snd_intel8x0_hw_params, + .hw_free = snd_intel8x0_hw_free, + .prepare = snd_intel8x0m_pcm_prepare, + .trigger = snd_intel8x0m_pcm_trigger, + .pointer = snd_intel8x0_pcm_pointer, +}; + +static snd_pcm_ops_t snd_intel8x0m_capture_ops = { + .open = snd_intel8x0m_capture_open, + .close = snd_intel8x0m_capture_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = snd_intel8x0_hw_params, + .hw_free = snd_intel8x0_hw_free, + .prepare = snd_intel8x0m_pcm_prepare, + .trigger = snd_intel8x0m_pcm_trigger, + .pointer = snd_intel8x0_pcm_pointer, +}; + + +struct ich_pcm_table { + char *suffix; + snd_pcm_ops_t *playback_ops; + snd_pcm_ops_t *capture_ops; + size_t prealloc_size; + size_t prealloc_max_size; + int ac97_idx; +}; + +static int __devinit snd_intel8x0_pcm1(intel8x0_t *chip, int device, struct ich_pcm_table *rec) +{ + snd_pcm_t *pcm; + int err; + char name[32]; + + if (rec->suffix) + sprintf(name, "Intel ICH - %s", rec->suffix); + else + strcpy(name, "Intel ICH"); + err = snd_pcm_new(chip->card, name, device, + rec->playback_ops ? 1 : 0, + rec->capture_ops ? 1 : 0, &pcm); + if (err < 0) + return err; + + if (rec->playback_ops) + snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, rec->playback_ops); + if (rec->capture_ops) + snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, rec->capture_ops); + + pcm->private_data = chip; + pcm->info_flags = 0; + if (rec->suffix) + sprintf(pcm->name, "%s - %s", chip->card->shortname, rec->suffix); + else + strcpy(pcm->name, chip->card->shortname); + chip->pcm[device] = pcm; + + snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, rec->prealloc_size, + rec->prealloc_max_size); + + return 0; +} + +static struct ich_pcm_table intel_pcms[] __devinitdata = { + { + .suffix = "Modem", + .playback_ops = &snd_intel8x0m_playback_ops, + .capture_ops = &snd_intel8x0m_capture_ops, + .prealloc_size = 4 * 1024, + .prealloc_max_size = 16 * 1024, + }, +}; + +static int __devinit snd_intel8x0_pcm(intel8x0_t *chip) +{ + int i, tblsize, device, err; + struct ich_pcm_table *tbl, *rec; + +#if 1 + tbl = intel_pcms; + tblsize = 1; +#else + switch (chip->device_type) { + case DEVICE_NFORCE: + tbl = nforce_pcms; + tblsize = ARRAY_SIZE(nforce_pcms); + break; + case DEVICE_ALI: + tbl = ali_pcms; + tblsize = ARRAY_SIZE(ali_pcms); + break; + default: + tbl = intel_pcms; + tblsize = 2; + break; + } +#endif + device = 0; + for (i = 0; i < tblsize; i++) { + rec = tbl + i; + if (i > 0 && rec->ac97_idx) { + /* activate PCM only when associated AC'97 codec */ + if (! chip->ichd[rec->ac97_idx].ac97) + continue; + } + err = snd_intel8x0_pcm1(chip, device, rec); + if (err < 0) + return err; + device++; + } + + chip->pcm_devs = device; + return 0; +} + + +/* + * Mixer part + */ + +static void snd_intel8x0_mixer_free_ac97(ac97_t *ac97) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, ac97->private_data, return); + chip->ac97[ac97->num] = NULL; +} + + +static int __devinit snd_intel8x0_mixer(intel8x0_t *chip, int ac97_clock) +{ + ac97_t ac97, *x97; + int err; + unsigned int i; + unsigned int glob_sta = 0; + + chip->in_ac97_init = 1; + memset(&ac97, 0, sizeof(ac97)); + ac97.private_data = chip; + ac97.private_free = snd_intel8x0_mixer_free_ac97; + if (ac97_clock >= 8000 && ac97_clock <= 48000) + ac97.clock = ac97_clock; + else + ac97.clock = 48000; + + glob_sta = igetdword(chip, ICHREG(GLOB_STA)); + ac97.write = snd_intel8x0_codec_write; + ac97.read = snd_intel8x0_codec_read; + ac97.pci = chip->pci; + + i = glob_sta & ICH_SCR ? 1 : 0; + ac97.num = i; + if ((err = snd_ac97_modem(chip->card, &ac97, &x97)) < 0) { + snd_printk(KERN_ERR "Unable to initialize codec #%d\n", i); + goto __err; + } + chip->ac97[i] = x97; + if(ac97_is_modem(x97)) { + chip->ichd[ICHD_MDMIN].ac97 = x97; + chip->ichd[ICHD_MDMOUT].ac97 = x97; + } + chip->in_ac97_init = 0; + return 0; + + __err: + /* clear the cold-reset bit for the next chance */ + if (chip->device_type != DEVICE_ALI) + iputdword(chip, ICHREG(GLOB_CNT), igetdword(chip, ICHREG(GLOB_CNT)) & ~ICH_AC97COLD); + return err; +} + + +/* + * + */ + +#define do_delay(chip) do {\ + set_current_state(TASK_UNINTERRUPTIBLE);\ + schedule_timeout(1);\ +} while (0) + +static int snd_intel8x0m_ich_chip_init(intel8x0_t *chip, int probing) +{ + unsigned long end_time; + unsigned int cnt, status, nstatus; + + /* put logic to right state */ + /* first clear status bits */ + status = ICH_RCS | ICH_MIINT | ICH_MOINT; + cnt = igetdword(chip, ICHREG(GLOB_STA)); + iputdword(chip, ICHREG(GLOB_STA), cnt & status); + + /* ACLink on, 2 channels */ + cnt = igetdword(chip, ICHREG(GLOB_CNT)); + cnt &= ~(ICH_ACLINK); + /* finish cold or do warm reset */ + cnt |= (cnt & ICH_AC97COLD) == 0 ? ICH_AC97COLD : ICH_AC97WARM; + iputdword(chip, ICHREG(GLOB_CNT), cnt); + end_time = (jiffies + (HZ / 4)) + 1; + do { + if ((igetdword(chip, ICHREG(GLOB_CNT)) & ICH_AC97WARM) == 0) + goto __ok; + do_delay(chip); + } while (time_after_eq(end_time, jiffies)); + snd_printk("AC'97 warm reset still in progress? [0x%x]\n", igetdword(chip, ICHREG(GLOB_CNT))); + return -EIO; + + __ok: + if (probing) { + /* wait for any codec ready status. + * Once it becomes ready it should remain ready + * as long as we do not disable the ac97 link. + */ + end_time = jiffies + HZ; + do { + status = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); + if (status) + break; + do_delay(chip); + } while (time_after_eq(end_time, jiffies)); + if (! status) { + /* no codec is found */ + snd_printk(KERN_ERR "codec_ready: codec is not ready [0x%x]\n", igetdword(chip, ICHREG(GLOB_STA))); + return -EIO; + } + + /* up to two codecs (modem cannot be tertiary with ICH4) */ + nstatus = ICH_PCR | ICH_SCR; + + /* wait for other codecs ready status. */ + end_time = jiffies + HZ / 4; + while (status != nstatus && time_after_eq(end_time, jiffies)) { + do_delay(chip); + status |= igetdword(chip, ICHREG(GLOB_STA)) & nstatus; + } + + } else { + /* resume phase */ + int i; + status = 0; + for (i = 0; i < 3; i++) + if (chip->ac97[i]) + status |= get_ich_codec_bit(chip, i); + /* wait until all the probed codecs are ready */ + end_time = jiffies + HZ; + do { + nstatus = igetdword(chip, ICHREG(GLOB_STA)) & (ICH_PCR | ICH_SCR | ICH_TCR); + if (status == nstatus) + break; + do_delay(chip); + } while (time_after_eq(end_time, jiffies)); + } + + return 0; +} + +static int snd_intel8x0_chip_init(intel8x0_t *chip, int probing) +{ + unsigned int i; + int err; + + if ((err = snd_intel8x0m_ich_chip_init(chip, probing)) < 0) + return err; + iagetword(chip, 0); /* clear semaphore flag */ + + /* disable interrupts */ + for (i = 0; i < chip->bdbars_count; i++) + iputbyte(chip, ICH_REG_OFF_CR + chip->ichd[i].reg_offset, 0x00); + /* reset channels */ + for (i = 0; i < chip->bdbars_count; i++) + iputbyte(chip, ICH_REG_OFF_CR + chip->ichd[i].reg_offset, ICH_RESETREGS); + /* initialize Buffer Descriptor Lists */ + for (i = 0; i < chip->bdbars_count; i++) + iputdword(chip, ICH_REG_OFF_BDBAR + chip->ichd[i].reg_offset, chip->ichd[i].bdbar_addr); + return 0; +} + +static int snd_intel8x0_free(intel8x0_t *chip) +{ + unsigned int i; + + if (chip->irq < 0) + goto __hw_end; + /* disable interrupts */ + for (i = 0; i < chip->bdbars_count; i++) + iputbyte(chip, ICH_REG_OFF_CR + chip->ichd[i].reg_offset, 0x00); + /* reset channels */ + for (i = 0; i < chip->bdbars_count; i++) + iputbyte(chip, ICH_REG_OFF_CR + chip->ichd[i].reg_offset, ICH_RESETREGS); + /* --- */ + synchronize_irq(chip->irq); + __hw_end: + if (chip->bdbars) + snd_free_pci_pages(chip->pci, chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2, chip->bdbars, chip->bdbars_addr); + if (chip->remap_addr) + iounmap((void *) chip->remap_addr); + if (chip->remap_bmaddr) + iounmap((void *) chip->remap_bmaddr); + if (chip->res) { + release_resource(chip->res); + kfree_nocheck(chip->res); + } + if (chip->res_bm) { + release_resource(chip->res_bm); + kfree_nocheck(chip->res_bm); + } + if (chip->irq >= 0) + free_irq(chip->irq, (void *)chip); + snd_magic_kfree(chip); + return 0; +} + +#ifdef CONFIG_PM +/* + * power management + */ +static void intel8x0_suspend(intel8x0_t *chip) +{ + snd_card_t *card = chip->card; + int i; + + if (chip->in_suspend || + card->power_state == SNDRV_CTL_POWER_D3hot) + return; + + chip->in_suspend = 1; + for (i = 0; i < chip->pcm_devs; i++) + snd_pcm_suspend_all(chip->pcm[i]); + snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); +} + +static void intel8x0_resume(intel8x0_t *chip) +{ + snd_card_t *card = chip->card; + int i; + + if (! chip->in_suspend || + card->power_state == SNDRV_CTL_POWER_D0) + return; + + pci_enable_device(chip->pci); + pci_set_master(chip->pci); + snd_intel8x0_chip_init(chip, 0); + for (i = 0; i < 3; i++) + if (chip->ac97[i]) + snd_ac97_resume(chip->ac97[i]); + + chip->in_suspend = 0; + snd_power_change_state(card, SNDRV_CTL_POWER_D0); +} + +static int snd_intel8x0m_suspend(struct pci_dev *dev, u32 state) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO); + intel8x0_suspend(chip); + return 0; +} +static int snd_intel8x0m_resume(struct pci_dev *dev) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO); + intel8x0_resume(chip); + return 0; +} + +/* callback */ +static int snd_intel8x0_set_power_state(snd_card_t *card, unsigned int power_state) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->power_state_private_data, return -ENXIO); + switch (power_state) { + case SNDRV_CTL_POWER_D0: + case SNDRV_CTL_POWER_D1: + case SNDRV_CTL_POWER_D2: + intel8x0_resume(chip); + break; + case SNDRV_CTL_POWER_D3hot: + case SNDRV_CTL_POWER_D3cold: + intel8x0_suspend(chip); + break; + default: + return -EINVAL; + } + return 0; +} + +#endif /* CONFIG_PM */ + +static void snd_intel8x0m_proc_read(snd_info_entry_t * entry, + snd_info_buffer_t * buffer) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, entry->private_data, return); + unsigned int tmp; + + snd_iprintf(buffer, "Intel8x0m\n\n"); + if (chip->device_type == DEVICE_ALI) + return; + tmp = igetdword(chip, ICHREG(GLOB_STA)); + snd_iprintf(buffer, "Global control : 0x%08x\n", igetdword(chip, ICHREG(GLOB_CNT))); + snd_iprintf(buffer, "Global status : 0x%08x\n", tmp); + snd_iprintf(buffer, "AC'97 codecs ready :%s%s%s%s\n", + tmp & ICH_PCR ? " primary" : "", + tmp & ICH_SCR ? " secondary" : "", + tmp & ICH_TCR ? " tertiary" : "", + (tmp & (ICH_PCR | ICH_SCR | ICH_TCR)) == 0 ? " none" : ""); +} + +static void __devinit snd_intel8x0m_proc_init(intel8x0_t * chip) +{ + snd_info_entry_t *entry; + + if (! snd_card_proc_new(chip->card, "intel8x0m", &entry)) + snd_info_set_text_ops(entry, chip, snd_intel8x0m_proc_read); +} + +static int snd_intel8x0_dev_free(snd_device_t *device) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, device->device_data, return -ENXIO); + return snd_intel8x0_free(chip); +} + +struct ich_reg_info { + unsigned int int_sta_mask; + unsigned int offset; +}; + +static int __devinit snd_intel8x0m_create(snd_card_t * card, + struct pci_dev *pci, + unsigned long device_type, + intel8x0_t ** r_intel8x0) +{ + intel8x0_t *chip; + int err; + unsigned int i; + unsigned int int_sta_masks; + ichdev_t *ichdev; + static snd_device_ops_t ops = { + .dev_free = snd_intel8x0_dev_free, + }; + static struct ich_reg_info intel_regs[2] = { + { ICH_MIINT, 0 }, + { ICH_MOINT, 0x10 }, + }; + struct ich_reg_info *tbl; + + *r_intel8x0 = NULL; + + if ((err = pci_enable_device(pci)) < 0) + return err; + + chip = snd_magic_kcalloc(intel8x0_t, 0, GFP_KERNEL); + if (chip == NULL) + return -ENOMEM; + spin_lock_init(&chip->reg_lock); + spin_lock_init(&chip->ac97_lock); + chip->device_type = device_type; + chip->card = card; + chip->pci = pci; + chip->irq = -1; + snd_intel8x0m_proc_init(chip); + sprintf(chip->ac97_name, "%s - AC'97", card->shortname); + sprintf(chip->ctrl_name, "%s - Controller", card->shortname); + if (device_type == DEVICE_ALI) { + /* ALI5455 has no ac97 region */ + chip->bmaddr = pci_resource_start(pci, 0); + if ((chip->res_bm = request_region(chip->bmaddr, 256, chip->ctrl_name)) == NULL) { + snd_printk("unable to grab ports 0x%lx-0x%lx\n", chip->bmaddr, chip->bmaddr + 256 - 1); + snd_intel8x0_free(chip); + return -EBUSY; + } + goto port_inited; + } + + if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) { /* ICH4 and Nforce */ + chip->mmio = 1; + chip->addr = pci_resource_start(pci, 2); + if ((chip->res = request_mem_region(chip->addr, 512, chip->ac97_name)) == NULL) { + snd_printk("unable to grab I/O memory 0x%lx-0x%lx\n", chip->addr, chip->addr + 512 - 1); + snd_intel8x0_free(chip); + return -EBUSY; + } + chip->remap_addr = (unsigned long) ioremap_nocache(chip->addr, 512); + if (chip->remap_addr == 0) { + snd_printk("AC'97 space ioremap problem\n"); + snd_intel8x0_free(chip); + return -EIO; + } + } else { + chip->addr = pci_resource_start(pci, 0); + if ((chip->res = request_region(chip->addr, 256, chip->ac97_name)) == NULL) { + snd_printk("unable to grab ports 0x%lx-0x%lx\n", chip->addr, chip->addr + 256 - 1); + snd_intel8x0_free(chip); + return -EBUSY; + } + } + if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) { /* ICH4 */ + chip->bm_mmio = 1; + chip->bmaddr = pci_resource_start(pci, 3); + if ((chip->res_bm = request_mem_region(chip->bmaddr, 256, chip->ctrl_name)) == NULL) { + snd_printk("unable to grab I/O memory 0x%lx-0x%lx\n", chip->bmaddr, chip->bmaddr + 512 - 1); + snd_intel8x0_free(chip); + return -EBUSY; + } + chip->remap_bmaddr = (unsigned long) ioremap_nocache(chip->bmaddr, 256); + if (chip->remap_bmaddr == 0) { + snd_printk("Controller space ioremap problem\n"); + snd_intel8x0_free(chip); + return -EIO; + } + } else { + chip->bmaddr = pci_resource_start(pci, 1); + if ((chip->res_bm = request_region(chip->bmaddr, 128, chip->ctrl_name)) == NULL) { + snd_printk("unable to grab ports 0x%lx-0x%lx\n", chip->bmaddr, chip->bmaddr + 128 - 1); + snd_intel8x0_free(chip); + return -EBUSY; + } + } + + port_inited: + if (request_irq(pci->irq, snd_intel8x0_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, (void *)chip)) { + snd_printk("unable to grab IRQ %d\n", pci->irq); + snd_intel8x0_free(chip); + return -EBUSY; + } + chip->irq = pci->irq; + pci_set_master(pci); + synchronize_irq(chip->irq); + + /* initialize offsets */ + chip->bdbars_count = 2; + tbl = intel_regs; + + for (i = 0; i < chip->bdbars_count; i++) { + ichdev = &chip->ichd[i]; + ichdev->ichd = i; + ichdev->reg_offset = tbl[i].offset; + ichdev->int_sta_mask = tbl[i].int_sta_mask; + if (device_type == DEVICE_SIS) { + /* SiS 7013 swaps the registers */ + ichdev->roff_sr = ICH_REG_OFF_PICB; + ichdev->roff_picb = ICH_REG_OFF_SR; + } else { + ichdev->roff_sr = ICH_REG_OFF_SR; + ichdev->roff_picb = ICH_REG_OFF_PICB; + } + if (device_type == DEVICE_ALI) + ichdev->ali_slot = (ichdev->reg_offset - 0x40) / 0x10; + } + /* SIS7013 handles the pcm data in bytes, others are in words */ + chip->pcm_pos_shift = (device_type == DEVICE_SIS) ? 0 : 1; + + /* allocate buffer descriptor lists */ + /* the start of each lists must be aligned to 8 bytes */ + chip->bdbars = (u32 *)snd_malloc_pci_pages(pci, chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2, &chip->bdbars_addr); + if (chip->bdbars == NULL) { + snd_intel8x0_free(chip); + return -ENOMEM; + } + /* tables must be aligned to 8 bytes here, but the kernel pages + are much bigger, so we don't care (on i386) */ + int_sta_masks = 0; + for (i = 0; i < chip->bdbars_count; i++) { + ichdev = &chip->ichd[i]; + ichdev->bdbar = chip->bdbars + (i * ICH_MAX_FRAGS * 2); + ichdev->bdbar_addr = chip->bdbars_addr + (i * sizeof(u32) * ICH_MAX_FRAGS * 2); + int_sta_masks |= ichdev->int_sta_mask; + } + chip->int_sta_reg = ICH_REG_GLOB_STA; + chip->int_sta_mask = int_sta_masks; + + if ((err = snd_intel8x0_chip_init(chip, 1)) < 0) { + snd_intel8x0_free(chip); + return err; + } + +#ifdef CONFIG_PM + card->set_power_state = snd_intel8x0_set_power_state; + card->power_state_private_data = chip; +#endif + + if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { + snd_intel8x0_free(chip); + return err; + } + + *r_intel8x0 = chip; + return 0; +} + +static struct shortname_table { + unsigned int id; + const char *s; +} shortnames[] __devinitdata = { + { PCI_DEVICE_ID_INTEL_82801_6, "Intel 82801AA-ICH" }, + { PCI_DEVICE_ID_INTEL_82901_6, "Intel 82901AB-ICH0" }, + { PCI_DEVICE_ID_INTEL_82801BA_6, "Intel 82801BA-ICH2" }, + { PCI_DEVICE_ID_INTEL_440MX_6, "Intel 440MX" }, + { PCI_DEVICE_ID_INTEL_ICH3_6, "Intel 82801CA-ICH3" }, + { PCI_DEVICE_ID_INTEL_ICH4_6, "Intel 82801DB-ICH4" }, + { PCI_DEVICE_ID_INTEL_ICH5_6, "Intel ICH5" }, + { 0x7446, "AMD AMD768" }, +#if 0 + { PCI_DEVICE_ID_SI_7013, "SiS SI7013" }, + { PCI_DEVICE_ID_NVIDIA_MCP_AUDIO, "NVidia nForce" }, + { PCI_DEVICE_ID_NVIDIA_MCP2_AUDIO, "NVidia nForce2" }, + { PCI_DEVICE_ID_NVIDIA_MCP3_AUDIO, "NVidia nForce3" }, + { 0x5455, "ALi M5455" }, + { 0x746d, "AMD AMD8111" }, +#endif + { 0, 0 }, +}; + +static int __devinit snd_intel8x0m_probe(struct pci_dev *pci, + const struct pci_device_id *pci_id) +{ + static int dev; + snd_card_t *card; + intel8x0_t *chip; + int err; + struct shortname_table *name; + + if (dev >= SNDRV_CARDS) + return -ENODEV; + if (!enable[dev]) { + dev++; + return -ENOENT; + } + + card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); + if (card == NULL) + return -ENOMEM; + + switch (pci_id->driver_data) { + case DEVICE_NFORCE: + strcpy(card->driver, "NFORCE"); + break; + default: + strcpy(card->driver, "ICH"); + break; + } + + strcpy(card->shortname, "Intel ICH"); + for (name = shortnames; name->id; name++) { + if (pci->device == name->id) { + strcpy(card->shortname, name->s); + break; + } + } + strcat(card->shortname," Modem"); + + if ((err = snd_intel8x0m_create(card, pci, pci_id->driver_data, &chip)) < 0) { + snd_card_free(card); + return err; + } + + if ((err = snd_intel8x0_mixer(chip, ac97_clock[dev])) < 0) { + snd_card_free(card); + return err; + } + if ((err = snd_intel8x0_pcm(chip)) < 0) { + snd_card_free(card); + return err; + } + + sprintf(card->longname, "%s at 0x%lx, irq %i", + card->shortname, chip->addr, chip->irq); + + if ((err = snd_card_register(card)) < 0) { + snd_card_free(card); + return err; + } + pci_set_drvdata(pci, chip); + dev++; + return 0; +} + +static void __devexit snd_intel8x0m_remove(struct pci_dev *pci) +{ + intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(pci), return); + if (chip) + snd_card_free(chip->card); + pci_set_drvdata(pci, NULL); +} + +static struct pci_driver driver = { + .name = "Intel ICH Modem", + .id_table = snd_intel8x0m_ids, + .probe = snd_intel8x0m_probe, + .remove = __devexit_p(snd_intel8x0m_remove), +#ifdef CONFIG_PM + .suspend = snd_intel8x0m_suspend, + .resume = snd_intel8x0m_resume, +#endif +}; + + +static int __init alsa_card_intel8x0m_init(void) +{ + int err; + + if ((err = pci_module_init(&driver)) < 0) { +#ifdef MODULE + printk(KERN_ERR "Intel ICH modemcard not found or device busy\n"); +#endif + return err; + } + + return 0; +} + +static void __exit alsa_card_intel8x0m_exit(void) +{ + pci_unregister_driver(&driver); +} + +module_init(alsa_card_intel8x0m_init) +module_exit(alsa_card_intel8x0m_exit) + +#ifndef MODULE + +/* format is: snd-intel8x0=enable,index,id,ac97_clock,mpu_port,joystick */ + +static int __init alsa_card_intel8x0m_setup(char *str) +{ + static unsigned __initdata nr_dev = 0; + + if (nr_dev >= SNDRV_CARDS) + return 0; + (void)(get_option(&str,&enable[nr_dev]) == 2 && + get_option(&str,&index[nr_dev]) == 2 && + get_id(&str,&id[nr_dev]) == 2 && + get_option(&str,&ac97_clock[nr_dev]) == 2 + ); + nr_dev++; + return 1; +} + +__setup("snd-intel8x0m=", alsa_card_intel8x0m_setup); + +#endif /* ifndef MODULE */ diff -Nru linux-2.6.0_orig/sound/pci/Kconfig linux-2.6.0/sound/pci/Kconfig --- linux-2.6.0_orig/sound/pci/Kconfig 2003-12-28 22:18:44.000000000 +0200 +++ linux-2.6.0/sound/pci/Kconfig 2003-12-28 22:29:43.000000000 +0200 @@ -172,6 +172,13 @@ Say 'Y' or 'M' to include support for Intel8x0 based soundcards, SiS 7012, AMD768/8111, NVidia NForce and ALi 5455 chips. +config SND_INTEL8X0M + tristate "Intel i8x0/MX440; AMD768/8111 modems (EXPERIMENTAL)" + depends on SND && EXPERIMENTAL + help + Say 'Y' or 'M' to include support for Intel8x0 and AMD768/8111 based + modems. + config SND_SONICVIBES tristate "S3 SonicVibes" depends on SND diff -Nru linux-2.6.0_orig/sound/pci/Makefile linux-2.6.0/sound/pci/Makefile --- linux-2.6.0_orig/sound/pci/Makefile 2003-12-28 22:18:44.000000000 +0200 +++ linux-2.6.0/sound/pci/Makefile 2003-12-28 22:29:43.000000000 +0200 @@ -13,6 +13,7 @@ snd-es1968-objs := es1968.o snd-fm801-objs := fm801.o snd-intel8x0-objs := intel8x0.o +snd-intel8x0m-objs := intel8x0m.o snd-maestro3-objs := maestro3.o snd-rme32-objs := rme32.o snd-rme96-objs := rme96.o @@ -29,6 +30,7 @@ obj-$(CONFIG_SND_ES1968) += snd-es1968.o obj-$(CONFIG_SND_FM801) += snd-fm801.o obj-$(CONFIG_SND_INTEL8X0) += snd-intel8x0.o +obj-$(CONFIG_SND_INTEL8X0M) += snd-intel8x0m.o obj-$(CONFIG_SND_MAESTRO3) += snd-maestro3.o obj-$(CONFIG_SND_RME32) += snd-rme32.o obj-$(CONFIG_SND_RME96) += snd-rme96.o slmodem-2.9.11-20110321/patches/zello.txt0000644000175000000620000000215610774316554016315 0ustar marvstaff======== 20080331 ======== What's been changed: -------------------- - in kernel 2.6.24 the macro SA_SHIRQ is undefined (it was deprecated - and redefined to IRQF_SHARED - since some previous kernel, I think 2.6.22). The code now use IRQF_SHARED if it's defined, and fall back to SA_SHIRQ if IRQF_SHARED is undef - every use of pci_find_device function has been replaced with the pair pci_get_device/pci_dev_put. pci_get_device is the recommended way to look for a pci device since some earlier 2.6.x kernel, and pci_find_device has been left for backward compatibility, but may be removed in some next kernel version. The side effect is that you don't need to have CONFIG_PCI_LEGACY defined in your kernel .config (choice Bus Options->Enable deprecated pci_find_* API). - some explicit casts have been added to prevent some signedness mismatch warnings when compiling How to patch ------------ Put the diff file in the directory created untarring slmodem-2.9.11-20070813. At the shell prompt, type: cat FILENAME.DIFF | patch -p1 where FILENAME.DIFF is the name of the diff file. -- zello slmodem-2.9.11-20110321/patches/no_slusb.patch0000644000175000000620000000074411030570315017254 0ustar marvstaffdiff --git a/drivers/Makefile b/drivers/Makefile --- a/drivers/Makefile +++ b/drivers/Makefile @@ -22,9 +22,13 @@ EXTRA_CFLAGS = -I$(obj) -I$(obj)/../modem ARCH64:=$(shell uname -m | sed -e '/amd64/s//x86_64/' | grep -c x86_64) +SUBLEVEL=$(shell uname -r | cut -d. -f3 | cut -d. -f1 | cut -d- -f1) +AGE=$(shell if [ "$(SUBLEVEL)" -gt 24 ] ;then echo NEW;fi) +JP=$(shell echo $(AGE)) ifeq ($(ARCH64), 0) -obj-m:= slamr.o slusb.o -else +obj-m:= slarm.o +endif +ifneq ($(AGE),NEW) slmodem-2.9.11-20110321/patches/sldiffs-20090222/0000755000175000000620000000000011150355752016743 5ustar marvstaffslmodem-2.9.11-20110321/patches/sldiffs-20090222/03_Makefile_2.6.12.4.diff0000644000175000000620000000113311150025637022556 0ustar marvstaffWorkaround in drivers/Makefile for a kernel 2.4 check accidentialy matching 2.6.12.4. Index: slmodem-2.9.11-20080817/drivers/Makefile =================================================================== --- slmodem-2.9.11-20080817.orig/drivers/Makefile 2008-09-17 15:15:36.000000000 +0200 +++ slmodem-2.9.11-20080817/drivers/Makefile 2008-09-17 15:17:56.000000000 +0200 @@ -76,7 +76,7 @@ $(RM) ${DESTDIR}/dev/slusb$(minor) ; ) echo -n else -ifeq ($(findstring 2.4,$(KERNEL_VER)),2.4) +ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/linux/version.h),) slusb-objs:= old_st7554.o obj:=. slmodem-2.9.11-20110321/patches/sldiffs-20090222/fortify_source.diff0000644000175000000620000000130611150256424022633 0ustar marvstaffFix FTBFS with -D_FORTIFY_SOURCE=2 compile flag. Index: slmodem-2.9.11-20080817/modem/modem_datafile.c =================================================================== --- slmodem-2.9.11-20080817.orig/modem/modem_datafile.c 2008-09-21 10:47:22.000000000 +0200 +++ slmodem-2.9.11-20080817/modem/modem_datafile.c 2008-09-21 11:05:13.000000000 +0200 @@ -48,6 +48,8 @@ #include #include #include +#include +#include #include #include @@ -111,7 +113,7 @@ int ret = -1; int fd; - fd = open(file_name,O_CREAT|O_WRONLY); + fd = open(file_name,O_CREAT|O_WRONLY,(S_IRUSR|S_IWUSR)); if(fd < 0) return -errno; slmodem-2.9.11-20110321/patches/sldiffs-20090222/Readme.txt0000644000175000000620000000044611150355752020705 0ustar marvstaff These patches were provided by Ahmed El-Mahmoudy , applied in the order: 02_dial_string_size.diff 03_Makefile_2.6.12.4.diff 05_st7554_license.diff 06_slmodem-class-simple-to-class-meins.diff kernel-ver.diff README.diff class_device.diff fortify_source.diff slmodem-2.9.11-20110321/patches/sldiffs-20090222/kernel-ver.diff0000644000175000000620000000117311150025605021640 0ustar marvstaffWorkaround for pre-2.6.18 kernels. Index: slmodem-2.9.11-20080817/drivers/Makefile =================================================================== --- slmodem-2.9.11-20080817.orig/drivers/Makefile 2008-09-18 05:35:21.000000000 +0200 +++ slmodem-2.9.11-20080817/drivers/Makefile 2008-09-18 08:35:18.000000000 +0200 @@ -78,7 +78,7 @@ $(RM) ${DESTDIR}/dev/slusb$(minor) ; ) echo -n else -ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/linux/version.h),) +ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) slusb-objs:= old_st7554.o obj:=. slmodem-2.9.11-20110321/patches/sldiffs-20090222/06_slmodem-class-simple-to-class-meins.diff0000644000175000000620000000744211150025541026765 0ustar marvstaffPatch for class/simple_class transition. Index: slmodem-2.9.11-20080817/drivers/st7554.c =================================================================== --- slmodem-2.9.11-20080817.orig/drivers/st7554.c 2008-09-17 15:18:14.000000000 +0200 +++ slmodem-2.9.11-20080817/drivers/st7554.c 2008-09-17 15:24:12.000000000 +0200 @@ -213,7 +213,21 @@ static struct st7554_state *st7554_table[MAX_MODEMS] = {}; +#ifdef FOUND_CLASS_SIMPLE +#define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_simple_device_add(class, dev, device, fmt, rest) +#define CLASS_DESTROY(class) class_simple_destroy(class) +#define CLASS_DEVICE_DESTROY(class, dev) class_simple_device_remove(dev) +#define CLASS_CREATE(owner, name) class_simple_create(owner, name) static struct class_simple *st7554_class; +#else +#include + +#define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_device_create(class, dev, device, fmt, rest) +#define CLASS_DESTROY(class) class_destroy(class) +#define CLASS_DEVICE_DESTROY(class, dev) class_device_destroy(class, dev) +#define CLASS_CREATE(owner, name) class_create(owner, name) +static struct class *st7554_class; +#endif static DECLARE_MUTEX(open_sem); @@ -1315,7 +1329,7 @@ } usb_set_intfdata(interface, s ); - class_simple_device_add(st7554_class, MKDEV(243, i), NULL, "slusb%d", i); + CLASS_DEVICE_CREATE(st7554_class, MKDEV(243, i), NULL, "slusb%d", i); USB_INFO(KERN_INFO "slusb: slusb%d is found.\n", s->minor); @@ -1343,7 +1357,7 @@ return; } - class_simple_device_remove(MKDEV(243, s->minor)); + CLASS_DEVICE_DESTROY(st7554_class, MKDEV(243, s->minor)); st7554_stop(s); down(&open_sem); @@ -1376,7 +1390,7 @@ int ret; USB_INFO ("ST7554 USB Modem.\n"); - st7554_class = class_simple_create(THIS_MODULE, "slusb"); + st7554_class = CLASS_CREATE(THIS_MODULE, "slusb"); if (IS_ERR(st7554_class)) { ret = PTR_ERR(st7554_class); USB_ERR("st7554_modem_init: failed to create sysfs class, error %d\n", ret); @@ -1386,13 +1400,13 @@ ret = usb_register(&st7554_usb_driver); if ( ret ) { USB_ERR ("st7554_modem_init: cannot register usb device.\n"); - class_simple_destroy(st7554_class); + CLASS_DESTROY(st7554_class); return ret; } if(register_chrdev(243, "slusb", &st7554_fops) < 0) { usb_deregister(&st7554_usb_driver); - class_simple_destroy(st7554_class); + CLASS_DESTROY(st7554_class); return -ENOMEM; } return 0; @@ -1404,7 +1418,7 @@ USB_DBG ("st7554: exit...\n"); unregister_chrdev(243,"slusb"); usb_deregister(&st7554_usb_driver); - class_simple_destroy(st7554_class); + CLASS_DESTROY(st7554_class); } Index: slmodem-2.9.11-20080817/drivers/Makefile =================================================================== --- slmodem-2.9.11-20080817.orig/drivers/Makefile 2008-09-17 15:17:56.000000000 +0200 +++ slmodem-2.9.11-20080817/drivers/Makefile 2008-09-17 15:24:12.000000000 +0200 @@ -21,7 +21,9 @@ # slusb support ends at 2.6.24 AGE:=$(shell if [ "$(SUBLEVEL)" -gt 24 ] ;then echo NEW;fi) -EXTRA_CFLAGS = -I$(obj) -I$(obj)/../modem +FOUND_CLASS_SIMPLE := $(shell grep -q 'class_simple_device_add' ${KERNEL_DIR}/include/linux/device.h 2> /dev/null && echo -DFOUND_CLASS_SIMPLE) + +EXTRA_CFLAGS = -I$(obj) -I$(obj)/../modem $(FOUND_CLASS_SIMPLE) ARCH64:=$(shell uname -m | sed -e '/amd64/s//x86_64/' | grep -c x86_64) @@ -82,7 +84,7 @@ obj:=. module-dir ?= ${DESTDIR}/lib/modules/$(KERNEL_VER)/misc -CFLAGS:= -Wall -pipe -O3 -fomit-frame-pointer -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -DMODVERSIONS --include $(KERNEL_DIR)/include/linux/modversions.h -I$(KERNEL_DIR)/include +CFLAGS:= -Wall -pipe -O3 -fomit-frame-pointer -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -DMODVERSIONS --include $(KERNEL_DIR)/include/linux/modversions.h -I$(KERNEL_DIR)/include $(FOUND_CLASS_SIMPLE) all: $(obj-m) slmodem-2.9.11-20110321/patches/sldiffs-20090222/README.diff0000644000175000000620000000230711150025574020530 0ustar marvstaffDropped the TROUBLESHOOTING section from README and adapted the feedback section, mentioned the transfer of the modem business to Conexant. Index: slmodem-2.9.11-20080817/README =================================================================== --- slmodem-2.9.11-20080817.orig/README 2008-09-18 08:38:11.000000000 +0200 +++ slmodem-2.9.11-20080817/README 2008-09-18 08:38:31.000000000 +0200 @@ -239,21 +239,13 @@ Note: When using ALSA modem driver you don't need to load other modules ('slamr'). - -Troubleshooting -=============== - -If you get an error message during installation/configuration or loading -the modules try to see it in FAQ file. - -Please report the problem to your modem provider or to us -(linux-support@smlink.com). - - Feedback ======== -Please send any feedbacks to Smart Link. See the Smart Link -web site for contact information (www.smlink.com) or to -linux-support@smlink.com. +This software has been originaly created and distributed by Smart Link. +However, Smart Link stopped supported them and apparently left the modem +business. See http://www.smlink.com/smlink.asp for further information and +contact data. +--- +File modified by Eduard Bloch , 2006 slmodem-2.9.11-20110321/patches/sldiffs-20090222/05_st7554_license.diff0000644000175000000620000000115311150025627022551 0ustar marvstaffChanged the MODULE_LICENSE string to "Dual BSD/GPL" since the license is actually a BSD license clone. Index: slmodem-2.9.11-20080817/drivers/st7554.c =================================================================== --- slmodem-2.9.11-20080817.orig/drivers/st7554.c 2008-04-18 04:56:46.000000000 +0200 +++ slmodem-2.9.11-20080817/drivers/st7554.c 2008-09-17 15:18:14.000000000 +0200 @@ -1414,5 +1414,6 @@ MODULE_AUTHOR("Smart Link Ltd."); MODULE_DESCRIPTION("ST7554 USB Smart Link Soft Modem driver."); -MODULE_LICENSE("Smart Link Ltd."); +//MODULE_LICENSE("Smart Link Ltd."); +MODULE_LICENSE("Dual BSD/GPL"); slmodem-2.9.11-20110321/patches/sldiffs-20090222/class_device.diff0000644000175000000620000000225611150025621022213 0ustar marvstaffSince 2.6.25 class_device_add() and class_device_destroy() has been renamed, modified st7554.c accordingly. Index: slmodem-2.9.11-20080817/drivers/st7554.c =================================================================== --- slmodem-2.9.11-20080817.orig/drivers/st7554.c 2008-10-04 01:02:35.000000000 +0200 +++ slmodem-2.9.11-20080817/drivers/st7554.c 2008-10-04 00:32:21.000000000 +0200 @@ -220,11 +220,15 @@ #define CLASS_CREATE(owner, name) class_simple_create(owner, name) static struct class_simple *st7554_class; #else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) +#define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) device_create(class, dev, device, fmt, rest) +#define CLASS_DEVICE_DESTROY(class, dev) device_destroy(class, dev) +#else #include - #define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_device_create(class, dev, device, fmt, rest) -#define CLASS_DESTROY(class) class_destroy(class) #define CLASS_DEVICE_DESTROY(class, dev) class_device_destroy(class, dev) +#endif +#define CLASS_DESTROY(class) class_destroy(class) #define CLASS_CREATE(owner, name) class_create(owner, name) static struct class *st7554_class; #endif slmodem-2.9.11-20110321/patches/sldiffs-20090222/02_dial_string_size.diff0000644000175000000620000000124211150025645023421 0ustar marvstaffEnlarge dial string buffer to 128 bytes. Some dial strings that include calling card numbers can be longer than the previously allowed 32 characters, causing them to be truncated. Index: slmodem-2.9.11-20080817/modem/modem.h =================================================================== --- slmodem-2.9.11-20080817.orig/modem/modem.h 2008-03-29 14:04:16.000000000 +0200 +++ slmodem-2.9.11-20080817/modem/modem.h 2008-09-17 15:17:49.000000000 +0200 @@ -301,7 +301,7 @@ void *cid; #endif /* dialer */ - char dial_string[32]; + char dial_string[128]; /* escape counter */ unsigned escape_count; unsigned long last_esc_check; slmodem-2.9.11-20110321/patches/no_slusb.txt0000644000175000000620000000067211030570211016767 0ustar marvstaffBlocks compilation of slusb.ko for kernels after 2.6.24 Otherwise a resultant Proprietary License related error would block compilation of slamr.ko and slmodemd Thanks to: Gustavo Fernando Padovan Engenharia de Computação 2006 LAS - Laboratório de Administração e Segurança de Sistemas Instituto de Computação - UNICAMP and Jacques Goldberg, for contributing: AGE=$(shell if [ "$(SUBLEVEL)" -gt 24 ] ;then echo NEW;fi) 6/25/2008 slmodem-2.9.11-20110321/patches/marv.diff0000644000175000000620000000335110774315051016213 0ustar marvstaff--- drivers/amrmo_init.c.orig 2008-03-31 01:43:53.000000000 -0400 +++ drivers/amrmo_init.c 2008-03-31 01:39:39.000000000 -0400 @@ -159,16 +159,11 @@ #define PCI_VENDOR_ID_PCTEL 0x134d #define PCI_DEVICE_ID_HSP1688 0x2189 -/* Analogue Devices Inc. 11d4:1805, Motorola proxy */ -#define PCI_VENDOR_ID_ANALOGUE 0x11d4 -#define PCI_DEVICE_ID_ANALOGUE 0x1805 - /* 14e4:4212 BROADCOM */ -#define PCI_VENDOR_ID_BROADCOM 0x14e4 -#define PCI_DEVICE_ID_BROADCOM 0x4212 - /* Motorola section */ -#define PCI_VENDOR_ID_MOTOROLA 0x1057 -#define PCI_DEVICE_ID_MOTOROLA 0x5600 +#define PCI_VENDOR_ID_MOTOROLA 0x1057 + +/* Silicon Instruments */ +#define PCI_VENDOR_ID_SILICON 0x1543 enum { ALS300_CARD = 1, @@ -185,7 +180,8 @@ SL1500_CARD, SL1801_CARD, SL1900_CARD, - SL2800_CARD + SL2800_CARD, + SL1543_CARD }; @@ -243,17 +239,14 @@ "SL1500", "ALI545A", "SL1900", - "SL2800" + "SL2800", + "SL1543" }; static struct pci_device_id amrmo_pci_tbl [] __devinitdata = { - {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM, /* Broadcom 14e4:4212 */ - PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, - {PCI_VENDOR_ID_ANALOGUE, PCI_DEVICE_ID_ANALOGUE, /* Analogue 11d4:1805 */ - PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, - {PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_MOTOROLA, /* Motorola 1057:5600 */ - PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, + {PCI_VENDOR_ID_SILICON, PCI_DEVICE_ID_SL1900, /* SiliconInstr SL1543:3052 */ + PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1543_CARD}, {PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_SL1900, /* Motorola 1057:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_SL1900, /* 163c:3052 */ slmodem-2.9.11-20110321/patches/zello.diff0000644000175000000620000000567510774315614016413 0ustar marvstaffdiff -r -u slmodem-2.9.11-20070813/drivers/amrmo_init.c slmodem-new/drivers/amrmo_init.c --- slmodem-2.9.11-20070813/drivers/amrmo_init.c 2008-03-26 23:40:54.000000000 +0100 +++ slmodem-new/drivers/amrmo_init.c 2008-03-29 13:04:16.000000000 +0100 @@ -92,6 +92,9 @@ #define MAXNUM 4 +#ifndef IRQF_SHARED +#define IRQF_SHARED SA_SHIRQ +#endif /* modem cards ids list */ @@ -617,7 +620,7 @@ } } - ret = request_irq(amrmo->irq, &amrmo_pci_interrupt,SA_SHIRQ, + ret = request_irq(amrmo->irq, &amrmo_pci_interrupt,IRQF_SHARED, amrmo->name,amrmo); if(ret) { printk(KERN_ERR "slamr: failed request_irq\n"); @@ -757,7 +760,8 @@ #ifdef OLD_KERNEL pci_for_each_dev(dev) { #else - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + /*while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {*/ + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { #endif if(pci_match_id(amrmo_pci_tbl, dev) && pci_dev_driver(dev)) { @@ -782,7 +786,11 @@ printk("slamr: device %04x:%04x is grabbed by another driver\n", dev->vendor,dev->device); #endif + } +#ifndef OLD_KERNEL + pci_dev_put(dev); +#endif } #ifndef OLD_KERNEL diff -r -u slmodem-2.9.11-20070813/modem/modem_ec.c slmodem-new/modem/modem_ec.c --- slmodem-2.9.11-20070813/modem/modem_ec.c 2008-03-29 12:59:49.000000000 +0100 +++ slmodem-new/modem/modem_ec.c 2008-03-29 13:04:16.000000000 +0100 @@ -720,7 +720,7 @@ f = l->info_list; if(!l->modem->get_chars) return 0; - n = l->modem->get_chars(l->modem,f->buf+3,l->tx_info_size); + n = l->modem->get_chars(l->modem,(char*)(f->buf+3),l->tx_info_size); if (n < 0) { /* error */ EC_ERR("tx_info: get chars error.\n"); modem_update_status(l->modem,STATUS_EC_ERROR); @@ -807,7 +807,7 @@ return; if (l->rx_count && l->modem->put_chars) { int ret = l->modem->put_chars(l->modem, - l->rx_buf+l->rx_head, + (const char*)(l->rx_buf+l->rx_head), l->rx_count); if (ret > 0) { l->rx_head += ret; @@ -857,7 +857,7 @@ /* recv data */ if(l->modem->put_chars) - ret = l->modem->put_chars(l->modem,f->buf+3,f->count-3); + ret = l->modem->put_chars(l->modem,(const char*)(f->buf+3),f->count-3); if(ret<0) { /* FIXME: handle error*/ ; } diff -r -u slmodem-2.9.11-20070813/modem/modem_pack.c slmodem-new/modem/modem_pack.c --- slmodem-2.9.11-20070813/modem/modem_pack.c 2008-03-29 12:58:07.000000000 +0100 +++ slmodem-new/modem/modem_pack.c 2008-03-29 13:04:16.000000000 +0100 @@ -97,7 +97,7 @@ if (bit_cnt <= 0) break; /* get char */ - if (!m->get_chars || m->get_chars(m, &ch, 1) != 1) + if (!m->get_chars || m->get_chars(m, (char*)&ch, 1) != 1) break; REVERSE_BITS(ch); s->data <<= CHAR_SIZE(m); @@ -145,7 +145,7 @@ s->bit-= CHAR_SIZE(m); REVERSE_BITS(ch); if (m->put_chars) - m->put_chars(m,&ch,1); + m->put_chars(m,(const char*)&ch,1); } } return ret; slmodem-2.9.11-20110321/patches/marv.txt0000644000175000000620000000035110774316132016120 0ustar marvstaffRemoves recogntion for a few cards which slamr failed to support, retaining Zello's proven support for the chipset Motorola 1057:3052 and adding test support for the chipset Silicon Instru. 1543:3052 Marv Stodolsky 2008-04-01 slmodem-2.9.11-20110321/patches/semaphore2011.diff0000644000000000000000000000152411541665270017412 0ustar rootrootDescription: Fix compilation of slusb with 2.6.37 *_MUTEX got deprecated since kernel 2.6.37 Author: أحمد المحمودي (Ahmed El-Mahmoudy) Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=613906 Bug-Ubuntu: https://bugs.launchpad.net/bugs/737650 --- a/drivers/st7554.c +++ b/drivers/st7554.c @@ -233,7 +233,11 @@ static struct class *st7554_class; #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) static DECLARE_MUTEX(open_sem); +#else +static DEFINE_SEMAPHORE(open_sem); +#endif /* --------------------------------------------------------------------- */ @@ -1234,7 +1238,11 @@ memset(s, 0, sizeof(*s)); spin_lock_init(&s->lock); +#ifdef init_MUTEX init_MUTEX (&s->sem); +#else + sema_init (&s->sem, 1); +#endif init_waitqueue_head(&s->wait); s->name = "ST7554 USB Modem"; slmodem-2.9.11-20110321/patches/ioctl.diff0000644000000000000000000000216111542156632016231 0ustar rootrootDescription: Fix compilation of slamr module with 2.6.36 ioctl got deprecated since kernel 2.6.36 Origin: http://bugs.gentoo.org/attachment.cgi?id=259296 Bug-Gentoo: http://bugs.gentoo.org/show_bug.cgi?id=302456 Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=613906 Bug-Ubuntu: https://bugs.launchpad.net/bugs/737650 --- a/drivers/amrmo_init.c 2011-01-06 20:12:59.000000000 +0100 +++ b/drivers/amrmo_init.c 2011-01-06 20:12:34.000000000 +0100 @@ -437,11 +437,11 @@ static unsigned int amrmo_poll(struct fi -static int amrmo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long parg) +static long amrmo_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long parg) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; - int ret; + long ret; unsigned stat; unsigned long arg=0; @@ -514,7 +514,7 @@ static struct file_operations amrmo_fops .read = amrmo_read, .write = amrmo_write, .poll = amrmo_poll, - .ioctl = amrmo_ioctl, + .unlocked_ioctl = amrmo_unlocked_ioctl, .open = amrmo_open, .release = amrmo_release, }; slmodem-2.9.11-20110321/patches/2.6.33.diff0000644000175000017500000000214411420701311015630 0ustar marvmarvDescription: Path of utsrelease.h changed to $(KERNEL_DIR)/generated/utsrelease.h in linux kernel >= 2.6.33 Credits to Harald Jenny for the heads up Forwarded: yes Author: أحمد المحمودي (Ahmed El-Mahmoudy) --- a/drivers/Makefile +++ b/drivers/Makefile @@ -82,7 +82,7 @@ $(RM) ${DESTDIR}/dev/slusb$(minor) ; ) echo -n else -ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) +ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/generated/utsrelease.h $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) slusb-objs:= old_st7554.o obj:=. --- a/drivers/kernel-ver.c +++ b/drivers/kernel-ver.c @@ -5,9 +5,13 @@ #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33) +#include +#else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) #include -#endif +#endif // KERNEL_VERSION(2,6,18) +#endif // KERNEL_VERSION(2,6,33) int main() { slmodem-2.9.11-20110321/patches/modem_20100303.patch0000644000175000017500000000514111343745405017357 0ustar marvmarvdiff -ur orig/slmodem-2.9.11-20100106/drivers/amrmo_init.c slmodem-2.9.11-20100106/drivers/amrmo_init.c --- orig/slmodem-2.9.11-20100106/drivers/amrmo_init.c 2008-04-01 05:08:42.000000000 +0300 +++ slmodem-2.9.11-20100106/drivers/amrmo_init.c 2010-03-04 06:25:33.297133596 +0200 @@ -434,12 +434,17 @@ -static int amrmo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +static int amrmo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long parg) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; int ret; unsigned stat; + unsigned long arg=0; + + cmd -= 100000; + if (parg) + copy_from_user(&arg, (unsigned long *)parg, sizeof(arg)); AMRMO_DBG("amrmo_ioctl: cmd %x, arg %lx...\n",cmd,arg); switch (cmd) { @@ -448,7 +453,7 @@ stat = amrmo->status; amrmo->status = 0; spin_unlock_irqrestore(&amrmo->lock,flags); - if (put_user(stat, (unsigned *) arg)) + if (put_user(stat, (unsigned *) parg)) return -EFAULT; return 0; case MDMCTL_START: diff -ur orig/slmodem-2.9.11-20100106/modem/modem_main.c slmodem-2.9.11-20100106/modem/modem_main.c --- orig/slmodem-2.9.11-20100106/modem/modem_main.c 2008-08-04 04:40:13.000000000 +0300 +++ slmodem-2.9.11-20100106/modem/modem_main.c 2010-03-04 06:17:48.366253090 +0200 @@ -552,14 +552,14 @@ int ret; DBG("modemap_start...\n"); dev->delay = 0; - ret = ioctl(dev->fd,MDMCTL_START,0); + ret = ioctl(dev->fd,100000+MDMCTL_START,0); if (ret < 0) return ret; ret = 192*2; memset(outbuf, 0 , ret); ret = write(dev->fd, outbuf, ret); if (ret < 0) { - ioctl(dev->fd,MDMCTL_STOP,0); + ioctl(dev->fd,100000+MDMCTL_STOP,0); return ret; } dev->delay = ret/2; @@ -570,7 +570,7 @@ { struct device_struct *dev = m->dev_data; DBG("modemap_stop...\n"); - return ioctl(dev->fd,MDMCTL_STOP,0); + return ioctl(dev->fd,100000+MDMCTL_STOP,0); } static int modemap_ioctl(struct modem *m, unsigned int cmd, unsigned long arg) @@ -580,7 +580,7 @@ DBG("modemap_ioctl: cmd %x, arg %lx...\n",cmd,arg); if (cmd == MDMCTL_SETFRAG) arg <<= MFMT_SHIFT(m->format); - ret = ioctl(dev->fd,cmd,arg); + ret = ioctl(dev->fd,cmd+100000,&arg); if (cmd == MDMCTL_IODELAY && ret > 0) { ret >>= MFMT_SHIFT(m->format); ret += dev->delay; @@ -810,7 +810,7 @@ continue; } #endif - ret = ioctl(dev->fd,MDMCTL_GETSTAT,&stat); + ret = ioctl(dev->fd,100000+MDMCTL_GETSTAT,&stat); if(ret < 0) { ERR("dev ioctl: %s\n",strerror(errno)); return -1; slmodem-2.9.11-20110321/patches/slmodem-2.9.11-20090222.patch0000644000175000000620000000102111321214324020477 0ustar marvstaffdiff -upPr slmodem-2.9.11-20090222-orig/drivers/amrmo_init.c slmodem-2.9.11-20090222/drivers/amrmo_init.c --- slmodem-2.9.11-20090222-orig/drivers/amrmo_init.c 2008-04-01 13:08:42.000000000 +1100 +++ slmodem-2.9.11-20090222/drivers/amrmo_init.c 2010-01-07 02:14:23.000000000 +1100 @@ -62,6 +62,9 @@ #include #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) +#include +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) #define OLD_KERNEL 1 slmodem-2.9.11-20110321/patches/slmodem-usb-2.6.16.patch0000644000175000000620000000106510773430100020404 0ustar marvstaffdiff -ru slmodem-2.9.11-20051101/drivers/st7554.c slmodem-2.9.11-20051101-new/drivers/st7554.c --- slmodem-2.9.11-20051101/drivers/st7554.c 2005-11-01 17:31:45.000000000 +0200 +++ slmodem-2.9.11-20051101-new/drivers/st7554.c 2006-01-31 04:08:45.000000000 +0200 @@ -1150,7 +1150,9 @@ MODULE_DEVICE_TABLE (usb, st7554_ids); static struct usb_driver st7554_usb_driver = { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) .owner = THIS_MODULE, +#endif .name = "ST7554 USB Modem", .probe = st7554_probe, .disconnect = st7554_disconnect, slmodem-2.9.11-20110321/drivers/0000755000175000000620000000000011542156733014445 5ustar marvstaffslmodem-2.9.11-20110321/drivers/amrmo_init.c.orig0000644000175000017500000005575411321214363017562 0ustar marvmarv/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * amrmo_init.c - Smart Link Soft Modem amr,pci driver initialization. * * Author: Sasha K (sashak@smlink.com) * */ /* * 20070505: -Added Motorola Venor ID and rename Motorola device 5600 * http://linmodems.technion.ac.il/bigarch/archive-seventh/msg00846.html * Marvin Stodolsky (marvin.stodolsky@gmail.com) * Alvaro Aguirre (alvaro.aguirre@gmail.com) */ /*****************************************************************************/ #include #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) #include #endif #include #include #include #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) #include #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) #define OLD_KERNEL 1 #endif #ifdef OLD_KERNEL #include #define iminor(i) MINOR((i)->i_rdev) #else #include #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13) #define class_simple_device_add(class, dev, addr, name, i) #define class_simple_device_remove(dev) #define class_simple_create(module, name) (struct class_simple *)(name) #define class_simple_destroy(class) #else #define pci_match_id(tbl, dev) pci_match_device(tbl, dev) #endif #include #define AMRMO_MODULE_NAME "slamr" #define AMRMO_MAJOR 242 #define AMRMO_DBG(fmt...) if (debug > 0) { printk(KERN_DEBUG AMRMO_MODULE_NAME ": " fmt) ; } #define MAXNUM 4 #ifndef IRQF_SHARED #define IRQF_SHARED SA_SHIRQ #endif /* modem cards ids list */ /* Intel */ /* #define PCI_VENDOR_ID_INTEL 0x8086 */ #define PCI_DEVICE_ID_ICHAA 0x2416 #define PCI_DEVICE_ID_ICHAB 0x2426 #define PCI_DEVICE_ID_BANISTER 0x7196 #define PCI_DEVICE_ID_ICH2 0x2446 #define PCI_DEVICE_ID_ICH3 0x2486 #define PCI_DEVICE_ID_ICH4 0x24c6 #define PCI_DEVICE_ID_ICH5 0x24d6 #define PCI_VENDOR_ID_STANDARD_MICROSYSTEM 0x1055 #define PCI_DEVICE_ID_STANDARD_MICROSYSTEM 0x9178 /* AMD */ /* #define PCI_VENDOR_ID_AMD 0x1022 */ #define PCI_DEVICE_ID_AMD_ACLINK 0x7446 /* NVidia */ /* #define PCI_VENDOR_ID_NVIDIA 0x10DE */ #define PCI_DEVICE_ID_MCP 0x01C1 /* VIA */ /* #define PCI_VENDOR_ID_VIA 0x1106 */ #define PCI_DEVICE_ID_VIA 0x3068 /* SiS */ #define PCI_VENDOR_ID_SIS 0x1039 #define PCI_DEVICE_ID_SIS630 0x7013 #define PCI_DEVICE_ID_SIS960 0x7018 /* Avance */ #define PCI_VENDOR_ID_ALS300p 0x4005 // PCI_VENDOR_ID_AVANCE #define PCI_DEVICE_ID_ALS300p 0x0308 /* ALi */ #define PCI_VENDOR_ID_ALI 0x10B9 // PCI_VENDOR_ID_AL #define PCI_DEVICE_ID_ALI5450 0x5450 #define PCI_DEVICE_ID_ALI5451 0x5451 #define PCI_DEVICE_ID_ALI5457 0x5457 #define PCI_DEVICE_ID_ALI5459 0x5459 #define PCI_DEVICE_ID_ALI545A 0x545A /* Philips */ /* #define PCI_VENDOR_ID_PHILIPS 0x1131 */ #define PCI_DEVICE_ID_UCB1500 0x3400 /* RealTek */ /* #define PCI_VENDOR_ID_REALTEK 0x10EC */ #define PCI_DEVICE_ID_8101 0x8197 #define PCI_VENDOR_ID_SMARTLINK 0x2000 #define PCI_VENDOR_ID_SMARTLINK_1 0x163c #define PCI_VENDOR_ID_SMARTLINK_2 0x10a5 #define PCI_VENDOR_ID_SMARTLINK_3 0x2003 #define PCI_DEVICE_ID_SL2800 0x2800 #define PCI_DEVICE_ID_SL1900 0x3052 #define PCI_DEVICE_ID_ND92XPA 0x8800 /* ND92XPA */ #define PCI_VENDOR_ID_PCTEL 0x134d #define PCI_DEVICE_ID_HSP1688 0x2189 /* Motorola section */ #define PCI_VENDOR_ID_MOTOROLA 0x1057 /* Silicon Instruments */ #define PCI_VENDOR_ID_SILICON 0x1543 enum { ALS300_CARD = 1, VIA3058_CARD, ALI5450_CARD, ALI5451_CARD, SL1800_CARD, SIS630_CARD, SIS960_CARD, ICH_CARD, ICH4_CARD, RTL8197_CARD, NVIDIA_CARD, SL1500_CARD, SL1801_CARD, SL1900_CARD, SL2800_CARD, SL1543_CARD }; struct amrmo_struct { unsigned id; const char *name; struct pci_dev *pci_dev; unsigned int irq; unsigned long iobase1; unsigned long iobase2; void *memaddr; unsigned long memlen; void *card; unsigned num; unsigned used; unsigned started; unsigned status; spinlock_t lock; wait_queue_head_t wait; char ibuf[2048]; char obuf[2048]; }; /* extern prototypes */ asmlinkage extern void amrmo_card_interrupt(void *card); asmlinkage extern int amrmo_card_start(void *card); asmlinkage extern int amrmo_card_stop(void *card); asmlinkage extern int amrmo_card_ctl(void *card,unsigned cmd,unsigned long); asmlinkage extern int amrmo_card_read(void *card,char *buf,int n); asmlinkage extern int amrmo_card_write(void *card,char *buf,int n); asmlinkage extern int amrmo_card_enable(void *card, void *modem); asmlinkage extern int amrmo_card_disable(void *card); asmlinkage extern void *amrmo_card_create(int card_id,void *amrmo); asmlinkage extern void amrmo_card_delete(void *card); /* internal data */ static int debug = 0; static const char *card_names[] = { 0, "ALS300+", // ALS300_CARD "VIA3058", "ALI1535", "ALI1535", "SL1800", "SiS630", "SiS960", "ICH", "ICH4", "RealTek8101", "NvidiaMCP", "SL1500", "ALI545A", "SL1900", "SL2800", "SL1543" }; static struct pci_device_id amrmo_pci_tbl [] __devinitdata = { {PCI_VENDOR_ID_SILICON, PCI_DEVICE_ID_SL1900, /* SiliconInstr SL1543:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1543_CARD}, {PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_SL1900, /* Motorola 1057:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_SL1900, /* 163c:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_2, PCI_DEVICE_ID_SL1900, /* 10a5:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_PCTEL, PCI_DEVICE_ID_HSP1688, /* 134d:2189 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_UCB1500, /* 1131:3400 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1500_CARD}, {PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_8101, /* 10ec:8197 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8197_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5459, /* 10b9:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_ALI5459, /* 163c:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_SMARTLINK_2, PCI_DEVICE_ID_ALI5459, /* 10a5:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, //{PCI_VENDOR_ID_ALS300p, PCI_DEVICE_ID_ALS300p, /* 4005:0308 */ // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALS300_CARD}, {PCI_VENDOR_ID_STANDARD_MICROSYSTEM, PCI_DEVICE_ID_STANDARD_MICROSYSTEM, /* 1055:9178 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_ACLINK, /* 1022:7446 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_MCP, /* 10de:01c1 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, NVIDIA_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICHAA, /* 8086:2416 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICHAB, /* 8086:2426 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BANISTER, /* 8086:7196 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH2, /* 8086:2446 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH3, /* 8086:2486 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH4, /* 8086:24c6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH5, /* 8086:24d6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, 0x266d, /* ICH6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, 0x27dd, /* ICH7 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA, /* 1106:3068 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA3058_CARD}, {PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS630, /* 1039:7013 */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MODEM<<8, 0xff00, SIS630_CARD}, {PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS960, /* 1039:7018 */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MODEM<<8, 0xff00, SIS960_CARD}, //{PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5450, // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5450_CARD}, //{PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5451, // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5451_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5457, /* 10b9:5457 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI545A, /* 10b9:545a */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1801_CARD}, {PCI_VENDOR_ID_SMARTLINK, PCI_DEVICE_ID_SL2800, /* 2000:2800 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL2800_CARD}, {PCI_VENDOR_ID_SMARTLINK_3, PCI_DEVICE_ID_ND92XPA, /* 2003:8800 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL2800_CARD}, {0,} }; MODULE_DEVICE_TABLE (pci, amrmo_pci_tbl); static struct amrmo_struct *amrmo_table[MAXNUM] = {}; #ifndef OLD_KERNEL static struct class_simple *amrmo_class; #endif /* * debug stuff * */ unsigned amrmo_debug_level = 0; static int amrmo_vprintf(const char *fmt, va_list args) { static char temp[4096]; struct timeval tv; unsigned long len; char *p; int ret; if (!fmt || !(len = strlen(fmt))) return -1; do_gettimeofday(&tv); while (*fmt == '\n' || *fmt == '\r' || *fmt == '\t' || *fmt == ' ') fmt++; p = temp; len = sprintf(p, "<%c%03ld.%06ld> ", in_interrupt() ? 'i' : 'p', (tv.tv_sec % 1000), tv.tv_usec); p += len; ret = vsprintf(p, fmt, args); len += ret; if(temp[len-1] != '\n') { temp[len++] = '\n'; temp[len] = '\0'; } return printk(KERN_DEBUG "%s",temp); } asmlinkage int amrmo_debug_printf(const char *fmt, ...) { int ret = 0; va_list args; if(debug <= 0) return 0; va_start(args, fmt); ret = amrmo_vprintf(fmt,args); va_end(args); return ret; } /* * * amrmo and char dev */ asmlinkage void amrmo_update_status(void *data,unsigned stat) { struct amrmo_struct *amrmo = (struct amrmo_struct *)data; unsigned long flags; spin_lock_irqsave(&amrmo->lock,flags); amrmo->status |= stat; wake_up(&amrmo->wait); spin_unlock_irqrestore(&amrmo->lock,flags); } static ssize_t amrmo_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; int ret; //AMRMO_DBG("amrmo_read...\n"); if(!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; if (count > sizeof(amrmo->ibuf)) count = sizeof(amrmo->ibuf); ret = amrmo_card_read(amrmo->card,amrmo->ibuf,count); if(copy_to_user(buffer,amrmo->ibuf,ret)) return -EFAULT; return ret; } static ssize_t amrmo_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; int ret; //AMRMO_DBG("amrmo_write...\n"); if(!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; if (count > sizeof(amrmo->obuf)) count = sizeof(amrmo->obuf); if(copy_from_user(amrmo->obuf,buffer,count)) return -EFAULT; ret = amrmo_card_write(amrmo->card,amrmo->obuf,count); return ret; } static unsigned int amrmo_poll(struct file *file, poll_table *wait) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; unsigned int mask = 0; poll_wait(file,&amrmo->wait,wait); spin_lock_irqsave(&amrmo->lock,flags); if(amrmo->status & MDMSTAT_ERROR) mask |= POLLERR; if(amrmo->status & MDMSTAT_RING) mask |= POLLPRI; if(amrmo->status & MDMSTAT_DATA) { mask |= POLLIN | POLLRDNORM; amrmo->status &= ~MDMSTAT_DATA; } spin_unlock_irqrestore(&amrmo->lock,flags); return mask; } static int amrmo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; int ret; unsigned stat; AMRMO_DBG("amrmo_ioctl: cmd %x, arg %lx...\n",cmd,arg); switch (cmd) { case MDMCTL_GETSTAT: spin_lock_irqsave(&amrmo->lock,flags); stat = amrmo->status; amrmo->status = 0; spin_unlock_irqrestore(&amrmo->lock,flags); if (put_user(stat, (unsigned *) arg)) return -EFAULT; return 0; case MDMCTL_START: ret = amrmo_card_start(amrmo->card); if(!ret) amrmo->started = 1; return ret; case MDMCTL_STOP: ret = amrmo_card_stop(amrmo->card); if(!ret) amrmo->started = 0; return 0; default: return amrmo_card_ctl(amrmo->card,cmd,arg); } return -EINVAL; } static int amrmo_open(struct inode *inode, struct file *file) { struct amrmo_struct *amrmo; unsigned minor = iminor(inode); if(minor > MAXNUM) return -ENODEV; amrmo = amrmo_table[minor]; if(!amrmo) return -ENODEV; AMRMO_DBG("amrmo_open: %d...\n",amrmo->num); if(amrmo->used) // FIXME: atomic or locked is needed return -EBUSY; amrmo->used++; file->private_data = amrmo; #ifdef OLD_KERNEL MOD_INC_USE_COUNT; #endif init_waitqueue_head(&amrmo->wait); return 0; } static int amrmo_release(struct inode *inode, struct file *file) { struct amrmo_struct *amrmo = file->private_data; AMRMO_DBG("amrmo_release...\n"); if(amrmo->started && !amrmo_card_stop(amrmo->card)) amrmo->started = 0; amrmo->used--; #ifdef OLD_KERNEL MOD_DEC_USE_COUNT; #endif return 0; } static struct file_operations amrmo_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = amrmo_read, .write = amrmo_write, .poll = amrmo_poll, .ioctl = amrmo_ioctl, .open = amrmo_open, .release = amrmo_release, }; /* * PCI stuff * */ #ifdef OLD_KERNEL static void amrmo_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct amrmo_struct *amrmo = (struct amrmo_struct *)dev_id; amrmo_card_interrupt(amrmo->card); } #else #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static irqreturn_t amrmo_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs) #else static irqreturn_t amrmo_pci_interrupt(int irq, void *dev_id) #endif { struct amrmo_struct *amrmo = (struct amrmo_struct *)dev_id; amrmo_card_interrupt(amrmo->card); return IRQ_HANDLED; } #endif static int __init amrmo_pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) { struct amrmo_struct *amrmo; unsigned long mem_start, mem_len = 0; int i, ret = 0; printk(KERN_INFO "slamr: probe %04x:%04x %s card...\n", pci_id->vendor,pci_id->device, card_names[pci_id->driver_data]); if ( pci_enable_device(pci_dev) || pci_dev->irq == 0 ) return -ENODEV; amrmo = kmalloc(sizeof(*amrmo), GFP_KERNEL); if (!amrmo) { pci_disable_device(pci_dev); return -ENOMEM; } memset(amrmo, 0, sizeof(*amrmo)); amrmo->id = pci_id->driver_data; amrmo->name = card_names[amrmo->id]; amrmo->pci_dev = pci_dev; amrmo->irq = pci_dev->irq; if (pci_resource_flags(pci_dev,0)&IORESOURCE_MEM) { mem_start = pci_resource_start(pci_dev, 0); mem_len = pci_resource_len(pci_dev, 0); amrmo->iobase1 = pci_resource_start(pci_dev, 1); } else if (pci_resource_flags(pci_dev,1)&IORESOURCE_MEM) { amrmo->iobase1 = pci_resource_start(pci_dev, 0); mem_start = pci_resource_start(pci_dev, 1); mem_len = pci_resource_len(pci_dev, 1); } else { amrmo->iobase1 = pci_resource_start(pci_dev, 0); amrmo->iobase2 = pci_resource_start(pci_dev, 1); mem_start = 0; mem_len = 0; } spin_lock_init(&amrmo->lock); init_waitqueue_head(&amrmo->wait); amrmo->card = amrmo_card_create(pci_id->driver_data,amrmo); if (!amrmo->card) { printk(KERN_ERR "slamr: cannot create card.\n"); pci_disable_device(pci_dev); kfree(amrmo); return -ENOMEM; } pci_set_master(pci_dev); ret = pci_request_regions(pci_dev,(char*)amrmo->name); if(ret) { printk(KERN_ERR "slamr: failed request regions.\n"); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } if(mem_len) { amrmo->memaddr = ioremap(mem_start,mem_len); if(!amrmo->memaddr) { printk(KERN_ERR "slamr: failed request_irq\n"); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return -EIO; } } ret = request_irq(amrmo->irq, &amrmo_pci_interrupt,IRQF_SHARED, amrmo->name,amrmo); if(ret) { printk(KERN_ERR "slamr: failed request_irq\n"); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } ret = amrmo_card_enable(amrmo->card,NULL); if (ret) { printk(KERN_ERR "slamr: cannot init card.\n"); free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } for(i = 0 ; i < MAXNUM ; i++) { if(amrmo_table[i] == NULL) { amrmo->num = i; amrmo_table[i] = amrmo; break; } } if( i == MAXNUM ) { ret = -EBUSY; goto error_out; } AMRMO_DBG("amrmo_pci_probe: %d amrmo is %p. data %p, io %lx, %lx.\n", amrmo->num, amrmo,amrmo->card,amrmo->iobase1,amrmo->iobase2); printk(KERN_INFO "slamr: slamr%d is %s card.\n", amrmo->num, card_names[pci_id->driver_data]); pci_set_drvdata(pci_dev, amrmo); #ifdef OLD_KERNEL #ifdef CONFIG_DEVFS_FS { char buf[8]; sprintf(buf, "slamr%d", i); devfs_register (NULL, buf, DEVFS_FL_DEFAULT, AMRMO_MAJOR, i, S_IFCHR|S_IRUSR|S_IWUSR, &amrmo_fops, NULL); } #endif #else class_simple_device_add(amrmo_class, MKDEV(AMRMO_MAJOR, i), NULL, "slamr%d", i); #endif return 0; error_out: free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } static void __exit amrmo_pci_remove(struct pci_dev *pci_dev) { struct amrmo_struct *amrmo = pci_get_drvdata(pci_dev); AMRMO_DBG("amrmo: remove %p...\n", amrmo); #ifdef OLD_KERNEL #ifdef CONFIG_DEVFS_FS { char buf[8]; void * handle; sprintf(buf, "slamr%d", amrmo->num); handle = devfs_find_handle (NULL, buf, AMRMO_MAJOR, amrmo->num, DEVFS_SPECIAL_CHR, 0); devfs_unregister (handle); } #endif #else class_simple_device_remove(MKDEV(AMRMO_MAJOR, amrmo->num)); #endif amrmo_table[amrmo->num] = NULL; amrmo_card_disable(amrmo->card); free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); pci_set_drvdata(pci_dev, NULL); kfree(amrmo); return; } static struct pci_driver amrmo_pci_driver = { .name = AMRMO_MODULE_NAME, .id_table = amrmo_pci_tbl, .probe = amrmo_pci_probe, .remove = amrmo_pci_remove, }; /* * module stuff */ module_param(debug, int, 1); MODULE_PARM_DESC(debug,"debug level: 0-3 (default=0)"); MODULE_AUTHOR("Smart Link Ltd."); MODULE_DESCRIPTION("SmartLink HAMR5600,SmartPCI56/561 based modem driver"); MODULE_LICENSE("Smart Link Ltd."); static int __init amrmo_init(void) { struct pci_dev *dev = NULL; int err; #ifdef OLD_KERNEL if (!pci_present()) return -ENODEV; #endif printk(KERN_INFO AMRMO_MODULE_NAME ": " "SmartLink AMRMO modem.\n"); amrmo_debug_level = debug; /* fix me: how to prevent modem cards grabing by serial driver? */ #ifdef OLD_KERNEL pci_for_each_dev(dev) { #else /*while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {*/ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { #endif if(pci_match_id(amrmo_pci_tbl, dev) && pci_dev_driver(dev)) { #ifdef OLD_KERNEL AMRMO_DBG("device %04x:%04x is used by %s: remove\n", dev->vendor,dev->device, dev->driver?dev->driver->name:""); if (dev->driver && dev->driver->remove) dev->driver->remove(dev); dev->driver = NULL; #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) struct device *reldev = get_device(&dev->dev); AMRMO_DBG("device %04x:%04x is grabbed by driver %s: try to release\n", dev->vendor,dev->device, (reldev&&reldev->driver)? reldev->driver->name:"unknown"); if (reldev) { device_release_driver(reldev); put_device(reldev); } #else printk("slamr: device %04x:%04x is grabbed by another driver\n", dev->vendor,dev->device); #endif } #ifndef OLD_KERNEL pci_dev_put(dev); #endif } #ifndef OLD_KERNEL amrmo_class = class_simple_create(THIS_MODULE, "slamr"); if (IS_ERR(amrmo_class)) { int err = PTR_ERR(amrmo_class); printk(KERN_ERR "slamr: failure creating simple class, error %d\n", err); return err; } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) if (!pci_register_driver(&amrmo_pci_driver)) { #else if ((err = pci_register_driver(&amrmo_pci_driver)) < 0) { #endif pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif return err; } if(register_chrdev(AMRMO_MAJOR, "slamr", &amrmo_fops) < 0) { pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif return -ENOMEM; } return 0; } static void __exit amrmo_exit(void) { AMRMO_DBG("slamr: exit...\n"); unregister_chrdev(AMRMO_MAJOR,"slamr"); pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif } module_init(amrmo_init); module_exit(amrmo_exit); #ifdef OLD_KERNEL EXPORT_NO_SYMBOLS; #endif slmodem-2.9.11-20110321/drivers/Makefile.orig0000644000175000000620000000777711324672752017070 0ustar marvstaff########################################################################### # # # Makefile -- modem kernel drivers Makefile. # # Copyright(c) 2003, Smart Link Ltd. (www.smlink.com) # All rights reserved. # # Author: Sasha K (sashak@smlink.com) # # ########################################################################### # ########################################################################### #KBUILD_VERBOSE=1 #export KBUILD_VERBOSE KERNEL_DIR:=/lib/modules/$(shell uname -r)/build SUBLEVEL:=$(shell echo $(KERNEL_DIR) | cut -d. -f3 | cut -d. -f1 | cut -d- -f1) # slusb support ends at 2.6.24 ifndef USB AGE:=$(shell if [ "$(SUBLEVEL)" -gt 24 ] ;then echo NEW;fi) endif FOUND_CLASS_SIMPLE := $(shell grep -q 'class_simple_device_add' ${KERNEL_DIR}/include/linux/device.h 2> /dev/null && echo -DFOUND_CLASS_SIMPLE) EXTRA_CFLAGS = -I$(obj) -I$(obj)/../modem $(FOUND_CLASS_SIMPLE) ARCH64:=$(shell uname -m | sed -e '/amd64/s//x86_64/' | grep -c x86_64) ifeq ($(ARCH64), 0) obj-m:= slamr.o endif # AGE:=test ifneq ($(AGE), NEW) obj-m:= $(obj-m) slusb.o endif slamr-objs:= amrmo_init.o sysdep_amr.o amrlibs.o slusb-objs:= st7554.o ifndef KERNELRELEASE ifndef KERNEL_VER all install uninstall: kernel-ver $(MAKE) $@ KERNEL_VER=$(shell ./kernel-ver) install: install-devices uninstall: remove-devices kernel-ver:: @echo "doing kernel-ver::" $(CC) -I$(KERNEL_DIR)/include -o $@ $@.c dep: clean: $(RM) kernel-ver $(obj-m) $(obj-m:.o=.ko) *st7554.o amrmo_init.o sysdep_amr.o *.mod.* .*.cmd *~ slusb.* $(RM) -r .tmp_versions install-devices: mkdir -p ${DESTDIR}/dev $(foreach minor,0 1 2 3, \ mknod -m 600 ${DESTDIR}/dev/slamr$(minor) c 242 $(minor) ; ) echo -n ifneq ($(AGE), NEW) $(foreach minor,0 1 2 3, \ mknod -m 600 ${DESTDIR}/dev/slusb$(minor) c 243 $(minor) ; ) echo -n endif remove-devices: $(foreach minor,0 1 2 3, \ $(RM) ${DESTDIR}/dev/slamr$(minor) ; ) echo -n $(foreach minor,0 1 2 3, \ $(RM) ${DESTDIR}/dev/slusb$(minor) ; ) echo -n else ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) slusb-objs:= old_st7554.o obj:=. module-dir:=${DESTDIR}/lib/modules/$(KERNEL_VER)/misc CFLAGS:= -Wall -pipe -O3 -fomit-frame-pointer -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -DMODVERSIONS --include $(KERNEL_DIR)/include/linux/modversions.h -I$(KERNEL_DIR)/include $(FOUND_CLASS_SIMPLE) all: $(obj-m) slamr.o: $(slamr-objs) slusb.o: $(slusb-objs) slamr.o slusb.o: $(LD) -r -o $@ $^ install: uninstall-old ifeq ($(ARCH64), 0) install -D -m 644 slamr.o $(module-dir)/slamr.o endif install -D -m 644 slusb.o $(module-dir)/slusb.o cp /etc/modules.conf /etc/modules.conf.slamr && \ echo 'alias char-major-242 slamr' >> /etc/modules.conf && \ echo 'alias char-major-243 slusb' >> /etc/modules.conf /sbin/depmod -a uninstall: /sbin/modprobe -r slamr slusb cp /etc/modules.conf /etc/modules.conf.slamr && \ egrep -ve 'alias char-major-242 slamr|alias char-major-243 slusb' /etc/modules.conf.slamr > /etc/modules.conf $(RM) $(module-dir)/slamr.o $(RM) $(module-dir)/slusb.o /sbin/depmod -a uninstall-old: $(RM) $(module-dir)/slmdm.o \ $(module-dir)/slfax.o \ $(module-dir)/slusb.o \ $(module-dir)/slamrmo.o \ $(module-dir)/slmodem.o # remove old 2.7,2.8 version %.o: %.c @echo " doing %.o: %.c" $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -o $@ -c $< else module-dir:=${DESTDIR}/lib/modules/$(KERNEL_VER)/extra all: @echo " obj-m=$(obj-m)" @echo " slamr-objs=$(slamr-objs)" $(MAKE) modules -C $(KERNEL_DIR) SUBDIRS=$(shell pwd) @echo " finished all:" install: ifeq ($(ARCH64), 0) install -D -m 644 slamr.ko $(module-dir)/slamr.ko endif ifneq ($(AGE), NEW) install -D -m 644 slusb.ko $(module-dir)/slusb.ko endif /sbin/depmod -a uninstall: ifeq ($(ARCH64), 0) modprobe -r slamr ; echo -n endif modprobe -r slusb ; echo -n $(RM) $(module-dir)/slamr.ko $(RM) $(module-dir)/slusb.ko /sbin/depmod -a endif endif endif $(obj)/amrlibs.o: echo "$@ done" slmodem-2.9.11-20110321/drivers/old_st7554.c0000644000175000000620000010655210773430100016417 0ustar marvstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * usb_st7554.c -- ST7554 USB Smart Link Soft Modem driver * * Author: SashaK (sashak@smlink.com) * * */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_MODEMS 16 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) #define iso_packet_descriptor_t struct iso_packet_descriptor #endif #define USB_INFO(fmt...) printk(KERN_INFO fmt) #define USB_ERR(fmt...) printk(KERN_ERR fmt) #define USB_DBG(fmt...) { if(debug) printk(KERN_DEBUG fmt); } #define DEBUG_URB_PRINT 0 #define USB_DBG_URB(fmt...) // USB_DBG(fmt) #define MY_MAJOR 243 static int debug = 0; MODULE_PARM(debug,"i"); MODULE_PARM_DESC(debug,"Debug level: 0-3 (default=0)"); /* st7554 IDs */ #define ST7554_ID_VENDOR 0x0483 #define ST7554_ID_PRODUCT 0x7554 /* st7554 interfaces */ #define ST7554_IFACE_CTRL_ALTSETTING 0 #define ST7554_IFACE_MODEM_ALTSETTING 1 /* comm class defined requests */ #define USB_COMM_CLASS_AUX_LINE_STATE 0x0a #define USB_COMM_CLASS_HOOK_STATE 0x0b #define USB_COMM_CLASS_PULSE_STATE 0x0c /* st7554 vendor defined requests */ #define ST7554_SSI1_CONTROL 0x1 #define ST7554_SSI2_CONTROL 0x2 #define ST7554_FIFO_MASK 0x3 #define ST7554_SSI1_COUNTER 0x4 #define ST7554_SSI2_COUNTER 0x6 #define ST7554_GPIO_DIR 0x8 #define ST7554_GPIO_OUT 0xA #define ST7554_GPIO_MASK 0xC #define ST7554_GPIO_INV 0xE #define ST7554_GPIO_STATUS 0x15 #define ST7554_SSI1_CWORD 0x17 #define ST7554_FIFO_CONTROL1 0x19 #define ST7554_FIFO_CONTROL2 0x1a /* requests' values */ /* SSI control */ #define SSI1_POWERDOWN 0x0000 #define SSI1_POWERUP 0x0001 /* FIFO mask */ #define SSI1_UNDERRUN 0x0040 #define SSI1_OVERRUN 0x0020 /* GPIO mask */ #define GPIO_RING1 0x0001 #define GPIO_HANDSET 0x0004 #define GPIO_HOOK1 0x0008 #define GPIO_CID1 0x0020 #define GPIO_LED_CARRIER 0x0040 #define GPIO_LED_HOOK 0x0080 #define GPIO_RFC 0x0100 #define GPIO_DISHS 0x0200 #define GPIO_DP 0x0400 /* used for Off Hook */ #define GPIO_BUZEN 0x0800 #define GPIO_DC 0x1000 #define GPIO_LED_RW 0x2000 #define GPIO_MONOLITHINC 0x4000 /* FIFO control */ #define BYTE_ORDER_LE 0x8000 /* gpio hook off bit mask */ #define GPIO_HOOK1_OFF (GPIO_HOOK1) //#define GPIO_HOOK1_OFF (GPIO_HOOK1|GPIO_DP|GPIO_DC) /* st7554 hw parameters */ #define ST7554_FIFO_SIZE 128 #define ST7554_HW_IODELAY 48 /* urb size */ #define DESCFRAMES 5 /* control message timeout */ #define CONTROL_MSG_TMO HZ /* data type definitions */ struct st7554_state { const char *name; unsigned minor; struct usb_device *usbdev; struct usb_interface *iface ; unsigned started; /* fixme: atomic */ spinlock_t lock; struct semaphore sem; wait_queue_head_t wait; wait_queue_head_t start_wait; unsigned status; struct file *file; unsigned int ctrl_ep; /* control endpoint */ u32 intr_status; /* interrupt status */ struct urb intr_urb; /* interrupt urb */ unsigned int format; /* sample format */ unsigned int srate; /* sample rate */ unsigned int fragsize; /* fragsize in bytes */ u16 gpio; /* gpio_out register shadow */ int delay; /* i/o delay */ int disbalance; /* output disbalance */ struct usb_modem_channel { /* modem in/out channels */ unsigned int maxsz; /* max packet size */ unsigned int pipe; /* usb data pipe */ struct dmabuf { /* "dma" ring buffer */ int count; /* byte count */ unsigned int head; /* head(write) pointer */ unsigned int tail; /* tail(read) pointer */ unsigned int size; /* buffer size */ unsigned char *buf; /* data buffer */ unsigned int error; /* over/underrun */ } dma; struct urb *urb[2]; /* isoc urb */ } mo, mi; struct codec { /* installed codec */ const char *name; int (*set_srate )(struct st7554_state *,unsigned); int (*set_format)(struct st7554_state *,unsigned); } codec; /* register access proc */ int (*get_reg)(struct st7554_state *s, u8 reg, u16 *value); int (*set_reg)(struct st7554_state *s, u8 reg, u16 value); }; static struct st7554_state *st7554_table[MAX_MODEMS]; static DECLARE_MUTEX(open_sem); /* --------------------------------------------------------------------- */ static int dma_init (struct dmabuf *db) { db->buf = (unsigned char *)__get_free_pages(GFP_KERNEL, 1); if (!db->buf) return -ENOMEM; db->head = db->tail = db->count = 0; db->size = 1UL<<(PAGE_SHIFT + 1) ; return 0; } static void dma_free(struct dmabuf *db) { int size = db->size; db->head = db->tail = db->count = db->size = 0; free_pages((unsigned long)db->buf, get_order(size)); db->buf = NULL; } static int dmabuf_copyin(struct dmabuf *db, void *buffer, unsigned int size) { int ret = 0, cnt; while (size) { cnt = db->size - db->head; if (cnt > size ) cnt = size; if (cnt > db->size - db->count) cnt = db->size - db->count; if (cnt <= 0) { /* overflow */ db->error++; USB_ERR("dmabuf_copyin: overrun: ret %d.\n", ret); return ret; } memcpy(db->buf + db->head, buffer, cnt); buffer += cnt; db->count += cnt; db->head += cnt ; if (db->head >= db->size) db->head = 0; size -= cnt; ret += cnt; } return ret; } /* --------------------------------------------------------------------- */ #define arrsize(a) (sizeof(a)/sizeof((a)[0])) #define NUM_OF_URBS(ch) (sizeof((ch)->urb)/sizeof((ch)->urb[0])) #define MO_URB_NO(s,u) ((u) == (s)->mo.urb[1]) #define MI_URB_NO(s,u) ((u) == (s)->mi.urb[1]) #define BYTES_IN_FRAMES(s,n) ((((s)->srate*(n))/1000)<<(MFMT_BYTESSHIFT((s)->format))) #define FILL_URB(state,ch,u) { \ (u)->dev = (state)->usbdev; \ (u)->context = (state); \ (u)->number_of_packets = DESCFRAMES; \ (u)->status = 0; \ (u)->transfer_flags = USB_ISO_ASAP; } #define FILL_DESC_OUT(state,ch,u,count) { int i; \ unsigned shft = MFMT_BYTESSHIFT((state)->format); \ unsigned len = count; \ for (i = 0 ; i < DESCFRAMES ; i++) { \ (u)->iso_frame_desc[i].actual_length = 0; \ (u)->iso_frame_desc[i].offset = 0; \ (u)->iso_frame_desc[i].length = (len/(DESCFRAMES-i))&(~shft); \ len -= (u)->iso_frame_desc[i].length; \ } } #define FILL_DESC_IN(state,ch,u,count) { int i, offs; \ for ( i=0 , offs=0 ; i < DESCFRAMES; i++, offs += (ch)->maxsz) { \ (u)->iso_frame_desc[i].length = (ch)->maxsz; \ (u)->iso_frame_desc[i].offset = offs; } } #define FILL_URB_OUT(state,ch,u,len) \ { FILL_URB(state,ch,u); FILL_DESC_OUT(state,ch,u,len);} #define FILL_URB_IN(state,ch,u,len) \ { FILL_URB(state,ch,u); FILL_DESC_IN(state,ch,u,len); } /* --------------------------------------------------------------------- */ static int mi_init (struct st7554_state *s) { struct usb_modem_channel *ch = &s->mi; void *buf; int i, ret; ret = dma_init (&ch->dma); if (ret) return ret; /* urb init */ buf = kmalloc( NUM_OF_URBS(ch)*ch->maxsz*DESCFRAMES, GFP_KERNEL); if (!buf) goto error; /* debug */ memset(buf,0,NUM_OF_URBS(ch)*ch->maxsz*DESCFRAMES); for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) { struct urb *u = usb_alloc_urb(DESCFRAMES); if (!u) { while(i) usb_free_urb(ch->urb[--i]); goto error1; } memset(u,0,sizeof(*u)+DESCFRAMES*sizeof(u->iso_frame_desc[0])); spin_lock_init(&u->lock); u->pipe = ch->pipe; u->transfer_buffer_length = ch->maxsz*DESCFRAMES; u->transfer_buffer = buf + i*(ch->maxsz*DESCFRAMES); FILL_URB_IN(s,ch,u,ch->maxsz*DESCFRAMES); ch->urb[i] = u; } return 0; error1: kfree(buf); error: dma_free(&ch->dma); return -ENOMEM; } static int mi_free(struct st7554_state *s) { struct usb_modem_channel *ch = &s->mi; void *buf = ch->urb[0]->transfer_buffer; int i; /* urb release */ for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) usb_free_urb(ch->urb[i]); kfree(buf); /* dma release */ dma_free(&ch->dma); return 0; } static int mo_init (struct st7554_state *s) { struct usb_modem_channel *ch = &s->mo; int i, ret; ret = dma_init (&ch->dma); if (ret) return ret; /* urb init */ for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) { struct urb *u = usb_alloc_urb(DESCFRAMES); if (!u) { while(i) usb_free_urb(ch->urb[--i]); goto error; } memset(u,0,sizeof(*u)+DESCFRAMES*sizeof(u->iso_frame_desc[0])); spin_lock_init(&u->lock); u->pipe = ch->pipe; u->transfer_buffer_length = ch->maxsz*DESCFRAMES; u->transfer_buffer = ch->dma.buf; FILL_URB_OUT(s,ch,u,ch->maxsz*DESCFRAMES); ch->urb[i] = u; } return 0; error: dma_free(&ch->dma); return -ENOMEM; } static int mo_free(struct st7554_state *s) { struct usb_modem_channel *ch = &s->mo; int i; /* urb release */ for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) usb_free_urb(ch->urb[i]); /* dma release */ dma_free(&ch->dma); return 0; } /* ----------------------------------------------------------------------- */ static void st7554_interrupt(struct urb *urb) { struct st7554_state *s = urb->context; u32 *status = urb->transfer_buffer; u16 fifo_status; u16 gpio_status; if (urb->status) { if (urb->status != -ENOENT) /* unlinked */ USB_ERR("st7554 interrupt: bad status received: %d\n", urb->status); return; } fifo_status = *status &0xffff; gpio_status = *status >> 16; #if 1 USB_DBG("interrupt: fifo %04x, gpio %04x...\n", fifo_status, gpio_status); #endif if (fifo_status & SSI1_UNDERRUN ) { USB_ERR("st7554: fifo underrun!\n"); s->status |= MDMSTAT_ERROR; } if (fifo_status & SSI1_OVERRUN) { USB_ERR("st7554: fifo overrun!\n"); s->status |= MDMSTAT_ERROR; } if (gpio_status & GPIO_RING1) { s->status |= MDMSTAT_RING; } if(s->status) wake_up_interruptible(&s->wait); } /* --------------------------------------------------------------------- */ static void mo_complete(struct urb *u) { struct st7554_state *s = u->context; struct dmabuf *db = &s->mo.dma; iso_packet_descriptor_t *p; unsigned long flags; int i; if (u->status) { if (u->status == -ENOENT) return; /* unlinked */ USB_ERR("mo_complete %d: err: urb status %d.\n", MO_URB_NO(s,u), u->status); } spin_lock_irqsave(&s->lock, flags); for (i = 0 ; i < u->number_of_packets ; i++) { p = u->iso_frame_desc + i; if (p->status) USB_ERR("mo_complete %d: err: fr.%d status %d.\n", MO_URB_NO(s,u), i, p->status); if (s->disbalance + (int)p->length > 0) { p->length += s->disbalance; s->disbalance = 0; } else { /* FIXME: striping may optimize case recovery, but fully stripped urb will cause mem leak in usb controller driver (usb-uhci.o) */ s->disbalance += p->length - 2 ; p->length = 2; } if (p->length > s->mo.maxsz) { s->disbalance += p->length - s->mo.maxsz; p->length = s->mo.maxsz; } if (p->length > db->size - db->tail) { s->disbalance += p->length - (db->size - db->tail); p->length = db->size - db->tail; } p->offset = db->tail; db->tail = (db->tail + p->length)%db->size ; db->count -= p->length; } spin_unlock_irqrestore(&s->lock, flags); USB_DBG_URB("mo_complete %d: %d: sent %d.\n", MO_URB_NO(s,u), u->start_frame, u->actual_length); } static void mo_startup_complete(struct urb *u) { struct st7554_state *s = u->context; if (u->status) { if (u->status == -ENOENT) return; /* unlinked */ USB_ERR("mo_startup_complete %d: err: urb status %d.\n", MO_URB_NO(s,u), u->status); } USB_DBG("mo_startup_complete %d: %d: sent %d.\n", MO_URB_NO(s,u), u->start_frame, u->actual_length); FILL_DESC_OUT(s,&s->mo,u,BYTES_IN_FRAMES(s,DESCFRAMES)); u->complete = mo_complete; mo_complete(u); wake_up(&s->start_wait); } /* ----------------------------------------------------------------------- */ static void mi_complete(struct urb *u) { struct st7554_state *s = u->context; iso_packet_descriptor_t *p; unsigned long flags; int i; if (u->status) { if (u->status == -ENOENT) return; /* unlinked */ USB_ERR("mi_complete %d: err: urb status %d.\n", MI_URB_NO(s,u), u->status); u->status = 0; goto error; } spin_lock_irqsave(&s->lock, flags); for (i = 0 ; i < u->number_of_packets ; i++) { p = u->iso_frame_desc + i; if (p->status) { USB_ERR("mi_complete %d: err: fr.%d status %d.\n", MI_URB_NO(s,u), i, p->status); } dmabuf_copyin(&s->mi.dma, u->transfer_buffer + p->offset, p->actual_length); /* set length of out urb (in driven) */ u->next->iso_frame_desc[i].length = p->actual_length; } if(s->mi.dma.count > 0) wake_up_interruptible(&s->wait); spin_unlock_irqrestore(&s->lock, flags); error: USB_DBG_URB("mi_complete %d: %d: recv %d.\n", MI_URB_NO(s,u), u->start_frame, u->actual_length); } static void mi_startup_complete(struct urb *u) { struct st7554_state *s = u->context; iso_packet_descriptor_t *p; unsigned long flags; int i; if (u->status) { if (u->status == -ENOENT) return; /* unlinked */ USB_ERR("mi_startup_complete %d: err: urb status %d.\n", MI_URB_NO(s,u), u->status); u->status = 0; goto error; } spin_lock_irqsave(&s->lock, flags); if(u->actual_length > 0) { for (i = 0 ; i < u->number_of_packets ; i++) { p = u->iso_frame_desc + i; if (p->status) { USB_ERR("mi_startup_complete %d: err: fr.%d status %d.\n", MI_URB_NO(s,u), i, p->status); } dmabuf_copyin(&s->mi.dma, u->transfer_buffer + p->offset, p->actual_length); } s->mi.urb[0]->complete = mi_complete; s->mi.urb[1]->complete = mi_complete; } i = BYTES_IN_FRAMES(s,DESCFRAMES) - u->actual_length; USB_DBG("mi_startup: advance mo head +%d...\n",i); s->mo.dma.count += i; s->mo.dma.head = (s->mo.dma.head + i)%s->mo.dma.size; if(s->mi.dma.count > 0) wake_up_interruptible(&s->wait); spin_unlock_irqrestore(&s->lock, flags); error: USB_DBG("mi_startup_complete %d: %d: recv %d.\n", MI_URB_NO(s,u), u->start_frame, u->actual_length); } /* --------------------------------------------------------------------- */ /* * Start process brief scheme: * * |<----DESCFRAMES--->||<----DESCFRAMES--->| * frame:| 0 | 1 | 2 | 3 | 4 || 5 | 6 | 7 | 8 | 9 | * ----------------------------------------------------------- * | in urb 0 || in urb 1 | * in: |+++|+++|+++|+++|+++||+++|+++|+++|+++|+++| * | out urb 0 || out urb 1 | * out: |+++|+++|+++|+++|+++||+++|+++|+++|+++|+++| * ----------------------------------------------------------- * fill out fifo start fifo * |<----------------->||<----------------->| * * */ static int st7554_start (struct st7554_state *s) { DECLARE_WAITQUEUE(wait, current); int len, ret; USB_DBG ("st7554 start...\n"); down(&s->sem); /* setup run params */ s->disbalance = 0; len = 32; memset(s->mo.dma.buf,0,s->mo.dma.size); s->mo.dma.count = len; s->mo.dma.head = len; s->delay = len + ST7554_FIFO_SIZE + BYTES_IN_FRAMES(s,DESCFRAMES)*2; /* prepare urbs */ FILL_URB_IN(s, &s->mi, s->mi.urb[0], s->mi.maxsz*DESCFRAMES); FILL_URB_IN(s, &s->mi, s->mi.urb[1], s->mi.maxsz*DESCFRAMES); FILL_URB_OUT(s, &s->mo, s->mo.urb[0], s->mo.maxsz*DESCFRAMES); FILL_URB_OUT(s, &s->mo, s->mo.urb[1], BYTES_IN_FRAMES(s,DESCFRAMES)); s->mi.urb[0]->complete = mi_startup_complete; s->mo.urb[0]->complete = mo_startup_complete; s->mi.urb[1]->complete = mi_startup_complete; s->mo.urb[1]->complete = mo_complete; /* all urbs are composed as ring listed pairs: mo0 <-> mi1 ; mi0 <-> mo */ s->mi.urb[0]->next = s->mo.urb[1]; s->mo.urb[1]->next = s->mi.urb[0]; s->mi.urb[1]->next = s->mo.urb[0]; s->mo.urb[0]->next = s->mi.urb[1]; /* submit all urbs */ set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&s->start_wait, &wait); if ( ( ret = usb_submit_urb(s->mo.urb[0]) ) || ( ret = usb_submit_urb(s->mi.urb[0]) ) || ( ret = usb_submit_urb(s->mo.urb[1]) ) || ( ret = usb_submit_urb(s->mi.urb[1]) ) ) { USB_ERR("st7554: cannot submit urb: %d\n",ret); set_current_state(TASK_RUNNING); remove_wait_queue(&s->start_wait, &wait); goto error; } USB_DBG("st7554 start: submitted urbs: " "mo0(%p) %d, mi0(%p) %d, mo1(%p) %d, mi1(%p) %d.\n", s->mo.urb[0], s->mo.urb[0]->start_frame, s->mi.urb[0], s->mi.urb[0]->start_frame, s->mo.urb[1], s->mo.urb[1]->start_frame, s->mi.urb[1], s->mi.urb[1]->start_frame); ret = schedule_timeout(HZ); set_current_state(TASK_RUNNING); remove_wait_queue(&s->start_wait, &wait); if(ret == 0) { USB_DBG("st7554 start: timeout!\n"); ret = -1; goto error; } /* start fifo */ ret = s->set_reg(s, ST7554_SSI1_COUNTER, s->fragsize); if (ret < 0) goto error; s->started = 1; /* set fifo mask */ ret = s->set_reg(s, ST7554_FIFO_MASK, SSI1_UNDERRUN|SSI1_OVERRUN); error: up(&s->sem); if (ret==0) return 0; usb_unlink_urb(s->mo.urb[0]); usb_unlink_urb(s->mi.urb[0]); usb_unlink_urb(s->mo.urb[1]); usb_unlink_urb(s->mi.urb[1]); return ret; } static int st7554_stop (struct st7554_state *s) { USB_DBG ("st7554 stop...\n"); down(&s->sem); if(!s->started) goto out; /* clear and stop fifo */ s->set_reg(s, ST7554_FIFO_MASK, 0); s->set_reg(s, ST7554_SSI1_COUNTER, 0); /* stop channels */ USB_DBG_URB("st7554_stop: unlink mi urbs...\n"); usb_unlink_urb(s->mi.urb[0]); usb_unlink_urb(s->mi.urb[1]); USB_DBG_URB("st7554_stop: unlink mo urbs...\n"); usb_unlink_urb(s->mo.urb[0]); usb_unlink_urb(s->mo.urb[1]); USB_DBG_URB("st7554_stop: in/out urbs unlinked.\n"); /* flush buffers */ s->mi.dma.count = s->mi.dma.head = s->mi.dma.tail = 0; s->mo.dma.count = s->mo.dma.head = s->mo.dma.tail = 0; s->started = 0; USB_DBG ("st7554 stop: delay %d.\n", s->delay); out: up(&s->sem); return 0; } static int st7554_set_srate (struct st7554_state *s, unsigned srate) { unsigned long flags; if (s->srate == srate) return 0; if(s->codec.set_srate(s, srate)) return -EINVAL; spin_lock_irqsave(&s->lock,flags); s->srate = srate; spin_unlock_irqrestore(&s->lock,flags); return 0; } static int st7554_set_format (struct st7554_state *s, unsigned format) { unsigned long flags; if(format == MFMT_QUERY) return s->codec.set_format(s, MFMT_QUERY); if (s->format == format) return 0; if(s->codec.set_format(s, format)) return -EINVAL; spin_lock_irqsave(&s->lock,flags); s->format = format; spin_unlock_irqrestore(&s->lock,flags); return 0; } static int st7554_set_frag (struct st7554_state *s, unsigned frag) { unsigned long flags; spin_lock_irqsave(&s->lock,flags); s->fragsize = frag; spin_unlock_irqrestore(&s->lock,flags); return 0; } static int st7554_set_hook(struct st7554_state *s, unsigned hook) { unsigned long flags; u16 val = s->gpio; if (hook == MODEM_HOOK_OFF) val |= (GPIO_HOOK1_OFF|GPIO_LED_HOOK); else if (hook == MODEM_HOOK_ON) val &= ~(GPIO_HOOK1_OFF|GPIO_LED_HOOK); else return -EINVAL; if(s->set_reg(s, ST7554_GPIO_OUT, val)) return -EIO; spin_lock_irqsave(&s->lock,flags); s->gpio = val; spin_unlock_irqrestore(&s->lock,flags); return 0; } /* * file operations * */ static ssize_t st7554_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct st7554_state *s = (struct st7554_state *)file->private_data; struct dmabuf *db; unsigned long flags; int cnt, ret = 0; if (!s) return -ENODEV; db = &s->mi.dma; while (count) { cnt = count; spin_lock_irqsave(&s->lock,flags); if ( cnt > db->count ) cnt = db->count; if ( cnt > db->size - db->tail ) cnt = db->size - db->tail; spin_unlock_irqrestore(&s->lock,flags); if ( cnt <= 0 ) break; if(copy_to_user(buffer, db->buf + db->tail, cnt)) return -EFAULT; spin_lock_irqsave(&s->lock,flags); db->count -= cnt; db->tail = (db->tail + cnt)%db->size; spin_unlock_irqrestore(&s->lock,flags); buffer += cnt; count -= cnt; ret += cnt; } return ret; } static ssize_t st7554_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct st7554_state *s = (struct st7554_state *)file->private_data; struct dmabuf *db; unsigned long flags; int cnt, ret = 0; if (!s) return -ENODEV; db = &s->mo.dma; while (count) { cnt = count; spin_lock_irqsave(&s->lock,flags); if ( cnt > db->size - db->count ) cnt = db->size - db->count; if ( cnt > db->size - db->head ) cnt = db->size - db->head; spin_unlock_irqrestore(&s->lock,flags); if ( cnt <= 0 ) return ret; if(copy_from_user(db->buf + db->head, buffer, cnt)) return -EFAULT; spin_lock_irqsave(&s->lock,flags); db->count += cnt; db->head = (db->head + cnt)%db->size; spin_unlock_irqrestore(&s->lock,flags); buffer += cnt; count -= cnt; ret += cnt; } return ret; } static unsigned int st7554_poll(struct file *file, poll_table *wait) { struct st7554_state *s = (struct st7554_state *)file->private_data; unsigned long flags; unsigned int mask = 0; if (!s) return POLLERR; poll_wait(file,&s->wait,wait); spin_lock_irqsave(&s->lock,flags); if(s->status & MDMSTAT_ERROR) mask |= POLLERR; if(s->status & MDMSTAT_RING) mask |= POLLPRI; if(s->mi.dma.count > 0) mask |= POLLIN | POLLRDNORM; spin_unlock_irqrestore(&s->lock,flags); return mask; } static int st7554_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct st7554_state *s = (struct st7554_state *)file->private_data; USB_DBG ("st7554 ioctl: cmd %x...\n", cmd); if (!s || !s->usbdev) return -ENODEV; switch (cmd) { case MDMCTL_CAPABILITIES: return -EINVAL; case MDMCTL_HOOKSTATE: return st7554_set_hook(s, arg); case MDMCTL_SPEED: return st7554_set_srate(s, arg); case MDMCTL_GETFMTS: return st7554_set_format(s, MFMT_QUERY); case MDMCTL_SETFMT: return st7554_set_format(s, arg); case MDMCTL_SETFRAGMENT: return st7554_set_frag(s, arg); case MDMCTL_CODECTYPE: return CODEC_STLC7550; case MDMCTL_IODELAY: { int val; val = s->delay + ST7554_HW_IODELAY; USB_DBG("st7554 ioctl: IODELAY = %d.\n", val); return val; } case MDMCTL_START: return st7554_start(s); case MDMCTL_STOP: return st7554_stop(s); case MDMCTL_GETSTAT: USB_DBG ("st7554 ioctl: GETSTAT...\n"); { unsigned long flags; unsigned stat; spin_lock_irqsave(&s->lock,flags); stat = s->status; s->status = 0; spin_unlock_irqrestore(&s->lock,flags); if (put_user(stat, (unsigned *) arg)) return -EFAULT; } return 0; default: break; } return -ENOIOCTLCMD; } static int st7554_open(struct inode *inode, struct file *file) { struct st7554_state *s; unsigned minor = MINOR(inode->i_rdev); USB_DBG("st7554 open...\n"); if(minor > arrsize(st7554_table)) return -ENODEV; down(&open_sem); s = st7554_table[minor]; if(!s || !s->usbdev) { up(&open_sem); return -ENODEV; } if(s->file) { up(&open_sem); return -EBUSY; } s->file = file; file->private_data = s; up(&open_sem); MOD_INC_USE_COUNT; return 0; } static int st7554_close(struct inode *inode, struct file *file) { struct st7554_state *s = (struct st7554_state *)file->private_data; USB_DBG("st7554 close...\n"); if(s) { st7554_stop(s); s->file = NULL; } MOD_DEC_USE_COUNT; return 0; } static struct file_operations st7554_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = st7554_read, .write = st7554_write, .poll = st7554_poll, .ioctl = st7554_ioctl, .open = st7554_open, .release = st7554_close, }; /* --------------------------------------------------------------------- */ static int st7554_get_reg (struct st7554_state *s, u8 reg, u16 *val) { int ret; ret = usb_control_msg(s->usbdev, usb_rcvctrlpipe(s->usbdev,s->ctrl_ep), reg|USB_DIR_IN, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN, 0, 0, val, sizeof(*val), CONTROL_MSG_TMO); if ( ret < 0 ) USB_ERR("st7554_get_reg: error: reg %x, ret = %d\n", reg, ret); return ret; } static int st7554_set_reg(struct st7554_state *s, u8 reg, u16 value) { int ret = usb_control_msg(s->usbdev, usb_sndctrlpipe(s->usbdev,s->ctrl_ep), reg, USB_TYPE_VENDOR|USB_RECIP_DEVICE, value, 0, NULL, 0, CONTROL_MSG_TMO); if (ret < 0 ) USB_ERR("st7554_set_reg: error: reg %x, val %x, ret = %d\n", reg, value, ret); return ret; } static int stlc7550_set_srate(struct st7554_state *s, unsigned int srate) { if ( srate == 8000 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3c8); else if (srate == 9600 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3c0); else if (srate == 16000 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3f0); else if (srate == 24000 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3e8); else return -EINVAL; } static int stlc7550_set_format(struct st7554_state *s, unsigned int format) { if (format == MFMT_QUERY) return MFMT_U16_LE | MFMT_S16_LE; if (!MFMT_IS_16BIT(format)) return -EINVAL; if (!MFMT_IS_LE(format)) return -EINVAL; return 0; } #if 0 static int st75951_set_srate(struct st7554_state *s, unsigned int srate) { return -EINVAL; } static int st75951_set_format(struct st7554_state *s, unsigned int format){ return -EINVAL; } #endif /* ---------------------------------------------------------------------- */ #if 0 /* ifdef DEBUG */ #define PRINT_REG(s ,reg, name) { u16 val; int ret; \ ret = s->get_reg(s,reg,&val);\ USB_DBG("st7554: vendor reg %s (%x) = %x , ret %d.\n", \ name, reg, val, ret); } static void print_all_regs(struct st7554_state *s) { PRINT_REG(s, ST7554_REVISION,"REVISION"); PRINT_REG(s, ST7554_SSI1_CONTROL,"SSI1_CONTROL"); PRINT_REG(s, ST7554_SSI2_CONTROL,"SSI2_CONTROL"); PRINT_REG(s, ST7554_FIFO_MASK,"FIFO_MASK"); PRINT_REG(s, ST7554_FIFO_SSI1_COUNTER,"FIFO_SSI1_COUNTER"); PRINT_REG(s, ST7554_FIFO_SSI2_COUNTER,"FIFO_SSI2_COUNTER"); PRINT_REG(s, ST7554_GPIO_DIR,"GPIO_DIR"); PRINT_REG(s, ST7554_GPIO_OUT,"GPIO_OUT"); PRINT_REG(s, ST7554_GPIO_MASK,"GPIO_MASK"); PRINT_REG(s, ST7554_GPIO_INV,"GPIO_INV"); PRINT_REG(s, ST7554_GPIO_STATUS,"GPIO_STATUS"); PRINT_REG(s, ST7554_FIFO_CONTROL1,"FIFO_CONTROL1"); PRINT_REG(s, ST7554_FIFO_CONTROL2,"FIFO_CONTROL2"); } #endif /* DEBUG */ /* ---------------------------------------------------------------------- */ #define SET_REG(s,reg,val) { ret = s->set_reg(s,reg,val); if (ret < 0) { USB_ERR("st7554: failed to set reg %x.\n", reg); ; return ret;} } #define CLEAR_ENDPOINT(s,pipe) { \ if (usb_endpoint_halted(s->usbdev, usb_pipeendpoint(pipe), usb_pipeout(pipe))) { \ USB_DBG("st7554_init: pipe %d is halted. clear...\n", usb_pipeendpoint(pipe)); \ if (!(ret=usb_clear_halt(s->usbdev, pipe))) return ret;}} static int st7554_init (struct st7554_state *s) { int ret; s->gpio = 0; SET_REG(s, ST7554_GPIO_DIR, 0x3ff8); SET_REG(s, ST7554_GPIO_OUT, 0x00); /* SET_REG(s, ST7554_GPIO_MASK, GPIO_HANDSET); */ SET_REG(s, ST7554_GPIO_MASK, GPIO_RING1); SET_REG(s, ST7554_FIFO_CONTROL1, 0x2828|BYTE_ORDER_LE); SET_REG(s, ST7554_FIFO_CONTROL2, 0x2828); SET_REG(s, ST7554_FIFO_MASK, 0x00); SET_REG(s, ST7554_FIFO_MASK, SSI1_UNDERRUN|SSI1_OVERRUN); SET_REG(s, ST7554_SSI1_COUNTER, 0x00); SET_REG(s, ST7554_SSI2_COUNTER, 0x00); /* power up */ SET_REG(s, ST7554_SSI1_CONTROL, SSI1_POWERUP); /* control word */ SET_REG(s, ST7554_SSI1_CWORD, 0x3c0); /* no inversion */ SET_REG(s, ST7554_GPIO_INV, 0); /* clear usb ep */ CLEAR_ENDPOINT(s, s->mi.pipe); CLEAR_ENDPOINT(s, s->mo.pipe); /* submit interrupt request */ s->intr_urb.dev = s->usbdev; ret = usb_submit_urb(&s->intr_urb); if (ret < 0) { USB_ERR("st7554_init: cannot submit interrupt urb: %d.\n", ret); return ret; } return 0; } static int st7554_release (struct st7554_state *s) { int ret; /* unlink interrupt urb */ ret = usb_unlink_urb(&s->intr_urb); if (ret) { USB_ERR("st7554_release: unlink intr urb: %d\n", ret); } /* clear fifo & gpio masks */ SET_REG(s, ST7554_FIFO_MASK, 0); SET_REG(s, ST7554_GPIO_MASK, 0); /* hook on && all */ s->gpio = 0; SET_REG(s, ST7554_GPIO_OUT, 0x00); /* power down */ SET_REG(s, ST7554_SSI1_CONTROL, SSI1_POWERDOWN); return 0; } /* --------------------------------------------------------------------- */ static void *st7554_probe(struct usb_device *usbdev, unsigned int ifnum, const struct usb_device_id *id); static void st7554_disconnect(struct usb_device *usbdev, void *ptr); static struct usb_device_id st7554_ids [] = { { USB_DEVICE(ST7554_ID_VENDOR,ST7554_ID_PRODUCT) }, { 0 } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, st7554_ids); static struct usb_driver st7554_usb_driver = { .name = "ST7554 USB Modem", .probe = st7554_probe, .disconnect = st7554_disconnect, .driver_list = LIST_HEAD_INIT(st7554_usb_driver.driver_list), .id_table = st7554_ids, }; /* --------------------------------------------------------------------- */ static void *st7554_probe(struct usb_device *usbdev, unsigned int ifnum, const struct usb_device_id *id) { struct usb_interface *iface; struct usb_interface_descriptor *ifdesc; struct st7554_state *s; unsigned int intr_ep; int i; u16 val; if ( ifnum != 0 ) return NULL; iface = usbdev->actconfig->interface; if ( iface->act_altsetting != ST7554_IFACE_MODEM_ALTSETTING ) return NULL; USB_DBG("st7554 usb: probe if %02x, alt %02x...\n", ifnum,iface->act_altsetting); ifdesc = iface->altsetting + iface->act_altsetting; if (usb_interface_claimed(iface)) { USB_ERR("st7554 probe: interface is busy.\n"); return NULL; } s = kmalloc(sizeof(*s), GFP_KERNEL); if (!s) { USB_ERR("st7554 probe: no memory.\n"); return NULL; } memset(s, 0, sizeof(*s)); spin_lock_init(&s->lock); init_MUTEX(&s->sem); init_waitqueue_head(&s->wait); init_waitqueue_head(&s->start_wait); s->name = "ST7554 USB Modem"; s->usbdev = usbdev; s->iface = iface; s->ctrl_ep = 0; /* interrupt init */ intr_ep = ifdesc->endpoint[0].bEndpointAddress & 0x0f; FILL_INT_URB(&s->intr_urb, s->usbdev, usb_rcvintpipe(s->usbdev,intr_ep), &s->intr_status, sizeof(s->intr_status), st7554_interrupt, s, ifdesc->endpoint[0].bInterval); s->intr_urb.transfer_flags = 0; s->mo.pipe = usb_sndisocpipe(usbdev, 2); s->mo.maxsz = ifdesc->endpoint[1].wMaxPacketSize; s->mi.pipe = usb_rcvisocpipe(usbdev, 3); s->mi.maxsz = ifdesc->endpoint[2].wMaxPacketSize; s->get_reg = st7554_get_reg; s->set_reg = st7554_set_reg; /* SSI1 codec detection */ if (s->get_reg(s,ST7554_GPIO_STATUS,&val) < 0) { USB_ERR("st7554 probe: cannot detect codec type.\n"); goto error; } if (val&GPIO_MONOLITHINC) { /* st75951/2 silicon DAA codec */ USB_ERR("st7554 probe: unsupported codec st75951/2.\n"); s->codec.name = "stlc75971/2"; goto error; } else { USB_DBG("codec stlc7550 detected.\n"); s->codec.name = "stlc7550"; s->codec.set_srate = stlc7550_set_srate ; s->codec.set_format = stlc7550_set_format; } if(st7554_init(s)) { USB_ERR("st7554 probe: cannot initialize device.\n"); goto error; } usb_set_configuration(usbdev, usbdev->actconfig->bConfigurationValue); usb_set_interface(usbdev, 0 , ST7554_IFACE_MODEM_ALTSETTING); st7554_set_hook (s, MODEM_HOOK_ON); st7554_set_srate (s, 9600); st7554_set_format(s, MFMT_S16_LE); st7554_set_frag (s, 96); if (mo_init(s) < 0 ) { USB_ERR("st7554: cannot init out channel.\n"); goto error1; } if (mi_init(s) < 0 ) { USB_ERR("st7554: cannot init in channel.\n"); mo_free(s); goto error1; } down(&open_sem); for(i = 0 ; i < arrsize(st7554_table) ; i++) { if(st7554_table[i] == NULL) { st7554_table[i] = s; s->minor = i; break; } } up(&open_sem); if (i == arrsize(st7554_table)) { USB_ERR("no more states\n"); mo_free(s); mi_free(s); goto error1; } #ifdef CONFIG_DEVFS_FS { char buf[8]; sprintf(buf, "slusb%d", s->minor); devfs_register (NULL, buf, DEVFS_FL_DEFAULT, MY_MAJOR, s->minor, S_IFCHR|S_IRUSR|S_IWUSR, &st7554_fops, NULL); } #endif USB_INFO(KERN_INFO "slusb: slusb%d is found.\n", s->minor); return s; error1: st7554_release(s); error: kfree(s); return NULL; } static void st7554_disconnect(struct usb_device *usbdev, void *ptr) { struct st7554_state *s = ptr; USB_DBG("st7554 disconnect...\n"); if (!s || !s->usbdev) { USB_DBG("st7554 disconnect: no dev.\n"); return; } down(&open_sem); if(s->file) { /* fixme: notify disconnect */ s->file->private_data = NULL; s->file = NULL; } #ifdef CONFIG_DEVFS_FS { char buf[8]; void * handle; sprintf(buf, "slusb%d", s->minor); handle = devfs_find_handle (NULL, buf, MY_MAJOR, s->minor, DEVFS_SPECIAL_CHR, 0); devfs_unregister (handle); } #endif st7554_stop(s); st7554_release(s); s->usbdev = NULL; /* notify disconnect */ // ... st7554_table[s->minor] = NULL; up(&open_sem); mo_free(s); mi_free(s); kfree(s); } /* ---------------------------------------------------------------------- */ static int __init st7554_modem_init(void) { int ret; USB_INFO ("ST7554 USB Modem.\n"); ret = usb_register(&st7554_usb_driver); if ( ret ) { USB_ERR ("st7554_modem_init: cannot register usb device.\n"); return ret; } if(register_chrdev(MY_MAJOR, "slusb", &st7554_fops) < 0) { usb_deregister(&st7554_usb_driver); return -ENOMEM; } return 0; } static void __exit st7554_modem_exit(void) { USB_DBG ("st7554: exit...\n"); unregister_chrdev(MY_MAJOR,"slusb"); usb_deregister(&st7554_usb_driver); } module_init(st7554_modem_init); module_exit(st7554_modem_exit); EXPORT_NO_SYMBOLS; MODULE_AUTHOR("Smart Link Ltd."); MODULE_DESCRIPTION("ST7554 USB Smart Link Soft Modem driver."); MODULE_LICENSE("Smart Link Ltd."); slmodem-2.9.11-20110321/drivers/kernel-ver.c0000644000175000017500000000066011420700445016522 0ustar marvmarv/* * kernel-ver.c - prints Linux kernel version to stdout and exit. * */ #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33) #include #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) #include #endif // KERNEL_VERSION(2,6,18) #endif // KERNEL_VERSION(2,6,33) int main() { printf ("%s\n",UTS_RELEASE); return 0; } slmodem-2.9.11-20110321/drivers/Module.markers0000644000175000000620000000000011132260453017234 0ustar marvstaffslmodem-2.9.11-20110321/drivers/amrlibs.o0000644000175000000620000204776010773430100016262 0ustar marvstaffELFc4(t$t$$\$14t=wRt =w+t\$T$ $\$1t$$$렉'D$t @D$Ít&'L$ T$L$ BD$&L$ T$L$ BD$&S\$t=wS T$C$1[$: S\$t=wC$1[Ít&$O܉|$|$ \$\$$t$t$(=$NuT1t$\$O $1ҸT$D$W$1D$\$O $t&1\$t$|$$cb\$t$|$G0뿃=@t$(t$$G\$t$D$ |$zL$W$=wnWh\$t$T$$G|$D$ t(t$("L$$vG %nt$(\$$I\$$v gfff\$O $@ )6\$L$W$D$Et$$t$D$_$L$T$G$t$t&S\$ =C$D$CtpC %C0CCC%C C$C(%C,C0C4C8\$L$$1҃[É\$$Yt&S\$ =w31L$D$S$C$C1[É\$$뻍v'VSt$$=wN$<1҅t2$1ҹ<T$L$3D$ t$$Ct[^Ét$$렉$1ډS\$=wC$\$[&\$$C$\$[ 1ɋD$L$L$$R< Í&'D$ t$t$$\$w$L1ۃ=w؋t$\$Í&t$\$$5؋t$\$$$1ɉÉL$t$$$1҉ÉT$t$y$@t$1D$$T$$1ɉÉL$t$/$$1҉ÉT$t$ $t$1D$$$$1ɉÉL$t$$$1҉ÉT$t$$t$1D$$v$$1ɉÉL$t$Q$$1҉ÉT$t$,$t$1D$$t&S\$=wt+\$H([\$$Puݐ&[Ðv'1\$\$ t$t$$D$$=C\s`w \$t$ËF D$ NL$S`$T$\$t$Ð1\$\$ t$t$$D$$=C\s`w \$t$ËF D$ NL$S`$T$\$t$ÐD$Ðt&D$Ðt&D$T$B`@Ðt&T$B`@Ðt&T$B`@ Ðt&T$L$B`@Ðv'D$$L$L$ T$ D$D$D$Q`B$D$ÃD$(L$$T$ D$L$L$ Q`B$Ðv'v'D$D$ᐐVS1ۉ\$ t$ 1ۋL$(T$$4$L$T$L81ɉH11PPT\XFd$L$\$\$1|D$1ۉ $1111҉1۸m1ɉ$$úT$T$øD$$=Xw$([^1ۉ\$T$TQD$$,T$=v1ۉ\$X$XQD$$PT$xv'VS1ۉ\$ t$ 1ۋL$(T$$4$L$T$L81ɉH11PPT\XFd$L$\$\$1|D$1ۉ $1111҉1۸m1ɉ$$úT$T$øD$$=Xw$([^1ۉ\$T$TQD$$,T$=v1ۉ\$X$XQD$$PT$xv'V8S\$TCdHu5XuK| $\$$X[^Ív4$4$Xt4$4$| $\$$X[^Ð&V8S\$TCdHu5XuK|$\$$Z[^Ív4$4$Xt4$4$|$\$$Z[^Ð&V8S\$HTCdu:XuK|$\$$\$[[^4$4$Xt4$4$룍&'Lt$@t$P\$<1ۉ|$Dl$H4$D$P$uu5؋t$@\$<|$Dl$HLÉ4$^dCCt̐P@<$PÃ<щ$=5ƒ1ɁL$t =cH==u=J\$ =l$ ,$PMb<‰$P$<|$Mb,$)ڃv,$P<‰$P$<ى\$,$Mb&)ځv=v$&P@,$1t@t1҃D$T\$X1ɉ &=w^1ۉ4$1l$=$t4=$m]D$\$$t4$$|$=7l$ ,$P<É$P$<щT$,$'P<<$u=MbMbt&)ڃcvP<<$P@É$= $$$$$$?$D&,|$(|$0\$ t$$GdWd$PtPumu<$\$ t$$|$(,Ív\$$1ҹ<T$L$4$P$<$\$ t$$|$(,Ít$4$P<‰$PΉ$<ˉL$4$|$\$* 1t$$Qt ,1|$(|$0\$ \$4t$$WTuD$P$LWT%t WXt OXt GXt =kt =A t = @t=t&'1\$ |$(t$$,Ã=}\$$P<Љ$P$<|$$뒉<$\$ t$$|$(,Ë\$<$P<؉$D$t$$pV<t$$T$<t$$\$t$$t$$#\$<$W\$1|$ VSL$ \$t$TBXBD$D$1t t[^Ð\$\$$t$|$|$ t*tR\$<$Ɖ\$t$|$ÉSwRJ1C x\$t$|$ËCS t\uC1P$؉\$덐 uSu1ҹ|T$L$$1CڋP$1|$0S1P‰$:K1P$1D$\t$vv'v',\$ \$0t$$t$|$(P4$P@‰$P%$@щT$4$<$D$\$ t$$|$(,Ðv'<|$4|$@l$8\$,t$0<$uk=wx\$P$P@$P%$@ʉL$$4$T$\$,t$0|$4l$8<Ë$=D$m&' T$D$t5wtj tQT$D$ t&Ltbwu߸3 ÉD$ Mu1ҹ|T$L$? SÍ&$1҉T$ @ 1ҹ\T$L$$ Ð&\$\$$t$t$ |$;C=%t7v)=.t.=\$t$|$=@uאt&TK < 1 v σ= wvK$00\$$|$t$ \$t$D$$T\$t$|$Ðt&=B$1T$ |$C$4D$jt$t$ \$\$$ $R,9t&Ë\$2D$$T$ N0t$v\$t$Ít&\$\$ t$t$$|$$t$u\$t$|$Ðt& $R,9tD$$R01ɉL$T$V҉T$ N|$D$L$1ɉL$X$V҉T$ N \4$L$D$\$t$|$UWVSL$0D$4L$T$D$$u [^_]Ë|$|<$<$1ۉt$\$D$Mb=t$Ft&<$11ۉ\$L$ËD$)؃@Mb)MbӋT$)ЃdvL$$R8uT$L$D$$RX=\$T$`CD$1ۉ\$L$\$D$T$$T$=w|<$1[^_]Ã=wtkD$x$\\$JT$4$S8=O$1D$8\$$o$ {t&v'S\$\$|$\$[&'S1҃T$\$ 1ɉL$|$K<1҉T$T$ $T$D$tC4ut =w+[ÍD$$$D$L$[Ít&L$$n[Ðv'S\$|\$$u[Ív\$[v',1t$$t$0|$(|$4\$ D$4$1ɉD$ $St\$$P<‰$P$<щT$$|$4$\$ t$$|$(,Í\$$P<‰$P$<щT$$1\$$Rt|$4$\$ t$$|$(,ÐVS\$$t$ \$4$tf$RDN(1ҋT$L$ $SH$R<4$1҉T$[^ËF(T$D$ $SHF04$D$[^ËN(j^,_\ $I $S@g\$\$ t$t$$$t$\$t$$t$D$ JPᐃ\$\$$t$t$ ÉD$4$VtH6RuJP$t$\$ \$Jh፴&rtʀvu=w \$t$ËD$\$ T$$,L$\$t$Ðv'1҉\$\$$t$t$ L$Ft$ 4$|D$>L$$D$R\$>4$fCul$t&1틗LtdBW$G 틗Lt+BG  Bl$uQu=D$1ɉLL[^_]øD$[G $hD$fv$P빍T$<$SPL떍&D$D$\D$<$D$vLEt&1ɾt$MbMbL$<$PPv)ځr싇$S8ul=w#L$LFD$N$L$ω<$1ۍ|\$T$VL$I4$Q<y<$\t$L$L$ 1퍇|l$D$Lt@ÐV1St$ D$ L$$\$(4$L$\$1<LHFd$\1`C11҉`hplL$$\$\$1D$$111҉11ɉ11ۉ1ɉ1҉$øD$$h$$ÉL$=lwa4$1҉T$=F$w =$=&$=q=x1D$h$hQD$$T$=a1D$l$lQD$$T$+[^Í&߉V1St$ T$ D$$\$(4$D$\$1<LHFd$\1ҍ`C11ɉ`hplD$ $\$\$1ҍT$$111ɉ1111ۉ11ɉ$$úT$h$øD$$=lw]4$1ɉL$=F$w =$=&$=q=x{1҉T$h$hKD$$L$=e1҉T$l$lKD$$L$/[^øt&␐&V<S\$hCdHu5luK $p$$X[^Ív4$4$lt4$4$ $p$$X[^Ð&V<S\$hCdHu5luK $p$$X[^Ív4$4$lt4$4$ $p$$X[^Ð&V<S\$hCdHu:luK$p$$\$Z[^4$4$lt4$4$룍&'UWVSL1ۋD$`T$dL$hD$,T$(L$$$D$|$,`<$uu9L[^_]Ë\$,t$,d4$CCtЉ'W@ʉ $ËG<,$=t=\$0$w<։$L$,ƒ`wO,$<D$$MbMb)ڃvO1ۃ<$f1\$0l$ ty=:\$0$O<щ$‹D$,`G,$<t$$w<։$=$W<,$L$, `cO4$<D$$OMb<$D$ Mb)aG@Љ$D$ !f9Af=uL$,1҉T$$=WCw념t&=\$0$O<$l$,ƒ`nO$<D$$t&W<ډ$u=v$o@4$=$o<Չ$L$,ƒ`O4$<D$$W<ډ$u=/_@É$L$(%l$$1E9u=t9|$,Q=ll$(L$$Et&t$,1D$4$=F$tpw/=$=&$D$,L[^_]=q=xuՋL$,D$\$$Bt$,o$<t$o$<͉L$2w$<l$w$<l$Uo҉$<t$=$<v=5\$t$l$ $dt$ l$$_T$,H\$ D$L$${$$2$K$|$,N|$,:$(L$,$<|$4|$@\$,t$0Wdl$8Gd$Pt`uLL$wh9yt&\$$U<ʉ $‹`E4$<l$$<$\$,t$0|$4l$8<Ë4t뀍\$$M<щ$‹`΅E$<t$$p$$t&\$$1ҹ<T$L$4$P$u$<ΉL$M4$<D$]v1ɉL$$St<1|$4|$@l$8l$D\$,t$0WTuD$`4$؅\OT?t wXt OXt wXt =t =g t =6@t= 1t$0ۋ|$4\$,l$8<Ðt&=l$,$V<ʉ $‹`tCF<$<t$,$뀉<$\$,t$0|$4l$8<Ë~$<ωL$뾋l$<$V<,$D$\$$D7<\$$xL$<\$$l$\$$\$$5]l$<$7p$$&VSL$ \$t$hBlBD$D$1t t[^Ð,\$\$4t$ |$$|$0l$(=t+=te\$<$Ɖ\$t$ |$$l$(,ËC\vn q= 1k x\$t$ |$$l$(,ËCk tQHuCꋯd1$|$nHuS1d‰$뇍``1L$Kf<ÄtOT$Z<$l$=CՍLT$1 $D$\${,$D$KD$fD$LD$$L$l$1C1d,$Ct/1D$l$$1e1ɾpL$t$؍T$(t$D$$\$t$ T$D$4$t؋t$\$Ðt&L $؋t$\$Ít&,|$(|$0\$ t$$`t$4$S@‰$K%$@щT$4$$D$\$ t$$|$(,ÐL|$D|$P\$<1ۉt$@1l$H<$t\$t$ 4$|D$>L$$D$R\$>4$fCul$t&1틗\tdBW$G 틗\t+BG  Bl$uQu=D$1ɉ\L[^_]øD$[G $< D$fv$P빍T$<$SP\떍&D$D$pD$<$D$v\Et&1ɾt$MbMbL$<$PPv)ځr싇$S8ul=w#L$\FD$N$` L$ω<$1ۍ\$T$VL$I4$Q<y<$pt$L$L$ 1퍇l$D$\t@ÐVS1ۉ\$ t$ 1ۋL$(T$$4$L$T$L4PH11҉P1CX1҉\`Fd $L$ T$\$\$11҉L$ T$$111ɉ111ɉ$$úT$X$øD$$=\w[^1ۉ\$X$XQD$$ T$=v1D$\ $\rD$$ t$덐&'VS1ۉ\$ t$ 1ۋL$(T$$4$L$T$L4PH11҉P1CX1҉\`Fd $L$ T$\$\$11҉L$ T$$111ɉ111ɉ$$úT$X$øD$$=\w[^1ۉ\$X$XQD$$ T$=v1D$\ $\rD$$ t$덐&'V4S\$XCd Hu5\uK $`$$X[^Ív4$4$\t4$4$ $`$$X[^Ð&V4S\$XCd Hu5\uK$`$$Z[^Ív4$4$\t4$4$$`$$Z[^Ð&V4S\$HXCd u:\uK$`$$\$[[^4$4$\t4$4$룍&'U1WVS|$0L$P<$D$4$S=54$1D$ L$\$|$ 1T$l$4$\$L$D$ 4$|$ T$l$4$4$D$\$ǃ4$4$ʼnL$…tNtJ=4$l$T$4$|$u:4$T$1l$ D$\$L$4$4$1ҿT$1ۉ|$ Mbl$\$D$ L$4$Mb')ڃv1Mb&)ځw!4$L$ǃ tԃ=wT\$4t$8D$>[^_]$ <$_dCCT$$)ډT$\$4t$8D$>[^_]$4v',|$(|$0\$ t$$GdWd$PtPPuou<$\$ t$$|$(,Í\$$1ɺ<L$T$4$P$<$\$ t$$|$(,Ðt&$1L$t$ \$$`$P 1ۉ\$$Qt-,1|$(|$0\$ \$4t$$WTuD$P$LWTt OXt WXt GXt =Vt =, t =@t=t&'1\$ |$(t$$,Ã=wq\$$P$P$L$$룍v<$\$ t$$|$(,Ë\$<$P$D$t$$ g<t$$H L$(<t$$t \$t$$t$$"\$<$l` $F$ t&VSL$ \$t$XB\BD$D$1t t[^Ð\$\$$t$|$|$ =t+=tV\$<$Ɖ\$t$|$Ít&S1wQJ1C x\$t$|$ËCS t[uC1P$|$뉃 uSu1҉D$T$$1KPD$1$L$.SP1$T$=C1Pȉ $1ɾ`L$t$xv' T$D$t5wtj tQT$D$ t&Ltbwu߸3 ÉD$ Mu1ɺL$T$? SÍ&$1ɉL$ @ 1ɺ`L$T$$ Ð&\$\$$t$t$ |$;C=%t7v)=.t.=\$t$|$=@uאt&XK < 1 v σ= K$001K8K48|$\$$\$t$ t$D$$<\$t$|$Ã=-$ T$ |$C$ D$Yt$t$ \$\$$ $R,9t&Ë\$2D$$T$ N0t$v\$t$Ít&VSt$ \$P$$1L$D$$T$D$$WD$1҉L$ T$$@T$L$$1L$D$$D$T$$T$L$$1L$D$$1҉D$T$$T$L$$L$D$$1ҸT$D$X1ҋT$X $\$1ɍL$ $D$\1ɋL$\ `$D$1҉\$4$T$ [^Ít& t$t$\$4$t؋t$\$ Ðt&4$؋t$\$ Ív'\$\$ t$t$$|$$t$u\$t$|$Ðt& $R,9tD$$R01ɉL$X$V҉T$ N$D$L$1ɉL$\$V҉T$ N `4$L$D$\$t$|$UWVSL$0D$4L$T$D$$u [^_]1Ƀ=|$MbLjL$1<$t$D$<$D$=t$B<$11ۉ\$L$ËD$)؃@Mb)MbӋT$)ЃdvT$$Q8uT$L$D$$RX=\$T$ C\$1ɸL$D$`$D$T$$0 T$=wZ<$1[^_]Ã=wOkt$~$\1ۃ=D$É\$`$6\$$T $V룐S\$$`È$\$[&'v'S1҃T$\$ 1ɉL$$8K<1҉T$T$ $T$D$tC4ut =w%[ËD$$$D$L$[Ít&8$tT$[Ðt&S\$`$$u[Ív\$[v'V1S\$ D$t$$$tb1L$$Rt1T$ PD$L$$t$$\$ [^1ҹT$ PL$D$$1ɋL$$Rtt$$\$ [^VS\$$t$ \$4$tc$RDN(L$1ɉL$$SH$S=w\$t$ |$$l$(,ý\$t$ l$0|$$l$(,MbMb')ڃvN\tP=w~,$|$T$\$t$ |$$l$(,Ë1ɋL$<$Rt,$1۸\$ D$t$=v$$q|$|$ \$t$PD$$t"=t$T$$<$L$t=w-\$t$<$|$ \$t$|$t$$\$t$<$t$$t$T$$]\$\$ t$|$S tF=wpC1ҋ[t-x19}$t&=w'F9| \$t$|$ËCD$ t$FT$$T 뺋CD$S$uD$$S `,\$\$8t$ t$<|$$|$4l$(l$0D$,$] ۉu$}t$\$<$E1ɉL$,$=EUEE Uw\$t$ |$$l$(,Ë}T$D$|$ $| \$t$ |$$l$(,Í,\$\$8t$ t$<|$$|$4l$(l$0T$,$] ۉu$}t$\$<$E1D$,$=EUEE Uw\$t$ |$$l$(,ËET$L$D$ $| \$t$ |$$l$(,Ív'S\$=v*S$uD$$=w[CЉT$K $$ D$=vCЉT$K $$؉\$[Ít$t$ \$|$F ȉL$~<$^!ӉT$F$N$t?V )Ѝ:T$(t =w$|$$؅uF)؋\$t$|$ËV ʼn\$ |$D$$-Ð&'UWVS l$ |$,UT$ED$u4$]\$MщT$E$t$$]u|$(D$(1=~=} ׅɉU~"ȁ@@t&'3SHuu@C3|$MщT$E$t$]ˉL$}<$ [^_]$ \S\$ &KщT$C$fx1҉L$ T$CȉL$S$D$$D$ K$L$S T$C$[Ð&' T$BȉL$B$ Ív' T$BȉL$B$ă ÐVS1ۉ\$ t$ N$L$V T$F$F\$1NщT$F$Cc@NщT$F$tܹ L$V‰D$^$[^Í&'ÐD$T$Ã,|$(|$0t$$t$\$ 4$\$4ˉ $‰D$$4$D$D$\$ t$$|$(,Él$l$ t$t$\$ |$\$$|$(4$EӉ$ȉL$E<$D$4$\$ t$|$l$Ív',T$L$t$ 4$|D$>L$$D$R\$>4$fCul$t&1틗LtdBW$G 틗Lt+BG  Bl$uQu=D$1ɉLL[^_]øD$[G $ D$fv$P빍T$<$SPL떍&D$D$`D$<$D$vLEt&1ɾt$MbMbL$<$PPv)ځr싇$S8ul=w#L$LFD$N$@ L$ω<$1ۍ\$T$VL$I4$Q<y<$`t$L$L$ 1퍇l$D$Lt@ÐD$T$P @@@Ð&D$T$P @@@Ð&=\$\$ t$t$$|$|$(w-{t3VSCC\$t$|$É|$ t$C $| D$붉1)҉1@Y[^UW1VS1ۋt$0l$4L$<4$T$8l$ndL$ T$E11҉11ɉ11҉E11ɉ11҅ۉFdFxF|t1ɉ@@L$$D$Ck <$C1T$<$1D$k 1C111ɉ1C1ۉ1҉1ۉ1 1$1ɉ,1퉎@04Mb<>D8Fp)cf" 'a Vt1ۉȉ)1@[^_]ÐUW1VS1ۋt$0l$4L$<4$T$8l$ndL$ T$E11҉11ɉ11҉E11ɉ11҅ۉFdFxF|t1ɉ@@L$$D$Ck <$C1ۉT$\$1ۉ$o 1G111ɉ1G11҉1ۉ1 1$1ɉ,1퉎@04Mb<>D8Fp)cf" 'a Vt1ۉȉ)1@[^_]ÐD$9t uÐT$Hᐍt& =\$\$t$CdwR9t uFFCd$\$t$ $K렋$P밐 =\$\$t$CdwR9t uFFCd$\$t$ $K렋$P밐VS\$=CdwR9t uGFCd$\$Z[^$K렐$P믍V1S4\$@L$HT$D0L$T$$1@uY$҉tJJk\$\$L$ T$$=w%$4[^Ðt&$4[^É\$$ɍ&'S\$$$9t u11[Ë $Q11[Ðt&T$1<&'L$D$J`ᐍv'ST$$L$ \$(Bw$T\$(T$$L$ [0t11ۉ0 $=v$v[Ë\$$L$ [9t} $R4,tCMbKʉS됋\$$D$ 뒉Y|gt7X0[=N\$$9 $S0,@0< D$$\$\$ xt$w$\$ t$\$D$$\$Ћt$ËS$1s$1҅uڋP$R1Ҩ t‹4$Q8ӍS1҃{(띋L$ \$t$S|vt$ KdڋSx]StOSpGP9.WP$RtWJ$Qt0H$Q4$=w \$$t&Ð&'f" 'a Ut11ۉ@)‹E҉,$7$XG19u_\$w D$z]T,$1T$S1Ã=ETL$,$P\$$D$_ UTG1M,$D$G t&]TeOҋ}T$1,$L$C]hT$MT_t$ 4$fD$>D$L$>L$\$$Rl$>4$1ʼnG 7ET$,$PDE,$MbL$1PDEp)cf" 'a Ut>1ɉ)1Ӊ]@,$E,$=DD$$_ /_1,$\$G U$ XG19_\$ w D$*ET1G ý~G1$ XG19v7_\$ w D$E1ɉL$Kývqýv뾃ý냐&UWVS$9t61҃=4$1ɺL$<1ۍ|$4$ļ[^_]$<$) M4$1,D$(|$=U\$8|$<4$u11҉l$8 T$<|$<&T$8D$<W1 |$(Pu5 T$ \$@9 L$T$D$$4$|$(JD$1 u5 D$D |$3L$ T$$D$K|$ \$L$4$P1Ƀ1ۉ,$R=@111= $F\1҉1D<$%;T$$W0 $S41ۋ D$<$Q\$,D$, D$<$Qt#D$,t=R$1\$,x[vl$$\P$PT$l$ ,$;T$>&T$L$$W\$>,$ft=vD$$t녃=ws1v?fD$T$,$L$L$t$$Pt$,$f?G vl$ $|LD$P\$<1ۉt$@|$Dl$HD$t9=T$1틺u<= ؋t$@\$<|$Dl$HLËL$-T$ -E$\$\$ t$<$P$ vt$@؋|$D\$l$ t$ ,$L$>&L$T$$P\$>4$ft=vD$$t뇃=wk1-L$ fD$ $T$T$t$t$ $P\$4$f-E v$뇍Ll$Hl$P\$4$\$$D$빐&\$\$$t$t$ \$4$t1҉\$t$Ð,\$\$0l$(t$ |$$s l$4>4$WK NjC1D$S $VC 11L$$Ru+k U|${ <$R\$t$ |$$l$(,És L$D$8L$ D$l$k ,$Rk U|${ Ɖ<$R\$t$ |$$l$(,Ð,\$\$0t$ l$(|$$K l$49 $l$l$8Ws NjC1D$S $Qt$C 1$Ru(S *|${ <$U\$t$ |$$l$(,ËC L$t$L$ l$t$C $R S *|${ Ɖ<$U\$t$ |$$l$(,Í&'<\$4\$@t$8t$4$fD$.L$.@L$$D$R\$.4$t$8Ë\$4<Ít&,\$ \$0t$$t$4|$(|$<$@t$T$$P<$؋t$$\$ |$(,Í\t$Pt$`|$T1\$Ll$X4$u,l$dt @t$d\$Lt$P|$Tl$X\ÐfD$>l$ ,$L$><L$T$4$P\$>,$uYfD$&,$T$T$4$\$Pt$,$K1Ƀ| :렐&,\$$\$0t$(t$4$VT$L$$P4$\$$t$(,ÐD$T$PÐ&'Lt$@t$P\$<\$Tl$H1|$DFu\$u&'J$00B8B4T$L$ D$$ 뛃=v$널&t$t$ \$\$$ $R,9t&Ë\$2D$$T$ N0t$v\$t$Ít&\$\$ t$t$$|$$t$u\$t$|$Ðt& $R,9tD$$R01ɉL$X$V҉T$ N$D$L$1ɉL$\$V҉T$ N `D$$L$ɉKL\$t$|$Ð&UWVSL$0D$4L$T$D$$D$u D$[^_]þ1Mbt$t$1ہƀ4$|$1D$4$\$ =l$vV4$11ۉ\$L$ËD$ u 9t T$ )؃@Mb)wMbL$)ȃdvT$$Q8wT$L$D$$RX=\$A$H0= 4$1l$D$[^_]Ã=|$D$X${1ҽ`T$<$1ۉ\$4$11L$D$Ít&'4$11ɉD$L$)ƒv<$E~=L$1һT$\$` $D$|$$xk\$$$<$11L$1\$D$|$1҉ÉT$4$=wF$ N\$选$щT$Fډ$ȉL$l$@1ۃ)t&Vƒ‰$@C9ً^$ Ã|$D$[^_]ÐPN$Jى\$PTL$ň $t$롋D$9D$9b[t&,\$ t$$t$0\$4|$(|$<$P\$4$1P<$؋t$$\$ |$(,Ðv'<\$,\$Dl$8l$t$0t$@|$4,$|$HftGP|$\$4$1҉ÉP,$؋t$0\$,|$4l$8<Ít&T뽐&S1\$u [Í&P$Pl1҉P[ÐUWVSLD$`|$dD$~\$titX|$wQt$$ $@\$L$%?D$@D$ $=v$ D$uL[^_]Ë1ҋl$0T$<$Vt\$T$D$L[^_]ËL$ih"q\G=v$ sl$Ŭ,$D$\L$T$ЉT$='$. T$l$4$St=$B 11\$ D$MbMb&)ځvL$1;E ~=Ml$V uY D$$f &\$Mb$Mbt&')ڃv=$~ 1P$PlT$PP$Plt$1PT$uQL$q\Y $@@T$\$%?D$D$$%L$fD$>t$ l$>4$&l$$D$R\$>4$L$Ӌ$Mv UD$H\tS4$&T$l$$P4$=$ l$4$?&T$L$$P4$=$ &t$t$ \$$$t =w2F4tVTtNht ^\u$t$ \$t$$ 4$@D$=vĉD$$벐|$@ t Í&'SD$\$ $L$$1T$(KSD$$=CSCC Sw [Ít&CT$L$D$ $[SL$\$ $T$$1ɋD$(SCL$$=CSCC Sw [Ít&CT$L$D$ $[Ã|$|$ t$\$WGZ 4$WƋGJÉ$_)u_ L$()t =w%t$$؅uG)؋\$t$|$Í\$ t$D$$ UWVS t$ l$,Ft$VNp $׉T$D$t$$Xul$(D$(1T$: 9B~ =w?|$ɉo ~ȁ@&3SHuK [^_]$볐&' D$P@J$ Ðv' D$P@J$% Ð&WVS\$ SCJƉ$K SqL$4$SCJ$@ƉD$t$$u [^_þMb1v'SCHʉ $uHMb)vσ=v{@ t D$$[^_ÿmVSt$ VFJÉ$NVY҉$ʉL$VFZ$@@D$Mbt&VFHʉ $t?Mb)ڃvσ=v ~@ t D$$D[^SD$ X vCx,=vKL$$ T$Cyԃ[Ð&VS\$ SCH҉$u[^ËSCJ$@ȉL$T$$tξMbt&SCHʉ $@uFMb)vσ=v {@ t D$$l1XPt&S\$SCH҉$u[SCH҉$@tSCZ$@ى\$[ÐÍv'VS4t$@fD$.t$4$L$.|L$$D$R\$.4$1f4[^Ít&UWV1S,|$@\$DL\$$P|$(\$HBL$D$ $t$t 1Kt,[^_]ËL$(1ۿLn \$,$D$D$$T$|$ $L$(11ҋLn M@=~=Mb11D$$\$ l$1҉T$$Mb)sQL$;\$ tыl$$T$L$,$Mb\$ )r\$$$=MbD$$$t)ځr܋L$(t$4$l$=t$(F wT$(L1i@@D$D$,[^_]ËD$$$=wt$t$$ L$$ W|$$<$D$$ |$(1LS\bSVD$LL$(LED$6\$$$D$$% =T$(Lx$B |$U1ɽWVSL|$`=L$WX\$@$$ƹL$s CL1ۅ\$ FG NfD$>t$ 4$|D$>L$$D$R\$>4$fCul$t&1틗LtdBW$G 틗Lt+BG  Bl$uQu=D$1ɉLL[^_]øD$[G $D$fv$P빍T$<$SPL떍&D$D$`D$<$D$vLEt&1ɾt$MbMbL$<$PPv)ځr싇$S8ul=w#L$LFD$N$L$ω<$1ۍ\$T$VL$I4$Q<y<$`t$L$L$ 1퍇l$D$Lt@ÐD$T$PÐ&'\$\$ t$t$$CD$uD$\$t$ȉ $D$S@‰$€u~KPщ$€uLKщ$ЅtC$؉\$L$l4$Sl_CPȉL$‰$뚋C@ȉL$‰$e&VS1ۃ=t$ w\CwDv lV$D$ lC$W L$v[^ËF$n D$롐D$f@Ð&'D$f@Ð&'\$\$ t$fti=w01ftCt'\$Ћt$És u T$ЉT$$ 룍v$HL$ t$T$t1fg=Zt$$B%fft"$=vK u T$ D$t$$ xv'T$1f:tRt &Ð&'\$\$ t$f;tKu \$t$Ít$4$"‰$ u- $щ$ u14$\$t$$"ȉL$$$؉\$벐t$t$ \$fu1\$t$à $؅t$ щT$1f\$\$ t$f;tsu\$t$Ívt$4$fuK "щ$ t{$Љ$ tE4$\$t$à $Ѕt$ ȉL$ $$ى\$ $"D$eV1St$ T$ \$(D$$4$\$1ۉD$T8H11ɉL1ҍXX\d`Fd $D$\$\$1ҍT$1ۉ$11҉11ɉ11҉11ɉ$$úT$\$øD$$=`wP[^Ð1҉T$\$\KD$$LL$=v1҉T$`$`KD$$pL$끐V1St$ T$ \$(D$$4$\$1ۉD$T8H11ɉL1ҍXX\d`Fd $D$\$\$1ҍT$1ۉ$11҉11ɉ11҉11ɉ$$úT$\$øD$$=`wP[^Ð1҉T$\$\KD$$LL$=v1҉T$`$`KD$$pL$끐V8S\$\CdHu5`uK $d$$X[^Ív4$4$`t4$4$ $d$$X[^Ð&V8S\$\CdHu5`uK $d$$X[^Ív4$4$`t4$4$ $d$$X[^Ð&V8S\$\CdHu:`uK$d$$\$Z[^4$4$`t4$4$룍&'WVS |$0=\$$X<$X$<t$$$X<$X$<t$Mb$Mbt&)ڃ v [^_$ #t$ 4$|D$>L$$D$R\$>4$fCul$t&1틗TtdBW$G 틗Tt+BG  Bl$uQu=D$1ɉTL[^_]øD$[G $D$fv$P빍T$<$SPT떍&D$D$dD$<$D$vTEt&1ɾt$MbMbL$<$PPv)ځr싇$S8ul=w#L$TFD$N$L$ω<$1ۍ\$T$VL$I4$Q<y<$dt$L$L$ 1퍇l$D$Tt@ÐD$T$Ã|$|$ \$ \$$l$1t$u\$ t$|$l$Í&@$ft̅t$Pl<щ$ uq7މ$ډ$n7<$ΉL$t=@5$@D$uut t̀L C87Ӊ$ΉL$u!t' St|v'VS1ۃ=t$ w[CwCv $D$ C$ML$v[^Ë$ D$룐D$vÍv'VS\$ t$ 1ۋD$(L$$4$D$L$L`1H11҉P1۸T`X\Fd8D$ $\$\$1ҍ|T$$1111ɉ$$úT$X$øD$$=\w%1҉B=~5[^1ۉ\$X$XQD$$HT$=v1D$\ $\rD$$lt$k&'VS\$ t$ 1ۋD$(L$$4$D$L$L`1H11҉P1۸T`X\Fd8D$ $\$\$1ҍ|T$$1111ɉ$$úT$X$øD$$=\w%1҉B=~5[^1ۉ\$X$XQD$$HT$=v1D$\ $\rD$$lt$k&' `t$t$\$XFd8ۉHu\u54$\$t$ Ð$$\tэ$$4$\$t$ Í `t$t$\$XFd8ۉHu\u54$\$t$ Ð$$\tэ$$4$\$t$ Í `\$\$t$XCd8Hu&\uE$\$t$\$ 4$4$\t 4$4$$\$t$\$ t&S\$ CdSd$PuKhuA\$ [t&P$L‰D$1ɉKhtĐt&$DT$$%D$DD$\$ [&|$|$ \$ Dt$l$\$<$t!=H\$ t$|$l$Ët\=><$L$=<$\$l$\$ t$|$l$Ã=<$DD$Mb\$Mb&)ڃv<$t$Dt$Mbv)ڃv<$L$=D$$\$ t$L$ |$l$$$U1WVS |$ l$_d<$CC<$D$P$u D$ [^_]É<$t$PHщ$u0t |$$t\$(D$ [^_]Ã=PMb4$HʼnD$Mb&)ځvMbt&')ځwYPHƉ$P$HщT$PHΉ $ut=w?=t$$$$)ډT$룍\$\$ t$|$CT|$$t tS4u1\$t$|$ÍP $D$D$tËLuTSTu&t$uitsXun|$댃=w0P$Lى\$̉$Z|$$@|$빋|$$놋|$$끐 T$t$t$|$|$$XY\CL$ T$ 1t7t &$t$|$ Ð\$\$$t$|$|$ t*tE\$<$Ɖ\$t$|$ÉSv-1C x͉\$t$|$ËCK w$$tċC1 붋ts 1랋Su1ҹ|T$L$$1iK1P$KS1P‰$*{1 s 1S1P $ډ\$CʋP1$|$щ<$1T$l1D$`t$,$$$0$ \$ $(1|$D$$4$DL$4$$8$4T$D$t&4$S $ $$$(,É4$DL$VhÅud4$ٺDT$L$ut\$$1ɺL$T$4$P$d1 댍v'S\$ P $D$PH‰$Kh%t"P$HȉL$P ‰$P $щT$$DL$$ DD$T$[Ð\|$T|$`l$X\$Lt$P<$<$1\$t$\$t*t%|$u=vD$$ =<$WTtaÃtK<$DT$<$ D$DD$=v$ t&'\$Lt$P|$Tl$X\Ã=fD$>t$ 4$L$>1L$$D$R\$>4$$\$T$D$$tD$ T$D$t0vLtswIu3 Åt% tMT$D$ D$ t&D$1҉T$ Mu1ɺ|L$T$! S1ɺ`L$T$$ Í T$L$;B=%t3w=@t*=wT =.t=>uv'J$00B8B4118T$L$ D$$)뚃=v$냍t&t$t$ \$\$$ $R, 9tD$$R0 iC1\$t$Ð&\$\$$t$t$ |$\$4$u\$t$|$Ðt& $R, 9tD$$R0 iC11L$X$S҉T$ K|$D$L$1ɉL$\$S҉T$ K `$L$D$\$t$|$Ív',\$ \$0|$(|$t$$<$P$T$4%ƁPƋ‰ $D$P ‰$P $щT$P4$°ډ\$<$\$ t$$|$(,ËP$ȉL$뭍&'UWVSL$0D$4L$T$D$$D$u D$[^_]ý1Mbl$l$1ہ|,$t$1D$,$\$ =|$vV5,$11ۉ\$L$ËD$ u 9t T$ )؃@Mb)wMbL$)ȃdvT$$Q8wT$L$D$$RX=\$A$0=,$1|$D$[^_]Ã=t$D$h$tzD$T$$eL$1һT$\$` $D$t$$\$$ Y$Lo1`\$$nS1҃T$\$$$|`$\$[v'S\$ P$P $ ʉL$11ɍ|T$L$$K<1҉T$T$ $T$D$tS4ut =w'[8D$$$D$L$[Ë8$CT$[ÉV1S\$ L$t$$$1Ҹ1҅tSh€PLD$ʉ $ t$$Qtt$$[^ÉVS\$$t$ \$4$tf$RDN(1ҋT$L$ $SH$R<1D$4$[^ËN(L$\$$RHF04$D$[^ËN(j|$` $Fv $S@1gv'\$\$ t$t$$$t$\$t$$t$D$ JPᐃ\$\$$t$t$ ÉD$4$Rtrt\$t$Í&11ɸT$PD$L$ $` $|$t2T$ \$Nht$ᐃ1҉\$\$$t$t$ L$F4$ @C9⋎@9Pډ$KP$9tދl$4$@1ۃ4$u{@C9拎@9t(>4$t$l$8fED$[^_]Ã=v$]l$D$[^_]ËD$9D$9}넃=?$.UWVS1|$4\$D$؉,$T$>T$\$4$P\$>,$ftfL$Gu|$@\$ 11D$Pl$<$t$D$|$Pп$ƠΉL$l$1t&'T$Ǎ\5FPЉ$~D$|$>~D$L[^_]Ðv'U1WVS~1=l$ T$G<ft4؉,$T$$\$t$P,$fD$,$L$D$1\$ $D$V\$,$f9Q=DT$ D$$L$|$1ۋL$CP,$Ơ|$T$P$ȉL$t$P$@ l$~ t$CP,$|$L$PƉ$|$%@ P$l$?~\$P$ƉD$|$P$l$L$P$t$D$P׉$l$P$ى\$uJt\$P$ƴƉD$=v $D$<[^_]Ë|$P$͉L$또&' L$PD‰$ Ðv'T$D$PT$DD$& L$PD‰$ Ðv' L$PF‰$ Í&' L$P@‰$ Ðv't$t$ \$L$(P\$$B‰D$ $Pt$\$ @\$‰D$$t& L$P@‰$ Ðv'ÐL$T$ D$QA1҉A t AAAÍt&AAAÍt&L$T$ D$QA1҉A t AAAÍt&AAAÍt&T$BtBJ ⋈!ʉËBJ ⋈!ʉÐt$t$ |$1\$FtgVN #t N?1ۋT$$9!Åu)ىˋL$(t =w/؋t$\$|$ËVN #뗍\$~$|$؋t$\$|$ÐVS\$ t$SC 1҉ C T$ C   C  S H  s[^Í&'L$Au)Q AAu3  ËQA ȉ Ív@  Ð&S\$ =KuHSC ȋKud  K ´ [ËSC  K ꀸ [ù@뚐t&S T$C$D$VL$AtAI ËAI Ð&ÐD$T$Ãt$t$ |$|$$\$ l$D$ uD$ \$ t$|$l$Ð$tщÁtL‰$D$ .$L݉\$11 Cȉ $uwqtF<$SlFL$ fEti.t$ L|$4$$щT$3D$ )=v\$$qL$ &UWVS 1ۃ=t$ l$(|$,T$$t^ t&CwJ=v,<$D$ C$L$v' [^_]Åt9}щ$DC9|ރ [^_]Ë$D$QUWVS 0|$ LAl$P,$<$1҉T$D$t$Mb<$Mb)ڃ1v<$1ɉL$t$\$,$=LXw{gƒ [^_]É\${$gƒ [^_]Ðv'VS4t$@fD$.t$4$L$.|L$$D$R\$.4$1f4[^Ít&UWVS,1ۋL$@D$DLL$(ΉD$$PEt$|$4$\$ T$(1ɋLh L$,$D$\$$|$ t$$T$(L1ҋA H1&@=~=Mb111ۉl$t$\$׋T$$$Mb)sQL$;\$tыt$$T$l$Mb4$\$)r|$$<$=MbD$$$t)ځr܋l$(\$$t$=\$(C wT$(L1i@@D$ D$ ,[^_]ËD$$$=w\$t$$0L$$BWL$$ $D$$PL$(1LW0b'VLl$(LF:|$$<$D$$k=T$(LH$L$v'UWV1SL|$`=t$}_X$@$$ƹL$s 1҅CLT$FG ,fD$>t$ 4$|D$>L$$D$R\$>4$fC(1ɸL$MbD$<$SPMb)ځr싟3$V8A=v $HL$1v'틇Lt&@W pv'@t$MbMb&)ڃcvt$<$PTLD$1ɉLL[^_]øD$1틏L1ҋAT$<$ST.G$G <$1ҍ|l$1T$D$vG $D$kL$<$SPQ M<$=t$/$S<$`T$l$uL$ LqE<$1ۍ|\$t$L$<$`D$L$D$뙋$Q<v'D$Lt@ÐVS1ۉ\$ t$ 1ۋL$(T$$4$L$T$P<TH11T1ҹC\d`Fd$L$\$\$1D$1ۉ $1111҉1۸1ɉ$$úT$\$øD$$=`w [^Ðt&1ۉ\$\$\QD$$T$=v1D$` $`rD$$t$눐VS1ۉ\$ t$ 1ۋL$(T$$4$L$T$P<TH11T1ҹC\d`Fd$L$\$\$1D$1ۉ $1111҉1۸1ɉ$$úT$\$øD$$=`w [^Ðt&1ۉ\$\$\QD$$T$=v1D$` $`rD$$t$눐D$ tËL$$$HL$ 1T$D$$HD$1L$ D$T$$HL$ 1T$D$$T1L$ D$T$@D$T1L$ D$T$$$HL$ 1T$D$$HD$1L$ D$T$$HL$ 1T$D$$T1L$ D$T$%?3&V<S\$H\Cdu5`uK$d$$[[^Ív4$4$`t4$4$$d$$[[^Ð&V<S\$\CdHu5`uK $d$$X[^Ív4$4$`t4$4$ $d$$X[^Ð&V<S\$\CdHu:`uK $d$$\$X[^4$4$`t4$4$룍&'VSt$ D$4$=04$\$4$T$ÉL$4$D$D$D$L$4$4$4$D$T$\$\$4$=wR4$<L$u5=4$4$ ػ<D$\$=w)[^É4$D$D$$닉4$<D$D$$[^Ð$$e&'VS1ۋt$ 4$Tu%=w[^$[^É4$^dC1CT$4$D$$L$(4$4$1҉T$=WTt"=YTufK,|$(|$0\$ t$$GdWd$PtTumu<$\$ t$$|$(,Ív\$$1ҹ<T$L$4$P$<$\$ t$$|$(,Í$d$r& 1t$$QtN1t$t$ |$|$$\$VTuD$T$؅PVTt NXt FX^t VX:t =t = t =@t=v1t$ۋ|$\$É4$\$t$|$Ë4$|$4$2T$T$t$y<\$$8 L$Z<\$$d |$&\$$\$$|$4$d $$lVSL$ \$t$\B`BD$D$1t t[^Ð\$\$$t$|$|$ t*tR\$<$Ɖ\$t$|$ÉSwRJ1C x\$t$|$ËCS t\uC1T$؉\$덐 uSu1ҹT$L$$1CڋT$1|$0S1T‰$:K1T$1D$dt$vv'v' T$D$t5wtj tQT$D$ t&Ltbwu߸3 ÉD$ Mu1ҹT$L$? SÍ&$1҉T$ @ 1ҹdT$L$$ Ð&\$\$$t$t$ |$;C=%t7v)=.t.=\$t$|$=@uאt&\K < 1 v σ= w}K$00S8S4|$\$$\$t$ t$D$$2\$t$|$Ã=;$ *T$ |$C$ D$cv't$t$ \$\$$ $R,9t&Ë\$2D$$T$ N0t$v\$t$Ít&UWVSt$0T$D$&'T$x틮T<$l$d<$,$T$ ˉL$T ‰$T $ ˉL$T ‰$u勖\1ɋL$\ $D$1҉T$ \$<$`1ɋL$` $D$1҉T$ \$,$T<$T 4$ˉL$[^_]É t$t$\$4$t؋t$\$ Ðt&4$؋t$\$ Ív',\$\$0t$ t$4|$$l$(t$$u\$t$ |$$l$(,Ë $R,9tl$$R0,$dL$ $T$ ЉT$T $T $ ʉL$vT Љ$u1ɉL$\$V҉T$ N,$D$L$1D$`$N\$ɉL$ n $D$l$\$t$ |$$l$(,Ðv'UWVSL$0D$4L$T$D$$u [^_]Ë|$1Mbnj<$t$D$<$D$=t$B<$11ۉ\$L$ËD$)؃@Mb)MbӋT$)уdvT$$Q8uT$L$D$$RX=\$T$ CT$1D$\$d$D$L$$!L$=wF<$1[^_]Ã=w;{D$x$ld$Z\$$@!$l!뷐S\$$d$$=w 1[Ë<$!L$1[Ðv'v'S1҃T$\$ 1ɉL$$K<1҉T$T$ $T$D$tC4ut =w+[ÍD$$$D$L$[Ít&L$$L[Ðv'S\$d$$u[Ív\$[v'V1S\$ D$t$$$tu11ҹL$$RtT‰$T ȉT$ $$t$$\$ [^T‰$T%$щT$1ɋL$$Rtt$$\$ [^t&VS\$$t$ \$4$tf$RDN(1ҋT$L$ $SH$R<1D$4$[^ËN(L$\$$RHF04$D$[^ËN(j^,_d $I $S@1gv'\$\$ t$t$$$t$\$t$$t$D$ JPᐃ\$\$$t$t$ ÉD$4$VtH6RuJT$t$\$ \$Jh፴&rtʀvu=w \$t$ËD$\$ T$$!L$\$t$Ðv'1҉\$\$$t$t$ L$Ft$ 4$|D$>L$$D$R\$>4$fCul$t&1틗PtdBW$G 틗Pt+BG  Bl$uQu=D$1ɉPL[^_]øD$[G $#D$fv$P빍T$<$SPP떍&D$D$dD$<$D$vPEt&1ɾt$MbMbL$<$PPv)ځr싇$S8ul=w#L$PFD$N$,#L$ω<$1ۍ\$T$VL$I4$Q<y<$dt$L$L$ 1퍇l$D$Pt@ÐVS1ۉ\$ t$ 1ۋT$(D$$4$T$D$P<TH11ɉT11C\d`Fd$T$\$\$L$1ۉ$11ɉ11ۉ1$$úT$\$øD$$=`w[^1ۉ\$\$\JD$$h#L$=v1D$`$`qD$$#t$VS1ۉ\$ t$ 1ۋT$(D$$4$T$D$P<TH11ɉT11C\d`Fd$T$\$\$L$1ۉ$11ɉ11ۉ1$$úT$\$øD$$=`w[^1ۉ\$\$\JD$$h#L$=v1D$`$`qD$$#t$V<S\$\CdHu5`uK $d$$X[^Ív4$4$`t4$4$ $d$$X[^Ð&V<S\$\CdHu5`uK $d$$X[^Ív4$4$`t4$4$ $d$$X[^Ð&V<S\$\CdHu:`uK $d$$\$X[^4$4$`t4$4$룍&'VSt$ T$4$HtV4$<D$u9=4$4$ ػ<D$\$=[^Ã=4$\$4$ÉT$D$4$4$D$L$\$D$4$=-4$L$D$$4$<L$D$$[^Ív$$&'U1WVS |$ T$l$$<$Tu-=w D$ [^_]$#D$ [^_]É<$L$(wdFF\$<$=T$ ‰D$T ˉ $uMbMb)ڃv T"Ɖ$%@EMb)ځwUtĉ<$1l$=t(D$ [^_]$t&,|$(|$0\$ t$$GdWd$PtTumu<$\$ t$$|$(,Ív\$$1ɺ<L$T$4$P$<$\$ t$$|$(,à d؉$T%$ щT$$4$G 1ۉ\$$Qt*&1t$t$ |$|$$\$VTuD$T$؅PFTt VXt NXt FXt =6t = t ='@t=t&1t$ۋ|$\$Ë$Pp2=4$4$\$t$|$Ë4$|$4$T ʉ $T%$ t$J<\$$#T$+$$N\$$\$$<\$$<$|$$Q|$4$]d$:VSL$ \$t$\B`BD$D$1t t[^Ð\$\$$t$|$|$ t*tR\$<$Ɖ\$t$|$ÉSwTJ1C x\$t$|$ËCS tauCҋT$1؉\$늃 uSu1ҹT$L$$1{CڋT$1|$+S1T‰$5K1T$1D$dt$pv'S\$T$L$d$\$[&'\$\$ t$$t\$t$Ðt&T $D$$d$\$t$Í&' T$D$t5wtj tQT$D$ t&Ltbwu߸3 ÉD$ Mu1ҹT$L$? SÍ&$1҉T$ @ 1ҹdT$L$$ Ð&\$\$$t$t$ |$;C=%t7v)=.t.=\$t$|$=@uאt&\K < 1 v σ= w}K$00S8S4|$\$$\$t$ t$D$$\$t$|$Ã=;$h$*T$ |$C$$D$cv't$t$ \$\$$ $R,9t&Ë\$2D$$T$ N0t$v\$t$Ít&\$\$ t$t$$|$$t$u\$t$|$Ðt& $R,9tD$$R01ɉL$\$V҉T$ N$D$L$1ɉL$`$V҉T$ N d4$L$D$\$t$|$UWVSL$0D$4L$T$D$$u [^_]Ët$T$|$|$DŽ<$u =k<$1\$D$D$Mb=t$B<$11ۉ\$L$ËD$)؃@Mb)MbӋT$)уdvT$$Q8uT$L$D$$RX=\$T$$CL$1۸\$D$d $D$T$$$T$=w<$1[^_]É\$$%$D%1҉T$~=w)"D$p$d$$p%ɍv'S\$$d$$=w [Í<$%L$[Ðt&v'S1҃T$\$ 1ɉL$$K<1҉T$T$ $T$D$tC4ut =w+[ÍD$$$D$L$[Ít&L$$9[Ðv'S\$d$$u[Ív\$[v'V1S\$ D$t$$$tv11ҹL$$RtT $Tȃ $ ҉T$$t$$\$ [^T ‰$T%$ щT$1ɋL$$Rtt$$\$ [^t&VS\$$t$ \$4$tS1ҋF( T$D$$QH$Rt$ 4$|D$>L$$D$R\$>4$fCul$t&1틗PtTBW$G "틗PtBG t|vBl$uQu=D$1҉PL[^_]øD$kG $'D$vv2$V빍L$<$SPP떾dt$D$<$D$&PUt&D$1ɾt$MbMbL$<$PPv)ځr싇$S8D$Mb')ڃv$RS\$ T$(D$$$T$D$=Cw [Ðt&$[Ð&'S\$ T$(D$$$T$D$=Cw [Ðt&$[Ð&' D$T$^L$$Ѓ с эRÍZt$t$ \$|$1\$L$4$4$úT$^D$@u(=\$t$|$Ít&uMbt&'Mb)ڃcw4$^T$D$@t̉4$^L$\$@t=b$\,P$,,\$ |$(|$0\$4t$$\t$D$<$Ɖ؁tl~ztm=wC\$$\t$L$<$P$\$ t$$|$(,É\$$,뫍&P듁닅u|W$VS0\$@T$D$$ǃuet$ j4$L$L$|$$Pt(L$jD$fL$|$$R4$0[^_Ít$ 4$L$$L$T$$P4$4$L$jL$T$$Pt'D$$ fD$jL$D$R4$4$L$$L$T$$P0D$uTfD$D$$|$D$L$$D$fL$L$$Rt& f|$먐 =w1 $1 Í =w1 $,1 ÍÐ&'V~St$ T$D$4$%tktut 4$|D$L$f=MSufFPT0v'=w[^Ð\$^P$,\$[^fFP$0Ǎ&fFP%0븐&UWVS<|$P=\$Twt3=<1[^_]$u։'\$ :N$LL$t$<$P$$7T$l$<$V$<[^_]Mb<$ZL$MbD$)w fttځ=W<<$1t$L$L$<$S1(HX%=bl$ Ӊމ,$NL$? T$<$P,$,$LT$t$Mb<$P,$,$NL$t$Mb<$P,$)ڃv(MbMb)ڃcv,$F1ۉT$\$<$P,$,$7\L$D$<$V,$_@,$L$hL$t$<$Pt'D$fD$%D$hL$<$R,$1҉T$<$SX<$/<$&1ɍD$L$D$<$R/,$h\$\$T$<$Prt$ft$I\$$$-\$Mb )T$ w<$1 D$>$D$t$Q\$>T$ $ÉE KE1$E u1T$ $t$=E1D$$E1i|ߋU&1D$\$$1E E1Q|TAT1E u1Y|Ή $E T$ $PD]]1q|ʉ $l$;1t$b1t$|$S T$D$Fw#E wLҹ_u1ȃ ÃMtIwLu1ɺL$T$@hT$D$ tIu31ɺL$T$$ Ë Sùo=w1_$1L Bt&1҉\$\$$t$t$ L$Ft&\$$$Wv'WVS0\$Dt$@\$4$V|(‰$uN|($~|$(׉T$=<t$ 4$;D$D$T$$Wt&D$ fD$ пT$|$$Q4$0[^_ÐV|(<$N|$(ى\$F0) =<|$ <$T$T$L$4$Pt3D$% f\$L$D$4$L$S<$0[^_Ít&~(N,u$b&=wK<t$ 4$;D$D$T$$WD$ fD$$막\$$$ fD$ &',\$\$4|$$|$0t$ l$("VtqwQ.tg>t&tT=T$$2\$t$ |$$l$(,Á}t}Dt몋C="Vtpw=.tg%=@=}tS=]&t>=\$t$ |$$l$(,Á@=]25K , 1 v ̓ K$001틇$C8C4t$ \$4l$(|$0\$|$$,vD$T$$5`=DF==>T$ l$s$2t$YD$$2L,\$\$0t$ t$4|$$l$(t$$u\$t$ |$$l$(,Ét$$,$T$$C|$ ȉL$S| ‰$K| $ щT$'C| ȉ $u1҉T$$NɉL$ V,$D$T$1D$ $V\$҉T$ n $D$l$\$t$ |$$l$(,Í&',D$0t$ t$4l$(\$|$$D$t$$u\$t$ |$$l$(,Ë|$MbǴ<$1ɾt$L$<$DD$D$= <$11ۉ\$T$L$);L$wFMb)vŃ=<$1\$t$ |$$l$(,Ã=w|D$x$$L$1D$T$ $D$\$$2\$(\$$3[$H3sS\$$$$=w [Í$$l3L$[Ðt&v'S\$=wC4tKTt!CT[Ðt&$5Ӊ$T$CT[Ã,|$(|$0\$ t$$<$PHt t =wD,tS=w\$ t$$|$(,ÉD$$3\$ t$$|$(,$O,uvW|‰$_|%$t$t$<4$&L$T$$P4$=MbMb')ڃv<$HHD$\$ DD$D<$t$D<$<$D T$D$<$TL$<$D$TD$\$<$t$<$D$\$ t$$|$(,$3WDVHSDL$|$ <$<$%D$DD$<$HT$t$D$<$\$<$<$%DL$ D$G|$W|$T$v_|$uMbMbv')ڃv=wLG4tOTu_GTw8u><$X\$<$XD$L$[^_$j릋T$<$PT믋<$딍LD$T\$<\$P|$Dt$@l$HD$$K$DžC0) =<l$ ,$L$L$T$$Pt1D$%fD$T$3D$$T$V,$ \$,$L$ȉ)׉[^_]$4E1҉T$Fp$^pKD$$,4L$=Z1҉T$Ft$^tKD$$X4L$*U1WVSt$0l$ \$8|$44$\$^l|$1VxFdFhFlFpFtL$$\$\$1D$,$1\$$(11,1ɉ011҉418<L@DHl$1\$1ۉ<$1X11҉\11ɉ`11҉d1pt|x<$,$=$$úT$^p$øD$$=^twn<$+Mb\$>,$L$ȉ)׉[^_]$4E1҉T$Fp$^pKD$$,4L$=Z1҉T$Ft$^tKD$$X4L$* t$t$\$^pu4^tuM$Fx$4$\$t$ É$$^tt'$$롍&' t$t$\$^pu4^tuM$Fx$4$\$t$ É$$^tt'$$롍&'VS\$spu:stuS$Cx$$\$X[^4$4$stt'4$4$뛍&'=wÍ4D$S\$$ЉSl1ۅÅt=w&[Ã=v$4[ÍvT$$=v$4ϐ&WVSt$ =Vl(‰$tD=w~MbMb)ڃ wxt1ۉxFl(ȉ $~l%$(t$[^_$4a$5q&S\$=w!Clu8$ $1[$5CltӍt&'$Sl1‰$Kl%$1щT$ $Sx$$ $1[Ív'\$\$ t$Sl4$Kl‰ƃ?$D$\$t$Ít$t$ \$|$Vl|$$ډ$Nl‰Ã?$D$u؋t$\$|$ÍFl$u` t( t =fwPt&'tt7=f7v$5utf$5뭐t$t$ \$|$Vl|$$‰$@u؋t$\$|$ËVl@$t$؁f\$t$|$Ív'S\$Sl(‰$Kl% $(щT$Cl$Kl @$L$Sl(‰$Kl $(щT$[ÐVS\$ Sl(‰$u 1[^Ðt&Sl(‰$Kl%$(щT$K8Sl(‰$Kl% $(щT$Cl$Kl @$L$Sl(‰$Kl $(щT$1ɉ%x[^Ësl(Ɖ$Sl%$(ʉL$=x$5t&S\$ Sl4ʉ $D$Cl$4ЉT$Kl$Sl%$ʉL$Sl$Cl3ȉ $Sl5‰$D$[Ð\$\$ t$t$$C8u \$t$Í$hhtGs.hQuƃ=wAt$$t$\$ \$uӃuκhuh붉D$$ 6VS\$ =t$$vuD$$@6t,Cl$Kl $L$[^Sl$Kl%$L$[^WV1S\$ fD$L$|$$L$$Sl‰$@Kl4щ$Cl$4ȉL$Sl‰$Kl%$щT$Cl$Kl3щ$Cl5ȉ $Sh3T$ft2CXI=mHt=KXuCht/4$=OT$v't;KXuCht-$=T$&u =vD$$l6T$[^_Í=$6T$$Cl@$ȉL$D$ fD$t&Kh$ua=`$6T$Q$ 7T$w$T7$73|$$T$$shtT$$|$$T$VSL$ \$t$QpBQtB,D$,D$ 1tt &[^ÐL$ \$\$$t$|$=w*=B=\$t$|$==uϋC>Wu$pC19st$ D$$tD31uCS <r1mPC1Yl$ȉL$1{1T$ $|$v$7\$t$|$ÉC1g<htL{ \$t$|$ËSh1tfC \$t$|$1=v$8{ $pC19st$ S1Alʉ $C Cڋyl$1ȉL$S1 $T$C FCҋyl$1؉\$C1ylȉ $C  $1lj{ $pC19vst$ ƿC1HC1ylЉ$C $#pC19v%st$ #jƿvsƿvЃƿ/qt&VSt$ =w.T$(1ɋD$$@T$D$4$t[^$,8ĉ4$4$D$Ht)=w [^$6 4$ $1Ʉ…t =wa=w#4$KL$\$$P8$8ϐ&'S1D$\$$=R0tK0[ø[0[S\$$11=<XwI1҃=\wc111ɉ`1D1҉pt $[$f1ɉL$1҃=\v&${1D$뉍,t$ t$0\$|$$l$(1l$4$|$\$1ۉD$4$4$ЅÉVlt?=]=L$wCD$\$t$ |$$l$(,Ã=v$4=L$vt&$8D$\$t$ |$$l$(,$$$9t&4$1ɉL$=R0nK04$t\$p<$l$=4|$>4$4$D$=  t$t&T$$=$4u<$%MbD$<$Mbv)ڃcw <$t<$u=l$<$VlMb(‰$nl% $(͉L$Mbv)ڃ vMbv')ڃYw <$t<$u=\$<$\$\$1ɉL$<$t#D$t=$1|$.\$4$t#D$t=$1D$4$[0$D9$$x9)$9hD$$D$?D$$D$\S\$$$tG$1ɉT$L$T$ L$T$@D$ $Ã[É=\$\$$t$t$ |$w0|w $t&\$$|$\$t$ t$t&\$$91ҍ\$Ћt$|$ÍW$tW$t0@봋4묋V$u$t$=oF$1҅b$1Ҩ J$֍V3v1҃~("\$t$|$ |$ 1۹\$L$$1҉D$FxT$݋\3t$ \$t$|$X4$\$$dD$|S1҃T$\$ 1ɉL$$K<1҉T$T$T$D$ $tC4u(t =w+[Í$L$$T$L$[Í&T$$[Ðv'=wÍ ;D$ D$H4t@8u Í&D$D$ $D$ Ít&=\$\$ t$t$$vuD$$@;K(t\$1t$Ð$1҉T$u $t$$t$\$ \$Kl1hl($Sl% $(ʉL$Cl$Sl @$T$Kl($Sl $(ʉL$t$$t$\$ \$ D$T$$T$ Ðv'\$\$ t$t$$$t$t$$t$\$ \$=\$\$$t$t$ |$||$<$u!=\$1t$|$ÉuP uUuZuq\$t$|$Ðt&\$$h;o1ɋL$4$PP t1ɋL$4$PLtt$$;U\$<$yT$랐T$룐\$\$$t$t$ ÉD$4$u!=v"$\$t$ÀRtrt\$t$ÉVl\$t$T$ &1҉\$\$$t$t$ L$F]\$$=qt&1҉T$$\$t$|$Ív'WVSt$ =\$$v%F(ۉD$uD$$0>\$4$ttL$$F(D$D$$=$1ɉL$=[^_ÍvV(\$<$T$<$^0F0<$D$Vl1ډ$Nl $1|$O=|Dv|D$$h>T$[^_Ít&<$1ɉL$뗉D$$>^02&'\$$=F(t~,i[1҉|N$=1|$Y 1ҋD$T$$% É 1ҋD$T$$% ÐSD$\$ $L$$1T$(KfS0D$$=C(SC CS,w[ÍvC0T$L$$>D$ [Ð&'SL$\$ $T$$1ɋD$(SfC0L$$=C(SC CS,w[ÍvC0T$L$$>D$ [Ð&'VSt$ N0Vȉ $^‰D$()19V !Ӆt =wT$$؅uF )؃[^É\$ L$F$$?D$ΐS\$=wqC0S $ȉL$C0S $ ȉL$C0S$D$[$D?VSt$ =wF^$ $L$^$$T$[^$l?묍v'UWVSt$0=|$8l$w 냲| D$H7‰$1҃ w $>Ѓ ú @% ޺(#׺%к.(ɺ.º5뻐v' D$H$6‰D$ Ív'VSt$ =wo^ B$ ȉ $Bډ\$^5‰$ $5щT$=wt$ [^$E냐$Et$ [^VSt$ =\$$v۸uD$$Et8^35Ɖ$ $5щT$[^Ð^35Ɖ$ %$5щT$[^Ð& D$H5‰$ Ð&'VSt$ =\$$v۸uD$$$Fth^ 4$$4ʉL$^3‰$ $3щT$t$ [^t&^ 4$$4ʉL$^3‰$ $3щT$t$ [^&' D$H5‰$ƒ` t 1@ Ð&|$|$ l$l$$\$ t$D…uruCG,=vIuD$$LF\$ |$ t$|$l$,t=G,w\$ t$|$l$Ðw5ى$1WË54$9QwD$ Ӌ5ȉ $ \$ D$ 5ӉT$$SD$T$tHt=[Í&Z5‰$ D$5щT$[Z 5$%D$5ʉL$[&',L$8|$$|$0l$(l$4\$t$ D…11ۃt$G,T$?=&<$uDD$ӋwD$1щ$ Ë\$1\$t$$&<$S(u"4t\$t$ $Sl1‰$u̍v' $t\$t$ Ðv'UWVS,D$@=T$DD$(T$$|$(1ۋohE<$t$(NhA \$$D$|$$`T$ l$<$t$(11ҋNhY Kt&'@=~=HMb11\$ D$׋T$$$Mb)sQl$;\$ tыT$$l$Mb$L$\$ )r|$$<$=MbD$$$t)ځr܋t$(4$=,[^_]ËD$$$3=wt$t$$L$$$\$$$D$$!L$$ $D$$=F\$({ho$7l$,[^_]ÐUWVS|$0w1ɃL$GWX!$@$$ƹL$s C_h1ۅ\$F a=/_lӉ$FL$&1WhtWBG$6G LWht!BG t&Bl$uauSGhD$[^_]þt$lG $4JD$t&$Ls $Q룋<$T$SPt$<$PTWhuGx\$D$<$D$v'Wh8l$ $1ҾT$t$Mb<$PT1ɉL$<$SPMbt&)ځr썟$D$Mb')ڃvL$.=wKL$Wh]$<$1t$D$L$$\JL$막<$WxL$T$L$ Wh1퍇l$qv'D$@ht@ÐUWVS,D$@=T$Dt$PD$(T$$|$L`L$(GF $\$L1ҋC T$1ۉ$D$L$$l$  $|$F \$$D$|$H`T$ l$<$L$L11ҋY K@=~Fn 11ҋM@=~tMbt$$1D$4$1҉T$ Mb)sQL$;\$ tыD$$T$MbL$$\$ )r|$$<$=Mbl$$,$t)ځr܋t$(4$=,[^_]$JL$$hl$$,$=wt$t$$L$$}w\$$$D$$D$$$D$$=+|$LO$7L$,[^_]Ð&'UWVS,l$@1ɻ\$(L$$UX$ǻ@$$Ɖ\$w G}h$@$$ÉL$^ MhF…1D$ A nPRCX} =Ulʉ $pL$$1ۉ\$(Mht&AT$(FtJM$nD$(#E NT$(Mh AT$ t<$Pt>4$WEhD$$,[^_]Él$$琍t&E $4JD$$J'D$$1ۉ\$('AE -ExL$D$,$D$$MhAT$  ]T$,$SPEL$,$PT]1ҸT$D$ ,$STE1ɉ,$MbL$PP'Mb)ځr獅Mb$D$t&Mb)ڃv\$=w L$$Mh $\JL$$卅$u$Ht$1D$]x|$ \$L$,$L$$,$]xD$\$mL$$ Mh`1ҍT$;T$(t$t$$B\$Ɖt!Ã=w)؋t$\$Ít&\$)t$$J؋t$\$ÍW1VS|$ T$ \$(t$$<$\$_xt$wlGdGhGlGpGtGxs $\$ D$t$\$ 1ҍT$$t$\$t$$11A1AA 1ɉ1҉ 1$1(1ۉ,1ɉ01҉4181<1ۉDT1҉X1h1tx|1҉111ۉ1ɉ1҉1?B  =$ƸD$4$wp$$ÉL$_tGp$1ۉ\$?Ɖ)`vF1ۉ\$Gp$wp`NT$ D$L$$(K=wk&[^_Ã=v$lK[^_$K@Z\$t$$JJGp1`Ht$Wpˉ$`\$$KȉD$=U1t$Wt$_t{D$$K|$%t&W1VS|$ T$ \$(t$$<$\$_xt$wlGdGhGlGpGtGxs $\$ D$t$\$ 1ҍT$$t$\$t$$11A1AA 1ɉ1҉ 1$1(1ۉ,1ɉ01҉4181<1ۉDT1҉X1h1tx|1҉111ۉ1ɉ1҉1?B  =$ƸD$4$wp$$ÉL$_tGp$1ۉ\$?Ɖ)`vF1ۉ\$Gp$wp`NT$ D$L$$(K=wk&[^_Ã=v$lK[^_$K@Z\$t$$JJGp1`Ht$Wpˉ$`\$$KȉD$=U1t$Wt$_t{D$$K|$%t&VSt$=Fdw6^puJ^tuc$$4$Z[^$(L^pt&$$^tt'$$$$4$Z[^Ð&VSt$=Fdw6^puJ^tuc$$4$Y[^$(L^pt&$$^tt'$$$$4$Y[^Ð&VS\$=CdwAspuZstus$$$\$[[^v$(Lspt'4$4$stt'4$4$xv'S\$=wS$D$=w%t[Ã=vPLT$[D$$tL$L럍&'S1ɃL$\$ T$T$$ClCltHCl@tB|$v8=$L$=w_t>[Ã=wCl1[ËT$T$Cl$D$Ճ=v$PL뫉D$$tL돋Sl$T$=S$LB T$\$t$r|zxuځҁ с=u$11 \$t$ Ð&VS\$ =w.CluG$3$Cl1[^Ðt&$Cltƍ'L$$31҉T$$VT{xs|td=uT$11 $4$$3$Cl1[^ÉЁ%% 널T$B8uÍt&v'S\$ ҍCx +t4HPClPt =w1Ƀ[ÍvH@D$KlQ$LT$1̍l$9D$$L$(|9T$ | 9L$r9|$s1D$$T$ L$|$XRT$4$T$4$4$1ɿ4$1۸z4$14$$T=$R\$(\$=$ST$=$,Sl$k&1ۉ4$4$t$11Ҹ1}&',|$$=\$\$4t$ t$0l$(1,;C=|t4$\$$D$릐S1҃T$\$ 1ɉL$$K<1҉T$T$T$D$ $tC4ut =w+[Í$L$$T$L$[Í&T$$[Ðv' D$H4t@8u Í&D$D$ $D$ Ít&VS\$ =t$$v u D$$ $1ɉL$t<1ҸLHD$ $t$$\$ [^1D$ $t$$\$ [^&Ív'v'VSt$ =\$$usu# u4u9uy[^úT$4$PP t1ɋL$4$PLtǸD$ $[^Ë1ɉL$붍t&\$$Te\$빋T$또\$\$$t$t$ ÉD$4$u!=v"$+ \$t$ÀRtrt\$t$Ét$ \$t$1҉\$\$$t$t$ L$Fu؁%% =u\$ >11 [^_Ð&'L$AARt ЃÃÍ|$|$ \$\$$t$Wp=we%t}v+tv=\$1t$|$Ít&@uՃ=GuH'PKL$ 4\$$0V%u&=GtP:w\$t$|$$TVS&L$QP%tr @t1øÉ|$1=\$\$$t$~tt&L$ Qr:uځҁ с =u>\$ 11 \$t$|$Áu $Vct&@f`VVS=wYL$ Qr:uځҁ с=u\$11 [^$V뙐v'WVS|$ =Wr:uځҁ с=u\$ 11 MbMbt&9tw^>uȁ%% ‰с=uT$ 1ҋ1ۉV > u؁%% =u\$ 11ۋ= wX>V:uށց =u\$ 115 [^_$Vw$ !nVSt$ =\$$v۸%!u*!D$$0!t|^s B;uӁӁ ف=u\$11 [^ËVr:uځҁ с멋sQT$Uv'D$HB$<Ð&t$t$\$\$|$ VtDtauDFH89WuB ‰׃=uJB$@tt^ \$t$|$ Ë~O?Pt<׃=t^ <\$t$|$ Éz 밍=\$\$$t$t$ 1$ vV>u؁%% =u\$11ۣ >t'V2N߃=K\$t$Ít&\$$VK\$1t$ËNQK 뛋Vr:u؁%% =u\$11 g2FD$D&S\$$$t,$1ɉT$L$L!T$$Ã[ÐSD$ T$xt [[Ívt,JuXK;RuC ‰Ӄ@H8Rt*Ӄ=t0[[ËXځ ‹P$ƐSD$|$t8P1ۅt(PCt] A $<ۃ<[ËPP;)у= vӉ\$$X!=w[ú$VߐST$L$tDu;AS~)у= wP؍&'[ËY1t"Q@t; Q uЁ%% =uT$ 11ۣ V @+G,u$= A G,P @9N1W, @9tI1G G$[^_Ív$!VKL$ E\$ 1G G$[^_ÐN4t$ YX \$ A G, v'UWVS=t$0v0V,!u!D$$xX=n]}uЁ%% =uT$11ۣ <U @+F,u$=Y A F,P @9 M)DV, @9)DT$4$W=Ehw*D$\$t$ |$$l$(,Ã=l$v$Y$t$t$t&E $[D$t$1ɍL$|$ \$D$,$IL$=4$q$#,$D$$X#,$1ҍT$L$D$&'WVS1ۋt$(|$$9s=w C9r[^_Ë\$CD$ |$$$אUWVS\D$t=|$pD$T!$@$$ƉL$E_lWxEu Koh-T$$t$$V*10Mt$Gp1$l$,`T$ \$ȉ,$D$t$Gt$D$`T$L$ \$ $l$ ,$t$ ,4$D$PD$ $L$ 4 $k1=T$Ps CSv&D$t$T$ l$$[T$L$, $$D$ $$yop1`ut&'@= vvT$$.$WtJ1҉&BvvL$$C$11fr1fp1ɉdۉtl|11hL$L\$Hti\$LT$HMb\$1D$($L$,t$@1 $1҉T$D\$ $<$t$411҉D$<1ɉT$8L$0Mb);t$LL$@;\$Dtut$,T$L$4$L$ ƉT$D$ $\$D‹GhxtU;t$<t$<1ۉ\$4;T$8T$81D$0|$0ƒ|$4B=<$D$,$=vL$, $D$$#MbMb);T$LsD$,$uރ=vt$,4$D$$#\$,$=wh~L$, $\$$S21NL$(l$ $\$HGh4H,Q9wT$H,R9sL$T=H|$0|$4t =L=t$,1ۋ4$9=CRCD$XO$8\=Wl$#T$~$h\g=5$\$T$,$=w8t$@D$0cD$4F1|t$$o#붋T\$CT$ l$$$1ɉtZ=D$ 1ۋ$9s+=wCT\$CT$ l$$$1퉯WhҋZt2$Vt$1ɉt$Gh11҉t؉\[^_]Ët$$Vhl$X<= $$$\[-l$HGhTpL$,[Qt$T$ T$H RT$L$ $t^$$7$\ $$k$[t$0l$4t$l$^$\UWVS|$lv 11҉l9v>r&эqTCl9wfrl[^_]Ðt&D$ Ív'U1WVS|$0 w?t&| 9tQD9tx=wC vƃ[^_]ËDD$4\$Ct$ T$$ ]9Du=fphwM롍&9Lr=BSfphvT$؉\$ \$ʉL$$@]:D$Ív' t$t$$\$|$…1ɄЋ|$t1 B9r$ȋt$|$ Ð&'UWVS|$0 $…&' $…t1<1ۉ4$Ɛ&9h=wCD\$CD$ l$$$͐UWV1S,|$@T$(hpD$$FC_w7pTf9u9A9u,Q fpvF1ۃ_vɉhD$(,[^_]1=D$(w5tbh\$$D$(0|,[^_]щT$L\$ L$t$$l]l$u<$D$(,[^_]Ð&'UWVS,|$@d;s t&Ghxxt'=w,1[^_]@d,[^_]p1hD$(t&CF_HpTf9u4A9u'Q fpv1$]p=N3L$(h|0WhB'AD$$t&'lv 11҉l9vFr эqTCl9wfrL$$lun<$u$=v $]_hC>=Gh@<$D$L\$ l$L$t$$l]lv 11҉l9v7rэqTCl9wfrl}$^;hFWD$ lv 11҉l9v9rtlCq9wfrL$ lulv 11҉l9v7rэqTCl9wfrln&UWVS<|$P=$$l$ D$$D$ L$$1҃ B9<$1҉T$= <$1t$$Ët$ @@@ @ (@D$<$$Ët$ @@G@ V@@TF<$L$$Ët$ @@@ @F @T$<$$t$ F0@ @@ @@D$<$$t$ ,F@@@@ @@L$<$$t$ 4@,@@ @@T$<$$t$ @4@@ @@<D$<$$t$ @@<@@ @2@L$<$$t$ @@@@ @@T$<$$t$ @@@ @@D$<$$t$ |$T@@?@ @@@t$|$T<=1ɉL$T$ t=D$$1ۅUC9]~t$C9]Ut$D$<[^_]$D^<$1ɉL$$t$ @@@ @  1۸;\$$D$.$$<$T$$t$ @@@ @1=l$<$=N1ۉ\$7<$ C;]}MU4twu\$<$UƋH@1!t wnC1;]t$||$$$$l^2\$$"v$"D$ t$\$$Z o=$ %$^ .$" U$'%&'D$ $t$P PpH9r9vP$t$Ít&9wp$t$ÍT$1ɋB9BtBU1WVS,T$HL$(t$@ugD$$F;D$D ~V n9v׉ыF;D$DD$(ЋF9s͉ύ\$ wKFn9~V 9v׉ыF9D$(ЋF9sω$^=|$ v\$D\$FD$ NL$$ _T$-l$ c$X_\$$D$DD$NL$ VT$.$ _l$=|$$NF|$DtB~1V 9v׉ыF;D$DsD$(ЋF9sщӉN|$ w!D$(,[H^_]ÍN9t<|$$vߋD$DD$NL$ VT$.$_l$D$(,[H^_]Ã|$$F뻋n뭍v',t$$t$0\$ \$8|$(F|$49sAV9v=N ˉFF99N9FuJFAV9r&9wX9v09s,=ww1-t&1D$\$4$t =w\$ t$$|$(,øÐD$$_9bV]$`=p\$NL$ VT$$ _D$GU1WVS,\$$t$@D$t$(MbT$ T$(vD$u] ׉T$L$H ƙ=}/B%)yUƙ=|ݍD$D$9D$wMMb\$ ыT$()ً4,<QB9r<[J9v1=t$$w5D$$,[^_]Ã=vL$\$$h`D$$,[^_]ÉL$\$$`ލt&UWVS,D$@=D$$\$$1|$t$$D$$L$ x=D$L$Q:t$$-G4$\$$҉T$D$$D$&'L$$ V w_l$$D$;݋X OxHǙ9}&UB%)yT$BǙ9|ݍvT$ d$ =D$P T$-\$ ҉YC=L$Q21=T$$Fl$\$$,[^_]þMbMb'L$$9rT$ d$ =\$%|$W2nl$($`D$Phl$(D$P:wt$( &UWVSD$0=D$v $(a11\$\$$l$T$D$$l$t$x~xU yu:w =u 2FD$:5T$ 1$t$1ɸ$1ۉD$|$T$\$ Y1'M\${xBus =g5MbMbZ&'9rU\$ {xAus = 5Mb MbZ9rGMb 9r=D$ D$|$t$ 9T$T$1l$|$$\$4,9t =w1Ƀ[^_]Ë1FD$T$$Laԍv2FD$\$L$$a)ω|$5UWVS,D$@=D$$WL$$l$ x=L$mt$V1ɾ5T$$Cl$$L$$1D$L$'T$ d$ =L$QT$ 5L$$S ~ w^D$+xM݋X H Ǚ9}/UB%)yT$BǙ9|ݍD$\$$t$98MbMbZ 9rl$$D$,$= |$W D$$5l$$A;t=1,[^_]MbMb'l$$9rD$\$$t$9G l$Ux|$(J$aD$l$ L$$x=L$QKL$(T$$a#\$S2NL$(v'UWVS l$ ==}xW2MbFMbZ t&'9r,$\$ɉ'tMbMbZ &9r,$D$=tQW A [^_]$ b=}xW AD$W*}|$ A [^_]Ív'V1S\$ sxV{x Au A = 1҉L$T$$u=v$Dbߍv{xNru1F ‰փ=tE1ɉ4t$$L$[^Ë@D$<PT$UWVS\$D$0D$$D$u T$1ɉD$l$] >OuM ƙ=}-B%)yUƙ=|ݍv'=v*$D%1D$É\$=L$D$T$\$$\$|$] }1NuMƙ=}#@%)yUƙ=|݋|$l$W|}x quXف ك=:T$ L$$u l$1=v-$lb1‰T$ȉL$=w||$\$\$<$T$ ~=wK[^_]Ët$@[^_]Ë2nl$!$bY$bs$X%[^_]ÐS\$ 1KT$ $D$CT$$C$S =Cw#C(CCC [É$o%C(CCC [ÐS\$ 1KT$ $D$CT$$C$S =Cw#C(CCC [É$o%C(CCC [ÐD$1ÐUMbWV1S,|$@Mb')ڃvD$$ >T$L$<$SD$$Mb)ڃcw'<$>t$L$uÃ=\$$Mb/1ҹ>T$L$<$UD$$Mb)ڃcw'<$>t$l$uÃ=Mbt&Mb)ڃcw%<$\t$D$uŃ=wa,[^_]t$Mb$b)ډT$t$Mb$b)ډT$Et$Mb$ c)ډT$,[^_]Ð& 1ɋD$L$TT$$Ѓ Ð&VS4t$@=\$Dtf\$ $T$TT$L$4$Pt%D$fD$D$TD$4$R$4[^Í\$ $T$TT$L$4$PtD$fD$%뗉\$$,c>t&Ív'Ív'Ív' D$L$\T$$%`f=`t ø Ð<1\$0\$Dt$4t$@|$8`f`tg|$ <$L$\L$T$4$Pt[D$%u=fD$T$\D$4$T$SÉ<$؋\$0t$4|$8<É f\$뿍&1ЍLT$Tt$@t$P\$<|$Dl$Ht  t1\$1҉T$4$WXD$1l$D$4$RD$^T$4$%fD$%D$S|fD$a&'VS$\$4t$0to\$$ RL$T$4$P$$ PL$T$4$P$$[^Í&\$$P1҉L$T$4$P$$1҉T$RT$4$P$$[^Í&'|$|$ \$1ۉt$L$T$<$Åu؋t$\$|$É<$@T$D$=vȉD$t$$c벐=\$\$(t$t$$wt/KtA\$t$É\$$T&u܍t&'f\$t$@f<=\$4\$Dt$8t$@w4~(tK=w\$4t$8<Ð$n&\$$&~(u&t4=w1\$4t$8<É\$$c1f$\$ $T$TT$L$4$Pt'D$fD$%D$TL$4$R$N$@\$ $T$TT$L$4$PtD$@fD$뛍 =wD$T$P $&D$T$P UWVS<|$P=l$ T,$ PT$L$<$S,$,$D$D$t$<$Rt(\$T7D$<$f\$\$V,$MbMbt&)ڃv,$7 RT$\$L$<$V,$,$7^\$D$<$Vt'L$^D$@fL$t$<$S,$7<$>Vh,$D$D$\$<$Rt'D$>T$<$ fD$\$Q,$<$<[^_]$&=t&V>S\$ t$L$$$T$\D$ftu[^Í&1u[^ÐUWVS,l$@|$DMb\$$E@|$T$,$P$,$@\$D$f9tMb)cvȃ=w1f9,[^_]\$Mb$c)T$1f9,[^_]Ív'S@L$D$ 1ۉ\$$=w[É\$$&[Ð =w  $& ÐS\$ 1KT$ $D$CT$$C$S =CC<fCPfCNC$w_C(CCC C0C4C@CHCDC8CLCMfCR#fCT1[$&듍S\$ 1KT$ $D$CT$$C$S =CC<fCPfCNC$w_C(CCC C0C4C@CHCDC8CLCMfCR#fCT1[$&듍\l$Xl$`t$Pt$ \$L|$TfD$>4$}bD$>T$D$,$W\$>4$fD$4$UL$~L$D$,$R\$4$1҃tB}(t$dtɁM(\$L1ҋt$P|$Tl$X\Ðt&p u볃LD$T|$D|$P\$L$T$$P4$؋t$(\$$,Ð,L$4\$$\$0ɉt$(tIt$4$T$VT$$P4$؋t$(\$$,Ít$4$1ɺVL$T$$P4$؋t$(\$$,Ã,\$ \$0t$$t$4|$(|$<$t$Vt$$P<$؋t$$\$ |$(,ÍVS4\$@fD$.t$4$L$.ZL$$D$R\$.4$1u=w 4[^$$d琍v'L\$@\$P|$H|$ t$DfD$><$L$>>L$$D$Rt$><$fD$<$L$^L$$D$R\$<$t\$@1t$D|$HLÐt&<tߋ\$@t$D|$HLÍ\|$T|$`l$Xl$ \$Lt$PfD$>,$>D$>L$D$<$Rt$>,$މڃ\$u\$Lt$P|$Tl$X\fD$,$L$@L$T$<$S|$,$=vD$l$$Ddl$늍<|$8|$@t$4t$\$0fD$.4$L$.TL$D$<$R\$.4$u؋t$4\$0|$8<Ðt&G$<$Tt$T$D$ ؋t$4\$0|$8<Í<\$4\$@t$8t$4$fD$.L$.TL$$D$R\$.4$t$8؋\$4<ÉUTW1V>S<|$P_$L$T$<$\$ l$l$D$ t$<$=w`MbMb)ڃv,$71ɸ>L$<$D$V,$<[^_]fD$.,$L$.>L$T$<$Pt$.,$$xdt$Q<\$4\$@t$8t$4$fD$.L$.TL$$D$R\$.4$t$8؋\$4<ÉUWVS<|$P=l$T;fD$.t$4$L$.TL$T$<$P\$.4$Ë\$Xuo8ÃG$u(D$X…4$\$T\$<$P4$MbMb)ڃvt5/<$ULw8<[^_]ÉÁK71ɉL$<$VXGHtы<$<[^_]Él$$dG8<$D$ ؉كO$ Mb_0ډWD<[^_]Ë1ɉL$<$PPMb&)ڃvv'<\$4\$@t$8t$4$fD$.D$.TL$$D$R\$.4$t$8؋\$4<ÉD$$T$ t(B$$ȉL$ 1D$TD$J$D$TD$L$ $ÐT$B<Ðv'VS4\$@fD$.t$4$D$.^L$$D$R\$.4$4<)[^Ð<|$8|$@t$4t$\$0fD$.4$L$.^L$D$<$R\$.4$ڃtt _<\$0t$4|$8<Ðv'VS$\$4t$0to\$$RL$T$4$P$$PL$T$4$P$$[^Í&\$$P1҉L$T$4$P$$1҉T$RT$4$P$$[^Í&'UWVS<l$P1vG wnv? t$fD$.4$UL$.L$\$,$R\$.4$$'\$? G\$ v<[^_]ËE $Q1ҁ}($dD$‰T$H&'SL$$\$ шL$&C<tHȃ~@uRCL$Ѹ=T$ \D$L$=wF[CL=w]1[ÍKL&$$CM\$$e&\$L$똍&$De1땃<\$4\$@t$8t$fD$.4$L$.\L$D$$R4$=w\$4t$8<Ív$pe\$4t$8<Ð&D$$L$)D$ T$ \T$$ÐWVS |$0\$$NL$t$L<$P$$T$t$Mb<$P$Mb&')ڃvO$<$T\$D$L$ Mb)ڃv<$1ɸL$ \\$D$Mb&')ڃv<$ [^_ÃL|$D|$Tl$Hl$P\$l$ ,$\D$>L$D$4$R,$=4$1T$ b\$D$fD$,$L$bL$T$4$P\$,$èt=wI4$1ɽL$ bl$T$af9FTl$ [$fD$$f$pe"D$$ g4$1۸\$b1|$`fD$ l$`fL$ T$4$|$1D$ \$4$FHMbn4FD9sЃ=FDlD$$`g&<|$8|$@\$0t$4WHt1\$0t$4|$84$L$>LL$$D$R4$4$fD$L$NL$$D$R4$4$fD$L$TL$$D$R4$D[^Ð&'=\$\$ t$t$$w{st+\$t$Ét$$,h{suۍS8\$ t$\$T$$S1Ƀ\$ D$${(…u[É$TL$1҉D$ T$[ÍD$ T$tHt f Ðt&fÍS\$ fD$D$$Sw$ w$w$, qD$[Ðt&$`hSƃv$h'D$[Ãv$hv$iЃv$Di뽃u$ti릅tBC9KcC jCt&D$D$D$$C$itoKudK u]C뗅MCt$i$Dj[$xjzuiCL$D$D$$CC EK vK "CC $jCC nCL=t$@t$P|$D|$T\$\$T\$4$W,$\$<t$@|$Dl$HLɁ룋F$F$룋F$F$똃 =wD$T$P $>'D$T$P Ã=wÍQ'D$SL$$\$ ɉ`t;T$T$\$ $PuL$9`t =w 1҃[Ã=v$k$m'ҍv'v'v'D$ D$ D$ D$ v'v'S$tËT$$0L$ D$ $T$D$1t#C(t!$D$L$؃[Ë$R1[S1҃T$\$ D$$\$ [L$$\$ t$…u9w1'$t$ÐVSt$\$L$ tAfJu[^Ðv'VSt$\$L$ tfJu[^ÍS\$(T$ D$$ L$T$$[ÍVSt$\$ L$tfAJu[^Ðv'VSt$\$ L$tfJu[^ÍS\$(T$ D$$ L$T$$[ÍT$ t$t$$\$|$J Z)xU)ljxF9~199!Ѕu =w5\$t$|$Ðt&99 Ѓ͋z볋z뤐t$\$L$ $(k\$t$|$Ð& \$\$t$1$X$\Xtt\$t$ Ã=v$Tk\$t$ ÐS\$Xu$\u[É$1ɉ\[É$1Xʐ&W1VSt$1ۋ|$9OA1)9r1[^_WV1S\$ |$(KPCStC C<A 'AAAA AA1B 'BBBB BB1CCCCC C4C8CHCPCt@@@@ @@@ '11҉11ɉ1҉1t$$H1ɉ81P1L1҉T1X1ɉ`1=\T$,hld[CD11ɉ1111ɉ11҉1ɉ@<1h1CLC8$X$\X|$$t s(%%t`=v*S('u'D$$'=w3[^_Ã=v$Tk넍t&$tk|$(k\$ L$$[^_&:1$D$W`E2L$$VuH%`F|$ $Ru*%p뻉ِ&WV1S\$ |$(KPCStC C<A 'AAAA AA1B 'BBBB BB1CCCCC C4C8CHCPCt@@@@ @@@ '11҉11ɉ1҉1t$$H1ɉ81P1L1҉T1X1ɉ`1=\T$,hld[CD11ɉ1111ɉ11҉1ɉ@<1h1CLC8$X$\X|$$t s(%%t`=v*S('u'D$$'=w3[^_Ã=v$Tk넍t&$tk|$(k\$ L$$[^_&:1$D$W`E2L$$VuH%`F|$ $Ru*%p뻉ِ&S\$$d`uFXu*\u [Í$1ɉ\[É$1҉Xċ$P 1`먐S\$$d`uFXu*\u [Í$1҉\[É$1ɉXċ$P 1҉`먐S\$$d`u!Xu5\uK\$[$P 1`Xtύt&$\1҉Xt$1ɉ\\$[\$\$ t$t$$`uC49Ët$\$Ët$L$$`L$`$RC49Ët$\$Ít&\$\$ t$1`u\$t$Í&D$$1T$ $D$Ƌ`L$`$RC,\$t$Ð&\$\$ t$1`u\$t$Í&D$$1T$ $D$Ƌ`L$`$RC0\$t$Ð& D$L$`HD$$()t&k0|$l$ $`k,l$|$` $'@M<H119l$ D$T$H $W L1ɋ}T$ ChL$D$L,$WHPT$,L$ l$\|$H$RHhML$(MtK1D$$D$,9D$$t%|$L$$|$(L$<$'1l$ t SH)U|$L$H$Rp|$0…tEL$8 $S҉T${<Xl$1t&;l$ srD$` t$1 hfɉ` ft(&9~Ffuv'FfɘcT$fjE눋l$ L$l$\ $|$T$t&'T1҅t^CT4t4t4K8t`wLD$ t$\L$L4$R l$8,$L])L$t$$P>$Q=vt$XT$T$K1҅t$\l$X<$щʋL$,))Չl$$TY)t$D$T$l$(T$,|$Չ,$&t$D$TD$84$҉D$4|$XD$\,$ҍ ?L$XD$P$|$ :Ll$$WD$L$av'\$\$ t$u \$t$1t$L$8$ҋTuX1ҋCT t t t$$uLt$ L$\D$L $R x$t=vt$XD$T$K1҅et$\D$X$щEv'\$\$ t$|$`t$D$$D$u\$t$|$Ë`s@t$|$` $`sDt$|$` $`s<t$|$` $4@t= `ltg=1v uLG9wCHL1l%)>D$L$L$W\$1t$|$1ɸL$D$84$ҋTuL1ҋCTLҋLGt$ T$\$t$Q l9G$t=vt$XD$T$K1҅qt$\D$X$щQ`1t$|$8 $ҋTx$f=vt$XD$T$S/D$\|$X $D$$4)l $O)v'S\$ =1ҹ0(L$T$$1ҹ0(CtL$T$$1ҍCP0($L$T$`t2w[Ë$f)D$'v΋S@T$K<$nL$=v$|)D$=v1҉T$$nL$=cL$$ oD$=6D$SL$8oT$= T$$doL$[Ít&C,$)D$=US0$)T$=5K4$)L$0$)D$X`L$$oT$.v'T$$\$\$ %t$w$ `1u \$t$ËT$$t$L$ K\$CՋC Ћȋ븋밋`du`띋CD똡뎋C@뉋끋C|,$L$>L$t$<$P\$>,$fD$,$T$~T$L$<$P\$,$ˉGʈ_ _1fW1ftfF1f…u+Mbt$) L[^_]ÃL[^_]D$D$D$D$11ɉ\$\$ t$L$C t$$$R1҅u\$Ћt$Í&C L$L$ D$(t$D$s 4$R\$t$‰,1ɉ\$ \$0t$$|$(C L$|$4$t$8R1҅u\$ Ћt$$|$(,ËK D$|$D$ t$s 4$R \$ t$$|$(ƒ,UWVSL|$`Mbl$ T$&'fD$>,$7L$>|L$D$<$V\$>,$fD$,$T$~T$L$<$P\$,$ˉGʈ_ _1fW1ftfF1f…u+Mbt$) L[^_]ÃL[^_]1111D$ &11111111111111111T$D$tx,t@,Í@,11D$311111D$ &1111UD$D$D$@D$@D$D$lD$D$@D$@D$D$ D$D$D$ D$  D$,D$l-D$lID$ KD$lhD$ iD$鬀D$<D$D$D$鼫D$D$|D$D$\D$D$D$lD$ D$, D$D$<L$H\$0\$@|$8|$Dt$4t$fL$.4$D$.|$$D$R\$.4$t$4؋|$8\$0< D$,8D$<:D$@D$@=\$\$$t$t$ w\$$\$t$ t$$\$$\$t$ t$=wÍ)D$D$ =w $> =wÍUD$ D$$ ,1,111,1,D$ &S\$ ~ [É1҅xfD$1ɺ@ L$D$L$D$ |L$D$$t.=T$ D dw61҅ƒ[Ã=v$t0ʋT$$0D$D$,DD$DD$LD$MD$011111D$@0D$$111111 D$ &D$|zD$錌D$D$\D$D$@D$@L\$<\$T|$D|$Pl$Hl$ t$@\$t$\\$X,$T$L$L$T$<$Pt]uIt T$ ft$D$L$<$L$D$S,$\$ٳڲEVL 6#j3Jjc[S>3+# #PD7,{1N>>N1{,7,EDU n7&B'R=o"XF0 hs?  >  ;lg: CA=T9q)</  /<)q9T=AC :gl; >  ?sh0 FX"o=R'B&7n UDE,<z^*{hQh{*^z<<nvE@N*yU{7 6YqX'Zq,  ,?6s=l to\ 4K > {*[AA[*{ > K4 \ot l=s6?,  ,qZ'XqY6 7{Uy*N@Evn< 3#[{kU "  " Uk{[#3  /-4PGpy'p') OyJ N~ 3(  (3 ~N JyO )'p'ypGP4-/ N}eH<He}NUy][6 ; {'> U;8":'NXlE_lAo4V0\2l  AcF{i-.)!<//2BWm(m(WB2//<)!.-i{FcA  l2\0Vo4Al_ElXN':"8;U >'{ ;6[]yUB} 3{^I{'I^{3 }B ")j#k(!!(k#j)"  oI~z~p;~z~Io Q4%sPV3u2Y*945:b3H@%%@H3b:549*Yu23VPs%4Q i,T %?0% T,i 'H4  ju-[[] iNRuh+  1AfdEb37%%73bEdfA1  +huRNi ][[u-j  4H'^[~_+d<d+_~[^O+U8) BhL *+5X^Z.!kk!.Z^X5+* LhB )8U+O "10*hHe~  ~ eHh*01" /2+{[ w  x B-3&,3$t%&,gS ^ 4 fQX\Q[)3))3)[Q\XQf 4 ^ Sg,&%t$3,&3-B x w [ {+2/ Hj~Y0a<a0Y~jH Foi;9Df gHDv#e;[ jnTgG A]0:H dGiE < 9Pu(AnA  75iYD8mB u<  2`?6=J5  ,oE?4EY. &Tb2o%  9 g01~Z'-U"`:B4+f%+. a nf](](fn a .+f%4+B:`U"-'Z~1g0 9  %o2bT& .YE4?Eo,  5J=6?`2  <u BmD8Yi57  AnA(uP9 < EiGdH :0]A GgTnj[ e;#vDHg fD9;ioF,es@c*^p\r 63 } } 36 r\p^*c@se,.cw$]@=]$wc.-Or] 7JkJ;!c2#A  v4CY((YC4v  A#2c!;JkJ7 ]rO- 1?6uA{g8tw _ w t8g{Au6?1 $r]u4E,h ` h,E4u]r$AG 2G A|0t!+W EdkhFM*!F4Y ~sZZs~ Y4F!*MFhkdE W+!t0|^hnC;Cnh^ (jf?e9eD9*\`f2\G1T;c ";9P Oo(o(O P9;" c;T1G\2f`\*9De9e?fj( '@',SDe(@(eDS,fAf,L,LYfs1AQamrmo_card_interrupt: RING amrmo_card_interrupt: error! amrmo_card_start... amrmo_card_stop... amrmo_card_ctl... amrmo card: IODELAY = %d. amrmo_card: SPEAKERVOL = %d amrmo_card_enable: card %p. amrmo_card_disable: card %p. amrmo_card_create: data %p. amrmo_card_delete: card %p. InitHW DeInitHW amr_create: %p (amrmo %p) amr_delete: %p... DeInitHW Unknown ICH4 likeCold reset finished...ICH5ICH4AC-Link is shut down...No codecs detected on AC-LinkAC-Link is in reset state...Warm reset finished.Transfer Underrun detectedTransfer Overrun detectedUsing time unit of %ldRate %ld is not supportedBlank PTC interrupt #%ldWakeup on Ring is EnabledAC Link to D3Cold...AC Link to D3hot...ICH4Card::OnResume PMCSR %lXIndex %lX, count %lX, pos %lXDirect[%02lXh] = %08lXStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDeInitHW Unknown ICHWarm reset finished.Standard MicrosystemICH2Warm reset...ICH 82801AABanisterICH0 82801ABMixed mode card detected...Transfer Underrun detectedTransfer Overrun detectedWakeup enabled = %ldRate %ld is not supportedBlank PTC interrupt #%ldAC Link powered down...GS on power down is %lXSuspending... GC %lXAC Link to D3hot...Cleared WU status...Resumed with AC97 Wake Up...Index %lX, count %lX, pos %lXendisPM active at %lX, %sabledStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDeInitHW UCH1500 PCI%ld ms for detectionWarm reset...Transfer Underrun detectedTransfer Overrun detectedRate %ld is not supportedPCICard: Finished CAP loop...Blank PTC interrupt [%ld]Unsupported.AC Link to D3 cold.AC Link to D3 hot.PME asserted...WOR detected(%lX)OutInDT table of DMA %s at %lX%s DMA:Internal %04lXCommand %04lXIndex %lX, count %lX, pos %lXDirect[%02lXh] = %08lXIndirect[%02lXh] = %04lXStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldPTC clockSpecificHardwareBitmask %lXh[V]ariablesSpeakerVolume %ldSLADVXD: Abort modem support.DeInitHW Platform Name Unknownslamr: mc97 codec is %s%lx%s pCodec->StopPulseDialingIgnore PS change to %ldLoopCurrentSense measured %dDirect IO space[4]PCI Configuration Space[4]Direct IO space[1]AC registers[2]InitHW SecPri%s-%lX(%s)%s-%lX(%s) on %sYNMC detection: %lX%s-%lXDelay reduction of %ldAdditional delay %ldPrimary %s-%lX, type %sSecondary %s-%lX, type %sMC details: %s[R]egistersERROR: AC can not be accessedtAmrMoCard: Resumed.tAmrMoCard: Resuming...pCodec->StartPulseDialingInvalidGenericACMCAMCDirect[%02lXh] = %08lXSILSMLADSStartFramer failed!DeInitHW VIAICEForce D3hot...Rate %ld is not supportedOutput can not start!Blank PTC interrupt #%ldUnmasked GPIO in on %lXStarts of Output:Can not start - %dStarted from 6th time - %dStarted from 5th time - %dStarted from 4th time - %dStarted from 3rd time - %dStarted from 2nd time - %dStarted from 1st time - %dTimed out read from %lXAC Link powered down...AC Link to D3hot...PowerOff stage 1...PowerOff stage 2...OKUnsuccessfulPowerOff stage 3...(%s)PowerOff stage 4...Resumed with AC97 Wake Up...MOMIIndex %lX, count %lX, pos %lXBlock at %lX, size %lXStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDirect[%02lXh] = %08lXVIA Registers: Base at %lXendisPM active at %lX, %sabledDeInitHW SiSWarm reset...Output LVI detectedInput LVI detectedTransfer Underrun detectedTransfer Overrun detectedGC: %lX, GS: %lXRate %ld is not supportedBlank PTC interrupt #%ldWR setting %ld, %ldAC Link to D3hot...AC Link powered down...YNTimeOut on GetPositionIndex %lX, count %lX, pos %lXStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDirect[%02lXh] = %08lXUnknownFirst In CooperationFirst And SingleSecondInvalidDeInitHW SIS960Power Control after reset %lXDC reset is suppressed.Reset DC...LinearMemoryBase at %lXWAKE_1 SETAudioReset is %lXRate %ld is not supportedBlank PTC interrupt [%ld]Timed out read from %lXTimed out writing GPIOTimed out writing to %lXMLNK set...Modem in PM as %sPowerOffProcedure to D%dMC WakeUp disabledAC Link status %lXPCI AC PM enabled?!PCI DC PM disabled?!AC Link cold reset(%lX).AC Link shut down.Wake-up on MC ring detected.Set WAKE_EN2Restore Last Audio StateMOMI%s: Position %lXConfigure channel %s on %ld%d cycles to drop GPIO_INTDirect[%02lXh] = %08lX960 Registers: Base at %lXIRQTest: Detected %ldStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDeInitHW Unknown SL1800 likeFixed %lXFix IO and Memory bar...Fix IRQ...SL1800 PCIALI 5457Transfer Underrun detectedTransfer Overrun detectedRate %ld is not supportedBlank PTC interrupt #%ldWakeup on Ring is disabledVALI5457Card::OnResume()Index %lX, count %lX, pos %lXStopping function of DMA_OUTStopping function of DMA_INdmaCIV=%ddmaLVI=%ddmaPOS=%dVALI5457: Try to stop DMAStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDeInitHW Unknown REALTEKFixed %lXFix IRQ...Fix IO bar...Cold reset...RTL 8101LTransfer Underrun detectedTransfer Overrun detectedRate %ld is not supportedBlank PTC interrupt #%ldReadACRegister %lXh timed outWakeup on Ring is disabledRTL8197Card::PowerOff doneDirect[%02lX] = 0x04lXStarted after %ldFilled at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDeInitHW Nvidia MCP AC-LinkStarting RD DMA...Stopping RD DMA...Wakeup on Ring is EnabledOnRESUME: bRingEnabled = %d VNVidiaCard: DNVw DNVw: ...Create SIL3054codecSIL3054codec::Calibrate()SIL3054codec::Initialize()Non-DeInitHW Implement CIDImplement DebugQueryImplement DevIO_acReadImplement ClearCodecIntStatusSqeezerSecPri%s-%lX(%s)%s-%lX(%s) on %sInitHW YNSubsystemID: %lX%s-%lXDelay reduction of %ldUserMuteEnable %ldAdditional delay %ldPrimary %s-%lX, type %sMC details: %sBlank PTC interrupt #%ld%s: %ld interrupts detected!Transfer Underrun detectedTransfer Overrun detectedFixed %lXFix IO and Memory bar...Fix IRQ...SL1801 PCIImplement OnTestIgnore PS change to %ldSet LC attenuation as %dMute buzzerRates: %ld(ADC), %ld(DAC)VALI545ACard::OnSuspend()Wakeup on Ring is disabledVALI545ACard::OnResume()DisconnectConnect%s handsetDeInitHW Unknown SIL PCIHWDriver: ModemBaseIO=%lXTRUEFALSEDirect IO space[dw]PCI Configuration Space[dw]Direct IO space[b]Direct IO space[w]ModemOpen bad HWlockUnknown SML PCISL1900 PCIAdditional delay %ldDelay reduction of %ldInitHW InitHw bad HWlockMC details: %sChipset: %sSi3052%s(%c)LoopCurrentSense measured %dStart bad HWlockRate %ld is not supportedDebug - SIL3052Card::Enable()checkLock Vid=%lXSIL3052Card::OnStart()%s: %ld interrupts detected!Blank PTC interrupt #%ld[R]egisterspCodec->StopPulseDialingIgnore PS change to %ldWakeup on Ring is DisabledSIL3052Card::PowerOff doneWakeup on Ring is enabledSIL3052Card: Resumed.oCodec.StartPulseDialingOUTINTRUEFALSEDirect[%02lX] = 0x04lXSi3018 Int-DAA(%c)TRUEFALSEOnOffSIL3052DMAChannel::CardTest()Started after %ldFilled at %lXSIL3052DMAChannel::DMATest()DMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldSIL3052DMAChannel::OnTest()DMA In Filled at %lXDMA out Filled at %lXDeInitHW Unknown PCIInvalid pMEMBAR %lX ,len %lXpMEMBAR at %lXSL2800Card::ModemClose()Unknown cardStatus=%lXSL2800: Detect Ring INTRGPIO0 INTRRegs in MEM space[dw]PCI Configuration Space[dw]SL2800 PCISL2800Card::registryInit()Additional delay %ldSL2800_GPIO_DATA_REG =%lXSL2800_GPIO_CONTROL_REG =%lXInitHW Tx Gain is supported%s on %sMC details: %sChipset: %sInternal%s(%c)YesNoTestCFG: Ignore first PTC =%senableddisabled HWDriver: SL2800Card::Start()Rate %ld is not supportedSL2800Card::OnStop()SL2800Card::Disable()SL2800Card::OnStart()%s: %ld interrupts detected!Blank PTC interrupt #%ldTRUEFALSESL2800Card::EnableRing(%s)[R]egistersIgnore PS change to %ldSL2800_CONTROL_STATUS_REG=%lXWakeup on Ring is enabledSL2800Card::PowerOff doneWakeup on Ring is DisabledSL2800Card: PME EVENT!SL2800Card: Resumed. CTRL=%lXSL2800Card::SetHookOn(%s)SL2800codec::Initialize()TRUEFALSESL2800codec::EnableRing(%s)Xformer DAASL2800codec::getGain =%dSL2800codec::set Tx Gain =0dBSL2800codec::set Tx Gain =6dBDMA_Out:Position=%lXSL2800DMAChannel::Reset()OUTINdmaBufferStartAddress=%lX,%lXdmaBufferSize=%lX,%lXBlockSize=%lX,%lXSL2800_CONTROL_STATUS_REG=%lXSL2800DMAChannel__%s::Start()TRUEFALSESL2800DMAChannel__%s::Stop()SL2800DMAChannel::Buffer=%dTesting register offset = %xSL2800Card::resetTest..Error: Unknown Test failureWriteable test is failedReset test is succeedWriteable test is succeedReset test is failedSL2800Card::CardTest()Started after %ldFilled at %lXSL2800DMAChannel::DMATest()pMEMBAR at %lXDMA Status on Stop is %lXhDMA Status on finish is %lXhDMATest detected %ldDMATEST=%lXSL2800DMAChannel::OnTest()DMA In Filled at %lXDMA out Filled at %lXDMATEST_BothChannel=%lXDMA TEST FAILMEM %lX[%d]=%lXSTRESS__TEST_FAILDMA In memory dump resultDMA Out memory dump resultPCI Reset test is succeedPCI Reset test is failedPCI Writeable test is succeedPCI Writeable test is failedPciCfgIntrStatus=%XTry to TST_StopTest...AD1803 codec: hxSupported Set speaker %lxMute speakerCalibrate codecCalibration is possible.Calibration in process. Wait.AC[%02lXh] = %04lXAC registers(DC base %lX)AC[0x60/2] = %04lXAC[0x60/1] = %04lXAC[0x64/1] = %04lXUpdate handset flag to %dHandset is not supportedsetHandsetState=%dsetNewMOHmechanismtAdsMC::SleepSampleRate gets %xCodec requests D3ColdSIL codec(): hxSupported Non-AC[%02lXh] = %04lXIntl%s, DAA(%c)USsetHandsetState=%dsetNewMOHmechanismOnHardwareInstanceDestroyedhal: cannot open modem card. LineOutLineInModemed successfully.ion failure!Construct%s Written %ld, evaluation %ldModemInstance::Stop()... and I deleted it! No, Modio is active Yes,Required force Modem Rate.Starting Modio:PTC = (C)%ld, (P)%ldSample Rates = (C)%ld,(P)%ldBuffers = (C)%lX, (P)%lXSize = (C)%ld, (P)%ldModemInstance::Start()... MIMOMTLHAL: Finish Modio Setup:[OnInterrupt] Depth = %ldLineIn:LineOut:Done, LineOut:Required blank DP run(%ld)Required idle cycle...Card capabilities %lXbModioActive = %lubRingEnabled = %lubHookOn = %lubCallerIDEnabled = %luInitialForward = %luMTLHAL: NTD query %ldSimpleConversUpon filter createdFilter creation failed.Converter [%s] is dead...Converter %s is busy...iperr%lX,operr%lX)[%s]Filter does not exist[Filter]Target sideSource side<<%s>>OKFailVConverter::Test: return %s. ?MS?Q[%s%s]Rate = %ld x %c x %ldtAmrMo::tAmrMo: card %p, pci %p, irq %d. PageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXICH4Card: Initialization...acLinkStatus %lX, acLinkControl %lXAC-Link status is unreadable! Failed to initialize...No codecs detected after warm reset, try cold one...AC-Link Bit Clock is stopped...Executing the WARM reset of the AC-Link...VICHCard: HWI in suspend mode, status %lX, acLinkControl %lXOutput LVI detected status %lX, MaxTime %ldInput LVI detected status %lX, MaxTime %ldDifferent IN/OUT Rates can not be supportedTransfer buffer of %ld sam. * %ld = %ld b.VICHMOCard: No line present.Activate loopback...Start waiting from O%ld, I%ld...HWDriver: DMA_problem = %d need more time VICHCard: Failed CAP waiting! (at %ld)VICHCard: Finished CAP loop...WaitW %ld, WaitR %ld, WTO %ld, RTO %ldICH4Card::ChangePTC.Base => %ldICH4 PowerOffProcedure PMCSR=%lXStartTable Phys = %lX, Lin = %lX, IO %lXICH4DMAChannel::ERROR(Number of blocks is greater than table size!ICH4RegSet: ICH4_ACLINK_STATUS_REGISTER is unreadable...ICH4 Registers: Modem Base at %lXICH4Card: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.PageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXVICHMOCard: Initialization...GS %lX, GC %lXWARNING: Illegal codec topography...dwWaiting = %ld ms, GSR %lX, GCR %lXNo codec found... Reset ACLink...Detected primary codec %s-%lX, type %ldAttention: AC Link is reset...Attention: AC Link is shut off...No codec found... Warm reset ACLink...VICHCard: HWI in suspend mode, status %lX, GCR %lXOutput LVI detected status %lX, MaxTime %ldInput LVI detected status %lX, MaxTime %ldDifferent IN/OUT Rates can not be supportedTransfer buffer of %ld sam. * %ld = %ld b.VICHMOCard: No line present.Activate loopback...Start waiting from O%ld, I%ld...VICHCard: Failed CAP waiting! (at %ld)VICHCard: Finished CAP loop...WaitW %ld, WaitR %ld, WTO %ld, RTO %ldVICHCard::ChangePTC.Base => %ldVICHMOCard::PowerOffProcedure to D%ldVICHMOCard::Win2K workaround...StartTable Phys = %lX, Lin = %lX, IO %lXVICHDMAChannel::ERROR(Number of blocks is greater that table size!PM detect failed: value %lX is invalidPM activated at %lX, Status %lX, %sabledERROR: Can not clear AC97_STS.ICHMOCard: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.PageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXPhilipsPCICard: probe && shutdown...PhilipsPCICard: HWI in suspend mode, status %lX, GCR %lXOutput LVI detected status %lX, MaxTime %ldInput LVI detected status %lX, MaxTime %ldDifferent IN/OUT Rates can not be supportedTransfer buffer of %ld sam. * %ld = %ld b.PhilipsPCICard: No line present.Activate loopback...Start waiting from O%ld, I%ld...PCICard: Failed CAP waiting! (at %ld)PCICard::ChangePTC.Base => %ldPhilipsPCICard: failed waiting for CMD clearPhilipsPCICard: failed waiting for valid flagsPhilipsPCICard ERROR: GPIO write failed!PhilipsPCICard::PowerOffProcedure to D%ld Entry[%ld], Base %08lX, Size %08lXStartTable Phys = %lX, Lin = %lX, IO %lXPhilipsDMAChannel::ERROR(Number of blocks is greater than table size!UCH1500 Registers: Modem Base at %lXVIA3058MOCard: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.%s::Init(Buffer of %lXh, PTC of %ld bytes.) ERROR: Wrong position detected, position control is disabled! ERROR: Wrong position detected at first measure!%s : Elapsed %ld, Transfer %lddwBlock = %ld, dwPrecisePos = %ldSLADVXD:%s:%ld omitted interrupts!!!(%ld =>%ld)HookOn = %ld, RingEn = %ld, CID = %ldClient = %lX, Enabled = %ld, HS support %ldtAmrMoCard: Test Validate finished %ld(%lX)tAmrMoCard: Prepare For Test finished %ldtAmrMoCard: Invalid IO space...tAmrMoCard::InitHw() failed, error %lXAC detection: Primary (%s), Secondary(%s)Back to the primary %s-%lX, type %stAmrMoCard: No MC codec found...AMRMODEM: FATAL Error - Unknown Codec ModeltAmrMoCard: Calibration failed:tAmrMoCard:AC calibration = 100 + 10*%ld = %ldtAmrMoCard: Warning: APDR %lX on power-downtAmrMoCard: Keep AC registers...tAmrMoCard: Restore AC registers...tAmrMoCard: Line is not present%s: Too many interrupts omitted: %d!tICHRegSet: GSR is unreadable...Intel AMR Registers: Modem Base at %lXtAmrMoCard::CreateCodecObject Identify SML32 CODECERROR: Index should be x4, required %lXhPageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXAMRCard: ModemOpen Error 1, cfg = %lXAMRCard: ModemOpen Error 2, cfg = %lXVIAMOCard: Query AC-Link topology...ERROR: VIACard - codec detection timed out!VIA3058Card: HWI in suspend mode, status %lX...Detected 8500V AC-Link topology...Different IN/OUT Rates can not be supportedVIACard: No line present.Activate loopback...Start waiting from O%ld, I%ld...VIA3058Card: Failed CAP waiting! (at %ld)VIA3058Card: Finished CAP loop...Output transfer started(%d, diff.%ld)VIA3058Card::ChangePTC.Base => %ld%d unsuccessful attempts to read from %lXRead from %lX succeeded on attempt #%d Looking for LUNA problem (%lX)StartTable Phys = %lX, Lin = %lX, IO %lXVIAPCIChannel::ERROR(Number of blocks is greater that table size!PCIChannel ERROR: Start timed out(%s)PCIChannel ERROR: Stop timed out(%s)PCIChannel ERROR: Pause timed out(%s)VIA3058MOCard: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.PM detect failed: value %lX is invalidPM activated at %lX, Status %lX, %sabledPageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXVSISCard: HWI in suspend mode, status %lX...Detected primary codec %s-%lX, type %lddwWaiting = %ld ms, Value of GSR is %lXAttention: AC97 is disabled...Transfer buffer of %ld sam. * %ld = %ld b.Different IN/OUT Rates can not be supportedSisCard: No line present.Activate loopback...Start waiting from O%ld, I%ld...VSISCard: Failed CAP waiting! (at %ld)VSISCard: Finished CAP loop...WaitW %ld, WaitR %ld, WTO %ld, RTO %ldVSISCard::ChangePTC.Base => %ldTimeout on ReadACRegister(%lX)Timeout on Read [%lX]=.%lX, (R%lX,W%lX)AC-Link Busy is not set on ReadACRegister(%x)Timeout on Write[%lX]=.%lX, (R%lX,W%lX)AC-Link Busy is not set on WriteACRegister(%x,%x)PowerOffProcedure finished, PMC %lXVSISMOCard: PowerOff GS %lX, GC %lXVSISMOCard: OnPowerRequestComplete D%ld PMC %lX, GS %lXVSISMOCard: On Suspend Audio PS %lXVSISMOCard: On Suspend Modem PMC %lX, GS %lXResume status: PME(%s), WakePri(%s), WakeSec(%s)StartTable Phys = %lX, Lin = %lX, IO %lXVSISDMAChannel::ERROR(Number of blocks is greater that table size!VIA3058MOCard: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.Intel AMR Registers: Modem Base at %lXPageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXAudio driver is active, do not reset DCV960MOCard ERROR: Can not deassert reset signal...Deassert AC Link reset signal...V960MOCard: AC Cold reset deasserted after %ldV960MOCard: HWI in suspended mode, status %lX...Invalid LinearMemoryBase %lX ,len %lXDifferent IN/OUT Rates can not be supportedV960MOCard: No line present.Activate loopback...Start waiting from O%ld, I%ld...V960MOCard: Failed CAP waiting! (at %ld)V960MOCard: Finished CAP loop...V960MOCard::ChangePTC.Base => %ldV960MOCard ERROR: WaitForNextFrame() failed!DC set to D3, PM control set to %lX...SIS960_PCI_POWER_CONFIG %lX, PowerControl %lXPCI Wakeup from primary enabled.Invalid PM Order(%s), use SinglePCI Wakeup enabled from secondary.Enable PCI DC PM, Disable PCI AC PMPCI Wakeup from primary disabled.ERROR: Can not shut AC Link down ...PM config = %lX, PM control = %lXCould not restore register %lx %lx %lx TEST ERROR: Codec is not ready! Check presence of the line.V960MOCard: OnTest(Test Case %ld)...PageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXHWDriver: BaseAddress==0, do not continue with initializeIOSpaceOutput LVI detected status %lX, MaxTime %ldInput LVI detected status %lX, MaxTime %ldDifferent IN/OUT Rates can not be supportedTransfer buffer of %ld sam. * %ld = %ld b.VALI5457Card: No line present.Activate loopback...Start waiting from O%ld, I%ld...VALI5457Card: Failed CAP waiting! (at %ld)VALI5457Card: Finished CAP loop...VALI5457Card::OnStop MaxDPTime %ldWaitW %ld, WaitR %ld, WTO %ld, RTO %ldVALI5457Card::ChangePTC.Base => %ldTimed out writing GPIO, val = %lXVALI5457Card::PowerOffProcedure to D%ldStartTable Phys = %lX, Lin = %lX, IO %lXV5457DMAChannel::ERROR(Number of blocks is greater than table size!VALI5457: DMA transfer WAS STOPPEDVALI5457: Can't stop DMA transferVALI5457Card: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.PageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXHWDriver: BaseAddress==0, can not initialize IOSpaceOutput LVI detected status %lX, MaxTime %ldShould clear Int stat: going to do... Input LVI detected status %lX, MaxTime %ldDifferent IN/OUT Rates can not be supportedTransfer buffer of %ld sam. * %ld = %ld b.RTL8197Card: No line present.Activate loopback...Start waiting from O%ld, I%ld...RTL8197Card: Failed CAP waiting! (at %ld)HWDriver: DMA_problem = %d need more time RTL8197Card: Finished CAP loop...RTL8197Card::OnStop MaxDPTime %ldWaitW %ld, WaitR %ld, WTO %ld, RTO %ldRTL8197Card::ChangePTC.Base => %ldTimed out writing GPIO, val = %lXRTL8197Card::PowerOffProcedure to D%ld, do nothingRTL8197Card: PME detected on resume!StartTable Phys = %lX, Lin = %lX, IO %lXDesc %ld, ResidualCount %lX, abs.pos %lXRTL8197DMAChannel::ERROR(Number of blocks is greater than table size!Amir:RTL8197DMAChannel::Start()RTL8197DMAChannel::Start() Error: DMAChannel is halted, while it should be running Amir:RTL8197DMAChannel::Stop()RTL8197Card: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.Using 40 microsec time unit of %ldnVidia ModemClose: bRingEnabled = %d ModemClose: Cancel nVidiaTimerVNVidiaCard::EnableRing(%d), IsRingDetectCurrentlyEnabled %d; bHookOn =%d InTransfer?=%dEnableRing: Cancel nVidiaTimerNVidiaCard Cannot modify ring detection during transferCardQueryPowerProcedure IsWOREnable()= %d; bHookOn = %d; uAudioBusMasterA = %lx;uAudioMixerAddress = %lx CardQueryPowerProcedure IsEnabled() = %lx (tranfer) PowerOffProcedure seting NVIDIA_PM_CONTROL_STATUS to %lxPowerOffProc:uModemMixerAddress = %lX uModemBusMasterAddress=%lXPowerOffProc:uModemMemoryAddress=%lX uModemCommand=%lXAC Link to D3hot (nVidia secondary)...AC Link powered down D3Cold(nVidia secondary)...PowerOffProcedure GPIOStatus has ringbit enabled ->cacel WOR OnRESUME:uModemMixerAddress = %lX uModemBusMasterAddress=%lXOnRESUME:uModemMemoryAddress=%lX uModemCommand=%lXOnRESUME:NVIDIA_PM_CONTROL_STATUS = %lXOnRESUME: setting timer 200miliVNVidiaCard: Pci Cfg problems on ResumeVNVidiaCard: DNVw: pclient ;dw= %x iResumeCounter = %d SIL3054codec: DAA frame detect ErrorSIL3054codec: DAA Revision ErrorHWDriver: SIL3054codec::SetSpeakerVolume(%d)SIL3054codec::CalibrationStatus()SIL3054codec::GetCodecID()=%lX, PID=%lXSIL3054codec::Initialize- usGPIO_Outputs=%lXSIL: %sInternational chip(0x%lX), %ldSIL3054codec::SetHookState(BOOL bOff=%dSIL3054codec: Clear GPIO ring interruptHWdriver Error: MOH_stateMachine unknown stateGeneral codec: MOH_stateMachine=ReconnectType2_phase1FlashingGeneral codec: MOH_stateMachine=WaitingCall_userTalkingGeneral codec: MOH_stateMachine=WaitingCall_FlashingStage1General codec: MOH_stateMachine=modemConectionGeneral codec: MOH_stateMachine=resetStateGeneral codec: unknown enter to MOH_stateMachine: WaitingCall_FlashingStage1! General codec: unknown enter to MOH_stateMachine: ReconnectType2_phase1Flashing! General codec Error: MOH_stateMachine unknown stateGeneral codec unknown enter to MOH_stateMachine: modemConection! General codec: unknown enter to MOH_stateMachine: WaitingCall_userTalking! tAmrMoCard: Calibration failed:tAmrMoCard:AC calibration = 100 + 10*%ld = %ldPageIn : linear %lX, physical %lXPageOut: linear %lX, physical %lXtAmrMoCard: Invalid IO space...tAmrMoCard::InitHw() failed, error %lXAC detection: Primary (%s), Secondary(%s)tAmrMoCard: No MC codec found...Output LVI detected status %lX, MaxTime %ldImplement OnTestingHardwareInterruptInput LVI detected status %lX, MaxTime %ldHWDriver: BaseAddress==0, do not continue with initializeIOSpaceVALI545ACard::ChangePTC.Base => %ldADC Rate %ld is not supported.Transfer buffer of %ld sam. * %ld = %ld b.DAC Rate %ld is not supported.Start waiting from O%ld, I%ld...VALI545ACard: Failed CAP waiting! (at %ld)VALI545ACard: Finished CAP loop...VALI545ACard::OnStop MaxDPTime %ldVALI545ACard::PowerOffProcedure to D%ldVALI545ACard::PowerOffProcedureVALI545ACard::SetHookHxCidState(prop=%lX)HWDriver: SIL3052Card::SIL3052Card()HWDriver: PageIn : linear %lX, physical %lXHWDriver: PageOut: linear %lX, physical %lXHWDriver: SIL3052Card::ValidatePCIConfiguration()HWDriver: BaseAddress==0, can not initialize IOSpaceHWDriver: SIL3052Card::StopWatchdogTimer()HWDriver:Need to Disable watchdog timer and wait 10mili or until INT handler stops watchdog timerHWDriver: SIL3052Card::ModemClose()HWDriver: PCI_MASTER_ABORT_INTRHWDriver: PCI_TARGET_ABORT_INTRHWDriver: UNEXPECTED Watchdog interruptHWDriver: SIL3052Card: ValidRing Voltage State %ldHWDriver:SIL3052RegSet::EnableDAAInt(%s)HWDriver: Unknown hardware interrupt. cardIntrStatus=%lXHWDriver: SIL3052Card::OnHardwareInterrupt- SIL3052_INT_RINGHWDriver: SIL3052: unknown PCI_WATCHDOG_INTR occuredHWDriver: SIL3052Card: DMA CHANNEL is DELAYED !!!HWDriver: Critcal PCI Error: SIL3052_INT_TARGET_ABORT_INTRHWDriver: Critcal PCI Error: SIL3052_INT_MASTER_ABORT_INTRHWDriver: SIL3052Card::IoControl() - Unknown IoControl CodetAmrMoCard: Test Validate finishedHWDriver: SIL3052Card::ModemOpen()HWDriver: ModemOpen() dwResult2= %ld;bFrameDetectERROR=%d(ModemHelperTestResult=2) HWDriver: SIL3052Card::ModemOpen() - Error in modem open functionSIL3052 Error: InitHW() fail because InitializeIOSpace()HWDriver: SIL3052Card::InitHw()SIL3052 Error: InitHW() fail because DAA not readySIL3052 Error:2 InitHW() fail because DAA Frame not detectedSIL3052 Error:1 InitHW() fail because DAA Frame not detectedHWDriver: SIL3052Card::GetProp(propID %ld)HWDriver: SIL3052Card::Start()Different IN/OUT Rates can not be supportedTransfer buffer of %ld sam. * %ld = %ld b.HWDriver: SIL3052Card::OnStop()HWDriver: SIL3052Card::Disable()HWDriver: SIL3052Card::SetupCodecForModio()HWDriver: SIL3052Card::CallDuringPTCProcessing()HWDriver:SIL3052Card::EnableRing(%s)SIL3052Card::SetHookHxCidState(prop=%lX)HWdriver error: Try to operate new V92 MOH mechanism without support from AC97 codecHWDriver: SIL3052Card::ChangePTC.Base => %ldHWDriver: SIL3052Card::SetProp(propID %ld, dwProp %lx)HWDriver: SIL3052Card::SetProp() tAmrPciMoDevice::SetProp(dwPropID=%d)SIL3052Card: Setting EnableCodecLoopback=%dSIL3052Card::PowerOffProcedure to D%ld, do nothingSIL3052Card::PowerOffProcedure %xSIL3052Card: PME detected on resume!HWDriver: SIL3052Card::ClearCodecIntStatus()SIL3052card: Line is not presentHWDriver: SIL3052Card::OnDigitPulseDialing(%d)HWDriver: SIL3052Card::ConnectSpeaker(bConnect= %lX)HWDriver: SIL3052Card::SetSpeakerVolume(%d)HWDriver: SIL3052Card::SetHookOn(%s), pulse dialing %dHWDriver: SIL3052Card::SetHookOn end: dmaWasStarted= %d firstOffhook=%dHWDriver: Current in codec is %dHWDriver: StartTable Phys = %lX, Lin = %lX, IO %lXHWDriver: currentBlock= %d, currentAddress %lX, abs.pos %lXHWDriver: SIL3052DMAChannel::Reset()HWDriver: SIL3052DMAChannel::ResetPCIabort()HWDriver: SIL3052DMAChannel::SetPhysicalAddress(). DMA_%s_ChannelHWDriver: dma_%s_BufferStartAddress=%lXHWDriver: dma_%s_BufferStopAddress=%lXHWDriver: dma_%s_NextInterruptAddress=%lXHWDriver: dma_%s_dmaBufferSize=0x%lX. PtcSize=0x%lX.HWDriver: dma_%s_numberOfBlocksInBuffer=%dHWDriver: KeepTransferRunning() wrap around. Additional bytes=%dHWDriver: DMA is too close to the end of PTC bufferHWDriver: SIL3052DMAChannel__%s::Start()HWDriver: SIL3052DMAChannel::IsActive()=%sHWDriver: SIL3052DMAChannel::Stop()SIL3052codec: Setting for Automatic Calibration mode...3052CodecDump:>>>> Reg %x = %lx3052CodecDump:>>>> Reg %x = %x3052CodecDump:>>>> Reg %x = %x ; LCS MB(4:0)3052CodecDump:>>>> Reg %x = %x ; DCT MB(3:2)3052CodecDump:>>>> Reg %x = %x ; CALD MB(5) MCAL MB(6) CALZ MB(7)3052CodecDump:>>>> Reg %x = %x ;(RCALD MB(5)3052CodecDump:>>>> Reg %x = %x ; FOH MB(6:5)HWDriver: SIL3052_CHIPSET_REV_C detected. Assume using 16.384MHz Osc.HWDriver: PCI core reset the DAA ...HWDriver: SIL3052_CHIPSET_REV_A detected. Assume using 32.768KHz Osc.HWDriver: SystemSideRevision=%dHWDriver: SIL3052_CHIPSET_REV_A detected. Assume using 16.384MHz Osc.HWDriver: SIL3052codec::Initialize end of Initialize reg statusHWDriver: SIL3052_CHIPSET_REV_B detected. Assume using 32.768KHz Osc.HWDriver: SIL3052_CHIPSET_REV_C detected. Assume using 32.768KHz Osc.HWDriver: SIL3052_CHIPSET_REV_B detected. Assume using 16.384MHz Osc.HWDriver: SIL3052codec::SetSampleRateHz =%dHWDriver: SIL3052codec::SetupForRing() enterHWDriver: SIL3052codec::SetupForRing() exitHWDriver: SIL3052codec::SetCIDState(%s) HWDriver: SIL3052codec::EnableRing(%s)HWDriver: SIL3052codec::SetFlashMode - %sSIL3052codec::SetHookState No flash stageSIL3052codec::SetHookState No flash stage OffHookHWDriver: SIL3052codec: Country parameters apllied, scheme[%ld]=0x%lXHWDriver: SIL3052codec: Country parameters set specially for PD, 0x%lXHWDriver: SIL3052codec: Country parameters restored after PD, 0x%lXHWDriver: MLPS LoopCurrentSense measured %dSIL3052codec ERROR: Invalid MCAL state required...SIL3052codec::Calibrate(%d) codec dump regsSIL3052codec ERROR: Hook is ON cannot calibrate ...SIL3052codec ERROR: Calibration is already in progress; Request ignored, stage %ld...SIL3052codec: Manual CALibration attempt...SIL3052codec ERROR: Calibration failed(Reg41 = %X).SIL3052codec Calibration started, It will finish at %ldSIL3052codec::CalibrationStatus Repeat recalibration...SIL3052codec::CalibrationStatus Recalibration finished...HWDriver: SIL3052codec::SetSpeakerVolume(%d)HWDriver: SIL3052codec::EnableDigitalLoopback(%s)SIL3052Card: OnTest(Test Case %ld)...TEST ERROR: Codec is not ready! Check presence of the line.SIL3052DMAChannel::DMATest_BothDMAchannel()SIL3052DMACard::OnTest_BothDMAchannel()AlignmentMemory: NonAlignPhysAddr=%lX, Align PhysAddr=%lXHWDriver: PageIn : linear %lX, physical %lX ,alignmentOffsetIn %lXhSL2800Card critical error: Fail to allocate memory for DMA bufferHWDriver: SL2800Card::SL2800Card()alignPhysPageIn=%lX, alignLinPageIn=%lXHWDriver: PageOut: linear %lX, physical %lXHWDriver: SL2800Card::!SL2800Card()SL2800Card: Need to fix PCI CFG...SL2800Card: ValidatePCIConfiguration(): pciMemBar = %x SL2800Card: ValidatePCIConfiguration()SL2800Card::Fail to clear Status=%lXOnHardwareInterrupt Error: cardStatus=0xFFFFFFFFHWDriver: Unknown hardware interrupt. cardIntrStatus=%lXSL2800Card::OnHardwareInterrupt() StatusBefore=%lX,StatusAfter=%lXSL2800_ERROR: DMA_OUT_HOST_PARITY_ERROR!!SL2800_DMA_HOST_FATAL_ERROR INTR!!SL2800_ERROR: APLICATION_FIFO_OUT_IS_EMPTY!!SL2800_ERROR: APLICATION_FIFO_OUT_FULL!!SL2800_ERROR: PCI_FIFO_OUT_FULL!!Got ring INT for stopping TestSL2800Card::IoControl() - Unknown IoControl CodetAmrMoCard: Test Validate finishedSL2800Card:: ModemOpen() dwResult1= %ld (0==GOOD) SL2800Card::ModemOpen() - Error in modem open functionSL2800Card::InitializePlatformName()SL2800_CONTROL_STATUS_REG =%lXSL2800_INTERRUPT_STATUS_REG =%lXSL2800_CODEC_CONTROL_STATUS_REG =%lXSL2800_DMA_IN_DOWN_COUNTER_REG =%lXSL2800_DMA_IN_BUFFER_BASE_ADDRESS_REG =%lXSL2800_DMA_IN_BUFFER_SIZE_REG =%lXSL2800_DMA_IN_CURRENT_POSITION_REG =%lXSL2800_DMA_OUT_BUFFER_BASE_ADDRESS_REG =%lXSL2800_DMA_OUT_BUFFER_SIZE_REG =%lXSL2800_DMA_OUT_CURRENT_POSITION_REG =%lXSL2800 Error: InitHW() fail because InitializeMemorySpace())SL2800Card::InitHw(): update SL2800_PCICFG_STATUS_COMMAND: %x -> %x HWDriver: SL2800Card::InitHw()SL2800: Critical Error: Master Reset is not clearTestCFG: DMA Test time(sec)=%dTestCFG: DMA Test loop =%dTestCFG: Continues search even data failure =%dTestCFG: Soft ICE breakpoint %sTestCFG: Fixing omitted interrupt option is %sHWDriver: SL2800Card::GetProp(propID %ld)Test Report: Interrupt Range Error Counter=%dTest Report: FatalErrorCounter=%dTest Report: TST_DataErrorCounter=%dDifferent IN/OUT Rates can not be supportedTransfer buffer of %ld samp. * %ld = %ld b.SL2800Card::Enable()-Starting DMA channelsSL2800Card::SetupCodecForModio(pMI->dwCaptureSampleRate=%d)SL2800Card::SetHookHxCidState(prop=%lX)HWDriver: SL2800Card::ChangePTC.Base => %ldHWDriver: SL2800Card::SetProp(propID %ld, (DWORD)Prop %lx)HWDriver: SL2800Card::SetProp() tAmrPciMoDevice::SetProp(dwPropID=%d)TST_FatalErrorCounter=%d, TST_DataErrorCounter=%dSL2800Card: Setting EnableCodecLoopback=%dUnknown HW_PROP_TESTING parameter=%xSL2800Card::PowerOffProcedure %xSL2800Card::PowerOffProcedure to D%ld, do nothingHWDriver: SL2800Card::ConnectSpeaker(bConnect= %lX)HWDriver: SL2800Card::SetSpeakerVolume(%d)SL2800codec::SetSampleRateHz =%dSL2800codec Error: Unsupported sample rate.SL2800codec::SetupRingFilter()SL2800codec::EnableCodecLoopback(%d)SetGain Error: Gain pin is not configure as output.SL2800codec::set Rx Gain =0x%lXSL2800codec Error: Unsupported value for Tx gain.SetGain Error: Tx gain is Unsupported or Gain pin is not configure as output.SL2800codec Error: Unsupported Rx gain. Set maximum 12dBSL2800codec::SetPGAValue(Rx, %d)SL2800codec::SetPGAValue(Tx, %d)SL2800DMAChannel(): DMA register base %lXDMA_In:Buffer=%d,Block=%d, Position=%lXSL2800:SetPhysicalAddress(). DMA_%s_ChannelHWDriver: dma_%s_BufferStartAddress=%lXHWDriver: dma_%s_BufferSize[B]=0x%lX. Ptc[B]=0x%lX.HWDriver: dma_%s_numberOfBlocksInBuffer=%dSL2800DMAChannel__%s::StartBothChannelSimultaneous()SL2800DMAChannel__%s::IsActive()=%s, CTRL=%lX, STS=%lXDMA.In::SetOnTheFlyPTCsize=%lXSL2800Card::writeable operation RegisterTestcheckWriteable error: Reg[%X]=%lX. Failure Bits=%lXSL2800 error: Master Reset is not clearSL2800Card::PCI_CFGwriteable operation RegisterTestcheckDefault error: Reg[%X]=%lX. Failure Bits=%lXPerform Operation RegistersTestSL2800Card: OnTest(Test Case %ld)...SL2800DMAChannel::DMATest_BothDMAchannel()DMATest INTR detected %ld. Range:[%ld - %ld]DMATest Error: Fail to stop DMA channelDmaInErrorPosition=%d DmaOutErrorPosition=%dSL2800Card: OnTest_BothDMAchannel(Test Case %ld)...DmaTracker:init() low=%lX, mid=%lX, high=%lX, ptcSize=%lX, bufferEndAddr=%lXSL2800DMAChannel::OnStressTest_BothDMAchannel()Memory allocation error for DMA_Out dump bufferMemory allocation error for DMA_In dump bufferTest Report: Position error: DMA is freezeTest Report: Interrupt count range errorsearchSync=%lX MEM[%d]=%lX, %lXDMA Stress: find SYNC PTC at %d. Data=%lXDMAIN ptc Error. dwCounter=%d Address %lX[%d]=%lX Excepted value=%XError://unknown pTesting->dwProgress valueDataTransferTest Error - fail to find start of datapTesting->dwProgress = STRESS__DATA_CHECKING_STAGEPerform PCI configuration Register TestYou must restart the computer after running this testPlease reset the PCI card by using PCI active extenderOmitted interupt detected with bufferWrapAroundPos: lowLimit=%lX, middleLimit=%lX, highLimit=%lX, dmaCurrentPosition=%lXOmitted interupt detected with no bufferWrapAroundlowAddrLimit=%lX, middleAddrLimit=%lX, highAddrLimit=%lX, dmaCurrentPosition=%lXDmaTracker:OmittedInterruptCounter=%dError: Unknown DMA state. Could be since DMA out is going slow or more the 31 omitted interruptDelay Test Success: Delay Param=%dmSec. Actual Delay was %dmSecDelay Test Fail: Delay Param=%dmSec. Actual Delay was %dmSecFrequencyGenerationByOutputs(TST_PeriodTimeInMicroSecond=%d)SL2800Card:: Ring Interrupt Test()TST_RingInterruptTest Error: TST_ringInterruptCounter=%dTest detected %d ring interrupts in this cycleGPIO Interrupt generation interval =%duSecTST_GPIOInterruptTest() Error: TST_GPIOInterruptCounter=%dTST_GPIOinterruptHookToggleTest()On TST_PCICFGinterruptStatusFlagTest()After disabling INTR, PciCfgIntrEnable=%X, PciCfgIntrStatus=%XDisable SL2800_PCICFG_interruptEnable SL2800_PCICFG_interrupt0x3E is %x after %ldms waiting0x5c is %x after %ldms waitingtAdsMC::SetHookState: bOff = %d Could not calibrate once more. Calibration in process.tAdsMC: Line Detect failed! (val %lX, sf %lX)Unknown request for handset(%d)SampleRate %d after %dms waitingSIL: %sInternational chip(0x%lX), %ldSiLabsCodec: DAA Revision ErrortSiLabsCodec: Line Detect failed! (val %lX, sf %lX)tSiLabsCodec: MC turned off after LD failure (status %lX)SIL3024codec::SetHookState(Offhook=%d)AC registers(DC base %lX), HSX support %dtSiLabsCodec: Country parameters apllied, scheme[%ld]=0x%lXtSiLabsCodec: Country parameters ignored.DC termination type is not SIL_LINE_CFG_DC_TERM_LOW1, left as istSiLabsCodec: Country parameters set specially for PD, 0x%lXtSiLabsCodec: Country parameters restored after PD, 0x%lXtSiLabsCodec ERROR: Invalid MCAL state...tSiLabsCodec ERROR: Failed MCAL request...tSiLabsCodec ERROR: MCAL is already in progress, stage %ld...tSiLabsCodec: Next MCAL attempt...tSiLabsCodec ERROR: Calibration failed(CS1 = %lX).Loop current out of range (== %d). Checking DC termination typetSiLabsCodec Calibration started, finish at %ldtSiLabsCodec: Repeate recalibration...tSiLabsCodec: Recalibration finished...tSiLabsCodec: Stop MCAL mode...tSiLabsCodec: Unsupported codec model (%lX)SIL3024codec::SetFlashMode(MOH_indication_flag=%dHWdriver Error: MOH_stateMachine unknown stateSIL3024codec: MOH_stateMachine=ReconnectType2_phase1FlashingSIL3024codec: MOH_stateMachine=WaitingCall_userTalkingSIL3024codec: MOH_stateMachine=WaitingCall_FlashingStage1SIL3024codec: MOH_stateMachine=modemConectionSIL3024codec: MOH_stateMachine=resetStateSIL3024codec: unknown enter to MOH_stateMachine: WaitingCall_FlashingStage1! SIL3024codec: unknown enter to MOH_stateMachine: ReconnectType2_phase1Flashing! SIL3024codec Error: MOH_stateMachine unknown stateSIL3024codec unknown enter to MOH_stateMachine: modemConection! SIL3024codec: unknown enter to MOH_stateMachine: WaitingCall_userTalking! hal: cannot find Card address. MTLHAL: HW pointer ERROR: R%ld C%ld W%ldMTLHAL ERROR: InitQueues failed[Hardware instance constructor...]Predefined rates: in %ld, out %ldMTLHAL: Cleaning content of output buffer(%ld of %ld)HAL WARNING: Last DP finishes with OHHAL WARNING: DP chain with ~OHMTLHAL: Destroy required...Deleting...Can I destroy the HW Instance? Bad input rate combination %ld => %ldBad output rate combination %ld => %ldHW does not support asymmetric rates.HW does not support different rates.RC enabled when force requested.Modio opening (OK) in progressModio opening refused! Error code %lX[FinishModioSetup] Failed : Bad CombinationMTLHAL: QSampling on input/output lines!MTLHAL: Mono sampling on input line!MTLHAL: Mono sampling on output line!MTLHAL: Custom SC routines used!LineOut forwarding <%ld>, written %ld b.LineOut forwarding <%ld>, not applicabledwSpeakerVolume = %lu, dwModemAtten = %lubDestroyRequired = %lu, VoiceEnabled = %luiAudioInVolume = %ld, iAudioOutVolume = %ldnInterruptDepth = %lu, nPTCInterrupts = %luAudioOut = %lu, AudioIn = %luIntCallback = %lXh, Card at %lXhModemInstance::OnCardRemoved()%s: Head = %08lx, Tail = %08lx VConversionFilter::Init - Creating converter - %d to %d (mode=%d). VonversionFilter::Init - RcFixed_Create Failed.VConversionFilter destructor...%s(%s): %ld/%ld spc, In %ld => Out %ldInvalid converter [%s](ip%lX,op%lX,pf%lX,prfb%lX,psfb%lX,%ld Spc, %ld channels, %ld bitsQueue of %ld b., Filter size %ld s.VConverter::Test:=> InputRate =%d, OutputRate =%d, bIsModem =%d Phys.PTC = %ld s. (%ld) b. ; Log.PTC = %ld s. (%ld) b.<@   P X ` c f <@@P<@  "&(*,02468:dlHLP "(* : ><>@FLNPRTV\^z|~<>@FLNZ\^PRTV : >   GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5).symtab.strtab.shstrtab.rel.text.gnu.linkonce.t._ZN10VModemLine12HandsetCloseEv.gnu.linkonce.t._ZN10VModemLine9OnSuspendEv.gnu.linkonce.t._ZN10VModemLine8OnResumeEv.gnu.linkonce.t._ZN10VModemLine16AdjustPowerStateEi.gnu.linkonce.t._ZN10VModemLine18DoOrCancelWaitWakeEv.gnu.linkonce.t._ZN10VModemLine12SetFlashModeEi.rel.gnu.linkonce.t._ZN6tAmrMo7SetPropEmm.rel.gnu.linkonce.t._ZN6tAmrMo7GetPropEm.gnu.linkonce.t._ZN6tAmrMo7ReleaseEv.rel.gnu.linkonce.t._ZN6tAmrMo6InitHwEv.rel.gnu.linkonce.t._ZN6tAmrMo8DeinitHwEv.gnu.linkonce.t._ZN17VOscillatorClient12OnOscillatorEm.gnu.linkonce.t._ZN14tAbstractAMRDC6BaseIOEv.gnu.linkonce.t._ZN14tAbstractAMRDC9GetSelectEv.gnu.linkonce.t._ZN14tAbstractAMRDC9SetSelectEN11tAbstractDC14tSelectedCodecE.gnu.linkonce.t._ZN10tAmrMoCard17SetModemInputGainEi.gnu.linkonce.t._ZN10tAmrMoCard19SetModemAttenuationEi.gnu.linkonce.t._ZN10tAmrMoCard14SetAudioSourceEi.gnu.linkonce.t._ZN10tAmrMoCard16SetAudioInVolumeEi.gnu.linkonce.t._ZN10tAmrMoCard17SetAudioOutVolumeEi.gnu.linkonce.t._ZN10tAmrMoCard13OnVirtualIRETEPvm.gnu.linkonce.t._ZN10tAmrMoCard23PrepareForAutomaticTestEv.gnu.linkonce.t._ZN10tAmrMoCard12PowerAudioOnEv.gnu.linkonce.t._ZN10tAmrMoCard13PowerAudioOffEv.gnu.linkonce.t._ZN10tAmrMoCard16PulsHardwareLockEi.gnu.linkonce.t._ZN10tAmrMoCard26OnWin2KHibernationRequiredEv.gnu.linkonce.t._ZN8ICH4Card12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N8ICH4CardD1Ev.rel.gnu.linkonce.t._ZThn100_N8ICH4CardD0Ev.rel.gnu.linkonce.t._ZThn100_N8ICH4Card14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N8ICH4Card15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZN9VTestDataD1Ev.rel.gnu.linkonce.t._ZN9VTestDataD0Ev.gnu.linkonce.t._ZN10VICHMOCard12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N10VICHMOCardD1Ev.rel.gnu.linkonce.t._ZThn100_N10VICHMOCardD0Ev.rel.gnu.linkonce.t._ZThn100_N10VICHMOCard14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N10VICHMOCard15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZN14PhilipsPCICard12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N14PhilipsPCICardD1Ev.rel.gnu.linkonce.t._ZThn100_N14PhilipsPCICardD0Ev.rel.gnu.linkonce.t._ZThn100_N14PhilipsPCICard14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N14PhilipsPCICard15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZN10VModemLineD1Ev.rel.gnu.linkonce.t._ZN10VModemLineD0Ev.gnu.linkonce.t._ZN12generalCodec17updateHandsetFlagERt9eHSXstate.gnu.linkonce.t._ZN12generalCodec15setHandsetStateE9eHSXstate.gnu.linkonce.t._ZN12generalCodec18setNewMOHmechanismEi.gnu.linkonce.t._ZN12generalCodec8AddDelayEv.gnu.linkonce.t._ZN12generalCodec17DoesRequestD3ColdEv.rel.gnu.linkonce.t._ZN11tAC97RegSet10InitializeEv.rel.gnu.linkonce.t._ZN11tAbstractDCD1Ev.rel.gnu.linkonce.t._ZN11tAbstractDCD0Ev.rel.gnu.linkonce.t._ZN12tACLinkCodecD1Ev.rel.gnu.linkonce.t._ZN12tACLinkCodecD0Ev.gnu.linkonce.t._ZN12tACLinkCodec7DetailsERPc.gnu.linkonce.t._ZN12tACLinkCodec12ReadRegisterEtRt.gnu.linkonce.t._ZN12tACLinkCodec13WriteRegisterEtt.rel.gnu.linkonce.t._ZN11tModemCodec10InitializeEv.gnu.linkonce.t._ZN11tModemCodec10InitializeENS_19tInitializationTypeE.gnu.linkonce.t._ZN11tModemCodec17StartLockSequenceEv.gnu.linkonce.t._ZN11tModemCodec16StopLockSequenceEv.gnu.linkonce.t._ZN11tModemCodec15ReadNextLockBitEv.gnu.linkonce.t._ZN11tModemCodec20CheckForLinePresenceEv.gnu.linkonce.t._ZN11tModemCodec25CheckForLineDetectFailureEv.gnu.linkonce.t._ZN11tModemCodec19FixAfterLineFailureEv.gnu.linkonce.t._ZN11tModemCodec16RingVoltageStateEv.gnu.linkonce.t._ZN11tModemCodec21EnableDigitalLoopbackEi.gnu.linkonce.t._ZN11tModemCodec19EnableCodecLoopbackEi.gnu.linkonce.t._ZN11tModemCodec20SetCountryParametersEm.gnu.linkonce.t._ZN11tModemCodec12GetCodecTypeEv.gnu.linkonce.t._ZN11tModemCodec4DumpEv.gnu.linkonce.t._ZN11tModemCodec20ClearInterruptStatusEv.gnu.linkonce.t._ZN11tModemCodec26ShallIClearInterruptStatusEv.gnu.linkonce.t._ZN11tModemCodec19EnableRingDetectionEi.gnu.linkonce.t._ZN11tModemCodec16SetSpeakerVolumeEt.gnu.linkonce.t._ZN11tModemCodec12GPIORingMaskEv.gnu.linkonce.t._ZN11tModemCodec17StartPulseDialingEv.gnu.linkonce.t._ZN11tModemCodec16StopPulseDialingEv.gnu.linkonce.t._ZN11tModemCodec9CalibrateEm.gnu.linkonce.t._ZN11tModemCodec17CalibrationStatusEv.gnu.linkonce.t._ZN11tModemCodec23MeasureLoopCurrentSenseEv.gnu.linkonce.t._ZN11tModemCodec17IsConcurrentCodecEv.gnu.linkonce.t._ZN11tModemCodec13hasErrorInDAAEv.gnu.linkonce.t._ZN11tModemCodec7SetPropEim.gnu.linkonce.t._ZN11tModemCodec7GetPropEi.gnu.linkonce.t._ZN11tModemCodec12SetFlashModeEi.gnu.linkonce.t._ZN11tModemCodec10FixGPIOBitEv.gnu.linkonce.t._ZN11tModemCodec14CaptureHandsetEi.gnu.linkonce.t._ZN14tBadModemCodec19TestUniqueRegistersERi.gnu.linkonce.t._ZN14tBadModemCodec7PowerUpEv.gnu.linkonce.t._ZN14tBadModemCodec12GetHookStateEv.gnu.linkonce.t._ZN14tBadModemCodec12SetHookStateEii.gnu.linkonce.t._ZN14tBadModemCodec11GetCIDStateEv.gnu.linkonce.t._ZN14tBadModemCodec11SetCIDStateEi.gnu.linkonce.t._ZN14tBadModemCodec15GetCapabilitiesEv.gnu.linkonce.t._ZN14tBadModemCodec13GetSampleRateEv.gnu.linkonce.t._ZN14tBadModemCodec13SetSampleRateEt.gnu.linkonce.t._ZN10tAmrMoCard17InitializeIOSpaceERiS0_.rel.gnu.linkonce.t._ZN10tAmrMoCard12PlatformNameEv.gnu.linkonce.t._ZN10tAmrMoCard23CallDuringPTCProcessingEv.rel.gnu.linkonce.t._ZN14tAbstractAMRDCD1Ev.rel.gnu.linkonce.t._ZN14tAbstractAMRDCD0Ev.rel.gnu.linkonce.t._ZN14tBadModemCodecD1Ev.rel.gnu.linkonce.t._ZN14tBadModemCodecD0Ev.rel.gnu.linkonce.t._ZThn100_N10tAmrMoCardD1Ev.rel.gnu.linkonce.t._ZThn100_N10tAmrMoCardD0Ev.rel.gnu.linkonce.t._ZThn100_N10tAmrMoCard23CalibrateMaxAcRdWrLoopsEv.rel.gnu.linkonce.t._ZN11tModemCodecD1Ev.rel.gnu.linkonce.t._ZN11tModemCodecD0Ev.rel.gnu.linkonce.t._ZN11tAudioCodecD1Ev.rel.gnu.linkonce.t._ZN11tAudioCodecD0Ev.rel.gnu.linkonce.t._ZN13VIA3058MOCard12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N13VIA3058MOCardD1Ev.rel.gnu.linkonce.t._ZThn100_N13VIA3058MOCardD0Ev.rel.gnu.linkonce.t._ZThn100_N13VIA3058MOCard14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N13VIA3058MOCard15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZN10VSISMOCard12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N10VSISMOCardD1Ev.rel.gnu.linkonce.t._ZThn100_N10VSISMOCardD0Ev.rel.gnu.linkonce.t._ZThn100_N10VSISMOCard14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N10VSISMOCard15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZN10V960MOCard12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N10V960MOCardD1Ev.rel.gnu.linkonce.t._ZThn100_N10V960MOCardD0Ev.rel.gnu.linkonce.t._ZThn100_N10V960MOCard14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N10V960MOCard15WriteACRegisterEttRi.gnu.linkonce.t._ZN12VALI5457Card12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N12VALI5457CardD1Ev.rel.gnu.linkonce.t._ZThn100_N12VALI5457CardD0Ev.rel.gnu.linkonce.t._ZThn100_N12VALI5457Card14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N12VALI5457Card15WriteACRegisterEttRi.gnu.linkonce.t._ZN11RTL8197Card12PlatformNameEv.rel.gnu.linkonce.t._ZThn100_N11RTL8197CardD1Ev.rel.gnu.linkonce.t._ZThn100_N11RTL8197CardD0Ev.rel.gnu.linkonce.t._ZThn100_N11RTL8197Card14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZThn100_N11RTL8197Card15WriteACRegisterEttRi.gnu.linkonce.t._ZN11VNVidiaCard9SetnTimerEv.gnu.linkonce.t._ZN11VNVidiaCard17CancelnVidiaTimerEv.rel.gnu.linkonce.t._ZThn100_N11VNVidiaCardD1Ev.rel.gnu.linkonce.t._ZThn100_N11VNVidiaCardD0Ev.rel.gnu.linkonce.t._ZThn100_N11VNVidiaCard15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZThn100_N11VNVidiaCard14ReadACRegisterEtRtRi.rel.gnu.linkonce.t._ZN11tAC97RegSet6acReadEtt.gnu.linkonce.t._ZN12tSiLabsCodec12GetCodecTypeEv.gnu.linkonce.t._ZN12tSiLabsCodec12GPIORingMaskEv.rel.gnu.linkonce.t._ZThn16_N12SIL3054codec17updateHandsetFlagERt9eHSXstate.rel.gnu.linkonce.t._ZThn16_N12SIL3054codec15setHandsetStateE9eHSXstate.rel.gnu.linkonce.t._ZN12SIL3054codecD1Ev.rel.gnu.linkonce.t._ZN12SIL3054codecD0Ev.rel.gnu.linkonce.t._ZN12VALI545ACard9EnableCIDEi.rel.gnu.linkonce.t._ZN12VALI545ACard10DebugQueryEc.gnu.linkonce.t._ZN12VALI545ACard12PlatformNameEv.gnu.linkonce.t._ZN12VALI545ACard22OnPowerRequestCompleteEt.rel.gnu.linkonce.t._ZN12VALI545ACard12DevIO_acReadEt.rel.gnu.linkonce.t._ZN12VALI545ACard19ClearCodecIntStatusEv.gnu.linkonce.t._ZN12VALI545ACard19ProcessHardwareLockEv.gnu.linkonce.t._ZN12VALI545ACard13OnVirtualIRETEPvm.gnu.linkonce.t._ZN12VALI545ACard17SetModemInputGainEi.gnu.linkonce.t._ZN12VALI545ACard14SetAudioSourceEi.gnu.linkonce.t._ZN12VALI545ACard16SetAudioInVolumeEi.gnu.linkonce.t._ZN12VALI545ACard17SetAudioOutVolumeEi.gnu.linkonce.t._ZN12VALI545ACard19SetModemAttenuationEi.rel.gnu.linkonce.t._ZN12VALI545ACard23CalibrateMaxAcRdWrLoopsEv.rel.gnu.linkonce.t._ZThn100_N12VALI545ACardD1Ev.rel.gnu.linkonce.t._ZThn100_N12VALI545ACardD0Ev.rel.gnu.linkonce.t._ZThn100_N12VALI545ACard15WriteACRegisterEttRi.rel.gnu.linkonce.t._ZThn100_N12VALI545ACard14ReadACRegisterEtRtRi.gnu.linkonce.t._ZN11SIL3052Card12PlatformNameEv.gnu.linkonce.t._ZN11SIL3052Card13OnVirtualIRETEPvm.gnu.linkonce.t._ZN11SIL3052Card19SetModemAttenuationEi.gnu.linkonce.t._ZN11SIL3052Card17SetModemInputGainEi.gnu.linkonce.t._ZN11SIL3052Card14SetAudioSourceEi.gnu.linkonce.t._ZN11SIL3052Card16SetAudioInVolumeEi.gnu.linkonce.t._ZN11SIL3052Card17SetAudioOutVolumeEi.gnu.linkonce.t._ZN12SIL3052codec21getSystemSideRevisionEv.gnu.linkonce.t._ZN10SL2800Card12PlatformNameEv.gnu.linkonce.t._ZN10SL2800Card13OnVirtualIRETEPvm.gnu.linkonce.t._ZN10SL2800Card19SetModemAttenuationEi.gnu.linkonce.t._ZN10SL2800Card17SetModemInputGainEi.gnu.linkonce.t._ZN10SL2800Card14SetAudioSourceEi.gnu.linkonce.t._ZN10SL2800Card16SetAudioInVolumeEi.gnu.linkonce.t._ZN10SL2800Card17SetAudioOutVolumeEi.gnu.linkonce.t._ZN4tPGA18GetPGACapabilitiesE13tPGADirection.gnu.linkonce.t._ZN6tAdsMC12GetCodecTypeEv.gnu.linkonce.t._ZN6tAdsMC8AddDelayEv.rel.gnu.linkonce.t._ZThn16_N6tAdsMC15GetCapabilitiesEv.rel.gnu.linkonce.t._ZThn16_N6tAdsMC17updateHandsetFlagERt9eHSXstate.rel.gnu.linkonce.t._ZThn16_N6tAdsMC15setHandsetStateE9eHSXstate.rel.gnu.linkonce.t._ZThn16_N6tAdsMC18setNewMOHmechanismEi.rel.gnu.linkonce.t._ZThn16_N6tAdsMC17DoesRequestD3ColdEv.rel.gnu.linkonce.t._ZN6tAdsMCD1Ev.rel.gnu.linkonce.t._ZN6tAdsMCD0Ev.rel.gnu.linkonce.t._ZN11tAC97RegSet8acChangeEttt.rel.gnu.linkonce.t._ZThn16_N12tSiLabsCodec20CheckForLinePresenceEv.rel.gnu.linkonce.t._ZThn16_N12tSiLabsCodec15GetCapabilitiesEv.rel.gnu.linkonce.t._ZThn16_N12tSiLabsCodec17updateHandsetFlagERt9eHSXstate.rel.gnu.linkonce.t._ZThn16_N12tSiLabsCodec21updateMOHstateMachineEi.rel.gnu.linkonce.t._ZThn16_N12tSiLabsCodec15setHandsetStateE9eHSXstate.rel.gnu.linkonce.t._ZThn16_N12tSiLabsCodec18setNewMOHmechanismEi.rel.gnu.linkonce.t._ZN12tSiLabsCodecD1Ev.rel.gnu.linkonce.t._ZN12tSiLabsCodecD0Ev.rel.gnu.linkonce.t._ZN13VVirtualQueueD1Ev.rel.gnu.linkonce.t._ZN13VVirtualQueueD0Ev.rel.gnu.linkonce.t._ZN6VQueueD1Ev.rel.gnu.linkonce.t._ZN6VQueueD0Ev.rel.gnu.linkonce.t._ZN7VFilter4KindEv.rel.gnu.linkonce.t._ZN13VSimpleFilter4KindEv.rel.gnu.linkonce.t._ZN17VConversionFilter4KindEv.rel.gnu.linkonce.t._ZN13VSimpleFilterD1Ev.rel.gnu.linkonce.t._ZN13VSimpleFilterD0Ev.rel.gnu.linkonce.t._ZN15VModemConverterD1Ev.rel.gnu.linkonce.t._ZN15VModemConverterD0Ev.rel.rodata.rodata.str1.1.rel.gnu.linkonce.r._ZTV6tAmrMo.rodata.str1.4.rel.gnu.linkonce.r._ZTV8ICH4Card.rel.gnu.linkonce.r._ZTV17VOscillatorClient.rel.gnu.linkonce.r._ZTV9VTestData.rel.gnu.linkonce.r._ZTV10VICHMOCard.rel.gnu.linkonce.r._ZTV14PhilipsPCICard.rel.gnu.linkonce.r._ZTV10VModemLine.rel.gnu.linkonce.r._ZTV17VVirtualModioCard.rel.gnu.linkonce.r._ZTV10tAmrMoCard.rel.gnu.linkonce.r._ZTV14tAbstractAMRDC.rel.gnu.linkonce.r._ZTV11tAbstractDC.rel.gnu.linkonce.r._ZTV14tBadModemCodec.rel.gnu.linkonce.r._ZTV12tACLinkCodec.rel.gnu.linkonce.r._ZTV11tAC97RegSet.rel.gnu.linkonce.r._ZTV11tAudioCodec.rel.gnu.linkonce.r._ZTV11tModemCodec.rel.gnu.linkonce.r._ZTV13VIA3058MOCard.rel.gnu.linkonce.r._ZTV10VSISMOCard.rel.gnu.linkonce.r._ZTV10V960MOCard.rel.gnu.linkonce.r._ZTV12VALI5457Card.rel.gnu.linkonce.r._ZTV11RTL8197Card.rel.gnu.linkonce.r._ZTV11VNVidiaCard.rel.gnu.linkonce.r._ZTV12SIL3054codec.rel.gnu.linkonce.r._ZTV12generalCodec.rel.gnu.linkonce.r._ZTV12VALI545ACard.rel.gnu.linkonce.r._ZTV11SIL3052Card.rel.gnu.linkonce.r._ZTV12SIL3052codec.rel.gnu.linkonce.r._ZTV10SL2800Card.rel.gnu.linkonce.r._ZTV11SL2800codec.rel.gnu.linkonce.r._ZTV4tPGA.rel.gnu.linkonce.r._ZTV6tAdsMC.rel.gnu.linkonce.r._ZTV12tSiLabsCodec.rel.gnu.linkonce.r._ZTV13ModemInstance.rel.gnu.linkonce.r._ZTV14VModioHWClient.rel.gnu.linkonce.r._ZTV6VQueue.rel.gnu.linkonce.r._ZTV11VSmallQueue.rel.gnu.linkonce.r._ZTV13VVirtualQueue.rel.gnu.linkonce.r._ZTV7VFilter.rel.gnu.linkonce.r._ZTV17VConversionFilter.rel.gnu.linkonce.r._ZTV13VSimpleFilter.rel.gnu.linkonce.r._ZTV10VConverter.rel.gnu.linkonce.r._ZTV15VModemConverter.rel.data.gnu.linkonce.d._ZZN12SL2800RegSet13dwWriteDirectEmmE14previousOffset.bss.comment.note.GNU-stack@1  "% U       J F  t p  !!$ @! `!Gp!t!!/!'!^!!"", "g@"P"`"p":" k" g ""  $"  &"  (?"5; *e#Ta (,p# #  /#  (1#  03Z# V 85# @7#  H9#  P;9# 5 X=~$ z `?$  hA $ pC 0$Q @$ P$ `$ p$/ $)+ @Jb % ^ L % N %  P % R %2 &rf &x ') @W 0( @(J P( `( p( (* (b ( ( ( (B(s)) )0)K@)P)`)p))I))))#)O)z)( *0* @*IP*w`*p***F*}***$*  0T++  8 + @0+ PP+ `Cp+ ? xr+ n +  + +  9+ 5 b+^ , ,   ,  &0, " j@, f P, `,  p,   @, < , } , ,  (%, ! 0T, P 8,  @, -  H9- 5 Pj - f X0-  `@- !P-  hQ`- M pp- } x-  -.-h- d -  -   -  L-fH w`.p..  +. ' s.o . .X (@/ )`/ [p//* 8 / P  /C /x 0  0  0!00P!@0 !P0! h 0!@1 ! !P1 ! 0"`1 ," s"p1 o" "1 "1#1O#1#1#1#1#$1 ^$2 $2$ 2$02-%@2_%P2%`2%p2&20&2Z&2 V&  &2 & &2 & '2 ' S'2 O' '3' ' 3' '@3'   ( 4 ( ( I(04 E( 0 (@4 ( 8 !(P4 ( @ #)`4 ) H %a)p4 ]) P ')4) X ))4) h +)4 ) -"*4* /M*4 I* 1p*4l* 3*5* 5*5* 7* 5* 9+05 + ;E+@5A+ =p+P5l+ ?+p5#+ A+5, +  C+2db*+ + #hF,2<q,< , %HI6,  2, h'Kb,0^, p'M,@@ , 'PO,8 , )@Q, , ,0S,`$ , @-8U$-  - x- WI-( E- /@Yr-( n- /@[-@ - 0]-@ - 10_-`- 1a. . 20c4. 0. @2eZ.< V. 3Hg. < ~. 06Hi. d . x8k. @ . ;Pm. @ . `=Po/ L / ?hq?/ ;/ Bsf/( b/ D@u/$ / @Dw/  / XFy/ H / H{0 / H}&0`"0 8J L0x H0 XJj0 f0 `J0 0 8L00 N(00 HN1$ 0 `N8"1 $ 1 N8H1HD1 N p1` l1 N01 1 O01 1 PO011 O 22 O42 02 OP:22h 220020z        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(5AN^kwN @?NTK\guNlNN -:GWg*"1Aiz` 0Qs~ &0 ` CGS`m*Er|d @TT` @CCC@C@CCC(C8CHCX@%Ch%pCx`'C(C(@C)C+C+Cn,Cp7! <!i\"u. ) <Q"q}p*"`za "5 0SN "]} Pp 0 3 0 P^P Nk   Q p!  Y+ " Y j~   A  W 0B m PF  ar i X  zv: Q 0_x g  "+ " ?H!{(..K07f' P "1Pu"f<"T@ep S E B Rqg( &jG VP"az0U@@@ sQP5h"7u"")rp\3P "m?f0 Z+"' C``wYQ!e0@IM`^n",Pp " +@If}p Y&@F f0?G{ mp"$nBhwU " "\M{I) ! '@B$Py'?hp`Y !W`4и4}Yp(wS k@?#0u="|` p !08*c "5"k["c70Hp(N  MI>\p?`< "%%`^N>p2[q0| fvg "; "; W 0!u #"A   !`0!q!!P2+!! "!p[! ""e?"e" " u"y"!F"Ш"" |#"5&#!];# "#l#pI#`e#@!o##c#"^+$pxJ$t$W$$"$+$ %'%@$C%u]%p% _% "9%@G?%pe%<!g% "-&R& "&pnz&p=&@m& &'/'PgN'm'p2')0'{''0("C(pFi(w(X"($5((-Q+)<V)b)w)" ))#)P *c*@=*"Fk*@b*1*"*P+ .+07W+"w+N+?+*k+ +",UF,rl,Pl,,"/,0Z,0b,Y1- -=-P_-0w-<-`-u-./"@.^..". !c. _.kU//"// "]/^/%/]/$"/$!/g0`+00bI0pr0"0G0 Sj000pB10Z61p h^12111P*(1p1S2B72`V2"}2j2AP2$2"2\43S{b3t3`33 "3@4"040U4\4"r4p434" 5 "!(5NP5@r5`u5)'5P(556m!6560 5J6!`66@R\6"{6 "70>7и5V7"h~77 "77 7 8A8Z_888b8@:907+979a9}9 "?9vW9!9:@&:.6:@L:lIy:$!U:\:P M::F; ";M;(![_;;P5S;P*;@; <"7<S<v<z<0@<|<e<pm=P;G=p8q=0= = =L>*>@K> Sd>>>]?>09> [(?"?A?@n,`?`,u? ?$!?"i??"@2@@[@ "3@i@"@!@A@@A5lAA@!OAP AA A"B@H#B)BBЯ']B,2qBB *B B"eB "(CKCtqC7CxCC "D0D "bD"RxD0eDp'D DRE`EY>EжHEnhEEaE "PE`RF0r*F"OF@gF`F y>F\F"FGFn9GJ#WGuGG "G0GyH"v9HP)YH/3wHH"qHHБH"I ,I`bHI I "I1I IP+1J J>?JCoJ!JJ2xJ "J!sK$K"V"bV@F~V`yV@1VpV\W(3WS MWnW0]W "Wp WW!X?XЇaXNzXXXX -MX"xY)YTBY2$`Y`C~YY@e:YsY@!mY0Z !`H`&)aAa@-oaP/aSaZa"aEbp9N2b"Wb "rbCbb" b<bpcb c".ca\c$scлc^cPc"c0d "&Ad0bd "AvddydTd!yd"_eOSQe,\e0 oe "e e!e0Deef .f^f qf`3fwf+g "$Cg"lhg$gp~gPgMg 52h`BLhPwhh"hlh"i_BiHei"i|i.ioj8!QjoFjP6njAjjJjb4jk0]kzBk" Wk5nk "k" k@k" kl+lSl&kl lnl $l.lm"YNmXjmmmflmeRmn" CngnVzn`PnPnn]nnoPv6oVdoo[oo0yJp;pj`p'~p"=pppepTq 2B:q "/Uq2yq "q%q (q0qyq!0r!M?r "._r3Xr@_r/lr "Lr`-s<*Hs.kssPs3s$sВ t0<{4tMtP.zttQt0.QtPfu :u<NOu=|u"u3.uISu " v5v@]v/vKv0$vpVv % w)w2Rw}w`w[w\w@Z x "xTFx@&y_xxNx"dxx`xw y@QypCwy jyp(y&y@?y#z"s>z`jzzszf"z|zz5"*zA'{P{ &!r{("t{{-{$|p%G|N| Us|<!I|Ї@||y| "||}"=(}@M}7s}h2}"}}}0y~pbT2~T~Z=~ "~(~!~~!a~@ZB*cU "= e \$p-K duȀ"x"V/G "w P Ձ * ! `4ogX0eȂ703."9/"NDr"UhPFk5\ "`dT",n*5 d@ip"}Ц1DJJpTt`Dž="$B?`@`  "z@҆'S'0U v"Iq&ph``%C3x nr͈4d!kp`p:@OP1k"y@݉h0,nU|&pŊ0B`nV'!80~?T |"uGŋ"& 5"~Z v;0x@V\(0<h[Wpd"܍p1$!}D{^)'r"H pǎ"[ `{?.!B"^qs"Ï(!Y@~i/'OCCx" "ʐвސ@  U#.DP*`RL1gw>P s1 )Nk" }Ē ֒'0v06M"\q}"bgՓ'!C@Dj`kp-"?ڔd% 5=0n[кڕB 2)$`KPr0d і"7M l-Vxʗ["`2 P@>` v%֘T!1@60%?O x0 Wlf b1G0kpa"ٚ!pgcN`pV +כ "@UH"n0FPQ=PY)ԜPv~"Ipv^"Cr@Z9ѝߝзMP .7 /SФ0p M\֞Q"T1a3Xkş "0  7 C=b)"We Π\2$@' AЪ_0v@ !_0 `ߡ 03p SU %vpuElۢy P7"W "sz"w}֣`I* "El`j^x !w@Pc"¥@zߥp4L!q0eFиo " =ѦF-&0~GU 'smƧw "^y9 "Y@#@ !Kبn=FT "o "q5Y^ ""8cP3PϪ "(C) "Epse`O<"mYΫWAE " = LPb`8" wwά"E@oo0`SFt?l!S}oPpjϭ ";p9 "$!9`Bh`&@`TQІ@+NFi"PHy[ï +د`2n<:оId"j"n "-°'; B1 =0]@/yqOȱ0 @0I`mv t+"òP= ". Р?pj[Yxv"ϳ@8/:R5"մ ")"J?8'Y]D@`S y$`NA`$!wӶ0P n-p |P.r``"ӷ/ ""ZD_vh(!u{"`"o۸c p/G !_'ktƹ@[u *(0DOSt<@{ %&D"pj "'Yy ' ?rlpo{"μ@/@ @Rz9x0pֽ;@Y+:Ppim"gNľi0yH "A/iuؿ{K &(;`JI z  \ "r-bF[P&ЮP!U$ 'GfPTamrmo_card.ccard_interruptLAmrMo.cppICH4card.cppICH4dma.cppICH4regs.cppDirectRegistersICH4test.cppichcard.cppichdma.cppichpm.cppichtest.cppphilcard.cppphildma.cppphilregs.cppIndirectRegistersphiltest.cppvmdmline.cppamrdev.cppac97codec.cpp_ZZN12tACLinkCodec15DetectCodecTypeEPPcE17VerboseCodecTypesac97ich.cppcodecfactory.cppframer.cpppciaccess.cpp3058card.cpp3058dma.cpp3058test.cppac97via.cppviapm.cppsiscard.cppsisdma.cppsistest.cppac97sis.cpp960card.cpp_NamesOfPMOrders960dma.cpp960regs.cpp960test.cpp5457card.cpp5457regs.cpp5457test.cppRTL8197card.cppRTL8197regs.cpp_ZZN13RTL8197RegSet4DumpEvE10DirectRegsRTL8197dma.cppRTL8197test.cppnvidiacard.cpplvpage.cppLin_dep.c_CalculateChunksSIL3054codec.cppgeneralCodec.cpp545Acard.cppSIL3052card.cppSIL3052dma.cppSIL3052regs.cpp_ZZN13SIL3052RegSet4DumpEvE10DirectRegsSIL3052codec.cpp_ZZN12SIL3052codec20SetCountryParametersEmE14CountryBitmaskSIL3052lock.cppSIL3052test.cppSL2800card.cppSL2800codec.cppSL2800dma.cppSL2800test.cppad1803.cppcalibration_status_ZZN6tAdsMC4DumpEvE11ACRegisters_ZZN6tAdsMC4DumpEvE12AC1Registerssilabs.cpp_ZZN12tSiLabsCodec4DumpEvE11ACRegisters_ZZN12tSiLabsCodec20SetCountryParametersEmE14CountryBitmaskhal.cpp_Z27OnHardwareInstanceDestroyedPvmtlhinst.cpp_ZZ24ConvertSampleToPWMFormatsE12RegionTable4mtlpipe.cpprateconv.cppsampling.cpp.LC0Queue.cpp_QueSemaphore_flagsFixedRC.cfixedRc_DownFactfixedRc_UpFactrc80to72filterrc72to80filterrc320to96filterrc96to320filterrc120to80filterrc80to120filterrc120to96filterrc96to120filterrc384to80filterrc80to384filterrc384to96filterrc96to384filterrc480to96filterrc480to80filterrc96to80filterrc80to96filterCI_b2CI_b1CI_bDroopc++.c_ZN11RTL8197Card15WriteACRegisterEttRi_ZTV13VVirtualQueue_ZTV10VSISMOCard_ZN8ICH4Card9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN14PhilipsPCICard26OnTestingHardwareInterruptEv_ZN14tBadModemCodecD1Ev_ZN12SIL3052codec13GetSampleRateEvsysdep_restore_flags_ZN14ICH4DMAChannelC1ER10ICH4RegSetm_ZN13tLineDetectorC1EP12generalCodecm_ZN12generalCodec18getNewMOHmechanismEv_ZN10V960MOCard12PlatformNameEvsysdep_outb_ZN10V960MOCard6OnTestEv_ZN12VALI545ACard12DevIO_acReadEt_ZN6tAdsMC11GetCIDStateEv_ZN10tSISRegSet10InitializeEm_ZThn100_N10VICHMOCard15WriteACRegisterEttRi_ZN11RTL8197Card18GetTransferBuffersERmS0_S0_S0__ZThn16_N11tModemCodec20CheckForLinePresenceEv_ZN16tICHPMController13DisableWakeUpEv_ZN10tAmrMoCard24RestoreACStateIfPossibleEv_ZN12SIL3054codec10GetCodecIDEv_ZN13ModemInstance6EnableEP18tagMODIOINFOSTRUCT_ZN17RTL8197DMAChannel18SetPhysicalAddressEPvmm_ZN12VALI5457Card6OnTestEv_ZN10SL2800Card22OnPowerRequestCompleteEt_ZN11RTL8197Card10ModemCloseEv_ZN10SL2800Card13configureGPIOEmm_ZN16tICHPMController9IsEnabledEv_ZN10tAmrMoCard6InitHwEv_ZN10VModemLine7GetPropEm_ZN10tAmrMoCard26OnWin2KHibernationRequiredEv_ZN14VICHDMAChannelC1ER10tICHRegSetm_ZN12tSiLabsCodec20SetCountryParametersEm_ZN7VFilterD0Ev_ZN17VConversionFilter4PumpEPvS0__ZN12tSiLabsCodec20ClearInterruptStatusEv_ZN7VFilter5DebugEPc_ZN10VModemLine20CallClientPTCHandlerEPv_ZN12VALI5457Card17InitializeIOSpaceERiS0__ZN10VModemLine4KillEv_ZN12tSiLabsCodec17IsConcurrentCodecEv_ZN12VALI545ACard9SetHookOnEi_ZN10V960MOCardD0Evamrmo_card_delete_ZN10VModemLine4StopEm_ZN11SIL3052Card30CheckAndClearWatchdogInterruptERt_ZN6tAmrMo9dwIOBase1Ev_ZN10VSISMOCard19ReportModemActivityEi_ZN10SL2800Card10disablePWMEv_ZN11RTL8197Card7IRQTestEv_ZN12tSiLabsCodecD0Ev_ZThn100_N11RTL8197Card15WriteACRegisterEttRi_ZN14PhilipsPCICard9EnableCIDEi_ZTV12SIL3052codec_ZN12SIL3054codec13hasErrorInDAAEv_ZN14t960DmaChannel4StopEv_ZN8ICH4Card20OnOscillatorSignaledEm_ZN12tSiLabsCodec4DumpEv_ZN10SL2800Card10PtcDpcProcEPv_ZN6VQueueD1Ev_ZN11VNVidiaCard23CardQueryPowerProcedureEv_ZN11SIL3052CardD2Ev_ZN11tModemCodec20ClearInterruptStatusEv_ZN14tAbstractAMRDCD0Ev_Z11ChannelNamemsysdep_inb_ZN11SL2800codec7DetailsERPc_ZN13ModemInstance10SetOptionsEm_Z10FlushQueueP18tag_QUE_Descriptor_ZN14PhilipsPCICard7OnStartEP18tagMODIOINFOSTRUCT_ZN10SL2800Card22DMATest_BothDMAchannelER16SL2800DMAChannelS1_P9VTestDataS3_m_ZN11VSmallQueueC2Em_ZN11VNVidiaCard6OnTestEv_ZN13VIA3058MOCard19TryToReadACRegisterEtRtRi_ZN11VNVidiaCard4StopEm_ZN12tSiLabsCodec17CalibrationStatusEv_ZN10VSISMOCard10DebugQueryEc_ZN13VIA3058MOCard9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN11tModemCodec21EnableDigitalLoopbackEi_ZN16SL2800DMAChannel8IsActiveEv_ZN10VConverter11ProcessDataEvsysdep_inl_ZN12VALI545ACard20OnOscillatorSignaledEm_ZN11SIL3052Card10PtcDpcProcEPv_ZN13VIA3058MOCard6EnableEPK18tagMODIOINFOSTRUCT_ZN6tAmrMoC1Emmm_ZN10ICH4RegSet4DumpEv_ZN13VSimpleFilter4KindEv_ZN11SIL3052CardD1Evhal_write_ZN11SIL3052Card16SetAudioInVolumeEi_ZN12tSiLabsCodecD1Ev_ZN8ICH4Card19InitializeRegistersEv_ZN11SIL3052CardC1Emm_ZN12VALI5457Card8CardTestEv_ZN11RTL8197Card9OnSuspendEv_ZThn100_N12VALI545ACardD0Ev_ZN10SL2800Card6OnTestEv_ZN16SL2800DMAChannel5StateEv_ZN10VICHMOCard11RingDpcProcEPv_ZN11SIL3052Card7OnStartEP18tagMODIOINFOSTRUCT_ZThn100_N12VALI545ACard23CalibrateMaxAcRdWrLoopsEv_ZN10VConverter9AvailDataEv_ZN13ModemInstance7DestroyEv_ZN13ModemInstanceD0Ev_ZN10VICHMOCard7DisableEv_ZN12VALI545ACard19OnHardwareInterruptEPvm_ZN14PhilipsPCICard9ModemOpenEP14VModioHWClientRP17VVirtualModioCardsysdep_pci_write_config_word_ZTV11tModemCodec_ZN7tFramer13NextOutputBitEv_ZN12tSiLabsCodec11GetCIDStateEv_ZN11SIL3052Card14SetAudioSourceEiamrmo_card_read_ZN10VSISMOCardD1Ev_ZN12tSiLabsCodec12SetFlashModeEi_ZN10VModemLine8OnResumeEv_ZN10tAmrMoCard15FreeCodecObjectEv_ZN12tSiLabsCodecC1ER11tAbstractDCR14VParametersKeysysdep_pci_read_config_dword_ZN17SIL3052DMAChannel6GetPosEii_ZN11VNVidiaCard10EnableRingEi_ZN13RTL8197RegSet20ClearInterruptStatusEP11tModemCodec_ZN6tAdsMC5SleepEv_ZN11SIL3052lock6getKeyEv_ZN13tLineDetector5CheckEv_ZN10SL2800Card12registryInitEv_ZN13ModemInstanceC1EmPvPFvS0_E_ZN10VICHMOCardC1Emm_ZN12tSiLabsCodec7DetailsERPc_ZN10V960MOCard7SetPropEmm_ZN7tFramer12PutNextInBitEi_ZN12VALI545ACard16SetSpeakerVolumeEi_ZN11SL2800codec11GetPGAValueE13tPGADirection_ZN17RTL8197DMAChannel4StopEv_ZN10t960RegSet20ClearInterruptStatusEP11tModemCodec_ZN10tICHRegSet20ClearInterruptStatusEP11tModemCodec_ZN14VSISDMAChannel6GetPosEii_ZThn100_N13VIA3058MOCardD1Ev_ZThn16_N6tAdsMC15setHandsetStateE9eHSXstate_ZN8ICH4Card18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN17PhilipsDMAChannel19KeepTransferRunningEv_ZN7tFramer12NextInputBitEv_ZN17RTL8197DMAChannel5StateEv_ZN10SL2800Card12SetFlashModeEi_ZTV7VFilter_ZN16SL2800DMAChannelC1ERVPmmR12SL2800RegSet_ZN10VICHMOCardD1Ev_ZN6tAdsMC12GetHookStateEv_ZN14PhilipsPCICard17PowerOffProcedureEt_ZN10VICHMOCard14ReadACRegisterEtRtRi_ZN12tSiLabsCodec17StartPulseDialingEv_ZTV10tAmrMoCard_ZN13ModemInstance16FinishModioSetupEP18tagMODIOINFOSTRUCT_Z13GetLeftStereoPvPtm_ZN10VModemLine9EnableCIDEi_ZN11SIL3052Card15OnRingInterruptEPv_ZN16SL2800DMAChannel5ResetEv_ZN10SL2800Card13searchSyncPTCEv_ZN14VICHDMAChannel6GetPosEii_ZN11RTL8197CardD2Ev_ZN14tPhilipsRegSet20ClearInterruptStatusEP11tModemCodec_ZN13VIA3058MOCard9EnableCIDEi_ZN10V960MOCard7GetPropEm_ZN14tBadModemCodec11SetCIDStateEi_ZN12tSiLabsCodec10InitializeEN11tModemCodec19tInitializationTypeE_ZN12tSiLabsCodec10FixGPIOBitEv_ZN12SIL3054codec17updateHandsetFlagERt9eHSXstate_ZN10tSISRegSet4DumpEv_ZN10tAmrMoCard17InitializeIOSpaceERiS0__ZN11tModemCodec17StartPulseDialingEv_ZN11tModemCodec20SetCountryParametersEm_ZN10SL2800Card22operationRegistersTestE9eTestType_ZN12VALI545ACard6InitHwEv_ZN10tICHRegSet4DumpEv_ZN11SIL3052Card9OnSuspendEv_ZN11SIL3052Card6OnStopEv_ZN10VICHMOCard19OnHardwareInterruptEPvm_ZN10VSISMOCard18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN14t960DmaChannel8IsActiveEv_ZN10tAmrMoCard11RingDpcProcEPv_ZThn16_N12tSiLabsCodec15setHandsetStateE9eHSXstatesysdep_strncpy_ZN11SL2800codec10InitializeEv_ZN10VSISMOCard6OnTestEv_ZN11SIL3052Card9checkLockEm_ZN6VQueue5writeEPvmi_ZN11SIL3052Card9IoControlEP14MTLUSBEXCHANGE_ZN17SIL3052DMAChannel13ResetPCIabortEv_ZN10V960MOCard18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN13VSimpleFilterD1Ev_ZN10SL2800Card13OnVirtualIRETEPvm_ZN12VALI5457Card7DisableEv_ZN17VConversionFilterC1Eiiii_ZN15VModemConverterD0Ev_ZN11SIL3052Card9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN16VInterruptTracer5TraceEmRi_ZN11VNVidiaCard7OnStartEP18tagMODIOINFOSTRUCTChannelRegisters_ZN10SL2800Card9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN10VModemLine10DebugQueryEc_ZN14ICH4DMAChannel8IsActiveEv_ZN6tAdsMC9CalibrateEm_ZN11tAudioCodecD1Ev_ZN11RTL8197Card6OnStopEv_ZThn100_N11VNVidiaCardD0Ev_ZN13ModemInstance24CalculateStartParametersEv_ZN12SIL3052codec16StopPulseDialingEv_ZN6tAmrMo15OnRingInterruptEPv_ZN10VICHMOCard7IRQTestEv_ZN10V960MOCard9ChangePTCEm_ZTV6tAmrMo_ZN14PhilipsPCICard7IRQTestEvsysdep_get_free_pages_ZN14PhilipsPCICardC2Emm_ZN7VFilter4KindEv_ZTV14tBadModemCodec_ZThn16_N12tSiLabsCodec21updateMOHstateMachineEi_ZN10VSISMOCard14ReadACRegisterEtRtRi_ZN12tSiLabsCodec16StopPulseDialingEv_ZTV11RTL8197Card_ZN10V960MOCard7IRQTestEv_ZN10SL2800Card6OnStopEv_ZN11tModemCodec25CheckForLineDetectFailureEv_ZN11SIL3052Card10ModemCloseEv_ZN12VALI5457Card20OnOscillatorSignaledEm_ZN10VICHMOCard6EnableEPK18tagMODIOINFOSTRUCT_ZN8ICH4CardD0Ev_ZN10tAmrMoCard16PulsHardwareLockEi_ZN10VSISMOCardD2Ev_ZN17RTL8197DMAChannel5StartEv_ZN14VCyclicCounter6UpdateEm_ZN11VNVidiaCard8OnResumeEv_ZN11SIL3052Card6OnTestEv_ZN7tFramer4WaitEm_ZN12SIL3052codecC2ER13SIL3052RegSet_ZThn100_N14PhilipsPCICardD1Ev_ZN10VSISMOCard9EnableCIDEi_ZN12VALI5457Card6OnStopEv_ZTV13VIA3058MOCard_ZThn100_N11RTL8197Card14ReadACRegisterEtRtRi_ZN12SIL3052codec15GetCapabilitiesEv_ZThn100_N12VALI545ACard14ReadACRegisterEtRtRi_ZN14VICHDMAChannel4StopEv_ZN11SIL3052Card9SetHookOnEi_ZN10SL2800Card14chipsetDetailsERPc_ZN11RTL8197CardD0Ev_ZN12VALI5457Card7GetPropEm_ZN13VIA3058MOCard10DebugQueryEc_ZN6tAdsMC16SetSpeakerVolumeEt_ZN17PhilipsDMAChannel5StartEi_ZN16SL2800DMAChannel16getDmaBufferSizeEv_ZN8ICH4Card17PowerOffProcedureEt_ZN10V960MOCard10PtcDpcProcEPv_ZN17SIL3052DMAChannel5StartEv_ZN12SIL3054codec16SetSpeakerVolumeEt_ZN12VALI545ACard16SetAudioInVolumeEi_ZN10SL2800Card18readChipsetVersionEv_ZN10SL2800Card14OnPTCInterruptEPv_ZN12VALI545ACard9EnableCIDEi_ZN16tVIAPMController10InitializeEv_Z14SimulatePutQueP18tag_QUE_Descriptorm_ZN12SIL3054codecC2ER11tAbstractDCR14VParametersKey_ZN8ICH4Card26OnTestingHardwareInterruptEvhal_getprop_ZN10SL2800CardC1Emm_ZN6tAmrMo7SetPropEmm_ZN10tAmrMoCard20ProcessPTCInterruptsEiPv_ZN10tVIARegSet20ClearInterruptStatusEP11tModemCodec_ZN11SIL3052lockC1Ev_ZN7tFramer7OnClockEv_ZN10V960MOCard15WriteACRegisterEttRi_ZN12generalCodec15setHandsetStateE9eHSXstate_ZN11SIL3052Card18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN16SL2800DMAChannel4StopEv_ZN14tAbstractAMRDC6BaseIOEv_ZN13VIA3058MOCard10EnableRingEi_ZN14tPhilipsRegSet18EnableDMAInterruptEhii_ZN13RTL8197RegSet17CheckDMAInterruptERt_ZN10tAmrMoCard12PowerAudioOnEv_ZN13VIA3058MOCard6OnTestEv_ZN12VALI5457Card9EnableCIDEi_ZN16SL2800DMAChannel18SetPhysicalAddressEPvmm_ZN6tAmrMo9dwIOBase2Ev_ZN10tAmrMoCard13PowerAudioOffEv_ZN12SIL3052codec24DisableManualCalibrationEv_ZN16tICHPMController12EnableWakeUpEv_Z14SimulateGetQueP18tag_QUE_Descriptorm_ZN11RTL8197Card10EnableRingEi_ZN13VVirtualQueueD0Ev_ZN11tModemCodec13SetSampleRateEt_ZN6VQueueC2EPvm_ZN10VICHMOCard6OnStopEvhal_read_ZN11RTL8197Card9SetHookOnEi_ZN17SIL3052DMAChannel8IsActiveEv_ZN10VConverter3GetEPvm_ZN10SL2800Card11RingDpcProcEPv_ZN11SIL3052Card20OnOscillatorSignaledEm_ZN11SL2800codec15ResetRingFilterEv_ZN7tFramer13GetNextOutBitERi_ZN14tAbstractAMRDC9SetSelectEN11tAbstractDC14tSelectedCodecE_ZN17PhilipsDMAChannel4StopEv_ZN12VALI5457Card22OnPowerRequestCompleteEt_ZN10VModemLine18DoOrCancelWaitWakeEv_ZTV11tAudioCodec_ZN12VALI5457Card14ReadACRegisterEtRtRi_ZN14VICHDMAChannel5ResetEvhal_stop_ZN14tAbstractAMRDC9GetSelectEv_ZThn100_N11VNVidiaCard15WriteACRegisterEttRi_ZN12tSiLabsCodec12GetHookStateEv_ZN10V960MOCard20IsACWritingAvailableEv_ZN12tSiLabsCodec11SetCIDStateEi_ZN6tAmrMo6InitHwEv_ZTV11VSmallQueue_ZN14t960DmaChannel16ConfigureChannelEv_ZN11RTL8197CardD1Ev_ZN12SIL3052codec7DetailsERPc_ZN16tICHPMController10InitializeEmmttti_ZN10tAmrMoCard17SetModemInputGainEi_ZN10tAmrMoCard14ConnectSpeakerEi_ZN10VSISMOCard8OnResumeEv_ZN12SIL3054codec13SetBuzzerModeEv_ZN10VSISMOCard10PtcDpcProcEPv_ZN14VSISDMAChannel9DumpTableEv_ZN11VNVidiaCard19bIsAudioDeviceReadyEv_ZN12tSiLabsCodec16StopLockSequenceEv_ZN13ModemInstance5WriteEPtt_ZN12tSiLabsCodec10GetCodecIDEv_ZN10VPageBlockD2Ev_ZN10SL2800Card20ProcessPTCInterruptsEiPv_ZN10SL2800Card7getHighEm_ZN10tAmrMoCard10DebugQueryEc_ZN15V5457DMAChannel6GetPosEii_ZN17VOscillatorClient12OnOscillatorEm_ZN10VICHMOCard22OnPowerRequestCompleteEt_ZN12VALI545ACardC1Emm_ZN11VSmallQueueD2Ev_ZN13VIA3058MOCard12PlatformNameEv_ZN13VIA3058MOCard18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN10SL2800Card26updateDMA_OUTtransferBlockEv_ZN10SL2800Card10DebugQueryEc_ZN11SIL3052lock6setKeyEt_ZN17PhilipsDMAChannel9DumpTableEv_ZThn100_N12VALI5457Card14ReadACRegisterEtRtRi_ZN11RTL8197Card7DMATestER17RTL8197DMAChannelm_ZN11tModemCodecD1Ev_ZN13VIA3058MOCard13DevIO_acWriteEtt_ZN12VALI5457Card18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN11tModemCodec7SetPropEim_ZN10SL2800CardD1Ev_ZN14ICH4DMAChannel9DumpTableEv_ZN12VALI545ACard19ProcessHardwareLockEv_ZN8ICH4Card12PlatformNameEv_ZN12VALI545ACard14ReadACRegisterEtRtRi_ZN12SIL3052codec12SetupForRingEvIO_ZN10VPageBlockC1Em_ZN10V960MOCard18ConfigureForACReadEt_ZN12tSiLabsCodec21EnableDigitalLoopbackEi_ZN12SIL3052codec21EnableDigitalLoopbackEi_ZN6tAdsMC13hasErrorInDAAEv_ZN10SL2800CardD2Ev_ZN11VNVidiaCardD0Ev_ZTV15VModemConverter_ZN10tAmrMoCard13DevIO_acWriteEtt_ZN10VICHMOCard9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN14tBadModemCodec11GetCIDStateEv_ZThn100_N12VALI5457Card15WriteACRegisterEttRi_ZN12tSiLabsCodec19EnableRingDetectionEi_Z14PutRightStereoPtPvm_ZN11tModemCodec19EnableRingDetectionEi_ZN12SIL3052codec4DumpEv_ZThn100_N10V960MOCard14ReadACRegisterEtRtRi_ZN12VALI5457Card11RingDpcProcEPv_ZN7VFilterD2Ev_ZN8ICH4Card7GetPropEm_ZN15VModemConverterC2EP20tagAUDIOCLIENTSTRUCTS1_Pc_ZN10VICHMOCard10EnableRingEi_ZN12VALI5457Card7DMATestER15V5457DMAChannelm_ZN11RTL8197Card10PtcDpcProcEPv_ZN11RTL8197Card24ValidatePCIConfigurationEv_ZN12SIL3054codec15setHandsetStateE9eHSXstate_ZN12tSiLabsCodec13SetBuzzerModeEvsysdep_outl_ZN11VNVidiaCard19OnHardwareInterruptEPvm_ZN10SL2800Card9EnableCIDEi_ZThn100_N14PhilipsPCICard15WriteACRegisterEttRi_ZN6tAdsMC7PowerUpEv_ZN8ICH4Card10PtcDpcProcEPv_ZN12SIL3052codec18setNewMOHmechanismEi_ZN10V960MOCard11PowerDCDownEv_ZN7VFilterC2Ev_ZN12VALI5457CardD2Ev_ZN14VICHDMAChannel18SetPhysicalAddressEPvmm_ZTV17VVirtualModioCard_ZN10VICHMOCard9SetHookOnEi_ZN13VIA3058MOCard15IsReadCompletedEv_ZN10SL2800Card9resetCardEv_ZN6VQueue5DebugEPci_ZThn100_N10VSISMOCardD0Ev_ZN17SIL3052DMAChannel19KeepTransferRunningEv_ZTV11tAbstractDC_ZN10SL2800Card21InitializeMemorySpaceEv_ZN10VSISMOCard18GetTransferBuffersERmS0_S0_S0__Z7PutMonoPtPvm_ZN11SL2800codec19EnableRingDetectionEi_ZN12tSiLabsCodec15GetCapabilitiesEv_ZN10tAmrMoCard14SetAudioSourceEi_ZN6tAdsMC13SetSampleRateEt_ZN14PhilipsPCICard10PtcDpcProcEPv_ZN10tAmrMoCard9OnSuspendEv_ZN10VSISMOCard6EnableEPK18tagMODIOINFOSTRUCT_ZN5ADATA5DebugEPc_ZN10V960MOCard12DevIO_acReadEt_ZN10SL2800Card21TST_GPIOInterruptTestEv_ZN8ICH4Card6EnableEPK18tagMODIOINFOSTRUCT_ZN13ModemInstance19SetModemAttenuationEm_ZN10SL2800Card9IoControlEP14MTLUSBEXCHANGEamrmo_card_enable_ZN17PhilipsDMAChannel18SetPhysicalAddressEPvmm_ZN10VSISMOCard17PowerOffProcedureEt_ZN12tSiLabsCodec16RingVoltageStateEv_ZN17RTL8197DMAChannel6GetPosEii_ZN10VICHMOCard6InitHwEv_ZN13VIA3058MOCard17PowerOffProcedureEt_ZN10tAmrMoCard7GetPropEm_ZN10VICHMOCard9EnableCIDEi_ZN10VSISMOCard17InitializeIOSpaceERiS0__ZN12VALI545ACard18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN15VModemConverterD1Ev_ZN14VICHDMAChannel8IsActiveEv_ZN11VSmallQueueD0Ev_ZN11VNVidiaCardC2Emm_ZTV6VQueue_ZN11tModemCodec16SetSpeakerVolumeEt_ZN14PhilipsPCICard15WriteACRegisterEttRi_ZN10tAmrMoCard23CallDuringPTCProcessingEv_ZN12SIL3052codec11SetCIDStateEi_ZN12SIL3052codec9hookStateE10eHookState_ZThn100_N10VICHMOCard14ReadACRegisterEtRtRi_ZN11SL2800codec7powerUpEv_ZN11VNVidiaCard17CancelnVidiaTimerEv_ZN17VConversionFilterC2Eiiii_ZN10V960MOCard22OnPowerRequestCompleteEt_ZN11RTL8197Card7OnStartEP18tagMODIOINFOSTRUCT_ZN10VSISMOCard9IoControlEP14MTLUSBEXCHANGE_ZN13VIAPCIChannel5PauseEi_ZTV10VICHMOCardRcFixed_Resamplesysdep_get_utime_ZN13ModemInstance7SetPropEmm_ZN12VALI545ACard22OnPowerRequestCompleteEt_ZN13VIAPCIChannel9DumpTableEv_ZN11SIL3052Card10EnableRingEi_ZN16VInterruptTracerC2EPcWritePCIConfigSpace_ZN11SIL3052Card22OnPowerRequestCompleteEt_ZN12tSiLabsCodec17updateHandsetFlagERt9eHSXstate_ZN6tAmrMo5dwMemERm_ZN11tModemCodec4DumpEv_ZThn100_N11VNVidiaCard14ReadACRegisterEtRtRi_ZN13ModemInstance12PutModemDataEv_ZN11VNVidiaCard17PowerOffProcedureEt_ZN10tAmrMoCard9SetHookOnEi_ZN10V960MOCard25EnableInterruptGenerationEi_ZN14PhilipsPCICard9SetHookOnEi_ZThn16_N12tSiLabsCodec15GetCapabilitiesEv_ZN17SIL3052DMAChannelC2ER13SIL3052RegSetm_ZThn100_N10tAmrMoCard23CalibrateMaxAcRdWrLoopsEv_ZN12tACLinkCodecD0Ev_ZN8ICH4Card9IoControlEP14MTLUSBEXCHANGE_ZN16tVIAPMController12EnableWakeUpEv_ZN8SAMPLING5PrintEmPc_ZN10VICHMOCard19InitializeRegistersEv_ZN13VIAPCIChannel4StopEv_ZN10VICHMOCard10PtcDpcProcEPvhal_start_ZN14VICHDMAChannel9DumpTableEv_ZN10SL2800Card35TSTprintTestConfigurationParametersEv_ZN10tSISRegSet20ClearInterruptStatusEP11tModemCodec_ZN12tACLinkCodecD1Ev_ZN10VSISMOCard9OnSuspendEv_ZN10V960MOCard16WaitForNextFrameEv_ZN10tAmrMoCard17SetAudioOutVolumeEi_ZN14PhilipsPCICardD1Ev_ZN11SIL3052Card16SetSpeakerVolumeEi_ZN10V960MOCard6EnableEPK18tagMODIOINFOSTRUCT_ZN14t960DmaChannelC2ERPmi_ZN10VModemLine12SetFlashModeEi_ZN10SL2800Card8OnResumeEv_ZN12VALI545ACard19InitializeRegistersEv_ZN10VICHMOCard10ModemCloseEv_ZN6tAdsMCC2ER11tAbstractDCR14VParametersKey_ZN14tPhilipsRegSet15wChangeIndirectEhtt_ZN11RTL8197Card12PlatformNameEv_ZN12tSiLabsCodec19TestUniqueRegistersERi_ZN12VALI5457Card9ChangePTCEm_ZN11tModemCodec14CaptureHandsetEi_ZN15V5457DMAChannel8IsActiveEv_ZN16SL2800DMAChannel5StartEvsysdep_memset_ZN11tModemCodec13hasErrorInDAAEv_Z19GetQueAvailableSizeP18tag_QUE_Descriptor_ZN14PhilipsPCICard7DisableEv_ZN12SIL3054codecD0Ev_ZN11SL2800codec15SetupRingFilterEi_ZN10VICHMOCard9OnSuspendEv_ZN11VNVidiaCard9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZThn100_N12VALI545ACard15WriteACRegisterEttRi_ZN10VSISMOCard10ModemCloseEv_ZN11SIL3052Card7GetPropEmReadPCIConfigSpace_ZN6tAdsMC4DumpEv_ZN13ModemInstance17SetModemInputGainEm_ZN13VIA3058MOCard25ClearCodecInterruptStatusEv_ZN12SIL3052codec11GetCIDStateEv_ZN12VALI5457CardC1Emm_ZN14ICH4DMAChannel4StopEv_ZThn100_N10VSISMOCard14ReadACRegisterEtRtRi_ZTV12SIL3054codec_ZN11SL2800codec13SetSampleRateEm_ZN14tBadModemCodecD0Ev_ZN11SL2800codecC1ERVPmR12SL2800RegSet_ZN11SIL3052Card7IRQTestEv_ZN11SL2800codec19EnableCodecLoopbackEi_ZN12tSiLabsCodec23MeasureLoopCurrentSenseEvamrmo_debug_level_ZN10V960MOCard6InitHwEv_ZN11SIL3052lockC2Ev_ZN16tICHPMControllerC1Ev_ZN10ICH4RegSet10InitializeEm_ZN14PhilipsPCICard17InitializeIOSpaceERiS0__ZN10SL2800Card14ConnectSpeakerEi_ZN11RTL8197Card7GetPropEm_ZN6tAdsMC17updateHandsetFlagERt9eHSXstate_ZN12SIL3054codecD1Ev_ZN17PhilipsDMAChannel13DumpRegistersEv_Z8EvaluatePtm_ZN6tAmrMo9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN13ModemInstance28ProcessSpecialInterruptCasesERm_ZN17PhilipsDMAChannelC2ER14tPhilipsRegSetmi_ZN17SIL3052DMAChannel5ResetEv_ZN10VICHMOCard9IoControlEP14MTLUSBEXCHANGE_ZN17SIL3052DMAChannelC1ER13SIL3052RegSetm_ZN11SL2800codec7setGainE9eGainPathisysdep_pci_write_config_byte_ZN6tAmrMo21WritePCIConfigurationEtm_ZN10V960MOCardD2Ev_ZN12VALI5457Card7SetPropEmm_ZN11tAC97RegSet8acChangeEttt_ZN13ModemInstance14EnableCallerIDEi_ZN11SIL3052Card13OnVirtualIRETEPvm_ZN17VConversionFilterD2Ev_ZN10VSISMOCard7GetPropEm_ZN10SL2800Card17PowerOffProcedureEt_ZN16tICHPMControllerC2Ev_ZN10VSISMOCardC1Emm_ZN10V960MOCard7DMATestER14t960DmaChannelmamr_delete_ZN4tPGA18GetPGACapabilitiesE13tPGADirection_ZThn100_N10VICHMOCardD0Ev_ZN12VALI5457Card15WriteACRegisterEttRi_ZN10tAmrMoCard12PlatformNameEv_ZN13ModemInstance12OnDebugQueryEv_ZN13ModemInstance16SetSpeakerVolumeEm_ZN12generalCodec18setNewMOHmechanismEi_ZN12VALI545ACardD2Ev_ZN13VIA3058MOCard9SetHookOnEi_ZN12VALI5457Card26OnTestingHardwareInterruptEv_Z14GetNearestRatell_ZN14VICHDMAChannel5StartEv_ZN12SIL3052codec15setHandsetStateE9eHSXstate_ZN16tICHPMController11ClearStatusEv_ZN10SL2800Card21OnTest_BothDMAchannelEv_ZN6tAmrMo8DeinitHwEv_ZN13VIA3058MOCard8CardTestEv_ZN11SIL3052Card19SetModemAttenuationEi_ZN10SL2800Card7DMATestER16SL2800DMAChannelm_ZN11tModemCodec20CheckForLinePresenceEv_ZN10SL2800Card49TST_PCICFGinterruptStatusFlagTest_serviceFunctionEv_ZN14tAbstractAMRDCD1Ev_ZTV4tPGA_ZN13ModemInstance5StartEP10STARTPARAM_ZN10SL2800Card14SetAudioSourceEi_ZThn100_N12VALI545ACardD1Ev_ZN14PhilipsPCICard19InitializeRegistersEv_ZN14tPhilipsRegSet10InitializeEm_ZN12tSiLabsCodec7PowerUpEv_ZN10SL2800Card33TST_PCICFGinterruptStatusFlagTestEv_ZN11RTL8197Card18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN12VALI545ACard9OnSuspendEv_ZN14PhilipsPCICard9ChangePTCEm_ZN11SIL3052Card18GetTransferBuffersERmS0_S0_S0__ZN10DmaTracker32updateMiddleAddrLimitOnBufferEndEv_ZN6tAdsMC11SetCIDStateEi_ZN10VICHMOCard8CardTestEv_ZN12SIL3052codec23MeasureLoopCurrentSenseEvsysdep_virt_to_phys_ZN11VNVidiaCard9SetnTimerEv_ZThn16_N12tSiLabsCodec17updateHandsetFlagERt9eHSXstate_ZN10V960MOCard17InitializeIOSpaceERiS0__ZN10SL2800Card26operationRegisterResetTestER12cRegisterSet_ZN10tAmrMoCard16SetAudioInVolumeEi_ZN10VSISMOCard9SetHookOnEi_ZN10SL2800Card9ChangePTCEm_ZN14ICH4DMAChannel5StartEv_ZN14t960DmaChannel4DumpEv_ZN14PhilipsPCICard18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN8ICH4Card15WriteACRegisterEttRi_ZN10VICHMOCard7GetPropEm_ZN12VALI5457Card10PtcDpcProcEPv_ZN10tAmrMoCard16SetSpeakerVolumeEi_ZN12VALI545ACard17SetModemInputGainEi_ZN13tLineDetector7DisableEv_Z23ValidateTransferPointerP6VQueuei_ZN8ICH4Card17InitializeIOSpaceERiS0__ZN13VIA3058MOCard8OnResumeEv_ZN6tAdsMC19EnableCodecLoopbackEi_ZN11tModemCodec5SleepEv_ZN15VModemConverterC1EP20tagAUDIOCLIENTSTRUCTS1_Pc_ZN14t960DmaChannel6GetPosEii_ZN6VQueue4fillEhmm_ZN8ICH4Card8OnResumeEv_ZN14tBadModemCodec7PowerUpEv_ZN6VQueue5flushEv_ZN10SL2800Card6getLowEm_ZN12SIL3054codec9CalibrateEm_ZN10VSISMOCard10EnableRingEiamrmo_debug_printf_ZN10DmaTracker24OmittedInterruptCheckingERim_ZN10VConverter5DebugEv_ZTV12VALI5457Card_ZN13VIA3058MOCard5StartEP18tagMODIOINFOSTRUCT_ZN12SIL3052codec13isFrameDetectEv_ZThn16_N6tAdsMC17DoesRequestD3ColdEv_ZN8ICH4Card10DebugQueryEc_ZN10VModemLine10ModemCloseEv_ZN12tSiLabsCodec20CheckForLinePresenceEv_ZN10VICHMOCard6OnTestEv_ZN10V960MOCard8OnResumeEv_ZN12VALI5457Card18GetTransferBuffersERmS0_S0_S0__ZN11RTL8197Card6InitHwEv_ZThn100_N11VNVidiaCardD1Ev_ZN10SL2800Card9OnSuspendEv_ZN12tSiLabsCodec13hasErrorInDAAEv_ZN17PhilipsDMAChannel6GetPosEii_ZN12VALI5457Card12PlatformNameEv_ZN12SIL3052codec10InitializeEii_ZN6tAdsMC13GetSampleRateEv_ZN6tAmrMo7ReleaseEv_ZN6tAdsMC12GPIORingMaskEv_ZN13ModemInstance11ReportErrorEv_ZN6VQueueD0Ev_ZN14tPhilipsRegSet13wReadIndirectEh_ZN13ModemInstance11OnInterruptEPvm_ZN10VConverterD0Ev_ZN12VALI5457Card8OnResumeEv_ZN15V5457DMAChannel4StopEv_ZN11VSmallQueueD1Evsysdep_memcpy_ZN10SL2800Card18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN10VConverterC1EP20tagAUDIOCLIENTSTRUCTS1_Pc_ZN10VICHMOCard5StartEP18tagMODIOINFOSTRUCT_ZN11RTL8197Card8OnResumeEv_ZN12VALI5457Card5StartEP18tagMODIOINFOSTRUCT_ZN11tModemCodecD0Ev_Z11PMOrderNamem_ZN13VIA3058MOCard9IoControlEP14MTLUSBEXCHANGE_ZN8ICH4Card18GetTransferBuffersERmS0_S0_S0_amrmo_update_status_ZN12tSiLabsCodec12GPIORingMaskEv_ZN12VALI5457Card7IRQTestEv_ZN10SL2800Card15OnRingInterruptEPv_ZN16SL2800DMAChannel28StartBothChannelSimultaneousEv_ZN16tICHPMController10ReadDirectEhRt_ZN17PhilipsDMAChannel8IsActiveEv_ZN10VSISMOCard8CardTestEv_ZN10tAmrMoCard10ModemCloseEv_ZN10VPageBlock18getPhysicalAddressEm_ZTV11SL2800codec_ZN12tSiLabsCodec15setHandsetStateE9eHSXstate_ZN6tAmrMo14OnPTCInterruptEPvhal_setprop_ZN12SIL3052codec16SetSpeakerVolumeEt_ZN10VModemLineC1EmRcFixed_Check_Combination_ZN17VConversionFilter7IsValidEv_Z11IsDateValidv_ZN10VSISMOCard7SetPropEmm_ZN11SL2800codec11SetPGAValueE13tPGADirectionm_ZN14PhilipsPCICardD0Ev_ZN10SL2800Card7OnStartEP18tagMODIOINFOSTRUCT_ZN10VModemLine16SetSpeakerVolumeEi_ZN14PhilipsPCICard18GetTransferBuffersERmS0_S0_S0__ZN10VSISMOCard7IRQTestEv_ZN11tAudioCodecD0Ev_ZN12VALI545ACard16ModifySampleRateEv_ZN8ICH4Card6OnTestEv_ZN10SL2800Card17SetModemInputGainEi_ZThn100_N10VSISMOCardD1Ev_ZN10VICHMOCardD0Evsysdep_sprintf_ZN6tAdsMC12GetCodecTypeEv_ZN10SL2800Card7IRQTestEv_ZN17VConversionFilterD1Ev_ZN10V960MOCard17PowerOffProcedureEt_ZN12VALI545ACard14SetAudioSourceEi_ZN10VSISMOCard26OnTestingHardwareInterruptEv_ZN10tVIARegSet4DumpEv_ZN12SIL3052codec12SetHookStateE10eHookStatei_ZN12VALI545ACard10EnableRingEiRcFixed_Reset_ZN10SL2800Card19SetModemAttenuationEi_ZN10VModemLine13GeneralHookOnEi_ZThn100_N8ICH4Card14ReadACRegisterEtRtRi_ZN7tFramer11StartFramerEPhmS0_m_ZN10VModemLineD1Ev_ZN17RTL8197DMAChannelC1ER13RTL8197RegSetm_ZN11SIL3052Card17CheckDMAInterruptERt_ZN15V5457DMAChannel5ResetEv_ZTV11SIL3052Card_ZN11tModemCodec19FixAfterLineFailureEv_ZN12VALI545ACard18GetTransferBuffersERmS0_S0_S0_hal_delete__cxa_pure_virtual_ZN12SIL3052codec21getSystemSideRevisionEv_ZN6tAmrMoD0Ev_ZN8ICH4Card6OnStopEv_ZN12VALI545ACardD1Ev_ZN11tAudioCodec13WriteRegisterEttsysdep_inw_ZN12VALI5457Card19OnHardwareInterruptEPvm_ZN17SIL3052DMAChannel18SetPhysicalAddressEPvmm_ZN6tAmrMo5dwIRQEv_ZN10SL2800Card38operationRegisterWriteableRegisterTestER12cRegisterSet_ZN11SIL3052Card17StopWatchdogTimerEv_ZN10SL2800Card43saveAndCompareErrorCountersToLastTestResultEiimmRiS0_RmS1__ZThn100_N8ICH4CardD0Ev_ZN11tModemCodec16StopPulseDialingEv_ZN16tVIAPMControllerC2Ev_ZN10V960MOCard10DebugQueryEc_ZN12tSiLabsCodecC2ER11tAbstractDCR14VParametersKey_ZN12VALI545ACard15WriteACRegisterEttRi_ZN10SL2800Card20PCI_CFGwriteableTestER12cRegisterSet_ZN10VSISMOCard7DisableEv_ZN12tSiLabsCodec21updateMOHstateMachineEi_ZN10SL2800Card22InitializePlatformNameEv_ZN12VALI545ACard17SetAudioOutVolumeEi_ZN14PhilipsPCICard14ReadACRegisterEtRtRi_ZN10tAmrMoCard23PrepareForAutomaticTestEv_ZN12SIL3052codecC1ER13SIL3052RegSet_ZN13ModemInstance12DeleteQueuesEv_ZN10SL2800Card16SetAudioInVolumeEi_ZN11SIL3052Card25CheckAndClearDAAInterruptERt_ZN17RTL8197DMAChannel8IsActiveEv_ZN10V960MOCard9IoControlEP14MTLUSBEXCHANGE_ZTV14PhilipsPCICard_ZN14VICHDMAChannel19KeepTransferRunningEv_ZN8ICH4Card7DMATestER14ICH4DMAChannelm_ZN10VICHMOCardD2Ev_ZN10tAmrMoCard8OnResumeEv_ZN6tAdsMC16RingVoltageStateEv_ZN10VICHMOCard17PowerOffProcedureEt_ZN11SIL3052Card12registryInitEv_ZN13SIL3052RegSet4DumpEv_ZN6tAdsMC23SetCurrentRegistersBankEt_ZN6tAmrMo7GetPropEm_ZN8ICH4Card7IRQTestEv_ZThn100_N10V960MOCard15WriteACRegisterEttRi_ZN6tAdsMC8AddDelayEv_ZN13VIA3058MOCard10ModemCloseEv_ZThn16_N6tAdsMC8AddDelayEv_ZN11SIL3052Card19OnDigitPulseDialingEiamrmo_card_interrupt_ZN6tAdsMC25CheckForLineDetectFailureEv_ZN13VSimpleFilterC1Eii_ZN11tAudioCodec12ReadRegisterEtRt_ZN11SIL3052Card14chipsetDetailsERPc_ZN8ICH4Card9SetHookOnEi_ZN8ICH4Card5StartEP18tagMODIOINFOSTRUCT_ZN14PhilipsPCICard10ModemCloseEv_ZN11tModemCodec10InitializeENS_19tInitializationTypeE_ZN12VALI545ACard7GetPropEm_ZN13VIA3058MOCardD1Ev_ZN11RTL8197Card11RingDpcProcEPv_ZN10SL2800Card15TST_CounterTestEv_ZN12VALI545ACard7OnStartEP18tagMODIOINFOSTRUCT_ZN12VALI5457Card19ClearCodecIntStatusEv_ZN10SL2800Card17SetAudioOutVolumeEi_ZN13VIAPCIChannelC1ER10tVIARegSetmamrmo_card_disable_ZN10tAmrMoCard7SetPropEmm_Z9BreakHerevsysdep_cli_ZN10VICHMOCard10DebugQueryEc_ZN10SL2800Card16ModifySampleRateEv_ZN12SIL3052codec13SetSampleRateEm_ZN13ModemInstance12GetModemDataEv_ZN10VICHMOCard7OnStartEP18tagMODIOINFOSTRUCT_ZN11RTL8197Card9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN14PhilipsPCICard19OnHardwareInterruptEPvmbDisableInterrupts_ZN11SIL3052Card25readAndClearDmaINTRstatusEv_ZN12tACLinkCodec15DetectCodecTypeEPPc_ZN14VICHDMAChannelC2ER10tICHRegSetm_ZN12SIL3052codec9hookStateEv_ZN8ICH4Card23CallDuringPTCProcessingEv_ZN10tAmrMoCardD0Ev_ZN13VIA3058MOCard12DevIO_acReadEt_ZN12VALI545ACard17InitializeIOSpaceERiS0__ZN16SL2800DMAChannel24DBG_DownCounterInterruptEv_ZThn100_N10VICHMOCardD1Ev_ZN13ModemInstance13OnCardRemovedEv_ZThn100_N12VALI5457CardD1Ev_ZN10V960MOCard17IsACReadDataReadyEvCounter_ZN13ModemInstanceC2EmPvPFvS0_E_ZN13ModemInstanceD2Ev_ZZN12SL2800RegSet13dwWriteDirectEmmE14previousOffset_ZTV9VTestData_ZN10VICHMOCard12PlatformNameEv_ZN12SIL3054codec10InitializeEN11tModemCodec19tInitializationTypeE_ZN10VICHMOCard7SetPropEmm_ZN14ICH4DMAChannel18SetPhysicalAddressEPvmm_ZN11tAbstractDCD1Ev_ZN15V5457DMAChannel18SetPhysicalAddressEPvmm_ZN10SL2800Card8CardTestEv_ZN10VSISMOCard15WarmResetACLinkEv_ZN13VIA3058MOCardC2Emm_ZN12tSiLabsCodec5SleepEv_ZN12SIL3054codec24DisableManualCalibrationEv_ZN16tVIAPMControllerC1Ev_ZN14PhilipsPCICard11RingDpcProcEPv_ZN12generalCodec21updateMOHstateMachineEi_ZN10VModemLine6OnStopEv_ZN13VIA3058MOCard7DMATestER13VIAPCIChannelmamrmo_card_ctl_ZN10VSISMOCard22OnPowerRequestCompleteEt_ZN12SIL3054codecC1ER11tAbstractDCR14VParametersKey_ZN12SIL3052codec17CalibrationStatusEv_ZN13ModemInstance21SimulateInterruptCallEi_ZN10VICHMOCardC2Emm_ZN12VALI5457Card23CallDuringPTCProcessingEv_ZN10SL2800Card16SetSpeakerVolumeEi_ZN9cRegisterC1Emmmmmm_ZN10SL2800Card11printMemoryEPmm_ZThn16_N6tAdsMC17updateHandsetFlagERt9eHSXstate_ZN14PhilipsPCICard20OnOscillatorSignaledEm_ZN12tSiLabsCodec18setNewMOHmechanismEi_ZN10tAmrMoCard21SaveACStateIfPossibleEv_ZN10VSISMOCard15WriteACRegisterEttRi_ZN8ICH4Card10ModemCloseEv_ZN14VSISDMAChannel5ResetEv_ZN10V960MOCard20IsACReadingAvailableEv_ZN14PhilipsPCICard7GetPropEm_ZN16SL2800DMAChannel15getDmaBlockSizeEv_ZN10tAmrMoCard23CalibrateMaxAcRdWrLoopsEv_ZN12tSiLabsCodec12SetHookStateEii_ZN10SL2800Card16PCIRegistersTestE9eTestType_ZN14PhilipsPCICard8CardTestEv_ZN12VALI545ACard7SetPropEmm_ZN10VConverter4TestEiii_ZN12tSiLabsCodec14CaptureHandsetEi_ZN8ICH4Card9ChangePTCEm_ZN15V5457DMAChannelC1ER11V5457RegSetiLastReadReg_ZN11tModemCodec12GetCodecTypeEvsysdep_save_flags_ZN12VALI5457Card24ValidatePCIConfigurationEv_ZN11SIL3052Card24ValidatePCIConfigurationEv_ZN13VIA3058MOCard7OnStartEP18tagMODIOINFOSTRUCT_ZN12tSiLabsCodec16SetSpeakerVolumeEt_Z11CreateQueueP18tag_QUE_Descriptorimm_ZN10VSISMOCardC2Emm_ZN8ICH4Card7SetPropEmm_ZN10VSISMOCard7OnStartEP18tagMODIOINFOSTRUCT_ZN12VALI5457Card19InitializeRegistersEv_ZN11tModemCodec7GetPropEi_ZN11SL2800codec12SetHookStateE10eHookState_ZN10t960RegSet4DumpEiPmi_ZN6tAmrMoC2Emmm_ZN11tAC97RegSet6acReadEtt_ZN10V960MOCard10EnableRingEi_ZN11RTL8197Card10DebugQueryEc_ZN9VTestDataD1Ev_ZN11RTL8197Card19InitializeRegistersEv_ZN10SL2800Card19OnHardwareInterruptEPvm_ZN16tVIAPMController9IsEnabledEv_ZN11tModemCodec12SetFlashModeEi_ZN10VModemLine6EnableEPK18tagMODIOINFOSTRUCT_Z24ValidateRatesCombinationP18tagMODIOINFOSTRUCTRK8SAMPLING_ZN10V960MOCard14ReadACRegisterEtRtRi_ZN10V960MOCard15IsACWritingDoneEvmemset_ZN10SL2800Card17dumpDMAtestMemoryEv_ZTV8ICH4Card_ZN11SIL3052Card6InitHwEv_ZN10VModemLine10EnableRingEi_ZN6tAdsMC12SetHookStateEiiamr_interrupt_ZN10VICHMOCard26OnTestingHardwareInterruptEv_ZN13VSimpleFilterD0Ev_ZN11SL2800codec16RingVoltageStateEv_ZN12SIL3052codec16RingVoltageStateEv_ZN10VICHMOCard8OnResumeEv_ZThn16_N14tBadModemCodec15GetCapabilitiesEv_ZN10SL2800Card16setGPIOinterruptE8eControl_ZN13ModemInstance10InitQueuesEv_ZN10DmaTracker22updateLimitAddrPointerEv_ZN14PhilipsPCICard10EnableRingEi_ZN10VICHMOCard23CallDuringPTCProcessingEv_ZN12VALI545ACard12PlatformNameEvRegistersToSave_ZTV12tSiLabsCodec_ZN13VIA3058MOCardD0Ev_ZTV11tAC97RegSet_ZN12tSiLabsCodec19EnableCodecLoopbackEi_ZN15V5457DMAChannel19KeepTransferRunningEv_ZN11SL2800codec12getHookStateEv_ZN10SL2800Card17SetHookHxCidStateEm_ZN12VALI545ACard9IoControlEP14MTLUSBEXCHANGE_ZThn100_N14PhilipsPCICard14ReadACRegisterEtRtRi_ZN12VALI5457Card12DevIO_acReadEt_ZN14t960DmaChannelC1ERPmi_ZN8ICH4Card22OnPowerRequestCompleteEt_ZN6tAmrMo10ModemCloseEv_ZN8ICH4CardD2Ev_ZN13VIA3058MOCard7DisableEv_ZN11VNVidiaCard30WriteModemACRegisterUsingAudioEttRi_ZN10tAmrMoCard19SetModemAttenuationEi_ZN12tACLinkCodec13WriteRegisterEtt_ZN13VIA3058MOCard6InitHwEv_ZN7tFramer9CalibrateEm_ZThn16_N12tSiLabsCodec20CheckForLinePresenceEv_ZN12VALI5457Card17PowerOffProcedureEt_ZN10V960MOCard9OnSuspendEv_ZN13VIAPCIChannel5StartEi_ZN6tAdsMC17DoesRequestD3ColdEv_ZTV13VSimpleFilter_ZN8ICH4Card7OnStartEP18tagMODIOINFOSTRUCT_ZN13VIA3058MOCard18GetTransferBuffersERmS0_S0_S0__ZN14VSISDMAChannel5StartEv_ZN12SIL3052codec19EnableCodecLoopbackEi_ZN10VModemLine9SetHookOnEi_ZN10SL2800Card16PCI_CFGResetTestER12cRegisterSet_ZN9cRegisterC2Emmmmmm_ZN17VConversionFilter4KindEv_ZN11tAbstractDCD0Ev_ZN12tACLinkCodec12ReadRegisterEtRt_ZN12VALI545ACard10ModemCloseEv_ZN8ICH4Card8CardTestEv_ZThn100_N12VALI5457CardD0Ev_ZN17RTL8197DMAChannel19KeepTransferRunningEv_ZN9VTestDataD0Ev_ZN14VICHDMAChannel5StateEv_ZN11SIL3052Card7SetPropEmm_ZN11RTL8197Card26OnTestingHardwareInterruptEv_ZN14PhilipsPCICard7DMATestER17PhilipsDMAChannelm_ZN12VALI545ACard17PowerOffProcedureEt_ZN14PhilipsPCICard6EnableEPK18tagMODIOINFOSTRUCT_ZN14tBadModemCodec15GetCapabilitiesEv_ZN14tPhilipsRegSet4DumpEv_ZN10VSISMOCard6InitHwEv_ZN11SIL3052Card21OnTest_BothDMAchannelEv_ZN13VIAPCIChannelC2ER10tVIARegSetm_ZN11SIL3052Card6EnableEPK18tagMODIOINFOSTRUCT_ZN10VSISMOCard5StartEP18tagMODIOINFOSTRUCT_ZN13VIA3058MOCard26OnTestingHardwareInterruptEv_ZN10SL2800Card7SetPropEmm_ZN6tAdsMC18setNewMOHmechanismEi_ZN12SIL3052codec12SetFlashModeEi_ZN14tBadModemCodec12SetHookStateEii_ZN17RTL8197DMAChannelC2ER13RTL8197RegSetm_ZN8ICH4Card14ReadACRegisterEtRtRisysdep_pci_read_config_word_ZN10tAmrMoCardC1Emmm_ZN10V960MOCard26OnTestingHardwareInterruptEv_ZN10VModemLine5StartEP18tagMODIOINFOSTRUCT_ZN12generalCodec17DoesRequestD3ColdEv_ZN10V960MOCard9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN10V960MOCardD1Ev_ZN10VICHMOCard20OnOscillatorSignaledEm_ZN12VALI5457Card9SetHookOnEi_ZN10ICH4RegSet20ClearInterruptStatusEP11tModemCodec_ZN10V960MOCard19OnHardwareInterruptEPvm_ZN10SL2800Card24ValidatePCIConfigurationEv_Z13PutLeftStereoPtPvm_ZTV10V960MOCard_ZN17SIL3052DMAChannel5StateEv_ZN8ICH4Card19OnHardwareInterruptEPvm_ZN10SL2800CardC2Emm_ZN13VIA3058MOCard6OnStopEv_ZN14tBadModemCodec12GetHookStateEv_ZN11VNVidiaCard24GpioStatusRingbitCleanupEv_ZN10tAmrMoCard13GetAudioCodecEv_ZN10tAmrMoCard19OnDigitPulseDialingEi_ZN10SL2800Card20OnOscillatorSignaledEm_ZN11VNVidiaCard20RingDetectDmaInStartEv_ZN10SL2800Card19ProcessHardwareLockEv_ZN16SL2800DMAChannelC2ERVPmmR12SL2800RegSet_ZN14t960DmaChannel5StartEi_ZN10VModemLine7SetPropEmm_ZN11RTL8197Card6OnTestEv_ZN10SL2800Card25checkPtcDataInDMAINbufferEv_ZTV10VConverter_ZN10V960MOCard9EnableCIDEi_ZN10V960MOCard20OnOscillatorSignaledEm_ZN11tModemCodec10FixGPIOBitEv_ZN12SIL3052codec20initLineSideRegisterEv_ZN12VALI545ACard23CalibrateMaxAcRdWrLoopsEv_ZN10tICHRegSet10InitializeEm_ZN12VALI5457CardD1Ev_ZN6tAmrMoD2Ev_ZN14tBadModemCodec13GetSampleRateEv_ZN11SIL3052Card8OnResumeEv_ZN12SIL3054codec20ClearInterruptStatusEv_ZN13ModemInstance10EnableRingEm_ZN10VICHMOCard18SetupCodecForModioEPK18tagMODIOINFOSTRUCT_ZN11SIL3052Card23CallDuringPTCProcessingEv_ZN10VConverterD2Ev_ZN12VALI545ACard6OnStopEv_ZN14PhilipsPCICard9IoControlEP14MTLUSBEXCHANGE_ZN10VSISMOCard12PlatformNameEv_ZN10VConverter3PutEPvm_ZN13VIA3058MOCard7GetPropEm_ZN10VSISMOCard19IsAudioDriverActiveEv_ZTV10SL2800Card_ZN12VALI5457Card6EnableEPK18tagMODIOINFOSTRUCT_ZN10V960MOCard7DisableEv_ZN10VPageBlockC2Em_ZN10SL2800Card9SetHookOnEi_ZN12generalCodec8AddDelayEv_ZN13ModemInstance4ReadEPtt_ZN11tModemCodec16StopLockSequenceEv_ZN13VIA3058MOCard14ReadACRegisterEtRtRi_ZN10V960MOCard6OnStopEv_ZTV13ModemInstance_ZN10V960MOCard9GetACDataEv_ZN11VSmallQueueC1Em_ZN11RTL8197Card20OnOscillatorSignaledEm_ZN11VNVidiaCard14ReadACRegisterEtRtRi_ZN12VALI5457Card17ForcePrimaryCodecEi_ZTV14tAbstractAMRDCamrmo_card_create_ZN10V960MOCard10ModemCloseEv_ZN16SL2800DMAChannel6GetPosEii_ZN10VICHMOCard17InitializeIOSpaceERiS0__ZN12tSiLabsCodec12GetCodecTypeEv_ZThn100_N13VIA3058MOCard14ReadACRegisterEtRtRi_ZN10VModemLineC2Em_ZN13VIA3058MOCard20OnOscillatorSignaledEm_ZN13RTL8197RegSet4DumpEv_ZN12SIL3054codec23MeasureLoopCurrentSenseEv_Z7GetMonoPvPtm_ZN11V5457RegSet20ClearInterruptStatusEP11tModemCodecLastWriteReg_ZN14PhilipsPCICard6OnStopEv_ZN10SL2800Card32TST_FrequencyGenerationByOutputsEv_ZN12VALI545ACardC2Emm_ZN11SIL3052Card17PowerOffProcedureEt_ZN15V5457DMAChannel5StateEv_ZN15V5457DMAChannel5StartEv_ZN14tBadModemCodec13SetSampleRateEt_ZN10V960MOCard9SetHookOnEi_ZN14PhilipsPCICardD2Ev_ZN8ICH4CardC2Emm_ZN16VInterruptTracerC1EPc_ZN6tAdsMCC1ER11tAbstractDCR14VParametersKey_ZN11RTL8197Card6EnableEPK18tagMODIOINFOSTRUCT_ZN11tModemCodec15ReadNextLockBitEvsysdep_free_ZN11tModemCodec19EnableCodecLoopbackEi_ZN12VALI545ACard6EnableEPK18tagMODIOINFOSTRUCT_ZN10VModemLine9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN11SL2800codec15setHandsetStateE9eHSXstate_ZN10VSISMOCard19InitializeRegistersEv_ZN11RTL8197Card19ClearCodecIntStatusEv_ZN11SL2800codec5resetEv_ZN10VSISMOCardD0Ev_ZN8ICH4Card10EnableRingEi_ZN10SL2800Card24getAlignmentMemoryOffsetEmm_ZN13VIA3058MOCard7SetPropEmm_Z14GetRightStereoPvPtm_ZN16VInterruptTracer4InitEmm_ZN10VModemLine16IsHandsetOffHookEv_ZN10VConverter16StartProcessDataEv_ZN11RTL8197CardC1Emm_ZN17VConversionFilter4InitEiiii_ZN10SL2800Card26OnTestingHardwareInterruptEv_ZN14ICH4DMAChannel5StateEv_ZN10SL2800Card19OnDigitPulseDialingEi_ZN13ModemInstance16ReallyCloseModioEv_ZN10SL2800Card13DumpRegistersEv_ZN10V960MOCardC2Emm_ZN13VIA3058MOCard15WriteACRegisterEttRi_ZN14PhilipsPCICard12PlatformNameEv_ZN13VIA3058MOCard19InitializeRegistersEv_ZN10SL2800Card6EnableEPK18tagMODIOINFOSTRUCT_ZN10tAmrMoCard11IsDateValidEv_ZN14ICH4DMAChannelC2ER10ICH4RegSetm_ZN17RTL8197DMAChannel5ResetEv_ZN13ModemInstance4HookEm_ZN10V960MOCard11WriteACDataEtt_ZN11tModemCodec16RingVoltageStateEv_ZN11SIL3052Card14ConnectSpeakerEi_ZN10SL2800Card10ModemCloseEvamrmo_card_stop_ZN11VNVidiaCardC1Emm_ZN13tLineDetectorC2EP12generalCodecm_ZN11VNVidiaCard10ModemCloseEv_ZN13VIAPCIChannel5StateEv_ZN6tAdsMC15setHandsetStateE9eHSXstate_ZN8ICH4Card7DisableEv_ZN6tAdsMC19EnableRingDetectionEi_ZN8ICH4Card9EnableCIDEi_ZN12tSiLabsCodec19FixAfterLineFailureEv_ZN11SIL3052Card8CardTestEv_ZN6tAdsMC20ClearInterruptStatusEv_ZN14VSISDMAChannel18SetPhysicalAddressEPvmm_ZN10V960MOCardC1Emm_ZN11RTL8197Card14ReadACRegisterEtRtRi_ZN6VQueueC1EPvm_ZN7VFilter7IsValidEv_ZN6tAdsMC21EnableDigitalLoopbackEi_ZN10VICHMOCard15WriteACRegisterEttRi_ZN10VModemLine16AdjustPowerStateEi_ZN10tAmrMoCard15OnRingInterruptEPv_ZTV6tAdsMC_ZN13VSimpleFilter7IsValidEv_ZN10SL2800Card9enablePWMEv_ZN10SL2800Card18GetTransferBuffersERmS0_S0_S0__ZN10SL2800Card31TST_GPIOinterruptHookToggleTestEv_ZN11VNVidiaCardD2Ev_ZN10tAmrMoCard9ModemOpenEP14VModioHWClientRP17VVirtualModioCardsysdep_strlen_ZThn16_N12SIL3054codec17updateHandsetFlagERt9eHSXstate_ZN10V960MOCard23CheckValidityAudioStateEv_ZN11SIL3052Card17SetModemInputGainEi_ZN14PhilipsPCICard6InitHwEv_ZN12VALI545ACard23CallDuringPTCProcessingEv_ZN14VSISDMAChannel5StateEv_ZN13ModemInstance12ModioInquireEPv_ZN11SIL3052Card19OnHardwareInterruptEPvm_ZN11VNVidiaCard15WriteACRegisterEttRi_ZN11SIL3052CardD0Ev_ZN10VModemLineD0Ev_ZN14VSISDMAChannel19KeepTransferRunningEv_ZN11SIL3052Card7DisableEv_ZN10SL2800Card6InitHwEvsysdep_udelay_Z19IsBadPTCCombinationmm_ZN10tAmrMoCardD2Evsysdep_outw_ZN14ICH4DMAChannel6GetPosEii_ZN14ICH4DMAChannel5ResetEv_ZN11SIL3052Card34getVendorID_usingIndirectPCIaccessEvhal_create_ZN13ModemInstance15ReallyOpenModioEv_ZN10V960MOCard8CardTestEv_ZN13ModemInstance7GetPropEm_ZN6tAdsMC17CalibrationStatusEv_ZN12tACLinkCodec7DetailsERPc_ZN12VALI5457Card7OnStartEP18tagMODIOINFOSTRUCT_ZN14ICH4DMAChannel19KeepTransferRunningEv_ZN12SIL3052codec9CalibrateEm_ZN17VConversionFilterD0Ev_ZThn100_N10V960MOCardD0Ev_ZN11RTL8197Card17InitializeIOSpaceERiS0__ZN11SIL3052Card5StartEP18tagMODIOINFOSTRUCT_ZN10VSISMOCard23CallDuringPTCProcessingEv_ZN11tModemCodec10InitializeEv_ZN11RTL8197Card12DevIO_acReadEt_ZN13VIAPCIChannel18SetPhysicalAddressEPvmm_ZN11RTL8197Card8CardTestEv_ZN12SIL3054codec17CalibrationStatusEv_ZN8ICH4Card6InitHwEv_Z16WritePCIRegistermmmmm_ZN12tSiLabsCodec9CalibrateEm_ZN14tPhilipsRegSet14wWriteIndirectEht_ZN10VConverter12CreateFilterEim_ZTV12tACLinkCodec_Z11DeleteQueueP18tag_QUE_Descriptor_ZN10VModemLine7DisableEv_ZN10tAmrMoCardD1Ev_ZN11V5457RegSet17CheckDMAInterruptEm_ZN13VIA3058MOCard11SelectCodecEv_ZN11SIL3052Card12SetFlashModeEi_ZN10V960MOCard13DevIO_acWriteEtt_ZN12VALI545ACard9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN11RTL8197Card9ChangePTCEm_ZN7VFilterD1Ev_ZN11SIL3052Card26OnTestingHardwareInterruptEv_ZN12VALI545ACard10DebugQueryEc_ZThn100_N11RTL8197CardD1Ev_ZN6tAdsMC15GetCapabilitiesEv_ZN14tBadModemCodec19TestUniqueRegistersERi_ZN14PhilipsPCICardC1Emm_ZN10VSISMOCard20OnOscillatorSignaledEm_ZN10SL2800Card5StartEP18tagMODIOINFOSTRUCT_ZThn100_N10tAmrMoCardD0Ev_ZN10VModemLine19OnDigitPulseDialingEi_ZN10V960MOCard15ResetDCIfNeededEv_ZN12tSiLabsCodec26ShallIClearInterruptStatusEv_ZN12tSiLabsCodec37MakeSureDCTermiationTypeIsNotJapaneseEv_ZN15V5457DMAChannelC2ER11V5457RegSeti_ZN11SIL3052Card10DebugQueryEc_ZN17RTL8197DMAChannel9DumpTableEv_ZN10VModemLine7OnStartEP18tagMODIOINFOSTRUCT_ZN6tAdsMCD0Ev_ZN14PhilipsPCICard10DebugQueryEc_ZN11SIL3052Card9ChangePTCEm_ZN12tSiLabsCodec17StartLockSequenceEv_ZTV11VNVidiaCard_ZN12VALI5457Card9IoControlEP14MTLUSBEXCHANGE_ZN12SIL3052codec19EnableRingDetectionEi_ZN11SIL3052Card12PlatformNameEv_ZN8ICH4CardC1Emm_ZN14PhilipsPCICard23CallDuringPTCProcessingEv_ZN17SIL3052DMAChannel4StopEvamrmo_card_write_ZN11SIL3052Card17SetHookHxCidStateEm_ZN11SIL3052Card12EnableDAAIntEisysdep_malloc_ZN13VIAPCIChannel8IsActiveEv_ZN11RTL8197Card9IoControlEP14MTLUSBEXCHANGE_ZN11RTL8197Card17PowerOffProcedureEt_ZN10V960MOCard7OnStartEP18tagMODIOINFOSTRUCT_ZN12VALI545ACard19SetModemAttenuationEi_ZN10VICHMOCard9ChangePTCEm_ZN10SL2800Card12PlatformNameEv_ZN10tAmrMoCard20SetCountryParametersEm_ZN14tPhilipsRegSet9DmaIOBaseEhi_ZN10SL2800Card10EnableRingEi_ZTV17VOscillatorClient_ZN11RTL8197Card7DisableEv_ZN12VALI545ACard17SetHookHxCidStateEm_ZN11RTL8197Card23CallDuringPTCProcessingEvsysdep_strcmp_ZThn100_N10V960MOCardD1Ev_ZN15V5457DMAChannel9DumpTableEv_ZThn100_N10tAmrMoCardD1EvRcFixed_Delete_ZN11SL2800codecC2ERVPmR12SL2800RegSet_ZN13ModemInstance4StopEv_ZN12tSiLabsCodec15ReadNextLockBitEv_ZThn100_N8ICH4CardD1Ev_ZN11RTL8197Card22OnPowerRequestCompleteEt_ZN10VSISMOCard19OnHardwareInterruptEPvm_ZN12VALI5457CardC2Emm_ZN13VIA3058MOCard19OnHardwareInterruptEPvm_ZThn100_N8ICH4Card15WriteACRegisterEttRi_ZN14PhilipsPCICard5StartEP18tagMODIOINFOSTRUCT_ZN10VModemLine9OnSuspendEv_ZN10tAmrMoCard12DevIO_acReadEt_ZN12VALI545ACard11RingDpcProcEPv_ZN11tModemCodec9CalibrateEm_ZN11RTL8197Card19OnHardwareInterruptEPvm_ZN10SL2800Card16DataTransferTestEvamrmo_card_start_ZN12VALI545ACardD0Ev_ZThn16_N6tAdsMC15GetCapabilitiesEv_ZN6tAmrMoD1Ev_ZN6tAdsMC7SetPropEim_ZN12SIL3054codec12SetHookStateEii_ZN10tAmrMoCard13OnVirtualIRETEPvm_ZN11SIL3052Card17InitializeIOSpaceEv_ZN12generalCodec17updateHandsetFlagERt9eHSXstate_ZN10V960MOCard18GetTransferBuffersERmS0_S0_S0__ZN10tAmrMoCardC2Emmm_ZN16tICHPMController11WriteDirectEht_ZTV10VModemLine_ZN16tICHPMController15IsWakeUpEnabledEv_ZN10SL2800Card21TST_RingInterruptTestEv_ZThn100_N14PhilipsPCICardD0Ev_ZN10SL2800Card7DisableEv_ZThn100_N11RTL8197CardD0Ev_ZTV14VModioHWClient_ZN10VConverterC2EP20tagAUDIOCLIENTSTRUCTS1_Pc_ZN13VSimpleFilterC2Eii_ZN10SL2800CardD0Ev_ZN10VConverter11CreatePipesEimm_ZN10SL2800Card18copyMemoryToBufferEPmmS0__ZN12VALI5457Card10EnableRingEi_ZN11SIL3052Card22InitializePlatformNameEv_ZN10tAmrMoCard14OnPTCInterruptEPv_ZN12VALI5457Card6InitHwEv_ZN11SIL3052Card17SetAudioOutVolumeEi_ZN10VSISMOCard9ChangePTCEm_ZN10VConverter5ResetEm_ZN11VNVidiaCardD1Ev_ZN6VQueue4readEPvmi_ZN16SL2800DMAChannel18SetOnTheFlyPTCsizeEi_ZN11SIL3052Card11RingDpcProcEPv_ZN12SIL3052codec20CheckForLinePresenceEv_ZN11tModemCodec12GPIORingMaskEv_ZN11tModemCodec17CalibrationStatusEv_ZN13VVirtualQueueD1Ev_ZN11VNVidiaCard17DirtyNVWorkaroundEv_ZN6tAdsMC7GetPropEi_ZN10VSISMOCard6OnStopEv_ZN12SIL3052codec17StartPulseDialingEv_ZN12VALI5457Card10DebugQueryEc_ZN13tLineDetector6EnableEm_ZN10V960MOCard26RestoreLastValidAudioStateEv_ZN12VALI545ACard10PtcDpcProcEPvsysdep_pci_read_config_byte_ZN10SL2800Card19clearStatusRegisterEv_ZN8ICH4CardD1Ev_ZN10V960MOCard25LoadW2KRegistryParametersEv_ZN11SIL3052Card14OnPTCInterruptEPv_ZN6tAdsMC19TestUniqueRegistersERi_ZN7tICHLPC4ReadEv_ZN10VModemLine12HandsetCloseEv_ZN11SIL3052Card9EnableCIDEi_ZThn100_N13VIA3058MOCard15WriteACRegisterEttRi_ZN7VFilterC1Ev_ZN17PhilipsDMAChannel5ResetEv_ZN13VIAPCIChannel6ResumeEv_ZN14VSISDMAChannel4StopEvsysdep_free_pages_ZN13VIA3058MOCard10PtcDpcProcEPv_ZN12VALI545ACard13OnVirtualIRETEPvm_ZN10VSISMOCard9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN14PhilipsPCICard8OnResumeEvaAC97Mixer_Z15ReadPCIRegistermmmm_ZN17PhilipsDMAChannelC1ER14tPhilipsRegSetmi_ZN11RTL8197Card5StartEP18tagMODIOINFOSTRUCT_ZN12VALI545ACard19ClearCodecIntStatusEv_ZThn16_N6tAdsMC18setNewMOHmechanismEi_ZN11tAC97RegSet10InitializeEv_ZN11RTL8197Card9EnableCIDEi_ZN16tVIAPMController11ClearStatusEv_ZN11SIL3052Card19ClearCodecIntStatusEv_ZN10VModemLine7ReleaseEv_ZN13VIA3058MOCard7IRQTestEv_ZN12VALI545ACard24ValidatePCIConfigurationEv_Z6GetQueP18tag_QUE_DescriptorPhti_ZN13ModemInstanceD1Ev_ZN14PhilipsPCICard6OnTestEv_ZN11SIL3052Card22DMATest_BothDMAchannelER17SIL3052DMAChannelS1_P9VTestDataS3_m_ZN12tSiLabsCodec25CheckForLineDetectFailureEv_ZTV12VALI545ACard_ZN13VIA3058MOCard17InitializeIOSpaceERiS0__ZN12tSiLabsCodec24DisableManualCalibrationEv_Z17CalculateSamplingP8SAMPLINGS0__ZN11SL2800codec13GetSampleRateEv_ZN13VIAPCIChannel6GetPosEii_ZN10tAmrMoCard19ProcessHardwareLockEv_ZN8ICH4Card11RingDpcProcEPv_ZN13VSimpleFilter4PumpEPvS0__ZThn100_N10VSISMOCard15WriteACRegisterEttRi_ZN11tModemCodec17StartLockSequenceEv_ZN12VALI545ACard14ConnectSpeakerEi_ZTV12generalCodec_ZN10tVIARegSet10InitializeEm_ZN11RTL8197CardC2Emm_ZN11tModemCodec23MeasureLoopCurrentSenseEv_ZN12VALI545ACard5StartEP18tagMODIOINFOSTRUCT_ZN10tAmrMoCard18ResetLockVariablesEv_ZN13VIA3058MOCardC1Emm_ZTV17VConversionFilter_ZN10tAmrMoCard9IoControlEP14MTLUSBEXCHANGEsysdep_pci_write_config_dword_ZN12VALI545ACard8OnResumeEv_ZN10VSISMOCard7DMATestER14VSISDMAChannelm_ZN10VICHMOCard7DMATestER14VICHDMAChannelm_ZN10VPageBlockD1Ev_ZN10VConverterD1Ev_ZN10VICHMOCard18GetTransferBuffersERmS0_S0_S0__ZN12generalCodecC1Ev_ZN10SL2800Card7GetPropEm_ZN6tAdsMC10InitializeEN11tModemCodec19tInitializationTypeE_ZN11SIL3052Card20ProcessPTCInterruptsEiPv_ZN10VConverter7IsValidEv_ZN17PhilipsDMAChannel5StateEv_ZN11tModemCodec17IsConcurrentCodecEv_ZN10t960RegSet10InitializeEm_ZThn16_N12tSiLabsCodec18setNewMOHmechanismEi_ZN11SIL3052Card32getVendorID_usingDirectPCIaccessEv_ZN12VALI545ACard9ChangePTCEm_ZN12VALI5457Card9OnSuspendEv_ZN11V5457RegSet4DumpEv_ZN14t960DmaChannel18SetPhysicalAddressEPvmm_ZN12VALI545ACard15SetHandsetStateE9eHSXstate_ZN11SIL3052Card16RunWatchdogTimerEv_ZN6tAdsMCD1Ev_ZN10tAmrMoCard17CreateCodecObjectEPKctR14VParametersKey_ZN11SIL3052Card19ProcessHardwareLockEv_ZN6tAmrMo20ReadPCIConfigurationEt_ZN6tAdsMC23GetCurrentRegistersBankEv_ZN13ModemInstance12CanChangePTCEP8SAMPLING_ZN11RTL8197Card7SetPropEmm_ZN11SIL3052CardC2Emm_ZN12generalCodecC2Ev_ZN11SIL3052Card7DMATestER17SIL3052DMAChannelm_ZN14VSISDMAChannel8IsActiveEv_ZN12VALI5457CardD0Ev_ZN11SL2800codec9powerDownEv_ZN11tModemCodec26ShallIClearInterruptStatusEv_ZN11VNVidiaCard19RingDetectDmaInStopEv_ZN12VALI545ACard7DisableEv_ZN13VIA3058MOCard9ChangePTCEmnSaveDebLevel_ZThn16_N12SIL3054codec15setHandsetStateE9eHSXstate_ZN10VSISMOCard20DoALCCodecWorkaroundEv_ZN10V960MOCard5StartEP18tagMODIOINFOSTRUCT_ZN12VALI5457Card9ModemOpenEP14VModioHWClientRP17VVirtualModioCard_ZN11SIL3052Card31CheckAndClearPCIWatchdogExpiredEv_ZN12SIL3052codec7PowerUpEvsysdep_dmesg_printRcFixed_Create_ZN10SL2800Card27OnStressTest_BothDMAchannelERm_ZN10tAmrMoCard5StartEP18tagMODIOINFOSTRUCT_ZN13VIA3058MOCardD2EvSaveRegs_ZN11tModemCodec13GetSampleRateEv_ZThn100_N13VIA3058MOCardD0Ev_ZN10V960MOCard19InitializeRegistersEv_ZN10DmaTracker25calculateOmittedInterruptEmi_ZN16tVIAPMController13DisableWakeUpEv_ZN12VALI5457Card10ModemCloseEvamr_create_ZN11SL2800codec7getGainE9eGainPath_ZN13ModemInstance23CleanOutputBufferOnStopEv_ZN14VSISDMAChannelC1ER10tSISRegSetm_Z6PutQueP18tag_QUE_DescriptorPhti_ZN14PhilipsPCICard7SetPropEmm_ZN12SIL3052codec20SetCountryParametersEm_ZN14VSISDMAChannelC2ER10tSISRegSetm%1%QfEnwE%&E+S%aIsEx%C(EEJs%%IENnE*%@E%+E0K%Zy EE%EEE:nEEkCt%Erf&:K_jpUvC)=Nbgz%E0% H# ] 0c %j  H       t   E H %  0 e l |   E    ! %6 V j Hs y %  H    % , < V w E     % *H39%PdHm__nEn E_(_0BP]__nEnE__#?_M_UinqEnE0)C f6f<%u%%%%z0f1EzJ0^f|%EfB%UoEHEHE%z0f#@fJ%Vqff%HEHEE Hyz0z0f*8 % %5%J%y%z0ff H%;HDZHcsExEfi3QVrfz0f![1g%|z0fE%X%E%HHN:Not% # } % H   H  %  %&!tC!%Q!H\!l!Hq!}!H!!!!!">"%w"E|"""#E#zJ#0^#fy####z#0#f## $5$$V$V%K%%b%k%%&H%&g&Rm&%&H&&. 'z'0&'fC'K'h'zm'0'f'R'%'H'=(VU(t(((7)VS)a)}))))*z*0*f7*?*u*%*z*0*f****=+W+9++%+++z+0+f,$,4,H9,H,EM,Z,z_,0,,%,E,,z,0,,%,E,,-95-;-%W-E\-aE7]!Y!""K-i----%-H-.1.7.%r.Hw...V.%/E/?/zD/0U/Vm/u///V/z/0 0V!0-0P0w0V00%111H61o1f11z101V111>2Vn2V2z202V22X3V33f!4f>4V4v44%4H444z40 5f"5*5Y5%x5%55f55E55H56z6096666N7%737t87s77777%77X788%s88%8E88E88X8E8#9X.9E3999%T9E]99%99J990:z5:0[:;H$;; ;;;%%<H*<I< < =  ==#=+=(q=4=4=E== > >&>%=>>>H>>%>>H>U? [?`?s?{?(?4?4@E8@K@]@p@v@%@@AH AA%.ABAHKAAAAA_A_AAnAEBn BEB_(B_0BBBPB]BB_B_BBnBEBnBEB_B_BCCC?C_MC_UCiCnqCECnCEC0C DC-Df@DfFD%gD%zDzD0DfDDDDEf/E%BEzGE0XEfEEEfE%EzE0Ef FF-Ff6FQF|FfF:F%F%FzF0Gf0G8GMGfWG%aGEfG}GfG%GzG0GfGGGfH%Hf[H%HHEHEIHIIE6IPIjIIII%IHII%IHIJH J3JH8JDJEIJUJEZJfJHkJwJH|JJEJEJHJJEJEJNKSKzK0KfKKKLzL0.LfVLdLrLHzLHLzL0LLLXMM%M%M%M%2N%ENzJN0[NfNNNNNfNHNOHO2OH;OKOEPO`OEeOO O HPiPPV>QmQ QQQfRcRR'RzR0RfRR SKS1~SzS0SfSSSFTcTiT%TTET4U%U%UEUU%VH V#VH,VV"WDWXWzWWWQWWX%$X:XWXX%XHXXXHYY%Y/Y%VYQfYHkYtYHyYYYYYZ.Z%gZElZZ ZZ[_[zd[0u[f[[[[z[0[f\ \F\t\\\]VR]V]]^b)^b^%^H^^R^%_H_q_._z_0_f___z_0`f$`R*`%G`HL``V3aVaaVGbbSb'bzb0bf,c4clcfrc%czc0cfcccc dzd0dfJdVdgd%dd%dzd0df ee(ez-e0>efferexe%eze0eef)fz.f0?ffjfvf|f%fEffEffff%fffEf gHg*g6gMgzRg0cgfggg%gEgggEggzh0h#h%2hS~ E~ Y~Ey~E~~~~~%(H17%NbHk   __nEn E_(_0B P ] __nEĀǹEڀ__  # ?_M_UinqEnECǁaՁ% +Ngx%(=d%H-CJSEaE z0/7lz;;[%p%%%Ɇ%؆z݆0fLf[H`vHHEÇEȇiRsfz%8%E%ŋHʋH}Ό3Ja{ˍ "C1d`$8Z8ȏݏ%*G%HސH% C%A8ZjHoxE}YC'D%yEKœ V_VC˔ b08mF/NmV/R%ɕHΕ<RB%iHn%Hx%˗HЗmߘ>%LHQe%uHϚ%E7Qj%ԛڛ%EE&7%Sds%9EȜ9לEܜaE=RCёɒђ]$.-%B%HEEE-3%wH|О%IHNz%EEE%ğ˟Eןݟ%E Gc%ĠEɠ&L%١H%Qs*ۢ*@az0Yz^0vz0z0 2TzY0rեff HzM0epڦ%f 'E05%COzT0lxE%ΧHקܧ%lz0)%,1lC%Īܪv%lz%EEvɫEΫv'E,2%MEVt%Jɬ z%0K Hu%H95%Hΰz0KZ%l%%H±ݱ%H-%JHSfHoH BE EGCd%uEzC)%1EW%rH{%H%E%%H'z%E>T 2c o½ ʽFZsfmÿ Ͽ" *FU%ho E% %2?G ZE_{% E%1SEnt%E{C%E(w%EC5%QEVz09z>0X+E0OE[9z0 fG`EE%%H4z0Jc%HEE[E`xE%7O9l%z%HE%PEdEqEEEE%%>%%E'H,GEPE]EfEqHv|%E%:%&EN:%: %6H;bEm}EH%E0E5[E`pHu%E?%m%HH]zb0z0OzT0z%H%z0!H&Y%v%z0H"E'K{V5z:0`o%}H%z0H%%E%%%-2z70SjEoEH%Ec%H(G%HE-2?^z0PzU0tz07z<0]z0JfrfVV%H"PzU0ff%%%5f@HEQfHoEE#%5G]TE]sBH% E%H 6z;0Gf{f%H!NzS0_f LSc,,V%(H17%NbHk ,#,GVSfx%H%H "0=__m_unEnE___-_5DnLEdnlEz____ nE$n,Ec9Xk9%9Ag9sCCb a9f%H91%CHHTHYd%rHw!%1;\HeFiZ=[V|f.!G`91!5[%99&E=K%`EeqHv"ZT%E%H__Z%Z #%H%% Z@ZQg%tFZHHHZ Z%F(E-CHH\YpZ%7E<s% E5VV[b%E%EF% E%F.4%>EDFMS%aEgFpv%EF%EF%FEWR]%HR %) H. q V V % H$ 0 %^ Hc   ( T V  V V 8 i   % E Z  V  V/z0Yz^0VCg9%E%E$;hn%|E%EH%XEaElEq%EYr9z0z0%%3E8OzT0v|%EK%E %%3H8E%-}.FEMEu%H%RHWff%ER%H V:VwVV #%/E6EAHFVV%E&E1H6\%oExVV3%?EFEQHVVVz09!%INZ%m!%%}%EEmE;mFEKQ%lEu%J@ zE 0k +!H4!!Z!!"%5"H:"Y"Z"ZL#Va#Vy#V####$%8$%E$U$f`$h$Eq$$E$$%4%E=%EO%ET%%D%%%H%%%%%E%E&H &&z&0&&&&'?'[''z'0'''(*(G(d(( (((()c)v))))%))H))% **H'*U* `*****#+6+H+[+a+%++H++%++H++, ,/,_=,_E,T,n\,Et,n|,E,_,_,,,,,_,_--n-E4-n<-EJ-_X-_`-r----_-_--n-E-n-E.%/.z4.0H.fc.k.s.zx.0.f.....E.y/z~/0////z/0/)0fK0zP00d0f000z000f000z001f.161H1zM10a1f1f11z2021292M2f_2zd20x2f222k2k22z202f3z!30@333%4%)4%?4%r4%4H444E44E44E45E 535F55ip666%6z606f77 7z%7097fW7d7i77777V8f 8E8g88f8z808f889z 90!9fE90Z9#9C9f9f9%9%:z:0/:fN:V:^:zc:0:f:::::;/;fX;:^;%t;;%;%;;<1<E6<_<Hd<p<Eu<<H<<f<H<=>%j>%>H>>%>%>E>>H>_???u?@uO@x@@@@%@@@QA%cAHhAAAHAA%A=A%ABH BBHB,BY@B=BBB%CE C8C@CwCCVCDbDsDD9DfDzD0DD%$E1SEE\EdE1tEEEE9EfFzF04FUFFVFVG=[GGbGG%,HH5HwHR}H%HHHIR"I%IIHNIIVJ%Jx4JH9JRJXJ%iJ6sJxJHJJVJ%JKHKsKVK%K6KK6L6LxLH+LVLV`L%}LLHLL%Mf3Mz8M0LMfiMqMyMz~M0MMMMMNf`NzeN0NN%NNNzN0NNOO!OCOXO9^O%rO}OHOOzO0OfOzO0OO PP*P9FPf\PfkPHpPPzP0PP%PfPPQzQ0)QfDQLQQQbQvQz{Q0QfQQEQQEQRRf!R%GRHLRRDR%RRfR%RHRRHS6SRSflS%wSSESESESESESHSSSfTz T0TfMB=aBYCC:DI.RSTTT%UHU%UAUGU%UHUUUfU"V%AV%KVEPVeVEjVVzV0VVVVVWV=WzHW0YWVqW}WWWVW X%mXXHXXVXzX0XVY Y'YVnYVYVYzY0YV ZZZVZZz[0)[[[[u[%[#\(\c\\\\=\%\\\] ]%c]q]%]E]]E]]]E]^^E#^)^%D^EM^t^%^^J^^ _z%_0K_ `H`u`l```%aHa9alal*bObfibVbVbb8cc%c%ccfccEccHc!dXd cddddde$e6eIeOe%feCweCeeHee%eeHe(f 3fpfwfffffggg%6gCGgCagugH~gg%ggHggggh$hn,hEDhnLhEThthhhhhnhEhnhEhi,i3iOikinsiEiniEij-jGj9jj%j%jj%k9k%Ck9Hkakk9kkkk%kEkkH lEllE lHlCZlCllxllfl%m m!m5mQmtmfmmfm%m%mHmmHmmnHnnn%nnoHooi1pC8pCppfpV7q^qqqrErkr9rzr0rrsf4sKsfks|ss9s1s t%tEt%t%4tbt|t9t%tEtt%tzt0tuE uuH'uuv%jvEovwv%vHvwww~ww~+xz0x0Gxfxxfxxx?ywyyyy%yyzaz%szHxzz%zLz%z{{H{'{H,{8{H={U{r{z{Y{L{f{|(|E|%||E|||}5}}V}V}L~LK~~b~~u~u7R=%iHnR% HRfuf%H7fZf΁%؁E%&H+%Pfr%|EEfVp9v%~ĄτHԄ%f%E%?9E%gEnwE4%BEG[H`k%%9ч% %z$0<f`hm~%Έ9Ԉ%9%%6g9m%{H%HƉω9 %H$%DfOETEHE̊%ߊz0f -2>P%l9%؋HHf!E&2E7HzM0ou%EHόfڌEߌH z%0<Oz0ˍ#)%C%YH9Ύ%9EEYhCz0ŏC֏Cz8nfuzz4Pzkzޑ)CGCVCdCozt0Cz0ђْC%C HIkՓf#Cc{VzzΔԔ%ޔE 7ǕCciEiEiTjlluxu u_v{L{.!tgӖEE3ESE%ZEcz%E&ܚf V-Ofқ%E %8%CRf]eEnfEȜEJa{%˝EНz09ў~%9>L%şݟ%m{%EEʠEϠ#.E39%TE]%Jơ١0z50[̢%֢Hۢ4QDHVDѤDDu åӥwwE:M_rx%Hæ%ڦH% 0lswwE"(%PdHms%HD?DcDDD)DB\c__nEĪn̪Eڪ__?_M_UdnlEnE__«Ыݫ_ _)n1EDnLEv%9̬9C99%0<%Kb9h%EEíEȭԭE٭C%$H)<CY(u{EE8z=0\d5\%n%%%Of4H=SH\lEqEfiٲc3QVrf:_c%%IENi%wH|H.Kfs5{fжf,PKaPuV1Էzfٸf 'P;[Pȹ<ݹc%c*G%H޺cH% %F<VH[dHi|Y%HĻc1N%E FVcVTVV Obi}%ܿH'R-%YH^R%HyV(( DVnV(fV%H(VbV%5%EHv"93M9^t99E9 9+J9Yfof%9E @zE0\o!E׳,>ټ׽.TfVzVffV6VOrVV :`f%H%CHHV%E'GVV%]qHvVV>VnVVV?fUpV%f%2V`%|%E%EVE% VE$%FMEYf%tHyEHV@z059QP%<c9?%Kc;l5% %E"/E4E;PEU;E%E%+1JFYz0HBQx%H EBUgz%H%H% 0ipE %CWH`f%}H__n E$n,E:_H_Pbp}__nEnE__"0=__m_unEnE%9"%5%Mj9rC99%EEEEIC\%rHwC%@MvEEE (z-0LTxccz%%%%%PmHHEEH i<sV,@cs1ccj%(%yE~%HH_++O}%% &%HH%H H(%O[H`|Y%H!>%wE| 6T*VoVb2R%HR% H|R%H0p%E"K@h%rHi%.V%fH9 %E 0El9%Hz0,?z0EMc-nqd.uC%ESj+,Uqw%H%2H7a}V%H7~%KnHVV%@YtV~%HH%0CHHVz0)+%#(c% %c q%EEEE#)%DEMt%J z%0KHPo' %^ oz H  o `   E   `   E         # 2 ? F T  D D D4 D^ D D 0DS\%rH{DDD%DODyD%QEA,%IgoQE%E%%;%PzHHHE %1dlHE%%%]%Q% H*H/;H@WE\eEjvH{V:DDD)DSDxDV 1Ts jDDDDDBDV5VQ_VlV~%nHw}%H%z0f=Iz0f9Pgy%%9 * D a y z~ 0 f     z 0!f:!F!V!H[!w!H!!%!H!!!H!E!!":"z?"0e""z"0""%,#F#a#zf#0##%#H##z#0##%#H#$%$E$&$H+$X$_$%$9$$$9$%%%%:%z?%0P%f{%%%%%z%0%f & &%&1&S&j&%&&E&&H&&%&H''H''%7'C'HH'l'9'9'9'9'9'H''%#(E((P(fi(%(%(E(H(()%$)B)J)Q`)j)%u)))H)E))E)a EHpX558<() *@*>p*>*l+),0o,A-m-8-j--%-..E.L.R.%Y.`.s.Ex.. /-/:/%e/////%/H/0H0>0]0%l0zq0000H011z10e1x1z}1011z1012z 202%2E22%2H2/3f33%3H33% 4E424z740T4\4za40~44444%/5%F5zK50s5{5z5055z50555616E6zJ60i6q6zv6066z606\7za707H777E7E7H77z708m8%888z809 9!99H99 :!:::z:0:G;Z;l;%;z;0;;H;;a<aN<CS<%d<C<H<<%<H<<H<<H<<H<<H==%=H=%=H=H==%>Hv>%>H> ?U'?U.?UL?wf?w?E@ @(@ 8@FQ@d@v@@@%@@H@@%@AH A:ApAUwAU~AUAwAwAEVB\BxB BFBBBBB%CCH C&C%=CQCHZCkCUxCUCUC_C_CC CnCEDnDE;DUHDUODUuD_D_DD DnDEDnDE EUEUEUEE_SE_ZEbE EnEEEnEE F1:FoFFFFFFfGG!G2GfLG]GfGGPGGPGVHH"H9CH%nHH9H%H%HHHHII%^IEnIEwIEIIEIEIEII%J%J%{J%JEJJ9JEJJHJJEKEKEKE%KH*K0K%BKEGKRK%K:K%KEK0LE;LGLERL^LEiLLHLLELLELUMVMMV]NVNNVNOcO(PGPP%PEPP%6QE?QhQpQ Q5Q%QfQPR%bR%tR%R%RHRRHRRHRRESSES@SSSvSS%SS9SS9SCS9T9T%.T:T%IT`T9fT%TTETTTETTETTETUCU%3UH8UWUCUOUE/VVzV0VPWzUW0zWWfW9W(XcfXVXiYcY%YEYYRY%ZHZZ%ZEZZRZ%[H[H[Vb[t[zy[0[[z[0[[z[0\\z$\0n\\z\0\\z\0-]?]zD]0]]z]0]@^V^^l^zq^0^^V_M_Vg__%_z_0(`B`%[`z``0``E``E`a/afHaf`afa%aza0aafb&b%?bzDb0bbb%bzb07cE%`twE|%H%EE!H&JVffҖf8q%Ǘї%7H<yH~Rߘ%EkRq%Hř%%q-HR %%E%ߛ%EH =HBRHW%%% H'H,5E:]w9}%Eĝ3՝V%E 6U9c%w%ÞEȞӞH؞%)H.}%H.%e+k%uEzH%VGHLe%%ǡءVH.H3P|%EEH̢|Ԣ<%%JRkX%Vǣ%H'H,2%WH\HvEw}Ȍ2^W53n39Hٛ2K<"(%_Hh%H1fT%~H% H+%<fN\fn{H%EEħHɧϧ%BH%]fo}f˨%EH%E/H4:%IEYEdHio%EH%EEɩHΩ"IaEsHxHEEf%2%GHLtH%ȫEϫEګH߫f $HfYf%EŬEЬHլ%fH fC%dsfE%VέڭH߭%f)H.4%JVQHfl%VH%VŮHڮ%VH%6V=HRX%rVyH%VHʯЯ%VH%CHaVfǰ%f2L%[f%±HDZӱHرf %H"-%;HGSHXdHiqf%̲HѲf %H5fNT%bHgr%VijVݳVH,2JJVV@] fE%IHNVC.K%aVzV%ķHɷӷHط% EEH 7VPoVV۸%EEHV.AVZVVV[%eElEuH%ѺVVV7oVV=%TvVU%cHhVŽV޽% V#YH^jHoVVV6VjVο%%H HVaV%HV?V^d%rH{V%HV1%O%d%H%HH%%HH(H-BV[nV%VHV%%:H?{V%HV0CV\oV%HV%0WH\%EEHVVjCVVVV3XV~VV%Vhι%fEfM%}9%en%9%<%+E0=EBNESdoEtE%E%J0Cy%fJHScEhm%,A^$g%EHm%9 3%k %3<W9]%xH}E%<%EEE 'E,2%GEPx%JJ.%fvHH%|$% H%9E>jS%H"jp! E$%CVex%H%%#H(6H;`Hej%H%H 2l!E%(L`%H%%HHH%>OHZ`%xH%__ HnE4n<EJ_X_` {%__ HnEn E_(_0 K%RYw__ HnEnE %$%9%AHYH^gHl%%%E&%0H5GHLXEag%uHzII %CEHII:IeI}%HISId%#%S,n,%%%%%0%x%%%%H!%7H@PHUfW}HZEH ;H@LHQgIIHHEEHn"'A>,Zb% E.E:{9HQIhI%HEE1%7H<%HII+A%EH1EJ%W%E%EI&I3IIIaIIII%H %H&,%<HEK%[Edj%zE%H%H%H%H%)H28%LHU[%oHx%%9 I2IBa%[%H%H$0E5AHFK%a%EII#I6II%VIyI%WH%EH!aEsH|E E%E E E-Pm vEE%H%H% EEE$*%:HCI%[EdEoHtz%EEHE%oC{2H ,%q(8 c$E)/%=HJP%dHms%H%E %LHQgElH%H%n4"< D [,r, %Y#'7E<DYR'z%E%Y%H.E%p%Y/)/HEM[Hd%4E=n,%`EK%YE`EkEp~%IH %ER%H%2 % H  R %[ %z % E  H  v % H! , % T H  H  H %II3IJ%QIfEou%E9%EI%%,IF%wH|HE%9ZE_r%EII%GI]IH%%(I?IiHn~H%EEE '-%gI~I%II7H<HHSEN! P[Y u U #a@IVIIII1I>QII%/%]IHIIH+%IIH%SIjIzH%IIOIfII%IIIH+E0K%YE`EkEpyIIIIII IU%~CIIII H r I I    E x!I!I#"%4"E9"B"%_"Hi""%#E ##%'#H,#g#%#I#%#I$%"$I>$IS$HX$z$I$%$I$E$$%$H%K%IX%%e%I%E%%%%H%%H%%%&%7&7L&%g&Hl&y&H~&&&%&H'@'F'%'H''%2(%J(HS(`(Ee(|(%(I(I(I(I)I)I*)I<)IM)I[)I)E))I)I*%**E3*E>*HC*I*%*I*I*I*I*I*I*I +I+I0+I+E+H++%+E+H++%+E ,E,H,!,%=,I\,Is,I,I,E,,I,%,I&-E0-S-E\-b-%t-I-I-I-I-E$.E)./.%J.Ir.E.%.E.E.H..I.I/I0/%6/I^/Eg//%/E/E/E//I/I<0IU0I0I0I1%(1E;1EB1EM1HR1q1E1%1E1E1E11I2ID2%U2EZ22I2%2I2H2m3%33%3%3I3I4I+4I\4%o4I4I4E44H44H4 5H5-5%[5%s5955%5E55H55H56%06A6%m6%6%6H66E66E66H6 7%;7%J7e7%7H77E77E77%788u888/9m999':e:::*;%b;Ev;E;E;;H;;;p;%<!<%+<E0<8<%B<EG<W<%a<Ef<o<Et<<%<E<<%<1==E=/Q=[=%== =>,>->'3>%?>W>w`>u>%>1>E>d>%>E>>E>>E>?%?E#?4?w??ED?U?w`?Ee?k?%?E??%??J @@I@%]@@X@%AEAw0dwiwwww%wzw0wxxMo    .CNC[ChCuCCCCCCCCCCCC3CCCSCEE2%E%E J$n,EJ4n<E,EPEE   E @zE0fxz}0 E E ;z@0fxz}0E E  E  E EEEE*z/0P  E%7E<0T%E%E%E~%%HH  E2z70  E E EEEE E  E  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|         $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @                                          $ ( , 0 4 8 < @ t,x,|,,,,,,,,,,,,,,,,,, 1A 7$<(,048<@DHL|PETX\`dhlpYtx|S:OU j"A 7$<(,2048<@DHL|PETqX!\N`dzhlptox|UqS:}\U[~aw,1 =o3Mw ($J(B,8dd M xA 7$<(,0418<@DH5L|PETX\`dzh5lp9t~xp|UqS:}xU[-aK,1 o3e{BG $$((J,B0<d m#A 7$<(,048<B@D7HL|PETIX\`dzhZlp7tx|UqS:}WU[*a^,1 o3f ( J$B(4d 2HA 7$<(M,048<@DHL|PETX\`dhlpYtx|S:  . A 7$<(,0>4b8<@DHiL|PETX\`dzhlpYtx|UqS:}1U[aI,1 o3 (JB[ T(J B$O  $   $$(_, 0D4 8=<@YDHLPTX\f`cdFhlyptSx|%&dw s& X%LI I I  p $$(_, 0D487<@YDHLPTX\f`cdFhlyptSx|%&dw s& X%LP bA 7$<(,&04 8<@DHL|PETXN\)`dzh}liptx|UqS:?}U[Vah?q,1 o31^!]/9 ($J(B,8d @AA 7$<(,0M4a8<W@DHL|PETXr\`dzhlp*tx|UqS:Y}U[a,1 o3\i^ ($J(B,8d +A 7$<(,0?48<@DH L|PETX>\`dzhlp"tx |UqS:}&U[oa,1 o3$3 .l|E $$M(e,8<@DH(LJPBT`d;  A 7$<(, 04,8|<@DHL|PET.X\`dzhlptx|UqS:y}U[;a,1 ao3D*GHDn $((J,B0<d ,6.FA 7$<(,R0 48t<@DHL|PETJX;\5`dzhlCptx%|UqS:}'U[a,1 o3&Kw H$((J,B0<dM xl_ 7$<(, 0418<@DH5L|PETX\`dzhlp9t~xp|UqS:}xU[-aK,1 o3e]' Qm $(,K0(4J8B<Hd . $L(,\0487<b@DTHrLLPTXN\`}dh5l.pNtx|T3=KsuUX)gy  X%L $s %eA 7$<(,048e<k@@DHL|PETX>\`dh)lGptx|{S:/Uv!gGx@_u( JBz d A 7$<(,m048< @>DHL|PET8X \`dhylptxg|WoS:h4#U:z ?L$  XR $(,04+8<@D rhA 7$<(,t04k8<@DHL|PETX\`dbhl`ptx|^+SY:O>UA- dF IF  5$s(_, 0D48<@YDHLPT"Xi\`zdhlpttx|pdw)-n&eXH pG $(,\0487<b@DTHrLLPpTXN\`}dh5l.pNt8x|~T`$=suW^gny *CQ} P !  ! ' 6 6y9 79 ]9lo  @EDEHELEPEEEEEEslmodem-2.9.11-20110321/drivers/amrmo_init.c0000644000000000000000000005614411542156541016627 0ustar rootroot/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * amrmo_init.c - Smart Link Soft Modem amr,pci driver initialization. * * Author: Sasha K (sashak@smlink.com) * */ /* * 20070505: -Added Motorola Venor ID and rename Motorola device 5600 * http://linmodems.technion.ac.il/bigarch/archive-seventh/msg00846.html * Marvin Stodolsky (marvin.stodolsky@gmail.com) * Alvaro Aguirre (alvaro.aguirre@gmail.com) */ /*****************************************************************************/ #include #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) #include #endif #include #include #include #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) #include #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) #define OLD_KERNEL 1 #endif #ifdef OLD_KERNEL #include #define iminor(i) MINOR((i)->i_rdev) #else #include #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13) #define class_simple_device_add(class, dev, addr, name, i) #define class_simple_device_remove(dev) #define class_simple_create(module, name) (struct class_simple *)(name) #define class_simple_destroy(class) #else #define pci_match_id(tbl, dev) pci_match_device(tbl, dev) #endif #include #define AMRMO_MODULE_NAME "slamr" #define AMRMO_MAJOR 242 #define AMRMO_DBG(fmt...) if (debug > 0) { printk(KERN_DEBUG AMRMO_MODULE_NAME ": " fmt) ; } #define MAXNUM 4 #ifndef IRQF_SHARED #define IRQF_SHARED SA_SHIRQ #endif /* modem cards ids list */ /* Intel */ /* #define PCI_VENDOR_ID_INTEL 0x8086 */ #define PCI_DEVICE_ID_ICHAA 0x2416 #define PCI_DEVICE_ID_ICHAB 0x2426 #define PCI_DEVICE_ID_BANISTER 0x7196 #define PCI_DEVICE_ID_ICH2 0x2446 #define PCI_DEVICE_ID_ICH3 0x2486 #define PCI_DEVICE_ID_ICH4 0x24c6 #define PCI_DEVICE_ID_ICH5 0x24d6 #define PCI_VENDOR_ID_STANDARD_MICROSYSTEM 0x1055 #define PCI_DEVICE_ID_STANDARD_MICROSYSTEM 0x9178 /* AMD */ /* #define PCI_VENDOR_ID_AMD 0x1022 */ #define PCI_DEVICE_ID_AMD_ACLINK 0x7446 /* NVidia */ /* #define PCI_VENDOR_ID_NVIDIA 0x10DE */ #define PCI_DEVICE_ID_MCP 0x01C1 /* VIA */ /* #define PCI_VENDOR_ID_VIA 0x1106 */ #define PCI_DEVICE_ID_VIA 0x3068 /* SiS */ #define PCI_VENDOR_ID_SIS 0x1039 #define PCI_DEVICE_ID_SIS630 0x7013 #define PCI_DEVICE_ID_SIS960 0x7018 /* Avance */ #define PCI_VENDOR_ID_ALS300p 0x4005 // PCI_VENDOR_ID_AVANCE #define PCI_DEVICE_ID_ALS300p 0x0308 /* ALi */ #define PCI_VENDOR_ID_ALI 0x10B9 // PCI_VENDOR_ID_AL #define PCI_DEVICE_ID_ALI5450 0x5450 #define PCI_DEVICE_ID_ALI5451 0x5451 #define PCI_DEVICE_ID_ALI5457 0x5457 #define PCI_DEVICE_ID_ALI5459 0x5459 #define PCI_DEVICE_ID_ALI545A 0x545A /* Philips */ /* #define PCI_VENDOR_ID_PHILIPS 0x1131 */ #define PCI_DEVICE_ID_UCB1500 0x3400 /* RealTek */ /* #define PCI_VENDOR_ID_REALTEK 0x10EC */ #define PCI_DEVICE_ID_8101 0x8197 #define PCI_VENDOR_ID_SMARTLINK 0x2000 #define PCI_VENDOR_ID_SMARTLINK_1 0x163c #define PCI_VENDOR_ID_SMARTLINK_2 0x10a5 #define PCI_VENDOR_ID_SMARTLINK_3 0x2003 #define PCI_DEVICE_ID_SL2800 0x2800 #define PCI_DEVICE_ID_SL1900 0x3052 #define PCI_DEVICE_ID_ND92XPA 0x8800 /* ND92XPA */ #define PCI_VENDOR_ID_PCTEL 0x134d #define PCI_DEVICE_ID_HSP1688 0x2189 /* Motorola section */ #define PCI_VENDOR_ID_MOTOROLA 0x1057 /* Silicon Instruments */ #define PCI_VENDOR_ID_SILICON 0x1543 enum { ALS300_CARD = 1, VIA3058_CARD, ALI5450_CARD, ALI5451_CARD, SL1800_CARD, SIS630_CARD, SIS960_CARD, ICH_CARD, ICH4_CARD, RTL8197_CARD, NVIDIA_CARD, SL1500_CARD, SL1801_CARD, SL1900_CARD, SL2800_CARD, SL1543_CARD }; struct amrmo_struct { unsigned id; const char *name; struct pci_dev *pci_dev; unsigned int irq; unsigned long iobase1; unsigned long iobase2; void *memaddr; unsigned long memlen; void *card; unsigned num; unsigned used; unsigned started; unsigned status; spinlock_t lock; wait_queue_head_t wait; char ibuf[2048]; char obuf[2048]; }; /* extern prototypes */ asmlinkage extern void amrmo_card_interrupt(void *card); asmlinkage extern int amrmo_card_start(void *card); asmlinkage extern int amrmo_card_stop(void *card); asmlinkage extern int amrmo_card_ctl(void *card,unsigned cmd,unsigned long); asmlinkage extern int amrmo_card_read(void *card,char *buf,int n); asmlinkage extern int amrmo_card_write(void *card,char *buf,int n); asmlinkage extern int amrmo_card_enable(void *card, void *modem); asmlinkage extern int amrmo_card_disable(void *card); asmlinkage extern void *amrmo_card_create(int card_id,void *amrmo); asmlinkage extern void amrmo_card_delete(void *card); /* internal data */ static int debug = 0; static const char *card_names[] = { 0, "ALS300+", // ALS300_CARD "VIA3058", "ALI1535", "ALI1535", "SL1800", "SiS630", "SiS960", "ICH", "ICH4", "RealTek8101", "NvidiaMCP", "SL1500", "ALI545A", "SL1900", "SL2800", "SL1543" }; static struct pci_device_id amrmo_pci_tbl [] __devinitdata = { {PCI_VENDOR_ID_SILICON, PCI_DEVICE_ID_SL1900, /* SiliconInstr SL1543:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1543_CARD}, {PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_SL1900, /* Motorola 1057:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_SL1900, /* 163c:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_2, PCI_DEVICE_ID_SL1900, /* 10a5:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_PCTEL, PCI_DEVICE_ID_HSP1688, /* 134d:2189 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_UCB1500, /* 1131:3400 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1500_CARD}, {PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_8101, /* 10ec:8197 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8197_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5459, /* 10b9:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_ALI5459, /* 163c:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_SMARTLINK_2, PCI_DEVICE_ID_ALI5459, /* 10a5:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, //{PCI_VENDOR_ID_ALS300p, PCI_DEVICE_ID_ALS300p, /* 4005:0308 */ // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALS300_CARD}, {PCI_VENDOR_ID_STANDARD_MICROSYSTEM, PCI_DEVICE_ID_STANDARD_MICROSYSTEM, /* 1055:9178 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_ACLINK, /* 1022:7446 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_MCP, /* 10de:01c1 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, NVIDIA_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICHAA, /* 8086:2416 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICHAB, /* 8086:2426 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BANISTER, /* 8086:7196 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH2, /* 8086:2446 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH3, /* 8086:2486 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH4, /* 8086:24c6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH5, /* 8086:24d6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, 0x266d, /* ICH6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, 0x27dd, /* ICH7 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA, /* 1106:3068 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA3058_CARD}, {PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS630, /* 1039:7013 */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MODEM<<8, 0xff00, SIS630_CARD}, {PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS960, /* 1039:7018 */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MODEM<<8, 0xff00, SIS960_CARD}, //{PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5450, // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5450_CARD}, //{PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5451, // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5451_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5457, /* 10b9:5457 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI545A, /* 10b9:545a */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1801_CARD}, {PCI_VENDOR_ID_SMARTLINK, PCI_DEVICE_ID_SL2800, /* 2000:2800 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL2800_CARD}, {PCI_VENDOR_ID_SMARTLINK_3, PCI_DEVICE_ID_ND92XPA, /* 2003:8800 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL2800_CARD}, {0,} }; MODULE_DEVICE_TABLE (pci, amrmo_pci_tbl); static struct amrmo_struct *amrmo_table[MAXNUM] = {}; #ifndef OLD_KERNEL static struct class_simple *amrmo_class; #endif /* * debug stuff * */ unsigned amrmo_debug_level = 0; static int amrmo_vprintf(const char *fmt, va_list args) { static char temp[4096]; struct timeval tv; unsigned long len; char *p; int ret; if (!fmt || !(len = strlen(fmt))) return -1; do_gettimeofday(&tv); while (*fmt == '\n' || *fmt == '\r' || *fmt == '\t' || *fmt == ' ') fmt++; p = temp; len = sprintf(p, "<%c%03ld.%06ld> ", in_interrupt() ? 'i' : 'p', (tv.tv_sec % 1000), tv.tv_usec); p += len; ret = vsprintf(p, fmt, args); len += ret; if(temp[len-1] != '\n') { temp[len++] = '\n'; temp[len] = '\0'; } return printk(KERN_DEBUG "%s",temp); } asmlinkage int amrmo_debug_printf(const char *fmt, ...) { int ret = 0; va_list args; if(debug <= 0) return 0; va_start(args, fmt); ret = amrmo_vprintf(fmt,args); va_end(args); return ret; } /* * * amrmo and char dev */ asmlinkage void amrmo_update_status(void *data,unsigned stat) { struct amrmo_struct *amrmo = (struct amrmo_struct *)data; unsigned long flags; spin_lock_irqsave(&amrmo->lock,flags); amrmo->status |= stat; wake_up(&amrmo->wait); spin_unlock_irqrestore(&amrmo->lock,flags); } static ssize_t amrmo_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; int ret; //AMRMO_DBG("amrmo_read...\n"); if(!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; if (count > sizeof(amrmo->ibuf)) count = sizeof(amrmo->ibuf); ret = amrmo_card_read(amrmo->card,amrmo->ibuf,count); if(copy_to_user(buffer,amrmo->ibuf,ret)) return -EFAULT; return ret; } static ssize_t amrmo_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; int ret; //AMRMO_DBG("amrmo_write...\n"); if(!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; if (count > sizeof(amrmo->obuf)) count = sizeof(amrmo->obuf); if(copy_from_user(amrmo->obuf,buffer,count)) return -EFAULT; ret = amrmo_card_write(amrmo->card,amrmo->obuf,count); return ret; } static unsigned int amrmo_poll(struct file *file, poll_table *wait) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; unsigned int mask = 0; poll_wait(file,&amrmo->wait,wait); spin_lock_irqsave(&amrmo->lock,flags); if(amrmo->status & MDMSTAT_ERROR) mask |= POLLERR; if(amrmo->status & MDMSTAT_RING) mask |= POLLPRI; if(amrmo->status & MDMSTAT_DATA) { mask |= POLLIN | POLLRDNORM; amrmo->status &= ~MDMSTAT_DATA; } spin_unlock_irqrestore(&amrmo->lock,flags); return mask; } static long amrmo_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long parg) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; long ret; unsigned stat; unsigned long arg=0; cmd -= 100000; if (parg) copy_from_user(&arg, (unsigned long *)parg, sizeof(arg)); AMRMO_DBG("amrmo_ioctl: cmd %x, arg %lx...\n",cmd,arg); switch (cmd) { case MDMCTL_GETSTAT: spin_lock_irqsave(&amrmo->lock,flags); stat = amrmo->status; amrmo->status = 0; spin_unlock_irqrestore(&amrmo->lock,flags); if (put_user(stat, (unsigned *) parg)) return -EFAULT; return 0; case MDMCTL_START: ret = amrmo_card_start(amrmo->card); if(!ret) amrmo->started = 1; return ret; case MDMCTL_STOP: ret = amrmo_card_stop(amrmo->card); if(!ret) amrmo->started = 0; return 0; default: return amrmo_card_ctl(amrmo->card,cmd,arg); } return -EINVAL; } static int amrmo_open(struct inode *inode, struct file *file) { struct amrmo_struct *amrmo; unsigned minor = iminor(inode); if(minor > MAXNUM) return -ENODEV; amrmo = amrmo_table[minor]; if(!amrmo) return -ENODEV; AMRMO_DBG("amrmo_open: %d...\n",amrmo->num); if(amrmo->used) // FIXME: atomic or locked is needed return -EBUSY; amrmo->used++; file->private_data = amrmo; #ifdef OLD_KERNEL MOD_INC_USE_COUNT; #endif init_waitqueue_head(&amrmo->wait); return 0; } static int amrmo_release(struct inode *inode, struct file *file) { struct amrmo_struct *amrmo = file->private_data; AMRMO_DBG("amrmo_release...\n"); if(amrmo->started && !amrmo_card_stop(amrmo->card)) amrmo->started = 0; amrmo->used--; #ifdef OLD_KERNEL MOD_DEC_USE_COUNT; #endif return 0; } static struct file_operations amrmo_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = amrmo_read, .write = amrmo_write, .poll = amrmo_poll, .unlocked_ioctl = amrmo_unlocked_ioctl, .open = amrmo_open, .release = amrmo_release, }; /* * PCI stuff * */ #ifdef OLD_KERNEL static void amrmo_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct amrmo_struct *amrmo = (struct amrmo_struct *)dev_id; amrmo_card_interrupt(amrmo->card); } #else #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static irqreturn_t amrmo_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs) #else static irqreturn_t amrmo_pci_interrupt(int irq, void *dev_id) #endif { struct amrmo_struct *amrmo = (struct amrmo_struct *)dev_id; amrmo_card_interrupt(amrmo->card); return IRQ_HANDLED; } #endif static int __init amrmo_pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) { struct amrmo_struct *amrmo; unsigned long mem_start, mem_len = 0; int i, ret = 0; printk(KERN_INFO "slamr: probe %04x:%04x %s card...\n", pci_id->vendor,pci_id->device, card_names[pci_id->driver_data]); if ( pci_enable_device(pci_dev) || pci_dev->irq == 0 ) return -ENODEV; amrmo = kmalloc(sizeof(*amrmo), GFP_KERNEL); if (!amrmo) { pci_disable_device(pci_dev); return -ENOMEM; } memset(amrmo, 0, sizeof(*amrmo)); amrmo->id = pci_id->driver_data; amrmo->name = card_names[amrmo->id]; amrmo->pci_dev = pci_dev; amrmo->irq = pci_dev->irq; if (pci_resource_flags(pci_dev,0)&IORESOURCE_MEM) { mem_start = pci_resource_start(pci_dev, 0); mem_len = pci_resource_len(pci_dev, 0); amrmo->iobase1 = pci_resource_start(pci_dev, 1); } else if (pci_resource_flags(pci_dev,1)&IORESOURCE_MEM) { amrmo->iobase1 = pci_resource_start(pci_dev, 0); mem_start = pci_resource_start(pci_dev, 1); mem_len = pci_resource_len(pci_dev, 1); } else { amrmo->iobase1 = pci_resource_start(pci_dev, 0); amrmo->iobase2 = pci_resource_start(pci_dev, 1); mem_start = 0; mem_len = 0; } spin_lock_init(&amrmo->lock); init_waitqueue_head(&amrmo->wait); amrmo->card = amrmo_card_create(pci_id->driver_data,amrmo); if (!amrmo->card) { printk(KERN_ERR "slamr: cannot create card.\n"); pci_disable_device(pci_dev); kfree(amrmo); return -ENOMEM; } pci_set_master(pci_dev); ret = pci_request_regions(pci_dev,(char*)amrmo->name); if(ret) { printk(KERN_ERR "slamr: failed request regions.\n"); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } if(mem_len) { amrmo->memaddr = ioremap(mem_start,mem_len); if(!amrmo->memaddr) { printk(KERN_ERR "slamr: failed request_irq\n"); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return -EIO; } } ret = request_irq(amrmo->irq, &amrmo_pci_interrupt,IRQF_SHARED, amrmo->name,amrmo); if(ret) { printk(KERN_ERR "slamr: failed request_irq\n"); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } ret = amrmo_card_enable(amrmo->card,NULL); if (ret) { printk(KERN_ERR "slamr: cannot init card.\n"); free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } for(i = 0 ; i < MAXNUM ; i++) { if(amrmo_table[i] == NULL) { amrmo->num = i; amrmo_table[i] = amrmo; break; } } if( i == MAXNUM ) { ret = -EBUSY; goto error_out; } AMRMO_DBG("amrmo_pci_probe: %d amrmo is %p. data %p, io %lx, %lx.\n", amrmo->num, amrmo,amrmo->card,amrmo->iobase1,amrmo->iobase2); printk(KERN_INFO "slamr: slamr%d is %s card.\n", amrmo->num, card_names[pci_id->driver_data]); pci_set_drvdata(pci_dev, amrmo); #ifdef OLD_KERNEL #ifdef CONFIG_DEVFS_FS { char buf[8]; sprintf(buf, "slamr%d", i); devfs_register (NULL, buf, DEVFS_FL_DEFAULT, AMRMO_MAJOR, i, S_IFCHR|S_IRUSR|S_IWUSR, &amrmo_fops, NULL); } #endif #else class_simple_device_add(amrmo_class, MKDEV(AMRMO_MAJOR, i), NULL, "slamr%d", i); #endif return 0; error_out: free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } static void __exit amrmo_pci_remove(struct pci_dev *pci_dev) { struct amrmo_struct *amrmo = pci_get_drvdata(pci_dev); AMRMO_DBG("amrmo: remove %p...\n", amrmo); #ifdef OLD_KERNEL #ifdef CONFIG_DEVFS_FS { char buf[8]; void * handle; sprintf(buf, "slamr%d", amrmo->num); handle = devfs_find_handle (NULL, buf, AMRMO_MAJOR, amrmo->num, DEVFS_SPECIAL_CHR, 0); devfs_unregister (handle); } #endif #else class_simple_device_remove(MKDEV(AMRMO_MAJOR, amrmo->num)); #endif amrmo_table[amrmo->num] = NULL; amrmo_card_disable(amrmo->card); free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); pci_set_drvdata(pci_dev, NULL); kfree(amrmo); return; } static struct pci_driver amrmo_pci_driver = { .name = AMRMO_MODULE_NAME, .id_table = amrmo_pci_tbl, .probe = amrmo_pci_probe, .remove = amrmo_pci_remove, }; /* * module stuff */ module_param(debug, int, 1); MODULE_PARM_DESC(debug,"debug level: 0-3 (default=0)"); MODULE_AUTHOR("Smart Link Ltd."); MODULE_DESCRIPTION("SmartLink HAMR5600,SmartPCI56/561 based modem driver"); MODULE_LICENSE("Smart Link Ltd."); static int __init amrmo_init(void) { struct pci_dev *dev = NULL; int err; #ifdef OLD_KERNEL if (!pci_present()) return -ENODEV; #endif printk(KERN_INFO AMRMO_MODULE_NAME ": " "SmartLink AMRMO modem.\n"); amrmo_debug_level = debug; /* fix me: how to prevent modem cards grabing by serial driver? */ #ifdef OLD_KERNEL pci_for_each_dev(dev) { #else /*while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {*/ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { #endif if(pci_match_id(amrmo_pci_tbl, dev) && pci_dev_driver(dev)) { #ifdef OLD_KERNEL AMRMO_DBG("device %04x:%04x is used by %s: remove\n", dev->vendor,dev->device, dev->driver?dev->driver->name:""); if (dev->driver && dev->driver->remove) dev->driver->remove(dev); dev->driver = NULL; #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) struct device *reldev = get_device(&dev->dev); AMRMO_DBG("device %04x:%04x is grabbed by driver %s: try to release\n", dev->vendor,dev->device, (reldev&&reldev->driver)? reldev->driver->name:"unknown"); if (reldev) { device_release_driver(reldev); put_device(reldev); } #else printk("slamr: device %04x:%04x is grabbed by another driver\n", dev->vendor,dev->device); #endif } #ifndef OLD_KERNEL pci_dev_put(dev); #endif } #ifndef OLD_KERNEL amrmo_class = class_simple_create(THIS_MODULE, "slamr"); if (IS_ERR(amrmo_class)) { int err = PTR_ERR(amrmo_class); printk(KERN_ERR "slamr: failure creating simple class, error %d\n", err); return err; } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) if (!pci_register_driver(&amrmo_pci_driver)) { #else if ((err = pci_register_driver(&amrmo_pci_driver)) < 0) { #endif pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif return err; } if(register_chrdev(AMRMO_MAJOR, "slamr", &amrmo_fops) < 0) { pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif return -ENOMEM; } return 0; } static void __exit amrmo_exit(void) { AMRMO_DBG("slamr: exit...\n"); unregister_chrdev(AMRMO_MAJOR,"slamr"); pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif } module_init(amrmo_init); module_exit(amrmo_exit); #ifdef OLD_KERNEL EXPORT_NO_SYMBOLS; #endif slmodem-2.9.11-20110321/drivers/Modules.symvers0000644000175000000620000000000010773430100017461 0ustar marvstaffslmodem-2.9.11-20110321/drivers/amrmo_init.c.old0000644000175000017500000005613411343745051017400 0ustar marvmarv/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * amrmo_init.c - Smart Link Soft Modem amr,pci driver initialization. * * Author: Sasha K (sashak@smlink.com) * */ /* * 20070505: -Added Motorola Venor ID and rename Motorola device 5600 * http://linmodems.technion.ac.il/bigarch/archive-seventh/msg00846.html * Marvin Stodolsky (marvin.stodolsky@gmail.com) * Alvaro Aguirre (alvaro.aguirre@gmail.com) */ /*****************************************************************************/ #include #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) #include #endif #include #include #include #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) #include #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) #define OLD_KERNEL 1 #endif #ifdef OLD_KERNEL #include #define iminor(i) MINOR((i)->i_rdev) #else #include #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13) #define class_simple_device_add(class, dev, addr, name, i) #define class_simple_device_remove(dev) #define class_simple_create(module, name) (struct class_simple *)(name) #define class_simple_destroy(class) #else #define pci_match_id(tbl, dev) pci_match_device(tbl, dev) #endif #include #define AMRMO_MODULE_NAME "slamr" #define AMRMO_MAJOR 242 #define AMRMO_DBG(fmt...) if (debug > 0) { printk(KERN_DEBUG AMRMO_MODULE_NAME ": " fmt) ; } #define MAXNUM 4 #ifndef IRQF_SHARED #define IRQF_SHARED SA_SHIRQ #endif /* modem cards ids list */ /* Intel */ /* #define PCI_VENDOR_ID_INTEL 0x8086 */ #define PCI_DEVICE_ID_ICHAA 0x2416 #define PCI_DEVICE_ID_ICHAB 0x2426 #define PCI_DEVICE_ID_BANISTER 0x7196 #define PCI_DEVICE_ID_ICH2 0x2446 #define PCI_DEVICE_ID_ICH3 0x2486 #define PCI_DEVICE_ID_ICH4 0x24c6 #define PCI_DEVICE_ID_ICH5 0x24d6 #define PCI_VENDOR_ID_STANDARD_MICROSYSTEM 0x1055 #define PCI_DEVICE_ID_STANDARD_MICROSYSTEM 0x9178 /* AMD */ /* #define PCI_VENDOR_ID_AMD 0x1022 */ #define PCI_DEVICE_ID_AMD_ACLINK 0x7446 /* NVidia */ /* #define PCI_VENDOR_ID_NVIDIA 0x10DE */ #define PCI_DEVICE_ID_MCP 0x01C1 /* VIA */ /* #define PCI_VENDOR_ID_VIA 0x1106 */ #define PCI_DEVICE_ID_VIA 0x3068 /* SiS */ #define PCI_VENDOR_ID_SIS 0x1039 #define PCI_DEVICE_ID_SIS630 0x7013 #define PCI_DEVICE_ID_SIS960 0x7018 /* Avance */ #define PCI_VENDOR_ID_ALS300p 0x4005 // PCI_VENDOR_ID_AVANCE #define PCI_DEVICE_ID_ALS300p 0x0308 /* ALi */ #define PCI_VENDOR_ID_ALI 0x10B9 // PCI_VENDOR_ID_AL #define PCI_DEVICE_ID_ALI5450 0x5450 #define PCI_DEVICE_ID_ALI5451 0x5451 #define PCI_DEVICE_ID_ALI5457 0x5457 #define PCI_DEVICE_ID_ALI5459 0x5459 #define PCI_DEVICE_ID_ALI545A 0x545A /* Philips */ /* #define PCI_VENDOR_ID_PHILIPS 0x1131 */ #define PCI_DEVICE_ID_UCB1500 0x3400 /* RealTek */ /* #define PCI_VENDOR_ID_REALTEK 0x10EC */ #define PCI_DEVICE_ID_8101 0x8197 #define PCI_VENDOR_ID_SMARTLINK 0x2000 #define PCI_VENDOR_ID_SMARTLINK_1 0x163c #define PCI_VENDOR_ID_SMARTLINK_2 0x10a5 #define PCI_VENDOR_ID_SMARTLINK_3 0x2003 #define PCI_DEVICE_ID_SL2800 0x2800 #define PCI_DEVICE_ID_SL1900 0x3052 #define PCI_DEVICE_ID_ND92XPA 0x8800 /* ND92XPA */ #define PCI_VENDOR_ID_PCTEL 0x134d #define PCI_DEVICE_ID_HSP1688 0x2189 /* Motorola section */ #define PCI_VENDOR_ID_MOTOROLA 0x1057 /* Silicon Instruments */ #define PCI_VENDOR_ID_SILICON 0x1543 enum { ALS300_CARD = 1, VIA3058_CARD, ALI5450_CARD, ALI5451_CARD, SL1800_CARD, SIS630_CARD, SIS960_CARD, ICH_CARD, ICH4_CARD, RTL8197_CARD, NVIDIA_CARD, SL1500_CARD, SL1801_CARD, SL1900_CARD, SL2800_CARD, SL1543_CARD }; struct amrmo_struct { unsigned id; const char *name; struct pci_dev *pci_dev; unsigned int irq; unsigned long iobase1; unsigned long iobase2; void *memaddr; unsigned long memlen; void *card; unsigned num; unsigned used; unsigned started; unsigned status; spinlock_t lock; wait_queue_head_t wait; char ibuf[2048]; char obuf[2048]; }; /* extern prototypes */ asmlinkage extern void amrmo_card_interrupt(void *card); asmlinkage extern int amrmo_card_start(void *card); asmlinkage extern int amrmo_card_stop(void *card); asmlinkage extern int amrmo_card_ctl(void *card,unsigned cmd,unsigned long); asmlinkage extern int amrmo_card_read(void *card,char *buf,int n); asmlinkage extern int amrmo_card_write(void *card,char *buf,int n); asmlinkage extern int amrmo_card_enable(void *card, void *modem); asmlinkage extern int amrmo_card_disable(void *card); asmlinkage extern void *amrmo_card_create(int card_id,void *amrmo); asmlinkage extern void amrmo_card_delete(void *card); /* internal data */ static int debug = 0; static const char *card_names[] = { 0, "ALS300+", // ALS300_CARD "VIA3058", "ALI1535", "ALI1535", "SL1800", "SiS630", "SiS960", "ICH", "ICH4", "RealTek8101", "NvidiaMCP", "SL1500", "ALI545A", "SL1900", "SL2800", "SL1543" }; static struct pci_device_id amrmo_pci_tbl [] __devinitdata = { {PCI_VENDOR_ID_SILICON, PCI_DEVICE_ID_SL1900, /* SiliconInstr SL1543:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1543_CARD}, {PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_SL1900, /* Motorola 1057:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_SL1900, /* 163c:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_SMARTLINK_2, PCI_DEVICE_ID_SL1900, /* 10a5:3052 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_PCTEL, PCI_DEVICE_ID_HSP1688, /* 134d:2189 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1900_CARD}, {PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_UCB1500, /* 1131:3400 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1500_CARD}, {PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_8101, /* 10ec:8197 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8197_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5459, /* 10b9:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_SMARTLINK_1, PCI_DEVICE_ID_ALI5459, /* 163c:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_SMARTLINK_2, PCI_DEVICE_ID_ALI5459, /* 10a5:5459 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, //{PCI_VENDOR_ID_ALS300p, PCI_DEVICE_ID_ALS300p, /* 4005:0308 */ // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALS300_CARD}, {PCI_VENDOR_ID_STANDARD_MICROSYSTEM, PCI_DEVICE_ID_STANDARD_MICROSYSTEM, /* 1055:9178 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_ACLINK, /* 1022:7446 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_MCP, /* 10de:01c1 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, NVIDIA_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICHAA, /* 8086:2416 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICHAB, /* 8086:2426 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_BANISTER, /* 8086:7196 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH2, /* 8086:2446 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH3, /* 8086:2486 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH4, /* 8086:24c6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_ICH5, /* 8086:24d6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, 0x266d, /* ICH6 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_INTEL, 0x27dd, /* ICH7 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH4_CARD}, {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA, /* 1106:3068 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA3058_CARD}, {PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS630, /* 1039:7013 */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MODEM<<8, 0xff00, SIS630_CARD}, {PCI_VENDOR_ID_SIS, PCI_DEVICE_ID_SIS960, /* 1039:7018 */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MODEM<<8, 0xff00, SIS960_CARD}, //{PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5450, // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5450_CARD}, //{PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5451, // PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5451_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI5457, /* 10b9:5457 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1800_CARD}, {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI545A, /* 10b9:545a */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL1801_CARD}, {PCI_VENDOR_ID_SMARTLINK, PCI_DEVICE_ID_SL2800, /* 2000:2800 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL2800_CARD}, {PCI_VENDOR_ID_SMARTLINK_3, PCI_DEVICE_ID_ND92XPA, /* 2003:8800 */ PCI_ANY_ID, PCI_ANY_ID, 0, 0, SL2800_CARD}, {0,} }; MODULE_DEVICE_TABLE (pci, amrmo_pci_tbl); static struct amrmo_struct *amrmo_table[MAXNUM] = {}; #ifndef OLD_KERNEL static struct class_simple *amrmo_class; #endif /* * debug stuff * */ unsigned amrmo_debug_level = 0; static int amrmo_vprintf(const char *fmt, va_list args) { static char temp[4096]; struct timeval tv; unsigned long len; char *p; int ret; if (!fmt || !(len = strlen(fmt))) return -1; do_gettimeofday(&tv); while (*fmt == '\n' || *fmt == '\r' || *fmt == '\t' || *fmt == ' ') fmt++; p = temp; len = sprintf(p, "<%c%03ld.%06ld> ", in_interrupt() ? 'i' : 'p', (tv.tv_sec % 1000), tv.tv_usec); p += len; ret = vsprintf(p, fmt, args); len += ret; if(temp[len-1] != '\n') { temp[len++] = '\n'; temp[len] = '\0'; } return printk(KERN_DEBUG "%s",temp); } asmlinkage int amrmo_debug_printf(const char *fmt, ...) { int ret = 0; va_list args; if(debug <= 0) return 0; va_start(args, fmt); ret = amrmo_vprintf(fmt,args); va_end(args); return ret; } /* * * amrmo and char dev */ asmlinkage void amrmo_update_status(void *data,unsigned stat) { struct amrmo_struct *amrmo = (struct amrmo_struct *)data; unsigned long flags; spin_lock_irqsave(&amrmo->lock,flags); amrmo->status |= stat; wake_up(&amrmo->wait); spin_unlock_irqrestore(&amrmo->lock,flags); } static ssize_t amrmo_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; int ret; //AMRMO_DBG("amrmo_read...\n"); if(!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; if (count > sizeof(amrmo->ibuf)) count = sizeof(amrmo->ibuf); ret = amrmo_card_read(amrmo->card,amrmo->ibuf,count); if(copy_to_user(buffer,amrmo->ibuf,ret)) return -EFAULT; return ret; } static ssize_t amrmo_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; int ret; //AMRMO_DBG("amrmo_write...\n"); if(!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; if (count > sizeof(amrmo->obuf)) count = sizeof(amrmo->obuf); if(copy_from_user(amrmo->obuf,buffer,count)) return -EFAULT; ret = amrmo_card_write(amrmo->card,amrmo->obuf,count); return ret; } static unsigned int amrmo_poll(struct file *file, poll_table *wait) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; unsigned int mask = 0; poll_wait(file,&amrmo->wait,wait); spin_lock_irqsave(&amrmo->lock,flags); if(amrmo->status & MDMSTAT_ERROR) mask |= POLLERR; if(amrmo->status & MDMSTAT_RING) mask |= POLLPRI; if(amrmo->status & MDMSTAT_DATA) { mask |= POLLIN | POLLRDNORM; amrmo->status &= ~MDMSTAT_DATA; } spin_unlock_irqrestore(&amrmo->lock,flags); return mask; } static int amrmo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long parg) { struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data; unsigned long flags; int ret; unsigned stat; unsigned long arg=0; cmd -= 100000; if (parg) copy_from_user(&arg, (unsigned long *)parg, sizeof(arg)); AMRMO_DBG("amrmo_ioctl: cmd %x, arg %lx...\n",cmd,arg); switch (cmd) { case MDMCTL_GETSTAT: spin_lock_irqsave(&amrmo->lock,flags); stat = amrmo->status; amrmo->status = 0; spin_unlock_irqrestore(&amrmo->lock,flags); if (put_user(stat, (unsigned *) parg)) return -EFAULT; return 0; case MDMCTL_START: ret = amrmo_card_start(amrmo->card); if(!ret) amrmo->started = 1; return ret; case MDMCTL_STOP: ret = amrmo_card_stop(amrmo->card); if(!ret) amrmo->started = 0; return 0; default: return amrmo_card_ctl(amrmo->card,cmd,arg); } return -EINVAL; } static int amrmo_open(struct inode *inode, struct file *file) { struct amrmo_struct *amrmo; unsigned minor = iminor(inode); if(minor > MAXNUM) return -ENODEV; amrmo = amrmo_table[minor]; if(!amrmo) return -ENODEV; AMRMO_DBG("amrmo_open: %d...\n",amrmo->num); if(amrmo->used) // FIXME: atomic or locked is needed return -EBUSY; amrmo->used++; file->private_data = amrmo; #ifdef OLD_KERNEL MOD_INC_USE_COUNT; #endif init_waitqueue_head(&amrmo->wait); return 0; } static int amrmo_release(struct inode *inode, struct file *file) { struct amrmo_struct *amrmo = file->private_data; AMRMO_DBG("amrmo_release...\n"); if(amrmo->started && !amrmo_card_stop(amrmo->card)) amrmo->started = 0; amrmo->used--; #ifdef OLD_KERNEL MOD_DEC_USE_COUNT; #endif return 0; } static struct file_operations amrmo_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = amrmo_read, .write = amrmo_write, .poll = amrmo_poll, .ioctl = amrmo_ioctl, .open = amrmo_open, .release = amrmo_release, }; /* * PCI stuff * */ #ifdef OLD_KERNEL static void amrmo_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct amrmo_struct *amrmo = (struct amrmo_struct *)dev_id; amrmo_card_interrupt(amrmo->card); } #else #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static irqreturn_t amrmo_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs) #else static irqreturn_t amrmo_pci_interrupt(int irq, void *dev_id) #endif { struct amrmo_struct *amrmo = (struct amrmo_struct *)dev_id; amrmo_card_interrupt(amrmo->card); return IRQ_HANDLED; } #endif static int __init amrmo_pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) { struct amrmo_struct *amrmo; unsigned long mem_start, mem_len = 0; int i, ret = 0; printk(KERN_INFO "slamr: probe %04x:%04x %s card...\n", pci_id->vendor,pci_id->device, card_names[pci_id->driver_data]); if ( pci_enable_device(pci_dev) || pci_dev->irq == 0 ) return -ENODEV; amrmo = kmalloc(sizeof(*amrmo), GFP_KERNEL); if (!amrmo) { pci_disable_device(pci_dev); return -ENOMEM; } memset(amrmo, 0, sizeof(*amrmo)); amrmo->id = pci_id->driver_data; amrmo->name = card_names[amrmo->id]; amrmo->pci_dev = pci_dev; amrmo->irq = pci_dev->irq; if (pci_resource_flags(pci_dev,0)&IORESOURCE_MEM) { mem_start = pci_resource_start(pci_dev, 0); mem_len = pci_resource_len(pci_dev, 0); amrmo->iobase1 = pci_resource_start(pci_dev, 1); } else if (pci_resource_flags(pci_dev,1)&IORESOURCE_MEM) { amrmo->iobase1 = pci_resource_start(pci_dev, 0); mem_start = pci_resource_start(pci_dev, 1); mem_len = pci_resource_len(pci_dev, 1); } else { amrmo->iobase1 = pci_resource_start(pci_dev, 0); amrmo->iobase2 = pci_resource_start(pci_dev, 1); mem_start = 0; mem_len = 0; } spin_lock_init(&amrmo->lock); init_waitqueue_head(&amrmo->wait); amrmo->card = amrmo_card_create(pci_id->driver_data,amrmo); if (!amrmo->card) { printk(KERN_ERR "slamr: cannot create card.\n"); pci_disable_device(pci_dev); kfree(amrmo); return -ENOMEM; } pci_set_master(pci_dev); ret = pci_request_regions(pci_dev,(char*)amrmo->name); if(ret) { printk(KERN_ERR "slamr: failed request regions.\n"); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } if(mem_len) { amrmo->memaddr = ioremap(mem_start,mem_len); if(!amrmo->memaddr) { printk(KERN_ERR "slamr: failed request_irq\n"); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return -EIO; } } ret = request_irq(amrmo->irq, &amrmo_pci_interrupt,IRQF_SHARED, amrmo->name,amrmo); if(ret) { printk(KERN_ERR "slamr: failed request_irq\n"); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } ret = amrmo_card_enable(amrmo->card,NULL); if (ret) { printk(KERN_ERR "slamr: cannot init card.\n"); free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } for(i = 0 ; i < MAXNUM ; i++) { if(amrmo_table[i] == NULL) { amrmo->num = i; amrmo_table[i] = amrmo; break; } } if( i == MAXNUM ) { ret = -EBUSY; goto error_out; } AMRMO_DBG("amrmo_pci_probe: %d amrmo is %p. data %p, io %lx, %lx.\n", amrmo->num, amrmo,amrmo->card,amrmo->iobase1,amrmo->iobase2); printk(KERN_INFO "slamr: slamr%d is %s card.\n", amrmo->num, card_names[pci_id->driver_data]); pci_set_drvdata(pci_dev, amrmo); #ifdef OLD_KERNEL #ifdef CONFIG_DEVFS_FS { char buf[8]; sprintf(buf, "slamr%d", i); devfs_register (NULL, buf, DEVFS_FL_DEFAULT, AMRMO_MAJOR, i, S_IFCHR|S_IRUSR|S_IWUSR, &amrmo_fops, NULL); } #endif #else class_simple_device_add(amrmo_class, MKDEV(AMRMO_MAJOR, i), NULL, "slamr%d", i); #endif return 0; error_out: free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); kfree(amrmo); return ret; } static void __exit amrmo_pci_remove(struct pci_dev *pci_dev) { struct amrmo_struct *amrmo = pci_get_drvdata(pci_dev); AMRMO_DBG("amrmo: remove %p...\n", amrmo); #ifdef OLD_KERNEL #ifdef CONFIG_DEVFS_FS { char buf[8]; void * handle; sprintf(buf, "slamr%d", amrmo->num); handle = devfs_find_handle (NULL, buf, AMRMO_MAJOR, amrmo->num, DEVFS_SPECIAL_CHR, 0); devfs_unregister (handle); } #endif #else class_simple_device_remove(MKDEV(AMRMO_MAJOR, amrmo->num)); #endif amrmo_table[amrmo->num] = NULL; amrmo_card_disable(amrmo->card); free_irq(amrmo->irq, amrmo); if(amrmo->memaddr) iounmap(amrmo->memaddr); pci_release_regions(pci_dev); amrmo_card_delete(amrmo->card); pci_disable_device(pci_dev); pci_set_drvdata(pci_dev, NULL); kfree(amrmo); return; } static struct pci_driver amrmo_pci_driver = { .name = AMRMO_MODULE_NAME, .id_table = amrmo_pci_tbl, .probe = amrmo_pci_probe, .remove = amrmo_pci_remove, }; /* * module stuff */ module_param(debug, int, 1); MODULE_PARM_DESC(debug,"debug level: 0-3 (default=0)"); MODULE_AUTHOR("Smart Link Ltd."); MODULE_DESCRIPTION("SmartLink HAMR5600,SmartPCI56/561 based modem driver"); MODULE_LICENSE("Smart Link Ltd."); static int __init amrmo_init(void) { struct pci_dev *dev = NULL; int err; #ifdef OLD_KERNEL if (!pci_present()) return -ENODEV; #endif printk(KERN_INFO AMRMO_MODULE_NAME ": " "SmartLink AMRMO modem.\n"); amrmo_debug_level = debug; /* fix me: how to prevent modem cards grabing by serial driver? */ #ifdef OLD_KERNEL pci_for_each_dev(dev) { #else /*while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {*/ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { #endif if(pci_match_id(amrmo_pci_tbl, dev) && pci_dev_driver(dev)) { #ifdef OLD_KERNEL AMRMO_DBG("device %04x:%04x is used by %s: remove\n", dev->vendor,dev->device, dev->driver?dev->driver->name:""); if (dev->driver && dev->driver->remove) dev->driver->remove(dev); dev->driver = NULL; #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) struct device *reldev = get_device(&dev->dev); AMRMO_DBG("device %04x:%04x is grabbed by driver %s: try to release\n", dev->vendor,dev->device, (reldev&&reldev->driver)? reldev->driver->name:"unknown"); if (reldev) { device_release_driver(reldev); put_device(reldev); } #else printk("slamr: device %04x:%04x is grabbed by another driver\n", dev->vendor,dev->device); #endif } #ifndef OLD_KERNEL pci_dev_put(dev); #endif } #ifndef OLD_KERNEL amrmo_class = class_simple_create(THIS_MODULE, "slamr"); if (IS_ERR(amrmo_class)) { int err = PTR_ERR(amrmo_class); printk(KERN_ERR "slamr: failure creating simple class, error %d\n", err); return err; } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) if (!pci_register_driver(&amrmo_pci_driver)) { #else if ((err = pci_register_driver(&amrmo_pci_driver)) < 0) { #endif pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif return err; } if(register_chrdev(AMRMO_MAJOR, "slamr", &amrmo_fops) < 0) { pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif return -ENOMEM; } return 0; } static void __exit amrmo_exit(void) { AMRMO_DBG("slamr: exit...\n"); unregister_chrdev(AMRMO_MAJOR,"slamr"); pci_unregister_driver(&amrmo_pci_driver); #ifndef OLD_KERNEL class_simple_destroy(amrmo_class); #endif } module_init(amrmo_init); module_exit(amrmo_exit); #ifdef OLD_KERNEL EXPORT_NO_SYMBOLS; #endif slmodem-2.9.11-20110321/drivers/Makefile0000644000175000017500000001005411420700445015742 0ustar marvmarv########################################################################### # # # Makefile -- modem kernel drivers Makefile. # # Copyright(c) 2003, Smart Link Ltd. (www.smlink.com) # All rights reserved. # # Author: Sasha K (sashak@smlink.com) # # ########################################################################### # ########################################################################### #KBUILD_VERBOSE=1 #export KBUILD_VERBOSE KERNEL_DIR:=/lib/modules/$(shell uname -r)/build SUBLEVEL:=$(shell echo $(KERNEL_DIR) | cut -d. -f3 | cut -d. -f1 | cut -d- -f1) # slusb support ends at 2.6.24 ifndef USB AGE:=$(shell if [ "$(SUBLEVEL)" -gt 24 ] ;then echo NEW;fi) endif FOUND_CLASS_SIMPLE := $(shell grep -q 'class_simple_device_add' ${KERNEL_DIR}/include/linux/device.h 2> /dev/null && echo -DFOUND_CLASS_SIMPLE) EXTRA_CFLAGS = -I$(obj) -I$(obj)/../modem $(FOUND_CLASS_SIMPLE) ARCH64:=$(shell uname -m | sed -e '/amd64/s//x86_64/' | grep -c x86_64) ifeq ($(ARCH64), 0) obj-m:= slamr.o endif # AGE:=test ifneq ($(AGE), NEW) obj-m:= $(obj-m) slusb.o endif slamr-objs:= amrmo_init.o sysdep_amr.o amrlibs.o slusb-objs:= st7554.o ifndef KERNELRELEASE ifndef KERNEL_VER all install uninstall: kernel-ver $(MAKE) $@ KERNEL_VER=$(shell ./kernel-ver) install: install-devices uninstall: remove-devices kernel-ver:: @echo "doing kernel-ver::" $(CC) -I$(KERNEL_DIR)/include -o $@ $@.c dep: clean: $(RM) kernel-ver $(obj-m) $(obj-m:.o=.ko) *st7554.o amrmo_init.o sysdep_amr.o *.mod.* .*.cmd *~ slusb.* $(RM) -r .tmp_versions install-devices: mkdir -p ${DESTDIR}/dev $(foreach minor,0 1 2 3, \ mknod -m 600 ${DESTDIR}/dev/slamr$(minor) c 242 $(minor) ; ) echo -n ifneq ($(AGE), NEW) $(foreach minor,0 1 2 3, \ mknod -m 600 ${DESTDIR}/dev/slusb$(minor) c 243 $(minor) ; ) echo -n endif remove-devices: $(foreach minor,0 1 2 3, \ $(RM) ${DESTDIR}/dev/slamr$(minor) ; ) echo -n $(foreach minor,0 1 2 3, \ $(RM) ${DESTDIR}/dev/slusb$(minor) ; ) echo -n else ifeq ($(shell grep 'UTS.*"2\.6' $(KERNEL_DIR)/include/generated/utsrelease.h $(KERNEL_DIR)/include/linux/utsrelease.h $(KERNEL_DIR)/include/linux/version.h 2>/dev/null),) slusb-objs:= old_st7554.o obj:=. module-dir:=${DESTDIR}/lib/modules/$(KERNEL_VER)/misc CFLAGS:= -Wall -pipe -O3 -fomit-frame-pointer -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -DMODVERSIONS --include $(KERNEL_DIR)/include/linux/modversions.h -I$(KERNEL_DIR)/include $(FOUND_CLASS_SIMPLE) all: $(obj-m) slamr.o: $(slamr-objs) slusb.o: $(slusb-objs) slamr.o slusb.o: $(LD) -r -o $@ $^ install: uninstall-old ifeq ($(ARCH64), 0) install -D -m 644 slamr.o $(module-dir)/slamr.o endif install -D -m 644 slusb.o $(module-dir)/slusb.o cp /etc/modules.conf /etc/modules.conf.slamr && \ echo 'alias char-major-242 slamr' >> /etc/modules.conf && \ echo 'alias char-major-243 slusb' >> /etc/modules.conf /sbin/depmod -a uninstall: /sbin/modprobe -r slamr slusb cp /etc/modules.conf /etc/modules.conf.slamr && \ egrep -ve 'alias char-major-242 slamr|alias char-major-243 slusb' /etc/modules.conf.slamr > /etc/modules.conf $(RM) $(module-dir)/slamr.o $(RM) $(module-dir)/slusb.o /sbin/depmod -a uninstall-old: $(RM) $(module-dir)/slmdm.o \ $(module-dir)/slfax.o \ $(module-dir)/slusb.o \ $(module-dir)/slamrmo.o \ $(module-dir)/slmodem.o # remove old 2.7,2.8 version %.o: %.c @echo " doing %.o: %.c" $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -o $@ -c $< else module-dir:=${DESTDIR}/lib/modules/$(KERNEL_VER)/extra all: @echo " obj-m=$(obj-m)" @echo " slamr-objs=$(slamr-objs)" $(MAKE) modules -C $(KERNEL_DIR) SUBDIRS=$(shell pwd) @echo " finished all:" install: ifeq ($(ARCH64), 0) install -D -m 644 slamr.ko $(module-dir)/slamr.ko endif ifneq ($(AGE), NEW) install -D -m 644 slusb.ko $(module-dir)/slusb.ko endif /sbin/depmod -a uninstall: ifeq ($(ARCH64), 0) modprobe -r slamr ; echo -n endif modprobe -r slusb ; echo -n $(RM) $(module-dir)/slamr.ko $(RM) $(module-dir)/slusb.ko /sbin/depmod -a endif endif endif $(obj)/amrlibs.o: echo "$@ done" slmodem-2.9.11-20110321/drivers/st7554.c0000644000000000000620000011331511541664721015571 0ustar rootstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * usb_st7554.c -- ST7554 USB Smart Link Soft Modem driver * * Author: SashaK (sashak@smlink.com) * * */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13) #define class_simple_device_add(class, dev, addr, name, i) #define class_simple_device_remove(dev) #define class_simple_create(module, name) (struct class_simple *)(name) #define class_simple_destroy(class) #endif #define MAX_MODEMS 16 #define USB_INFO(fmt...) printk(KERN_INFO fmt) #define USB_ERR(fmt...) printk(KERN_ERR fmt) #define USB_DBG(fmt...) { if(debug) printk(KERN_DEBUG fmt); } #define DEBUG_URB_PRINT 0 #define USB_DBG_URB(fmt...) // USB_DBG(fmt) static int debug = 0; module_param(debug, int, 1); MODULE_PARM_DESC(debug,"Debug level: 0-3 (default=0)"); /* st7554 IDs */ #define ST7554_VENDOR_ID 0x0483 #define ST7554_PRODUCT_ID 0x7554 /* st7554 interfaces */ #define ST7554_IFACE_CTRL_ALTSETTING 0 #define ST7554_IFACE_MODEM_ALTSETTING 1 /* comm class defined requests */ #define USB_COMM_CLASS_AUX_LINE_STATE 0x0a #define USB_COMM_CLASS_HOOK_STATE 0x0b #define USB_COMM_CLASS_PULSE_STATE 0x0c /* st7554 vendor defined requests */ #define ST7554_SSI1_CONTROL 0x1 #define ST7554_SSI2_CONTROL 0x2 #define ST7554_FIFO_MASK 0x3 #define ST7554_SSI1_COUNTER 0x4 #define ST7554_SSI2_COUNTER 0x6 #define ST7554_GPIO_DIR 0x8 #define ST7554_GPIO_OUT 0xA #define ST7554_GPIO_MASK 0xC #define ST7554_GPIO_INV 0xE #define ST7554_GPIO_STATUS 0x15 #define ST7554_SSI1_CWORD 0x17 #define ST7554_FIFO_CONTROL1 0x19 #define ST7554_FIFO_CONTROL2 0x1a /* requests' values */ /* SSI control */ #define SSI1_POWERDOWN 0x0000 #define SSI1_POWERUP 0x0001 /* FIFO mask */ #define SSI1_UNDERRUN 0x0040 #define SSI1_OVERRUN 0x0020 /* GPIO mask */ #define GPIO_RING1 0x0001 #define GPIO_HANDSET 0x0004 #define GPIO_HOOK1 0x0008 #define GPIO_CID1 0x0020 #define GPIO_LED_CARRIER 0x0040 #define GPIO_LED_HOOK 0x0080 #define GPIO_RFC 0x0100 #define GPIO_DISHS 0x0200 #define GPIO_DP 0x0400 /* used for Off Hook */ #define GPIO_BUZEN 0x0800 #define GPIO_DC 0x1000 #define GPIO_LED_RW 0x2000 #define GPIO_MONOLITHINC 0x4000 /* FIFO control */ #define BYTE_ORDER_LE 0x8000 /* gpio hook off bit mask */ #define GPIO_HOOK1_OFF (GPIO_HOOK1) //#define GPIO_HOOK1_OFF (GPIO_HOOK1|GPIO_DP|GPIO_DC) /* st7554 hw parameters */ #define ST7554_FIFO_SIZE 128 #define ST7554_HW_IODELAY 48 /* urb size */ #define DESCFRAMES 5 /* control message timeout */ #define CONTROL_MSG_TMO HZ /* run state bits */ #define MO0_RUNNING 1 #define MO1_RUNNING 2 #define MI0_RUNNING 3 #define MI1_RUNNING 4 #define RUNNING 5 /* data type definitions */ struct st7554_state { struct usb_device *usbdev; struct usb_interface *iface ; const char *name; unsigned minor; struct file *file; spinlock_t lock; wait_queue_head_t wait; unsigned status; unsigned int ctrl_ep; /* control endpoint */ u32 intr_status; /* interrupt status */ struct urb *intr_urb; /* interrupt urb ptr */ unsigned int format; /* sample format */ unsigned int srate; /* sample rate */ unsigned int fragsize; /* fragsize in bytes */ u16 gpio; /* gpio_out register shadow */ int delay; /* i/o delay */ int disbalance; /* output disbalance */ unsigned long run_mask; /* run states mask: started+urbs */ struct completion start_comp; struct completion stop_comp; struct usb_modem_channel { /* modem in/out channels */ unsigned int maxsz; /* max packet size */ unsigned int interval; /* interval */ unsigned int pipe; /* usb data pipe */ struct dmabuf { /* "dma" ring buffer */ int count; /* byte count */ unsigned int head; /* head(write) pointer */ unsigned int tail; /* tail(read) pointer */ unsigned int size; /* buffer size */ unsigned char *buf; /* data buffer */ unsigned int error; /* over/underrun */ } dma; struct urb *urb[2]; /* isoc urb */ } mo, mi; struct codec { /* installed codec */ const char *name; int (*set_srate )(struct st7554_state *,unsigned); int (*set_format)(struct st7554_state *,unsigned); } codec; /* register access proc */ int (*get_reg)(struct st7554_state *s, u8 reg, u16 *value); int (*set_reg)(struct st7554_state *s, u8 reg, u16 value); struct semaphore sem; }; static struct st7554_state *st7554_table[MAX_MODEMS] = {}; #ifdef FOUND_CLASS_SIMPLE #define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_simple_device_add(class, dev, device, fmt, rest) #define CLASS_DESTROY(class) class_simple_destroy(class) #define CLASS_DEVICE_DESTROY(class, dev) class_simple_device_remove(dev) #define CLASS_CREATE(owner, name) class_simple_create(owner, name) static struct class_simple *st7554_class; #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) #define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) device_create(class, dev, device, fmt, rest) #define CLASS_DEVICE_DESTROY(class, dev) device_destroy(class, dev) #else #include #define CLASS_DEVICE_CREATE(class, dev, device, fmt, rest) class_device_create(class, dev, device, fmt, rest) #define CLASS_DEVICE_DESTROY(class, dev) class_device_destroy(class, dev) #endif #define CLASS_DESTROY(class) class_destroy(class) #define CLASS_CREATE(owner, name) class_create(owner, name) static struct class *st7554_class; #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) static DECLARE_MUTEX(open_sem); #else static DEFINE_SEMAPHORE(open_sem); #endif /* --------------------------------------------------------------------- */ static int dma_init (struct dmabuf *db) { db->buf = (unsigned char *)__get_free_pages(GFP_KERNEL, 1); if (!db->buf) return -ENOMEM; db->head = db->tail = db->count = 0; db->size = 1UL<<(PAGE_SHIFT + 1) ; return 0; } static void dma_free(struct dmabuf *db) { int size = db->size; db->head = db->tail = db->count = db->size = 0; free_pages((unsigned long)db->buf, get_order(size)); db->buf = NULL; } static int dmabuf_copyin(struct dmabuf *db, void *buffer, unsigned int size) { int ret = 0, cnt; while (size) { cnt = db->size - db->head; if (cnt > size ) cnt = size; if (cnt > db->size - db->count) cnt = db->size - db->count; if (cnt <= 0) { /* overflow */ db->error++; USB_ERR("dmabuf_copyin: overrun: ret %d.\n", ret); return ret; } memcpy(db->buf + db->head, buffer, cnt); buffer += cnt; db->count += cnt; db->head += cnt ; if (db->head >= db->size) db->head = 0; size -= cnt; ret += cnt; } return ret; } /* --------------------------------------------------------------------- */ #define arrsize(a) (sizeof(a)/sizeof((a)[0])) #define NUM_OF_URBS(ch) (sizeof((ch)->urb)/sizeof((ch)->urb[0])) #define MO_URB_NO(s,u) ((u) == (s)->mo.urb[1]) #define MI_URB_NO(s,u) ((u) == (s)->mi.urb[1]) #define BYTES_IN_FRAMES(s,n) ((((s)->srate*(n))/1000)<<(MFMT_BYTESSHIFT((s)->format))) #ifndef URB_ASYNC_UNLINK #define URB_ASYNC_UNLINK 0 #endif #define FILL_URB(state,ch,u) { \ (u)->dev = (state)->usbdev; \ (u)->pipe = (ch)->pipe; \ (u)->context = (state); \ (u)->number_of_packets = DESCFRAMES; \ (u)->interval = (ch)->interval; \ (u)->status = 0; \ (u)->transfer_flags |= URB_ISO_ASAP|URB_ASYNC_UNLINK; } #define FILL_DESC_OUT(state,ch,u,count) { int i; \ unsigned shft = MFMT_BYTESSHIFT((state)->format); \ unsigned len = count; \ for (i = 0 ; i < DESCFRAMES ; i++) { \ (u)->iso_frame_desc[i].actual_length = 0; \ (u)->iso_frame_desc[i].offset = 0; \ (u)->iso_frame_desc[i].length = (len/(DESCFRAMES-i))&(~shft); \ len -= (u)->iso_frame_desc[i].length; \ } } #define FILL_DESC_IN(state,ch,u,count) { int i, offs; \ for ( i=0 , offs=0 ; i < DESCFRAMES; i++, offs += (ch)->maxsz) { \ (u)->iso_frame_desc[i].length = (ch)->maxsz; \ (u)->iso_frame_desc[i].offset = offs; } } #define FILL_URB_OUT(state,ch,u,len) \ { FILL_URB(state,ch,u); FILL_DESC_OUT(state,ch,u,len);} #define FILL_URB_IN(state,ch,u,len) \ { FILL_URB(state,ch,u); FILL_DESC_IN(state,ch,u,len); } /* --------------------------------------------------------------------- */ static int mi_free(struct st7554_state *s) { struct usb_modem_channel *ch = &s->mi; int i; for( i = 0 ; i < NUM_OF_URBS(ch) ; i++) { if(ch->urb[i]) { if(ch->urb[i]->transfer_buffer) kfree(ch->urb[i]->transfer_buffer); usb_free_urb(ch->urb[i]); ch->urb[i] = NULL; } } dma_free(&ch->dma); return 0; } static int mi_init (struct st7554_state *s) { struct usb_modem_channel *ch = &s->mi; int i; if ( dma_init (&ch->dma) ) return -ENOMEM; for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) { struct urb *u = usb_alloc_urb(DESCFRAMES,GFP_KERNEL); if (!u) goto error; ch->urb[i] = u; u->transfer_buffer = kmalloc(ch->maxsz*DESCFRAMES,GFP_KERNEL); if(!u->transfer_buffer) goto error; u->transfer_buffer_length = ch->maxsz*DESCFRAMES; memset(u->transfer_buffer,0,u->transfer_buffer_length); FILL_URB_IN(s,ch,u,ch->maxsz*DESCFRAMES); } return 0; error: mi_free(s); return -ENOMEM; } static int mo_free(struct st7554_state *s) { struct usb_modem_channel *ch = &s->mo; int i; for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) { usb_free_urb(ch->urb[i]); ch->urb[i] = NULL; } dma_free(&ch->dma); return 0; } static int mo_init (struct st7554_state *s) { struct usb_modem_channel *ch = &s->mo; int i; if( dma_init (&ch->dma) ) return -ENOMEM; for (i = 0 ; i < NUM_OF_URBS(ch) ; i++) { struct urb *u = usb_alloc_urb(DESCFRAMES,GFP_KERNEL); if (!u) goto error; ch->urb[i] = u; u->transfer_buffer_length = ch->maxsz*DESCFRAMES; u->transfer_buffer = ch->dma.buf; FILL_URB_OUT(s,ch,u,ch->maxsz*DESCFRAMES); } return 0; error: mo_free(s); return -ENOMEM; } /* ----------------------------------------------------------------------- */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static void st7554_interrupt(struct urb *urb, struct pt_regs* regs) #else static void st7554_interrupt(struct urb *urb) #endif { struct st7554_state *s = urb->context; u32 *status = urb->transfer_buffer; u16 fifo_status; u16 gpio_status; if (urb->status) { USB_DBG("st7554 interrupt: status = %d\n", urb->status); return; } fifo_status = *status &0xffff; gpio_status = *status >> 16; #if 1 USB_DBG("interrupt: fifo %04x, gpio %04x...\n", fifo_status, gpio_status); #endif if (fifo_status & SSI1_UNDERRUN ) { USB_ERR("st7554: fifo underrun!\n"); s->status |= MDMSTAT_ERROR; } if (fifo_status & SSI1_OVERRUN) { USB_ERR("st7554: fifo overrun!\n"); s->status |= MDMSTAT_ERROR; } if (gpio_status & GPIO_RING1) { s->status |= MDMSTAT_RING; } if(s->status) wake_up_interruptible(&s->wait); urb->dev = s->usbdev; usb_submit_urb(urb,GFP_ATOMIC); } /* --------------------------------------------------------------------- */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static void mo_complete(struct urb *u, struct pt_regs* regs) #else static void mo_complete(struct urb *u) #endif { struct st7554_state *s = u->context; struct dmabuf *db = &s->mo.dma; struct usb_iso_packet_descriptor *p; unsigned long flags; int i, mybit = MO_URB_NO(s,u) ? MO1_RUNNING : MO0_RUNNING ; if (u->status) goto finish; spin_lock_irqsave(&s->lock, flags); for (i = 0 ; i < u->number_of_packets ; i++) { p = &u->iso_frame_desc[i]; if (p->status) USB_ERR("mo_complete %d: err: fr.%d status %d.\n", MO_URB_NO(s,u), i, p->status); if (s->disbalance + (int)p->length > 0) { p->length += s->disbalance; s->disbalance = 0; } else { /* FIXME: striping may optimize case recovery, but fully stripped urb will cause mem leak in usb controller driver (usb-uhci.o) */ s->disbalance += p->length - 2 ; p->length = 2; } if (p->length > s->mo.maxsz) { s->disbalance += p->length - s->mo.maxsz; p->length = s->mo.maxsz; } if (p->length > db->size - db->tail) { s->disbalance += p->length - (db->size - db->tail); p->length = db->size - db->tail; } p->offset = db->tail; db->tail = (db->tail + p->length)%db->size ; db->count -= p->length; } spin_unlock_irqrestore(&s->lock, flags); USB_DBG_URB("mo_complete %d: %d: sent %d.\n", MO_URB_NO(s,u), u->start_frame, u->actual_length); u->dev = s->usbdev; if(!test_bit(RUNNING,&s->run_mask) || usb_submit_urb(u,GFP_ATOMIC) ) goto finish; return; finish: USB_DBG("mo_complete %d: finished, status %d\n", MO_URB_NO(s,u),u->status); clear_bit(mybit,&s->run_mask); complete(&s->stop_comp); } #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static void mo_startup_complete(struct urb *u, struct pt_regs* regs) #else static void mo_startup_complete(struct urb *u) #endif { struct st7554_state *s = u->context; USB_DBG("mo_startup_complete %d: %d: sent %d.\n", MO_URB_NO(s,u), u->start_frame, u->actual_length); FILL_DESC_OUT(s,&s->mo,u,BYTES_IN_FRAMES(s,DESCFRAMES)); u->complete = mo_complete; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) mo_complete(u,regs); #else mo_complete(u); #endif complete(&s->start_comp); } /* ----------------------------------------------------------------------- */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static void mi_complete(struct urb *u, struct pt_regs* regs) #else static void mi_complete(struct urb *u) #endif { struct st7554_state *s = u->context; struct urb *next; struct usb_iso_packet_descriptor *p; unsigned long flags; int i, mybit = MI_URB_NO(s,u) ? MI1_RUNNING : MI0_RUNNING ; if (u->status) goto finish; next = s->mo.urb[!MI_URB_NO(s,u)]; spin_lock_irqsave(&s->lock, flags); for (i = 0 ; i < u->number_of_packets ; i++) { p = &u->iso_frame_desc[i]; if (p->status) { USB_ERR("mi_complete %d: err: fr.%d status %d.\n", MI_URB_NO(s,u), i, p->status); } dmabuf_copyin(&s->mi.dma, u->transfer_buffer + p->offset, p->actual_length); /* set length of out urb (in driven) */ next->iso_frame_desc[i].length = p->actual_length; } if(s->mi.dma.count > 0) wake_up_interruptible(&s->wait); spin_unlock_irqrestore(&s->lock, flags); USB_DBG_URB("mi_complete %d: %d: recv %d.\n", MI_URB_NO(s,u), u->start_frame, u->actual_length); u->dev = s->usbdev; if(!test_bit(RUNNING,&s->run_mask) || usb_submit_urb(u,GFP_ATOMIC)) goto finish; return; finish: USB_DBG("mi_complete %d: finished, status = %d\n", MI_URB_NO(s,u),u->status); clear_bit(mybit,&s->run_mask); complete(&s->stop_comp); } #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static void mi_startup_complete(struct urb *u, struct pt_regs* regs) #else static void mi_startup_complete(struct urb *u) #endif { struct st7554_state *s = u->context; struct usb_iso_packet_descriptor *p; unsigned long flags; int mybit = MI_URB_NO(s,u) ? MI1_RUNNING : MI0_RUNNING ; int i; if (u->status) goto finish; spin_lock_irqsave(&s->lock, flags); if(u->actual_length > 0) { for (i = 0 ; i < u->number_of_packets ; i++) { p = &u->iso_frame_desc[i]; if (p->status) { USB_ERR("mi_startup_complete %d: err: fr.%d status %d.\n", MI_URB_NO(s,u), i, p->status); } dmabuf_copyin(&s->mi.dma, u->transfer_buffer + p->offset, p->actual_length); } s->mi.urb[0]->complete = mi_complete; s->mi.urb[1]->complete = mi_complete; } i = BYTES_IN_FRAMES(s,DESCFRAMES) - u->actual_length; USB_DBG("mi_startup: advance mo head +%d...\n",i); s->mo.dma.count += i; s->mo.dma.head = (s->mo.dma.head + i)%s->mo.dma.size; if(s->mi.dma.count > 0) wake_up_interruptible(&s->wait); spin_unlock_irqrestore(&s->lock, flags); USB_DBG("mi_startup_complete %d: %d: recv %d.\n", MI_URB_NO(s,u), u->start_frame, u->actual_length); u->dev = s->usbdev; if(!test_bit(RUNNING,&s->run_mask) || usb_submit_urb(u,GFP_ATOMIC)) goto finish; return; finish: USB_DBG("mi_startup_complete %d: finished, status %d\n", MI_URB_NO(s,u),u->status); clear_bit(mybit,&s->run_mask); complete(&s->stop_comp); } /* --------------------------------------------------------------------- */ /* * Start process brief scheme: * * |<----DESCFRAMES--->||<----DESCFRAMES--->| * frame:| 0 | 1 | 2 | 3 | 4 || 5 | 6 | 7 | 8 | 9 | * ----------------------------------------------------------- * | in urb 0 || in urb 1 | * in: |+++|+++|+++|+++|+++||+++|+++|+++|+++|+++| * | out urb 0 || out urb 1 | * out: |+++|+++|+++|+++|+++||+++|+++|+++|+++|+++| * ----------------------------------------------------------- * fill out fifo start fifo * |<----------------->||<----------------->| * * */ static int st7554_stop (struct st7554_state *s) { USB_DBG ("st7554 stop...\n"); down(&s->sem); if(!test_and_clear_bit(RUNNING,&s->run_mask)) goto out; /* stop fifo */ s->set_reg(s, ST7554_FIFO_MASK, 0); s->set_reg(s, ST7554_SSI1_COUNTER, 0); if(test_bit(MO0_RUNNING,&s->run_mask)) usb_unlink_urb(s->mo.urb[0]); if(test_bit(MI0_RUNNING,&s->run_mask)) usb_unlink_urb(s->mi.urb[0]); if(test_bit(MO1_RUNNING,&s->run_mask)) usb_unlink_urb(s->mo.urb[1]); if(test_bit(MI1_RUNNING,&s->run_mask)) usb_unlink_urb(s->mi.urb[1]); while(test_bit(MO0_RUNNING,&s->run_mask) || test_bit(MI0_RUNNING,&s->run_mask) || test_bit(MO1_RUNNING,&s->run_mask) || test_bit(MI1_RUNNING,&s->run_mask) ) wait_for_completion(&s->stop_comp); /* flush buffers */ s->mi.dma.count = s->mi.dma.head = s->mi.dma.tail = 0; s->mo.dma.count = s->mo.dma.head = s->mo.dma.tail = 0; USB_DBG ("st7554 stopped - delay %d.\n", s->delay); out: up(&s->sem); return 0; } static int st7554_start (struct st7554_state *s) { int len, ret = 0; USB_DBG ("st7554 start...\n"); down(&s->sem); if(test_and_set_bit(RUNNING,&s->run_mask)) goto out; init_completion(&s->start_comp); init_completion(&s->stop_comp); /* setup run params */ s->disbalance = 0; len = 32; memset(s->mo.dma.buf,0,s->mo.dma.size); s->mo.dma.count = len; s->mo.dma.head = len; s->delay = len + ST7554_FIFO_SIZE + BYTES_IN_FRAMES(s,DESCFRAMES)*2; /* prepare urbs */ FILL_URB_IN(s, &s->mi, s->mi.urb[0], s->mi.maxsz*DESCFRAMES); FILL_URB_IN(s, &s->mi, s->mi.urb[1], s->mi.maxsz*DESCFRAMES); FILL_URB_OUT(s, &s->mo, s->mo.urb[0], s->mo.maxsz*DESCFRAMES); FILL_URB_OUT(s, &s->mo, s->mo.urb[1], BYTES_IN_FRAMES(s,DESCFRAMES)); s->mi.urb[0]->complete = mi_startup_complete; s->mo.urb[0]->complete = mo_startup_complete; s->mi.urb[1]->complete = mi_startup_complete; s->mo.urb[1]->complete = mo_complete; /* submit all urbs */ ret = usb_submit_urb(s->mo.urb[0],GFP_KERNEL); if(ret) goto out; set_bit(MO0_RUNNING,&s->run_mask); ret = usb_submit_urb(s->mi.urb[0],GFP_KERNEL); if(ret) goto out; set_bit(MI0_RUNNING,&s->run_mask); ret = usb_submit_urb(s->mo.urb[1],GFP_KERNEL); if(ret) goto out; set_bit(MO1_RUNNING,&s->run_mask); ret = usb_submit_urb(s->mi.urb[1],GFP_KERNEL); if(ret) goto out; set_bit(MI1_RUNNING,&s->run_mask); USB_DBG("st7554 start: submitted urbs: " "mo0(%p) %d, mi0(%p) %d, mo1(%p) %d, mi1(%p) %d.\n", s->mo.urb[0], s->mo.urb[0]->start_frame, s->mi.urb[0], s->mi.urb[0]->start_frame, s->mo.urb[1], s->mo.urb[1]->start_frame, s->mi.urb[1], s->mi.urb[1]->start_frame); wait_for_completion(&s->start_comp); USB_DBG("st7554 start: starting...\n"); /* start fifo */ ret = s->set_reg(s, ST7554_SSI1_COUNTER, s->fragsize); if (ret < 0) goto out; /* set fifo mask */ ret = s->set_reg(s, ST7554_FIFO_MASK, SSI1_UNDERRUN|SSI1_OVERRUN); out: up(&s->sem); if(ret) { USB_ERR("st7554: start failed = %d (mask %lx)\n", ret, s->run_mask); st7554_stop(s); } return ret; } static int st7554_set_srate (struct st7554_state *s, unsigned srate) { unsigned long flags; if (s->srate == srate) return 0; if(s->codec.set_srate(s, srate)) return -EINVAL; spin_lock_irqsave(&s->lock,flags); s->srate = srate; spin_unlock_irqrestore(&s->lock,flags); return 0; } static int st7554_set_format (struct st7554_state *s, unsigned format) { unsigned long flags; if(format == MFMT_QUERY) return s->codec.set_format(s, MFMT_QUERY); if (s->format == format) return 0; if(s->codec.set_format(s, format)) return -EINVAL; spin_lock_irqsave(&s->lock,flags); s->format = format; spin_unlock_irqrestore(&s->lock,flags); return 0; } static int st7554_set_frag (struct st7554_state *s, unsigned frag) { unsigned long flags; spin_lock_irqsave(&s->lock,flags); s->fragsize = frag; spin_unlock_irqrestore(&s->lock,flags); return 0; } static int st7554_set_hook(struct st7554_state *s, unsigned hook) { unsigned long flags; u16 val = s->gpio; if (hook == MODEM_HOOK_OFF) val |= (GPIO_HOOK1_OFF|GPIO_LED_HOOK); else if (hook == MODEM_HOOK_ON) val &= ~(GPIO_HOOK1_OFF|GPIO_LED_HOOK); else return -EINVAL; if(s->set_reg(s, ST7554_GPIO_OUT, val)) return -EIO; spin_lock_irqsave(&s->lock,flags); s->gpio = val; spin_unlock_irqrestore(&s->lock,flags); return 0; } /* * file operations * */ static ssize_t st7554_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct st7554_state *s = (struct st7554_state *)file->private_data; struct dmabuf *db; unsigned long flags; int cnt, ret = 0; if(!s) return -ENODEV; db = &s->mi.dma; while (count) { cnt = count; spin_lock_irqsave(&s->lock,flags); if ( cnt > db->count ) cnt = db->count; if ( cnt > db->size - db->tail ) cnt = db->size - db->tail; spin_unlock_irqrestore(&s->lock,flags); if ( cnt <= 0 ) break; if(copy_to_user(buffer, db->buf + db->tail, cnt)) return -EFAULT; spin_lock_irqsave(&s->lock,flags); db->count -= cnt; db->tail = (db->tail + cnt)%db->size; spin_unlock_irqrestore(&s->lock,flags); buffer += cnt; count -= cnt; ret += cnt; } return ret; } static ssize_t st7554_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct st7554_state *s = (struct st7554_state *)file->private_data; struct dmabuf *db; unsigned long flags; int cnt, ret = 0; if(!s) return -ENODEV; db = &s->mo.dma; while (count) { cnt = count; spin_lock_irqsave(&s->lock,flags); if ( cnt > db->size - db->count ) cnt = db->size - db->count; if ( cnt > db->size - db->head ) cnt = db->size - db->head; spin_unlock_irqrestore(&s->lock,flags); if ( cnt <= 0 ) return ret; if(copy_from_user(db->buf + db->head, buffer, cnt)) return -EFAULT; spin_lock_irqsave(&s->lock,flags); db->count += cnt; db->head = (db->head + cnt)%db->size; spin_unlock_irqrestore(&s->lock,flags); buffer += cnt; count -= cnt; ret += cnt; } return ret; } static unsigned int st7554_poll(struct file *file, poll_table *wait) { struct st7554_state *s = (struct st7554_state *)file->private_data; unsigned long flags; unsigned int mask = 0; if(!s) return POLLERR; poll_wait(file,&s->wait,wait); spin_lock_irqsave(&s->lock,flags); if(s->status & MDMSTAT_ERROR) mask |= POLLERR; if(s->status & MDMSTAT_RING) mask |= POLLPRI; if(s->mi.dma.count > 0) { mask |= POLLIN | POLLRDNORM; } spin_unlock_irqrestore(&s->lock,flags); return mask; } static int st7554_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct st7554_state *s = (struct st7554_state *)file->private_data; USB_DBG ("st7554 ioctl: cmd %x...\n", cmd); if (!s || !s->usbdev) return -ENODEV; switch (cmd) { case MDMCTL_CAPABILITIES: return -EINVAL; case MDMCTL_HOOKSTATE: return st7554_set_hook(s, arg); case MDMCTL_SPEED: return st7554_set_srate(s, arg); case MDMCTL_GETFMTS: return st7554_set_format(s, MFMT_QUERY); case MDMCTL_SETFMT: return st7554_set_format(s, arg); case MDMCTL_SETFRAGMENT: return st7554_set_frag(s, arg); case MDMCTL_CODECTYPE: return CODEC_STLC7550; case MDMCTL_IODELAY: { int val; val = s->delay + ST7554_HW_IODELAY; USB_DBG("st7554 ioctl: IODELAY = %d.\n", val); return val; } case MDMCTL_START: return st7554_start(s); case MDMCTL_STOP: return st7554_stop(s); case MDMCTL_GETSTAT: USB_DBG ("st7554 ioctl: GETSTAT...\n"); { unsigned long flags; unsigned stat; spin_lock_irqsave(&s->lock,flags); stat = s->status; s->status = 0; spin_unlock_irqrestore(&s->lock,flags); if (put_user(stat, (unsigned *) arg)) return -EFAULT; } return 0; default: break; } return -ENOIOCTLCMD; } static long st7554_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) { return st7554_ioctl(NULL, file, cmd, arg); } static int st7554_open(struct inode *inode, struct file *file) { struct st7554_state *s; unsigned minor = MINOR(inode->i_rdev); USB_DBG("st7554 open...\n"); if(minor > arrsize(st7554_table)) return -ENODEV; down(&open_sem); s = st7554_table[minor]; if(!s || !s->usbdev) { up(&open_sem); return -ENODEV; } if(s->file) { up(&open_sem); return -EBUSY; } s->file = file; up(&open_sem); file->private_data = s; return 0; } static int st7554_close(struct inode *inode, struct file *file) { struct st7554_state *s = (struct st7554_state *)file->private_data; USB_DBG("st7554 close...\n"); if(s) { st7554_stop(s); s->file = NULL; } return 0; } static struct file_operations st7554_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = st7554_read, .write = st7554_write, .poll = st7554_poll, // .ioctl = st7554_ioctl, .unlocked_ioctl = st7554_ioctl32, .compat_ioctl = st7554_ioctl32, .open = st7554_open, .release = st7554_close, }; /* --------------------------------------------------------------------- */ static int st7554_get_reg (struct st7554_state *s, u8 reg, u16 *val) { int ret; ret = usb_control_msg(s->usbdev, usb_rcvctrlpipe(s->usbdev,s->ctrl_ep), reg|USB_DIR_IN, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN, 0, 0, val, sizeof(*val), CONTROL_MSG_TMO); if ( ret < 0 ) USB_ERR("st7554_get_reg: error: reg %x, ret = %d\n", reg, ret); return ret; } static int st7554_set_reg(struct st7554_state *s, u8 reg, u16 value) { int ret = usb_control_msg(s->usbdev, usb_sndctrlpipe(s->usbdev,s->ctrl_ep), reg, USB_TYPE_VENDOR|USB_RECIP_DEVICE, value, 0, NULL, 0, CONTROL_MSG_TMO); if (ret < 0 ) USB_ERR("st7554_set_reg: error: reg %x, val %x, ret = %d\n", reg, value, ret); return ret; } static int stlc7550_set_srate(struct st7554_state *s, unsigned int srate) { if ( srate == 8000 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3c8); else if (srate == 9600 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3c0); else if (srate == 16000 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3f0); else if (srate == 24000 ) return s->set_reg(s, ST7554_SSI1_CWORD,0x3e8); else return -EINVAL; } static int stlc7550_set_format(struct st7554_state *s, unsigned int format) { if (format == MFMT_QUERY) return MFMT_U16_LE | MFMT_S16_LE; if (!MFMT_IS_16BIT(format)) return -EINVAL; if (!MFMT_IS_LE(format)) return -EINVAL; return 0; } #if 0 static int st75951_set_srate(struct st7554_state *s, unsigned int srate) { return -EINVAL; } static int st75951_set_format(struct st7554_state *s, unsigned int format){ return -EINVAL; } #endif /* ---------------------------------------------------------------------- */ #if 0 /* ifdef DEBUG */ #define PRINT_REG(s ,reg, name) { u16 val; int ret; \ ret = s->get_reg(s,reg,&val);\ USB_DBG("st7554: vendor reg %s (%x) = %x , ret %d.\n", \ name, reg, val, ret); } static void print_all_regs(struct st7554_state *s) { PRINT_REG(s, ST7554_REVISION,"REVISION"); PRINT_REG(s, ST7554_SSI1_CONTROL,"SSI1_CONTROL"); PRINT_REG(s, ST7554_SSI2_CONTROL,"SSI2_CONTROL"); PRINT_REG(s, ST7554_FIFO_MASK,"FIFO_MASK"); PRINT_REG(s, ST7554_FIFO_SSI1_COUNTER,"FIFO_SSI1_COUNTER"); PRINT_REG(s, ST7554_FIFO_SSI2_COUNTER,"FIFO_SSI2_COUNTER"); PRINT_REG(s, ST7554_GPIO_DIR,"GPIO_DIR"); PRINT_REG(s, ST7554_GPIO_OUT,"GPIO_OUT"); PRINT_REG(s, ST7554_GPIO_MASK,"GPIO_MASK"); PRINT_REG(s, ST7554_GPIO_INV,"GPIO_INV"); PRINT_REG(s, ST7554_GPIO_STATUS,"GPIO_STATUS"); PRINT_REG(s, ST7554_FIFO_CONTROL1,"FIFO_CONTROL1"); PRINT_REG(s, ST7554_FIFO_CONTROL2,"FIFO_CONTROL2"); } #endif /* DEBUG */ /* ---------------------------------------------------------------------- */ #define SET_REG(s,reg,val) { ret = s->set_reg(s,reg,val); if (ret < 0) { USB_ERR("st7554: failed to set reg %x.\n", reg); ; return ret;} } static int st7554_init (struct st7554_state *s) { int ret; s->gpio = 0; SET_REG(s, ST7554_GPIO_DIR, 0x3ff8); SET_REG(s, ST7554_GPIO_OUT, 0x00); /* SET_REG(s, ST7554_GPIO_MASK, GPIO_HANDSET); */ SET_REG(s, ST7554_GPIO_MASK, GPIO_RING1); SET_REG(s, ST7554_FIFO_CONTROL1, 0x2828|BYTE_ORDER_LE); SET_REG(s, ST7554_FIFO_CONTROL2, 0x2828); SET_REG(s, ST7554_FIFO_MASK, 0x00); SET_REG(s, ST7554_FIFO_MASK, SSI1_UNDERRUN|SSI1_OVERRUN); SET_REG(s, ST7554_SSI1_COUNTER, 0x00); SET_REG(s, ST7554_SSI2_COUNTER, 0x00); /* power up */ SET_REG(s, ST7554_SSI1_CONTROL, SSI1_POWERUP); /* control word */ SET_REG(s, ST7554_SSI1_CWORD, 0x3c0); /* no inversion */ SET_REG(s, ST7554_GPIO_INV, 0); /* clear usb ep */ usb_clear_halt(s->usbdev, s->mi.pipe); usb_clear_halt(s->usbdev, s->mo.pipe); return 0; } static int st7554_release (struct st7554_state *s) { int ret; USB_DBG("st7554_release: clear regs...\n"); /* clear fifo & gpio masks */ SET_REG(s, ST7554_FIFO_MASK, 0); SET_REG(s, ST7554_GPIO_MASK, 0); /* hook on && all */ s->gpio = 0; SET_REG(s, ST7554_GPIO_OUT, 0x00); /* power down */ SET_REG(s, ST7554_SSI1_CONTROL, SSI1_POWERDOWN); return 0; } /* --------------------------------------------------------------------- */ static int st7554_probe(struct usb_interface *interface, const struct usb_device_id *id); static void st7554_disconnect(struct usb_interface *interface); static struct usb_device_id st7554_ids [] = { { USB_DEVICE(ST7554_VENDOR_ID,ST7554_PRODUCT_ID) }, { 0 } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, st7554_ids); static struct usb_driver st7554_usb_driver = { #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) .owner = THIS_MODULE, #endif .name = "ST7554 USB Modem", .probe = st7554_probe, .disconnect = st7554_disconnect, .id_table = st7554_ids, }; /* --------------------------------------------------------------------- */ static int st7554_probe(struct usb_interface *interface, const struct usb_device_id *id) { struct usb_device *usbdev = interface_to_usbdev(interface); struct st7554_state *s; struct usb_host_interface *iface_desc; int i , ret; u16 val; if ((usbdev->descriptor.idVendor != ST7554_VENDOR_ID) || (usbdev->descriptor.idProduct != ST7554_PRODUCT_ID)) return -ENODEV; USB_DBG("st7554 usb: probe...\n"); s = kmalloc(sizeof(*s), GFP_KERNEL); if (!s) { USB_ERR("st7554 probe: no memory.\n"); return -ENOMEM; } memset(s, 0, sizeof(*s)); spin_lock_init(&s->lock); #ifdef init_MUTEX init_MUTEX (&s->sem); #else sema_init (&s->sem, 1); #endif init_waitqueue_head(&s->wait); s->name = "ST7554 USB Modem"; s->usbdev = usbdev; s->iface = interface; s->ctrl_ep = 0; iface_desc = &interface->altsetting[1]; usb_set_interface(usbdev, 0, 1); /* interrupt init */ s->intr_urb = usb_alloc_urb(0,GFP_KERNEL); if (!s->intr_urb) { USB_ERR("cannot alloc intr urb\n"); kfree(s); return -ENOMEM; } usb_fill_int_urb(s->intr_urb, usbdev, usb_rcvintpipe(usbdev,iface_desc->endpoint[0].desc.bEndpointAddress), &s->intr_status, sizeof(s->intr_status), st7554_interrupt, s, iface_desc->endpoint[0].desc.bInterval); ret = usb_submit_urb(s->intr_urb,GFP_KERNEL); if (ret < 0) { USB_ERR("st7554_init: cannot submit intr urb: %d.\n", ret); goto error; } s->mo.pipe = usb_sndisocpipe(usbdev,iface_desc->endpoint[1].desc.bEndpointAddress); s->mo.maxsz = iface_desc->endpoint[1].desc.wMaxPacketSize; s->mo.interval = iface_desc->endpoint[1].desc.bInterval; s->mi.pipe = usb_rcvisocpipe(usbdev,iface_desc->endpoint[2].desc.bEndpointAddress); s->mi.maxsz = iface_desc->endpoint[2].desc.wMaxPacketSize; s->mi.interval = iface_desc->endpoint[2].desc.bInterval; USB_DBG("probe: int interval %d, maxsize mo %d, mi %d\n", iface_desc->endpoint[0].desc.bInterval, iface_desc->endpoint[1].desc.wMaxPacketSize, iface_desc->endpoint[2].desc.wMaxPacketSize ); s->get_reg = st7554_get_reg; s->set_reg = st7554_set_reg; /* SSI1 codec detection */ if (s->get_reg(s,ST7554_GPIO_STATUS,&val) < 0) { USB_ERR("st7554 probe: cannot detect codec type.\n"); goto error; } if (val&GPIO_MONOLITHINC) { /* st75951/2 silicon DAA codec */ USB_ERR("st7554 probe: unsupported codec st75951/2.\n"); s->codec.name = "stlc75971/2"; goto error; } else { USB_DBG("codec stlc7550 detected.\n"); s->codec.name = "stlc7550"; s->codec.set_srate = stlc7550_set_srate ; s->codec.set_format = stlc7550_set_format; } if(st7554_init(s)) { USB_ERR("st7554 probe: cannot initialize device.\n"); goto error; } st7554_set_hook (s, MODEM_HOOK_ON); st7554_set_srate (s, 9600); st7554_set_format(s, MFMT_S16_LE); st7554_set_frag (s, 96); if (mo_init(s) < 0 ) { USB_ERR("st7554: cannot init out channel.\n"); goto error1; } if (mi_init(s) < 0 ) { USB_ERR("st7554: cannot init in channel.\n"); mo_free(s); goto error1; } down(&open_sem); for(i = 0 ; i < arrsize(st7554_table) ; i++) { if(st7554_table[i] == NULL) { st7554_table[i] = s; s->minor = i; break; } } up(&open_sem); if (i == arrsize(st7554_table)) { USB_ERR("no more states\n"); mo_free(s); mi_free(s); goto error1; } usb_set_intfdata(interface, s ); CLASS_DEVICE_CREATE(st7554_class, MKDEV(243, i), NULL, "slusb%d", i); USB_INFO(KERN_INFO "slusb: slusb%d is found.\n", s->minor); return 0; error1: st7554_release(s); error: if (s->intr_urb) { usb_unlink_urb(s->intr_urb); usb_free_urb(s->intr_urb); } kfree(s); return -ENOMEM; } static void st7554_disconnect(struct usb_interface *interface) { struct st7554_state *s = usb_get_intfdata(interface); usb_set_intfdata(interface, NULL ); USB_DBG("st7554 disconnect...\n"); if (!s || !s->usbdev) { USB_DBG("st7554 disconnect: no dev.\n"); return; } CLASS_DEVICE_DESTROY(st7554_class, MKDEV(243, s->minor)); st7554_stop(s); down(&open_sem); if(s->file) { /* TBD: notify disconnect */ s->file->private_data = NULL; s->file = NULL; } USB_DBG("unlink intr...\n"); if (s->intr_urb) { usb_unlink_urb(s->intr_urb); usb_free_urb(s->intr_urb); } st7554_release(s); s->usbdev = NULL; st7554_table[s->minor] = NULL; up(&open_sem); USB_DBG("st7554 mo/mi free...\n"); mo_free(s); mi_free(s); kfree(s); } /* ---------------------------------------------------------------------- */ static int __init st7554_modem_init(void) { int ret; USB_INFO ("ST7554 USB Modem.\n"); st7554_class = CLASS_CREATE(THIS_MODULE, "slusb"); if (IS_ERR(st7554_class)) { ret = PTR_ERR(st7554_class); USB_ERR("st7554_modem_init: failed to create sysfs class, error %d\n", ret); return ret; } ret = usb_register(&st7554_usb_driver); if ( ret ) { USB_ERR ("st7554_modem_init: cannot register usb device.\n"); CLASS_DESTROY(st7554_class); return ret; } if(register_chrdev(243, "slusb", &st7554_fops) < 0) { usb_deregister(&st7554_usb_driver); CLASS_DESTROY(st7554_class); return -ENOMEM; } return 0; } static void __exit st7554_modem_exit(void) { USB_DBG ("st7554: exit...\n"); unregister_chrdev(243,"slusb"); usb_deregister(&st7554_usb_driver); CLASS_DESTROY(st7554_class); } module_init(st7554_modem_init); module_exit(st7554_modem_exit); MODULE_AUTHOR("Smart Link Ltd."); MODULE_DESCRIPTION("ST7554 USB Smart Link Soft Modem driver."); //MODULE_LICENSE("Smart Link Ltd."); MODULE_LICENSE("Dual BSD/GPL"); slmodem-2.9.11-20110321/drivers/sysdep_amr.c0000644000175000000620000001325410773430100016750 0ustar marvstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * sysdep_amr.c -- pci driver sysdep routines. * * Author: Seva (seva@smlink.com) * * */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include /* memory allocations */ asmlinkage void *sysdep_malloc (unsigned int size) { void *mem; mem = kmalloc(size, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); if(!mem) printk(KERN_ERR "slmdm: cannot alloc %db mem\n", size); return mem; } asmlinkage void sysdep_free (void *mem) { kfree(mem); } /* strings */ asmlinkage void *sysdep_memset(void *d,int c,size_t l) { return memset(d,c,l); } asmlinkage void *sysdep_memcpy(void *d,const void *s,size_t l) { return memcpy(d,s,l); } asmlinkage size_t sysdep_strlen(const char *s) { return strlen(s); } asmlinkage char *sysdep_strncpy(char *d,const char *s, size_t l) { return strncpy(d,s,l); } asmlinkage int sysdep_strcmp(const char *s1,const char *s2) { return strcmp(s1, s2); } asmlinkage int sysdep_sprintf(char *buf, const char *fmt, ...) { va_list args; int i; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); return i; } /* getting times */ asmlinkage unsigned long sysdep_get_utime(void) { struct timeval t; do_gettimeofday (&t); return t.tv_sec * 1000000 + t.tv_usec ; } /* cli/sti handling */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28)) asmlinkage void sysdep_save_flags (unsigned long *flags) {save_flags(*flags); } asmlinkage void sysdep_restore_flags(unsigned long *flags) {restore_flags(*flags);} asmlinkage void sysdep_cli(void) {cli();} #else asmlinkage void sysdep_save_flags (unsigned long *flags) {local_irq_save(*flags); } asmlinkage void sysdep_restore_flags(unsigned long *flags) {local_irq_restore(*flags);} asmlinkage void sysdep_cli(void) {} #endif /* dmesg print */ asmlinkage void sysdep_dmesg_print(const char *s) { printk("%s\n",s); } /* page allocations */ asmlinkage unsigned long sysdep_get_free_pages(unsigned long order) { return __get_free_pages(GFP_KERNEL, order); } asmlinkage void sysdep_free_pages(unsigned long addr, unsigned long order) { free_pages(addr, order); } asmlinkage unsigned long sysdep_virt_to_phys(volatile void * address) { return virt_to_phys (address); } /* delay */ asmlinkage void sysdep_udelay(unsigned long usecs) { udelay(usecs); } /* from linux/pci.h */ asmlinkage int sysdep_pci_read_config_byte (void *dev, unsigned char where, unsigned char *val) { return pci_read_config_byte (dev, where, val); } asmlinkage int sysdep_pci_read_config_word (void *dev, unsigned char where, unsigned short *val) { return pci_read_config_word (dev, where, val); } asmlinkage int sysdep_pci_read_config_dword (void *dev, unsigned char where, unsigned int *val) { return pci_read_config_dword (dev, where, val); } asmlinkage int sysdep_pci_write_config_byte (void *dev, unsigned char where, unsigned char val) { return pci_write_config_byte (dev, where, val); } asmlinkage int sysdep_pci_write_config_word (void *dev, unsigned char where, unsigned short val) { return pci_write_config_word (dev, where, val); } asmlinkage int sysdep_pci_write_config_dword (void *dev, unsigned char where, unsigned int val) { return pci_write_config_dword (dev, where, val); } /* io */ asmlinkage unsigned char sysdep_inb(unsigned short port) { return inb(port); } asmlinkage void sysdep_outb(unsigned char data,unsigned short port) { outb(data,port); } asmlinkage unsigned short sysdep_inw(unsigned short port) { return inw(port); } asmlinkage void sysdep_outw(unsigned short data,unsigned short port) { outw(data,port); } asmlinkage unsigned long sysdep_inl(unsigned short port) { return inl(port); } asmlinkage void sysdep_outl(unsigned long data,unsigned short port) { outl(data,port); } slmodem-2.9.11-20110321/drivers/modules.order0000644000175000000620000000010311420701153017127 0ustar marvstaffkernel//usr/src/pkg/smart/slmodem-2.9.11-20100718/drivers/slamr.ko slmodem-2.9.11-20110321/drivers/Module.symvers0000644000175000000620000000000010773430100017276 0ustar marvstaffslmodem-2.9.11-20110321/drivers/makefile.00000644000175000017500000000014411324677320016147 0ustar marvmarvall: @echo " finished all:" @echo DEST=${DESTDIR} @echo RM=${RM} @echo module-dir=${module-dir} slmodem-2.9.11-20110321/Changes0000644000175000000620000000715410775037640014273 0ustar marvstaff* Recent version - automated recognition of x86_64 host for compile of 64 bit slusb, and concurent 32 bit slmodemd compile - support upto 2.6.24 added - compatibility fixes - class_simple wrapper by Stefan Schweizer - example of Ubuntu startup script by Nicola Inchingolo - example of Slackware startup script by Sanel Z - merged 2.9.9x: Applied patch for USB fix, from SashaK - merged 2.9.9x: Modem speaker support (ALSA mode) - merged 2.9.9x: 'shortbuffer' slmodemd's option (required with ALI5451 modems) - merged 2.9.9x: gcc4 build support - merged 2.9.9x: added Intel ICH6 and ICH7 support - misc fixes * Version 2.9.11 - Off-hook with mixer (ALSA mode) - device major numbers change, (212 -> 242, 213 -> 243) - support for HSP1688 PCI modem - misc compatibility fixes - misc improvements * Version 2.9.10 - internal ring detector - misc fixes * Version 2.9.9 - sysfs support (contributed by Daniel Drake) - fix broken USB ST7554 support for 2.4 kernels - V32 fixes - misc fixes * Version 2.9.8 - T.35 country codes fixes - Fax Class1 support - Mandrake style startup script 'scripts/mandrake' (contributed by Gaetano Lombardo) - misc improvements - misc fixes * Version 2.9.7 - Support for SL2800 modem cards - V90/V92 improvements - Voice modem (V253 like, supports vgetty) - V23 fixes - CID, ring detection fixes - misc improvements and fixes * Version 2.9.6 - v34 and v34 fallback fix - v92 QC fix - COPYING file was added - '--perm' option fix (thanks to Michal Jaegermann) - v34/v90/v92 improvements and fixes - v32, v32bis modems - v22, v22bis, Bell212 modems - v23 modem - Bell103, V21 modem - Caller ID - Pulse dialer - SuSE style startup script 'scripts/suse' (contributed by Gerd Fleischer) - improvements and fixes * Version 2.9.5 - v8/v34/v90 improvements - ALSA mode improvements (looks more useful now) - ALSA xrun recovery - ability to update tx/rx delay - ICH ALSA driver (intel8x0m.c) 'long names' fix - Debian style startup script 'scripts/debian/slmodem' (contributed by Mike Gabriel) - improvements and fixes * Version 2.9.4 - group and permission setup for PTY - 'devfs' support (for Linux Kernel 2.4) - improvements and fixes * Version 2.9.3 - ALSA mode (not finished, experimental, kernel patch is needed) - ICH5 support - RH style startup script and RPM spec file were contributed by Stefan Becker - 'scripts' directory for misc useful utils was added - improvements and fixes * Version 2.9.2 - support for st7554 based USB modems readded for kernels 2.4, 2.6 - 'devfs' support (for Linux Kernel 2.6) - many fixes * Version 2.9.1 - user-space softmodem - support for kernel 2.6 * Version 2.8.4 - 2.8 release line is suspended - v92 QC support * Version 2.8.3 - critical v34/v90 fixes - backward compatible 'install-amr/-usb' make targets - error corrector small improvements - misc fixes * Version 2.8.2 - installation improvements. - invalid start delay fix. - disabling pulse dialing (not implemented yet). - v34/v90 protocol fixes. - at processor improvements. - reentrant dsp code. - misc fixes. * Version 2.8.1 - escape mode switch fix. - AT&A,AT+MS commands. - error corrector protocol fixes. - tty driver improvements. - mgetty support. - support for speaker (if exists). - procfs interface for debugging. - hot device unplug support. - misc fixes. * Version 2.8.0 - new open architecture. - modem core from scratch. - pluggable hw modem drivers. - support for multiple modems. - V34/V90 caller and answer data modem. slmodem-2.9.11-20110321/scripts/0000755000175000000620000000000010773430100014442 5ustar marvstaffslmodem-2.9.11-20110321/scripts/slmodem.spec0000644000175000000620000001754010773430100016765 0ustar marvstaff# Generate version information for kernel module %define kname %(echo `uname -r`) %define kver %(echo %{kname} | sed -e 's/smp//' -e 's/bigmem//' -e 's/enterprise//') %define ktype %(echo kernel-%{kname}|sed -e 's/%{kver}//' -e 's/-$//') %define krel %(echo %{kname} | sed -e 's/-/_/g') ############################################################################### # # Common Package Information # ############################################################################### Name: slmodem Version: 2.9.4 Release: 2 Distribution: Unknown License: SmartLink URL: ftp://ftp.smlink.com/linux/unsupported/ # Alternative: URL: http://linmodems.technion.ac.il/packages/smartlink/ Vendor: Smart Link Ltd. # # Source files (taken from $RPM_SOURCE_DIR) # Source0: %{name}-%{version}.tar.gz Source1: slmodemd # # Patches (taken from $RPM_SOURCE_DIR)) # #Patch0: XYZ.patch # # Build Requirements # #buildarch: noarch BuildRequires: kernel-source = %{kver} # Package preparation area BuildRoot: %{_tmppath}/%{name} ############################################################################### # # Package Information (Main) # ############################################################################### Summary: Driver for Smart Link HAMR5600 winmodem (user space) Group: System Environment/Driver AutoReq: 1 #PreReq: Describe dependencies to install this package (see %pre/%post) #Requires: Describe dependencies to use this package AutoProv: 1 #Provides: Describe what this package provides %description This is the Linux driver for the Smart Link Soft Modem HAMR5600 hardware. It provides a full-featured 56K Voice Fax Modem. This winmodem hardware is used e.g. in the IBM ThinkPad T30. This package includes the generic application (slmodemd) and the init script for it. %package -n kernel-module-%{name} ############################################################################### # # Subpackage Information (kernel module) # ############################################################################### Summary: Driver for Smart Link HAMR5600 winmodem (kernel space) Group: System Environment/Kernel Release: %{krel} AutoReq: 0 #PreReq: Describe dependencies to install this subpackage (see %pre/%post) Requires: %{name} = %{version} Requires: %{ktype} = %{kver} AutoProv: 0 #Provides: Describe what this subpackage provides %description -n kernel-module-%{name} This is the Linux driver for the Smart Link Soft Modem HAMR5600 hardware. It provides a full-featured 56K Voice Fax Modem. This winmodem hardware is used e.g. in the IBM ThinkPad T30. This package includes the hardware specific kernel-space drivers (slamr, slusb) and the device nodes for them. ############################################################################### # # Build Phase Information # ############################################################################### # Define %_make_cmd in $HOME/.rpmmacros to override the standard make %if !%{?_make_cmd:1}0 %define _make_cmd make %endif # Use '--define "_skip_build 1"' during package testing to skip build phases %if !%{?_skip_build:1}0 %prep # # Preparation (-bp): Unpack the source files to $RPM_BUILD_DIR... # %setup -q # ... apply patches #%patch0 -p1 -b .XYZ %build # # Compilation (-bc): Configure and build sources in $RPM_BUILD_DIR # export KERNEL_VER=%{kver} %{_make_cmd} KERNEL_DIR=/lib/modules/%{kname}/build %install # # Installation (-bi): Copy data from build $RPM_BUILD_DIR to # package preparation area %{buildroot} # # "install" from Makefile is broken, so do everything by hand... rm -rf %{buildroot} install -D -m 755 modem/slmodemd %{buildroot}/usr/sbin/slmodemd install -D -m 755 -d %{buildroot}/var/lib/slmodemd install -D -m 644 drivers/slamr.o %{buildroot}/lib/modules/%{kname}/misc/slamr.o install -D -m 644 drivers/slusb.o %{buildroot}/lib/modules/%{kname}/misc/slusb.o # Hack device for kppp mkdir -p %{buildroot}/dev ln -sf /dev/ttySL0 %{buildroot}/dev/modem # Install service file install -D -m 755 %{SOURCE1} %{buildroot}/etc/init.d/slmodemd %clean # # Installation cleanup: Delete package preparation area %{buildroot} # rm -rf %{buildroot} %else # !%{_skip_build} # Fix environment when build phases are skipped... %define _builddir %{_topdir}/BUILD/%{name}-%{version} %endif # !%{_skip_build} %files ############################################################################### # # Packaging Phase Information (Main) # ############################################################################### # # Package Content # %defattr (-,root,root) # Directories owned by this package %dir /var/lib/slmodemd # Files owned by this package (taken from %{buildroot} /usr/sbin/slmodemd /etc/init.d/slmodemd # Documentation for this package (taken from $RPM_BUILD_DIR) %doc README %doc README.1st # # Package Installation Scripts # # NOTE: During "update" of a package the order of execution is # # %pre (NEW) # %post (NEW) # %preun (OLD) # %postun (OLD) # #%pre # Commands to execute before package is installed (see also Prereq:) # Parameter $1: 1 = install, 2 = update #%post # Commands to execute after package is installed (see also Prereq:) # Parameter $1: 1 = install, 2 = update #%preun # Commands to execute before package is uninstalled # Parameter $1: 0 = remove, 1 = update #%postun # Commands to execute after package is uninstalled # Parameter $1: 0 = remove, 1 = update %files -n kernel-module-%{name} ############################################################################### # # Packaging Phase Information (Subpackage kernel module) # ############################################################################### # # Package Content # %defattr (-,root,root) # Directories owned by this package #%dir %{_datadir}/... # Files owned by this package (taken from %{buildroot}) /lib/modules/%{kname}/misc/slamr.o /lib/modules/%{kname}/misc/slusb.o # Devices %defattr (600,root,root) %dev (c, 212, 0) /dev/slamr0 %dev (c, 212, 1) /dev/slamr1 %dev (c, 212, 2) /dev/slamr2 %dev (c, 212, 3) /dev/slamr3 %dev (c, 213, 0) /dev/slusb0 %dev (c, 213, 1) /dev/slusb1 %dev (c, 213, 2) /dev/slusb2 %dev (c, 213, 3) /dev/slusb3 /dev/modem # Documentation for this package (taken from $RPM_BUILD_DIR) #%doc ChangeLog # # Package Installation Scripts # # NOTE: During "update" of a package the order of execution is # # %pre (NEW) # %post (NEW) # %preun (OLD) # %postun (OLD) # #%pre -n kernel-module-%{name} # Commands to execute before package is installed (see also Prereq:) # Parameter $1: 1 = install, 2 = update %post -n kernel-module-%{name} # Commands to execute after package is installed (see also Prereq:) # Parameter $1: 1 = install, 2 = update if [ $1 = 1 ]; then cat << EOF >> /etc/modules.conf # added by kernel-module-slmodem package alias char-major-212 slamr alias char-major-213 slusb EOF fi /sbin/depmod -A %preun -n kernel-module-%{name} # Commands to execute before package is uninstalled # Parameter $1: 0 = remove, 1 = update service slmodemd stop modprobe -r slamr slusb if [ $1 = 0 ]; then rm -f /dev/ttySL* egrep -ve 'added by kernel-module-slmodem package|alias char-major-212 slamr|alias char-major-213 slusb' /etc/modules.conf >/tmp/modules.conf.slmodem$$ mv /tmp/modules.conf.slmodem$$ /etc/modules.conf fi /sbin/depmod -A #%postun -n kernel-module-%{name} # Commands to execute after package is uninstalled # Parameter $1: 0 = remove, 1 = update %changelog ############################################################################### # # Package Change History # ############################################################################### * Tue Nov 05 2003 Stefan Becker - The HW doesn't seem to like suspend. Added removal of the kernel modules when slmodemd is stopped, so HW can be kicked by restarting the service. * Mon Nov 04 2003 Stefan Becker - Initial version based on slmodem-2.9.2 slmodem-2.9.11-20110321/scripts/slmodemd.ubuntu.italy0000644000175000000620000000526310773430100020641 0ustar marvstaff#!/bin/sh # # slmodemd: Starts the SmartLink Modem Daemon # # chkconfig: 345 90 10 # description: This is the user space part of the SmartLink Modem driver # processname: slmodemd # config: /etc/sysconfig/slmodem # Source function library. #. /etc/init.d/functions NAME=slmodemd DAEMON=/usr/sbin/slmodemd PIDFILE=/var/run/$NAME.pid RETVAL=0 . /lib/lsb/init-functions # Default configuration SLMODEMD_DEVICE=slamr0 SLMODEMD_COUNTRY=ITALY # Test presence of daemon binary test -f $DAEMON || exit 0 # Source configuration CONFIG=/etc/default/$NAME if [ -f $CONFIG ]; then . $CONFIG else echo " # # This is the default configuration for the slmodem driver daemon # running on Debian systems. # # Edit device node and country code here ... # # possible country codes are: # # USA # GERMANY # BELGIUM # etc. # # use \'$DAEMON --countrylist\' to check out other countries # SLMODEMD_DEVICE=$SLMODEMD_DEVICE SLMODEMD_COUNTRY=$SLMODEMD_COUNTRY " > $CONFIG fi # uncomment this if you want this feature (if necessary edit module pattern): # do not try to start on a kernel which does not support it grep 'slamr\..*o' /lib/modules/`uname -r`/modules.dep > /dev/null || { \ echo "SmartLink modem driver not supported by Kernel `uname -r`. Exiting ..." exit 0 } start() { cat /proc/modules | grep 'slamr' >/dev/null || { #echo -n "Loading SmartLink Modem driver into kernel ... " log_begin_msg "Loading Smartlink Modem Driver into kernel ..." modprobe slamr && echo "done." || { i #echo "failed." log_end_msg 1 exit -1 } } #echo -n "Starting SmartLink Modem driver for: $SLMODEMD_DEVICE" log_begin_msg "Starting SmartLink Modem driver for: $SLMODEMD_DEVICE" start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --make-pidfile --background --quiet -- -c $SLMODEMD_COUNTRY #RETVAL=$? log_end_msg $? } stop() { log_begin_msg "Shutting down SmartLink Modem driver normally" ps -A | grep $NAME >/dev/null 2>/dev/null && { start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON || { log_end_msg 1 log_begin_msg "Trying it the hard way (send SIGKILL all $NAME processes): " log_end_msg 0 killall -KILL $NAME /bin/true RETVAL=0 } } || { log_begin_msg " ... no $NAME daemon running"; RETVAL=0; log_end_msg 0; } log_end_msg 0 } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart|reload) stop echo "" rm $PIDFILE start ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|restart}" exit 1 esac if [ $? == 0 ]; then #echo "." if [ $1 == "stop" ]; then rm $PIDFILE &>/dev/null fi exit 0 else echo " failed." exit -1 fi slmodem-2.9.11-20110321/scripts/mandrake/0000755000175000000620000000000010773430100016224 5ustar marvstaffslmodem-2.9.11-20110321/scripts/mandrake/slmodemd0000755000175000000620000000352510773430100017763 0ustar marvstaff#!/bin/sh # # slmodemd: Starts the SmartLink Modem Daemon # # chkconfig: 345 90 10 # description: SmartLink Modem : Autoload slarm + slmodem # processname: slmodemd # config: /etc/sysconfig/slmodem # Source function library. . /etc/init.d/functions prog=slmodemd RETVAL=0 # Default configuration SLMODEMD_DEVICE=slamr0 SLMODEMD_COUNTRY=ITALY # Source configuration CONFIG=/etc/sysconfig/$prog if [ -f $CONFIG ]; then . $CONFIG fi # uncomment this if you want this feature (if necessary edit module pattern): # do not try to start on a kernel which does not support it # grep -q 'slamr\.o' /lib/modules/`uname -r`/modules.dep || exit 0 start() { cat /proc/modules | grep 'slamr' >/dev/null || { echo -n "Loading SmartLink Modem driver into kernel ... " modprobe slamr && echo "done." || { echo "failed." exit -1 } } echo -n "Starting SmartLink Modem driver for $SLMODEMD_DEVICE: " # if you want ALSA comment next line and uncomment last $prog /dev/null 2>/dev/null --country=$SLMODEMD_COUNTRY /dev/$SLMODEMD_DEVICE & # $prog /dev/null 2>/dev/null --country=$SLMODEMD_COUNTRY --alsa /dev/$SLMODEMD_DEVICE & RETVAL=$? [ $RETVAL -eq 0 ] && success $"$prog startup" || failure $"$prog startup" echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog return $RETVAL } stop() { echo -n "Shutting down SmartLink Modem driver: " killproc $prog RETVAL=$? modprobe -r slamr slusb echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog return $RETVAL } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status $prog RETVAL=$? ;; restart|reload) stop start RETVAL=$? ;; condrestart) if [ -f /var/lock/subsys/$prog ]; then stop start RETVAL=$? fi ;; *) echo "*** Usage: $prog {start|stop|status|restart|condrestart}" exit 1 esac exit $RETVAL slmodem-2.9.11-20110321/scripts/debian/0000755000175000000620000000000010773430100015664 5ustar marvstaffslmodem-2.9.11-20110321/scripts/debian/slmodemd0000755000175000000620000000473710773430100017431 0ustar marvstaff#!/bin/sh # # slmodemd: Starts the SmartLink Modem Daemon # # chkconfig: 345 90 10 # description: This is the user space part of the SmartLink Modem driver # processname: slmodemd # config: /etc/sysconfig/slmodem # Source function library. #. /etc/init.d/functions NAME=slmodemd DAEMON=/usr/sbin/slmodemd PIDFILE=/var/run/$NAME.pid RETVAL=0 # Default configuration SLMODEMD_DEVICE=slamr0 SLMODEMD_COUNTRY=USA # Test presence of daemon binary test -f $DAEMON || exit 0 # Source configuration CONFIG=/etc/default/$NAME if [ -f $CONFIG ]; then . $CONFIG else echo " # # This is the default configuration for the slmodem driver daemon # running on Debian systems. # # Edit device node and country code here ... # # possible country codes are: # # USA # GERMANY # BELGIUM # etc. # # use \'$DAEMON --countrylist\' to check out other countries # SLMODEMD_DEVICE=$SLMODEMD_DEVICE SLMODEMD_COUNTRY=$SLMODEMD_COUNTRY " > $CONFIG fi # uncomment this if you want this feature (if necessary edit module pattern): # do not try to start on a kernel which does not support it grep 'slamr\..*o' /lib/modules/`uname -r`/modules.dep > /dev/null || { \ echo "SmartLink modem driver not supported by Kernel `uname -r`. Exiting ..." exit 0 } start() { cat /proc/modules | grep 'slamr' >/dev/null || { echo -n "Loading SmartLink Modem driver into kernel ... " modprobe slamr && echo "done." || { i echo "failed." exit -1 } } echo -n "Starting SmartLink Modem driver for: $SLMODEMD_DEVICE" start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --make-pidfile --background --quiet -- -c $SLMODEMD_COUNTRY /dev/$SLMODEMD_DEVICE RETVAL=$? } stop() { echo -n "Shutting down SmartLink Modem driver normally" ps -A | grep $NAME >/dev/null 2>/dev/null && { start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON || { echo " probably failed." echo -n "Trying it the hard way (send SIGKILL all $NAME processes): " killall -KILL $NAME /bin/true RETVAL=0 } } || { echo -n " ... no $NAME daemon running"; RETVAL=0; } } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart|reload) stop echo "" rm $PIDFILE start ;; *) echo "Usage: /etc/init.d/$NAME {start|stop|restart}" exit 1 esac if [ $? == 0 ]; then echo "." if [ $1 == "stop" ]; then rm $PIDFILE &>/dev/null fi exit 0 else echo " failed." exit -1 fi slmodem-2.9.11-20110321/scripts/slmodemd0000755000175000000620000000337610773430100016205 0ustar marvstaff#!/bin/sh # # slmodemd: Starts the SmartLink Modem Daemon # # chkconfig: 345 90 10 # description: This is the user space part of the SmartLink Modem driver # processname: slmodemd # config: /etc/sysconfig/slmodem # Source function library. . /etc/init.d/functions prog=slmodemd RETVAL=0 # Default configuration SLMODEMD_DEVICE=slamr0 SLMODEMD_COUNTRY=USA # Source configuration CONFIG=/etc/sysconfig/$prog if [ -f $CONFIG ]; then . $CONFIG # override default group and permissions if defined in $CONFIG; # other valid options also can be put into SLMODEMD_OPTS variable [ "$GROUP" ] && SLMODEMD_OPTS="$SLMODEMD_OPTS --group=$GROUP" [ "$PERMS" ] && SLMODEMD_OPTS="$SLMODEMD_OPTS --perm=$PERMS" fi # uncomment this if you want this feature (if necessary edit module pattern): # do not try to start on a kernel which does not support it # grep -q 'slamr\..*o' /lib/modules/`uname -r`/modules.dep || exit 0 start() { echo -n "Starting SmartLink Modem driver for $SLMODEMD_DEVICE: " $prog /dev/null 2>/dev/null \ --country=$SLMODEMD_COUNTRY $SLMODEMD_OPTS /dev/$SLMODEMD_DEVICE & RETVAL=$? [ $RETVAL -eq 0 ] && success $"$prog startup" || failure $"$prog startup" echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog return $RETVAL } stop() { echo -n "Shutting down SmartLink Modem driver: " killproc $prog RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog return $RETVAL } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status $prog RETVAL=$? ;; restart|reload) stop start RETVAL=$? ;; condrestart) if [ -f /var/lock/subsys/$prog ]; then stop start RETVAL=$? fi ;; *) echo "*** Usage: $prog {start|stop|status|restart|condrestart}" exit 1 esac exit $RETVAL slmodem-2.9.11-20110321/scripts/suse/0000755000175000000620000000000010773430100015421 5ustar marvstaffslmodem-2.9.11-20110321/scripts/suse/slmodemd.SUSE0000755000175000000620000000424510773430100017736 0ustar marvstaff#!/bin/sh ### BEGIN INIT INFO # Provides: slmodemd # Required-Start: $syslog $remote_fs # Required-Stop: $syslog # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: slmodem daemon # Description: Start slmodem daemon for smartlink # softmodem driver. ### END INIT INFO # Check for missing daemon SLMODEMD_BIN=/usr/sbin/slmodemd if [ ! -x $SLMODEMD_BIN ]; then echo "slmodemd: $SLMODEMD_BIN not found" exit 5 fi # Check for config file in /etc/sysconfig # if not using default config SLMODEMD_CONFIG=/etc/sysconfig/slmodemd if [ ! -r $SLMODEMD_CONFIG ]; then echo "slmodemd: $SLMODEMD_CONFIG not found - using default config" SLMODEMD_DEVICE=/dev/slamr0 SLMODEMD_COUNTRY=GERMANY else . $SLMODEMD_CONFIG fi # Check for kernel modules case `echo "$SLMODEMD_DEVICE"|cut -c6-10` in slamr) grep -q 'slamr\..*o' /lib/modules/`uname -r`/modules.dep || \ { echo "slmodemd: kernel module slamr.(k)o missing"; exit 1; } ;; slusb) grep -q 'slusb\..*o' /lib/modules/`uname -r`/modules.dep || \ { echo "slmodemd: kernel module slusb.(k)o missing"; exit 1; } ;; *) echo "slmodemd: no kernel module for $SLMODEMD_DEVICE - broken config?" exit 1 ;; esac # Source SUSE rc functions and reset . /etc/rc.status rc_reset case "$1" in start) echo -n "Starting slmodemd" # loading modules also required for restart if [ "`echo "$SLMODEMD_DEVICE"|cut -c6-10`" == "slamr" ]; then modprobe slamr else modprobe slusb fi startproc $SLMODEMD_BIN --country=$SLMODEMD_COUNTRY $SLMODEMD_DEVICE > /dev/null 2>&1 rc_status -v ;; stop) echo -n "Shutting down slmodemd" killproc -TERM $SLMODEMD_BIN modprobe -r slamr slusb rc_status -v ;; reload|restart) $0 stop $0 start rc_status ;; try-restart) # only restart if already running if [ "`$0 status > /dev/null 2>&1`" == "0" ]; then $0 restart else echo "slmodemd not running" fi rc_status ;; status) echo -n "slmodemd is:" checkproc $SLMODEMD_BIN rc_status -v ;; *) echo "Usage: $0 {start|stop|reload|restart|try-restart|status}" exit 1 ;; esac rc_exit slmodem-2.9.11-20110321/scripts/suse/slmodemd.conf0000644000175000000620000000031010773430100020066 0ustar marvstaff#/etc/sysconfig/slmodemd #modem device, default /dev/slamr0, #for USB take /dev/slusb0 for example SLMODEMD_DEVICE=/dev/slamr0 #Your country, try "slmodemd --countrylist" SLMODEMD_COUNTRY=GERMANY slmodem-2.9.11-20110321/scripts/slackware/0000755000175000000620000000000010773430100016416 5ustar marvstaffslmodem-2.9.11-20110321/scripts/slackware/rc.slmodemd0000755000175000000620000000232510773430100020555 0ustar marvstaff#!/bin/sh # # rc.slmodemd # # Start slmodemd daemon for SmartLink # SLMODEMD_DEVICE=/dev/slusb0 slmodemd_start() { if [ -x /usr/sbin/slmodemd ]; then echo -n "Starting SmartLink modem daemon: " echo "/usr/sbin/slmodemd" /usr/sbin/slmodemd $SLMODEMD_DEVICE 1>/dev/null 2>/dev/null & fi } slmodemd_stop() { echo "Shutting down SmartLink modem daemon" killall slmodemd } slmodemd_restart() { slmodemd_stop sleep 1 slmodemd_start } if [ "$SLMODEMD_DEVICE" ]; then readonly SLMODEMD_DEVICE; fi if [ -z $SLMODEMD_DEVICE ]; then echo "slmodemd: SLMODEMD_DEVICE not set. You can set it in /etc/rc.d/rc.slmodemd file or as environment variable." exit 5 fi case `echo "$SLMODEMD_DEVICE"|cut -c6-10` in slamr) grep -q 'slamr\..*o' /lib/modules/`uname -r`/modules.dep ||\ { echo "slmodemd: kernel module slamr.(k)o missing"; exit 1; } ;; slusb) grep -q 'slusb\..*o' /lib/modules/`uname -r`/modules.dep ||\ { echo "slmodemd: kernel module slusb.(k)o missing"; exit 1; } ;; *) echo "slmodemd: no kernel module for $SLMODEMD_DEVICE - broken config?" exit 1 ;; esac case "$1" in 'start') slmodemd_start ;; 'stop') slmodemd_stop ;; 'restart') slmodemd_restart ;; *) echo "usage $0 start|stop|restart" esac slmodem-2.9.11-20110321/scripts/slackware/README0000644000175000000620000000101310773430100017271 0ustar marvstaffINSTALLATION ============= Copy rc.slmodemd to /etc/rc.d/ directory. If you want to be started during boot, append to /etc/rc.d/rc.local line: "/etc/rc.d/rc.slmodemd start" or simply "rc.slmodemd start". If you want to customize it, or to direct it to the right device, edit SLMODEMD_DEVICE. Script will exec file assuming default location (/usr/sbin/slmodem), so if you placed it somewhere else, please correct it in rc.slmodemd. For problems or something else, please mail me at: Sanel Zukan slmodem-2.9.11-20110321/Documentation/0000755000175000000620000000000010775036632015602 5ustar marvstaffslmodem-2.9.11-20110321/Documentation/ALSA_support.txt0000644000175000000620000000632510775035476020672 0ustar marvstaff For service with the ALSA modem drivers (snd-intel8x0m, snd-via82xx-modem, snd-atiixp-modem, and snd-hda-intel), the slmodemd helper was be compiled with incorporation of added ALSA code. The necessary code is provides by installation of a package libasound2-dev, which may have alternative names in some Linux distros. But the installed components are listed below. The actual compiler must proceed within the modem/ sub-folder of this package. So the command sequence is: $ cd driver $ make clean $ make SUPPORT_ALSA=1 The slmodemd is typically copied to the folder /usr/sbin/ For Ubuntu related distros do: $ sudo cp -a slmodemd /usr/sbin/ $ sudo chmod +x /usr/sbin/slmodemd For other distros $ su root # cp -a slmodemd /usr/sbin/ # chmod +x /usr/sbin/slmodemd Very minimal functionality tests are: $ slmodemd --version which should report like: SmartLink Soft Modem: version 2.9.11 Feb 29 2008 21:22:01 $ slmodemd --help $ slmodemd --countrylist will return details on parameter usage. Modem setup can proceed through: $ sudo modprobe DriverName though drivers will typically already be autoloaded. $ sudo slmodemd -c Country --alsa modem:1 or for usage with the snd-hda-intel driver: $ sudo slmodemd -c Country --alsa hw:0,n with n typically being 1 or 6 . The choice of n is evident for example in an ouput $ cat /proc/asound/pcm 00-00: STAC92xx Analog : STAC92xx Analog : playback 1 : capture 2 00-06: Si3054 Modem : Si3054 Modem : playback 1 : capture ---- wherein the 00-06 correponds to hw:0,6 while a 00-01 would correspond to hw:0,1 Note that hw:0,0 specifies the audio section of a High Definition Audio card, which may host a modem chip on the Subsystem. Components of the libasound2-dev package are: ----------------------------------------- /usr/share/lintian/overrides /usr/share/aclocal/alsa.m4 /usr/include/alsa/sound /usr/include/alsa/sound/ainstr_fm.h /usr/include/alsa/sound/ainstr_gf1.h /usr/include/alsa/sound/ainstr_simple.h /usr/include/alsa/sound/ainstr_iw.h /usr/include/alsa/sound/asound_fm.h /usr/include/alsa/sound/hdsp.h /usr/include/alsa/sound/sb16_csp.h /usr/include/alsa/sound/sscape_ioctl.h /usr/include/alsa/sound/emu10k1.h /usr/include/alsa/sound/type_compat.h /usr/include/alsa/asoundlib.h /usr/include/alsa/asoundef.h /usr/include/alsa/version.h /usr/include/alsa/global.h /usr/include/alsa/input.h /usr/include/alsa/output.h /usr/include/alsa/error.h /usr/include/alsa/conf.h /usr/include/alsa/pcm.h /usr/include/alsa/pcm_old.h /usr/include/alsa/pcm_plugin.h /usr/include/alsa/rawmidi.h /usr/include/alsa/timer.h /usr/include/alsa/hwdep.h /usr/include/alsa/control.h /usr/include/alsa/mixer.h /usr/include/alsa/mixer_abst.h /usr/include/alsa/seq_event.h /usr/include/alsa/seq.h /usr/include/alsa/seqmid.h /usr/include/alsa/seq_midi_event.h /usr/include/alsa/conv.h /usr/include/alsa/instr.h /usr/include/alsa/iatomic.h /usr/include/alsa/alisp.h /usr/include/alsa/pcm_external.h /usr/include/alsa/pcm_ioplug.h /usr/include/alsa/pcm_extplug.h /usr/include/alsa/pcm_rate.h /usr/include/alsa/control_external.h /usr/include/sys /usr/include/sys/asoundlib.h /usr/lib/libasound.a /usr/lib/libasound.la /usr/lib/pkgconfig /usr/lib/pkgconfig/alsa.pc /usr/share/doc/libasound2-dev /usr/lib/libasound.so Marv Stodolsky, 2008-03-24 slmodem-2.9.11-20110321/Documentation/Smartlink.txt0000644000175000000620000002570110773430100020276 0ustar marvstaff Smartlink modem setup. ----------------------------------------------------------- The modem should setup with: modprobe ungrab-winmodem modprobe slamr slmodemd -c YOUR_COUNTRY /dev/slamr0 which should announce creation of ports: /dev/ttySL0 --> /dev/pts/N , N some number Specify the symbolic link /dev/ttySL0 as the port to be used by dailer software. SmartLink (http://www.smlink.com/) chipset modems are sold under a variety of BrandNames, and have vendor IDs 163c, 2000, 2003, and 2004. Conexant bought Smartlinks's modem techhology sector in 2005. While Linux updates are not expected from Conexant, Linux support is still very good thanks to volunteer Linux maintainer Sasha Khapyorsky. Get his updated software from: http://linmodems.technion.il/packages/smartlink/ A high level support component is a smart helper: slmodemd Acting through one of several drivers, it creats ports dynamically and supports COMM and FAXing functions. During facsimile usage, the AT&F command is not supported. Usage of SMP (Symmetric MultiProcessor) mother boards is supported. For service on 64 bit AMD x86_64 processor mother boards, see http://linmodems.technion.ac.il/archive-fourth/msg02594.html http://linmodems.technion.ac.il/archive-fifth/msg02490.html However a 64 bit compilation of a proprietary dsplibs.o conponent is not available. Hence for modem must be operated in 32 bit mode. The compiling must be done with the 32 bit version of compiling resources The slmodemd supports a few different types of modem drivers. Below the suffix .ko means the modular form of a driver, before loading into the kernel. The slmodemd does not access the modem hardware directly. Rather access is provided through lower sophistication drivers. Prior to usage of a slamr driver, there must be a release of serial driver interference by loading of: ungrab-winmodem.ko For PCI card modems with Smartlink chips the driver used is: slamr.ko For USB modems with ID 0483:7554 use Smartlink driver: slusb.ko For ALSA (Advanced Linux Sound Architecture) modem drivers, see the Table below. Sasha's core resources are: ---------------------------- ungrab-winmodem.tar.gz - for compiling a ungrab-winmodem.ko driver slmodem-2.9.11-MostRecentDate.tar.gz - the core code resource for compiling and installing slmodemd, slamr.ko and slusb.ko. The slmodemd dynamically creates ports and provides higher level COMM functions, after driver loading. Not being a driver, slmodemd serves under alternative boot kernels. ALSA modem drivers, included with 2.6.n kernel+module releases. Some derivative resources at http://linmodems.technion.il/packages/smartlink/ SLMODEMD.gcc3.tar.gz - containing a compiled slmodemd and usage instructions. When used with ALSA modem drivers, further compiling is not necessary. > SLMODEMD.gcc3.tar.gz will suffice for getting online, though read on about automation. <<< sl-modem-daemon-SomeVersion.deb - an installer for Debian related distros. It has slmodemd and scripts for starting slmodemd at boot. This package is also available from repositories of Debian related distros Ubuntu, Kbuntu, Ebuntu, Xandros, Kanotix and others. sl-modem-daemon-SomeVersion.tar.gz has the same contents, but is repackaged in an easily opened format, for access to its automation scripts. After unpacking, they are resident in the etc/ subfolder sl-modem-source-SomeVersion.deb - is a Debian installer for the slamr and slusb source code. It is Not necessary for ALSA driver usage. slamr-KernelVersion.tar.gz - for several Ubuntu KernelVersions, containing: ungrab-winmodem.ko, slamr.ko, slusb.ko, slmomdem, setup script and as a convenience, the sl-modem-daemon-SomeVersion.deb. Look in the folder: http://linmodems.technion.il/packages/smartlink/ubuntu/ Slmodemd actions ----------------------------------------- Start working with slmodemd with commands: slmodemd --help slmodemd --countrylist The long output can be written to a Clist.txt file with: slmodemd --countrylist &> Clist.txt Find your COUNTRY_NAME within the 2nd column if the list and record it. It will be used in capital letters during the modem setup command. Try USA if your COUNTRY is not in the list. Before modem setup root/adm capacity must be acquired with: su - root or by prefixing commands with "sudo" for Ubuntu Linux and its cousins. The setup command is: slmodemd -c COUNTRY_NAME --alsa slmodemd_device if successful there will be reported dynamic creation of: /dev/ttySL0 --> /dev/pts/N , with N a number The /dev/ttySL0 is a symbolic link to the real modem port /dev/pts/N , and it is /dev/ttySL0 which should be named to dialup utilities such as wvdial. The "--alsa" is only needed for usage with ALSA modem drivers. Throughout a dialout session slmodemd MUST be kept running. Open another console/termimal to startup dialout software such as wvdial. The slmodemd device nodes --------------------------- The slmodemd_device is different for the several modem drivers. For usage with slamr.ko , the slmodemd_device is /dev/slamr0 , within the command sequence: modprobe ungrab-windmodem modprobe slamr slmodemd -c COUNTRY_NAME /dev/slamr0 For USB modem usage: modprobe slusb slmodemd -c COUNTRY_NAME /dev/slusb0 For a modems using a ALSA driver, details are below. The /dev/slamr0 and /dev/slusb0 will be made the slmodem installation processes. However, they usually will NOT survice reboot, because most current Linux have ports created in volatile RAM space. However the these devices can be manually created under root/adm persmission with: mknod -m 600 /dev/slamr0 c 242 0 mknod -m 600 /dev/slusb0 c 243 0 if automation scripts are not yet in place. For automation of RPM using Linux distros see: http://www20.brinkster.com/olivares/slmodemd-setup-1.html For any Distro the following lines will serve in /etc/modprobe.conf or subfolders of /etc/modprobe.d/: -------------- alias char-major-243 slusb alias char-major-242 slamr # The following install and remove commands are to be written as single lines. # Preloads ungrab-winmodem and creates a device node upon "modprobe slamr" install slamr modprobe --ignore-install ungrab-winmodem ; modprobe --ignore-install slamr; test -e /dev/slamr0 || (/bin/mknod -m 660 /dev/slamr0 c 242 0 2>/dev/null && chgrp dialout /dev/slamr0) # rpm using distros should use "uucp" rather than "dialout" # Removes slamr and ungrab-winmodem successively: remove slamr /sbin/modprobe -r --ignore-remove slamr ; /sbin/modprobe -r --ignore-remove ungrab-winmodem Usage with ALSA modem drivers -------------------------------- See SoftModem.txt for a description of the hardware. For a modem using an ALSA driver, the slmodemd_device only has to be specified within the slmodemd command line. A preliminary "mknod something" command is not necessary. The Table shows hardware PCI ID, its card type, driver and slmodemd_device name. The ALI5451 and HDA (High Definition Audio) cards can host softmodems. For these cards hw:0,0 is the audio card designation and the modem Subsystem on it is most commonly hw:0,1 , but there are some hw:0,6 cases. For the older soft modem controller family, the ALSA software first assigns hw:0 to an audio card, and the following modem designation is hw:1 or equivalently modem:1 An attempt to use modem:0 may initially appear successful, but modem:0 or hw:0 is actually the companion audio card. PCI ID controller ALSA driver slmodemd_device ========= =============== =============== =================== several HDA cards snd-hda-intel hw:0,1 or hw:0,6 10b9:5451 ALI5451 audio snd-ali5451 hw:0,1 ------------------ softmodem controllers -------------------------- 1002:434d ATI snd-atiixp-modem modem:1 1002:4378 ATI " " 1106:3068 VIA snd-via82xxx-modem " 8086:xxxx many Intel snd-intel8x0m " 10de:00d9 Nvidia Corp " " 1039:7013 SIS 630 " " Others? " test " --------------------------------------------------------------------------- * The scanModem script tries to determine ALSA modem driver and slmodemd_device dynamically from /proc/asound/ information, or the internal Archive as a fallback. Do a precautionary unloading and reloading of the driver. su - root (not for Ubuntu) modprobe -r driver modprobe driver This precaution is sometimes necessary, because a driver may functionally die although loaded. But usually it can be skipped. For most modems the setup command is: slmodemd -c COUNTRY_NAME --alsa modem:1 For modems on HDA cards, the command is: slmodemd -c COUNTRY_NAME --alsa hw:0,1 though there have been cases of hw:0,6 For the ALI5451 hosted modems, a shortbuffer (-s) option is needed: slmodemd -s -c COUNTRY_NAME --alsa hw:0,1 The slamr diagnostic --------------------- Sasha has provided slamr.ko with a capability for reporting softmodem codecs, even for modems not supported fully by slamr. This is useful when other resources do not report out the modem codec, needed to distinguish between hsfmodem, slamr and ALSA driver support alternatives. This slamr test is Not effective for softmodems on HDA audio cards. The test routine is: modprobe ungrab-winmodem modprobe slamr followed by a readout from the dmesg buffer with: dmesg | grep slamr Among the few output lines, there is one like: slamr: mc97 codec is SIL27 reporting in this example an ALSA driver supported, Agere Systems codec SIL27. Conexant codecs have format CXTnm, nm a number. These modems are not ALSA driver supported. Softmodems with all other codecs should be ALSA driver plus slmodemd supported. Compiling details ----------------- Within a slmodem-SomeVersion/ folder, always before compiling do a precautionary: $ make clean The next step is $ make The file slamr_compile.txt is the record of a compilation of slmodemd, slamr.ko and slusb.ko. The command pair: $ su root # make install OR for Ubuntu $ sudo make install will install the drivers, make device nodes and copy slmodemd to /usr/sbin/slmodemd IMPORTANT - ALSA driver competence of slmodemd requires a different process. First a package libasound2-dev (for Debian/Ubuntu like distros) must be installed. This resource package may have a different name for RPM using distros. To compile do: $ cd modem $ make clean $ make ALSA=1 The slmodemd product will reside in the modem/ folder. Put it on the COMMAND path with: $ su - root $ cp slmodemd /usr/sbin/ OR for Ubuntu related Distros: $ sudo cp slmodemd /usr/sbin/ Note that slmodemd need NOT be compiled again with each change of kernel. Its functioning is NOT tightly kernel version dependent, in contrast to drivers. ============ end Smartlink section ===================== slmodem-2.9.11-20110321/Documentation/compile_example.txt0000644000175000000620000001552510774322565021520 0ustar marvstaffThis is a sample compile. Always first: $ make clean make -C modem clean && make -C drivers clean && echo "done." make[1]: Entering directory `/usr/src/modules/slmodem-2.9.11-20080401/modem' rm -f slmodemd modem_test modem_main.o modem_cmdline.o modem_test.o modem.o modem_datafile.o modem_at.o modem_timer.o modem_pack.o modem_ec.o modem_comp.o modem_param.o modem_debug.o homolog_data.o dp_sinus.o dp_dummy.o sysdep_common.o rm -f *~ *.orig *.rej make[1]: Leaving directory `/usr/src/modules/slmodem-2.9.11-20080401/modem' make[1]: Entering directory `/usr/src/modules/slmodem-2.9.11-20080401/drivers' rm -f kernel-ver slamr.o slusb.o slamr.ko slusb.ko *st7554.o amrmo_init.o sysdep_amr.o *.mod.* .*.cmd *~ rm -f -r .tmp_versions make[1]: Leaving directory `/usr/src/modules/slmodem-2.9.11-20080401/drivers' done. Before the compile (see note at the end for including ALSA support): $ make -C modem all make[1]: Entering directory `/usr/src/modules/slmodem-2.9.11-20080401/modem' rebuild profile... gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_main.o -c modem_main.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_cmdline.o -c modem_cmdline.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem.o -c modem.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_datafile.o -c modem_datafile.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_at.o -c modem_at.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_timer.o -c modem_timer.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_pack.o -c modem_pack.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_ec.o -c modem_ec.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_comp.o -c modem_comp.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_param.o -c modem_param.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_debug.o -c modem_debug.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o homolog_data.o -c homolog_data.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o dp_sinus.o -c dp_sinus.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o dp_dummy.o -c dp_dummy.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o sysdep_common.o -c sysdep_common.c gcc -o slmodemd modem_main.o modem_cmdline.o modem.o modem_datafile.o modem_at.o modem_timer.o modem_pack.o modem_ec.o modem_comp.o modem_param.o modem_debug.o homolog_data.o dp_sinus.o dp_dummy.o dsplibs.o sysdep_common.o gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -o modem_test.o -c modem_test.c gcc -o modem_test modem_test.o modem_cmdline.o modem.o modem_datafile.o modem_at.o modem_timer.o modem_pack.o modem_ec.o modem_comp.o modem_param.o modem_debug.o homolog_data.o dp_sinus.o dp_dummy.o dsplibs.o sysdep_common.o make[1]: Leaving directory `/usr/src/modules/slmodem-2.9.11-20080401/modem' make -C drivers KERNEL_DIR=/lib/modules/2.6.22-14-generic/build make[1]: Entering directory `/usr/src/modules/slmodem-2.9.11-20080401/drivers' cc -I/lib/modules/2.6.22-14-generic/build/include -o kernel-ver kernel-ver.c make all KERNEL_VER=2.6.22-14-generic make[2]: Entering directory `/usr/src/modules/slmodem-2.9.11-20080401/drivers' make modules -C /lib/modules/2.6.22-14-generic/build SUBDIRS=/usr/src/modules/slmodem-2.9.11-20080401/drivers make[3]: Entering directory `/usr/src/linux-headers-2.6.22-14-generic' CC [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/amrmo_init.o CC [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/sysdep_amr.o CC [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/st7554.o LD [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/slamr.o LD [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/slusb.o Building modules, stage 2. MODPOST 2 modules CC /usr/src/modules/slmodem-2.9.11-20080401/drivers/slamr.mod.o LD [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/slamr.ko CC /usr/src/modules/slmodem-2.9.11-20080401/drivers/slusb.mod.o LD [M] /usr/src/modules/slmodem-2.9.11-20080401/drivers/slusb.ko make[3]: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic' make[2]: Leaving directory `/usr/src/modules/slmodem-2.9.11-20080401/drivers' make[1]: Leaving directory `/usr/src/modules/slmodem-2.9.11-20080401/drivers' Products are: $ ls -l drivers/*.ko -rw-r--r-- 1 marv marv 767859 2008-03-31 22:41 drivers/slamr.ko -rw-r--r-- 1 marv marv 163768 2008-03-31 22:41 drivers/slusb.ko $ ls -l modem/slmodemd -rwxr-xr-x 1 marv marv 1302834 2008-03-31 22:41 modem/slmodemd It could be followed by: $ su root # make install or alternatively on Ubuntu like systems by: $ sudo make install The slmodemd is installed to /usr/sbin/slmodemd. ALSA support ============ To include in slmodemd support for the several modem drivers of the ALSA package, there are two differences: 1) There must first be installed a package libasound2-dev or equivalent 2) The make command is not given in the base slmodem folder, but within the modem/ folder. $ make SUPPORT_ALSA=1 rebuild profile... gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_main.o -c modem_main.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_cmdline.o -c modem_cmdline.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem.o -c modem.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_datafile.o -c modem_datafile.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_at.o -c modem_at.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_timer.o -c modem_timer.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_pack.o -c modem_pack.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_ec.o -c modem_ec.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_comp.o -c modem_comp.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_param.o -c modem_param.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_debug.o -c modem_debug.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o homolog_data.o -c homolog_data.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o dp_sinus.o -c dp_sinus.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o dp_dummy.o -c dp_dummy.c gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o sysdep_common.o -c sysdep_common.c gcc -lasound -o slmodemd modem_main.o modem_cmdline.o modem.o modem_datafile.o modem_at.o modem_timer.o modem_pack.o modem_ec.o modem_comp.o modem_param.o modem_debug.o homolog_data.o dp_sinus.o dp_dummy.o dsplibs.o sysdep_common.o /usr/lib/libasound.so gcc -Wall -g -O -I. -DCONFIG_DEBUG_MODEM -DSUPPORT_ALSA=1 -o modem_test.o -c modem_test.c gcc -lasound -o modem_test modem_test.o modem_cmdline.o modem.o modem_datafile.o modem_at.o modem_timer.o modem_pack.o modem_ec.o modem_comp.o modem_param.o modem_debug.o homolog_data.o dp_sinus.o dp_dummy.o dsplibs.o sysdep_common.o Next manually copy the slmodemd to /usr/sbin/slmodemd and activate $ sudo chmod +x /usr/sbin/slmodemd Marv Stodolsky slmodem-2.9.11-20110321/Documentation/x86_64.txt0000644000175000000620000001216210775035236017302 0ustar marvstaff from Marvin Stodolsky to Jean-Pierre Demailly , cc Discuss@linmodems.org, date Sun, Jan 20, 2008 at 11:18 AM subject Re: Modem Motorola SM56 Jean For candidate modem in PCI bus: 00:1b.0 Class 0403: 8086:284b Audio device: Intel Corporation 82801H Primary PCI_id 8086:284b Subsystem PCI_id 103c:30cc Softmodem codec or chipset from diagnostics: from Archives: 10573055 ------ should be supported. But the needed slmodemd helper has a precompiled 32 bit component. So you must install 32 bit versions of packages libasound2 and libasound2-dev. With that done: --------------- Download from http://linmodems.technion.ac.il/packages/smartlink/ the package SLMODEMD.gcc4.2.tar.gz having a compiled slmodemd. Unpack under Linux with: $ tar zxf SLMODEMD.gcc4.2.tar.gz and read instructions therein. But briefly, the modem is setup with command: slmodemd -c YOUR_COUNTRY --alsa hw:0,1_or_hw:0,6 reporting dynamic creation of ports: /dev/ttySL0 --> /dev/pts/N , with N some number Read Smartlink.txt and Modem/YourSystem.txt for follow through guidance. --------- Report back presently. MarvS ==================== to discuss@linmodems.org, Jean-Pierre Demailly , date Mon, Mar 10, 2008 at 6:51 PM subject Patches for slmodem and related software Hi: I am happy to report that I have finally been able to get most of the functionality of the winmodem Motorola SM56 to work on my laptop (HP Pavilion DV9000, running Debian/Linux kernel 2.6.23 on x86_64) However, I encountered several difficulties, some of them not so easy to solve -- I guess that most beginners would have got stuck at some point (if not all of them). Therefore I send here some bits which could help to fix these issues. 1. Compilation The Makefiles distributed with the slmodem package are broken on 64 bit machines, because there are 32 bit binaries and you need ad hoc compile switches. I enclose in the enclosed tar ball sm56.tar.bz2 a 'slmodem.diff' file which contains the required modifications to the Makefiles to make them work flawlessly in 32 bit/64 bit settings. 2. fax Don't know in general, but it worked OK almost from scratch with xfax (of which I am a co-author). Very old stuff, but I am used to it and it still works fine ! 3. PPP connection It took me some time to figure out a wvdial.conf script that works. One is enclosed. 4. V.23 mode for French Minitel I was really upset that it seemed almost to work, but the echo of characters was completely garbled and made the all process useless. I did not manage to get it working through adjustments of the xtel configuration files. The difficulty is that the SM56 has a rather awkward parity setting that xtel does not seem to know about, and the only way I found was to patch the xteld daemon - using a FORCE_PARITY switch which I added. Patch also enclosed here, together with the "xtel.lignes" configuration for SM56. 5. I have added some docs that were useful to me, as well as scripts 'modem' and 'modem.sh' which I use to start the modem services (as I want possibly to commute with another modem, and don't want to have them loaded at boot). I still have minor annoyances. For instance, the modem frequently does not hang off when the connection is over, e.g. with xtel. Maybe the init strings can be improved to achieve this. Best regards, Jean-Pierre Demailly =============================== Jean-Pierre Demailly , date Sun, Mar 16, 2008 at 4:08 AM subject Re: "This is a NEW softmodem case! On Sat, Mar 15, 2008 at 05:58:00PM -0400, Marvin Stodolsky wrote: Hi Marvin, > What is the procedure for doing a 32 bit boot on a x86_64 system, > or does one simple use a 32 bit kernel+modules? > Yes indeed - that's it. x86_64 processors can execute all 64 bit and 32 bit instructions, but only Linux kernels running in 64 bit mode can run simultaneously 64 bit and 32 bit binary programs, provided that all needed 32 bit and 64 bit dynamic libraries are available (I guess that the other way round on 32 bit kernels would be hard because of 64 bit system calls). Right now slmodemd has to be compiled in 32 bit mode because of the proprietary 32 bit binary blobs ; it might eventually be possible to convert them to 64 bit using binary conversion tools such as objcopy, but I didn't succeed to link the resulting blob (the table of pointers produced by objcopy was reported by gcc to be incorrect). In any case, 32 bit slmodemd runs flawlessly on my x86_64 machine, with the following 'ldd /usr/sbin/slmodemd' output : linux-gate.so.1 => (0xffffe000) libasound.so.2 => /usr/lib32/libasound.so.2 (0xf7ee8000) libc.so.6 => /lib32/libc.so.6 (0xf7da1000) libm.so.6 => /lib32/libm.so.6 (0xf7d7c000) libdl.so.2 => /lib32/libdl.so.2 (0xf7d78000) libpthread.so.0 => /lib32/libpthread.so.0 (0xf7d60000) /lib/ld-linux.so.2 (0xf7fdc000) I believe that, on the other hand, it is not possible to get a 32 bit module being loaded by a 64 bit kernel (at least without using some kind of complicated emulation or virtual machine). Best regards, JP Demaillyslmodem-2.9.11-20110321/modem/0000755000175000000620000000000011420701164014055 5ustar marvstaffslmodem-2.9.11-20110321/modem/modem_param.c0000644000175000000620000001523710773430100016511 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_param.c -- modem parameters access module. * * Author: Sasha K (sashak@smlink.com) * * */ #include #include #include /* param access services */ long modem_get_sreg_param(struct modem *m,unsigned sreg_num) { return modem_get_sreg(m,sreg_num); } long modem_get_param(struct modem *m, unsigned param_name) { int val; switch (param_name) { case MDMPRM_NONE: break; case MDMPRM_MIN_RATE: return m->min_rate; case MDMPRM_MAX_RATE: return m->max_rate; case MDMPRM_IODELAY: return m->driver.ioctl(m,MDMCTL_IODELAY,0); case MDMPRM_CODECTYPE: val = m->driver.ioctl(m,MDMCTL_CODECTYPE,0); if(val<0) return CODEC_UNKNOWN; /* unknown */ return val; case MDMPRM_DIALSTR: return (long)m->dial_string; case MDMPRM_AUTOMODE: return 0 /* MODEM_AUTOMODE(m)*/; case MDMPRM_DPRUNTIME: return (long)(m->dp_runtime); case MDMPRM_DSPINFO: return (long)(&m->dsp_info); #ifdef MODEM_CONFIG_VOICE case MDMPRM_VOICEINFO: return (long)(&m->voice_info); #endif case MDMPRM_DP_ADDR: return (long)(m->dp); case GetPulseDialMakeTime: return m->homolog->params->PulseDialMakeTime; case GetPulseDialBreakTime: return m->homolog->params->PulseDialBreakTime; case GetPulseDialDigitPattern: return m->homolog->params->PulseDialDigitPattern; case GetDTMFHighToneLevel: return m->homolog->params->DTMFHighToneLevel; case GetDTMFDialSpeed: return modem_get_sreg(m,SREG_DTMF_DURATION); case GetMinBusyCadenceOnTime: return m->homolog->params->MinBusyCadenceOnTime; case GetMaxBusyCadenceOnTime: return m->homolog->params->MaxBusyCadenceOnTime; case GetBusyDetectionCyclesNumber: return m->homolog->params->BusyDetectionCyclesNumber; case GetMinBusyCadenceOffTime: return m->homolog->params->MinBusyCadenceOffTime; case GetMaxBusyCadenceOffTime: return m->homolog->params->MaxBusyCadenceOffTime; case GetCallingToneFlag: return m->homolog->params->CallingToneFlag; case GetHookFlashTime: #if 0 return modem_get_sreg(m,SREG_FLASH_TIMER); #else return m->homolog->params->HookFlashTime; #endif case GetBlindDialPause: return modem_get_sreg(m,SREG_DIAL_TONE_WAIT_TIME); case GetNoAnswerTimeOut: return modem_get_sreg(m,SREG_WAIT_CARRIER_AFTER_DIAL); case GetDialPauseTime: return modem_get_sreg(m,SREG_DIAL_PAUSE_TIME); case GetTransmitLevel: return m->homolog->params->TransmitLevel; case GetDialModifierValidation: return m->homolog->params->DialModifierValidation; case GetDialToneValidationTime: return m->homolog->params->DialToneValidationTime; case GetBusyToneDiffTime: return 0; case GetDTMFHighAndLowToneLevelDifference: return m->homolog->params->DTMFHighAndLowToneLevelDifference; case GetPulseDialingFlag: return !modem_get_sreg(m,SREG_TONE_OR_PULSE); case GetDialToneCallProgressFilterIndex: return m->homolog->params->DialToneCallProgressFilterIndex; case GetDialToneDetectionThreshold: return m->homolog->params->DialToneDetectionThreshold; case GetABCDDialingPermittedFlag: return m->homolog->params->ABCDDialingPermittedFlag; case GetComaPauseDurationLimit: return m->homolog->params->ComaPauseDurationLimit; case GetPulseAndToneDialInSameDialStringPermittedFlag: return 0; case GetBusyToneCallProgressFilterIndex: return m->homolog->params->BusyToneCallProgressFilterIndex; case GetPulseBetweenDigitsInterval: return m->homolog->params->PulseBetweenDigitsInterval; case GetDialToneWaitTime: return modem_get_sreg(m,SREG_DIAL_TONE_WAIT_TIME); case GetMinRingbackCadenceOnTime: return m->homolog->params->MinRingbackCadenceOnTime; case GetMaxRingbackCadenceOnTime: return m->homolog->params->MaxRingbackCadenceOnTime; case GetRingbackDetectionCyclesNumber: return m->homolog->params->RingbackDetectionCyclesNumber; case GetMinRingbackCadenceOffTime: case GetMaxRingbackCadenceOffTime: case GetRingbackToneCallProgressFilterIndex: case GetMinCongestionCadenceOnTime: case GetMaxCongestionCadenceOnTime: case GetCongestionDetectionCyclesNumber: case GetMinCongestionCadenceOffTime: case GetMaxCongestionCadenceOffTime: case GetCongestionToneCallProgressFilterIndex: return 0; case GetCallProgressSamplesBufferLength: return m->homolog->params->CallProgressSamplesBufferLength; case MustNoiseFilterBeApplied: return m->homolog->params->MustNoiseFilterBeApplied; case GetAdditAttenToBeepgenVoice: return 0; case GetDialToneFilterSubindex: return 0; case GetBusyToneLooseDetectionEnabled: return 0; } return -1; } long modem_set_param(struct modem *m, unsigned name, int val) { switch(name) { case MDMPRM_NONE: break; case MDMPRM_RX_RATE: m->rx_rate = val; break; case MDMPRM_TX_RATE: m->tx_rate = val; break; case MDMPRM_DP_REQUESTED: m->dp_requested = val; break; case MDMPRM_UPDATE_DELAY: m->update_delay = val; break; case MDMPRM_HOOK_ON: return m->driver.ioctl(m, MDMCTL_HOOKSTATE, val ? MODEM_HOOK_ON : MODEM_HOOK_OFF ); case MDMPRM_PULSE_DIAL: // bla-bla return m->driver.ioctl(m, MDMCTL_PULSEDIAL, val); default: return -1; } return 0; } slmodem-2.9.11-20110321/modem/modem_timer.h0000644000175000000620000000443410773430100016533 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_timer.h -- definitions for simple timer. * * Author: Sasha K (sashak@smlink.com) * * */ #ifndef __MODEM_TIMER_H__ #define __MODEM_TIMER_H__ #define MODEM_HZ 100 struct timer { struct timer *next; unsigned added; unsigned expires; void (*func)(void *); void *data; }; #define time_before(t1,t2) ((long)((t2)-(t1)) > 0) #define time_after(t1,t2) (!time_before(t1,t2)) unsigned long get_time(void); extern void timer_init(struct timer *t); extern int timer_add(struct timer *t); extern int timer_del(struct timer *t); extern int modem_timer_init(void); #endif /* __MODEM_TIMER_H__ */ slmodem-2.9.11-20110321/modem/modem_debug.h0000644000175000000620000000616610773430100016505 0ustar marvstaff/* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_debug.h - modem debug definitions. * * Author: SashaK * * Change History: * */ #ifndef __MODEM_DEBUG_H__ #define __MODEM_DEBUG_H__ /* constant definitions */ enum MODEM_LOG_CATEGORIES { /* 0-3 */ MODEM_DBG_PRINT_MSG = 0, MODEM_DBG_RX_SAMPLES, MODEM_DBG_TX_SAMPLES, MODEM_DBG_ECHOC_SAMPLES, /* 4-5 */ MODEM_DBG_MISC_DATA, MODEM_DBG_MISC1_DATA, /* 6-9 */ MODEM_DBG_RX_BITS, MODEM_DBG_TX_BITS, MODEM_DBG_RX_DATA, MODEM_DBG_TX_DATA, /* 10-11 */ MODEM_DBG_RX_CHARS, MODEM_DBG_TX_CHARS, /* 'overflow marker' */ MODEM_DBG_OVERFLOW }; struct sllog_header { unsigned modem_id; unsigned id; unsigned length; char data[0]; }; struct modem; #ifdef CONFIG_DEBUG_MODEM extern unsigned modem_debug_level; extern int modem_debug_printf(const char *fmt,...) __attribute__ ((format (printf, 1, 2))); #define eprintf(args...) { modem_debug_printf("err: " args) ; } #define dprintf(args...) { modem_debug_printf(args) ; } extern int modem_debug_log_data(struct modem *m, unsigned id, const void *, int); #else /* not CONFIG_DEBUG_MODEM */ #define eprintf(fmt...) #define dprintf(fmt...) #define modem_debug_log_data(m,id,data,cnt) #endif /* not CONFIG_DEBUG_MODEM */ extern int modem_debug_init(const char *suffix); extern void modem_debug_exit(); #endif /* __MODEM_DEBUG_H__ */ slmodem-2.9.11-20110321/modem/modem_defs.h0000644000175000000620000004004110773430100016326 0ustar marvstaff/* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_defs.h - modem common definitions * * Author: sashak@smlink.com */ #ifndef __MODEM_DEFS_H__ #define __MODEM_DEFS_H__ #ifdef __KERNEL__ #include #else #include typedef __uint8_t u8; typedef __uint16_t u16; typedef __uint32_t u32; typedef __int8_t s8; typedef __int16_t s16; typedef __int32_t s32; #endif /* !__KERNEL__ */ /* hook states */ #define MODEM_HOOK_ON 0 #define MODEM_HOOK_OFF 1 #define MODEM_HOOK_SNOOPING 2 /* modem device ctrl interface */ #define MDMCTL_CAPABILITIES 0x01 #define MDMCTL_HOOKSTATE 0x02 #define MDMCTL_SPEED 0x04 #define MDMCTL_GETFMTS 0x05 #define MDMCTL_SETFMT 0x06 #define MDMCTL_SETFRAG 0x07 #define MDMCTL_SETFRAGMENT MDMCTL_SETFRAG #define MDMCTL_SPEAKERVOL 0x08 #define MDMCTL_IODELAY 0x10 #define MDMCTL_CODECTYPE 0x11 #define MDMCTL_PULSEDIAL 0x12 #define MDMCTL_GETSTAT 0x20 #define MDMCTL_START 0x21 #define MDMCTL_STOP 0x22 /* modem device status mask */ #define MDMSTAT_ERROR 0x1 #define MDMSTAT_RING 0x2 #define MDMSTAT_DATA 0x4 /* codec types - numbers important */ enum codec_types { CODEC_UNKNOWN = 0, CODEC_AD1821 = 1, CODEC_STLC7550= 4, CODEC_SILABS = 9, CODEC_SIL3052 = 10, CODEC_SIL3054 = 11, CODEC_AD1803 = 12, CODEC_ALC545A = 13, }; /* sample formats + extensions */ #define MFMT_SIZE_MASK 0x000f #define MFMT_SIZE_8 0x0000 #define MFMT_SIZE_16 0x0001 #define MFMT_SIGN_MASK 0x00f0 #define MFMT_SIGNED 0x0010 #define MFMT_UNSIGNED 0x0000 #define MFMT_ORDER_MASK 0x0f00 #define MFMT_ORDER_LE 0x0100 #define MFMT_ORDER_BE 0x0000 #define MFMT_QUERY 0x0 #define MFMT_S8 (MFMT_SIZE_8|MFMT_SIGNED) #define MFMT_U8 (MFMT_SIZE_8|MFMT_UNSIGNED) #define MFMT_S16_LE (MFMT_SIZE_16|MFMT_SIGNED|MFMT_ORDER_LE) #define MFMT_S16_BE (MFMT_SIZE_16|MFMT_SIGNED|MFMT_ORDER_BE) #define MFMT_U16_LE (MFMT_SIZE_16|MFMT_UNSIGNED|MFMT_ORDER_LE) #define MFMT_U16_BE (MFMT_SIZE_16|MFMT_UNSIGNED|MFMT_ORDER_BE) #define MFMT_IS_16BIT(x) ((x)&MFMT_SIZE_16) #define MFMT_IS_LE(x) ((x)&MFMT_ORDER_LE) #define MFMT_BYTESSHIFT(x) ((x)&MFMT_SIZE_MASK) #define MFMT_SHIFT(x) (MFMT_BYTESSHIFT(x)) #define MFMT_BYTES(x) (1< #include #include #include #include #include #include #include #include #define XMIT_SIZE 4096 #define MODEM_AUTHOR "Smart Link Ltd." #define MODEM_NAME "SmartLink Soft Modem" #define MODEM_VERSION "2.9.11" #define MODEM_DATE __DATE__" "__TIME__ /* event mask */ #define MDMEVENT_RING_CHECK 0x01 #define MDMEVENT_ESCAPE 0x02 /* debug prints */ #define MODEM_INFO(fmt,arg...) printf(fmt , ##arg) ; dprintf(fmt , ##arg) #define MODEM_DBG(fmt,arg...) dprintf("%s: " fmt , m->name , ##arg) #define MODEM_ERR(fmt,arg...) eprintf("%s: " fmt , m->name , ##arg) /* external symbols */ extern int process_at_command(struct modem *m, char *buf); extern void *dp_runtime_create(struct modem *m); extern void dp_runtime_delete(void *runtime); extern void *dcr_create(); extern void dcr_delete(void *dcr); extern void dcr_process(void *dcr, void *buf, int len); #ifdef MODEM_CONFIG_RING_DETECTOR extern void *RD_create(struct modem *m, unsigned rate); extern void RD_delete(void *obj); extern int RD_process(void *obj, void *in, int count); extern void RD_ring_details(void *obj, long *freq, long *duration); #endif #ifdef MODEM_CONFIG_CID extern void *CID_create(struct modem *m, unsigned rate, unsigned cid_val); extern void CID_delete(void *cid); extern int CID_process(void *cid, void *in, int count); #endif #ifdef MODEM_CONFIG_VOICE extern void *VOICE_create(struct modem *m, unsigned srate); extern void VOICE_delete(void *obj); extern int VOICE_process(void *obj, void *in, void *out, int count); extern int VOICE_command(void *obj, enum VOICE_CMD cmd); #endif #ifdef MODEM_CONFIG_FAX extern void *FAX_create(struct modem *m, unsigned caller, unsigned srate); extern int FAX_process(void *obj, void *in, void *out, int count); extern void FAX_delete(void *obj); #endif /* local prototypes */ int modem_answer(struct modem *m); static int sregs_init(unsigned char sregs[]); static void do_modem_change_dp(struct modem *); static int modem_start(struct modem *); static int modem_stop (struct modem *); static struct dp_operations *get_dp_operations(enum DP_ID id); static int modem_get_chars(struct modem *m, char *buf, int n); static int modem_put_chars(struct modem *m, const char *buf, int n); static int modem_comp_get_chars(struct modem *m, char *buf, int n); static int modem_comp_put_chars(struct modem *m, const char *buf, int n); #ifdef MODEM_CONFIG_CID static int modem_cid_start(struct modem *, unsigned timeout); #endif #ifdef MODEM_CONFIG_FAX static int modem_fax_start(struct modem *m); #endif /* global config data */ const char *modem_default_country = NULL; /* data definitions */ const char modem_author[] = MODEM_AUTHOR; const char modem_name[] = MODEM_NAME; const char modem_version[]= MODEM_VERSION; const char modem_date[] = MODEM_DATE; /* * misc macros */ /* ring parameter */ #define RING_ON_MIN(m) MODEM_HZ*3/20 /* 0.15 sec */ #define RING_ON_MAX(m) MODEM_HZ*5/2 /* 2.5 sec */ #define RING_OFF_MIN(m) MODEM_HZ*3/2 /* 1.5 sec */ #define RING_OFF_MAX(m) MODEM_HZ*13/2 /* 6.5 sec */ #define RING_COUNT_MIN(m) 10 #define TOTAL_RINGS_COUNT(m) ((m)->sregs[SREG_RING_COUNTER]) #define ANSWER_AFTER_RINGS(m) ((m)->sregs[SREG_RINGS_TO_AUTO_ANSWER]) #define ESCAPE_CHAR(m) ((m)->sregs[SREG_ESCAPE_CHAR]) #define CR_CHAR(m) ((m)->sregs[SREG_CR_CHAR]) #define LF_CHAR(m) ((m)->sregs[SREG_LF_CHAR]) #define BS_CHAR(m) ((m)->sregs[SREG_BS_CHAR]) #define IS_ECHO(m) ((m)->sregs[SREG_ECHO]) #define IS_QUIET(m) ((m)->sregs[SREG_QUIET]) #define IS_VERBOSE(m) ((m)->sregs[SREG_VERBOSE]) #define IS_AUTOMODE(m) MODEM_AUTOMODE(m) #define MODEM_EC_ENABLE(m) ((m)->sregs[SREG_EC]) #define MODEM_EC_DETECTOR(m) ((m)->sregs[SREG_EC]) #define MODEM_COMP_ENABLE(m) ((m)->sregs[SREG_COMP]&&MODEM_EC_ENABLE(m)) #define ESCAPE_TIMEOUT(m) (MODEM_HZ/2) #define ANSWER_DELAY(m) ((m)->sregs[SREG_ANS_DELAY]) #define SPEAKER_CONTROL(m) ((m)->sregs[SREG_SPEAKER_CONTROL]) #define SPEAKER_VOLUME(m) ((m)->sregs[SREG_SPEAKER_VOLUME]) #define QC_SKIP_EC_DETECTION(m) ((m)->caller && (m)->dsp_info.qc_lapm) /* * dp operations drivers * */ struct dp_driver modem_dp_drivers[] = { {DP_CALLPROG,"CallProg"}, {DP_DUMMY,"Dummy"}, {DP_AUTOMODE,"Automode"}, {DP_V8,"V8"}, {DP_V17,"V17"}, {DP_V21,"V21","21"}, {DP_V22,"V22","22"}, {DP_V23,"V23","23"}, {DP_V22BIS,"V22bis","122"}, {DP_V32,"V32","32"}, {DP_V32BIS,"V32bis","132"}, {DP_V34,"V34","34"}, {DP_B103,"Bell103","103"}, {DP_B212,"Bell212","212"}, {DP_FAX,"VFax"}, {DP_K56,"K56Flex","56"}, {DP_V8BIS,"V8bis"}, {DP_V90,"V90","90"}, {DP_V92,"V92","92"}, {DP_SINUS,"Sinus"}, {} }; static struct dp_driver *get_dp_driver(enum DP_ID id) { struct dp_driver *p; for(p = modem_dp_drivers ; p->id > 0 ; p++) if (p->id == id) return p; return NULL; } static struct dp_operations *get_dp_operations(enum DP_ID id) { struct dp_driver *p; for(p = modem_dp_drivers ; p->id > 0 ; p++) if (p->id == id) return p->op; return NULL; } int modem_dp_register(enum DP_ID id, struct dp_operations *op) { struct dp_driver *p; int ret = -1; for(p = modem_dp_drivers ; p->id > 0 ; p++) { if (p->id == id && !p->op) { p->op = op; ret = 0; break; } } return ret; } void modem_dp_deregister(enum DP_ID id, struct dp_operations *op) { struct dp_driver *p; for(p = modem_dp_drivers ; p->id > 0 ; p++) if (p->id == id) p->op = NULL; } /* * state and status handling * */ enum MODEM_RESULT { RESULT_OK = 0, RESULT_CONNECT = 1, RESULT_RING = 2, RESULT_NOCARRIER = 3, RESULT_ERROR = 4, RESULT_UNUSED_5 = 5, RESULT_NODIALTONE = 6, RESULT_BUSY = 7, RESULT_NOANSWER = 8, }; static void modem_report_result(struct modem *m, enum MODEM_RESULT code) { #define MODEM_RESPONSE_TEXT(id) modem_responses[id].text #define MODEM_RESPONSE_CODE(id) modem_responses[id].code /* response codes : FIXME */ static const struct modem_response { enum MODEM_RESULT id; char *code; char *text; } modem_responses[] = { {RESULT_OK, "0", "OK"}, {RESULT_CONNECT, "1", "CONNECT"}, {RESULT_RING, "2", "RING"}, {RESULT_NOCARRIER, "3", "NO CARRIER"}, {RESULT_ERROR, "4", "ERROR"}, {RESULT_UNUSED_5, "" , ""}, {RESULT_NODIALTONE, "6", "NO DIALTONE"}, {RESULT_BUSY, "7", "BUSY"}, {RESULT_NOANSWER, "8", "NO ANSWER"}, }; static const char none_str[] = "NONE"; const char *msg; u8 msg_mask; MODEM_DBG("modem report result: %d (%s)\n",code,MODEM_RESPONSE_TEXT(code)); if (IS_QUIET(m)) return; if (IS_VERBOSE(m)) { if(code==RESULT_CONNECT) { msg_mask = modem_get_sreg(m,SREG_CONNNECT_MSG_FORMAT); if(msg_mask&1) { struct dp_driver *dp_drv; modem_put_chars(m,"Modulation: ",12); dp_drv = get_dp_driver(m->dp->id); msg = (dp_drv) ? dp_drv->name : none_str; modem_put_chars(m,msg,strlen(msg)); modem_put_chars(m,CRLF_CHARS(m),2); } if(msg_mask&2) { modem_put_chars(m,"Protocol: ",10); msg = m->cfg.ec ? "LAPM" : none_str; modem_put_chars(m,msg,strlen(msg)); modem_put_chars(m,CRLF_CHARS(m),2); } if((msg_mask&3) == 3) { modem_put_chars(m,"Compression: ",13); msg = (m->cfg.ec && m->cfg.comp)? "V42bis" : none_str; modem_put_chars(m,msg,strlen(msg)); modem_put_chars(m,CRLF_CHARS(m),2); } if(msg_mask&4 && m->tx_rate) { char rate_str[16]; modem_put_chars(m,"TxRate: ",8); sprintf(rate_str,"%d",m->tx_rate); modem_put_chars(m,rate_str,strlen(rate_str)); modem_put_chars(m,CRLF_CHARS(m),2); } } msg = MODEM_RESPONSE_TEXT(code); modem_put_chars(m,msg,strlen(msg)); if (code==RESULT_CONNECT && m->mode == MODEM_MODE_DATA && m->rx_rate && modem_get_sreg(m,SREG_X_CODE) != 0) { char rate_str[16]; sprintf(rate_str," %d",m->rx_rate); modem_put_chars(m,rate_str,strlen(rate_str)); } } else { msg = MODEM_RESPONSE_CODE(code); modem_put_chars(m,msg,strlen(msg)); } modem_put_chars(m,CRLF_CHARS(m),2); } /* TDB: state lifecycle description */ /* modem state constants */ #define STATE_MODEM_IDLE 0x1 #define STATE_DP_ESTAB 0x2 #define STATE_EC_ESTAB 0x4 #define STATE_MODEM_ONLINE 0x5 #define STATE_COMMAND_ONLINE 0x6 #define STATE_EC_DISC 0x7 #define STATE_DP_DISC 0x9 #define STATE_DISC 0x100 #define STATE_ESTAB STATE_DP_ESTAB #define IS_STATE_LINKED(stat) ((stat) > STATE_DP_ESTAB) #define IS_STATE_IDLE(stat) ((stat) == STATE_MODEM_IDLE) #define IS_STATE_CONNECTING(stat) ((stat) > STATE_MODEM_IDLE && (stat) < STATE_MODEM_ONLINE) #define IS_STATE_ONLINE(stat) ((stat) == STATE_MODEM_ONLINE || (stat) == STATE_COMMAND_ONLINE) #define IS_STATE_DISC(stat) ((stat) == STATE_EC_DISC || (stat) == STATE_DP_DISC) static int modem_set_state(struct modem *m, unsigned new_state) { MODEM_DBG("modem set state: %x --> %x...\n", m->state, new_state); if(m->state == new_state) return 0; switch(new_state) { case STATE_MODEM_IDLE: MODEM_DBG("new state: MODEM_IDLE\n"); m->command = 1; m->get_chars = 0; m->put_chars = 0; m->get_bits = 0; m->put_bits = 0; break; case STATE_DP_ESTAB: MODEM_DBG("new state: DP_ESTAB\n"); m->command = 0; m->get_chars = 0; m->put_chars = 0; m->get_bits = 0; m->put_bits = 0; break; case STATE_EC_ESTAB: MODEM_DBG("new state: EC_ESTAB\n"); m->command = 0; m->get_chars = 0; m->put_chars = 0; break; case STATE_MODEM_ONLINE: MODEM_DBG("new state: MODEM_ONLINE\n"); m->command = 0; m->put_chars = (m->cfg.ec && m->cfg.comp&0x1) ? modem_comp_put_chars : modem_put_chars; m->get_chars = (m->cfg.ec && m->cfg.comp&0x2) ? modem_comp_get_chars : modem_get_chars; m->modem_info |= TIOCM_CD; break; case STATE_COMMAND_ONLINE: MODEM_DBG("new state: COMMAND_ONLINE\n"); m->command = 1; m->get_chars = 0; m->put_chars = 0; break; case STATE_EC_DISC: MODEM_DBG("new state: EC_DISC\n"); m->get_chars = 0; m->put_chars = 0; break; case STATE_DP_DISC: MODEM_DBG("new state: DP_DISC\n"); m->get_chars = 0; m->put_chars = 0; m->get_bits = 0; m->put_bits = 0; break; default: MODEM_ERR("invalid state: %d\n", new_state); return -1; } m->state = new_state; return 0; } static void run_modem_stop(struct modem *m) { modem_stop(m); } /* FIXME */ #define schedule_modem_stop(m) { m->sample_timer_func = run_modem_stop; \ m->sample_timer = m->count + 48; } static void modem_hup(struct modem *m, unsigned local) { MODEM_DBG("modem_hup...\n"); switch(m->state) { case STATE_MODEM_IDLE: return; case STATE_DP_ESTAB: if(local && m->dp && m->dp->op->hangup ) m->dp->op->hangup(m->dp); modem_set_state(m,STATE_DP_DISC); if (m->result_code == 0) m->result_code = RESULT_NOCARRIER; schedule_modem_stop(m); break; case STATE_EC_ESTAB: case STATE_MODEM_ONLINE: case STATE_COMMAND_ONLINE: if(local && m->cfg.ec) { modem_ec_stop(m); modem_set_state(m,STATE_EC_DISC); } else { if(local && m->dp && m->dp->op->hangup) m->dp->op->hangup(m->dp); modem_set_state(m,STATE_DP_DISC); } if (m->result_code == 0) m->result_code = RESULT_NOCARRIER; schedule_modem_stop(m); #if ALREADY_DONE if(m->modem_info&TIOCM_CD && m->tty && !m->termios->c_cflag&CLOCAL /* !C_CLOCAL(m->tty) */) { MODEM_DBG("tty_hangup...\n"); tty_hangup(m->tty); } #endif m->modem_info &= ~TIOCM_CD; break; case STATE_EC_DISC: if(local && m->dp && m->dp->op->hangup ) m->dp->op->hangup(m->dp); modem_set_state(m,STATE_DP_DISC); break; case STATE_DP_DISC: default: return; } } /* FIXME: find better place */ #define NONEC_DP(id) ((id) == DP_V23 || (id) == DP_B103 || (id) == DP_V21) void modem_update_status(struct modem *m, unsigned status) { MODEM_DBG("modem_update_status: %d\n", status); switch(status) { case STATUS_OK: break; case STATUS_DP_LINK: MODEM_DBG("--> DP LINK\n"); if(NONEC_DP(m->dp->id)) m->cfg.ec = 0; modem_set_state(m,STATE_EC_ESTAB); /* start packer */ if(m->cfg.ec && m->cfg.ec_detector && !QC_SKIP_EC_DETECTION(m) ) { modem_detector_start(m); m->get_bits = modem_detector_get_bits; m->put_bits = modem_detector_put_bits; } else { /* skip pack connect phase */ modem_update_status(m,STATUS_PACK_LINK); } break; case STATUS_PACK_LINK: MODEM_DBG("--> PACK LINK\n"); if(m->cfg.ec) { /* start EC */ modem_hdlc_start(m); m->get_bits = modem_hdlc_get_bits; m->put_bits = modem_hdlc_put_bits; modem_ec_start(m); } else { /* start async, pass EC connect phase */ modem_async_start(m); m->get_bits = modem_async_get_bits; m->put_bits = modem_async_put_bits; modem_update_status(m,STATUS_EC_LINK); } break; /* case STATUS_CONNECT: */ case STATUS_EC_LINK: MODEM_DBG("--> EC LINK\n"); modem_set_state(m,STATE_MODEM_ONLINE); modem_report_result(m,RESULT_CONNECT); // fixme if(SPEAKER_CONTROL(m) == 1) m->driver.ioctl(m,MDMCTL_SPEAKERVOL,0); break; case STATUS_EC_RELEASE: case STATUS_EC_ERROR: MODEM_DBG("--> EC UNLINK\n"); m->result_code = RESULT_NOCARRIER; modem_hup(m,(m->state == STATE_EC_DISC)); break; case STATUS_ERROR: case STATUS_DP_ERROR: case STATUS_NOCARRIER: case STATUS_NODIALTONE: case STATUS_BUSY: case STATUS_NOANSWER: default: MODEM_DBG("--> FINISH.\n"); if(status == STATUS_NODIALTONE) m->result_code = RESULT_NODIALTONE; else if(status == STATUS_BUSY) m->result_code = RESULT_BUSY; else if(status == STATUS_NOANSWER) m->result_code = RESULT_NOANSWER; else m->result_code = RESULT_NOCARRIER; modem_hup(m,IS_STATE_DISC(m->state)); break; } } void modem_update_config(struct modem *m, struct modem_config *cfg) { MODEM_DBG("modem update config...\n"); #if 1 #define PRINT_CONFIG(prm) MODEM_DBG(#prm " = %d (%d)\n",cfg->prm,m->cfg.prm) PRINT_CONFIG(ec); PRINT_CONFIG(ec_detector); PRINT_CONFIG(ec_tx_win_size); PRINT_CONFIG(ec_rx_win_size); PRINT_CONFIG(ec_tx_info_size); PRINT_CONFIG(ec_rx_info_size); PRINT_CONFIG(comp); PRINT_CONFIG(comp_dict_size); PRINT_CONFIG(comp_max_string); #endif // FIXME, FIXME, FIXME !!! #if 0 if(cfg->ec) ; /* TBD: now ec reconfig is handled internally in EC */ #endif if(cfg->comp && m->cfg.comp) { m->cfg.comp = cfg->comp; if(!modem_comp_config(m,cfg->comp_dict_size, cfg->comp_max_string)) { m->cfg.comp_dict_size = cfg->comp_dict_size; m->cfg.comp_max_string = cfg->comp_max_string; } else { /* config failed */ ; /* TBD: probably try to renegotiate */ } } else m->cfg.comp = 0; } /* * Interrupt handlers and services * */ /* get/put bits */ int modem_get_bits(struct modem *m, int nbits, u8 *buf, int n) { if(m->get_bits) n = m->get_bits(m,nbits,buf,n); else memset(buf,0xff,n); modem_debug_log_data(m,MODEM_DBG_TX_BITS,buf,n); /* process bit timer and packer */ if (m->bit_timer && (m->bit_timer -= nbits*n) <= 0) { m->bit_timer = 0; m->bit_timer_func(m); } // FIXME NOW: remove packer_process from modem to EC if(m->packer_process) m->packer_process(m,nbits*n); return n; } int modem_put_bits(struct modem *m, int nbits, u8 *buf, int n) { if(m->put_bits) n = m->put_bits(m,nbits,buf,n); modem_debug_log_data(m,MODEM_DBG_RX_BITS,buf,n); return n; } static unsigned dpstat2status(unsigned dpstat) { switch (dpstat) { case DPSTAT_OK: return STATUS_OK; case DPSTAT_CONNECT: return STATUS_DP_LINK; case DPSTAT_ERROR: return STATUS_DP_ERROR; case DPSTAT_NODIALTONE: return STATUS_NODIALTONE; case DPSTAT_BUSY: return STATUS_BUSY; case DPSTAT_NOANSWER: return STATUS_NOANSWER; case DPSTAT_CHANGEDP: return STATUS_OK; default: return STATUS_ERROR; } } static void modem_dp_process(struct modem *m,void *in,void *out,int count) { int ret; unsigned cnt; //MODEM_DBG("modem_process %d: %d...\n", m->count,count); while(count && m->dp) { cnt = count; if (cnt > m->frag) cnt = m->frag; //MODEM_DBG("%d: running dp %s...\n", m->count,dp->name); ret = m->dp->op->process(m->dp,in,out,cnt); switch(ret) { case DPSTAT_OK: break; case DPSTAT_CONNECT: if(!IS_STATE_LINKED(m->state) && !IS_STATE_DISC(m->state)) { modem_update_status(m,STATUS_DP_LINK); } break; case DPSTAT_CHANGEDP: do_modem_change_dp(m); break; default: /* errors */ modem_update_status(m,dpstat2status(ret)); m->process = NULL; break; } count -= cnt; out += cnt<format); in += cnt<format); } if(count) memset(out,0,count<format)); } void modem_process(struct modem *m,void *in,void *out,int count) { /* clean DC */ dcr_process(m->dcr,in,count); modem_debug_log_data(m,MODEM_DBG_RX_SAMPLES,in,count<format)); if(m->process) m->process(m,in,out,count); else /* mute output */ memset(out,0,count<format)); modem_debug_log_data(m,MODEM_DBG_TX_SAMPLES,out,count<format)); m->count+=count; if( m->sample_timer && m->count >= m->sample_timer ) { void (*f)(struct modem *) = m->sample_timer_func ; m->sample_timer = 0; m->sample_timer_func = NULL; if(f) f(m); } } /* * event processing * */ static void timer_mark_event (void *data) { struct modem *m = data; #ifdef DEBUG_TIMERS MODEM_DBG("timer_mark_event: %x | %x : now = %lu...\n", m->event, m->new_event, get_time()); #endif m->event |= m->new_event; m->new_event = 0; } static void schedule_event(struct modem *m, unsigned mask, unsigned long when) { m->new_event |= mask; m->event_timer.data = m; m->event_timer.func = timer_mark_event; m->event_timer.expires = get_time() + when; #ifdef DEBUG_TIMERS MODEM_DBG("schedule_event: %x | %x : now %lu + %lu = %u...\n", m->new_event, mask, get_time(), when, m->event_timer.expires); #endif timer_add(&m->event_timer); } void modem_event(struct modem *m) { unsigned event = m->event; m->event = 0; MODEM_DBG("modem_event: %x...\n", event); if(event&MDMEVENT_RING_CHECK) { if(m->ring_count == 0) { MODEM_DBG("ring cancel...\n"); TOTAL_RINGS_COUNT(m) = 0; } else if ( time_before(m->ring_last,m->ring_first+RING_ON_MIN(m)) || time_after(m->ring_last,m->ring_first+RING_ON_MAX(m)) || m->ring_count < RING_COUNT_MIN(m)) { MODEM_DBG("ring reject: count %d (%lu-%lu)\n", m->ring_count,m->ring_first,m->ring_last); TOTAL_RINGS_COUNT(m) = 0; m->ring_count = 0; } else { MODEM_DBG("ring valid.\n"); m->ring_count = 0; TOTAL_RINGS_COUNT(m)++; if(TOTAL_RINGS_COUNT(m) == 1) modem_put_chars(m,CRLF_CHARS(m),2); modem_report_result(m,RESULT_RING); if (ANSWER_AFTER_RINGS(m) && #ifdef MODEM_CONFIG_RING_DETECTOR (!m->started || m->rd_obj) && #else !m->started && #endif TOTAL_RINGS_COUNT(m) >= ANSWER_AFTER_RINGS(m)) { TOTAL_RINGS_COUNT(m) = 0; modem_answer(m); } else { schedule_event(m,MDMEVENT_RING_CHECK, RING_OFF_MAX(m) + 1); } } } if(event&MDMEVENT_ESCAPE) { MODEM_DBG("modem_escape (count %d)...\n", m->escape_count); if (m->state == STATE_MODEM_ONLINE && m->escape_count == 3) { modem_set_state(m, STATE_COMMAND_ONLINE); m->xmit.head = m->xmit.tail = m->xmit.count = 0; modem_put_chars(m,CRLF_CHARS(m),2); modem_report_result(m,RESULT_OK); m->command = 1; } m->escape_count = 0; } } void modem_ring(struct modem *m) { unsigned long now = get_time(); if (m->state != STATE_MODEM_IDLE) return; m->ring_count++; if(m->ring_count == 1) { MODEM_DBG("modem_ring...\n"); if(time_before(now,m->ring_last + RING_OFF_MIN(m))) { MODEM_DBG("bad ring: now %lu, last %lu.\n", now,m->ring_last); m->ring_count = 0; } else { m->ring_first = now; schedule_event(m,MDMEVENT_RING_CHECK, RING_ON_MAX(m) + 1); #ifdef MODEM_CONFIG_CID if (TOTAL_RINGS_COUNT(m) == 0 && m->cid_requested) modem_cid_start(m, RING_ON_MAX(m) + RING_OFF_MIN(m)); #endif } } m->ring_last = now; } void modem_error(struct modem *m) { MODEM_DBG("modem error...\n"); } /* command mode processing */ static void modem_at_process(void *data) { struct modem *m = (struct modem *)data; int echo = IS_ECHO(m); char lf = LF_CHAR(m), cr = CR_CHAR(m), bs = BS_CHAR(m); int ret; char ch; while(1) { if(modem_get_chars(m,&ch,1) <= 0) break; if (ch == '/' && m->at_count == 1 && toupper(m->at_line[0]) == 'A') { m->at_count = strlen(m->at_line); if(echo) modem_put_chars(m,m->at_line+1,m->at_count-1); ch = cr; } if (echo) modem_put_chars(m,&ch,1); if (ch == cr || ch == lf) { int i; char *p = m->at_cmd; m->at_line[m->at_count] = '\0'; for(i = 0 ; i < m->at_count ; i++) { if( m->at_line[i] == ' ' || m->at_line[i] == '\t' ) continue; *p++ = m->at_line[i]; } *p = '\0'; if (strlen(m->at_cmd) < 2 || toupper(m->at_cmd[0]) != 'A' || toupper(m->at_cmd[1]) != 'T' ) { memset(m->at_line,' ',m->at_count); if(echo) { modem_put_chars(m,&cr,1); modem_put_chars(m,m->at_line,m->at_count); modem_put_chars(m,&cr,1); } m->at_count = 0; continue; } if (echo) modem_put_chars(m,CRLF_CHARS(m),2); MODEM_DBG("run cmd: %s\n",m->at_cmd); ret = process_at_command(m, m->at_cmd); if (ret < 0) modem_report_result(m,RESULT_ERROR); else if (ret==0) modem_report_result(m,RESULT_OK); m->at_line[m->at_count] = '\0'; m->at_count = 0; echo = IS_ECHO(m); cr = CR_CHAR(m), lf = LF_CHAR(m), bs = BS_CHAR(m); } else if (ch == bs && m->at_count) { m->at_count--; if(echo) { ch = ' '; modem_put_chars(m,&ch,1); modem_put_chars(m,&bs,1); } } else if (m->at_count == sizeof(m->at_line) - 1) { if (echo) modem_put_chars(m,CRLF_CHARS(m),2); m->at_count = 0; m->at_line[1] = '\0'; modem_report_result(m,RESULT_ERROR); } else { m->at_line[m->at_count++] = ch; } } } /* * TTY procedures * */ /* get chars */ static int modem_get_chars(struct modem *m, char *buf, int n) { int ret = 0, cnt; while(n) { cnt = n; if (cnt > m->xmit.count) cnt = m->xmit.count; if (cnt > m->xmit.size - m->xmit.tail) cnt = m->xmit.size - m->xmit.tail; if (cnt <= 0) { break; } memcpy(buf, m->xmit.buf + m->xmit.tail, cnt); ret += cnt; n -= cnt; buf += cnt; m->xmit.count -= cnt; m->xmit.tail = (m->xmit.tail+cnt)%m->xmit.size; } //MODEM_DBG("modem_get_chars: %d...\n", n); return ret; } /* put chars */ static int modem_put_chars(struct modem *m, const char *buf, int n) { int ret = write(m->pty,buf,n); if(ret < 0) { /* perror("write"); */ ret = 0; } #if 0 if(ret>0) { //MODEM_DBG("modem_comp_put_chars: %d...\n",i); modem_debug_log_data(m, MODEM_DBG_RX_CHARS,buf,i); } #endif return ret; } /* compressor get/put chars */ /* fixme: unify interfaces: modem tx -> comp -> ec -> hdlc --> modem tx -> ec -> hdlc --> modem tx -> async --> modem tx --> raw output */ static int modem_comp_get_chars(struct modem *m, char *buf, int n) { int ret = 0, cnt; char ch; while(ret < n) { cnt = modem_get_chars(m,&ch,1); if(cnt <= 0) break; cnt = modem_comp_encode(m,ch,buf+ret,n-ret); if(cnt < 0) { break; } ret += cnt; } if(ret < n) { cnt = modem_comp_flush_encoder(m,buf+ret,n-ret); ret += cnt; } if(ret > 0) { //MODEM_DBG("modem_comp_get_chars: %d(%d)...\n",ret,count); modem_debug_log_data(m,MODEM_DBG_TX_DATA,buf,ret); } return ret; } static int comp_send_output(struct modem *m) { int cnt; if(m->comp.count > 0) { cnt = modem_put_chars(m,m->comp.buf+m->comp.head,m->comp.count); m->comp.count -= cnt; m->comp.head += cnt; if(m->comp.count > 0) return 0; else m->comp.head = 0; } return 1; } static int modem_comp_put_chars(struct modem *m, const char *buf, int n) { int i=0, cnt; if(!comp_send_output(m)) return 0; while(icomp.buf,sizeof(m->comp.buf)); if(cnt < 0) { MODEM_DBG("decoder error. %d(%d)\n",i,n); modem_update_status(m,STATUS_ERROR); break; } m->comp.count += cnt; if(!comp_send_output(m)) break; } if(i==n) { cnt = modem_comp_flush_decoder(m,m->comp.buf,sizeof(m->comp.buf)); m->comp.count += cnt; comp_send_output(m); } if(i>0) { //MODEM_DBG("modem_comp_put_chars: %d...\n",i); modem_debug_log_data(m,MODEM_DBG_RX_DATA,buf,i); } return i; } /* * internal procedures * */ #define IS_FAST_DP(id) (id == DP_V34 || id == DP_V90 || id == DP_V92) static void do_modem_change_dp (struct modem *m) { struct dp_operations *op; struct dp *old; old = m->dp; if (m->mode == MODEM_MODE_FAX) { modem_fax_start(m); m->dp = NULL; } else { struct dp *dp = NULL; int dp_id,id; dp_id = m->dp_requested; m->dp_requested = 0; id = dp_id; if(dp_id == 0) { dp_id = MODEM_DP(m); id = IS_FAST_DP(dp_id) ? DP_V8 : dp_id; } MODEM_DBG("%ld: change dp: --> %d...\n", m->count, id); op = get_dp_operations(id); if (op && op->create) dp = op->create(m,dp_id, m->caller,m->srate, m->frag,op); if (!dp) { MODEM_ERR("change dp -> %d error.\n", id); modem_hup(m,1); return; } m->dp = dp; m->process = modem_dp_process; } if ( old ) { old->op->delete(old); } } static int modem_set_hook(struct modem *m, unsigned hook_state) { int ret; MODEM_DBG("modem set hook: %d --> %d...\n", m->hook, hook_state); if ( m->hook == hook_state ) return 0; ret = m->driver.ioctl(m, MDMCTL_HOOKSTATE,hook_state); if (!ret) m->hook = hook_state; return ret; } static void modem_setup_config(struct modem *m) { m->cfg.ec = MODEM_EC_ENABLE(m); m->cfg.ec_detector = MODEM_EC_DETECTOR(m); m->cfg.ec_tx_win_size = LAPM_MAX_WIN_SIZE; m->cfg.ec_rx_win_size = LAPM_MAX_WIN_SIZE; m->cfg.ec_tx_info_size = LAPM_MAX_INFO_SIZE; m->cfg.ec_rx_info_size = LAPM_MAX_INFO_SIZE; if(m->cfg.ec && MODEM_COMP_ENABLE(m)) m->cfg.comp = 0x3; /* bi-directional v42bis */ else m->cfg.comp = 0; m->cfg.comp_dict_size = COMP_MAX_CODEWORDS; m->cfg.comp_max_string = COMP_MAX_STRING; /* setup dsp data */ m->dsp_info.qc_lapm = m->cfg.ec && m->cfg.ec_detector ; } static int do_modem_start(struct modem *m) { int ret; ret = m->driver.ioctl(m, MDMCTL_SPEED, m->srate); ret = m->driver.ioctl(m, MDMCTL_SETFRAG, m->frag); m->count = 0; ret = m->driver.start(m); m->started = !ret; return ret; } static int modem_start (struct modem *m) { int ret; MODEM_DBG("modem_start..\n"); if(m->started && modem_stop(m)) return -1; m->result_code = 0; modem_setup_config(m); modem_set_state(m, STATE_ESTAB); if(SPEAKER_CONTROL(m) == 1) m->driver.ioctl(m,MDMCTL_SPEAKERVOL,SPEAKER_VOLUME(m)); ret = modem_set_hook(m, MODEM_HOOK_OFF); if (ret) goto error; m->xmit.head = m->xmit.tail = m->xmit.count = 0; m->command = 0; if( !(m->dcr= dcr_create()) || !(m->dp_runtime = dp_runtime_create(m))) { ret = -1; goto error; } if ( m->cfg.ec && m->cfg.comp && (ret = modem_comp_init(m)) ) goto error; if ( m->cfg.ec && (ret = modem_ec_init(m))) goto error; /* clear rings and all events */ TOTAL_RINGS_COUNT(m) = 0; m->ring_count = 0; m->event = m->new_event = 0; timer_del(&m->event_timer); ret = do_modem_start(m); if (!ret) return 0; error: MODEM_ERR("modem start = %d: cannot start device.\n",ret); m->result_code = RESULT_NOCARRIER; modem_stop(m); return ret; } static int modem_stop (struct modem *m) { int ret = 0; MODEM_DBG("modem_stop..\n"); m->process = NULL; if(m->started) { ret = m->driver.stop(m); m->started = ret; if ( ret ) { MODEM_ERR("modem stop = %d: cannot stop device.\n",ret); } } modem_set_hook(m, MODEM_HOOK_ON); if(SPEAKER_CONTROL(m) == 1) m->driver.ioctl(m,MDMCTL_SPEAKERVOL,0); m->caller = 0; m->command = 1; // FIXME: If ec,comp were allocated handled inside _exit() - improve? modem_ec_exit(m); modem_comp_exit(m); if (m->dp) { struct dp *dp; dp = m->dp; m->dp = 0; if(dp) dp->op->delete(dp); } if (m->dp_runtime) { dp_runtime_delete(m->dp_runtime); m->dp_runtime = NULL; } if (m->dcr) { dcr_delete(m->dcr); m->dcr = NULL; } #ifdef MODEM_CONFIG_RING_DETECTOR if(m->rd_obj) { RD_delete(m->rd_obj); m->rd_obj = NULL; } #endif #ifdef MODEM_CONFIG_CID if(m->cid) { CID_delete(m->cid); m->cid = NULL; } #endif #ifdef MODEM_CONFIG_VOICE if(m->voice_obj) { VOICE_delete(m->voice_obj); m->voice_obj = NULL; } #endif #ifdef MODEM_CONFIG_FAX if(m->fax_obj) { FAX_delete(m->fax_obj); m->fax_obj = NULL; } #endif modem_set_state(m, STATE_MODEM_IDLE); if (m->result_code) { modem_report_result(m, m->result_code); m->result_code = 0; } m->count = 0; return m->started; } /* * Caller ID * */ #ifdef MODEM_CONFIG_CID static void modem_cid_stop(struct modem *m) { MODEM_DBG("modem_cid_stop...\n"); m->sample_timer = 0; m->sample_timer_func = NULL; #ifdef MODEM_CONFIG_RING_DETECTOR if(!m->rd_obj) { m->process = NULL; modem_stop(m); } else { CID_delete(m->cid); m->cid = NULL; } #else m->process = NULL; modem_stop(m); #endif /* continue with answer if need */ if (ANSWER_AFTER_RINGS(m) && TOTAL_RINGS_COUNT(m) >= ANSWER_AFTER_RINGS(m)) { TOTAL_RINGS_COUNT(m) = 0; modem_answer(m); } } static void modem_cid_process(struct modem *m, void *in, void *out, int count) { int status; //MODEM_DBG("modem_cid_process: %d...\n", count); memset(out,0,count*2); status = CID_process(m->cid, in, count); if(status) { if(status < 0) MODEM_DBG("CID failed.\n"); modem_cid_stop(m); } } static int modem_cid_start(struct modem *m, unsigned timeout) { MODEM_DBG("modem_cid_start: timeout = %d...\n", timeout); #ifdef MODEM_CONFIG_RING_DETECTOR if(m->started && !m->rd_obj) #else if(m->started) #endif return -1; m->cid = CID_create(m, m->srate, m->cid_requested); if(!m->cid) return -1; m->sample_timer = m->count + m->srate*timeout/MODEM_HZ ; m->sample_timer_func = modem_cid_stop; #ifdef MODEM_CONFIG_RING_DETECTOR if(m->started && m->rd_obj) return 0; #endif m->process = modem_cid_process; modem_set_hook(m, MODEM_HOOK_SNOOPING); return do_modem_start(m); } #endif /* MODEM_CONFIG_CID */ /* * Ring detector (internal) * */ #ifdef MODEM_CONFIG_RING_DETECTOR static void modem_ring_detector_process(struct modem *m, void *in, void *out, int count) { int ret; memset(out, 0, count*2); ret = RD_process(m->rd_obj, in, count); if (ret) { long freq, duration; RD_ring_details(m->rd_obj, &freq, &duration); MODEM_DBG("ring details: freq = %ld, duration = %ld\n", freq, duration); if(freq == 0) { MODEM_DBG("report ring start...\n"); modem_ring(m); } else if (freq > 0) { MODEM_DBG("report ring end...\n"); /* ring finishing */ m->event |= MDMEVENT_RING_CHECK; if (m->ring_count <= 1) m->ring_count = duration * freq / 1000 ; m->ring_last = get_time(); } else MODEM_ERR("RD returns %ld freq. (duration %ld)\n", freq, duration); } #ifdef MODEM_CONFIG_CID if(m->cid) modem_cid_process(m, in, out, count); #endif } int modem_ring_detector_start(struct modem *m) { MODEM_DBG("modem_ring_detector_start...\n"); if(m->rd_obj) { MODEM_ERR("modem_ring_detector_start: rd_obj already exists!\n"); return -1; } m->rd_obj = RD_create(m, m->srate); m->process = modem_ring_detector_process; modem_set_hook(m, MODEM_HOOK_SNOOPING); return do_modem_start(m); } #endif /* MODEM_CONFIG_RING_DETECTOR */ /* * Voice modem * */ #ifdef MODEM_CONFIG_VOICE extern void modem_voice_stop(struct modem *m); static void modem_voice_process(struct modem *m, void *in, void *out, int count) { int status; //MODEM_DBG("modem_voice_process: %d...\n", count); status = VOICE_process(m->voice_obj, in, out, count); if(status) { MODEM_DBG("modem_voice_process: status %d\n", status); switch(status) { case VOICE_STATUS_OK: modem_report_result(m, RESULT_OK); m->command = 1; break; case VOICE_STATUS_CONNECT: modem_report_result(m, RESULT_CONNECT); m->command = 0; break; case VOICE_STATUS_ERROR: modem_report_result(m, RESULT_ERROR); m->command = 1; break; default: break; } if(status < 0) { MODEM_DBG("VOICE failed.\n"); modem_voice_stop(m); } } } int modem_voice_command(struct modem *m, enum VOICE_CMD cmd) { MODEM_DBG("modem_voice_command: %u...\n", cmd); switch(cmd) { case VOICE_CMD_BEEP: case VOICE_CMD_DTMF: case VOICE_CMD_STATE_RX: case VOICE_CMD_STATE_TX: if(!m->voice_obj) return -1; m->command = 0; VOICE_command(m->voice_obj, cmd); return 1; default: return -1; } return 0; } int modem_voice_start(struct modem *m) { MODEM_DBG("modem_voice_start...\n"); if(m->voice_obj) return 0; if(m->started) { #ifdef MODEM_CONFIG_RING_DETECTOR if(m->rd_obj) modem_stop(m); else #endif return -1; } m->voice_obj = VOICE_create(m, m->srate); if(!m->voice_obj) return -1; m->sample_timer = 0 /* m->srate*timeout/MODEM_HZ */ ; m->sample_timer_func = NULL /* modem_voice_stop */ ; m->process = modem_voice_process; modem_set_hook(m, MODEM_HOOK_OFF); return do_modem_start(m); } void modem_voice_stop(struct modem *m) { MODEM_DBG("modem_voice_stop...\n"); m->process = NULL; m->sample_timer = 0; m->sample_timer_func = NULL; if(m->voice_obj) { VOICE_delete(m->voice_obj); m->voice_obj = NULL; } modem_stop(m); modem_set_hook(m, MODEM_HOOK_ON); } int modem_voice_set_device(struct modem *m, unsigned device) { MODEM_DBG("modem_voice_set_device: dev = %u...\n", device); if (device == VOICE_DEVICE_NONE) { if(m->voice_obj) modem_voice_stop(m); return 0; } else if (device == VOICE_DEVICE_LINE) { if(m->voice_obj) return 0; else if(modem_voice_start(m)) return -1; return 1; } return -1; } int modem_voice_init(struct modem *m) { m->voice_info.comp_method = 1; m->voice_info.sample_rate = 8000; m->voice_info.rx_gain = 128; m->voice_info.tx_gain = 128; m->voice_info.dtmf_symbol = 0; m->voice_info.tone1_freq = 933; m->voice_info.tone2_freq = 0; m->voice_info.tone_duration = 150; m->voice_info.inactivity_timer = 0; m->voice_info.silence_detect_sensitivity = 128; m->voice_info.silence_detect_period = 50; return 0; } #endif /* MODEM_CONFIG_VOICE */ /* * Fax modem * */ #ifdef MODEM_CONFIG_FAX static void modem_fax_process(struct modem *m, void *in, void *out, int count) { int ret; //MODEM_DBG("modem_fax_process: %d...\n", count); ret = FAX_process(m->fax_obj, in, out, count); if(ret) { MODEM_DBG("fax_process: %d\n", ret); switch(ret) { case FAX_STATUS_OK: modem_set_state(m, STATE_COMMAND_ONLINE); modem_report_result(m, RESULT_OK); m->command = 1; break; case FAX_STATUS_CONNECT: modem_set_state(m,STATE_MODEM_ONLINE); modem_report_result(m, RESULT_CONNECT); m->command = 0; break; case FAX_STATUS_NOCARRIER: modem_set_state(m, STATE_COMMAND_ONLINE); modem_report_result(m, RESULT_NOCARRIER); m->command = 1; break; case FAX_STATUS_ERROR: modem_update_status(m, STATUS_ERROR); break; default: break; } if(ret < 0) { MODEM_DBG("FAX failed.\n"); modem_stop(m); } } } static int modem_fax_start(struct modem *m) { MODEM_DBG("modem_fax_start...\n"); m->fax_obj = FAX_create(m, m->caller, m->srate); if(!m->fax_obj) return -1; m->sample_timer = 0; m->sample_timer_func = NULL; m->process = modem_fax_process; return 0; } #endif /* MODEM_CONFIG_FAX */ /* * Commands * */ int modem_send_to_tty(struct modem *m, const char *buf, int n) { return modem_put_chars(m, buf, n); } int modem_recv_from_tty(struct modem *m, char *buf, int n) { return modem_get_chars(m, buf, n); } int modem_answer(struct modem *m) { MODEM_DBG("modem answer...\n"); if ( m->dp ) { MODEM_ERR("dp %d is already exists.\n", m->dp->id); return -1; } if(m->started) modem_stop(m); m->dp_requested = 0; m->automode_requested = 0; /* MODEM_AUTOMODE(m) */ m->sample_timer = ANSWER_DELAY(m) ? ANSWER_DELAY(m)*m->srate : m->srate/100; m->sample_timer_func = do_modem_change_dp; return modem_start(m); } static int modem_dial_start(struct modem *m) { struct dp_operations *op; struct dp *dp = NULL; MODEM_DBG("modem_dial_start...\n"); if(m->dp) { return -1; } if (m->started) modem_stop(m); m->caller = 1; op = get_dp_operations(DP_CALLPROG); if (op && op->create) dp = op->create(m,DP_CALLPROG, m->caller,m->srate, m->frag,op); if (!dp) { MODEM_ERR("cannot create CALLPROG.\n"); return -1; } m->dp = dp; m->process = modem_dp_process; return 0; } int modem_dial(struct modem *m) { int ret; MODEM_DBG("modem dial: %s...\n", m->dial_string); m->dp_requested = 0; m->automode_requested = 0; ret = modem_dial_start(m); if(ret) return -1; return modem_start(m); } int modem_hook(struct modem *m, unsigned hook_state) { MODEM_DBG("modem hook...\n"); if ( m->hook == hook_state ) return 0; if (!IS_STATE_IDLE(m->state)) modem_hup(m,1); return modem_set_hook(m,hook_state); } int modem_online(struct modem *m) { MODEM_DBG("modem online...\n"); if (m->state != STATE_COMMAND_ONLINE) return -1; m->command = 0; modem_set_state(m, STATE_MODEM_ONLINE); modem_report_result(m,RESULT_CONNECT); // fixme return 0; } void modem_update_speaker(struct modem *m) { //MODEM_DBG("modem update speaker...\n"); m->driver.ioctl(m,MDMCTL_SPEAKERVOL, SPEAKER_CONTROL(m) == 2 ? SPEAKER_VOLUME(m):0); } int modem_get_sreg(struct modem *m, unsigned int num) { if (num >= sizeof(m->sregs)) return -1; return m->sregs[num]; } int modem_set_sreg(struct modem *m, unsigned int num, int val) { if (num >= sizeof(m->sregs)) return -1; m->sregs[num] = val; return 0; } /* homolog set initialization */ int modem_homolog_init(struct modem *m, int id, const char *name) { const struct homolog_set *set; for(set=homolog_set;set->name;set++) { if(set->id == id || (name && *name && !strcmp(name,set->name))) { m->homolog = set; modem_set_sreg(m,SREG_DIAL_PAUSE_TIME, set->params->DialPauseTime); modem_set_sreg(m,SREG_FLASH_TIMER, set->params->HookFlashTime); return 0; } } return -1; } int modem_set_mode(struct modem *m, enum MODEM_MODE mode) { MODEM_DBG("modem set mode: -> %d...\n", mode); if (m->mode == mode) return 0; #ifdef MODEM_CONFIG_VOICE if (m->mode == MODEM_MODE_VOICE && m->voice_obj) { modem_voice_stop(m); } #endif m->mode = mode; return 0; } int modem_reset(struct modem *m) { MODEM_DBG("modem reset...\n"); if(m->state != STATE_MODEM_IDLE) modem_hup(m,1); else if(m->started) modem_stop(m); else if(m->hook) modem_set_hook(m,MODEM_HOOK_ON); modem_set_state(m, STATE_MODEM_IDLE); m->command = 1; m->min_rate = MODEM_MIN_RATE; m->max_rate = MODEM_MAX_RATE; sregs_init(m->sregs); modem_homolog_init(m,m->homolog->id,NULL); modem_set_mode(m, MODEM_MODE_DATA); return 0; } /* * Init functions * */ /* set default init values */ static int sregs_init(unsigned char sregs[]) { sregs[SREG_ESCAPE_CHAR] = '+' ; /* escape char */ sregs[SREG_CR_CHAR] = '\r'; /* cr char */ sregs[SREG_LF_CHAR] = '\n'; /* lf char */ sregs[SREG_BS_CHAR] = '\b'; /* bs char */ sregs[SREG_DIAL_TONE_WAIT_TIME] = 2; /* seconds */ sregs[SREG_WAIT_CARRIER_AFTER_DIAL] = 60; /* seconds */ sregs[SREG_DIAL_PAUSE_TIME] = 2; /* seconds */ sregs[SREG_CARRIER_DETECT_RESPONSE_TIME] = 6; /* 0.1 sec */ sregs[SREG_CARRIER_LOSS_DISCONNECT_TIME] = 7; /* 0.1 sec */ sregs[SREG_DTMF_DURATION] = 100; /* ms */ sregs[SREG_ESCAPE_PROMPT_DELAY] = 50; /* ms */ sregs[SREG_FLASH_TIMER] = 20; /* 10ms */ sregs[SREG_ECHO] = 1; /* yes */ sregs[SREG_QUIET] = 0; /* no */ sregs[SREG_VERBOSE] = 1; /* yes */ sregs[SREG_TONE_OR_PULSE] = 1; /* tone */ sregs[SREG_X_CODE] = 4; sregs[SREG_SPEAKER_CONTROL] = 1; /* yes */ sregs[SREG_SPEAKER_VOLUME] = 3; /* max */ sregs[SREG_AUTOMODE] = 1; /* yes */ sregs[SREG_DP] = DP_V92; sregs[SREG_ANS_DELAY] = 2; /* seconds */ sregs[SREG_LINE_QUALITY_CONTROL] = 0; sregs[SREG_CD] = 0; sregs[SREG_FLOW_CONTROL] = 0; sregs[SREG_CONNNECT_MSG_FORMAT] = 0; sregs[SREG_CONNNECT_MSG_SPEED_SRC] = 0; /* new sregs */ sregs[SREG_EC] = 1; sregs[SREG_COMP] = 0x3; return 0; } /* ---------------------------------------------------------------- */ void modem_hangup(struct modem *m) { modem_hup(m,1); } void modem_update_termios(struct modem *m, struct termios *tios) { MODEM_DBG("update termios...\n"); if( cfgetispeed(tios) == B0 || cfgetospeed(tios) == B0 ) { MODEM_DBG("modem_update_termios: hangup.\n"); if(m->state!=STATE_MODEM_IDLE) modem_hup(m,1); // TBD: drop DTR? } else m->modem_info |= TIOCM_DTR; m->termios = *tios; } /* * * modem_write() * */ static int modem_check_escape(struct modem *m, const char *buf, int count) { unsigned long now = get_time(); int i; if(count + m->escape_count > 3 ) goto noescape_out; for( i = 0 ; i < count ; i++) { if(buf[i] != ESCAPE_CHAR(m)) goto noescape_out; } if(m->escape_count == 0) { if(time_before(now, m->last_esc_check + ESCAPE_TIMEOUT(m))) goto noescape_out; } else if (time_after(now, m->last_esc_check + ESCAPE_TIMEOUT(m))) goto noescape_out; m->escape_count += count; if(m->escape_count == 3) schedule_event(m,MDMEVENT_ESCAPE,ESCAPE_TIMEOUT(m)); m->last_esc_check = now; return m->escape_count; noescape_out: m->escape_count = 0; m->last_esc_check = now; return 0; } int modem_write(struct modem *m, const char *buffer, int count) { const char *buf; int cnt, ret = 0; if(IS_STATE_CONNECTING(m->state)) { MODEM_DBG("modem_tty_write: hangup...\n"); modem_hup(m,1); return count; } if(m->state == STATE_MODEM_ONLINE) modem_check_escape(m,buffer,count); while(count) { cnt = count; if(cnt > m->xmit.size - m->xmit.count) cnt = m->xmit.size - m->xmit.count; if(cnt > m->xmit.size - m->xmit.head) cnt = m->xmit.size - m->xmit.head; if(cnt <= 0) { MODEM_DBG("modem_write: overflow!\n"); break; } buf = buffer; memcpy(m->xmit.buf + m->xmit.head, buf, cnt); m->xmit.count += cnt; m->xmit.head = (m->xmit.head + cnt)%m->xmit.size; ret += cnt; buffer += cnt; count -= cnt; } if(m->command) modem_at_process(m); return ret; } void modem_print_version() { MODEM_INFO("%s: version %s %s\n", modem_name,modem_version,modem_date); } struct modem *modem_create(struct modem_driver *drv, const char *name) { struct modem *m; modem_print_version(); m = malloc(sizeof(*m)); if (!m) return NULL; memset(m,0,sizeof(*m)); m->name = name; m->driver = *drv; m->modem_info = 0; m->state = STATE_MODEM_IDLE; m->command= 1; m->hook = MODEM_HOOK_ON; m->caller = 0; m->min_rate = MODEM_MIN_RATE; m->max_rate = MODEM_MAX_RATE; m->modem_info |= (TIOCM_DSR|TIOCM_CTS); sregs_init(m->sregs); if(modem_homolog_init(m, MODEM_DEFAULT_COUNTRY_CODE, NULL)) { MODEM_ERR("bad default country code `%x'!\n", MODEM_DEFAULT_COUNTRY_CODE); free(m); return NULL; } if(modem_default_country && modem_homolog_init(m, -1, modem_default_country)) { MODEM_INFO("bad country name `%s', using default by code!\n", modem_default_country); } m->ring_last = get_time(); timer_init(&m->event_timer); /* setup config */ modem_setup_config(m); /* packer initializations */ // fixme: TBD /* dp initialization */ m->format = MODEM_FORMAT; m->srate = MODEM_RATE; m->frag = MODEM_FRAG; /* in samples */ m->dp = NULL; MODEM_DBG("startup modem...\n"); m->xmit.buf = malloc(XMIT_SIZE); if ( !m->xmit.buf ) { free(m); return NULL; } m->xmit.size = XMIT_SIZE; m->xmit.head = m->xmit.tail = m->xmit.count = 0; m->modem_info |= TIOCM_DTR|TIOCM_RTS; // TODO: update speed,DTR according to termios #ifdef MODEM_CONFIG_VOICE modem_voice_init(m); #endif return m; } void modem_delete(struct modem *m) { MODEM_DBG("modem_delete...\n"); if(m->started) { MODEM_DBG("shutdown modem...\n"); if(m->state != STATE_MODEM_IDLE) m->result_code = RESULT_NOCARRIER; modem_stop(m); } m->xmit.size = 0; m->xmit.count = m->xmit.tail = m->xmit.head = 0; free(m->xmit.buf); m->xmit.buf = 0; timer_del(&m->event_timer); free(m); } slmodem-2.9.11-20110321/modem/modem_test.c0000644000175000000620000002577410773430100016377 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_test.c -- modem simulator. * * Author: Sasha K (sashak@smlink.com) * * */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #define INFO(fmt,args...) fprintf(stderr, fmt , ##args ); #define ERR(fmt,args...) fprintf(stderr, "error: " fmt , ##args ); #define DBG(fmt,args...) if(modem_debug_level) \ fprintf(stderr, "main: " fmt , ##args ); //#define SIMULATE_RING 1 /* modem init externals : FIXME remove it */ extern int dp_dummy_init(void); extern void dp_dummy_exit(void); extern int dp_sinus_init(void); extern void dp_sinus_exit(void); extern int prop_dp_init(void); extern void prop_dp_exit(void); extern int datafile_load_info(char *name,struct dsp_info *info); extern int datafile_save_info(char *name,struct dsp_info *info); /* global config data */ extern unsigned modem_debug_logging; struct modem_test { struct modem *modem; struct modem_test *link; int in,out; unsigned int delay; unsigned int started; unsigned pty_closed; unsigned close_count; }; #define CLOSE_COUNT_MAX 100 /* static data */ static char inbuf[4096]; static char outbuf[4096]; /* 'driver' simulation */ static int modem_test_start (struct modem *m) { struct modem_test *t = m->dev_data; DBG("modem_test_start...\n"); t->delay = 256; t->started = 1; memset(outbuf,0,t->delay); write(t->out,outbuf,t->delay); return 0; } static int modem_test_stop (struct modem *m) { struct modem_test *t = m->dev_data; DBG("modem_test_stop...\n"); t->started = 0; t->delay = 0; return 0; } static int modem_test_ioctl(struct modem *m, unsigned int cmd, unsigned long arg) { struct modem_test *t = m->dev_data; DBG("modem_test_ioctl: cmd %x, arg %lx...\n",cmd,arg); switch (cmd) { case MDMCTL_CAPABILITIES: return -1; case MDMCTL_HOOKSTATE: return 0; case MDMCTL_SPEED: return 0; case MDMCTL_GETFMTS: case MDMCTL_SETFMT: return 0; case MDMCTL_SETFRAGMENT: return 0; case MDMCTL_SPEAKERVOL: return 0; case MDMCTL_CODECTYPE: return CODEC_UNKNOWN; case MDMCTL_IODELAY: return t->delay/2; default: break; } return -2; } struct modem_driver modem_test_driver = { .name = "modem_test driver", .start = modem_test_start, .stop = modem_test_stop, .ioctl = modem_test_ioctl, }; /* * */ static volatile sig_atomic_t keep_running = 1; void mark_termination(int signum) { DBG("signal %d: mark termination.\n",signum); keep_running = 0; } static int modem_test_run(struct modem_test *modems) { struct timeval tmo; fd_set rset,eset; struct termios termios; struct modem_test *t; void *in; int max_fd = 0; int count, ret; #ifdef SIMULATE_RING #define RING_HZ 20 #define RING_ON 1*RING_HZ #define RING_OFF 4*RING_HZ unsigned rcount = RING_ON; #endif while(keep_running) { for( t = modems ; t->modem ; t++ ) if(t->modem->event) modem_event(t->modem); #ifdef SIMULATE_RING tmo.tv_sec = 0; tmo.tv_usec= 1000000/RING_HZ; #else tmo.tv_sec = 1; tmo.tv_usec= 0; #endif FD_ZERO(&rset); FD_ZERO(&eset); max_fd = 0; for( t = modems ; t->modem ; t++ ) { FD_SET(t->in,&rset); FD_SET(t->in,&eset); if(t->in > max_fd) max_fd = t->in; if( t->pty_closed && t->close_count ) { if ( !t->started || t->close_count++ > CLOSE_COUNT_MAX ) t->close_count = 0; } else if (t->modem->xmit.size - t->modem->xmit.count > 0) { FD_SET(t->modem->pty,&rset); if(t->modem->pty > max_fd) max_fd = t->modem->pty; } } ret = select(max_fd + 1,&rset,NULL,&eset,&tmo); if (ret < 0) { if (errno == EINTR) { continue; } ERR("select: %s\n",strerror(errno)); return ret; } //DBG("select = %d\n",ret); if (ret == 0) { #ifdef SIMULATE_RING if(!modems->modem->started) { rcount++; if (rcount <= RING_ON) modem_ring(modems->modem); else if (rcount > RING_OFF) rcount = 0; } #endif continue; } for( t = modems ; t->modem ; t++ ) { if(FD_ISSET(t->in,&eset)) { DBG("dev exception...\n"); } } for( t = modems ; t->modem ; t++ ) { if(FD_ISSET(t->in,&rset)) { //DBG("dev read...\n"); count = read(t->in,inbuf,sizeof(inbuf)/2); if(count < 0) { ERR("dev read: %s\n",strerror(errno)); return -1; } else if (count == 0) { DBG("dev read = 0\n"); continue; } in = inbuf; if(t->modem->update_delay < 0) { if ( -t->modem->update_delay >= count/2) { DBG("change delay -%d...\n", count/2); t->delay -= count; t->modem->update_delay += count/2; continue; } DBG("change delay %d...\n", t->modem->update_delay); in -= t->modem->update_delay*2; count += t->modem->update_delay*2; t->delay += t->modem->update_delay*2; t->modem->update_delay = 0; } if(t->started) { modem_process(t->modem,in,outbuf,count>>1); } else { memset(outbuf,0,count); /* ring here */ } count = write(t->out,outbuf,count); if(count < 0) { ERR("dev write: %s\n",strerror(errno)); return -1; } else if (count == 0) { DBG("dev write = 0\n"); } if(t->modem->update_delay > 0) { DBG("change delay %d...\n", t->modem->update_delay); memset(outbuf, 0, t->modem->update_delay*2); count = write(t->out,outbuf,t->modem->update_delay*2); if(count < 0) { ERR("dev write: %s\n",strerror(errno)); return -1; } t->delay += t->modem->update_delay*2; t->modem->update_delay = 0; } } } for( t = modems ; t->modem ; t++ ) { int pty = t->modem->pty; if(FD_ISSET(pty,&rset)) { //DBG("pty read...\n"); /* check termios */ tcgetattr(pty,&termios); if(memcmp(&termios,&t->modem->termios, sizeof(termios))) { DBG("termios changed.\n"); modem_update_termios(t->modem, &termios); } /* read data */ count = t->modem->xmit.size - t->modem->xmit.count; if(count == 0) continue; if (count > sizeof(inbuf)) count = sizeof(inbuf); count = read(pty,inbuf,count); if(count < 0) { if(errno == EAGAIN) { DBG("pty read, errno = EAGAIN\n"); continue; } if(errno == EIO) { if(!t->pty_closed) { DBG("pty closed.\n"); t->pty_closed = 1; if(termios.c_cflag&HUPCL) modem_hangup(t->modem); } t->close_count = 1; //DBG("pty read, errno=EIO\n"); continue; } else ERR("pty read: %s\n", strerror(errno)); return -1; } else if (count == 0) { DBG("pty read = 0\n"); } t->pty_closed = 0; //DBG("pty read %d\n",count); count = modem_write(t->modem,inbuf,count); if(count < 0) { DBG("modem_write failed.\n"); return -1; } } } } return 0; } static int modem_test_init(struct modem_test *t, const char *name, int in, int out) { struct termios termios; char *pty_name; int pty; int ret; memset(t,0,sizeof(*t)); t->in = in; t->out = out; pty = getpt(); if (pty < 0 || grantpt(pty) < 0 || unlockpt(pty) < 0) { ERR("getpt: %s\n",strerror(errno)); exit(-1); } ret = tcgetattr(pty, &termios); /* non canonical raw tty */ cfmakeraw(&termios); cfsetispeed(&termios, B115200); cfsetospeed(&termios, B115200); ret = tcsetattr(pty, TCSANOW, &termios); if (ret) { ERR("tcsetattr: %s\n",strerror(errno)); exit(-1); } fcntl(pty,F_SETFL,O_NONBLOCK); pty_name = ptsname(pty); t->modem = modem_create(&modem_test_driver,name); if(!t->modem) { return -1; } t->modem->name = name; t->modem->pty = pty; //t->modem->dev = dev; t->modem->dev_name = name; t->modem->pty_name = pty_name; // datafile_load_info(basename(dev_name),&t->modem->dsp_info); modem_update_termios(t->modem,&termios); t->modem->dev_data = t; DBG("created %s: %s\n",t->modem->name,t->modem->pty_name); return 0; } static void modem_test_free(struct modem_test *t) { int pty = t->modem->pty; modem_delete(t->modem); close(pty); } int modem_test() { struct modem_test *ma, *mb; struct modem_test modems[3] = {}; int pipe1[2], pipe2[2]; int ret = 0; modem_debug_init("test"); memset(modems,0,sizeof(modems)); dp_dummy_init(); dp_sinus_init(); prop_dp_init(); modem_timer_init(); ma = &modems[0]; mb = &modems[1]; if(pipe(pipe1) < 0 || pipe(pipe2) < 0) { ERR("pipe: %s\n",strerror(errno)); exit(-1); } modem_test_init(ma,"modemA",pipe1[0],pipe2[1]); modem_test_init(mb,"modemB",pipe2[0],pipe1[1]); ma->link = mb; mb->link = ma; signal(SIGINT, mark_termination); signal(SIGTERM, mark_termination); /* main loop here */ ret = modem_test_run(modems); modem_test_free(ma); modem_test_free(mb); dp_dummy_exit(); dp_sinus_exit(); prop_dp_exit(); exit(ret); return 0; } int main(int argc, char *argv[]) { extern void modem_cmdline(int argc, char *argv[]); modem_debug_level = 1; modem_cmdline(argc,argv); return modem_test(); } slmodem-2.9.11-20110321/modem/modem_dp.h0000644000175000000620000000544410773430100016020 0ustar marvstaff/* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_dp.h - modem data pumps interface definitions * * Author: sashak@smlink.com */ #ifndef __MODEM_DP_H__ #define __MODEM_DP_H__ #include /* * type definitions * */ /* data pump operations structure */ struct dp_operations { const char *name; int use_count; /* dp interface */ struct dp *(*create)(struct modem *, enum DP_ID id, int caller, int srate, int max_frag, struct dp_operations *); int (*delete)(struct dp *); int (*process)(struct dp *, void *in, void *out, int cnt); int (*hangup)(struct dp *); }; /* data pump structure */ struct dp { enum DP_ID id; struct modem *modem; unsigned status; struct dp_operations *op; void *dp_data; }; /* * prototypes * */ /* bit interface */ extern int modem_get_bits(struct modem *m, int nbits, u8 *buf, int n); extern int modem_put_bits(struct modem *m, int nbits, u8 *buf, int n); /* modem dp registration */ extern int modem_dp_register(enum DP_ID id, struct dp_operations *op); extern void modem_dp_deregister(enum DP_ID id, struct dp_operations *op); #endif /* __MODEM_DP_H__ */ slmodem-2.9.11-20110321/modem/modem_cmdline.c0000644000175000000620000001623710773430100017025 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_cmdline.c -- simple command line processor, * define config parameters. * * Author: Sasha K (sashak@smlink.com) * * */ #include #include #include #include #include #include #include #include #include #define PR_INFO(fmt...) fprintf(stderr, fmt ) /* global config data */ /* modem.c */ extern const char *modem_default_country; /* modem_debug.c */ extern unsigned int modem_debug_level; extern unsigned int modem_debug_logging; /* config parameters */ const char *modem_dev_name = NULL; const char *modem_default_dev_name = "/dev/slamr0"; const char *modem_alsa_dev_name = "modem:1"; unsigned int need_realtime = 1; #ifdef MODEM_CONFIG_RING_DETECTOR unsigned int ring_detector = 0; #endif unsigned int use_alsa = 0; unsigned int use_short_buffer = 0; const char *modem_group = "uucp"; mode_t modem_perm = 0660; enum { OPT_HELP = 0, OPT_USAGE, OPT_VERSION, OPT_COUNTRY, OPT_COUNTRYLIST, OPT_ALSA, OPT_GROUP, OPT_PERM, #ifdef MODEM_CONFIG_RING_DETECTOR OPT_RINGDET, #endif OPT_USER, OPT_SHORTBUF, OPT_DEBUG, OPT_LOG, OPT_LAST }; static struct opt { int ch; const char *name; const char *desc; enum {NONE=0,MANDATORY,OPTIONAL} arg; enum {INTEGER,STRING} arg_type; const char *arg_val; unsigned found; } opt_list[] = { {'h',"help","this usage"}, {'u',"usage","this usage"}, {'v',"version","show version and exit"}, {'c',"country","default modem country name",MANDATORY,STRING,"USA"}, { 0 ,"countrylist","show list of supported countries"}, {'a',"alsa","ALSA mode (see README for howto)"}, {'g',"group","Modem TTY group",MANDATORY,STRING,"uucp"}, {'p',"perm","Modem TTY permission",MANDATORY,INTEGER,"0660"}, #ifdef MODEM_CONFIG_RING_DETECTOR {'r',"ringdetector","with internal ring detector (software)"}, #endif {'n',"nortpriority","run with regular priority"}, {'s',"shortbuffer","use short buffer (4 periods length)"}, {'d',"debug","debug level",OPTIONAL,INTEGER,"0"}, {'l',"log","logging mode",OPTIONAL,INTEGER,"5"}, {} }; static void usage(const char *prog_name) { struct opt *opt; PR_INFO("Usage: %s [option...] \n" "Where 'device' is name of modem device (default `%s')\n" " and 'option' may be:\n", prog_name, modem_default_dev_name); for (opt = opt_list ; opt->name ; opt++ ) { int n = 0; if(opt->ch) n = PR_INFO(" -%c, ",opt->ch); else n = PR_INFO(" "); n += PR_INFO("--%s%s ",opt->name,opt->arg?"=VAL":""); n += PR_INFO("%*s%s",24-n,"",opt->desc); if(opt->arg) { n+= PR_INFO(" (default `%s')",opt->arg_val); } PR_INFO("\n"); } exit(1); } static void opt_parse(int argc, char *argv[]) { const char *prog_name; const char *dev_name = NULL; struct opt *opt; char *p, *arg; int found, i; prog_name = argv[0]; for( i = 1 ; i < argc ; i++ ) { p = argv[i]; if(*p != '-') { if(dev_name) usage(prog_name); dev_name = p; continue; } found = 0; arg = NULL; do { p++; } while( *p == '-' ); for (opt = opt_list ; opt->name ; opt++ ) { if(!strncmp(p,opt->name,strlen(opt->name)) || (opt->ch && *p == opt->ch) ) { char *q; if(!strncmp(p,opt->name,strlen(opt->name))) q = p + strlen(opt->name); else q = p + 1; if( *q == '\0' ) found = 1; else if (*q == '=' && opt->arg ) { arg = q + 1; found = 1; } else if(isdigit(*q) && opt->arg ) { arg = q; found = 1; } } if ( !found ) continue; if ( arg && !opt->arg ) usage(prog_name); if (!arg && opt->arg && (i < argc - 1 && *argv[i+1] != '-') && (!opt->arg_type == INTEGER || isdigit(*argv[i+1]))) arg = argv[++i]; if(!arg && opt->arg == MANDATORY) usage(prog_name); opt->found++; if(opt->arg && arg) opt->arg_val = arg; break; } if(!found) usage(prog_name); } if(dev_name) modem_dev_name = dev_name; } void modem_cmdline(int argc, char *argv[]) { const char *prog_name = argv[0]; int val; opt_parse(argc,argv); if(opt_list[OPT_HELP].found || opt_list[OPT_USAGE].found ) usage(prog_name); if(opt_list[OPT_VERSION].found) { extern void modem_print_version(); modem_print_version(); exit(0); } if(opt_list[OPT_COUNTRYLIST].found) { const struct homolog_set *s ; for( s = homolog_set; s->name ; s++ ) { PR_INFO("%02x: %s\n",s->id,s->name); } exit(0); } if(opt_list[OPT_COUNTRY].found) modem_default_country = opt_list[OPT_COUNTRY].arg_val; if(opt_list[OPT_ALSA].found) { #ifndef SUPPORT_ALSA PR_INFO("ALSA support is not compiled in (see README for howto).\n"); exit(1); #endif use_alsa = 1; } if(opt_list[OPT_GROUP].found) modem_group = opt_list[OPT_GROUP].arg_val; if(opt_list[OPT_PERM].found) { val = strtol(opt_list[OPT_PERM].arg_val,NULL,8); if (val <= 0) usage(prog_name); modem_perm = val; } #ifdef MODEM_CONFIG_RING_DETECTOR if(opt_list[OPT_RINGDET].found) ring_detector = 1; #endif if(opt_list[OPT_USER].found) need_realtime = 0; if(opt_list[OPT_SHORTBUF].found) use_short_buffer = 1; if(opt_list[OPT_DEBUG].found) { modem_debug_level = 1 ; if(opt_list[OPT_DEBUG].arg_val && (val= strtol(opt_list[OPT_DEBUG].arg_val,NULL,0)) > 0 ) modem_debug_level = val; } if(opt_list[OPT_LOG].found) { modem_debug_logging = 5; if(opt_list[OPT_LOG].arg_val && (val= strtol(opt_list[OPT_LOG].arg_val,NULL,0)) > 0 ) modem_debug_logging = val; } if(!modem_dev_name) { modem_dev_name = use_alsa ? modem_alsa_dev_name : modem_default_dev_name; } } slmodem-2.9.11-20110321/modem/modem_homolog.h0000644000175000000620000000725710773430100017065 0ustar marvstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_homolog.h -- Modem Homologation definitions. * * Author: Sasha K (sashak@smlink.com) * * */ /*****************************************************************************/ #ifndef __MODEM_HOMOLOG_H__ #define __MODEM_HOMOLOG_H__ /* homologation parameters struct */ struct homolog_params { u8 PulseDialMakeTime; u8 PulseDialBreakTime; u8 PulseDialDigitPattern; u8 DTMFHighToneLevel; u8 DTMFDialSpeed; u8 MinBusyCadenceOnTime; u8 MaxBusyCadenceOnTime; u8 BusyDetectionCyclesNumber; u8 MinBusyCadenceOffTime; u8 MaxBusyCadenceOffTime; u8 CallingToneFlag; u8 HookFlashTime; u8 DialPauseTime; // ? u8 TransmitLevel; u8 DialModifierValidation; u8 DialToneValidationTime; //u8 BusyToneDiffTime; u8 DTMFHighAndLowToneLevelDifference; u8 DialToneCallProgressFilterIndex; u8 DialToneDetectionThreshold; u8 ABCDDialingPermittedFlag; u8 ComaPauseDurationLimit; //u8 PulseAndToneDialInSameDialStringPermittedFlag; u8 BusyToneCallProgressFilterIndex; u8 PulseBetweenDigitsInterval; u8 DialToneWaitTime; u8 MinRingbackCadenceOnTime; u8 MaxRingbackCadenceOnTime; u8 RingbackDetectionCyclesNumber; //u8 MinRingbackCadenceOffTime; //u8 MaxRingbackCadenceOffTime; //u8 RingbackToneCallProgressFilterIndex; //u8 MinCongestionCadenceOnTime; //u8 MaxCongestionCadenceOnTime; //u8 CongestionDetectionCyclesNumber; //u8 MinCongestionCadenceOffTime; //u8 MaxCongestionCadenceOffTime; //u8 CongestionToneCallProgressFilterIndex; u16 CallProgressSamplesBufferLength; u8 MustNoiseFilterBeApplied; //u32 DigitalImpairmentsMask; //u8 DialToneFilterSubindex; //u8 BusyToneLooseDetectionEnabled; //u8 CallWaitingIntegrationTimeMiliSec; //u8 CallWaitingThresholdPercentage; }; /* homologation country set */ struct homolog_set { const u16 id; const char *name; const struct homolog_params *params; }; /* 'nulled'-terminated homologation array */ extern const struct homolog_set homolog_set[]; #endif /* __MODEM_HOMOLOG_H__ */ slmodem-2.9.11-20110321/modem/modem_comp.c0000644000175000000620000005173210773430100016347 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_comp.c -- modem compressor module. * * Author: Sasha K (sashak@smlink.com) * * */ #include #include /* * TODO list: * - modify interface: clean temporary out buffs * - char char encoding/decoding * - simplify and clean code: * - decoder * - encoder test compression case, do it after string finishing * - preformance trace and optimize * */ //#define COMP_TEST 1 //#define COMP_DEBUG 1 /* V42bis parameters limitation */ #define MIN_DICT_SIZE 512 /* min dictionary size enabled by protocol */ #define MIN_STR_SIZE 6 /* min string size enabled by protocol */ #define MAX_STR_SIZE 250 /* max string size enabled by protocol */ /* V42bis constants */ #define CHAR_SIZE 8 /* char size (bits) N3 */ #define TOTAL_CHARS 256 /* number of chars N4 */ #define TOTAL_CTRLS 3 /* number of control cw N6 */ #define FIRST_ENTRY TOTAL_CTRLS /* first dictionary entry */ #define FIRST_FREE TOTAL_CHARS+FIRST_ENTRY /* initial val of free entry N5 */ /* control codewords */ #define CCW_ETM 0 /* Enter transparent mode */ #define CCW_FLUSH 1 /* Flash data */ #define CCW_STEPUP 2 /* Step up codeword size */ /* command codes */ #define CC_ECM 0 /* Enter compression mode */ #define CC_EID 1 /* Escape charactrer in data */ #define CC_RESET 2 /* Force reinitialization */ #define ESCAPE_STEP 51 /* escape char value step */ #define TEST_SLICE 256 /* compression test slice (bytes) */ /* fixme: use get pages */ #define COMP_ALLOC(size) malloc(size) #define COMP_FREE(mem) free(mem) /* debug stuff */ #if COMP_DEBUG #define INLINE_FUNC static #define COMP_DBG(fmt,arg...) dprintf("comp %d/%d: " fmt , \ c->cmp_bits , c->raw_bits , ##arg) #if 1 #define COMP_DBG1(fmt,arg...) #else #define COMP_DBG1(fmt,arg...) COMP_DBG(fmt , ##arg) static char *show_string(struct comp_state *c, u16 cw) { static char _str[COMP_MAX_STRING+1]; int j; _str[COMP_MAX_STRING] = 0; for(j = COMP_MAX_STRING-1; cw && j >= 0 ; j--) { _str[j] = c->dict[cw].ch; cw = c->dict[cw].parent; } return _str+j+1; } #endif // 0 #else /* !COMP_DEBUG */ #define INLINE_FUNC extern inline #define COMP_DBG(fmt,arg...) #define COMP_DBG1(fmt,arg...) #endif /* !COMP_DEBUG */ #define COMP_ERR(fmt,arg...) eprintf("err: " fmt , ##arg) /* * common procedures * */ /* initialize dictionary and params */ static void dict_init(struct comp_state *c) { int i; for(i=0;idict_size;i++) { c->dict[i].parent = 0; c->dict[i].child = 0; c->dict[i].next = 0; } c->next_free = FIRST_FREE; c->last_matched = 0; c->update_at = 0; c->last_added = 0; c->cw_size = CHAR_SIZE + 1; c->threshold = TOTAL_CHARS<<1; c->bit_len = 0; c->flushed_len = 0; c->str_len = 0; c->escape_char = 0; c->cmp_last = TEST_SLICE<<3; c->mode = TRANSPARENT; c->escape = 0; } /* match one char */ INLINE_FUNC u16 match_char(struct comp_state *c, u16 at, u8 ch) { register u16 e; if (!at) return ch + FIRST_ENTRY; e = c->dict[at].child; while(e) { if (c->dict[e].ch == ch) return e; e = c->dict[e].next; } return 0; } /* add one char */ INLINE_FUNC u16 add_char(struct comp_state *c, u16 at, u8 ch) { register u16 new = c->next_free; register u16 next; /* add */ c->dict[new].ch = ch; c->dict[new].parent = at; c->dict[new].child = 0; c->dict[new].next = c->dict[at].child; c->dict[at].child = new; /* update next free */; next = new; do { if (++next == c->dict_size) next = FIRST_FREE; } while(c->dict[next].child); if (c->dict[next].parent) { u16 e = c->dict[next].parent; if(c->dict[e].child == next) c->dict[e].child = c->dict[next].next; else { e = c->dict[e].child; while(c->dict[e].next != next) e = c->dict[e].next; c->dict[e].next = c->dict[next].next; } } c->next_free = next; return new; } /* * decoder * */ /* out decoded string */ INLINE_FUNC int send_string(struct comp_state *c) { int ret; #if 0 c->str_data[c->str_len] = 0; COMP_DBG("out string %d: '%s'\n",c->last_matched,c->str_data); #endif memcpy(c->obuf+c->olen,c->str_data,c->str_len); ret = c->str_len; c->olen += ret; c->str_len = 0; c->flushed_len = 0; return ret; } /* receive encoded data */ INLINE_FUNC int recv_data(struct comp_state *c, u16 cw) { int i,ret = 0; u16 p = cw; COMP_DBG1("dec recv %d: '%s'\n",cw,show_string(c,cw)); for (ret = 0 ; p ; ret++) { p = c->dict[p].parent; } p = cw; i = c->str_len + ret - 1; while(p) { c->str_data[i--] = c->dict[p].ch; p = c->dict[p].parent; } c->str_len += ret; return ret; } /* flush decoder */ int comp_flush_decoder(struct comp_state *c) { int ret, total_len; total_len = c->flushed_len + c->str_len; ret = send_string(c); c->flushed_len = total_len; if (ret) { COMP_DBG("flush_decoder: %d...\n", ret); } return ret; } /* decoder */ int comp_decode(struct comp_state *c, u8 *in, int n) { register int i, ret = 0; register u16 cw, p; u8 ch; for (i = 0 ; imode) { case COMPRESSED: /* get cw from input */ while (c->bit_len < c->cw_size && ibit_data |= *in++ << c->bit_len; c->bit_len += 8; i++; } if (c->bit_len < c->cw_size) break; cw = c->bit_data&((1<cw_size)-1); c->bit_data >>= c->cw_size; c->bit_len -= c->cw_size; /* process cw */ switch (cw) { /* control cw */ case CCW_ETM: /* enter transparent mode */ COMP_DBG("C decoder: ETM\n"); c->bit_len = 0; c->mode = TRANSPARENT; c->last_matched = 0; c->last_added = 0; break; case CCW_FLUSH: /* flush signal */ COMP_DBG("C decoder: FLUSH\n"); c->bit_len = 0; break; case CCW_STEPUP: /* increase cw size */ c->cw_size++; c->threshold <<= 1; COMP_DBG("C decoder: STEPUP %d\n", c->cw_size); if (c->cw_size > (c->dict_size>>3)) { /* C-ERROR */ COMP_ERR("fatal: cw size too big!\n"); return -1; } break; default: /* regular codeword */ if (cw == c->next_free) { /* C-ERROR */ COMP_ERR("fatal: next free!\n"); return -1; } ret += recv_data(c,cw); if (c->update_at) { ch = c->str_data[0]; p = match_char(c,c->update_at,ch); if (!p) { // fixme: prevent case add 303 at 303 c->last_added = add_char(c,c->update_at,ch); COMP_DBG1("C dec add %d at %d: %d(%c) '%s'\n", c->last_added,c->update_at, ch,ch,show_string(c,c->last_added)); if (cw == c->next_free) { /* C-ERROR */ COMP_ERR("fatal: empty cw!\n"); return -1; } } else if (p == c->last_added) c->last_added = 0; } if (c->str_len + c->flushed_len == c->max_string) { c->update_at = 0; } else { c->update_at = cw; } /* process escape */ // fixme: separate it in func (send_string ?) { int j; for (j=0;jstr_len;j++) { if(c->str_data[j]==c->escape_char) { COMP_DBG("C dec: ESCAPE %d\n", c->escape_char); c->escape_char+=ESCAPE_STEP; } } } send_string(c); break; } break; case TRANSPARENT: if (c->escape) { /* command */ c->escape = 0; switch(*in) { case CC_ECM: /* enter compressed mode */ COMP_DBG("T decoder: ECM\n"); ret += send_string(c); c->mode = COMPRESSED; c->update_at = c->last_matched; c->last_matched = 0; in++;i++; continue; //break; case CC_EID: /* escape symbol */ COMP_DBG("T decoder: EID\n"); // fixme: don't rewrite in buf *in = c->escape_char; c->escape_char += ESCAPE_STEP; break; case CC_RESET: /* reset dict */ COMP_DBG("T decoder: RESET\n"); // TBD ret += send_string(c); dict_init(c); in++;i++; continue; //break; default: /* C-ERROR */ COMP_ERR("fatal: invalid cmd!\n"); return -1; } } else if (*in == c->escape_char) { COMP_DBG("T dec ESCAPE %d\n", *in); c->escape = 1; in++; i++; break; } //COMP_DBG1("dec rcv: %d(%c)\n", *in, *in); if (c->update_at) { if(!match_char(c,c->update_at,*in)) { c->last_added = add_char(c,c->update_at,*in); COMP_DBG1("T dec add %d at %d: %d(%c) '%s'\n", c->last_added,c->update_at, *in,*in,show_string(c,c->last_added)); } c->update_at = 0; } cw = match_char(c,c->last_matched,*in); if(!cw) { c->update_at = c->last_matched; /* out string */ ret += send_string(c); c->last_matched = 0; } else if (cw == c->last_added) { c->last_added = 0; /* out string */ ret += send_string(c); c->last_matched = 0; } else { c->last_matched = cw; c->str_data[c->str_len++] = *in++; if (c->str_len + c->flushed_len == c->max_string) { /* out string */ ret += send_string(c); c->last_matched = 0; } i++; } break; default: return -1; } } return ret; } /* * encoder * */ #define SEND_CW(c,cw) { (c)->bit_data |= (cw) << (c)->bit_len; \ (c)->bit_len += (c)->cw_size; } #define ALIGN_BITS(c) { if((c)->bit_len%8) \ (c)->bit_len += 8 - (c)->bit_len%8; } #define SEND_BITS(c) { while((c)->bit_len >= 8) { \ (c)->obuf[c->olen++]=(c)->bit_data&0xff; \ (c)->bit_data >>= 8; \ (c)->bit_len -= 8; ret++; \ } } /* send encoded data */ static int send_data(struct comp_state *c, u16 cw) { register int i, ret = 0; /* update test info */ c->raw_bits += c->str_len<<3; c->cmp_bits += c->cw_size; c->cmp_last += c->cw_size - c->cmp_last*c->str_len/TEST_SLICE; switch(c->mode) { case TRANSPARENT: for (i = 0;istr_len;i++) { c->obuf[c->olen++] = c->str_data[i]; ret++; if (c->str_data[i] == c->escape_char) { COMP_DBG("T enc ESCAPE %d\n", c->escape_char); c->obuf[c->olen++] = CC_EID; ret++; c->escape_char += ESCAPE_STEP; } COMP_DBG1("enc send: %d(%c)\n",c->str_data[i],c->str_data[i]); } break; case COMPRESSED: /* process escape */ for (i = 0;istr_len;i++) { if (c->str_data[i] == c->escape_char) { COMP_DBG("C enc ESCAPE %d\n", c->escape_char); c->escape_char += ESCAPE_STEP; } } /* send codeword */ /* check cw size and send STEPUP if need */ while (cw >= c->threshold) { SEND_CW(c,CCW_STEPUP); SEND_BITS(c); c->threshold <<= 1; c->cw_size++; COMP_DBG("C enc STEPUP %d\n",c->cw_size); } SEND_CW(c,cw); SEND_BITS(c); COMP_DBG1("enc send %d: '%s'\n",cw,show_string(c,cw)); break; } c->str_len = 0; c->flushed_len = 0; return ret; } /* test compression */ static int test_mode(struct comp_state *c) { int ret = 0; switch(c->mode) { case TRANSPARENT: /* fixme: why 11 ? */ if (c->cmp_last < (TEST_SLICE<<3) - 11) { /* switch to compressed mode */ COMP_DBG("encoder %d/%d %d: --> COMPRESSED mode.\n", c->cmp_bits,c->raw_bits,c->cmp_last); if (c->last_matched) { c->update_at = c->last_matched; ret += send_data(c,c->last_matched); c->last_matched = 0; } c->obuf[c->olen++] = c->escape_char; c->obuf[c->olen++] = CC_ECM; ret += 2; c->bit_data = 0; c->mode = COMPRESSED; } #if 0 else if (0) { /* fixme: when RESET? */ COMP_DBG("encoder RESET\n"); } #endif break; case COMPRESSED: if (c->cmp_last > (TEST_SLICE<<3)) { /* switch to transparent mode */ COMP_DBG("encoder %d/%d %d: --> TRANSPARENT mode.\n", c->cmp_bits,c->raw_bits,c->cmp_last); if (c->last_matched) { c->update_at = c->last_matched; ret += send_data(c,c->last_matched); c->last_matched = 0; } c->last_added = 0; SEND_CW(c,CCW_ETM); ALIGN_BITS(c); SEND_BITS(c); c->mode = TRANSPARENT; } break; } return ret; } /* flush encoder data */ int comp_flush_encoder(struct comp_state *c) { int ret = 0; //COMP_DBG1("flush_encoder...\n"); #if 1 /* fixme: use something better */ if (c->update_at) { return 0; } #endif if (c->last_matched) { int total_len = c->flushed_len + c->str_len; ret = send_data(c,c->last_matched); c->flushed_len = total_len; } if(c->mode == COMPRESSED) { c->update_at = c->last_matched; c->last_matched = 0; c->flushed_len = 0; //if (c->bit_len > 0) { COMP_DBG("flush_encoder: send FLUSH\n"); /* send FLUSH and align by zeros */ SEND_CW(c,CCW_FLUSH); ALIGN_BITS(c); SEND_BITS(c); //} } if (ret) COMP_DBG("flush_encoder %d...\n", ret); return ret; } /* encoder */ #define NEW_ENCODER 1 int comp_encode(struct comp_state *c, u8 *in, int n) { register int i, ret=0; register u16 cw = 0; for(i=0;iupdate_at) { if (!match_char(c,c->update_at,*in)) { c->last_added = add_char(c,c->update_at,*in); COMP_DBG1("enc add %d at %d: %d(%c) '%s'\n", c->last_added,c->update_at, *in,*in,show_string(c,c->last_added)); } c->update_at = 0; } #if NEW_ENCODER /* match string */ while(ilast_matched,*in); if (!cw) { c->update_at = c->last_matched; ret += send_data(c,c->last_matched); c->last_matched = 0; break; } if (cw == c->last_added) { c->last_added = 0; ret += send_data(c,c->last_matched); c->last_matched = 0; break; } c->last_matched = cw; /* collect char */ c->str_data[c->str_len++] = *in++; i++; if ( c->str_len + c->flushed_len == c->max_string ) { ret += send_data(c,c->last_matched); c->last_matched = 0; break; } } ret += test_mode(c); } #else /* match char */ cw = match_char(c,c->last_matched,*in); if (!cw) { /* add char */ c->update_at = c->last_matched; /* send and reset string */ ret += send_data(c,c->last_matched); c->last_matched = 0; } else if (cw == c->last_added) { c->last_added = 0; /* send and reset string */ ret += send_data(c,c->last_matched); c->last_matched = 0; } else { c->last_matched = cw; /* collect char */ c->str_data[c->str_len++] = *in++; if ( c->str_len + c->flushed_len == c->max_string ) { /* send and reset string */ ret += send_data(c,c->last_matched); c->last_matched = 0; } i++; } } ret += test_mode(c); #endif return ret; } #if COMP_TEST /* * Test encoder procedures * */ /* force reset */ int comp_force_reset(struct comp_state *c) { int ret = 0; if (c->mode != TRANSPARENT) return 0; COMP_DBG("comp_reset...\n"); if (c->last_matched) { ret = send_data(c,c->last_matched); c->last_matched = 0; } c->obuf[c->olen++] = c->escape_char; c->obuf[c->olen++] = CC_RESET; ret += 2; c->bit_data = 0; dict_init(c); return ret; } /* force change compression mode */ int comp_force_change_mode(struct comp_state *c, enum COMP_MODE mode) { int ret = 0; if (mode == c->mode) return 0; COMP_DBG("change_mode...\n"); if (c->last_matched) { c->update_at = c->last_matched; ret += send_data(c,c->last_matched); c->last_matched = 0; } /* switch to compressed mode */ if (c->mode == TRANSPARENT) { COMP_DBG("encoder %ld/%ld %d: switch to COMPRESSED mode.\n", c->cmp_bits,c->raw_bits,c->cmp_last); c->obuf[c->olen++] = c->escape_char; c->obuf[c->olen++] = CCW_ECM; ret += 2; c->bit_data = 0; c->mode = COMPRESSED; } /* switch to transparent mode */ else if (c->mode == COMPRESSED) { COMP_DBG("encoder %ld/%ld %d: switch to TRANSPARENT mode.\n", c->cmp_bits,c->raw_bits,c->cmp_last); SEND_CW(c,CCW_ETM); ALIGN_BITS(c); SEND_BITS(c); c->mode = TRANSPARENT; } return ret; } #endif /* * init procedures * */ int comp_init(struct comp_state *c,int dict_size,int max_str) { struct dict *d; int i; memset(c,0,sizeof(*c)); if (dict_size < MIN_DICT_SIZE || max_str < MIN_STR_SIZE || max_str > MAX_STR_SIZE) return -1; /* alloc dict */ d = COMP_ALLOC(dict_size*sizeof(*d)); if (!d) return -1; COMP_DBG("comp_init: dict size %d, max str %d (dict %d bytes).\n", dict_size,max_str,dict_size*sizeof(*d)); memset(d,0,dict_size*sizeof(*d)); c->max_string= max_str; c->dict_size = dict_size; c->dict = d; /* init dict */ for(i=0;idict[i+FIRST_ENTRY].ch = i; } dict_init(c); /* temporary */ c->olen = 0; return 0; } int comp_config(struct comp_state *c,int dict_size,int max_str) { if (dict_size < MIN_DICT_SIZE || max_str < MIN_STR_SIZE || max_str > MAX_STR_SIZE) return -1; if (dict_size > c->dict_size || max_str > sizeof(c->str_data)) return -1; c->max_string= max_str; c->dict_size = dict_size; //dict_init(c); /* temporary */ //c->olen = 0; return 0; } int comp_exit(struct comp_state *c) { COMP_DBG("comp exit: %d/%d %d\n", c->cmp_bits,c->raw_bits,c->cmp_last); c->dict_size = 0; if(c->dict) { COMP_FREE(c->dict); c->dict = NULL; } return 0; } /* * modem init procedures * */ /* exported functions prototypes */ extern int comp_init(struct comp_state *c,int dict_size,int max_str); extern int comp_config(struct comp_state *c,int dict_size,int max_str); extern int comp_exit(struct comp_state *c); extern int comp_encode(struct comp_state *c, u8 *in, int n); extern int comp_decode(struct comp_state *c, u8 *in, int n); extern int comp_flush_encoder(struct comp_state *c); extern int comp_flush_decoder(struct comp_state *c); int modem_comp_init(struct modem *m) { int ret; ret = comp_init(&m->comp.encoder, m->cfg.comp_dict_size,m->cfg.comp_max_string); if(ret) return ret; ret = comp_init(&m->comp.decoder, m->cfg.comp_dict_size,m->cfg.comp_max_string); if (ret) { comp_exit(&m->comp.encoder); return ret; } return 0; } int modem_comp_config(struct modem *m,int dict_size,int max_str) { int ret = 0; if ((ret = comp_config(&m->comp.encoder,dict_size,max_str)) || (ret = comp_config(&m->comp.decoder,dict_size,max_str)) ) COMP_ERR("modem_comp_config: setup failed (%d/%d).\n", dict_size,max_str); return ret; } void modem_comp_exit(struct modem *m) { comp_exit(&m->comp.encoder); comp_exit(&m->comp.decoder); // temproary m->comp.head = m->comp.count = 0; } // FIXME: remove this stupest things static int get_odata(struct comp_state *c, char *buf, int n) { int ret = 0; if(c->olen > 0) { ret = c->olen - c->ohead < n ? c->olen - c->ohead : n; memcpy(buf,c->obuf+c->ohead,ret); c->ohead += ret; if (c->ohead == c->olen) { c->ohead = 0; c->olen = 0; } } return ret; } int modem_comp_encode(struct modem *m, u8 ch, char *buf, int n) { int ret; ret = get_odata(&m->comp.encoder,buf,n); if (ret == n) return ret; if(comp_encode(&m->comp.encoder,&ch,1)<0) return -1; ret += get_odata(&m->comp.encoder,buf+ret,n-ret); return ret; } int modem_comp_decode(struct modem *m, u8 ch, char *buf, int n) { int ret; ret = get_odata(&m->comp.decoder,buf,n); if(ret == n) return ret; if(comp_decode(&m->comp.decoder,&ch,1)<0) return -1; ret += get_odata(&m->comp.decoder,buf+ret,n-ret); return ret; } int modem_comp_flush_encoder(struct modem *m, char *buf, int n) { int ret; ret = get_odata(&m->comp.encoder,buf,n); if (ret == n) return ret; if(comp_flush_encoder(&m->comp.encoder) < 0) return -1; ret += get_odata(&m->comp.encoder,buf+ret,n-ret); return ret; } int modem_comp_flush_decoder(struct modem *m, char *buf, int n) { int ret; ret = get_odata(&m->comp.decoder,buf,n); if (ret == n) return ret; if(comp_flush_decoder(&m->comp.decoder) < 0) return -1; ret += get_odata(&m->comp.decoder,buf+ret,n-ret); return ret; } slmodem-2.9.11-20110321/modem/Makefile.200804010000644000175000000620000000417411002006756016421 0ustar marvstaff########################################################################### # # # Makefile -- modem application Makefile. # # Copyright(c) 2003, Smart Link Ltd. (www.smlink.com) # All rights reserved. # # Author: Sasha K (sashak@smlink.com) # # ########################################################################### # ########################################################################### ARCH64:=$(shell uname -m | sed -e '/amd64/s//x86_64/' | grep -c x86_64) ifeq ($(ARCH64), 0) CC:= gcc else # SUPPORT_ALSA:=1 CC:= gcc -m32 endif RM:= rm -f CFLAGS+= -Wall -g -O -I. -DCONFIG_DEBUG_MODEM modem-objs:= \ modem.o modem_datafile.o modem_at.o modem_timer.o \ modem_pack.o modem_ec.o modem_comp.o \ modem_param.o modem_debug.o homolog_data.o dp-objs:= dp_sinus.o dp_dummy.o sysdep-objs:= sysdep_common.o all-objs:= modem_cmdline.o $(modem-objs) $(dp-objs) dsplibs.o $(sysdep-objs) all: slmodemd modem_test slmodemd: modem_main.o $(all-objs) modem_test: modem_test.o $(all-objs) ifdef SUPPORT_ALSA CFLAGS+= -DSUPPORT_ALSA=1 ifeq ($(ARCH64), 0) LFLAGS+= /usr/lib/libasound.so else # LFLAGS+= /usr/lib32/libasound.so , replaced by -l commands search for asound LFLAGS+= -lasound endif endif slmodemd: $(CC) -o slmodemd modem_main.o $(all-objs) $(LFLAGS) modem_test: $(CC) -o modem_test modem_test.o $(all-objs) $(LFLAGS) clean: $(RM) slmodemd modem_test modem_main.o modem_cmdline.o modem_test.o $(modem-objs) $(dp-objs) $(sysdep-objs) $(RM) *~ *.orig *.rej .PHONY: all dep generic-dep clean clean-build-profile # # rules # %.o: %.c .build_profile $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -o $@ -c $< dep: generic-dep generic-dep: $(RM) .depend $(foreach src,$(wildcard *.c),$(CC) -M $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(src:.c=.o)) -c $(src) >> .depend ;) -include .depend # build_profile -include .build_profile .build_profile:: ifneq ($(CFLAGS),$(PROFILE_CFLAGS)) @if [ "$(CFLAGS) $(EXTRA_CFLAGS)" != "$(PROFILE_CFLAGS)" ] ; then \ echo "rebuild profile..." ; \ echo "PROFILE_CFLAGS=$(CFLAGS) $(EXTRA_CFLAGS)" > $(@) ; fi endif clean: clean-build-profile clean-build-profile: @$(RM) -f .build_profile slmodem-2.9.11-20110321/modem/modem_ec.c0000644000175000000620000010145710773430100016000 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_ec.c -- modem error corrector (lapm like) implementation. * * Author: Sasha K (sashak@smlink.com) * * */ #include #include //#define EC_DEBUG 1 /* LAPM default parameters */ #define LAPM_DFLT_WIN_SIZE 15 /* default win size */ #define LAPM_DFLT_INFO_SIZE 128 /* default info size */ #define LAPM_MAX_RTX 5 /* max num of retransmissions (N400) */ /* timeouts */ // fixme: speed is parameter #define _TMP_SPEED 28800 // fixme: what is timeout vals should be (2sec?)??? #define T401_TIMEOUT _TMP_SPEED*2 /* noacks timeout (in ???) */ #define T403_TIMEOUT _TMP_SPEED*2 /* no frames timeout */ /* LAPM definitions */ /* frame types */ #define FRAME_I 0x00 #define FRAME_S 0x01 #define FRAME_U 0x03 /* supervisory headers */ #define FRAME_S_RR 0x01 /* cr */ #define FRAME_S_RNR 0x05 /* cr */ #define FRAME_S_REJ 0x09 /* cr */ #define FRAME_S_SREJ 0x0d /* cr */ /* unnumbered headers */ #define FRAME_U_SABME 0x6f /* c */ #define FRAME_U_DM 0x0f /* r */ #define FRAME_U_UI 0x03 /* cr */ #define FRAME_U_DISC 0x43 /* c */ #define FRAME_U_UA 0x63 /* r */ #define FRAME_U_FRMR 0x87 /* r */ #define FRAME_U_XID 0xaf /* cr */ #define FRAME_U_TEST 0xe3 /* c */ /* useful macros */ #define FRAME_ADDR(f) ((f)->buf[0]) #define FRAME_CTRL(f) ((f)->buf[1]) #define FRAME_TYPE(f) ((f)->buf[1]&0x1 ? ((f)->buf[1]&0x3) : FRAME_I) #define RX_IS_COMMAND(f) ((f)->buf[0] == l->rsp_addr) #define TX_IS_COMMAND(f) ((f)->buf[0] == l->cmd_addr) #define FRAME_I_PF(f) ((f)->buf[2]&0x1) #define FRAME_S_PF(f) ((f)->buf[2]&0x1) #define FRAME_U_PF(f) ((f)->buf[1]&0x10) #define FRAME_NS(f) ((f)->buf[1]>>1) #define FRAME_NR(f) ((f)->buf[2]>>1) /* tx unnumbered */ #define TX_SABME(l) tx_unnum(l,l->cmd_addr,FRAME_U_SABME|0x10,0,0) #define TX_DISC(l) tx_unnum(l,l->cmd_addr,FRAME_U_DISC|0x10,0,0) #define TX_UA(l,pf_mask) tx_unnum(l,l->rsp_addr,FRAME_U_UA|pf_mask,0,0) #define TX_DM(l,pf_mask) tx_unnum(l,l->rsp_addr,FRAME_U_DM|pf_mask,0,0) /* tx supervisory */ #define TX_RR(l,addr,pf_mask) tx_super(l,addr,FRAME_S_RR,pf_mask) #define TX_RNR(l,addr,pf_mask) tx_super(l,addr,FRAME_S_RNR,pf_mask) #define TX_REJ(l,addr,pf_mask) tx_super(l,addr,FRAME_S_REJ,pf_mask) /* timers */ #define T401_START(l) { EC_DBG("T401 start.\n");\ (l)->rtx_count = 0; \ (l)->modem->bit_timer = T401_TIMEOUT; \ (l)->modem->bit_timer_func = t401_timeout; } #define T401_STOP(l) { EC_DBG("T401 stop.\n"); \ (l)->modem->bit_timer = 0; (l)->rtx_count = 0; } #if T403_IMPLEMENTED #define TIMER_START(l) { EC_DBG("T403 stop, T401 start.\n"); \ (l)->rtx_count = 0; \ (l)->modem->bit_timer = T401_TIMEOUT; \ (l)->modem->bit_timer_func = t401_timeout; } #define TIMER_STOP(l) { EC_DBG("T401 stop, T403 start.\n"); \ (l)->rtx_count = 0; \ (l)->modem->bit_timer = T403_TIMEOUT; \ (l)->modem->bit_timer_func = t403_timeout; } #else /* !T403 */ #define TIMER_START(l) T401_START(l) #define TIMER_STOP(l) T401_STOP(l) #endif /* !T403 */ /* xid sub-fields definitions */ #define FI_GENERAL 0x82 #define GI_PARAM_NEGOTIATION 0x80 #define GI_PRIVATE_NEGOTIATION 0xf0 #define GI_USER_DATA 0xff /* param negotiation */ #define PI_HDLC_OPTFUNCS 0x03 #define PI_TX_INFO_MAXSIZE 0x05 #define PI_RX_INFO_MAXSIZE 0x06 #define PI_TX_WINDOW_SIZE 0x07 #define PI_RX_WINDOW_SIZE 0x08 /* private param negotiation */ #define PI_PARAMETER_SET_ID 0x00 #define PI_V42BIS_REQUEST 0x01 #define PI_V42BIS_CW_NUMBER 0x02 #define PI_V42BIS_MAX_STRING 0x03 /* user data */ /* fixme: ??? */ /* type definitions */ enum LAPM_STATES { LAPM_IDLE, LAPM_ESTAB, LAPM_DATA, LAPM_DISC }; /* prototypes */ static int lapm_connect(struct lapm_state *l); static int lapm_disconnect(struct lapm_state *l); static void reset(struct lapm_state *l); /* * service functions * */ /* le/be value parsing */ extern inline u32 lapm_get_le_val(u8 *buf, int len) { u32 val = 0; while(len--) { val <<= 8; val |= buf[len]; } return val; } extern inline u32 lapm_get_be_val(u8 *buf, int len) { u32 val = 0; while(len--) { val <<= 8; val |= *buf++; } return val; } /* debug stuffs */ #define EC_ERR(fmt,arg...) eprintf("%s ec err: " fmt , \ l->modem->name , ##arg) #ifdef EC_DEBUG #define EC_DBG(fmt,arg...) dprintf("%s ec: " fmt , \ l->modem->name , ##arg) #define EC_DBG1(fmt...) // EC_DBG(fmt) static char print_buf[(LAPM_MAX_INFO_SIZE+3)*2]; /* frame debug prints */ static const char *get_frame_name(frame_t *f) { if (!(f->buf[1]&0x1)) return "INFO"; switch(f->buf[1]&0xef) { case FRAME_S_RR: return "RR"; case FRAME_S_RNR: return "RNR"; case FRAME_S_REJ: return "REJ"; case FRAME_S_SREJ: return "SREJ"; case FRAME_U_SABME: return "SABME"; case FRAME_U_DM: return "DM"; case FRAME_U_UI: return "UI"; case FRAME_U_DISC: return "DISC"; case FRAME_U_UA: return "UA"; case FRAME_U_FRMR: return "FRMR"; case FRAME_U_XID: return "XID"; case FRAME_U_TEST: return "TEST"; default: break; } return "invalid frame"; } static void print_frame(struct lapm_state *l, char *title, int cmd, frame_t *f) { int i; i = sprintf(print_buf,"(va/vs/vr %d/%d/%d) %s: %s %s", l->va,l->vs,l->vr, title,get_frame_name(f),cmd?"cmd":"rsp"); switch (FRAME_TYPE(f)) { case FRAME_I: EC_DBG("%s[%d] cnt=%d, (ns/nr %d/%d)...\n",print_buf, FRAME_I_PF(f),f->count-3,FRAME_NS(f),FRAME_NR(f)); break; case FRAME_S: EC_DBG("%s[%d], (nr %d)...\n",print_buf, FRAME_S_PF(f), FRAME_NR(f)); break; case FRAME_U: EC_DBG("%s[%d]...\n",print_buf, FRAME_U_PF(f)); break; default: EC_DBG("%s: unknown frame.\n", print_buf); break; } } #define LAPM_PRINT_FRAME(str,cmd,f) print_frame(l,str,cmd,f) /* XID debug prints */ static int print_xid_params(char *str_buf, u8 *buf, int len) { u8 pid, plen; u32 pval; int i = 0; while (len > 0) { pid = buf[0]; plen = buf[1]; buf += 2; len -= 2 + plen; if (len < 0) break; switch (pid) { case PI_HDLC_OPTFUNCS: i += sprintf(str_buf + i,"HDLC_OPTFUNC = 0x%x, ", lapm_get_le_val(buf,plen)); break; case PI_TX_INFO_MAXSIZE: pval = lapm_get_be_val(buf,plen); i += sprintf(str_buf + i,"TX_INFOSIZE = %u, ",pval>>3); break; case PI_RX_INFO_MAXSIZE: pval = lapm_get_be_val(buf,plen); i += sprintf(str_buf + i,"RX_INFOSIZE = %u, ",pval>>3); break; case PI_TX_WINDOW_SIZE: i += sprintf(str_buf + i,"TX_WINSIZE = %u, ", lapm_get_be_val(buf,plen)); break; case PI_RX_WINDOW_SIZE: i += sprintf(str_buf + i,"RX_WINSIZE = %u, ", lapm_get_be_val(buf,plen)); break; default: i += sprintf(str_buf + i,"??, "); break; } buf += plen; } i += sprintf(str_buf+i,"\n"); return i; } static int print_xid_private_params(char *str_buf, u8 *buf, int len) { u8 pid, plen; int i = 0; while (len > 0) { pid = buf[0]; plen = buf[1]; buf += 2; len -= 2 + plen; if (len < 0) break; switch (pid) { case PI_PARAMETER_SET_ID: i += sprintf(str_buf + i,"PARAM_SETID = 0x%x, ", lapm_get_be_val(buf,plen)); break; case PI_V42BIS_REQUEST: i += sprintf(str_buf + i,"V42BIS_REQUEST = 0x%x, ", lapm_get_be_val(buf,plen)); break; case PI_V42BIS_CW_NUMBER: i += sprintf(str_buf + i,"V42BIS_CWNUM = %d, ", lapm_get_be_val(buf,plen)); break; case PI_V42BIS_MAX_STRING: i += sprintf(str_buf + i,"V42BIS_MAXSTR = %d, ", lapm_get_be_val(buf,plen)); break; default: i += sprintf(str_buf + i,"??, "); break; } buf += plen; } i += sprintf(str_buf+i,"\n"); return i; } static int print_xid(struct lapm_state *l,char *str,frame_t *f, int len) { u8 *buf = f->buf + 2; int i = 0; i = sprintf(print_buf,"XID: FID %02x;\n",*buf); buf++; len--; while(len > 0) { u8 gid = buf[0]; u16 glen = buf[1]; glen = glen << 8 | buf[2]; buf += 3; len -= 3 + glen; if (len < 0) break; switch (gid) { case GI_PARAM_NEGOTIATION: i += sprintf(print_buf+i,"GI_PARAMS(%d): ",glen); i += print_xid_params(print_buf+i,buf,glen); break; case GI_PRIVATE_NEGOTIATION: i += sprintf(print_buf+i,"GI_PRIVATE_PARAMS(%d): ",glen); i += print_xid_private_params(print_buf+i,buf,glen); break; default: i += sprintf(print_buf+i,"unknown GI = 0x%x (%d) ??\n", gid,glen); break; } buf += glen; } EC_DBG("%s : %s\n", str, print_buf); return 0; } #define LAPM_PRINT_XID(str,f,len) print_xid(l,str,f,len); #else /* !LAPM_DEBUG */ #define EC_DBG(fmt...) #define EC_DBG1(fmt...) #define LAPM_PRINT_FRAME(str,cmd,f) #define LAPM_PRINT_XID(str,f,len) #endif /* !LAPM_DEBUG */ /* * service functions * */ /* get frame from ctrl list */ static inline frame_t *get_ctrl_frame(struct lapm_state *l) { frame_t *f; if ( l->ctrl_list->next == l->tx_ctrl ) { return 0; } f = l->ctrl_list; l->ctrl_list = l->ctrl_list->next; l->ctrl_count--; // debug only return f; } /* U transmission */ static int tx_unnum(struct lapm_state *l, u8 addr, u8 ctrl, u8 *info, int len) { frame_t *f = get_ctrl_frame(l); if (!f) { EC_ERR("tx_unnum: cannot alloc frame.\n"); return -1; } f->buf[0] = addr; f->buf[1] = ctrl; if (info && len) memcpy(f->buf+2,info,len); f->size = 2 + len; return 0; } /* S transmission */ static int tx_super(struct lapm_state *l, u8 addr, u8 ctrl, u8 pf_mask) { frame_t *f = get_ctrl_frame(l); if (!f) { EC_ERR("tx_super: cannot alloc frame.\n"); return -1; } f->buf[0] = addr; f->buf[1] = ctrl; f->buf[2] = (l->vr << 1)|pf_mask; f->size = 3; return 0; } /* parse xid */ #define SET_PARAM(param,value,default) { \ if (((value)<(default) && (param)>=(default)) || \ ((value)>=(default) && (param)<(default))) \ (param) = (default); \ else if (((value)<(default) && (param)<(value)) || \ ((value)>=(default) && (param)>(value))) \ (param) = (value); } static int parse_xid_params(struct lapm_state *l, u8 *buf, int len) { u32 pval; u8 pid, plen; while (len > 0) { pid = buf[0]; plen = buf[1]; buf += 2; len -= 2 + plen; if (len < 0) break; switch (pid) { case PI_HDLC_OPTFUNCS: pval = lapm_get_le_val(buf,plen); break; case PI_TX_INFO_MAXSIZE: pval = lapm_get_be_val(buf,plen); pval >>= 3; SET_PARAM(l->tx_info_size,pval,LAPM_DFLT_INFO_SIZE); break; case PI_RX_INFO_MAXSIZE: pval = lapm_get_be_val(buf,plen); pval >>= 3; SET_PARAM(l->rx_info_size,pval,LAPM_DFLT_INFO_SIZE); break; case PI_TX_WINDOW_SIZE: pval = lapm_get_be_val(buf,plen); SET_PARAM(l->tx_win_size,pval,LAPM_DFLT_WIN_SIZE); break; case PI_RX_WINDOW_SIZE: pval = lapm_get_be_val(buf,plen); SET_PARAM(l->rx_win_size,pval,LAPM_DFLT_WIN_SIZE); break; default: break; } buf += plen; } return 0; } static int parse_xid_private_params(struct lapm_state *l, struct modem_config *cfg, u8 *buf, int len) { u8 pid, plen; while (len > 0) { pid = buf[0]; plen = buf[1]; buf += 2; len -= 2 + plen; if (len < 0) break; switch (pid) { case PI_PARAMETER_SET_ID: //pval = lapm_get_be_val(buf,plen); break; case PI_V42BIS_REQUEST: cfg->comp = lapm_get_le_val(buf,plen); break; case PI_V42BIS_CW_NUMBER: cfg->comp_dict_size = lapm_get_be_val(buf,plen); break; case PI_V42BIS_MAX_STRING: cfg->comp_max_string = lapm_get_be_val(buf,plen); break; default: break; } buf += plen; } return 0; } #define DEFAULT_MODEM_EC_CONFIG {1,1,15,15,128,128,0,512,6} static int rx_xid(struct lapm_state *l, frame_t *f) { struct modem_config cfg = DEFAULT_MODEM_EC_CONFIG; u8 *buf = f->buf; int len = f->count; /* skip addr and ctrl */ buf += 2; len -= 2; LAPM_PRINT_XID("rx_xid",f,len); if (*buf != FI_GENERAL) return -1; buf++; len--; while(len > 0) { u8 gid = buf[0]; u16 glen = buf[1]; glen = glen << 8 | buf[2]; buf += 3; len -= 3 + glen; if (len < 0) break; switch (gid) { case GI_PARAM_NEGOTIATION: parse_xid_params(l,buf,glen); break; case GI_PRIVATE_NEGOTIATION: parse_xid_private_params(l,&cfg,buf,glen); break; default: break; } buf += glen; } cfg.ec_tx_win_size = l->tx_win_size; cfg.ec_rx_win_size = l->rx_win_size; cfg.ec_tx_info_size = l->tx_info_size; cfg.ec_rx_info_size = l->rx_info_size; modem_update_config(l->modem,&cfg); return 0; } static int tx_xid(struct lapm_state *l, u8 addr) { u8 *buf; int size = 2 + 1 + (3+19) + (3+15); int len = 0; u32 pval; int glen; frame_t *f = get_ctrl_frame(l); if (!f) { EC_ERR("tx_xid: cannot alloc frame.\n"); return -1; } buf = f->buf; *buf++ = addr; /* addr */ *buf++ = FRAME_U_XID; /* ctrl */ *buf++ = FI_GENERAL; /* fid */ len += 3; /* param negotiation group */ *buf++ = GI_PARAM_NEGOTIATION; /* group id */ glen = 19; /* group length */ // v42vmi: 19 *buf++ = (glen>>8)&0xff; *buf++ = glen&0xff; len += 3; *buf++ = PI_HDLC_OPTFUNCS; *buf++ = 3; /* p length */ // v42vmi : 3 *buf++ = 0x8a; /* p value */ *buf++ = 0x89; *buf++ = 0x00; //*buf++ = 0x00; *buf++ = PI_TX_INFO_MAXSIZE; pval = l->tx_info_size<<3; *buf++ = 2; /* p length */ *buf++ = (pval>>8)&0xff; /* p value */ *buf++ = (pval&0xff); *buf++ = PI_RX_INFO_MAXSIZE; pval = l->rx_info_size<<3; *buf++ = 2; /* p length */ *buf++ = (pval>>8)&0xff; /* p value */ *buf++ = (pval&0xff); *buf++ = PI_TX_WINDOW_SIZE; *buf++ = 1; /* p length */ *buf++ = l->tx_win_size; /* p value */ *buf++ = PI_RX_WINDOW_SIZE; *buf++ = 1; /* p length */ *buf++ = l->rx_win_size; /* p value */ len += glen; #if 1 /* v42bis-like compressor */ if(l->modem->cfg.comp) { /* private param negotiation group */ *buf++ = GI_PRIVATE_NEGOTIATION; /* group id */ glen = 15; /* group length (msb first) */ *buf++ = (glen>>8)&0xff; *buf++ = glen&0xff; len += 3; *buf++ = PI_PARAMETER_SET_ID; *buf++ = 3; /* p length */ *buf++ = 0x56;/*old 0x26 */ /* p value */ // v42vmi: 0x56 *buf++ = 0x34; *buf++ = 0x32; *buf++ = PI_V42BIS_REQUEST; *buf++ = 1; /* p length */ *buf++ = l->modem->cfg.comp; /* 3 - compression in both direction */ *buf++ = PI_V42BIS_CW_NUMBER; *buf++ = 2; /* p length */ pval = l->modem->cfg.comp_dict_size; *buf++ = (pval>>8)&0xff; /* p value */ *buf++ = (pval&0xff); *buf++ = PI_V42BIS_MAX_STRING; *buf++ = 1; /* p length */ *buf++ = l->modem->cfg.comp_max_string; len += glen; } #endif /* user data */ /* ... */ if (len > size) { EC_ERR("tx_xid: result length(%d) > size (%d).\n", len, size); return -1; } f->size = len; LAPM_PRINT_XID("tx_xid",f,len); return 0; } /* timeout procedures */ static void t401_timeout(struct modem *m) { struct lapm_state *l = &m->ec.lapm; EC_DBG("t401_timeout: %d...\n",l->rtx_count); if (l->rtx_count > LAPM_MAX_RTX ) { EC_DBG("t401: max retransmission count was reached.\n"); l->rtx_count = 0; // TBD switch(l->state) { case LAPM_ESTAB: case LAPM_DISC: l->state = LAPM_IDLE; modem_update_status(l->modem,STATUS_EC_RELEASE); break; case LAPM_DATA: // TBD: disconnect EC_DBG("t401: max data rtx was reached: disconnect\n"); lapm_disconnect(l); break; } return ; } l->rtx_count++; if (l->config) { tx_xid(l,l->cmd_addr); } else { switch(l->state) { case LAPM_ESTAB: TX_SABME(l); break; case LAPM_DISC: TX_DISC(l); break; case LAPM_DATA: if (l->busy) TX_RNR(l,l->cmd_addr,1); else TX_RR(l,l->cmd_addr,1); break; } } m->bit_timer = T401_TIMEOUT; m->bit_timer_func = t401_timeout; } #if T403_IMPLEMENTED static void t403_timeout(struct lapm_state *l) { EC_DBG("t403_timeout...\n"); if (l->state != LAPM_DATA) { EC_ERR("t403: no in data state.\n"); return; } if (l->busy) TX_RNR(l,l->cmd_addr,1); else TX_RR(l,l->cmd_addr,1); T401_START(l); l->rtx_count = 1; } #endif /* transmit info */ static int tx_info(struct lapm_state *l) { frame_t *f; int n = 0; if (l->peer_busy || ((l->vs - l->va)&0x7f) >= l->tx_win_size) { return 0; } if (l->tx_info == l->info_list) { /* empty tx */ if (l->info_list->next == l->tx_info || l->info_list->next == l->sent_info) { EC_ERR("tx_info: cannot alloc frame.\n"); return 0; } f = l->info_list; if(!l->modem->get_chars) return 0; n = l->modem->get_chars(l->modem,(char*)(f->buf+3),l->tx_info_size); if (n < 0) { /* error */ EC_ERR("tx_info: get chars error.\n"); modem_update_status(l->modem,STATUS_EC_ERROR); return 0; } if ( n == 0) { /* no data */ return 0; } f->size = n + 3; l->info_list = l->info_list->next; l->info_count--; // debug l->tx_count++; // debug LAPM_PRINT_FRAME("tx_info",1,f); } /* start T401 */ //if (!l->timer) // TIMER_START(l); return 1; } /* reject all noacked frames (>va) */ static int reject_info(struct lapm_state *l) { u8 n = (l->vs-l->va)&0x7f; if (l->state != LAPM_DATA) /* ignore retransmission */ return 0; EC_DBG("(va/vs/vr %d/%d/%d) reject info: reject %d frames...\n", l->va,l->vs,l->vr,n); l->vs = l->va; l->tx_info = l->sent_info; l->tx_count += l->sent_count; // debug l->sent_count = 0; // debug return n; } /* ack info */ static int ack_info(struct lapm_state *l, u8 nr) { int n = 0; //EC_DBG1("ack info: nr %d...\n", nr); /* check for valid nr ( va <= nr <= vs && vs-va<= k ) */ // fixme: optimize this if (!( ((nr-l->va)&0x7f) >= 0 && ((l->vs-nr)&0x7f) >= 0 && ((l->vs-l->va)&0x7f) <= l->tx_win_size) ) { EC_ERR("nr sequince error. disconnect!\n"); // TBD notify CF lapm_disconnect(l); return -1; } while(l->va != nr) { if (l->sent_info == l->tx_info) { /* debug only ? */ EC_ERR("ack info: VERY BAD: empty sent list: va %d, vs %d\n", l->va,l->vs); break; } l->sent_info = l->sent_info->next; l->sent_count--; // debug l->info_count++; // debug l->va = (l->va+1)&0x7f; n++; } /* stop T401 , start T403 */ #if 1 if(n > 0 && !l->rtx_count) { #else if(n > 0 && !l->rtx_count && !l->peer_busy) { #endif TIMER_STOP(l); if ((l->vs-l->va)&0x7f) TIMER_START(l); // exp.8.4.8 } return n; } /* push rest data (when busy) */ static void push_rest_data(struct modem *m, int bits) { struct lapm_state *l = &m->ec.lapm; if (!l->state == LAPM_DATA) return; if (l->rx_count && l->modem->put_chars) { int ret = l->modem->put_chars(l->modem, (const char*)(l->rx_buf+l->rx_head), l->rx_count); if (ret > 0) { l->rx_head += ret; l->rx_count -= ret; if (!l->rx_count) { l->rx_head = 0; /* reset busy state */ l->busy = 0; TX_RR(l,l->cmd_addr,0); l->modem->packer_process = NULL; } } } } /* info frame process */ static int rx_info(struct lapm_state *l, frame_t *f) { int ret = 0, n; //LAPM_PRINT_FRAME("rx_info",1,f); /* ack I frames: nr -1 */ n = ack_info(l,FRAME_NR(f)); /* busy */ if (l->busy) { if(FRAME_I_PF(f)) /* 8.4.7 */ TX_RNR(l,l->rsp_addr,1); return 0; } /* NS sequence error */ if (FRAME_NS(f)!= l->vr) { /* TBD */ /* is info may be send */ EC_DBG("seq.error: ns %d, vr %d\n",FRAME_NS(f),l->vr); // reject should be sent if (l->reject) /* already sent */ return -1; EC_DBG("tx reject...\n"); TX_REJ(l,l->rsp_addr,FRAME_I_PF(f)); /* TX_REJ(l,l->cmd_addr,1); */ l->reject = 1; // fixme: why to start timer //if (!l->timer) // TIMER_START(l); return -1; } l->reject = 0; /* recv data */ if(l->modem->put_chars) ret = l->modem->put_chars(l->modem,(const char*)(f->buf+3),f->count-3); if(ret<0) { /* FIXME: handle error*/ ; } if (ret != f->count-3) { /* save rest data, enter busy state */ l->rx_head = 0; l->rx_count = f->count - 3 - ret; memcpy(l->rx_buf,f->buf+3+ret,l->rx_count); // TBD l->busy = 1; // try to push rest data later l->modem->packer_process = push_rest_data; } /* increment vr */ l->vr = (l->vr+1)&0x7f; /* response I,RR,RNR */ if (l->busy) TX_RNR(l,FRAME_ADDR(f),FRAME_I_PF(f)); else if ( l->peer_busy || FRAME_I_PF(f) || !tx_info(l) ) TX_RR(l,FRAME_ADDR(f),FRAME_I_PF(f)); return 0; } /* rx supervisory frame */ static void rx_super_cmd(struct lapm_state *l, frame_t *f) { int n; //LAPM_PRINT_FRAME("rx super:",1,f); /* note 8.4.7: if l->busy each RR,RNR,REJ with p=1 should be replied by RNR with f=1 */ switch(FRAME_CTRL(f)) { case FRAME_S_RR: /* clear peer_busy state */ l->peer_busy = 0; n = ack_info(l,FRAME_NR(f)); /* p=1 may be used for status checking */ if (FRAME_S_PF(f) || !tx_info(l)) { if (l->busy) TX_RNR(l,FRAME_ADDR(f),FRAME_S_PF(f)); else TX_RR(l,FRAME_ADDR(f),FRAME_S_PF(f)); } break; case FRAME_S_RNR: /* going to peer_busy state */ l->peer_busy = 1; n = ack_info(l,FRAME_NR(f)); /* if p=1 may be used for status checking ?? */ if (FRAME_S_PF(f)) { if (l->busy) TX_RNR(l,l->rsp_addr,FRAME_S_PF(f)); else TX_RR(l,l->rsp_addr,FRAME_S_PF(f)); } break; case FRAME_S_REJ: /* clear peer_busy state */ l->peer_busy = 0; n = ack_info(l,FRAME_NR(f)); if (!l->rtx_count) { TIMER_STOP(l); reject_info(l); } /* p=1 may be used for status checking */ if (FRAME_S_PF(f) || !tx_info(l)) { if (l->busy) TX_RNR(l,FRAME_ADDR(f),FRAME_S_PF(f)); else TX_RR(l,FRAME_ADDR(f),FRAME_S_PF(f)); } break; case FRAME_S_SREJ: /* TBD, optional */ EC_ERR("unsupported SREJ command!\n"); return; default: EC_ERR("unknown s frame: %02x.\n",FRAME_CTRL(f)); return; } } static void rx_super_rsp(struct lapm_state *l, frame_t *f) { int n; //LAPM_PRINT_FRAME("rx_super",0,f); if (!l->rtx_count && FRAME_S_PF(f)) { EC_ERR("rx_super: unsolisited final response!\n"); return; } /* ack I frames <= nr -1 */ switch(FRAME_CTRL(f)) { case FRAME_S_RR: l->peer_busy = 0; n = ack_info(l,FRAME_NR(f)); if (l->rtx_count && FRAME_S_PF(f)) { reject_info(l); TIMER_STOP(l); } break; case FRAME_S_RNR: l->peer_busy = 1; n = ack_info(l,FRAME_NR(f)); if (l->rtx_count && FRAME_S_PF(f)) { reject_info(l); TIMER_STOP(l); // fixme: need stop even on RNR ?? } if (!l->rtx_count) TIMER_START(l); break; case FRAME_S_REJ: l->peer_busy = 0; n = ack_info(l,FRAME_NR(f)); if (!l->rtx_count || FRAME_S_PF(f)) { reject_info(l); TIMER_STOP(l); } break; case FRAME_S_SREJ: /* TBD, optional */ EC_ERR("unsupported SREJ response!\n"); return; default: EC_ERR("rx_s_rsp: unknown header %02x.\n", FRAME_CTRL(f)); return; } } /* rx unnumbered frame */ static int rx_unnum_cmd(struct lapm_state *l, frame_t *f) { //LAPM_PRINT_FRAME("rx unnum:",1,f); switch(FRAME_CTRL(f)&0xef) { case FRAME_U_SABME: EC_DBG("sabme received.\n"); /* discard unacked I frames, reset vs,vr,va, clear exceptions */ reset(l); /* going to connected state */ l->state = LAPM_DATA; /* respond UA (or DM on error) */ // fixme: why may be error and TX_DM ?? TX_UA(l,FRAME_U_PF(f)); TIMER_STOP(l); modem_update_status(l->modem,STATUS_EC_LINK); break; case FRAME_U_UI: /* break signal */ /* pf = 0 */ /* TBD */ break; case FRAME_U_DISC: /* respond UA (or DM) */ if (l->state == LAPM_IDLE) TX_DM(l,1); else { /* going to disconnected state, discard unacked I frames, reset all */ l->state = LAPM_IDLE; reset(l); TX_UA(l,FRAME_U_PF(f)); T401_STOP(l); // TBD notify CF modem_update_status(l->modem,STATUS_EC_RELEASE); } break; case FRAME_U_XID: /* exchange general id info */ rx_xid(l,f); tx_xid(l,l->rsp_addr); break; case FRAME_U_TEST: /* TBD */ /* optional */ break; default: EC_ERR("rx unnum cmd: unknown frame 0x%02x\n", FRAME_CTRL(f)); return -1; } return 0; } static int rx_unnum_rsp(struct lapm_state *l, frame_t *f) { //LAPM_PRINT_FRAME("rx unnum",0, f); switch(FRAME_CTRL(f)&0xef) { case FRAME_U_DM: /* notify peer about disconnected state */ /* TBD */ switch(l->state) { case LAPM_ESTAB: case LAPM_DISC: if (FRAME_U_PF(f)) { l->state = LAPM_IDLE; reset(l); T401_STOP(l); // TBD notify CF modem_update_status(l->modem,STATUS_EC_RELEASE); } break; case LAPM_DATA: if (l->rtx_count || !FRAME_U_PF(f)) { l->state = LAPM_IDLE; reset(l); // TBD: notify CF modem_update_status(l->modem,STATUS_EC_RELEASE); } break; case LAPM_IDLE: if (!FRAME_U_PF(f)) { // TBD: notify CF // to establish connection modem_update_status(l->modem,STATUS_EC_LINK); } break; default: break; } break; case FRAME_U_UI: /* break signal */ /* pf = 0 */ /* TBD */ break; case FRAME_U_UA: /* notify us about mode change, responds SABME,DISC */ switch(l->state) { case LAPM_ESTAB: l->state = LAPM_DATA; reset(l); TIMER_STOP(l); modem_update_status(l->modem,STATUS_EC_LINK); break; case LAPM_DISC: // TBD l->state = LAPM_IDLE; reset(l); T401_STOP(l); modem_update_status(l->modem,STATUS_EC_RELEASE); break; default: // TBD /* handle unsolicited UA */ break; } /* clear all exceptions, busy states (self and peer) */ /* reset vars */ break; case FRAME_U_FRMR: /* not recovarable error */ /* TBD */ break; case FRAME_U_XID: if (l->config) { rx_xid(l,f); l->config = 0; T401_STOP(l); if (l->state == LAPM_IDLE) { lapm_connect(l); } else if (l->state == LAPM_DATA) { l->busy = 0; TX_RR(l,l->cmd_addr,0); } } break; default: EC_ERR("rx unnum rsp: unknown frame 0x%02x\n", FRAME_CTRL(f)); break; } return 0; } /* lapm framer interface functions */ static frame_t *lapm_get_tx_frame(void *framer) { struct lapm_state *l = framer; frame_t *f; /* get ctrl frame */ if ( l->tx_ctrl != l->ctrl_list ) { f = l->tx_ctrl; l->tx_ctrl = l->tx_ctrl->next; return f; } /* get info frame */ if ( l->peer_busy || l->config || l->state != LAPM_DATA) return 0; if ( l->tx_info == l->info_list && !tx_info(l) ) return 0; f = l->tx_info; l->tx_info = l->tx_info->next; f->buf[0] = l->cmd_addr; f->buf[1] = l->vs << 1; f->buf[2] = l->vr << 1; l->vs = (l->vs + 1)&0x7f; if (!l->modem->bit_timer) TIMER_START(l); //LAPM_PRINT_FRAME("get_tx_frame",1,f); //EC_DBG1("get_tx_frame: sent %d, tx %d, free %d...\n", // l->sent_count,l->tx_count,l->info_count); return f; } static void lapm_tx_complete(void *framer, frame_t *f) { struct lapm_state *l = framer; LAPM_PRINT_FRAME("tx",TX_IS_COMMAND(f),f); switch(FRAME_TYPE(f)) { case FRAME_I: l->sent_count++; // debug l->tx_count--; // debug //EC_DBG1("tx_info_complete: sent %d, tx %d, free %d.\n", // l->sent_count,l->tx_count,l->info_count); break; case FRAME_S: case FRAME_U: l->ctrl_count++; // debug break; default: EC_ERR("unknown frame type.\n"); break; } } static int valid_data_state(struct lapm_state *l) { switch (l->state) { case LAPM_ESTAB: reset(l); l->state = LAPM_DATA; modem_update_status(l->modem,STATUS_EC_LINK); case LAPM_DATA: return 1; case LAPM_DISC: reset(l); l->state = LAPM_IDLE; modem_update_status(l->modem,STATUS_EC_RELEASE); case LAPM_IDLE: return 0; default: EC_ERR("valid_data_state: unknown state %d.\n", l->state); return 0; } return 0; } static void lapm_rx_complete(void *framer, frame_t *f) { struct lapm_state *l = framer; LAPM_PRINT_FRAME("rx",RX_IS_COMMAND(f),f); switch(FRAME_TYPE(f)) { case FRAME_I: if(!valid_data_state(l)) return; rx_info(l,f); break; case FRAME_S: if(!valid_data_state(l)) return; if (RX_IS_COMMAND(f)) rx_super_cmd(l,f); else rx_super_rsp(l,f); break; case FRAME_U: if (RX_IS_COMMAND(f)) rx_unnum_cmd(l,f); else rx_unnum_rsp(l,f); break; default: EC_ERR("unknown frame type.\n"); break; } } /* lapm api functions */ static int lapm_connect(struct lapm_state *l) { if (!l->state == LAPM_IDLE) return -1; /* negotiate params */ //tx_xid(l,l->cmd_addr); /* clear all */ reset(l); /* connect */ l->state = LAPM_ESTAB; TX_SABME(l); /* start t401 (and not t403) */ T401_START(l); return 0; } /* negotiate params */ static int lapm_config(struct lapm_state *l) { l->config = 1; if (l->state == LAPM_DATA) { l->busy = 1; TX_RNR(l,l->cmd_addr,1); } tx_xid(l,l->cmd_addr); T401_START(l); return 0; } static int lapm_disconnect(struct lapm_state *l) { l->state = LAPM_DISC; TX_DISC(l); /* start T401 (and not T403) */ T401_START(l); return 0; } static void reset(struct lapm_state *l) { l->busy = 0; l->peer_busy = 0; l->vs = 0; l->va = 0; l->vr = 0; /* discard pended data */ // l->rx_head = l->rx_count = 0; /* discard info frames */ l->sent_info = l->info_list; l->tx_info = l->info_list; l->sent_count = l->tx_count = 0; l->info_count = LAPM_INFO_FRAMES; /* discard ctrl frames */ // TBD ??? } /* fixme: optimize mem usage */ static int alloc_frames(struct lapm_state *l) { #define arrsize(a) (sizeof(a)/sizeof((a)[0])) frame_t *f; int i; EC_DBG("alloc_frames: lapm size %d (info %d, ctrl %d).\n", sizeof(*l), sizeof(l->info_buf), sizeof(l->ctrl_buf)); /* init info list */ l->info_list = &l->info_buf[0].frame; for (i=0;iinfo_buf);i++) { f = &l->info_buf[i].frame; f->next = &l->info_buf[i+1].frame; f->buf = l->info_buf[i].ctrl; f->size = sizeof(l->info_buf[0]) - sizeof(frame_t); } f->next = l->info_list; l->info_count= arrsize(l->info_buf); // debug l->tx_info = l->info_list; l->sent_info = l->info_list; /* init ctrl list */ l->ctrl_list = &l->ctrl_buf[0].frame; for (i=0;ictrl_buf);i++) { f = &l->ctrl_buf[i].frame; f->next = &l->ctrl_buf[i+1].frame; f->buf = l->ctrl_buf[i].ctrl; f->size = sizeof(l->ctrl_buf[0]) - sizeof(frame_t); } f->next = l->ctrl_list; l->ctrl_count= arrsize(l->ctrl_buf); // debug l->tx_ctrl = l->ctrl_list; return 0; } static int lapm_init(struct lapm_state *l, struct modem *m) { memset(l,0,sizeof(*l)); l->modem = m; l->state = LAPM_IDLE; l->busy = 0; l->peer_busy = 0; /* set originator/answer addresses */ l->cmd_addr = m->caller ? 0x3 : 0x1; l->rsp_addr = m->caller ? 0x1 : 0x3; l->tx_win_size = m->cfg.ec_tx_win_size; l->rx_win_size = m->cfg.ec_rx_win_size; l->tx_info_size = m->cfg.ec_tx_info_size; l->rx_info_size = m->cfg.ec_rx_info_size; alloc_frames(l); reset(l); return 0; } static int lapm_exit(struct lapm_state *l) { reset(l); l->info_list = 0; l->ctrl_list = 0; return 0; } /* modem ec interface func */ static void modem_ec_negotiate(struct modem *m) { m->packer.hdlc.tx_complete = lapm_tx_complete; m->packer.hdlc.get_tx_frame = lapm_get_tx_frame; lapm_config(&m->ec.lapm); } void modem_ec_start(struct modem *m) { struct hdlc_state *h = &m->packer.hdlc; struct lapm_state *l = &m->ec.lapm; EC_DBG("modem_ec_start...\n"); h->framer = l; h->tx_complete = NULL; h->rx_complete = lapm_rx_complete; h->get_tx_frame = NULL; if(m->caller) { m->bit_timer = 48*8; m->bit_timer_func = modem_ec_negotiate; } else { h->tx_complete = lapm_tx_complete; h->get_tx_frame = lapm_get_tx_frame; } // fixme: improve BUSY becoming, remove packer_process() m->packer_process = NULL; } void modem_ec_stop(struct modem *m) { struct lapm_state *l = &m->ec.lapm; EC_DBG("modem_ec_stop...\n"); m->bit_timer = 0; m->packer_process = NULL; lapm_disconnect(l); } int modem_ec_init(struct modem *m) { struct lapm_state *l = &m->ec.lapm; lapm_init(l,m); return 0; } void modem_ec_exit(struct modem *m) { struct lapm_state *l = &m->ec.lapm; lapm_exit(l); } slmodem-2.9.11-20110321/modem/dp_sinus.c0000644000175000000620000000700610773430100016047 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * sinus.c -- sinus data pump. * * Author: Sasha K (sashak@smlink.com) * * */ #include #include #ifdef __KERNEL__ #define malloc(size) kmalloc(size,GFP_KERNEL) #define free(mem) kfree(mem) #endif #define SIN_AMPLITUDE 16384 #define SIN_PERIOD (sizeof(sintab)/sizeof(sintab[0])) static const s16 sintab[] = { 0, 3196, 6269, 9102, 11585, 13622, 15136, 16069, 16384, 16069, 15136, 13622, 11585, 9102, 6269, 3196, 0, -3196, -6269, -9102, -11585, -13622, -15136, -16069, -16384, -16069, -15136, -13622, -11585, -9102, -6269, -3196}; #define SIN_DBG(fmt,arg...) dprintf("sin: " fmt , ##arg) struct sin_state { struct dp dp; int count; int linked; u8 buf[1024]; int amp; unsigned period; unsigned phase; }; static struct dp *sin_create(struct modem *m, enum DP_ID id, int caller, int srate, int max_frag, struct dp_operations *op) { struct sin_state *s; SIN_DBG("create...\n"); s = malloc(sizeof(*s)); if (!s) return NULL; memset(s,0,sizeof(*s)); s->dp.id = id; s->dp.modem = m; s->dp.op = op; s->dp.dp_data = s; s->phase = 0; s->amp = SIN_AMPLITUDE; s->period= SIN_PERIOD; return &s->dp; } static int sin_delete(struct dp *dp) { struct sin_state *s = dp->dp_data; SIN_DBG("delete...\n"); free(s); return 0; } static int sin_run(struct dp *dp, void *in, void *out, int cnt) { struct sin_state *s = dp->dp_data; s16 *smpl = out; int i; //SIN_DBG("run...\n"); for (i=0;iphase%SIN_PERIOD]; s->phase = s->phase+1; } return DPSTAT_OK; } static struct dp_operations sin_operations = { name : "Sinus DP driver", create: sin_create, delete: sin_delete, process:sin_run }; int dp_sinus_init(void) { return modem_dp_register(DP_SINUS,&sin_operations); } void dp_sinus_exit(void) { modem_dp_deregister(DP_SINUS,&sin_operations); } slmodem-2.9.11-20110321/modem/homolog_data.c0000644000175000000620000003007610773430100016663 0ustar marvstaff/* generated at Jun 1 2004 19:11:22 */ #include #include static const struct homolog_params params000 = {0x22,0x43,0x01,0x08,0x5a,0x28,0x3f,0x02,0x25,0x3f,0x00,0x1b,0x02,0x09,0x01,0x10,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params001 = {0x24,0x40,0x01,0x06,0x64,0x12,0x3c,0x04,0x12,0x3c,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x05,0x2b,0x00,0xff,0x06,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params002 = {0x21,0x43,0x01,0x08,0x5a,0x23,0x27,0x04,0x23,0x27,0x00,0x09,0x02,0x09,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params003 = {0x28,0x3c,0x01,0x08,0x5a,0x00,0x00,0x02,0x00,0x00,0x00,0x09,0x04,0x09,0x01,0x08,0x02,0x06,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params005 = {0x21,0x43,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x04,0x09,0x01,0x07,0x02,0x04,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params006 = {0x24,0x40,0x01,0x06,0x64,0x12,0x50,0x04,0x12,0x50,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x05,0x2b,0x00,0xff,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params007 = {0x21,0x43,0x01,0x06,0x69,0x2a,0x50,0x04,0x2a,0x50,0x00,0x3c,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x03,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params008 = {0x28,0x3c,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params011 = {0x24,0x40,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params012 = {0x21,0x43,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params013 = {0x21,0x43,0x01,0x08,0x5a,0x2a,0x50,0x04,0x2a,0x50,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params014 = {0x28,0x3c,0x01,0x06,0x5a,0x06,0x2a,0x08,0x0d,0x3c,0x01,0x0a,0x04,0x09,0x01,0x0e,0x02,0x00,0x22,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params015 = {0x24,0x40,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x02,0x09,0x01,0x19,0x02,0x00,0x26,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params016 = {0x21,0x43,0x01,0x09,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params018 = {0x28,0x3c,0x01,0x08,0x5a,0x0a,0x42,0x04,0x0a,0x41,0x00,0x09,0x04,0x09,0x01,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params020 = {0x29,0x3c,0x01,0x08,0x5a,0x0f,0x3c,0x04,0x23,0x3c,0x00,0x12,0x04,0x09,0x01,0x19,0x02,0x05,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params022 = {0x24,0x40,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x06,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params023 = {0x21,0x43,0x01,0x06,0x5a,0x0b,0x3c,0x02,0x0b,0x3c,0x00,0x09,0x04,0x09,0x01,0x08,0x02,0x06,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params025 = {0x24,0x40,0x01,0x06,0x64,0x41,0x55,0x04,0x41,0x55,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x2e,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params027 = {0x22,0x43,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x09,0x00,0x19,0x02,0x02,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params028 = {0x24,0x40,0x01,0x06,0x64,0x12,0x3c,0x04,0x12,0x3c,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x05,0x2b,0x00,0xff,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params029 = {0x29,0x41,0x01,0x08,0x5a,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x02,0x09,0x01,0x0f,0x02,0x04,0x28,0x00,0x1e,0x00,0x50,0x06,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params030 = {0x22,0x42,0x01,0x08,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x0e,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params032 = {0x22,0x42,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x08,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x06,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params033 = {0x24,0x40,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x00,0x2b,0x00,0xff,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params035 = {0x21,0x43,0x01,0x08,0x5a,0x21,0x30,0x04,0x0e,0x19,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params036 = {0x28,0x3c,0x01,0x06,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x04,0x09,0x01,0x19,0x02,0x05,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params038 = {0x21,0x43,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x03,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params039 = {0x21,0x43,0x01,0x08,0x5a,0x21,0x3c,0x04,0x21,0x3c,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params040 = {0x24,0x40,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x2e,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params041 = {0x21,0x43,0x01,0x06,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params042 = {0x28,0x3c,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x02,0x09,0x01,0x0f,0x02,0x07,0x20,0x00,0x1e,0x00,0x50,0x05,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params043 = {0x21,0x43,0x03,0x07,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x46,0x04,0x09,0x00,0x19,0x01,0x01,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params044 = {0x24,0x40,0x01,0x08,0x5a,0x0a,0x42,0x02,0x0a,0x41,0x00,0x0a,0x04,0x09,0x01,0x0f,0x02,0x00,0x27,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params045 = {0x21,0x43,0x01,0x08,0x69,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x03,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params049 = {0x21,0x43,0x01,0x06,0x5a,0x0b,0x3c,0x02,0x0b,0x3c,0x00,0x09,0x04,0x09,0x01,0x08,0x02,0x05,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params050 = {0x21,0x43,0x01,0x08,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x02,0x09,0x01,0x19,0x02,0x03,0x23,0x01,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params051 = {0x28,0x3c,0x01,0x07,0x5a,0x0c,0x16,0x04,0x0c,0x16,0x00,0x12,0x04,0x09,0x01,0x19,0x02,0x05,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params052 = {0x26,0x3e,0x01,0x04,0x69,0x22,0x2e,0x04,0x22,0x2e,0x00,0x09,0x02,0x0a,0x00,0x19,0x03,0x01,0x2b,0x00,0x1e,0x00,0x32,0x03,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params054 = {0x21,0x43,0x01,0x07,0x69,0x48,0x4e,0x04,0x48,0x4e,0x00,0x09,0x02,0x0a,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x03,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params055 = {0x28,0x3c,0x01,0x07,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x0a,0x04,0x09,0x01,0x19,0x02,0x05,0x2b,0x00,0x1e,0x00,0x55,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params056 = {0x28,0x3c,0x01,0x07,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x04,0x09,0x01,0x19,0x02,0x05,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params057 = {0x28,0x3c,0x01,0x09,0x5a,0x2a,0x50,0x04,0x2a,0x50,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params059 = {0x21,0x43,0x01,0x08,0x5a,0x05,0x3c,0x04,0x05,0x3c,0x00,0x0a,0x05,0x09,0x01,0x0c,0x02,0x05,0x29,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params061 = {0x28,0x3c,0x02,0x08,0x5a,0x14,0x1e,0x04,0x14,0x55,0x00,0x09,0x04,0x09,0x01,0x0f,0x02,0x00,0x1f,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params062 = {0x28,0x3c,0x01,0x08,0x5a,0x08,0x50,0x02,0x08,0x50,0x00,0x0c,0x04,0x09,0x01,0x0f,0x02,0x00,0x25,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x01,}; static const struct homolog_params params063 = {0x21,0x43,0x01,0x06,0x64,0x14,0x3c,0x04,0x14,0x3c,0x00,0x32,0x02,0x0a,0x00,0x0a,0x02,0x01,0x2b,0x00,0x1e,0x06,0x50,0x03,0x00,0x00,0x00,0x012c,0x00,}; static const struct homolog_params params064 = {0x28,0x3c,0x01,0x06,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x02,0x0a,0x00,0x19,0x02,0x01,0x23,0x00,0x1e,0x00,0x50,0x02,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params067 = {0x21,0x43,0x01,0x07,0x5a,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x04,0x09,0x00,0x02,0x02,0x03,0x2d,0x00,0x1e,0x00,0x15,0x04,0x00,0x00,0x00,0x029a,0x00,}; static const struct homolog_params params068 = {0x22,0x48,0x01,0x08,0x5a,0x23,0x27,0x04,0x23,0x27,0x00,0x07,0x04,0x09,0x00,0x19,0x02,0x01,0x2b,0x00,0x1e,0x00,0x50,0x04,0x00,0x00,0x00,0x029a,0x00,}; const struct homolog_set homolog_set[] = { {0x0002,"ALGERIA",¶ms000}, {0x0007,"ARGENTINA",¶ms001}, {0x0009,"AUSTRALIA",¶ms002}, {0x000a,"AUSTRIA",¶ms003}, {0x000c,"BAHREIN",¶ms001}, {0x000f,"BELGIUM",¶ms005}, {0x0016,"BRAZIL",¶ms006}, {0x001a,"BRUNEI",¶ms007}, {0x001b,"BULGARIA",¶ms008}, {0x0020,"CANADA",¶ms001}, {0x0025,"CHILE",¶ms001}, {0x0026,"CHINA",¶ms011}, {0x0100,"CTR21EUROPE",¶ms012}, {0x002d,"CYPRUS",¶ms013}, {0x002e,"CZECH_REPUBLIC",¶ms014}, {0x0031,"DENMARK",¶ms015}, {0x0036,"EGYPT",¶ms016}, {0x0101,"ESTONIA",¶ms012}, {0x003c,"FINLAND",¶ms018}, {0x003d,"FRANCE",¶ms000}, {0x0042,"GERMANY",¶ms020}, {0x0046,"GREECE",¶ms012}, {0x0050,"HONG_KONG",¶ms022}, {0x0051,"HUNGARY",¶ms023}, {0x0052,"ICELAND",¶ms012}, {0x0053,"INDIA",¶ms025}, {0x0054,"INDONESIA",¶ms011}, {0x0057,"IRELAND",¶ms027}, {0x0058,"ISRAEL",¶ms028}, {0x0059,"ITALY",¶ms029}, {0x0000,"JAPAN",¶ms030}, {0x005e,"JORDAN",¶ms013}, {0x0061,"KOREA",¶ms032}, {0x0062,"KUWAIT",¶ms033}, {0x0103,"LATVIA",¶ms008}, {0x0064,"LEBANON",¶ms035}, {0x0104,"LITHUANIA",¶ms036}, {0x0069,"LUXEMBOURG",¶ms012}, {0x006c,"MALAYSIA",¶ms038}, {0x0070,"MALTA",¶ms039}, {0x0073,"MEXICO",¶ms040}, {0x0077,"MOROCCO",¶ms041}, {0x007b,"NETHERLANDS",¶ms042}, {0x007e,"NEW_ZEALAND",¶ms043}, {0x0082,"NORWAY",¶ms044}, {0x0083,"OMAN",¶ms045}, {0x0084,"PAKISTAN",¶ms040}, {0x0088,"PERU",¶ms001}, {0x0089,"PHILIPPINES",¶ms040}, {0x008a,"POLAND",¶ms049}, {0x008b,"PORTUGAL",¶ms050}, {0x008e,"ROMANIA",¶ms051}, {0x00b8,"RUSSIA",¶ms052}, {0x0098,"SAUDIARABIA",¶ms001}, {0x009c,"SINGAPORE",¶ms054}, {0x00c5,"SLOVAKIA",¶ms055}, {0x00c6,"SLOVENIA",¶ms056}, {0x009f,"SOUTHAFRICA",¶ms057}, {0x0107,"SOUTHKOREA",¶ms001}, {0x00a0,"SPAIN",¶ms059}, {0x00a1,"SRILANKA",¶ms054}, {0x00a5,"SWEDEN",¶ms061}, {0x00a6,"SWITZERLAND",¶ms062}, {0x0108,"TAIWAN",¶ms063}, {0x00a9,"THAILAND",¶ms064}, {0x00ad,"TUNISIA",¶ms000}, {0x00ae,"TURKEY",¶ms012}, {0x00b3,"UAE",¶ms067}, {0x00b4,"UK",¶ms068}, {0x00b7,"URUGUAY",¶ms001}, {0x00b5,"USA",¶ms001}, {0x00bc,"VIETNAM",¶ms040}, {}}; slmodem-2.9.11-20110321/modem/modem_param.h0000644000175000000620000001442010773430100016507 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_param.h -- modem parameters access definitions. * * Author: Sasha K (sashak@smlink.com) * * */ #ifndef __MODEM_PARAM_H__ #define __MODEM_PARAM_H__ /* param names */ enum MODEM_PARAMETER_NAMES { MDMPRM_NONE, MDMPRM_RX_RATE, MDMPRM_RATE = MDMPRM_RX_RATE, MDMPRM_TX_RATE, MDMPRM_MIN_RATE, MDMPRM_MAX_RATE, MDMPRM_IODELAY, MDMPRM_CODECTYPE, MDMPRM_DIALSTR, MDMPRM_AUTOMODE, MDMPRM_DP_REQUESTED, MDMPRM_DPRUNTIME, MDMPRM_DSPINFO, MDMPRM_VOICEINFO, MDMPRM_UPDATE_DELAY, MDMPRM_DP_ADDR, MDMPRM_HOOK_ON, MDMPRM_PULSE_DIAL, //GetDTMFBetweenDigitsInterval, GetPulseDialMakeTime, GetPulseDialBreakTime, GetPulseDialDigitPattern, GetDTMFHighToneLevel, GetDTMFDialSpeed, //GetCallProgressDetectionThreshold, //GetDialToneDelay, //GetDialToneHoleTime, //GetDelayBeforeRingCountResettingInMcs, //GetRingCountForAutoanswer, //GetMinRingSignalPeriodInMcs, //GetMaxRingSignalPeriodInMcs, //GetMinRingCadenceOnTimeInMcs, //GetRingCadenceOffTimeInMcs, GetMinBusyCadenceOnTime, GetMaxBusyCadenceOnTime, GetBusyDetectionCyclesNumber, GetMinBusyCadenceOffTime, GetMaxBusyCadenceOffTime, //GetContinuousUnavailableDetectionFlag, //GetAnswerToneValidationTime, //GetBlacklistingDelayedFlag, //GetFailedAttemptsAllowedInFirstStage, //GetFailedAttemptsNumberBeforeBlacklisting, //GetTroubledCallDelay, //GetIneffectiveCallDelay, //GetErroneousCallDelay, //GetBlackListingDuration, //GetLoopCurrentSenseWaitingTime, GetCallingToneFlag, //GetBlindDialFlag, //GetBusyDetectDisable, //GetGuardToneType, //GetBellModesPermittedFlag, //GetOffHookRestrictions, //GetShuntRelayOnTimeDuringOffHook, GetHookFlashTime, GetBlindDialPause, GetNoAnswerTimeOut, GetDialPauseTime, //GetNoCarrierDisconnectTime, GetTransmitLevel, GetDialModifierValidation, //GetTADReceiveGain, //GetHalfOrFullWaveRingDetection, //GetFailedAttemptsNumberBeforeBlockingFurtherAttempts, //GetErroneousCallIncrementCount, GetDialToneValidationTime, //GetDialToneMinOnTimePeriod, GetBusyToneDiffTime, //GetBusyToneDetectionDuringDialToneDetectionFlag, GetDTMFHighAndLowToneLevelDifference, //GetLocalPhoneDetectionInSpeakerphone, GetPulseDialingFlag, GetDialToneCallProgressFilterIndex, GetDialToneDetectionThreshold, GetABCDDialingPermittedFlag, GetComaPauseDurationLimit, //GetTADTransmitLevel, //GetDataFAXCarrierReceiveThreshold, //GetNoDialToneTimeOutDuration, //GetFAXDataAnswerToneDetectionThreshold, //GetDialToneLevel, //GetFAXCallingToneLevel, GetPulseAndToneDialInSameDialStringPermittedFlag, //GetRingerImpedanceRelayFlag, //GetDCLoopVICharacteristicsRelayFlag, //GetDCLoopLimitingRelayFlag, //GetRealOrComplexImpedance, //GetMinPauseBetweenRingSequencesInMcs, //GetMaxPauseBetweenRingSequencesInMcs, //GetMinRingCadenceOnTimeFirstInMcs, //GetMaxRingCadenceOnTimeFirstInMcs, //GetMinRingCadenceOnTimeForFirstSequenceInMcs, //GetMaxRingCadenceOnTimeForFirstSequenceInMcs, //GetMaxRingCadenceOnTimeInMcs, //GetNumberOfSequencesInFirstRing, //GetNumberOfSequencesInRegularRing, //IsALaw, GetBusyToneCallProgressFilterIndex, //GetCoefficientTableIndex, GetPulseBetweenDigitsInterval, GetDialToneWaitTime, //GetAnswerDelay, //GetPulseRefresh, //GetHandsetGain, //GetSpecificHardwareBitmask, //GetDefaultDTMFDialSpeed, //GetDefaultNoAnswerTimeout, //GetBlacklistingTimeout, //IsATPCommandDisabled, //GetDelayAfterCounterpartDisconnection, //IsFloatModeForced, //GetDataFaxCarrierDisconnectThreshold, //GetFaxTransmitLevel, //GetPulseDialingRefreshScheme, GetMinRingbackCadenceOnTime, GetMaxRingbackCadenceOnTime, GetRingbackDetectionCyclesNumber, GetMinRingbackCadenceOffTime, GetMaxRingbackCadenceOffTime, GetRingbackToneCallProgressFilterIndex, GetMinCongestionCadenceOnTime, GetMaxCongestionCadenceOnTime, GetCongestionDetectionCyclesNumber, GetMinCongestionCadenceOffTime, GetMaxCongestionCadenceOffTime, GetCongestionToneCallProgressFilterIndex, GetCallProgressSamplesBufferLength, MustNoiseFilterBeApplied, //GetDigitalImpairmentsMask, GetAdditAttenToBeepgenVoice, GetDialToneFilterSubindex, GetBusyToneLooseDetectionEnabled, //GetRingFreqValueInHz(int); //GetEndUniversalRingTimeoutInMcs, //GetRingIntsForFreq, //GetDelayBeforeUniversalRingCountResettingInMcs, //GetUniversalRingDetectorEnabled, //GetCallWaitingIntegrationTimeMiliSec, //GetCallWaitingThresholdPercentage, //GetDialStringAfterFlash(char *dialString); MDMPRM_LAST }; struct modem; extern long modem_get_param(struct modem *m, unsigned param); extern long modem_set_param(struct modem *m, unsigned name, int val); extern long modem_get_sreg_param(struct modem *m, unsigned sreg_param); #endif /* __MODEM_PARAM_H__ */ slmodem-2.9.11-20110321/modem/modem_main.c0000644000175000017500000006164411343745051016217 0ustar marvmarv /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_main.c -- modem main func. * * Author: Sasha K (sashak@smlink.com) * * */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef SUPPORT_ALSA #define ALSA_PCM_NEW_HW_PARAMS_API 1 #define ALSA_PCM_NEW_SW_PARAMS_API 1 #include /* buffer size in periods */ #define BUFFER_PERIODS 12 #define SHORT_BUFFER_PERIODS 4 #endif #include #include #define INFO(fmt,args...) fprintf(stderr, fmt , ##args ); #define ERR(fmt,args...) fprintf(stderr, "error: " fmt , ##args ); #define DBG(fmt,args...) dprintf("main: " fmt, ##args) #define CLOSE_COUNT_MAX 100 /* modem init externals : FIXME remove it */ extern int dp_dummy_init(void); extern void dp_dummy_exit(void); extern int dp_sinus_init(void); extern void dp_sinus_exit(void); extern int prop_dp_init(void); extern void prop_dp_exit(void); extern int datafile_load_info(char *name,struct dsp_info *info); extern int datafile_save_info(char *name,struct dsp_info *info); extern int modem_ring_detector_start(struct modem *m); /* global config data */ extern const char *modem_dev_name; extern unsigned int ring_detector; extern unsigned int need_realtime; extern const char *modem_group; extern mode_t modem_perm; extern unsigned int use_short_buffer; struct device_struct { int num; int fd; #ifdef SUPPORT_ALSA snd_pcm_t *phandle; snd_pcm_t *chandle; snd_mixer_t *mhandle; snd_mixer_elem_t *hook_off_elem; snd_mixer_elem_t *cid_elem; snd_mixer_elem_t *speaker_elem; unsigned int period; unsigned int buf_periods; unsigned int started; #endif int delay; }; static char inbuf[4096]; static char outbuf[4096]; /* * ALSA 'driver' * */ #ifdef SUPPORT_ALSA #define INTERNAL_DELAY 40 /* internal device tx/rx delay: should be selfdetectible */ extern unsigned use_alsa; static snd_output_t *dbg_out = NULL; static int alsa_mixer_setup(struct device_struct *dev, const char *dev_name) { char card_name[32]; int card_num = 0; char *p; snd_mixer_elem_t *elem; int err; if((p = strchr(dev_name, ':'))) card_num = strtoul(p+1, NULL, 0); sprintf(card_name, "hw:%d", card_num); err = snd_mixer_open(&dev->mhandle, 0); if(err < 0) { DBG("mixer setup: cannot open: %s\n", snd_strerror(err)); return err; } err = snd_mixer_attach(dev->mhandle, card_name); if (err < 0) { ERR("mixer setup: attach %s error: %s\n", card_name, snd_strerror(err)); goto error; } err = snd_mixer_selem_register(dev->mhandle, NULL, NULL); if (err <0) { ERR("mixer setup: register %s error: %s\n", card_name, snd_strerror(err)); goto error; } err = snd_mixer_load(dev->mhandle); if (err < 0) { ERR("mixer setup: load %s error: %s\n", card_name, snd_strerror(err)); goto error; } for (elem = snd_mixer_first_elem(dev->mhandle) ; elem; elem = snd_mixer_elem_next(elem)) { if(strcmp(snd_mixer_selem_get_name(elem),"Off-hook") == 0) dev->hook_off_elem = elem; else if(strcmp(snd_mixer_selem_get_name(elem),"Caller ID") == 0) dev->cid_elem = elem; else if(strcmp(snd_mixer_selem_get_name(elem),"Modem Speaker") == 0) dev->speaker_elem = elem; } if(dev->hook_off_elem) return 0; error: snd_mixer_close(dev->mhandle); dev->mhandle = NULL; if (!err) { ERR("mixer setup: Off-hook switch not found for card %s\n", card_name); err = -ENODEV; } return err; } static int alsa_device_setup(struct device_struct *dev, const char *dev_name) { struct pollfd pfd; int ret; memset(dev,0,sizeof(*dev)); ret = alsa_mixer_setup(dev, dev_name); if(ret < 0) DBG("alsa setup: cannot setup mixer: %s\n", snd_strerror(ret)); ret = snd_pcm_open(&dev->phandle, dev_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); if(ret < 0) { ERR("alsa setup: cannot open playback device '%s': %s\n", dev_name, snd_strerror(ret)); return -1; } ret = snd_pcm_open(&dev->chandle, dev_name, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK); if(ret < 0) { ERR("alsa setup: cannot open playback device '%s': %s\n", dev_name, snd_strerror(ret)); return -1; } ret = snd_pcm_poll_descriptors(dev->chandle, &pfd, 1); if(ret <= 0) { ERR("alsa setup: cannot get poll descriptors of '%s': %s\n", dev_name, snd_strerror(ret)); return -1; } dev->fd = pfd.fd; dev->num = 0; /* <-- FIXME */ if(modem_debug_level > 0) snd_output_stdio_attach(&dbg_out,stderr,0); return 0; } static int alsa_device_release(struct device_struct *dev) { snd_pcm_close (dev->phandle); snd_pcm_close (dev->chandle); if (dev->mhandle) { if (dev->hook_off_elem) snd_mixer_selem_set_playback_switch_all(dev->hook_off_elem, 0); if (dev->cid_elem) snd_mixer_selem_set_playback_switch_all(dev->cid_elem, 0); if (dev->speaker_elem) snd_mixer_selem_set_playback_switch_all(dev->speaker_elem, 0); snd_mixer_close(dev->mhandle); } return 0; } static int alsa_xrun_recovery(struct device_struct *dev) { int err; int len; DBG("alsa xrun: try to recover...\n"); err = snd_pcm_prepare(dev->phandle); if (err < 0) { ERR("xrun recovery: cannot prepare playback: %s\n", snd_strerror(err)); return err; } len = dev->delay - INTERNAL_DELAY; snd_pcm_format_set_silence(SND_PCM_FORMAT_S16_LE, outbuf, len); err = snd_pcm_writei(dev->phandle, outbuf, len); if (err < 0) { ERR("xrun recovery: write error: %s\n", snd_strerror(err)); return err; } err = snd_pcm_start(dev->chandle); if(err < 0) { ERR("xrun recovcery snd_pcm_start error: %s\n", snd_strerror(err)); return err; } DBG("alsa xrun: recovered.\n"); return 0; } static int alsa_device_read(struct device_struct *dev, char *buf, int count) { int ret; do { ret = snd_pcm_readi(dev->chandle,buf,count); if (ret == -EPIPE) { ret = alsa_xrun_recovery(dev); break; } } while (ret == -EAGAIN); #if 0 if(ret != dev->period) DBG("alsa_device_read (%d): %d ...\n",count,ret); #endif return ret ; } static int alsa_device_write(struct device_struct *dev, const char *buf, int count) { int written = 0; if(!dev->started) return 0; while(count > 0) { int ret = snd_pcm_writei(dev->phandle,buf,count); if(ret < 0) { if (ret == -EAGAIN) continue; if (ret == -EPIPE) { ret = alsa_xrun_recovery(dev); } written = ret; break; } count -= ret; buf += ret; written += ret; } #if 0 if(written != dev->period) DBG("alsa_device_write (%d): %d...\n",asked,written); #endif return written; } static snd_pcm_format_t mdm2snd_format(unsigned mdm_format) { if(mdm_format == MFMT_S16_LE) return SND_PCM_FORMAT_S16_LE; return SND_PCM_FORMAT_UNKNOWN; } static int setup_stream(snd_pcm_t *handle, struct modem *m, const char *stream_name) { struct device_struct *dev = m->dev_data; snd_pcm_hw_params_t *hw_params; snd_pcm_sw_params_t *sw_params; snd_pcm_format_t format; unsigned int rate, rrate; snd_pcm_uframes_t size, rsize; int err; err = snd_pcm_hw_params_malloc(&hw_params); if (err < 0) { ERR("cannot alloc hw params for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_hw_params_any(handle,hw_params); if (err < 0) { ERR("cannot init hw params for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_hw_params_set_access(handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); if (err < 0) { ERR("cannot set access for %s: %s\n", stream_name, snd_strerror(err)); return err; } format = mdm2snd_format(m->format); if(format == SND_PCM_FORMAT_UNKNOWN) { ERR("unsupported format for %s\n",stream_name); return -1; } err = snd_pcm_hw_params_set_format(handle, hw_params, format); if (err < 0) { ERR("cannot set format for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_hw_params_set_channels(handle, hw_params, 1); if (err < 0) { ERR("cannot set channels for %s: %s\n", stream_name, snd_strerror(err)); return err; } rrate = rate = m->srate; err = snd_pcm_hw_params_set_rate_near(handle, hw_params, &rrate, 0); if (err < 0) { ERR("cannot set rate for %s: %s\n", stream_name, snd_strerror(err)); return err; } if ( rrate != rate ) { ERR("rate %d is not supported by %s (%d).\n", rate, stream_name, rrate); return -1; } rsize = size = dev->period ; err = snd_pcm_hw_params_set_period_size_near(handle, hw_params, &rsize, NULL); if (err < 0) { ERR("cannot set periods for %s: %s\n", stream_name, snd_strerror(err)); return err; } if ( rsize < size ) { ERR("period size %ld is not supported by %s (%ld).\n", size, stream_name, rsize); return -1; } rsize = size = use_short_buffer ? rsize * dev->buf_periods : rsize * 32; err = snd_pcm_hw_params_set_buffer_size_near(handle, hw_params, &rsize); if (err < 0) { ERR("cannot set buffer for %s: %s\n", stream_name, snd_strerror(err)); return err; } if ( rsize != size ) { DBG("buffer size for %s is changed %ld -> %ld\n", stream_name, size, rsize); } err = snd_pcm_hw_params(handle, hw_params); if (err < 0) { ERR("cannot setup hw params for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_prepare(handle); if (err < 0) { ERR("cannot prepare %s: %s\n", stream_name, snd_strerror(err)); return err; } snd_pcm_hw_params_free(hw_params); err = snd_pcm_sw_params_malloc(&sw_params); if (err < 0) { ERR("cannot alloc sw params for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_sw_params_current(handle,sw_params); if (err < 0) { ERR("cannot get sw params for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_sw_params_set_start_threshold(handle, sw_params, INT_MAX); if (err < 0) { ERR("cannot set start threshold for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_sw_params_set_avail_min(handle, sw_params, 4); if (err < 0) { ERR("cannot set avail min for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_sw_params_set_xfer_align(handle, sw_params, 4); if (err < 0) { ERR("cannot set align for %s: %s\n", stream_name, snd_strerror(err)); return err; } err = snd_pcm_sw_params(handle, sw_params); if (err < 0) { ERR("cannot set sw params for %s: %s\n", stream_name, snd_strerror(err)); return err; } snd_pcm_sw_params_free(sw_params); if(modem_debug_level > 0) snd_pcm_dump(handle,dbg_out); return 0; } static int alsa_start (struct modem *m) { struct device_struct *dev = m->dev_data; int err, len; DBG("alsa_start...\n"); dev->period = m->frag; dev->buf_periods = use_short_buffer ? SHORT_BUFFER_PERIODS : BUFFER_PERIODS; err = setup_stream(dev->phandle, m, "playback"); if(err < 0) return err; err = setup_stream(dev->chandle, m, "capture"); if(err < 0) return err; dev->delay = 0; len = use_short_buffer ? dev->period * dev->buf_periods : 384; DBG("startup write: %d...\n",len); err = snd_pcm_format_set_silence(SND_PCM_FORMAT_S16_LE, outbuf, len); if(err < 0) { ERR("silence error\n"); return err; } err = snd_pcm_writei(dev->phandle,outbuf,len); if(err < 0) { ERR("startup write error\n"); return err; } dev->delay = err; dev->delay += INTERNAL_DELAY; /* <-- fixme: delay detection is needed */ err = snd_pcm_link(dev->chandle, dev->phandle); if(err < 0) { ERR("snd_pcm_link error: %s\n", snd_strerror(err)); return err; } err = snd_pcm_start(dev->chandle); if(err < 0) { ERR("snd_pcm_start error: %s\n", snd_strerror(err)); return err; } dev->started = 1; return 0; } static int alsa_stop (struct modem *m) { struct device_struct *dev = m->dev_data; DBG("alsa_stop...\n"); dev->started = 0; snd_pcm_drop(dev->chandle); snd_pcm_nonblock(dev->phandle, 0); snd_pcm_drain(dev->phandle); snd_pcm_nonblock(dev->phandle, 1); snd_pcm_unlink(dev->chandle); snd_pcm_hw_free(dev->phandle); snd_pcm_hw_free(dev->chandle); return 0; } static int alsa_ioctl(struct modem *m, unsigned int cmd, unsigned long arg) { /* TODO */ struct device_struct *dev = m->dev_data; DBG("alsa_ioctl: cmd %x, arg %lx...\n",cmd,arg); switch(cmd) { case MDMCTL_CAPABILITIES: return -EINVAL; case MDMCTL_HOOKSTATE: return (dev->hook_off_elem) ? snd_mixer_selem_set_playback_switch_all( dev->hook_off_elem, (arg == MODEM_HOOK_OFF) ) : 0 ; case MDMCTL_SPEAKERVOL: return (dev->speaker_elem) ? snd_mixer_selem_set_playback_volume_all( dev->speaker_elem, arg) : 0 ; case MDMCTL_CODECTYPE: return CODEC_SILABS; case MDMCTL_IODELAY: DBG("delay = %d\n", dev->delay); return dev->delay; default: return 0; } return -EINVAL; } struct modem_driver alsa_modem_driver = { .name = "alsa modem driver", .start = alsa_start, .stop = alsa_stop, .ioctl = alsa_ioctl, }; #endif /* * 'driver' stuff * */ static int modemap_start (struct modem *m) { struct device_struct *dev = m->dev_data; int ret; DBG("modemap_start...\n"); dev->delay = 0; ret = ioctl(dev->fd,100000+MDMCTL_START,0); if (ret < 0) return ret; ret = 192*2; memset(outbuf, 0 , ret); ret = write(dev->fd, outbuf, ret); if (ret < 0) { ioctl(dev->fd,100000+MDMCTL_STOP,0); return ret; } dev->delay = ret/2; return 0; } static int modemap_stop (struct modem *m) { struct device_struct *dev = m->dev_data; DBG("modemap_stop...\n"); return ioctl(dev->fd,100000+MDMCTL_STOP,0); } static int modemap_ioctl(struct modem *m, unsigned int cmd, unsigned long arg) { struct device_struct *dev = m->dev_data; int ret; DBG("modemap_ioctl: cmd %x, arg %lx...\n",cmd,arg); if (cmd == MDMCTL_SETFRAG) arg <<= MFMT_SHIFT(m->format); ret = ioctl(dev->fd,cmd+100000,&arg); if (cmd == MDMCTL_IODELAY && ret > 0) { ret >>= MFMT_SHIFT(m->format); ret += dev->delay; } return ret; } struct modem_driver mdm_modem_driver = { .name = "modemap driver", .start = modemap_start, .stop = modemap_stop, .ioctl = modemap_ioctl, }; static int mdm_device_read(struct device_struct *dev, char *buf, int size) { int ret = read(dev->fd, buf, size*2); if (ret > 0) ret /= 2; return ret; } static int mdm_device_write(struct device_struct *dev, const char *buf, int size) { int ret = write(dev->fd, buf, size*2); if (ret > 0) ret /= 2; return ret; } static int mdm_device_setup(struct device_struct *dev, const char *dev_name) { struct stat stbuf; int ret, fd; memset(dev,0,sizeof(*dev)); ret = stat(dev_name,&stbuf); if(ret) { ERR("mdm setup: cannot stat `%s': %s\n", dev_name, strerror(errno)); return -1; } if(!S_ISCHR(stbuf.st_mode)) { ERR("mdm setup: not char device `%s'\n", dev_name); return -1; } /* device stuff */ fd = open(dev_name,O_RDWR); if(fd < 0) { ERR("mdm setup: cannot open dev `%s': %s\n",dev_name,strerror(errno)); return -1; } dev->fd = fd; dev->num = minor(stbuf.st_rdev); return 0; } static int mdm_device_release(struct device_struct *dev) { close(dev->fd); return 0; } /* * PTY creation (or re-creation) * */ static char link_name[PATH_MAX]; int create_pty(struct modem *m) { struct termios termios; const char *pty_name; int pty, ret; if(m->pty) close(m->pty); pty = getpt(); if (pty < 0 || grantpt(pty) < 0 || unlockpt(pty) < 0) { ERR("getpt: %s\n", strerror(errno)); return -1; } if(m->pty) { termios = m->termios; } else { ret = tcgetattr(pty, &termios); /* non canonical raw tty */ cfmakeraw(&termios); cfsetispeed(&termios, B115200); cfsetospeed(&termios, B115200); } ret = tcsetattr(pty, TCSANOW, &termios); if (ret) { ERR("tcsetattr: %s\n",strerror(errno)); return -1; } fcntl(pty,F_SETFL,O_NONBLOCK); pty_name = ptsname(pty); m->pty = pty; m->pty_name = pty_name; modem_update_termios(m,&termios); if(modem_group && *modem_group) { struct group *grp = getgrnam(modem_group); if(!grp) { ERR("cannot find group '%s': %s\n", modem_group, strerror(errno)); } else { ret = chown(pty_name, -1, grp->gr_gid); if(ret < 0) { ERR("cannot chown '%s' to ':%s': %s\n", pty_name, modem_group, strerror(errno)); } } } ret = chmod(pty_name, modem_perm); if (ret < 0) { ERR("cannot chmod '%s' to %o: %s\n", pty_name, modem_perm, strerror(errno)); } if(*link_name) { unlink(link_name); if(symlink(pty_name,link_name)) { ERR("cannot create symbolink link `%s' -> `%s': %s\n", link_name,pty_name,strerror(errno)); *link_name = '\0'; } else { INFO("symbolic link `%s' -> `%s' created.\n", link_name, pty_name); } } return 0; } /* * main run cycle * */ static int (*device_setup)(struct device_struct *dev, const char *dev_name); static int (*device_release)(struct device_struct *dev); static int (*device_read)(struct device_struct *dev, char *buf, int size); static int (*device_write)(struct device_struct *dev, const char *buf, int size); static struct modem_driver *modem_driver; static volatile sig_atomic_t keep_running = 1; void mark_termination(int signum) { DBG("signal %d: mark termination.\n",signum); keep_running = 0; } static int modem_run(struct modem *m, struct device_struct *dev) { struct timeval tmo; fd_set rset,eset; struct termios termios; unsigned pty_closed = 0, close_count = 0; int max_fd; int ret, count; void *in; while(keep_running) { if(m->event) modem_event(m); #ifdef MODEM_CONFIG_RING_DETECTOR if(ring_detector && !m->started) modem_ring_detector_start(m); #endif tmo.tv_sec = 1; tmo.tv_usec= 0; FD_ZERO(&rset); FD_ZERO(&eset); if(m->started) FD_SET(dev->fd,&rset); FD_SET(dev->fd,&eset); max_fd = dev->fd; if(pty_closed && close_count > 0) { if(!m->started || ++close_count > CLOSE_COUNT_MAX ) close_count = 0; } else if(m->xmit.size - m->xmit.count > 0) { FD_SET(m->pty,&rset); if(m->pty > max_fd) max_fd = m->pty; } ret = select(max_fd + 1,&rset,NULL,&eset,&tmo); if (ret < 0) { if (errno == EINTR) continue; ERR("select: %s\n",strerror(errno)); return ret; } if ( ret == 0 ) continue; if(FD_ISSET(dev->fd, &eset)) { unsigned stat; //DBG("dev exception...\n"); #ifdef SUPPORT_ALSA if(use_alsa) { DBG("dev exception...\n"); continue; } #endif ret = ioctl(dev->fd,100000+MDMCTL_GETSTAT,&stat); if(ret < 0) { ERR("dev ioctl: %s\n",strerror(errno)); return -1; } if(stat&MDMSTAT_ERROR) modem_error(m); if(stat&MDMSTAT_RING) modem_ring(m); continue; } if(FD_ISSET(dev->fd, &rset)) { count = device_read(dev,inbuf,sizeof(inbuf)/2); if(count < 0) { ERR("dev read: %s\n",strerror(errno)); return -1; } else if (count == 0) { DBG("dev read = 0\n"); continue; } in = inbuf; if(m->update_delay < 0) { if ( -m->update_delay >= count) { DBG("change delay -%d...\n", count); dev->delay -= count; m->update_delay += count; continue; } DBG("change delay %d...\n", m->update_delay); in -= m->update_delay; count += m->update_delay; dev->delay += m->update_delay; m->update_delay = 0; } modem_process(m,inbuf,outbuf,count); count = device_write(dev,outbuf,count); if(count < 0) { ERR("dev write: %s\n",strerror(errno)); return -1; } else if (count == 0) { DBG("dev write = 0\n"); } if(m->update_delay > 0) { DBG("change delay +%d...\n", m->update_delay); memset(outbuf, 0, m->update_delay*2); count = device_write(dev,outbuf,m->update_delay); if(count < 0) { ERR("dev write: %s\n",strerror(errno)); return -1; } if(count != m->update_delay) { ERR("cannot update delay: %d instead of %d.\n", count, m->update_delay); return -1; } dev->delay += m->update_delay; m->update_delay = 0; } } if(FD_ISSET(m->pty,&rset)) { /* check termios */ tcgetattr(m->pty,&termios); if(memcmp(&termios,&m->termios,sizeof(termios))) { DBG("termios changed.\n"); modem_update_termios(m,&termios); } /* read data */ count = m->xmit.size - m->xmit.count; if(count == 0) continue; if(count > sizeof(inbuf)) count = sizeof(inbuf); count = read(m->pty,inbuf,count); if(count < 0) { if(errno == EAGAIN) { DBG("pty read, errno = EAGAIN\n"); continue; } if(errno == EIO) { /* closed */ if(!pty_closed) { DBG("pty closed.\n"); if(termios.c_cflag&HUPCL) { modem_hangup(m); /* re-create PTM - simulate hangup */ ret = create_pty(m); if (ret < 0) { ERR("cannot re-create PTY.\n"); return -1; } } else pty_closed = 1; } // DBG("pty read, errno = EIO\n"); close_count = 1; continue; } else ERR("pty read: %s\n",strerror(errno)); return -1; } else if (count == 0) { DBG("pty read = 0\n"); } pty_closed = 0; count = modem_write(m,inbuf,count); if(count < 0) { ERR("modem_write failed.\n"); return -1; } } } return 0; } int modem_main(const char *dev_name) { char path_name[PATH_MAX]; struct device_struct device; struct modem *m; int pty; int ret = 0; modem_debug_init(basename(dev_name)); ret = device_setup(&device, dev_name); if (ret) { ERR("cannot setup device `%s'\n", dev_name); exit(-1); } dp_dummy_init(); dp_sinus_init(); prop_dp_init(); modem_timer_init(); sprintf(link_name,"/dev/ttySL%d", device.num); m = modem_create(modem_driver,basename(dev_name)); m->name = basename(dev_name); m->dev_data = &device; m->dev_name = dev_name; ret = create_pty(m); if(ret < 0) { ERR("cannot create PTY.\n"); exit(-1); } INFO("modem `%s' created. TTY is `%s'\n", m->name, m->pty_name); sprintf(path_name,"/var/lib/slmodem/data.%s",basename(dev_name)); datafile_load_info(path_name,&m->dsp_info); if (need_realtime) { struct sched_param prm; if(mlockall(MCL_CURRENT|MCL_FUTURE)) { ERR("mlockall: %s\n",strerror(errno)); } prm.sched_priority = sched_get_priority_max(SCHED_FIFO); if(sched_setscheduler(0,SCHED_FIFO,&prm)) { ERR("sched_setscheduler: %s\n",strerror(errno)); } DBG("rt applyed: SCHED_FIFO, pri %d\n",prm.sched_priority); } signal(SIGINT, mark_termination); signal(SIGTERM, mark_termination); INFO("Use `%s' as modem device, Ctrl+C for termination.\n", *link_name ? link_name : m->pty_name); /* main loop here */ ret = modem_run(m,&device); datafile_save_info(path_name,&m->dsp_info); pty = m->pty; modem_delete(m); usleep(100000); close(pty); if(*link_name) unlink(link_name); dp_dummy_exit(); dp_sinus_exit(); prop_dp_exit(); device_release(&device); modem_debug_exit(); exit(ret); return 0; } int main(int argc, char *argv[]) { extern void modem_cmdline(int argc, char *argv[]); int ret; modem_cmdline(argc,argv); if(!modem_dev_name) modem_dev_name = "/dev/slamr0"; device_setup = mdm_device_setup; device_release = mdm_device_release; device_read = mdm_device_read; device_write = mdm_device_write; modem_driver = &mdm_modem_driver; #ifdef SUPPORT_ALSA if(use_alsa) { device_setup = alsa_device_setup; device_release = alsa_device_release; device_read = alsa_device_read; device_write = alsa_device_write; modem_driver = &alsa_modem_driver; } #endif ret = modem_main(modem_dev_name); return ret; } slmodem-2.9.11-20110321/modem/modem_pack.c0000644000175000000620000004031310773430100016320 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_pack.c -- modem packer module. * * Author: Sasha K (sashak@smlink.com) * * */ #include #include #define PACK_DBG(fmt,arg...) dprintf("%s: " fmt , m->name , ##arg) #define PACK_ERR(fmt,arg...) eprintf("%s: " fmt , m->name , ##arg) /* HDLC definitions */ #define HDLC_FLAG 0x7e #define HDLC_ESCAPE (0x1f<<3) /* bit ordering (reverse) table */ static const u8 _ordered[] = { 0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe, 0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf}; #define REVERSE_BITS(c) { (c) = _ordered[(c)&0xf]<<4 | _ordered[(c)>>4] ; } /* * Async packer * */ #define START_BIT 0 #define STOP_BIT 1 #if 0 #define STOP_BITS(p) ((p)->stop_bits) #define DATA_SIZE(p) ((p)->data_bits) #define CHAR_SIZE(p) ((p)->char_size) #define CHAR_DATA(p,ch) ( ( ~(0x1<<(CHAR_SIZE(p)-1)) & \ ((ch)<<(p)->stop_bits) ) | \ ((0x1<<(p)->stop_bits)-1) ) #else #define STOP_BITS(p) 1 #define DATA_SIZE(p) 8 #define CHAR_SIZE(p) 10 #define CHAR_DATA(p,ch) (((ch)<<1)|0x1) #endif int modem_async_get_bits(struct modem *m, int nbits, u8 *bit_buf, int bit_cnt) { struct bits_state *s = &m->pack; int ret = 0; u8 ch; do { /* fill bits */ while ( bit_cnt > 0 && s->bit >= nbits) { *bit_buf++ = (s->data>>(s->bit-nbits)); s->bit -= nbits; ret ++; bit_cnt--; } if (bit_cnt <= 0) break; /* get char */ if (!m->get_chars || m->get_chars(m, (char*)&ch, 1) != 1) break; REVERSE_BITS(ch); s->data <<= CHAR_SIZE(m); s->data |= CHAR_DATA(m,ch); s->bit += CHAR_SIZE(m); } while (1); if (s->bit && bit_cnt > 0) { /* left data + stops */ *bit_buf++ = (s->data<<(nbits-s->bit))|((0x1<<(nbits-s->bit))-1); ret ++; bit_cnt--; s->bit = 0; } #if 0 memcpy(bit_buf,(1< 0) { /* fill stops */ *bit_buf++ = (1<unpack; int ret = 0; u8 ch; while(bit_cnt > 0) { s->data<<= nbits; s->data |= *bit_buf++ & ((0x1<bit += nbits; bit_cnt --; ret++; while(s->bit && s->data&(0x1<<(s->bit-1))) /* stop bit */ s->bit--; while (s->bit >= CHAR_SIZE(m)) { ch = s->data >> (s->bit-(CHAR_SIZE(m)-STOP_BITS(m))); s->bit-= CHAR_SIZE(m); REVERSE_BITS(ch); if (m->put_chars) m->put_chars(m,(const char*)&ch,1); } } return ret; } void modem_async_start(struct modem *m) { m->pack.bit = m->unpack.bit = 0; m->pack.data = m->unpack.data = 0; m->bit_timer_func = NULL; m->bit_timer = 0; } /* * Packer detector * */ /* * Detection phase description. * originator - transmits ODPs until T400 timer is expired * or until ADP is received. * * answer - transmits marks(1) until: detect phase termination, * ODP receipt - send at least 10 ADPs, * detection of start protocol phase (continuous flags). * * */ /* ODP: 0100010001 11111111 0100010011 11111111 */ #define ODP0 0x88 #define ODP1 0x89 /* ADP v42: 0101000101 11111111 0110000101 11111111 */ /* ADP v14: 0101000101 11111111 0000000001 11111111 */ #define ADP0 0xa2 #define ADP1_V14 0x00 #define ADP1_V42 0xc2 #define ADP1 ADP1_V42 #define MIN_RX_PATTERNS 2 #define MAX_TX_PATTERNS 16 #define PATTERN_SIZE 36 #define FILL_PATTERN_ODP(pat) { (pat)[0]=ODP0 ; (pat)[1]=ODP1; } #define FILL_PATTERN_ADP(pat) { (pat)[0]=ADP0 ; (pat)[1]=ADP1; } static void detector_start(struct modem *m) { PACK_DBG("detector start...\n"); m->packer.detector.tx_count = 1; } static void detector_finish(struct modem *m) { PACK_DBG("detector finished.\n"); // fixme: modem update config m->cfg.ec = m->packer.detector.ec_enable; modem_update_status(m,STATUS_PACK_LINK); } int modem_detector_get_bits(struct modem *m, int nbits, u8 *bit_buf, int bit_cnt) { struct bits_state *s = &m->pack; struct detect_state *d = &m->packer.detector; int ret = 0; do { /* fill bits */ while ( bit_cnt > 0 && s->bit >= nbits) { *bit_buf++ = (s->data>>(s->bit-nbits)); s->bit -= nbits; ret ++; bit_cnt--; } if (bit_cnt <= 0) break; #if 0 s->data <<= 18; s->data |= (0x1ff<<9)|(d->tx_pattern[d->tx_count++%2]); s->bit += 18; #else /* get char */ s->data <<= 9; s->data |= 0x1ff; s->bit += 9; if (d->tx_count > 0) { s->data <<= 9; s->data |= d->tx_pattern[d->tx_count++%2]; s->bit += 9; } #endif } while (1); return ret; } int modem_detector_put_bits(struct modem *m, int nbits, u8 *bit_buf, int bit_cnt) { struct bits_state *s = &m->unpack; struct detect_state *d = &m->packer.detector; int ret = 0; u8 ch; while(bit_cnt > 0) { s->data<<= nbits; s->data |= *bit_buf++ & ((0x1<bit += nbits; bit_cnt --; ret++; while(s->bit && s->data&(0x1<<(s->bit-1))) /* skip marks */ s->bit--; while (s->bit >= 10 ) { ch = s->data >> (s->bit-9); s->bit-= 10; PACK_DBG("rx pattern: 0x%02x.\n",ch); if (ch == HDLC_FLAG) { PACK_DBG("hdlc flag detected.\n"); d->ec_enable = 1; m->bit_timer_func = detector_finish; m->bit_timer = PATTERN_SIZE; continue; } if (!d->rx_count) { d->rx_count = (ch == d->rx_pattern[0]); continue; } if (d->rx_count >= 2) continue; switch(ch) { case ODP1: //PACK_DBG("rx ODP.\n"); if (!m->caller) { /* start replay ADP and leave detector */ d->tx_count = 1; d->rx_count = 2; d->ec_enable = 1; m->bit_timer_func = detector_finish; m->bit_timer = MAX_TX_PATTERNS*PATTERN_SIZE; } else d->rx_count = 0; break; case ADP1_V14: //PACK_DBG("rx ADP non v42.\n"); d->rx_count = 2; d->ec_enable = 0; m->bit_timer_func = detector_finish; m->bit_timer = PATTERN_SIZE; break; case ADP1_V42: //PACK_DBG("rx ADP v42.\n"); m->cfg.ec = 1; d->rx_count = 2; d->ec_enable = 1; m->bit_timer_func = detector_finish; m->bit_timer = PATTERN_SIZE; break; default: d->rx_count = 0; break; } } } return ret; } void modem_detector_start(struct modem *m) { struct detect_state *d = &m->packer.detector; int rate = 28800 ; // fixme: use real bit rate from modem d->tx_count = 0; /* mute transmitter */ d->rx_count = 0; d->ec_enable = 0; if (m->caller) { FILL_PATTERN_ODP(d->tx_pattern); FILL_PATTERN_ADP(d->rx_pattern); m->bit_timer_func = detector_start; m->bit_timer = 64*8 ; } else { FILL_PATTERN_ADP(d->tx_pattern); FILL_PATTERN_ODP(d->rx_pattern); m->bit_timer_func = detector_finish; m->bit_timer = rate*3/4; /* T400 timeout */ } m->pack.bit = m->unpack.bit = 0; m->pack.data = m->unpack.data = 0; } /* * HDLC packer * */ /* static data */ /* fcs16 table */ static const u16 fcs16_tab[256] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; #define fcstab fcs16_tab #define INIT_FCS16 0xffff /* Initial FCS16 value */ #define GOOD_FCS16 0xf0b8 /* Good final FCS16 value */ #define GET_FCS(fcs,c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff]) #define INIT_FCS INIT_FCS16 /* Initial FCS value */ #define GOOD_FCS GOOD_FCS16 /* Good final FCS value */ /* hdlc bit generators */ #define HDLC_PUT_BYTE { \ for( i = 0 ; i < 8 ; i++ ) { \ s->data<<=1; \ s->bit++; \ if(in&0x1) { \ h->tx_ones++; \ s->data |= 0x1; \ if (h->tx_ones==5) { \ s->data<<=1; \ s->bit++; \ h->tx_ones = 0; \ } \ } \ else { \ h->tx_ones = 0; \ } \ in>>=1; \ } } int modem_hdlc_get_bits(struct modem *m, int nbits, u8 *bit_buf, int bit_cnt) { struct hdlc_state *h = &m->packer.hdlc; register struct bits_state *s = &m->pack; register int i, ret = 0; register u8 in, mask = ((1< 0 && s->bit >= nbits) { *bit_buf++ = (s->data>>(s->bit-nbits))&mask; s->bit -= nbits; ret ++; bit_cnt--; } if (bit_cnt <= 0) break; if (!h->tx_frame) { s->data <<= 8; s->data |= HDLC_FLAG; s->bit += 8; if (h->get_tx_frame && (h->tx_frame = h->get_tx_frame(h->framer))) { h->tx_frame->fcs = INIT_FCS; h->tx_frame->count = 0; } } else if(h->tx_frame->count == h->tx_frame->size) { /* end frame */ /* put fcs */ h->tx_frame->fcs ^= 0xffff; in = h->tx_frame->fcs&0xff; HDLC_PUT_BYTE; in = (h->tx_frame->fcs>>8)&0xff; HDLC_PUT_BYTE; h->tx_ones = 0; /* frame complete callback */ if (h->tx_complete) h->tx_complete(h->framer, h->tx_frame); /* reset tx frame */ h->tx_frame = NULL; /* put flags will done automatically */ } else { in = h->tx_frame->buf[h->tx_frame->count]; h->tx_frame->count++; /* fixme: in order to speed up fcs calc: copy it to local var */ h->tx_frame->fcs = GET_FCS(h->tx_frame->fcs,in); HDLC_PUT_BYTE; } } while (1); return ret; } int modem_hdlc_put_bits(struct modem *m, int nbits, u8 *bit_buf, int bit_cnt) { struct hdlc_state *h = &m->packer.hdlc; register struct bits_state *s = &m->unpack; register int ret = 0; register int i; register u8 in, out, mask = ((0x1< 0) { s->data <<= nbits; s->data |= *bit_buf++ & mask; s->bit += nbits; bit_cnt--; ret++; /* 8 char, 2 possible escapes, +8 estimated flag */ if ( s->bit < 8 + 8 + 2) continue; out = 0; // fixme: probably may be optimized by handling whole // byte with masking /* mask = 0x80; */ for ( i=0 ; i<8 ; i++ ) { in = s->data >> (s->bit-8) ; /* flag: finish frame */ if (in == HDLC_FLAG) { /* end of frame */; if ( !h->rx_frame->count ) { //HDLC_DBG("empty.\n"); } /* check frame for errors */ else if (h->rx_error) { PACK_DBG("hdlc frame error.\n"); } else if (i) { PACK_DBG("hdlc frame integrity error.\n"); } #if 1 else if ( h->rx_frame->count < 3 ) { #else else if ( h->rx_frame->count < 4 ) { #endif PACK_DBG("hdlc frame size error.\n"); } else if ( h->rx_frame->fcs != GOOD_FCS ) { PACK_DBG("hdlc frame fcs error.\n"); } /* good frame */ else if ( h->rx_complete ) { /* reduce fcs size */ h->rx_frame->count -= 2; h->rx_complete(h->framer,h->rx_frame); } s->bit -= 8; h->rx_ones = 0; h->rx_error = 0; h->rx_frame->fcs = INIT_FCS; h->rx_frame->count = 0; break; } else if(h->rx_error) { s->bit--; continue; } /* put reversed data bit */ out >>= 1; if (in&0x80) { out |= 0x80; h->rx_ones++; /* escape or idle reached */ if (h->rx_ones == 5) { if (in&0x40) { h->rx_error++; h->rx_frame->count = 0; } s->bit--; h->rx_ones = 0; } } else h->rx_ones = 0; s->bit--; } /* finish char */ if(i==8 && !h->rx_error) { if (h->rx_frame->count < h->rx_frame->size) { h->rx_frame->buf[h->rx_frame->count] = out; h->rx_frame->count++; h->rx_frame->fcs = GET_FCS(h->rx_frame->fcs,out); } else { /* overflow */ PACK_DBG("hdlc rx frame overflow.\n"); h->rx_error++; h->rx_frame->count = 0; } } } return ret; } void modem_hdlc_start(struct modem *m) { struct hdlc_state *h = &m->packer.hdlc; PACK_DBG("hdlc_start...\n"); memset(h,0,sizeof(*h)); /* wait for flag to clear rx error state */ h->rx_error = 1; /* rx frame */ h->rx_frame = &h->_rx_frame; h->rx_frame->buf = h->_rx_buf; h->rx_frame->count= 0; h->rx_frame->size = sizeof(h->_rx_buf); h->rx_frame->fcs = INIT_FCS; /* tx frame */ h->tx_frame = 0; m->pack.bit = m->unpack.bit = 0; m->pack.data = m->unpack.data = 0; m->bit_timer_func = NULL; m->bit_timer = 0; } #if 0 // temp stupid things static struct hdlc_frame *tmp_get_frame(void *framer) { frame_t *f; struct modem *m = framer; if(m->get_chars) { f = &m->packer.hdlc._tx_frame; f->buf = m->packer.hdlc._tx_buf; f->size = m->get_chars(m,f->buf,sizeof(m->packer.hdlc._tx_buf)); if(f->size <= 0) { return NULL; } PACK_DBG("get frame: %d...\n",f->size); return f; } return NULL; } static void tmp_put_frame(void *framer, frame_t *fr) { struct modem *m = framer; if(fr->count > 0 && m->put_chars) { PACK_DBG("put frame: %d...\n",fr->count); m->put_chars(m,fr->buf,fr->count); } return; } void tmp_init(struct modem *m) { m->packer.hdlc.get_tx_frame = tmp_get_frame; m->packer.hdlc.rx_complete = tmp_put_frame; m->packer.hdlc.framer = m; } #endif slmodem-2.9.11-20110321/modem/modem_datafile.c0000644000175000000620000000655611150256650017174 0ustar marvstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_datafile.c -- modem data file stuff. * * Author: Sasha K (sashak@smlink.com) * */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #define DBG(fmt,args...) dprintf( fmt , ##args ); struct datafile_record { unsigned minor; struct dsp_info dsp_info; unsigned size; }; int datafile_load_info(char *file_name,struct dsp_info *info) { struct datafile_record *dr; int ret = -1; int fd; DBG("open file: %s...\n",file_name); fd = open(file_name, 0, 0); if(fd < 0) { DBG("cannot open '%s': %s\n", file_name,strerror(errno)); return -errno; } dr = (struct datafile_record *)malloc(sizeof(*dr)); if (!dr) { close(fd); return -errno; } ret = read(fd,(char *)dr,sizeof(*dr)); if (ret < 0) { free(dr); close(fd); return -errno; } /* simple validation */ if(dr->size != sizeof(*dr)) { free(dr); close(fd); return -1; } memcpy(info,&dr->dsp_info,sizeof(*info)); free(dr); close(fd); return ret; } int datafile_save_info(char *file_name,struct dsp_info *info) { struct datafile_record *dr; int ret = -1; int fd; fd = open(file_name,O_CREAT|O_WRONLY,(S_IRUSR|S_IWUSR)); if(fd < 0) return -errno; dr = (struct datafile_record *)malloc(sizeof(*dr)); if (!dr) { return -errno; close(fd); } memcpy(&dr->dsp_info,info,sizeof(*info)); dr->size = sizeof(*dr); ret = write(fd,(char *)dr,sizeof(*dr)); free(dr); close(fd); return ret; } slmodem-2.9.11-20110321/modem/sysdep_common.c0000644000175000000620000000573710773430100017113 0ustar marvstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * sysdep_common.c -- sysdep API. * * Author: Sasha K (sashak@smlink.com) * * */ /*****************************************************************************/ #include #include #include #include /* memory allocations */ void *sysdep_malloc (unsigned int size) { return malloc(size); } void sysdep_free (void *mem) { free(mem); } /* strings */ size_t sysdep_strlen(const char *s) { return strlen(s); } char *sysdep_strcpy(char *d,const char *s) { return strcpy(d,s); } char *sysdep_strcat(char *d, const char *s) { return strcat(d,s); } int sysdep_strcmp(const char *s1,const char *s2) { return strcmp(s1, s2); } char *sysdep_strstr(const char *s1,const char *s2) { return strstr(s1,s2); } void *sysdep_memset(void *d,int c,size_t l) { return memset(d,c,l); } void *sysdep_memcpy(void *d,const void *s,size_t l) { return memcpy(d,s,l); } void *sysdep_memchr(const void *s,int c,size_t l) { return memchr (s,c,l); } int sysdep_vsnprintf(char *str, unsigned size, const char *format, va_list ap) { return vsnprintf(str, size, format, ap); } int sysdep_sprintf(char *buf, const char *fmt, ...) { va_list args; int i; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); return i; } slmodem-2.9.11-20110321/modem/dp_dummy.c0000644000175000000620000000727210773430100016046 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * dp_dummy.c -- dummy data pump (very stupid simulator). * * Author: Sasha K (sashak@smlink.com) * * */ #include #include #define DUMMY_SKIP 100 #define DUMMY_TIMEOUT 300 #define DUMMY_A1 0xff struct dummy_dp { struct dp dp; unsigned long count; unsigned long linked; u8 buf[1024]; void *dcr; }; static struct dp *dummy_create(struct modem *m, enum DP_ID id, int caller, int srate, int max_frag, struct dp_operations *op) { struct dummy_dp *d; dprintf("dummy_create...\n"); d = malloc(sizeof(*d)); memset(d,0,sizeof(*d)); d->dp.id = id; d->dp.modem = m; d->dp.op = op; d->dp.dp_data = d; d->dcr = m->dcr; m->dcr = NULL; return (struct dp *)d; } static int dummy_delete(struct dp *dp) { struct dummy_dp *d = (struct dummy_dp *)dp; dprintf("dummy_delete...\n"); dp->modem->dcr = d->dcr; free(d); return 0; } static int dummy_process(struct dp *dp, void *in, void *out, int cnt) { struct dummy_dp *d = (struct dummy_dp *)dp; int n = cnt << MFMT_SHIFT(dp->modem->format); s16 *s; int i; d->count++; if (!d->linked) { if (d->count < DUMMY_SKIP) { memset(out,0,n); return DPSTAT_OK; } else if(d->count > DUMMY_TIMEOUT) return DPSTAT_ERROR; s = out; for(i = 0 ; i < cnt ; i++) { *s = (1-2*(i&1))*('A'); s++; } s = in; for(i = 0 ; i < cnt ; i++) { if(abs(*s) == 'A') { d->linked = 1; return DPSTAT_CONNECT; } s++; } } else { s = in; for(i = 0 ; i < cnt ; i++) { d->buf[i] = *s&0x1; s++; } modem_put_bits(dp->modem,1,d->buf,cnt); s = out; modem_get_bits(dp->modem,1,d->buf,cnt); for(i = 0 ; i < cnt ; i++) { *s = d->buf[i]&1 ; s++; } } return DPSTAT_OK; } static struct dp_operations dummy_operations = { name : "Dummy DataPump driver", create: dummy_create, delete: dummy_delete, process:dummy_process }; int dp_dummy_init(void) { return modem_dp_register(DP_DUMMY,&dummy_operations); } void dp_dummy_exit(void) { modem_dp_deregister(DP_DUMMY,&dummy_operations); } slmodem-2.9.11-20110321/modem/Makefile0000644000175000000620000000417411002010051015503 0ustar marvstaff########################################################################### # # # Makefile -- modem application Makefile. # # Copyright(c) 2003, Smart Link Ltd. (www.smlink.com) # All rights reserved. # # Author: Sasha K (sashak@smlink.com) # # ########################################################################### # ########################################################################### ARCH64:=$(shell uname -m | sed -e '/amd64/s//x86_64/' | grep -c x86_64) ifeq ($(ARCH64), 0) CC:= gcc else # SUPPORT_ALSA:=1 CC:= gcc -m32 endif RM:= rm -f CFLAGS+= -Wall -g -O -I. -DCONFIG_DEBUG_MODEM modem-objs:= \ modem.o modem_datafile.o modem_at.o modem_timer.o \ modem_pack.o modem_ec.o modem_comp.o \ modem_param.o modem_debug.o homolog_data.o dp-objs:= dp_sinus.o dp_dummy.o sysdep-objs:= sysdep_common.o all-objs:= modem_cmdline.o $(modem-objs) $(dp-objs) dsplibs.o $(sysdep-objs) all: slmodemd modem_test slmodemd: modem_main.o $(all-objs) modem_test: modem_test.o $(all-objs) ifdef SUPPORT_ALSA CFLAGS+= -DSUPPORT_ALSA=1 ifeq ($(ARCH64), 0) LFLAGS+= /usr/lib/libasound.so else # LFLAGS+= /usr/lib32/libasound.so , replaced by -l commands search for asound LFLAGS+= -lasound endif endif slmodemd: $(CC) -o slmodemd modem_main.o $(all-objs) $(LFLAGS) modem_test: $(CC) -o modem_test modem_test.o $(all-objs) $(LFLAGS) clean: $(RM) slmodemd modem_test modem_main.o modem_cmdline.o modem_test.o $(modem-objs) $(dp-objs) $(sysdep-objs) $(RM) *~ *.orig *.rej .PHONY: all dep generic-dep clean clean-build-profile # # rules # %.o: %.c .build_profile $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -o $@ -c $< dep: generic-dep generic-dep: $(RM) .depend $(foreach src,$(wildcard *.c),$(CC) -M $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(src:.c=.o)) -c $(src) >> .depend ;) -include .depend # build_profile -include .build_profile .build_profile:: ifneq ($(CFLAGS),$(PROFILE_CFLAGS)) @if [ "$(CFLAGS) $(EXTRA_CFLAGS)" != "$(PROFILE_CFLAGS)" ] ; then \ echo "rebuild profile..." ; \ echo "PROFILE_CFLAGS=$(CFLAGS) $(EXTRA_CFLAGS)" > $(@) ; fi endif clean: clean-build-profile clean-build-profile: @$(RM) -f .build_profile slmodem-2.9.11-20110321/modem/modem_timer.c0000644000175000000620000001130210773430100016516 0ustar marvstaff /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_timer.c -- simple timer (will not in multithreaded env). * * Author: Sasha K (sashak@smlink.com) * * */ #include #include #include #include #include #if 0 #include #define WARN(fmt...) fprintf(stderr, fmt); #else #define WARN(fmt...) #endif #define MAX_TIME LONG_MAX static struct timeval tv_init; static struct timer_list_struct { struct timer *list; unsigned long when; struct sigaction old_act; } timer_list; unsigned long get_time() { struct timeval tv_now,tv; gettimeofday(&tv_now,NULL); timersub(&tv_now,&tv_init,&tv); return tv.tv_sec*MODEM_HZ + tv.tv_usec/(1000000/MODEM_HZ); } static void set_timer(unsigned long when) { struct itimerval it; long t; t = (long)(when - get_time()); if( t <= 0) t = 1; it.it_interval.tv_usec = 0; it.it_interval.tv_sec = 0; it.it_value.tv_usec = (t%MODEM_HZ)*(1000000/MODEM_HZ); it.it_value.tv_sec = t/MODEM_HZ; setitimer(ITIMER_REAL,&it,NULL); } static void timer_list_handler(int num) { unsigned long now; struct timer *t,*next; now = get_time(); t = timer_list.list; timer_list.list = NULL; while(t) { next = t->next; t->next = NULL; if( (long)(t->expires - now) <= 0 ) { t->added = 0; if(t->func) { t->func(t->data); } } else { t->next = timer_list.list; timer_list.list = t; } t = next; } timer_list.when = now + MAX_TIME; t = timer_list.list; while(t) { if((long)(timer_list.when - t->expires) > 0) timer_list.when = t->expires; t = t->next; } set_timer(timer_list.when); } void timer_init(struct timer *t) { t->next = 0; t->added = 0; t->expires = 0; t->func = NULL; t->data = NULL; } int timer_add(struct timer *t) { sigset_t set, old_set; sigemptyset(&set); sigaddset(&set,SIGALRM); sigprocmask(SIG_BLOCK,&set,&old_set); if(t->added) { WARN("timer_add: already.\n"); } else { t->added = 1; t->next = timer_list.list; timer_list.list = t; } if((long)(timer_list.when - t->expires) > 0) { timer_list.when = t->expires; set_timer(timer_list.when); } sigprocmask(SIG_SETMASK,&old_set,NULL); return 0; } int timer_del(struct timer *t) { sigset_t set, old_set; struct timer *p, **prev; sigemptyset(&set); sigaddset(&set,SIGALRM); sigprocmask(SIG_BLOCK,&set,&old_set); if(t->added) { p = timer_list.list; prev = &timer_list.list; while(p) { if(p == t) { *prev = t->next; t->next = NULL; t->added = 0; break; } prev = &((*prev)->next); p = p->next; } } else { WARN("timer_del: not added\n"); } sigprocmask(SIG_SETMASK,&old_set,NULL); return 0; } int modem_timer_init() { struct sigaction act; gettimeofday(&tv_init,NULL); timer_list.list = NULL; timer_list.when = get_time() + MAX_TIME; act.sa_handler = timer_list_handler; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGALRM); act.sa_flags = SA_SIGINFO; sigaction(SIGALRM,&act,&timer_list.old_act); set_timer(timer_list.when); return 0; } void modem_timer_exit() { sigaction(SIGALRM,&timer_list.old_act,NULL); } slmodem-2.9.11-20110321/modem/modem_at.c0000644000175000000620000006467210773430100016024 0ustar marvstaff /* * * Copyright (c) 2001, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_at.c -- modem at command processor. * * Author: Sasha K (sashak@smlink.com) * Seva (seva@smlink.com) * */ /******************************************************************** * * AT commands status. (p) - partiatly * * 1. Implemented: * * AT : A B C D E H I L M N O P Q S T V X Y Z * AT&: C D E F H P R S F W * AT\: A N * AT%: C E * AT+: MS FCLASS GCI GMI GMM GMR * AT#: CID * ******************************************************************** * * 2. Not implemented yet: * * AT+: DSC DS DS44 DR * FAE FTS FRS FTM FRM FRH FTH * AT&: A K V Z * AT\: B K * AT*: B * AT#: BDR RG TL CLS SPK UD * VBS VBT VIP VIT VLS VRA VRN * VRX VSD VSP VSR VSS VTD VTM * VTS VGT VTX * *****************************************************************************/ #include #include #include #include #include #include #define AT_DBG(fmt...) // dprintf("at: " fmt) /* ------------------------------------------------------------ */ /* prototypes from modem.c */ extern const char modem_author[]; extern const char modem_name[]; extern const char modem_version[]; extern const char modem_date[]; extern struct dp_driver modem_dp_drivers[]; extern int modem_send_to_tty(struct modem *m, const char *buf, int n); extern int modem_answer(struct modem *m); extern int modem_dial(struct modem *m); extern int modem_hook(struct modem *m,unsigned hook_state); extern int modem_online(struct modem *m); extern int modem_reset(struct modem *m); extern void modem_update_speaker(struct modem *m); extern int modem_homolog_init(struct modem *m, int id, const char *name); extern int modem_set_mode(struct modem *m, enum MODEM_MODE mode); /* ------------------------------------------------------------ */ /* * local util functions */ /* simple toupper + strncmp */ static int toupper_strncmp(char *s1, char *s2, int n) { int i; for(i = 0 ; i < n ; i++) if(toupper(s1[i]) != s2[i]) return s1[i] - s2[i]; return 0; } static int set_sreg(struct modem *m, int num, char c, int low, int hi, int *len) { if (!isdigit(c)) { *len = 0; c = '0'; } else *len = 1; if ( c >= low + '0' && c <= hi + '0' ) return modem_set_sreg(m,num,c - '0'); return -1; } /* ------------------------------------------------------------ */ static int process_A(struct modem *m, char *p, int *len) { int ret; AT_DBG("AT A command...\n"); ret = modem_answer(m); if (ret) return -1; return 1; } static int process_B(struct modem *m, char *p, int *len) { AT_DBG("AT B command...\n"); MODEM_DP(m) = DP_V22; MODEM_AUTOMODE(m) = 0; m->min_rate = 1200; m->max_rate = 1200; return 0; } static int process_D(struct modem *m, char *p, int *len) { int ret; AT_DBG("AT D command...\n"); switch (toupper(*p)) { case 'T': modem_set_sreg(m,SREG_TONE_OR_PULSE,1); break; case 'P': #ifdef NO_PULSE_DIAL return -1; #endif modem_set_sreg(m,SREG_TONE_OR_PULSE,0); break; case 'L': if(m->dial_string) { modem_send_to_tty(m,"Dialing ",8); modem_send_to_tty(m,m->dial_string, strlen(m->dial_string)); modem_send_to_tty(m,"...",3); modem_send_to_tty(m,CRLF_CHARS(m),2); } p = 0; break; default: break; } if (p) strncpy(m->dial_string,p,sizeof(m->dial_string)); ret = modem_dial(m); if (ret) return -1; return 1; } static int process_H(struct modem *m, char *p, int *len) { int ret; AT_DBG("AT H command...\n"); switch(*p) { case '1': *len = 1; ret = modem_hook(m, MODEM_HOOK_OFF); break; case '0': *len = 1; p++; default: if (isdigit(*p)) return -1; ret = modem_hook(m, MODEM_HOOK_ON); break; } return ret ? -1 : 0; } static int process_I(struct modem *m, char *p, int *len) { const char *s; int c,i; char *end; AT_DBG("AT I command...\n"); c = strtoul (p,&end,0); *len = end - p; switch(c) { case 1: case 2: modem_send_to_tty(m,modem_name,strlen(modem_name)); modem_send_to_tty(m,", ",2); modem_send_to_tty(m,modem_version,strlen(modem_version)); modem_send_to_tty(m,CRLF_CHARS(m),2); modem_send_to_tty(m,modem_author,strlen(modem_author)); modem_send_to_tty(m,CRLF_CHARS(m),2); break; #if 0 case 2: s = "Modem Manufacturer: unknown (TBD)"; modem_send_to_tty(m,s,strlen(s)); modem_send_to_tty(m,CRLF_CHARS(m),2); s = "Modem Provider: unknown (TBD)"; modem_send_to_tty(m,s,strlen(s)); modem_send_to_tty(m,CRLF_CHARS(m),2); break; #endif case 3: s = m->dev_name ? m->dev_name : "unknown"; modem_send_to_tty(m, s, strlen(s)); modem_send_to_tty(m, CRLF_CHARS(m),2); s = m->driver.name ? m->driver.name : "unknown"; modem_send_to_tty(m, s, strlen(s)); modem_send_to_tty(m, CRLF_CHARS(m),2); break; case 4: for (i=0;i<24;i++) { char str[10]; sprintf(str,"s%.2d=%.3d ",i,m->sregs[i]); modem_send_to_tty(m,str,strlen(str)); if (!((i+1)%8)) modem_send_to_tty(m, CRLF_CHARS(m),2); } modem_send_to_tty(m,CRLF_CHARS(m),2); break; case 5: modem_send_to_tty(m,"Stored Profile 0:",17); modem_send_to_tty(m,CRLF_CHARS(m),2); #if 0 s = load_profile(m,0); if (s!=NULL) ret = print_sregs(m,s); #endif break; case 6: modem_send_to_tty(m, "Stored Profile 1:",17); modem_send_to_tty(m, CRLF_CHARS(m),2); #if 0 s = load_profile(m,1); if (s!=NULL) ret = print_sregs (m,s); #endif break; case 7: s = m->homolog->name; modem_send_to_tty(m,"Country: ",9); modem_send_to_tty(m,s,strlen(s)); modem_send_to_tty(m, CRLF_CHARS(m),2); break; case 0: modem_send_to_tty(m,modem_name,strlen(modem_name)); modem_send_to_tty(m,CRLF_CHARS(m),2); break; default: return -1; } return 0; } static int process_O(struct modem *m, char *p, int *len) { int ret; AT_DBG("AT O command...\n"); ret = modem_online(m); if (ret) return -1; return 1; } static int process_S(struct modem *m, char *p, int *len) { unsigned n = 0; int val; char *end; AT_DBG("AT S command...\n"); n = strtoul(p,&end,0); *len = end - p + 1; p = end; if ( n >= sizeof(m->sregs)/sizeof(m->sregs[0]) ) return -1; switch(*p++) { case '?': val = modem_get_sreg(m,n); if (val < 0) return -1; else { char strval[8]; int l = sprintf(strval,"%d",val); modem_send_to_tty(m, strval,l); modem_send_to_tty(m, CRLF_CHARS(m),2); } return 0; case '=': val = strtoul(p, &end, 0); *len += end - p; return modem_set_sreg(m,n,val); break; default: return -1; } return 0; } static int process_Z(struct modem *m, char *p, int *len) { AT_DBG("AT Z command...\n"); #if 1 switch(*p) { case '1': case '2': case '3': case '0': *len = 1; break; default: *len = 0; break; } modem_reset(m); return 0; #else char *s; int set_num; set_num = strtoul (p,&s,0); *len = s-p; if (set_num < 0 || set_num > 4 ) return -1; if (set_num == 0) { /* ATZ0 - load value defined by ATYn */ set_num = m->sregs[SREG_DEFAULT_SETTING]; } else { set_num--; } AT_DBG("AT Z command - going to load set %d\n",set_num); s = load_profile (m,set_num); AT_DBG("AT Z command - done\n"); if (s != NULL) { /* FIXME: modem reset must be done instead */ /* ... */ memcpy (m->sregs,s,sizeof (m->sregs)); return 0; } return -1; #endif } /* * AT+ commands */ static int process_plus_GCI(struct modem *m, char *p, int *len) { static const char gci_string[] = "+GCI:"; char strval[8]; const struct homolog_set *h; char *end; unsigned long n; AT_DBG ("AT+GCI...\n"); switch (*p) { case '=': p++; *len = 1; if (*p == '?') { /* show all country codes */ *len += 1; modem_send_to_tty(m,gci_string,strlen(gci_string)); modem_send_to_tty(m,"(",1); for(h=homolog_set;h->name;h++) { n = sprintf(strval,"%x,",h->id); modem_send_to_tty(m,strval,n); } modem_send_to_tty(m,")",1); modem_send_to_tty(m, CRLF_CHARS(m),2); } else { n = strtoul (p,&end,16); if(end == p) { return -1; } *len += end - p; p = end; /* set country n */ if(modem_homolog_init(m,n,NULL)) return -1; } break; case '?': n = sprintf(strval,"%x",m->homolog->id); modem_send_to_tty(m, "+GCI:",5); modem_send_to_tty(m, strval, n); modem_send_to_tty(m, CRLF_CHARS(m), 2); *len = 1; break; default: *len = 0; return -1; } return 0; } static int process_plus_MS(struct modem *m, char *p, int *len) { char strval[32]; struct dp_driver *drv; char *end; unsigned long n; unsigned int dp_id; int auto_mode,min_rate,max_rate; int is_found=0; AT_DBG ("AT+MS...\n"); switch (*p) { case '=': p++; *len = 1; if (*p == '?') { *len += 1; modem_send_to_tty(m,"(",1); for(drv = modem_dp_drivers ; drv->id ; drv++ ) { if(!drv->code || !drv->op) continue; if(is_found++>0) modem_send_to_tty(m,",",1); sprintf(strval,"%d",drv->id); modem_send_to_tty(m,strval,strlen(strval)); } modem_send_to_tty(m,"),(0,1),",1+7); sprintf(strval,"(%u-%u),",MODEM_MIN_RATE,MODEM_MAX_RATE); modem_send_to_tty(m,strval,strlen(strval)); modem_send_to_tty(m,strval,strlen(strval)-1); modem_send_to_tty(m, CRLF_CHARS(m),2); break; } #define PARSE_MS_ITEM(p,len,item) { \ n = strtoul (p,&end,0); \ if (end != p) { item = n; } \ *len += end - p; p = end; \ if (*p != ',') goto setup_ms; \ *len += 1; p++; \ } dp_id = MODEM_DP(m); auto_mode= MODEM_AUTOMODE(m); min_rate = m->min_rate; max_rate = m->max_rate; PARSE_MS_ITEM(p,len,dp_id); PARSE_MS_ITEM(p,len,auto_mode); PARSE_MS_ITEM(p,len,min_rate); PARSE_MS_ITEM(p,len,max_rate); setup_ms: if(dp_id != MODEM_DP(m)) { for(drv = modem_dp_drivers ; drv->id ; drv++ ) { if(drv->op && drv->code && drv->id == dp_id) { is_found++; break; } } if(!is_found) return -1; } if((auto_mode != 0 && auto_mode != 1) || min_rate > max_rate || min_rate < MODEM_MIN_RATE || max_rate > MODEM_MAX_RATE ) return -1; MODEM_DP(m) = dp_id; MODEM_AUTOMODE(m) = auto_mode; m->min_rate = min_rate; m->max_rate = max_rate; break; case '?': n = sprintf(strval,"%d,%d,%u,%u",MODEM_DP(m),MODEM_AUTOMODE(m), m->min_rate,m->max_rate); modem_send_to_tty(m, strval, n); modem_send_to_tty(m, CRLF_CHARS(m), 2); *len = 1; break; default: *len = 0; return -1; } return 0; } static int process_plus_FCLASS(struct modem *m, char *p, int *len) { char ch; if(*p == '=' ) { p++; *len += 2; if(*p == '?') { modem_send_to_tty(m, "0" , 1); #ifdef MODEM_CONFIG_FAX_CLASS1 modem_send_to_tty(m, ",1" , 2); #endif #ifdef MODEM_CONFIG_VOICE modem_send_to_tty(m, ",8" , 2); #endif modem_send_to_tty(m, CRLF_CHARS(m), 2); } else if (isdigit(*p)) { int val = *p - '0'; if ( val != 0 #ifdef MODEM_CONFIG_FAX_CLASS1 && val != 1 #endif #ifdef MODEM_CONFIG_VOICE && val != 8 #endif ) return -1; return modem_set_mode(m, val); } else return -1; } else if (*p == '?') { *len += 1; ch = '0' + m->mode; modem_send_to_tty(m, &ch , 1); modem_send_to_tty(m, CRLF_CHARS(m), 2); } else return -1; return 0; } /* * Caller ID */ #ifdef MODEM_CONFIG_CID static int process_CID(struct modem *m, char *p, int *len) { char ch; if(*p == '=' ) { p++; *len += 2; if(*p == '?') { modem_send_to_tty(m, "0,1,2" , 5); modem_send_to_tty(m, CRLF_CHARS(m), 2); } else if (isdigit(*p) && *p - '0' < 3) { m->cid_requested = *p - '0'; } else return -1; } else if (*p == '?') { *len += 1; ch = '0' + m->cid_requested; modem_send_to_tty(m, &ch , 1); modem_send_to_tty(m, CRLF_CHARS(m), 2); } else return -1; return 0; } #endif /* * Voice commands */ #ifdef MODEM_CONFIG_VOICE extern int modem_voice_set_device(struct modem *m, unsigned device); extern int modem_voice_command(struct modem *m, enum VOICE_CMD cmd); extern int modem_voice_init(struct modem *m); struct voice_param { unsigned *val; unsigned min, max; }; static int set_voice_params(struct modem *m, char *p, const char *cmd, struct voice_param *param, int *len, const char *prefix, const char *suffix) { char strval[32]; unsigned val[3]; struct voice_param *prm; int i; char *end; *len += 1; if( *p == '=' ) { p++; if(*p == '?') { *len += 1; sprintf(strval, "+%s=", cmd); modem_send_to_tty(m, strval, strlen(strval)); if(prefix) modem_send_to_tty(m, prefix, strlen(prefix)); prm = param; while(prm->val) { sprintf(strval, "%d-%d", prm->min, prm->max); modem_send_to_tty(m, strval, strlen(strval)); prm++; if(prm->val) modem_send_to_tty(m, ",", 1); } if(suffix) modem_send_to_tty(m, suffix, strlen(suffix)); modem_send_to_tty(m, CRLF_CHARS(m), 2); return 0; } if(prefix) { if(strncmp(p,prefix,strlen(prefix))) return -1; p += strlen(prefix); *len += strlen(prefix); } prm = param; for (i = 0; prm->val && i < sizeof(val)/sizeof(val[0]) ; i++ ) { val[i] = strtoul(p,&end,0); if( (prm->min && val[i] < prm->min) || (prm->max && val[i] > prm->max) ) return -1; *len += end - p; p = end; prm++; if(prm->val) { if(*p != ',') return -1; *len += 1; p++; } } if(suffix) { if(strncmp(p,suffix,strlen(suffix))) return -1; *len += strlen(suffix); } prm = param; for (i = 0; prm->val && i < sizeof(val)/sizeof(val[0]) ; i++ ) { *prm->val = val[i]; prm++; } return 0; } else if ( *p == '?' ) { sprintf(strval, "+%s=", cmd); modem_send_to_tty(m, strval, strlen(strval)); if(prefix) modem_send_to_tty(m, prefix, strlen(prefix)); prm = param; while(prm->val) { sprintf(strval, "%d", *prm->val); modem_send_to_tty(m, strval, strlen(strval)); prm++; if(prm->val) modem_send_to_tty(m, ",", 1); } if(suffix) modem_send_to_tty(m, suffix, strlen(suffix)); modem_send_to_tty(m, CRLF_CHARS(m), 2); return 0; } else return -1; } static int process_voice_command(struct modem *m, char *p, int *len) { AT_DBG("voice cmd: %s\n", p); *len += 2; /* AT+VIP */ if(!toupper_strncmp(p,"IP",2)) { return modem_voice_init(m); } /* AT+VNH=0,1 */ else if(!toupper_strncmp(p,"NH",2)) { unsigned val = 0; struct voice_param params[] = { {&val,0,1}, {} }; return set_voice_params(m,p+2,"VNH",params,len,NULL,NULL); } /* AT+VGT=127 */ else if(!toupper_strncmp(p,"GT",2)) { struct voice_param params[] = { {&m->voice_info.tx_gain,0,128}, {} }; return set_voice_params(m,p+2,"VGT",params,len,NULL,NULL); } /* AT+VGR=127 */ else if(!toupper_strncmp(p,"GR",2)) { struct voice_param params[] = { {&m->voice_info.rx_gain,0,128}, {} }; return set_voice_params(m,p+2,"VGR",params,len,NULL,NULL); } /* AT+VIT= */ else if(!toupper_strncmp(p,"IT",2)) { struct voice_param params[] = { {&m->voice_info.inactivity_timer,0,255}, {} }; return set_voice_params(m,p+2,"VIT",params,len,NULL,NULL); } /* AT+VSD=128,50 */ else if(!toupper_strncmp(p,"SD",2)) { struct voice_param params[] = { {&m->voice_info.silence_detect_sensitivity,0,255}, {&m->voice_info.silence_detect_period,0,255}, {} }; return set_voice_params(m,p+2,"VSD",params,len,NULL,NULL); } /* AT+VSM=1,8000 */ else if(!toupper_strncmp(p,"SM",2)) { struct voice_param params[] = { {&m->voice_info.comp_method,0,1}, {&m->voice_info.sample_rate,8000,8000}, {} }; return set_voice_params(m,p+2,"VSM",params,len,NULL,NULL); } /* AT+VLS=1 */ else if(!toupper_strncmp(p,"LS",2)) { unsigned dev = (m->voice_obj != NULL); struct voice_param params[] = { {&dev,0,1}, {} }; int ret = set_voice_params(m,p+2,"VLS",params,len,NULL,NULL); if(ret) return ret; return modem_voice_set_device(m, dev); } /* AT +VRX, +VTX, +VTR */ else if(!toupper_strncmp(p,"TX",2)) return modem_voice_command(m,VOICE_CMD_STATE_TX); else if(!toupper_strncmp(p,"RX",2)) return modem_voice_command(m,VOICE_CMD_STATE_RX); else if(!toupper_strncmp(p,"TR",2)) return modem_voice_command(m,VOICE_CMD_STATE_DUPLEX); /* AT+VTS=[933,,150] */ else if(!toupper_strncmp(p,"TS",2)) { unsigned orig_len; int ret; p += 2; orig_len = *len; { struct voice_param params[] = { {&m->voice_info.tone1_freq,0,0}, {&m->voice_info.tone2_freq,0,0}, {&m->voice_info.tone_duration,0,6000}, {} }; if(*p == '?' || (*p == '=' && *(p+1) == '?' )) return set_voice_params(m,p,"VTS",params,len,NULL,NULL); ret = set_voice_params(m,p,"VTS",params,len,"[","]"); if(!ret) return modem_voice_command(m, VOICE_CMD_BEEP); } { struct voice_param params[] = { {&m->voice_info.dtmf_symbol,0,0}, {&m->voice_info.tone_duration,0,100}, {} }; *len = orig_len; ret = set_voice_params(m,p,"VTS",params,len,"{","}"); if(!ret) return modem_voice_command(m, VOICE_CMD_DTMF); } { struct voice_param params[] = { {&m->voice_info.dtmf_symbol,0,0}, {} }; *len = orig_len; ret = set_voice_params(m,p,"VTS",params,len,NULL,NULL); if(!ret) return modem_voice_command(m, VOICE_CMD_DTMF); } return -1; } else return -1; } #else #define process_voice_command(m,p,plen) (-1) #endif /* MODEM_CONFIG_VOICE */ /* * Fax commands */ #ifdef MODEM_CONFIG_FAX extern int FAX_class1_command(void *obj, unsigned cmd, unsigned param); static int process_fax_command(struct modem *m, char *p, int *len) { unsigned val; char *end; AT_DBG("fax cmd: %s\n", p); *len += 2; /* +FTS= */ if(!toupper_strncmp(p,"TS=",3)) { *len += 1; p += 3; val = strtoul(p,&end,0); if(p == end) return -1; *len += end - p; p = end; return FAX_class1_command(m->fax_obj, FAX_CMD_FTS, val); } /* +FRS= */ else if(!toupper_strncmp(p,"RS=",3)) { // FIXME: abort on tty input *len += 1; p += 3; val = strtoul(p,&end,0); if(p == end) return -1; *len += end - p; p = end; return FAX_class1_command(m->fax_obj, FAX_CMD_FRS, val); } /* +FTM= */ else if(!toupper_strncmp(p,"TM=",3)) { *len += 2; p+= 3; if(*p == '?') { modem_send_to_tty(m,"24,48,72,73,74,96,97,98,121,122,145,146",39); modem_send_to_tty(m, CRLF_CHARS(m), 2); return 0; } else { val = strtoul(p,&end,0); if(p == end) return -1; *len += end - p - 1; p = end; return FAX_class1_command(m->fax_obj, FAX_CMD_FTM, val); } } /* +FRM= */ else if(!toupper_strncmp(p,"RM=",3)) { *len += 2; p+= 3; if(*p == '?') { modem_send_to_tty(m,"24,48,72,73,74,96,97,98,121,122,145,146",39); modem_send_to_tty(m, CRLF_CHARS(m), 2); } else { val = strtoul(p,&end,0); if(p == end) return -1; *len += end - p - 1; p = end; return FAX_class1_command(m->fax_obj, FAX_CMD_FRM, val); } return 0; } /* +FRH= */ else if(!toupper_strncmp(p,"RH=",3)) { *len += 2; p+= 3; if(*p == '?') { modem_send_to_tty(m,"3",1); modem_send_to_tty(m, CRLF_CHARS(m), 2); return 0; } else if (isdigit(*p)) return FAX_class1_command(m->fax_obj, FAX_CMD_FRH, *p - '0'); return -1; } /* +FTH= */ else if(!toupper_strncmp(p,"TH=",3)) { *len += 2; p+= 3; if(*p == '?') { modem_send_to_tty(m,"3",1); modem_send_to_tty(m, CRLF_CHARS(m), 2); return 0; } else if (isdigit(*p)) return FAX_class1_command(m->fax_obj, FAX_CMD_FTH, *p - '0'); return -1; } else return -1; } #else #define process_fax_command(m,p,plen) (-1) #endif /* MODEM_CONFIG_FAX */ /* ------------------------------------------------------------ */ /* * Main AT processor * */ int process_at_command(struct modem *m, char *cmd) { char c, *p = cmd; int len = 0, ret = -1; /* verify 'AT' */ if (toupper(*p++) != 'A' || toupper(*p++) != 'T') return -1; while(*p) { c = toupper(*p++); len = 0; switch(c) { case 'A': /* ATA */ ret = process_A(m,p,&len); return ret; case 'B': /* ATB */ ret = process_B(m,p,&len); break; case 'D': /* ATD */ ret = process_D(m,p,&len); return ret; case 'E': /* ATE */ ret = set_sreg(m,SREG_ECHO,*p,0,1,&len); break; case 'H': /* ATH */ ret = process_H(m,p,&len); break; case 'I': /* ATI */ ret = process_I(m,p,&len); break; case 'L': /* ATL */ ret = set_sreg(m,SREG_SPEAKER_VOLUME,*p,0,3,&len); if(!ret) modem_update_speaker(m); break; case 'M': /* ATM */ ret = set_sreg(m,SREG_SPEAKER_CONTROL,*p,0,2,&len); if(!ret) modem_update_speaker(m); break; case 'N': /* ATN */ ret = set_sreg(m,SREG_AUTOMODE,*p,0,1,&len); break; case 'O': /* ATO */ ret = process_O(m,p,&len); break; case 'P': /* ATP */ #ifdef NO_PULSE_DIAL return -1; #endif ret = modem_set_sreg(m,SREG_TONE_OR_PULSE,0); break; case 'Q': /* ATQ */ ret = set_sreg(m,SREG_QUIET,*p,0,1,&len); break; case 'S': /* ATS */ ret = process_S(m,p,&len); break; case 'T': /* ATT */ ret = modem_set_sreg(m,SREG_TONE_OR_PULSE,1); break; case 'V': /* ATV */ ret = set_sreg(m,SREG_VERBOSE,*p,0,1,&len); break; case 'X': /* ATX */ ret = set_sreg(m,SREG_X_CODE,*p,0,4,&len); break; case 'Y': /* ATY */ ret = set_sreg(m,SREG_DEFAULT_SETTING,*p,0,3,&len); break; case 'Z': /* ATZ */ ret = process_Z(m,p,&len); return ret; case '#': /* AT# */ #ifdef MODEM_CONFIG_CID if(!toupper_strncmp(p,"CID",3)) { p+= 3; ret = process_CID(m, p, &len); } else #endif ret = -1; break; case '%': /* AT% */ c = toupper(*p++); switch (c) { case 'C': /* AT%C */ ret = set_sreg(m,SREG_COMP,*p,0,3,&len); break; case 'E': /* AT%E */ ret = set_sreg(m,SREG_LINE_QUALITY_CONTROL,*p,0,2,&len); break; default: return -1; } /* end AT% */ break; case '&': c = toupper(*p++); switch (c) { case 'A': /* AT&A */ ret = set_sreg(m,SREG_CONNNECT_MSG_FORMAT,*p,0,7,&len); break; case 'C': /* AT&C */ ret = set_sreg(m,SREG_CD,*p,0,1,&len); break; case 'D': /* AT&D */ case 'R': /* AT&R */ case 'S': /* AT&S */ len = isdigit(*p)?1:0; ret = 0; break; case 'E': /* AT&E */ ret = set_sreg(m,SREG_CONNNECT_MSG_SPEED_SRC,*p,0,1,&len); break; case 'F': /* AT&F */ len = isdigit(*p)?1:0; ret = 0; break; case 'H': /* AT&H */ ret = set_sreg(m,SREG_FLOW_CONTROL,*p,0,1,&len); break; case 'K': /* AT&K */ ret = set_sreg(m,SREG_COMP,*p,0,3,&len); break; case 'P': /* AT&P */ ret = set_sreg(m,SREG_PULSE_RATIO,*p,0,3,&len); break; case 'V': /* AT&V */ case 'W': /* AT&W */ ret = -1; break; #if 0 case 'Z': /* AT&Z */ c = toupper(*p++); if (c == 'L'){ ret = print_last_dial_string (m); break; /* ZL */ } break; /* Z */ #endif default: return -1; } break; case '*': /* AT* */ c = toupper(*p++); switch(c) { case 'B': /* AT*B */ break; default: return -1; } break; case '+': c = toupper(*p++); switch (c) { #if 0 case 'D': /* AT+D */ c = toupper(*p++); switch (c) { case 'C': /* AT+DC */ break; case 'S': /* AT+DS */ break; case 'R': /* AT+DR */ break; default: return -1; } break; #endif case 'G': /* AT+G - generic DCE cntrl */ c = toupper(*p++); switch (c) { case 'C': /* AT+GCI[=|?|=?] */ if (toupper(*p++) == 'I') ret = process_plus_GCI(m,p,&len); else return -1; break; case 'M': /* AT+GM[I|M|R] */ c = toupper(*p++); switch (c) { case 'I': /* AT+GMI */ modem_send_to_tty(m,modem_author,strlen(modem_author)); modem_send_to_tty(m,CRLF_CHARS(m),2); break; case 'M': /* AT+GMM */ modem_send_to_tty(m,modem_name,strlen(modem_name)); modem_send_to_tty(m,CRLF_CHARS(m),2); break; case 'R': /* AT+GMR */ modem_send_to_tty(m,modem_version,strlen(modem_version)); modem_send_to_tty(m,CRLF_CHARS(m),2); break; default: return -1; } ret = 0; break; default: return -1; } break; case 'F': /* AT+F */ if(!toupper_strncmp(p,"CLASS",5)) { p+= 5; ret = process_plus_FCLASS(m, p, &len); } else ret = process_fax_command(m, p, &len); break; #ifdef MODEM_CONFIG_VOICE /* AT+IFC=2,2 */ /* TBD: flow control - not voice command */ case 'I': // FIXME if(!toupper_strncmp(p,"FC=2,2",6)) { p+= 6; ret = 0; } else ret = -1; break; #endif case 'M': /* AT+M */ c = toupper (*p++); if (c == 'S') ret = process_plus_MS(m,p,&len); break; case 'V': if(m->mode != MODEM_MODE_VOICE) return -1; #ifdef MODEM_CONFIG_CID if(!toupper_strncmp(p,"CID",3)) { p+= 3; ret = process_CID(m, p, &len); } else #endif ret = process_voice_command(m, p, &len); break; default: return -1; } break; case '\\': c = toupper(*p++); switch (c) { case 'A': /* AT\A */ if(isdigit(*p)) len++; // ret = set_sreg(m,SREG_V42_BASEREG,*p,0,5,&len); break; #if 0 case 'B': /* AT\B */ break; case 'K': /* AT\K */ break; #endif case 'N': /* AT\N */ ret = set_sreg(m,SREG_EC,*p,0,5,&len); break; default: return -1; } break; default: AT_DBG("unknown command `%c` (%x).\n",c,c); return -1; } if (ret) return ret; p += len; } return 0; } slmodem-2.9.11-20110321/modem/modem_debug.c0000644000175000000620000001100510773430100016464 0ustar marvstaff/*****************************************************************************/ /* * * Copyright (c) 2002, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * modem_debug.c -- modem debug module (dummy). * * Author: Sasha K (sashak@smlink.com) * * */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include unsigned int modem_debug_level; unsigned int modem_debug_logging; unsigned int dsplibs_debug_level; static const char *modem_debug_logfile = "slmodem.log"; static int modem_log_fd; /* logging */ int modem_debug_log_data(struct modem *m, unsigned id, const void *data, int count) { struct sllog_header hdr; int ret = 0; if(id <= modem_debug_logging && modem_log_fd > 0) { hdr.modem_id = (unsigned)m ; hdr.id = id; hdr.length = count; ret = write(modem_log_fd,&hdr,sizeof(hdr)); if(ret < 0) { fprintf(stderr,"log_data: cannot write header: %s\n", strerror(errno)); return ret; } ret = write(modem_log_fd,data,count); if(ret < 0) { fprintf(stderr,"log_data: cannot write data: %s\n", strerror(errno)); return ret; } } return ret; } /* printing */ static int debug_vprintf(unsigned level, const char *fmt, va_list args) { static char debug_temp[512]; struct timeval tv; int i, len; gettimeofday(&tv,NULL); i = snprintf(debug_temp,sizeof(debug_temp),"<%03ld.%06ld> ", (tv.tv_sec % 1000), tv.tv_usec); len = vsnprintf(debug_temp + i, sizeof(debug_temp) - i, fmt, args); if(modem_debug_logging) modem_debug_log_data(0, MODEM_DBG_PRINT_MSG,debug_temp,len + i); if(level <= modem_debug_level) fprintf( stderr, "%s", debug_temp); return len; } int dsplibs_debug_printf(const char *fmt, ...) { va_list args; int len; va_start(args, fmt); len = debug_vprintf(dsplibs_debug_level, fmt, args); va_end(args); return len; } int modem_debug_printf(const char *fmt, ...) { va_list args; int len; va_start(args, fmt); len = debug_vprintf(1, fmt, args); va_end(args); return len; } int modem_debug_init(const char *suffix) { dsplibs_debug_level = modem_debug_level; if(modem_debug_logging) { char path_name[PATH_MAX]; const char *name; if(suffix) { snprintf(path_name, sizeof(path_name), "%s.%s", modem_debug_logfile, suffix); name = path_name; } else name = modem_debug_logfile; modem_log_fd = creat(name,S_IREAD|S_IWRITE); if(modem_log_fd < 0) { fprintf(stderr,"cannot create `%s': %s\n", name,strerror(errno)); return -1; } if(dsplibs_debug_level < 3) dsplibs_debug_level = 3; } return 0; } void modem_debug_exit() { if(modem_log_fd > 0) { close(modem_log_fd); modem_log_fd = 0; } } slmodem-2.9.11-20110321/modem/dsplibs.o0000644000175000000620000455150010773430100015706 0ustar marvstaffELF4( 1 Ít& 1 ÐS$ t<$ 1T$D$ CCC%CKfC [Í&D$tv D$f@@ @Í&,1\$\$0t$ t$8ۉl$(l$4|$$D$D$KQw 19t$}f|UuB9|19C;CCCC &K{ 1)9| |$D$t,19| $t&KDU)fDUB9|t&'D$\$t$ |$$l$(,1\$t$ |$$l$(,Éw119 |MA9|{K ;{Si3sD$ șL$ i @fCC C119 |MA9|K{ ;K|q=D$ fCv6D$K{ uD${$|$ L$T$ЃCaC~{ KsK {hVSt$$=w~@1ҁ%1Ʌu\$1ɅtH$1ɸL$D$T$ 1L$(D$L$$Ct9%tك[^$q%T$s4$ω$1ō'S\$=wC$\$[&$C$\$[U1WVSl$4t$8/=\$7&D$)l}~l$T$01ɉL$\$1\$ D$Bf|$$tHu=\$0D$K $1҉ÉT$h;_=wn$D$T$0\$$T$0'L$D$ $$D$\|$~D$t&[^_]É\$$*뀍$:$L =w $^D$D$ Ð& =w $zD$D$ Ð&S T$\$D$$1ɃRt:wHweuHASt[vw0J[Í@$ut'[Ãv[ÃIu퐋H([Í[Ít&WVS0|$@=\$De$14$1T$D$>@tF1%>hF1ҁ%AYVtrF T$<$F |$ Mb0`D$$L$ |$( `dp\$, $Fu'Ft$Fur4$10[^_Í\$1\$T$F|$$|$\$^L$$0[^_Ít&$$널t&$F1ҁ%v$‹F$$ڍvS\$=w"Cu8CuACuJ\$[$Ctҍv'$Ct$Ct$\$[t&'VS$t$0T$4tM^wR$=L$t&FT$D$D$^$$[^Í&=$[^Ã=1D$룍v=D$눃=\$m=K̉L$ctL$At&=wU )=S̉T$KL$cT$1T$$8$ $X$|1$$ccT$ ST$C$D$3cT$C$ D$U1WVS|$l$\$tdD$$T$,$`L$X9vD$Xt$X1ۋ$\$H$T$Tl$Pt$LL$,Q^T$,\-D$P\$r$LrL$\$Pt$,)l$LV).ꋏ`1ҋl$L D$,P`;D$Lvl$L D$$p)9vʼn)9vŋL$$\-D$T\$Tq$D$\$TD$$p`1D$$P`9t$DL$,P \$pq TPT$DqL$DD$@t$p t$D$ L$_D$($t$p1t$<;D$<}%߄G ٜ` @;D$<|fD$v` 1҉D$8G \$4|fT$tfҍ_ H\$L$8t$tt$D$4T$vT$ t$L$ D$_$ D$0L$t1ۉOL$09Ot8 @$(=v $G T$0W1;T$<}=|$bD$bf fD$`t&، l$`ߜW l$bB;T$<|؋t$DL$dD$@L$T$fF@fFBfFFfFHfFJfFLF f~Nf~PxYfF2fF4d<[^_]Ðt&n l$^\$FD$L$ VT$o$ll$"~ wfF2fF4F x<[^_] UWVS<|$P$ToƸgffffF:1)݋)ʉT$4O|$4^,fF0[D$,D$,W _^O ND$(fF8GF ~d~Fd~'F(~ wF x=FW~0FL$ D$ 1FfF,)fN6fNDمfF.F(fF<fF>fF@fFBfNFfFHfFJfFLF f~Nf~PxPfF2fF4d<[^_]Ën l$^\$FD$L$ VT$o$ll$%~ wfF2fF4F x<[^_]ÍL$D$Q.Q$D$ Ð&U1WVS \$ ;l$( Mb{S L$ʉ)‰$ffsL|$9~'K0CfCJfCHfCLfC>fKNfKPK,ft*CJf~!i֙;C~ fC:fC.$9C9C ~ftfK.fC,C(fC:E;l$(C>Cf>K6CT$$sjFf9kC@fCB@f9CNfC@s2C4fC>fKDfsPfCFCCLT$$Ks @AfCLFjf;CFYCBSPfC@@f9fCBf;S0#KfC>fCHfCLC {:1K'9CBfC@@f9CPfCB}!s4S2fC>fsDfSN~syf;CDK}WCHS8fC@fCB@f9}bs0fCJfC>KfCHfsNfsPs K f;CFKs fC@fCBs9|&C$fCHs ks )xxk$KA9ȉ}!;D$|C,K(QS(֙fC,CJC@fCJKA9ȉ}!;D$|C,K(QS(֙fC,CJC@fCJD$D$UWVSl$=$$1X4$1|$D$^$8v$N D$~<$~‰$|$ Ѹ`+D$L$11L$T$$\$D$D\$<$L$V$,0< \$<$@@tC=w`1%F1%F``l[^_]Íl$@|$$념t&$XQ$>6L$F$\$L$! $ҍ\$ tT$ $H$$&$&'SD$=Xw2D$CuGCuPC$1[$iD$Ct‰'$Ct$C$1[ÉU1WVS|$D$L1ɉL$(T$D\$(\$ L$LD$D$HT$T$$L$\$D$ T$~ <$NDžt>D$(~61$D$(B9|\$D$ \$U$L$$1ۅNt;F;]t =],[^_]Í&FuFVD$ہð\$N $\$\$V$끍&L$ |$D$U$D$$ \(Jy|$$],[^_]F `D$$1 É `D$$ ÐVSDt$T=$D1҅$D1T$D$3L$P@T$dKL$\S D$0QL$ T$D$$C C1Ƀ|$XXL$ t1D$$1`D$(1t$,t$ T$8L$0D$4t$$CtD[^$S $$1Ѝt& t$t$\$NYS$C $F$\$1t$ Ð&UWVS,l$@EXC |$${$|$L$Lt$$t$D$DT$(T$L$(L$Ht$D$ L$S$D$ Cuc11|$(19}*'K"D$(B9|D$ t$ST$u4$D$ w0$D$(dv=+dD$(d|;]t =wM],[^_]ÉD$ {$|$D$$KL$U$D$$&4t$Jy|$ $|$],[^_]C1uC Ct$L$C$|$T$s4$#C ` CL$D${<$` T$묉D$$v xL$$z$xT$$xD$1 Ð& xL$$z$xT$$xD$ ÐWVS@t$T=|$XL$H1҅+$1ҹHL$T${D$P@3L$dCD$\K T$UD$ L$T$$C$C1҅XƒgT$ 1D$$1=`t$(L$,8D$0|$4t$8vNT$8|$|$$t$`L$D$|$ tT$$CT$ T$$C t!@[^_$16C$$$1ȍv' t$t$\$NYS $C$$F$\$1t$ Ð&UWVS,T$@BXCfD$(s(t$l$H|$(|$D$DL$*L$l$|$D$ S fD$*$sŅtQT$*ftGtAT$*9|$|$@t$ L$G$;kt=k1'Cl$@;u1҃…'C,l$T$C$t$,L${<$\$@s,[^_]Él$‰D$$ =C1l$@;u1҃…_\$@s,[^_]fD$(s(D$ t$l$z<$fD$(ȉ L(JyC넃=r$Dav' T$$g$D$1 Í' T$$g$D$ Ð D$T$$ Ít&WVS|$ $1$1ɺL$ T$t$<$$1҉ƉT$D$Sр߀⟈KF$ˆSF cCSNC C<C(CC@CDKLCPSHD$<$CTCXC\C`ClChCd[^_Ðt& dS\$C uCu$\$[&$Ctݐ$\$[t&'<\$,\$Hl$8l$Lۉ|$4t$0‹|$P Шu Ȩt1\$,t$0|$4l$8<Í&$8 1tщ4$1ҹ8 L$݉T$D$@L$Dؙ9N$11Ɂ@D$(1ہ%Åى\$$1ҁ%‰T$ 1ҁ@…T$ ^1ہÅc1\$ ^D$$tN$<$D$|$~\$,t$0|$4l$8<$D$(D$(F 1ɉL$1Ɂ@1ہ%Åى\$u1%D$1ҁ@…T$1ہÅ1u,\$D$>$)$R$F t$FuU4$$$$$$$$롍v'U1WVS,D$@T$t$L@D$ ljŁ(nUD$L$ ;t$Lvt$L_ )9vƉ)9vƋD$D6\$D$WLW $\$D\$ W1WT$ 9Z  ËO E TODED$D$@T$T$ \$ $RtD$L$ Q\$ O )1uG T$ ] 1MuE 6T$H\$E$LEL$)uD$ U\$HЍ 1U)t$Lt$LD$,[^_]ÉT$$T$D$$E \$TEȉT$ D$Y$%t&D$\$(\$L$(D$ L$_ D_D$J $D$ \$(T$UWVS,1ۉ\$(l$@t$H9t$(M UEL$$T$ D$'u|$DD$L$ |$D} f}u}f] D$$)ʍM A)EfufUҍC ] @t+}MUEZD$(t$H9t$(F,1[^_]É9~=I~ U"~3t&E}EEE~,[^_]ÉEEUE@@=EvT$ L$D$$l롍v'T$D$feff@f@f@@@@@t!fftÍ&f@ Zf@Uf@9f@ f@f@9Ív'D$f w $`1øøøøøhøøøxø<ø(øøø Ív'Ð&'t$t$ \$ |$^l$HH5t aLux<NA0A4 ~  9} ƒ~X \$ t$|$l$Ívyt<X4\$P0 $T$\$ t$|$l$Juf5\$ t$|$l$Í&<\]0u4\$t$$\$ t$|$l$Ít&SD$ <XB`0v=,w 1҉0[ÉD$J`$L$1҉0[Ð&t$t$ \$|$<H5YdC"f|wCYh)f\wmQhk$hT$\$t$|$Ðt&\$D$$ <Yh)؃f\v'\$D$$P <kQh$hT$\$t$|$Ð1ÐD$T$=PwÉT$ T$L$$\$\$ t$|$sH5dHw"\ \$t$|$Ãt{tg($D$11fX1fZf\"Ff\$t$|$Ë$H;|(덅y$@; sܐUWVSt$0L$4=H5dD$~L$T$(HH5t a$L<NA0A4 ~  9} ƒ A`^0v=,10YdH5C"f|Yh)f\ZYhk$h\$T$ a H11f̫1\$fʫ€|$otET$8Z<\3=D$'D$8 hH"umf<_t&y@<U4T$]0 $\$]t&Jxf5gZ\11ɉHL4$1T$T$11۹"fXfZf\P5fCC,'fP51ff@fef@f@@@@@ff[^_]\$$ \$$ <MPt&\$D$$P <\$D$$ <FD$A`$D$<1LHjf@ f@f@9[^_]Íf@ Zf@UމH,H"Xr<\Z0j4\$l$$<l$$ l$D$<=$p D$<=T$$ 떋L$1ҽT$ $>H2Ɔ&T$D$$=t$t$ \$ |$^l$H5dwR111ɉ( Hwaƅ>\ \$ t$|$l$$4 111ɉ( Hvv4$1\$F1҉"1fXfZf\\$ t$|$l$Í&'T$$\$ \$ L$(t$d|${l$<L$ H5L$,`L$ 1҈1f1f11ffثD$$11fX1ɿf\"\ofZ1<$5ff@f@fef@@@@@t5fftW\$ t$|$l$Ív=wE11ɉf@ f@f@9\$ t$|$l$Éf@ Zf@U$d 뭍t&iD$%1ɋT$48ÉL$\t Jt"Ðt&u8Ðt&fƫtfȫ\uѸZÐS1\$ w"uut[̫[Ðt&ST$f5fH5t:t*Yi` [ËHw鋓\$[Ë[ÍT$H5f5ftHw!X1z,t$Ëtmt^vi` ËJ@1ҋiH@RQ,$ |$T$f fT$ l$ <$l$$땸0u닋$a1z,vBL1ҋiA@RP,$ 또v'T$f5ft@vËHt&T$f5ftH@vËt&T$f5ft1ɃvËHꐍT$f5ft1Ƀ:tÐ1ɃwÐV1ST$ 1ہdf~*HȉЙiΉCi2[^ÐD$Ðt&D$Ðt&D$T$* 1f*X/Ã,D$4\$L$0t$ 1ۃ|$$d|$8l$(H5wx$99kj;l$ffCfʫt=~CfCfƫt=KsfsfC0`B t$$K %fS`z :fCKfK\$t$|$Ã=v3L$u<T$$ ffC=v狈L$u<T$$$$L${f{8 #$$$q$$At$=wÍD$=wÍD$ T$Ht=wL$fA Ðt&$_L$fAߐ&D$ÍUWVS11f@11fF1fJfLfBfDfH[^_]É|$h*<$qF$D$=GD$L$=#n$l$=V$T$=F$D$=N$L$=o $@l$t${|$h*$W,|$$|$0\$t$ dl$(oH5H"t-tmYG\$1t$ |$$l$(,f<$L$@f\$1t$ |$$l$(,É$%D$fD$<$T$L$`=Hf<f(<$T$H <$Bf <$@f1Hfs1\$ %T$D$,$f<$1Aff\$t$ |$$l$(,Ë <$Bf<$@f!11H1ff%fD$$fD$<$\$t$c|<$f5Et Ef5H.1ҹ\$%T$L$ $f1ɸ$D$ l$L$^<$\$F<$T$+$l6&\$ \$ t$|$"l$kH5Hd  \ tt[\$ 1t$|$l$f$T$@f\$ 1t$|$l$É$%L$fD$D$D$t$`$f5Et Ef5H+$D$K& $Bf $@f 1H$@f=$@f 11ɉH1ff;$|$t&,l$(l$0\$t$ d|$$H5""utfHc [ 5\$1t$ |$$l$(,11ff,$H~"f"1f\$1t$ |$$l$(,Í&$%L$,$D$`"<f"BP<=Qƅ#vf=f=211ff,$@*,$Bf ,$@f=H ,$@f,$@f|HT,$Bf ,$@f&H111fff,$L$,$Cf ,$@fH}$%D$fD$,$\$|$ H$$%D$fD$M,$\$|$a,$f5Et Ef5HS1Ҹ\$%T$D$ $f1t$ L$D$$4,$t$%\$ 1T$t$ $ffL$$\$,$T$`,$T$,D$8=t$ t$0\$|$$"l$(~l$4D$҃11H1ff f1ۉ4$|$f*F"t>f1ɸZ4D8\$t$ |$$l$(,ýfl$D$$<)&'D$$=t$t$ D$D$(\$^D$wK|$Ht1f\$t$À|$uḐf\$t$T$ȉL$$xT$뗍v'D$$=\$\$ t$|$sD$"wSH1|$ftf\$t$|$ÿf\$t$|$$D$똍v' T$H  =Hw' Ív;=Hv&H$D$ ÍD뛐D$H5HLÉL$T$LT$Pt$@t$ 1|$Dl$Hl$T\$D$%$t&\$$$v'VS\$ d""f"|$$f=wn$f5t f5111ff5TF fF'fT[^D$ L$$PT$`fF&S\$=wL[$L[T$D$f Ð&'T$@fÍT$@fÍD$ƀÍt&,t$ t$0\$|$$dl$(F#"D$t;L$L$y\$1t$ |$$l$(,É$%L$4$T$t"1f"\$ff*1L\$t$ |$$l$(,ÉfP%\$ l$L$$f4$1Ff\$t$ |$$l$(,Í*4$D$*Cf*t$11f1fL$%D$f4$L$H4$f5Et Ef5l$L\$%l$D$ $fL$ T$D$$ ~4$T$=&'UWVS,\$@l$LH5dD$$E t$(sUD$у=UL$ T$p$1ҸLT$D$T$$1L$D$$L$(f<H5$11f<55%5151҉51ɉث1ܫ1f1f1=fff5U1 RL$(,af@,a1B1fī1퉩a1fƫ1fȫ11fʫ1f̫1fԫ1|$PfҫfЫfΫCL{O|$P|$PG 1HL$Dff5D$H111҉11F 14D$$1҉1ɉ$(1퉖,01ɉD1f51fb8FF |$P$5f*1fG G'fP5ff@f@fef@@@@@ffƃ11f 1ƃ11fbH1퉋1ffff1Ʌ҉T5H5fHX5\5t a`Lt y<NA0A4 ~  9} ƒ  A`0v=,10qdH5F"f|qh)f\ihk4$hl$<BpH =$T$(Ƃ\D$(($=<,1[^_]G T$(H$|$ l$(fƫfʫ,afOfԫfWfҫfGfЫfofΫGL$(T$ ,aPl$ |$DD$L$D$L$(a'e|$PG 1|$D|$(HD$D<$t&Jf5t$(\$|$,1[^_]Ív$ 1ɉL$i$<L$ L$=o$xT$T$=N$D$D$=-$L$PL$= $T$$T$t$D$$P <at$D$$ <!D$A`$D$<=zT\$(\;f@ f@f@9If@ Zf@U=wL$(Ɓ\$$0<\W0o4T$l$$<t&<}4|$U0 $T$҉G 1퉮HW $lT$L<$G 1ɉH$<T$|$(D$T$D$\,$C &UWVSl$$$H5$l$T$$T$P"$L$,dfb\$Lt$Hu @l[^_]ËL$,$$43l$$Љt$(%4$11~KT$,11ɐt&CAƒ~L$,FE$Ƌ 9L$T\:|$( w=;$f|$,$ 1;L$$g|$fD$ff fD$d$f*A;L$$:$$*l$dߜkX/l$fUfWv11$@;D$$rD$,$$4dE v*=v $$1҉T$4$1;L$$|$f\$ff f\$d$f*A;L$$W$$$*l$dߜFX/l$fPfWv1벉|$$$$D$$t$$l$$|$L$TD$ \$T$ $ v$T$<C  ʫL$T;o:$1f̫$f̫u%|$T1틷,aF afʫ$$T$,1;L$$|$fD$ff fD$d$f*A;L$$$$*$Dl$dߜ~X/l$fWfWv1f*뱋D$$$l$Lf*f9E%$ $$l$L*f9uu\$Luȋ$$Ɖ|$$$$T$$D$$L$$\$|$TT$ t$l$<$! $T$,H2l$$$|$Lf*f9/|S  L$L $<$$T$L*f92 T$,H~$$ŋ|$,D$$7 \$$$4$K$$|$ft$f$f ft$dl$dߟ`l$f<$$$L$L߂^*f91$|T$Hf:xD$LX$<$S1$@;D$$r닌$$T$,E?1$@;D$$r담$$D$,1$@;D$$r닼$$D$$$t;ܫt<= vT$,$l$,Ef\$,3=St$ L$T$D$$D$,0"<$4@|$$eT$,t$$PP$f*fQ$$$$߅^$N$$$|$fD$ff fD$dl$dߙ`l$f $|$,$P`ft\KHfPѨCЃ=fCvKL$D$$hC$`C͋$)*$UfoX/fW1K$`밋|$$$$|$\$Pl$)$L$ $$t$$$\$,39tNw$<HT$,2uK\$,4@)ʁv1D$$9s$=K $<gT$,2D$,1ɋ|$,BA9wT$,1ۃ$BF)ȅ6$T$,1$v+L$,TЃIyT$,G9Ӌ|$,1ɋ$$@= $E $f%1%t|$,ܫ1=D$$kl$,H~4t$Ta =v $$\$,L =v $ $1ҋL$,EfP1t&$1ۋ<ƆT$,<@g fīY fHK fHٍDT$t$$PL$,H D$,L~ T$P$L$,D$$<؋$< _j ƃ=v<$l$$f B$D$, 1l$,ED$,1ɋt$,BA9wD$,1ۉ0~3$B)ȅ$ $E$T$,1;L$$|$f\$ff f\$d$f*A;L$$t$|$T*ل ll$dߜCX/l$fPfWv1f*븋t$,1St$, L$, 11$1Ƀf̫$p\$$mL$,t$$PP$f*fQ$$$$߂^$N$ $$|$fT$ff fT$dl$dߝ`l$f,$$`|$,Pft\KHfPѨC=fCvKL$D$$hC$`Cʋ$)*$PfGX/fW1f*K$`멋|$$$$|$t$TT$)$L$ 4$$\$ $twܫ=j=vD$$ $f5$,$@$$,$t =$ $ l$,E$fLuT$PƆ$<Nt$,$|$$0\$$ۃ=v\$$D!$1Ɔ|$$T$)$|$$,$D<@1ɉHJQ4$|$$,;l$L$,1ۋl$,BC9wD$,1D$,1ۃ=$ثܫw)~i%$ث$D$$!T$,ث2빸딸h델놸|xr<h(^TJ @19$|$, $1|$,fLfH$fLul$T\$$$fīu)1fƫtfȫt$fī$1fHh$D$, L$"T$ $/$Z|$,$D$,1$ 4$!$ED$(Wt$,$1ۋ|$,fīfH$$1l$,fīEfHL$,$,"ev $x"$f̫=v $"$\$T\ $t$T$$a1y,uF$1QL2i~@UW,$ |$fD$ff fD$dl$d|$Xl$fD$X$Ɓ^T$"T$4$$8\$$ዼ$"l$<$N$ZD$ $ዔ$\\$$̋|$,1틴$ 4L$,J$"T$,2$t$, T$$0#=v $l#1]T$,<@'=v $#$aMl$,H~0t$Tat"=v $$D$,L~6=v $ $1T$,fP2T$,$L$,<rl=<D$Bl$#D$|$T<$#$$щ)S\$($o$\o $k$$aX$$[Ð&'S\$($o$\o $k$$aX$$[Ð&'T$D$}=w¹D$L$T$D$}=w¹D$L$T$D$}=w¹D$L$T$1ɋD$f}f}Í|$D$Ɉʀ}=wº$D$T$&D$11f8ƀ}ƀ}ƀ}ƀ}f}ÐL$ $\$t$1f6tQ8PAf8f8Pf8A f869t$}t1f8$t$1f8щW1VS\$ t$$f}t\f1}96t&8Pf8Co fA}9r8}9t [^_}\ @=Jxf}J|}t$=1ɉf8[^_À}t倻}u}f9}r̃=61SfSoB9|f}1ƃ}f}{}L$ }T$}$0$D$.$l$8$$h&'D$ƀƀƀƀƀƀÐD$ƀƀƀƀƀƀÐD$11f61f}1f8ƀ:ƀ;ƀ<ƀ=ƀ>ƀƀƀƀƀƀƀ}ƀ}ƀ}ƀ}ƀ}f}f}Ðv'D$($)$D*$E+$F,$G-$H.$I0$fJ2$fL4$fN6$fP8$fR:$fTfVÐ&\$\$$t$t$ $$Ƀ\L$,a1҅‰aXX\$$\$t$ t$&'S\$ƃ aƃƃƃƃƃ $ a$(a$= ƃ:11f8 a1f61Ʌf}ƃ;ƃ<ƃ=ƃ>ƃƃƃƃƃƃƃ}ƃ}ƃ}ƃ}ƃ}f}f}uOƃa11ƃa1ɉo1҃=ooow[Ð$\$[\$$%V1S$\$0aw$t&'T$8D$4L$@T$T$f}f} =_a$%ƃa1$&ƃ}=$\$=Qƃa aƃaH=n$C<ƃ<*>11$o $$L$ T$D$ $=f}ƃ} 1f81ƃ}ƃ}ƃ}f} $>1o$$L$ T$D$ $=f}-ƃ}11f8ƃ}ƃ}ƃ}f}f}$u($)$*$D+$EF,$G.$-$H0$ɈIfJ2$4$fL}fNfP6$8$:$fRfTfVK>$$D$ L$T$$=f6ƃ}=$7ƃ}=w~a aK$(&$\&t$D$I$&$$&D$$T$h$&>L$}$ 'T$$H'D$$'$' ;D$:$'L$j$X(\1Ҹ$$T$ L$D$$=f6ƃ}= a$($$ЉT$:$$ȉL$$(\D$$)D$$`)$$t$$)\$)D$G$L$$*D$$D$$\*v'U1WVS,t$@D$ L$Dl$Ha|$Lw$T$ & a`! lL$ lkL$ $\$|$ \$ D$PX$\$T|$D$\$\$a $\A<[(5$ uƆaD$ ,[^_]Ëd=t@dP$ٞ l4;:D$T$h $=;$a:S C h$a $$a[$$ aPuP'|$D$\$al$ \$X$D$\$19s%0&'D\@9r؉l$l$|$,$$aG4tzƆa=t$L$4$1D$ D$ at \{4te\$ =D$1|$$\$\z< $*l$ atƆaD$ Ɔa$a\$ x,w$jD$ \$*$aKH $5k$pT$D$$$a $\$|$*L$* ,f fL$(l$(\$&l$*D$&D$$Ɔa$a\$ $a aJxk$D$L$$$aKH $;$aYH$*Ɔa aL$ J$aKH $$aPH$Ɔ=ƆƆƆƆƆƆ\$ =!`d<Ɔa$a1ɉL$ $[= $a`d$ $aY$PHB0 B8$$aQ$XHC0 C8$D$ $$aJH $D$ Ɔa$aL$ x,Z$hƆa$aT$ x,V$9T$ +L%L$k$^%$aBHJH $L%D$k$$aYH$$aZH$$aPH$$+k$az;L$:$4+\$$0$L$\$a CHP,{$\$a AHX,WVS0t$@D$\$DL$|$HT$ D$@D$(1L$ T$$'@~11ҍDB~싆`H a1`A 1҃‰A ,aB `,aB A  aShQ,aClB=`,~}~J~J,aBZYBzyAZY azy$$$X\L$,a1aZ\$<$0[^_Ë` ClA,aChB=;`8$|+ʉL$=$+L$=`Z $,\$=,aZ\$,aA$0,D$=a\D$ ,aZ\$,aA$d,D$NVS$$$$1Ɉ$$1$$$$1Ɉ$$$$1҈$$$$$$$$$$$$$$1ҍDŽ}DŽ,~DŽ~DŽ~B~΅24118<\$,D$,T0\$,D$,T0tٜ~At&B~ء3ل~ث~|$*D$*f fD$(l$(T$$l$*L$$Q$ʃl$(\$ l$*@l$(\$$l$*D$$1)ЉD$ل~ث~ɉt$$iɃ-L$FG $$D$t$$1=u a@ u*ƃƃƃƃƃƃ[^$v'V1S\$ @ aX $a4$T$4$11D$$a $k$d a1`boƃa[^Ðv'S1҃\$ 11ƃ:ƃ;ƃ<ƃ=ƃ>ƃƃƃƃƃƃƃ}ƃ}ƃ}ƃ}ƃ}f61҃=f}f8f}f}wO\$6L$CT$$6$,L$[Í$,룉UWVS|$0at a1\X`;l$8T\$ L$x419|$\$f f\$t&@Q )A뉏@؋L$4T$$)$$D$ )Ӻ$R)$i$)ЋT$-6 l$\l$F9c؃[^_]Í&x4l$819s|$T$f fT$v@gfffvщ)C鉟@ȉT$$)$i$)D$) 6L$4l$\l$F9rJv'WVSD$t$|$at a1ۅt\@ 9w\ËO19sD|$D$Df f$',$\l$B9rY[^_É렐t&VSD$t$T$at 1ۃ at\H@@89wJ19s<|$D$Hf f$t&,$\l$B9r^[^É벍S\$t\( $o$\o$k $$a$X$$[ÐT$\D$,1T$@t$ t$0L$D\$\$4|$$|$IO11=v"t$۸uD$$L/$ht$T$HÉ|$t$ L$Dl$T$ t$L$$ƃ:11f811ƃ;ƃ<ƃ=ƃ>ƃƃƃƃƃƃf6f}ƃ}ƃ}ƃ}ƃ}ƃ}f}f},[^_]1UR,$ &=w1$|/1띐UWVS,\$@L$Dt$T|$P l$HXt$D$Lsl$T$|$t$ D$ $t$t$LM|$ T$X$akt$ $T$t$|$cT$ (a,$D$|$ 2%L$z?T$$tHpD$\ol$F|$ L$T$$l$ouD|$ EcL$T$$l$ |$(L$ T$D$,$|$1ɉL$$11ɺf6-1o=@f1T$,$1D$ƃ}11ƃ}1ƃ}ƃ}ƃ}ƃaf}T$Lf}1f}1ɉoPo1퉻o lobl$<$D$ a11҉a1ƃaƃ\`d,[^_]ÐÐ&'Ð&'Ð&'Ð&'Ð&'Ð&'Ð&'Ð&'Ð&'Ív'1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð $ Ð D$t$ Ð&1ÐSD$u[É$$[Ð&SD$u[É$$[Ð&S\$D$\$$D$C$@;C(CɉC$C t[C8[ [ÍK$1R`Q,$=\CdK[ʞSSsI؋C0@;C C0rC,C8t&'C$C8K K[ÍC4t(Cw K0A;K K0rC,C8C,C0S9S,rC8뒉WVSD$(\$ |$$[[ NT$\$ $D$ C$@;C(CɉC$C uK$1RQ,$=hCpC l lCSʞSrMڋC4CK0A;K K0C,C8C8[^_Ð tڞw/K4t( sC0S,B;SS,Q؋K0A;K K0rC,C8C$C CC,C0S9S,rC8ʍv'S\$$C,C CCCC0C$C8[Í,\$\$Dt$ t$0|$$|$Xl$($4ŋT$\D$@,$L$D$>f fD$L$8Q$̃l$<\$l$>T$ \$$(0l$<\$8l$>D$81)ЉD$ ҃-T$D$S4|$>D$>f fD$L$8Q$D$ l$<\$l$>$T0l$<\$8l$>ɋD$81)ЉD$ -D$S8/s8)K,t$TD$PD[^T$1JvR @9wÐS\$KC(S8ыPt1҃K,vC$B9w[ÉS1\$ SvK t&'@9wC(K8ʋHt1ʃS,vK$@9wC11C0-T$ L$D$$(0C411ɉT$ -L$D$$T0ST$ [<=\$,\$Dt$0t$@|$4|$Hl$8l$LCpN8F8)V,D$$/@lHNFD$$0^$F V8Nщ1ǍyD$$|$$ ^$F$$4l$ùc|$ `$L$T$D$ ^\$,t$@|$4t$0l$8<$0&<=\$,\$Dt$0t$@|$4|$Hl$8l$LCpN8F8)V,D$$/@lHNFD$$0^$F V8Nщ1ǍyD$$|$$ ^$F$$4l$ùc|$ `$L$T$D$ ^\$,t$@|$4t$0l$8<$0&LD$T\$<\$Pt$@|$Dl$H9Ct1~:(=C\$띐VSt$^D^H^LVP^t^xF| .@RVT$X[^Ív$$^Hdt&$$^LOt&$$VP:t&$P^t-'$$^xt&$$F|t&$v'$v'$v'$v'$VT$X[^Ð&VSt$^D^H^LVP^t^xF| .@RVT$Z[^Ív$$^Hdt&$$^LOt&$$VP:t&$P^t-'$$^xt&$$F|t&$v'$v'$v'$v'$VT$Z[^Ð&L$Q@BhЃÐv'S(\$0{,t]=wYKAD$S1T$K1҉D$ T$L$L$CD$C,C0C4C8([$ 뙉S\$CDxt[Ã=w$C4[$ CDۍS\$CDxt[Ã=w$C4[$ CDۍS\$CDx t[Ã=w$C4[$ CDۍS\$CDx t[Ã=w$C4[$6CDۍS\$CHu=w$C4[É$ CH$C4VS$\$0{,=C,C0L$SL$CL$uo$<6C1ҋHT$t$ L$C t$D$KH $C4SH$C @s 4$1$[^É$6돉$6?=w$6봍VS$\$0{,=C,C0T$sL4$SL AH@P$us$(7K1ҋAt$ T$D$K D$L$SH$C4sH4$K AC $1$[^Í$p7닉$7/=w$7밍S\$ {,tP=wLC1ҋHT$1L$D$ K T$L$CH$C,C0C4[$ 릐&'S\${,t2$8C,C0C4 T$CL$[Ðv'<\$0\$@t$4t$D|$8{,t:t$L$ {|$T$sP4$\$0t$4|$8<ËC8tD$T$,T$D$ {<|$L$SP$C8H.T$(T$|$ C|$(9sA9r^=SP$tC$|$&L$&f fL$$l$$T$ l$&|$ W$ʃl$$\$l$&l$$\$ l$&D$ 1)ЉD$ [$$88Ƀ-L$$`8Pv'U1WVSPÐVl S\$ L$t$$C4$D$4$S~ T$D$4$K T$L$4$ CL$D$4$S T$D$4$K8T$L$4$ CL$D$4$S T$D$4$K( T$L$4$" C$L$D$4$S,6 T$D$4$K0O T$L$4$g C4L$D$4$S8 T$D$4$K< T$L$4$ C@L$D$4$SD T$D$4$KH 9T$L$4$ CLL$D$4$SP T$D$4$KT T$L$4$% CXL$D$4$S\; T$D$4$K`S T$L$4$D9CdL$D$4$Shl T$D$4$Kl T$L$4$ CpL$D$4$St T$D$4$Kx T$L$4$ C|L$D$4$T$D$4$T$L$4$6L$D$4$TT$D$4$rT$L$4$L$D$4$T$D$4$T$L$4$L$D$4$T$D$4$T$L$4$L$D$4$h9T$D$4$9T$L$4$%L$D$4$<T$D$4$FT$L$4$XL$D$4$tT$D$4$9T$L$4$9L$D$4$9T$D$\$4$L$[^Ð&S\$$@xu[É$D$[Ð&'S\$T$$@xu[É\$D$[v'S\$T$$@xu[É\$D$[T$1J(yA BABAB 1yBBBBB A\BA`BAdBBÐ&L$1T$yJ(A BABAB 1yBBBBB A\BA`BAdBBÐt&L$1T$yJ(A BABAB 1yBBBBB A\BA`BAdBBÐt&VS$t$0=v,>tD$$= ^\$V$ :T$FD$N$T:L$^$:\$1V$T$=V |$"D$"f fD$ l$ T$l$"L$Q$ʃl$ \$ l$" l$ \$l$"D$1)ЉD$V \$$:-L$C^$[^ËF$D$=F @P$|$"L$"f fL$ l$ T$l$"\$S$Ƀl$ \$l$"l$ \$l$"D$1)ЉD$ N AQ$$:҃-T$='~  tD$$; D$$ Ív' D$$ Ív'SL$yt[ÍvY tR9uAA [A[Ív'D$xtÐt&P t@@ Ív'SL$y t[ÍvY tR9uA A [A [Ív'D$x tÐt&H t@ ÐL$ $t$q NR)Ѓvwqމ؋t$$Y؋t$$Ð&L$ $t$q NR)ЃvwYt$؋$qމ؋t$$Ð&$\$ t$K IR)уw&u+u8(tKv'$t$Ívs$t$1$t$Ã$\$ t$K IR)уw&u+u=(ts $t$ÍvK$t$1$t$Ðv'S\$C v1s@C<S$D$SK81ȉC8tڃ[ÐSL$\$C$tC[ؘÍt&C[Ít$t$ \$|$FF w$F1ۃ=w؋t$\$|$Í&$8;؋t$\$|$F1FN yR)Ѓqw^uF1ҍNF T$ $FWF~ OR)уw$@p(t NٹR9F F FN I؋t$D\$@|$HLËF_ FxFxV@t1뢋Nl $D$  \$ |$8\$|$Nl $\$8f^l$D$ D$|$0|$D$^l$~\$0%= VCNtF(FtV,T$~t<$Nt $D$Vt$~C1FHX D$Nl $D$~l<$yNl $D$ D$|$2|$D$Nl $~\$25NlFrHFP~C^L$|$~||$VCNxD2{1ȉFxD2{|$^p$N؁_ R9Vt =F$(>D$4L$D$L$Vl$\$m\$4CNyR)Ѓw^@ = 1VLFD$$FxNyR)Ѓnw ~@߁F~C^L$|$~||$VCNxD2{1ȉFxD2{|$^p$N;N$3R9VtoL$1$d>F4Nt1F 1FFAFFVt1Ft$D$Nt $VC1cL$\$6\$L$Fl$T$\$62^l$D$(.L$(|$<|$L$^l$~@\$<$>@T$FH D$~l<$L$Fl$4$N1؉L$$t<F E4$N1؉%L$$> FNtFt$T$~t<$Nt(S4$N1؉Ft4$؋F;D$$>FFN4$4$؋F;6D$^l$D$$T$$|$:|$T$^l$~@\$:$?@D$FF ^<3~CFL$|$~||$VCNx\2{1ˉ^x\2{|$Fp$fD$>؋F;[N(tV0t ~4qVH~<D$$L?F1~LD$<$~CNL $|$~||$VC^xD2{1؉FxD2{|$Np $N؁71R9Vt=Fj$t?z1|$~L<$V@ȋ^x1مɉNxtڋ9V!F1t$<$NV@~x~xt1؍AL$$<F 4$N1؉|= ~tFVt$L$Ft$~t(1񉆰 4$~tFN1҉~t<$|$Ft$VC1ND 9NF=F NtVt$|$Ft$Nt(1^CFL$\$^|\$NC~xT1{1VxT1{\$Fp$V$=T$^lF;\$4wHFP~$=|$\$6F}Vl$D$,|$>\$,|$\$Vl$D$>^@~@D$~|NL|$ $|$D$$D$Vl$D$~|FL|$$|$T$ T$^l$;D$~|NL|$ $|$T$T$Fl$ED$~|VL|$$|$\$\$Fl$1ҋFL $L$~x1vA1ҍ^L<$|$V@Nx1ȅFxtڋND$~|FL|$$|$T$(T$Nl $L$$?7D$~|FL|$$|$L$,L$^l$=FZ$?j=<$x=L$,@L$$d@T$L$$@F4~t111҉F FFGNtFCFF(L$$@NCVtFF(Ft~,|$Nt $FtD$$>FHD$Vl$L$Fl$=7$x=&D$$AFN8%F$N$;L$=_$x=N&WVSt$ \$$D$4T$(F |$0FDD$,f^@وVBVCF\$^LF@D$Np $$1҉T$Fx^t111F(F<F,F0F4FFF ƃ(Ft^t$L$Vt$1t4$Ku[^_ÐVSt$=wrIv =^F^ ^uhIu. $ $X[^$A뀉$$ $ $X[^É$$놉$$j&$Kv$$($$$@A&'VSt$=wrIv =^F^ ^uhIu. $ $Z[^$A뀉$$ $ $Z[^É$$놉$$j&$Kv$$($$$@A&' $lA$A$A=wQ$ B$X@BL$$B=w ÍlAD$ $lA=v$]zT$D$=o$lA^&'UWVS$1D$~4$TGÉ\$$41[^Ív$uV,`$$\$$|$.\$ D$$\$.f f\$,D$$l$,\$(l$.L$(Q$l$$l$,\$l$.T$$Gl$,\$(l$.D$(1)ЉD$ \$$-D$|$.D$ \$.f f\$,D$ l$,\$(l$.L$(Q$l$ D$l$,\$l$.$Hl$,\$(l$.D$(1)ЉD$ \$ ҃-T$|$.D$ \$. $hHf f\$,l$,\$l$.N,فl\$ I$HN,L$$|$.D$.f fD$,l$,ZLl$. $Ht&VSt$4$'^<N<` rDHPT\$$H $$Fl$Z[^Ðt&$$$$$$$$^t&$$$$<$$ $$D~$Htv'$Pbv'$TPv'$\>v'$'VSt$4$'^<N<` rDHPT\$$H $$Fl$Y[^Ðt&$$$$$$$$^t&$$$$<$$ $$D~$Htv'$Pbv'$TPv'$\>v'$'S\${4tH=wIC4C8KCDQC80S,CHh|[Ðt&$PI멉VS4t$@~4t>F4$pIV,`xu11=fw4[^úIT$@4[^$$\$$|$.\$ D$$\$.f f\$,D$$l$,\$(l$.L$(Q$l$$l$,\$l$.T$$Il$,\$(l$.D$(1)ЉD$ \$$-D$|$.D$ \$.f f\$,D$ l$,\$(l$.L$(Q$l$ D$l$,\$l$.$ Jl$,\$(l$.D$(1)ЉD$ \$ ҃-T$|$.D$ \$. $HJf f\$,l$,\$l$.N,فl\$ N$lJN,L$$|$.D$.f fD$,l$,ZLl$.S\${4=C8CCDC4PKHS,h| K tPuɃ!OG $D$\A$G,ـ(؊\$XW0G $\$8ȉt$47D$Xt$0GX l$(ӉT$,< (t$$<t$\(D$ <\$<T$ot$\$ l$<L$D$$W,H HDk(s,Ƈ=}$G<& @$t$t~!ۃ!_<4H= G8ow,GDUG4OHh|GFL$ \$T$ T$L$ \$ L$\$T$T$L$ÀL$T$T$\$L$L$T$T$L$ $$T$T$T$ $9L$T$T$ D$ T$ <D$T$$  T$ L$ D$ T$L$D$\$ T$ L$ [^_]Ð&D$@@@@Ð&D$11@@@@ Ð&D$11@@@@ Ð&D$11@@@@ Ð&U1WVSt$$v0@~V9T$D$\$ L$ T$ D$ \$  L$ T$ D$ \$ L$T$D$\$ $vD$)T$D7GL$ \$ T$T$ L$\$ L$ \$ T$ T$L$ ÀL$T$ T$\$ L$L$T$T$L$L$T$T$T$T$$9L$T$$$T$<D$T$D$  T$ L$ D$ T$ L$ D$ \$ T$L$11ɍ|51l A)1)Ãv1[^_]Ðt&D$T$ Ðv'V1S\$CD$CDJ$wC:KK9fC$C;ҀшKS=KC?t&J܉DB1vCNCOT$!ɈS1҈L$E~9P@|$!4S4v$DACvS C`Ev$DATvS CqVv$DAevSƃg$DAvvSƃx$DAvSƃ'$DAvƃD@=vƃ1v'@~|$!暍9L$ T$D$L$T$D$L$ T$ D$ L$ T$ D$L$T$D$L$t&T$)D$ L$DFT$ T$L$L$T$T$L$#L$T$L$T$L$T$L$T$L$T$L$T$L$L$T$T$T$T$$9L$T$T$T$D$6D$T$D$  T$ D$ L$ T$D$L$T$#D$L$T$ LWLBvƃ vD@9w$[^_C9C:D@CvC`1 @~D$T$L$ D$ T$ L$ D$  T$ L$ D$ T$ L$D$T$L$$')T$D$L$ DFT$T$ L$L$ T$ T$ L$"L$ T$ L$ T$L$ T$ L$T$L$T$L$T$L$L$T$T$T$T$$DL$T$$T$$7T$D$T$  L$ D$ T$ L$ D$ T$ L$"D$ T$EL$LBTvECaED@9w$[^_Àl$DL$C9C: C9C:C9C:t&VS\$t$D$t Hftt1Cu[^Åt0C쐍&'$$$1$$$CSC9C$l$$=vsC D$K$XL$=vNST$s $Yt$=v)st$C$(YD$'$$$$ĜCCS9{ =C:Cu$SCCCC F L5Kl$P 1Bu0{ CCCCCCKC<LҀ⚈T$8Eʈi1҉Ɖ9>VшC$$$$ĜSLˆT$O8ˆD$9t/T$OS.C"$a1v'@~C<D$:暍9*L$JD$IT$HL$GD$FT$EL$D D$C T$B L$A D$@ T$?L$>D$=T$<L$; T$I)D$JL$HDFT$JT$GL$IL$FT$HT$EL$ML$GT$FL$DT$CL$ET$DL$BT$AL$CT$BL$@T$>L$AL$?T$?T$=T$>T$<$9L$@T$=T$;T$D$?  T$A D$B L$C T$DD$EL$FT$MD$HL$IT$Jl$9D$N1ɍtt&l A)1)D$Nv|$Nu)L$OCKWl$8DL$8|$9ov1t&'@~|$:暍9D$7T$6L$5D$4T$3L$2D$1 T$0 L$/ D$. T$- L$,D$+T$*L$)D$(T$6)D$7L$5DFT$7T$4L$6L$3T$5T$2L$KL$4T$3L$1T$0L$2T$1L$/T$.L$0T$/L$-T$+L$.L$,T$,T$*T$+T$)$9L$-T$*T$(T$)D$(6D$*T$+D$,  T$. D$/ L$0 T$1D$2L$3T$KD$5L$6T$7l$9D$L1ɍt'l A)1)D$Lv|$LuyL$OCK=$LYnES5Kl$P 1Bt:u0CCC=C$xYl$$=S T$s$Xt$=KL$k $Yl$=L&1D$KL$kl$ST$ si` D$ $YL$5l$ST$st$CD$ Ki` l$$YT$5v' T$=w Ë L$$4ZD$ Ð t$t$\$u/(uM$F4$\$t$ É$$(t&'$$$F4$\$t$ Ðv' t$t$\$u/(uM$F4$\$t$ É$$(t&'$$$F4$\$t$ Ðv'D$1҉Ð =wD$1ɉ Ít&$XZD$1ɉ Ít&D$T$P4T$D$t&t$t$ \$N( ƒu t t tt u"t&$Z^4${t\$t$Í&N,$ZL$F(F,F0\$t$ÍS\$D$ $$D$[v'T$B@tBBÐL$Q @8ÍD$VÍt&L$D$t71҉ v!H,98) t1҉ɐt&S\${(t$ZC(C,[ÐUWVS\\$pT$x$$$=T$@$D$< ƃ$L$tf$C0$Kst$t$D$|S,C(nT$@$fCD$@1ҍC$1KD$4${ t<$k$t,${$<$1퉫1<$D$ 1)ʉ$4d$hL$lT$hA`ل$\$ CD$k $l$fss+Kuل$\$ CD$s $t$fS+KUل$\$ CD$ST$ $fSKɉ$$1)щ $4$$$A$\C0:C?Cik,4R9C$C0D$@hC0 C,D$4C0C(>CfC0 ClCJC0C( C,T$PCCJC0C}CufC0 }C0 e1)ʼn,$f)1)ʼn,$f)1)׉<$f)k$,$,$n,$M$fи)ИKC$$$1) $4$$$At$aC034$C,T$HC0C(z34$$ftK @8C,D$TC( +,$C,D$,C0C(+,$$ftK @8C,D$8C(n { w S Fل$‹T$<\$ KD$$L$fES3҉t$ts1)ʼn,$4t$tFS|KCL$`T$da1) $4d$`L$dT$`ApD$ T$Dl$t$$K-1)lj<$4D$ST$;<$ CL$DTC0=C(C0l$a[C($,bC0 S,K$4,|$0o|C0 S,$K$dbL$1)Չ,$}1)ʼn,$1)͉,$k,$bl$C(C,C0_K,$bL$C(C,C082 $C0C($i34$ftk @8K,$bL$C(C,C0虉1)׉<$fȸ)ȘL$$,cC0?=C( C,11ɉT$ 11k D$C4l$L$t$T$ kl$K$L$k$,$ل$L$0\$ C|$ $D$faS3҉t$\s,$4T$\B虉1)щ $fи)KsT$pT1)ʼn,$4t$pF虉1)Љ$fȸ)i虉1)Љ$fй)虉1)Љ$fй)ل$L$L\$ C|$ $D$fS3҉t$|s,$4T$|Ba$fи) s  D$XcCR1)Չ,$f)K3ɉt$xs,$4L$xAK1)Չ,$f)K3ɉt$Xs,$4L$XAs Vk($cx,$f)A,$f)r,$f) ,$f)Q$c(&ټ$$ل$$$f f$٬$ߜ$٬$$$$$C,C(!w $TC0$$$$Ĭل$C0\$( $tC 9s,r$\C0:ل$C0\$(,$X{,[$\C0;C(C( 1C,C0:$|a$\C0:ل$\$ CD$KL$$fwKS҉D$lL$h9 1)ʉ$4d$hL$lT$hArل$\$ CD$ST$ $fSKɉ$$ 1)щ $4$$$Axل$\$ CD$s $t$f S+KUHل$\$ st$C $D$fpS+KUل$\$ kl$s $t$fSKPhل$\$ st$k $l$fSKPF{l$t$|$ $CCVC9C0 k,4R9ACgCCfC0 C0D$@CC CaC0C( C,T$P/CfC0 C0 C,D$4C0C(&ƃ$Js 91)׉<$f)1)ʼn,$f),1)ʼn,$f),$,$$fи)ИKC$$1) $4$$$A9+,$C,D$,C0C( $aC0 K+,$$ftK @8C,D$8C(e34$$ftK @8C,D$TC( &KCL$`T$d1) $4d$`L$dT$`AD$ T$Dl$t$$K1)lj<$4D$ST$;<$ CL$D @ل$‹T$<\$ KD$$L$fS3҉t$ts71)ʼn,$4t$tFS i34$C,T$HC0C(zC0 S,.KW$4,|$0o,=C(C0$pdvC($,bC0C0 S,K$dbL$"1)Չ,$1)͉,$\1)ʼn,$C,$bD$C(C,C08k,$bl$C(C,C0o$ $C0C(34$ftk @8K,$dL$C(C,C0ل$L$L\$ C|$ $D$f3S3҉t$|s,$4T$|Bs 4$虉1)щ $fи)ل$L$0\$ C|$ $D$fLS3҉t$\s,$4T$\BR虉1)׉<$fȸ)ȘKsT$p1)ʼn,$4t$pFF虉1)Љ$fȸ)FL$$,cC0=C( 6C,11ɉT$ 11k D$C4l$L$t$T$ kl$K$L$虉1)Љ$fй)a虉1)Љ$fй)cs  D@$fи)$XcCYs Vk(1)Չ,$f)1)Չ,$f)PK3ɉt$Xs,$4L$XAK3ɉt$xst;,$4L$xA,$f)M,$f)$d,$f)Y,$f)4$ct& D$T$HtT$$ ÉT$$ Ð< T$H\$,\$@1ɉt$0t$`|$4|$ll$8l$DD$ 1L$1ɉT$SP$L$ l$D$|$t$t$/$t$(0 $k T$LD$Hsl$Pt$X;L$\|$TT0T$dCD$hk{X04S5\$,t$0|$4l$8<Ð&'< T$H\$,\$@1ɉt$0t$`|$4|$ll$8l$DD$ 1L$1ɉT$SP$L$ l$D$|$t$t$/$t$(0 $k T$LD$Hsl$Pt$X;L$\|$TT0T$dCD$hk{X04S5\$,t$0|$4l$8<Ð&'S\$(0$/P$$[ÍS\$(0$/P$$[ÍD$T$PT$D$S\$C$$eD$C C$[ÉS\$C$$HeD$C C$[ÉS\$C$$|eD$C C$[ÉSL$\$ S/(0 $D$$ T$D$[Ð&'t$t$ D$$\$/$D$1҅u\$Ћt$ÍS$$eT$F F$F(uF8F<\$t$ЃÐD$@8@<@D@H@0Ðv'S\$T$(0$T$1҅u [Ít& 0$eL$$fC C$C([Ðl$l$ \$ t$]P|$$u$1Ћ5)N𺫪R)f\t@1)ˉ$45,4k\$ l$t$Nj|$É1)É$fи)И뷐&Lt$Dt$P\$@|$HF F$\$TF($F \$T0<$59F$u'=T0fv$u4$1D$Ku鐃 [^_ËNl몋N $N V^4$l\$dD$1ɺÐ&Ð&'Ð&'UWVSt$0l$\$4F$~nD$|$(6L$$$V KT$D$l$`|$~$$NtT$L$l$Fn$$D$|$L$$$V T$D$l$|$~0$$N( mT$L$l$F,n8$D$|$L$$$V4T$D$l$Dm|$~D$$N<(T$L$l$F@nL$D$|$>KL$$$VH[T$D$l$hm|$~X$$NPlT$L$l$FTn`$D$|$L$$$V\T$D$l$|$$$NdT$L$l$Fh$D$|$L$$$T$D$l$ |$$$T$L$l$$D$|$%3L$$$?T$D$l$M|$$$ZT$L$l$$D$|$fsL$$$~T$D$l$|$$$T$L$l$$D$|$L$$$T$D$l$|$$$T$L$l$$D$|$L$$$,T$D$l$C|$$$WT$L$l$k$D$|$L$$$T$D$|$l$$|$mL$$$mT$D$l$|$$$T$L$l$ $D$|$L$$$ T$D$l$|$,$$$-T$L$l$(4$D$|$@QL$$$0cT$D$l$u|$@$$8T$L$l$<H$D$|$L$$$DT$D$l$|$T$$LT$L$l$P\$D$|$mL$$$XmT$D$l$n|$h$$`DnT$L$l$dp$D$|$hnL$$$lnT$D$l$-|$$$tIT$L$l$x$D$|$ncL$$$|nT$D$l${|$$$T$L$l$$D$D$l$|$$|$nL$$$oT$D$$0oT$L$$ToL$D$$xoT$D$$T$L$$oL$D$$T$oD$T$l$oL$$|$pT$$l$lp[.x[-?.|"-.,-... ..ٕٕٝٝ.= 1(0_p0X}/w̫1R3Yـ3$(w+3,w+20 WN18w̫2V34Y3<Yـ2_p 2 333?@DHLPTX\`%d%hKl$tHpL?t>x|@F1ɉF1ɉEEE0AvE EaEzE@EA Aٕ`XBQU 0 ..X XDH LPT]X.\1҉`hlR>?pt?x |q=?1҉11 B@B14CA1 ?ٕٕٕٕٕٕٕٕٕٝ BHC @E$zC(?,?048` <` @` D HLPTX \$`qdhlpt CxC|@u?1ۉ=i$9()8X,0` 4,<X@Xu,X y?1` 1҉11ɉ11҉u dٕH111ɉ11 11҉11ɉ@ 1$1҉(1,1ɉ048<@DٕLٕPٝT[^_]Ã=3L$ i` i` $|\$L$G$8}v'VS$t$0X@$p}\$عR$ ٖ|$"\$"f f\$ l$ T$l$"L$Q$ʃl$ \$l$"l$ \$l$"D$1)ЉD$ ؞$}҃-T$SP$}Ӄ\$t^YH$}\$~ t(BP D$$0~$[^Ív^ BP D$$0~$[^Ð&S\$$@xu \$[$D$\$[S1Ƀ\$D$$@xu\$[$D$\$[S1҃\$D$$@xu\$[$D$\$[L$1Q zBAB AB$A 1z(A Ð&'T$1L$zQ BAB AB$A 1z(A Ðv'T$1L$zQ BAB AB$A 1z(A Ðv'VS$t$0=v,>!t!D$$!=V1$!T$=V|$"D$"f fD$ l$ T$l$"L$Q$ʃl$ \$ l$" l$ \$l$"D$1)ЉD$V\$$x~-L$C^$[^ËF$!D$=F @P$|$"L$"f fL$ l$ T$l$"\$S$Ƀl$ \$l$"l$ \$l$"D$1)ЉD$ N AQ$$~҃-T$=g~  "t"D$$~B D$ $ Ív' D$ $ Ív'T$D$Ðt&L$ $t$qNR)Ѓw$ Y'؋t$$ÍvA؉؋t$$Yt$؋$A׍&'L$ $t$qNR)Ѓw$ Y'؋t$$ÍvA؉؋t$$AYt$؋$Í&'SL$yt[ÍvYt989uAۃY[ËA[Ð&SL$yt[ÍvYt989uAA[A[Ív'S\${ t[ËCt􋓌t C [ÉD$$~C CC[ÍV1St$ VFv ;~Av[^Ðt&WVS|$$t$ yVT1GȃFU_^V DD2WB9w1҃t&2B9w1% $4Љ$f^xCwCINTXu ʉ $f^xCv1ۀ~Tu2fʉ $VTf^C9v6Fu$VTf^C9wЍƆ1ۋ~1ҍ ƆƆ;~Bv[^_FT[^_ÍWVS\$ sffKC$4:SVD$\$ T$€|Wu:CUA ;XtgL$[^_Í&s $cSx t&1҉ƃƃ:CTtM1ɋSC  ;4~Av[^_ƃ밍S1ɃL$\$C $S@1ЅC@S uڃ[ÐS98\$KICD)C $T$S@1ЅC@S uڃ[SL$\$C $tC [ÍC [ؘÍt&\$\$ t$|$CCw$ C1=w\$t$|$Í&$,\$t$|$ÉC1\$t$|$CKyR)ЃM$ Cs98N ҋSD)΍K 2 $D$S s@1C@uڋK<9CCCK98ICDs <)4$T$S {@1C@uڋC1R1PK,$WQ,$C C$PqCs T$4$C {|>:CDC1fCK@KyR)Ѓ$ Cр/CffKC$4:SVD$\$ T$€|Wu:CUA ;XL${@9{CC$tC1ɍ{ L$<$S s@1C@uڃ{ {T'C sCsCKff}K$4:SVD$\$ T$ʀ|Wu:KU ʋA;XL$S$~T$C CCes0CIsCs%CCCCsSxs $AC hs$~sx1҉ƃƃ:CT1ɋSC ;4~Av1҉ƃƃ:CT1ɋSC ;4~AvC1K CC|$ $=Ci$XC$@ƃXƃS98\$KICL)C $T$S@1ЅC@S uڃ[S98\$KICH)C $T$S K@1ȉC@uڃ[Ã\$\$ t$|$CCw$$ C1=w\$t$|$Í&$,\$t$|$ÉC1\$t$|$ËKyR)Ѓ`$d CK98sLI)C $T$S s@1C@uڋK<9CC CK98ICL{ 4)<$T$S s@1C@u1ҋKRQ,$C C$Cs98N ҋSH)΍K 2 $D$S s@1C@uڋK<9#CCC C1ɍ{ L$<$S s@1C@uڃ{ {T]C CCKffK$4:SVD$\$ T$ʀ|Wu:KU ʋA;XL$S$~T$C CCCKyR)Ѓ$| Cs T$4$C {|>4CHC1fCK@CK98ICHs <)4$T$S {@1C@uڋC1R1PK,$WQ,$C C$4wCрdCffKnC$4:SVD$\$ T$€|Wu:CUA ;X.L${@9{CC$tbCJC&Csss0aCCCssxs$mC ps $Sx1҉ƃƃ:CT1ɋSC ;4~Av1҉ƃƃ:CT1ɋSC ;4~AvC1K CC|$ $=Cd$XSC$;ƃƃLt& D$t$ Í$ ÐU1WVS,t$@T$HD$\$DN $l$P|$XT$^T$`FD$LFVF\$$fF FD$T$$fFN$fFF@|$T1t T$T$FD\$\4$\$&,[^_]L$ $fF FPD$\$$fFNP$fFF@PtS<$FH<$FL4$\$\\$V4$KA.u4$FHFL볐Sc(T$ \$0D$L$S $D$41ҋL$8CP1 1ɉT$ 1҉D$1L$1ɉT$@D$1$L$ T$D$([Ðt&Sc(D$ \$0L$T$C $L$41T$8KP1ɉ1҉D$ 1L$1ɉT$1҉D$@L$1ɉ$T$ D$L$([Ð t$t$\$/u^DuVX$\$t$ É$$VX$\$t$ É t$t$\$/u^DuFX$\$t$ É$$FX$\$t$ ÉD$11ɉ//@$@(@,@0@4@ ÐT$D$Ðt&L$ $t$qNR)Ѓvwq<މ؋t$$Y<؋t$$Ð&$\$ t$sNR)Ѓv$w#s<$΋t$ÍK<$ًt$ÍS\$ C=Cw[CST$/L$CT$//KTR1;C/[ËC$D$됍t&SL$YKR)Yh/[Ív'SL$YKR)Yh/[ؘÐD$1ҋHT@0@ @@A1ɉ//Ðv'SL$YKR)Yt/[Ð&SL$YKR)Yt/[ؘÍS\$ {t[ËKt1҉`/t C[ÉL$$ĀCSDCJ d/[Ív'S\$ /u{t[ÍvK1҉/t C[ÉL$$CSTC$/L$CT$//KTR1;//[ÐT$BT@Ít&S\$ SBvJv/u t [ËK1҉/t C[ÉL$$CSTC$/L$CT$//KTR1;//[Ð&L$AT/@Ð&S\$C/CtSK uLCt$|Bw:K1҉/t.C K1҉/tC C [ÉL$$ĀCSDJC d/čS\$ STBC uK1҉/tC C [ÍL$$ĀCSDJC d/뿐v'S\$ CC Ctr/t0K1҉/t\C|IwAC 1KT/1AKTC/tBC C [ÉL$$ĀCSDJC d/C /CC  $D$//KTR1;/[C kS\$ C uqK1҉/t Ct]|VHwNC 2t&L$$ĀCSDJC d/C [C ߉S\$ S uK1҉/tC C [ÉL$$CSDJC d/ō&'S\$Cw-Kt&R9tCv'[ÉL$$DCC[Ð&S\$ SBw2Kt&R9tBCv'[Ãu/uK1҉/t/C[ÉL$$DCC[ÉL$$CSTC$/L$CT$//KTR1;//[ÍS\$Cu1Kt*R9tC&'[ÉL$$hCC[Ð&T$D$PÍt&S\$ {t[ËKt1҉`/t C [ÉL$$C\/CL$CH$X/\/KHR1`/[ÉST$$\$ t0C8T$D$KD $T$$CDD$ [=w[û\$ [VS\$t$C8Nщ$fh/K8‰$fj/S8$4ȉ $fl/C8щ$K8fn/‰$S8fp/4$fr/X[^ÉV‰$fh/K8 $ȉ $fj/S8 щ$fl/C8 ‰$K8fn/ $ȉ $S8fp/ ‰$fr/X[^VS\$t$K8V‰$ft/S8$4ȉ $fv/C8щ$K8fx/‰$S8fz/$4ȉ $f|/C8щ$f~/K8V‰$S8f/$4ȉ $f/C8щ$f/K8‰$f/S8$4ȉ $f/C84$f/X[^F$ȉ $ft/S8щ$fv/C8‰$K8fx/$ȉ $S8fz/щ$f|/C8‰$f~/K8F$ȉ $S8f/щ$f/C8‰$f/K8$ȉ $f/S8щ$f/C8$ȉ $f/X[^ÐS\$ D$L$D$L$SD$D$u D$[ËS$T$CCD$[S\$ D$L$D$L$SD$D$u D$[ËS$ T$CCD$[Ãct$t$ T$ VX\$\$,|$|$$D$L$$/D$T$D$T$ND $\$0\$>,~_R)^h/ڃ$T$F~8F|$FPD$ND $$0VP$~P7$dt$~OR)Ѓw ~<X^D$D$, L$HT$,L$T$^D$~\$H~F N1҉`/Ft&ND $D$0L$0\$J\$L$~D<$\$J1ҋN`/L$$FF\/D$NH $X/\/~HR1`/5ND $D$8\\$N|$8\$|$ND $~|>\$NVHN|>ND$+"~t."D$$:~D<$D$4D$LT$4D$T$~D<$\$Lv~_R)Ѓw ^<ك6FF$1VXD$$~$ |$\$>FFN<N<^<)\/~xFX|$\$ X/$L$\/|$T$^D$\/~xFX|$\$ X/$L$\/|$T$^D$\/^xNX\$|$ X/ $D$\/\$T$~D<$D$^xVX\$$\$L$ L$~D<$D$^xFX\$$\$T$8T$~D<$rD$~xNX|$ $|$\$\$FD$\/~xVX|$\$ X/$D$\/|$L$^D$D$^xFX\$$\$T$$T$ND $=FF$ЃD$$FN8FL$~L|$FD$dt&VS$t$0FD$D$u&T$"D$T$D$ND $D$"$[^Ë/FX\$ ^x\$/$T$/\$L$VD$T$"D$T$D$ND $D$"$[^Ð&VS$t$0FD$D$u&T$"D$T$D$ND $D$"$[^Ë/FX\$ ^x\$/$T$/\$L$VD$T$"D$T$D$ND $D$"$[^Ð&|t$t$\$p|$xFFF w$ 1ۃ=w؋t$t\$p|$x|Ív$D؋t$t\$p|$x|1ɋNYR)Ӂ^h/u$,L$FFxN1ۿR9ZL$$DF뽍L$ \$V\$L$VD$D$  \$VND $D$$ \$$|$X\$|$ND $\$X^D$D$( D$(|$Z|$D$^D$~ \$Z$h T$FFF a~D<$D$, \$\L$,\$L$~D<$\$\F;d/V$t~,t N0 ~Li =FF$VD$D$0 \$^L$0\$L$~D<$\$^F;/D$$ĀFFDFP d/S~D<$D$4L$4\$`\$L$~D<$\$`1ҋN/L$$TF FFT$#~_R)^h/ڃ$|$FFPVTF~8;|$FPD$ND $$0VP$~P7$dt$.NYR)Á^h/$L$F\L$TT$L$T$~D<$\$\$T~_R)^h/ڃ$1D$FNT1FF0F FFA//?NYR)^t/ڃ$L$FFLNTF8;V( $/D$NT $//~TR1;/tVD$D$8XL$b\$8\$L$~D<$\$bN1҉/(L$^D$D$@GL$f\$@L$\$~D<$\$f1ҋN/FT$ ^D$D$D,D$hT$DD$T$~D<$\$hF;/zD$$؄FFFc^D$D$HML$H\$j\$L$~D<$\$j1ҋN/L$$F~TF<$/D$VT$//1ҋ~TI;//^D$D$L1T$lL$LT$L$~D<$~\$ltFN1҉/<4~T<$/|$VT$//1ҍINT;V@ 9V/F=FF $|$~T<$//NTR1;/~_R)Ѓ_w ^<ك;FF$ND $D$P\$n|$P\$|$ND $~|>\$nVT=FFqF N1ہ_ ~_R)Ӂ^t/b$,|$FNyR)Ѓw ~<߿R9L$$hFS~OR)Ѓw ~<VD$D$<!L$d\$<\$L$~D<$\$d&~$ |$\$VFF8F$D$\$TFF ^<N<NT$$FNT~( $/D$VT$//1ҋNT;/D$$FN8FL$~L|$VD$1NXD$ $A$T~D$$FV4ЃFF$D$NT!&' D$t$ Í$ ÐWVSD$$L$(t$ \$4T$,|$0F8^@FVF ȃ5$fF<1ɍVXL$$FF$F(F,1ۃ/11ɉF9/F0FFF r$t&4$C9su4$C9r[^_Éʃ$QL$(\$\$ t$|$|$$K$SƉ$T$3?$C{ CCC \$t$|$ÃL$(\$\$ t$|$|$$K$SƉ$T$3?$C{ CCC \$t$|$à t$t$\$uFu$\$t$ É$$Ftݐ$\$t$ Í t$t$\$uFu$\$t$ É$$Ftݐ$\$t$ ÍL$(\$\$$t$t$ L$\$$F 1t$1ҍ@FFFF \$t$Ít&L$(\$\$$t$t$ \$L$$F\$t$Í$\$ t$1KS9v&)р{ u.ȾR9t3rS$t$ÍvsȾR9u͋S$ʉt$Ív'T$$\$ t$1KS9v()ʉр{ u+ȾR9t0rS$t$ËCR9uЋS$ʉt$Ð<1T$Hl$8l$@t$0t$L\$,|$4}T$$D$ uB=\$ w"} tE D$ \$,t$0|$4l$8<$Ѝ\$(T$$\$}E xD$DL$ D$\$}<$D$(M}9E=T$ ]1҃vMQfVB9wEu1ۉ9vM&'QBfYC9w]19v9)ـ} tu񻫪h $[É$Ct׍$C tÐ$h $[Ðt&S\$,u!Cu5C u>h $[É$Ct׍$C tÐ$h $[Ðt&U1W1VS,\$@T$(t$DS,C;S$ffk DL$ k1)fh(D$f9TK0L$|(0IvvD$Gf9TC0|9wDK0LK2D$)1)ИD$$)1)f;T$$G|$( ,tH&T$fj({,CL$( C,{G R)ω{|$(f\$ t$ D$ ,[^_]Éf9TK0L$$0DD$Gf9TC09wt&$|$(1f\$ t$ D$ ,[^_]Ët$T$$D$(S,k蘉D|$(;4}5@&k DЉL$ 1)$1kL$|UWVS D$ $D$$fV(L$01f9ss,$'Lt>1RP,$T$،|$ D$ f fD$l$\J0l$ Kf9r؋$C<$fP؃=w [^_]Ë,$T$0It$ [^_]UWVS\$0t$8\$\$41Ή)1))R$D$׉MqL$l$TE.DE0)R$ v9D$4*ؙ1)S$؄ٜT$@;\$[^_]ËT$fW(u@l$0T$׍B9,L$Ti0Di2'L$0Cffy11҉t$ L$英fD$ fF(\$01f9svl$ &'Lt?1RP,$D$،|$T$f fT$l$\H0l$Kf9r؋|$ G߉\$ fJ؃=wm11 T$4$s\$މ|$f~ڍOfCD$뺋l$ L$0l$^$l$1xfvt&U1WVSt$0D$8^,D$w1[^_]ËV(B9Hh|$d\$T$ t&~T$4\$L$F $ЉD$~vCv'FL$4HȉD$L$F~(V É $CЉD$9^wNj^~(݋^,W V(9i19^V  AG9N,w~,F(t$.[^_]ËV 1ۅtD$4|&N(F L$ T$ $C9^ wۋ^~(݋^,W V(9_ D$$ Ív' D$$ Ív'S\$CCT$$C[Ít&S\$CCL$$C[Ít&ST$$\$ ҉t6CѸ11҉CCT$K$L$T$(S[C1ҍCCT$K$L$T$(S[Ð&W1VSt$\$|$Fv'T$t"~rtctDA9w'[^_À:AB9Nv:AB9Nwހ:AB9Nvu:AB9Nvtt A9vA9wBA9NvBA9Nw{v'UWVS t$ l$$FHUF1ɄӍ{N1Ƀ^wtv'\$~\$1ۉ<$NvDDC9tDn,$D$NՀ}~F1ɍ^vttjA9wq: AB9N^: AB9NwK\L$(\B9Vw [^_]À: AB9Nu: AB9NttA9A9wB A9NB A9NwVSL$\$S1Ct#DB9w1Ҁt(&B9w1Ҁt%t&B9w1ҍ4Bv1ҍ4 BvtItX[^$X[^ùTL$Z[^&'\1l$Xl$`t$P|$T\$L \$d1p9s" &',9}B9r\$LЋt$P|$Tl$X\Ðlt$`1|$p\$\|$dl$ht$ ~D$ \$\t$`|$dl$hlËT$p1ۉ\$D$tl$t&D$p|$T$ 1|$tH19sv'|9\}B9rD$|$pt$ \$;\$@LVL$ wD$ \$\t$`|$dl$hlÐ&'U1WVS\l$pD$ T$p1|$l$tD$t&D$p|$T$ 1|$tH19s'|9\}B9r|$pt$ D$\$@9\$LVL$ wD$ \[^_]ÐD$@@@@ @@Ðv'D$@@@@ @@Ðv'D$T$L$ JD$BL$J D$BL$JD$ BÐv'D$T$L$ JD$BL$J D$BL$JD$ BÐv'U11WVS|$D$l$L$}^t$t$|$hD$h$,$|$l$$\$hiD$`D$1,$؋D$`$|$\$tT$dt$dS t$1ЉT$Xl$|$\L$X$$1l$ΉD$P$$Njy <$D$tt$P\$TXT$T4$؉\$HL$HT$1$$|$l$L1T$D$D$@t$D$΋H\$D $|$T$tl$@,$Zt$Dt$؉\$0|$01$$L$44$$L$tD$(D$T$,l$,CT5$l$(1T$,|$t$,,$ЉT$t$1|$\$4$$$$D$D$T$l$Ë\$tōT5T$C1T$L$1t$\$t$7F9sw|[^_]ÐD$@@@@ @@Ðv'D$@@@@ @@Ðv'D$T$L$ JD$BL$J D$BL$JD$ BÐv'D$T$L$ JD$BL$J D$BL$JD$ BÐv'U11WVS,D$@L$T$hD$$-T$Dt$|$*1؃ ӉL$\$MyЋT$$1\$|$l$ $|$D$L$H1҉1D$$)t$(|$T$1ۉl$t$\$ <$t$L$$։1Q<$t$T$D$ l$H1ɋT$$E]j)1l$<$t$D$ \$$lj1ҋK1ۉ<$L$t$T$ l$HL$$EEQ)1l$ <$t$T$\$$1ɉ֋C 1ۉL$ ,$D$T$|$HG D$$W H )1L$|$ ,$t$׋T$$1Z4$|$\$D$ L$H1ҋ\$$AiC)1ɉ4$|$D$L$ l$HE,[^_]ÐS\$C(uC,u*C<$[É$C,tt&'$C<$[Ð&S\$C(uC,u*C<$[É$C,tt&'$C<$[Ð&S\$SD$>f fD$L$8Q$˃l$<\$l$>\$ l$<\$8l$>D$81)ЉD$ ؛$ĉ҃-T$=D$ |$>D$>f fD$L$8Q$ʃl$<\$l$>$ l$<\$8l$>D$81)ЉD$ ҃-T$=ك|$>1L$>f fL$<@@l$T$8R$ʃD$L$l$<\$l$>D$l$<\$8l$>D$81)ЉD$ ؛$Pۃ-\$ H[  $v$ك= (ٛ؃H[Ð&T$B|ÐS\$$C`#=SLSPSTSXS\ShSlSpStSxC|ƃ[ÍVS$D$HL$@\$0t$DD$T$u@ v'l$h\$`l$jD$`fSfQB9wT$$11L$ 1һt$41ɃT$0\$(\$vaE@D$,Nt$,D$(D$41)ЉD$0KD$$\$(1\$$);D$ ~D$ ;D$}D$A9w$؍|$jL$jf fL$hl$hT$`l$j\$`S$ʃl$h\$l$j tl$h\$`l$jD$`1)ЉD$ ؝$-1|$ۅ|$jT$jt$ f fT$hl$h\$l$jۅ$Ȏ-D$L$ $\$$|$jD$(|$jxf f|$hD$(l$h\$`l$jt$`V$l$(l$h\$l$jT$$8l$h\$`l$jD$`1)ЉD$ \$(Ƀ-L$|$jD$$\$jf f\$hD$$l$h\$`l$j|$`W$l$$D$l$h\$l$j$ll$h\$`l$jD$`1)ЉD$ \$$-D$$t$4t$$ԏL$0L$$\$\$1$@|$ |$}81ɃvcED0|$jD$<D$jT$@f fD$h&D$Eh4;xyl@4$[^_]f\$t$D$L$T$|D$\$ T$$$|$Tل$$\$qH4$$$yHG0YAd9N$$J`\$T$$l$pL4$$$YLC(Adu $ټ$ل$$t$L$$f )f$٬$ߜ$٬$ل$$٬$ߜ$٬$ل$٬$ۜ$٬$$$$Ә$v٬$٬$HuT$t1;D$Ls0$$D٬$B٬$@;D$Lr݋$$N`l$TD$$L$SL$SL$B(@Cd1$ $$L$ZP$$$FPf2$$\$FL$$1҃=iPAd#f $<$ۄ$$$L$LTf8Z$ٜ$߄$ٜ$ۄ$ٜ$t $1;D$Ls!$B$@;D$Lr싄$$D$VL$Fd%1=^Pf2 $,$ۄ$$D$Lf9ƍz$ٜ$߄$ٜ$ۄ$ٜ$t $1;D$L)$B$\@;D$Lrل$ٜ$$VLz lټ$$ل$f f$٬$ߜ$٬$$$D$$$SLB(t"$Ed>B Z$B9z B $T$T$K`ل$$\$JH $$$QHB0Ad $ ټ$$ل$f f$٬$ߜ$٬$$$8$MTt z8#$,$D$$ D$ $$SLz B$B zq$l$T$,$$WHr(Z,uQ$tH$Kn NDD$$~ nLL$$VHz(g$Hz({t z(gB(t# t t tt t tu $B(B( tc t^$$L$TN`|$yQ q)KY \LJu`$1ɋK`T$Tل$?-$1N`|$T$9 $D$$H $VLx$$$|$l$95 z IT0ft$fDz T0f$fF1fF4$ن ن<ٖ@=m ټ$$f f$٬$۔$٬$$S$ʃ$٬$\$٬$٬$ۜ$٬$$1)ЉD$ ؞@$@҃-T$$WL$>95$11$9$H{$94lh4$T$VHHDټ$$ل$f f$$9p^N$4$ ټ$ل$$$$f f$٬$ߜ$٬$ل$$٬$ߜ$٬$ل$$$٬$ߜ$٬$$$Ә$D$L)Ńv٬$٬$HuT$t1;D$L$$٬$B٬$@;D$Lrދ$SLt$$99$QHe$$nX}($u\4$|$WL$D}\$ $P\$><$$,$ټ$ل$$$$f f$٬$ߜ$٬$ل$$٬$ߜ$٬$ل$٬$ۜ$٬$$$Ә$D$L)ƃv٬$٬$HuT$t1;D$L,$$٬$B٬$@;D$Lr$T,$|$ULH11fD $؋$1ҋUL<$$|$4$|$4$VL-$~\<$/$VL$,$\$MXy($o\,$]$0$T$\$4$\$4$tF1L$D$$$X$UH$$T$0$l$L$D$34$$SH$|$$|$$,$$$,$D$,$\$$4UH$4$|$4$L$$VHM$$t$$,$|$$$SH$,$t$=vM$L$$PffR$ؿ$\$$$ $$VHH$$|$$D$SH $H$1ҋF vNB9w$t'1҃vfSfQB9w$t$l$:<$j1۾ƋH4$D$VH$>1҉\$T$$,$|$$ $t$$ ,$D$n$$t$SXz($^\$d$LP4$l$$H"L$t$(,$$PLG $t$$$UHU؋$UL.ً$ٕ@[$t<4$T$$UL$UL l$|$ $VL$4$\$XD$n \$$D$;<$SL%$$\$)$D$<D$,$UL%$\$,$\$͉F1L$D$$$Ę$QLLL$$+$4$L$8$|$SD$$\$ D$(؋K 1PQ,$|$T$f fT$l$|$l$D$C,l$|$l$L$K0T$C$$K0ɉL$$S(T$ [ldt&vDUWVS,t$D$#\$@t$fC$4(1ɉSS<t$$t$$C`k1Cd{ )HC t$ KsD$ &')DB9wG;D$sD$T$?14s8v(K@SD @9w틋1v&'fAfB@9wE1҃v fQB9w~1v;,'fFfAfB@9w'Cl1C|11ǃǃǃǃ`ǃ<ǃ@1ChCp\ـ|ـɉktCxfDfFC4s{؋K 1WQ,$|$&t$&f ft$$l$$|$l$&D$C,l$$|$l$&T$S0l${$<$K0ɉL$Ds(t$@,[^_]viOBKjWVSt$ T$@D$,L$$T$0\$(FHD$4VLT$8|$LFPD$<VTT$DFXD$HV F\ $Ft V $FF $F$N  $F(V8$F@F8$FD1ɉPtOx\$$F $N ɉ $V҉$^8ۉ$~8<$F8$,Q)QW)ꉖWy)y{){YP$)˃)ꉞ(1f]@F fUBfEFV$ՃflOHA ~fGf$$1h$f_bfod1D$L$Z$fD$L$Ś($l$T$,$1Ɂ¬fT$\$0,$D$L$4$1f1@1ۍ4$CfU~G~1f1P1ۍ4$CfU~G~ˋ$ff$fB@=~1$|$t9l$tT$|1҉T$x$$1\$L$t4$L$D$|t$xD$X|$X1flt&'$CfW~D$X"E~D$t$D$xD$|9l$t[$$$ ݈f$1$D$p9T$p$$l$p$$\$l$1<$t$pD$p$$$ƍ$D$ $?$Wu>$D$$>$MuA$D$$C$$"S T$DCD$@kl$<KL$8{|$4ST$0CD$,kl$(KL$${|$ S T$C D$kl$KL${|$ ST$"D$$`Nc$l[^_]$1AD$$$'D$L$T$ PÍ&'D$L$T$ PÍ&'Ð&'Ð&'f|$tL$BxÐ&1ҋL$R1P,$R1P ,$R1P,$R1P,$R1P,$R1P,$tF\$ D$ |$ D$ f fD$l$<$l$ $؉ЃÍt&UW1VSl$t$M 1N;Ax}@MB;Ax|Gf~[^_]ÐUWVS$,$$$$$($1҉$Ax$B~郼$0$( ,049v$11ɉ$$R1P,$Q1V ,$R1P,$Q1V,$R1P,$QV,$ٜ$ل$ټ$$f f$٬$߼$٬$$)ڋ$z1;$1҉8@~$11R4V,$٬$߼$٬$$SW,$$ ٬$ۜ$٬$$ؙ1)Љ$4Չ\$ $,D$st$\$$L$s$xtL$$|$$Ct8D$ssD$s|$s1D$Ȉ$ J1)Љ$9C~$11$t$x/$$fP|?fzùXfx33>fz?|Ð&'UWVS T$(t$,\$ D$$҉\kXǃ<$fl1ҹ?fH1fnL't$14v'DŽDŽDŽDŽHfDŽC BfvD$1111fk(0} (fDŽHfntj(@pti ftnǃ|>P1fxfzǃ? [^_]ÉŃ,$ǃp?(@ti fu33>Xfx?fz| [^_]Ð&UWV1S\$lk&1'fCfDŽCBf~V)f\$>f f\$ɋL$8\$4Q$l$<\$l$>\$ $ l$<\$8l$>ɋD$81)ЉD$ -D$|$>D$ \$>f f\$L$8Q$ʃl$<\$l$>$Pl$<\$8l$>D$81)ЉD$ ۃ-\$Y@|$>D$41T$>D$4f fT$D$8P$ʃL$\$l$<\$l$>$D$l$<\$8l$>D$81)ЉD$ \$4Ƀ-L$T$PقT$4v\$4D$4H[Ðv'S(D$4\$0|كP苓(󋂨|$&T$&f fT$$ l$$ߛl$&  |ٛ l$$ߛl$& l$$\$l$&D$f= ~ f l$$\$l$&D$f=p~pf߃l1l$$\$l$&L$kt&'f S@fSf~t&(HLPTX\f2 zEpf1f1f([É wv$$$kSD$kKT$kCL$kSD$ kKT$k C$dL$$T$$$D$L$$T$ك|$&D$&f fD$$l$$T$ l$&L$ Q$ʃl$$\$l$& l$$\$ l$&D$ 1)ЉD$ ؛$$҃-T$$11҉([S\$L$D$ 1)P$؄0ٜ[Ð&'(UWVSL1|$.T$dl$`D$.$T$$f fD$,v'\$11t$t&fDD0@f~1 ff|t0~ufu(u݋\$$للL$ fD$T$$Afqf|L0ufM(uދT$DUT])Й1)9}ftL0D$ ؄؄Ѓ뀘D$ Af~L$ D$ T$$l$,\]l$.ٜHftt0׸D$fkL$$D$$BfAf9tT0uD]fDMHHD$@D$Bf~ȉ'\$f9\$DڋL$$D$fDUD$لH\$ 1ʐL$$11ҍ<L}'r֍ f~f;\$D$ 1T$$l$,\$*l$.L$*t&fE(t fLUٔH@ꀘf~؃L[^_]Ít&S\$ D$T$ tZ1RP,$=,ل،ٜH|$T$0f f$,$Kl$X[V1S\$4kȈD$ tS1RP,$ل،ٜH|$D$f fD$ l$ Kl$Ff~L$ $L$k1t&DŽ@1DŽf~փ[^à \$\$t$t$D$0tF810RP,$ؼ|$D$f f$,$ߜNl$\$t$ Ív'VS1<t$'f^(tU0tJk10RP,$،|$T$f f$,$ߜNl$DŽ1ҍK0f~Y[^Ð&UWVS\t$pنd߆ @s߆s|$N|$NT$0$f f|$Ll$L\$Jl$N@D$JɘD$l$L\$Jl$ND$JD$D$I1ɺ?kL$(T$,D$(D$0\$Hl$I@M@t&8\$Ht^tS1UW,$ل،ٜH|$ND$Nf fD$Ll$LNl$NAOvD$I|$ItƆj1D$Gfn(uOK@'DNN)P$vGAyf ~ 1ۈ5 (j5 (D$GE|$Gv؃=L$HD$F11|$Hv4T$HDŽ1퉬DŽfF@uT$H1DŽDŽ+1DŽDŽfFyD$FG逃뀀|$FZ\[^_](T$(\$(L$(D$  (l$ ($@|$kT$Ht&U1WVSL|$`D$dD$)v'€fDL0v\$)D$1D1҉l$$1t$ \$T$t&= (u f|l0D$El$|$vL$)11ۍv'Ӏ: (ul$f9lT0Ã退vڅfP1$=H|$.T$.f fT$,T$)Ll$,\$*l$.\$*&8 (u fWٔHDŽ1DŽꀀv؃L[^_]Ðt&؄ɋ؄+\$fll0Àt$ËT$L$T$ȍ4G ÁwWˀ9 (uf|L0uD$لHG)P$sflL0D$$Á@D$$v؋\$ f9\$$:l$L$$L$ )؃L[^_]ÐU@BWVSL$T$ |$$L$1)Í'T$B)‰Й1)9} $ōAftvՋ,$t$/^[^_]ÍUs WVS $L$$ T$$D$D1|$xL$xfM(iD$x>1T$`1ۉ\$|L$HL$L$t\$`߹}(|$X@B1)Ít&'DU)‰Й1)9}L$TǍAftv׋\$TL$tT$X<AD}|$\\$t9fU(gL$p1T$HD$(UN9t$(kht$pD$x|$p\UET$4|$,f\$R\$pft$B߉|$Lt&'T$8|$(D$`U(T$(f;D$Rrf@\$h9||$0L$L׋T$`׉|$M C9}TD$0L$`T$E(f;U(uԋT$4f;LUtfAtŋL$hfE(AD$hC9|\$lf9\$hv0D$8\$(T$`|$hE(|$lL$d|$Bt$(L$BO9T$HL$pfUtHh|$p\$lDEfDUt$dfUL$H\$pMT$`|$|GljD$|fr |$D1 SfwK|$Dv|$x}t$ D}\$$$D$ SfL$DvL$xAى\$xfQ|$Dw3 [^_]fU9$5t$D$$İT$xT$5t$D$XU11WVSLt$`T$D (fht"hCˀ1 (fhtf~hffD$6PD$JT|$@|$0fl$J1D$K1L$JT$$D$ \$|$D$C\f D$$fD$l$\$l$D$1)fw(T$ O@fO\$t$ |$Ðv'\$\$ t$t$,|$\|$$T$(te1)ʉ$4 1)V$؄ٜ4$$؄ٜ\$t$|$ É1)‰$fи)И뒐UWVS$|$Nل$$T$NL$S` 8[Í$D$Sٚ $(,048<@DHLPTv'Ð&'D$1ҋHɋ BD8uÐ&'U1WVS$_Gۋ XTQ8_ tt$$Owɋ, ^XU8뭉<$9G O$t5w ΋D8tHt$عO$Wҋ ȋD8Ht $عvl$D$<$_ 7$,W$X<$,(L$ŀl$SW 눃"('S2v2Zv@VSt$N$xWVˍҋ |@^Hu^ȍۋ4 \@Z[^É4$N$1y뵐V1SL$$\$ ف C s SRV,$C[$Cs 4$C$ƋD$ T$C 4$D$sC([^Í&'V1SL$$\$ ف C s SRV,$C[$Cs 4$C$ƋD$ T$C 4$D$sC([^Í&'S\$Cu2Cu![u[É$$[É$Չ$Đt&S\$Cu2Cu![u[É$$[É$Չ$Đt&S\$$%C$C C([ÉS\${$t u[Ð$C$C [ÐT$D$r|$D$f fD$ l$ <$l$$Ð&T$D$r|$D$f fD$ l$ <$l$$Í&'T$D$r|$D$f fD$ l$ <$l$$@ÐL$D$QÐV1S$\$0$C K|$"D$"f fD$ l$ T$l$"T$R$ l$ \$l$"T$l$ \$ l$"1)ʉT$Ƀ1-L$PVF,$K$l$ \$l$"S 9P\$0$[^&L$D$q|$T$f fT$ l$ <$l$$‹AÐ&'WVSĀ$$G(t[^_wف|$~t$~f ft$|l$||$pl$~T$pفɋWl$||$pl$~D$p؉T$hl$||$pl$~\$p,T$TD$Tl$|T$ll$~\$LL$lQ$ʃl$|\$l$~$ \$0l$|\$ll$~D$l1)ЉD$ \$T-t$|$~\$~D$Ld$hf f\$|l$|T$ll$~\$LL$lQ$l$LD$0l$|\$l$~$hl$|\$ll$~D$l1)ЉD$ \$L҃-T$D$T7؞kنw|$~T$~f fT$|l$||$pl$~WL$pنl$||$pl$~D$p؎T$dl$||$pl$~t$p,T$HD$Hl$|T$ll$~\$PL$lQ$l$|\$ll$~ɋD$ll$|\$l$~\$01$)ЉD$ \$Hۃ-\$|$~t$~D$Pd$df ft$|l$|T$ll$~\$PL$lQ$l$PD$0l$|\$l$~$l$|\$ll$~D$l1)ЉD$ \$Pۃ-\$D$H؛vD$P؛كw|$~L$~f fL$|l$||$pl$~Ot$p\$`كl$||$pl$~T$p؋\$\D$`l$||$pl$~D$`D$pl$|T$ll$~ɋt$l\$XV$l$|\$ l$~l$|\$ll$~D$l1)ЉD$-D$كl$|\$l$~$4|$~L$~D$\D$\f fL$|l$|T$ll$~t$lV$˃l$|\$ l$~l$|\$ll$~D$l1)ЉD$ۃ1-\$Y@قl$|\$l$~$t|$~D$~D$XD$Xf fD$|l$|T$ll$~L$lQ$\$,t$(D$(l$|\$ l$~l$|\$ll$~ɋD$l1)ЉD$Ƀ-L$7نl$|\$l$~$D$`d$\كٞsD$`d$Xw`؋_(=$[^_D$L؞G($,7hG($lG($&',1ҋD$0t$ 1\$|$$l$(x$D$T$tD$\$t$ |$$l$(,ËH xl$899tAT$Yj'T$4F L9;t$8[u݋t$N 9rT$1۽B$\$r|$t$ BD$J $$%l$T$u|$<$'$吐T$D$PÍt&S\$Cu!C u [Ðt&$[Ív$ՍS\$Cu!C u [Ðt&$[Ív$ՍUWVS,\$@T$Hl$L{\$$)Љ1)D$1 D@9r1D$1҉t$ 9D$ T$t&1҃D$$t$$H Ft$DL$L$D$t&L$t$ \B9w\$\$t$$19rqD$ t$$T$N)D$9T$ u|$P!|$P,[^_]ËD$$P \$t$T$\$$19sL$$Q DDD\@9rD$ t$$T$N)D$9T$ d19r؃,[^_]B9sDwB9r19sD\$(D$(\@9r19t$1SV,$D\A9rn\$P191ҋD$RP,$D\$(D$(\A9rlt&V1SD$ t$D$v/1RP,$&1RQ,$A9w[^Ð T$D$JD$L$$ ÍS\$ L$$  $CB$C T$(D$K$L$D$,C[Í&'S\$ L$$  $CB$C T$(D$K$L$D$,C[ÐUWVS|$8D$,OD$Xp@\$ $D$T$ t&D$0T$l$D$0D\$4Nt$$KL$4L$,t& @J@J@ J ƒwԅ  IuL$xOk؋|$o[^_]Ë\$D$t$S \$ ՍLT$)Jt&Ju묐S\$Kt$C 1҃ B9wS)ЉC[Ít&C S)ЉC[ÐSD$\$T$CL$ȉC $Ct&K 1҃ vB9wC)K[ËK C)K[ÐSD$\$T$CL$ȉC $Ct&K 1҃ vB9wC)K[ËK C)K[Ð D$@u É$ É D$@u É$ ÉS\$T$K 9v 9SD$ tS)ыS9ЉC1[ÍUWVS\$D$S{s j, @I@I@ I wԅ  Ju$x k$Y[^_]Ëk V)K\L&31Ju$Y[^_]ÐUWVS,D$Ll$@H$@u M,]L$Ut$E}\$ u$] T$$MU0D$|$t$(\$T$L$ &'\$DT$|$ L$\$DT$$L$*v @J@J@ J ƒwԅ  IuL$|$(t$ɋT$L$ ' @J@J@ J ƒwԅ  IuD$T$(L$OE0m,|$(U,x:t$L$HU,Nt$L$Hxu $<$؉u }$,[^_]ËU\$ D$ )ލ\t$(LT$ JJut$L$HU,Nt$L$HyUt$L$D$ )\$ލ\LT$JJuS&'VSL$ qt%A(Q &A(A(@9rA(QtY 1t&'@9rA(A)Ɖq q)Q$[^Í&'UWVS T$$\$ |$(;T$$l$0L$4sS9sC4 ȉCsCCC $s4$CK $CS$C D$$C(3 C(C(L$,@;D$$rCL$$D$9v*9s&K(C(C(@;D$r썶tC(KC(C(T@9rk9v'9s#{(SC(C(@9r'L$,C(S C(D$,C( @9r;D$$x|$,7 @;D$$r؉S(su[t&C(St!K 1'@9rC()l$s )S$ [^_]stC(SC(C(@9r늋3z<UWVS T$$\$ |$(;T$$l$0L$4sS9sC4 ȉCsCCC $s4$CK $CS$C D$$C(3 C(C(L$,@;D$$rCL$$D$9v*9s&K(C(C(@;D$r썶tC(KC(C(T@9rk9v'9s#{(SC(C(@9r'L$,C(S C(D$,C( @9r;D$$x|$,7 @;D$$r؉S(su[t&C(St!K 1'@9rC()l$s )S$ [^_]stC(SC(C(@9r늋3z<S\$uBCu+CuC u[É$[É$ݐ$ˍ$봍S\$uBCu+CuC u[É$[É$ݐ$ˍ$봍UWVSt$$D$(V~ T$\$<$ $VN^,L$) @J@J@ J ƒwԅ  Iu~n N0^$L$ D* @J@J@ J wԅ  IuT$ HF0n,V,\xF$$Hx=F F,[^_]ËVӍL)W^$\&+)Ju$HyË~\$L$D$)ډV T$\LJv'+)JuF,[^_]ÐD$@T$@HL$@8P0T$ @P`m@LPDÍv'D$@T$@HL$@8P0T$ @P`m@LPDÍv'Ð&'Ð&'D$fP$@ɘf~ÐSD$\$ |$tWH9wD$( ,04[É븋H9v؉$( ,04[Ít&1ҋL$R1P,$R1P ,$R1P,$R1P,$R1P,$R1P,$tF\$ D$ |$ D$ f fD$l$<$l$ $؉ЃÍt&S1҃D$1ɋ\$RP,$t&A f~$$$$X[ÉUWVS \$ L$$T$(sD$;͉L$`4$D29rS{  Gf9~$: tD$T$v'$AD9sD$ [^_]Ít&SD$D$ \$ D$ \$ |$ D$ D$ f fD$ l$<$l$ $tt&'Iu1RP,$ l$<$l$ $t Hu؉1SQ,$l$|$l$D$[Ð&UWVS$$T$l$11҉$1ɋFD$xv'|$x9v!$h) (u ى$Avʉ1RV1,$t&D$x1틼UW,$ٜAvً$1VS,$Ƀ\$p%D$pٜ$ل$ٜ$ټ$ل$$f f$ ٬$߼$٬$$t Iu1RP,$ ٬$߼$٬$$tHu؉11SQ1,$٬$߼$٬$$D$h|$hUW,$'q،f~ٜ$ل$ٜ$$1ل$RW,$%|$l \$h1P1CS,$&y،f~ٜ$ل$ٜ$$1ل$RQ,$% |$l\$hY $JL$x|$lW$\$x;D$hË$1x ;l$h$$) $.ټ$$l$|f f$v$$1҈$L$|\$x$߄$٬$ߜ$٬$`$$$D9rM$svFf9~$1 t$$t&\$xBD9s$$;t$hƒ$c؃|$l$;l$h5 1ҋ$RP1,$'i،f~ٜ$ل$ٜ$$1ل$SQ,$%$1R1W,$i،f~ٜ$ل$ٜ$$1ل$SQ,$%I$$f~ |$li$11QP,$D$pٜ$ل$ٜ$ټ$ل$$f f$ ٬$߼$٬$$9sIu1WP,$ ٬$߼$٬$$tHu11Q1S,$٬$߼$٬$$l$d\$dRS,$t&'y،f~ٜ$ل$ٜ$$1ل$RS,$|$l\$d1P1CS,$t&'Q،f~ٜ$ل$ٜ$$1ل$UQ,$|$l\$d|$l$~ f~[^_]ËXT$h|$pD$Y T$ i|$q$D$\$l{$8\$l|$lG\$d$$\$M$tD$=|$l $j$l$`;D$d7$1|$\;t$dA D$X  $.ټ$$l$Tf f$D$X1ҋL$T$\$`٬$ߜ$٬$`$$D$XD9rY$s Ff9~$1 t$L$X&\$`BD9s$D$\;|$dƒ|$\c+؃|$l?t$X\$,11D$,RW,$'i،f~ٜ$ل$ٜ$1ɉ\$,$ل$D$,QS,$|$lj$j fj|$l$r$t$[^_]]؃|$lT$h$D$xT$$|$$5]t$l\$x$\$x;D$hg$B ټ$$ f |$lf$٬$Z ٬$$(D$l|$l$z $|$5t$lm$C ټ$$ $f |$lf$٬$[٬${$ L$lU$x|$x؋$fq \$0$-D$0ɉl$l>$hD$l\$@$-D$@ɉl$l$|$$D$-l$l$\$$t$T$ L$l$$f{ $fw&$fs $t$-l$l4$L$XL$D$l$$5]t$l\$x$fw$P5t$lpXXUWVSL$`$^ tل$d (ټ$$,f f$٬$^ ٬$0=ٜ$ل$dل$d٬$۔$٬$$V$˃\$p\$`٬$\$٬$$H٬$ۜ$٬$$1)ЉD$ ؜$dɃ-L$=D$pD$`؋$AH sV $S $AHfR$ټ$$ Tf f$)٬$Y٬$~ fA D$$$Q $ډ\$$3t$4l$Cټ$$f f$٬$۔$٬$$Q$ʃ٬$\$٬$P٬$ۜ$٬$$1)ЉD$ [$h-t$Cټ$$f f$٬$۔$٬$$WY@$ʃ٬$\$٬$P٬$ۜ$٬$$1)ЉD$ [$-1D$C ټ$$f f$٬$۔$٬$$V$ʃl$X|$\٬$\$٬$D$X٬$ۜ$٬$$1)ЉD$ [ $-1D${1҉$&$$pf=v$>D$t$$fB >>&$C ftqS f9}so$E =$fF ل$d$ LP Xل$d PXل$،$dX 4$C =$fB wل$d$ L[ل$d P[ل$،$d[ $`=JN$L$1$P $=h$G $D$H$ UWVS$X$)$ل$ۅټ$$f f$\٬$ߜ$٬$Q$ ȃt`tHHuh1<t@w$fƍ'E\ \ ]A9wD$(L$3,g9XO|$]11V1W1,$R1P ,$QV1,$WP,$R1Q,$VW,$tH\$TD$T|$RD$Rf fD$Pl$P|$@l$RL$@؋ )BU,L$\$T$ }0<$T$u0\$4$D$\$<)\$4f|$ MU,D$L$T$ ]0$T$M0\$0 $D$0|$R|$Rf f|$Pl$P\$Ll$Rt$LV$$ l$P\$ l$Rl$P\$Ll$RD$L1)ЉD$\$0ҋD$(-1ۉT$D$SMQ,$|$R|$R f f|$Pl$PT$Ll$Rt$LV$l$P\$ l$Rl$$l$P\$Ll$RD$L1)ЉD$ۃ-\$$\[^_]Ã=wt$,1҉T$ C$<]ك=i\$(G=v $]T$,Ft2]}D D Iu؋]D$'1T$,]1L$&LM1L$(WV1,$PS 1,$R1W,$VP,$SW,$R1V,$tI\$TD$T|$R|$Rf f|$Pl$P|$@l$Rt$@؋ )ZD$$W1VSL$q&D9sƉBv[^_u򋄑9vv'UWVSl$0T$8D$D}l$ʈT$\:|$<4Wf9}yl$4T$]r,ul$L$<i1)Љ$t$4ЈF[^_]Ðt&U1WVS D$$D$ D$t$(1ҋ\$L58KD$8L8uteT$T$$4'T$$11ۋ9"ˍPT9r܋\$$L$uD$ El$|$ Y [^_]Ðv'U11W11VS$L$lD$sK$D$rP1U,$W1V ,$R1S,$PU,$WV,$RS1,$_ ٜ$ل$ټ$$f f$٬$߼$٬$$Ӌ11U1W1,$R1P ,$VU1,$WP,$RV1,$UW,$g ٜ$ل$ټ$$f f$٬$߼$٬$$Ɖ$ ߋ1)׃1҉9P1U,$R1W ,$P1U,$R1W,$PU,$RW,$ʃT$hl \$hٜ$ل$|$h\$h$z,l$L$|$ J0 $$\$x0<$$H$ټ$$D$hD$hf f$٬$ۜ$٬$$Q$l$h٬$\$٬$$٬$ۜ$٬$$1)ЉD$ \$h-D$1RS,$$l$hMؙ $111NP1U,$R1W ,$S1V,$PU1,$RW,$SV,$ٜ$ل$ټ$$f f$٬$߼$٬$$݀|$s~11P11U,$R1V ,$S1W,$PU,$RV,$SW,$ٜ$ل$ٜ$ل$11P11U,$R1V ,$S1W,$PU,$RV,$SW,$=ٜ$ل$ٜ$ل$ټ$1$f f$1٬$ۜ$٬$$S$٬$ۜ$٬$$VW1Ë,$)Ӄ11R1P ,$UV1,$WP,$RU,$VW,$ٜ$ل$ٜ$ل$ټ$$f f$11٬$ۜ$٬$$R1W,$U1P ,$R1W,$UP,$RW1,$QU,$)ٜ$ل$ٜ$ل$ɉ\$ t$Ƀ$ -1L$$11ۋNR1P,$W1U ,$S1V,$R1P,$WU,$SV,$>ٜ$ل$ټ$$f f$٬$߼$٬$$ڋ )ڍz$9J,t$L$ BD$j0,$$T$\$L{0<$D$Lټ$$Ǎ_f f$٬$ۜ$٬$ዴ$V$Ƀ٬$\$٬$$L ٬$ۜ$٬$$1)ЉD$ \$L1-D$US,$ټ$$ f f$٬$۔$٬$ዴ$V$Ƀ٬$\$ ٬$|$$٬$ۜ$٬$$1)ЉD$҃-T$$Hļ[^_]2>؀|$s؉l$$ $9$$Jq1'D9ƉBv݉|$tJD$tt$|\\$x1ۃvLƍ'$HLL$CJ9wË11S1W1,$R1P ,$VS1,$WP,$R1V,$SW,$ٜ$ل$ټ$$f f$٬$߼$٬$$D$l׋ )߃99CT$ttG $J<$hLLKuʋ$ND$|T$t$\$xi\/L$l$l$ll$$NC\$\\$$$D$s$1ҋX'LBv9t$\s1ҋT$dv'D9ƉT$dBvۋ|$d$D$cȉ\f|M2$4BqwO B$D$<j<)l$,t&'9|l$<$jl$,9} Ãqvֈ$$r,D|$c닌$y1)Љ$4Ո$}$l$dS=]tB $U<$uD D IuʋU$1l$d$^1$$DY1틃R1P,$W1V ,$U1Q,$R1P,$WV,$UQ,$]ٜ$ل$ټ$$f f$٬$߼$٬$$D$rՋ $)Ń+9T$\2l$r$l$$M_9PG%9 t$cˋ$w1)Љ$o$$TEy 9)FL$ \$ T$ T$L$ \$ L$\$T$T$L$ÀL$T$T$\$ L$L$T$$L$L$T$T$$T$$9L$T$T$ D$ T$9  D$ $ D$  T$ L$ D$ T$L$D$\$ T$ L$ [^_]ÍD$1ɉ1҉ ƀƀÉD$1ɉ1҉ ƀƀ ÐD$1ɉ1҉ ƀƀ@ ÐD$1ɉ1҉ ƀƀ@ ÐT$D$ÍU1WVS\$(v@~ o9)D$T$L$D$T$L$D$  T$  L$  D$  T$  L$ D$ T$ L$ D$t&'T$)D$L$)FT$T$L$L$T$T$L$L$T$L$ T$ L$T$ L$ T$ L$ T$ L$ T$L$ L$T$T$T$T$$9L$ T$T$T$D$3  D$ T$ D$  T$  D$  L$ T$ D$L$T$D$L$T$D$9 A)1)D$Ky1|$[^_]Ít&D$T$ ) Ív'D$L$ D$tHt.Y1 BIwA1҃ BIw䐉U1WVS,|$@v8)@vƇ:;b_؈و<$ۈ=uƇ(O1҈$:>Bv1҈8)@ vG"ˉD$J@11҈8)p v:B~h9L$\$D$T$L$ \$ D$  T$  L$  \$ D$ T$ L$ \$ D$ T$D$)T$>)FL$\$T$T$ L$\$L$ \$ T$ T$ L$ ÀL$ T$ T$\$L$ L$T$ T$L$L$T$T$T$T$$9L$T$T$D$T$7  D$ T$ D$  T$ L$  D$ T$ L$ D$ \$T$L$1ɍt&9A:)Bv(1ɍj:)良[ 1 1ۈ8)@9w|$t ,[^_]ø1ۈ8)@vƇC1Ɉ$9DAvW"IT$J_ƇK1҈L$:MB vGƇ\O Z1҈[l\$(D$( BIwBI~ƇmGឍtu1 BIwBI~Gឍ|}1 BIwBI~Ƈ~Gឍ1 BIwBI~G ឍ1 BIwBI~Ƈ1L($BKyEvƇ1L8$BKyEv_$1Ɉ8)@=v 1t$ffl$tiD$1D$$1ɍr:)\$$>)L_Bv$BKyE^vD$l$;l$wf|$$4$1t$ 19)qT$ W>)&$BKyE^v$l$;,$wWT$uG$HI7OL$KGD$>t&UWVS|$0wF$ 11҉:D BvIJ_[^_] 1t$ffl$t\$1D$;$11fE&'$)C8)@$vD$fU|$vD$T$;T${W=G1<È_:)J$wOIH w[4Z$1LҾ ˆ_W $$vɋ$U=)$tɉ_)$A$v$1_$1ɋ$ً$B:)$t\)$A$v؋$؍Q$$9)t5DFv$1$1ɋ$ً$B:)$t\)$A$v؋$؍Q$$9)t5DFv$1111ۉD($C9)ЋD(A$T(v9~Fvq$11҉L($4B9)Ƌt(q$D(v9~Cv>)Uf Q$_$Hyj$ 1ɉL$ffD$xt$1ۉ\$l>B$11fE&$)C8)@$vD$fU|$vD$T$;T$w<L$D|$41\$,ɉt$0\$@l$8D$(ƃtmD$9 w$$L$ wP!tb \$,t$0|$4l$8B~$4T>D7CB~t&@ ~$0ffP$ټ$$f$٬$٬$ݜ$ټ$݄$$f f$٬$ۜ$٬$$)T$$$4D=w1@~t$$yxxx)T$C$$$\$\$$$$\$X$$\$T$\$P$\$L$\$H$\$D$\$@$\$<$ \$8"\$41ۉ\$0\$C\$ t&\$09\$4L$lL$\t$ht$P|$d|$Ll$`l$TT$pT$D$D$X$L$8$l$H$t$<|$||$@$T$xL$tt&$4T$pL$lCL$pЋT$hL$dT$l$L$hL$`T$`$$$L$d$$$$$T$|$TT$|9\$4l$x|$xt$tD$tQD$8D$x$t$<$|$@$l$H$D$D$T$LT$pl$Pl$`t$Tt$h|$XϋL$l\$\D$0D$4L$ \$\$8$$$ \$<$$$\$@$$\$D$\$H$\$L$\$P$\$T$\$X$\$\$t$$1ɋ$4T>vAB~T$$$4D,Ջ$8*[^_]$X$0t$=$|$4|$=x$%$8l$=T$0$%D$=-S$T$= K$L$؉D$$s$ n t$$l$t$iD$$$8$4\$$D[^_]Ð&'Ð&'Ð&'Ð&'SD$\$T$ CfufC&@K([fC&AC([Ð&V1St$\$F& f IyF(F|$L$f fL$l$\$l$D$[^ÐS\$  up uV u< u" u[Ív$[Ív$ԍ$뺍$렍$농$iS\$  up uV u< u" u[Ív$[Ív$ԍ$뺍$렍$농$iT$1v';@~UWVS|$$;9;\$;T$ ;L$ ;D$ ;\$ ;T$;L$;D$;\$;T$;L$;D$;\$;$;L$;D$ D$)T$ > FL$ \$ T$T$L$ \$ L$\$ T$ T$L$ÀL$T$T$\$ L$L$T$T$L$L$T$$T$T$$9L$$T$ D$ T$9;;$;T$;D$;;T$;L$;D$;T$;L$;D$ ;;\$ ;T$ ;L$;[^_]ÍD$1ɉ 1҉ ƀ ƀ ÉD$1ɉ 1҉ 1ɉ 1҉;ƀ ƀ ;;ÐS\$$ $ $ $ $ $ 1 11҉ 1 ƃ ƃ ;;C;[Ð&'S\$$ $ $ $ $ $ 1҉ 11ɉ 1҉ ƃ ƃ ;;C;[Ð&'U1WVS\$(v;@~񋻰;o9);D$;T$;L$;D$ ;T$ ;L$ ;D$ ;T$ ;L$;D$;T$;L$;D$;T$;L$;D$t&'T$)D$L$ FT$T$ L$L$ T$T$ L$L$ T$ L$ T$ L$ T$ L$T$L$ T$L$T$L$L$T$T$T$T$$9L$T$T$T$D$3;;D$;T$;D$;;T$;D$;L$ ;T$ ;D$ ;L$ ;T$;D$;L$;T$;D$;9A)1)D$Ky1|$[^_]Ít&D$T$; Ív'UWVSt$$ $PFH 1FLFP FT ?1 I KyVH^LA 1 I OyVL^PQ 1 I OyVP^TA 1 I OyVTy [^_]ËX 1tQ v 2 J  Kyۃ E9X w\ 1tT  2 J  Kyۃ E9\ w` 1tT  2 J  Kyۃ E9` wd 1tT  2 J  Kyۃ E9d wh 1tT  2 J  Kyۃ E9h wl 1  2 J  Kyۃ E9l w  FF12 JكwN   F ҈Fӈ^2N1ɍ&2 J "wN2 11ۉ\@ v1틾 D &1 I KyTD 1 I KyTEO % vNH1L$ vYfDnX 1щ t&'Ǎf1 I KyfTnXYE 9l$ w~L1|$vU 11fnX Ǎf1 I KyfnXQE 9l$w^P1\$vb 11fnX &'Ǎf1 I KyfnXQE 9l$w^T1$ 11fnX  t&'Ǎf1 I KyfnX EQ9,$ 11퉬p @v 1틾 p  '1 I Kyꉔp E v_ p  1 I Kyꉔp E vO1 1X @v1틾 X v'1 I KyꉔX \  1 I Kyꉔ\ E lN >&' 1҉t$t$$|$;;G9t"Pщ;$t$|$ Í&;$t$|$ Ðv'U1WVS|$0 @vƆ  0t&1ۈ0 @vV" 115 } l$\;'0;@~l$\9";\$;;L$:;T$9;D$8;\$7;L$6;T$5;D$4;\$3;L$2;T$1;D$0;\$/;L$.;T$-;D$,'D$;)T$:7 GL$9\$8T$;T$6L$:\$9L$5\$7T$7T$4L$6ÀL$3T$5T$2\$8L$4L$1T$3T$/L$2L$0T$0T$.T$/T$-$9L$1T$.T$,D$,T$-7;;D$.;T$/;D$0;;T$2;L$3;D$4;T$5;L$6;D$7;;\$9;T$:;L$;; 1ɍv1;A2 Bv1ۍJ2 l$\ ;1E9tC; 1Ɉ2 B9w|[^_]ËVN ^ T$@ L$<V 1ɐ$1 AvF<< <N1 1҈0 @vFƆ 1V '$ꈄ1 AvƆ 3ۉ tr1틞 1ɍ{3 L $2 BKyL 7 t&$BKyEW vl$@FHD$`NLD$(L$d^PL$$\$h~T\$ 1ۉ|$|$l 1ɍz2  D`7 v$D`BID`yG 0 '@BIy Cv1|$(vOLnX1 3 {7 v'$BKyWE 9l$(w1|$$vWnX1ۋ 0 x 7 $BKyOE 9l$$w1|$ vWnX1ҋ 3 {7  $BKyOE 9l$ w1|$vWnX 1ۋ 2 z 7 $BKyOE 9l$wl$< 11툔7 G p  ˍt&'A$3 COy Ev1ҍK3 p  ˈA$3 COy Evͺ3 @Jyk 1틎 1ۍy1 X  v$2 BKy\  7 $BKyEW vX 1|$v` L$X 1ҍx0 \$X 7  &'$BKyEO9l$ w\ 1|$v_ \$T 1ɻ0 xT$T  7 '$BKyE_9l$ w` 1|$v_ T$P 1ۍy1 7 D$P  '$BKyEW9l$ wd 1|$ v_ L$L 1ҍx0 \$L 7  '$BKyEO9l$ wh 1|$v_ \$H 1ɻ0 xT$H  7 '$BKyE_9l$ wl 1|$/ T$D 1ۍy1 7 D$D  '$BKyEW9l$ wƆ Ɔ Ɔ Ɔ Ɔ ؄Ɔ ڐ&'<\$,\$D|$41t$0ۉl$8t$@Ɔ  ; 9 w$t ;H! tY;\$,t$0|$4l$8< 1ɋ; 9{ nd&;\$,t$0|$4l$8<Íow1w 2 ' @:Ɔ 1ɉ 1ۉ Ɔ R94$1 1ɀ~ Ɔ Ɔ ҃z =.0 @ @% C =.00 @ A; 4$ 1 =.0 @ AU 4$1X \ ` d Ћh ؋l ЉÉ O =.0 @ B; 4$n  1 A B^ 1 A v4$1 V. E1 AD !4$NH1ۉ FLnP VTЉÉ Ӊ5 E Ѓ9Ɔ 1ɉ 1퉎 Ɔ ~ =. 0 @ C 9 2 B3 !4$F1퉮 =$P =b$PQ=$P=Z$PI  ]=$PÉF|nq 1l$(;0;@~\$(\$ 9;\$;L$;D$;T$;\$;L$;D$;T$;\$;L$;D$;T$;\$;L$;D$;T$D$)T$5 EL$\$T$T$L$\$L$\$T$T$L$ÀL$T$T$\$L$L$T$T$L$L$T$T$T$T$$;l$ L$T$T$D$T$5;;D$;T$;D$;;T$;L$;D$;T$;L$;D$;;\$;T$;L$;D$';l$()A)Й1)D$'Ky|$'u- >xtƆ 11Ɔ = >$-F  ˉN W& T$=w Ë;L$;$D$ ÐUWVSD$,L$(49s@9v\T\T)9u߃9rD$0$1P,S,$9 h $ p x9bL\$ LD$ \$ D$ D\D\9vƒ9m9[^_]ÐU1WVSX|$pl$t\$lRQ,$ D$D?ɃʍGT$,\$< \$4D$DD\$(&@ADL$(L$D  D$F0$'D$V4$'T$^8$('\$N<$2'L$F@$<'D$VD$F'T$r^H$Q'\$P$p5NL$\'L$FP$g'D$$o&VT$o&$o&9$o&G@G [^_$o&VX$o&FLt$o&FP0&'U11WVS$L$($9#N VT$$E;$ $~+9N A;NN rՋ|$$\$p|$V1T$NH $F@D$ D$$L$0\$L$|$GD$VL$L$0L$FT$F@vL$p\$@\$L$VP$FD|$.1ɋD$(\$.$f f\$,G&D@Al$,l$. v؃D$( E~ F)lj~ ;$$l$(.Ĭ[^_]ÐÐ&'Ð&'Ð&'Ð&'UWVS$$tk[^_]1t$<1|$81l$4L$41ۋT$8\$0JD$Dt$D1$t$PD$P1ɋl$$D$$T$|$ËT$ljV$$|$L$D$D$pT$ l$N |$ d$D$t֋T$pƋD$hՉD$D$l|$L$hŋD$`d$͉l$ ӋT$dt$ ؋l$`Ѝ(D$XD$|$\T$T$X1$t$Ӌl$D$L$։l$(l$(d$(L$,|$,t$t$ЋT$(މ)ډ$T$D$$ D$D$(t$T$ d$l$,|$ ЋT$(׍,)$Äu$[$$$EE NjE 1҉D$l$T$ t$ 1D$PЋ$ (Z$L$TD$Pl$T\$d$ËD$PыT$Nj$14W(D$ L$ ЉT$|$D$H$͋X,T=T$LD$H1ɋ|$H1t$L\$d$ыT$Ë$֍4P0T$l$ |$ щD$@D$$ƋZ41,\$D$@d$l$Dl$DËD$@ы$Njr8|$t$1D$ ,9|$ D$8ы$T$X<ՋD$8\$14d$t$)щ t$CS  t1$֋$Ow@L@P[^_]Éqv'UWVS$$@Pttx[^_]Ë$$~O}VEE JUF(HE^,EEK]N8IM ~>t&$$$*1؃ M$$y$1n FD$@ƋL$@$l$D)щ1X1ɍlP\$8T$<\$1ۉ$T$T$$$\$$$$$$$$9$ 9$$$11 u*$9$$9$$$${L$$1ˉ$$$$ttD$D11 D$@$$t$l$@t$D+$$$$T$8D$<+$$$$$$$$Ή+$$t#$$$$$$]L  $1Xt$l$ \$$$$$$\$l$ $L$D$|$T$։$D$ƃ$] I $1틴$$$Ӌ$֋$Ѝ0މ)߉$E$ tD$$T$|$d$$֋T$Nj$ƍ>މ)߉u'$1ۺ$i\$ $$l$T$$$$$$$L$t$ <$D$D$$T$l$|$d$Ӌ$$$֍>Ջ$Ɖы$Ѝ<$$$ +1ȃ ى$$My'1>u$$Љ tD$$$T$l$d$NjD$ȋ$ʉډ t1Ɖ׋$1)s1|$ $t$T$ljՋ$1$$Z $t$ \$D$\$t$ $T$$1ɋ$L$|$B9D$xM$9<$D$x\$l$|D$l$ D$$$T$d$|$$֋T$Éʋ$T$xȉT$<(L$|t$$L$ $$$$$$1ۋ$$J\$ 4$L$|$$1ҋ$EEY)$\$$$1t$ $<$l$ljՋ$1ۋB \$ <$l$D$$1҉A$qX )1\$t$ <$l$1$É֋O$1l$ L$$T$$$B B i$)1҉l$$t$T$ $1ɉ֋G(1L$ $D$T$$E$UH()1L$l$ $t$֋$1z,$t$|$D$ $1ҋ$AiO,)1L$1$t$D$ $։ËU01|$ $t$T$$$AAz0)1|$$t$D$ $É1ҋi4$t$l$T$ $1ɋ$GGU4)1$1|$ t$T$$É֋A8l$ $D$T$$1ɉB $z h8)1҉l$$t$T$ $1֋O<1$L$D$ T$$$E$U$i<)1l$$t$D$ ֋$1ɉËz@L$ $|$t$$1ҋ$E(E(O@)1L$l$ $t$$A,$1$|$t$i|$ \$l$pl$$T$4t$tT$pl$t$ D$0T$$D$hL$p|$tT$l$$L$|$ \$$D$D$hl$hT$d$|$l֋T$ÉD$$NjT$p4$<T$$l$tL$l$ $$$$|$4R$1Zt$|$ \$$D$ L$0l$4T$$\$|$ $l$D$T$֋T$D$(D$։t$, D$ 1t$,d$(|$$ӋT$ ֋t$(Ѝ0މ)߉T$$ED$  tD$D$(T$|$d$ӉT$ދD$,‹T$(ƍމ)߉u$1ۺ\$dy\$ $|$`|$T$D$XL$4D$`T$\t$dl$0L$t$ ,$D$D$D$XT$|$l$d$ӋT$XD$\D$`֍.l$`׋T$dƉЍ<(d$$1$$C1ۉt$ |$D$$$)$)$p$$1҉t$$<$T$ l$$1ՋY<$D$ \$T$$1ɋ$FVs)1t$D$ <$l$$11Fu|$ l$$ tD$D$(\$,T$d$NjD$ыT$؋D$(ٍډ t1׉Ɖϋ$1)S1l$t$ T$$ljՋ$1$$XL$t$ \$$\$t$ 1$T$t$T$$GCt$ l$D$PD$$T$LL$PT$TD$H|$0\$4L$<$\$T$ D$D$Hl$HT$d$|$ËD$ыT$LD$PD$49l$T$$l$ $|$lj8|$(11|$0Kt$t$$|$|$ \$$t$1ɉL$cD$ $_h$t$úc$1T$ D$_l\$t$|$Ðt$t$$|$|$ \$$t$1ɉL$cD$ $_h$t$úc$1T$ D$_l\$t$|$Ð t$t$\$^hu^lu3\$t$ Í&$$^lt։'$$\$t$ Ít& t$t$\$^hu^lu3\$t$ Í&$$^lt։'$$\$t$ Ít&S\$=wSh$ClD$[t&$r'Sh$ClD$[&VSt$=\$ClVFPKpNTStVXCxF\K|FN`N VdVFCF NK N$VS$V(C(F,K,N0S0V4C4F8K8N*D$Lf<*L$fS:)ؙ\$8ȍt91f7fC\$8‰Ƹ)fCFHNjT$8)l$8f} )fJ1f fEv+Nfv"1V)ύOfwt$8fV\$ AT$8fJfBffD$\$8t$fsދ {L$1Ƀv4?l$8A)9fDUHfDMHwL$84?1t$|$H $&]D$\$4$\$) ~D$ 1SfL$8t$ fqHfiHl$;l$v|$1ҋl$ )t$\$8D$HB9rT$L$8fQB=fAD~!úJ9݉||$8fOD\$8CD@fCD$1[^_]1f ¸)ЋL$8ۍ?fD$LfQA$fKfAtL$8A(lfH릍t&'UWVSLT$` ՁŜID$4|$41uU]|$8);|$4hf;L$4q]t$`|$`NH H |$ ‹T$8؍ WD$01Vf] L$0U ω|$<}f\$4]);D$4| t$4)f;L$4r |$T$4)\$`1KH Ƌt$ Ѝ nD$,Sft$8L$`T$,\$ 1f< @f;@ 11f> $f: f|$dt[[^_]Ë$T$d$SD$Tl$L>I1[^_]Ë$fLf|$l@~$$P$ 4@9t$lSfLB$1f< f: $f> $$P $ S1\$ %fDBH1fBHH@f~1'fDB,fDB@f~fB1ɉH1B(fB<fB8fLfB fDBH1fBHH@f~1'fDB,fDB@f~fB1ɸfL1ɉHB(fB<fB8fB T$L$$1ɺT$L$$1ɺT$L$$1ɍT*1҉T*tfL1f@ fA @ @@1t1f5eAAf"tt(*H[ú(*H[Ít&'UWVS,t$@D$@T$@Ƅf5eD$("\$@ fV <|$$nf9~fF~f9~f^ߡD$$O\$@ff9fFʼnfFͺIft4T$@u%SffVtl$@!ftމωIft9\$@u*&zff~t\$@!ftfu!Ff=` t|$$fFfFT$@ fN fn %@|$$f%~ ^Ǎ,)ŋF ˍiflPKD$(PQL$(=Q ?l$D$@\$@h*D$i` %Vl$ T$ЉT$>$|$^"V(~)ύ,ADju=D$l$@1Ë\$@L$ńl$i` D$ ͉L$~$|$\$@u@Fl$(i` Hu"Lunƃi` ,[^_]o=L$(A T$(J L$ B|$$D$^~ \$@%%|$$f%~i` L$n$<i` T$$li` i` l$T$n\$@ ~fL$$y>gt& fN < $~^"$D$T$$v'UWVS$*f$%@u;$Z$*f*%<$[^_]Ë$j%D$*f*$$<$[^_]% $$%$0*%((&$@$1ɉt$x1ӉAf"9,wލ։Af~ދ$$$('$L$ q('*'‹$(())lj&9É)ʼny牜$L$؋$)ٍnw('$$*&|$D)щӉș$$(&LUD$p$(&ft$:‰ډ)‰9É)‰y牜$)$Nx(&ؙ$$$)t$:)$ٍT]\$DL$pƍrt&у‰)y鉌$)닄$k݉X(&D$)f;$ $$)f$f$$)f;$P $$)f$f$f;$f$)f$$$))f;$f$)f$$11$$$$$$&%&\$H &l$@T$ $ fD$0y L$df<$T$D$ $G$fi f2$$ "fD$0)|$dfD$0L L$()f)󍵠ft$,1&Vf~|$ ىt$$1&Gf~|$$ D$񍝚t$p1ɉ\$T\$(L$fƒD$D$@fD$~ԍ|$,1ɉ\$Lދ\$ L$v'fƒD$D$@fD$~|$\$pt$fff$\$T|$|L$Lft$((1|$ D$lt&$)D$|)fD$|)$D$lf@fD$l|" f|$0׉)  \$hT$d|$hD$df\$hfȉfсf @҉f ؘf)فfD$0f.\$h ))؉֘҉ٍ |$hҋ LBff(bf$L1 11(f$0uHL7=v.$L$$pT$"fD$0fD$0r\$t$$Ĝ[^_]@f=X1ۃ@=ff"=$1|$"f=2 C4 f f/f~1f  )L$dyHf5  ))׉  )ljߘ)f9Zf$2 1ɉ\$1L$$f 1Ĝ[^_]ËL$0t$ T$L$<$"fL$0 fWfS"fT$0hfD$0 D$6D$4$Ĝ[^_]fD$0=6$t$"fL$0$Bf$="1f$f"$"fL$02 σ=f"T$$"1ʸt$D$ T$<$xT$$("f\$0fu11ۉ$ $1M yMf/~ى$$<M yMfK~;$$~<=v $d $ "1ft$06ىt$ \$$|$v'UWVSLL$`|$`"dL$`Ul$<  i)1T$H f>1L$`<*PfWfAX/T$@1f* "Aff JL$ |$ f7fGL$@ 9wT$@ D$<\$@SL$`*L$`}f*f*f*f*+v 1f*\$`T$`@ iH?|$HL5f@XۉL51-1|$,` l$0؉ݍ )эI))Ձ1f‰!f!T$(fl$T$`'L$D$0\\$ffP5$|$ D$\$`<fL$`P5̀Ef̀? D$Hft0\$`R5LEfL? D$HD$4f|$8?\$`L5=OF =PFYft$T$`L5v'L1[^_]Íl$`f*T$@ "Aff JL$ }f1fAv|$`l$HT$@1D$$Df1yvqx f‹T$$ЉD$D$$Ef;~΋\$@l$"l$Ht$T$`l$Hl$ \$D\$¸$D$DL$H|$  ffOt$`T$8Ƹ4$T$4D$`f<=w\$`<$'\$`<T$`f<>с8 $D$,%L$ށƸ4$<=$L$88$L$7=$'L$`<~'D$(\l$T$,݉L$+R5|$ D$T$,$|$48$|$K=>$ -\$`ø$D$0VST$$\$ 3tK1@Ҙ@tHљfx`T$, ؃=fw$t$(t T$0ʁ@f [^Ét$D$ D$4$,D$뽸 뙍&11҉\$\$ 1ɉt$"|$dfP51fR51҉ff $8$ "f"("VN1t$T$D$p1ɺfdx GG1T$|$$t$1ɉ$L$\$t$|$Ít&'V1SL$ t$t&tCf9|[^UWVSl$T$ "PT$$ L$1f9ƉD$}YK%l$("Dt  BfQ9T$ffAwFf;t$|St$L$ x l$t$ $1f;l$8T$\$&'5155VB9!Dl 55fVB19ыt$!‰5Tl 4$T$\$L$ $Ef;l$|l[^_]Ð&`)If"OD$(Ս%Q9f^w("Wl$(1f>l$,$f`D$uoL5AL5p`5̀\5P5Cf̀Njt$ f|$(D$,$&\$,1t$0|$4l$8<11;T5\$$P5ҍP5X5L$ tN1@Ҙ@tHљf=iy ؃=fwmL$$@fgfffȉ)Ӎ9I\$$;=$P$,T$ D$ 'T$D$l,$Nj\5~``5%&wT\5`5@]v \5=\5D$`5$'T$~`5اv뙸 ~뎍'W1VSt$|$VfOfBf9wV A~V[^_ÍVSD$ t$Xʉэ iU ҉ iL@i;ff^[^Ðt$f\$É|$x;5r=1511ɉ565D$L$$HuLt01f<wl\$t$|$f<tfF1f<f~\)f\듍t&<t$$D$\$t$|$Ðt&=w!t$1$t$$f<t$|$$\$)T$D$'t$t$ \$|$d=\$$|$( f(|` | 6>f6ff@%ff\$t$|$Á h >22ffz|$\$$0 f(&'>55fAfff%#3 @~1)t&K$fv&e $>++fff.>f.f(f\$t$|$Éչ>>>ff1&VS\$"wFfw`$=wy8L$X[^&$@+fv&$`$=v'$8L$X[^UWV1Sl$|$(T$ \$$$HD$f9 $Uuf 1tt@t@tFf9|ƉM\$)![^_]1t t@t@tFf9|ɉM몋U\$)![^_]ËL$T$AfBfAfBAfB AfBfBA fBA fBA fBfBAfB AfBÍ&'UWV1S,l$@T$D%%D$"T$\$f$Ѓ&1tt@t@tFf|D$\$1ۉ 2t$f$t&1tt@t@tCf|D$Ӊ4f l$@,[^_]1t t@t@tFf|1t t@t@tCf|It&'UWV1Sl$\$%%$"t&1tt@t@tFf|4$ ffl$Z[^_]&1t t@t@tFf|끍T$1v'1fB@fc~01fЪ1fҪ1fܪf1ff1fԪf֪ fުfتfڪÐ&T$&ffBABBBBBB B$B,f~Ív'L$1ʐ&f@fBBB,f~fAfA. fAZ fÍ'L$1ʐ&f@fBBB,f~fAfA.fAZ fÍ'D$(t$|$|$ t$$T$,\$D$T$ t$$L=tL1ҋ\$Ћt$|$1LL$t$$1f9}#1Ґt&f1@L1ɉL,f9|JtBus8KV9PBfPTf9P\YS s(9}/K8CT9}#Sd9}P@fPRf9P| fJ11fPfJmS1\$ʐfB(P@fB* fBB,f~fA1fA.fAZ 1fJL fPfRfT[Í',t$ Ɖ\$|$$l$(h(fV@f$)f~f9f~"nfN(F$$n<f~ ЉF$f~t:t6~$FYˉtt5!fFu~$EfF(\$t$ |$$l$(,Í&f~(F$߈NAn,$fNfn ЉF$[uIf~unf~ t^"fFV,n*fFCf^"fFV$fn(cfuF$$fF(fF&NfF(<$f~ωN$ S\$ ީL$ Љ$fT$$ީ` ffL$ Љ$` f@f=wP[fffPfZe f2L$ T$$D$[ø@t&f foff?e ff t&fީ KfQG@ ff~ީ f% fKfީ fwm fff}%fx&,l$(l$0\$t$ d|$$,$ f(F`   >66fff@ b1 >2f2f벐|$t$$0 f(H&'>55fAfff%tx6[@u|fcvu:f!f'b f:f6}" 1ɿ%f"1|$d5T$t$ L$D$<$L$"f"\$t$ |$$l$(,Ív$D$mK>$ke _>+f+f.>f.f_(&'ft&޾>>>fff@1랍&'W1VS t$0T$4|$8dt&1fF@fc~1ɉD$1L$ɁPD$ ` P$XL$T$u01fЪ11fҪ1fܪf1ff fԪfت1f֪fުfڪ"bf: f"f6t&1fC<@f/~11ff [^_Ðt&U1WVS\$0"ʍd fB(P@fB* fBB,f~fA11fA.fAZ fJ fP1L1fR1fT1f^1f`1f̫1f1҉L51f5f5fx1f*1f*f1ff&11fCfCh*@f ~$1l$ 11҉D$` T$PL$D$,$$=!>>f(>f@fffff5e1ff"v'1fC@fc~,$1҉D$1ɸXT$` 1L$ |$1D$fҪ0fЪ11ɉfܪ1ff ffުfԪf֪fتfڪ"bf:1 f"f6 1fF<@f/~11ff$$f5e12D$1T$L$|$ l$D$d5,$"f"[^_]$0` T$L$1f1f"v'1fC@fc~,$1҉D$1ɸXT$1L$ |$1D$fҪ0fЪ11ɉfܪ1ff ffުfԪf֪fتfڪ"bf: f61f" 1fF<@f/~1ҹ2T$1L$|$l$ D$T$Ft&,1ɉ\$\$0t$ |$$Sl$(""Ddl$4~"4)=vv}14ZD41f@81ƃƃfƃƃf$D-41ƃ$bf65fJt=Jf55f#t=#f55fOt=*Of5|LpfFl|$$1=lfAfAfAfA"fAfAfAfA( fA* fA A$rA,rf5f5e1ɺ2D$d1L$T$l$ t$D$d5,$1fj5f5&'1f<1f*\$t$ |$$l$(,Ðt&5ft=8f55ft=f55f)t=)f5 11fA1fAfAfA"fAfAfAfA(fA*fA A$A,ff f1"f$%'ff"1f*fx$"f%=f"f%D$$ |$A"@u zƃFf$5fJt=Jf55f#t=r#f5"bf"f6f5f5$$5f6t=$6f55f+t=a+f55f)t=)f5"|pf"1f@ff5fD$$@f$`21D$d1|$L$T$ l$%xl$*L$54llt$5D$$ l,lL$ l$,xL$*D$5 lL$ l5$L$,l‰l$ ,ll$xL$*D$5 lL$ l5$L$,l‰l$ ,ll$xL$*D$5 lL$ l5$L$,l‰l$ ,ll$yxL$*D$5 lL$ l5$L$,l‰l$ ,ll$<xL$*D$5 lL$ l5$L$,l‰l$ ,ll$xL$*D$5,l5(ml$5t$$l lD$ L$xL$*D$(m54llt$5D$T$$ lL$ xD$*l$-l5<l|$<l5l$|$$lD$ xl$*t$5f. f f: 5fe$u Zl$t$fEe fEE t$$l$tt$xfEVNE(E,fVfNfEe fE$F$fFi&fsf9 f ~߃= ؋\$tfC a|$l $K\$ $Ȫl$$PD$-l$lt$щT$ l$$5t$l5$5$T$p~l$6$L$1L$T$$0[$D$L$x1 f)\$1$t$xl$p fbэkiGݍ  |= \$pfb 9 ='4,r D9f~HfD9Jfv։|$$$$f5$5fe$<L$tf` ީA CfA$ީl$% Ɖ4$\$tL$xfCfC` fC$@QC(C,$fQ$vi}sf9 f ~߃=؋|$tfGL$$\$x%s fSS fC|[^_]ÉL$T$$l9$5f?f:+fe $fff~f2f:+fe$cV~fff~fRf:fe"$T$tf B {D$tf@$T$ $T$tL$xfBqiB( fqfifB f~ffyAB,fAfB$Kt$xN$fN$igCf9 f ~߃=?؋\$tfC\$t$f C 5fC$T$$\$tT$xfCjJC(`fjfJfC f ffLL$tfA$A,l$x]$f]Pioesf94f ~߃=؋l$tfEغ$T$\$x%k f{\$t$f @C D$tf@%$T$$\$tT$xfCJC(ɐfJfC fBrC,frfC$L$xY$fY|ickf98f ~߃=؋L$tfA$` D$_ى ) )1ۅZ1M.t$dT$`l$\D$X~L$TR\$P&t$LT$Hl$DD$@vL$<J\$8t$4T$0l$,D$(nL$$B\$ t$T$l$D$OfL$ _:\$w$t$ T$xB$fB$i}kf9f ~߃=؋l$tؿfE|$$$5$;t$tfF@f=v\$e T$$L؋\$tfC T$ $\$xk fs$5dl$$5L\$pb$DL$5&fT$xB fB$igsf9|f ~߃=؋\$tfCT$ $l$x$u fE5f fL$xY i ̀fY fi PioeCf9f ~߃=P؋\$tȽfCl$ $t$x$V fF 5QD$tf@fC$` T$`fBKffj\$xsfsVfft$xF fF BC,fBfC$$ L$$ D$$ t$$ D$$ l$$e D$fu=\$` l$$Lf= \$` L$$Ll$tfE$E,fT$xB @fB f\$xs k@fs fk|icsf9f ~߃=wL؋l$tfET$ $t$x$^ fF 5y$ T$띋D$tf@$%@,f=\$ D$$Lf=\$ t$$LfT$xB r ΀fB fr (l$xE fEi&fkf9df ~߃=}$e D$c=w1$|` T$1lL$xA QfA fQf=u\$ l$$LW=w1E$|` t$1)fp=\$ T$$Lbfg=\$ L$$Lf^=U\$ L$$L7L$xY i ̀fY fi Lf3=\$e T$$L=w1*$| T$1=w1/$| T$1=w1$| T$1=w1$| L$1=w1$| T$1~=w1$| \$1=w1$|e L$1=w1|$|e L$1`vUWVSt$0\$4|$04$"L$$fT$$f~fD$0Lt\ff9}Nff}EfwPv'iKK f[^_]f|i 9@f9vt$ ʉL$$t\$iKK f[^_]$D$iGif4iGifxLf3&'VS$\$0$ܩdT$D$L1u PtD$T$ PD$$L$"%f"5f#t=w_#f55ft=f5%1f%f%\$0$[^xD$*L$5lD$l5$D$4lʉt$ 4lt$?xD$*L$5lD$Hl5$D$4lʉt$ 4lt$UWVS$$$dT$t$"*D$Lf9"L$x$5Qwz$- \$L$<$\$L-$4$@f3HL$Lf$*v'D$Lf9c\$tf;$5+R Y)#K5E$"Zw t$xzw fJ t$x894v|$tT$x4;,}^0t$x0%~ StbFRwĬ[^_]Ë$5E@$.T$x10뚃Tu\$xĬ[^_]Ël$xEĬ[^_]L$tD$x|mf55(HC%$5[$t*Gf*$ln(f"^Ff\$P)fO~f9(f~#VfN(n$\$PV<f~ ʼnn$f~~$FYˉtt5!fFu$1ۍ$\$Hf53&$|$L*̓?-A$fD$Hf*@D$Hf~t$t$L4$$f53> f*=fj$4f51f*3$l$L5$'*D$Lf9d\$L11틼$ff<$L$t"t$L$ f5ft ='$f5D$L111ff|$tf@$|$LT$Lǰf5e1ۨ1tt@t@tkf|‰|$Lf$4$L$LBf*9t"' 9z&l$L$t$t<$f" lhCfC1f<fP5$ff=` OHf= Lf= Sf= uWf=e \$ft f$~u6f fe  ШQI $S$|$H$f9f$$$ )鋪O|E1f$ H%0hBщT$D:L$tT$Df9P|$|$HHf9$gL$t^ffRL$t`G9$}B$_$$$ )ыO1|Bf$ I0hBՉT$DC|$Dl$HL$tf9$fR@$$ )ODPf$ 1GT$tihBfTl$tT$DTfT$$f9L@$,)ՍhDUf FL$tihBfVD$t11ɋl$x1fZDf\fXw94fCsV$"wF$T$Hf9Љ$} L$H$$$f{f{$$fC$|$x9} fL$x 9~$f|$x(x;$t$f$l$4$|$$$$=f5B$f5eC$$ f5$ f,$f5e=C3 PNi` 9AfC$5fCBF$Cf5$111f*f5f5CAC$l$t"C,"fCfCfCfC"fC`0fCfCfC(fC*fC $f51t t@t@tkf|$xftHffxL|$L$T$L$Ff߁%*1%'1tt@t@tkf|‰\$L<f4f$4$*Qf5ff*5I$f5DFT$Lf{ f $f5fDtz=v^xt$5m*\$5<l,l|$5t$l$$ lL$ $Df5$xf7l$Lf$ø$=#$18$$fx l$tf7$1۾D$L$%%1tt@t@tCf|‰t$L$<*ff$*f*$f*4$*D$Lf91t t@t@tkf|@\$L11D$Ht$tff='|$HD$ln(f VFfT$`)f^ ~f9 nf~(F$ENL$`fnfN ЉىF$f~/ ' ~$FYˉtt5!fFuѐEfF(L$Hl$L$t$t f*@f*"  U $ * X $f;5 D$Ht$t@D$Hf=y|$HyL$L1ۋ$$%%f$E1tt@t@tCf|‹\$L$D$L 2fð\$|1fx1tt@t@t{f|‹D$L|$|,L$Lf$$$l$LWt$t11L$x 4fD$"ۉ$(u0=v'i` L$$i` D$$"11$$L$L$\$ $$*Gff*/$$|$LT$Lǰf5e1ۨ'1tt@t@tkf|‰ӋL$L$<f$$*Ff9xf*j1$5f9*r=fA$11t$LPD$$Pl$ D$ $\$$5ft =E$f5t$L11f f1t t@t@tCf|~$xftqHffxudBL$LftB$¸$=AB$84$$<$|$L$$ $$Ef@fw,$*D$Lf93$11ۉ$1҉$fzL$L$|$ $$5fJ*f6u$*@f kD$f*$xftqHffxud@t$Lf@$Ÿ,$=@$8$$$$|$LT$Lǰf5e1ۨ|v'1tt@t@tCf|‰\$L l$L$f<$ 1t t@t@tkf|돋$$\$L*Ff* $$f*0K*t$L@f$*D$Lf9$|$LT$Lǰf5e1ۨ1tt@t@tCf|‰Ջt$L<f$<$Bff9x2T$Lы$f; f1t t@t@tkf|.$5f?2$5ff#8T$xwD$xh$Lft$xFT$x7|$x($f5e2\$t"1t t@t@tCf|~$=f $lB(b$fB(s=T$5<Wf5\$t"́ʃ$lfB΋$fBfBfB"`1fB0fBfBfB(fB*fB B$B,"f*f5D$LT$t$L$ "l$5$X|$BfOVfN(n$\$`V<f~ ʼnn$'lk(c$Efk(5f5$lB(b$@fB(f~NfF(|$`f~ωN$|$t"ʃd$f5ыlu 1f5fS*|$t"$f~ ^"fFV,F*fFCf^"fF(fFV$蟢ZfuF$l$`fF(fn$1T$xf*<Hfcf5e$5fEt =0k$Ef5$1\$tf*"f"f=9\$L$T$L1ہ%$%? 1tt@t@tkf|‰L$L$2ffi$lD~$EfF(fD$HI$t$H\$L51f5<$RL$x Ĭ[^_]Ë|$t<$$L$t *$Ъt$|$,$$5ƃ)'W$0l$L$ʋD94,$9\'9$5f@<A$@f5$~f4\$xHH?LQR$fxE\$L$ff5ft =~A$f5$4$$;L$t f(h;7` O [%;F7N F@.dt$t bf:f6:\$t11 "f"t$$|$D$d5T$L$ <$l$" B$B, f"fBfBfBfB"fBfBfBfB(fB*fB 5f)t =>$)f5|$x1۽$Hf*f15fNt =O$Nf5$5f#t =:M$#f5$<$l$m=8$-V;wA/$5fTtz=v^xD$*t$5Pm5l\$l5t$\$$lD$ $Tf5$5f#tz=v^x|$=l*\$5 l,lL$5|$l$$4lt$ $#f5$f$ƅ$~*9 8A=v $$5fTt = w$Tf5$5f#t =@w$#f5$f`$xGf@fx3D$t$$f5eh,fxAD$|$t$Ъ \$|$4$f6f65f+tz=v^xl$*D$5l l\$55lL$$,lt$l$ $+f5$5f>=v=vex$D$*L$ l5<lډ|$<l5L$|$$lD$ $>5f5c$T$L*σ??A$fD$Hf*@D$Hf~1t t@t@tCf|$5/t$Lf\/$¸$=)/$8$L1t t@t@t{f|$ $T$t"@u5$$,)9j%^%$t$$=<$5~t$t4$$f54/$5Jf~(n$߈NAVT$PfN ʼnn$fVB$5f<=6$<f5.$<$xt$t0)- fi1#G?f=>k8fPBf=>Df@kO$5U49D$tP 9[Yf,f5et$xPxl$*\$Hl54lt$5 l\$,lL$$l$ =:\$LB1ɋ$11f5ff 21t t@t@tkf|$l$tx0Ffx|$ρd5D$ |$,$ft+$u=$ƃ$~x9tS$rq=i$l$$$5f'$L$txd50EfxT$ |$\$ $fW$xf;n5ft =$f5$}$5f)t =~$)f5$11111fܪ$f|fFLfFfx5plf5f*$5$5f<*xf$\$x<@=v $$$ܩl$<$1L$$Lu PtD$$Pt$ l$ $|$T$t"%f"5f#tz=v^x|$*L$ l54l‰t$5lL$$<l\$|$ $#f5$5f=vdx$L$*D$Hl5,ll$,l5D$l$$ lL$ $f5$1%f%f%$5$f9te$x@f_O515fxf;f5f>$;f5v$$U+t$$5v$5$xBf*fxY$5w$ O|f8fxf$8f5v8|$t$6D$ "l$|$0\$L$t$"f"5$x@fxfxif=i$5$5f+Xf<+W$5fPxf~rM$xf:cf_1f511f5f̫fʫ$1fB@f ~51f«fpvg$l$*T$`l5l\$l5T$\$$,ll$ $f5$5f)t{vcxT$*D$l54lىt$4l5D$t$$lT$ $)f5$1f5eff'$Lf@f@f@f@"f@f@f@@$r@,rf@( f@* f@ $5$f5c$xAf_fx~&L$t"f"fvb$xf~5tf5~vfMM$f55cfi11f51f̫fʫf5$1fC@f ~51f«ftv=vZ|$*t$5`l5 lL$ l5t$L$$<l|$ $f5$5f)tz=v^xt$*l$-l5lʉD$l5l$D$$4lt$ $)f5$1۸f5eff$$LfBfBfBfB"fBfBfBfB( fB* fB 5B$rB,rEt&$x@fx2Y$xf*Xf_~0D$tfMX|$t$fx$|Ã\9G$ff Ш!)؃cf?$f~$~ly=fxl$t>@>f$>f(ffff $$5fHW ز$Hf5|$t"6f6f"N$5Bl$59$x@f2fx9J|L94f5 11f̫1f5fʫf5$1fB@f ~1f«5fXvm$֋4lxl$*t$4lD$`l5t$D$$,ll$ 5$f5f)vj$xl$*D$l5<l։|$<l5D$|$$,ll$ $)f5$1f5effA~$Lf@f@f@f@"f@f@f@@$r@,rf@( f@* f@ }$|$Px9GZM=fxT$t>>>f(@f$ffff<$5fHt =$Hf5\$t$"6f6f"5$c$x@f_B51fxуf55f3tc=$3f551$1fzfBHpfxf;A}7AtX$5!fAx$@fxQ9JT$x!TfHf ЮpfO5M$1fzr^$7A5f5Afd$5$x@f(fxHA|كL9}%=r$Px9@L$t"f"cf̫cx|)ƍtf~-Ԟ$~fЋ$r$5|f/fxt =!q$/f5t$t$6fd5鐿T$$$xt$54*Aff*5fOw+;D$Of5$5f+t6$+f5f$L|$D$|$|$tL$ Pt$$(l$5$D$$lT$5鎻111ɉL5f1fP5fR5`5<$KL${|$kl$ st$$D$酾)l$<$1҉T$H%!fD$H,6@fD$H˽L$Ht ȋ|$tVl$TL$ RD$$T$ۼ<$`i$` l$xi ` T$ i` t$$,|$ɻZf5f|$x防3   PN龼5$3 O L$H$鿷D$x"$5f@ f&$kSSl$H5f5fVt =-$Vf5$11ɉD$1|$` PL$ t$T$,$$N\) )i` $=fx D$5$X\$L$ti:fTʸl$ti:fV/f f  Ȩ$H$錶։Ձtr#f ~bD$t"f)\$tʃ f& f9g:l$tf |$t$f=a@f$ $fp5'&T$t$ f"ft f"\$t$0$؁d5T$ l$ D$fi =v"6L$"$|$$1\$L1fl5|$tfp5fv5f$Bf5fG)"f%f"U58̪\ f~NfF(|$Pf~ωN$(xl$*D$5<l m|$54lL$$lt$D$ 鞸 |$H$逳$lS,{"C*Gff{" Kf+sfCf9fsfs( ‰S$fCf{{$Ci͉tt5!fCuC(HfC($|$LD$Hl$H51f54$f?h$f5eS-t&T$t$8 ̪l$t$$=D$t>>>@"f(df$ffff"f65f+t =$+f5$5f22@fffff*$5qf~ u^"fFV,F*fFCf^"fF(fFV$0f?x\$*|$=Hl5,ll$5ʋ4l|$lt$$\$ xL$ʉ|$5llD$55m\$$<lt$|$ =n$1ɻ$f*f5LlD$<$$f5e$lf@f@f@f@"f@f@$f@f@(f@*f@ @$r@,r1f5Jx\$*|$=Ll54lt$4l5|$t$$l\$ xt$ L$t \$ L$$5$5lS"T$ *l$$|$D l$H$D$^f F$l$PfF(fnY|$tf|$t>55Affff}t$\$$0$@$~x99fy',9A$5rfCfCfCS$fC(U=v $$5fTtz=v^xD$*L$ Pm5,ll$,l5L$l$$lD$ $Tf5$5f#tz=v^xL$*t$5l5l\$5<lt$$ l|$L$ $#f5$ffٟ$5fQt =g$Qf5$5f#t =!&$#f5$11fxf*b$$f5e5HX:f9 b$f5$fxfS=D#$Sf5x|$*L$ l5,ll$,l5L$l$$<l|$ xT$$|$=m5lщ\$l5|$\$$4lt$ =$|$t S$k(&!֋$ ƍEfC(5t$pf);?f>=s$|$)f5fC|$tfC"L$H$*xD$*L$ l5,ll$5lL$l\$$D$ xT$*D$m5l\$5,lD$ll$$T$ ܽx\$*L$ l54lt$5<lL$$l|$\$ t$ \$tl$$ \$ <$t$ $\$l $t$$5鶜$f5e$ܩD$$1L$$LP}D$$Pl$ L$$t$|$t"%f"5f#t =\$#f5$5ft =$f5$1%f% f%,$\$t6iff@fbtmt$t1"ff"`8|$\$ <$l$D$T$t"y$=7$\$$$f`x|$*l$-m5 l‰L$54ll$$<lt$|$ B$T$5$/x1D$ml$-m5<l|$5l$D$$l\$ {$$$D$x$L$ $`$@+W$01` D$L$|$tfy=v $$|$$$fb~ fxCf_t$tf׹1Lt$l$$11f@1l1ɘL,f|㋔$Jabk8CV957$PAfP$Tf9P!=v $\$1҉1fB(P@fB* fBB,f~fC$1fC.1fCZ fJfP55fTLf.fRf5tz=v^xt$*l$5llD$5ʋl\$,lD$$l$ $.f5$5f+tz=v^xL$*l$-l5lډD$l5l$D$$4lt$ $+f5$5f>>@"f(df$ffff"f65f++fff@fxt$\$l5,ll$5 l\$$lL$T$ =|$$D$$504$d5 \$D$ L$f=v"*T$6$|$$f5e$5f..fff@f(fCf>/3fKfK( S$@xD$*l$-l5 lL$5<ll$l|$$D$ x$l$*|$=l5lʉ\$l5|$\$$,ll$ d$5颏t$t(f2xD$l*L$5,lll$5D$\$$4lt$ dx\$l*D$54l,lt$5\$l$$ lL$ t$tL$t>>>ffft$ \$t|$$ \$ <$t$ $\$lt$,$1,$D$L$\$1ۉT$<$$11ɋ$1x,,kf~܋$ɉ 1ȪfύYBfzBBBBB B$B,f~$5 $fx鯭x1Ét$58m|$5 l‰L$ l5t$L$$<l|$ 駯xD$*l$-Tl5 lL$ l5l$L$$lD$ w5\$Lf5fI=v^xt$*|$=Pl5lD$5 l|$$4lL$t$ $f5xD$*t$5l,l\$5 Pll$$lL$D$ T$xH lf@f@f@f@"f@ x f*t$T$`l5 lL$5=lT$$,l|$l$ )$iثfm$5f, |$t$f91=u$$$Mul$t f(tGt` t s%$srPCC@ul$tf\$t bf:f6Qu|$t1 1ҽ"f"t$$L$D$l$ 1T$\$d5$"1(f"$f l$1t$1D$ l$T$$T$"1$l$Lf"f5f5Txl$l*D$l5T$D$ $4l lt$L$5$xD$*|$=l5 llL$5|$T$$lD$ l$tL$t& fft1f f"Xr$ft f$`=v $$$l<$LL$lfFfFfFfF"fFfFfFF$rF,rfF( fF* fF A$i=ƒ=f5-$5s$\$t"*t$t"6f=4f" fbv|$t6$0t$$1 f@fBBB,f~fAf1fA. fAZ $lf@fBBB,f~fA$fA.fAZ f5xL$*t$5Xm5,ll$5lt$ lD$$L$ t$ \$t|$$  \$<$t$ t$$\$l4$l$1D$4$\$1ۉT$<$$111ɉx,,ōCf~܋$ɉ\"D1Ī1f@fBBB,f~fGfG. 1fGZ ff@fBBB,f~fFfF.fFZ f$5$ifD$t>6f6f+t!f{fCfCC$fCfC(vxD$*|$5l4l\$5 Dmt$$lL$D$ 6x$L$*\$l5<l|$<l5\$|$$ lL$ f{ -]fCfCfCS$fC($iUfex1ɉL$ʉD$Tm5,lll$5D$\$$4lt$ $i$1ȪYxD$ll$-(m5D$l$ $<lщ|$<l|$58C s(9(k8KT9(Sd9'$P@fP鼟$5 $5$5fx$5f`#fHi/$X1$5$5|$|о$5V$fxo$5011fʫ1f5f̫f5$1fG@f ~1ff«Rv_ÉD$`l*\$ً l54lt$5D$L$$<l|$ $f5$5f)t|vdxl$-l*t$5<ll|$5T$l$$l\$ $)f5$1f5effQ$Lf@f@f@f@"f@f@f@@$r@,rf@( f@* f@  Q$5f,f$5}$5|V T$T$t~|$FD$NL$ nl$$d|$e$xl$*t$5Lm5 lډL$ l5t$L$$,ll$ R4$f5sdl$t`fbG\$t1$5{$|$~*$9$5{$xt$*\$Hm5lʉD$5<l\$$4l|$t$ $5{5=f5+$5zx(mT$щ\$rf=~t$tf6nt&f?t=vc$*D$*l$-l5l։\$l5l$\$$lD$ $?f5$5ftz=v^xD$*l$-`l5<l|$5ڋ ll$lL$$D$ $f5$111ìf*fxf5l\$4$= 4BB=` A= sA$1lfAfAfAfA"fA&fAfAfA(fA*fA A$rA,rf5ff6KL$,CD$(kl$${ |$ S T$KL$CD$kl${+|$ \$$T$0|$$t$ $d5|$f=v $0T$t$"@f"L$$5o5fB=\$f5c\$5f5[$11f̫fʫf51$1fF@f ~1f«5ft =V[$f5$5f)t =:$)f5$1f5eff&$Lf@f@f@f@"f@f@$1f@f@( f@* f@ @$r@,rfx_$5dm$5QmAf9'=v $d$5f+tz=v^x|$=l*t$5 l,lL$5|$l$$l\$ $+f5$5f)tz=v^xt$*l$-l5lʉD$l5l$D$$4lt$ $)f5$1۹pf@f5fffY$11ӁL5f51lf5f̫fʫ$1fF@f ~1f«5ftz=v^xL$*l$5l=`lD$5l|$,lD$$l$ $f5$5f)=vex$t$*L$5l-lD$5ll$ lD$$L$ $)f5$1f5effVXfCfCfCfC"fCfCfCC$rC,rfC( fC* fC =&$5ifA$xL"$5f5~"$11ۺf̫1fʫf5$1fB@f ~1f«5ft =5"$f5$5f)t = $)f5$1ɽf5eff86$Lf@f@f@f@"f@f@1f@@$r@,rf@( f@* f@ $fxژ5=$f55|f7fxtt=vXD$*|$=l5lʉD$5l|$$,l\$l$ $7f5t$t$"6 fdf"5:glfx Pfx"Ef@ :$5f$fx%=r=vz$+t$$z@f &H1ۺ1fz1f5Ll1f̫fʫf5$1fG@f ~51f«fGvcxD$*t$5,lʉl$,l5=`ll$$4l|$t$ $f5$5f)t{vcx|$*D$5,l5ll$5ʋ,lt$ll$$D$ $)f5$1f5effJfCfCfCfC"fCfCfCC$rC,rfC( fC* fC I$5Y$5ft%=$f5f2t =S$2f5$1fx d5f55c$5c$`p$D$p$@+pt&$x$L$*l$-Pm5<l|$<l5l$|$$ lL$ 錈xl$*|$5llD$55l\$$,lt$l$ ]$5b$of, >>$,f5$1pf@f5ful$t"f"$1ۃfxG$5a==$5fTt%=s>$Tf5T$5f#t =f=$#f5$ff[afC(S$fC$1퉩ĪffCfCC$fCfC($1fx5f+t =>$+f5$5f3>=>$3f55`$1fPfJx$\$*|$=l54lt$4l5|$t$$l\$ KC93Qf6f6ff@f|$t>>>fff@f ~ D$t>22@ffffOL$t>55Affffe  \$t>++ff|$t>.f.f511f*fxftp=vT11D$l$-`l5l\$54ll$$lt$D$ $f5$$ܩީ% f5|$$=$f5v$ ,D$$4$v'\$$dL$$ܩvoZ\$,JL$(BD$$z |$ $j l$rt$2,Z\$JL$BD$ ܩt$$l$$$pìlt$,$.s$1$ $t$$l4$L$lf@f@f@f@"f@&f@f@f@(f@*f@ 5@$r@,rf5f?vbxl$*L$5<ll|$5D$$ l,lL$ l$$?f5rST$,kl$(KL$$C D$ ${ |$st$ST$kl$KE,L$ \$|$ xt$*\$5l-lD$5ʋll$lD$$\$ 1D$*|$5 l,lL$5ll$$l\$D$ _c\$xHLf@f@f@f@"f@d1D$ 21|$؉t$L$l$T$c$fxdfxL|lp\$<$f5fup<$t$$11ɿ5f̫fʫf5f51$1fA@f ~1f«5fvcxt$*D$5<l-`l|$5ʋ<ll$l|$$D$ $f5$5f)tzvbxL$*t$5,lll$5<lD$$4l|$t$ $)f5$1f5efffCfCfCfC"fCfCfCC$rC,rfC( fC* fC v $$5ƃ/$fxb|$xHffCfCfCfC"fCav$$ Kf%ft$f0$= t]9= $$ѽ=e ƽ$鯽$阽x\$*D$5 l<lL$55l|$$lt$\$ $D$p韵xl$*\$l5lD$l5\$D$$,ll$ ;D$*D$l5,ll$5 lD$$lL$\$ ^xL$*l$- m5l‹l\$5l$T$$ lL$ i\$t1ɋ$1҃ff f"4$D$ݭ$H$5L$xHfLf@f@f@f@"f@f$xEfxKf;;T$t"g=f"$5f)=njx|$*t$5l-lD$5ʋll$4lT$$t$ d $11\$$1ɋ$5Lf51lf5f̫fʫ$1fG@f ~51f«fvcxD$*l$54l `lt$5<lL$$,l|$l$ $f5$5f)t{vcx|$*D$54l-lt$5ʋ4ll$lt$$D$ $)f5$1f5efffCfCfCfC"fCfCfCC$rC,rfC( fC* fC y$5(CD$({|$$st$ k l$K L$ST$CD${|$ st$+$l$T$t"gɐf"tqK$$h*fMfh*CfE{f} sfufuK fMS fUC fEfE{f} sfu=LCD$({|$$st$ k l$K L$ST$CD${|$ st$+$l${$$5J'L$xHfCfCfCfC"fC:T$$HL$`$$5&=v $$$11D$1$$1$5Llf̫f5fʫf5$1fF@f ~51f«f3vcx|$*D$5,l `ll$54lL$$lt$D$ $f5$5f)tzvbxt$*|$5,lll$5ʋ,lD$<ll$$|$ $)f5$1f5eff$fCfCfCfC"fCfCfCC$rC,rfC( fC* fC $5y$ K"fCfCfCAfK"S$fC(BSv$@x l\$$*D$l5L$ D$$,ll$,ll$5.xl$*D$l5 lL$5ދ<lD$,l|$$l$ xT$*D$5,l<ll$55Pm|$$lt$T$ *$DOC$$5"L$xHfCfCfCfC"fCx\$*l$-l5<l|$5 ll$$lL$\$ $5"1D$*\$l54lt$5,l\$ll$$D$ $It$xHgLf@f@f@f@"f@g|f~Ca$|t$ ~T$̫$L$`l$t0"f"|$߁d5D$ |$,$fuf`$11һ15f̫fʫf5f5$1fB@f ~51f«fqvk$xl$*T$`l5lً lD$5T$L$$,ll$ $f5$5f)t|vdxT$*\$l54lt$4l5\$t$$lT$ $)f5$1f5effX$Lf@f@f@f@"f@f@f@@$r@,rf@( f@* f@ $5$i̪̪5|и$fz5.$̪ @̪50i̪̪5$̪5,4̪ $$5\$xHLf@f@f@f@"f@f5\11f51f̫fʫf5$1fB@f ~51f«fvn$֋4lx|$*t$4ll$-`l5t$l$$<l|$ 5$f5f)vk$x|$*l$-l5l։D$l5l$D$$<l|$ $)f5$1ɸf5eff$Lf@f@f@f@"f@f@f@@$r@,rf@( f@* f@ w1$|Z$5O$@$|Z|$xHCLf@f@f@f@"f@C$$5頝L$xHϵfCfCfCfC"fCʵ1ۉ\$*t$5l5<l‰|$<l5t$|$$l\$ WT$t6$L$5K$ivl$$/k$fnfh*CfF{f~ kfnfnK fNC fF{ f~f~kfn K\$tfN"|$t 1ɋ$f"1fffxv"$(T$t$t$<$DD$\$t"@t f"$f5u4$f5|$t@f5zt$t"0%K$$5f,=vdx$t$*l$5<ll|$l5D$T$$,ll$ $,f5$1fxfCfCđ$0` \$t$#T$TD$qxt$*D$l5,ll$5lD$$4l\$t$ B{x$D$*|$=Hl5 lL$ l5|$L$$lD$ {LK7D$t$fl$tftL|$tfÌ|$tf飌D$t1g\$t>6f6ff@f |$t>>>fff@fы ~ D$t>22@ffff~L$t>55AffffEe 9\$t>+f+f|$t>..fft$\$$0锊6t$T$|$\$ $/$$59\$xHHLf@f@f@f@"f@H$D$陊$(5$x\$*t$5 m5,l‰l$,l5t$l$$l\$ L L$0` t$T$K$f~K$U+T$Gx\$*l$-`l5lʉD$l5l$D$$4lt$ G$5$5t$T醣*D$*L$5,l5ll$5t$$ llL$ D$x=f@ $X,T$xHfCfCfCfC"fC铧t&'WVS\$ 8dH")=evC"vF*f9"|fd~%t&'$*f9|f>[^_*f9"}/ $*f9|썶f>$f=/u@f$$f;RUX@fX8H)=2vf;T7Z@fZ)ʁuf;V\Gf>f\Y "@f9X %Z9\9$|$1f\1ɉ"1ҸfXfZf^=f`\$ [^_t&11f\[1$T$f9Xȃ11"1=fXfZf\" $|$1f\1ɉ"1ҸfXfZf^=f`$Z9u$D$"11fX1fZf\f^=f`w%$$i,$$?$9D$xlt ЀȀ؀Ԁ<ĀxPh8Hx@X<DTÍt&'VST$ Br1v"ZJ RfCfAfB@9w=w[^ûH\$ [^'S\$T$ CfQKA9wʉ[Ít&'U1WVSD$t$xXtWAfJuT$>L$2Pt$A F9w)L$fD{Yv;Iu[^_]Ðt&UWVSD$l$p Hx@v,‰ffKu[^_]ÐSD$1ۋH@vJu[Ít&'UWVS |$ t$$x S\9BkX k~%SJtf9uJuv'C`9)ŋ^9؍P ~!Itf9uFITBut&88^Q9~"Itf9unITju퐍t& !1 $ 1ۉl$D$t$ ("\$$$"G 9s %fKy [^_]É$ 1L$D$FTC2NTK D$L$1҉T$$ Í&'T$D$PTÍt&T$D$ ÐVS$L$0a1YR҅~&'f f(T$$D$(t$4  ff@1) ͐t&l$XT]fL]C΃'~݃`[^_] L$1ʐ&f@fBfB fBfBfBf~1fDA$@fOvÍv'UW1VS $ D$  pt& TlD$?T$?$L$$'l$~$4$ [^_]É'SL$\$ 1҉T$$f[ËT$$&1fB@1fB@+~Ðt&S\$D$ L$fSBPfSt[1[Ðt&U11WVST$,L$|$,t$,D$\$,@à|$t$\$ L&L$|$,t$ D$D$o9 nE0׉ȃD$)T$\$O~T$,1틚$JL$|$,t$ D$D$o9 nE0׉ȃD$)T$\$9,$l$4\$D$0T$][^_]É'UWVSD$(\$,l$(|$(L$0t$(\$T$(@\$(ƀL$  T$ t&U‹D$(HD$)‹D$HD$ )‰fEf‹D$(HD$ )‹D$HA$D$‰ffO~D$(1ɋT$~U‹D$(HD$)‹D$HD$ )‰fEf‹D$(HD$ )‹D$HA$D$‰ff9L$[^_]Ít&U1WVST$$\$(D$t$$l$,|$$\$ \$$P$ƈH,ǠL$(OPԃ$D$]D$$HD$ )O)D$$fH$)OAD$ f;L$|1bt&D$$HD$ )O)D$$fH$)OAD$ f;L$|[^_]Ã|$O$D$PD$t&UWV1S1L$|$;t$ _f _l$D]CΉ;\$ r[^_]ÍvU1WVS |$(D$$L$f9D$D$}bWdoT$\$ 1D$ C1ۍ_f _D]C΃*r $@\$t$@L$ D$f9fY| [^_]Ðt&UWVS,|$PD$H=\$Dt$LD$(D$TSL$@  t|$@`  uxf|$(@=D$@ @@{\$@<| tp ;e !T$@ b=!\$@ O@6CC| L$@A$ ~\1Ǎ 6L$$1҃N~/ DMIfSB9?fSB?~T$$Ou|$(% |$(@ |$(t =9|$@GGL$T[D$@@1҉ ,[^_]A 1Aż T$D$,$L$@1Ҹ D$T$ $ f|$(D$@@E @@]D$@D| p Ct$@ X|$T$Tt$ D$T$\$$0 =t$@ \$$X&l$@E }EU }U,[^_]Á|$(k}|$(K|$(.D$@@@6|$@GG|$(Q|$(\$@CC|$(|$(` l$@EEf|$(@@:D$@ @@ T$@9|  8D\$@ OO  CC| pMt$@ Xt$@FFT$@BB1D| $H\$(\$l$@EE(L$@AA$l$@E EE@79| t$@FFHL$@AAt7@L| `L J If|$(%D$@ @K t!L$@J| 붺<| J| 뙐U1WVS@1ۉ\$8L$T\$TD$X T$44SfK fs C T$9ЉD$D$T$ T$T0D$T|$l$Tzt$$p]|$l$T|$Tt$ T$Tt$T\$ ] ,NT$(\$D$l$0$L$1\$T$4ً\$0L$<ü S|$$$|$<wF$9t$$ډ\$ l$t$ |$ ݋\$$l$,l$G ,_|$C$\$9| )<$<$|$11)ʍ ȍ&'D$(|$Xf X_C΃rߍ \$\t$8L$fsF9L$,t$8$|$TG1҃|$$2\$l$TD$8)\$L$M @[^_]Ët$T1ҋL$$|$$~΋|$TW fW B9T$$1Ƀ|$$!D$4t$TF A9L$$fF ݋\$l$TD$8)\$L$M @[^_]ÐUWV1S \$ L$,T$4D$8l$(|$0L$T$$ 1ҍ 6t&'fDCfDCBf~Vf~fkߋl$f{4$|$fC L$$fCfk f{fsfC [^_]ÍUWVSD$ t$9D$.&T$1:T$T]D^T] D^C)~^fNFf~f^1fFT]D^T]  D^ C)~F^ f~fFFf^"1i<fN )׋L$ 9L$f~$f~ tZf~t7Vf;V} NAfNf;V~fF^ f9^1[^_]f~t-~f9~~VBfVn1EfnfxfF f~~fFl$1"%f"fF떐UWVS l$(D$$$D$D$,f9$D$t$ 1h^%?f]@%ӉNRW$F^^ $$F^,f;|$|$@$D$f9$p [^_]Ð&UWVS |$ D$$$L$(f9$D$L$'L$G_GG41fW _ t&))ى1u.Cf~fG$,\$@f9؉$| [^_]Ísfw D$ÐU1WVS\\$pL$,T$pl$0D$p\$(T$$D$ D$t1ۋt$(L$$8D$tf> t&'Sf ~L$$f}1ۃ 'ǍCf ~t$$ f}\$ l$ 1L$'Uf ƒD$Gf ~|$D$,\$ l$@f+݃D$,ft$||$01T$pĀLFL$ Nr1ۍVt&fCf/~D$f^]ff ~L$(1ҍl$0T$t$(|$("L$t$|$T$1ɍv']Aȃff~L$q11ۍv'SfO~D$|L$t$xT$X)1f\$(1Ƌ9^19}#_‰$L$$C9||$(7\$ t$|$l$Í&D u 늉։뜍T yT$у`V `V D$T$Í&'T$f҉xÍvÍv'L$Af|$tt5!fAÍ&WVSt$1ft&f9wCf~މ1[^_ÉS\$KSil = ШtrfKC udC-fҍ0x]f~GC S fҍxKf~=fCf~EKi 9fC[1fC늍t&-fK1[É-Cf=jȘiG UWV1S1ۋl$0UT$f&f9wCf~މD \$ |$ɉW߻Tt T\$1D$fh1ɍt&MhQf'~1ɍf71&'BYff&~D$\$@fD$~\$ 1|$Hff#fTG"~ 1f~f~ŋL$1۾#"&9Fi׎f@u1tvfD$؍t$=\$w1Q=vff\$4 9t D$fD$T$@@f=vTǘ\$ f1߃ f FfD$Hʉf Шuĉff=aT$Af fufBf $u=f M111f L$f fFfIT$ 112i̓f~|$O_ilLÁ بfOT$B u{rfҍ0f~Yl$E ] fҍfD$ff@|$_i 9fw1[^_]ÉD$$.fp|$fGC$-J-iT$fJ둉@f=jiGfJrv'SL$f=~XQ1fИf)әfxTf3ef=f~ f[fAҘ)Љfyf3~11ff[ÍWVS|$1$f&f9w(Cf~މ$1[^_É0|$(|$4\$ t$$l$,o4fW$G"fT$)fw&f9f~#o(fO4G0\$o4fw$ ЉG0f tFtBw0&'GYˉtt5!fGuw0EfG4\$ t$$|$(l$,0Í&fw4G0ވO(Aol$fO(fo$ ЉG0NuJf upf*t_,fGW8o1|$ut$GD$0H Yu#€tW\$0D$H fF @D$UL$0D$H fF@D$7$L$0X u1=wFO@D$0|$H f~G|$X l$0D$H fF @D$$t$0X 뢍&U1W1V1S<1ۉ\$ l$P1ۉ|$(H t$$T$8ffA| D$0f~'t&]T %=C9f^X BB1tTыH G$\$8D$8Ƀf ^X L71uf=t$8H X fpAfDpfDpt$81f|$(…f|$$1f|$ G| 11ۉt$fC9]T %=uG1/T$ X FL>1҃…tYщ$]T 9u|$8FL$H CfxG|$8X L>1҃…u|> Ȩt t$| C9H t&t$8fsaF1f|$(…t0f|$$1f|$ tfs|$8fD{=fC,fC$fC(fC,fk"fC& fC C0C8fC4fC<fC*<[^_]]T f=f=f= ,f= =fL$0f1f|$0…]T t$8H fqF]T t$8ff'| 1ɋ\$8\$4f9t&‰aUA9MT ցAut$8H s!fsFMT AT$(MT Ѓ9D$8‰av A߃9ˉD$$jt&'=X 1f|$(4f|$$1f|$ …=H \$4 ^f ^1f|$(…'| 11\$f~.uT %=F9H fGG1&'F$Ћ|$8҃f{H  {G|$8X fL>1uMsA!fst$8MT Ѓ9*sAD$8!fsMT D$ =X VF1~-T$0hX GL71҃…Mщ$]T Ƀ9uL$8Ct$0H fHAL$8fJ@u"T$8H fPBT$8t$8H fwFt$8rT$$@t$$pH =X t$ |$$$L$(t$ |$T$L$f|$( Ȩuf|$$f|$  ШsL$8fKAL$8fSX |7 Ȩtq|$0x]T 1Љ$D$/X y T$/8T F| 1҃…u$Gt$0$DX Hu"t$8H fq Ft$8t$8H fs Ft$8G(uD$f1f|$…1f|$(Åf|$$1f|$ …uT f=nL$8H fKAL$8uT ff1ۀtHT;$uT 9tUT$X C|;1u|; بt T$1f|$8FL$H fxG|$8f둋H (uT T$8H fSBT$8f=_\$qX jF@uT 1<$X (48L;(C|;(1҃…uf6=,$|=$F=$=wrJ@T$8H fWBT$8X J$$=$LX H $$X wU1WV1S|$0 ff9E9-o %=uރ=X SWC10t&fX FL1҃…tU$o ۃ9ufX fFEL1҃…u| بtf11fffto f E911fɉl$F9w %=uދX CLC1~)D$X EL1҃…tQщ$w Ƀ9ufE\$X FL1҃…ut&| Ȩt l$q F1f9t&=v9/fuT$f/u#/T$$[^_]Ío f=tOf=tmf= f= L4vffjT$$9C@ =w@f=v$f$$ዟX wX C=v$ f&'D$1ɺf f ÍS1҃L$ fCfCfCfC B f $>D$fCfC[Ít&'W1ҹVS 1ۋt$0~f> 1f 1f  f 1f@ 4$4$ 11f 11fD 1ۉ 1ɉ 1҅ffftH 1[^_úf L f f fG ~ i€%\P ~ i€%`11ɉd2L$1pVT$d L$T$D$\$T |$ 4$@ $H L 4$f 1ɃH f f 1f 11f 1f f f X f 1f 1f 1f 1ɉ f f G% T H GUP f f  G@ ȃGt 1f 1 f f f 1f 1f 1f <f2 f8 1f< 1f@ 1f6 1f: 1f4 D L fH fP f> 111f f [^_ÍvL f f ~ i€%\P ~ i€%` 1fC1fCfCfC B df $>D$fC1ɺfC L$T$4$H T L fG 14$f 11f 1f [^_É ȃA'WVS|$ \$$'  %?f $fNy̓[^_ÍU1WVS \$ |$$ä 'sSK%?fс?fK $$ D$S@$T$K  $t$$T$ D$$fEf]f{tC @f=8t fC [^_]{fC f{ [^_]Í&UWVS v'f9t$P (w$V\$P&'L$P  Ձ?f ,$fNyȋ\$P$_\$P< $l$( f9& f( Lt$P> f9)T$Pf~2 #| jv'1<[^_]ËD$P`td9\$P< $|$( f9& f( t$Pd> g\$P\td9|$P1\$Pä t&sSK%?fс?fK $$ D$S@$T$K  $t$$t$PD$4$fEf]f{tC @f=8fC |$P<$T$Pd>T$P1f@f~t$P4$(c-%vD$P$H 4$ f< Gf Bff> L$P1f@ F)9))J!fJuT$P1@ f> @f@ fB 붋\$P$ EfXf z|$,()f f fG 1f Jl$PF D f9fJ f*t1@f8 f: fF f)f#\$Pf8 : 1f8 f(f,[jf11t$Pf |$P1f zf fuˋl$P @f fB HD BfD fF +ٸT f H "\$PD e|$P f 9n=v'I./t/D$$(L$PdT$P@dL$Pf uL$P fы\2d9t$P@d\$\$4$f|$,$1f 1f G d%fG T$P: %= =U t$PX @P fUfB@f~l$P,1f f f fB(1f8 f: B\$P 5t$PX  GŃ-f |$l$PD$ |$Ŕ ,$T$P fAH fx4׽ǔ H f f L$Pf h=l$P1|$1D$,$)\$,1ҹ(fC \$Pf X f< f f f f F+f =v$P\$Pdt$P@dT$ L$$L$P@f=f dcf f Dl$P f "L$PdL ffB@f~|$P(1f f f fB(1f8 f:  @ff l$Pcf f q=\$P@dD$P|$PP  Sf f ^f !Nى߁݁n  1~U!f9N!=L$P q2T$Pf f f f RP WT$G$tD$L$Pf ftB|$PL  ,^9tff ^T$P @f \$Pj L f9J(fL$P fB(f f z$1/t$PZ f Af G$t$Pd=v$|$PP F\$PŃ= v:~T$N$Ήt$\$Pcf f =v $8L$P)f ]$X|$PP QT$ qt$AD$il$Y\$y|$ QT$q$|t$&D H \$P*1f f dl$P1ۉ,$L$P1f H f f< F0fF4|$,1\$Pw ofw f@ f |$P<$\$PH t#L$P#f 릺3f T2f 뇐UW1VS 1ۋT$ t$$fF$*Wl$L^$C $ǃ~1&WT$D^*C$)ǃ~1۽)DV$)CfDN$DV*fDN*~f~* [^_] UWV1S |$$l$ T$( rL$Dw$T$(LrL$DwF$)Ã~wf_Gfofw1fGT$(DrD$Lw $T$(Dr D$Lw F $)Ã~w f_ Ofofw"fO [^_]UWV1S \$$L$0T$8D$<l$,|$4L$T$$ 1ҍ 6t&'fDCfDCBf~Vf~1Ґt&1&'@f~fDS$rfDS*f~fkT$(f{,$D$fC L$fCfC fKfkfCfC0\$ {&f{& [^_]Ðt&UWVSD$0T$8|$49P,t&\$81 1fO$*WT$l_$C,$ƃ~1&WL$D_*C$)ƃ~1۽)DW$)CfDO$DW*fDO*~fw*΋t$8L$ft$8/1TuT$Lw $DuD$TwF$)Ã~|$OGt$f_fw1fOfG\$TuT$Lw $Du D$Tw F$)Ã~wˋT$o f_ fwfWfo" $ø<D$w4$,foT$8D$09P,dft:Wf;W} _Cf_f;W~fGo f9o1҃[^_]ftGf9G~OAfOf0~1W0Bf3fW0ufGt$01^&f^&fGfG01또t&T$11f@BBfBfB fB fBfDB@9ÍvU1WV1S,l$@|$Ht$ EUuT$]|$(}D$|$(E\$L$$D$qD$ U]9/U iU fEBL$ fU &'\$ &w!f} ~=fT$$L$D\$D$$QfsD$$9D$(FT$;D$ !Ɖ)fD$$L$DAD$ p)ɁD$D$X)ϋD$)\$i\$D$K\$9ÉT$UBfEL$  \fu\$t$}]u,[^_]$T$ T$UWVS|$$D$($l$ f9$D$}vv'\$1JK%?f@W@%S@WFSf9|$@$D$f9$|[^_]ÍUWVSl$1|$t$*EUfE Cf9|[^_]ÍD$@WÐT$1v'1fB @'v11ɉ 1 Í&L$T$ D$ L$ D$ ÍvUWVS(D$ 1f@ fD fF [^_ú=@\\ T$D$<$Df" B f$ $$2L$f* 1`Zf, ZYf. @Yt&UW1VS l$ D$$ tn&' Cf  $S $T$,$D$fGf~l$ [^_]vS%f$K $L$,$D$fWf~럐D$D$&'S\$$=wsCdt=$Clt=wu$S|uVCpCdu1=w[ûS1\$[$n1|$ōvKx $띍v$Cl$wt&$<Cd$?t&L$11 vB9 ]u]B~ÍvU1WVSLl$ =\$`T$(22|$ t$dL$$7C~{ VS$N ;CxK(t$$=C|ƃS$L$811t$01T$ l$D$$ClK$|$0t$L$ l$$Cd-h] x]l]p]+=t]K5|]S-]C1ɉ{ sk'1&Ƅ @~A ~1ɍv'1&Ƅ@~A ~1v'ƀp@ ~1ƀ@ ~1 &DD DD DD @ ~)1, - 9 <=A DEI LMtt&ƀ@ ~11,@@ ~1 ƀ$@ ~%k'K(s ) "C, #{`1D-L P5T=dƀr@ ~s1tvƀ|@ ~1ƀh@ ~l1mk1<@ ~C,i@C4=qt SL{,is@=sHwqL[^_]ú]] T$] D$|$ L$t$Sx$Cx(D$$1C|$1$1L[^_]CT\U11WVSl$$D$$L$ $ $t$\$G<W|GPRX 1ҋ$T$9D$w,"vLD$$9T$r|tSoPGD(<( T$t(9_01t=_8G<G4HG4XL_@\$Q&GD@;GHGD:=j<pt(9_01҅…t=_8G<GL\$$L$ L$T$Gx$~&91#=G4($<T$9_01=_8G<w,h11ɉT$$$ $l$HD$ l$\$E$H^$1@] @]T$L$w,$1w@1ۉș$;$D$}Ov'T\ C 1)i\?1);$|fc_TC;\$_T=G<0=\G8G<$1w,<t!0t=sG8G<=w w,t6D$;$})@v'$fDB@;$|T$ O\]D$o,$1@]\$`]\$O,$1@]T$"G`5d]t$G,$1,@]l$ L]L$W,$14@]t$ X]L$W,$14@]t$dD]D$o,$1@]\$$2]$2$dw,$$C$1,@]H]l$D$w,|5X]t$_,$1,@]l$? UWVS \$ =t$${ u&=w [^_]û\$ [^_]L$C$$C\zЉS`l$C$$S $ЉT${$t$,$|$=CXL${$<$Cl$C$$CT$K$ $C |$k$,$CD$S$$C1&'ƀ@ ~11҉@@ ~1 ƀ$@ ~+%C'S(K ) "{, #LC-DkP T=`-d=D$S$$D%s}t~{,MC,S,i<@@{4pt ,kL =xt$$2t$ [^_]t$$2:C`-L$k$,$"ʼnT${$<$gfffH )ƒE=D%s}t~D$$2L${$<$D$$2CT=woC,L${$<$D$$(C`s"L$S$$H )D$<냐\$ Ӆۉt$Ɖ|$l$T$tr$1҃dwc=I tT ШupP 1ҨtCti Ww5$|^ɃQv\$ Ћt$|$l$À|;t#vtnvG;u\$ t/=D$vD$$d\$ t$|$Ћl$ÃvG;뜋i|$G;냃QG;l_-$VƸS tPt&B=wCWw$_\$$3߸[^ø샾uuE|2,\[^11ɸ1ۉ1ɉ뿸땸͸럸w|3 ƒ Шna1mOBK- )v1ۃ=$tFx=R$A=($$1=$h 2=$=$VS\$ t$$Cd$T$=w:$؉Ã/3wf\$ 1f~Hl$$|$0L$(fQ1ɉONQf~DM|$ Oy)f~~ \$4f~|$0 fF ufU\$1ful$,t$(Ml$$ L$(fQ 1ɍt&'ONQf~DM|$Oy)f~~ \$4f~|$0fFufU\$1ful$,t$(Ml$$L$( fQ1ɍt&'ONQf~DM|$Oy)f~V \$,fVfFufMfuSf~Ltl$<1)t$`Li\?1)ߍ:Tfi\?1щ)ыV,1)B;Vtt$`D$8V,fL[^_]fFT$`ޘ9J$$9!1T$`9!f;r}z1t$`n 9~1ۉl$`9~ uD$8|$`11ɋD$8G,fffL[^_]Ått$`돋D$`H$u11҉ot&'t&' 4$a|$|$ 4$|$Ív'UWVS T$ \$$t$(ҋ|$,l$01t&'fBfDB2@~1 OfDJdA9|1&|MfJA9|K1ɍ'\$44KfJA~ [^_]$`' D$t$ É'UW1VS@D$X|$|$^vD$\$ L$n T$&\$\T$<1ɍt&N|$0OÍAf~&'T$(|$,DJO)ÍAf~ ^|$(fNf^\$4ffGK1fV1ɉ'T$8|$JOQf~߹v'T$$|$ DJO)ÍAf~ދL$8 yfy|$$fY\$4ffGK1fV 1ɐt&DM|$OQf~'T$|$DJO)ÍAf~M ]|$fMf]\$4ffGK1fV1ɐ&$|$JOQf~t&'T$|$ DJO)ÍAf~ދ<$ _f_\$fOL$4ffCQf~|$<\$\T$Xf{G9׉|$<@[^_]ÐLT$T\$<\$Pt$@1|$D1l$HT$$t]H v2=314$CC\$D$ $=yXt1`t'\td 77X`\dO  qG.   몺9T$4$11҉ƃ=l5D$ $X4T$$`7L$$d8D$ $\6T$$hXt"`t\td1҃=T$$5 $5bt$$5G  W   W $1[$1C$1҉L$T$D$$r3D$4$11=l9/L$$X.D$ $`1T$$d2L$$\0D$ $hXt"`t\tda1=D$$5 $=t$$5Et$$5&'S\$ $C11C[ÐUW1VS l$ v;|$(}EE;D$(~t$(UtB9|P)uBut}EEA;|$(| [^_]ËL$$fyG9|)tʉE땐t&U] $L$$ fyGE%?fE9|ċElEE9'S\$T$fCi§\C$fC [ÐWVS1t$|$‰1)~1)t&ʍC؅~[^_[^_Í&'WV@S|$1ۍ?=v;v"mЉ1)…~ڍCf~[^_"mω1)~׉ڍCf~[^_ÐT$f=w)И iؘÐt&fw iؘÍf=w)И iÍv iÍ&D$-)iÐS$Dt#$D1T$D$fC fC[t&'U1WVS4\$HT$0l$HL$H\$HT$HD$,}\$\$H(T$ qD$HK@|$(l$Ht$$|$PSBD$t$P l$D$PfK@9D$0fSB`L$L6m|$ 1UEOEOEO)E )f7)6.mfGGfWfGCfyD$L|$i \${f+fK:SD$i {fST$)D$i3)D$|$|$f{|$:ZiމRf{f+iKfS)i3)fKt$ɉ>iڋ\$sCfD$t$f{f 1iys)i3t$)‹D$fsf{9w)19w)ËD$,,ЍIL$(T,[<Ël$$؉T$,v|D$0LT$(l$P@T$$9D$0\$HL$$l$,s|$(+K9{sfC@1fCB4[^_]ËL$H\$$A 9D$,v!fy@~[fA@fAB4[^_]9D$(vD$HfxB~Gf@Bf@@뚋t$HfF@fFB4[^_]ËT$HfBB4[^_]ËD$Hf@@RVST$t$\$1fDf@f~fCfC0fC.afC$CCC C(fC,fC2?C$fCfC4t&fDC@f~X[^ÃufC$CCC C(fC,fC2$fC$CCC C(fC,fC2YfC$CCC C(fC,fC2&'U1WVS$D$H $_ $ =mfE,u$]f}(t$Duh^UV EFFF$EF FFf=@8F f=. f=% f=  fF(Ef=@8j f=.v f=% f=  fF*&'Ef UdfBv= f$t$pf~(tf$p Bv1҉L$Lf$r$pf~(fT$LV0^0$tBBfzN0))fBKfzD$LZӉZ VHFH1'fDB@f~fB1f:5 fB=fBfBfJ$Lt$D$@ $D=$H$d $Pt$H$@$X$\$`t$\$$TMh` $}d Gv=$0$4$0$8|$Dt$D$$<f$rUh$]0if&]h$1fFы!ȋ fDt$ $ $$$0$D$$Uh$Eh1ɺffft$T$]h$ًD$D$󥉄$$t$H T$t$MhH $Mh%ff$i%@Bhf$ft$DL$H$$EhL$T$ P$]h$}h1 Pw*CpfCnfCPt$@fC^fC`CdfCbChfCtt&fDCR@f~1 fDC@f~fT$HsfCfCS1fDf@f~|$@fFfF0fF.|$@ fF$FFF F(fF,fF2?^$fFf^4fDF@f~t$LP1P fDB@f~fB1f:PfBfBfJfB$pFP$t^fVP))f^HfV11ffFЉF E 1fffT$`L$d fD$`4=fD$b5fD$dD$lD$H|$ht$p \$t|$DT$|$fD$h'fD$fztfD$jfD$l||$xfD$~(fD$|]dC,t$`t$Udz,<$C,]df{vjfD$`D$HtC0t$}dO0 $C0\$HfD$` $]dC4t$MdQ4$C4Udi}LfBt]B| Bpfu6f]fu61f]ff|$~if&@fEif&@fzvfBlJx11ff|$,$t$,$\$1ۉ,$,$1҉T$,$D$MhD$PT$P0Pf~ludfF<fF>fF@fFBfFDfFFfFHD$MdfD$TfD$Vzty8fD$X<$1F8\$HT$1\$Ed$Eh1fPfPfPE0M1@E0X]4\U8dM@h}D4uL44 ]P4fEH1<}X4b}< rf]TEM\fu`f E=Č[^_]fHnUdfBvfF*fF(rfF*fF(\$C}h1})fN(,}d1fGtXT$t$ 1\$,$EdH,fA@|$,$E]dClCpSxC|fHE]dfCtU1ɉCxL$,$BlBx]dfD$`X]d[|$@*fF$FFF F(fF,fF2%$777|$t$=.$ST$ CD$K L${*|$st$ST$ CD$ $L$fF$FFF F(fF,fF2t 1҃})f^*hUdfBvpfF(fF*DfF$FFF F(fF,fF2$l$PEh$Ed@,@8$duh$TP]h$TPT$Ht&'L t$D1|$H|$\$@\$P;sSL$!fD$ft$$шL$!T$TCD${ D$f|$:sT$D$$fft$ft$L$,\$@t$D|$HLÍ&S\$CdH8 $SdB4$KdQ0$CdH, $Sh8P$L$Sh$D$KhH $T$Ch$L$Sh$D$Kh` $ShP$KhP$Cd $Sd$Ch$\$[t&'T$BhD$t&'T$L$BhPf=w JhPJhPÐUWVSD$,T$8\$,l$,HD$0J3|$4L$L$0t$ \uuhA l$l$0$D$ MfBL$D$tpT$ v'L$T$˃DL$ Ћ$fQB1Uf;D$!fB $uL$,,$|$0fqD$ f\Afo [^_]ÉL$Ѓ˃ڋL$T$ Ћ$fQB1ʍUf;L$!fB$uut&'UWVS|$D$(l$ T$ _t$$H}JT$<$:L$M >T$ fJQ1f;$!Ef@ut$f^\$ fK [^_]Ít&UWVS(t$<\$Hn~\$$^l$nMJ‰D$ ֋L$@T$֋T$@NƋqD$BL$)  1f9HD$@D$@$t$^$f|$Tfl$l$Pt$ |$,$D$^l[^_]f9f@-%1fD$HD$Xl$XT$X ')0) )1 2)  f9ÍDfFnE,fxnS0ChfD1fFT$D$$Ch011fff[ÐD$T$t&|#JhAA AËBh@@ @Í'WVSD$\$HdPHhf9}ЉЉ!f9}fsf3f9)ff9)f1fff~!fSrf9[^_Í& L$Qh0@d T$1ɋBh0BbtfBnfBbBt@fBtÍt&'T$1ɋBh0BbtfBnfBbÍt&D$ÉT$D$@h@*tt É u+t6t1t uعÐt& tѹÍt&@t @tt!щÍv'T$D$@h@*t.t*t&ftщÐt& u+t6t1t u붍 tѹ륐t&@t @tt!y'T$D$@h@*t%t!t&Ѹft u%t/t*t uƹ뿨 t׹봍t&@t @tt!댍T$D$@h@*t%t!t&Ѹft u%t/t*t uƹ뿨 t׹봍t&@t @tt!댍T$D$@h@*tt Ð u+t6t1t uعÍt& tѹÍv@t @t t!Ð&UWVSD$0T$l$|$SdJ4 $KdQ|<fuX>l$|$A,$f<Kd@ff1҉f>l$|$Q,$fKd)И!И=A|fyviL )ffyv$Kd9y|rK1C0AlApfAt!l$L$8$T$ L$f[^_]ËKd1D$$7Kd=&iL ))))И=fwf1fD$$8Kdύv,L$4t$ t$0|$$|$4$L$ff ШgVdBx@N1F0fBtB|JxNhN1F00fCbt&'=w[^ÐNdAt$^dstD$$q9t$[^ËSxfCt Cx$C|Cp4$fCDNdAD4$D$4$\$4$T$4$L$?F14$4$L$D$VdfBtB|fBDBp\$D$ L$T$4$Nd@Yx)ڃ?~)ЉAxKxf1CpSxfCtCxD$ L$fۉ4$ \$^d뮉4$D$\$4$4$L$FdVhf@t@l@x8fۉ4$1ӉL$\$D$T$ 4$^1^1f҉4$PT$Fd@p@|pfCtCxClD$4$4$ȉL$4$T$4$D$ L$T$fVhfBX4$D$4$L$VdfBtBx\$4$4$D$4$L$ ؉T$\$rN1L$4$4$؉\$4$T$\$L$D$ 4$NdfyD&AHA|fAt )ÉYxfCtClCxF14$4$D$4$D$4$1D$\$4$úD$T$L$ 4$L$4$1҉T$f> Fht1fPP8$F1CpD$4$\$L$T$ D$4$VdA|fAtApQxD$4$Cp\$4$\$D$L$ T$4$VSt$ ^dCt!wk$N1T$4$4$D$4$L$NdfyDApfAt Yx&=w[^ÐVdBt$^dstD$$q9t$[^ËKxC|SxN1CD4$D$Nh^00fBbqfCt Cx$C|Cp4$fCDFdXD4$\$4$L$fCtD$4$4$ȉL$4$T$f^dCx(N1F0fCtfCtCxC|Cl\$4$4$D$L$ T$D$4$XfCtCx@C|Cl\$4$4$1D$4$D$4$؉T$L$ \$4$1ɉL$f> Fht1fPPfCt1ҹfCxC|f\$ L$ 4$T$\$4$Fdf@tf@D@l@p@x8f@|ЉT$ D$\$4$4$1ɉL$4$4$T$D$\$ D$L$T$4$f14$D$\$4$4$L$^dVhfCtCxClCpC|T$ D$L$\$4$4$L$f14$4$D$4$D$4$1҉T$D$4$T$ D$L$VdfBxBl^hfCXQHA|fAt )ЉAxbUWVS|$0D$8L$0w o_9t$t$4l$fT$ Hf@L$Љ$T$0ŃBڈD$L$0AD$L$L$ L$!ˋ $1$T$ ˋ $1!f $t=|$$Ofl$fGttD$08fuŃ8,$kL$؉L$L$ L$! 11$l$! |$fOfGl$ut&t$0^[^_]úT$ UWVS|$0D$8L$0w o_9t$t$4l$fT$ Hf@L$Љ$T$0ŃBڈD$L$01$T$AD$L$ $1!L$ $L$! ft@l$$MfŃD$fEtwD$08fxŃ8,$nvL$߉ڋD$1L$1L$ l$!Nj$!l$ fMfED$ut&t$0^[^_]úT$ t$t$ \$^dCt!wE$hfCtCxC|ClT$ L$D$4$=w \$t$ËFdHt $^dstD$$9t$\$t$ËSxfCtKx)ȃ)‰Sx4$\$D$4$ifCtC|ClKxFfCtC|CxN1L$4$4$ЉT$F0\$4$4$L$Vh0f@b4$T$L$\$ Fdf@t@x@|@l@p\$4$4$ȉL$4$T$HfCtCxClCpD$4$4$؉\$4$L$4$T$4$D$\$ ЉL$T$4$^h$fCtC|ClKxCpD$4$4$D$4$T$ ؉L$\$4$D$\$T$L$ D$4$\$4$fCtCxC|ClfCtCxC|ClT$ L$\$4$4$1D$D$4$ifCtCxC|ClCp1ۉ\$4$4$T$L$D$ 4$\$D$4$4$D$4$ЉT$fN1F0fCtC|CpKx\$4$4$D$\$T$L$ D$4$PfCtCxC|ClCp(fCt1C|CpSxL$4$\$4$fCtCxT$4$^dK,CpfAztfCt1D$4$NdA|AlApЉCxmfCtC8C|SxCpD$K8 $4$4$D$4$D$4$غT$\$4$D$ ӉL$T$4$D$HfCt CxlC|\$*fCt CxC|ClfCt CxC|Cl1ۉL$ T$D$4$\$4$*fCt fCt 1CxC|ClL$4$4$D$4$1҉T$\$D$ f_V11N2F0⿀ V1D$4$L$VdfBtBxB|BlBpYKxNfCtCx\$ L$T$4$^d1f fHfCtC|C|CpƒCxL$4$^dS,fB8J{|fCtC|Cx Cp\$ T$D$4$^d1fMCxfCtC|%fCtCxFusC|Cl\$ D$L$4$T$4$NdQ,fBztCxfCtCx1ۉ\$Cx` 넀N1F0ClCpfCt!ut$t$ \$VdBt!$fBt Bx` B|BpL$4$4$4$D$4$L$\$T$ D$4$&\$t$ËrxB|JxD$4$4$N1^0fBt Bx B|BpL$4$V1⿀ V1pfBtB|BlZxBpL$D$ \$4$4$T$4$1D$\$ L$T$D$4$fBt1BxB|BpL$4$\$4$T$4$1D$\$L$ T$VfBtBx L$ \$T$'fBtBxB|Bp fBtB|BlBxL$ \$T$4$XD$4$ZxfBt1BxL$ӐT$$\$\$ t$t$(CtVHt\$t$Å~𐍴&fHuC ;C~^C C\$t$ÉT$ΉL$C$C ;C|C C\$t$ÉC \$t$É'WVSP\$`|$dt$hJ= C ~{NgfffISN)‰S>= L$ 5 =T$$ D$(t$,5 D$<1|$0L$4T$8t$@fD$ 4fD$$f;tfD$"|$ |$$CsC؉sP[^_C؋sCsP[^_É$999|$L$$9$(f8ftRt$$C$4|wD$|$ L$T$T$$C Nt$w$C$|$L$ T$D$D$묍t&S\$tVCuEC $f;tK$ $\$[t&S$$\$[$뱃[É',\$\$0t$ t$8|$$|$4l$(CSl$H9t =w:CwRT$<H\$t$ |$$l$(,ÍD$T$$`C뭍&f;C$f>t1~@9t&|$ D$@|$($1f61ҋH=`fC4@f8f:f<f>wx[$x[$@t&'S\$tHK $C`1҉$T$S|1ɉL$$$\$[[Í&UWVSt$0|$8f> D$:f9<f:1l$4J\UfV9|׹L$ F4T$T$\$$l$\$~<$fu=fdl$D$4\$ ^`l$$T$$L$4^|$L$|$ L$l$ T$4l$T$$f  f f 6f98f6 l$ T$4F|$l$T$f6f4u^\$@1҉ Vzl$t&f>>[^_]1f6mL$@1f>$ȿgfffȉ)|$u$=w$9r=v$9ߐ\\$L\$`t$P|$Tۉl$X|$hl$dt$lfsT$p5f{ SD$pfkf(C|$tfk-{=t$5L$ T$D$D$l$$|$(t$,L$0T$ fD$D$$Ct$P؋|$T\$Ll$X\$ /S\$tC$\$[[Í&U1WVS\$0T$|$8t$4Ctm9|$}&fHu|$|$C\$@;[^_]ËSCSD$@љCf PfKtNKIfKfAtkt{k t~CD$OC$t$L$S$uf{uT{sD$@f4o|$fs\$@;[^_]Í&D$<(uC뀃D$<0C|$k \$@;[^_]ÐSH\$PIf fC SfCfCfCfC fC fCD$ L$ T$D$L$ T$$ D$(D$L$,T$0CCCfD$HqfD$fD$D$$C,fC(C0T$L$$C\dfCd$C`1 fPB ~fC D$TfCfH؉K$H[$ht&S\$t$S,$C`$\$[[Ít&'UWVS\$@t$0l$4\$8\$NdL$ V`T$F\,$D$L$8F0|$ T$4$L$T$f~( gfF 1;|$8CnN1f1ff9lf;VtFVF9F\$@L$fE2 zf/f9uf9u։T$'|$L$W\ 2f )[^_]ÐUWVS,D$TL$Xl$@8t$D\$HfT$(1f|$*eefB9t$X1ҋ>uPL$LQN4f`B9Vt$(\$|$*t$`|$D$L$ t$,$D|$(T$X:U,<wUPfBfB UwMPfAfA |$X1ҋ~L$Pt$XB9M 1AKPfy1f|$…z$l$ t$$|$(l$ t$|$$=vO$|$$L$$T$CPf@f@ '\$,t$0|$4l$8<É|$T$4$t$$L$l$t$$D$ fT$ t$$|$( t$|$$L$ l$ L$$fED$L$$T$ t$$T$4$$T$ L$$D$(T$ L$D$$=KC fBfB fB $$1҉T$$1ɉL$|$1D$4$l$t$$T$ ft$ L$$D$(>L$$D$|$ T$ sTfl$|$KPQ$$l$$t$(D$ l$t$D$ \$@t$0\$,|$4l$8<|$1D$4$l$t$$T$ fL$ t$$|$(t$|$$D$ l$ KTfET$D$sP~<$l$ f}tukP}f}$T$ L$$t$(T$ L$t$$cLkP1f}8Ãf] 3|$T$4$t$$L$l$t$$D$ fT$ t$$D$( t$D$$L$ |$ STfl$L$sPF$|$ f? KPfy1f|$…$t$ |$$l$(t$ |$l$$=A$t$ |$$l$(t$ |$l$$L$$T$$D$|$D$4$t$$L$l$t$$T$ fD$ |$$l$(0|$l$$t$ L$ T$$fD$(L$ T$D$$$=N$|$kPfE /|$D$4$t$$L$l$t$$T$ fD$ T$$t$(T$t$$L$ |$ fD$$l$$D$$L$ T$$t$(L$ T$t$$=Wy$|$kPfE Z|$D$4$t$$L$l$t$$T$ fD$ T$$t$(T$t$$L$ |$ fD$$l$$D$$L$ T$$t$(L$ T$t$$=$|$kPfE 1l$KPt$yfy1|$KPl$qfqK)C$t$ |$$l$(t$ |$l$fAfA L$$^fAfA L$$@t&,1\$\$0t$ t$D|$$|$4l$(SPD$l$HKCB t#M\$t$ |$$l$(,1f{t$<$AL$|$D$8$T$ D$fT$@t$<MT$t$$L$ fEfl$ t$@l$<$t$l$CPfxa$=G$L$SPfBfB "1f{t$<$BT$|$$D$|$T$8$T$L$ f|$@t$<E|$t$$D$ fEft%{Pw$|$@ʉL$|$l|$@D$ Kl$<$L$sPVfFD$@l$ l$CPfx;cf@Xl1\$\\$pt$`$|$d$l$hSPD$,l$tCB ]$=v $;t$L$,$l$D$x$T$ D$fCP8/$t$|$l$ t$D$fSTL$l$CPp4$f?b|$ $|$|$l$|$KPfy;1f|$,…t f{` ffy  =9fAfA fA $t$KKT $t&'\$\t$`|$dl$hlÃ=cBffnt$ t$xl$$t$묃=D$0fBfB D$$f$T$||$ L$T$$D$ESP1fB |$$$1D$t$L$,$l$|$x$T$ |$fKPfA =Kl$xD$l$J $fl$|$f|$ D$l$$$= KP111fA f5KT$$|$$KPi}fEiZfEl$Y$=nt$1D$,$l$L$x$L$T$ f$t$|T$t$$D$ f$ȉL$$l$|$ D$|$$D$|$$ap{PfG b=t$$T$||$t$xD$T$ t$l$$!=wH|$$|$xt$t$|T$|$t$ l$$$;SP1J $;L$J $;L$L$;$;SP$t$ L$xl$$L$sPfF E$H1҅T$,RKPD$,qfq|$$lL$ T$,$f<7$$t$L$l$$lT$ |$$KPq 0f;fA T$xL$T$h,$fYKPfA $SP;B6KC=!$;$<KP=w6fAfA fA CPfx;f@$<KPfQ v|1t$p$|$t$l$x$\$l^PD$,FC ~$=v $/<|$L$,$l$4$T$l$$4$\$ D$f$$$T$\$4$L$ $~TfED$L$VPZ$$f}4$$$$L$D$ |$NPfy;f|$,D$3l$3Ofy N=NfAfA fA 4$l$^T$t&\$lt$p|$tl$x|Ã=l|$$$l$$$\$T$D$ |$4$롃= D$@fCfC fC 4$D$|$ $l$1|$4$$$$fL$T$\$ 4$4$1D$4$l$NPY{ffCiZfs\$Q$=l$$|$ 4$T$4$$l$4$$$fD$ |$\$4$4$NP;ALNF=7$F<&=~$T$$fC(|$ $l$4$|$$$$ T$l$4$L$ $ffNPfyv8Y21A,fAfA D$8Q0D$<9T$ut&B9}ft$<ؘD$D$L)f|$80D$Ll$811ɋT$@tjt$0T$HAt$0 S $fX> Ƌ$ffF }f=@~-$fF>\$ L$ f҉f=@~-@\$`fD$lfD$`$T$nL$dD$b))ʉމ֋$ifF"iyffn" ~n|$H-1΋t$D D$T D$P&\$0D$Tk ȉfD$PЁfUf0~|$Ls$l$4t$<G.fo@T$8fwXfW<|[^_]Ël$@11ɉl$0l$Hyt$@DMNf0~i11ې&|$Dt$@OyNf0~ t$@b\$@|$bt$$D$8l$<14(D$8f|$L~vD$fC@fCBfCVfCXu{{01ɋk4s8|$;[\$'O0\$)fS\$KfDUQfNf0~1fF@fa~ [^_]$bC0$bC4$C8$(CD$(CH$C$$C(S\$C($K$ $SH$CD$K8 $S4$C0D$[U1WVS|$ 1ۋt$$T$1jfvT$JOÍAf~1ɍ&'T$DJN)ÍAf~ߺv'DWJfWf&DVJfVffL$(Ë\$iU fk1f-[^_]Ð&V1SL$ \$t$SfQBf~1ҍv'VZfDQf~1'fDA@f~1 fDA@f~[^ÐWVS01ۋ$D$H$@VfGWfG fG fG1f~Wv'fB@f9Gt&'f^T$TD1ɉT$1L$FT,$^T^Pf$|$$C~nFP@PP fB&B^fD$:\$8fD$8.fD$PFT1ҹ(ffPD$1҉T$NT$]$0=G=P=|$T$ļ[^_]É$$FPefD$:\$8fD$8fD$PWfD$:\$8fD$8t&fUf$F|Cf$f$f$fB&R|$$C&-n=~ N V^ofD$:FTfD$81ҹ2\$8ffdt$X@P@T^T$hgf$fB&'S\$CT$KT$D$KT $T$CT耉$L$STd$CT $ST$KT$CT$CPPuP u0$\$[$CPP tى'$CP$\$[U1WVS,D$T\$Dft&&,J|$Tf9|T$@zt%1ftD$Trf9|L$X1l$f9\$@STT$ vT$ @f91ft$\$L|$ T$ sfii|$$1vIyL$$KvI9\$t$Ll$Xf^@MD$9L$,L$@A$AtA|$Tf@f~fD$*1ۍt$*l$@T$HEPT$,$t$ L$Pf|$*|$HG,݉T$Hċt$T1f\$X ًL$@l$XT$LAPL$@l$ t$T$ $Pl$XfD$*Ml$L)ӍT]fɉT$L4nut$X19f>}"&z\$P9|T$@Bw$t$ f=wl$@E,[^_]$l$@E,[^_]Ã=v$ډ't$t$ \$\$$|$VP|$,B @fB L$ \$T$FT8$\$L$VPB$fu9^TFPffxtZf1\$t$|$Ít&VPZf9Z |fB4$N1Ff\$t$|$4$뗉VS\$,t$ T$(D$$ T$D$4$L$ f4$uVPJ IffJ ~ 1[^ËFP4$1[^fB4$NFÐt& D$HP$1 ÍvS\$,L$(T$$L$T$D$ D$ $f[Ív'W1VS\$,t$ L$$fvfQBf9wL$T$(|$ 4$T$fVPNBHfBuf~[^_f4$^Tf~t&T$$\$\$,|$L$(t$|$ 3T$L$<$t$ fWPBHffB~Ƌ\$t$|$<$Ƌ\$t$|$Í&'T$(\$\$,t$D$$|$t$  T$D$4$L$ ff߉4$uBVPZ CffZ ~=:4$f1F\$t$|$ÍN FPf@ fNj\$t$|$ÍS\$KPAt~Mt+[ÍfAAfA fAcC[AfAK-C[ÍuQAfAfAfQ KC[Í L$QPBt!tB=wp fB\=fB fBaA=w4 fB(p=fB BfBI$A=vD$ t&$= ÅoBBfB BfB=fBIA=w BBfBI A==i' L$QPBttF=wi Ðt&fB\=fB fBaA=vωD$ BBfBI-A=vp=$= ÅvBBBfB fBfBIA=H=T$oS\$ T$,L$$T$ STL$$D$L$(D$ L$CTd$T$[Í'V1S\$ D$,STfL$$D$ L$$D$STL$(fD$ L$d$D$[^Ít&UWV1Sl$t$$$pTf19}#v'DUzfQ9|\$~8D$ <$L$$VTB|$D$NPQ$fH$qTFf|$$t$ t$HPy <$1|MQDL f|M9|\$ $^T뀉l$L$$$؋uTF$|$ \$ 4$T$$QTj(fjfD$l[^_]B$f\$ L$,$\$ЉT$D$l[^_]Ë$1BTfB $$WTe&D$PTBJ!S\$`~C`$`tK $`t1[Ått&S1fB, [Ív'VSt$ \$`t f<tNfY*1Ʌ%t Ff@, @Åt NfA, J~ VfB, [^Ðt&SL$\$ `t f>JtQfZ([Ð&T$D$dÐVSD$t$t\`u3tC$C`t)t$؉dY[^Ðt& $`빋SfB, $1tĉ`1NCn=w`U$=t&S\$`u2HtL$S $C$\$[$`뼍v'U1WVS,\$@t$T$Ll$(`L$ D$$t;f<@HtKfy*@M*f1f9l$(T$9}@P&D$L$DAfSfD$@f9D$ B9|҉9t D$(,[^_]ǍhD$T$fL$(f|$ f|$ f|$  Шt!=L$(`f|$mf|$Hf|$$.f|$$L$1҉f9}?~;t&'t$DNqf9fChP}9|҉9L$`'Kt$D$L$t$$D$$f|$$G`:T$(,t&D$(`u= $=`=$L$(=wUs4$`D$(z`%$HM$=띋L$t$T$L$4$=8$=`t$T$D$t$$KD$ D$L$t$$D$lT$t$D$T$4$D$$HV1XS\$ t$T$s4$`ƒt 1Ґ @DB~[^Ãdtt$S$[^Ét$K $[^ÐSD$L$ D$Yt&D$8 tD Df9|Z[ÉZ[Ð&UWVSt$l$\$~+ 31Ҁ…t t9uD3Lf9|[^_]É[^_]Ð&VS\$ t$C=~19}7'  40N  0TNA9|N[^ÀWTNA됍t&Wʍt&'VS\$ t$C=~19}1&  40N  0TNA9|N[^ÀWTNA됍t&Wʍt&'UWVSD$$\$(f\DCACTCEC C=C l$$*BA~C { GT GIGMGEG G=G v'|$$:BA ~C K s ANAMABARA A=A J. l$$*B3C9|[^_]ùˉźMf9}<*t*Df9|Mf9}<*t*Df9|D$ Mf9}<*]t*Df9|D$DCACTCEC C=C T$$׍BFIyC K s ATAIAMAEA A=A B3CIyF ^ t$CNCMCBCRC C=C f|$$~Xt$|$$>=~~4T$$\$P'A<$t$7GJ<$u|$ $f|$ $ƍ~|$FNFAFMFEF F=F \$ $T$$=~~4T$$\$ P'A<$t$7GJ<$uT$ $ uf9}B +1Ҁ…NEu Ef9|ʍv' ؍&f-T$$4$D$Xp\$@M@E@S@G@ @=@ $C=~19}:  0N  a0TNA9|Nuf9vt39*L/D9f9 +1Ҁ…uD+DӀWTNA띍vW{|+Dx@S\$=f11f,1f*f6S f41f.1ɉ81fV1fT1fZ1fX1f^1fb1CfCf\f`&11fjfh@f~11Ɉ@@f~f0[$>'S\$ O1҃=@f<f>f11f,1f*f6S f41f.1ɉ81fV1fT1fZ1fX1f^1fb1CfCf\f`t&'11fjfh@f~11Ɉ@@f~f0[1҉T$<$xD$=$>$&'U1ɺ8WVS|1fD$`q$$fD$bfD$dKfD$ffD$h8fD$P~fD$RAfD$T?fD$VfD$XfD$@TfD$B3fD$DrfD$FfD$H3fD$0UfD$2u2fD$4ofD$6fD$8u2f<%$\$,L$(T$$(D$PD$ 111f9'Of N~Ef'~SڍAf9|׉f91t&WJfWf9|11f9}?&',WJf9|1ؙOQ)fOf9|111L$1f9t$|-&C؋D$U@D$Af9}?O1)=X=,C؍AȍUf9|΍'f~fM1f9,WB\mfWf9|'1f9}`$X_L$ l$‰$D$(D$ D$f_KكD$,f9|T$( L$,@_wExD$$$>ff4fD$$‰D$$@9$69}fdfu$f6|[^_]=9S.1f9' WZ,If,Wf9|v|1[^_]f9f1WjfWf9|Dl$`l$ D$$l$$)D$$W|$$|$$DD$$f6f|$1f9/WJfWf9|D$$@D$$l'U1WVS$$|$QBf\T 9|틄$t$.鉈f~LT$<V$f.:$f9*$1f.f*f,D$Ĭ[^_]Ë$ʋ$0.hf.8@f.f tzf …]$111f41f0f*f.(f1f f 1f …$111f f4f,f*f0f #$0.of.@$f.1T$#.1۽9@q=f.l$Y$>H$f,4f6Fff4f.k$4f6Gf41f..1ҹ@u=f.L$$>S(\$0=fCfCfC T$@D$L$T$C$fD$ fD$ fD$Zs1ɉL$L$S L$$fCR1fC^fC.fDC0@f1~1 fDCT@f~1 fDC0@f~fC`11f11f1f1f1f1f1f1f1fP1fR1fT1fV1f\1fCbCdChClCpfCvfCtfCxfCzfC|fC~fXfZ1҈@fw~([øD$$0>t&'S\$ =C$w0$=fC*@fC(fC, w=[Í$A>$=fC*@fC(fC, vĐT$C*$D$[$`Y'V1S\$t$ C(ftVfuBfNTHfTfT~fV11fXfZ[^ftgfHZXQfZ fXfu\fVPf\[^T@auQZ@fZqZ9kfZfV[^ÐLfV)1볍vU11WVS$$l$QBf\T@9|fD$0Tˋ$fD$231fD$4rfD$6fD$83fD$ UfD$"u2fD$$ofD$&fD$(u2z*1 DT@jf9|ș$i A i *fQkfEtI&DLB)fDLBIfEuf%tЙq$L9Lm9 \$$fy*%t0t$ ˍT$@T$ T$$$D$L9Dm911f;\$DL@yϙ1)f;L$|$T$t$t$T$D$$\$<2)1f;T$}-$ v'tT@BftT@f;T$|\9$Os\ff~ffs sf9$11ҁyw9 j9|18\4΁[^_]É\$$|$@<$L$fuS$Q,Љǃ=f$T>$$1f1$|$@1<$D$݉\$ ŐD$l$f9ƉD${(^fK$TIfT$fT~11fVfXfZ^f;t$d\u1Ƀftϋ$VfyffH$ZQfZىX ffXu\Pf\fVWf#TCfT$Z@fZ$AZ9$fVfZ$11fVfXfZ$1fZ넻;[^_]Ë$eU1WVSD$8L$HЉ$f@P\$<|$ fD$@fD$BfD$D fD$F fD$HfD$JfD$LfD$N $f<%\$(t$,T$Pl$Tt$X\$\D$`|$dL$hT$l1L$,|$$f9L$$w$$d\$`D$ t$$$T$,st$`L$ T$i2st$@,$|$(1$h&'\$T$ DP4$D$L$(W σLpf~,$\$ t$ |$\\$|$$xt&\$l$ DP4$oD$L$() уTpf~D$$|$,@f9D$$T$(1ہ@'Lps@Lpf~TR iff1@t&\p9s9sى@f~ 1 9s9sىƍ'@f~f1f…t,Ll0Ĝ[^_]ýl$Pt$T\$XD$\|$`L$dT$hl$lEL$1T$ t&fA@9|Ít&D$L$u(ÍD$L$к1҉1fu(Ðt&L$1T$ (fB@=|T$(u ,1W1VS|$@t$ T$(v'fB@=|D$8L$4D$$$T$ft,=,1[^_fd~(=wY111,[^_Ã=wG;(s1[^_$D$$@D$$AU&' T$L$((h9(+L$D$L$X$1 Í$1 É1Í'SD$L$\$ ~1fQB9|1[1fA@=|1[Ð&UWVS$=$o1һ0O1퉖 $D$l$1҃ h‰O- - -   $`- -(, ,@, 0481҉-<1퉖xt1 @D1H1ۉ|LdT@?k1ۉ Åۉdu =$=- T$ |$$l$(=L$,- L$ \$4T$8|$<l$@L$D$0fD$ LfD$$fD$"X11(\`|$4$ļ[^_]ÍȻgfff)ƒ=hO$+AL$$DAMAl$t$ -   l$P=-L$T D$X \$\\$PT$`|$dl$hL$lD$pfD$P4fD$TfD$R\$$X1҉($YA$11҉Ɖ 11ɉ11퉎11X$ $-( HP- h H P- L$ h-Skl$-L$K SkfCfC`fC 4fC C fCD$$$$k CP H P HL$PT$C L$SK ffCfC `fC `fCt+D$1$1T=w1$1t&,=\$\$4t$ t$0l$(l$8|$$<1@%9u<@~ =t1wA$DTv\$t$ |$$l$(,É\$$qA>l$|$ xT$t$AD$RT4$땋ttDu4$TL$<l$4$DDttDu4$Tl$4$l$4$DD u(\$t$ |$$l$(,ÉD1҉1f9TU4$al$4$P'D$T$L$ u1Ðt&Hu1҅tP 1Ð&UWVS,D$Tt$@|$Dl$\D$(| 1f<_t| C9~v _$AL$D$(뼃9|~1҉|xct11҉xE,l$L$(D$`L$l$X\$PD$ D$Ll$l$H\$D$ l$|$4$ 9A1 t&@;`ud@~1@; `ud@~=v.|$\$ xT$t$|$ \$X;t =@t$H@u=<,,Ty Шu atIu D`H Ш,0 بt D,[^_]Éx1E,3D$L$ \$<$D$Ps{(oE`fOt1ɺ fO ,A1@ ; u@ ~=8T$ xl$t$,D$,,[^_]$APD{(oEPfbO1ɺ fbO ,Ax\$t$XT$D$( /$A$AD$(aPYz(oETfNO,1ɻ fNO ,&<1ҡL$@D$D$D$ D$D$ D$$D$DD$(|.~/ w!D$D$$Ѓ<ÍT$T$׍v'S\$ tu2uFXu\$[ÃD$tōt&'$Xt&'$$[Í$Cv@$ $$vP$ $$t&1ÐT$ t~.t .%t71Ív` tuÐt&@8t1˸É'ST$\$ L$ow @8Bw .Bw %Bw  `tHt0t!t,[%[ t&[É` &\$ t$t$ |$l$l$,|$$$(= SC K SC KS k$f{C C$bC$bC$C = n >VF NfFfF@fF fF fF ^\$ t$|$l$$x\$ t$t$ |$l$l$,|$$$=C K S f{k=C V>F NnfFfF@fF fF fF ^\$ t$|$l$Ít&$Z \$ t$t$ |$l$l$,|$$$= SC K  Sf{k=C V>F NnfFfF@fF fF fF^\$ t$|$l$$Uv'S\$Bf tNffF`fF 0fF fF nF^t$|$C\$ l$$D'\$ t$t$ |$l$l$,|$$$= SC K  Sf{k=C fCVF >NffF`fF 5fF fF nF^t$|$C\$ l$Ð$J \$ t$t$ |$l$l$,|$$$ = KS C K Sf{fC=C kVF >NffF@fF %fF fFnF^t$|$C\$ l$$4C&S\$A$$1ɉ$1҉u1҉[Ít&$1҉[Ít&'U1WVS$=$Jb Шuz Ȩt=ow$00@84D$,Sw$00.4D$,Sw$0%4D$,Sw$0 4D$,`4H[0rO'tdtd=eH $$1҉$1ɉ{1ۉuH+|$L$,1҉T$ 1ۉ\$$,y$D$@f f  T$0- \$4l$<- L$8 D$@L$=f|$2$D$0$$$$$$l$$lT$,ɃH1(Ĭ[^_]Ð$lJD$HL$ xT$t$D$%40L$,&u4 0΍v@ 401ɉL$,zxD$t$T$p$l$p L$l-D$`T$d \$hf|$`L$m$D$`$$$$@4` 0- l$\ L$]-T$P\$TL$X $D$Pf|$P$$$$$xU1WVS |$ \$$r5swKOS W CGCGO Wك9ډ}A 6_$ $W$1frfz\&fBw$fBfB fFB VFFFF F$F(V,F0fF4F8F<1f~Dt"V@ fB@f9FDwfFFfFHfFJFLfFPFTO(1Qv'fB@f1~1&'fB@f=~_GD$W($GGG [^_]ËW$1fz 'fA@f9Bw_ $F@w$f^DO(Aw($dFo($E5  wOW _$,$XG$$G(X S\$SK( $C( $S(B$K$Q@$C$ $S($C$$\$[&',t$ t$0|$$|$D$,$S'\$\$$|$1ۉt$t$ t>CuGN$Q A)fA CVSF1fyJC q<‰Ss\$t$|$VD$F($렍&W1VS\$$t$ t`CK uUV$3t51fzt fA@f9BwfBfBfB B CKfB4J8[^_f{wV$1fzDtJ@v'fA@f9BDwfBFfBHfBJfBPBLBTV$fBJfB4B B$B(J,CB0B8B<BBBfVD$F($&'1ɋT$ L$D$JD$D$$D$B($D$ÐUWVS,T$@|$HD$DD$$|$L$@)߉\$A(Y$hsSl$$h @{t$sD$ L$ l$HD$(L$u+k8tdC4f{1HL$fC4&1ɍoT$ f;l$ ul$(|$$D$!f/H|$$1D$뇉k fu-l$@T$EC8D$CHf9KfKBEfC wfC҃T$d$Kf{D$l$DS|$@L$sCl$<$L$)D$\$@T$C$s(P F ,[^_]ÍU1WV1S 1ۉt$ D$4\$|$AfFfOnf9nrfF$K,$fCt-N \$V+D)9ct$,D$ [^_]Ë\$t$,D$ [^_]É\$WS(D$4\$0t[T$@fD$t[T$fC fCfS1f{fCtKt&fQBC9|([T$$D$$CT$|'UWVS |$ T$(L$$GD$G f9v_)‰$H҉T$f@ot3t&'D]Sff;T$r1ÍFf@u؋D$HwBf1f@uO f_$$)fO [^_]UWVSl$L$ |$\$U$4$W )f9w͋t$E~Nf@t3&Af;$fOr1VfBu܋\$S t$|fNL$fy Y[^_]Ð&S\$C$\$[L$A Qљf=9Ð 1T$ t&@#w9`ud ÉT$|DD$$ Ít&S1۸|$T$ L$t[Ðt& Шu=v [搐U1WVS\$tD$, $p G S ;$p:kjCBs r KJ{zkjCBs r K$J$$p1^\ =$@ L$Dd$H$pf$H$@|$A\f$Df$F04$  $ $5$$$( $ $p$$$,$$0f$q\T$A\X$F$p^\fCfCCVC $DS|$f$DF\$HLf$FH$$@,f$H $C$T$l$~\0<$V\fB,fB.F=%=  fB $pM)E($p$pZ`p$ۉt$(.- t$(h$$l$,$ $p$$T$l$f$~`f$f$ǘ<$L$,$pD$L$k`Ŵ,$$։ٸ f$L$(@f$$pf$$p\f$f$V$0f$$$$pf$f$W`$$f&$f$f$*f$l$D$,$pD$q`)f$ f$4$$p0%O`f\fj@B$i%hfl$fhٸf$|$(f$$p$i\]Gqf$$y$$11f$f$$p1f$f$n`$D$,T$,$D$f$~`f$fp$f$<$$N\1n`y Q,fEhfEff}dU`fEZE\fE<fEJfELEPET&'fDE>@f~T$,]U1'fDf@f~fCfC0fC.wfC$CCC C(fC,fC2?C$fCfC4fDC@f~\$,tET$0׉ƹ T$|$XM|$pt$\ $fD$0fD$V E$pfD$tF\\$pfD$rP |$N`fT$pO $$p1U`OOfCfA@f=~심$p11fO1fOM\fOA Dy1fO1fOfOi BBB fj$$pBBBB BB(U`E(M)PE(],u4|E0f]@}8EDM)  1f9HD$@t$@fv=1 T$^$ $L$Tff0l$l$PT$ L$,$D$^l[^_]f9f@-1fD$HD$Xl$XT$X ')0) )1 2)  f9ÍDf@-fL$HlD$H^fCh@vD$HL$DPD$T$LL$ ) )  Иf;D$D} D$DL$L$@D$T$L@9ЉD$|?L$$${,|$P;1fD$Hf8D$XU1WVS,T$@l$$BXZTJ^R,4HBh~ZdfBZB\A0BhrZ@FfrZf=fBhy^$iTQX1t}zv  ))҉f9} $ǍAf~<$1\$L$ ?f3f2Z[^_]fBh@i'UWVSLD$`t$dl$`X,ELKZShC<{JABfKZfSh|$4kL)fS<ȘfJf=@pT$hD$4t$8L$4:)D$4D$)CHs@)‹D$4щiUU9f{Z fCHT$`1l$41fCF1fCDfCBfC@fC>fC<BLB@fCZB0CPL$f{HfCFL$fCHfsF랍&L$`AD-t&WVS|$O,Y`ҁz r%Q\Љ1AZ @fAZAh@f=fAhAZ9|\fG8q`tzAdW0fG\$fAZA\?APL$f3f2[^_\$Q\L$?f3f2[^_ÐG0닍&fAh@VU1WVS$D$$k| 3uKMSUC E {}suKMCE ]$M!XEE b1 f$$$EL$U$f$4@|$`f$$ L$`u$L$U$fD$`B$FU$fBfBfBEB}B=%z }= fBM!E U(ufB1fBBB fB2RfB@f1~fD$T\$P=\$M(|$PfD$R $fD$PD$D$}(T$4<$t$DD$$ D$8 \$ L$,T$@u$fD$ fD$"~L$0T$4|$t$<\$(\$ |$\$M(fD$,fD$@xH $}(艗ļ[^_]=.=@8xfB{$ E$@{$E($dCU(>$E]5u M U E=}]$EwP$,@$ź@(T$PfB|fBqfBf$E뢍'SD$\$K(H $S(B$K( $S$B$K$$C$$\$[U1WVS\t$p\$t{~KNS V CFCFFL^P~@f@f@ f@ f@|$<L$0L$l$D$0\$8FPT$4fD$0 8$fD$2 fD$8h\$l$VP $NP|$(D$\$AA T$D$ L$\$$f>#fD$|$l$|$|$FPfD$ fD$T$L$fD$fD$"-\$@T$Dl$Hf>tD$@L$@^PL$~PfD$DfD$FLfD$H,$nPFNPFfF0UptF Vn$F(F,F4F8fF<F@FDfFH\[^_]fD$L$&$Fn&$T@Lƽ@P8&$+F$=~ N V ^FFL$FL$FP1ɉT$L$FP$^P$@@1ɉT$L$^P$NP1҉$-F'S\$CP $T$CPT$L$SP8$CP $SP$CL$\$[U1WVSLt$`\$dayCF{~K N SVCFCF^ NXFFfD$4L$0=L$V |$0fD$2$N$~ GGfG fG~ffD$L$fD$\$fAfAL$N$D$ $|$,|$ |$l$D$(T$ n$\$$fD$ ,$fD$" fD$(hL[^_]Í&fHHfD$L$fD$NFK$0F$1ҹ0L$T$F$$^$$@C,@1҉L$T$F$X,$$F Z$FVF= ~ N^$F&wB$(@ ƽ@$WfD$rL$fD$: $F밍t&'S\$K$ $T$C$$K$Q,$C$$K $C $\$[U1WVS$D$($ MSUCE{ } suKMCE]P1 C1ҹ}fCfCC fS =$$,f$$|$MP$Lf$Qf$$CD$t$uP$4$]PfC fC"E=` *=*fCME 5$$$f{t|$f$uP$df$f$$]T}ۉ|$$bD$$$$$]PK f${?$f$K\$(|$\$UT $L$f$\$D$MTh $uPf~\$pL$$$MPQfD$tfD$rfD$v@fD$py?ft$|q<$$$<33$f$UT$$f$f$*f$zh)f$D$(q\$D$MT6 $f$uPf~<]Tf4<f@BL$pff \$0L$$L$dMPfyufD$0Qft$2Q<|$4D$8ft$<y?fT$>Aft$@Q<|$DfD$HqfD$LfD$Nf&fD$P6f|$J}TQ4D$Tt$X|$\T$(\$L$`T$]T$$MT1@ODOfCfB@f=~111fNO]PfHOfJOCHfA11fTO1fPOfROfAfAfAfAfA{fA ?1f{ fA*fA(sfA0fA22fA8{Q$fA:5Q,1ҿft$.f{A4D$.D$]T)f|$.<$]TCCC CEMPExM |u(0U$fE@fM4},fELE8E0E<EDEH[^_]Ë]T ffLO]$XOET$@@O]T$HDOa$PEPþ$@C]PC$Gr MUE= } 5u]Y$G wd$X@Pź@TT$(}TfGr(5fCfC' fLO$)G뎍&'SL$\$ST$$D$KT $T$CTL$KTDO$CT@O $ST$CP $SPB$KPQ$CP$\$[UWVST$t$j,FT}&MGf}&V^~XM $4WPEU}))ɘE)E )D$D$}f}}EUf}fE fUf]fuE;$~Mu)fE9~2fE\$MC@C0AfM[^_]f]MAfM[^_]ÐWVS\$|$K,A&@f=fA&Q$q p)f@~ f} ЋD$f21) ~AQ!fAQq VqfQfA$BfQfC82f9y|-S 1f @f9C@fC8C0[^_fA&@"UWVSD$t$ x,o WO ۃQ$)G&@f=fG&~ف$11l$9}2o )Иf9}L$ƍQ; $}TM9yى)wL$T$$_΋o !ދ\$ fwwf2G|$LEf ~[^_]fG&@I>)TU1WVS$D$$3uKMSUC E {}suKMCE ]$M!XEE  $󥍌$L$U$f$z<$C]$1C}fCfCCfCE=` e=efC M!E f$$$1s MD$f$6u$ϋ>f$<$U$MB U(L$fB1f9fBBB fr}R'fB@f9||$P \$P1|$T}$W fD$Xw fD$\6fL$Z_ fT$^T$PG ft$bO T$E(fD$`,$\$dT$5=T$D  t$ L$,|$(\$@U$\$$B ft$ u z ?fL$"B fD$,<|$(z T$ 4L$0?\$4D$8t$fD$@fD$HHfD$JfD$LfD$NfD$P fD$$=D$ uL1҉|$ fD$"f~ D$MP)ӁjB8fB@fBBfBDfBFBBB BBBBB B$UPEMP~EtMxu$,] fE<fM0}(fEHE4E,E8E@ED [^_]û f`O$lOEP$@TOuP$HXO-$XEL@$@C}L$@G$]LC $GE5u M U ]$GNwV$T@Lſ@P|$fB &fB f`Od$ H뜐SD$\$KP  $T$CP$L$SPH$CPXO $SPTO$KP $SL$KLQ$CLH $SLB$$KLQ $CL$\$[UWVST$L$j,qTAL]Cf]YXQ^V$^ICD$"_$^ID$=$^I|$= -$dIl$D$@f@ 2f@f@É V1S\$t$f;~!D$ &VfQBf9[^Ðt&Ív'Ív'D$ ÐUWVSl$,D$4t$0] U}HM\$]T$U|$L$ T$@L$ ؉L$$ $11L$T$L$!f! ÍGf@u][^_]Í&'UWVSt$(D$0\$(l$(KH\$(u |$,$L$SKt$ sT$L$GL$L$ $L$ !11ډL$f ƃ!fEf@u|$(w[^_]É'T$ t$t$$B^2fZ)fZHBЉB B)fB$t$ÐW1VS\$ t$$ fCLfCHCHfCN{{1K$Of{Tf~KPfQBsT9|K$;@CXC4C8K&fC<C@CD)f{V[^_CKȍt։$CPd3$\út&'S\$CP$\$[UWVS 1D$(\$L$ t$$HYXЉ$f@i,y(T$ D$ Id$'T$t&t\!f !9ut$ ~0F@!߅҉~D!f uL$ D$YX [^_]ÉD$@D$$Hf@$t|$ _X [^_]UWVS\$0|$8T$0t$4CTRP|$l$ zT$)HfCf@uD$H.Af*f@uT$01|$ t$Z);l$L$}xB$J fD$L$D$1t$T$\$ rH't&1Ff@uf;|$ s l$|$ t ];l$|L$0l$ f9iV|Cl$ A4\$D$T$؍fBBfBS`c*c)[Ã=0BfBBfBc){=qfBBfBc*N=7S`´$K\fAAfAc*K)[Ã=BfBfBBK*c)=wvBfBc*K)B ftffC([C( [É$S\J$}IS\$IS\v$IS\H$IS\$IS\ $I$IS\{fBBfBc)$c*[C([ÍVS\$,t$ T$(D$$ T$D$4$L$ ff)F(4$tN) F) t^`f~1[^É4$=v$l+ٍ,D$4t$ t$<\$\$8|$$|$0l$(\$D$<$T$ \$l$<$f<$t2O) W\G(JIffJ~:\$1t$ |$$l$(,Ívo\EfEG)G( $߈G)B fu5G( <$fO)<$ŋ\$t$ |$$l$(,ftfÀ_(G(봍,D$4t$ t$<\$\$8|$$|$0l$(\$D$<$T$ \$l$<$f<$t2O) w\G(NIffN~<1\$t$ |$$l$(,Ívo\EfE_)G(߈_)ĉ<$fO)<$맍&',D$4t$ t$<\$\$8|$$|$0l$(\$D$<$T$ \$l$<$f<$t2O) w\G(NIffN~<1\$t$ |$$l$(,Ívo\EfE_)G(߈_)ĉ<$fO)<$맍&'VS\$,t$ T$(D$$ T$D$4$L$ f4$t6N) F\F(XKffX~ 4$ft14$1[^ËN\AfAV)F(߈V)1[^Ít&VS\$ t$,c)C(T$(D$$T$D$$L$ $uf1[^ÍvK) $f1[^ÐV1S\$$t$ tDCV\FBC u5u@C t N`C t ^`C[^ÍvBC tSVt$4$묍'V1S\$t$fC1fNfKF)fS4$fCfC fCfCFfCCK$V`JȈ€SN`$ CV`Jc$ @$CZ[^ÐL$ T$L$ B(D$t&L$D$Q(B,ÐD$T$L$ t ~/tÐt&B(fËB(ffH:ÅtËB(1ffH:ÍT$D$t$f@f@f@f@ f@Ðf@f@f@f@ f@É'$$$ \$|\$0$$|$0-x$\$\$ OT$fT$0 $G$5fD$$T$H(t$ fT$ q,\$ $fD$"$O(T$A4Q4f@f@f@f@ f@q,fA6ftU$B $C! $C!\$|$$$ČfAF$fA4AXB$A\f@ \$|$$$ČÐt&fAF$fA4AXA\O$fA@\$|$$$ČÍfAF$fA4AXk$A\fE fAF$fA4AXu$A\fF\$|$$$Č VSt$ \$,D$$V(D$BD$B4\$ $\$ L$(L$F(PT$H$[^Í&'UWVSD$0t$$L$(T$$|$ L$T$fc$fKNj\$t$|$ËKLS߈SAt;~[=cވSC\$1t$|$Ã=w;fA AfAK̅u=wyfA AfA$KKL봍=wXAfAfA KcdA$KD$S5$:KKLs$(KKL뗐S1T$\$t!J1KKLR u [É\$$萍t&V1S\$t$tmfC1fC,f FfS4$fCFPfC fCfCHvpfcCɉș)i,fCZ[^ÐUWVS|$0\$8W gBtmt$<L$fD$1l$W \$D$4l$ <$D$Rf|$CՋl$<\$f9]tOGL$T$lSLl$LD$H$T$h$$S0nP$KJC8T$@$L$D$l$dkH^2rD$,A4\$fFHf~JfFbfV0fF`)~ N@VDfAfB@f9F>VJ1f~$NLVPv'fAfB@f9FJL$1ɍt&19}TTfB@9|{f~1f9} V8&'t$f4B@f9|[^_]1ۉ<$|-NF@ɉ $FDF$VFL҉$FP<$F8|$<$DTSf~^~N=>^ N F VVSt$TT$CfyN8 $VP$FL$^D$N@L$Y[^ST$\$ BCJKB C JKBCD$JfC(KfC0fC2fC4u1f{~S$fB@f9CC 19}K,vfQBC 9|S1fC f{fS"~S&'fB@f9C[Kɉ $C$C $SC,҉$CHt&U1WVS|$$L$T$h$׉|$l$Jl$`3$O$h t$Ps$L$hOt$Ll$d$s$}$L$ S\$S4$C0D$['VST$\$L$rsBCr s BCrsBCrsB C r$Cs$fC(fC*C fC,uf9s.|0fs.uT1f{.~K4S0fBfA@f9C.X[^Ã=wDS4$K0 $fs.t6$s.C04$C4$N뮐V1SL$D$HiЎЍCf@u4$Z[^ÐUWVSl$,D$4t$0] U}HM\$]T$U|$L$ T$@L$ ؉L$$ $11L$T$L$!f! ÍGf@u][^_]Í&'UWVSt$(D$0\$(l$(KH\$(u |$,$L$SKt$ sT$L$GL$L$ $L$ !11ډL$f ƃ!fEf@u|$(w[^_]É'T$ t$t$$B^2fZ)fZHBЉB B)fB$t$ÐUWVS,\$@D$Ll$@|$HSHul$@KT$T$@t$(L$s J T$@]l$@L$ L$D\$]j,\$ Z.Q L$D$QT$$L$DQf@T$L$L$@AD$mT$L$!! Ѝ9|)$L$fQT$( f9|)؋$1@f;D$$!‰$T$JfBL$tAT$uL$ L$!ʋL$ QL$Tl$!! jt$@|$Df^.$fn,f_ ,[^_]ÐD$ 4$ t$|$|$ f@,f@.4$|$ÐV1SD$tof$f=?\$w!1ɍQf=?vff$ 9t \$f\$T$@@։Z[^Ít&'V1ST$t|f$Ѝt$w1ɉ'Q=vff$ 9t \$f\$t$@@f=vY[^ÐUW1VSLL$`D$l|$))D$ؙ1)ӋT$ځ~\$`f9;fS>{lfCn_|$`f9_hf9W(G@T$`B*f9B>B@|$`W@O`w\f8u r1fb|$`f_l\$JT$\$ $T$Jf@~ fL$JL$`QHy<)؅fA<AQjIf9fC:zf9f{jWfC8fD$"\$`S~{|:f9t!L$`fA~D$`fhNfppD$ΉCCH)fSLfCNC\C`fCdfCffChfCjfClfCnfCpfCxfCz 1f~#sPK'1fFJD$fD$=&<$N0~fYN,_|$T$fYKf9|fFL11fFNffFP&fDFR@fO~N611f11fl$fffD$,$f@fB@L$ fB:fJ|$ ifBffCfCfC[^_]Í|-<$N F,\ ۉ$F0$ $= > -N= ^F n~N^$ƺ4 S\$f{~2$ $S0$C,$\$[UWVS|$0t$8\$4O$t$ D$ fL$L$HW&f@fT$t/͍t& $GT$fFf@u_(l$ WDf9!ʼnt$Tt$$f<$t$,O߉$fGuL$(fi4[^_]Ðt&T$ D$(L$ D$D$D$$L$$ÐUWVSl$$$A$+T$@fATy,1ɉt$D$t&$\NiÚyfDLPAf\L0f~F$ t$\$+1)Ѝ 1)ЍG 9~9~1f9Ǎf9$y(G1fH$1ɋ$$D$[ FWt$\$D$ sT$&;t$ T$f|L f|L(~t$)‰И~|$)Qif f|L@f|LHf~L$@1\$P˻T\@|\Pf9}f9щ~ȍCf~ҋ$fJL$ft|t f|t$P\$Jλ1v'T\P)DD@f9}f9щ~ЍSf~΋$T$)fKL$ft |D f|\$Dt$Pλ1|\PD\Df9}f9щ~ЍSf~ҋ$D$\$fJ ft|t$f|t$PL$F1T\P)DD@f9}f9щ~ЍSf~΋$T$)fHD$ftL$t$\| f\1ɍFt&;t$ T$f|L f|L(~t$)‰И~t$)ҍqif f|L@f|LHf~L$@\$X˻'T\@|\Pf9}f9щ~ȍCf~ҋ$fJL$ft|t f|t$X \$Jλ&T\P)DD@f9}f9щ~ЍSf~΋$ T$)fK L$ft|D f| t$X\$Fλ&T\P)DD@f9}f9щ~ЍSf~΋$T$)fO|$ft\D f\L$Dt$Xξ&'T\<D\Pf9}f9щ~Ѝ{f~ҋ$D$fKftLtt$fL1Kt&$TGf9}f9~@ʘf~ۋ$1ɋ$ZX.f&2ytσxf9\t0$r2J4j0!$$`H!fM4fu0l[^_]Ët$T$\$L$)1fCt$\$T$D$)UWVSt$D$$|$(l$,f$|$+|$ ڍC؉WffyӋL$I)|$ ڍC؉W9ff;$҃[^_]Ív'UWVSt$|$$D$(L$,l$0fD$ $;vL$ ڍCQ$ŃffyƋL$I5L$ ڍCQ$Ńff9ƃ[^_]Ív'UWVS|$4$t$<L$@|$T$\$Hl$LD$Pf9$t$L$\$ l$D$&'11f;t$ }UL$$|$).t&l$DD]l$8TUCf;\$ }fy̋l$|$ $\$t$0@N$f9f$h.|$-=fTf^f`fb=fd'+K@Gh=$NL$ VT$D$w4$1ɉ@C$OD$R$.D$$O$PL$$VT$D$w4$t<$^\$ NL$$$PT$<$bGG \$G$G$G t$׍&'T$D$t ttø É ø Ít&UWVS,\$@fD$*|$Xl$P{fD$(K $l$ L$*T$LL$T$D$s4$T$*Ɖ$D$TL$(L$L$LD$l$DD$HT$L$ l$D$S L$*T$(ыCfDCu(HutRtjtr,[^_]Ðt&bCC |$K $11҃D艓Hu, [^_]ËS$, [^_]Ã, [^_]Ð\|$TǸ\$Lt$Pl$XՉD$$$ƉL$$ø)P<$ T$74$\$ P$@$D$ ʉL$$\$ $@D$`\$4D$4S$ $T$\$L$4=]w\$Lt$P|$Tl$X\Ít&<\$74$D$$.=vE|$:|$: $BPf f|$8l$8\$l$:={zDL$`T$D$ |$:l$:$]Pf fl$8l$8\$l$:8V8S1ɃTD$4D$aD$$D$`T$0t$8!\$<L$@TT$D1҉t$#\$L$T$ w$11ۋT0D$dL$h\T[^þ&T0D$dL$h\T[^þھ1žt&'T0D$dL$h\T[^þT0D$dL$h\T[^þ.렾ľ 11먾뜾S=$.t&'VSt$$=\$ KC CSCC؉ $)=C$VC(F V$ w؃[^ÉT$$xPt$܍v$Pe$,1Y밐t&t&',=\$\$0t$ t$4|$$|$8l$(l$މ4$t у51=\$t$ |$$l$(,$nQ봉l$|$$0/$11ۅ_1ɅۉL$,D$1ۅ1ɅۉL$D$1ɉL$VFffl$tBFO1F4$1FFF3^$JT$<$F ^$T$$FT$$'F$ $F$$V$VSL$ T$w9s/&'v&vwC9rX[Ct&ԍUŸW1V1S l$ D$8D$\$$Ht&t1D A9rL$(D$0L$, w$9$s4t&${w$9$r1ٞ1D$D$8KT$TٍFf9vW+<uߍS+<=<$ȉL$D$T$TKf9w&'t$_8\$w$4$XO$=@Q to= 4=+c=@= E=+uQm>=!$Q+ $R+7=f\uD'L1Iww\$X1f;t&T$Pt$XfB@f9w'O$t$T\$Xi O)蘉!9Offt |$D$,[^_]ËD$HjfwD$HjfvT$1f\ $\$T$1f9s:` &fl:8ZfU$f9\$(D$(rQL$C1f9 d'fD:8rfP$l$\f9r$$RR,= D$f\EG1f9s2`t&fD:8rfP$l$\f9r؍K+fZht|\$X1f;tP|$&t$&f ft$$t$BL$Pl$Xl$$\$ l$&\$ fQf9UwO0$/lw,L$D\$D$@t$ T$<|$$t$HL$\$8l$(L$4T$ |$0t$1D$\$L$G4$@u1f>u-v'_9_t\$t$ |$$l$(,ËT$8D$O $Sf91uIu=w@$$>RԐ=\$\$(t$t$$|$|$ wf_\$t$|$$URÉD$f_\$t$|$Ít&'D$ |$pT$L$f fT$l$$l$$H9Í&' D$t-fBL$D$fB BЉJfB $1u Í&'t&',\$\$0t$ Rt$|$$l$(T$8$T$ Sf1;|$ C[o;|$ }~k T$4tEfk Q$ȃr؃= \$D$SwQԄfCfC fC o;|$ S|ؐ&\$t$ |$$l$(,|$xԄD$$]Rf fD$l$\$l$l$\$l$CԄ_S1D$$SUP,$|$L$f fL$l$\$l$l$C@=fCw?S9f{ fCt?=wsL$@D$<f@ql$ȉL$$zR먃=wL$@D$<f@s$URsl$$URql$sL$ |z\$ D$ \$ D$ |$ T$ f \$ D$ fT$l$T$l$ D$fP$t-%Q YQ YA r%Ð4VS\$ xL1ɍv'9}A|[^ÃH~"ـ[1^ÉؾU؍XމS\$UɃpttIy [ÍBx[Ív퐍&VSD$ xA1ɍt&9}A|[^Ãʃـ[1^û)뱍D$ȉʃpՄx|Í&)Ð&D$x4UÍt&4Í&'D$x4ɀUÉ4Ð1Í'1ÐL$ 0 Bt  1 Í'WVSL$ T$\$$\$ L$$ $ D=v)$ Rt$=[^_$ 1ҸR 1D$$ =@ G ډ^0 tE@ $ 9v3  q0 u115 ƃ R|$$ =!$R L$[^_Ð?(\?D$ E@tiD$E@K<$,$u9XZy =p ؃p s uÉp x ɞwp Ívp ÍvD$p EEt$@t0P P h ÍvD$Ívt1<$,$u>XZ$t> y= w/X Éh P ÍvP ÍvtEt,<$,$uXZ$tvp 5h ؃p 5h Ét$<$,$uXZ$ts ` ؃h ÐS\$t4Cu \$[;t $\$[[ËP$CH $SB$C D$ \$t$tJtx\$t$ËX1ҸT$s4$D$1f9Йff\$t$ÉX1ҸT$D$s4$1L$D$S$t$1ɉL$C$fC fCfC$\$t$Í4 f ,1\$\$0|$$1l$(1t$ ws$@vqw?$F@ffw $tgH\$t$ |$$l$(,Ít&$(F$E$E$E끋^1T$|$K $1f9ЙfxtfA^1L$l$S$|$1D$K $l$1҉T${<$fC fCfC$ f $'f@   D.D@&  Df]EE`E 0$`(f DTf:f*f0&@D UWVS \$$t$ ݅ۉ ՅuؙHø @@t9u9u獴& [^_]Ð&UWVS$$$ $tI$Ĝ[^_]Ét$P$JD$X\$T$L$\T$L|$Ttl$\L$T\$H9ˉvȍhyD$\Mt]T$XL$\2T$XWfty׉u)ډލ\Qt&fJuMuL$\D$T9D$H%L$Ht$\|$\)ȉD$T/)tEl$P]\$P\W19s!'Iu\$\$f}11ff9)1ۍv'C)f9ʉ}|$\f$\$L9h+$J1$$1퉜$$$|$x$l$tD$pH$$sU t$$$B$@f!fB$$$\$u$Q$$f4S4$o$1kIyKK9D$x@fD$x$F$$$uP$t$D$KT$@$oL$"3" 011 0 0 01z1z1z10011 0z1z1z17777887777788287788 CABBBBBBBBBBBBBBBIII'J'JIIIIIIIJ'JJIIIIIIIII'J'J'J'JIRR0RSR0R0R0R0R0R0R0R0R0R0R0R0Raaaaaaaaaaaaaar5ssst/r0trr5l@| iGZD~S@+d?`???????????rR)WWM81t{IS_j`Rb<xKYYYBX5w%%%%%&>&]&]%W)p))))) *0*O*=)\hyf%fli ihnfggYgfiDjujnfnf2eF;.Ї^Y(H w%   6 e        Xv=ii68Qwy38&h%%$ -# &"!<#Z$*]f_______m_fALA@0@:E=DE88?'G'BLC>=<;~;8p;p;p;p;p;p;p;;j::99{9%98$`_^^_Ffecnabbabuaat`_naDlkjj=rkk}pmo=onsn!nm,mlm0sBss^ssrƬƬ׬V@V#a#{"VA````//$·޷·*\BFP ee+E cc^`Jg<z5c,K/?O_o/?O_oqBBBBBCDCmCCCCD:DcDDKBˠ{eU !{RǭССССoܬ8JССС H^t20Pp ?=;97531/-+)'%#!   "$&(*,.02468:<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst!#&$),,!KLLLLLLLLMMM(M4M@MLMMNNNNOOO(O4O@OLOXOdOpO|O _mgI%:V1 @.1120B205170-/C//_./Hi=0??y %] - t -S "7R2pΏFA[ -s -~O҂b'f{ES#[+sc&n< - 0YvVRSO E]Z *M:N2G"p%M[Ӡ - 1]ƥ +F; _ m4]"(/d5:T@bD#I>LO RS9U2VVPW3WWWWWWWWWW - #>2^"B2ۦ 3 GB 3)3D?7L4Zh$Fxܹ<L˥ȳ'_qcG{u%YM|V f#zVRE[ - #F2^%j ro 8&/2@IQ@eX|dβ,k<6Z|l%T*>0)P^ Z r 4 X `  - #F2^>' "vw) Xx!->Se%oX+ +t ,Md9Q3+om7VI .|E ]G M jS Y҃[B2WpJ;3u-_wOKo`z`7t],xu8X1sMyb'%s5Q֕މN f؟U ͠E[ - #F2^>'y3 oqkS!.?MWVs,Elz3@(g0dfО J9Sf~$ l z D O>pRzb*RiiϦ5. {!o Z#$j72&:z'()}*+@e,P-Qq-8..) /)^/iܢ//0<,0ԸH0 $_00lp0΍}0a00Zܓ0?0O/0G0$003e0+0ݞ00f0 020|000 0 - #F2^>'{7 {+!1/@ͼWgu' IN@Cr&~ߎub| = ? ` jK:*\RX"Kge!|$Cv'x*5}-0y39[f6Y@9^;<Ϊ>h3ACEuG`IK ZMDNM^+P3K[QkgR?BSSTTHNfU}U@ PVDwVV,WT[W[YW3W WϱW WWAEWyWEWWWW™WW bWWݧWEWWW[WWWW - #F2^>'B{8 {!D/Y AX%vl !޴%)w-I2R6Yw;9@EY"I(yNS҈X(J]Hayf jr o s\vnz#} - #F2^>'J{8 ߀[!g/nA&Y}xH\a=4^TY+XMe^ o] kɁ sRN1(f2IV}!>&,+&ݗ1j7>Ek MU$^gq䉣{ - #F2^>'J{8 !k/ yA?Y7xD!|x)deCpnv7I  O s!^.m#Xn7$) /I6,=~ENmWsa^/l5w                    ??  vnlp}rXA5-)1=NdZ9'EkyM%8`~L4fY$rkimx ?uq7t_RJFLVhVWsYD5.,3=Nc;x@^C/"(9Qo#_t3qP4! *BaUm,jI- $;X|Kj(gE+  8Uz Ho0lK2 &?]P|<wT<'1He\JfM7)#%0A[v/ic&~bO@:6>GZpCDn`WS\du+bh6{y}!R^2  G{e>*QzsT:"  .Baw]SIFO[g                              !!!!!! !!!  !!!! ! !!%%%!!%% % %%% ! %!%%!!% %%% !!%%))) ) ))!!)%)%) )))%%!!)  )%%))!! ))%% ----))-!-!--%%- -         H?@@@{AAsBBhCCZDDHEE3FFGGHqHHRII0JJ KxKKPLL&MMMbNN2OOPfPP0QQQ]RR#SSSITT UjUU)VVVEWWX\XXYqYY'ZZZ6[[[B\\\K]]]Q^^^T__`U```RaaaNbbbGccc=ddd1eee#fsffgagghNhhh9iii!jnjjkTkkk8lllmemmmEnnn#omoopIppp#qkqqqCrrrs`sss4t{ttuMuuuvcvvv2wwwwxDxxxySyyyz`zzz({k{{{1|s|||8}y}}}<~}~~~?YFh@`w=w=tw=#w=w=ew=w=3w=ow=w=#w=lw=w=Gw= w=[w=w=&w=y>y>y>y>H n#r/K b?97= krv9C  CM( Z LIT;3 U o^\~ hjtk } wx rr9  C2)3r`T$$'[ټ .&μ˅ X)sԉͣsX) &. ['$$T`Όr)3LLLLZ ZL ZLLZZLZL LLLZZ LZZLLLZ L LZ @@iO&iO& @))))))))))))H@m)B9C))+))))))))))))))))))))))))))i,))@)))))=-)))5-(.95X8<A))@)))9A))X=X=X=X=?=D@*@*@*@*@*@*@*@*@*@*@*@*EE E E@*@*D@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*D@*@*D@*@*@*@*@*D@*@*@* E@*DD EDD@*@*@*Di Y Yh Ym]4h0] jdG\ Y Y Yr[4h Y`b Y Yz\Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y YWVA-@A-@A-A-@@@@Z="{/-?F;?*?; Bzge>ùG&<,8L 2}4 6`/<:|)ݦ@5]Ey?6 W-!= Cc'R;/f-7"J3J3"7-f/R;'cC =-!W6 y?E]593"ÿ6?%%6?"39: ?ym@aW(='44'(=Wa=ҔȐ@ȿ=/A-l7ppl7A-/@ȿ =/A-l7ppl7A-/= ҔȐ ;A-A- ;Ŀ}@}@} ;A-A- ;Ŀ}l7l7Ȕ@  ??C HVv}Ic5dX%(9Uj8/0NY9~m-6RV+n[ 92[ n+VR6- (j^Qs BA- w}s "EY@@$>@@ WK=p -) uׁ>u )- p=KW  |+02`A{/@T=Scr:% 6 D p17eO+ K9%9%K O+e71p D 6 %r:cS=T/@{`A28$G`8YO .Gjpuf1 !*+'! !'+*! 1fupjG. OY8`G$8U''UuPsX''XsPuQ 1&&1 QWK %% KW p_%_%p n),`}((}`,)n%4w, P''P ,w4% ''  `& ''& ` G{ B'B' {GV=p:"91t@Iee@It91":p=VV^H #r&.:leel:.r&#  H^V 7z`Qz0 %ex9 %,kF"Ua%}+ $?107?mKS#600@*gB + [X#Dn +%@8> '' >8@BL ?b&b&?L BE@F~% %% %~F@E` $$ `Iw $$ߘ wIE_''_EX[ l'l' [XAxZ ,','Z xACF&&FC"3Mt&t&M3"zL r9Y^XcXcǦ^Y9r LztZ-;9]) +BRccRB +)]9;-Zt 7z`Sw0 %ex9 0~RbL10_yp=!*H 90Z 7qfA#!~B mq/EXC %$z?vEsc.F]h)IC&%)tA!aE{- q7B,%,kF"Va(z+ $?1$0`OSqrp0)x/1';5#1%S[Xu^'R FSI57  2+Fjem]c%/0<w#j.9% 207{x[m" o(%:*15 '=o   9-07BmKW#60,97!G,32 ):(?/#faqv</2$90a1soT&\q_ eJ*2!76?a1PwA(buUWX#1#4<NC:*T^zmSLc/%0@*kC +ZY#Dn +% +B=\L {-:f@u '%%CN%.Y.-}?{"% B]Rd/ yB$#@i}Ujf0J+ <ssM\ez0-qJV}3I8"k/&&/k"8I| %% |kB $$ BkFEs ## sEF|f`y""y`f|K_9 /p'p'/ 9_K a ' 'a _' && '_b;&&;bh =g%g%= h8P N)f,e`^`^ef,N)ݎ P8WS6 /S+Z*:f]fɒcc]ff:ߞ*Z+S/ 6SW 7z`Tv0 %ex9 -M04ik?#!~B ls/EXC %& w?k3- 3MAC) %,kF"Va)|+ $?1$0"ZTTue(~w$j886 2+Fjem\e%0/<w#k.9% 230Nz!r :+07CmJX#60+:#J}"qV}412$90a1snT&\r_ eJ*2!6: .zL F)|lsSQ^0$0@*kC +ZY#Dn +% 'CF7S~&.;a&p?y%% B]Rd/y B$#>o}l0O[2qO0M(<|~N&&N~|<(M` %% `)>& }$}$& >)&H A#A# H&~=r""r=~OL[ c''c [LO && k}` jQ&Q&j `}kC%%Cvso$$osvJ3f $-N 71fF``Ff1 7N-$ f3JTCCqX . -\OZDzSSZO\-.  XqCCT :Y fd}3^~< %4'XS"B)T)XWHM7;" ::BXBqb*h-?&N\%4&| .&nV>˕)-<}I#T#TI}<-)>Vn&. |9*  jY "XLhpZ  ZphLX" Yj  D Zg&&gZ Dh9 pN%N%p 9hjN ## Nj5 J"J" 5h~.} }.~hH& |'|' &H7] && ]7hD\ r%%r\ Dh9&[$$[&9xz3P##P3zx0>fW{ c\ C6XGMMGXC6 \c{ Wf>0 7z`Tv0 %ex9  +Jyf0fT|i@$ }@D/1RC# %*sA"_JZ,M {5A-%0bMSpui?)>"<5!2)Lc ^r[_&k7]09#213TsF"<":+07ClIX#60*:%(p#l\x{702"83REW '\tZ^P'2"3=]f8*eTlS Je/% +B:f& J-?d @t (%  CW@T/v`A~ $?lyr0M.@,,,,,,,, --#-1-7-=-C-K-S-e-x-p--------. dK zzz Kd !zl;CvJ#,#JvC;lz!@@@{AAsBBhCCZDDHEE3FFGGHqHHRII0JJ KxKKPLL&MMMbNN2OOPfPP0QQQ]RR#SSSITT UjUU)VVVEWWX\XXYqYY'ZZZ6[[[B\\\K]]]Q^^^T__`U```RaaaNbbbGccc=ddd1eee#fsffgagghNhhh9iii!jnjjkTkkk8lllmemmmEnnn#omoopIppp#qkqqqCrrrs`sss4t{ttuMuuuvcvvv2wwwwxDxxxySyyyz`zzz({k{{{1|s|||8}y}}}<~}~~~?     08<`8q>>=>===>q>>?N?????? g^CCik F ) )+"PK .nF > cNc D 8Hzd2R9TwAZLX'c N ` ;kT:nRm)C'CK" fOm7Yl&?R$s5rrv> Jvx G4H ,T(?\w@u %|Rp GD ;^LD @lp\! k| "K@s=ep`Hr J ^)oh6i #=&P\ ;vfY  Yfv; \P&=#  !RigM2{O  O{2MgiR! O/g/z/////// 0  << 3  @e BW ~   !050F0z/\0q0000 0 0 0 0 1!1=1ƟBП7 8aTWWWWWWWWWWWWWIIIIybIIIIyЫ(Ы/ЫЫЫЫЫBЫXЫЫЫtЬݬЫ ЫЫЫЫ$TsЫЫЫЫЫЫЫЫЫЫЫЫЫЫ@ЫЫ!ЫЫЫЫЫЫ.ЫЫTsЫЫЫЫЫЫЫЫЫЫЫЫЫЫ@ЫЫ!333)3̱=\{6@ 92O-b(# reZPGaa ,Pa444441[11lb,P / [Ư 1 K $ v  Ƒ Ď Ƙ U > # P  m a O ǻ g  R 9Q Ϥ P+  ) <  C  1 0 # @  l 2 d  S  A ^ 0  IJ  YV s i ǎ .H ? % [L = J   7 }ɭ ķ  5  Đ | 6 d t p/ Y; {  Z V  D 3  G  % T   %      ȅ Z  E  \  xC _C Q ɏ QE ʓ ;Ĭ iB *L  Ħ 3 V  ̥ ô d  ̄ â c t k  < c  e \  F V  3 Q * M + I D 9] î ^c )ž . Ï P 1—  q J> 8 ` U + ?‰ Ƨ @9 ? Eƒ &z g  K} J  G RwZ\`acfr0@@@???????????????????????????????????????x?r?k?d?]?V?O?G?@?8?0?(? ????>>>>>>>>>>>>>}>r>g>\>P>E>9>->!>> >==========x=j=[=M=?=0=!===<<<<<<<KRQH4gWWhH */!.] *xRq{uINx/n%D8!T #X,;4:?C"DC?:;4X,#T !8D%n/xNIu{qRx* ].!/* HhWWg4HQRK>-F @f& ((TUSLB6( )C`yT0DvNpnF{+sZYr>Q4;D,fl9.cyw8@ nk QCs_:.uu|a'a-aP:[D2MscHߔܬgU Pk!0H>[KV_e1i1ie_V[KH>0k!P Ugܬ۔HcsM2D[:Pa-a'a|uu.:_sCQ kn @8wyc.9lf,D;4Q>rYZs+{FnpNvD0Ty`C) (6BLUT h8(8(8(8(8(8(8(8(((88((88((88((88/]3,/7=4;?(+"$/r9&/B?HDKLPP]SFPPrYTW[]r]  ?ofryodbk?h{t}wol]so2ODD8<8.(<.8(!LLP 8<(.D2O8DL!P L.<(88(<.LP !LD82OD.(<8P LL!(8.<(.8<8DD2O9>29>2'H'H9>29>2'H'H'H'HHH''HH''HH''229>9>229>9>'.-*r)-+'$r)O'%t$"]#?wTAl'NMJrIMKGDrI@@6OGEtDB]C@@<;4?82w=T:;86A2l51'nmjrimkgdri``VOgetdb]c``\[T?XRw]TZ[XVARlUQ' r  r vOt]|{t?xrw}Tz{xvArluq{>93@5(+ ZD=:I@0(80 +(@=:IZD593@{>{>93@5(+ ZD=:I@0(80 +(@=:IZD593@{>{>93@5(+ ZD>:I@0(80 +(@=:IZD593@{>{>93@5(+ ZD=:I@0(80 +(@=:IZD593@{>((88((8888((((8888((88((88((((88(((88888H((H((000000@ @ @ @ @ @ @ @ 000000H((H((88(((888 ,dp;A<Xn)33[iqj>@Hk ^X$)?W     "23# /XkV0jhT$ ow$qU2Z(? ? (Z2Uq$wo $Thj0VkX/ #32"   x00000000   V9JJV5<55443433R3(3X211y1P1D0b///. ,..-E-,,,,,,,,,:-8%8-868>8F8O8W8_8g8o8w888888888888888888 999+969B9%%MFGGGGGNN0MNMFPOP{M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0M0MLpMVUPSUTPST3TRSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSPSSSQdccZcc[bQbaaapaNa`e`-`__P_[[^ZE^%^o]\F\[[f[[[[[gDgPegfPewfeedgePePePePePePePePePePePePePePePePePePePePePePe\e3E@'@@t @b+>{'"lv4(l6 8$8̹>@r@>@t@$$G@@Ɏ3ܒ@@ ;x@PP(wwK Lm |t )@@)@f@@)@vp _ 2 N "X/Y| v %U4BP\3gnsUusn3g\PBU4%v |Y/X" N 2_ pv>.m5?qI(mc}0KXkq45oo~ ,?O ~?oYRZn'EZf tt{m7m7ȓ@ mW?% a:b4r@~O!zU3*UGG6y&Qa @ " zm^M:#q= y!)""o#$$%%%c&& 'R'''''''''''R' '&c&%%%$$o#")"y!  =q#:M^mz " @ a Q&y6GGU*3Uz!O~@r4b:a %?Wm. = (wwhB = $ww ~fP:% ?eA0W6%tH  R  : [ q | | q [ :  R  H t%6W0Ae? %:Pf~  ```````` `` ` ` ` ` `` < |t  pm @K@3a)_4#4 7XssX7 4#4_)a3(| 5v m@@m v5 |(1BSbow{yqcO4dJ8./:RtL!>KH2 7}|ABP[qXw x6f] ;$7f g#_|goQbE:^l P` %*I/ 3578875 3I/*%` P l^:EbQog|_#g f7$; ]f6x wXq[PBA|}7 2HK>!LtR:/.8Jd4Ocqy{wobSB1L-{ckU_4qHS>2S` EE  `S2>SHq4_Ukc{-LY@W^@`@W@80!3'X:SVa4n-~;`I7X t!T%1(+*.+.++*1(T%!t X7I`;~-n4aVh>~>>>>>>> ? -?D?W? @n?`?? ? ? ? ? ?? @@5@G@c@n@@@@@@99/998;5 K5 5 4 5 +6 2dBBtB!B"C#1*C2EC3IC4MC5QC7UC8=mCACBDCHCXC_CqCrCsDt Dv7DyDzt|}JDdDhDlDpDtDoZ. |GnU!"n<pXUf/N;WXW;N/fUXp&Ff002C/r9&/FPPrYrpfryo00000000+r)$KrI@D@6;4kri`d`V[T r v{t9#A0#A99#A0#A99#A0#A99#A0#A9~~ZZZ~~Z8!P 8!P !P ->KRQH4gWWhH */!.] *xRq{uINx/n%D8!T #X,;4:?C"DC?:;4X,#T !8D%n/xNIu{qRx* ].!/* HhWWg4HQRK>-?m?6?8LMKE<1$ &<WrnL,=k-L\\I&o(ji80nc5.MI0>BH)rwMda bo?"M 5f\pU-eq.J#$ ?McYG+8CN!V[^^[!VNC8G+YcM? $#J.qe-Up\f5 M"?ob adMwr)HB>0IM.5cn08ij(o&I\\L-k=,LnrW<& $1<EKML3#2(,(@ @3sR]E+\4vL/n:R5"Sս Οa1?C<|*LRO9  ~;WI)'k_XDu)ESE'   ;K7 H CA Yi UFr;bMbcx'Rbwl%YaC&, R&7t IA>?W#W?>AI t7&R (=PV% 2(% VP=(39<9f44\?>9579**f,6)'>%9KX`b^R@( souBma*r<4p `;eytUp!e( -rT}s0 Hx1YBk_kWr1g}1Q;)@c ^9"?&),-.-,)?&9"^c @);Q1}g1rWk_kBY1xH 0s}Tr- (e!pUtye;` p4u+](_g%U'K }(/5\:;=5>;=\:5/}( K'U%g_(]+u>&W;L R8I@Buees0BKLE9)'>g>l9X$DHw=NQ~cbkm)=kT&>4zw=eCqLb^ 4 -_t!c ,)>iG3i{J1 #$0), c!t_- 4 ^bLqCe=wz4>&Tk=)mkbc~QN+2(@ @3sc >J S; >.sv _ % ~Fm= ? [ ^Ht ;`1AXXE' \ "k= CRD OAM[HYttF @9b=B}^;nn~_C7M@B]"F3];*+>Sjj>S+*;]3F"]B@M7C_~nn;^}B=b9@!!@Zn{{nZ@!!~&]]&~{nZ@!!~&]]&~!!@Zn{(((((88888H((H((000000@ @ @ @ @ @ @ @ 000000H((H((88(((888((88((8888((((8888((88((88((((88000 @@@@ 00000000000@ `P0pH(hX8xD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_?8(8(8(8(8(8(8(8(((88((88((88((88/]3,/7=4;?(+"$/r9&/B?HDKLPP]SFPPrYTW[]r]  ?ofryodbk?h{t}wol]so2ODD8<8.(<.8(!LLP 8<(.D2O8DL!P L.<(88(<.LP !LD82OD.(<8P LL!(8.<(.8<8DD2O9>29>2'H'H9>29>2'H'H'H'HHH''HH''HH''229>9>229>9>'.-*r)-+'$r)O'%t$"]#?wTAl'NMJrIMKGDrI@@6OGEtDB]C@@<;4?82w=T:;86A2l51'nmjrimkgdri``VOgetdb]c``\[T?XRw]TZ[XVARlUQ' r  r vOt]|{t?xrw}Tz{xvArluq{>93@5(+ ZD=:I@0(80 +(@=:IZD593@{>{>93@5(+ ZD=:I@0(80 +(@=:IZD593@{>{>93@5(+ ZD>:I@0(80 +(@=:IZD593@{>{>93@5(+ ZD=:I@0(80 +(@=:IZD593@{>k1Ru#%MwVC@Lh=x_}8#m'2km0nxH $eJ|Zwd `#!7kF:2@7 4 A"IqMI `[aZv P  o IV*E3.*6BvMVV^c,f,fcV^VvMB6.*3E*VIo  P  vZa[` IMqI"A 4 7@2:Fk7!#` dwZ|Je$ Hxn0mk2'm#8}_x=hL@CVwM%#uR1k   G p   j  / X }        z. . . / K/ 4 7 6 6 5 37 5 K6 y5 O5 )5 jA A A B AB JH yH H I I I I xU.ۚn?ݧt=ߡg*Icx-9?A?8,}l W?"mL(pGa1vA MSUR J>{/jU=v Y x0U@<R  @@@{AAsBBhCCZDDHEE3FFGGHqHHRII0JJ KxKKPLL&MMMbNN2OOPfPP0QQQ]RR#SSSITT UjUU)VVVEWWX\XXYqYY'ZZZ6[[[B\\\K]]]Q^^^T__`U```RaaaNbbbGccc=ddd1eee#fsffgagghNhhh9iii!jnjjkTkkk8lllmemmmEnnn#omoopIppp#qkqqqCrrrs`sss4t{ttuMuuuvcvvv2wwwwxDxxxySyyyz`zzz({k{{{1|s|||8}y}}}<~}~~~?~}|0{Dz\yxxwvuu2tasrqp8ptonm:mlkkcjii[hg gffe"edcLcbba```_A_^)^]]\ \[[ZZY YXXW&WV;VUUUTtTTS*SRTRQQQPPPOO&ONdNNMHMLL4LKK'KJyJ"JIxI$IH~H-HGG5,! xj[L >>I??@q@@5AAAXBBCxCC7DDDREE FkFF$GGG8HHHHIIIVJJ KaKKLiLLMoMMNqNNOpOOPmPPQgQQ R^RRSSSSSDTTT3UUUVnVV WVWWW^^^_U___#`g```2avaaa>bbbcEcccdHdd[$Gj 3 S r9Um3G V a!#""#g$(%%&g'&(()a*++,U-../A001n2&334M566o7$889@::;V<==h>??s@!AAzB%CCzD$EEuFGGiHIIXJJK?LLM!NN^OOP3QQiRSS3TT`UUVWWBXXdYYZ[[)\\>]]P^^^__h``oaaqbbqcclddceeWffFgg2hhiiimjjJkk$lllbmm0nnn_oo#pppAqqqUrrs_ss t_ttuUuuuAvvv#wlwww@xxx yJyyyzBz}zzz&{]{{{{)|Z||||}9}b}}}}}~?~_~~~~~~ !8MbuubM8! ~~~~~_~?~~}}}}b}9}}|||Z|)|{{{]{&{zz}zBzzyyJy yxx@xwwlw#wvvAvuuUuut_t ts_ssrUrqqAqpp#po_onn0nmbmll$lkJkjmjiiih2hgFgfWfecedldcqcbqbaoa`h`_^_^P^]>]\)\[[ZYdYXBXWWVU`UT3TSSiRQ3QPO^ON!NML?LKJXJIIiHGGuFE$EzDC%CzBA!As@??h>==V<;:@:98$8o766M543&3n210A0/..U-,++a*)(&(g'&%(%g$#"#"a! V G3mU9rS 3 j G$[4l`Hx@5@(@meX\J%BTZTB%J\Xem@&>F~n^.6F~n^.6N~nV&>N~nV&>FvnZ.6B~f^.6J~fV&>NvnR &>FvnZ .6B~f^ .6J~fV &>NvnR &>DvoZ .6Bf\ .6JfT &>LvoR '?DvoZ /7Bf\ /7JfT '?LvoR '?DwoY /7Ag\ /7IgT '?LwoQ '?DwoY/7Ag\/7IgT '?LwoQ '?@woY/7AgX/7IgP '?HwoQ">F~n^*6F~n^.2N~nV&:N~nV">FvnZ*6B~f^.2J~fV&:NvnR ">FvnZ *6B~f^.2J~fV&:NvnR ">DvoZ *6Bf\.2JfT&:LvoR #?DvoZ +7Bf\/3JfT';LvoR #?DwoY +7Ag\/3IgT';LwoQ #?DwoY+7Ag\/3IgT';LwoQ #?@woY+7AgX/3IgP';HwoQ">Fzl^*6Fzl^.2N|jV&:N|jV">FrlZ*6Bzd^.2J|bV&:NtjR ">FrlZ *6Bzd^.2J|bV&:NtjR ">DrmZ *6B{d\.2J}bT&:LtkR #?DrmZ +7B{d\/3J}bT';LtkR #?DsmY +7A{e\/3I}cT';LukQ #?DsmY+7A{e\/3I}cT';LukQ #?@smY+7A{eX/3I}cP';HukQ"<Fzl^*4Fzl^,2N|jV$:N|jV"<FrlZ*4Bzd^,2J|bV$:NtjR "<FrlZ *4Bzd^,2J|bV$:NtjR "<DrmZ *4B{d\,2J}bT$:LtkR #=DrmZ +5B{d\-3J}bT%;LtkR #=DsmY +5A{e\-3I}cT%;LukQ #=DsmY +5A{e\-3I}cT%;LukQ #=DsmY+5A{e\-3I}cT%;LukQ #=@smY+5A{eX-3I}cP%;HukQ"<Gzl_*4Gzl_,2O|jW$:O|jW"<Grl[*4Czd_,2K|bW$:OtjS "<Grl[ *4Czd_,2K|bW$:OtjS "<Erm[ *4C{d],2K}bU$:MtkS #=Erm[ +5C{d]-3K}bU%;MtkS #=Esm[ +5C{e]-3K}cU%;MukS #=EsmY +5A{e]-3I}cU%;MukQ #=EsmY +5A{e]-3I}cU%;MukQ!<Gzl_)4Gzl_,1O|jW$9O|jW!<Grl[)4Czd_,1K|bW$9OtjS !<Grl[ )4Czd_,1K|bW$9OtjS !<Erm[ )4C{d],1K}bU$9MtkS !=Erm[ )5C{d]-1K}bU%9MtkS #=Erm[ +5C{d]-3K}bU%;MtkS #=Esm[ +5C{e]-3K}cU%;MukS!<Gyh_)4Gyh_,1OxiW$9OxiW!<Gqh[)4Cy`_,1KxaW$9OpiS !<Gqh[ )4Cy`_,1KxaW$9OpiS !<Eqh[ )4Cy`],1KxaU$9MpiS !<Eqm[ )4C{`],1K}aU$9MpkS !=Eqm[ )5C{`]-1K}aU%9MpkS!8Gyh_)0Gyh_(1OxiW 9OxiW!8Gqh[)0Cy`_(1KxaW 9OpiS !8Gqh[ )0Cy`_(1KxaW 9OpiS !8Eqh[ )0Cy`](1KxaU 9MpiS $=5- $=5- %=5, %=5, $<5) =4- !=4, %<5($<5) =4- !=4,%<5(&<3) ;4/ !;4.'<3(&<3) ;4/ !;4.'<3(&:3) ;2/ !;2.':3( $=5- $=5- %=5, %=5, $<5) =4- !=4, %<5($<5) =4- !=4,%<5(&<3) ;4/ !;4.'<3(&<3) ;4/ !;4.'<3(&<3) ;4/ !;4.'<3(&:3) ;2/ !;2.':3( $97- $97- %?1, %?1, $87) 96- !?0, %>1($87) 96- !?0,%>1(&87) 96/ !?0.'>1(&83) ;6/ !;0.'>3(&83) ;6/ !;0.'>3( $97- $97- %?1, %?1, $87) 96- !?0, %>1($87) 96- !?0, %>1($87) 96- !?0,%>1(&87) 96/ !?0.'>1( "97+ "97+ #?1* #?1* "87+ "96+ #?0* #>1* "87) 96+ !?0* #>1("87) 96+ !?0* #>1( "97+ "97+ #?1* #?1* "87+ "96+ #?0* #>1* @` @` @` @` @` @` @  @` @` @` @` @` @` @`   @` ` @`@@@`@`` @` @@@`@ ````                                                                   @@` ` @@`@ @@@``n 9  } 2 | p d Z * o U G @ < ,   147*2580369#ABCD7,{1N>>N1{,7,EDU n7&B'R=o"XF0 hs?  >  ;lg: CA=T9q)</  /<)q9T=AC :gl; >  ?sh0 FX"o=R'B&7n UDE,<z^*{hQh{*^z<<nvE@N*yU{7 6YqX'Zq,  ,?6s=l to\ 4K > {*[AA[*{ > K4 \ot l=s6?,  ,qZ'XqY6 7{Uy*N@Evn< 3#[{kU "  " Uk{[#3  /-4PGpy'p') OyJ N~ 3(  (3 ~N JyO )'p'ypGP4-/ N}eH<He}NUy][6 ; {'> U;8":'NXlE_lAo4V0\2l  AcF{i-.)!<//2BWm(m(WB2//<)!.-i{FcA  l2\0Vo4Al_ElXN':"8;U >'{ ;6[]yUB} 3{^I{'I^{3 }B ")j#k(!!(k#j)"  oI~z~p;~z~Io Q4%sPV3u2Y*945:b3H@%%@H3b:549*Yu23VPs%4Q i,T %?0% T,i 'H4  ju-[[] iNRuh+  1AfdEb37%%73bEdfA1  +huRNi ][[u-j  4H'^[~_+d<d+_~[^O+U8) BhL *+5X^Z.!kk!.Z^X5+* LhB )8U+O "10*hHe~  ~ eHh*01" /2+{[ w  x B-3&,3$t%&,gS ^ 4 fQX\Q[)3))3)[Q\XQf 4 ^ Sg,&%t$3,&3-B x w [ {+2/ Hj~Y0a<a0Y~jH Foi;9Df gHDv#e;[ jnTgG A]0:H dGiE < 9Pu(AnA  75iYD8mB u<  2`?6=J5  ,oE?4EY. &Tb2o%  9 g01~Z'-U"`:B4+f%+. a nf](](fn a .+f%4+B:`U"-'Z~1g0 9  %o2bT& .YE4?Eo,  5J=6?`2  <u BmD8Yi57  AnA(uP9 < EiGdH :0]A GgTnj[ e;#vDHg fD9;ioF,es@c*^p\r 63 } } 36 r\p^*c@se,.cw$]@=]$wc.-Or] 7JkJ;!c2#A  v4CY((YC4v  A#2c!;JkJ7 ]rO- 1?6uA{g8tw _ w t8g{Au6?1 $r]u4E,h ` h,E4u]r$AG 2G A|0t!+W EdkhFM*!F4Y ~sZZs~ Y4F!*MFhkdE W+!t0|^hnC;Cnh^ (jf?e9eD9*\`f2\G1T;c ";9P Oo(o(O P9;" c;T1G\2f`\*9De9e?fj( '@',SDe(@(eDS,fAfg g    Z   & 3         @ M endiscid: create... cid: delete... cid: STR: '%s' cid: CID Failure cid: CID Success voice: vce_hook_on (%p)... voice: vce_hook_off (%p)... voice: VOICE_create... voice: VOICE_delete... voice: VCE: VOICE_CMD_ABORT voice: STRM_VCE:VOICE_ERROR voice: STRM_VCE:VOICE_CANCEL voice: STRM_VCE:VOICE_PURGE voice: STRM_VCE:VOICE_OK voice: STRM_VCE: BUSY voice: STRM_VCE: FAX Tone voice: STRM_VCE: Underrun voice: STRM_VCE: DIALTONE fax: delete... fax: create... fax: bad command: %x fax: FAXC1_FRS, %x fax: FAXC1_FTS, %x fax: FAX_class1_command: %x fax: FAXC1_FTM, %x, %d fax: FAXC1_FRM, %x fax: FAXC1_FTH, %x fax: FAXC1_FRH %x fax: rcv: %d (%d) fax: snd: %d (%d) fax: FAX_CLASS1_ACCEPT_RATE fax: FAX_CLASS1_NO_CARRIER fax: FAX_CLASS1_ERROR fax: FAX_CLASS1_OK fax: FAX_CLASS1_CONNECT RD: create... RD: delete... callcall: create... call: delete... call: process: msg %d --> %d call: PulseDialDigit %lu... call: %d: hook off... call: %d: hook on... call: SetPulseBreakTime %lu call: SetPulseMakeTime %lu V8v8: delete... v8: status (%d) %s v8: process: timeout. v8: process: QC. v8: process: OK. VPCMvpcm: Delays: HW %d, DMA %d vpcm: delete... vpcm: New status %d vpcm: Link Error vpcm: train timeout! vpcm: Re-starting phase II vpcm: Phase II completed !!! v32v32: create... v32: phys. delay is %d v32: delete... v32: process: error. v32: process: nocarrier. v32: process: connect %x. v23v23: create... v23: V23STAT: --> %d v22v22: create... v22: V22STAT: --> %d b103Bell103V.21b103: create... K.56Flex (same as V.34)V.34Setting prev bulk delay = %d V90, setINFO0dBits VPcmV34Main, giveINFO0%cBits VPcmV34Main, rxinfo0%c = VPcmV34Main: giveINFO1dBits VPcmV34Main: giveINFO1aBits VPcmV34Main: Uinfo is %d MHreq message detected ! MHcda message detected ! MHfrr message detected ! VPcmV34Main, setINFO1dBits VPcmV34Main, setINFO1aBits V90mp - drn = %d V90mp - type = %d V90mp - trellisState = %d V90mp - rateMask = 0x%X RX at %lX Ja Flag set to %d CP Flag set to %d CPnot Flag set to %d *** Echo Silence ON *** *** Echo Silence Off *** L2[%d] = %c%d.%05d Final L2 Probing signal: DigitalAnalog = %c%d.%06d CPObj->M[%d] = %d CPObj->LC[%d] = %d V92 mapping parameters: CPObj->trellisState = %d CPObj->prefilterGain = %d CPObj->extendEu = %d CPObj->drn = %d Upstream rate = %d CPObj->lz1 = %d CPObj->lz2 = %d CPObj->lp1 = %d CPObj->lp2 = %d const6[%d] = %d const5[%d] = %d const4[%d] = %d const3[%d] = %d const2[%d] = %d const1[%d] = %d V92Modem Destruction %s V92Modem Version: %s (%s) 9-Apr-011.1V92Modem Reset DigitalAnalogV92Modulator enter Phase 3 V92Modulator: exit Ja V92Modulator: exit Silence V92Modulator: exit SuSecond V92Modulator: exit CPt V92Modulator: enter Phase 4 V92Modulator reset V92Modulator constraction VPCM_SESSION_TYPEV92_PHASE2_INFO_A_OR_MUV92_PHASE2_INFO_RTDV92_PHASE2_INFO_UINFOV92_PHASE2_INFO_MAX_TX_POWERV92_EXTEND_EUV92_DELAY_BEFOR_STEADY_STATEV92_RRN_SIMULATION_SWITCHV92_RRN_START_DELAYV92_SILENCE_RRN_REQUESTEV92_RRN_TRN2U_DD_LENGTHV92_MAX_SILENCE_LENGTH_FLAGV92_SILENCE_LENGTHV92_FPE_SIMULATION_SWITCHV92_FPE_START_DELAYV92A_DIGITAL_RATE_MASKV92A_PHASE4_CONSTELLATIONV92A_RRN_CONSTELLATIONV92_PHASE4_CONSTELLATIONV92_RRN_CONSTELLATIONV92_NOF_FILTER_SECTIONSV92_MAX_TOTAL_NOF_COEFFSV92_APPLY_TX_SHAPING_FILTERV92_ECHO_FILTER_LENGTHV92_ECHO_INITIAL_DELAYV92_ECHO_DELAY_OFFSETV92_ECHO_FAST_BETA_FACTORV92_ECHO_FAST_DECAY_FACTORV92_ECHO_SLOW_BETA_FACTORV92_ECHO_SLOW_DECAY_FACTORV92_ECHO_FAST_UPDATE_DURATIONV92_ECHO_SLOW_UPDATE_DURATIONV92_RESAMPLER_RESULOTIONV92_LINEAR_EQU_LENGTHV92_LE_PHASE_3_BETAV92_LE_BETA_I_DURATIONV92_LE_PHASE_3_BETA_IIV92_DFE_LENGTHV92_DFE_PHASE_3_BETAV92_DFE_TRN1U_FREEZE_DURATIONV92_AGC_NOMINAL_ENERGYV92_AGC_KV92_AGC_BLOCK_LENV92_AGC_ADAPTATION_DURATIONSU_DETECTOR_ENERGY_THRESHOLDMODULATOR_QUEUE_LENGTHA_LAWMU_LAWV92Phase2Info: pcmType = %s V92Phase2Info: Uinfo = %d V92Phase2Info: rtd = %d CodecOutputDigitalModemTerminalrecivedSUVtag called V90Modem Destruction %s V90Modem Version: %s (%s) 25-Mar-042.98DigitalAnalogV90Modem Reset, qcFlag = %d V90Modulator enter Phase 3 V90Modulator: exit Jd V90Modulator: exit JdPhase V90Modulator: TRN2d D = %d V90Modulator: exit Ri V90Modulator: enter Phase 4 V90Modulator: exit DIL V90Modulator reset V90 Diagnostics ------------------------- RBS : %d (%d%d%d%d%d%d) V90Demodulator: Agc Frozen V90MP: Rate Mask - %s V90MP: Ed detected PROBING_MODEHW_CODEC_TYPEENABLE_EQUALIZER_MMXLINE_CONNECTION_TYPEPHASE2_INFO_A_OR_MUEIA6_ENABLE_EQUALIZER_MMXPHASE2_INFO_RTDPHASE2_INFO_MAX_TX_POWERPHASE2_INFO_UINFODIGITAL_RATE_MASKMAX_SPECTRAL_SHAPER_LOOKAHEADV34_RRN_CONSTELLATIONV34_PHASE4_CONSTELLATIONV92_DIGITAL_RATE_MASKV92_JD_PHASEPRE_FILTER_GAINANALOG_RATE_MASKPRE_FILTER_COEF_TYPEGERMAN_PBX_PRE_FILTER_GAINAGC_KAGC_NOMINAL_ENERGYAGC_ADAPTATION_DURATIONAGC_BLOCK_LENINITIAL_BAUD_OFFSETBLL_INITIAL_K2BLL_INITIAL_K1BLL_FAST_K2BLL_FAST_K1BLL_MEDIUM_K1BLL_SLOW_K1BLL_MEDIUM_K2BLL_SLOW2_K1BLL_SLOW_K2BLL_SLOW2_K2BLL_DIL_K2BLL_DIL_K1BLL_TRN2_INITIAL_K2BLL_TRN2_INITIAL_K1BLL_TRN2_K1BLL_STEADY_STATE_K1BLL_TRN2_K2BLL_PRE_ANSPCM_K1BLL_STEADY_STATE_K2BLL_PRE_ANSPCM_K2BLL_TRN1_QC_INITIAL_K2BLL_TRN1_QC_INITIAL_K1BLL_TRN1_QC_FAST_K2BLL_TRN1_QC_FAST_K1BLL_TRN1_QC_SLOW_K1BLL_TRN1_QC_MEDIUM_K1BLL_TRN1_QC_MEDIUM_K2BLL_TRN1_QC_SLOW_K2EIA6_BLL_INITIAL_K2EIA6_BLL_INITIAL_K1EIA6_BLL_FAST_K1EIA6_BLL_MEDIUM_K1EIA6_BLL_FAST_K2EIA6_BLL_SLOW_K1EIA6_BLL_MEDIUM_K2EIA6_BLL_SLOW_K2EIA6_BLL_SLOW2_K2EIA6_BLL_SLOW2_K1EIA6_BLL_DIL_K2EIA6_BLL_DIL_K1EIA6_BLL_TRN2_INITIAL_K1EIA6_BLL_TRN2_K1EIA6_BLL_TRN2_INITIAL_K2EIA6_BLL_STEADY_STATE_K1EIA6_BLL_TRN2_K2EIA6_BLL_STEADY_STATE_K2LINEAR_EQU_LENGTHLINEAR_EQU_FADE_EDGES_CYCLELINEAR_EQU_HISTORY_LENGTHLINEAR_EQU_CURSOR_PLACELINEAR_EQU_DIL_BETALINEAR_EQU_DIL_MED_UCODE_BETALINEAR_EQU_TRN1D_BETALINEAR_EQU_ALT_DIL_BETALINEAR_EQU_TRN2D_BETALINEAR_EQU_TRN2D_INITIAL_BETALINEAR_EQU_DATA_BETAEIA6_LINEAR_EQU_DIL_BETAEIA6_LINEAR_EQU_TRN1D_BETAEIA6_LINEAR_EQU_TRN2D_BETAEIA6_LINEAR_EQU_DATA_BETADFE_TRN1D_BETADFE_LENGTHDFE_DIL_BETADFE_DIL_MED_UCODE_BETADFE_DIL_HIGH_UCODE_BETAEIA6_DFE_DIL_MED_UCODE_BETADFE_DIL_ERROR_RELAX_BETAEIA6_DFE_DIL_HIGH_UCODE_BETAEIA6_DFE_DIL_ERROR_RELAX_BETADFE_DIL_ALT_BETADFE_DIL_ALT_HIGH_UCODE_BETADFE_DIL_ALT_MED_UCODE_BETADFE_TRN2D_BETADFE_DATA_BETADFE_TRN1D_FREEZE_DURATIONGERMAN_PBX_DFE_DATA_BETAEIA6_DFE_DIL_BETAEIA6_DFE_TRN1D_BETAEIA6_DFE_TRN2D_FAST_BETAEIA6_DFE_DATA_BETAEIA6_DFE_TRN2D_SLOW_BETAEIA6_DFE_TRN2D_RRN_BETAERROR_ENERGY_MEAN_BLOCK_LENERROR_ENERGY_MEAN_KSD_DETECTOR_ENERGY_THRESHOLDPHASE4_R_DETECTION_LENGTHRRN_R_DETECTION_LENGTHSPECTRAL_VERIFIER_ENABLEEIA6_SPECTRAL_VERIFIER_ENABLESPECTRAL_VERIFIER_SAMPLE_FREQSPECTRAL_VERIFIER_FFT_WINDOWSPECTRAL_VERIFIER_FFT_LENSPECTRAL_VERIFIER_PSD_LENTRN1D_DD_LENGTHSILENCE_SCRTRN2D_DD_LENGTHRRN_TRN2D_DD_LENGTHUSE_RESTRICED_DMINDIGITAL_POWER_REDUCTIONUP_ROUND_KEIA6_USE_RESTRICED_DMINDMIN_CALC_FACTOR2DMIN_CALC_FACTOR1DMIN_EIA6_FACTORFORCED_DMINFORCE_RATE_ENABLESPECTRAL_SHAPER_A1RATE_FORCESPECTRAL_SHAPER_A2SPECTRAL_SHAPER_B1SPECTRAL_SHAPER_B2SPECTRAL_SHAPER_IDSPECTRAL_SHAPER_SRGERMAN_PBX_SPECTRAL_SHAPER_A1GERMAN_PBX_SPECTRAL_SHAPER_A2GERMAN_PBX_SPECTRAL_SHAPER_B1GERMAN_PBX_SPECTRAL_SHAPER_SRGERMAN_PBX_SPECTRAL_SHAPER_B2GERMAN_PBX_SPECTRAL_SHAPER_IDEIA6_SPECTRAL_SHAPER_A1EIA6_SPECTRAL_SHAPER_A2EIA6_SPECTRAL_SHAPER_B2EIA6_SPECTRAL_SHAPER_B1EIA6_SPECTRAL_SHAPER_SREIA6_SPECTRAL_SHAPER_IDRRN_SILENCE_REQUESTEDRRN_SILENCE_SCR_LENGTHRRN_SILENCE_ECHO_CALC_PERIODPDSNR_THRESHOLD_IN_PHASE3PDSNR_THRESHOLD_IN_PHASE4TRN1D_ERROR_FOR_V34_FALLBACKPHASE3_ERROR_FOR_V34_FALLBACKPHASE4_ERROR_FOR_V34_FALLBACKENABLE_RRN_UPENABLE_RRN_DOWNRATE_DOWN_DETECT_DURATIONRATE_UP_DETECT_DURATIONRETRAIN_DETECT_DURATIONMAX_NOF_V90_RETRAINSRETRAIN_COUNTER_FADE_COUNTMAX_NOF_REMOTE_RETRAINSREMOTE_RRN_COUNTER_FADE_COUNTENABLE_ERROR_CORRECTION_RRNEIA6_MAX_NOF_V90_RETRAINSTRN2D_QC_DD_LENGTHTRN1_QC_DD_LENGTHDFE_QC_TRN1D_FREEZE_DURATIONANSPCM_DEMODULATION_LENGTHQC_LOGGING_PERIOD_INITIALHIGH_LEVEL_TX_ACTIVESENSITIVE_ISP_DETECTEDLOOP_TYPEWRITE_ERROR_TO_FILEWRITE_EQU_COEFS_TO_FILELOAD_EQU_COEFS_FROM_FILETEMP_INT_PARAMETER1TEMP_INT_PARAMETER2TEMP_INT_PARAMETER3TEMP_INT_PARAMETER4TEMP_FLOAT_PARAMETER2TEMP_FLOAT_PARAMETER1TEMP_FLOAT_PARAMETER3TEMP_FLOAT_PARAMETER4A_LAWMU_LAWV90Phase2Info: pcmType = %s V90Phase2Info: Uinfo = %d V90Phase2Info: rtd = %d CodecOutputDigitalModemTerminalMPDIRECTLY to MPNotError histogram #%d: constellation %d : %d - %d %d V90MappingParams: Sr = %d V90MappingParams: Id = %d V90Resampler: state = FAST V90Resampler: state = SLOW V90Resampler: state = SLOW2 V90Resampler: state = DIL V90Resampler: state = TRN2 V90Equalizer: enter Phase 3 V90Equalizer: enter Phase 4 Linear Equalizer: maxLeCoefValue = %c%d.%06d coefs sum = %c%d.%06d abs coefs sum = %c%d.%06d DFE: V90Equalizer: reset Q3.13 format violation!! Q1.6 format violation!! 'stV90CP packed: CP%s%s%s bits: V90TRN2Design: trn2 size : %d error -- = %c%d.%03d threshold -- = %c%d.%03d altRbsDistanceThresh = %d altMinVarThresh = %c%d.%02d AltUcode[%d] : %d %d minErrorMuLaw = %c%d.%02d gainValueMuLaw = %c%d.%06d minErrorALaw = %c%d.%02d gainValueALaw = %c%d.%06d Codec type %d V90SpectralVerifier: Reset V90SpectralVerifier: Ready V90ConstellationDesigner: ## Debug: Cnt address = %X ## Debug: pParamObj->N = %d z1[%d] = %c%d.%07d p1[%d] = %c%d.%07d z2[%d] = %c%d.%07d p2[%d] = %c%d.%07d --------------------------- lz2 = %d lp2 = %d Gain = %c%d.%07d K = %d trellisType = %d extendEu = %d m0 = %d m1 = %d m2 = %d m3 = %d m4 = %d m5 = %d m6 = %d m7 = %d m8 = %d m9 = %d m10 = %d m11 = %d lz1 = %d lp1 = %d V92Precoder: reset 2 called V34AGC, overflow = 0x%x, NEV34NEC, Start NEC Adaptation V34NEC - stop NEC adaptation FENEEcho Energy = %d, BETA = %d NOSTATE0TXRENEGNOSTATE2NOSTATE3RECEIVESILENCEANSAMTONE_2100TONE2225AA_TXCC_TXAC_TXCA_TXSXMITXMIT1XMIT2XMIT3XMITV22SSEGSBARSEGPPSEGTRNSEG4TRNSEG16TX_JM_CMTX_DPSKDET_2100DET_2250DET_2400DET_1200DET_ACDET_AC_RTNDET_AC_ENDDET_AAPHASE1PHASE2WAITNOSTATE36RECEIVE1RECEIVE2RECEIVEV22DET_CM_JMDET_SYNCDET_CJRX_DPSKDET_INFOTONE_AB_ANSTX_PHASE1_ANSTX_PHASE2_ANSTX_PHASE3_ANSRX_PHASE1_ANSRX_PHASE2_ANSTX_L1TX_L2DET_ABSILENCEINFOTX_PHASE1_CALLTX_PHASE2_CALLTX_PHASE3_CALLRX_PHASE1_CALLRX_PHASE2_CALLTONE_ABTONE_AB_CALLRX_PHASE3_CALLINFODONEJTXMITXMIT0TRNSEG4AXMITMPJ1TXMITEXMITDATAXMITTXLEVELRX_L1RX_L2SILENCERETRAINRX_RETRAIN_CALLRX_RETRAIN_ANSWERTX_RETRAIN_ANSJaTXMITMOH_TONEMOH_TONE_DROPMOH_SILENCEMOH_ON_HOLDMOH_FRRMOH_CLEARDOWNK56JaTXMITTXMDV34HSHAK: Freeze EC V21RXBUF=0x%x V34MP- E transmit completed V34PROBE, txinfo1ctransmitting info1astarting DET_ABV34PROBE, txinfo1a (QC)TX_PHASE_ANS: count3 = %d V34INFO, rxinfo0 Short Phase 2RX MDLENGTH = %d V34PROBE, rxinfo1aV34PROBE, rxinfo1cV34PROBE, txinfo1aSetINFO0dBits V34TIMING,Retrain started ?%d %d %d %d %d %d V8CTRL_START_CMV8CTRL_START_CJV8CTRL_START_JMV8CTRL_CTRL3V8CTRL_CTRL4V8CTRL_CTRL5V8CTRL_CTRL6V8CTRL_CTRL7V8CTRL_CTRL8V8CTRL_CTRL9V8CTRL_CTRL10V8_CMV8_JMV8_CJV8_QC1AV8_INITV8_ANS_SEND_ANSAMV8_ANS_CM_DETECTEDV8_ANS_SEND_JMV8_ORG_WAITING_FOR_ANSAMV8_ORG_SEND_CMV8_ORG_JM_DETECTEDV8_ORG_SEND_CJV8_OKV8_ORG_SEND_QCV8_ORG_WAITING_FOR_QCA1dV8_ORG_BAD_QCA1d_MESSAGEV8_LAST_ENUM Protocol - LAPM V.42 v8bisIndication - %d quickConnectEnabled - %d lapmIndication - %d ucodeForQts - %d ansPcmLevel - %d V8: local configuration : CallerAnswer Side = %s Operation Mode = %d V8AGC, overflow = 0x%x, JMCMGotDidn't getCJV8 ANSAM Detected (CM ready) CALLPROG_NO_LEGAL_STATECALLPROG_WAIT_DIALCALLPROG_DIALINGCALLPROG_WAIT_RINGCALLPROG_WAIT_TO_ANSWERCALLPROG_ANSWER_STATECALLPROG_ENDCALLPROG_END_PARTIALLY_STATECALLPROG_WFS_STATECALLPROG_BONGTONE_STATECALLPROG_NO_MESSAGECALLPROG_NO_RINGCALLPROG_NO_DIAL_TONECALLPROG_END_DIALINGCALLPROG_RINGBACKCALLPROG_NO_ANSWERCALLPROG_ANSWERCALLPROG_MODEM_ANSWERCALLPROG_VOICE_ANSWERCALLPROG_BUSYCALLPROG_CONGESTIONCALLPROG_ERRORCALLPROG_ANSWER_STATE_TIMEOUTCALLPROG_V8BIS_MODEM_ANSWERCALLPROG_MAX_MESSAGESCALLPROG_Delete is exited CALLPROG_Delete is entered APPLY_FILTER = %d CallProgFP_Create >> CALLPROG Create << STATE: %s --> %s CALLPROG: LINE CLEAR TIMEOUT CALLPROG: $ encountered. CALLPROG: @ encountered. CALLPROG: Time out busy detected by cadence Invalid buffer length CALLPROG: ^ encountered. Found 2100 Found 2250 CALLPROG_Dial was exited. CALLPROG Dialing %s WAIT DIAL TIMEOUT = %d GetNoAnswerTimeOut. %d Digit is %c FATALINVALIDTOLERABLEVALIDILLEGAL!Dial String Syntax is %s DIALER_END_PARTIALLY_STATE DIALER_END_STATE DIALER_CALLING_TONE_STATE DIALER_INITIAL_STATE Dialer switch default case Done Generating flash Done Generating Dial-Pause Done Generating digit Original digitToPulseDial %dSamples left = %d Dialer was aborted. Dialer was aborted - error. DTMF_Gain1 = %d DTMF_Gain2 = %d Configuration->flashTime %d BUSYDIALCONGRINGINVALIDNO ANSWER state recognized CYCLES_COUNTER= %d BUSY cadence recognized TYPE %s Filter index %d Filter SubIndex %d BUFFER LENGTH %d samples. INTEGRATION_LENGTH %d[ms] LEVEL %d Disable CONGESTION detector BUFFER LENGTH is INVALID! ============> %d Disable RINGBACK detector Ringback index====> %d CONNECT 9600 BPS! CONNECT 4800 BPS! Remote Loop #2 ESTABLISHED! Remote Loop #2 FAILED! Remote Loop #2 terminated. Detected retrain request...Initiating retrain...NO CARRIER CONNECT! DISCONNECT! Timeout : Detecting epoch. Timeout : Detecting AA CLEARDOWN. CONNECT 7200 BPS! CONNECT 9600T BPS! CONNECT 12000 BPS! CONNECT 14400 BPS! Rate change request detectedV32FP version: %s %s 15:48:07Sep 22 2005sre no carrier v32 low sig energy V32_MSG_NO_CARRIER state %s(%d) v32 Turn Around Delay = %d v32 RTD = %d STATE_ASTATE_BSTATE_B2STATE_CSTATE_DSTATE_D2STATE_ESTATE_FSTATE_GSTATE_HSTATE_ISTATE_JSTATE_KSTATE_LSTATE_MSTATE_NSTATE_OSTATE_PSTATE_QSTATE_RSTATE_SSTATE_TSTATE_USTATE_VSTATE_WSTATE_XSTATE_YSTATE_ZSTATE_ENDSTATE_F2STATE_X2STATE_CLEARDOWNSTATE_DONESTATE_ERRORSTATE_DONT_CAREINVALID!Dec error = %d (*64) state %s(%d) state %s(%d) V23FP version %s %s 15:48:09Sep 22 2005Generating answer tone. Carrier Detection Time Out Energy drop detected...... V23 no carrier detected... CONNECT 2400 BPS! CONNECT 1200 BPS! Remote Loop #2 ESTABLISHED! Remote Loop #2 FAILED! Remote Loop #2 terminated. Detected retrain request...Initiating retrain...NO CARRIER V22FP create, built %s %s Sep 22 200515:48:09V22_MSG_NO_CARRIER2 V22_MSG_ERROR7 V22_MSG_NO_CARRIER3 connect_2400, NODE_2400C connect_2400, NODE_2400B V22_MSG_NO_CARRIER4 V22_answer,NODE_3 V22_answer,NODE_0 V22_answer, NODE %d V22_answer,NODE_4 V22_answer,NODE_1 V22_MSG_ERROR5 Detected V22 Carrier Detected V22bis Carrier V22_originate, NODE_6 V22_MSG_ERROR1 V22_MSG_ERROR3 V22_originate, NODE_5 V22_originate, NODE_4 V22_originate, NODE %d V22_originate, NODE_1 V22_originate, NODE_3 V22_originate,NODE_0 V22_MSG_ERROR4 V.22 %d modem det true V22: Detect_V22 OK!!! B103FP version: %s %s 15:48:11Sep 22 2005B103_STATE_CARRDET B103_STATE_WAIT1 default B103_STATE_START B103_STATE_WAIT2 AUTOMATIC MODULATION MODE FSK demodulator Failed DTMF demodulator Failed DTMF CID Reset ! CID DTMF Detected 'C' ! FSK CID Reset ! FSK CID Creating Tone 1200 Detected FAX_CLASS1_NO_MESSAGEFAX_CLASS1_OKFAX_CLASS1_ERRORFAX_CLASS1_OK_NO_CARRIERFAX_CLASS1_ERROR_NO_CARRIERFAX_CLASS1_ERROR_ON_HOOKFAX_CLASS1_CONNECTFAX_CLASS1_NO_CARRIERFAX_CLASS1_OTHER_CARRIERFAX_CLASS1_ACCEPT_RATET30_PREAMBLE_STATESEND_HDLC_BUFFER_STATEHDLC_RECEIVE_STATEHDLC_EMULATE_RECEIVE_STATEIDLE_STATETX_SCRAMBLED_ONES_STATETX_DATA_STATETX_NULLS_STATERX_LOOK_CARRIERRX_DATA_STATEANSWER_TONE_STATESEND_SILENCE_STATERECIEVE_SILENCE_STATECHDLCTX_OFF_STATETX_SILENCE_BEFORE_SCRM_ONESMAX_STATESFAX_CLASS1_TH_COMMANDFAX_CLASS1_TM_COMMANDFAX_CLASS1_RM_COMMANDFAX_CLASS1_RH_COMMANDFAX_CLASS1_TS_COMMANDFAX_CLASS1_RS_COMMANDEnergy %d > silence treshold Abort waiting for silence!Answer tone length %d ms15:48:16Sep 22 2005CNG generation disabledFax Class1 Command %X At %2d.%02d[sec] %s %d %d,ERROR: TxSmpCnt != 160 !!! STATUS = DELAYED_STATUS Restarting existing RX modem %02X,FCL1: FRAME TRANSMITTED (%s) %2x Frame with bad CRC Replacing the second byte... Shifting data %d bits Bad CRC! Replacing first byte ... Replacing the first byte... CRC is now OK! TCF - TrainNONE - DataNSF - Non-Standard FacilitiesCFR - Confirmation To ReceiveFTT - Failure To TrainMCF - Message ConfirmationRTNRTPPINPIPRNR - Receive Not ReadyPPR - Partial Page RequestDCS - Digital Command SignalNSSCTC - Continue To CorrectCRPDCN - DisconnectEOM - End Of MessageMPS - MultiPage SignalEOR - End Of RetransmissionEOP - End Of ProcedureRR - Receive ReadyPPS - Partial Page SignalDTCCIGPWDNSCINVALIDUnknown frame (ID=0x%02x)V.17 Receive Data ModeV.17 Receive Protocol ModeV.17 Rx Start of ProtocolERROR: V.17 Rx Internal Error V.17 RX Create New allocation V.17 Transmit Data ModeV.17 Protocal Transmit ModeV.17 Transmit Idle ModeERROR: V.17 Tx Internal Error V.17 TX Create New allocation V.21 Receive Data ModeV.21 Rx Start of ProtocolERROR: V.21 Rx Internal ErrorCONNECT: V.21 Receive 300 bpsV.21 RX Create New allocation V.21 Transmit Data ModeV.21 Transmit Idle ModeERROR: V.21 Tx Internal Error V.21 TX Create New allocation V.27 Receive Data ModeV.27 Receive Protocol ModeV.27 Rx Start of ProtocolERROR: V.27 Rx Internal Error V.27 RX Create New allocation V.27ter Transmit Data ModeV.27ter Transmit Idle Mode V.27 TX Create New allocation V.29 Receive Data ModeV.29 Receive Protocol ModeV.29 Rx Start of ProtocolERROR: V.29 Rx Internal Error V.29 RX Create New allocation V.29 Transmit Data ModeV.29 Protocal Transmit ModeV.29 Transmit Idle ModeERROR: V.29 Tx Internal Error V.29 TX Create New allocation _tx_scrambled_ones_init cDATAtx_counter %d At %2d.%02d[sec] Tx connect %2d.%02d[sec] Idle state CLASS1: DLE %1X in data FCL1: FRAME RECEIVED (%s) HDLC Recieved Frame of %d: %02X,%02X V17RX_DEFAULT: %d V17RX_STATE_PROTOCOL V17RX_STATE_IDLE V17RX_STATE_EPOCH_DET V17RX_STATE_START V17RX_STATE_DATA V17RX_STATE_SCRAM V17RX_STATE_BRIDGE V17TX_DEFAULT, %d V17TX_STATE_BRIDGE V17TX_STATE_SCR1_END V17TX_STATE_EQCOND V17TX_STATE_SILENCE V17TX_STATE_ALT V17TX_STATE_START V17TX_STATE_IDLE V17TX_STATE_QUIET_END V17TX_STATE_DATA V17TX_STATE_TEP V17TX_STATE_SCR1 V17TX_STATE_QUIET V21RX_DEFAULT, %d V21RX_STATE_WAIT V21RX_STATE_DATA V21RX_STATE_START V21TX_DEFAULT, %d V21TX_STATE_DATA V21TX_STATE_IDLE V21TX_STATE_START V27RX_DEFAULT, %d V27RX_STATE_EPOCH_DET V27RX_STATE_START V27RX_STATE_IDLE V27RX_STATE_DATA V27RX_STATE_PROTOCOL V27TX_DEFAULT, %d V27TX_STATE_START V27TX_STATE_IDLE V27TX_STATE_QUIET V27TX_STATE_NOENG V27TX_STATE_CARR V27TX_STATE_ALT V27TX_STATE_NOCARR V27TX_STATE_TURNOFF V27TX_STATE_DATA V27TX_STATE_SCR1 V27TX_STATE_EQCOND V29RX_DEFAULT, %d V29RX_STATE_START V29RX_STATE_IDLE V29RX_STATE_DATA V29RX_STATE_PROTOCOL V29RX_STATE_EPOCH_DET V29TX_DEFAULT, %d V29TX_STATE_START V29TX_STATE_IDLE V29TX_STATE_DATA V29TX_STATE_SCR1 V29TX_STATE_EQCOND V29TX_STATE_ALT V29TX_STATE_QUIET V17: V21 Carrier detected V27: V21 Carrier detected V29: V21 Carrier detected AGC_Freeze AGC_Release AGC %s %s 15:48:18Sep 22 2005Decoder Error = %d Reallocating FPM_FSE buffersFatal error: log10 of zero! Reallocate FPM_MRF bufferReallocate FPM_PPS bufferReallocating FPM_SRE buffersUnknown command - %2x voice command voice dle command: ETX beepgend end, send ok voice delete %lX voice_create 11.8.98 12:41 voice_command # %d VOICE_RESET_DUPLEX_COMMAND VOICE_TIME_MARK_COMMAND %d VOICE_ABORT_COMMAND VOICE_VLS_COMMAND %d call beep gen with: %d %d %d BeepGen: GAIN1*1000 = %d. BeepGen: GAIN2*1000 = %d. %X %X beepgen_create start beep %d %d %d beepgen start dtmf %d %d *** digit ',' => pauseEnd of BEEP Start beep[%02d] Hook on proc busy detected by cadence dial detected by cadence detected %c detected dtmf %c false dtmf detect %d Reinitialization requested: ONOFFInternal Beep %s Identify High energy Sample rate 8000 RX WAIT ABORT ****** Send DLE ETX PCM 8 bit. TX: double dle TX: shel comando dle ** NO enouch data ** beepgend end, send ok DLE %d energy = %d, threshold = %d silence counter %d, level %d too long print string$!$ ????%s DCR: initial DC Evaluation done, DC level %d, %sabled voice: VCE: Unknown command %u voice: VCE: VOICE_CMD_SET_MODE: TX voice: VCE: VOICE_CMD_SET_MODE: RX voice: VCE: VOICE_CMD_SET_MODE: SPEAKER voice: VCE: VOICE_CMD_SET_MODE: COMMAND voice: VCE: VOICE_CMD_BEEP, %d %d %d voice: VCE: VOICE_CMD_DTMF, %d %d voice: STRMVCE Monitor: Unknown message %d voice: STRM_VCE: VOICE_NO_MESSAGE voice: STRM_VCE: VOICE_START_ONLINE_AFTER_ABORT(1) voice: input in RX mode: %d (%d,%d) voice: STRM_VCE:VOICE_START_DUPLEX voice: STRM_VCE:VOICE_START_TX voice: report char: '%c' (%d) voice: STRM_VCE: VOICE_START_ONLINE voice: STRM_VCE:VOICE_START_RX voice: StrmVCE old: *psFarEchoDelay %d ,*psNearEchoDelay %d voice: StrmVCE new: *psFarEchoDelay %d ,*psNearEchoDelay %d fax: fax_class1 will created (ans_org=%d, s7=%d) fax: process: samples count %d != %d fax: process: Unknown status %d fax: FAX_CLASS1_ERROR_NO_CARRIER fax: FAX_CLASS1_OK_NO_CARRIER fax: FAX_CLASS1_OTHER_CARRIER fax: FAX_CLASS1_NO_CARRIER_NO_MESSAGE fax: FAX_CLASS1_ERROR_ON_HOOK RD: RD: freq = %d, duration = %d Reset Soft Ring: Threshold = %d, Fs = %d, MinFreq = %d, MaxFreq =%d minOnDur = %d, minOffDur = %d call: create RC: %d <-> %d... call: IsPulseDialerReady !(%u) (count %d) call: LastPulseDigitDialed... v8: create: caller %d, automode %d, dp id %d. v8: Link established. Idle timer %d. vpcm: create: dp %d, caller %d, frag %d (size %d). vpcm: initial dp V.%d, session type %d. vpcm: VPCM rate limits: %d-%d vpcm: P2 FINISHED: increase delay!! init %d, ext %d, add %d vpcm: Same Line Verification Status vpcm: P2 RESTART: decrease delay!! init %d, ext %d, add %d vpcm: too many bits requested (%d) vpcm: No symbols Requested!!! vpcm: Link: DP is V.%d, rate: rx %d, tx %d v32: V32 config S%d,R%d,T%d,A%d,L%d v32: process: unknown V.32 status: %d. v32: FATAL: rx_len is too big (%d). v32: v32_update connect: tx_rate %d, rx_rate %d v22: FATAL: rx_len is huge (%d). b103: %s config %d,%d,%d,%d,%d %db103: B103 state -> %x (msg: %x) b103: ReturnStatus = BELL_103_LINKED ********** retrainDetector() notchDetectSigCnt = %d energyInp>>NOTCH_IN_OUT_RATIO_SHIFT = %d energyOut = %d VPcmV34Main: minLevel given is %d , minSigLevel set to %d V34 filtdelay set to %d (params initial delay = %d) V34FEC, V34dmadelay set to %d, (ext delay=%d) VPcmV34Main: Max Block Length modified to %d VPcmV34Main: Initiating retrain, requested DP is %d VPcmV34Main: Notifying Sensitive ISP detected... VPcmV34InitiateRetrain: unknown requested mod (%d), keeping same modulation!!! VPcmV34InitiateRetrain: requested mod K56Flex, but params.flex is OFF, keeping same modulation!!! VPcmV34InitiateRetrain: requested mod V.%d, but params.v90 is OFF, keeping same modulation!!! VPcmV34Main: VPcmV34InitiateHangUp called ! VPcmV34Main: Special bypass - sending MOHreq instead of MOHFRR... VPcmV34GetDiagnostics called... ...It is diagnostics of V.34 (or P2)... ...It is diagnostics of V.90 Digital... ...It is diagnostics of V.92 Digital... ...It is diagnostics of V.90 Analog... ...It is diagnostics of V.92 Analog... VPcmV34 Notification: Validate 3-Way Call... VPcmV34 debug validate: mohTimer = %d, setting count2 to %d VPcmV34 Notification: Invalid in samples... VPcmV34 Notification: Valid in samples... VPcmV34 Notification: CAS Detected... VPcmV34SetTxScale: tx scale set to %d VPcmV34Main: Due to final MinTXPR = %d, setting echo: decay start = %d, decay fact = %d, beta = %d VPcmV34Main: Get Minimal power reduction - returning %d (cfg flag set to %d) on get max upstream rate, on regular ISP, returning %d on get max upstream rate, on sensitive ISP, returning %d setINFO0aBits - setting info0 (Caller) for %s setINFO0aBits - setting info0a for %s setINFO0aBits - setting info0d (Digital) for V.PCM setINFO0aBits - setting info0a for V.PCM ...requesting short phase2... ...indicating V.92 capabilities... VPcmV34Main: Echo adapt start reported... VPcmV34Main: Echo adapt middle reported... VPcmV34Main: localV92- %d, remoteV92- %d, localShort- %d, remoteShort- %d, isShort- %d 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x VPcmV34Main: rxinfo1d = 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x VPcmV34Main: upstream selection: local cap - %d, remote cap - %d, requested in info1 - %d, isPCM - %d VPcmV34Main: we got PCM upstream under V.92Lite (after Info1d), retraining to V.34 upstream... VPcmV34Main: rxinfo1a = 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x VPcmV34Main: upstream baud index = %d VPcmV34Main: K56Flex enabled by remote, PCM type: local %d, remote %d (A=1, Mu=0) VPcmV34Main: K56Flex disabled by remote VPcmV34SetMohMessageBits: Building MHcda message... VPcmV34SetMohMessageBits: Building MHfrr message... VPcmV34SetMohMessageBits: Building MHreq message... VPcmV34SetMohMessageBits: Building MHnack message... VPcmV34SetMohMessageBits: Building MHack message... VPcmV34SetMohMessageBits: Building MHclrd message... ========================================================================= MHack message detected ! , Time out period code = %d MHnack message detected (modem may init MOH in the future) ! MHcld message detected ! , disconnect reason is outgoing call MHcld message detected ! , reserved disconnect reason (assume other reason) MHnack message detected (modem may NOT init MOH in the future) ! Illegal MH message detected !!! (rxsq[0] = %X) forcing message type to MH NACK MHcld message detected ! , disconnect reason is incoming call MHcld message detected ! , disconnect reason is other reason V34SetINFO1aBits: Setting INFO1a for K56Flex (Answer-Digital)... VPcmV34Main: It is ===== V90 receiver ==== from Now on V34SetINFO1aBits: Setting INFO1c for K56Flex (Caller-Analog)... VPcmV34Main: V.34 Upstream is selected (info1)... VPcmV34Main: PCM Upstream is selected (info1)... VPcmV34Main: Short phase2 (Hard Coded) !!! V90mp - nonlinearEncoder = %d V90mp - constellationShaping = %d mp->data[0] = 0x%X , mp->data[1] = 0x%X move to SCR on silence rrn (disabling SAS detector on silence) VPcmV34Main: tx buffer backward clear is enabled... Entered v34m->v90Receiver == V90RCV_P3_THIRD_S with tx->symcnt = %d period = %d setV90RateReneg called, rrn type = %d, constel size = %d V34Main: IndicateJdReceived - constel size = %d, silence SCR = %d V34Main: IndicateDilReceived - constel size = %d IndicateTrn2dReceived called, v90Receiver = %d VpcmV34Main: max V34 baud rate index = %d VPcmV34Main: About to setup v34 txmit, baudrate = %d, carrier = %d, preemp = %d K56Flex rate determined, starting MP transmission... VPcmFlo: YES! entrance filter applied = %d On Create: Setting desired TX MD (%d mSec)! VPcmV34Create: quick connect indication from phase1 = %d VPcmV34Create: Uqts index is %d VPcmV34Create: ANSpcm level index is %d VPcmV34Create, initial Session Type = %d VPcmFlo: From Stream - Entrance Filter forced enabled... VPcmFlo: From Stream - Entrance Filter forced disabled... VPcmV34Main: it is K56Flex session type, (AorMu = %d) VPcmFlo: From Stream - Entrance Filter according to HW... VPcmV34Main: Illegal Modem State !!!! VPcmV34Main: waiting for user response for 30sec, initiating retrain ! VPcmV34Main: Line verification period completed !!! VPcmV34Main: Delay ended, indicating reconnect request... VPcmV34Main: BUG BUG, Wrong state & statuses... (v90receiver = %d, cond = %d ; DPstatus = %d, cond = %d) VPcmV34Main: Retrain Detected by Tone detector ! Estimated DC = %d (acc = %d) VPcmV34Main: Reconnect request indicated from phase2 (waiting min time = %d before reconenct request)... VPcmV34Main: Moving to Phase3 Modem V92.. VPcmV34Main: Moving to Phase3 Modem K56Flex.. VPcmV34Main: phase3halfDuplexLength = %d symbols (baud %d) VPcmV34Main: Indicating First P2 COMPLETE... (after %d) VPcmV34Main: Moving to full phase2 upon DP Manager setting... VPcmV34Main: ANSam detected on out going call (later case, after %d smp) ! assuming no 3-way call... VPcmV34Main: Modem On Hold Timeout expired , ending session !!! VPcmV34Main: ANSam detected on hold ! requesting Reconnect... VPcmV34Main: ANSam detected on out going call ! assuming no 3-way call... VPcmV34Main: requestOutputSampleClear (asking %d samples clear) !!! VPcmV34Main: Modem On Hold approved by phase2 (ISP timeout is %d seconds) !! VPcmV34Main: ANSam not detected on out-going, assuming 3-way call supported ! VPcmV34Main: Moving to full phase2 due to false same line verification... VPcmV34Main: Moving to short phase2 due to same line verification... VPcmV34Main: Moving to Phase3 Modem V90.. VPcmV34Main: End Transmission indicated by V.34 / Handshake... VPcmV34Main: Masking CAS detection after %d in train... VPcmV34Main: Wait (before P2 COMPLETE)... VPcmV34Main: Wait (after P2 COMPLETE)... On PHASE2_COMPLETE: added Silence = %d, p2DelayCntr = %d SetNofBitsPhase4 - nof bits each call = %d End of CP #%d tx.... (terminateCp=%d, terminateCpNot=%d) GetV90CpBits: Indicating CP termination !!!! OK Time to move to CPNot TX... VPcmFloModem: setting PCM session to V.%d V90_V34_Main: external reset called. V90_V34_Main: reinitializing parameters. VPcmFloModem (V90): DemodPhase3Error !!! VPcmFloModem (V90): DemodSdNotDetected VPcmFloModem (V90): Phase4 terminated. VPcmFloModem (V90): ON Start TRN1d restoring SAS detector VPcmFloModem (V90): DemodSdDetected VPcmFloModem (V90): restoring SAS detector (RtNot) VPcmFloModem (V90): retrain requested !! VPcmFloModem (V90): Ed Received !!! VPcmFloModem (V90): Building CPt, CPt length = %d VPcmFloModem (V90): Enter Data Phase VPcmFloModem (V90): Building CP, CP length = %d (clr=%d) VPcmFloModem (V90): Rebuilding CP after silence rrn, CP length = %d VPcmFloModem (V90): energy drop detected !! VPcmFloModem (V90): drop to V34 requested !! VPcmFloModem (V90): Train constellation : %d RRN constellation : %d (0 = 4 points / 1 = 16 points) VPcmFloModem (V90): terminate session requested !! VPcmFloModem (V90): on sensitive ISP, after one CPnot supposed to move to E... VPcmFloModem (V90): rate renegotiation requested !! VPcmFloModem (V90): phase3 SCR set to NOT silence, due to RTD %d VPcmFloModem (V90): Indicating Cleardown ! VPcmFloModem (V90): rate renegotiation detected !! VPcmFloModem (V90): Building CPnot on MP receive, CPnot length = %d VPcmFloModem (V90): Building CPnot on MPnot receive, CPnot length = %d VPcmFloModem (V90): Going to terminate CPnot... VPcmFloModem (V92): got V90 Fallback request... VPcmFloModem (V92): Starting echo canceller training... VPcmFloModem (V92): Freezing echo canceller... VPcmFloModem (V92): Jd Detected: trainConstel = %d, rrnConstel =%d P2 REPORT : A_LAW or MU_LAW %d ( 0 = Mu, 1 = A) P2 REPORT : Tx power measurment point = %d ( 0 = digital modem terminal, 1 = codec output) P2 REPORT : Max tx power = %d P2 REPORT : short phase2: local=%d , remote=%d P2 REPORT : V92 capabilities: local=%d , remote=%d , selected=%d VPcmFloModem: enterPhase3: Ja length = %d VPcmFloModem: enterPhase3 called. VPcmFloModem (QC LineVerify): Channel verification status is: %d VPcmFloModem (QC LineVerify): ANSpcm demod over (after %d samples), start TONEq... VPcmFloModem (QC LineVerify): demodulator verification status is %d VPcmFloModem (QC LineVerify): got ANSpcm drop detection, with no verification completion status !!! VPcmFloModem (QC LineVerify): Silence after TONEq over, move to phase2... VPcmFloModem (QC LineVerify): TONEq mod over (after %d samples), tx silence... VPcmFloModem (QC LineVerify): TONEq termination requested, still bellow 50mS (nof samples = %d)... VPCMXF_Create: side is %s, maxDataBuffer - %d VPCMXF_Create: new VPcmFloModem() failed. **************** NEAR ECHO FILTER *************** V92EchoCanceller: echoDelay updated to: %d V92EchoCanceller Destruction V92EchoCanceller: echoBeta = %c%d.%06d V92EchoCanceller: echoBetaDecay = %c%d.%06d V92EchoCanceller: echoFilterLen = %d V92EchoCanceller: constraction V92EchoCanceller: echo state set to filter only V92EchoCanceller: setState ERROR: illegal state V92EchoCanceller: echo state set to count delay before training V92EchoCanceller: echo state set to fast echo training V92EchoCanceller: echo state set to slow echo training V92Modulator: constellation gain (before Lu multiplication) = %c%d.%06d V92Modulator: constellation gain (after Lu multiplication) = %c%d.%06d CPObj->indexConstel[%d] = %d CPObj->modulosEncoderPresent = %d CPObj->prefilterPrecoderPresent = %d CPObj->constellationPresent = %d ======== Constellation LC 1 ============= ======== Constellation LC 2 ============= ======== Constellation LC 3 ============= ======== Constellation LC 4 ============= ======== Constellation LC 5 ============= ======== Constellation LC 6 ============= ================================== V92Modem Destructor: Illegal modemSide V92Modem progress: Illegal modemSide ********************************************************* ******* This is a PRIVATE version ******* ******* for the use of SL DSP group only ******* V92Modem Version Description: Memory cleanups + dil descriptor crash fixV92Modem Reset: Illegal modemSide V92Modem Construction (as %s Modem) V92Modem Constructor: Illegal modemSide V92Modulator: exit TRN1uSecond V92Modulator: Phase4Modulator state initialized to DataToRuModulation V92Modulator: Phase4Modulator state initialized to RuModulation V92Modulator: RRN requested, enter Phase 4 V92Modulator: RRN requested but NOT approved V92Modulator: Phase4Modulator state initialized to DataToRmModulation V92Modulator: Phase4Modulator state initialized to RmModulation V92Modulator: FPE requested, enter Phase 4 V92Modulator: FPE requested but NOT approved V92Modulator:enter Data Phase: V92Modulator: setPhase = %c%d.%05d V92Modulator: setPhase = 0.5 V92Modulator: Queue is Empty/Full !!! V92Modulator progress: Enter phase4 V92Modulator progress: Illegal state V92_PHASE2_INFO_TX_POWER_MEASURE_POINTV92A_MAX_SPECTRAL_SHAPER_LOOKAHEADV92_MAX_NOF_COEFFS_IN_EACH_SECTIONERROR_ENERGY_PRINT_PERIOD_PHASE3ERROR_ENERGY_PRINT_PERIOD_PHASE4SU_DETECTOR_POSITIVE_CORR_THRESHOLDSU_DETECTOR_NEGATIVE_CORR_THRESHOLDSU_DETECTOR_DETECTION_COUNTER_THRESHOLDV92Phase2Info: ShortPhase2: local=%d , remote=%d V92Phase2Info: v92Capabilities: local=%d , remote=%d V92Phase2Info: v90UseHighCarrier = %d V92Phase2Info: L2[%d] = %c%d.%03d V92Phase2Info: maxTxPower [dBm0] = %c%d.%01d V92Phase2Info: txPowerMeasurementPoint = %s V92Phase3Modulator: Illegal state V92Phase3Modulator: TRN1u state length set to %d BUG BUG BUG BUG BUG - V92Phase3Modulator: no Ja Object, DIL descriptor available ! V92Phase4Modulator: enter repeatedCPu @ %d V92Phase4Modulator: enter E1u @ %d V92Phase4Modulator: on recivedSUV enter CPu @ %d V92Phase4Modulator: enter E2u @ %d V92Phase4Modulator: enter E2u First at RRN @ %d V92Phase4Modulator: ERROR: E2u is extended in RRN !!! V92Phase4Modulator: ERROR: Null CP at RRN @ end of TRN2d V92Phase4Modulator: on recivedRt enter SUV @ %d V92Phase4Modulator: ERROR: Null mappingParams @ setMappingParams V92Phase4Modulator: enter Rm @ %d V92Phase4Modulator: enter Ru @ %d V92Phase4Modulator: Illegal state V92Phase4Modulator: ERROR: Null CP @ RRN @ end of TRN2u V92Phase4Modulator: RRN: Terminate TRN2uSecond @ %d V92Phase4Modulator: enter B1u @ %d V92Phase4Modulator: enter FinalSUVu @ %d V92Phase4Modulator: CPu Terminated @ %d V92Phase4Modulator: Phase4 Terminated @ %d V92Phase4Modulator: enter FB1u @ %d V92Phase4Modulator: ERROR: Null CP @ end of TRN2d V92Phase4Modulator: on SUVuToCPuModulation enter CPu @ %d V92Phase4Modulator: ERROR: Null dataPhaseMappingParams @ end of Ed V92Phase4Modulator: RRN: enter TRN2uModulation @ %d V92Phase4Modulator: FPE: enter SUVu @ %d V92Phase4Modulator: on TRN2uRrnSecondExit enter SUV @ %d V92Phase4Modulator: on TRN2uModulationExit enter SUV @ %d V92Phase4Modulator: enter TRN2u Second at RRN @ %d V90Modem Destructor: Illegal modemSide ********************************************************* ******* This is a PRIVATE version ******* ******* for the use of SL DSP group only ******* V90Modem Version Description: Modified Quick Connect without Memory + Train Time + Constel PowerComponents: Floreat, ADI, ACD, New BLL V90Modem Construction (as %s Modem) V90Modem Constructor: Illegal modemSide V90Modem Reset: Illegal modemSide due to probe mode quick connect is masked !!! V90Modem progress: Illegal modemSide V90Modulator: TRN2d spectral parameters: V90Modulator: exit MP due to CP reception V90Modulator: setting delayed MPNot exit due to CPNot reception V90Modulator: exit MPNot due to CPNot reception V90Modulator: exit MP due to CPNot reception V90Modulator: setting delayed MPNot exit due to E reception V90Modulator: exit MPNot due to E reception V90Modulator: Data Phase spectral parameters: V90Modulator: enter Data Phase, Rate = %d [bps] V90Modulator: Phase4Modulator state initialized to DataToRdModulation V90Modulator: Phase4Modulator state initialized to RdModulation V90Modulator: RRN requested, enter Phase 4 V90Modulator: RRN requested but NOT approved V90Modulator: Phase4Modulator state initialized to DataToRfModulation V90Modulator: Phase4Modulator state initialized to RfModulation V90Modulator: FPE requested, enter Phase 4 V90Modulator: FPE requested but NOT approved V90Modulator progress: Illegal state V90Demodulator on sessionTermination: Timing offset NOT saved to registry (isDataState = %d, isEia6 = %d) V90Demodulator on sessionTermination: mean of timing offset History = %c%d.%04d V90Demodulator on sessionTermination: std of timing offset History = %c%d.%04d V90Demodulator on sessionTermination: 1000* std = %d V90Demodulator on sessionTermination: Timing offset saved in Registry! V90Demodulator on sessionTermination: Timing offset NOT saved to registry, EVALUATION DISABLED ! V90Demodulator: enter Phase 4 V90Demodulator: enter Data steady state V90Demodulator: disable linear mapping study. V90Demodulator: mean of timing offset History = %c%d.%04d V90Demodulator: std of timing offset History = %c%d.%04d V90Demodulator: 1000* std = %d V90Demodulator: Timing offset saved in Registry! V90Demodulator: RRN detected: enter Phase 4 V90Demodulator: disable linear mapping study V90Demodulator: FPE detected: enter Phase 4 V90Demodulator: setSessionFlag, flag = %d V90Demodulator: enter Phase 3 V90Demodulator: we got PCM upstream under V.92Lite, retraining to V.34 upstream... V90Demodulator: TRN1d RMS Ratio = %c%d.%08d V90Demodulator: TRN2d spectral parameters: V90Demodulator::exitPhase3() delayedRetrainRequest !!! V90Demodulator: enter Data Phase, Rate = %d [bps] V90Demodulator: reset and enable linear mapping study in data V90Demodulator reset: Baud Offset = %c%d.%03d V90Demodulator reset, quick connect flag = %d V90Demodulator: Enter Channel Verification called ! V90Demodulator: disable linear mapping study in data V90Demodulator: Error Energy = %c%d.%03d V90Demodulator: Timing Offset [ppm] = %c%d.%03d V90Demodulator: !!! ERROR !!! : Spectral Verifier returned illegal value !!! V90Demodulator: Silence rrn not finished on platform other then USB, masking silence rrn... V90Demodulator: On phase4 timeout: Assuming Sensitive ISP - use non-silence & 6dB up & maixmal rate 12000 for next time... V90Demodulator: Phase4 TimeOut V90Demodulator: PreFilter adjusted to: %d V90Demodulator: on silence RRN redesign, prevRate = %d V90Demodulator: one rate down on silence rrn V90Demodulator: about to redesign... current Mean Error = %c%d.%04d, average Mean Error = %c%d.%04d V90Demodulator: RtNot detected. V90Demodulator: Silence RRN is not masked (silence flag = %d) V90Demodulator: freezing timing on silence rrn... V90Demodulator: Jd maxLookAhead = %d V90Demodulator: enabling connectionEvaluator of TRN1d V90Demodulator: Agc Gain = %c%d.%06d V90Demodulator: Request FallBack to V.34 due to line conditions ------------------------------------------------------------- V90Demodulator: REMOTE RETRAIN - Energy Drop detected V90Demodulator: Agc Energy = %c%d.%02d V90Demodulator: Dil max ucode = %d V90Demodulator: Severe Codec conditions were detected NOT on EIA6, initiating drop 2 V34... V90Demodulator: FORCED rate down on silence rrn V90Demodulator: Severe Codec conditions were detected NOT on EIA6, drop is masked, doing nothing... V90Demodulator: Dil study Terminated. Enter error relaxation period. V90Demodulator: disabling connectionEvaluator of Phase3 V90Demodulator: Agc Activated V90Demodulator: Severe Codec conditions were detected due to EIA6 loop type... V90Demodulator: Agc Gain low > Setting DIL overflow protection !!! V90Demodulator: connectionEvaluator of TRN1d is NOT ENABLED due to quick connect... V90Demodulator: Data Phase spectral parameters: V90Demodulator: Constellation design on silence rrn... V90Demodulator: FORCED keep rate on silence rrn --------------------------------------------------------------- V90Demodulator: tearing down connection, probing mode ended... V90Demodulator: keeping rate on silence rrn V90Demodulator: Ed received on Silence RRN... current Mean Error = %c%d.%04d, average Mean Error = %c%d.%04d V90Demodulator: connection design error, initiating retrain V90Demodulator: setAltRbsDetectedOnQC was called !!! V90Demodulator: Agc Gain very low > Setting DIL extreme overflow protection !!! ########################################################################### V90Demodulator: 'Problematic' ISP Modem detected NOT on USB. Masking Silence RRN... V90Demodulator: 'Problematic' ISP Modem detected on USB. Masking drop to V34 (MAX_NOF_V90_RETRAINS = %d)... V90MP: h1 real = %d, imag = %d V90MP: h2 real = %d, imag = %d V90MP: h3 real = %d, imag = %d V90MP: recieved MP with modified good CRC V90MP: recieved MP with bad CRC V90MP: MP detected. Type%d,Rate%d,Trellis%d,NonLin%d,Shaping%d,CPack%d V90MP: MPnot detected. Type%d,Rate%d,Trellis%d,NonLin%d,Shaping%d,CPack%d V90MP: received %d MP, %d MPNot V90Phase3Demodulator: clearVerificationStatus called V90Phase3Demodulator: exit DIL V90Phase3Demodulator: Phase3 Terminated @ %d V90Phase3Demodulator: enter WaitForANSpcmDrop V90Phase3Demodulator: Reset called, sessionFlag = %d ! V90Phase3Demodulator: initial state set to IRREGULAR !!!!! (%d) V90Phase3Demodulator: initial state set to WaitForQTS V90Phase3Demodulator: initial state set to TRN1dKnownData V90Phase3Demodulator: initial state set to WaitForSd V90Phase3Demodulator: enter V92 study reference Ucode state @ %d V90Phase3Demodulator: ANSpcm detected on recovery, move to wait for drop... V90Phase3Demodulator: faking ANSpcm energy drop detected (QTs timeout)... V90Phase3Demodulator: WaitFor QtsNot TimeOut, decision is set to not same line V90Phase3Demodulator: QTS detected @ %d V90Phase3Demodulator: ProbingDILDemod TimeOut V90Phase3Demodulator: enter ANSpcm demod state V90Phase3Demodulator: ANSpcm energy drop detected... V90Phase3Demodulator: V92JdPhase detected @ %d V90Phase3Demodulator: JdPhaseDemod TimeOut V90Phase3Demodulator: TRN1dDemod TimeOut V90Phase3Demodulator: V92Jd detected @ %d V90Phase3Demodulator: V92JdDemod TimeOut V90Phase3Demodulator: JdDemod TimeOut V90Phase3Demodulator: enter TRN1d DD state V90Phase3Demodulator: SdDemod TimeOut V90Phase3Demodulator: Sd detected @ %d V90Phase3Demodulator: DILDemodQCthirdStudy TimeOut V90Phase3Demodulator: DILDemodThirdStudyStage TimeOut V90Phase3Demodulator: DILDemodFirstStudy TimeOut V90Phase3Demodulator: DILDemodQCfirstStudy TimeOut V90Phase3Demodulator: DILDemodSecondStudy TimeOut V90Phase3Demodulator: DILDemodErrorRelaxation TimeOut V90Phase3Demodulator: DILDemodQCsecondStudy TimeOut V90Phase3Demodulator: WaitForSd TimeOut V90Phase3Demodulator: WaitFor Qts TimeOut, decision is set to not same line V90Phase3Demodulator: Probing DIL ended V90Phase3Demodulator: ERROR: Null V92JdDetector V90Phase3Demodulator: enter TRN1d Known Data state V90Phase3Demodulator: waitForJd framePosition = %d V90Phase3Demodulator: SdNot detected @ %d V90Phase3Demodulator: QTSNot detected @ %d V90Phase3Demodulator: enter Wait For V92Jd state @ %d V90Phase3Demodulator: JdNot detected @ %d V90Phase3Demodulator: adjustUinfoToPhaseOffset V90Phase3Demodulator: V92 setting params for short TRN1 V90Phase3Demodulator: changing state to DILDemodQCfirstStudy V90Phase3Demodulator: enter study reference Ucode state @ %d V90Phase3Demodulator: Jd detected @ %d V90Phase3Demodulator: ERROR: Null JdDetector V90Phase3Demodulator: enter Wait For Jd state @ %d V90Phase3Demodulator: setting params for short TRN1 V90Phase4Demodulator: enter WaitForV90CP state @ %d V90Phase4Demodulator: enter WaitForMP state @ %d V90Phase4Demodulator: enter WaitForEd state @ %d V90Phase4Demodulator: Rd detected, polarity = %d V90Phase4Demodulator: Rf detected, polarity = %d V90Phase4Demodulator: enter FPE !V90Phase4Demodulator reset & enable linear mapping study in TRN2. V90Phase4Demodulator: disable linear mapping study V90Phase4Demodulator: RiNot detected @ %d, enter TRN2dKnownData state V90Phase4Demodulator: Ri detected @ %d, polarity = %d V90Phase4Demodulator: RtNot detected @ %d V90Phase4Demodulator: No reset to demapper, current Phase - %d V90Phase4Demodulator: Rt detected @ %d, polarity = %d V90Phase4Demodulator: entering CalcErrorEnergyAfterEchoCancellation state @ %d V90Phase4Demodulator: entering CalcErrorEnergyBeforeEchoCancellation state @ %d V90Phase4Demodulator: RdNot detected @ %d, enter TRN2d DD state V90Phase4Demodulator: Phase4 Terminated @ %d, nof B1d bits = %d, B1d Zeros (after delay) = %d V90Phase4Demodulator: B1d BER = %c%d.%08d V90Phase4Demodulator: MPnot detected on WaitForEd @ %d V90Phase4Demodulator: MP detected @ %d V90Phase4Demodulator: Ed detected @ %d, enter B1d state V90Phase4Demodulator: MPnot detected @ %d V90Phase4Demodulator: entering WaitForRt state @ %d V90Phase4Demodulator: error energy after echo cancellation = %c%d.%04d V90Phase4Demodulator: silence SCR echo energy [dB] = %c%d.%04d V90Phase4Demodulator: entering WaitForEchoCancellation state @ %d V90Phase4Demodulator: error energy before echo cancellation = %c%d.%04d V90Phase4Demodulator: Ed detected @ %d, enter wait for Rt state V90Phase4Demodulator: RfNot detected @ %d, enter WaitForCPu state V90Phase4Demodulator: CP detected @ %d V90Phase4Demodulator: CPnot detected @ %d V90Phase4Demodulator: First Ed at RRN detected @ %d, Silence state V90Phase4Demodulator: trn2dDDLength = %d symbols V90Phase4Demodulator: reset called, quickConnect indication is %d PHASE2_INFO_TX_POWER_MEASURE_POINTV92_MAX_SPECTRAL_SHAPER_LOOKAHEADGERMAN_ISDN_NT1_BOX_FILTER_GAINBLL_TRN1D_FAST_TO_SLOW_DURATIONBLL_TRN1D_INITIAL_TO_FAST_DURATIONEIA6_BLL_TRN1D_FAST_TO_SLOW_DURATIONEIA6_BLL_TRN1D_INITIAL_TO_FAST_DURATIONTIMING_HISTORY_EVALUATION_BUFFER_LENGTHTIMING_HISTORY_EVALUATION_ENABLEDTIMING_HISTORY_EVALUATION_PERIODTIMING_OFFESET_MIN_STD_FOR_SAVELINEAR_EQU_FADE_RIGHT_EDGE_RATIOLINEAR_EQU_FADE_LEFT_EDGE_RATIOLINEAR_EQU_DIL_HIGH_UCODE_BETALINEAR_EQU_DIL_ERROR_RELAX_BETAEIA6_LINEAR_EQU_DIL_MED_UCODE_BETAEIA6_LINEAR_EQU_DIL_HIGH_UCODE_BETAEIA6_LINEAR_EQU_DIL_ERROR_RELAX_BETALINEAR_EQU_ALT_DIL_MED_UCODE_BETAGERMAN_PBX_LINEAR_EQU_DIL_BETAGERMAN_PBX_LINEAR_EQU_DIL_MED_UCODE_BETAGERMAN_PBX_LINEAR_EQU_DIL_HIGH_UCODE_BETALINEAR_EQU_ALT_DIL_HIGH_UCODE_BETALINEAR_EQU_TRN1D_FREEZE_DURATIONLINEAR_EQU_TRN2D_INITIAL_DURATIONEIA6_LINEAR_EQU_TRN2D_INITIAL_BETAEIA6_LINEAR_EQU_FADE_LEFT_EDGE_RATIOEIA6_LINEAR_EQU_FADE_EDGES_CYCLEEIA6_LINEAR_EQU_FADE_RIGHT_EDGE_RATIOGERMAN_PBX_LINEAR_EQU_DATA_BETAGERMAN_ISDN_NT1_LINEAR_EQU_DATA_BETAGERMAN_PBX_DFE_TRN2D_SLOW_BETAGERMAN_PBX_DFE_TRN2D_FAST_BETAERROR_ENERGY_PRINT_PERIOD_PHASE3ERROR_ENERGY_PRINT_PERIOD_PHASE4ERROR_ENERGY_PRINT_PERIOD_DATANOF_DD_SYMBOLS_BEFORE_MEAN_ERROR_DIAG_PHASE3TIMING_OFFSET_PRINT_PERIOD_PHASE3NOF_DD_SYMBOLS_BEFORE_MEAN_ERROR_DIAG_PHASE4TIMING_OFFSET_PRINT_PERIOD_PHASE4TIMING_OFFSET_PRINT_PERIOD_DATASD_DETECTOR_NEGATIVE_CORR_THRESHOLDSD_DETECTOR_POSITIVE_CORR_THRESHOLDSD_DETECTOR_DETECTION_COUNTER_THRESHOLDNO_ENERGY_DURATION_FOR_REMOTE_RETRAINENERGY_DROP_DETECTOR_THRESHOLDSPECTRAL_VERIFIER_PSD_OVERLAP_LENSPECTRAL_VERIFIER_PRINT_SPECTRUMSPECTRAL_VERIFIER_ISDN_LEFT_PEAK_FREQSPECTRAL_VERIFIER_ISDN_NULL_FREQSPECTRAL_VERIFIER_ISDN_RIGHT_PEAK_FREQSPECTRAL_VERIFIER_ISDN_LEFT_PEAK_DELTASPECTRAL_VERIFIER_ISDN_RIGHT_PEAK_DELTASPECTRAL_VERIFIER_GERMAN_PBX_LEFT_PEAK_FREQSPECTRAL_VERIFIER_GERMAN_PBX_NULL_FREQSPECTRAL_VERIFIER_GERMAN_PBX_RIGHT_PEAK_FREQSPECTRAL_VERIFIER_GERMAN_PBX_LEFT_PEAK_DELTASPECTRAL_VERIFIER_GERMAN_PBX_RIGHT_PEAK_DELTASPECTRAL_VERIFIER_SEVERE_CODEC_TEST_FREQ1SPECTRAL_VERIFIER_SEVERE_CODEC_REF_FREQSPECTRAL_VERIFIER_SEVERE_CODEC_TEST_FREQ2SPECTRAL_VERIFIER_SEVERE_CODEC_DELTAMINIMUM_RTD_FOR_NON_SILENCE_SCRENABLE_DIGITAL_POWER_REDUCTIONENABLE_REDUNDANCY_OPTIMIZATIONMASK_RRN_SILENCE_ON_PROBLEMATIC_ISPRRN_SILENCE_WAIT_BEFORE_ECHO_CALCRRN_SILENCE_MIN_ECHO_ENERGY_FOR_KEEP_RATEMIN_RATE_FOR_SILENCE_RRN_KEEP_RATETRN1D_MEAN_ERROR_STD_EVALUATION_ENABLETRN2D_MEAN_ERROR_STD_EVALUATION_ENABLETRN1D_MAX_MEAN_ERROR_STD_IN_PHASE3TRN2D_MAX_MEAN_ERROR_STD_IN_PHASE4TRN2D_MAX_MEAN_ERROR_ENERGY_IN_PHASE4PHASE4_MEAN_ERROR_BEF_TO_AFT_UPDATE_RATIO_THRESHQC_PHASE4_MEAN_ERROR_BEF_TO_AFT_UPDATE_RATIO_THRESHNOF_REMOTE_RATE_RENEG_BEFORE_RETRAINMINIMUM_DURATION_IN_DATA_BEFORE_RRN_UPMINIMUM_DURATION_IN_DATA_BEFORE_RRN_DOWNMAX_NOF_RATES_DIFF_BEFORE_RETRAINMINIMUM_DURATION_IN_DATA_BEFORE_EC_RRNEIA6_PDSNR_THRESHOLD_IN_PHASE3EIA6_PDSNR_THRESHOLD_IN_PHASE4EIA6_TRN1D_ERROR_FOR_V34_FALLBACKENABLE_DROP_2_V34_ON_SEVERE_CODECDEBUG_DIGITAL_MODEM_INITIATE_RRNDEBUG_DIGITAL_MODEM_INITIATE_RRN_TIMELINEAR_EQU_QC_TRN1D_FREEZE_DURATIONQC_LOGGING_PERIOD_STEADY_STATEANSPCM_CORRELATION_THRESH_FOR_VALIDATIONDEBUG_CONNECTION_EVALUATOR_ALTERNATE_DEBUGDEBUG_CONNECTION_EVALUATOR_FALL_BACKDEBUG_CONNECTION_EVALUATOR_RATE_UPDEBUG_CONNECTION_EVALUATOR_RETRAINDEBUG_CONNECTION_EVALUATOR_RATE_DOWNDEBUG_CONNECTION_EVALUATOR_PERIODMAX_TX_RATE_INDEX_FOR_SENSITIVE_ISPSEPARATE_PHASE3_CONSTELLATIONSSEPARATE_PHASE4_CONSTELLATIONSWRITE_TIMING_PHASE_AND_OFFSET_TO_FILESEPARATE_DATA_PHASE_CONSTELLATIONSWRITE_DEMOD_IN_SAMPLES_TO_FILEDEBUG_PRINT_MAPPER_CONSTELLATIONSDEBUG_PRINT_DEMAPPER_CONSTELLATIONSDEBUG_DEMAPPER_ERROR_HISTOGRAMDEMAPPER_DELAY_BEFORE_ERROR_HISTOGRAMDEMAPPER_ERROR_HISTOGRAM_INTEGRATION_TIMEV90Parameters: upStream min rate : %d upStream max rate : %d Rate mask :%x V90Parameters: bad upstream rate, using default values V90Parameters: Debug - tempPR = %d V90Parameters: setting power reduction to = %c%d.%02d V90Parameters: Debug - tempProbe = %d V90Parameters: Debug - tempConnectionType = %d V90Parameters: Debug - trn2d_mean_error_std_evaluation_enable = %d V90Phase2Info: L2[%d] = %c%d.%03d V90Phase2Info: maxTxPower [dBm0] = %c%d.%01d V90Phase2Info: txPowerMeasurementPoint = %s V90Phase3Modulator: Phase3 Terminated @ %d V90Phase3Modulator: Illegal state V90Phase3Modulator: Jd TimeOut V90Phase3Modulator: DIL TimeOut V90Phase3Modulator: ERROR: Null JdBits @ end of TRN1d V90Phase3Modulator: ERROR: Null DIL @ end of JdNOT V90Phase3Modulator: V92JdPhase TimeOut V90Phase3Modulator: V92Jd TimeOut V90Phase3Modulator: ERROR: Null v92JdBits @ end of TRN1d V90Phase4Modulator: enter repeatedCPd @ %d V90Phase4Modulator: enter Ed @ %d V90Phase4Modulator: enter CPd @ %d V90Phase4Modulator: enter Ed first at RRN @ %d V90Phase4Modulator: enter Rt @ %d V90Phase4Modulator: enter RiNot @ %d V90Phase4Modulator: enter MPNot @ %d V90Phase4Modulator: ERROR: Null mappingParams @ setMappingParams V90Phase4Modulator: enter Rf @ %d V90Phase4Modulator: enter Rd @ %d V90Phase4Modulator: Illegal state V90Phase4Modulator: Phase4 Terminated @ %d V90Phase4Modulator: ERROR: Null dataPhaseMappingParams @ end of Ed V90Phase4Modulator: enter RdNot @ %d V90Phase4Modulator: enter TRN2d @ %d V90Phase4Modulator: TRN2d spectral parameters: V90Phase4Modulator: TRN2d D = %d V90Phase4Modulator: enter %s @ %d V90Phase4Modulator: enter TRN2d V90Phase4Modulator: ERROR: Null MP @ end of TRN2d V90Phase4Modulator: enter B1d @ %d V90Phase4Modulator: enter RtNot @ %d V90Phase4Modulator: enter FinalSUVd @ %d V90Phase4Modulator: enter SUVd at RRN @ %d V90Phase4Modulator: enter SUVd @ %d V90Phase4Modulator: CPd Terminated @ %d V90Phase4Modulator: RiNot Terminated V90Phase4Modulator: enter RfNot @ %d V90Phase4Modulator: ERROR: Null CP @ end of TRN2d V90Phase4Modulator: enter Silence @ %d V90BitsToSymbol - error: process called, SIZE_NOT_SET V90BitsToSymbol - error: process called, BUFFER_OVERFLOW V90BitsToSymbol - error: process called, BUFFER_UNDERFLOW =========================================================== V90Demapper: Hard decision input buffers are full !!!!!!!!!!!!! V90Demapper: constelation update !!! V90DilDescriptorSettings: DIL descriptor set to option ADI_QC. V90DilDescriptorSettings: DIL descriptor set to option ADI. V90MappingParams: A1 = %c%d.%06d V90MappingParams: A2 = %c%d.%06d V90MappingParams: B1 = %c%d.%06d V90MappingParams: B2 = %c%d.%06d V90Resampler: state = TRN1_QC_SLOW V90Resampler: state = FROZEN V90Resampler: state = SECOND ORDER FROZEN V90Resampler: state = INITIAL V90Resampler: state = MEDIUM V90Resampler: state = TRN2 INITIAL V90Resampler: state = STEADY_STATE V90Resampler: state = PRE_ANSPCM V90Resampler: state = TRN1_QC_INITIAL V90Resampler: state = TRN1_QC_FAST V90Resampler: state = TRN1_QC_MEDIUM ResamplerTiming::adjustHalfBaudBpfGain baud/2 dft bin = %c%d.%03d ResamplerTiming::adjustHalfBaudBpfGain normFactor = %c%d.%03d ResamplerTiming::adjustHalfBaudBpfGain normBPFhBaudB0coef = %c%d.%03d V90Equalizer: LE Beta = %c%d.%05de-10 V90Equalizer: DFE Beta = %c%d.%05de-7 V90Equalizer: timing offset on freeze (phase4) = %c%d.%04d ======================================================= minLeCoefValue = %c%d.%010d minDfeCoefValue = %c%d.%010d maxDfeCoefValue = %c%d.%06d V90Equalizer: Dfe coefs zeroed!! V90Equalizer: LE & DFE running in FLOAT mode. ============================================================== V90Equalizer: linearEquMmxConversionFactor = %c%d.%05de8 V90Equalizer: linearEquMmxOutputConversionFactor = %c%d.%03d V90Equalizer: linearEquBetaMmx = %d, beta exponent = %d V90Equalizer: float LE coeffs sum = %c%d.%04d V90Equalizer: float LE coeffs abs sum = %c%d.%04d V90Equalizer: short high LE coeffs sum = %d V90Equalizer: short high LE coeffs abs sum = %d V90Equalizer: short high LE coeffs min value = %d V90Equalizer: short high LE coeffs max value = %d V90Equalizer: Max LE History = %d V90Equalizer: Min LE History = %d V90Equalizer: dfeMmxConversionFactor = %c%d.%05de8 V90Equalizer: dfeMmxOutputConversionFactor = %c%d.%03d V90Equalizer: dfeBetaMmx = %d, beta exponent = %d V90Equalizer: float dfe coeffs sum = %c%d.%04d V90Equalizer: float dfe coeffs abs sum = %c%d.%04d V90Equalizer: short high dfe coeffs sum = %d V90Equalizer: short high dfe coeffs abs sum = %d V90Equalizer: short high dfe coeffs min value = %d V90Equalizer: short high dfe coeffs max value = %d V90Equalizer: Max dfe History = %d V90Equalizer: Min dfe History = %d V90Equalizer: LE & DFE running in MMX mode. V90Equalizer: enter Data Phase V90Equalizer: Equalizer restored to FLOAT mode. V90Equalizer: enter FPE state V90Equalizer: Dfe coefs zeroed (GERMAN_PBX) !! V90Equalizer: Dfe & Linear EQU coefs freezed (RRN : EIA6 )!! V90Equalizer: restoring Equalizer to float... V90Equalizer: enter RRN state V90Equalizer: enterChannelVerification #################################################### V90Equalizer: meanErrorEnergy Debug: V90Equalizer: calculated over %d mean errors -------------------------------------------- V90Equalizer: meanErrorEnergy mean = %c%d.%06d V90Equalizer: current meanErrorEnergy = %c%d.%06d V90Equalizer: meanErrorEnergy Std = %c%d.%06d V90Equalizer: meanErrorEnergy Variance = %c%d.%06d V90Equalizer: meanErrorEnergy min value = %c%d.%06d V90Equalizer: meanErrorEnergy max value = %c%d.%06d V90Equalizer: High momentary error, symbol#%d, error = %c%d.%03d, soft Decision = %c%d.%03d V90Equalizer: nof consecutive errors = %d V90Equalizer: High momentary error, symbol#%d, error %d, soft Decision %d V90Equalizer: ph4MeanErrorEnergyBeforeToAfterUpdateRatio = %c%d.%03d V90Equalizer: disable linear mapping study. V90Equalizer: middle of TRN2d (DFE EIA6 CONDITION) V90Equalizer: Freezing equ & dfe on silence between Ed and Rt V90Equalizer: Rtnot on EIA6 DFE SLOW V90Equalizer: DemodDilInFreeze => freeze LE & DFE & timing. V90Equalizer: DemodDilInitialErrorRelaxTerminated => unfreezing LE & DFE and Timing. V90Equalizer: DemodDilInitialErrorRelaxation => freeze LE & DFE V90Equalizer: DemodDilInMedUcodesStageTerminated setting normal dil beta V90Equalizer: DemodDilInMedUcodesStage V90Equalizer: DemodDilHighUcodesStageTerminated setting medium ucode beta V90Equalizer: DfeProtectionOnDil = %d V90Equalizer: DemodDilInHighUcodesStage V90Equalizer: RiNot on EIA6 DFE fast V90Equalizer: middle of TRN2d V90Equalizer: after rrn (EIA6): set fast... V90Equalizer: DemodDilInHighUcodesStage -> freeze timing V90Equalizer: Created - MMX mode is enabled. V90Equalizer: Created - MMX mode is disabled. %1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d V90CPPacker: CLEARDOWN indicated ! V90TRN2Design: max TX index = %d, givin power limit = %d, implying max level =%d V90TRN2Design: ...hence max ucode (after factor) = %d, by params maxUcode = %d -------------------------------------- V90TRN2Design: sqrt(power) = %c%d.%03d V90TRN2Design: index %d, power in dBm0 = %c%d.%01d trn2 constel[%d] : %d %d %d %d %d %d : %d %d %d %d %d %d : %d %d %d %d %d %d Trn2 Design: phase %d, dMin = %d... -------------------------------------- V90TRN2Designer : ADI design report : ------------------------------------------------------------------------------------------------------ V90TRN2Designer::V90TRN2Design() constelation design failed !!! *********** Echo Rrn Mechanism *********** V90ConnectionEvaluator reset called ! V90ConnectionEvaluator UPDATE: curDmin = %d, 10*threshUp = %d, 10*threshDown = %d, 10*threshRetrain = %d V90ConnectionEvaluator: remote rrn indicated. (rrn no %d). V90ConnectionEvaluator: before EC RRN: curDmin = %d, initDmin = %d V90ConnectionEvaluator: error correction mechanism demanded rate down, V90ConnectionEvaluator: initiating retrain (retrain no %d), due to %d rate renegotiations down. V90ConnectionEvaluator: initiating One Rate Down, due to error correction mechanism demand. V90ConnectionEvaluator: initiating Retrain (retrain no %d) due to avePdsnr = %c%d.%02d V90ConnectionEvaluator: Alternate Debug RRN down V90ConnectionEvaluator: Debug fall back to V34 V90ConnectionEvaluator: can't responed to V42 RRN down because currently at min allowed rate. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ V90ConnectionEvaluator: initiating Retrain instead of One Rate Down !! V90ConnectionEvaluator: initiating Retrain (retrain no %d) due to %d remote rate reneg V90ConnectionEvaluator: Initiating RRN Down (external demand) V90ConnectionEvaluator: Debug One Rate Up V90ConnectionEvaluator: Initiating No Restriction RRN (external demand) V90ConnectionEvaluator: initiating fall back to V34 due to %d V90 retrains, avePdsnr = %c%d.%02d V90ConnectionEvaluator: Debug initiating Retrain V90ConnectionEvaluator: Initiating Fast Parameters Exchange called - NOT IMPLEMENTED V90ConnectionEvaluator: initiating fall back to V34 due to %d V90 retrains V90-mod3 Echo_Rrn_State = %d V90ConnectionEvaluator: Alternate Debug Retrain V90ConnectionEvaluator: on Rate Down: curDmin = %d, initDmin = %d V90ConnectionEvaluator: initiating retrain, due to %d rate renegotiations down, avePdsnr = %c%d.%02d V90ConnectionEvaluator: retrain no %d V90ConnectionEvaluator: initiating One Rate Up demand, avePdsnr = %c%d.%02d V90ConnectionEvaluator: Initiating RRN up (external demand) V90ConnectionEvaluator: Debug One Rate Down V90ConnectionEvaluator: initiating One Rate Down demand, avePdsnr = %c%d.%02d V90ConnectionEvaluator: Alternate Debug RRN up V90-mod3 CHANGE echoRrnState = %dV90ConnectionEvaluator (phase3): altRbsDetectedOnQc => initiating Retrain (retrain no %d) V90ConnectionEvaluator (end of TRN1d): initiating fall back to V34 due to large error, avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase3): altRbsDetectedOnQc => initiating fall back to V34 due to %d V90 retrains V90ConnectionEvaluator (phase3): initiating fall back to V34 due to %d V90 retrains, avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase3): initiating fall back to V34 due to large error, avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase3): initiating Retrain (retrain no %d), due to avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase3): initiating fall back to V34 due to large mean error variance, std = %c%d.%04d V90ConnectionEvaluator (phase4): initiating fall back to V34 due to large error, avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase4): initiating Retrain (retrain no %d), due to meanErrBefToAftUpdateRatio = %c%d.%03d V90ConnectionEvaluator (phase4): pdsnrCurrentV34DropThreshPhase4 set to = %c%d.%03d V90ConnectionEvaluator (phase4): initiating Retrain (retrain no %d), due to avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase4): initiating fall back to V34 due to %d V90 retrains, avePdsnr = %c%d.%03d V90ConnectionEvaluator (phase4): initiating fall back to V34 due to %d V90 retrains, meanErrBefToAftUpdateRatio = %c%d.%03d V90ConnectionEvaluator (phase4): Initiating retrain (delayed)... V90ConnectionEvaluator (phase4): initiating fall back to V34 due to %d V90 retrains (last one delayed) V90ConnectionEvaluator (phase4): initiating Retrain (retrain no %d), due to delayed retrain request V90ConnectionEvaluator: initiating fall back to V34 due to %d remote retrains V90ConnectionEvaluator Status Summary: V90ConnectionEvaluator: nofRetrainsSoFar = %d V90ConnectionEvaluator: nofRateRenegSoFar = %d V90ConnectionEvaluator: nofRemoteRetrainsSoFar = %d V90ConnectionEvaluator: rateUpCounter = %d V90ConnectionEvaluator: rateDownCounter = %d V90ConnectionEvaluator: retrainCounter = %d V90ConnectionEvaluator: evaluatorCounter = %d V90ConnectionEvaluator: fadeCounter = %d V90AutoDigitalImpDetector: getAltVarThresh: meanVar = %c%d.%02d V90AutoDigitalImpDetector: getAltVarThresh: factor = %c%d.%02d V90AutoDigitalImpDetector: getAltVarThresh: initial varThresh = %c%d.%02d --------------------------------------------------------------- V90AutoDigitalImpDetector::resetStudyUrefHandler QC report : prevSession uinfo : %d %d %d %d %d %d uniteUrefDistanceThresh = %d neighborUcodeMinDistance=%d neighborUcodeMaxDistance=%d V90AutoDigitalImpDetector::porcessFirstStudy() 2.5*trn1Sigma=%d , sqrDiffThresh=%d V90AutoDigitalImpDetector: suspected rbs patern %d%d%d%d%d%d ------------------------------------------------------------------ ---- AltPhase %d : linearMapping linearMappingAlt ---- V90AutoDigitalImpDetector: unSuspectedPhase = %d linearMapping[%d] : %d %d %d %d %d %d ------------------------------------------------------ ----------------- Linear Mapping report -------------- V90AutoDigitalImpDetector: Trn1 alternate rbs initial patern %d%d%d%d%d%d V90AutoDigitalImpDetector trn1 first update : %d %d %d %d %d %d V90AutoDigitalImpDetector trn1 third update : %d %d %d %d %d %d V90AutoDigitalImpDetector trn1 Alt second update : %d %d %d %d %d %d V90AutoDigitalImpDetector trn1 second update : %d %d %d %d %d %d V90AutoDigitalImpDetector trn1 Alt first update : %d %d %d %d %d %d V90AutoDigitalImpDetector: alternate rbs false detection on phase %d !!! V90AutoDigitalImpDetector second update : trn1Sigma = %d V90AutoDigitalImpDetector first update : trn1Sigma = %d V90AutoDigitalImpDetector trn1 final update : %d %d %d %d %d %d V90AutoDigitalImpDetector trn1 Alt final update : %d %d %d %d %d %d V90AutoDigitalImpDetector: initail AltRbsVarThresh (Trn1) = %d V90AutoDigitalImpDetector: initail var (Trn1): %d %d %d %d %d %d error = %d, gain = %c%d.%02d Final codec identified is MuLaw Final padGain identified is = %c%d.%06d projectionBaseUcode = %d minUcodeForCodecProjection = %d Final codec identified is ALaw ------------------------------------------------------------------------- V90AutoDigitalImpDetector::findPadGain() Report : ------ Final conclusions ------- V90AutoDigitalImpDetector: original varThresh = %c%d.%02d V90AutoDigitalImpDetector: final varThresh = %c%d.%02d -------------------------------------------------------- V90AutoDigitalImpDetector: linearMappingVar report: linearMappingVar[%d][%d] = %d V90AutoDigitalImpDetector: original maxUcode = %d forced minimum maxUcode = %d V90AutoDigitalImpDetector: phase %d maxUcode is %d V90PreFilter: HardwareCodecType: %s V90PreFilter: HardwareCodecType loaded by configuration parameters *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* V90PreFilter: External Hardware Codec Index exceeds table length (codec inx = %d, table length = %d) V90PreFilter: getFilterPointer BUG !!! - unsupported PreFilterCoefType ! V90PreFilter: setParamEIA6 called V90PreFilter: prev params ClockDeviation is = %c%d.%04d V90PreFilter: Setting timing parameters (registry)... V90PreFilter: loop = %s (%d) V90PreFilter: Pre Filter Coeffs Type array %d, (filter length %d) V90PreFilter: Filter Gain = %d V90PreFilter: Using coeff type array according to codec type V90PreFilter: Force coeff type array 3 V90PreFilter: Connection Type is ISDN NT1 BOX (4.2kHz Null) V90PreFilter: Connection Type is PBX ISDN BOX (4kHz Null) V90PreFilter: Force coeff type array 1 V90PreFilter: Force coeff type array 2 V90SpectralVerifier: start data accumulation -------------------------------------------------------- V90SpectralVerifier: Spectrum[%d] = %c%d.%02d V90SpectralVerifier: German ISDN NT1 box: left peak delta = %c%d.%02d V90SpectralVerifier: German ISDN NT1 box: right peak delta = %c%d.%02d V90SpectralVerifier: German PBX: left peak delta = %c%d.%02d V90SpectralVerifier: German PBX: right peak delta = %c%d.%02d V90SpectralVerifier: Severe Codec: ref freq (%d) = %c%d.%02d V90SpectralVerifier: Severe Codec: test freq1 (%d) = %c%d.%02d V90SpectralVerifier: Severe Codec: test freq2 (%d) = %c%d.%02d V90SpectralVerifier: No special conditions V90SpectralVerifier: German ISDN NT1 box conditions detected! V90SpectralVerifier: Severe Codec conditions detected! V90SpectralVerifier: German PBX conditions detected! V90ConstellationDesigner::determineDminForRrn : pParams->m[1..6] = %d %d %d %d %d %d V90ConstellationDesigner:: increment maxM for one rate up V90ConstellationDesigner:: current maxM = %d rrn up maxM = %d V90ConstellationDesigner:: rrnUpDmin = %d V90ConstellationDesigner:: current maxM = %d rrn down maxM = %d V90ConstellationDesigner:: maxM>pParams->m[phase] seting rrnDownDmin arbitrary !!! V90ConstellationDesigner:: rrnDownDmin = %d V90ConstellationDesigner:: maxMm[phase] seting rrnUpDmin arbitrary !!! V90ConstellationDesigner:: rrn down maxM too low - probably will cause more then one rate down V90ConstellationDesigner:: failed to find rrnUpDmin => seting rrnUpDmin = dMin !!! V90ConstellationDesigner:: maxM too high - probably will not cause rate up V90ConstellationDesigner:: rrn down - nofUcodes = %d prevNofUcodes = %d V90ConstellationDesigner:: rrn down - tempDmin = %d prevDmin = %d V90ConstellationDesigner:: rrn up nofUcodes = %d V90ConstellationDesigner:: rrn up tempDmin = %d V90ConstellationDesigner:: increment maxM for one rate down V90ConstellationDesigner:: tempDmin might cause 2 rates up => rrnUpDmin = dMin V90ConstellationDesigner: noiseEnergy = %c%d.%02d V90ConstellationDesigner: dMin Forced to: %d V90ConstellationDesigner: final dMin = %d V90ConstellationDesigner: USE_RESTRICED_DMIN = %d V90ConstellationDesigner: pdSnrThreshForRateUp = %c%d.%02d V90ConstellationDesigner: pdSnrThreshForRateDown = %c%d.%02d V90ConstellationDesigner: pdSnrThreshForRetrain = %c%d.%02d V90ConstellationDesigner: KeepRate => keep dMin and pdsnr thresh ----------------------------------------------------------------------------------------------------------------- V90 Constellation Designer report: constelation size phase[0..5] : %d %d %d %d %d %d ----------- constel phase 0,1,2,3,4,5 codec constel phase 0,1,2,3,4,5 linearMapping of constel -------------- V90ConstellationDesigner: dMinHighRates = %d dMinLowRates = %d V90ConstellationDesigner: current dMin = %d ucode[%d] : %d %d %d %d %d %d : %d %d %d %d %d %d : %d %d %d %d %d %d --------------------------------------------------------------------------------------------------------------------- V90ConstellationDesigner: adjusting dMin for rate>=53k. Orig dMin=%d Modified dMin=%d V90ConstellationDesigner: dMin calc OneRateUp V90ConstellationDesigner: rrnUpDmin = %d V90ConstellationDesigner: dMin calc OneRateDown V90ConstellationDesigner: rrnDownDmin = %d V90ConstellationDesigner: dMin calc NoRestriction V90ConstellationDesigner: pdSnrThreshForRateUp = %d pdSnrThreshForRateDown = %d pdSnrThreshForRetrain = %d V90ConstellationDesigner: requested rate force is %d V90ConstellationDesigner: initial nofUcodeInPhase[1..6] = %d %d %d %d %d %d V90ConstellationDesigner: initial phaseDmin[1..6] = %d %d %d %d %d %d V90ConstellationDesigner: final nofUcodeInPhase[1..6] = %d %d %d %d %d %d V90ConstellationDesigner: final phaseDmin[1..6] = %d %d %d %d %d %d V90ConstellationDesigner: reached max posible ucode -> Not able to reach requested rate !!!V90ConstellationDesigner: set min rate to %d V90ConstellationDesigner: set max rate to %d -------------------------------------- V90ConstellationDesigner: initial sqrt(power) = %c%d.%03d V90ConstellationDesigner: initial index %d, power in dBm0 = %c%d.%01d V90ConstellationDesigner: nof points removed %d, new sqrt(power) = %c%d.%03d V90ConstellationDesigner: final index %d, final power in dBm0 = %c%d.%01d V90ConnectionDesigner: adjustConstellationPower - BUG !!! reached constellation length 0!!! V90ConstellationDesigner::adjustConstellationsPower restoring last removed point V90ConstellationDesigner::adjustConstellationsPower (pParams->d=%d) seting currentRate = %d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! V90ConstellationDesigner: Rate Used Masked By Provider !!!!!!!!!!!!!!!!!! V90ConstellationDesigner: currentRate = %d is smaller then minRate = %d => seting currentRate = %d V92BitsToSymbol - error: process called, SIZE_NOT_SET V92BitsToSymbol - error: process called, BUFFER_OVERFLOW V92BitsToSymbol - error: process called, BUFFER_UNDERFLOW V92CP: recieved CP with bad CRC ## Debug: pParamObj address = %X ## Debug: BitVector address = %X ## Debug: pParamObj->Lsp = %d ## Debug: pParamObj->Ltp = %d #%# Debug: last bit before V.92 info = %d #%# Debug: last bit after V.92 info = %d, temp calculation = %d *** error CP bit , not enouch memory in the buffer *** V90CP: recieved CP with bad CRC V90MP: received %d MP, %d MPNot ================== Pre Filter =============== On V92 Transmitter reset, here are modulation parameters: ================== General ================== ================== Pre Coder ================ V92Precoder: reset 1 (with cfg) called V92Precoder: setCoefficients called V34DATARATE, for tx data rate - %d, PTC - %d, setting nofTxBits to %d V34DATARATE, finally txbitrate %d,rxbitrate %d V34DATARATE, preliminary txbitrate %d,rxbitrate %d FATAL ERROR(initdigital) - ZERODIV expected!--ERROR---, 2400bps is not possible at %d baud rate V34demodulate, agc overflow = 0x%x, V34RENEG, may be renegotiation,equalizer adaptation disabled V34EQU, equerr = %d, preerr = %d, V34RETRAIN, retrain request detected, rtncount = %d V34AGC, abcddetect gain = 0x%x, AGC frozen V34RENEG, RRN request detected,rtncount = %d Signal Energy below Threshold %d, initiate a disconnectionDetected shifted TRN2... assuming 32 symbols Snot S-S1 is detected,rxsymcnt= %d,pllcnt= %d,gain= 0x%x V34NEC, --------ERROR--------- occured in modem_serrint V34FEC - start FEC adaptation updateAlpha%s: updated %d => %d V90NEC, --------ERROR--------- occured in adaptecho V34 bulk delay estimation %d (FAR=%d) V34 bulk delay first estimation %d RTD (%d) lower than min (%d), masking Far EC... ...Modifying dma delay from %d to %d V34SetupDemodulator: baudrate %ld, carrier %ld ==== Near Echo Canceller report ====== ==== Far Echo Canceller report ====== V34PROBESELECT, setfinalrate, txbaudrate = %d,rxbaudrate = %d,txpreemp= %d V34AGC, setup receiver gain = 0x%x V34RNEG, initialize RNEG, tx->txflags= 0x%x,rx->rxflgs= 0x%x v34handshakinit: initiating MOH negotiation V34HSHAKE: rxstate %s=>%s(tx %s, mst %s, [1]%ld, [2]%ld) V34HSHAKE: microstate %s=>%s(tx %s, rx %s, [1]%ld, [2]%ld) V34HSHAKE: txstate %s=>%s(rx %s, mst %s, [1]%ld, [2]%ld) setInitialPhase() : Error - deviding by 0 (polyValue(k2)+polyValue(k)=0) setInitialPhase() : Error - deviding by 0 (samp2+samp1=0) setInitialPhase: Error (i==5) !!!!!!! TimingV34: Timing Offset [ppm] = %d V34PREEMPHASIS, - index is 10, baudrate= %d V34PREEMPHASIS, - index is %d, baudrate= %d V34PREEMPHASIS, - index is 0, baudrate= %d V34PROBE, agc gainestimate due to power reduction request is %d V34PROBE, asking for a power reduction of %d Sensitive RX Power Reduction mechanism disabled! V34PROBE, snr_L1=%d , snr_L2=%d , L2toL1ratio=%d (all not in dB) V34PROBE, dBcnt=%d , powerReductionReq=%d , gain=%d V34PROBE, not asking for power reduction V34PROBE, rx->gain=%d ,(obj->rxinfo0.data[1]&0x80)=%d V34PROBE, min = %d, i= %d, so reducing band edge norm by 2 V34PROBE, min = %d, i= %d, so reducing band edge norm by 1 V34PROBE,0=%d,%d,%d,%d,%d,5=%d,%d,%d,%d,%d,10=%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,20=%d,%d,22=%d,%d,24=%d Sensitive RX Power Reduction mechanism enabled! V34PROBE, agc gainestimate of L1 signal is %d V34TXSCALE, txscale before is %d, reduced txscale is %d dB,final txscale is %d V34TXSCALE, power reduction requested by remote modem is %d dB V34DATA, getting into data mode from Handshake, Tx bit rate - %d, Rx bit Rate - %d V34MP, Starting txmit MP again(%d), rxflgs=0x%x,txflags=0x%x MOH: Timeout waiting for MH sequence under cleardown, terminating connection without acknowledge V34Hshak: Setting up transmitter for phase3... V34PHASE2, RX_PHASE3_CALL ,filtdelay = %d, rxflgs= 0x%x,rx->gain=0x%x V34DATARATE,threshold for data rate %d = %d V34RETRAIN, SILENCERETRAIN finished, rx->rxflgs,=0x%x,rx->gain=0x%x,gainestimate=0x%x V34MP, MP detected, starting MP' txmitV34DATARATE, ethresh data rate = %d,ethreh=%d,rate2 = 0x%x,data=%d V34DATARATE, equerr = %d,preerr=%d V34DATARATE, txmp bits 0x%x,0x%x,0x%x,0x%x,0x%x V34DATARATE, Final choice data rate = %d, retrainThresh = %d, renegDownthresh = %d, renegUpthresh = %d V34DATARATE, automatic: %d, min %d, max %d Moving to TX MD, would take %d symbols , echo start delay is %d... S detected,rxflgs= 0x%x,rxgain=0x%x TX: Done with MD, moving to S/Sbar again... On MD - enabling echo adaptation... V34Hshak: echo start wait time would be: NEC %d symbols, FEC %d symbols... V34Hshak: on JaTXMIT - time to freeze echo... V34Hshak: on K56JaTXMIT - time to freeze echo... V34Hshak: on JTXMIT - time to freeze echo... TRNSEG4A : returning from local rrn down => forcing rate down V34INFO, V.34bis is not possible V34DATARATE, precoefs=0, 0, 0, 0, 0, 0 End of current MOH msg: isterm=%d, count1(%d), pktcount(%d)... MOH: Timeout waiting for MH sequence under MHreq, disconnecting... V34TIMING, detected J, Phase = %x,%x, clk = %x,%x V34RETRAIN, going into retrain in Handshake TRNSEG4A : returning from local rrn up => forcing rate up V34Hshak: On J TX start, would freeze EC after bulk delay (%d samples, bulk=%d) MOH: Timeout waiting for MH sequence under MHreq, initiating retrain DET_SYNC : retrain request detected while searching for info1 V34F MOH: After 192 silence, org = %d , act = %d V34RETRAIN, End of L2,rx->gain=0x%x,count1=%d MOH: MHnack received for MHreq, sending MHcda V34AGC, rx->gain = 0x%x, at the beginning of RX_L1 V34DATARATE, precoefs [%d,%d,%d][%d,%d,%d] V34RETRAIN, waiting for tone A at the end of RX_L2 %s 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x V34RETRAIN, %s, rx->rxflgs = 0x%x,rx->gain=0x%x V34RETRAIN, retrain is initiated in RX_PHASE2_CALL V34INFO, info0 CRC not received properly in DET_INFO V34Hshak: on J1TXMIT - forced freeze echo (count2 = %d)... MOH: Illegal MH sequence under MHreq, initiating retrain Repeated info0 is detected, errorrecovery is initialized in TX_PHASE2_xxx Setting Bulk delay according to prev session - %d RX MDLENGTH, getting into waiting state for MD = %d errorrecovery for info0 is initialized in RX_PHASE1_CALL V34Handshake: Detected signal drop on FRR request, time to move to phase1... V34INFO, info0 received in DET_SYNC V34Handshake: Detected signal drop on FRR request (after NACK), time to move to phase1... Tone AB detected ending errorrecovery. Switch to TX_PHASE1_ANS. Tone AB detected ending errorrecovery. Switch to RX_PHASE1_CALL. DET_SYNC not detected, during search for info1c initiating a retrain V34PHASE2,detected INFOMARKS, reinitializing Info1c DET_SYNC not detected, during search for info1a V34RETRAIN, RX_PHASE1_CALL received, count2=%d,rx->gain=0x%x,filtdelay=%d Repeated info0 is detected, errorrecovery is initialized in TX_PHASE1_CALL Repeated info0 is detected, errorrecovery is initialized in RX_PHASE2_ANS V34INFO,%s info0 received in DET_INFO Received MOH message ! (count2=%d, data0=%X, data1=%X) V34PROBESELECT, in ANSWER, txbaudrate = %d,rxbaudrate = %d, Repeated info0 is initialized on retrain V34HSHAK: Illegal prev session baud (2743), select 2800 instead... Agc gain estimate at the end of phase 3 is %d Repeated info0 is detected, errorrecovery is initialized in TX_PHASE1_ANS V34MP -MP sequence,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x V34MP -MP1 sequence,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x V34 In Retrain. errorrecovery for info0 is initialized in TX_PHASE1_CALL V34AGC, rx->gain =0x%x,rx->slowcf=%d, at end of bulkdelay estimation DET_SYNC not detected, but Tone is detected during info1 MOH: MHnack received for MHreq, sending MHfrr MOH: Timeout waiting for MH sequence under MHfrr, disconnecting... MOH: Timeout waiting for MH sequence under MHfrr, initiating retrain V34 In Retrain. errorrecovery for info0 is initialized in RX_PHASE2_CALL On RX_PHASE1_ANS: is short=%d, bulkDelay=%d, filtDelay=%d errorrecovery is initialized in DET_SYNC Repeated info0 is detected, errorrecovery is initialized in RX_PHASE1_ANS info0 is detected, info0 is initialized in TX_PHASE1_ANS DET_SYNC is received in RX_DPSK,rx->gain=0x%x V34MP- E received before MP', rxflgs = 0x%x V34MP - E sequence detected,rxflgs= 0x%x V34AGC, -- ERROR-- gainestimate in RX_L1,0x%x RX MDLENGTH over, it was %d bauds,rxflgs = 0x%x,pllcnt = %d,rxgain=0x%x Repeated info0 is detected (after 1200), errorrecovery is initialized in TX_PHASE1_ANS V34RETRAIN, retrain is initiated in DET_AB Repeated info0 is detected, errorrecovery is initialized in RX_PHASE2_CALL V34RNEG, rate renegotiation DOWN initiated due to large error V34RNEG, rate renegotiation detected V34RNEG, rate renegotiation UP initiated due to small error V34FLO: Echo running in Original Integer... ?======= Nothing to report ========= ?======= Coefficients[1..%ld]========= V34SetupModulator: baudrate %ld, carrier %ld, preemp %ld, V90=%ld. fullReset=%1d V34SetupModulator: invalid baudrate %ld V34SetupModulator: invalid carrier %ld V8_ANS_TIME_OUT_WAITING_FOR_CMV8_ANS_TIME_OUT_WAITING_FOR_CJV8_ORG_ANSAM_DETECTED_WAITING_TEV8_ORG_TIME_OUT_WAITING_FOR_ANSAMV8_ORG_TIME_OUT_WAITING_FOR_JMV8_ORG_TIME_OUT_WAITING_FOR_QCA1d Call Functions - raw CF specified: cf[0]=%d , cf[1]=%d , cf[2]=%d , cf[3]=%d timeouts - signal detect %d sec, message detect %d sec ############################################################ V8: Create called, V8 version 23/09/03 . Modulations - V90=%d, V34=%d, V34HD=%d, V32=%d, V22=%d, V17=%d, V29=%d, V27=%d, V23=%d, V21=%d Protocol - raw Protocol specified: prot[0]=%d , prot[1]=%d , prot[2]=%d , prot[3]=%d Call Functions - Data=%d, CallRxFax=%d, CallTxFax=%d, V.80=%d V8: V8SetMessage called, message type is %s V8: Try to set message with size larger than maximal (max=%d, externalLength=%d) V8: Try to set message with illegal V.8 message type V8: Try to set message with 0 length V8: V8Control called - control type is %s V8: V8Control called with currently not supported control type (type=%d) V8: State changed from %s to %s V8Report: v90:%d, v34:%d, v34hd:%d, V32:%d, V22:%d, V17:%d, V29:%d, V27:%d, V23:%d, V21:%d V8Report: Finished with Quick Connect V8Report: since no call function match, not indicating any modulation capability... V8Report: remote V90: mod - %d, digital connection - %d, pcmIndication - %d V8Report: Didn't get matching call function V8: Due to overflow, looking for ANSam again... V8: Initial %s message length is %d octets V8: BUG - raw Call Function selected without valid data !!! V8: BUG - raw Protocol selected without valid data !!! V8: BUG - no Call Function selected in bit fields - use data as default !!! V8: on ANSWER: remote call function is: %X V8: Final JM message length is %d octets V8: on ANSWER: remote V90: mod - %d, digital connection - %d, pcmIndication - %d , local - %d V8: NO Call Function Match !!! zeroing all modulation capabilities... V8: on ANSWER: rebuilding JM with V90 capabilities... V8: Got Call Function Match (in call function range) !!! V8: call function FAX TX from caller indication... V8: call function FAX RX to caller indication... V8: call function DATA indication... V8: Got Protocol Match (in protocol range) !!! V8: Got Default Protocol Match (LAPM) !!! (not indicating modulation capabilities)!!V8: %s Call Function Match%s! V8: on CALLER: remote call function is: %X V8: Timeout waiting for %s message... V8: Time Out Waiting For CM... V8: QCA1d: LAPM Indication: bit23 = %d, bit53 = %d V8: Time Out Waiting For ANSam... V8: QCA1d: Got Good QCA1d !!!! V8: QCA1d: ANSpcm level index: bits27-28 = %d, bits57-58 = %d V8: reseting QCA1 detector... V8: QCA1a: Got Good QCA1a !!!! V8: QCA1a: U_QTS: bits24,26-28 = %d%d%d%d, bits54,56-58 = %d%d%d%d ANSAM phase reversals detected delay = %d CALLPROG_END_DIALING_PARTIALLYcadence_delete with CADENCE_OBJ is invoked cadence_delete with CADENCE_DIAL_OBJ is invoked tone detected by cadence dial CALLPROG: Dialing string partially ended. CALLPROG: Dialing string error. CALLPROG: ^ encountered. Disabling Calling-Tone. no answer detected by cadence CALLPROG: Wait dial tone, reset the cadence CALLPROG: 5 sec. silence was detected. DIALER_ERROR_MSG encountered in Callprog_progress. CALLPROG: ^ encountered. Enabling Calling-Tone. sreg function is not defined! BlindCall: GetBlindDialPause = %d . Set state to CALLPROG_DIALING_STATE AnalyzeDialString: LAST_DIALABLE_SYMBOL is %d AnalyzeDialString: Updated 17 May 1999 00:50 Dialer.c: GetNextDigit... Switching to Pulse Dialer.c: GetNextDigit... Switching to Tone Dialer.c: GetNextDigit... TONE_OR_PULSE_FLAG became TONE_DIALING Dialer.c: GetNextDigit... TONE_OR_PULSE_FLAG became PULSE_DIALING Dialer.c: GetNextDigit... Not permitted to switch to Tone Dialer.c: GetNextDigit... Not permitted to switch to Pulse DIALER.C: IsDialStringInvalid(char * dialString ) got: %s Done Generating silence between digits DIALER_WAIT_FOR_DIALTONE_STATE DIALER_WAIT_FOR_BONGTONE_STATE DIALER_WAIT_FOR_SILENCE_STATE Consequitive-Commas Dialing; Number of samples is %d. =========> End dialing Flash. =========> Begin Dialing FLASH. =========> Waiting to PULSE_IS_DIALER_READY_PROC to become true. =========> Calling PULSE_DIAL_DIGIT_PROC with %d. =========>END OF DIAL DIGIT DETECTED. **** Dialer.C: LastPulseDigitDialed was called Configuration->tone_DigitLength %d Configuration->pulse_OffHookTime %d Configuration->pulse_OnHookTime %d Configuration->dialPauseTime %d Configuration->pulse_BetweenDigitsInterval %d Configuration->tone_BetweenDigitsInterval %d Configuration->digitPattern %d Configuration->commaPauseDurLimit %d Configuration->callingToneFlag %d Configuration->pulseAndToneInSameStringPermittedFlag %d Configuration->ABCD_PermittedFlag %d Configuration->dialModifierValidationFlag %d Configuration->toneOrPulseFlag %d INTEGRATION_TIME = %d Buffers. CADENCE %s: CONDITION B SATISFIED CADENCE SERIRES COMPARISON ========================> CADENCE %s: CONDITION C SATISFIED CADENCE %s: CONDITION -- SERIES --- SATISFIED MAX_ON_TIME %d Buffers MIN_ON_TIME %d Buffers MAX_OFF_TIME %d Buffers MIN_OFF_TIME %d Buffers OFF_TIME_THAT_RESETS_CYCLE %d Detection Thresholds: levle_fix=%d,--> LEVEL_THRESHOLD=%d Cadence: Busy Tone loose detection is %d Detected remote loop #2 request...Timeout : Looking for answer tone. Timeout : Waiting for drop in carrier. Timeout : Detecting phase reversal. Timeout : Detecting rate sequence. Timeout : Waiting for reappearance of S sequence. V32FP Config: protocol=%d,tx_rate=%d,rx_rate=%d,timeout=%d,energy_drop_time=%d,tx_scale=%d,options=0x%x,trellis=%d V32_MSG_NO_CARRIER won't be reported (carrier_loss_time %d of %d ms) Patch: set ctl_ptr->vxx_ctl.options.retrain = TRUE V32STC - SNR drop observed, SNR = %d < threshold = %d %d coseq SNR drops detected local retrain is initiated V23ModemMain: modem state moved from %d to %d V23FP Rx Created, version 10-December-02. v23 tone detected, counter = %d,threshold = 2 V23 backward channel: Tone detected 390[Hz] V23Debug: Timeout waiting for V23 signal... Detected remote loop #2 request...Timeout in ORIGINATE: Looking for answer tone. Timeout in ORIGINATE: Detecting end of tone. Timeout in ORIGINATE: Detecting unscrambled 1s Timeout in ORIGINATE: Determining data rate. Timeout in ANSWER: Determining data rate. Timeout in LOCAL LOOP: Determining data rate. Timeout detecting scrambled ones @ 2400 bps. Timeout detecting scrambled ones @ 1200 bps. Signal quality < Retrain level. Retrain initiated.V22_MSG_NO_CARRIER won't be reported (carrier_loss_time %d of %d ms) V.22: Retrain request detected.Carrier back during carrier_loss_time (v22_data). Retrain initiated.V22_MSG_NO_CARRIER won't be reported (carrier_loss_time %d of %d ms)Carrier back during carrier_loss_time (Connect_2400). Retrain initiated.V22_MSG_CONNECT_2400 In NODE_2400D V22_MSG_CONNECT_2400 In NODE_2400C V22_answer,NODE_SILENCE_AFTER_2100 Bell103 unknown internal state!Bell103 internal error detected! DTMF demodulator Failed after CID_MESSAGE state DTMF Failed , not enough numbers detected DTMF Cid Creating Fs = %d Threshold = %d ! FSK CID Setting Fs = %d Threshold = %d ! FAX_CLASS1_NO_CARRIER_NO_MESSAGET30_SILENCE_BEFORE_PREAMBLE_STATESEND_HDLC_BETWEEN_BUFFER_STATEHDLC_RECEIVE_LOOK_CARRIER_STATEHDLC_RECEIVE_BETWEEN_BUFFERS_STATEEnergy %d < silence treshold... Fax Class1 Create - Fixed-Point Version %s %s Internal memory allocation error! At %2d.%02d[sec], FAX_CLASS1_STATE: %s ===> %s At %2d.%02d[sec] New STATUS message: %s At %2d.%02d[sec] Input Buffer: Initializing VMI_V17_RX Modem No ECM (Simple Packing) Initializing VMI_V29_RX Modem No ECM (Simple Packing) Initializing VMI_V27_RX Modem No ECM (Simple Packing) %2d.%02d[sec] Initializing RX modem receiver, MODEM_IDX=%d Short train in V.17 mode is selected %2d.%02d[sec] New RX Modem... Deleting previous existing one Initializing VMI_V17_TX Modem No ECM (Simple Packing) Initializing VMI_V29_TX Modem No ECM (Simple Packing) Initializing VMI_V27_TX Modem No ECM (Simple Packing) Short train in V.17 mode is selected %2d.%02d[sec] Initializing TX modem, MODEM_IDX = %d, silence %d ms %2d.%02d[sec] New TX Modem... Deleting previous existing one HDLC Transmitted Frame (Length = %d, iR = %d, iW = %d): Replacing the second byte ... DIS - Digital Identification SignalCSI - Called Subscriber IdentificationCTR - Response for Continue To CorrectERR - Response for End of RetransmissionTSI - Transmitting Subscriber IdentificationPRI_EOM - Procedure Interrupt-End Of MessagePRI_MPS - Procedure Interrupt-MultiPage SignalPRI_EOP - Procedure Interrupt-End Of ProcedureERROR: Loss Carrier In V.17 Rx ProtocolV.17 Rx Idle (End of Transmition)CONNECT: V.17 Receive 14400 bpsCONNECT: V.17 Receive 12000 bpsCONNECT: V.17 Receive 9600 bpsCONNECT: V.17 Receive 7200 bps******************Index fault %d, changed to 0 CONNECT: V.17 Transmit 14400 bpsCONNECT: V.17 Transmit 12000 bpsCONNECT: V.17 Transmit 9600 bpsCONNECT: V.17 Transmit 7200 bpsERROR: Transmit Input Queue Under-runERROR: Transmit Input Queue Over-runV.21 Rx Wait for Valid Data ProtocolERROR: Loss Carrier In V.21 Rx ProtocolV.21 Rx Idle (End of Transmition)ERROR: Transmit Input Queue Under-runERROR: Transmit Input Queue Over-runCONNECT: V.21 Transmit 300 bpsERROR: Loss Carrier In V.27 Rx ProtocolV.27 Rx Idle (End of Transmition)CONNECT: V.27 Receive 2400 bpsCONNECT: V.27 Receive 4800 bpsV.27ter Protocal Transmit ModeCONNECT: V.27ter Transmit 4800 bpsCONNECT: V.27ter Transmit 2400 bpsERROR: V.27ter Tx Internal ErrorERROR: Transmit Input Queue Under-runERROR: Transmit Input Queue Over-runERROR: Loss Carrier In V.29 Rx ProtocolV.29 Rx Idle (End of Transmition)CONNECT: V.29 Receive 9600 bpsCONNECT: V.29 Receive 7200 bpsCONNECT: V.29 Transmit 9600 bpsCONNECT: V.29 Transmit 7600 bpsERROR: Transmit Input Queue Under-runERROR: Transmit Input Queue Over-runTxDatCnt !=0 in _rx_look_carrier_state... abort to command mode At %2d.%02d[sec] Data RX connect in _rx_look_carrier_state At %2d.%02d[sec] HDLC frame detected during look for DATA carrier !!! S7 time elapsed in look carrier At %2d.%02d[sec] No carrier in _rx_data_state, move to idle TxDatCnt !=0 in _rx_data_state... abort to command mode Fifo is full in _tx_nulls_state At %2d.%02d[sec] Back to TX_DATA_STATE in _tx_nulls_state CURRENT_STATE_TIMER > FIVE_SECONDS in _tx_nulls_state class1 object fifo under run in _tx_nulls_state !!! class1 object fifo under run in _tx_scrambled_ones_state !!! At %2d.%02d[sec] ENABLE_TRANSMIT in _tx_scrambled_ones_state At %2d.%02d[sec] Fifo is full in _tx_scrambled_ones_state At %2d.%02d[sec] Fifo is full in _tx_data_state(%d=>%d>%d) At %2d.%02d[sec] Queue is full in _tx_data_state At %2d.%02d[sec] fifo underrun in _tx_data_state, count %d < %d At %2d.%02d[sec] Queue underrun, Stop TX At %2d.%02d[sec] Queue underrun, Continue NULLS Tx silence before scrambled ones ... At %2d.%02d[sec] HDLCrx_init_from_idle At %2d.%02d[sec] hdlc_receive_state_init %2d.%02d[sec] TxDatCnt>0 in _hdlc_receive_state... abort command mode At %2d.%02d[sec] No carrier in HDLC receive state %2d.%02d[sec] Receive buffer OK in _hdlc_receive_state %2d.%02d[sec] Receive buffer with error in _hdlc_receive_state SuperFrame full, skipping HDLC frame! %2d.%02d[sec] Missing HDLC frame of %d during command mode(%d already in)! %2d.%02d[sec] No carrier during command mode, NO MESSAGE**** %2d.%02d[sec] TxDatCnt>0 in _hdlc_receive_between_buffers_state abort command mode. Gain Attenuation Reuqest: +%d[dB], avg_rms = %dAt %2d.%02d[sec] Carrier Detected in _hdlc_receive_look_carrier_state At %2d.%02d[sec] TxDatCnt>0 in _hdlc_receive_look_carrier_state abort command mode. At %2d.%02d[sec], curent_timeout = %d, No carrier in _hdlc_receive_look_carrier_state, S7 = %d[sec] %2d.%02d[sec] Receive buffer OK in _hdlc_emulate_receive_state %2d.%02d[sec] End of HDLC buffer transmission %2d.%02d[sec], Elapsed 50MS second, send preamble %2d.%02d[sec] Collect data with %d bytes. At %2d.%02d[sec] Elapsed 1 second, send %d buffers At %2d.%02d[sec] Elapsed 5 second in _t30_preabmle_state At %2d.%02d[sec], CURRENT_STATE_TIMER > 5[sec] %2d.%02d[sec] End of off state, COUNTER %d Decision error is small back to DATA mode !!! Decision error is small back to DATA mode !!! Decision error is small back to DATA mode !!! ERROR: SRE buffer violation!(%d)V17 Decoder error too big... no carrier sudden energy drop > 8[dB], no carrierV17 Dec error too big... unreliable data ERROR: SRE buffer violation(%d)sudden energy drop > 8[dB], no carrierV27 Decoder error too big... no carrier V27 Dec error too big... unreliable data ERROR: SRE buffer violation(%d)sudden energy drop > 8[dB], no carrierV29 Decoder error too big... no carrier V29 Dec error too big... unreliable data Fatal error: Division by zero! Fatal error: Division by zero! TimingVxx: Timing Offset [ppm] = %d modem not in online or duplex VOICE_OUTPUT_TRANSMIT_LEVEL_COMMAND %d VOICE_PLAYBACK_VOLUME_COMMAND %d BeepGen: Additional Attenuation to Beepgen Voice = %d. start !!!!!!!!!!!!!!!!!!!!!!!! could not allocate DTMF channel ver 120 sRxSamplesDelay %d ,sTxSamplesDelay %d Delayed FDSP_Kernel_InitObj invocation due to saturation. rx buffer greater than internal VOICE TX: not enough data to tx Mb?333333?333333#@333333?.! ?333333?.A-DT!@-DT!@q= ףp?HzG?-DT!@zG?-DT!)@{Gz?-DT! @@@.A:0yE>.A.A-DT!@q= ףp?HzG?UUUUUU??333333?@@Y@?Y@.AY@}:-DT!@-DT!@q= ףp?HzG?-DT!@zG?-DT!)@{Gz?Y@~#uH?G?-DT!@?-DT! @?Dl?I?-C6?Gz?{Gz?seI?Q?-DT! @.DT!@ffffff??{GzT?.DT!@m0_d@-DT! @zF=?*>@F@=?=? A A>8 ApBPG@F@F@">A??333?>?333?>?$tI$tI$tI$tI$tI1CGGG7D6$tIzE88PG?UUU??UUU??UUU?? AzD?*>?*>?@FzD@FzD*>?*>? A L*>?.zD?$tIBzC*>?@FzD;F GhGF;F GhG L@F A L@F AeJ,,-?B AzDFF?>?v~?????7575757575$tIu?o9o:?H@@#=a ;PPGK@KPGI@@FPN7K@PG@FIPFzDC??A?@75@75C??Y?zD A A33@\??BzD@FzD*>A?EzEHBr-EVUEB?????? @>??F@?? L$tI?B,@?L?Y??L=BCPG?o:@FP?B???B A??@75@@*>B?@?@*>B?L?>\???ff??33s?fff?@ffA@PU@BjA@A@Bff>̴???@?@>= AL=fff?@_p0@75zD A@75_p0PGzD A@75=?=A??KhS`FzDzF-;n;*>{@z4@u?{?q=J?o8F@Go:o8F?F<F><B`FC AHDN@?Sp+-.@57p7|:=@>&`EG0LPMOPTUGPZeq.0Ŝ?_lj@]*0Ŝ??qdr"?@oQC:Bꈪ?O#>CㇻHCㇻX>CㇻXCㇻH>O#O'Rsc?ͽI_?$܋!?$ 5?kC?i'?53h礙?6C?²'?ˉPo?O>s?JXD?C??C]Ft1!|@Q+ sYw<,@<6L)vѬ,@)X UK@ϋ, ;??+=?ѷWŠ@9G@K[A-@-(s @;6:3@N@kO+@.x@yr@d?9* ? ҿ?d;?c.&?B>X@q= >Y.> hb> ;?5?z61+??Ah@>5>>x<+G9D}*⩺Am2񔡻eGrT0cۢA1WJ`qx|p?x|q`WJA1ۢ0cTrGe񔡻Am2⩺}*D+G9|||||||?| @ONMLKJIHGFEDCBA@?=;97531/-+)'%#!   "$&(*,.02468:<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstdZPONMLKJIHGFONMLKJIHGFEDCBA@?=;97531/-+)'%#!   "$&(*,.02468:<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstdZPONMLKJIHGF''''''  NNNNNNNNNNNNNNx>==<<;;::99??>>==<9 % @ f 6@m)@|Oil` wm(@9]17@n@@Vp&ܛ*|nqbW9N9lE? 7P:ˠZ:ǺZt: ;Л i;(<&x =.꽀`?.x =&(<\>;߻D;eS8<9纞B;k;`;h>G ޛ?h>G >S<;z>;N,GH94x98ɰ <m<Բ<寽->w%?w->寽Բ<<mɰ <84x9섗9K?aG)<ͭ~=U2U?UT>ֽlB<~=<ͭG)q)?q&>A=Sc<lKY?&>K4N7=F<󼵥<5ӽ@9):޻.<U<-W=TSh>r2Ox?r2h>TS-W=U<.<޻):I.:Oz=$v>4-E?4->$v>z==j=x׾>#U?"@">#U?x׾j=X>=Pp+*=Hmb\:1:rMXB=aY=[={ls?Ͽ4!@Ͽls?{[=Y=aXB=rM1::yYy]=^JJw=\>r x?ƿm.@ƿx?r \>Jw=^Jy]=yY:I:{=fN׽裌=i">Ý?v7>@v7῜Ý?i">裌=fN׽{=I:A;;U==m8>g5-'?+#O@+-'?g5m8>==;UA;l;׼ 2= C="Q>M&?T?b@T&?M"Q>C= 2=׼l;%$;n}=q=l> h@?9$Yw@9$@? hl>q=}=n%$;Q:;C =g1[ =>eȃ_%@X9J@X9_%@eȃ>[ =g1=C Q:;2R;FE=m>z@Qz@Qz@򔿘m>`!>bn>>3 &@"m@"m &@3>n>b>y0m;&;%Gߨ>c'> >-Ͻs;@̅ᵵ@̅s;@-Ͻ >'>cߨ>%G&;4J;``(>?r<>>g ֿdS@X@XdS@g ֿ>r<>?(>``4J;Q;}8>>6eT>NF>@An@mI@An@@NF>eT>68>>}Q;i;OIV>%NDo>& ?3@\@3@& ?NDo>%IV>Oi;? 7P:ˠZ:ǺZt: ;Л i;(<&x =.꽀`?.x =&(<\>;߻D;eS8<9纞B;k;`;h>G ޛ?h>G >S<;z>;N,GH94x98ɰ <m<Բ<寽->w%?w->寽Բ<<mɰ <84x9섗9K?aG)<ͭ~=U2U?UT>ֽlB<~=<ͭG)q)?q&>A=Sc<lKY?&>K4N7=F<󼵥<5ӽ@9):޻.<U<-W=TSh>r2Ox?r2h>TS-W=U<.<޻):I.:Oz=$v>4-E?4->$v>z==j=x׾>#U?"@">#U?x׾j=X>=Pp+*=Hmb\:1:rMXB=aY=[={ls?Ͽ4!@Ͽls?{[=Y=aXB=rM1::yYy]=^JJw=\>r x?ƿm.@ƿx?r \>Jw=^Jy]=yY:I:{=fN׽裌=i">Ý?v7>@v7῜Ý?i">裌=fN׽{=I:A;;U==m8>g5-'?+#O@+-'?g5m8>==;UA;l;׼ 2= C="Q>M&?T?b@T&?M"Q>C= 2=׼l;%$;n}=q=l> h@?9$Yw@9$@? hl>q=}=n%$;Q:;C =g1[ =>eȃ_%@X9J@X9_%@eȃ>[ =g1=C Q:;2R;FE=m>z@Qz@Qz@򔿘m>`!>bn>>3 &@"m@"m &@3>n>b>y0m;&;%Gߨ>c'> >-Ͻs;@̅ᵵ@̅s;@-Ͻ >'>cߨ>%G&;4J;``(>?r<>>g ֿdS@X@XdS@g ֿ>r<>?(>``4J;Q;}8>>6eT>NF>@An@mI@An@@NF>eT>68>>}Q;i;OIV>%NDo>& ?3@\@3@& ?NDo>%IV>Oi;$Y7 ;;jSGtO=St$M=Krh$>Sl>C=b?0>@0=b?CSl>h$>rJs>lK<$M=St=GtOjS; ;7$YUjv_M;BĻ\ <okO3=h=g<-">+%>\U>Ӈ^@?#O@@?Ӈ^\U>%>+">-g-'>T>W|L?4?b@4L?W|T>-'> >c}#YQ<=O\TK=뇻ysȾ=>ׄ>䎿sf?'Yw@'sf?䎿ׄ>=>ysȾEg>$)9˹<=(Gf=FK陻l1V>b,>a4@=J@=4@ab,>V>>}yQO?<~;=΍ɽJB=#!I<%c;|{׹wN `ʹE-Z;f!6c<Ļm~9=ZE=0)R'Ѯr>> @Vz@V @>Ѯr>R'E>l0)>uUοǁ5@5_r@5_rǁ5@uUο>> ?Ů<"=9B=pڼC޻KX ?连L@ᵵ@L@X ?>P# ?ږU<=&=NhƐ<M;s0k}.ys;g=D<;m T 1=İ#p >=m"?+8a>?If@?8@?8f@I?a>+8"?m=p >İ#1=T ;m =Du=񽿾|7?hO>2?+@LѭmI@Lѭ+@2?>hO|7?񽿾u=>}8 w=ʦbfS<;!E #85 ^b1;6>nL<3x0P>O|.>|}-=׾ N?ig>y@I?>&@\@@>&y@I?g>i N?׾|}-=|.>OP>x03nL<6>b1;5 ^8TOzj}D>YC=7i?YM>4b?5;@zHAz@5;4b?M>Yi?7YC=}D>j=>F1J'jc)]>[=DS$?-M ??BCS׹@c)gAc)׹@BCS?M ?-S$?D[=)]>c:*>e_c\=hb/x>ew=T?Թ ?V~?pmp@o (Ao p@pmV~? ?ԹT?ew=x>b/@?>j{c=ѼY&8>#=:-?1?CqW>r@&=,케;n_>v=-B?TҿG??T>Av0QQAv0>AT?G?Tҿ?-Bv=_>nCr>l&:=4S<,GȺ!v+. tmxҾ> =*Z|?z`? ?AYFUiAYFA ?z`?|?*Z =>xҾE.>_벽,R=sI tm<.ẻ+^Һr<';l=à̼vɽ><>1=&v0?<O|?X?'A{#_#A{#_'AX?O|?<0?&v1=<>쾡>vɽà̼;l='r<^Һ2t캏6wx>b-=NA@wč?Q@x;AwzAAwz;AxQ@č?wA@Nb-=x>m>"''=?υ>=eL@;(I?@RAߌ 8AߌRA@I?;(L@e=>υC>S /#=S9~<k93H<n= wX>b'[ ?*8 >!B'@[ ?b'X>w =nH<39'~I|X]ĿP;@HT?)6@PTA±mA±APT)6@?HTP;@]Ŀ^>ak?X<>4 :#Y1=G|<~I'H<~b< \=@73?S_1?0>;ܿS@kn?2M@)A?܏A?A)2M@?knS@;ܿ0>_1?S?3@7\= <~bH<LkS`X~#=ꗨ[=RMJ6?"Rl@P߅'?of@^>-At3qAt3-A^>of@'?P߅l@"R]F>G?fKby,?Ny\`?_>Y " @RCU@x`@QV0A B0AQVx`@CU@R" @Y _>y\`?Ny,?KbflC>"P=͎_mxDuU )=ΎԽ>r~A?>B{?sz>S=`@KȨ@pC@pAGU uBGU ´AppC@@KȨ=`@Ssz>B{?>A?r~>ΎԽ )=uUxDb==#'>0Y?kUi?> /@R~k3@@]A1B]A@k3@R~@ />Ui?kY?0'>#==bʻU=̖<>O[Zct??N՝>DE@IrlI@@襗fB"2[GB"2´fB襗@rlI@IE@DN՝>?Zct?O[̖<>U=ʻ U⻀-o=_-S>Fam8+??Կ6?->Ė\X@%~b@h@&6??Կ+?m8Fa-S>_-o=U ӻC==(m>0ͽLʾ?@ ?C>ǜw0=@}@ @(B"w`ǻyB"w`(B @}@0=@ǜwC> ?@?Lʾ0ͽm>(==Cӻhq=hv=^> +oԬ?_?<>w%AMqr@zAC}]?_oԬ?+ 罍^>hv=q=hNULLAscendNULL.lflG=g3?g@_{@AscendNULLCodec2<>r3ܻʁ>Ow?)@YAAscendEIA1&>+=Kw>r?:t@֨A AscendEIA1Codec2sF>qa>~?W @*A AscendEIA2 )>rb>6,?A?|@pA AscendEIA2Codec2>y#>m(?z?d@A AscendEIA3h>H>&V??˘@>PA AscendEIA3Codec2>UM>[BF?? @0"A AscendEIA4nr>l>0؁?q?4@A AscendEIA4Codec27>T?? @į@-A AscendEIA5Y? 3?/? @i@_R#A AscendEIA5Codec2a>?|a?#g@Xs@0AAscendEIA6\Ɇ?Ĕ?ٍ@4=ĄADA#AscendEIA6Codec2_?Nх?@S6AM3A)A#AscendEIA7G?@+M@ZpDA{AB[ B#AscendEIA7Codec20?@@DA Ar B#UsrNULL褧>{? @R@LAVAUsrNULLCodec2>4?=@7@AA UsrEIA1.>?@@nA_{AUsrEIA1Codec2>?@4@/nA)A UsrEIA2)?b?/@@vO A{}A UsrEIA2Codec2??^/@A@$A׎A UsrEIA3k?^? 1@@'AUA UsrEIA3Codec2?$?`Y1@:u@b*AA UsrEIA4#???,O@ $@-A4A UsrEIA4Codec2@?Ԃ?xN@M@0A{AUsrEIA55?z?V@1@I6AA UsrEIA5Codec2@vAAٚB#UsrEIA6Codec2u? @_@vAnA"B#UsrEIA7?M@0@AscendNULLCodec2˾k w*>M@"@AscendEIA1 6^cHĔ>1E@7@ AscendEIA1Codec2Tཎ>uP@A AscendEIA2Ad#±>&}?p@@ AscendEIA2Codec2=cY=>hy?@cA AscendEIA3du}"û>]?P|@GA AscendEIA3Codec23>ϛ=?/?7q@A AscendEIA4>x>f?v?%@5 A AscendEIA4Codec2>׸> f?B?2@F1A AscendEIA5L>>P? @0@9A AscendEIA5Codec2O#>x?<ڐ? @,@J$AAscendEIA6]w?Pv?S@&AA-A#AscendEIA6Codec2C?}"G?%;J@A㙛A/A#AscendEIA73?+5#@X9|@oG,AA"B#AscendEIA7Codec2Է?@Rq@'%ATA B#UsrNULLe>ضH?it@YQ@& AnAUsrNULLCodec27>9??t?@AeA UsrEIA1_>gV?m @ɋ@` A FpAUsrEIA1Codec21z>lj?r@`@LA,A UsrEIA2>6?!@?@.Aq~A UsrEIA2Codec2Џ>Jҍ?*@R՟@'AA UsrEIA3`>0/? @զ@A4@A UsrEIA3Codec24>KY?'@Sy@]aAFA UsrEIA4@?z?u@@W@#A/A UsrEIA4Codec2?zp?qU=@Ǯ@O#'AAUsrEIA5i?t?tK@m9@^h(A=A UsrEIA5Codec2&?~?7TL@1@+AAUsrEIA6wJ?P6?@t`AAJB#UsrEIA6Codec2?M?@L^AAB#UsrEIA7?/e@y#@cA(A#B#UsrEIA7Codec2^?-f@9@bAcAk"B#NULLAscendNULLľBE>E@M@AscendNULLCodec2XV2U%ǽga>d#R@(@AscendEIA1Kv=.4S=D?Y@?@ AscendEIA1Codec2>=:?Vf@vA AscendEIA2^z>M>3>p?%@A AscendEIA2Codec2>I)>q8?û?]@A AscendEIA3R'>:>cE?0d@zA AscendEIA3Codec2U=+=q>vO?ྈ@0A AscendEIA4";>h>F?x ?Q@ZG A AscendEIA4Codec2@>O;>K??@OA AscendEIA5+>>y#?1?@MA AscendEIA5Codec2>$>?=D?3@."AAscendFountain>\*@̌@b@{\A~AAscendEIA6>?U?P@ː$A5;AA#AscendEIA6Codec2l[\?j?G@ۧA AKA#AscendEIA7W?.@|~~@+A AlB#AscendEIA7Codec26?A2@5c@L+AA8B#UsrNULL >J~?@@ A9pAUsrNULLCodec2A+>He?ۧ?g@@AǨA UsrEIA1n>T? @@}ArAUsrEIA1Codec2_>o?'@@@KA?iA UsrEIA2?o>z?e@z@A=A UsrEIA2Codec2>Ԃ?r@@ AA UsrEIA3>Ϡ?j'@}@ AA UsrEIA3Codec2>Ǻ?`'@ @#AllA UsrEIA4?kH?`<@ղ@)AfA UsrEIA4Codec2"3?S?!C@W @)A8>AUsrEIA5C??R@ɹ@+A˜A UsrEIA5Codec25K?\?BQ@TƷ@/A?AUsrFountain1l?@@)\9AHAZdAUsrEIA6L?l@d@rAlAB#UsrEIA6Codec2b?jM @@pAA&B#UsrEIA7?z@(@AAB#UsrEIA7Codec25 ?[%z@@VAAz"B#NULLAscendNULLC_ʾ_ 弁!?fS@S@AscendNULLCodec2ta=[@l=sV?8j@AAscendEIA1%ܫ:X=}4?]@~R@AscendEIA1Codec2ؽ=w?vlh@AAscendEIA2N>:S>W?p?/4@AAAscendEIA2Codec2dY>u>Ϊ?z?;Ǐ@AAscendEIA33<|~=A??@A AscendEIA3Codec2 >z>+C??@A AscendEIA4B!>$?s.?` @,@VHA AscendEIA4Codec2u>>k??@h3A AscendEIA5K>?$?Q@@}A AscendEIA5Codec2>*?>??$@@'AAscendFountain>\*@̌@b@{\A~AAscendEIA6r??@M?E@(@A yAUsrNULLCodec2Z>ڬZ?<@Џ@ACAUsrEIA1d>_?q8 @Ք@Aj$|AUsrEIA1Codec2p>j? @@]ALԆA UsrEIA2>?^%@@ A_A UsrEIA2Codec2C>?h,@@. AaA UsrEIA3`<?x?aT6@@ A%A UsrEIA3Codec2od??N4@@q$A ؋A UsrEIA4r?tA?:A@?@I,ASA UsrEIA4Codec2?_?I@.ʶ@^(A!AUsrEIA52??]mW@@ a-AAUsrEIA5Codec2߉1?q?&V@?@-AmJAUsrFountain1l?@@)\9AHAZdAUsrEIA6z?@J@wA AJB#UsrEIA6Codec2큚? @vT@EuAVAB#UsrEIA7?z@(@AA+B#UsrEIA7Codec25 ?[%z@@VAAz*B#NULLAscendNULLȘ󎓾`P=y?X@@AscendNULLCodec2l y1A=ı?W@ @ AscendEIA1ew=o_=%?Y\@@AscendEIA1Codec2'=q =?f@8A AscendEIA2s= ;>0*?@ A AscendEIA2Codec2z6> >?[B? ^@XAAscendEIA3QkZ> >~??Q@A AscendEIA3Codec2|>b>+??l@n4AAscendEIA4>>v??@+AAscendEIA4Codec27>K>_x?TR?a@!AAscendEIA5>y>?tF?ͤ@DAAscendEIA5Codec2|>4?ܕ?z@h@6'AAscendEIA6^K?,e?e@+A AdA#AscendEIA6Codec2bh?i?Z@&%AAA#AscendEIA7U?;&@ ~@ *AAB#AscendEIA7Codec2p?$@.@*+AaîAB#UsrNULL4??1@@AJ{AUsrNULLCodec2>ྎ?@J@mAfAUsrEIA1? ׫? 2@ q@*:!AւAUsrEIA1Codec2&??4@Ǻ@YAQA UsrEIA2.>T?;@/n@sAeyA UsrEIA2Codec2?xz?@@AcA UsrEIA3?e?9@xz@\$AɄA UsrEIA3Codec2S3?a?c8@@6<$A{A UsrEIA4D8?>?O@@-AΉA UsrEIA4Codec2>??1O@F@0AđAUsrEIA5F?W?TY@Qf@0AAUsrEIA5Codec2e?t?\@@22AӰAUsrEIA6?m@(@RhANWA_gB#UsrEIA6Codec2=?+@4@EgAACB#UsrEIA7K?z@(@A!A+B#UsrEIA7Codec2 ?$z@@VAA*B#NULLAscendNULLhJپ?ֲ@\2AAscendNULLCodec2ntӾR~?;߷@AA AscendEIA3r8|;=?4@5?A AscendEIA3Codec2t3`P=D>1?T@TA AscendEIA5ݵ >&C?h"(@@NWA AscendEIA5Codec2>e2?@'@8bAAscendChicagod;_ux?#ۙ?wg@AwqAAscendFountainO ?/\@y@HA'1AAAscendEIA6B`XY?`X@77AA'B#UsrNULLFX?ё?m@#J4AAUsrNULLCodec2jJ ??@6AwA UsrEIA1m۾x?[?q=@Y3AA UsrEIA3<̼?j @S@qBAA UsrEIA3Codec2#y&?S@X9@MDAҬA UsrEIA4A?7@@KA A UsrEIA4Codec2"۽-?333@@MAKAUsrEIA5RI=a?E@ @PAqAUsrEIA5Codec2E=&S?E@'1@RA†AUsrChicago/$>@ףh@/@tgAףAUsrFountainT>-@`@y$AAApAUsrEIA6 >Zd @@zASAT'B#UnknownAD1821LucentSiemensUSB_STLC_7550ALS300_AD1819ALS300_AKM4542ALS300_ICEALS300_WOLFSONAMR_SILABSSIL3052_INTERNALCodecType_SIL3054Panther_AD1803Squeezer_545A_ALCRaptor_SL2800Squeezer_545A_ITE@@??>>==<<;;::99??>>==< @ @       (((&(/(7(?(E(O(X(^(d(j(p(v(|((((((((((((((((() ))) )*)3)<)G)Q)Z)a)i)r)~)))))))))))***.*6*C*R*[*b*h*q*x*************+++"+0+;+@?????N??>q>>=>===>q>>?N?????? Jg#Pn$;55;$nP#gJ `^8L; TH'+X X +'HT ;L8^`B-pP1W%+(+(%W1Pp-BxLQHbh|s9 NcPz--zPcN 9s|hbHQLxd/_^Om |j ~(0##0(~ j| mO^_/d$,6CQcx;g2jR._1COUUOC1_.Rj2g;xcQC6,$ 6 6 6 66 606M6e666666 64X66 77)7=7Q7e7 !Y_~~_Y!   39=raU>QF+ g af @`Z &Ff002C/r9&/FPPrYrpfryo00000000+r)$KrI@D@6;4kri`d`V[T r v{t9#A0#A99#A0#A99#A0#A99#A0#A9~~ZZZ~~Z8!P 8!P !P  ?m?6?8m7@'P(e#P$@@wpaapBSSB4%%4     @h 0(++++++'++ %% .@8 kkj@f@\@f@\@) #K_w@@\` 6 @ P$x x@f@\7  z$z 7͌)@1<@> pJ pI pH )@f@)@Z@DDDD @`@8`@8` @`k( Z   m7@"E:E8VEnEX@8`@8`)@EA@)@ @)@R@)@+E%@EEEE,`,`=FUFmFDl,` ,` )@Cô@)@g܎'@)@uQ~@)@:@FFFF`` @` 0@P`p 3H 3H @`3f 3f 3#f&),033f69<@3CfFILP3SfVY\`3cffilp3sfvy|(|p 8  2 )2 m7m7ȓ<%b"@ @999G 8 \ TG   %`%`)@nj@)@/!S@GGGG !@!`!%`%`(( 0@P`p 0@P`pP P P P (!(!(!(!- AY,02y<>+PV*ng4PU5P4gn# U r 9Ur9 !#U%'(*r,9.013U578:r<9>@ACUEGHJrL9NPQSUUWXZr\9^`acUeghjrl9npqsUuwxzr|9~Fm7@H5H!!QHiH!!%`%`دc2 ( `f:r `''''''''''Uu2ou2@@@@ecaf DD@E EuD >@? #<Q9p?55?8Y?je?uHz?4\1?uHz?:D3>uHz?=9>uHz?%?! pQx?p?zpQx?\?!pQx?o?`Ͽdn= w?j`?xzizt?4+?= g33s?:x>Idq?=X3>Idq?%??Idq?p?!oj]{n?\?F(j]{n?o?ƿ= [l?,@EY?C@? #<;p?5?(np^4U:;Z;`;;<2n5>*# >>q>>G>w>v">=&>h*> L.>.2>6>9>=>_A>wE>]I>G5M> Q>T>X>\>*W`>%d>*g>k>o>Ps> w>z>~>/>u>->ˆ>Ҩ>>_>9>>>>>l>@>>>>]>"U>">s>>m>N>> ޮ> >i>,>V>ʰ>q>;0>4>>f>!>X>j>II>>j>f>>>y>v'>>{>!+>>|>#>A>m>>>DS>>>v->>8c>.>ۓ>@*>\>.S>>v>>>">>???*i?+???qp?0?/??Tm?* ? ?- ?_ ? ?/ ? ?G?]?"?Ao?%???JE?1?s?_? ?a?s?$#??Z?/???)6??nj?%7???z2 ?W ?!?3("?3"?s#?W$?}$?`%?&?@&?F'? '?(?f()?)?Xf*?i+?+?>,?,?v-?.?L.?5F/?/?Bx0?i1?1?>2?^2?2k3?r4? 4?;)5?ż5?O6?#6?s7?>8?8?&9?9?D:?8:?'a;?;?^{?A>?`3????F@?@?VA?A?dB?KB?,qC?C?^{D?D?~E?F?F? G?G?H?H?I?;I<ɖ< >>@>v>">(>/>@5>n;>7A>G>`M>T>9Z>\`>f|f>l>Qr>x>~>}>Ά>>>">ݝ>1>>>x>嚠>ŕ>>Ć>|>:q>c>T>*D>1>J>>>)>S>>{> Z>A6>k>>y>O>c>u3>>>y>Z>>>->']>>?B?=??K?6??H ?k ? ?9????*h?9??<???? B????/!?g"?#?%$? &?V6'?f(?)?*?J+?i-?;.?a/?0?1?2?3?5?l 6?#:7?R8?Bh9?|:?;;??g??@?pA?)B?C?D?E?*F?eG?H?I?J?K?yL?M?N?zO?dP?=MQ?3R?IS?S?1T?U?V?&pW?SHX?jY?jY?PZ?[?a\?S-]?]?^?'_?!F`?a?a?b?Z?=?']>->>>Z>y>>>u3>c>O>y>>k>A6> Z>{>>S>)>>>J>1>*D>T>c>:q>|>Ć>>ŕ>嚠>x>>>1>ݝ>">>>Ά>}>~>x>Qr>l>f|f>\`>9Z>T>`M>G>7A>n;>@5>/>(>">v>@>> >>s=v8=.===6=:==0== =t+{=ib=0H=/=,=I< <ɖ<I<;????  !!""##$%&'()*+,-./001123456789:;<=>?@@ABCDEFGHIJKLMNOOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,.0123456789:;<=>@ABCDEFGHIJKLMNOQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~?    GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5)GCC: (GNU) 3.4.2 (Gentoo Linux 3.4.2-r2, ssp-3.4.1-1, pie-8.7.6.5).symtab.strtab.shstrtab.rel.text.gnu.linkonce.t._ZN10GenericIIRIfdE5resetEv.gnu.linkonce.t._ZN10GenericIIRIfdE7processEPKfPfj.gnu.linkonce.t._ZN8SineWaveIffED1Ev.rel.gnu.linkonce.t._ZN10GenericIIRIfdED1Ev.gnu.linkonce.t._ZN8SineWaveIffEC1Effff.rel.gnu.linkonce.t._ZN8SineWaveIffE8generateEPfm.rel.gnu.linkonce.t._ZN10GenericIIRIfdEC1EjjPdS1_j.gnu.linkonce.t._ZN10GenericIIRIfdE7processEf.rel.gnu.linkonce.t._ZN9ScramblerIihED1Ev.rel.gnu.linkonce.t._ZN5QueueIfED1Ev.gnu.linkonce.t._ZN5QueueIfE5resetEv.rel.gnu.linkonce.t._ZN5QueueIfEC1Ej.gnu.linkonce.t._ZN5QueueIfE4readEPfj.gnu.linkonce.t._ZN9ScramblerIihE19resetHistoryIndexesEv.rel.gnu.linkonce.t._ZN9ScramblerIihE5resetEi.rel.gnu.linkonce.t._ZN9ScramblerIihEC1Ejjj.gnu.linkonce.t._ZN9ScramblerIihE15copyHistoryTailEv.rel.gnu.linkonce.t._ZN9ScramblerIihE7processEPKiPhj.gnu.linkonce.t._ZN5QueueIfE5writeEPfj.gnu.linkonce.t._ZN5QueueIfE5writeEf.rel.gnu.linkonce.t._ZN9ScramblerIhiED1Ev.gnu.linkonce.t._ZN9ScramblerIhiE19resetHistoryIndexesEv.rel.gnu.linkonce.t._ZN9ScramblerIhiE5resetEh.rel.gnu.linkonce.t._ZN9ScramblerIhiEC1Ejjj.gnu.linkonce.t._ZN9ScramblerIhiE15copyHistoryTailEv.rel.gnu.linkonce.t._ZN9ScramblerIhiE7processEh.rel.gnu.linkonce.t._ZN9ScramblerIhhED1Ev.gnu.linkonce.t._ZN9ScramblerIhhE19resetHistoryIndexesEv.rel.gnu.linkonce.t._ZN9ScramblerIhhE5resetEh.rel.gnu.linkonce.t._ZN9ScramblerIhhEC1Ejjj.gnu.linkonce.t._ZN9ScramblerIhhE15copyHistoryTailEv.rel.gnu.linkonce.t._ZN9ScramblerIhhE14processAllOnesEPhj.rel.gnu.linkonce.t._ZN9ScramblerIhhE15processAllZerosEPhj.rel.gnu.linkonce.t._ZN9ScramblerIhhE7processEh.rel.gnu.linkonce.t._ZN11DescramblerIhiED1Ev.gnu.linkonce.t._ZN3AgcIfE6freezeEv.gnu.linkonce.t._ZN3AgcIfE5resetEv.rel.gnu.linkonce.t._ZN3AgcIfEC1Ev.rel.gnu.linkonce.t._ZN3AgcIfE7processEPKfPfj.gnu.linkonce.t._ZN11DescramblerIhiE19resetHistoryIndexesEv.rel.gnu.linkonce.t._ZN11DescramblerIhiE5resetEh.rel.gnu.linkonce.t._ZN11DescramblerIhiEC1Ejjj.gnu.linkonce.t._ZN11DescramblerIhiE15copyHistoryTailEv.rel.gnu.linkonce.t._ZN11DescramblerIhiE7processEPKhPij.rel.gnu.linkonce.t._ZN11DescramblerIiiED1Ev.gnu.linkonce.t._ZN25SerialDifferentialDecoderIiE7processEi.gnu.linkonce.t._ZN11DescramblerIiiE19resetHistoryIndexesEv.rel.gnu.linkonce.t._ZN11DescramblerIiiE5resetEi.rel.gnu.linkonce.t._ZN11DescramblerIiiEC1Ejjj.gnu.linkonce.t._ZN11DescramblerIiiE15copyHistoryTailEv.rel.gnu.linkonce.t._ZN11DescramblerIiiE7processEi.rel.gnu.linkonce.t._ZN11DescramblerIhiE7processEh.rel.gnu.linkonce.t._ZN9ScramblerIhhE7processEPKhPhj.gnu.linkonce.t._ZN25SerialDifferentialEncoderIhE7processEh.gnu.linkonce.t._ZN25SerialDifferentialDecoderIhE7processEh.rel.gnu.linkonce.t._ZN27ParallelDifferentialDecoderIhEC1Ej.rel.gnu.linkonce.t._ZN27ParallelDifferentialDecoderIhED1Ev.gnu.linkonce.t._ZN27ParallelDifferentialDecoderIhE5resetEjh.gnu.linkonce.t._ZN27ParallelDifferentialDecoderIhE7processEPhS1_.rel.gnu.linkonce.t._ZN27ParallelDifferentialEncoderIhEC1Ej.rel.gnu.linkonce.t._ZN27ParallelDifferentialEncoderIhED1Ev.gnu.linkonce.t._ZN27ParallelDifferentialEncoderIhE5resetEjh.gnu.linkonce.t._ZN27ParallelDifferentialEncoderIhE7processEPhS1_.gnu.linkonce.t._Z3sumIfET_PS0_j.rel.gnu.linkonce.t._Z4meanIfET_PS0_j.gnu.linkonce.t._Z6sqrSumIfET_PS0_j.rel.gnu.linkonce.t._Z3VarIfET_PS0_j.gnu.linkonce.t._ZN9Resampler16timingCorrectionEf.rel.gnu.linkonce.t._ZN10LowPassFIRIfED1Ev.gnu.linkonce.t._Z6boxcarIfEvPT_j.rel.gnu.linkonce.t._Z7hanningIfEvPT_j.rel.gnu.linkonce.t._Z7hammingIfEvPT_j.rel.gnu.linkonce.t._Z8blackmanIfEvPT_j.rel.gnu.linkonce.t._Z12designWindowIfEv10WindowTypePT_j.rel.gnu.linkonce.t._Z4sincIfET_S0_.rel.gnu.linkonce.t._ZN10LowPassFIRIfE6designEjffPKfi.rel.gnu.linkonce.t._ZN10LowPassFIRIfE6designEjf10WindowTypef.rel.gnu.linkonce.t._ZN10LowPassFIRIfEC1Ejf10WindowTypef.rel.gnu.linkonce.t._Z3StdIfET_PS0_j.rel.rodata.rodata.str1.1.rodata.str1.4.rodata.cst8.rodata.cst4.rel.gnu.linkonce.r._ZTV12V90Resampler.rel.gnu.linkonce.r._ZTV9Resampler.rel.gnu.linkonce.r._ZTV21ResamplerTimingOffset.rel.gnu.linkonce.r._ZTV15ResamplerTiming.rel.data.bss.comment.note.GNU-stack@  ؖ%0 zQ H  : XP p  h 3! k/ x bp! #   #  @# P# 4 )# O`$ $ 0 $ k  % $P%  ȄL% s& U '  ؄ @' `' , #-' f) %U(  ( v ((  *( !( , -O) fK /w) ) x (2 * x 84%* k! H6U+ Q X8~0+ P+ #+  `<+  h>p, V, ,R pA, f xC0- P- x F&- " HO- .  . 0 LP. k N' . $c . n_ Q `/ v ȅS / x ؅U `0 6 0 v 0 ?r Y 0  [ 1 <' @1 9m 1 ?i _ 1  a 1 <  2 6` `2  2 & f 2 . 2 E i 03 & @3 " lM `3 s 3 lo (o 3 h 8q `4  P(s 5 t x(u"5 . wF5 uB Hy|07 jx {7  }7  7 d  B 2DG R/2 /> K \ X (        (  8 g g3KӲӲ$ 0      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ (+0(8`EKP_fnp+bz-.=`+@57Vp7N0:=n@>~H `EsG_@Hg+1`90LDPMHOM[axiO,tPH0Q-TUHUF P#4D(O (Zh`Xh@Xh 0`0!+CPap 9K]t "8Nk&@[y !/L]q{ #+>Qgw`(v))) l\  $ 1 @69 @7C @8@I 9T` 9Ts @:| @;@ <T <T @= @C@ DT DT @E @I@ JT JT @K/ LTE `LV M@\ OTo Ox S     q    TR TRT `V  pV  $W *W ' @W1 : B @YRR YRb ZRr `ZR ZR [R [R [R @\z \z  @]( h] ] " ]1 ]@ ]N Pb Ps p      @( $  r  |  h & (@ I h^ Y r^ h z  IlbVbnzi  i"m .m6mm $/:CLU+c+u'[~~Pw \w hw'1<|wUwnv ww@$d$ 0P Z  dvww$*wB $R[dvD~`@ww "~,x x6@GQY@foxXx bx lx vx X`00, @@, 1`- ^D- HP[ y r@ ? > 4,y pJ pI pH     %3AO]jv` @,( $/7BLV`jt~" )4?JU`kv&0;EQ[eo~ #.@j6AK` Xcm` u@0) g6 (KS\di.pu~Ԅ(    P P (X 3X =` Ch Hp Lx R\Tm@T|@@@ `*p: J Z@ @i x0~`K16 `A' $ '2" E;y3t0]%t $ _-:-dw x0 x Po89*q 9 q~@H<0Zv=P8 Pg8' H8yZnk zHv,"-  px b    m0 @"# PT pM-u $"  \ v   Xp pl 1!иWT!̆b! Z "+"+ ;G"`W"`f"s"W]"Ԇ"zj""'"*8"&X"*&#p`]#@ n#@\K#0#V #` #,###`=$|Q$ ^$j$0y$($j$"$Y$p$r"%@5%03L%t[%px%`f%iM%i.%% %, &Xh.&x =& lR&д ^&z&2*& &a&p\&%&Z'`d''^'pD o'= '`]s''u"y'd' t' 6(jE( "](}n(p ~(g(V(Ȯ( ( j((V(@g),)|<) c)gq) ) >)Pn)z))$*@ ;*xb*@D<*cH*PWz*; [* * @*(*, *p *`#* + 4+,+ #+ 1+{K+p {X+@P+Z + n+O\++W+`v+@rt,`} ,(,pG, $U,Wx,,p(,  -"<-5"-0m-0Q-`@-Q -p- -@- 3T. .0|'.@5.xv@.tK. f.|y.. 6.c.5. .). /;/`  k/y//`//p/*x0@]20u0u 0`0"01P= )121f1p ~1@1 ( 1- 1pp1b 12/2>2 LU22s2v242p2M)22 2m3B 3 '3s53c&\3Tu3X13P433 3 3r44Ec64H4|X404s4`P4 '4 '4P#4J?445P4"@#5 C5 ^5~l5܁y5 f 5+5 -55$ 53@5"*5p 6P_ 60V[96k"NT6p l6p x666> v66P 6r6puA6d7y 17C<7ĆJ77J7`97@:7j"{8:(808 >8u8 8 8P8V)9o:9"[b9n90v999x 9 95: I:P [: m:`Su:0:\j: q::: :: ;Pn T#;1;P?;u@O;sZ; h;;x;J t;cdv;;;%<@< K :"<@)M<>[<x"F<0 <0q< 7<P<:<0 <|=P#=0 7=BE=08 q===*==@U>PY]->I>6mV>_a>&s>o>Z> >(>Я >v>V?I=?p;y[?g? kt??P ? ?"a@2H@c@u(@L@ @0 @T@|@t@0 7#A 0A Q >ANApWgA|{AAqAx A8A AP B Bz'B"v5BPB N [BZhBMzBH"B BP !B CwC 4 g2C̀EC HOCy^CQEC@| C0 C CPDC@+8C TC5DDzHDPD ]DP<uDH~DHqDDPEDbDsl ESuEy/E3Ey>Es&xE/E@qE9ELE0E&F RHF-pFKF0]FhFF "FPGЫ/>G } IGoaG[jG]3GYG GG oH!H(HWAH_H }HpHH@ HXH t#I`X1I :I^ fI rIbI0I 'I n@I 3I0IPBJ$J5cNf"C O_[3ODg=O {POZO jO`PO O0OP O P0"%P83P`x?Pp KP:_PPPP5PP>PP#5PPb*QQyQ@/QYQ gQPt_Q1Q0!%QQ@(;Q.jQ_WR_ R +R=9Rp,URSLbR2qRRP%RpwiR R`.S(o]pb] ]` "]p]`] ^P^pU#6^ (S^h^@ x^^a ^|^ f^ 4^p^Bx ^z^_0A_/ ]_ l_Pg{__pmi__|{ `f-`  <` L`$@T`pl`;x`@ `0> `,=``k`"```u5` `ba`/a`a1(a a@aaa\.a R bV[0bx ?blvb5b"*b< bpbbv"Sb byb0  c -W !cx 0c @cq Pc >^ckwc0,cp{c|cbcS d ?dA+d96d@ BdhUdGtd` d~md0Udfd envJe@WepK ume@Oe}ee e@ e`4eepGf  f` 4f 3 AfJNfyYf> ffzfX gf"Kfk"6f0!fP? f6f"sgOfg@Dg@7gn LKg 5iglyg@!gPDgp9g P ggXh]Gh0^h0 h;h`hIhYh  i i u &i`4ip-_itijRivri5i`"Ti*i}iPh j jm j &j 0 3jVj`Lcj0mj zj` >j j0Yj",jdk| 'k1k[KNkckBlk@nk0ak{k<"]l` l lp 1^l /ol {lpl|lP6ll@hl l`im0=gm tmz"m0 mmx mB*mm>km @n U7n HCnQncnwtn4Xn np nUgn}n]n oy #oV[Ho6 [oy_o@b,oypp0 pPp p` VpE npp"1qp qPO-q 6? [q jfq0'yqq< qq`Or  rPrn`r nr@:vr 8r@{ry r rVr0 r`Ps`d sv^sĠps5s +[sqs>'tw7t8@t Qttpt tx"2u`y(%uSNu0euj uuuv*{vv v^v`vkv6w+wW %;wpGOw iwP ww^wwprwPwvw X w 5w0 5x0(x=x@QxX^xNixnOxĢxEx xyxpTx$wx x Ny@y0,y:y^AoypH }yOy^5yey@ yh y@oZz z0"z-Lzkz0z5z!zp z5z`1{| {@I{p <~{ ;{{]{M^{`W{||+|2|>|yU|sb||| G|`" |c|i|k_/}0H}@ U}z_}m}}h"q} ;}]} }d^}. ~j~~ S+~0 D~pliX~/j~ ~M~~~t   PYO0 Y[0 jw*`A@'q0dX-;@ rt  ^fǀ@Ҁ9hv9 :@ 1(Csd\pD~}b0p%м[?JG6`|  f:$`b, ;0FPW. fmi0X MG˃0mEۃ Z t-`J ^hp 4@f ;uτ ">$a 6@n0" p " ΅` B4{ #nb 5SJW [ pPqd Z Cv5Ȇ0LՆaK t,0S0EЩ5ć`҇ py$G>yLXLJ( `2w pp= }5T!@/@b< vL  qm0 1` ȉll݉`@ `SHЮZp k0 h9&f Њ`e [. }( #0Yi  R"",  <R qQ+8[@spn2ΌU ܌@z p>t An8 RD0 p[ i*rP v΍#";q  O  Ve4cK܎e Yp `= -2 Zjgiw0 s)PV R0)[4Տk"  ;"Pv]`  iɐm ؐ4  "`w=":Q[w iprlUOÑpW͑vؑ` dp+ p) 0;H -YpzpJB`w@ bɒP ^ )@AM%3 7> EAyW#@  `cX%p,0 C R8\6jzP:  ] `@*КH6na$ G0`<ŕ\?>T ] l`pyf"%܋)@< 8P?Rc iqp_L01@ Oȗp #ڗ% pi=oYMPl yz(}` d _ΘP uΙՙq3 <,]0J 4pA:|ƚ0m ՚`y`:5$ |9 Hk" gPY Ktx S r$0  Y ]Λ`<ܛw$0e(@:TE M"elk@  % F+[ =@]?LEFY i0`$"P%Ў ÝXҝБ ) b!!7@GQ v~bP 8 m 4[?"_ܞ`-&c u5пQ N] { ,|ٟV: P-qZ*]W`lx { gFPREDԠPp - W e x"m{zV-pm`mк̡NסLb\,DFO Tf"X`m !^@j@"-0"i!|@R p6D6 ypnp['8)|J rZ`znr0A:̤p T7x F =Tb|rПN 0G<pch84Kp_[qyp=wҦж$XJR@ rg lħ 'ҧݧ:@w@^ x6^ `0t¨0<#@J#)tcVm@,upg ]@(9"^R6v) k6p5Kp|~ { m:̪ (+ *u@=mWVPmk @f~̫zܫw4x 2 }"@I]ovx"4PЁ Ĭp^ Ԭ@v e^+[.W@Dd n2xyv4"" ֭E ip9S }i 0:d@}h ήPٮ E ."w Ru/@@jDHw܆@8 G@Ut[} ư`ذ@ST@Au@r%x3- ;A@{ N){.P @d^ \y(|ϱv _ܱv& +8 !v4`R yEASakw` r* x"U)9Tp(!P qxijhs@ED Ъ n e:IbvLx @e Ŵ"Դ6 U"@KU,FS'0g %P!| .n 5ص ?S` "Pb{03`: D;_ p@ | @\Qp=bI0IEmr L3Ƿ`2Է=q!,% 8P#DlU[ ʸ(zԸ j$ ' P 4*j@PPbf>`p¹|ѹ 1FyT`gdp|`<YЙ > Ǻ0к3`L @zY]"Hvvu wi˻{v& z}` f"/м@ ߼@[`v  S@,"A:l =}68|1 Ƚ`޽  `Rv"(T ľ4о0 0 x 0P`&"l=p 5[@ 'iz` ؀@ȿ ؿ 03 @ *#* >yLz`p~\.<@-? S/, `< jIrH hsP"ps0i.2> OP y^ Ybpz,pC ,"#@X3pMP  ,9,Pj 5p,Q xf%1q' | .P; @y(`= gi@% 5x D<"cqI` ~`F&J=@ T8\` Di`n@woxo;X0 cG   ' 4 /DIh ~P"t!xg:wF*90GP^1aZ q }zn=r|P 0S$6 e EzPa|vPQ "E`, )F =kY"p}t"@p a "@rw}@H ~ '$IRu_|t0`#Q $*`N]8| '`m `u@( 5oЌ|}k `pV | D@nW[ #@743Ab* - 0&} @#P ) y-N k yXP1( oJw_:Pw\@!a C|   M!F#(= XR kP0 5 @ +` 8P E}X\e v0"L ) ?"Y+ ^P-?oM`-tPEq/@+ *o +-@B /<@-F oq@(x9 tc PU!6 8w!e/WXxt"u >` >@'c 1Ю }1P V c@ymT@} t( H\@|Pq0 > pd u&@%)8 G ,R: _ {R@dW {oXP}0+ #5#\I 'WPej!"14X peM` t0, V QPjR*+84P_dme*(0vZN K }m @w)<wHVt8aq |f PB NA @}"  ,y ^59ppBXpK|^ {m"}K?`X| q! n`cFp5??tp (f" 0F/vZ87K1CpWe` AxE  "`P @P #5{'BpDq~{ 6"d  &pVym x` W` 2uPmLd KW6D`D9Op@Z`Lgl rx `VF W 7"nx =0& :S,Hp""k08d Z`2>`oxHUP[4s q  @xX4  - 6?@I{S _Įr lP{?p6P1X4"'8SFDp 'R0s }*; `94 $ x6`tp* 5y& |p e3G'k"x`Gp  9mlwDDdU:/P > CRp[l"on`YyK . >d_ b 0!B(X W3n| =nQ6 X* 7 D PP%d0 Pg 6bpO`? ; t- <M`ZdnN  e +0P d`` (/0U`{ `_mU$| p84 @sl,M [njT 88y P@,@,2e WsViwv7Z}Bp  # 1 > ]t4 | p(v"ZmW`Bmam0P` @eF#Lp  n *0] ; PrV PT^{ "!K n~0 E"ip U@0@dĄl@ }̮`M( %pS+2w7АtFZzlzbF0l=h 0v "3Q9WPd^^ >SO ~ >@403,"8Eavs @5P@0"pG c&c!  00K(~< UP jaf-I @!`l + 37P\> In Xpkn"Q@W (e[# p&X:" 0y:y\Xk,|x  96 0 V H8Z I2 k ZU}0. #dp_init.cdcr.ccid.cvoice.cvce_hook_onvce_hook_offvce_get_sregfax.crd.cringDetector.ccall.ccall_opcall_createcall_deletecall_runcall_GetSRegisterv8.cv8_opv8_createv8_deletev8_processvpcm.cvpcm_opvpcm_createvpcm_deletevpcm_runv32.cv32_opsv32_createv32_deletev32_processv23.cv23_opsv23_createv23_deletev23_processv22.cv22_opsv22_createv22_deletev22_processb103.cb103_opsb103_createb103_deleteb103_processdp_param.cdp_wrapper.cVPcmV34Main.cppV34DisconnectThreshTable_Z14getMPrecvdBitsP12tagV34ObjectVpcmFloModem.cppv34initialbaudsentFiltNumentFiltDenNoK56Flex.cppGenericToneDetector.cppAnsamToneDetector.cppIIR2100_Coef_B_9600IIR2100_Coef_B_8000IIR2100_Coef_A_9600IIR2100_Coef_A_8000V92EchoCanceller.cppv92echoPreFilter_bv92echoPreFilter_aV92Jd.cppV92MappingParamsInt.cppV92Modem.cppV92Modulator.cppv92TxPreFilterV92Parameters.cppV92Phase2Info.cppV92Phase3Modulator.cppV92Phase4Modulator.cppV90Modem.cppV90Modulator.cppV90Demodulator.cppV90Jd.cppV90MP.cppV90Phase3Demodulator.cppV90Phase4Demodulator.cppV90Parameters.cppV90Phase2Info.cppV90Phase3Modulator.cppV90Phase4Modulator.cppV90bitsToSymbol.cppV90Mapper.cppV90Demapper.cppV90SignBitsExtractor.cppV90DilDescriptorSettings.cppTOHNREFTPSPLtpLspV90ModulusDecoder.cppV90ModulusEncoder.cppV90SpectralShaper.cppV90SpectralShapingFilter.cppV90MappingParamsInt.cppV90Resampler.cppResampler.cppResamplerTimingOffset.cppResamplerTiming.cppV90Equalizer.cppV90SdDetector.cppV90CPpck.cppV90TRN2dDesigner.cppV90RDetector.cppV90ConstellationPower.cppV90ConnectionEvaluator.cppV90AutoDigitalImpDetector.cppV90PreFilter.cppV90PreFilterCoeffType1.cppV90PreFilterCoeffType2.cppV90PreFilterCoeffType3.cppV90PreFilterRefLoops.cppV90SpectralVerifier.cpppsd.cppFloatFIR.cppFloatARMA.cppV90ConstellationDesigner.cppV90DILdesPCK.cppV92bitsToSymbol.cppV92CP.cpp_ZZN5V92CP10bitsToInfoEhE5gamma_ZZN5V92CP10bitsToInfoEhE5deltaV92DILdesPCK.cppV92Mapper.cppV90CP.cpp_ZZN5V90CP10bitsToInfoEhE5alpha_ZZN5V90CP10bitsToInfoEhE4betafft.cppV92Transmitter.cppV92ConvEncoder.cppV92ModulusEncoder.cppV92Precoder.cppV92PreFilter.cppFloatIIR.cppV34.cV34ARRAY.cV34CONST.cV34RX.csqrt_tableV34demodulatebpcoeff1.0bpcoeff2.1edelay.2V34TX.cV34hshak.cStateNameApplyBulkDelaygetbitv34filters.ctx600c1txAllPassp2400ec_prem_coef_B2400Highec_prem_coef_B2400tx2400c1p2800ec_prem_coef_B2800Highec_prem_coef_B2800tx2800c1p3000ec_prem_coef_B3000Highec_prem_coef_B3000tx3000c1p3200ec_prem_coef_B3200Highec_prem_coef_B3200tx3200c1_for_v34V90EchoPrefilterCoefftx3200c1_for_v90p3429ec_prem_coef_B3429tx3429c1preemp0detector.cDFTC.cDPSK.cfsklpfcoeff600MEMORYC.cV8Interface.cV8global.cANSWER_Entrance_FilterCALLER_Entrance_FilterwordFlipV8.cc2100V8Detector.cabV8Dftc.cv8_costblV8Dpsk.cV8Fsk.cLS_filter2_coefLS_filter1_coefLM_filter2_coefLM_filter1_coefHS_filter2_coefHS_filter1_coefHM_filter2_coefHM_filter1_coeftemp_v21_lobndtemp_v21_hibndCallprog.cstate_namesdefault_configuration_apply_biquad_scales_filter_b_coef_filter_a_coefmessage_namesnext_state_due_cptdmessage_due_cptdnext_state_due_line_clear_timeoutmessage_due_line_clear_timeoutnext_state_due_timeouttimeout_tablemessage_due_timeouttoneiir_dialtone_tabletoneiir_busy_tableautomode_tableenable_line_clear_timeoutDialer.cdial_high_freqsdial_low_freqsAnalyseDialStringGetNextDigitAndReturnNextStatesyntaxStatName.0DialerConfig.cHigh_Tone_Gain.0Lower_Tone_Diff.1toneiir.ctoneiir_configuration_defaultdefault_adefault_bdefault_scalesCadence.cCadenceNamesCPfiltrs.cCP_allpass_bElliptic1.cElliptic2.cElliptic3.cCallingTone.cFP_math.cThresholdsTableFPTONEFact_FPDualTone_Detector.cIIRFilterScalesIIRFilterCoefV32.cV32DiconnectThreshTableV32RXTAB.cV32SMC_TX.cV32TAB144.cV32TXHDX.cV32TXTAB.cV32dec.cV32int.cV32mod.cv32_handshakev32_null_protocolv32_datatx_in_internalrx_out_internalV32org.cV32prc.cV32rxhdx.cV32states.cstatenamesV32stc.cSnrToRetrainTableRATEv32PROTOCOLV32RNG.cV32Sdm_rx.cV32Sdm_tx.cV32ans.cV32loop.cv23modem.cfw_ch_samp_per_bit_tablebw_ch_samp_per_bit_tablev23rx.cAGCv23_CFGV23_AGC_DEF_ALPHAV23_AGC_DEF_BETATONEv23_CFGFSDv23_CFGMRFv23_CFGv23tx.cV23filt.cbwchdem.cblock_size_tableSpace_CoefsMark_CoefsBwCh_IIR_FILTV22.cTONEv22_CFGV22DiconnectThreshTableTONEv22INIT_CFGV22Dec.cv22mod.ciSilenceAfter2100V22_PROTOCOLrx_in_internalv22prc.cv22rxtab.cAGC_DEF_ALPHAAGC_DEF_BETAv22stc.cv22txtab.cv22_fse.cv22_fse_muv22_iir.cv22_mrf.cv22_pps.cv22_sre.cV22int.cB103.cB103prc.cB103tab.cB103int.cData.cDtmf_Rx.cRxcid.cV23_MRF_FILTCidfsd.cCidmtd.cMTD_COEF_2_8000MTD_COEF_1_8000MTD_COEF_2_9600MTD_COEF_1_9600Dtmf_Detector.cclass1.cstatus_namesstates_namescommand_namesFAX_HP_COEFF_send_silence_state_recieve_silence_state_answer_tone_state_idle_stateclass1rx.cinit_vmi_data_rx_modeminit_vmi_v27rxinit_vmi_v29rxinit_vmi_v17rxclass1tx.cinit_vmi_data_tx_modeminit_vmi_v27txinit_vmi_v29txinit_vmi_v17txfaxvmi.cvmi_unpackvmi_packvmi_reversefaxvmi_asyc.cfaxvmi_hdlc.cfaxvmi_pack.cfaxvmi_tbls.cfaxvmi_utls.cfaxvmififo.cT30frames.cFrameNamesBuffer.0V17rx.cV17rxdec.cV17rxtab.cV17tx.cV17txtab.cV21rx.cV21rxtab.cV21tx.cV27rx.cV27rxdec.cV27rxtab.cV27tx.cV27txtab.cV27_SDM.cV29rx.cV29rxdec.cV29rxtab.cV29tx.cV29txtab.cVmi_v17.cVmi_v21.cVmi_v27.cVmi_v29.cVtb_tab.ccDATArx.ccDATAtx.ccDATAtx_countercHDLCrx.cGAIN_THRESHOLD_TABLEcHDLCtx.ccTOOLS.ctemp.0faxvmi_null.creversedchars.cSDM.cSgd.cSmc.cSmc_tx.cTab144.cTx_rxtab.cV17r_prc.cV17r_stc.cV17t_int.cV17t_prc.cV17t_stc.cV21r_prc.cV21r_stc.cV21t_prc.cV21t_stc.cV27r_prc.cV27r_stc.cV27t_prc.cV27t_stc.cV29r_prc.cV29r_stc.cV29t_prc.cV29t_stc.cV17r_int.cV21r_int.cV21t_int.cV27r_int.cV27t_int.cV29r_int.cV29t_int.cfpm_agc.cfpm_atan.cfpm_div.cfpm_div32.cfpm_ecc.cfpm_fsd.cfpm_fse.cavg_err_show.0fpm_fsm.cfpm_iir.cfpm_log10.cFPM_log10_tablefpm_mrf.cfpm_mtd.cDEF_COEFSfpm_phasor.cfpm_pps.cfpm_rms.cfpm_sdm.cfpm_smc.cfpm_sqrt.cfpm_sre.cfpm_tables.cfpm_tone.cToneLPFfpm_tren.cfpm_vtb.cVTB_DIFF_TBLfpm_adeq.cBeepgen.cGetGainDetector.cstatustone_chartone_integration_thresholdenablelookup_tabletoneTONEamode_CFGDtmf.cFdsp.cpGlobalFDSPObjuCorrelationReportsNoFdspkrnl.cbInternalBeepInProgressEchoCancelerbValidateEnergyValueFifo8.cFIFO_CFGNotch.cRx.cTONE.cTx.cduplex.csilence.csilence_level_tablePHASOR.cTABLES.cpcm.cseg_endVparser.cencode.coffsetarriEncodeOffsetcEncodedTemp.1pow.Sinf_zeroinfinityminf_mzerominfinitymzerozeroonelimitFixedRC.cfixedRc_DownFactfixedRc_UpFactrc80to72filterrc72to80filterrc320to96filterrc96to320filterrc120to80filterrc80to120filterrc120to96filterrc96to120filterrc384to80filterrc80to384filterrc384to96filterrc96to384filterrc480to96filterrc480to80filterrc96to80filterrc80to96filterCI_b2CI_b1CI_bDroopdp_v32_init_ZN20V90Phase3Demodulator24setDigitalImairmentsInfoEvdtmf_detect_ZN25V90AutoDigitalImpDetector21applyPadGainToLinMappEvDTMF_MTD_detectv27tx_messageCID_FSD_demodulate_ZN18V90Phase3Modulator24updateCodeSegmentPointerEv_ZN12VPcmFloModem15resetBitPointerEvCRRv32_PLL_K2_ZN20V90Phase4Demodulator13resetBeforRRNEvV22_FSE_init_ZN20V90Phase3Demodulator15setAltRbsParamsEvFSE_decision_eqtrnedprintfV21_MRF_FILT_ZN18V90Phase3Modulator14generateSymbolEvV27TX_SMC_PHS_MASKB103_MRF_FILT_TX_ZN8FloatIIRD1Evv17rx_controlMTD4_COEF_8000_ZN11V92Precoder7processEPjiiPiPf_ZN5V90MP12getBitVectorERjdcr_process_ZN16V92EchoCancellerC1EP13V92ParametersjjgetTimingPhase_ZN25V90AutoDigitalImpDetector21unitePhasesInfoOfUrefEsV34scramblerV32FP_status_ZN15V92BitsToSymbol7processEPhRjPs_ZN18V90Phase3Modulator7exitDILEvSDMv32_CFGRxHdxRateSequence_ZN12V90PreFilter9setFilterEj_ZN12V90Equalizer6freezeEvV34SetINFO0dBits_ZN24V90ConstellationDesignerD1EvV27RX_SRE_FILT_4800FIFO_createAGCv32_CFG_ZN9ScramblerIhhE5resetEhFPM_TONE_create_ZN25V90AutoDigitalImpDetector10updateUrefEvFPM_ECC_freecid_modemSREv22_yCLOCKvoice_dle_commandV32_CFGlsbMask_ZN17V92ModulusEncoder5resetEP16V92MappingParams_ZN9Resampler15copyHistoryTailEv_ZN9ScramblerIihE15copyHistoryTailEvFIFO8_readV29RX_YCLOCKV32_SAMPLE_LENAGCv17_CFGVPcmV34LogTimingOffsetECCv32_QMAPv8_TONEq_init_ZN12VPcmFloModem16getConstellationEP11int_complexm_ZNK14V90Demodulator10getBitRateEvDECv22_QMAP12_ZN20V90Phase4DemodulatorC1EP16V90MappingParamsS1_P11V90DemapperP5V90CPP5V90MPP11DescramblerIhiEP22V90ConnectionEvaluatorP13V90ParametersP20V90Phase3DemodulatorP25V90AutoDigitalImpDetectorjAGCv27_CFG_recieve_silence_state_initFSE_decision_ABV29TX_SMC_PMAPMTDb103_COEFSDMv32_descramblerDECv22_IMAP12GetVPcmMinimalTxPowerReductionDECv17_QMAP64B103OriginateNextStatescale3429_ZN17V90SpectralShaperD2Ev_ZN18V90Phase4Modulator13generateRfNotEv_ZN18V90Phase4Modulator27generateDataSymbolBeforeFPEEvSGD_sequence_gen_ZN19V90SpectralVerifierD1EvGenerateCallingToneGetSNRV17TONE_killFPM_FSD_CFGv8_dftupdate__divdi3_ZN12VPcmFloModemC1EPv12V90ModemSideP19_tagModemParametersj20V90ComputationalMode20V92ComputationalModeV27TX_PPS_DOWN_FACTv27tx_deleteupdateAlphaTxHdxNoCarrierV23_IIR_FILTSREv17_COFFS_Z3StdIfET_PS0_j_ZN15V90TRN2Designer19setTrn2DummyConstelEP16V90MappingParamsCID_process_ZN18V92Phase4Modulator9recivedCPEv_ZN12VPcmFloModem12getV90JaBitsEPsgetConstellationsIndexDECv32_MAG9600_ZN5V92Jd15packJdPhaseDataEvFilter_100_550_a_ZNK3Psd14getFrequenciesEPff_ZN12V90Equalizer17setLinearEquCoeffEPfjFSE_decision_128ptV17RX_control_ZN5V92Jd14getJdBitVectorEv_ZN13V92Parameters10loadParamsEPcMTD8_COEF_8000_ZN11V92PrecoderC1EjVTB_decoder_ZN13V90Parameters10loadParamsEPcc1680_cHDLCrx_init_from_idlecadence_progress_ZN15ResamplerTimingC1EjfjffjinitV34_ZN19V90SpectralVerifierC2EP13V90Parameters_ZN18V92Phase3Modulator10genereteSuEv_ZN15K56FlexFloModem16getConstellationEP11int_complexmRxHdxEpochDetV29_set_modem_rate_ZN20V90Phase4Demodulator9detectFPEEsV27TX_ALT_COUNT_ZN10LowPassFIRIfE6designEjffPKfiFilter_350_500_aTxHdxIdleV17_hdlc_receive_between_buffers_state_ZN21V92ConvolutionEncoder14cosetMapping4DE_ZN8SineWaveIffEC1EffffV34SetINFO0aBitsFindCorrelationFilter_276_504_b_ZN13V92ParametersD1EvV27TX_FRMSIZEnull_status_tx_data_stateSetTxModeV32V29RX_SRE_PLLK1_ZN15V92BitsToSymbol7processERjPs_ZN16V92EchoCanceller5resetEvTxNoCarrierB103_Z18calculateDilLength7DilType7PcmTypeB103FP_createFPM_PPS_filterFPM_SRE_init_ZN12V90Modulator22acknowledgeCPReceptionEv_ZN18V92Phase4Modulator10generateRmEvV27RX_MRF_FILT_2400FPM_TONE_CFGRxHdxErrorV29CP_450_630_a_ZN19GenericToneDetector5resetEvVTBv32_init_ZNK21ResamplerTimingOffset18getTimingOffsetPPMEvfax_class1_delete_ZN5V90MP12evaluateInfoEvDECv17_ANGL9600TFPM_PPS_CFGRxHdxDataV27TxHdxSilenceV17RingDetector_DeleteDECv22_QMAP24vxx_processprobeFDSP_DP_Deletev29rx_controlV27RX_DEC_LAST_PHASE_4800V21RX_delete_ZN18V90Phase3Modulator13generateV92JdEvDescrambleDataV27voice_set_tx_ZN12V90PreFilter15getFilterLengthEjsetfinalrate_ZN5V92Jd10setJdPhaseEfSMCv32_encoder_tcmV32_MESGV27TX_CFG_ZN14V90DemodulatorD2Ev_ZN21V90ConstellationPowerD1EvVOICE_command_ZN13V92Parameters12setToDefaultEv_ZN22V90ConnectionEvaluator26evaluateMeanErrorStdPhase3Ef_ZNK14V90Demodulator23indicateRemoteRateRenegEv_ZN12V90Modulator8progressEPiRjPfj_ZN3AgcIfEC1Evcadence_reset_ZN20V90Phase3DemodulatorC2EP13V90ParametersP19V90SpectralVerifierjP25V90AutoDigitalImpDetector_ZN5V90MP10PrintBase2EPcmtDECv17_MAG9600T_ZNK9Resampler18getNormalizedPhaseEvCALLPROG_Createv21tx_deleteConvolve32hsine1829v27rx_controlV27RX_CRR_TABLE_2400MTK_cos_tableSDMv32_GPACRRv32_CLKDialer_IsDialStringInvalidV27RX_FSE_MU_TRAINv8_phase_rev_detectdetectorinit_Z16VPcmV34SetDelaysP12tagV34ObjectV32FP_GetCleanedSamplesFPM_log10_ZN14V90Demodulator6reInitEvcHDLCtx_preamble_state_init_ZN17ANSamToneDetectorC2Ejjfjfjjj_ZN20V90Phase3Demodulator18resetJdNotDetectorEv_ZN5V90JdD2Evmodem_get_sregDescrambleDataV32FPM_sin_table_ZN16V92EchoCanceller17updateEchoHistoryEPfj_ZN24V90ConstellationDesigner7processEjP25V90AutoDigitalImpDetectorfiP16V90MappingParamsPA128_sS5_PsPhS7_h23__tHardwareCodecTypes__j28V90SpecialSpectralConditions_ZNK19V90SpectralVerifier13freqToLeftBinEfDECv32_SIN_ROT_ANGLEDECv32_ANGL9600V17TX_PPS_SCALECodeESeq_ZN20V90Phase3Demodulator13twoLevelDemodEfRifax_class1_GetConstalationreceiver_ZN20V90Phase3Demodulator22incrementFramePositionEv_tx_scrambled_ones_init_ZN11V90DemapperC1EjP13V90ParametersP25V90AutoDigitalImpDetectorkkNormal_idle_state_initECCv32_IMAPCP_100_550_scalesV22_MRF_CFG_ZN12VPcmFloModem22copyMpInfoForInterfaceEvmodem_get_bitsclass1_state_functions_ZN22V90ConnectionEvaluator14evaluatePhase3Ev_Z17getSegmentPointer7PcmTypeiV32_SYMBOL_LENSGD_CFGMRFv32_COFFSv8_crc_ZN12VPcmFloModem13internalResetEvMTDv22_CFG_ZN8FloatFIR7processEfRxHdxIdleV29smIndexDECv32_QMAP64_ZN18V92Phase3Modulator11exitSilenceEv_ZN15V92BitsToSymbolD1Evdp_b103_exitgetConstellationMask_ZNK13V90Phase2Info9printInfoEv_ZN18V90Phase4Modulator14setSessionFlagEjFPM_SDM_descramblerFSEv32_QCOFFGetDialerConfig_ZN14V92Transmitter7processEPhjPsRjmodem_send_to_ttyV27RX_FSE_PLLK2_ZN13V90SdDetector5resetEv_ZN12V92Modulator5resetEvv29tx_messagev21rx_messageRD_ring_details_ZN9ResamplerD2EvDECv17_COS_ROT_ANGLEV34TimingHPFilterCoeff_ZN11DescramblerIhiE19resetHistoryIndexesEvcTOOLS_handle_data_output_resetdetector_set_output_statusdescrambleGPAFPM_sin_signTxNoCarrierV29_ZN17V90SpectralShaper14advanceTrellisEv_rx_look_carrier_init_ZN12V90ModulatorD2EvV21TX_modemhsine1800c1920v29rx_statusTxNoCarrierV27_ZN21ResamplerTimingOffsetC2Ejfjffj_ZN11DescramblerIiiEC1Ejjj_send_hdlc_buffer_stateScramblerOn_ZN9V92MapperD2Evdecoderv34V27TX_statusDescrambleDataV22FPM_TONE_set_freqV27RX_SRE_FILT_LEN_ZN8FloatIIR7processEPKfPfj_ZN18V90Phase4Modulator13generateRiNotEvFPM_FSD_demodulateRxHdxEpochDECv22_ANGL12_ZN15V90TRN2DesignerC2EP13V90ParametersP21V90ConstellationPowerV29RX_XB_COFFS_ZN5V92CP5resetEv_ZN15V90BitsToSymbol15resetNoSpectralEP16V90MappingParams7PcmType_ZN10LowPassFIRIfE6designEjf10WindowTypef_ZN8V92ModemD1Ev_ZN18V90Phase4ModulatorC1EP13V90ParametersjP15V90BitsToSymbolP5V90MPP16V90MappingParamsS7_P5V90CPjv17tx_processDECv32_COS_ROT_ANGLE_ZN14ModulusDecoder8progressEPhPjsilence_deleteV34XF_IndicateJdReceived_ZN24V90ConstellationDesigner14setMinMaxRatesEjjdetectRetrainReq_ZN27ParallelDifferentialDecoderIhED1Ev_ZN14V90Demodulator11enterPhase4Ev_ZN18V92Phase4Modulator9recivedEdEv_ZN11V90Demapper18updateConstelationEvV27TX_SMC_PMAPMTD4_COEF_9600FPM_SRE_recoverposHalfBaud_Bcoef_Imag_ZN12V90Equalizer29setLinearEquEdgesFadingParamsEffFPM_TONE_generateFSE_decision_32ptrxvect4_iir_filter_delete_ZN15ResamplerTiming5resetEjSetTxModeV17FAX_process_ZN5V90CP12evaluateInfoEvSetTxRate_ZN5V90MP10infoToBitsEvprop_dsp_versionGetT30FrameIDFromBufferSREv22_PLL_K1_ZN5V92JdD1EvDECv32_MAG9600Tv8handshakVOICE_process_ZN12VPcmFloModem26setMinNofTransmitSequencesEtV27TX_PPS_IFILT_4800TxHdxIdleV29ModDataB103V27TX_SMC_PMAP_48V21RX_IIR_LPF_ZN5V92Jd17unPackJdPhaseDataEiCALLPROG_DeleteTxHdxDataV29_ZN18V90Phase4Modulator15generateRdRtNotEvmodem_serrint_ZN11DescramblerIhiE7processEPKhPijTimingV34_ZN18V92Phase4Modulator10recivedSUVEvsetInitialPhase_ZN12V90RDetectorD1Ev_ZN14V92TransmitterD1EvSGD_pattern_detV27RX_FSE_PLLK2_2400chkForceBaudRateFAX_FSE_decision_ABVTBv17_QMAP32_ZN20V90Phase3Demodulator14getV90DecisionEf_ZN15K56FlexFloModemD2Ev_ZN22V90ConnectionEvaluator5resetEvc2400__ZN11V90DemapperC2EjP13V90ParametersP25V90AutoDigitalImpDetector_ZN12V90PreFilter16displayParamEia6EvSDMv32_scramblerV34XF_IndicateTrn2dReceived_Z5four1PfmiModDataV22FSEv22_decision12_ZN25V90AutoDigitalImpDetector18resetLinearMappingEvdp_wrapper_createFPM_sqrt_tableV22_S1_HC_COEFDialerCreatecid_reset_ZN14V90Demodulator14setSessionFlagEj_ZN12V92Modulator17mkResampledSignalERj_ZN8V92Modem8progressEPiRjPfjTxClockSyncV27TX_delete_ZN18V90Phase3Modulator5resetE7PcmTypeh20Phase3ModulatorStatejP5V90JdP5V92JdPK19tagV90DILdescriptorjvoice_deletebeepgen_delete_ZN27ParallelDifferentialEncoderIhED1Ev_ZN24V90SpectralShapingFilter8progressEPKs_ZN8V90Modem10printTitleEv_ZN18V92Phase4Modulator12recivedCPtagEv_ZN5V92Jd12getRatesMaskEvFPM_FSE_initFPM_iir_filt_II_ZN15V92BitsToSymbolD2EvV27RX_SRE_PLLK1DECv17_MAP_BRIDGEFDSP_Kernel_SetInternalBeepInProgressv17tx_createFAXVMI_createScrambleDataV22_ZN15ResamplerTimingD2EvVPcmV34GetMaxUpstreamRateIndex_ZN12V90RDetector8detectRfEs_ZN12V90RDetector10detectRNotEsMTD6_COEF_8000_ZN9V92Mapper5resetEshSMCv22_IMAP_2400BPSv22_local_loopFDSP_DP_RunVTBv32_IMAP128SREv32_yCLOCKK56FLEX_SessionTerminationTxHdxABV29V22_FSE_freev8_phase_rev_init_ZN10GenericIIRIfdE7processEPKfPfjVPcmV34SetIndicationOfRemoteRetrain_ZN11V90Demapper25incrementRBSFramePositionEv_ZN5V92CP6setSUVEj_ZN5V90JdC1EP13V90Parametersfax_class1_commandV29TX_PATTERN_SCR1_look_forVTBv32_QMAP128_ZNK12V90PreFilter13isV90WithEia6EvFAX_FSE_decision_128ptRxHdxPrtcolV27TONE_generate_ZN12V90Modulator11exitJdPhaseEvscale3000SGD_statusposHalfBaud_Acoef_ImagV34EchoFilter_ZN24V90ConstellationDesigner4maxKEP16V90MappingParamsSGD_CTLv27rx_delete_ZN14V92TransmitterC2EvputFrame_ZN12V92Modulator11enterPhase4Evdefault_voice_configuration_ZN12V90ResamplerC1EjfjfP13V90ParametersfjCP_100_550_a_ZN12V92PreFilterD1Ev_ZN9ResamplerC2EjfjfjCRRv17_PLL_K1_SxyzModDataV32_ZN18V92Phase4Modulator30recivedPartOneSilenceRrnSUVtagEv_ZN12VPcmFloModem16setV34BaudForV90EvTxHdxToneV8_V21_reset_ZN9ResamplerC1EjfjPfj_ZN12VPcmFloModem11runPcmModemEPfS0_jPiS1_S1_S1__ZN11V90Demapper20resetLinearMappStudyEj_ZN12V90PreFilter12setParamEia6Ev_ZN12VPcmFloModem18setTerminateJaFlagEh_ZN20V90Phase3Demodulator13JdNotDetectorEi_ZN15ResamplerTimingC2EjfjffjevaluateRxJMSequenceConvolve16_ZN5QueueIfE5resetEv_ZN18V92Phase4Modulator14generateSymbolEv_ZN24V90ConstellationDesigner5resetEvV27TX_MESG_ZN5V90Jd10unPackDataEidpskinit_ZNK19V90SpectralVerifier14freqToRightBinEf_ZN13V90ParametersC1EP19_tagModemParametersV27TX_PPS_IFILT_2400_ZN18V90Phase4Modulator11generateB1dEvFPM_SMC_encoderDetect_Rmloop2_ACKmemcpy_ZN15ResamplerTimingD1Ev_ZN20V90SignBitsExtractorD2Ev_ZN11V90Demapper7processEPhRjV27RX_XB_COFFS_2400_ZN25V90AutoDigitalImpDetector13updateUrefAltEvfltTable1_ZN13V90Parameters19loadModemParamsDataEv_ZN12V92PreFilter5resetEv_ZN12V90PreFilter13refLoopsType2Eeur_coef_ZN20V90Phase4Demodulator14getV90DecisionEsV17RX_modemV29RX_XCLOCKSMCv17_CFGv34setuptxmitVTBv32_QMAP32_ZN18V90Phase3Modulator13generateJdNotEv_ZN25V90AutoDigitalImpDetectorD1Ev_ZN14V90Demodulator14enterDataPhaseEvv22_retrain_ZN14ModulusDecoderC2Ev_ZN8FloatFIRC1EjPfj_ZNK22V90ConnectionEvaluator11printStatusEvMTK_sin_signV29TX_SMC_SINE_ZN15V92BitsToSymbol19setSymbolsBlockSizeEjtxmitdibitVPCMXF_DeleteDECv17_ANA_QMAP128FPM_MRF_free_ZN14V90Demodulator8progressEPiRjPfj_ZN21ResamplerTimingOffsetD1Evv8_tone_detect_ZN8FloatIIR15setCoefficientsEPfjFPM_AGC_Release_ZN8FloatIIR5resetEvV34EchoPreFilterCopy_ZN12VPcmFloModemD1EvVPcmV34InitMOHV27RX_SRE_PLLK2_4800_ZN5V90JdD1EvV29TX_PPS_SCALEDECv17_MAG7200create_cidVPcmV34GetSNR_ZN18V92Phase4Modulator27generateDataSymbolBeforeFPEEvTxHdxStartB103SREv32_PLL_K1_ZN18V92Phase4Modulator13generateRuNotEvFSEv32_decision_ZN12VPcmFloModem18qcLineVerificationEPfS0_jPiS1_S1_S1_QualityDetectV29_ZN15V90TRN2DesignerD2EvFAXVMI_processV22_FSE_getdiag_ZN14ModulusEncoderC1Ejjjjjjj_Z15retrainDetectorP17tag_retrainReqDetPsiV17RX_CTLV29RX_DEC_ANGLESetToneDetect_ZN5V90Jd12getRatesMaskEvVOICE_delete_ZN8V90Modem5resetEjV8Process_ZN25V90AutoDigitalImpDetector16setMaxUcodeArrayEPhV27RX_CTL_ZN21V92ConvolutionEncoder25makeStateTtransitionTableEvFAX_FSE_decision_32ptposHalfBaud_Bcoef_Realv8_mpyint_ZN5V92JdC2EP13V90Parameters_ZN20V90Phase3DemodulatorD1EvMTDv22_COEFCP_350_600_b_ZN11DescramblerIhiEC1Ejjj_ZN13V92Phase2InfoC1EP13V92ParametersRxHdxNullV27_MTD_COEFF_2400cid_value_ZN11V90Demapper27printErrorHistogramAndResetEv_ZN5V92Jd10getJdPhaseEv_ZN22V90ConnectionEvaluator20indicateLocalRetrainEvVPCMXF_SessionTerminationdtmf_set_easyrxtiminginit_ZN9ScramblerIihE5resetEiDemodDataB103scrambleGPCcHDLCtx_off_ZN5V90CP7calcCRCEv_ZN12V90Equalizer23calcMeanErrorStatisticsEvGetSignalQualityposHalfBaud_Acoef_Real_ZN19GenericToneDetector7processEf_ZN14ModulusEncoderC1EvV29RX_FSE_PLLK2c1867MRFv22_COFFSscrambleGPADual_TONE_create_ZN15K56FlexFloModem17getK56MPsReceiverEvDECv17_IMAP16_ZN12V92PreFilter15setCoefficientsEPfS0_jjdp_call_exitRD_createDECv17_IMAP4V34EqualizerUpdateDelayLineV92deleteFilterCoefficients_ZN13V92Phase2Info12setToDefaultEvv22_originateprobeselect_ZN5V92CPC1EvVPcmV34GetCurrentRxBaudRatev8StatusNamePulseDialDigitVPCMXF_CreateTxNoCarrierV32_ZN8FloatIIRC1EjPfjSMCv17_encoder_dif_ZN15V90TRN2Designer13V90TRN2DesignEP16V90MappingParamsPA128_sS3_PA128_hPs7PcmTypeS7_sPhjh28V90SpecialSpectralConditionscid_thresholdSMCv32_CFG_ZN15V90TRN2DesignerC1EP13V90ParametersP21V90ConstellationPowerV29RX_FSE_IFILTv27rx_create_delete_data_rx_modemfax_class1_createFAXVMI_STSV17RX_statusV22_SRE_initIsDialStringInvalidMRFv17_COFFS_ZN21V92ConvolutionEncoder10inverseMapEPik56FlexPhase34_ZN22V90ConnectionEvaluator30updateCurrentConstellationDataEsfffFAX_createv21tx_createv17rx_create_ZN18V90Phase4Modulator10generateRfEvV92createConstellations_ZN12V92Modulator15exitTRN1uSecondEv_ZN18V92Phase4Modulator13generateTRN2uEvv8_fskmodulate_ZN18V92Phase4Modulator13resetBeforFPEEvVPcmV34Progressdata_rawFAX_class1_commandBwChDem_CreateTxHdxIdleV21_ZN5V90MPD1EvTxHdxEQCondV29FPM_FSD_init_ZN20V90SignBitsExtractorC1Evmodem_recv_from_ttySMCv32_IMAP16_ZN21V92ConvolutionEncoder5resetEi_ZN5QueueIfED1EvSeedScramblerV29V32FP_modemV21RX_CFGV34EchoReportCoeffV27TX_PPS_QMAP_ZN3Psd16setOverlapLengthEj_ZN15K56FlexFloModem17getResamplerPhaseEP11int_complexmGenerateAnsToneGenEQTrnSequenceV27DECv17_QMAP4RxHdxPhsReversalbpv22high_ZN18V90Phase4Modulator11generateCPdEvMTD2_COEF_9600VPcmV34IndicateRemoteRRN_ZN11V92PrecoderC2EjVTB_BOUND_9600_ZN24V90ConstellationDesigner14spectralDesignEj28V90SpecialSpectralConditionssilence_progressV21TX_deleteQualityDetectV17RxHdxIdleV21dp_call_initDECv32_IMAP16_ZN15V92BitsToSymbolC1EjP13V92Parametersv8_ansamgenerate_ZN12V90Equalizer10getDfeBetaEvalaw2ulaw_ZN25SerialDifferentialDecoderIiE7processEiFP_Pow_ZN5V92Jd15setMaxLookaheadEh_ZN24V90SpectralShapingFilter14setFilterCoeffEffffV21RX_status_ZN15V90TRN2DesignerD1Ev_ZN18V90Phase3ModulatorC2EP13V90Parametersj_ZN18V90Phase4Modulator6exitRiEvVPcmV34GetCurrentTxBitRatedp_v8_initv34handshakinit_ZN18V92Phase4Modulator27recivedPartOneSilenceRrnSUVEvv90RateRenegSilenceCRRv32_PLL_K1c1600_ZN25V90AutoDigitalImpDetector25calculateLinearMeanAndVarEssjSMCv17_ABS4_ZN9V90MapperC1EP13V90Parameters_Z6sqrSumIfET_PS0_jV21RX_controlv17rx_delete_ZN18V92Phase3Modulator12exitSuSecondEv_ZN12VPcmFloModem18setTerminateCpFlagEh_ZN18V90Phase4Modulator14setRdRtSymbolsEP16V90MappingParams_Z4meanIfET_PS0_jFPM_FSE_CFGV34ModulatorProcess_ZN18V90Phase3Modulator10generateSdEvV32RxHdxModemV34PremptxCopy_ZN13V90Parameters12setToDefaultEvGetSNRV27V27RX_MRF_UPV21_CHAN1_MTD_COEFFV8SetMessageV29RX_DEC_IMAPV21TX_CTLnull_processnull_messagedtmf_testV17TX_control_ZN25SerialDifferentialEncoderIhE7processEh_ZN13V90ParametersC2EP19_tagModemParameters_ZN5V90CP5resetEvFAX_deletev17rx_statusRetrainDetectV32_ZN5V92CP8resetCRCEv_ZN21V92ConvolutionEncoderC1EvRxHdxStartV27RxHdxSequence_ZN18V92Phase3ModulatorD2EvVparser_read_intgridVPcmV34InterpretMohMessageBits_ZN18V90Phase4Modulator30recivedPartTwoSilenceRrnSUVtagEvV27RX_deleteB103_BPF_CALLER_ZN21ResamplerTimingOffsetD0Ev_ZN19GenericToneDetectorD1EvV27RX_FSE_IFILT_4800_tx_nulls_statemodem_dp_registerCarrierDetectV29V27RX_FSE_MU_TRACKSGD_sequence_detvxx_createV32FP_recreateAUTOCOR_COEF_9600_ZN24V90ConstellationDesigner5calcKEjPf_ZN15V90TRN2Designer4maxKEP16V90MappingParamsV92setParamsInfoFromCPUnPckMTDb103Org_CFG_ZN3Psd7processEPfjS0_NS_12OutputOptionE_a2u_ZN18V92Phase3ModulatorC2EP13V92Parameters_ZN15K56FlexFloModem13externalResetEvV34XF_GetMaxUpstreamRateIndex_ZN18V90Phase4Modulator9exitMPNotEvTxHdxEQCondV17SDM_descramblerquarter_ZN5V92CP10bitsToInfoEhscaleVectorV29TX_SMC_IMAPV27TX_controlV34Filter2cid_freq_samplRD_processVTBv17_IMAP64VPcmV34GetDiagnostics_ZN5V90Jd15getMaxLookaheadEvFSEv17_QCOFF_ZN12V90PreFilter18preFilterCoefType3E_ZN15K56FlexFloModemC1EPviP19_tagModemParameters_ZN24V90SpectralShapingFilterC1Evvoice_duplex_ZN12V90PreFilter13refLoopsType1EV32FP_GetDiagnostics_ZN20V90Phase4Demodulator14enterWaitForEdEvfComputeRMSValueFloatBuf_ZN21ResamplerTimingOffsetC2EjfjPffjMTD6_COEF_9600_ZN15V90BitsToSymbol5resetEP16V90MappingParams7PcmTypecadence_delete_ZN9ScramblerIhhED1EvV27TX_PPS_QMAP_2400txinitV29RX_FSE_PLLK1_ZN11DescramblerIhiE7processEhRxDetMarkB103getFrameFIFO8_create_ZN5V90CP10bitsToInfoEhMTD7_COEF_9600FPM_TONE_detectgetTimingOffsetv17rx_process_ZN9V92Mapper7processEPh_ZN20V90SignBitsExtractorC2Ev_ZN18V92Phase4Modulator11generateB1uEv_ZN24V90ConstellationDesigner19determineDminForRrnEjCP_276_504_bSetRxLoopsV32RxTrained1200_ZN8V90ModemD1Evdp_v8_exitV17TX_modemV27TX_PPS_FILT_LEN_ZN8V90Modem14setSessionFlagEj_ZN21V90ConstellationPower18averagePowerLimitsEV32_S_COEF_ZN21ResamplerTimingOffsetD2Ev_ZN18V92Phase3Modulator14generateSymbolEv_ZN15K56FlexFloModem14setMinMaxRatesEii_ZN11V92Precoder15setCoefficientsEPfS0_jjSignalDetect_delete_data_tx_modem_ZN21V92ConvolutionEncoder7processEPiV29_MTD_COEFFVTB_BOUND_12000pow10TableDECv22_IMAP24vxx_controlAGC_DEF_ALPHA_v21_ZN12V90ResamplerC1EjfjPfP13V90ParametersfjFPM_MTD_CFGSMCv22_QMAP_1200BPSV27RX_statusv8_dftenergyCRRv17_CLKSMCv17_IMAP4B103AnswerNextStateTxNoCarrierV21_ZN11DescramblerIiiE19resetHistoryIndexesEv_ZN9ScramblerIhhE7processEhdemapFrameV29RX_modemtone_detect_Z8blackmanIfEvPT_jV8agcV8Control_ZN21V90ConstellationPowerC2EvGetT30FrameNameByID_ZN14ModulusDecoderC1EjjjjjjjV27TX_PPS_QFILTTxClockSyncV32_ZNK12V92Modulator19getV92TxFilterDelayEv_ZN25V90AutoDigitalImpDetector21isThereAnyAltRbsPhaseEvRcFixed_Resample_ZN12V90Equalizer11enterPhase3Ev_ZNK19V90SpectralVerifier13printSpectrumEvVPcmV34SetV90RateReneg_ZN12V90RDetectorC1EP13V90ParametersV34agc_ZN18V90Phase4Modulator27generateDataSymbolBeforeRRNEv_ZN12V90PreFilterD2Ev_ZN17V92ModulusEncoder8progressEPhPjv29tx_controlv21rx_controlDECv32_QMAP16_ZN5V90CPC2Ev_ZN12VPcmFloModem21setTerminateCpNotFlagEhmodem_debug_log_data_ZN3PsdC2Ej10WindowTypej_ZN18V92Phase4Modulator17recivedFirstRrnEdEvnegHalfBaud_Acoef_RealRD_deletec1200_V29RX_CFGfaxvmi_frame_reverseDescramblerOnFIFO_writeTONE_createRxHdxIdleV27_ZN12VPcmFloModem13externalResetEvV8GetMessagehsine1959V21TX_createv27rx_processRxHdxIdleV17_ZN15ResamplerTiming21adjustHalfBaudBpfGainEf_ZN9ScramblerIhhE19resetHistoryIndexesEv_ZN18V92Phase3Modulator13genereteSuNotEvV27RX_YCLOCK_2400V29TX_CTL_ZN19V90SpectralVerifierD2Evdsplibs_debug_printfV8Delete_ZN14V90Demodulator8enterFPEEv_ZN12VPcmFloModemD2Ev_ZN24V90ConstellationDesigner19calcMtoMatchKtargetEff_ZN27ParallelDifferentialDecoderIhE5resetEjhv29tx_statusv21rx_status_ZN25V90AutoDigitalImpDetector28calculateLinearMeanAndVarAltEsjvoice_set_onlineMTDv22_CFG2_ZN14V90DemodulatorD1EvV27RX_CRR_TABLE_LENV22_statusFSEv22_CFGFilter_276_504_aFPM_block_update_ZN12V90Equalizer17loadCoefsFromFileEv_ZN8V92ModemC1E12V92ModemSideP19_tagModemParametersjP19tagV90DILdescriptor20V92ComputationalModeV29RX_delete_ZN10GenericIIRIfdE5resetEvcadence_createTxHdxCarrierStateMTD7_COEF_8000c1646FPM_cos_signdisplaySpectralParams_Z22V92DILdescriptorPackerP19tagV90DILdescriptorPhPifComputeRMSValueShortBufalaw2linearsysdep_memsetV27TX_SMC_CRR_ADJ_ZN8FloatIIRD2EvSetPulseMakeTimeFAX_FSE_decision_16ptV21RX_create_ZN12V90PreFilter13autoSelectionEvSDMv27_CFG_ZN15ResamplerTimingC1EjfjPffj_hdlc_receive_look_carrier_stateV22FP_create_ZN21ResamplerTimingOffsetC1EjfjPffjV34TimingIIR_Acoef_ZN18V92Phase4Modulator27generateDataSymbolBeforeRRNEvtoneiir_configuration_allpass_ZN14V90DemodulatorC1EjP13V90Phase2InfoP5V90JdP5V92JdP19tagV90DILdescriptorP16V90MappingParamsS9_P22tagV90AdditionalCPinfoP5V90CPP5V90MP23__tHardwareCodecTypes__P13V90Parameters20V90ComputationalModej_ZN12V90Equalizer13printEquStuffEvFIFO8_deleteV29RX_SRE_PLLK2V29RX_eq_trainFPM_SDM_initV29RX_controlReadGTimer_ZN9ScramblerIhhE15copyHistoryTailEvDemodDataV22V34EchoAdapt_ZN25V90AutoDigitalImpDetector11findPadGainEvfltTable_1V34TimingPrefilter_ZN5V90MP13resetDetectorEv_ZN12V90PreFilter13refLoopsType6E_ZN20V90SignBitsExtractor16applyFrameActionENS_7ACTIONSEPhS1_SetAdaptEqV32reset_dtmftxmitquadbit_ZN21V90ConstellationPower21calcModulusParametersEP16V90MappingParamsshellDemappercosreadulaw2linear_ZN24V90ConstellationDesigner12constelBuildEssMTD3_COEF_9600v27rx_status_ZN13V92ParametersD2Evnull_control_ZN18V90Phase3Modulator10generateJdEvV22_MESG_ZN25V90AutoDigitalImpDetector26updateLinMappMeanAndVarAltEssV21RX_CHAN1_INTRPV34EchoEstimateDelayLineEnergyV34EqualizerCenterAdapt_ZN18V92Phase4Modulator9exitTRN2uEv_ZN21V90ConstellationPower8getPowerEP16V90MappingParams26V90TxPowerMeasurementPoint7PcmTypeDECv32_MAG14400StoreReg_ZN12V92ModulatorC1EjP13V92Phase2InfoP5V92JaP19tagV90DILdescriptorP5V92CPP16V92MappingParamsP13V92ParametersTxHdxFinishFrame_ZN11V90Demapper5resetEP16V90MappingParamsTxHdxABV17_ZN9ScramblerIhhE14processAllOnesEPhjV17RX_MESG_ZN16V92EchoCanceller13setEchoParamsEffj_ZN13V90SdDetectorD2Ev_ZN20V90Phase4Demodulator14getV92DecisionEs_ZN12V90Modulator6exitRiEv_ZN14V90DemodulatorC2EjP13V90Phase2InfoP5V90JdP5V92JdP19tagV90DILdescriptorP16V90MappingParamsS9_P22tagV90AdditionalCPinfoP5V90CPP5V90MP23__tHardwareCodecTypes__P13V90Parameters20V90ComputationalModejc1959_ZN18V90Phase4Modulator17generateV90SymbolEv_ZN5V90CP8resetCRCEv_ZN12V90Equalizer5resetEjV27TX_PPS_SCALEV23ModemMain_ZN18V92Phase4Modulator11generateE1uEvmodem_get_paramRestore_rateV17_ZN5V90MP7calcCRCEv_ZN16V92EchoCancellerD1EvSDM_scrambler_ZN18V90Phase4ModulatorD2Ev_ZN19GenericToneDetector7processEPfj_ZN9FloatARMA5resetEvdecisionSREv32_PLL_K2CarrierDetectV21SMC_init_ZN14ModulusDecoderC1EvV29TX_SMC_COSINEV27RX_FSE_QFILT_2400aReversedCharsArraydp_param_getGetRateV32VPcmV34GetCurrentSessionDPV27RX_FSE_QFILTV32StateName_tx_scrambled_ones_stateSREv17_PLL_K1_S_ZN15V90BitsToSymbolD1EvV32_CONNECTRxHdxDataV17v8_agcadaptTrellisTransitionTableV34XF_GetRTD_ZN5V90CPD1Ev_ZNK19V90SpectralVerifier23getSpectrumOfNearestBinEfVPcmV34Createdp_v23_exit_ZN13V92ParametersC1EP19_tagModemParametersFilter_100_550_bv8_detectorinitCreateV23ModemVPcmV34GetCurrentRxBitRateV29TX_SMC_QMAPFSE_decision_16Tpt_ZN18V90Phase4Modulator14generateSymbolEvVPcmV34ReportMiddleOfEchoAdapt_ZN12VPcmFloModem14setPhaseIIinfoEPiinegHalfBaud_Bcoef_ImagRateToSeqdata_formatted_outputsetCodecConstellationMask_Z16setDilDescriptorP19tagV90DILdescriptor7DilTypeAGCv29_CFG_ZN18V90Phase4Modulator13recivedSUVtagEv_ZN20V90Phase3Demodulator23clearVerificationStatusEvpreempindexV34XF_IndicateK56FlexJdReceived_ZNK19V90SpectralVerifier16getSpectrumOfBinEmv8_rxreadqueueV22_MRF_filterV34GiveINFO0dBitsmodem_set_paramV27TX_PATTERN_SCR1rxinitFPM_FSM_CFG_ZN13V90ParametersD2EvFSEv32_ICOFFV34XF_IndicateDilReceivedbeepgen_start_beepRxHdxDataV21Filter_350_500_b_ZN15V92BitsToSymbolC2EjP13V92Parameters_ZN18V92Phase3Modulator5resetEs23V92Phase3ModulatorStatejP5V92JaPK19tagV90DILdescriptorj_ZN5V90CP11evaluateCRCEvv27tx_createV21TX_CFG_ZN5V92CPD1Ev_ZN12V90Equalizer8enterFPEEv_Z7hammingIfEvPT_jRxHdxErrorV17V22_FSE_receiveFPM_TONE_filter_ZN12V90Equalizer16setLinearEquBetaEf_ZN5V90CP13resetDetectorEvV29RX_SRE_FILTFPM_FSE_receive_Z17print_echo_coeffsPfj_ZN8FloatFIRC2EjPfj_ZN17V90SpectralShaper7processEPsPhS0_V27RX_FSE_FILT_LEN_ZN9Resampler8resampleEPKfjPfRjVTBv17_QMAP128_ZN22V90ConnectionEvaluatorD2Ev_ZN5V90MP18calcSequenceLengthEvV32_CTL_ZN25V90AutoDigitalImpDetector35uniteLinMappInfoOfUnsuspectedPhasesEhSDMv27_initRxNextStateV17notch_filterV27TX_PPS_IMAP_4800_ZN8V90ModemD2EvRingDetector_ProcessVPcmV34GetVisualDiagnostics_ZN12VPcmFloModem6getDFEEP11int_complexmB103FP_delete_ZN18V92Phase3Modulator13generateRuNotEvCRRv22_PLL_K2_ZN18V90Phase4Modulator27recivedPartOneSilenceRrnSUVEvDECv32_ANGL12000TxNoCarrierV17v27tx_status_ZN18V90Phase4ModulatorD1EvdftfreqinitCID_create_ZN8V92ModemD2EvSMCv32_MOD_ZN12VPcmFloModem11enterPhase3EvTxHdxDataV27_ZN5V90Jd8resetCrcEv_ZN5V90MP5resetEv_ZN9FloatARMAC1EjjPfS0_j_ZN12V92Modulator11enterPhase3EvFSEv17_ICOFF_ZN12VPcmFloModem13getUinfoValueEsV27TX_PPS_QMAP_4800_ZN9V90Mapper15resetNoSpectralEP16V90MappingParams7PcmType_ZN15V90BitsToSymbolC2EjP13V90Parameters_ZN13V90SdDetectorC1EfffjPPSv22_CFG_ZN25V90AutoDigitalImpDetector18setQcLinearMappingEv_ZN18V92Phase4Modulator11generateE2uEvVOICE_create_Z18calculateDilLengthP19tagV90DILdescriptor7PcmType_ZN3PsdD2EvCodeFinalRateSeq_ZN12VPcmFloModem17setPcmSessionTypeEi_rx_data_state_ZN12V92Modulator7exitCPtEvRxNextStateV27_ZN18V92Phase3ModulatorC1EP13V92ParametersGetSNRV21_ZN21V92ConvolutionEncoderC2EvTxHdxSilenceB103v23FP_rx_create_ZNK14V90Demodulator8getAT_UDEP21TAG_DiagnosticResultsSetEncoderV17DECv32_IMAP4_ZN5V92JdC1EP13V90Parameters_hdlc_receive_statedcr_reset_ZN15V90BitsToSymbolC1EjP13V90Parameterscheck_for_validPPSv17_QCOFFSFPM_AGC_Freezetoneiir_progress_ZN25V90AutoDigitalImpDetector23updateLinMappMeanAndVarEss_ZN3AgcIfE7processEPKfPfjDescrambleDataV29_ZN15K56FlexFloModem17getDecisionErrorsEP11int_complexmV27TX_SMC_PMAP_24_ZN5V90CP10infoToBitsEv_ZN9V92MapperC1EvRxHdxScramV17_ZN9ScramblerIhiED1Evsilence_is_more_thenV27_MTD_COEFF_4800AGCv21_CFGV29TX_PPS_QFILTbeepgen_get_freqsCP_450_630_scalescheckSignalStabilityfaxvmi_asyc_packV27TX_PPS_QFILT_2400_ZN9FloatARMAC2EjjPfS0_jV29TX_createDataCarrierDetectV27BwChDem_Deletesysdep_memcpyV22FP_delete_ZN25V90AutoDigitalImpDetector30unSuspectedPhaseNearestLinMappEss_ZN25V90AutoDigitalImpDetector17setConnectionTypeEs_ZN20V90Phase3Demodulator11getMaxUcodeEvprop_dp_initV34EchoCleanUpV32FP_control_ZN13V90Phase2InfoC1EP13V90ParametersRxTrained2400_ZN12V90PreFilter18preFilterCoefType2E_ZN13V90SdDetector7processEfCRRv17_PLL_K1_ZN5V92Jd12setRatesMaskEiCRRv17_PLL_K2setScramble_ZN25V90AutoDigitalImpDetector21resetStudyUrefHandlerEjV32RngInitNextStatekkInverthsine1867B103_CTL_ZN18V92Phase4Modulator21resetRRNSecondSectionEvV27RX_SRE_FILTnegHalfBaud_Acoef_Imagv8_getbitPPSv17_ICOFFSFSEv22_COFFSSREv32_XB_COFFS_ZN12V90RDetectorC2EP13V90Parameters_ZN11V92Precoder5resetEP16V92MappingParams_Z10float2BitsfPsivoice_set_rxFPM_lmsupd2_ZN11V92PrecoderD2Ev_ZN5V92Jd14setConstelSizeEhhB103_MRF_FILT_RXdp_v22_init_ZN18V90Phase3Modulator17resetDILGeneratorEPK19tagV90DILdescriptorRxHdxEpochDetV17RcFixed_Check_CombinationRxHdxToneV34TimingFiltersInit_ZN5V92Jd15getMaxLookaheadEvmodem_put_bitsScrambleDataV29_ZN20V90Phase4Demodulator14enterWaitForMPEvPPSv32_CFGTONE_filter_ZN20V90Phase4DemodulatorC2EP16V90MappingParamsS1_P11V90DemapperP5V90CPP5V90MPP11DescramblerIhiEP22V90ConnectionEvaluatorP13V90ParametersP20V90Phase3DemodulatorP25V90AutoDigitalImpDetectorjfaxvmi_write_framesilence_create_ZN9ScramblerIhiE19resetHistoryIndexesEvcid_get_stringsDataCarrierDetectV17scale2400VPcmV34IndicateLocalRRN_ZN22V90ConnectionEvaluatorC2EP13V90Parameters_ZN9FloatARMA7processEPKfPfjsysdep_sprintfFAXVMI_statusV17TX_CFGResetRxDECv32_QMAP4RxHdxWaitV21RxHdxData_Z17VPcmV34SetTimeOutP12tagV34Objectivoice_modem_rx_look_carrier_stateRcFixed_Resetl2thresh_ZN18V90Phase3Modulator17generateV92SymbolEvSMCv17_PMAP4SMCv17_encoder_tcmV27RX_MRF_DOWN_ZN3AgcIfE5resetEvVPcmV34GetCleanedSamples_hdlc_receive_state_initv17tx_status_ZN24V90ConstellationDesigner17findMinValueIndexEP16V90MappingParams_ZN12V90Modulator11initiateRRNEvCP_100_550_b_ZN24V90ConstellationDesigner18findNextUcodeToAddEPhhPA128_sS2_PsPA128_hModDataV29_ZN16V92EchoCanceller7processEPfS0_jTxHdxQuietV27V92deleteConstellations_ZN11V90Demapper18linearMappingStudyEssDeleteV23ModemCRRv22_PLL_K1band_passv23FP_tx_deleteFAXVMI_controlECC_CFGtoneiir_create_ZN20V90Phase4DemodulatorD2Ev_ZN9ScramblerIihEC1Ejjj_ZN5V90Jd14setConstelSizeEhh_ZN14V90Demodulator24enterChannelVerificationEss_ZN8SineWaveIffED1EvV32NextState_ZN15V90BitsToSymbol18nofBitsForNextTimeEvV27RX_create_ZN18V90Phase4Modulator10recivedE2uEvdtmf_progressVTBv32_QMAP16TgetCodecConstellationMaskV27RX_decision_handle_hdlc_input_close_ZN20V90SignBitsExtractor5resetEjj_ZN3AgcIfE6freezeEvDetect_1sB103NextStateintcoef1v8_ansaminit_ZN12V90PreFilter16getFilterPointerEjVPcmV34ReportStartOfEchoAdaptv8_rxinitSDMv32_GPClinear2ulaw_put_silenceVPcmV34GetCurrentRxCarrier_ZN12V90Modulator14enterDataPhaseEv_ZN14V92TransmitterC1Evvoice_set_duplex_ZN12V90Modulator11enterPhase3Ev_ZN12V90Resampler19getTimingHistoryStdEv_ZN12V90RDetector5resetEjjModDataV17V34XF_GetProbeResultsPtrfaxvmi_hdlc_unframe_ZN5V92CP11evaluateCRCEv_ZN12V90ResamplerD0Evsysdep_strcpypowTxHdxStartV27_ZN25V90AutoDigitalImpDetector17determineMaxUcodeEs_ZN12VPcmFloModem12getV90CpBitsEPs_ZN15ResamplerTimingD0EvV21RX_modem_ZN18V90Phase4Modulator16setMappingParamsEP16V90MappingParams_ZN18V92Phase3Modulator10generateRuEvRxClampV22FPM_iir_filt_blockFPM_MTD_createdftupdateTxHdxDataB103DECv17_MAG12000fskdetectTxHdxDataV17_ZN18V90Phase3Modulator17generateV90SymbolEv_ZN15K56FlexFloModem18getLinearEqualizerEP11int_complexmDECv17_MAG14400SREv22_COFFS_ZN12V90RDetectorD2Ev_ZN8V90Modem8progressEPiRjPfjsetParamsInfoFromCPUnPck_ZN12V90Equalizer7processEPfjPsS0_Rj_ZN21V92ConvolutionEncoderD2Ev_ZNK13V92Phase2Info9printInfoEv_ZN19V90SpectralVerifier17startAccumulationEv_ZN8V92ModemC2E12V92ModemSideP19_tagModemParametersjP19tagV90DILdescriptor20V92ComputationalModeinitG248FDSP_DP_Create_ZN12VPcmFloModem18getLinearEqualizerEP11int_complexmdatapumpv34_ZN18V92Phase4ModulatorC1EP13V92ParametersP15V92BitsToSymbolP5V92CPP16V92MappingParams_ZN9ScramblerIhiEC1EjjjAGCv22_CFG2modulatevector_ZN13V90Parameters4initEvTxHdxScrSequenceRxHdxStartV17_ZN15ResamplerTiming11invertPhaseEv_ZN24V90SpectralShapingFilter5resetEvV29RX_createFPM_TONE_find_revV34EchoUpdateDelayLine_ZN20V90Phase3Demodulator7exitDILEv_ZN12V90Equalizer18linearEquFadeEdgesEvv23FP_rx_delete_ZN14V90Demodulator8enterRRNEvv21tx_statusV17TX_MESGV29RX_CRR_TABLESMCv32_PMAP16v17tx_deletefaxvmi_simp_packSetAdaptEqV22Get_Detection_Threshold_Table_ZN12V90EqualizerC2EjjP20V90Phase3DemodulatorP20V90Phase4DemodulatorP11V90DemapperP22V90ConnectionEvaluatorP19V90SpectralVerifierP13V90ParametersP12V90ResamplerP12V90PreFilter20V90ComputationalModeTONE_detectDECv32_ANA_QMAPkTable_ZN12V90Modulator25acknowledgeCPNotReceptionEv_ZN22V90ConnectionEvaluator14updateAvePdsnrEfjagcadapt_ZN5V92Jd19getJdPhaseBitVectorEv_ZN12V90PreFilter9setFilterE17PreFilterCoefTypejhsine1600_ZN12V90ResamplerD1Ev_ZN5V92CP10infoToBitsEvFPM_circ_dotp2_ZN21V90ConstellationPowerD2EvSREv17_PLL_K1biquad_filterCalcTurnAroundDelayV27RX_FSE_PLLK1_2400FPM_MTD_delete_ZN10GenericIIRIfdEC1EjjPdS1_jDemodDataV27MTD8_COEF_9600FAXVMI_deleteDecodeRateSeqV27TX_createSGD_symbol_genfaxvmi_asyc_unpacktoneiir_resetV32_PROTOCOLSREv22_PLL_K2B103_CHAN_INTRPVPcmV34InitiateRateRenegotiationV34GiveINFO1aBitsCID_deletekLookup_ZN24V90ConstellationDesigner19constellationDesignEfPA128_sS1_PsPhS3_PA128_h_Z3sumIfET_PS0_jv8handshakinit_ZN21V92ConvolutionEncoder16subsetLabelTableESREv22_xCLOCK_handle_hdlc_input_openTxNextStateV21CALLPROG_Dialfaxvmi_hdlc_framedp_wrapper_rundp_vpcm_exitScrambleDataV17_ZN12V90EqualizerD2Ev_ZN11DescramblerIiiE15copyHistoryTailEvV32FP_deleteFPM_MRF_filterV17TX_SYM_SIZEFPM_MTD_detect_ZN18V90Phase4Modulator18recivedFirstRrnE2uEvFSEv22_decision24_ZTV15ResamplerTiming_ZN5V90Jd12setRatesMaskEi_ZN16V92EchoCanceller11setEchoBetaEfV29RX_FSE_QFILTnotchbeepgen_start_dtmfLastPulseDigitDialed_ZN27ParallelDifferentialEncoderIhEC1Ej_ZN20V90Phase3Demodulator22enterWaitForANSpcmDropEvCP_350_600_adata_unformatted_output_ZN14V90Demodulator5resetEjTONE_deletedetector_set_output_in_streamcTOOLS_handle_hdlc_outputConvolve64V27RX_CRR_ADJUST_ZN20V90SignBitsExtractor7processEPhS0__ZN9V92MapperD1Evcid_delete_ZN5V92CP7calcCRCEvV8_setFiltersv8_TONEq_generate_ZN20V90Phase4Demodulator15trn2dKnownDemodEs_ZN5V90Jd8packDataEvMTD5_COEF_9600Filter_276_504_scalesGetFP_Value_ZN12V92Modulator12exitSuSecondEvV22FP_GetDiagnostics_ZN11V90Demapper12hardDecisionEs_ZN5V90Jd19getConstelationSizeEPhS0_FPM_TONE_set_scale_ZN19GenericToneDetectorC2EjjPdS0_jjfjfjjDECv17_QMAP16fix_LPFV27RX_DEC_PMAP_4800B103FP_modemV21RX_CTLv8_copycoeff_ZN8FloatFIRD1EvcostblV34descramblerv90Phase34_ZN9ResamplerC2EjfjPfj_Z24VPcmV34SetMinMaxBitRatesP12tagV34ObjectFSE_decision_16pt_ZN12V90Resampler5resetEvTxHdxStartV29CarrierDetectB103_ZN25SerialDifferentialDecoderIhE7processEhV29RX_MRF_FILTFIFO_full_test_ZN25V90AutoDigitalImpDetector26addReceivedSampleToStorageEshf_ZN18V92Phase4Modulator11generateCPtEvbinaryTablev8_cosread_ZN18V92Phase4Modulator5resetEsh23V92Phase4ModulatorStatejj_ZTV12V90ResamplerDescrambleDataV17SMCv22_PMAPInitGenSequencefax_class1_progress_ZN12V90Modulator21acknowledgeEReceptionEvmodem_dp_deregister_ZN13V90SdDetectorC2EfffjDECv17_ANA_QMAPDECv17_ANGL14400V34EqualizerAdaptcreate_cid_dtmfV21_CHAN2_MTD_COEFF_ZN12V92PreFilterC1Ej_ZN12V90ResamplerD2Ev_ZN22V90ConnectionEvaluator18evaluateConnectionEv_ZN21V90ConstellationPower17isLegalPowerIndexEj_ZN24V90ConstellationDesigner25adjustConstellationsPowerEvMTD5_COEF_8000FPM_TONE_killSRE_ALPHA_AVGV27RX_CRR_TABLEv22_ans_rmloop2TxHdxQuietV29V27TX_PATTERN_ALT_ZN21V92ConvolutionEncoderD1Ev_ZN18V90Phase3Modulator13generateTRN1dEv_Z25VPcmV34SetMinimumSigLevelP12tagV34Object_ZN15V92BitsToSymbol7processEPhjV34hilbertrealcoef_ZN13V92Phase2InfoC2EP13V92Parametersus_coefECCv32_CFG_ZN9V90MapperD1Ev_ZN20V90Phase4Demodulator5resetEh22Phase4DemodulatorStatejj_ZN24V90ConstellationDesigner28reconstructInitialConditionsEP16V90MappingParamsPh_ZN18V90Phase4Modulator10generateRiEv_ZN24V90ConstellationDesigner33setConstellationToNoise_forceRateEfPA128_sS1_PsPhS3_PA128_hSGD_correlatefaxvmi_gen_fcs16v21tx_messagedcr_deleteRxHdxNoSignalV32_TX_MODEEpochDetectV27_ZN24V90ConstellationDesignerC2EP13V90ParametersP12V90PreFilterP21V90ConstellationPower_ZN18V90Phase4Modulator9recivedCPEvdftRetrainDetInit_ZN12V90Equalizer24enterChannelVerificationEv_ZN14V90Demodulator18sessionTerminationEvRingDetector_Reset_ZN12V90Resampler20getTimingHistoryMeanEv_ZN18V92Phase4Modulator30recivedPartTwoSilenceRrnSUVtagEvv8_txinitSMC_CFG_ZN18V90Phase3Modulator11generateDILEvfaxvmi_byte_reverse_ZN5V90MPC2Ev_ZN27ParallelDifferentialDecoderIhE7processEPhS1__ZN18V90Phase4Modulator17generateV92SymbolEvGenSequenceV17TX_deletesetConstellationMask_ZN15K56FlexFloModemC2EPviP19_tagModemParametersV29RX_DEC_MAGV27RX_DEC_PMAPDual_TONE_delete_ZN8FloatFIR15setCoefficientsEPfj_ZN12V90PreFilter18preFilterCoefType1EV34EqualizerClearCenterTaps_ZN17ANSamToneDetectorD2EvDECv32_ANA_IMAP128_ZN11V92Precoder5resetEv_ZN13V90SdDetectorD1Ev_ZNK12V90Equalizer16printCoefsToFileEvv17tx_controlV27TX_EQCOND_COUNTVPcmV34InitiateRetrainFSE_decision_CD_ZN20V90Phase4Demodulator11getDecisionEsMTD3_COEF_8000V27RX_control_ZN25V90AutoDigitalImpDetector24adjustUinfoToPhaseOffsetEsV34GiveINFO1dBits_ZN9FloatARMA7processEf_ZN9ScramblerIhhE15processAllZerosEPhj_ZN5V90CPD2EvCOEF_DCScrambleDataV27VTB_REGION_7200V32_ESEQ_ZN20V90SignBitsExtractorD1Ev_ZN12V90Equalizer10setDfeBetaEf_ZN20V90Phase4Demodulator14enterWaitForCPEvtxwritequeueMMinTablehsine1920V34SetINFO1aBitsV32_RATE_SEQ_ZN5QueueIfEC1EjSeedScramblerV32_ZN10GenericIIRIfdE7processEfV27RX_FSE_IFILT_2400initdigitalRxHdxStartV29_ZN24V90ConstellationDesigner23setConstellationToNoiseEfPA128_sS1_PsPhPA128_h_ZN19GenericToneDetectorC1EjjPdS0_jjfjfjjFPM_AGC_init_ZN14V92TransmitterD2EvFSEv17_decisionV27TX_CTLfaxvmi_write_fifoMakeTxData_ZN12V90PreFilter13refLoopsType5E_Z4sincIfET_S0_V32RngRespNextStateDECv32_MAG12000_ZN18V90Phase3Modulator32codeSegmentsBoundriesLookupTableEdp_vpcm_initDECv22_MAG24DECv17_ANA_IMAP128GetSequence_ZN24V90ConstellationDesigner26adjustConstellationsToNewKEPA128_sS1_PsPA128_h_ZN12V92Modulator11initiateFPEEv_ZN8V90ModemC2E12V90ModemSideP19_tagModemParametersP19tagV90DILdescriptorj20V90ComputationalModej_ZN5V92CP12getBitVectorERj_ZN20V90Phase4Demodulator14setSessionFlagEjV29RX_MESG_ZN9V92MapperC2Evcid_progressScrambleDataV32SetRxModeV32DECv32_ANA_QMAP128v23FP_tx_createVTBv32_QMAP64RxHdxErrorV27V17RX_delete_ZN12V90Equalizer23restoreEqualizerToFloatEvV22_SRE_freeDemodDataV17B103_BPF_ANSWERSetScramblerV27V17RX_CFGV27RX_SRE_PLLK2FPM_ECC_initV32_TURNAROUND_DLYCID_MTD_detectscale3200V27RX_XB_COFFSMTDs1_CFGV32_FINAL_RATE_SEQCarrierDetectV17RxHdxToneData_ZN5V92CPD2EvVPcmV34InitiateHangUp_init_tx_nulls_statec1829_ZN12VPcmFloModemC2EPv12V90ModemSideP19_tagModemParametersj20V90ComputationalMode20V92ComputationalModeMTK_sin_table_ZN9ScramblerIhhE7processEPKhPhj_ZN16V92EchoCancellerC2EP13V92Parametersjj_ZN12V90RDetector7detectREs_ZN19GenericToneDetectorD2Ev_ZTV9Resampler_ZN21V90ConstellationPowerC1Evbpv22low_ZN12V90Equalizer18zeroLinearEquCoefsEv_ZN12V92Modulator11exitSilenceEvSDMv27_descrambler_ZN18V92Phase3Modulator13generateTRN1uEv_Z25SetUpstreamModulationInfoP12tagV34Object_ZN5V90Jd11unPackResetEvAUTOCOR_COEF_7200GetSNRV29_ZN5V90Jd12getBitVectorEvVTBv17_IMAP16TsetDataBitRateDECv17_IMAP64dpskDetectInfo1Init_ZN5QueueIfE5writeEf_ZN9ResamplerD0Ev_ZN18V90Phase3Modulator11exitJdPhaseEvV34EqualizerCleanUp_ZN16V92EchoCanceller12setEchoDelayEjcid_createEpochDetectV32FPM_FSD_freeV17RX_createnegHalfBaud_Bcoef_RealFPM_PPS_initRxHdxSequenceERxNextStateV21v8_V21_InitCP_450_630_bV27RX_DEC_PMAP_2400hsine2000MMaxTable_ZN8V92Modem10printTitleEvcHDLCtx_off_init_ZN25V90AutoDigitalImpDetector17porcessFirstStudyEvV27RX_YCLOCK_4800_ZN20V90Phase4Demodulator16resetRRNDetectorEvV34InitializeImplementationSpecific_ZN15K56FlexFloModem21k56FlexRunDemodulatorEPfjPiS1_txrxdmainit_ZN12V92Modulator14enterDataPhaseEv_ZN18V92Phase4Modulator27recivedPartTwoSilenceRrnSUVEv_ZN12V92Modulator8progressEPiRjPfjconnect_1200_ZN14V92Transmitter5resetEP16V92MappingParamsRenegotiateDetectV32V22FP_controlVparser_read_floatCodeRateSeq_ZN18V90Phase4Modulator12generateSUVdEv_ZN21ResamplerTimingOffsetC1EjfjffjTrellisEncodeDifTableSTRM_VCE_GetFDSPEnvironmentalParamsV17TX_CTL_ZN3Psd13setWindowTypeE10WindowTypeRingDetector_GetLastRingFPM_atan_tableulaw2alaw_ZN9V92Mapper21constelAmplitudeTableE_ZN12V90EqualizerD1Ev_ZN16V92EchoCanceller16resetEchoHistoryEvTxHdxData_ZN18V90Phase4Modulator12recivedCPtagEvDECv17_MAP_TRN_ZN18V90Phase4Modulator22setNextStateAfterTRN2dE20Phase4ModulatorState_ZNK24V90SpectralShapingFilter9getMetricEPKsjSREv17_PLL_K2_ZN12V90PreFilter8dataBaseEV27RX_SRE_PLLK2_2400setParamsInfoFromV92CPUnPckFPM_rms_ZN20V90Phase3DemodulatorD2EvTONE_CFG_ZN18V90Phase4ModulatorC2EP13V90ParametersjP15V90BitsToSymbolP5V90MPP16V90MappingParamsS7_P5V90CPjTxHdxSCR1V29VPcmV34RequestDPNotification_ZN11DescramblerIiiED1EvDECv32_ANGL14400_ZN12V90RDetector11detectRfNotEsbeepgen_create_ZN8FloatIIRC2EjPfj_ZN22V90ConnectionEvaluator21indicateRemoteRetrainEvV27RX_DEC_LAST_PHASEBwChDem_Progress_ZN18V92Phase4ModulatorC2EP13V92ParametersP15V92BitsToSymbolP5V92CPP16V92MappingParams_ZN16V92EchoCanceller14setDecayFactorEfV22_iir_filt_demod_ZN9ScramblerIhhEC1EjjjFSE_Bridge_det_ZN19V90SpectralVerifierC1EP13V90ParametersAGCv22_CFGvect16_ZN11DescramblerIhiE5resetEh_ZN25V90AutoDigitalImpDetectorC2EP13V90ParametersSDMv27_scrambler_ZN5V90CP23printNofRecievedMpMpNotEvV27RX_FSE_PLLK1_4800RxHdxEpochDetV27_ZN12V90ModulatorD1EvCRRv22_CLKRxHdxBridgeV17_ZN12V90ModulatorC1EjP13V90Phase2InfoP5V90JdP5V92JdP19tagV90DILdescriptorP16V90MappingParamsS9_P22tagV90AdditionalCPinfoP5V90CPP5V90MPP13V90Parametersj_ZN9ScramblerIhiE7processEhMTK_cos_signSGD_createvxx_messageFPM_TONE_generate2v22_answerFPM_FSM_deleteVTBv32_IMAP64_ZN17V92ModulusEncoderC2Ev_ZN10LowPassFIRIfED1Ev_ZN14ModulusDecoderC2Ejjjjjjjv17tx_messageFSE_decision_trnV32TxHdxModemV34SetupDemodulatorSDM_CFGV34XF_IndicateK56FlexRateDetermineddetector_deletedetector_set_enableV27TX_modemVTB_REGION_9600TxNextStateV17c2000V22_PPS_freeDILdescriptorPackerSREv17_yCLOCK_ZN15K56FlexFloModem21enterPhase3FullDuplexEvsetTimingStateParametersv22_data_ZN5V90MP11evaluateCRCEvSRE_BETA_AVG_ZN19V90SpectralVerifier5resetEv_ZN8V92Modem5resetEvCALLPROG_Status_stringRxHdxDataV29dftnlinitNoiseBinsV21TX_statusV17TX_status_ZN18V90Phase3Modulator13generateSdNotEvV27RX_MRF_FILT_4800RxHdxPrtcolV17_ZN12V90Equalizer12zeroDfeCoefsEv_ZN18V90Phase4Modulator27recivedPartTwoSilenceRrnSUVEv_ZN5QueueIfE4readEPfjMRFv32_CFG_ZN12V90Equalizer11setDfeCoeffEPfjsysdep_freeFPM_phasor_demod_ZN18V90Phase3Modulator14setSessionFlagEjModDataV27_ZN18V92Phase3ModulatorD1EvVPcmV34SetTxScaleRxHdxPrtcolV29_ZN9ScramblerIhiE5resetEhdp_b103_initv8_absfn_ZN5V90MP8resetCRCEv_handle_statusindicateJaTransmissionFPM_atanVPcmV34GetCurrentTxBaudRateV27TX_PPS_QFILT_4800RxClampV32gInvertPatdetector_progressfax_class1_statusV17_MTD_COEFF_ZN17V90SpectralShaper16applyFrameActionENS_7ACTIONSEPsi_sym_sizefltTable_2_ZN12V90Modulator11initiateFPEEv_ZN5V90MP10bitsToInfoEiMTD1_COEF_8000_ZN27ParallelDifferentialEncoderIhE5resetEjh_ZN22V90ConnectionEvaluator14evaluatePhase4EfV27TX_SMC_CRR_LEN_ZN18V90Phase4Modulator16enterRepeatedCPdEvB103LocLoopNextStatevoice_tx_ZN12V90ResamplerC2EjfjfP13V90Parametersfj_ZN12V90PreFilter5resetEv_handle_data_outputLoadRegFPM_FSE_freeVTBv32_IMAP32v21_hibndVPcmV34GetQuickConnectIndication_ZN18V90Phase3Modulator6exitJdEvhsine1200_ZN18V92Phase3Modulator9exitTRN1uEvTxNextStateV29FAXVMI_CFGRxHdxStartB103v29tx_deletev21rx_deleteV27RX_epoch_det_ZN12V90Resampler8resampleEPKfjPfRjFAX_FSE_decision_64pt_ZN15K56FlexFloModem16getK56FlexMpBitsEPs_iir_filter_progressDECv32_ANGL1200SeqToRateSMCv17_MOD_ZN3PsdD1EvAGCb103_CFG_ZN25V90AutoDigitalImpDetector27setPrevSessionLinearMappingEPs_ZN5V90MPD2Ev_ZN13V92Parameters4initEvV32AnsNextStatenull_deleteV21TX_MESG_ZN12V90Modulator11enterPhase4Ev_ZN5V92CPC2Ev_ZN18V92Phase4Modulator13recivedSUVtagEvV27RX_YCLOCKSetECRndTripDelayV32dftnlinitSignalBins_ZN5V92Jd18unPackJdPhaseResetEvEpochDetectV29V21RX_MESGsysdep_vsnprintfV27RX_SRE_PLLK1_2400_Z11V90CPPackerP16V90MappingParamsP22tagV90AdditionalCPinfoPsi_ZN5V90Jd15setMaxLookaheadEh_ZN14V90Demodulator11enterPhase3Ev_ZN11DescramblerIhiE15copyHistoryTailEvV27RX_modemV27TX_PPS_IMAP_2400_ZN8FloatFIR7processEPKfPfj_ZN5QueueIfE5writeEPfj_ZN15K56FlexFloModem13internalResetEvMTK_atan_tableV27RX_XCLOCKDECv32_IMAP64_ZN9ScramblerIihED1Evsetupreceiver_ZN12V90EqualizerC1EjjP20V90Phase3DemodulatorP20V90Phase4DemodulatorP11V90DemapperP22V90ConnectionEvaluatorP19V90SpectralVerifierP13V90ParametersP12V90ResamplerP12V90PreFilter20V90ComputationalModebiascoefSMC_encoder_ZN5V92Jd10packJdDataEv_ZN12V92PreFilterC2EjB103_CFGV29RX_CTLV8UpdateModemParametersV29RX_DEC_QMAP_ZN14ModulusEncoder8progressEPhPj_ZN9ResamplerC1EjfjfjV27RX_SRE_PLLK1_4800_ZN12V90Modulator7exitDILEv_ZN15K56FlexFloModem6getDFEEP11int_complexmMTDv22_COEF2V34TimingFilter_ZN14V90Demodulator20enterDataSteadyStateEvSREv17_XB_COFFS_ZN15K56FlexFloModem18getResamplerOffsetEP11int_complexm_ZNK19V90SpectralVerifier16freqToNearestBinEfv27rx_messageV32_S_DATA_COEFsysdep_strlen_ZN21V90ConstellationPower20getConstellationInfoEP16V90MappingParams26V90TxPowerMeasurementPointjv29rx_deleteDECv32_ANGL9600TTxHdxTEP_V17_ZN18V90Phase4Modulator12setRfSymbolsEP16V90MappingParamsconnect_2400SMCv32_PMAP_ABS16polyValueFPM_div_V23_MRF_FILTEpochDetectV17V27RX_XCLOCK_2400_ZN12V90Modulator6exitJdEv_ZN18V92Phase4ModulatorD1EvV22_SRE_recovervoice_createInitDetSequenceMTK_xor_table_ZN9V90MapperC2EP13V90Parameters_ZN17V90SpectralShaper11applyActionEiPspack_next_bit_ZN20V90Phase3Demodulator14setSessionFlagEjtoneiir_get_default_configurationFSE_getdiag_ZN5V92Jd8resetCrcEv_ZN17ANSamToneDetectorC1Ejjfjfjjj_ZN24V90ConstellationDesigner4pow6Es_t30_silence_before_tx_stateDECv22_ANGL24_ZN15ResamplerTiming13SdHalfBaudDftEf_ZN24V90SpectralShapingFilterC2Ev_tx_silence_before_scrm_ones_ZN12V90PreFilterD1EvDetect_v22_ZN19V90SpectralVerifier30checkSpecialSpectralConditionsEv_ZN15V90BitsToSymbol7processERjPs_ZN25V90AutoDigitalImpDetector16studyUrefHandlerEfjDataCarrierDetectV29V27RX_FSE_PLLK2_4800VTB_REGION_14400TxHdxSCR1V17charFlip_ZN12V92Modulator11initiateRRNEv_ZN18V90Phase4Modulator6exitMPEv_ZN5V92Jd12unPackJdDataEi_look_for_other_than_ZN25V90AutoDigitalImpDetectorC1EP13V90Parameters_ZN12V90Equalizer11enterPhase4Ev_ZN14V90Demodulator10exitPhase3Ev_ZN18V90Phase4Modulator13generateTRN2dEvFPM_SMC_initV27RX_SRE_FILT_2400V17TX_createv29tx_createv21rx_createvoice_online_Z10float2BitsfPhiDemodDataV32SeedScramblerV17FSE_decision_4pt_ZN11DescramblerIiiE5resetEi_ZN16V92EchoCancellerD2EvTxHdxDataV21_ZN27ParallelDifferentialDecoderIhEC1EjV21TX_controlV34SetupModulator_ZN18V90Phase4Modulator30recivedPartOneSilenceRrnSUVtagEv_ZN16V92EchoCanceller13zeroEchoCoeffEvV29TX_PPS_IFILT_ZN25V90AutoDigitalImpDetector15getAltVarThreshEPffVPcmV34GetCurrentTxCarrierV27RX_XB_COFFS_4800_ZN5V92JdD2Ev_send_silence_state_initv23FP_rx_progressv90RateReneg_init_receiverechoshift_ZN18V92Phase4Modulator15enterRepeatedCPEvecoeff_ZN18V90Phase4Modulator10generateMPEvTxHdxIdleV27CP_350_600_scales_ZNK12V90PreFilter14getNofRefLoopsEvfax_class1_info_ZN5V90JdC2EP13V90Parameters_ZN5V90CP18calcSequenceLengthEv_ZN15ResamplerTiming16timingCorrectionEf_ZN22V90ConnectionEvaluatorD1Ev_Z12designWindowIfEv10WindowTypePT_jv29tx_processv21rx_process_ZN17V90SpectralShaperC2Ev_ZN25V90AutoDigitalImpDetector5resetEh7PcmTypeszFLTUTL_Linear2FloatFPM_TONE_generate_demod_send_hdlc_between_buffer_state_initFPM_FSM_initTONE_read_ZN12V92ModulatorC2EjP13V92Phase2InfoP5V92JaP19tagV90DILdescriptorP5V92CPP16V92MappingParamsP13V92Parameters_ZN12V90Equalizer14enterDataPhaseEv_ZN17ANSamToneDetectorD1EvDECv32_MAP_TRN_ZN21V90ConstellationPower21getPowerIndexForPowerEfV27RX_CRR_TABLE_4800_ZN18V90Phase3ModulatorD1Evv21tx_processdetector_create_ZN12V90Equalizer31resetMeanErrorEnergyDiagnosticsEv_status_ZN18V90Phase4Modulator12generateRdRtEvv34FreezeEchosettxlevelK56FLEX_Deletebeepgen_sampleSMCv22_CFGTxHdxSCR1V27_hdlc_emulate_receive_state_ZN12V90ModulatorC2EjP13V90Phase2InfoP5V90JdP5V92JdP19tagV90DILdescriptorP16V90MappingParamsS9_P22tagV90AdditionalCPinfoP5V90CPP5V90MPP13V90ParametersjpreinitV34_ZN25V90AutoDigitalImpDetector22updateAltRbsPhaseInDilEv_ZN15V90BitsToSymbol19setSymbolsBlockSizeEjdtmf_modemV27RX_DEC_LAST_PHASE_2400_ZN18V92Phase4Modulator10generateRuEv_ZN18V92Phase4Modulator11generateCPuEvV32OrgNextState_ZN14ModulusEncoderC2Ejjjjjjj_ZN20V90Phase4Demodulator9detectRRNEsv29rx_messageSMCv32_encoder_difV34InitHilbertFilterhsine1680SetPulseBreakTimenull_create_ZN18V92Phase3Modulator10generateJaEv_t30_preabmle_stateTxHdxNullprop_dp_exitFPM_sqrt_dpStoreCoefV17_ZN3PsdC1Ej10WindowTypejscale2800_ZN18V90Phase3ModulatorD2Ev_V23RX_IIR_LPFVPcmV34DeleteVPcmV34SetMaxBlockLength_ZN5V90MPC1Ev_ZN9FloatARMAD2Ev_ZN12V90PreFilter13refLoopsType4E_ZN9Resampler17resetHistoryIndexEvdescrambleGPCFIFO_delete_ZN18V92Phase4Modulator9recivedRtEvV27TX_SDM_NUM_BITSIIR_b_coeffsysdep_mallocFSEv32_CFGDECv17_ANGL4800SGD_deletefaxvmi_simp_unpack_ZN12V92ModulatorD1EvFPM_TONE_deleteRxNextStateV29SMCv32_QMAP16VTB_REGION_12000SetRxRateFPM_lmsupdvectppSREv17_xCLOCK_ZN13V92ParametersC2EP19_tagModemParametersintcoef2intcoef3V27RX_DEC_PHS_MASKCrossDataLinks_ZN10LowPassFIRIfEC1Ejf10WindowTypef_ZN9ResamplerD1EvinitTxSequencePPSv32_ICOFFSRcFixed_Delete_ZTV21ResamplerTimingOffsetlinear2alawFilter_350_500_scales_ZN18V90Phase4Modulator21resetRRNSecondSectionEv_ZN25V90AutoDigitalImpDetector18porcessSecondStudyEvV29RX_epoch_det_ZN17V90SpectralShaper13resetSSFilterEffff_ZN8SineWaveIffE8generateEPfmrxreadqueue_ZN12VPcmFloModem16setV34BaudForV34Ev_ZN9FloatARMAD1Ev_ZN12VPcmFloModem16setNofBitsPhase4Ejdp_v32_exit_ZN18V92Phase4Modulator7exitCPtEv_handle_data_inputV29RX_statusvoice_commandpreinitdigital_ZN18V90Phase3Modulator15generateJdPhaseEvFPM_SDM_scramblerV27RX_FSE_QFILT_4800FPM_iir_filt_ZN14ModulusEncoderC2EvPPSv32_QCOFFS_ZN5V90CP12getBitVectorERj_ZN15V92BitsToSymbol5resetEP16V92MappingParamsV29RX_DEC_PMAP_ZN18V90Phase3ModulatorC1EP13V90Parametersjreset_cid_ZN27ParallelDifferentialEncoderIhE7processEPhS1_FPM_xor_tableSMCv22_QMAP_2400BPSV34EchoHistoryBackwardClean_ZN9V90Mapper5resetEP16V90MappingParams7PcmType_ZN13V90ParametersD1EvMTK_phasorB103_IIR_LPFsysdep_strcatSMCv17_initbSearchEnergyIsPulseDialerReady_ZN8FloatFIRD2Ev_ZN15V90BitsToSymbol7processEPhRjPsv8_fskdemodulate_ZN5V92CP12evaluateInfoEv_ZN9Resampler5resetEvFPM_div_tableRxHdxErrorbitreversev34modeminitFPM_div_32txmitFPM_phasor_dp_ZN24V90ConstellationDesigner24findConstelMaxValueIndexEP16V90MappingParamsV29TX_modemFAXVMI_message_Z6boxcarIfEvPT_jFAXVMI_CTLfskdemodulateRxHdxDataB103SMCv22_IMAP_1200BPSv8ControlName_ZN25V90AutoDigitalImpDetector21clearCamulativeAltValEss_ZN9ScramblerIihE7processEPKiPhj_ZN9Resampler16timingCorrectionEf_Z7realfftPfmiVTBv17_IMAP128_ZN15V92BitsToSymbol18nofBitsForNextTimeEvdp_runtime_delete_iir_filter_createDialerAbortv21_lobndV32FP_create_ZN20V90Phase4DemodulatorD1EvCALLPROG_Progress__moddi3_ZN18V90Phase4Modulator10recivedSUVEvVTB_BOUND_14400_ZN18V92Phase4Modulator16setMappingParamsEP16V92MappingParamsSMCv17_QMAP4SDMv22_CFG_u2av21tx_controlvoice_rxrxtimingadaptechoV27RX_CFGcreate_dtmfV27TX_PATTERN_CARRV29RX_decisionV27RX_SAMP_PER_BAUD_ZN11V90DemapperD1EvSetAdaptEcV32getDataBitRate_ZN13V90Phase2Info12setToDefaultEv_ZN20V90Phase3Demodulator11getDecisionEf_ZN9ScramblerIhiE15copyHistoryTailEvdp_v22_exitv17rx_message_ZN12V90Equalizer21convertEqualizerToMmxEvc1800_TxHdxEQCondV27dftenergyvxx_status_ZN9V90Mapper7processEPhjPsRjdsplibs_debug_level_ZN5V92Jd13unPackJdResetEv_handle_hdlc_input_ZN24V90ConstellationDesignerC1EP13V90ParametersP12V90PreFilterP21V90ConstellationPowerV27TX_PPS_IFILT_ZN22V90ConnectionEvaluator23indicateRemoteRateRenegEvV27TX_PPS_UP_FACTtoneiir_delete_ZN13V90Phase2InfoC2EP13V90Parameters_ZN24V90ConstellationDesignerD2EvTxHdxStartV21zFLTUTL_Float2Linear_V23RX_ANSWER_INTRP_ZN17V90SpectralShaper5resetEjjffffV22_PPS_initV34GiveProbeResultsV34XF_GetInfo0BitsPtrFPM_SRE_free_ZN11V92PrecoderD1EvIIR_a_coeff_ZN12V92Modulator6exitJaEvV27RX_FSE_IFILT_ZN21ResamplerTimingOffset5resetEvResetCallingToneTxHdxBridgeV17FDSP_Kernel_InitObjTxHdxTRN_Z7hanningIfEvPT_jdcr_create_init_transmitterControl_FlagV8CreateDemodDataV29CP_276_504_scalesCarrierDetect_ZN20V90Phase3Demodulator14getV92DecisionEf_ZN12V90Resampler11setBllStateE11V90BllStatejModDataV21_ZN22V90ConnectionEvaluator26evaluateMeanErrorStdPhase4EffV27RX_XCLOCK_4800_ZN9V90MapperD2Ev_ZN18V92Phase4Modulator13resetBeforRRNEvV34TimingIIR_Bcoef_ZN17V90SpectralShaper17actionLookupTableEdp_runtime_create_ZN25V90AutoDigitalImpDetector8isAltRbsEssfPPSv22_COFFSFIFO8_writeRingDetector_Create_ZN5V92Jd19getConstelationSizeEPhS0_K56FLEX_Createhsine2400FPM_AGC_agcCP_276_504_adp_v23_initV22_PPS_filter_ZN18V90Phase4Modulator13resetBeforRRNEvRxHdxErrorV21_ZN12V92PreFilter7processEPfS0_Detect_RetrainDECv17_ANGL12000V22_MRF_initV32LocLoopNextState_ZN12V90Modulator5resetEvV29TX_MESGFDSP_Kernel_LoopSetEncoderV29V29TX_status_ZN22V90ConnectionEvaluatorC1EP13V90Parameters_ZN12VPcmFloModem17v90RunDemodulatorEPfjPiS1_V34EqualizerFilter_ZN18V90Phase4Modulator10generateEdEvV27RX_MESG_ZN15ResamplerTiming8addPhaseEf_ZN8V90ModemC1E12V90ModemSideP19_tagModemParametersP19tagV90DILdescriptorj20V90ComputationalModejV27RX_FSE_PLLK1SREv32_CFGvxx_deleteRxHdxStartV21_ZN12V92PreFilterD2Ev_ZN15V90BitsToSymbol7processEPhjv27tx_control_ZN24V90ConstellationDesigner5realKEP16V90MappingParamsSREv32_COFFS_ZN15V90BitsToSymbolD2Ev_ZN5V90MP23printNofRecievedMpMpNotEvFPM_SRE_CFGV29TX_CFGMTD1_COEF_9600SMCv32_encoder_abs_ZN12V92ModulatorD2EvTxNOP_ZN19V90SpectralVerifier7processEPfjv23FP_tx_progressV34nlencoderDetSequenceV22FP_modemV27RX_MRF_FILTRxHdxSTone_ZN15K56FlexFloModem18k56FlexEnterPhase3Ev_ZN5V90CPC1Ev_ZN15K56FlexFloModemD1EvFPM_sqrt_send_hdlc_between_buffer_stateTxHdxStartV17v29rx_create_ZN11V90Demapper15resetNoSpectralEP16V90MappingParamsTxNextStateV27FPM_phasor_ZN15K56FlexFloModem16getK56FlexJaBitsEPsSREv32_xCLOCKV34HilbertFilter_ZN18V92Phase4ModulatorD2EvVTBv17_IMAP32_ZN20V90Phase3DemodulatorC1EP13V90ParametersP19V90SpectralVerifierjP25V90AutoDigitalImpDetectorFPM_MRF_CFG_ZN15V90TRN2Designer18setNofUcodesInTrn2EsDual_TONE_detect_ZN17V92ModulusEncoderC1EvV29TX_deleteFilter_100_550_scalesV34TimingHPFilterSMCv17_encoder_absVTB_BOUND_7200VTBv32_IMAP16TQualityDetectV27_ZN16V92EchoCanceller8setStateE21V92EchoCancellerState_ZN12V90PreFilter12selectFilterEvFSE_decision_64ptv8_txwritequeue_ZN11V90DemapperD2Evcheck_for_valid_easy_ZN20V90Phase3Demodulator5resetE7PcmTypeh22Phase3DemodulatorStatejP5V90JdP5V92JdP19tagV90DILdescriptorssfj_ZN25V90AutoDigitalImpDetectorD2Ev_ZN18V92Phase4Modulator12generateSUVuEvV21RX_CHAN2_INTRPFPM_MRF_init_Z3VarIfET_PS0_jzFLTUTL_FloatMemSet_ZN21ResamplerTimingOffset15setTimingOffsetEfVTBv17_QMAP64_ZN12VPcmFloModem20vPcmResetPhase3ModemEv_ZN12V90Modulator14setSessionFlagEjV22_CFGFPM_FSM_modulateV27TX_NOCARR_SYMBOLv22_org_rmloop2_ZN12V90PreFilterC2E23__tHardwareCodecTypes__P13V90Phase2InfoP13V90Parameters_ZN18V90Phase4Modulator26recivedFirstSUVuPartTwoRrnEvvect4V32_RX_MODEv8_fsktxfilter_ZN12V90PreFilter16getV90CapabilityEvFPM_cos_table_ZN18V92Phase3Modulator6exitJaEv_ZN8FloatFIR5resetEv_ZN18V90Phase4Modulator11exitSilenceEvDECv17_ANGL7200DECv17_SIN_ROT_ANGLEAGCv32Prc_CFG_ZN9ScramblerIihE19resetHistoryIndexesEv_ZN9Resampler18setNormalizedPhaseEfV22_MRF_free_ZN15ResamplerTimingC2EjfjPffjVPcmV34SetMohMessageBitsv29rx_processv8SequenceNameV29TX_controlv27tx_processdecodeDepthV22IIRFilterInitV34hilbertimagcoef_ZNK14V90Demodulator13getRbsPatternEPj_ZN11DescramblerIhiED1Ev_Z20resetRetrainDetectorP17tag_retrainReqDetsDialerProgressV34TimingPrefilterCoeff_ZN25V90AutoDigitalImpDetector18clearCamulativeValEssVTBv17_QMAP16TGenEQTrnSequenceV29V27RX_MRF_FILT_LEN_ZN17V90SpectralShaperC1EvRcFixed_Create_ZN12V90PreFilterC1E23__tHardwareCodecTypes__P13V90Phase2InfoP13V90ParametersTxHdxAltV27_ZN21ResamplerTimingOffset16timingCorrectionEfzfFLTUTL_GetMaxAbsValue_Z19interpretMohTimeoutsV92createFilterCoefficientsAGC_DEF_BETA_v21fltTable2FIFO_readcEncodeCharrebuildJMSequenceFPM_ECC_cancelV17TX_PATTERN_SCR1_ZN11DescramblerIiiE7processEiDemodDataV21v34handshak_ZN15ResamplerTiming18resetSdHalfBaudDftEvSGD_control_ZN17V90SpectralShaperD1Ev_ZN10GenericIIRIfdED1EvVPcmV34NotifyDP_ZN12V90Equalizer8enterRRNEv_ZN13V90Parameters11initSessionEvV27TX_PPS_IMAPV34EchoPreFilterMTD2_COEF_8000setV92CPpckFromParamsInfoV27RX_eq_trainTxHdxMarksB103_ZN18V90Phase4Modulator5resetE7PcmTypeh20Phase4ModulatorStatejjSDM_init_ZN12V90ResamplerC2EjfjPfP13V90ParametersfjCarrierDetectV27_ZN12V90PreFilter13refLoopsType7Edp_wrapper_delete_ZN5V92CP13resetDetectorEvFPM_PPS_freeO  [d ^"49>& CH MR!l B. $ K. t B $ . (>CH$S>. . kC. N dr $$$5 ` .  $5. CP$y,. C fB 4 C s  $     . F K $d Ct    .   . * . B . Z . u . . .  $  $' , $= B $P U $a f $  $  $t 7 7  /y`f. pu$. $55 . -xUi. . $. . . . . U`. ns$~. $. . $. . `i$u$$$$$. $$$+0$5. AX$di$n. z$$. . $. /8$?   Z. $  _ . # FBB. $B. w $$ _  $   + m. $g_d$$$. $$$$7{. 7cy$P5`. i. Q. $$)2$=. KP$_. . . . .  . ) . V . q .  $  $  $  $  $  $  $!!$!!$  5!. z! !B!!^ """$M" j". x"e""$"e"#B #. '#<#$" " \#B 1$. %%$c% &. &&$i# +. + +B+,(,C,a,u,,,. -%-$3-8-$E- b--- - - - -. -. )...$<.T. d. s. /7/ /. /0Bw071R1h1q1$1111k$202. _222$22. 2. -333$33. 33$4 4$%4. C4S4X4$s444. 44$5 5. -525$j+`5v5. 5 5B55b6B6M 66$7 7. +7%37 C7H7$S7%[7 777. 8 88$ 8. 48. X8 k8. 888. 99$F9R9\9$h9m9$|99$9999k*:. J: r:B:::';` J;a;u;. ;<. G<. q<<<$<< <<$ ==$-=2=$=== =. = >> #> 3>8>$>7>BH?7x?7?7?\@,z@@ @. SAbfA. AA. AA. AB$B. BB$B. BB$B. BB$ C. [CaC. CCC$CC$C. CC$CCD] D. ED\D}DD$DD$DD$DDDDDDE$Ek0E9EkEENEklE. E EBEE8=F_FpF. F FF$FG. ,G1G$>G. hGG$G G%G G. H%H H 4H9H$HH:H(I IbII. I. II$I. JJ$J. J!J$)J. CJJ. JJJJ$K"K$:KCK$uKBKKKKKLkLLk;L. NL qLBLL8LMM$(M 4M lMwM M NdNbN. NO(ONOSO$tOOOOkO. O OBP,P8PLPP$P P P8Q Q Q QbRR. G$au${. $. $. . . *Y^$d. Ƅ$$&+$.  . H. $. $. . !$7<$$$17. n. . . . . $$$/4$EJ$V[$ى. . 5. R. gl$. $Ҋ. . $%*$9. GL$]b$j. $$. $ċ. ԋً$ދ. . $$&. 49$ . ^. w.   ^.  َ. ,1$:?$KP$p.  / ] . Ő  & Y . $$Ƒ$ґב$$ (.  LQ”2 Ҕ۔$. $.  $&. 8A$G. Yb$h. z$. $ƕ2 bҖ. d" 0 D R  Η   ) 7 ؘ)K]g udd$0gd   " R ` u  қd %6.     ĝ ܝ.    * O ] r  ܞ    Kr$؟Dfxg dΠ $ d%d:.  49$Z. ע$. t$. ǣ. $. ǥ̥$. *$.  $ (è Ѩ u .@g Xd. ڪBB0 . 7_. . i . 8. Ӱ$#.$:G$M. [h$n. |$. $. ˱$$$ . *3$D. . $$5>Qns$.. m. $޶. $Fb. . Pj. Y. ch$}BP. \a$g. ۻ ,< ܼaQ  . $. $*/$ؿ !. ;@$1 P. NT. . $. $&. 05$ Z. js$49$ ,. FK$s $. 27$^r\ ~$. $$B. PU$B . in$S(-$$.  $1Vr v{$$. $. $:. DI$i. sx$. $ &e$$$ $; EB P^v l v  . ,P. \. . u. . . MV$bg$sx$y  ( .. . !<EJ$z. . `. . G{. 2. JnU. l. ^. $ 5 ;. J. . @K. . $. . . */DIV. dr$}. . c %. k3 . 3 . . (:. bgpu$$$$$$$$*/$;@$^g$sx$ . .  $)5$AF$\ar|$$$$$$ $$\^_ . G?Q{.  .   '}$  (^ 3V t T. B .  `,cB4 nG $(9HO#e qv$$$$; ; 3. . $$. 8A$G. _h$n. $. $<FL. . H^$r> $. !3CQ _P). [ z $ v $ *. 7.  . . . "39. t. $$. $$ $ %$5:$MR$x 6 a* ~EB -BB$.o. }$ . $+x b6* EIaBwB3B9$i$$$.$?    7 ? f!1N8 >8 N8  : L     L    ; H     % . c h $     . 3 8 $T  t     : K    )l+5RWz. % ` o $. ).RWe   $_.  $(-KP_`q(%M_  OPPl;%), ,( - 2- D- V- h- z- - - - - 4. D. T. d. t. . . . . . /. M/. ]////$/. /0U00$0. 00$"1. 112I2|2. 22$2. 2. 22$3. 3. 3. 3. 3. 4. +4. B4. [4. r4. 4. 4. B6G6$M6. ^6g6$m6. ~66$6. 66$6. 66$6. 66$6. 7 7$7. !7*7$07. T7[7v7$77$7. 77$7. 77$7. 77$78$88$#8(8$78<8$K8P8$_8d8$u8. 88$88$88$89$$9)9$L9Q9$t9y9$9. 9. 99: ::$%:I-: 7:?: I: Q: [: g:l:$:. :. ::: ; ;$;I; ';/; 9; A; K; W;\;$;. ;;;<<<<<. #<(</<4<=<B<U<Z<$`<. j<o<t<<$<. <<$<. <+ <. <<$< =?=9=. g=n=y=~=$=+ = == == = = >'> &>. .>r> >x>. >> ??$?+ (? 6?K? \?k? u? ? ?'? ?. ?@ A@x;$;5 N<<$&=J>$?$@ @ @ A A 4ADM _M M. M NN$NHNN. NdN. NN$O5O:O`OkO OOO$P *PEPJP$lP. PPP QQ$QQWQ. rQQQ Q Q R R .R HRQWR R= R RR RR SS (SASGS. _SSS S SS$SS$1T7T. RTeTT T T T T U (UQ7U rU= U UU UU UU V!V'V. ?VkVV V VV$VV$Q XY YY$Y1Y9YIYTYaYlYyYYYYYYYYYYYY ZZ!Z,Z9ZDZQZYZiZtZZZZZZZZZZZZ[[[)[1[A[L[Y[d[q[y[[[[[[: [[: [[: [\: \"\0\=\K\X\`\s\\\: \\\\: \\\\: ]]#]0]>]K]S]f]: t]]: ]]]]]]: ]]: ]^: ^)^2^>^\^yx^/^y^y^/_/;`. F`M`X`]`$c`. }`````````. $aUada$~aa$a. aab6b$8=$f zK . < $. . . 4. B< KP$\a$. . Рՠ$>( .. DI$Ws.  $(. 3H. y $$բ.  "N `f rl& ãȣ$ӣ. $. > IT^  &ĤӤؤ$. $. .SX$   )8 P _ L ^ m    g.  . B t>۩ . $ HM$v  Ҫת$l$$HkWcqkʫGϬ!&,^c}DL Zwhs1 F   Į ̮   Z  $, DL di l   į    w1 $F , DL d l   Z ı̱  i  $ D d   . $9>_. t0˴Ҵ d. . $P. $ʶ϶& %. \d lk k y~$1 3 ޹U/8߻ Nl| ;>I. dit>ǽaؽ. (@ 49$BG$R . ܾ. *Y^$.ܿ. 1h 9S Z )<$. 6w $} B{T d   % 3 C c t?  r     z   )8 Y1 } 2{D q}d    # 3 S d? v r     j|   ( I1  "6 v. $_. t\ . J$t. ^^^-^ET$ (Q!tt +. gl. 5kTT ;Ia.  $. R  $R\e:v{gl;IaQ"R -!R -R :\A aR . .4  . /4$G. $. $. $Xmty B. 3<kR R R R $$:GQZ:k'7$. ;@Mkl. $&6;GLW>z"$)5:$@. NS$Y. gl$ddR $*/;@$RW$$$$ſ $. ,5$;. QZ$`. v$. `F. q{$ .   $? . | .  $  $ .  $ .  $ . R [ $a .  $ . .  $- W 8 z L T  t v |  W z W z   $ v ,  : W E z u .  $#FO\qv. 5AgM v /  n . 7_Bw h. 7$. #7[h$s. $$$ * m * " Q   >*  U P[ :_Us  .JOB &B8AoJ\QVv6?h `5Qd `$k `4_Um $^U 5   T  U  = . !. !'!0!I! p!!!!!dW""U" #.#3#G#c#d# #`$g$$d$%. H%GS%/ Z%_%%B%%&/ & &!&GO&Ba&j&&&&&''='B'g'l''''' ( }( (!( #) y) ) .*U*Z****[ +[ R+[ +d+[ + ?,[ ,[ ,[ - I-N-../'/ 4/C/R// /// 0- 0W00- 00[ +1 1 1d1 1!2. 92>2$Q22 22$233*333W3`33 333344#4>4. 4B4/ 4[ 4 15r5 5556[ J6 t666$66 ,7_7 77$777888$8899C9_9d999. 99$9U:\\:a:::B::;7;BI;R;;;;;<<<,= R=`==d> ->`>>dK?p?U? ?"@'@>@t@. @G@ @@A A!A5AGjABAAABB B9BUBdB B`B^CC C`DuDDUD D5 D,E1ErEEUE EE%FJFU^F FF. F. FFG;GtGdGGGGH HEHJHoHtHHHHH1I I J EJ `J!J J 2KYK^KKKKKK[ L gL[ L L[ CM[ M[ M[ NdOOOPP#PnP PPPP- P+Q- 5QQ QdQ R!=R[ rR R S S. ;S@S$SSSS$SSSSS!T*TLT]T zTTTT[ U X cX~XXX$XXXX$ YQ Y,  YYYyZZZ"[%3[%;[b[%s[%{[[[[[\'\n\\\ \\{]U]]]]]E^ ^^^I^. __$O_z_. __$_V__`4` M`V``d`V``````a"ad.a GaPaadad'bdjbobbdbbcI"c4cVKcTcfccc cIc:dCddeeVeeIe ff #f. 7f@f$TfIyfff ffg6g bgkgg ggghhChhhhiRiiii!j2jHjQjjjj kIk. :k?k$okk. kk$kVkk0lTl mlvllIllY ll m8mdJmV\memmmmmdm mm0ndndnnndIodoooIooVoppIptp pIpppqqqqrKrIprrrrrrs OsXssst[t`ttttueuuuu2vkv|vvvv/wOwww9x]xyxxzx yy. 6y;yQyhyyyy$[z)z2z7zCzNz[zdzsz~zzzzzzzzzzz{{"{'{3{>{K{T{c{n{{{{{{{: {{{{{{ |||#|.|;|: D|V|: a|n|||||: ||: ||: ||: }: }}(}: 6}C}: L}^}: l}y}: }: }}}: }}: }}: }~: ~: %~*~6~: D~Q~: Z~l~: z~~: ~: ~~~: ~~: ~~: : ): 2D: R_: u: ~: : :  : $1: :L: Zg: : : : Ӏ: : : $: 2?: HZ: hu: : : Ɓρ!&2@M: Vhv: ǂԂ: ݂ : ): ?: HT: bo: }: : : ΃ۃ: : : *: 3E: NS_: hmy: : : ̄Մڄ: : 8: FS: \am: v{: : ͅڅ: : *: F: Ta: jo{: : : ͆: ۆ: : : 8: T: bo: x}: : ۇ: : : *: F: b: p}: : ͈ ',8Tp~: : ۉ:  ,5:F: b~: ͊ ).:CHT: p: : : : ʋϋۋ: : : !.: 7<H: QVb: ~: : : Ìό،݌!/<EJV_dp: Í: ̍эݍ: /: =JSXdmr~: : Ďю: ڎߎ: !=: KX: afr: {: ďҏߏ: : : /: KYfotҐ: !=: Y: gt: }: đ: :  : #/: K: g: uҒ #,1=Yuē : %1: :?K: gƔҔ %.3?HMYu: ƕϕԕ&3<AMV[gÖȖԖݖ &4AJO[diuȗї֗4BOX]irw: : : ʘ: . . #$ͦצ$ +w§ҧ9>\s~3sب3s83r˨+E. &-8=$C. W`r. Ī$'$-. >֫$ܫ. $)>)glKAhůAhFװ o5r r Ȳr  . CH$޳r Sr ʹr = HMjr  _W . $ȹ͹"r rr . $Bwr r 49sr Ҽr o  Xsr r "BG W\". 9. NS$fk} *ATAoA \hhh@.K^\t}BJB ';C N. & $KP& & 7< S Z_x}& \aBb. oAAA%AQA}AhhhhDhohAAA'AQA{AAAA"AJAvAhhhh=hfhhhh h2h\h4 4 mb  Mb  #4 D|_~ v4 4 |~ 4 @c4 ~ 4 4 4 M~ h4 . $GLj4 4 @4 ej4 . $@Nu4  >"j4 4 38[4 74  6~ a z~  ~ |~ |"~ =|T~  ~ ~ . $ 2Ps4  ~ 4 #4 T m~ 4 . $>L4 4 54 N\4 . $>4 ]b4 5Cx>4 ^n'&< n4 4 "I4 hm4 & Qx4 & . $&3 4 . |Cj4 ~ '~ R k~  ~ |~ |~ > W~ r~  ~  ~ < U~  ~ |~  &" TY$$$|A&ha[ |$V gft  f <D T    e.  $@- ]. . bg$sx$. $ - ". 9>$z. . $$   ) 6 D bp    hA\; h A ~Wl4  '<4U `  W       ' r {   #|   $ 4 B. Hy.  $<] $P LP ))G]py4Tsxer$ $$ %'% R%u% %% %-&E:& T& _&E&E& & &E&2&' ' \'2g's' ' ' ''(X(+9,Y ,L -Y 5-0~50 0F0F1(X>>>> ?@?y???@2@T@@@"A:AeLASYA aASzAeASA ASAeASA ASGBfBkBBBBBBBBB CC6C;C_CdCCCCCCCDD,D1DUDZD~DDDDDDR EEeE E FR TF FFeF FGR dG G GeG H2HR tH H HeH IBIR I I J^[JmJ JJA A J J J K ,K 6K JK tK K 3L L L cM QQ>R R R dS{ wS S [T pT T{ T lK K U9U AUYU aUzU UU V~ V V VdV~jV rV VVWV V V$WW*W 2W ?WRWU yW+WW+WW+WWXXXyY. YYZZ$Z. 9ZpZZ$Z. <[M[$m[s[[[[. [ \D \\+\D ] m]s]+{]D ] -^3^+;^D ^ ^^+^D \_ __W a a $a 4a Da Ta da ta a a a a b $b Db 'c 4c Dc Tc dc tc c c c c c d $d Dd dd dde3eNe_esefXfbffffflgxggggg8kBkUkakkR k^k^kk^,l^HlYlGmLmSmXmmmm0n]nnnnnnVoooogplppppDqqqqqqrjrrrrssUs\sssssuu#uouuuuuvv&v+v>vvvwHwOw\wcwpwwwwwwxxx$x5xIxxxyyy,zWzjzzzzzzzzG{x{{||| |-|4|C|J|W|||||||X}]}o}/ G~L~S~X~~~~0]nUglDqԂ i( .3Tk k-9@EcjrÆksxkɇЇՇHR^oR m!&  6GĊՊ܊,4iO|$+0̐Cdi{ 'ښ:$ ͛u %QnI .  >. Ξn}$ ǠRq¡@ . $. <Kޣb. 3D$vu $$(kd. u Щ":F`kkĪɪ+R 27e}R ūث߫ ',SkrwĬɬ. $Hf| SR ʮR  *Nmk|ʯR 38PR R N]gsR ̱ ʲ۲0my 0=J[׶   " : K    Է    ,  #     + v    ʺ    ͻһ޻ IJ&  F f R_.  . ľ$о۾. )@E$p&. UUUUBU==\gwOTw|$" F rK j  wux a~". [`$w.  7g "W. $. $. $. $. $ $ * Rx   >o eAAhh-F. CH$@J<A>. :>HZ_v}%/. F !-$3. $. du$!_hr{?iz-Wht$. 4$:. $>C(<A09F$[.f'3. U$JS | KPZcmvk.{.;AhNg0m+ A G b z        i r        : K R W   /6[&. .7$*RGns.  $. [`$f. v{$$. &" '. $. $. $. #   -!!!". "V ". ###T$$%%&'u'\(. (. ).**l+. (--... / 0 z00$0. 11$1. 11$1. 22$D2 2 13 33344$ 4. 4 4$0454$E4J4$44$4. K5T5$Z5. o55$56$36. N66AD7 V7a7. 7Ai888h&9N9 Y9A9h9. P:W::$:;y;. ;;/<r<<<e=='>s>>>>>R?X?. ??@hl@@@$@. @@$@@@AA$A. 'A,A$2A. @AEA$QAVA$oABB}BBBBBCIC^CcCjCoCCCCDDDDDDDEEGH H. HH$H. HH$H. II$I. "I$A$2I$I J iJJJJAJ K$KWKvK. KN KN K KKKLLN L$#L(L$1L. @L. OLTL$ZL. qLzL$L. LL$L. MM. MN MN M N N-N7NANN JN$SNXN$aN. pN. NN$N. NN$N. NN$N. ON OO PN )P.PKPjPPAPN PP QN .Q3QMQ]QQAQQN +R0RsSSSSCTHT_UN UUN UN 8VN FVYVmVN VVVVN VVN WWWWWN WWWW3X8XHXN xXAXXXN XHXN XXYN 2Y7YLY\YkYuYYYYYZA0ZN iZN {ZHyJJZ Z Z [ [ [ [ [ \ \ +\ 5\ f\ n\ {\ \ \\\\"]]]'^|^^^^^3___2````aaa3bjbbAcccc?dDddd$e. 0ecehe}eeee}ffff3 f^Be$f g 4g Dg h h iiii,>Wv  FKR$~l   f p} &  <&D T 7 .  $@]. . RW$ch$. $. ).$j. . uz$$2 Hk] 4]w]]]5bb 3]]bdb+b  ;U  .  $. )>} . . %5$;. IY$_. m}$. $. $. $$ ,$E       T d t          p      {-. q// / .0e0y0 1 i1 1i2 2. 22$2. 22$2. 22$2. 3 3$+3. 93>3$+6. K6P6$6. 66$U7`7p7Z8p888999949:4t:~|: :}: :@ : : : : $;~,; 8;}@; J;@ R; d; t; ; ; ; ; ; ; ;< <1$< 7<ra< ~< < < < << <1< <r4=I=Tp={===7=. A>r>~>$>. ?B?N?$W?. y?. ?"@.@$6@. X@. @@@$A. 4A9A$?A. \AaA$gA. xAA$A. AA$AA$A. AA$A. +BUBfB$lB. BB$B. BB$B. BB$B. BB$B. CC$C. )C2C$8C. KCTC$ZC. mCvC$|C. CC$C. CC$C. CC$C. CC$D. D D$&D. 9DBD$HD. [DdD$jD. zDD$D. DD$D. DD$D. DD$D. DD$D. E E$EE$7E X> >. ?R $?. ?. @<@. 0@<?@!M@ b@ h@ }@ @[A. A<A. A<AVYB yB B B C C +F. FF$G. H. I I. 8J FJ lJJ J>K. K. LL. $MM. M. *N. SN rN. N. NNOOO&O$SO. gOOOOOO$3P. =PBP$\P. P. PAQ qQ. QQQQQQ$R. )R7RER[RbRkR$Rh>S. zS<S. S<SOT_UT. {TT. %U VV+V6VAVJV$UV. W3W. W. W_X9X. X. jY. tYyY$Y ZR *Z. IZWZlZwZ~ZZ$Z. ZZZ[[#[$b[[. \\$\. \]$U^. y^^^^^^$^. __$_:_A_J_$P_. a. 1a?aMacajasa$a. aaaaab$c. cd=d. xe. eeeeee$e. .f$k. ù̹$O. )?H$N. z. $Ż_. . . Ǽ. . ½$ܽ.  -4=$j. ¾˾$. ѿܿ$!. OUju$L. . . . . . . &4IT[h$". 3<$. &3$8. $. . . $(2$8. HM$S. ch$$!(5$TY$n. . . T. . H. $. $. ;IWmt}$. "'$B. eo$. $. AHYdkx$}. . $r|$. #@Zaj$p. ,ALS`$f. . $2@KQ_l$. %?FO$/$G_. $$). y$. w$. $#($CQ_u|$h. $. $. \j$. $/4$:. l$. . "-6$<. _j. . $ . 0:Oipy$. $*_V. {$. &,:G$S. $. F. RW$qv$$$$.  $,:H^en$ . . $. 3AKelu$. $ek. $. M[i$. $BPep{$.  $. :. S\$|.  $<. bp~$8]. |$/3= Lh. $. '<GN[$ . $q. (=HS\$~. $. 'cm$&W. $ AJa) Y. n|$ . %/$> C. aj$o. $F= _. !.$3. . $CJ[fmz$. /6FR. %$*. z$. KP$. . $.  +mVpm $%$+. 6. Wes$$. *4NU^$. $. ]. . $_. $. <BWbmv${. py$. q. $$$. ',$a_.  *1>$C. $. z. $ !$HVkv$. $$. $$  " - 6 $ .  $  .      $ . T b p    $ . v . .   $ .  6=F$S. $. . $ $o}$$. $ . $)[. . $#:$FP$V. v$"$JJj) SX$^. $$$ $AO]sz$. . $$ (>EN$$. $. $ CN_. _. C_. G_. n&+$7<$EJ$V[$U<<  (ni. t B!BS!B!B". "/". L". ""$""$". "" 4#7$?$" K$c$%%r%%N&'' v' ' 'Bb-. ---.G.. W.\./. ./ /B/B//0=0B0$Y0. z00$0 1=1p1a 111112)2@2Q2c2p2$2 2J222) 3353U3f3s33$*"$8T8TI:T:: ;; ~<K=1> m>. >??$+?. L?Q?$W?. p?~?$?. ??$?. ??$?. ?@$ @. "@+@$1@. H@Q@$W@. e@j@$v@{@$@. @@$@. @@$@. @@@@$@. A A$A. AA$A. $B-B$qBB. C. )C: C. CC C$CC$DD$#D. -D2D$D. D. DD D$0E. HEME$SF?G. _GjG qG ~G$H. I. SI. eII$3J8J$UJ: J: JJ$J. KL$$L. 2L7L$L: B -M9MOOQQ. Q. RR$#S(S$VOX. Y. Z. Z$Z/Z4Z$Z: Z. ZZ$+[: [[$[. 4\9\$]: D]. @^: "_. _. "a. ja. 8b: b. =c: cc$cc$d#d$d: dd$ee$9f: g. Dg: g. gg$g. gg$g. gg$g. 1h6h$Ah. OhTh$qhzhh$h. Bi: vj: k. kk'k.k9k>k$kk$k. k. kk$ll$0l. :l?l$lImQm3njnxnan &qMq& oq qc_rcprrrcrr _sscs s*t*?ucPufu{ucuu u v Hv[vOvOvv w0Xwxx xz. zzzz$A{||. (}& }. }}$}~. . )8$$!$6. @E$l. $ہ. $ $. $.  aԃ &Aه . $Pl wRԑt@|̒R"'3c c ɓ R X. h. w. . Քڔ$$#($3EYb. . 49V9^jpv{Ö"05fov}×ʗїؗߗ "5R_hoyĘʘИ֘ܘ(/Eaj. ʙ ݙ$$$j7њޚ+. . . ś .. CNs.  $. ٝ. $. 4. Оڞ . (. 27$P. k. uz$. . ~ޟ. . ". E. kp$$6֠. 6. [. r|$١  $. OBx. $$ϢԢ$. $. -2$;@$K. jo${$. ţ. $ '0$GU\e$p~$$Ϥ֤ߤ$$$ $!&$27$CJO\$jx$. ť. եFE Y;_. ¦٦"/8?IPZakr|. ֧ۧ -7I. Yty$ܨ.  "$;FK$b. $۩$.Δ$$i$2 ?. . $$.  $. 16$h. $. $. Ѯ֮$. $ . $NT. qz. $$:EO . . ǰ̰$T1Z. r. . % 3. Le s. . $( 6. \Eq w. . ?. ^. }. . ״1ݴ. . E7 E S. q$$@E$QV$bg$sx$$. . j. $. s ڸs . ,1$BG$SX$$$¹ǹ$. $HM$k. $$. DI$]b$ns$ݻ. Y1_. $˼. $$).$>C$Y. νӽ$. . 81>. UZ$fk$$. ¾. ݾ. . %. @N. io. . . ̿ҿ. . . /5. P[. . . $". .MR$ci. $. $.  $#. GL$\a$w|$$$$$$ $!$B$F. */$6G = ? !  . . $. V. . $Q. nw$$$. $$5 ?' . 2K[. 4c F:FjFF. MPF+Fjqz$. $. $. $. $. (1$7. KT$Z. nw$}. $$. :Wt. [)jq A . %B_|. $$ $0[;' F/3HE|  /BEJ$fr. U. gl$c O 5 $$ ! s =V c B)! d\kjr y8 y     9 @GIN }eeeeeeeee1# : @ J ` 9Caz {U KJL\SjZ a8 L X e6t YYsYYYYYY{_2EXm ! bM.:  .  Phh:C"y )07 OTYf$l. $  U \cIj           ' A? Zt       ( o > Nee#^;A@[P NPV y'2v X /2R`   T `  2  4 x     2dPn P ' 6 HT^u u6 !; CKu|6 1~  8L hw \j@6G 6  # *by i,A]L Y+_ T8&w b J`. $ Q . */$q ! """l##$B$$%TX2z &&&&'''L J(J |((8 (. (($) )&)5)?)I))>)))))))&*5*O*L Z*. q*v*$*>*L ***+q+ ,&,-,9, H, i,! , ,,h,! ,. --&-$[-ws- - --b-! -w-.w. . %.Q. `. n.w.M.h..w(///w@/bH/S/e t/{////z /U///b*0! ;0d0x0! 0 0; 0w0 0 00h11! )1M91A1e l111H 1h12: 2w62hB2 O2 o2 2 2:2w2b222w3M3h?3I3m3w333b33334]4ww44 444hr5h55:5Ce6J9b c999 9 9J:b c:::: : N;b g;x;x;<X<. <<< < ==$n=. ==$=J >> )>6>\>c> > >?J ?,? B?_?f? ? ?J ?8@ b@ r@@w@ @ @@@ CAJ YApA AAA BJ 2BIB qBB B(BB C ?CXCJ CJ C CD #D MDDJ DD D E!EEEFF(FFH!G'G. :G?G$bGzG GG HH IwIIIJJ. JJJJJJKK5K. K>KK$K. KK$ LL$8L cLLL L L2M. KM]MfM$MwMM M MMbMNNwCN$ `N! NNhOb O! O:O:ZOMxOhOOOO O OPM*PhXPbiPP PPhP P PPMQhWQlQyQQ; QwQhQMQRR=R! iRxRRRR! RR S S!SM6SRS. kS}SS$S SSwST !T *TFT UT cTlTMTT TThU UM.U ;U; \UhjUUbU V:V$ DVhRVMZVpVwV! VbVV! WH W/W! @WLWYWfW; yWwWhWZZ: [h[. 0[B[K[$[[w[y[ \ \\b.\j\h\\w\ \ \\M\\w\ ] ] ]*] 9]U]hf]]]] ] ]h]M^! ^b<^f^H ^h^^! ^:^w^M^h__w%_ 4_ f___b_! __w``$`I`V` u` ``w` ` ````; aw/ah@aMaaH aha b:b (b 6bMbwbbwbh+cEccCchd:+dh~D~J~T~]~ f~~< v ;Awk f 22-v 5Qw6VĀ ȁ́ҁ߁$A   / = L y    ʂ ߂   K d ~` ƒЃރ    " 3 D U ` k x ff…- օY KgĆ Ά &E Tg >CLb?1k5ԉZ0P ^. uz$ĊRAG. gl$w. $@i t   :D. RW$y. $DP v. ˍލR5Z9YaXr.  Ž. Ύ . 2cvR5ZяX . 0 <ViR5ZĐX8KRb5Z@ߑX. $'. 16$L@[`$lq$}$. $4GR^5Z(X / @R5ՔZ@08Xpt~  5ەZ((Vm5Z(X>QRh5Z(X;L ] nR5ؘZX BURl5ZЙؙX *RA5gZXɚS{(C5fZXœ R&5IZyÝڝX5h5žZIjZmR5ZԠܠXBURp5ZԡR5Z;lX1ZR5P ,@ROP . #. IR5ҥZXatR5ZͦݦX.=B$cާ,5OZy(,6 P1h X & H jΪ ۪X'fΫR6<. FK$`{5Zج(<. l. ޭ . 13U c x5. ͮX#3 ? kv. 5ϯZ X0. f q. 6 $ǰа$ݰ$$$$9 Oȱ,JXd. rw$$. ֲ۲$5;. EJ$_rR5Z(.c. ƴ. 6 . @1]   ֵ.  2 LTXn. |$. Q ʶ Zu}X. $. ׷ Z'/Xf. 5Z(-Xf. ù ϹԹ$$$ $$,1$DM$~ZźQsۻ$NzX̼. ڼ߼$R$$N$DXj$hb +(M(. $h7o   ) Hj ]7 77  , ; J Y h        8 77a77\ b7}7    7$y<  y W_6L7877      T ]Y P6*>be Q 4b o 6p ba  YY&Y+Y7YD_YpYYY, 1; A RZ}     )3=M r  3O.    B ) G oB:BFKP]$x 1 9 B K T ] e { x %? Vm~          >p . $. $eb ~8E\rKQ bv\ 6 [ . .  . #($?LUi. w~ . . .  2. :CH$_ f. $$ &Q &b Ap & b |c 9fp . $ * . \  .   $ .   $ .   E J $a f $   .   $     ? B  5  .  $ .  $ .   $           .   $z .   $ .        8    $ .    .   $   & . P Y $l  & &    .   $~ *#  # N% & & & & @'  b'  a(  f(  k( t( y( w( W( ;( 0.)  l)  )  )  +  + F!+ j*+ /+ D8+ =+ F+  , Q , . , . , . - (- $1- ;- $D- I- $- - 3. . S. . B. , .  . . . K. . . C.  . .  . . . . /  / L/ / / / z%/ */ 0/ 5/ ;/ @/ F/ K/ P/ U/ [/ `/ 0 f/ n/ / / / / . 0 Y 0 Y0 Y0 Y#0 Y-0 Y70 YA0 YN0 Y0 0 50 . 0 1 $1 1 1 *1 $51 YK1 YP1 Y\1 Yb1 Yl1 Yr1 Y|1 Y1 Y1 1 1 $2  O2  c2  i2 q2 z2 2 2 2 2  2 2  2  2  2  2  '3 Q93  M3  V3 ;e3 ;n3 ;w3 ;3 ;3 ;3 Q3 . 4 4 $%4 . ^4 g4 4 . 4 5 5 $)5 25 $E5 l5 5 5 5 5 5g6 ~6 56 . 7 . A7 J7 $7 8 )8 28 K8 T8 `8 . 8 8 $8 . 8 . 9 K9 9 : : . 6: ?: $V: [: $: : $: . : : $: : $V; c; l; u; ~; ; ; rh<  < <  <  <  <  <  =  =  '=  5=  B= >  > . > > > > > > > > ? ?  -?  a }a . a a $b . b b $b . "b 'b $Vb jb . b b . b c c $c c $c . c c $c . c c $c d $1d 6d $z IEz  tz {z  z z  z  z  z  z #{ ({ $R{  `{  z{  { ? { {  {  {  { {  |  |  | *|  7|  | |  ^} l} } . } } n~ 2s~ ~ " / z  $d  n    j 2t |  m( m8 m  aʃ 2t ~ M Ƅ M    2i   B  ه g  M ^ J z  J  É c . q y  Ê  t     ɋ ߋ  b b P b '  7 F S  #  ،     # $1 s: sC sL sT s] sf sn sz  $ .  .  $  )  4  B  O  Z  g  z . |    4 ,X  n z      ُ q  3" ' v- 3 J q     $ . A  [ . s x $ ; ; ; ; ; ;ؑ   B  > BU Z $   Ē  ϒ  ڒ   . w   8    r   (  [   B˔  B    $2 : B K T ] e s x $ .  . ڕ ߕ $ x  $  /  <  G  T  x . q   c k   × ɗ ՗ + . H  N  v u    ՘  ޘ    @  Q a Mh o  }  M   5 U nњ  C    * z2 0\ ;m  w y ~  J[   I ] ޜ    ֝    " ' $5  >  F  O  X  a  i  u z $ .  .  $.  H ? _ p        ͟   H .  t  P V  J  J 8 CP  a v    b b bå b 4  ,  3 =: 2 A M | #    զ   $ u u u! u) u2 u; uC uO T $[ . r  .  $ۧ          '  IX .  έ   Y$ Y) Y/ Y< YI YU Yb Yo Y  qܮ   2 : P    ^    ; C U Ta f r  NJ U~ n    .α   ? JL   ;  L  a  x    ƴ ˴ $ش        $ . 3  M .  $  ǵ ? ޵      &  4  B  P [  h  ^  U z    T x`   ֹ  .  غ   t = [  ʻ  )  4 G P U   ż b˼ bռ bڼ - b b U ( X # q     ɽ ν $۽           ! $( . ?  Y .   $   Ǿ  վ         z E s s s s s s s s !      ) 3 = F   U  }l |    , }< -    & 0 : C  G ; ; ; ; ; ;F    %  L l  Y Q h   u u u u u u u u         F   % v A      4        X         F  n   7l q |   W ]     . 9 \ 9  . .  . 7 < $X a $}  $  $  .  @  h .  9   $0  C H $z . K   # ( $c . .     . V w .  $  $  $  $ .  # e  ~  .  2 . } .   $     . * / $M V $r { $  $ .    I  _ .  .  $   $" . < E $\ . .  $  $  $1 . I   $ Q Q Q Q     % . S \ $ .  $0 . J q 9   . < 9 . 9  $ . S \ $x  $  $  . . .  9' B . P U $  $  $  $l   . # . r   .  $ . - D . k  9   $ . : C $j s $  $0 j . 9 \ e $ y y y y    y              r2 . P {  $  . # , $ . 0 . . Q   $  $  ${  .  0 C L $j u .   $ Q Q Q Q     T   .  1 . O X $]  .  % $0 . B . ~ .    $ .   $ . ) 0 : $J Q Z $f m v $| .   $        ,   ~ e >   : l  f M  G R . z  $ .  ] .    . 4 (I . ] (r .    .   .  4 S X $g l ${  $  $  $  $  $ p   8 M y  .   $  f 6 b t   f F g y   f & G Y       @ H h  ! L    '& t 6  k  { '  1 +v }       T% T   " . J O $l .  d .    .  B .  d . 6 uB  a  q 9  .  u    K  .   " u<  [  r  9  .    u     .  1 . E dZ . n u    { .  u   ! 1  M uu    F   $  $  $  $  $  $* / $> C $R W $f k $z  $  $      "  "+ 6     " 4     "   {   "   H  d      I       a  E   (  =  .  .   .  N  .  v7 @ $L Q $` e $t y $   V .  .   .  N . % v; D $X ] $p u $  $  ! g R! . ! . ! N! . ! ! . ! v" " $%" *" $6" ;" $J" O" $" "  " # . 7# . G# ]# . m# v|# # $# . # N# # $# # $# # $P$ G$ % % . % . & 0"& . 2& 8 Z& . j& O }& & $& & $& & $& & $&  ' S 9' . c' . t' 0' . ' 8 ' . ' O ( ( $( $( $0( 5( $A( F( $( . ( . ( 0( ) $) $2) . B) 8 j) . z) O ) ) $) ) $) ) $*  ;* S {* S * . * . * 0* + $+ . + 8 <+ . O+ O e+ n+ $z+ + $+ + $+ - 5c- v- n-  - t- '. 2. . Z. _. $|. . . m . . . . . / c/ . '/ M/ . [/ c/ m/ / $/ / $/ / $/ / $0  0 $H0 ]0  0 0 . 0 0 $0 0 n1  F1 u1 1 1  1 1  2 `2 h2  2 3 b3 J3 4 :4 }^4  4 4 . 4 4 $4 . 5 5 J+5 . ?5 Q5 . e5 b {5 . 5 5 J5 . 5 * 5 5 . 5 6 . ,6 :6 JM6 . d6 up6 6  6  6 J6 . 6 u6 }7  7  "7 ?57 . L7 uX7 w7  7  7 7 . 7 u7  7  7  8 J#8 (8 $78 <8 $K8 P8 $_8 d8 $s8 x8 $8 8 $8 8 $8 8 $8 8 $8 8 $8 8 $'9  [9 9  : ):  s: :  :  ;  +; C;  t;  ; < }<<  e<  <  <  =  D=  = =  >  a> >   @ 6 S@ N f@ #s@ @  @ N A "A . JA OA $lA . A <A . A  A . A A  B . B CB . MB  xB }B $B B $B B $B B $B B $C N C IC  OC . YC ^C $C N C #C D Z7D  ID  D N D D  D  D Z@E N HE hE  E ,F  SG G H . *H /H $LH . `H |{H . H uH  H p H _H . H 2I . /I u;I hZI  hI 9vI p I U I . I I . I I . J [J J $+J 0J $ . o z  $ .   $ .  $  .  $ . 9 . ~  $  $  . V [ $G .   $  $ . ^ c $i .  $ .  .  . B .  $  $$ ) $;     S   9 9  2  I 7w   & _  6  6 .  . P l t .    . > ~ J O $r ~  $   $  ~  $ .  $o   3     7 g  y   /A | /G  Z /  .  $$      7 7B O    [  a t      . . G   8 = $N S $a    N  v         !  .  >  9 . ? H O Z _ $ , 2  . G .  $  $ 7 7     ?  L    i . T {    $q * 9  K .  ~ 8  * .  $  9 > $^ . r w $   T    <  G  V  h  x S      4  X     #       . S X $ . + b ] .  $  $ .   s   $ .  O   $ 0 [   .  O  $ . & 2 $m     .   * 1 C m $w  .  . - 2 $: . a o $x  $      $ 2 9 I s S  Z  j x   v ! 8 a  x         #  5 : C I . ^ e k v }                 "  ( . 6 ; D $    A T f        3 9 G M x       M B B B BM  r  |           / B B B B   ( 5 B O \ n u |         b t     $ 4 SF W g8   0  1 gd l j. b Xj`%  . bT\YQYYT\Y . bh ^f  1 gM T\$X` [cY  !  g+m 0*0.4:@( <I L` p '  % V g 3j `@    $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|         $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                p t x |                                   $(,048<@DHLPTX\`dhlptx|D-H-L-P-T-X-\-`-d-h-l-p-t-x-|---------------------------------... ..... .$.(.,.0.4.8.<.@.D.H.L.P.T.X.\.`.d.h.l.p.t.x.|................................./// ///// /$/(/,/0/4/8/ #include #include #include #include #include #include #include /* modem modes */ enum MODEM_MODE { MODEM_MODE_DATA = 0, MODEM_MODE_FAX = 1, MODEM_MODE_VOICE = 8 }; /* modem status */ #define STATUS_OK 0x0 #define STATUS_NOCARRIER 0x0002 // 3 #define STATUS_ERROR 0x0004 // 4 #define STATUS_NODIALTONE 0x0010 // 6 #define STATUS_BUSY 0x0020 // 7 #define STATUS_NOANSWER 0x0040 // 8 #define STATUS_DP_LINK 0x0100 // 13 #define STATUS_DP_ERROR 0x0200 // 14 #define STATUS_PACK_LINK 0x0400 // 15 #define STATUS_PACK_ERROR 0x0800 // 16 #define STATUS_EC_LINK 0x1000 // 17 #define STATUS_EC_RELEASE 0x2000 // 18 #define STATUS_EC_ERROR 0x4000 // 19 /* * parameters * */ #define MODEM_FORMAT MFMT_S16_LE #define MODEM_RATE 9600 /* 8000 */ #define MODEM_FRAG (MODEM_RATE/200) #define MODEM_MIN_RATE 300 #define MODEM_MAX_RATE 56000 #define MODEM_DEFAULT_COUNTRY_CODE 0xb5 /* USA */ #define MODEM_CONFIG_CID 1 #define MODEM_CONFIG_VOICE 1 #define MODEM_CONFIG_FAX 1 #define MODEM_CONFIG_FAX_CLASS1 1 #define MODEM_CONFIG_RING_DETECTOR 1 /* * type definitions * */ /* modem driver struct */ struct modem_driver { const char *name; int (*start)(struct modem *m); int (*stop )(struct modem *m); int (*ioctl)(struct modem *m,unsigned cmd, unsigned long arg); }; /* modem data pumps driver struct */ struct dp_driver { const enum DP_ID id; const char *name; const char *code; struct dp_operations *op; }; /* * * compressor definitions * */ #define COMP_MAX_CODEWORDS 2048 /* dictionary size */ #define COMP_MAX_STRING 34 /* max string length */ /* encoder and decoder states */ struct comp_state { const char *name; enum COMP_MODE {TRANSPARENT,COMPRESSED} mode; int escape; /* escape state: decoder only */ u16 update_at; /* update dict. at node */ u16 next_free; /* next free dict entry */ u16 last_matched; /* last matched dict entry */ u16 last_added; /* last added dict entry */ u16 cw_size; /* cw size */ u16 threshold; /* cw size threshold */ u8 escape_char; /* escape char value */ int max_string; /* max string length */ int dict_size; /* dictionary size */ struct dict { u8 ch; u16 parent; u16 child; u16 next; } *dict; /* dictionary */ /* fixme: union may be used? */ int bit_len; u32 bit_data; int flushed_len; /* string length already sent */ int str_len; /* string length */ u8 str_data[COMP_MAX_STRING]; /* test statistics info : encoder only */ u16 cmp_last; /* compressed bits per last TEST_SLICE chars */ u32 cmp_bits; /* total compressed bits */ u32 raw_bits; /* total non-compressed bits */ /* temporary */ int olen; int ohead; char obuf[1024]; }; extern int modem_comp_init(struct modem *m); extern int modem_comp_config(struct modem *m, int dict_size, int max_str); extern void modem_comp_exit(struct modem *m); extern int modem_comp_encode(struct modem *m, u8 ch, char *buf, int n); extern int modem_comp_decode(struct modem *m, u8 ch, char *buf, int n); extern int modem_comp_flush_encoder(struct modem *m, char *buf, int n); extern int modem_comp_flush_decoder(struct modem *m, char *buf, int n); /* * * HDLC definitions * */ typedef struct hdlc_frame { struct hdlc_frame *next; int count; int size; //u16 addr; //u16 ctrl; u16 fcs; u8 *buf; } frame_t; /* * LAPM definitions * */ #define LAPM_MAX_WIN_SIZE 15 /* max supported winsize */ #define LAPM_MAX_INFO_SIZE 128 /* max supported infosize */ #define LAPM_INFO_FRAMES LAPM_MAX_WIN_SIZE + 1 /* number of info frames */ #define LAPM_CTRL_FRAMES 8 /* number of ctrl frames */ /* lapm state */ struct lapm_state { /* modem link */ struct modem *modem; int state; /* sub-states: may be optimized */ int config; /* those DATA sub-states may be optimized */ int reject; int busy; int peer_busy; u8 cmd_addr; u8 rsp_addr; u8 vs; u8 va; u8 vr; int rtx_count; /* retransmission counter () */ unsigned int tx_win_size; unsigned int rx_win_size; unsigned int tx_info_size; unsigned int rx_info_size; frame_t *sent_info; frame_t *tx_info; frame_t *info_list; frame_t *tx_ctrl; frame_t *ctrl_list; /* temporary: internal buffs */ /* rx buf (used when enter busy state) */ int rx_count; int rx_head; u8 rx_buf[LAPM_MAX_INFO_SIZE]; /* temporary: frames bufs */ struct { frame_t frame; u8 ctrl[4]; u8 info[LAPM_MAX_INFO_SIZE]; } info_buf[LAPM_INFO_FRAMES]; struct { frame_t frame; u8 ctrl[4]; u8 info[LAPM_MAX_INFO_SIZE]; } ctrl_buf[LAPM_CTRL_FRAMES]; /* temporary: debug counters: remove it */ int info_count; // debug int tx_count; // debug int sent_count; // debug int ctrl_count; // debug }; /* modem struct */ struct modem { const char *name; int pty; /* pty descriptor */ const char *dev_name, *pty_name; /* and names */ struct termios termios; /* device driver */ struct modem_driver driver; void *dev_data; /* modem states */ unsigned modem_info; unsigned state; unsigned started; unsigned command; unsigned result_code; unsigned hook; unsigned caller; unsigned rx_rate; unsigned tx_rate; enum MODEM_MODE mode; /* data,fax,voice */ /* modem events (ring,escape,waiting for connect,etc) */ unsigned event; unsigned new_event; struct timer event_timer; /* modem parameters */ unsigned min_rate; unsigned max_rate; unsigned char sregs[256]; /* s-registers */ const struct homolog_set *homolog; /* homologation parameters */ /* at processor */ unsigned int at_count; char at_line[64]; char at_cmd[64]; /* ring detector */ unsigned int ring_count; unsigned long ring_first; unsigned long ring_last; #ifdef MODEM_CONFIG_RING_DETECTOR void *rd_obj; #endif /* cid */ #ifdef MODEM_CONFIG_CID unsigned cid_requested; void *cid; #endif /* dialer */ char dial_string[128]; /* escape counter */ unsigned escape_count; unsigned long last_esc_check; /* xmit queue */ struct xmit_queue { int count; unsigned int head; unsigned int tail; unsigned int size; unsigned char *buf; } xmit; /* run time configuration */ struct modem_config { /* ec params */ u8 ec; u8 ec_detector; u8 ec_tx_win_size; u8 ec_rx_win_size; u16 ec_tx_info_size; u16 ec_rx_info_size; /* compressor params */ u8 comp; int comp_dict_size; int comp_max_string; } cfg; /* modem packer */ int (*get_chars)(struct modem *m, char *buf, int n); int (*put_chars)(struct modem *m, const char *buf, int n); //int tx_window; //int rx_window; int bit_timer; void (*bit_timer_func)(struct modem *m); void (*packer_process)(struct modem *m, int bits); struct bits_state { int bit; u32 data; } pack,unpack; int (*get_bits)(struct modem *m, int nbits, u8 *buf, int n); int (*put_bits)(struct modem *m, int nbits, u8 *buf, int n); union packer_union { struct async_state { struct packer *packer; int data_bits; int stop_bits; int parity; int char_size; } async; struct detect_state { int tx_count; u8 tx_pattern[2]; int rx_count; u8 rx_pattern[2]; int ec_enable; } detector; struct hdlc_state { struct hdlc_frame *tx_frame; struct hdlc_frame *rx_frame; int rx_error; int rx_ones,tx_ones; /* framer interface */ struct hdlc_frame *(*get_tx_frame)(void *framer); void (*tx_complete)(void *framer, frame_t *fr); void (*rx_complete)(void *framer, frame_t *fr); void *framer; /* temporary: internal bufs */ struct hdlc_frame _rx_frame; u8 _rx_buf[512]; } hdlc; } packer; /* error corrector */ union { struct lapm_state lapm; } ec; /* compressor */ struct comp_struct { // fixme: redo interface int head,count; char buf[256]; struct comp_state encoder; struct comp_state decoder; } comp; /* modem data pump interface */ unsigned srate; unsigned format; unsigned frag; unsigned dp_requested; unsigned automode_requested; int update_delay; void (*process)(struct modem *m,void *in,void *out,int cnt); /* process counter and sample timer */ unsigned long count; unsigned long sample_timer; void (*sample_timer_func)(struct modem *); /* data pump */ struct dp_operations **dp_ops; struct dp *dp; void *dp_runtime; /* dc evaluator and cleaner */ void *dcr; /* dsp info data */ struct dsp_info dsp_info; /* voice info */ #ifdef MODEM_CONFIG_VOICE void *voice_obj; struct voice_info voice_info; #endif #ifdef MODEM_CONFIG_FAX void *fax_obj; #endif }; /* * prototypes * */ /* device driver --> modem */ extern struct modem *modem_create(struct modem_driver *drv, const char *dev_name); extern void modem_delete(struct modem *m); extern int modem_write(struct modem *m, const char *buf, int n); extern void modem_hangup(struct modem *m); extern void modem_update_termios(struct modem *m, struct termios *tios); extern void modem_error (struct modem *m); extern void modem_ring (struct modem *m); extern void modem_event (struct modem *m); extern void modem_process(struct modem *m,void *in,void *out,int cnt); /* packers && EC */ // FIXME: improve interface extern void modem_async_start(struct modem *m); extern int modem_async_get_bits(struct modem *m,int nbits,u8 *buf,int cnt); extern int modem_async_put_bits(struct modem *m,int nbits,u8 *buf,int cnt); extern void modem_detector_start(struct modem *m); extern int modem_detector_get_bits(struct modem *m,int nbits,u8 *buf,int cnt); extern int modem_detector_put_bits(struct modem *m,int nbits,u8 *buf,int cnt); extern void modem_hdlc_start(struct modem *m); extern int modem_hdlc_get_bits(struct modem *m,int nbits,u8 *buf,int cnt); extern int modem_hdlc_put_bits(struct modem *m,int nbits,u8 *buf,int cnt); extern int modem_ec_init(struct modem *m); extern void modem_ec_exit(struct modem *m); extern void modem_ec_start(struct modem *m); extern void modem_ec_stop(struct modem *m); /* status & config */ extern void modem_update_status(struct modem *m, unsigned status); extern void modem_update_config(struct modem *m, struct modem_config *cfg); /* modem parameters access macros */ #define CRLF_CHARS(m) ((char *)((m)->sregs+SREG_CR_CHAR)) #define MODEM_DP(m) ((m)->sregs[SREG_DP]) #define MODEM_AUTOMODE(m) ((m)->sregs[SREG_AUTOMODE]) #endif /* __MODEM_H__ */ slmodem-2.9.11-20110321/COPYING0000644000175000000620000000325310773430100014011 0ustar marvstaff /* * * Copyright (c) 2001, Smart Link Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Smart Link Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ slmodem-2.9.11-20110321/faxing/0000755000175000000620000000000010772070434014240 5ustar marvstaffslmodem-2.9.11-20110321/faxing/xtel.diff0000644000175000000620000000373210772066107016055 0ustar marvstaff*** xtel-3.3.0.orig/xteld.c 2008-03-10 23:02:40.000000000 +0100 --- xtel-3.3.0.modif/xteld.c 2008-03-09 22:17:40.000000000 +0100 *************** *** 1088,1094 **** fprintf(fplog, "%s, %s appel de : %s sur %s\n", at, utilisateur, service, definition_lignes[numero_ligne].nom); fclose(fplog); } ! #ifdef NO_TERMIO parite = definition_lignes[numero_ligne].parity; #endif } --- 1088,1094 ---- fprintf(fplog, "%s, %s appel de : %s sur %s\n", at, utilisateur, service, definition_lignes[numero_ligne].nom); fclose(fplog); } ! #if defined(NO_TERMIO) || defined(FORCE_PARITY) parite = definition_lignes[numero_ligne].parity; #endif } *************** *** 1561,1567 **** kill (pid_fils, SIGTERM); } else { ! #ifdef NO_TERMIO if (parite != SANS) { register int p; /* Calcul de parite... */ --- 1561,1567 ---- kill (pid_fils, SIGTERM); } else { ! #if defined(NO_TERMIO) || defined(FORCE_PARITY) if (parite != SANS) { register int p; /* Calcul de parite... */ *** xtel-3.3.0.orig/Config.tmpl 2008-03-10 23:02:40.000000000 +0100 --- xtel-3.3.0.modif/Config.tmpl 2008-03-09 22:24:00.000000000 +0100 *************** *** 19,29 **** /* Pour gnrer avec OSF-Motif */ #define MOTIF /* Pour ne pas utiliser TERMIO */ /*#define NO_TERMIO*/ /* Pour ne pas utiliser le slecteur de fichier (sous Athena) */ /*#define NO_SEL_FILE*/ /* Pour les radins */ /*#define LOW_MEMORY*/ --- 19,36 ---- /* Pour gnrer avec OSF-Motif */ #define MOTIF + /* Pour gnrer avec Xaw3d plutot que Xaw */ + /* (ceci suppose que MOTIF ne soit pas choisi prcdemment ) */ + /*#define XAW3D*/ + /* Pour ne pas utiliser TERMIO */ /*#define NO_TERMIO*/ + /* Pour forcer l'usage de la parit avec NO_TERMIO non dfini... */ + #define FORCE_PARITY + /* Pour ne pas utiliser le slecteur de fichier (sous Athena) */ /*#define NO_SEL_FILE*/ /* Pour les radins */ /*#define LOW_MEMORY*/ slmodem-2.9.11-20110321/faxing/smartlink.pdf0000600000175000000620000051000010772066107016725 0ustar marvstaff%PDF-1.3 % 185 0 obj << /Linearized 1 /O 187 /H [ 1346 717 ] /L 166808 /E 30353 /N 37 /T 162989 >> endobj xref 185 41 0000000016 00000 n 0000001171 00000 n 0000002063 00000 n 0000002281 00000 n 0000002455 00000 n 0000002496 00000 n 0000002519 00000 n 0000003948 00000 n 0000003971 00000 n 0000005077 00000 n 0000005100 00000 n 0000006238 00000 n 0000006261 00000 n 0000007376 00000 n 0000007398 00000 n 0000008453 00000 n 0000008475 00000 n 0000009498 00000 n 0000009716 00000 n 0000010000 00000 n 0000010175 00000 n 0000010363 00000 n 0000010430 00000 n 0000010507 00000 n 0000011194 00000 n 0000011377 00000 n 0000011605 00000 n 0000014498 00000 n 0000021605 00000 n 0000022085 00000 n 0000022614 00000 n 0000022887 00000 n 0000023205 00000 n 0000023652 00000 n 0000023675 00000 n 0000025432 00000 n 0000025455 00000 n 0000027524 00000 n 0000027664 00000 n 0000001346 00000 n 0000002041 00000 n trailer << /Size 226 /Info 184 0 R /Root 186 0 R /Prev 162978 /ID[] >> startxref 0 %%EOF 186 0 obj << /Type /Catalog /Pages 170 0 R /Outlines 152 0 R /OpenAction [ 187 0 R /XYZ null null null ] /PageMode /UseNone /JT 183 0 R /PageLabels 168 0 R >> endobj 224 0 obj << /S 852 /O 1001 /L 1017 /Filter /FlateDecode /Length 225 0 R >> stream Hb```f``ub`. 'P^`PP0o̎KX{:4gtigǔ!P >AE"!_MMM'cƆ ͏umvԳkm_m@Y&tՍ893gLY/g'g*N]Y0M-caKY6*3ڪ)+jj6_ŧrVIǩ+uf Ns`Pa`pEsf. tPPC eKd#v!a-[Lq+3Oq3O0'x^he0gahbf00e/eel x#( P._ endstream endobj 225 0 obj 592 endobj 187 0 obj << /Type /Page /Parent 169 0 R /Resources 188 0 R /Contents [ 191 0 R 193 0 R 195 0 R 197 0 R 199 0 R 201 0 R 219 0 R 221 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 188 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 209 0 R /F3 204 0 R /F4 215 0 R /F5 213 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 189 0 obj [ /ICCBased 223 0 R ] endobj 190 0 obj 1349 endobj 191 0 obj << /Filter /FlateDecode /Length 190 0 R >> stream H엻%5~R. 9!"ZX݀ x}mt4΢o>/=Q4''AL:_GS!L\y$P$%LH2(wK3X;z;Ô@za)[KՑ^SC+c$3\800`[J*<ig꼳`tFs:Ν-*Yhand3iw& %k?9^DK3G?X"<_gO?JN176v쎡cP&%0=̾J`%s!~B4;@І-%l^l|L>\lْ1nON?}ga;G?D4lxX,1:ihkDX٫L\Vw2ZG$Yylw8Ǔ)_^Qdn\Gy-cE?\ fm{;3wqNJ9bk U3bk1P}9ӮR J]Gu}mvs9o5@v+4R^g2_/i_0Z0Y11m0#Po.Oƶ>h=)B4hcs` 3Zw"m85"\ҭ$b!q٨`Jۥ8ĀBX}_٦dmv/zfqQ"-.`̰f[Ǜ"x39Z1)8rzB " V-E(QdAPG*W|%mS!&=>z 5 #),kf $,ز=.\Pߧ?>[+- endstream endobj 192 0 obj 1026 endobj 193 0 obj << /Filter /FlateDecode /Length 192 0 R >> stream HKnF Eo*~TBO{ A2h{çg[ =hǷbӱֽmv^YG->v5$^߇}CZFQQY[N.8'Q3^Gdڱ76^l}^ε1=흿??Xm|"[Ekum|F}ٯu{`Vӂfpf<33xfϬpYѣ-y:;:;;;;_8yx<8O#4r@< hEg8O#Yy9 pFiE8O#4r@< hEiy9 p60000000PPPPPPPP`{+Oם$[*! $CA|b}p-[ #ڿ_F[TđNH`ݦ{y5h:[ُzDmN34=?i+5_8mVW޸ZI6d5~xcҾ3o_"'6O* endstream endobj 194 0 obj 1058 endobj 195 0 obj << /Filter /FlateDecode /Length 194 0 R >> stream H|K E罊7NU(/(Y@?fuJ4?\kѕޅxN ˯ }r_ij7ޙLo޵x]{6Dsާ靲8867;f{`173 '第x,KULRyd5pst8;8zUtbnt%YY}2?ZLƊ)+_8-Okk>8n3} ,x"eęF`m)gIccbiw *gX*'n]g>yz%pދchAW+?_f>9<9B3l=8ű7Ơ3b뉟bd*bZ!6nFV20ԪV9F^>1({#|b^.b PlP, @e _1YRpJU2̇s3^:"X,4f9eA.w+]¸ߔMHblpBփ[DcjyգVC V&تRg_)*#}b>㌳t7."3Ⱦe;~:g:M&DtzE3B,<1ޱCb V0! ZM 4^dK*4kSӬجud\uU+Ќᗥ)f1w0dt͗YlU2*R+*c3*T4Xo[V٪w[ U[ O+*]k@+l2Y(T nZ:fK^;2Z]PM'*NBs_[eYPYuX Ye(*RFU z΅V;FU z΅1BKB]y(BKЊ`lfZ:ǬZh#fF` endstream endobj 196 0 obj 1035 endobj 197 0 obj << /Filter /FlateDecode /Length 196 0 R >> stream H|Kr0>ש |H(9@ Zz-+wk-ߩ;d| XNj!Oڎp4JS9i=;>Ra.՜ZoҔפ̫u@Kab(I?lv09 fflRj֩4 mXR^Ik%lU7ed |Dkui&F6;;4Kx2,xbRNAl?&v)T5eS.VWUZuXK5 lʝ7?vW&o7nf sq=w[% o["R(:sssK/HN:8;锞z\B>X9WUlSzp[F" E?PV1UVR`+WmWc.*!ɍL`#Ѥv'O7ZQk&}?\VEtIVۜȓAfD)К?dRj}kAZut(CBvR>Qan!؇K&x,CX˰eϭF:*+_zQwȽee} 6᭄+ZTJ2%ZuҰi4zC}0t! DRI[J0W9LuJJqg0,%;s|Lv[N0L;3t}If uQAo;3q FrBԝFeq&#`-%XxK QW}? <`-'Di_xnύ >"% f͸u*q9\NSkjcr9\NSw{ n'ՙuIvBԝD"IV!D#Ef{r%4NTOI6fb Ul)Č,1cYi5x֍0#+VhحD`Ffۓ_"3lY]j$f FI%fd H2'%f{r % endstream endobj 198 0 obj 975 endobj 199 0 obj << /Filter /FlateDecode /Length 198 0 R >> stream H|Mr:Ou.IXBO]]~~,PW'UltV,ɠЧnoFH[L\à]ƷWQSLKP_=iu{)W;>MM$no\zɨÿ sM endstream endobj 200 0 obj 943 endobj 201 0 obj << /Filter /FlateDecode /Length 200 0 R >> stream H|K1 нOu>@HlZ5%?]y:ӥo-v,-iqӷy(|vΓ~ޮrNG >ڸzDmiFeW[G] W-ըjb5\,6:e>?TvtCw0ê$ڥ]X+CdbTv`̓Vh% 4F-76zYNНMq[F&iFeG76A\غ#vLĕAսrA\>@Tvc͙/3j.sJlaqh42㲙≠y̳P$46'[năAսrAoi[Z𾶜;.;A7FiFeG7?\讖V_ JXQѕ5ڿK _ *;A 7 # zAoqwe eby4㲉=ȸr$46' n.u;# 4[n,յ 9 Zpև -ji\s;&NŠN^ n +jtQ.t]PsY6pB(|f Des-03`De7g>@\<:/ #W7ؓ{ xe'2NqdAJ4eX~bTvq' 2}،nnd~As=z! endstream endobj 202 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ 0 -12 281 171 ] /FontName /ANLBKP+MSTT31c22900 /ItalicAngle 0 /StemV 0 /CharSet (/G11) /FontFile3 203 0 R >> endobj 203 0 obj << /Filter /FlateDecode /Length 192 /Subtype /Type1C >> stream Hbd`ad`ddqq  16L6240k.qgV M 7? N "nhb c;H9EWhY.zaYr2**2r8*s2SÓfʖYYek箖zɒ58Y;u4}23 ¤F endstream endobj 204 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 1 /Widths [ 338 ] /Encoding 206 0 R /BaseFont /ANLBKP+MSTT31c22900 /FontDescriptor 202 0 R >> endobj 205 0 obj << /Type /Encoding /Differences [ 1 /G32 /G58 /G55 /G03 /G36 /G52 /G49 /G57 /G5A /G44 /G48 /G2C /G56 /G3C /G30 /G47 /G50 /G25 /G2F /G24 /G26 /G2E /G37 /G28 /G27 ] >> endobj 206 0 obj << /Type /Encoding /Differences [ 1 /G11 ] >> endobj 207 0 obj << /Type /Encoding /Differences [ 1 /G2F /G57 /G47 ] >> endobj 208 0 obj << /Length 616 /Subtype /Type1C >> stream ANLBIP+MSTT31c21c00/ RokHH  G57G47G2FMSTT31c21c00/GWpd؋̻åwwcP$fL\}kqlpoUs9|n%|Nu}kvE`}x8,#9bluu7(B)M[g\^y^Y`ihzùwnȔ{v}{zyuvsus[`Y5WWq3ks|{Ľ:g<goyŮu];XPSfeSUyU]hrq3԰ƵƵ endstream endobj 209 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 3 /Widths [ 616 280 504 ] /Encoding 207 0 R /BaseFont /ANLBIP+MSTT31c21c00 /FontDescriptor 210 0 R >> endobj 210 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -28 -14 579 677 ] /FontName /ANLBIP+MSTT31c21c00 /ItalicAngle 0 /StemV 0 /CharSet (/G57/G47/G2F) /FontFile3 208 0 R >> endobj 211 0 obj << /Filter /FlateDecode /Length 2800 /Subtype /Type1C >> stream HTUiTIjjaQji(QAAqёAD.Q//ĕAWu|2Ǻ$۸̈|L'0 f:uܼm#2ԺZ6S3^+}8s9_'Nϙ peNd< g}'6Ʀ YX˖ZΟ85\IpV6Tm9 Nɴ_(8'udK8dK9NK9 t_pVaȹNb?agl,;e`Jk <p C``^}Yc`L Dww棆)ϷvUUAWЊ#ȈBKoe}N?+>hm(')|_& ytUi?4WTǔG^x'Ǎ>ծ"R%v\S~-~Ô7 yˁ7ɛ/Mw @зȝBcB,'9xtvY]FͣG_QЖ!U1ܽߊ;؁-Z+n^eFh32`-JUX]O[渗5<܊ڥV>2 p"ZѢSɸԮ^ f7~xq-aPvڌ~FO?(= ]gK+/ mQsJPdaosHeMFY!u%xg>s1!2{?<=)K'cmGм ![ȭ;SDP1텉LbaYz5P{./-Sr۲Œ6V`4[Wp@  V4[o@lh0'{Y M8ayyaLhUs-%m('Kg?zH &u736 @ o||ģFc(S=kC֤;w,dp+~~ i#֬t$f·րh̵ !jy!4-G`Ĺ3ԓ5LuTEzObH GF ǻ4cE!(G&~ghg98ȉ^vԕ7Ew/O}z0KJ&NaG{E[ H:m0~ڵgK[s9HO?kbu9c5y` L~#g2wX!MQcZH3>ބ4!x0i-IܦyDfy-ifLQVX-q\xTt0s$$$9R}(m ږ?Q}u=NS)mu* SJe,:Ykr {x\X˩ . ~/ @p>Mbpd2{>.> stream HTyTSWs yylKx .2+FBT850YZ! 8:3ig<ڞ~wֆp]1\1bYĦ͛)T 2l_nMrt;4,៖Jcx Gu5tK=`.'[<7Dp2/puPphXxocmOHړu$N(BᥲʚΞ#>xo/J P`(j5TʠLUPr^r( Pf*,4P B|-T&J([UP5rA,*L PrT 6CZ+ճPY+Z([UlPr%Tˡͣ T@ 0PE9@8yj 'ȋՁvA>(ˠ S#pj A'fp|΃bP '`\YpZg c$8.*O psTz>0@(5tIN#ׁ{{{m ^%|v~9NkwʮlW{gq]wutwp|I߂D34g9s#gE5wܲy ]%)_*jWnݦ'!\$'RΊEi % (RQqȀLĤLb ;{Dl%NlĽ(2R o#ksܸ #37#R8Tfim)93DbwB0cA|BFk?6h2"ʼn4 (}CI W֕'KxDwMI_a^4na2,^mb/Ad*NjQc/%0'\[ijFfb& eZT[.̨k~(66TK*;.Hht g2Y]*ʐrQ/xsmol챍DkzyvD e?_G CSd|hӫ72F}\i8*.+9Yt(ll"k;y91"-DD'';b Od#wGA#"BnHO=l8F <YEm=f$g -U&basb's%12Fxne=%v++7NR"#O4ՋHџptB$O#,ƿ@QcSUnR_-Ta_tG*?nXo?ӮնdnCq0y4lsṃ)aq9 Q< P baP;!.Qƒ?iG&$<%=6d`>[U mf&\(~ž~E^m #DG\Yݐ",c(S]y2J\O#Cc,@c}1!{&SY["7i;YxO󲿗f$#b/mqrEOwwZY!T.r'"ЖC-/4`>}x4XAA5[NJkn\R:[6kռ:!"; OOHÃ1qT+7j5F+Jkm/ڑJl_%^V%[RTykk(l&~Y.n{"沰@S_  9I Ro7Hc f@|q|ڌNd%w;aABf˔F1bm<:P2ǰ^Vn8 emѾ:o88n9INmG "sUK,M=[EE|rQL՞gІC$b z:W,辩.*6Õ)+,:+f7X.1Nu@sV[̸R^3sťEuy]tnׅ fA1ҞT[[FhIkUZM1 Xi OQa` *pT&$b4 LHy0% )t(}dQ\)N@JgX X2 t*pQ {tٔ 5Nj -^yZUVFŵqր4[8vdt%4l$[LvbZ3\A"ـ,X `=܄GX,Otap/&pNXv@ڟw ~g޹vOLX͂[ L|?\(ɂOaK @7O3?HX=xK`G'Y9ςmBQLharUIis }E}QcobϢDJAL&?z[wl>%y~^ ÐI}SU*j.UGF^|ODGiuTD* nE@H$l"i*,B5a *e*TE-mp =su9C@57u/Rm,&2n2l~ѲU9jBeVjNZZ|m4FI9(jk~ fV٤48% -. q^DkjYӮnrU/@R}2u[5 OѴx--?.\ i >EbD0Q\ K`i؟!w!M. epub||. YZ@#7dSl;̋yK1B LB/IxZZ?uW4᧚n%&x;Y3ɃVqbt@W'nrgwz< ˃wf{8s<0}3/y@~,4sZ 7Ԍ(k!Z+MVO}(Y8HEw_G$ON4L!6| rHQ2Dm p!>NlPǻ-VTbgNaG*1GԿoEL ))8VyʼnSOeq;t޷+k]y𒺖^T6VTJ~.K?~EVʔD9[hԸ(6*Nv̇xAHGDcމщTp8 b" tKyMQ^̪&)E;Ay>i|W C+0ĝ)ص>h.枯Q{_FUBUf:hͽ]KlkNsK<ʷ;"$n~{0'G4⏯kLk fl |%Dw(b4{;;ث0:ĝc(`</+]q~?^9moCSu9yžѡP8i"ؗc:Gf+z_ b )]@6/&ZUOtLNm +Z{Rțq>&ħ6JjDA 9 (#8hQU\y]j7jVW̽L+MA'|_ga%[g]ٰ |FXwq_0GSWƺ2>lw>C ==Pdc }|J0vtzMNwm+A ŀi5!rKae9TP%Lo[)l[t2iyp,?2Sc8Uq|j:TVH2Ѿ)1RV ⴝ)C%/ceBzV\}&uYE|xoax@89D yhx*,Le173-%lfv)>9m%z=^;~t+1Շ׊"q?()ѡlhѐ$1(ieW=揞fRI%d^lZeâNI4!i1:&Yj NhM\pV0#IA2Yh/,x$ZaxΕ7RbZٶȲ , -Ik h dЛ1;jӊgBv^ƚAxkven5Fx)$jC'G]T Iu2"-(O+uDȻ(#!GNԨHK E T|mr˥bC[YYK#P~( ~/7'_f#oBGF܏E2?S>.D]DDyDv Kg ΁ l /KD,S^XyG굌DH*;?dA8K01y:iYTvNjuNeQ!A(hfsDh*|ϴoCudwmC5SH3^zJ? ?3V^Vs ®il2zS鞨=DOQF{<!Օ*u2Y+|RAPS w=8) G^(B;>9Awkns8*CI\ ^rVܨm2T f:5E[P > ,ӕMc9X3F:n/ml6@y /"H3bب CBKYB5S~ cmƃqSjr`'l I6 gcEܹ-~M9(8fo2vd`Noc.g|AFA7s3Q "%Zń;8C˯:Y <[P\iUW]RUuD\V't)(j'C2i'uYD!jF?Ѐa~k>>" endstream endobj 213 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 76 /Widths [ 669 893 558 391 334 279 613 279 613 558 836 613 613 558 558 725 613 725 334 725 613 558 558 725 558 613 279 558 558 278 778 333 278 556 556 784 616 722 944 722 556 584 611 333 561 728 561 335 561 672 672 561 616 616 672 280 672 896 588 335 588 588 335 561 561 392 561 672 561 728 728 278 333 556 333 278 ] /Encoding 217 0 R /BaseFont /ANLBNM+MSTT31c24d00 /FontDescriptor 214 0 R >> endobj 214 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -10 -210 943 728 ] /FontName /ANLBNM+MSTT31c24d00 /ItalicAngle 0 /StemV 0 /CharSet (/G09/G47/G3B/G16/G2F/G48/G3C/G17/G55/G30/G0B/G49/G24/G18/G56/G31/G0C/G4A\ /G25/G3E/G19/G57/G32/G0D/G4B/G26/G3F/G1A/G58/G33/G0E/G4C/G27/GB1/G40/G1B\ /G59/G0F/G28/G03/G1C/G35/G10/G4E/G29/G42/G1D/G5B/G36/G11/G4F/G2A/G1E/G5C\ /G37/G12/G50/G2B/G06/G44/G1F/G38/G13/G51/G2C/G45/G20/G39/G14/G52/G08/G46\ /G21/G3A/G15/G53) /FontFile3 212 0 R >> endobj 215 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 25 /Widths [ 781 613 391 279 669 613 334 334 781 558 558 279 558 669 836 613 893 728 616 728 728 728 616 672 728 ] /Encoding 205 0 R /BaseFont /ANLBLN+MSTT31c24200 /FontDescriptor 216 0 R >> endobj 216 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -12 -13 882 728 ] /FontName /ANLBLN+MSTT31c24200 /ItalicAngle 0 /StemV 0 /CharSet (/G44/G3C/G55/G2C/G03/G24/G56/G25/G36/G57/G2E/G47/G26/G58/G37/G50/G2F/G48\ /G27/G30/G49/G28/G5A/G52/G32) /FontFile3 211 0 R >> endobj 217 0 obj << /Type /Encoding /Differences [ 1 /G36 /G50 /G44 /G55 /G57 /G03 /G2F /G4C /G51 /G4E /G30 /G52 /G47 /G48 /G56 /G24 /G37 /G26 /G10 /G35 /G4A /G15 /G1B /G31 /G59 /G45 /G0F /G14 /G1C /G4F /G32 /G49 /G11 /G16 /G19 /G2A /G58 /G09 /G3A /G2B /G13 /G0E /G29 /G1E /G17 /G25 /G46 /G1D /G18 /G3B /G39 /G1A /G4B /G53 /G3C /G3F /G28 /G08 /G20 /G3E /G1F /G21 /G40 /G42 /G5B /G0D /GB1 /G33 /G06 /G38 /G27 /G2C /G0B /G5C /G0C /G12 ] >> endobj 218 0 obj 1677 endobj 219 0 obj << /Filter /FlateDecode /Length 218 0 R >> stream HWɎ-7ݿH)yĮҫ,zMLW U}OOw_$ "şQ5M,r׏wWY0KόwJEg;M$-m,=s)+g943ם3UzWf*:qk"XZQ™g;e̢3睦-w`\WU[^n,'aH7|*=)+|{M䜥( x,|*=s)+|{M,˜?VE|{;e{ooNk)+x;MBؿ|7J׿!Y 8* cJOXE'{M\EZ9t\_Og;e\oQ 9++y{M\6k^Og;e o7*Nv2>n}݇F"Os&jo ~|tGfj4b= Ll8Z9(9rst{hAaw퇺ӰFkLwְiꂳ8lLУKOk[2ybDDߌ|H SqHHze- ]Eț6vi4Z (wJ )32ߔ"Zbczz1 t5SW'cTl{q,.m)#f Wmh0KF |ɷI\ DK 14/_2r]i`"Su2aL0}zqv-fGne6 Pe1x:|k|0{k_Y:nl-g'3D*i統ƻk9q3(nq\aDfÌ6q.Y"喤A]t!.)sfkdΜOR5Ra4@u A?%2͌ZLj܋TM˸(< O;w-J@auۄT+OFXI6H/zM2͏Q*8bN} xB*6OXĴ(w$b% ?1]1I_ /=Q#X`5f1zae`՛w{?#YX=, |c4unon9~s2C8(ariPZ_r?F<fNuDzbHh"CkhE+Jb*7؈U?(DHY+޴e8>ϒ/5 Tn]`]7Y:uY#mX?r5 {`cyOVÐଷ2<0Tzd9Ϧn'> }!+h-' g;{O/xp@u"YNcGތ{ȉv ު%mA.)~7C0sAFy0`#qR)tjE(|jg>rYbx{yn`+bzF,9^f+X{z@wq`F^ZsBl D{S_ϳ-,"fC endstream endobj 220 0 obj 1989 endobj 221 0 obj << /Filter /FlateDecode /Length 220 0 R >> stream HW;7W<V~?O3Svx3"68xKﻞd=-CX*>S)ɕ_G);e ApJy|0+9{^&aZ3Xz/eUNW "R ,%%LETx./Aqxv@X&™g#_6lx+`l `<30UHvo =WJdMV(\0Mv]!#`Y"=]ID4[X[;.@蹀f͂O3>/b rHh0׷ .Qb 8i4ԀDN-@C$ZY56Pł5 ;6kSyZqbKKӤ9"8JƱY# #Ѭf2f.c%yf3ͫqC 5LuGnٰft-lKMY.)ZZ ϓ:V֒EUu؈cظEZHYM7Z94b'a0XբU5v Vy#1N/3L!g2,Mbedx8.d0 6`Ϗ_qJV}V*mֳ?Unkeʣv3jd<[S:c:qy$ lQR1IF+<CzULAxYqI(9Lc4m…IV͊A֘b1(JS\Sx}\쭀X.ի5a5+U}8끊s2M:ŝYLu#U`0@ N>Q]v!pT4Q{ ÊZ\<owzfZ&%`*:[*"M쵮,?ehMJ%[F/o] p'xFȎʢ72njEE-trI`"kT2YXf≈sM|9M`gO9Փ-/0C7!,0-ՓդG.ΆioG{xn4,cV>k+lX$i983 ԆqI'B3hh{:n7iItN=B8hJ=Z[\Kpb+'yF]Um͕2筄QCg7XI&_ [VWm8g-j:+ gy!4T+WVl7zA\Z5.ҫc)k۴2y4VGMc4YզK=oVBk^4b֝Lb[Lnhf0ZlumMFߐ:Uw-vo.[ȫe7y <➽^_Qr>|˿?x\j3 ~cOoGx!B! *6K|HgGj s`oLU@w']};*}.i :fTK-T:-tK::aRqj5#.Su}:;Og[:8\֌3<3~:nO/AϠ19WwwsЇ;}:tIxESI?v}%oooByӊ=.wFSw虿9}*S &vŊN(r'3iod 4>chg.Yٵ}:G2r7ȷd<@kk&\_sr~u. ;?\Ww=|7o[׭ endstream endobj 222 0 obj << /Type /ExtGState /SA false /SM 0.02 /OP false /op false /OPM 1 /BG2 /Default /UCR2 /Default /TR2 /Default >> endobj 223 0 obj << /N 3 /Alternate /DeviceRGB /Length 2328 /Filter /FlateDecode >> stream HNwTi~%=!B/颀!@((4AQ@Aq(" RDGXfFauFq=g{{w{<+`s2O>0ˀ>TU؟}#ꏂ< 'V)Dn<Ȕ*$g=\XTI+3-F dqX20P'!"aH⥊cEYT1K$f_ױߐnH#Po1כٲ@ao|!}=Md~3e?xA,$#{" T&`pn H) P @%8F :@`+*n9X/[pC  @fr ( xH IhT @P.@WhZ~L \-p<~nOÃ|ë@HQG8!~Hd HR#2|!kQAPO4h!Z6At GW Fc1axL S `11X,ecpl"6[=Îc`8NgbpY2\4n w{'fxw|^/wOo T6G%l'T:#[E[ M'zb/q D ِH"NR=,iL#yH|3Yg>`Ssʕݕ[WwWߗRpSHR80DUW PQlQV\Vb() *U+T^UQUPISiPTYVe:&֪^V]R9j~dɲYɬzkE]YS]ަ>VQѧDՌӬ՜\R*VN>= ٣3-=Ǻ]Gtv{zX=^Q~~-@dp!PlnC8s9=y#Qѐ c-3M,MM:LLLKLGL6753da`!hڒnkr7+k ^%k-hf\ן[Žfq)ymkeeo7;]]ݳ 5cXcwtutz|Kˀϖ7zVκ܂ݾspwq_xz{|W ]/k^SdMލd¾^|o(8~/`~4 ,D{ GȐPКй0a7EΈno^,|%w[^:~yۊ'8"x[$=?P,E?%z&&%%LܗON Sw mdxgtfB[2YiY7%ݒlW9!9serŹ7o/4=D>/ȟ(P/(.ἣ*V8QYTZcbbqR_JLJjJ~kTtgn=eReei݋-7/o(_[eIe]*A՗L?nlUuɫY8{hU[Q,ZH7h5hxטxɥYyhѻ-N-*o}6خ^w{<!3'':;+;;)>9w*TuWWrwu#Y:y3ý޶>f_YpVrs{OB@ 4}pe(ahn8| #v#.Um${2rcyciW,LDM< 705;=}癱kF=1ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km/v endstream endobj 1 0 obj << /Type /Page /Parent 169 0 R /Resources 16 0 R /Contents 17 0 R /Annots [ 2 0 R 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 2 0 obj << /Dest [ 18 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 180 586 460 599 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 3 0 obj << /Dest [ 18 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 548 460 561 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 4 0 obj << /Dest [ 21 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 522 460 535 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 5 0 obj << /Dest [ 21 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 496 460 509 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 6 0 obj << /Dest [ 51 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 472 460 485 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 7 0 obj << /Dest [ 60 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 446 460 459 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 8 0 obj << /Dest [ 66 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 420 460 433 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 9 0 obj << /Dest [ 78 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 395 460 408 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 10 0 obj << /Dest [ 84 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 370 460 383 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 11 0 obj << /Dest [ 84 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 344 460 357 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 12 0 obj << /Dest [ 102 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 319 460 332 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 13 0 obj << /Dest [ 117 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 180 267 460 280 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 14 0 obj << /Dest [ 117 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 240 460 253 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 15 0 obj << /Dest [ 117 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 191 215 460 228 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 16 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 17 0 obj << /Length 1168 /Filter /FlateDecode >> stream HWKo7ڕ$˖Nmt4Od4E>wfH`(`FS Ғrx]`wLwzWkmd4G'c˂XCͲÈ:b/t AZAkE8ؖ-osj=Jˋ}a=dK` +mZB4:Jχ`#j(ƩPN>MEgkzez [p`=`ޱyS7V/aV;ٵ1RU0$ LQt^:#v*^Y&d`0k{FLJ4ǢirQ kLay)Ρ0tjCw贉F,|VPx+aRy@yBd\4/,. hP:(i!J9z IqkyKZzϼ`A / ZZߩ`!&KPQ&Os2 D -D/Ȓ둩`ۂ' YBqq >eI aJimR@nE@ 4al땈At sw+b SH5ks)pcd6a\ $ޢP1)Wb^UE0F_/5s20f%Aݭġ۾\!0S^VRzcaQ5 W[Be@F". ,pcRHԗYt[ jGb0I&䎓gTVbAy`Ot>e^ endstream endobj 18 0 obj << /Type /Page /Parent 169 0 R /Resources 19 0 R /Contents 20 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 19 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F13 124 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 20 0 obj << /Length 2788 /Filter /FlateDecode >> stream HWYo;X k=hQYay < qCv)Kr꣺~}S{_H{_?EKUZW4Fѿif ;n~Za?TSxTzXpv]Jnz+.A_"9)ueĬ4i g楬i r{/ZVO'Y^J*i{q/ Meѽ}ʿyf%+|VRkC Æ0 D_e@vuvoIoA,,\MP_" 2m: >ʽ7TxH28??sܫ:g@XVj@V6C80\c*ck^K npI fK*aǯ3h]* ]g$etɲHMN)p/'78, +ERr"{Ր[ }rԄ[YtYf/l\g,^Џc ނf7td'ZFMj i됳]Tm i;M9{|M6ix#9 X>Mߊ<$.[5mcJt yO޳6Fwn5l@;ȋ ̓!9 4#XLh~C Oi )tJ XX3DFA8Uga\]7`RP 89i{it${NB=6(yBh?#p3qVwpS}F @<~?|0~]5 mqbu&Rdqmݮ~o~O (-YP?r5u gx.E]=bUrm*l5' whVu, d~maوwpxrm5d#*\e K&:<66Dlc S:urڂuVlYtT:* O4^lf"vGuG{P=940+CmmHINk]<$K\R/QDvݾEp/iNr?e.OOR~S q5+ i!.knXT_df Tg3j󉦻\pSS! ,{9((nm2)rs.8~g9qzDl\oYF==jtP\Q}I4V-av =4N`{zyoyz6!ӐM5ՠ65}?_r*T/zzúm9t|ҹ%}{$ʷYȊ*^$[ i}LJdYL7ZK=jk>dJȒEAW8 >#YB?D=bq]+z~1p H7-V ~u ?u] 7$U)[5K˙W0K˸(؀ *PVTM!'^~(teGZ -"],lˉ".t :x( D ^R)e F%/!XH0 DwG:7%o#ݖ@Q!pu2& u @p&FR~zB2J ./yJw(QE 1v:g8x# #CƷ5zb%r^>P) ]|ڸ 9q[rw>IuLb;EzeyXй(q&DAZ?(w/ |df]:núSZscgp;r͖|wYw 8N{׋Mև84HP _{%KjhkV6~Xw?Jy+/u6@^v?31z.Fdٶ}>I}l{"U|AhǺG#'džQWꉶ#GxW5ؙ@!ҿĜ|7RjeVA̾ˁ)籀szMk.,ff endstream endobj 21 0 obj << /Type /Page /Parent 169 0 R /Resources 22 0 R /Contents 23 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 22 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F13 124 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 23 0 obj << /Length 2755 /Filter /FlateDecode >> stream HWoܸ+,8f vY,p]Y$JizT%} zE C%jRXIp8o7Oߧ^/F4zol9XM9877?倓ыqCi{ݙhuWeek>}W+<:)ES<.q*ci0 ؛l4]>D*ͨQޒhb"pS] {/[4h4Vצ);4 |1eL&(6mTf@][}UTdN>"8.blKVU'{M()¿^3x}N<ňCvxh;ز5CLY\nxz;T2τaYpj}Cn8bc$BhM)ixMs"y4yd$!"jy!ljW~2]v|o"7$WE"Ui[H~:>/LJI:-k0 t.پnt]dyXb>y5Y?AMktP;\mi6B{[d2 ^(˯It#"#.'acr!}F{-GO`]Fku% k?"I*h{AABe^$ `XbYϪeFƣ9{IQ ŞᮮpJ 5/ߋl_+!WWǁ7݆{t?f]u6Yid̅ԥ v"1M T^`M%PHa,f|Rs?"5z5jZETEE_Fj e}`G x igf{&8\9'b~/kZq܃/6ލu*pI^/ w:yu ?¤ kW7b;1_6ߤvPsXV y)8iqh-6hvcx^"9߁:lB EQ#Ɂ&"D6{8a@>Y{nI9@o׳ʋcȶˍ _ЂP$/J9|EB}LS&w'Zn"uPIgFA9dbHZJ X "I gj,uNJ쇢&Mu_^ӊ /G-]:l*3mcY[-f=.OQwz:HD~;ȶS")zϰqw5t#2;V @p _?] uY1ZQe8+p-N4[mFN?53Ab烶nWY"dIspd#Z"IvļIdP2іV8h` 찫pFyrÅ7)T FHR_/ ^yz_ǙsԻ- \¦ l yHIhl6` (\. %'8yk>?_ ;hc!FLe.D5:1$&΄ŘP_܎\&}', 7Q*j&K/<^Ų"OZՊ-63-$RXr ^Gŏj͐W;9ݐ[ފj!Ѿ9\*GrD+Qs=TnԮŻs8|"Hrp99YI"%uï`~ٌlr>ds+0\}O}{rwidjGqv8hw>Axm!?ƜxRWCtrK+o$< endstream endobj 24 0 obj << /Type /Page /Parent 169 0 R /Resources 25 0 R /Contents 26 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 25 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 26 0 obj << /Length 2238 /Filter /FlateDecode >> stream HWs 9%Axk863}R;}h_$IޏonN-_Ӌ+[}]}maz3͇i%EiovsZ,.[ycLoጪ.,oڨI^y7Ek|?/h Eepf&?k_Vԅ'3%ђ|$ogvZ& Ny*gGx_77SEK_^UmWaZ[ _b㊦=ʮBng*_pQt:0BhqYF8<:zz̦(_nΜD-l >嫪骯ݖ;uS/) VU8/(U޼paL4 R"[M[Tf_zdHX] qgglVR]y‹K|+2Ul>l݅ҍݟ1z_7YӾͫq-A=_@Y`yaKF)T&Sf!U  $#^#E/+誉UiB30m`4hCn ڦj$Ӗ.ނ6&4tʚb֫,mON}*C]@[WxZD d5$78 _2(%4 =lbp*|@:Qi*L:Z3Qj4|QK -(3xri,DLmuo\Ma yQ~ȇ{|?!&p3m{  .\ϐZNkmK0K(yrΕQ2a=1ہTЛb}̣i=Y π$ ckWV:PU#F]SmpA <(q4VjՎ\`QEo>pJ\f_EC}Y<4X ;04*\XwY"Ŗ%S:DDD,W5#,UAm6!!w?ig[L鹜ޑ4Hcz_cWfj$jgIEkU\BroYnwtOIb9ErpUw7\,/%#NF{$_xWyy^l& A=17aŎ#x_F)5-JvyE"?jը{="!!IUxKRr|#z"EjrYw 5#Ln,9 x7}F? szf!,j(]8&-> endobj 28 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 29 0 obj << /Length 2072 /Filter /FlateDecode >> stream HW[oܸrg2'1u6 .ewd%ʻX$i/OAS@<\Hd'A!swo~٫ZFҴjkl5X冶:[_nyO'kыz_5\4몶Mval}Qn횪ߕ]h1+e CYŏy~yi*[3TN`ܭiBӲ++$$Ju<%yxzdQowK;ZUƪƴUߩLG^114[ E>D@ [<˚\O2mc}tףrϞgྩ 2b-{b! lU{~~<*۪w;Um̚7^ߗg?f? %HTsy/1J_^l6"s\UE^5п2m f1%{x:!"=BV#%|1Ll'&+I /xka2GlX uMQ F.W"fM_ GBPȏ^EG{3VF/J$6Dww'~pͥKZ%)!J&4l`_d,/}zf#ݎtwIuu0R MTx9foWo*x\EPPil|"l ;(.CM;k;:8q X<ΧA7ĶRm`$q O{揋:W H=}PB5i1,9wxM͹6 b\@d-":˷ݰ薧T>=eXTt#]C7r 9QAk||%0F 暑3rtxk1WlE xY%R+l{q kMޫ:;gYMȬ鷒K~>J閞n&sq{ww_ޗ+iKH9pNա>VPW Ȗxp${Nd8VX gIݟO"r|%ӫE|k;ܛwxAYD@h}-2)^KR2!Z mtf}pڍ]_學!Vb9laM8nGu;HMy1 fOͯN1>-}(W Z5&6,Ap隧'! QZq`6M=GDZHDSh}0? :@\vލ endstream endobj 30 0 obj << /Type /Page /Parent 169 0 R /Resources 31 0 R /Contents 32 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 31 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 32 0 obj << /Length 1353 /Filter /FlateDecode >> stream HVߏ4V쏮׫P N$mUq ^ط"{gf<Ͷ V:oƾ~o\^}]&/){۾){w_,.o˫o,ؿ]8Y>Kڶ`DzYĮ.߿WQԥw+kLT]6rP؉fJ. ۘ&?Su[Xe竀ɲwx9}?%a2_ģRKڲk[jU[./LQsy.h_bc˦=XwUgWNPPvqS`[  T4M,@SB )oz/]VH`Z*机Qz Z(x}8yEE= (1()Z%Ymw)+tY5i"f`@A>`29"5+5G|όӍM`,d!kryJ%V 4Vddaq[Ub&mfwF ؎6GT{_K<;|;ld=jϕƷA % $g/fͬQ1̡V;$\.N6cFb@zпC %CC endstream endobj 33 0 obj << /Type /Page /Parent 169 0 R /Resources 34 0 R /Contents 35 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 34 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F37 125 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 35 0 obj << /Length 1789 /Filter /FlateDecode >> stream HWmo5VmzJds Eqk{  (BBćOE Q ϼ{{K e3/|u)]z39[%(#JWmgJogN^O:\v)_5 LjZEuU+[>yQ/Z[UVi{eSb4-r?FZiZŝr-0Ђ8e*_܃ GS$6le|<o y)'=,_}5y(( 0D[)-e*gRWC*UՆ`Q@ѴU .kEqK4'r”'&Aaq=ri}mW5@̰pCtb.z֡ѺU%ac]SrT`C`3JI΃a2f{,E\bPnJS`MNU53Q3qeyB, _b.Cq"uAGFLb,x~)%գQ~[]$9^HL=/ h%p[yx L݅ifR1{fESLINw,8a3"m1~{馺D @zm̀4Βh _B^=gپ f m4"a WJ# \@2H;} pp ;!xljyrb6d#dy>]?|RvRkG"ڣY٭i@mQkh? #e,Ol*}܉e`%8sv:U6WXSGB j u t![2Bsab/`qTxI~Ig7_% !l􄤜?kkW5i$k1}]ҩw25A2ZU(}'Cx oCEiD ]So: A# 6Xo~cV5vS# ]lU7ВnB mR'DheMc+`_1SƘV.&aK dӄ0z~v;Y~tB(`G EdDcAX%=^j |O Fo@t44y1◳@z9]!FYu&R &~(lV0PT: _BOq='aI" [|[ߧ\"f@X95v3R*PiwzO8Ӡ3VBv#)6>JߒJ>,%J-2G2D&ۓ#5QΚ27$e,9/N,ZX2z(^QNeo(7-PC:D-7ЁS1)TDdـzൺfB2{{N:i]H^Y؜ܘף 6tϸC 7f3nxbIR|A2Hh~o` N |Ov䀶3,Swrbd)@x@,᳸#-(`NxH^#5\Ǥ6@z}Mq`Yh endstream endobj 36 0 obj << /Type /Page /Parent 169 0 R /Resources 37 0 R /Contents 38 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 37 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 38 0 obj << /Length 1691 /Filter /FlateDecode >> stream HW[oD:Zq*Euc [Pj&yS6%`W{#?Ųh\,[0[T䂾C0~#6nL(KM{*$z8b+ /=ǁ!0֝.+@Nk6GWMn[[g)wJYQbD0?hHD)oʺû_c]Lb; u9.eT%'@m-gyPFxp=~` r 2kC1iAi8Mtb"D0 zg @mg~2 x/)~ L#$I&f-~["͖pt T0;"s1CRL=>[TxV@:AE/MS5/faS-L 4)φp.y{nH' K۵m5}Z2& C5̱6eg'yI|@Aa錽r1`'oD.E$dfb'(Nζbd4xD9/*QCLE9'Liܡ72Z24#&4ȝ :Uutī@3'"j b 1F PLְ-RGH' > `Fb2Rm TMc},Dy.9y pO.a\4 2s˵ڙ*}aя*/w:JUϵǴa)b bRkp+E]. j̀׫C^!W& qA=p̼ô0udUb 2@nG pxL9{)ʿ'h.$H 0nNUXUn!r 65z40 xL LF[WRm1AQmգE&<0jӓe+xLy߼>1U| |g4s2>YZ,@L۳4AVRK˷{8(kaʍfDQzbcB8ނN#ENkMG^)'` \EG9J69͎~csO1}s5:|z\vgV {25G14aϭ_t7ķ%k³Ɛ ֢765Ȃ*#<0޾o*e0] ˷}^Z\[/> :Uo@1`5ȱ;Adnykh620yޝ-Ep1f?wTwG`GO@$zs┇bz3s {>OWd endstream endobj 39 0 obj << /Type /Page /Parent 169 0 R /Resources 40 0 R /Contents 41 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 40 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 41 0 obj << /Length 1282 /Filter /FlateDecode >> stream HVQO7V|-{9IX)HȆY{^UT-MUlO>Όj9!=7w7\v35/QᶭU븯5ׯnv݇Y%|h] 1+}4Uûk]Y)+,VD:U &KĄdLԆOB sز c;虬Պ`QԪ/wF,\OdQ!^(> endobj 43 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 44 0 obj << /Length 1586 /Filter /FlateDecode >> stream HWMo6EֱnƍR9bS@Ni=R4E пRkwr$j8oސ3:/k~}J]x4l~~g ?M;z)n8IϕqhT[pGoLq[=fn&LpW?xBB;xZ١c206)9Sy8`d 3F8y `42xʇŪl%8=鱗Jט%J8n}6d>'%:d( Ԇk!;_i(m{vq`DBj|0 91cV'ŸkϥlykA 0est5tj ;kyjAo 5=\\<0K(KWz? >1t7 N:e/(1S١ )q(9ü K"!2UP"<+gk'kmU4Q^' a!9pŰ 4 an$6cz%9g.֠ VDIO[M;gdhm_#W5RҡJmtŋ1H;K e*{^0Hּ%@$MUR%1ji*Pw\fQx CݩZpErePwzCuXPuW8gQu#ˠ*U@{~ (TՓ.& AUI΢Qw|7hˡ 5u6wq4ڂN=,،=q`6 |ޙ}z (d:"eF7Ogūui*(+Yk8 Z1\7$70y^<[{>YoCg?b endstream endobj 45 0 obj << /Type /Page /Parent 171 0 R /Resources 46 0 R /Contents 47 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 46 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 47 0 obj << /Length 1757 /Filter /FlateDecode >> stream HWKo7F8q@R(UƲh_K%Z^hP;CrW+^U 𾆜o>G^{Owݧ? w} $0^so aѿ羧8LEJs .'|[^2M:UYܖGSyU?{~G2{x4| S+P838^/NGdlFiFh6>-C|ч⏢N# ,-f ~tA.t )%Z' gȜp-AO|_'L@l'ʈp8z!Y#|9kqyI+RVC&SuuɈKhExO/CoLd2.|BYŦП[ lZV+W#VBx n~!La>O}X9X8MF?0u`ܗ7WXa0S:HWHԗ@WLc:šUM܋c1~raM k_eeDUH_a?zuk.86'tG2!I& Q6~ .*9(9zبG;Fnp7=>)Y`|nr ћ=ޙmrVQh*TISM{E|J+6`v(x8L:#ڍH eWJɤytd/zs0ʉ>Zgqib"@qj,V58$0gMiLs"2 OՇ 6*7f d faНq #H!7(f[-ٜJI<,O`~s#P>e*Q'-|4ZޖXId J6Z:+$ tcz!·y!RkSS@I%_HGJrP$mF<Fr?ʍP-돸zT8"wG3^4f$'J_2ifPS2aBc(7^`msfh\mRRR48 !VZSkǃY)J.k2PiaWscv~ ;m'[o3TtDDN3uDM`cijvH&#jb$Hj ږfS U(T2 -f@T]0Bw!|B-B4x)aX;Pd"/ i endstream endobj 48 0 obj << /Type /Page /Parent 171 0 R /Resources 49 0 R /Contents 50 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 49 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 50 0 obj << /Length 1613 /Filter /FlateDecode >> stream HWOGVDzI8;n#$>nRPDR 5U+!~gfw` %sޝogvߝY!sol(t 0A^ OÃpgOÀ|APJ_8Ke3hcWe%+alyxžrU/`-5xUZAS.[4"̘ƲIʳ0 DRG,0 Rѹ 3;q"fI|8/. JAS Yʕ Y K꽊(eIT M+PVy{_~lM^Di6#:da ~<}Q1|!+-=SQ㐵 @+ #+[J]XoK,M P=f/h_HeP+4L!jTq>ǎbJn b? \Cs3R*}`(дv.PkPQ:gD\4䌱a;TSt}|-3@olpmeP[G̈́oHm j _i@m3 )3bGfibkfw+BCfa~;\ƍWӻ?. y`R@MnYY78Hӄ*_ e}l庴D\Uo:]:Z uiù.^-M]e:^/dmMLk]\ho&N#ߴs</9\ ӗ+bW˄ B oPZZN7Q4}6<Eo'<8GOvw3g;9r8e97G\c Pń"_` Jve( xd5:Ym0jSw)2mN' Py_BhL JW]+`' 1*o5ULD* ӎ֏9õj* heR6S i{;o&v%ifI ϱadz*[YkO]HȈƙTݷ]MC $͢o2eQ'`%lb'*ζ&kwgQ]mxg>pdS=ϛl![MWƎmݤ X/i*ddƐ; r(@3!YjBob܄@dA%d+`7~cd#?wcY_s%~Zy<}XwlmA*mxnk\JhK u4Pڭ kb׶Tj@JX^x{ ۠cz~@]Wno;(R:eyW'p9r.˾ endstream endobj 51 0 obj << /Type /Page /Parent 171 0 R /Resources 52 0 R /Contents 53 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 52 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 53 0 obj << /Length 1989 /Filter /FlateDecode >> stream HWoܸ,=d(JtEǽq/o=wE CRujÖHfpx/"5~ǟǗFWEWɦʶ8ߦb۴~EۮZt[Ɓ%(+v~RG)7ڶeѪor[Jea=©h'K]9|Ё 9͉^zWt%HP2uaԫ4^Q1 ,_Bb|An?T[W5FЖKH^LR%SM|R9''pp=KqX<뺶! |{x-- 1;BZ|3_V'SҳUʐln .DpqxG;q~'C1n(\ WC:!Ƞ0 ?;e8] g|p_̯g+Qą SƆ$ Y2Ų)/#Z$>gE $FYad}#MxqV_,auvRVx3 >@? _TD6^hɉ0EcfYݳ*7q:9h}6w_jO.Xẁ_])q]if&NrznOkҙRޛo | uMѠɨpƆ)CQU5ACd!c h[}9bM*W At>#j"=~B]E-ԟSb>2}A)}A9d9NMSIb$tXrtI6`?cOtǛt>+K5lRWH6Ù[s9K-P8ןOX^BUH&,zwޯQ92'_b2TkM35Pi4,kQѱQ:daN^q!aF@c0,PxŠy =u}knmEP[`Ð7<4_ip'@hLI,fi'$ 8pP0Z MhC0  q@ixTԟsu@,ꐤsg! endstream endobj 54 0 obj << /Type /Page /Parent 171 0 R /Resources 55 0 R /Contents 56 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 55 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 56 0 obj << /Length 1618 /Filter /FlateDecode >> stream HWo6GȪ\NcFu"#%Y):`kz[&0{ aa"7M?t/C}w;sq?iHbMQ6EXQW2z=z=Q ~胶MjjQ: e$EYs=z)TR-7M TZ9 ў`ތ^eZǰUNhMh_嵼 \ Nsy0f9CWtG9@sPtƤ3'N洯>8U?om#-~#m.2FYZM-W;NrLa)w0Ny|\k+9/ƼD1]אwMu͛}&S`i]5#R/vy;Aࢄ ]Ƒl|XR{sd|W䵏OgؙW @ }CXu Oxz}#KyMmo#t+F5ƕF|j\'t_zaL;Xw~16i9~5dGt/ͧ_}07l{c`Yi?1LY׌$!zk2D+|Vm1C:\z>M / @< endstream endobj 57 0 obj << /Type /Page /Parent 171 0 R /Resources 58 0 R /Contents 59 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 58 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 59 0 obj << /Length 1528 /Filter /FlateDecode >> stream HWo6Ȍ\ikVfjX)RkeYaء۩Xrؿ)YvbÆ]l}O׍|s-5_}rv\OkmHڢec5>b39I%]iMQ9MJeQ9yUIu >*EF4w«dKmhl|8!71v/Zu"*H2uQSB:Lbh,,Ou Aqz&D{px4 ?m\n&Z*'EcWh#+ \BD`Ժ(-E+l[p ̕A^Xnd8~tsH0x #vV̎ QE'p|]rv:~kSRYd܋aXߦP* n[#y_LUhJ*DEQMR=NDp֑1V> LXCɳQg2Պ*CZA&ؙ2DHSU:]vZ]wR3.]pXƒHL hW9:&DmLl"O%#Jp* b霶"8%]]!qWE6dhWcqZ\H6MxH>K  ji@@/ ԓi> endobj 61 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 62 0 obj << /Length 1720 /Filter /FlateDecode >> stream HWoF9>\ 9^{ihC^zoЧT>4;{>x(B\cvvf7싋Bӿˋg?/g+]C])[Ffg/׳-X Y?h;u_t/f+wV>TMJV֘-*ܡh&*]ZSXjhMyk_5 *]6n*+CpV ar|,72p~]<;[tG1Ӷ+{1hK]MՕ/Vu-Es.+C iKS㷂U}a{+o 0߿ê`8W+U9 tznVuEE{ ~Ǡz B8A3\lהmCe \xc?淝L$LOd4M&$]a!ֶׂ0m{~§C3L5e^Y5ֲJ D2R^(p 9YD(m!NvZU5"Y]ɜgGNk 3o;Os234h#(lb-ę[(Ąa;ǩHQ$>'|o Ͱ Ͱޙa7ߘagoF1/?\>?җ /y9A@ 6+˘efŰbߜCC FnW_u|t+ Ukb׸! o؆O/8K1 v^٨Ȧ{? 3ASdG"'E mR}Sc"Uɥ-7{Di I8~Kq&l[?UިFA "^rAD{GDmOFshB*"DswxP,Kq8j 6mhKcѫ]z|"9#7zcef54dTĝ2Cu0`ܘ(l@>"|KA" o[[H/21I!ds^^+ɴtXJK, o{D)<4#׶c~⪂+RNT*DCl1M/2PIETdtl? (<(tك 5Cc(Í|B~>di%'$noJPSlށ`9Z$6Du,+.Y"K<g6''"N(?2|!@ߘjtxy●ӦhvMn%YHrWrP=P1}Pt+ }1:}Ǖ듭<2WD]"chgr,)2A<8,r4q}%A\GO`4ZMlgp.FVźBE 2<Oمg[7/?'T-:M{YucpH]s&t-6LD8WܦMr3<3Ϭb]Q3|:\}҇݉탲=j ~YV}h#wg~Ϻx hQd/Hݑc:N׆O4>\Մwh5R2A&Z>%ބumk{mmm=a#]j?h]qںkD7% endstream endobj 63 0 obj << /Type /Page /Parent 171 0 R /Resources 64 0 R /Contents 65 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 64 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 65 0 obj << /Length 1123 /Filter /FlateDecode >> stream HVQo5Vmr%9g)ݹR 笽^{T(MQy}+kۉ`:ݴ ~Qk]&d_KV~6wn嵓L˽WNYLʃOQ69 =AE[X5A,p2Qܞ#wMtm/%cQ vtV+^l6>xIv1v$zJV;ȽO~1QN[Y TS'Ύ\Bm|ki3Jֱ^)|Ehl{N@{ѦD]/(!80ЧR&?2֎i IʒLgO&E1\}^Ő,g^oǒN@Nt:Y얋պdyιw&h;׻z8ӿWm:Ж >Iup]w; Qʳ;Zx 棁uQM/{OH—o^q:iy0=?c[(ȟ} endstream endobj 66 0 obj << /Type /Page /Parent 171 0 R /Resources 67 0 R /Contents 68 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 67 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F82 126 0 R /F83 127 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 68 0 obj << /Length 1591 /Filter /FlateDecode >> stream HWKoFFVhJ68cm^&!cM-RT)Z=ԇ.)bBcvo^7~_~ގeZӺ&8w|׸Sex%M gwgit7`m8uZGqRU*ŽLs,-ŀqVM&&q"k a٭yX+FL8 P'arGv#b˃YW|Qpa|K˲JMT\gUZTsKIf91dGHL_eF!m='53FqbR%|LP"AN891 { gqz+z`ZDpg+q2͏cPS-BU (yӥE !;rNBJAmc)ǪXWFm g;?&-w|e P .N(6C&E+ Y|:ygO*wѽR"Q t`8 WsA߉HdM&y#{9א(Z+ =߳wx\X-p-,]yޱ4'S)2q]<@ pA suH+`50ūZ[Z*B4[KenI%hG-ZTӠ[ԚP];BɊ+2^hZY"k^*xݣ}#rI/1W!ݶJYea4ZŨ2W|j_Ŗ*Eִю2~QT7rlx4+эX^1PkaNh*(emLVl̄?3;{h+Dk|4`5h/(},`j*iMQD:9o4hК yiM=x2> endobj 70 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F83 127 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 71 0 obj << /Length 1076 /Filter /FlateDecode >> stream HVoD9v8Vpm ]h v?6/7'8N̷}c5'wd(/4IElcxSH:ŠA?4dpU'k-Pڑe7jn[JjUVܔ*Lh|+Bp G苊:BC!\O( |BfayB_^P~/flTvJ,OWL_I&+k:X.a  AB)0RZFk@:Q+/M$ɐdK@ j"P+xRYPVY%y]>M rgZc>eJyst*U 0:PoUM*gUBwEm\#&q M PNONAo(ΓUbUNG*d}1٠ˠ?]7S&TGdevI>L";/wʽ^-i'KSPGw+tO^l"~^+xj=p Љ7PBA[!"~7pكѹfZ^Dp7lZrMIlo^7y?/֭Z)/Ǔ{WIu] [.:I&zp(~@ENZvȷ6lGF始|xsYYbFRMa,_PS yԖ?`YlSW S?!Nc(”< D1u$*4Bpiw`9IiF9HVWpټ@Tw؋lÜ-8'i1s 3 endstream endobj 72 0 obj << /Type /Page /Parent 172 0 R /Resources 73 0 R /Contents 74 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 73 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 74 0 obj << /Length 1985 /Filter /FlateDecode >> stream HW[6F8Q$]7 lM.X#RI9Iw"KPOvC~υKԃ$^w.}x~T? WJΛ֔ͽQ o/'+eR)_֍V4ҵ˷alg9+겑ϋ5TAaK#EQVyaJ'R.+ 5c,j/| ". UH"UXհ7Ӣ0'2^6}8/ ~?l*5*JoT:+WZt,wyO2MSJ `F~DjXR˔â"#Awaac<\>fQ:)V`'  2XNAk`Aϭfϟ}(^_@sU(p&y2t&Htեo,sY"&b]3;eupTlX&`E-\ j)hgZoߒ\4 FO删\:h'4D\зg-f75Y. YT13Ʋ1m,7"-REW [`ƾxC [f #I!НVZ3_@zq@.gQN,KBfIؘ,=j/"䔤 ِ D]>!Aa&96(%&|qspi)+B :x@Ir)l&Q&~v.t$LN~b5{V!o: 4-':]%f+}iCRL$NtxhZ,;.#پwh!0[=x4ҵw'3XK0yxݔS%^pZG?d{}ý0@'4 C9YcI/Br+Z=@o͢ Vm,GBc~R쫁,5mupD?Ol|`)z#|M}TLLHj:""fWo`$ZfX}˻ ^m6d"QEp޸w5r@;~\s߀,e}9=)q8ИI|LwwP =ެݣnNp" +g-r$P8 g^ q~(T2aN/쭚Ĺ>JJ&t[0M'`(֤c-JLS5 @N1iyx3 $9԰xܙ9Ϝ$ +约YiBob!Bv2ze: nb]hڶ ҔjHg )ڲw endstream endobj 75 0 obj << /Type /Page /Parent 172 0 R /Resources 76 0 R /Contents 77 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 76 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 77 0 obj << /Length 1010 /Filter /FlateDecode >> stream HUߏ4e76WnRIU_) {J<H>3c;i!@(jcόg<3ӇG*[ywXJMkD,Zk' (/Dbl>A\oݾgZJ@RV#>2(ht ))+d-{CN P$?MHA= $AkG'EtQRx,e|𙌗˴xp_a 0e)x YhpTcz+ pu#P-1N#$1|MhAfi)GH@oCVs(i&.MCEV!z@t C]iQPËaMġGOX D<.ULs@2Kz;ϲ+tŒOAqpk0cDCǪz*dC# 0 a H!>?bGU u"ΗjFhӌސ$b ql 9gDMfw}(a;buz@Edyh\ɲY[J Xsa,6>,02bď QvJ4=M :m{=F(2BIQ~.i4a #o%Zہ;/[η mW+_plލ )g n*0|*|DݡzOQl%!v~,WEZEQ+Ú67ŸS}oN:}gHOO8|`|M*2GpAJz\ef%GdĠ!0N'~mSwx endstream endobj 78 0 obj << /Type /Page /Parent 172 0 R /Resources 79 0 R /Contents 80 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 79 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 80 0 obj << /Length 1762 /Filter /FlateDecode >> stream HWo6FȊ]NMf,YڠhfCb/3Pl͞u؀ayؿAr$$%xwk+?^KE}^U)*O\VuZR_?^Ͼ`S ~A:ͭ4ʦEe~F;K0r?ēHd:UDe,,q25q {Wi0 0T iLxj')l &*-G!!A2/㉈ۣ(y]rW7Wڤ TL҄ g>Ҭ$XVilkg+&sqn|;h C!oƝab8+x%s;Gl_eiGq23' :O3m SiY̡4SA@.2F<9RݽiK[% n.U|ó'r RUZ.ްmq`6 R[V* hZP[EЉB) ]% -"~6 ;x4//y|ēADUn.ʺlnwa o ĭ}|U΋͟_'hu8 %+.1O!^6[~c ;vXӄ5.l,G\أl{t֋7QS wwF>`aO[8~S@A&Ųխc 'рඥXM NPj3@n|2v &xmL%T""86`\sˆ#bb>^iM5dO }^2zf3! {+6Iwnei YzlkkKͩoʩ:+q~L|ORVzt"p紿vIxAˀ5ơ~[i>QVpcnݮ}+c[dEߕƇ h S_MKO[>> endobj 82 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 83 0 obj << /Length 993 /Filter /FlateDecode >> stream Hԕo6Q.bՐVVtphIŲ66@ C`-:`{Xe;1 <i*lݏ~ɤTUԴz-?golǬE0S'=o_3VѷB5v0}`epꪖ كrH%e_Jsǒ`t% saC c2y#tX5,p_IްGcB;tbzxXܞTuG~q\(`io8~~.L4qAå Kkť > \ Rjõ-JXr+T{@E\4N)A5fAdrx]pR( x@R썧~P>j%Bc9T)Vq)d:mp\ijBnZ {"2\±lBPW"X4!aVMp|Wz &BW2E: $ I-N(Hd 1<0HxNyyFi~? H)G_25#"_72Cf:MϠ,~}Ί7pzAPe03tmƒ. JI$qlvc$uOPGP'cnh4IGeqgIL p BkVdP:L123bC8jv!#2WIE X/ZbYyò6TҺAc@9TN[u19AMfhQes%yԄZeo_ [5+v܇x.P;$w@j(/rL^QhrӜ> endobj 85 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 215 0 R /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 86 0 obj << /Length 1925 /Filter /FlateDecode >> stream HW[KҔ zK@D(Ms%hI) ЇOFS$@4~ IInP P3sf99|A~#5}߼qoVZf4ҏ;98~Ջ?x[㹪?\_XgX|}6-E(G#[4-. B1)me5{d\(C1_^lel>aΣί.;7;6N7!jUN[e(Whi[BE1Y->RHԃj~Xe1 GL8Ķ8;1ˤRD% Dl"Γ m+<M?)""UWI5׍~ mDuݡt7Ǥsd o5_ ѣ>="TMPI2ڲǪLeg'yY`V;I}vAu0fO~ᄔoFOgpS,S47O bXʓ< 1c,| tBp $ "mN*I YaXy69-κͷ=8[hvp\pO"ɏm.%C+*KtQ%QYB5jݻo~/PswsFƚg&pBD ,(8+**OЇcXJngbC{YWYñy2G=[`3QR@D9T*O0퉓˔P`ɴ-ɤDž4 ؎Do"ٯ*.#To9q-,z_fDhET6TWX3Ny3-Oq>!ZeZ#IGqʫ 3>BM6 kgrh~`dٳ(Ъ')y9MSzX A_b=kXihܓP'!qZdFt3WN*dBb9 ljlE'nF CTCqPۣ"dМRE0 $cꍛzOb\l}dRX }>0V/8|/QGCK~@ke4<*N|.)W_$V^ &u۠}2axm:ĸ+G:쨼dXTHAM.2,G mK(~)j-D{t/a=6/1{D[#U'o|@ 2H};IA% 9_ؾF6b[#chî>e5t#vA7 Udkˎ}~ hm۷Lߣq|Q e %xH/\Eżr_1EI#c !o8IPQHH9CG@ע-ߡ,/#(yxKdQpawEY>Ckso .bh1F=hLйmqж` s}7YYnn=`M endstream endobj 87 0 obj << /Type /Page /Parent 172 0 R /Resources 88 0 R /Contents 89 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 88 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 89 0 obj << /Length 2010 /Filter /FlateDecode >> stream HWoGV"iE+qZk=&'tEw"(POAhC~籤(ė ,rwvv7y|Aoo_>L+cʪEd ӟ7`M Iy'xqr-jǩRd5)\<^,F[mԱZ >Τ`gt4=6;V,4X(ER(26ŭ D@Vl)L5ݰ_FU0I!Uo|{A ת4#t0޳<KS@ 9'e J݁X \J!$gb]/ j59P) eY:lidti!bc,a~,7ziUrW{e#0c-z){FX# P@[5#H<|q3L "B6AQ"SR:E -_&|vFgEgg`jMQū;&W'53)‌j3&pUqv^"Z-EzFNVIb ZJdw E+i ^., 3@@5\vSG֐{pk\z(DU_S|', 69۬+@\wxfKn^woa!RYj7W RBZeo-XSd TePS.^BaA;BTn+[LWzJd*#lA^8nq#ӃOq_TXj+aF9VU>yㄩ_Kq?䵪U9zQ3ʺ q[c7a [\1iQKR\`vjݽ10Ʃ'P:%mӮݖTOTaIRJd9&;OF6xK1΀ߤ ^+3fSLZF/iUjJ.-s{L uLڥo+ji:W~?>O*NpPqjj'p,C܈Y\S *K@E ߨ&6pDGJ }J" TBgn$*7l(ח1p0a 5$E'."&s9Vw71ԫa(h׍Uxpmi>my 6R{o#q?<ū@Q6 fa fk˱?9e%?Z CC]´I^GRxNI|:W\2*aBB$?A!9 ;gJGn[=̜qsjn[oa endstream endobj 90 0 obj << /Type /Page /Parent 172 0 R /Resources 91 0 R /Contents 92 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 91 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 92 0 obj << /Length 1747 /Filter /FlateDecode >> stream HWoF{3w9%8&*W=ZZQ$ׇoKmH6Xgc M^ʫF݀ 亨ͱ|^FVŇ|6m^HyKn?-/FZ*GEcWh#.|#gО{5 Ei !~ ZWR `+QD>k 5Q z^ f@0=O'31֖x̏_AWJl<8kU!&}UN`j\NqH&s@TR$u*v`i O']iPFl/kUڬz^ܠ+!x5x82'Xhmي,l 6M1ќ=kJE/c{"Y4Ha~"t4Db,oD-ܱR`*Ql0jפ0Q`$S "KYp9 am;Qwzi4xID9GTɐUj,rR1՚]5UuB6oVOS)|c6HN^[V hDy KZ  Ld@ۑFiaƩ<Пg"d;4\ uV) 9|IANi<c!ku<ߙCMTN iv@㖐;9:PK Rsq., >cLvbwEߙS/;VUZN0!kUYA!ؘH[l8IYp7( ѫbo:p iE/oll"TsVTT @-MQ#4!l TB/ -=w4:fׅ&p,|?ST Q))ln̽C{ -'l}oR8M6,D:G̷VDC))AD4j>v$ qao"dPhk}ׂx[CR'"abbc<, NK&6d#_4#!> e='}dHyjt]FdX7%K%krڲi$k) y _[JQd c Ȳwן4~ӸNa']4Gh5Ms]uP3a=(JQcǩ=n)xvҸ=Yx.qϷaC%_A;fSF&F;pp%:VVӸ?(7Qb`p*|QSG}`[(?LΞlO?+%>@ #4,Y/~6L Pz44X60 ~a?})>:@ endstream endobj 93 0 obj << /Type /Page /Parent 172 0 R /Resources 94 0 R /Contents 95 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 94 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 95 0 obj << /Length 1745 /Filter /FlateDecode >> stream HWo6Ȋ\I\K,Z%ҮhָC0)X ;a0`xxv^sw~`wt>PU!FZ+`A9EF5T-KSVQw. V ފiVJ#>֥,GZ,Vhm+ӲQ?N媠-Ѐ̈؎[J6b$JPsP0=x>n_R'6銏:&d?,We+Yk TEvTJ暂| :W p#V|IJyڊټ݄rrEA(y/FQ1su'[S(Yq♂N/$cdn,Kh:%3|˫aѤp3RA@oh+'#kE"4HuV+fS"(:` &Ȍ=Zώb%1e?i1!-81-!s2ע.C-bm+dYӓ\o]<kKda̐0 *eq,fΠf3٩}F+(7f),S9\vi+6u"$V.r+W̳,N/'3J%Dʆ,{8 -IȈ}Y0֭WUn9>ȟj$EOp?2Juֿۜrߣg'0=e/Gx|l~ez hp#D{Rx|c Js_CC^h߮tF,"99 =Ӵ1A `Kcz3lD}@`%0a`= DC'ƴ2ldwnh %"܅Oqe#5K;j0e%H{" OV `tG'*q pSsM'h 1rU `+suaR7AnYc[@Q@/n08͠  #,Y ΞixeE-JZ4kݙ,cx\VX^ZWkN_K_ΪMgVpgoxm+~)ܵ _zD=$NNlŔVJ*&omR 0/jh%B\޸E1fSh J&KFxZݹE)뗆z{)W@}Su RSnҁM(xExWQPp}_W&5| 0NM02: K5b B|sgHtWGGMfjh%tD&oj.*Zp R b\t)߁+o?Z.6vBV!76Q/9~Ľ6{> endobj 97 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F128 128 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 98 0 obj << /Length 1844 /Filter /FlateDecode >> stream HWsFQmbIh];I2P0()g <1Ӈ gB(z*,e( J>❷ɛr0B(5{yHDA"EФl)3&G&ڵg#)\X ěySgb~ɁeqzzR sjNdت9%zF=$.ozҐjA3Z"Yw|C4v[N*X ]B,/JІ 54/ꍝ]>Ϻ*Wa4 k铸l1܀C* =C*WZ ZY޳ \:U7av[pV;b:h t"Y]q#+3| qR޸&KSHN>+bJ<= o4?Zoy`neT~{2"SաȄ:UZJ ..8l(h2K9dNppx=u=j6 TqOxvVDRN8_Sc&@P'\7AF+ʯ;םfZ4}JOHdz:@".7Lh2 t W.R*{ϯkYe:7WhcXk ƪ+"8J5d'&dD)W\$yc?L]Mfq+ ؝U|p*D( Mʹu4 E?z{teAĬ0H*U''+0VѪox Ts٩ңwD/7`[MS8,)J_6 |v:cjt#ij?D. ZތĹI 6e_R\ue|syUF8f:&zrqÐg3 Pb.b¥LPU%mTXv) endstream endobj 99 0 obj << /Type /Page /Parent 172 0 R /Resources 100 0 R /Contents 101 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 100 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 101 0 obj << /Length 966 /Filter /FlateDecode >> stream HUo#5:L3%M;.^qmU" HHZN@b%lOvfx߯<כGOLJ?(c mASzϟw՗+ wUM ߸P.ihmW2bn)n=mWu^s(h3p),VvčpǓ{tC@), vV]说R0@JV9h\2J i"Ei4Vok=# PqtTya ~eGޞ"o' s8xZ|%rfۼX~,$luBz (l\g.F~wUVH'5frnQQQ瓬FuI=_פ]]Kޠ0.~<=v-\E6YqQiVɁFHfA& &5zML$k3@<%v &ub:j(K$yEÐ9Lׅ?p3cF$̈cdM2Ok8qbj]U|\*zNr (FdL:)c<b TZ\0A3LƠ\~?Kk :H.{DܠR PEa&umlohd2Y_%c/<){ixZq0D,нeVl/Wy#)ʲF*VE9 @Ytd䦍Rx:mvץOAG`q(~2'8oǂ |x-tXYAb7 mAT 䰞?~*ÓiIweʅO>Am뢬d`2z&?^ 0T4q endstream endobj 102 0 obj << /Type /Page /Parent 173 0 R /Resources 103 0 R /Contents 104 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 103 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R /F137 129 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 104 0 obj << /Length 2114 /Filter /FlateDecode >> stream HWoG6d)7k6%.^c/痻\h wW;ߜߐ3O ?sqUB5VE5Ug ߨ,~Y{X|߂/.0kÅ]}ᔯL@v](UZ>)medVU+jl*+tv2VigVu R{XKN jed.iY(cucIlp: [PU҅]e}Օ7=OSL8M[5B됵IVn;t"gD`IY3L,y8=;{~N`yVn!n2'``/Oy:d%}"( ֝jHq BQъS`$5TBm)K"]"Y$~8yz1_ڮo!d7.'|TugPՀk+m EPF+QTȖs"Vl VQ8pTmtA\}U6XJoi!XmMlR)=Dn?V^΋L db3pYM&HB˲wlʋ 9f3U3]|Z`]дZ!`pbl\E1 gD\#5GG/n~ A;Ӽmfa߃[3Y- H^ l5e?{q]M.%)2-s<:v*ʠHƑbƂ}0D}$@ṆhtWTV*cZˇ7|{Js K&a&" n+.|݅"VU{wsy?.I'[q1k0.OOicĢh0&TTKX(ܻ+w! b&n!7. 0%4F+CT2rRYN8*CHoJAdFɰhGڃZ?eOٟaW~ ݤ{+GmQ@xd)o1W̋ PwTC е0UN4ƅjhz̆BYP-kJe!7Pi~T ~4`t5+-]k,i.@< f%ÕRߔ_˿>{D9}DrrAA+㻐TU0;Y)u #CFl0N6=r>u_z4r1oʭ/97p~0vr%_&*ŘMR:W"_ҏX%蚶}]bM3M͡507ŏ# {#>TB'X+ ӷ?5>ef :2; GB no IǦ?ZOpUʎۣ荀#܆ `hԡ%?"_V棈(x Xd+<[ NX $t$98 8B-/WG_ 22QNuRh<>R ހp8'1F8GGu,NT*cO[ޒP4:` ,TjЬ[fh݈ U^@zbvLRT'MJwZ: 3RR=ɦzy9qqf'lg endstream endobj 105 0 obj << /Type /Page /Parent 173 0 R /Resources 106 0 R /Contents 107 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 106 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 107 0 obj << /Length 7242 /Filter /FlateDecode >> stream HoZ$#`1M;ct1\C g83$E"Y^[!=Lj$>"Ώ7͛_}۟|]i[lzSV/:}ꧧOza-`:oʭqm^ Z\MUwv] Y\Xe L[@ sU jꁔc+_԰SE,]Y|`0<̨ѹEy\/v`Э^Wޚݒ`;`MV+ jՏPoZ*>MTSi ݐt2Ѡ ՕbOb^ϝ |T[WٓMm1)F5h6আl}' IM]nO=ږyy-aVWGCSmXѱ6L93&1L Dg {5 ozyL ö&< wOHkVrTzX(G'{X,Sd0PuXx3 8UVK_wPLT/YP\'ξ;1")aQu's O"Tcj @5@Mg14dl#`ל‘DgYz!QnF:;td{Ye]4ea{k^6edA=7CLvux> [4qp.K,.K8"[/h1c,VJ^4UXEcYcY>a6x]DcYs1X}n[j$Ku'K9Jn*A Az_ArHfmRa&ͪ6,nK݃,p[ >cܢ,n 0nX6Cn`Z oFKܴ*[VQm۪~Sx[ֈ.DCQ]DEȢ J.8REaّhs=J,K`5`1VnUKX*ՑP~(7(@r@5j<~TO@  y"QƉd&Re΁%RO$:e%A|JSB:q41WjZ_rk8rZY l!:̿H^%ɮrPE.dh;;dj9fr=:Ȓג<=?=Zr4ۍfZQA: gXԮwxyw![/t77\@UޕPRRdd6[h~3xC3L 4=|Q\ 2*,"u|16È,"Ϡ1n@%s"C.0lV+T.t<?r)|L#'I鉔@P!Ѱ4W/êL"=,H=,G >M3Ezy{~zF9D|v1䗦da*%T"c|Yd;V4!(t&Dhf (сwsn=cij XU&u e O$VWrUªϼ:L<; =##=>sɧG*/K*Nz0ze+,?aqRSt6-DZeI'C /fPl#xtaz5qO w%fhg%e[:pU&DeR!ÐDEEII:I=6/UwCEy70 `zD (s:\ƚeᔋ({ham@d+tweZDMć&Xy3:\Q*2R@'kDEͲȇ s>Ç(K@ECTp-m#4KbhH{HS#Hj "$,ːH$,D ~X[}fYD's >IQIk]сh +zxX1) amb:;.!iGOxS#F䊙UEFXFX>6}bfYdD's ~̈1ʓ+pд$ִPV[)U㱲V"jHʈC!sg``1iT{1 "VeX!bYH bDbN0Dм:$CW:k80@M5V i7\({ېt{^1Of#@і)s<Ũ'癑քs|òx$$bb{0BMd#ӁjX$0,!an= 1&fL..rqy^F̶sm 6SNY#/O7y-5fNmtS(='#FŜu$BWQqGOR*/޸$  Gr"H# %wOŏ֩*sC{m3ӗjSJR Z衙|ʿy*uCd:d4 VcedGM(gΘzlU'3[I D#ݍ#Ef%N:l$4Y}nk-VK3$L S91SbLİN lJɔ"O{ ʥ*SHhF^s0Q3Lun e@wNq?iC+R٣*uIYvd:%dN$@ &IFeJGH^kHu,J()4O.Dx}ۋ)Q=-E5䟻|n Ä/Sm} fJ< VW3*>}ȫ!{&&AS)&sLtLi~6cpJUiD+Dxh?!!fhe'DbLm?ֈ}6}1 4԰ش&W} kŻ{~{?Thsqj-nʩS)rHdgTDY~(i)D/T:) #!{]Gmh'ɥ VO-~75wewbPcR bq}C}zx`|ӳuZ?CrW}~tV CP[3MN6C̦;&/`L &d1ǽKDyqzCe8 JJloRoJE[2P)LO`Ѝ}$~;#Qm\^tN;#Wh4_NVRJ+PN%-BF71j:%dN(@( ? ͏ɔP"O{$LhYO6Zmkf(bRe 'de*-;s֦-a%gkd,0c_C/(v ~+>N6ۼm /PۦrMlfӝmئtʶɔm"O{# {bs5Z.mSt913[_wWOzx"{0Z zCzRz]gLӍ^9M>-fNE8iTi#=k.$=}4sD>:xd1篙Ynԥˮs$*vҺ`5K։NS>ta߯R˛awۜkz{SyM7M ~:[˔"[٤+W:f*M6fÏξdynU}iMg=&/d?-p72>->vz~~w CN0TFqtH^M׸@qޤ j4]i7dv6nBi~ qӴLNi⑴Wr.sֽ0dB ,^7s=潱;Wo 횩)&stgh~J ѕ#p>%Q`@-K d?%=n&@"VexJz^%( Vyb T\r]JFPS2BUH@ U"))D/B`y|޾QZՃ@L&HCUZ%F; %Dr4Ll`ӝ٤sZp&S><_<r׻-׻{=TFiMid=&/og+,Ch2M#ǽ◯y04>x{ƷxoVՇ0]A*xCM&{X}hV۬~g>ogC2h.?OgȄa 2Rd\gȸL 92UdӚ#, IV8D5nJ%G[PQE(H9C_?ʡ=n,|&m :)N$aۯ~6DA&B2A"n4!_{.-e˾͋Z:nUytt՗By*S yofdUZ*G9rU_a-c;(BY0ec| Fr:H+ɚbjuӕc/hod'ySR)h};eM%z/zŚ):iobE+ו0 u}'uI&ɁRgLYGݝu9x>6fz~Xϰn*gֵC`]GI0ǣn3ĵn\F{77[䒠 &'Q9KAc<#NR˒*uk4G z/gBh+refk}& 'R}|ќEv#/lnGug/@KoI@r당C__-c(UW3¦ꢶƅFmL[FYظa ۙ A1`vMb0;%ZMaUSX#*LnjԋLhР5fk]'I4I5&$e &uoIJq|2K`(C3d91a>TO3b!I!9%Mukg ®պ::|[* 65ʧ97;X"c̅0ȁf|̤8ː/Rlƛ]90TqquSDfr9N0Ws5Z>цS4EhGX0`q=nۮQc\N{1[ cn~o!Ekrӟp C]%6Q[ǩneЭWtKcUP1' tZ,9m8>$i y2T1I~x:t&h endstream endobj 108 0 obj << /Type /Page /Parent 173 0 R /Resources 109 0 R /Contents 110 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 109 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 110 0 obj << /Length 3719 /Filter /FlateDecode >> stream HW[sHqq6<" #jA ,-)E(<94#錩h[5䟿~=U6*]:wZ׿v3GʷyBe\yZkU?û~,޼)ŒY+S$e]4-K[b.OVj]ܪ+wN .KTmq#Li`ٟ% /87r; e<#/ʿ>TOo`W)|ȷR ̞RUm ~YWZHXF>ϒrŽGNj8_'eMGωݿÈW<^[[#s 8 ֌_rkd?%oz"u(aeU>8&KU <ʗJ0i TdyT86$!?,:x:Qa`Cm]bpWNuhh_eة*JεF?]' ,޹"F{{IÓ(>P&nٻj 0bV ;^G^2\7)zʨ0}Z<[@;HMAyڠf}44:FzQmE ='oWw%w?rC3Ixĥa|20 ƅ re4{n67稫furZl%`en)݋5122|Rqh\]DJ)f)uhQa0/z:ҙ3A5]Q7=.1%2:`|&}ŵxxoL<"  ^ܽ3Nf,eփ !AYf%' AS`J ~'5aLk*ȠL."Vڹ>@."1L6 )L/s-d4[t[P u po wa4' RF"rW8U_O\žnMX%ie\ꊻ)GXW=W ul{ (!'†QX$$C(Vy Us+M+ bbKKB]DC`k v#?S*S>u MrqRnXpt`W{8qU+wN p q8U9htwxgc[qgWT_о-nz2Yf-T~a>1fYBIRL1K Feaa0q@0E5 |\$bM2v[iY!I+h- _P}I!ga7ńb"}Ō3.RݣqIjJ"0k폅Nu11jn=?:t~(CG@|*SAv^] oX'^Fn8):R`,1 Ic̻L3ٿa=8AM`v)`nt>`:7 ^` UrEק6 b#aPtӒ](=gè1ٳ8 0/WKIJ=j $*3yb=Fq7 s)l6vRCd)RFݣq߉|2,)SWr?ym!D7e,zݟ L +1dzBt4%QhE>@{4mI"EQ!u ȵk U/mewfftGz!a|9qPkS/7bn.6 `3Pv[h{ZxTLHGOuzԪlۭrIS4'4EBImJ=E*N2GTi[p6.f4IV|08EK/XHzP]Օ=j@^>iղo~N)h="I0` h;|0偬~=x/fLuf2ї)ЖEn YXn1񥮮tLjC 6xѸ9tx~\L9b!6d7DꮵZ^U^^)*i _QN9ָ5\7XE_/Mڈ[k?7{m=rL03hgxzۛJ¨ yȄ yl\ ^zқMv-ne~MN)z)%du qMu3q^`pvDZt#G5x>~0y=7pn7{p|gOOiML) _R&ŊGF$GR][AHr9f 7Tߺ̿rNkѸF&o^@a4CyHbm6G>moo endstream endobj 111 0 obj << /Type /Page /Parent 173 0 R /Resources 112 0 R /Contents 113 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 112 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 113 0 obj << /Length 3806 /Filter /FlateDecode >> stream HWoGhKCr#w6m Dq?IUiZߒC<.E,rn\?*}U??ϔ7J]cU>>ζH<~5o ]番 *߳2,Jm|7{/7r|]x&}aD&‰i +N-'gamn_ʶa5<ޱ?wsT#u) Ev8C^\WD.$ dƑalY45(F #[TeC-pqO÷gVTaxCpU _Lq-֫Z/|[ć~:WoDΆ<*cȧGy>qs^$2 Ad?>"pPjm?I32ݒS`F}\&\r%Q*bf0C}8P3\K n-ѱEi.G yw6ݡW2X> }Wz<HʼnRWۛ0.558dh^MW f ge䋰ũ(4jN9͈n@.UQŋ_n/2sp|6qS{;(m1J`ͯ1p5vjlKo$LwZ3hktC0F<Ň#a͓wُ`ज(чoi`J ^ux.ǠyȲ.I0O$#$]]99V c@`Xnba#eƚUh㍃[p9lgӆpq[RZy*x~ `EF~RwǓq'1hHy"D$GdG D2p|> R;݈\:"Kr$.\ÃkpNsæY. d5 VX.U> piэ _+X,Zf%O|Z|u۫"x{4h=e1;Fnsk-b0;(0# 'pX8#q[#wtr?z*@3ߖHN*L`+qmHWZTp݂ȉ{E:ϭ&į'C$Ы#q! #"Cа[ԑ;ʇnl&|C~ \ !.˟$lx/K|D7:t+j)oVi#~1OIK]y#'O|T|_HeV0TӠERׁTV`WOח6^ 78u,$gOl|m|4Mg0F :@u>[ٷr{] \c/ԃ˫ `y2;Eޕ:_Ƨ,yj<3n~ȇP6Bp ||Xѱzsysت}Lyv6b <3x aH|9&TtiBJwT l]ueCZ?}z^LtRInp8^3V#G1h>ܮw=#L[ μ-m<‚tsOOL{c^@ IDg>%ʆWGߍ qKqG%c]=}+0XfEQ|-NkskD^c\PC螵:|ِ]^C6]P=w1֙\4\5 )BPHyvKo:)aۇbczO.xsyM\F)%Æc&B]iAZ/:e90('OTC1 kr;o4F׻ ~#?xg\LAAVfHgX]3a_4n׌) YixBqO2%ix}K0zbgХ)e3n7 # g͇ՏUfAyCtGah,=_МQ>o(mbXmz"Ȩb#,?ۆco7m|٩c~Go7W9. XHmh9kl}rr lŻ`K UvaxL~mEn s1, L4 [I<~w{{vMhce1EvnL<(OS 0ݟm Ưhvʰ˔Le0Ev1itPDm{<þؚ)u+>JSXhuK6UGfң2iȣG34J Mfb- ν<>‚?- endstream endobj 114 0 obj << /Type /Page /Parent 173 0 R /Resources 115 0 R /Contents 116 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 115 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 116 0 obj << /Length 5850 /Filter /FlateDecode >> stream HW]oܸ#ɚ V4q1F)Qlvۧ[ҧ[@<~xW[$<~u(|-4w.ubM5Žm5vjZ~; ?GkG_t7Vf(z=Tÿ58v]զ銇/VmFuUSFly-W2Ns %O^eMڢKhLLy"+OS7ᚡ;>?< 8HRk]X뮯VMWPM;ڼ{U7Z}{صz0ko"aƳU+L`6u}{qqy_/6s1,_װ%9:xloԸP.6j3--$ i )m@"5ʝ/a_ZhxzܧjwqucrC}3(/kX?#+}_mH4>ؠȦe%`ziow vnotmFwIvOHmIp;]żMe pΪ`ʽqp[HR< d $MjxM7P=CK?D0(6|z>;' ]e0Y#5!)]B2Fe69~MopQvO#ϊsP[ȧo<`Xև>xe}OJ+ @r s,f9 `0˧ݖ*?( eEmYDw1}"} >=} O[`/d] PbuM?qgFnh(fET~#'$/NΞ]`. EB-DU8WHO)i01]qfO\|f)qv5~oMw)#փ 2B*x&2bnqut2<pSYΜ_/e6n.š-&;!Ў}%LFE`2yBQ:1oS)0<#z[a fܚ޶ں| 6᭜S[" T J= TٻŵxRD*x- Os$*k 8$)٠3z,0~PޯH, #K}V1``]" 4 fh= 4ٻQ"<pO\ZӉY)Xk@%6%UjH ,S ۶Z I { ]0$T&P{ZU |0upi Ivh@D$PT9)-ir.}|WGev;9KJ஡p@r_(To]z_U \+Ixl1cXY43@ifXY~ZY0f|[>;?AhkrVYd{h-r)-/a|Sm)xGj rЗc/ЇA~ᩚM|wb4Qò,p/ d!{Y0,B̞WU`&~n>N?b~y5^ZqunCT-/>R:o}Y@W@ ^{uܷXih9X$\ w;X&\w;X$\-ܪȷNi zZ3\p $d&- ׸Ύ]=ZO<džlǯy 69I5#0AGwjE!tA2hBeHyUU+;  a8g>{I3=I5c:[n ׎::ȓdK4܀.wזGvGBҌmU;.|<$%ՌW9Yx$˜o1H%||S;\"~+M@]sڈ-`0:^rL̖Ҷl8Nt.~ MGĉ-9׻R@ ^)p&hK&ǰL~Y+Uv9ԒRNF%4MnTer) >XEeߜn17[k۲Q=fRᚯ]>zʠ`->KL4Pqs}BVz@iN*c <@V9*c0kMn|%A^NIncz kOжN&Y;E,>sY^{4.>Oe *' Qe f7}or䛵-qnr;RQџ_a~|sgbr򈘗!1yC񞘗!1}ԛ0.&}rͨ竪CW?icE6a0v~˥cJe̸r_| SYkӘ7%^L@xr pT|`~s417[k۲h,}'THy\x˘TNʘon @r͖ڶl9˻&R'I[>ӵP)Ԟ+k({R'YƍWQ%Շj9ﲢ|P"weG]8;ݭ|oab20*cÀ`0*cF 䘛-ǵmqD;R 6Mڙ KG2FӌQVW:ú^Li𯭛*l?,`UN,o\m5ffqaS5:poGIKGH35y?%s4"g xvt`'*F9e11[Kq:WJrkvrKf.hF@w+-͵eS6M:(_|vϒv7$(1Mp P1Q\w17[kR~$<3/:gT"]Si-r=J<׎٩فN;ةeIT@r\ۖ[*j(ˇ#/̮ȖwqE{UL>s;jnua2Č=f/c(c2Čr3cn׶eYngtr2O[Sؑ/^ꅖzi;YUU=6YЋd AAZh@A0eK۲|-̀;Cnw"X \VkE44sKe/Y1;S)cuG~ٞ/ͻ?aKQ=Jcn>|_N .ڪb&&\bG=򎻺 7YҖl؅"_5q엑Lao1c\[G5kA~r=x|0HYe*'@@Zef7pk,fmK6Xv5 0mW|'}"'N|Su|Du*ˢ} 7q^ƔAxr2UƔaqsn|%߬m厳TJkih\jҨŻ!:(lu^py@nu ZE^Y3YYZkXYKs帶-gy7m<:\E˅]gzo2WN4瑪*J_̱4rƿGNTΊ*x@ ,UJĮ)kq@!㽡P <J儡@|0P0{9ꬰl5ffqaS5t LooF_uI\el]]89QYQVSDFAy] !69&fqi[W( +%yS! ǧnੂK.S~qM?),?7&<{'`=D2& RLA|2 br͖ڶl`]8XOq0}K-%'ǟ[E"yH/t,O3c?!9>WW?t+ 2 ~2~2o,s帶-Z7s[!a8 07y] hה\Ʀ>R㏻C/cz ~kϳ/c_ :?7ëߪ&Gv䢸Q:Q;{ySu:}%WƒCTN8sFd7`4Q9X=|s*9A_/za:isˊ endstream endobj 117 0 obj << /Type /Page /Parent 173 0 R /Resources 118 0 R /Contents 119 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 118 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 119 0 obj << /Length 4055 /Filter /FlateDecode >> stream HWokV6dAHfv("qw}FH]Tb(]Ff3:wϦ#Ϛl:y=Qտ1UL]ѭr§T=qmMB :S}glxp8?j6xxL/ݦC71ێٽsRgY $+ɇ*~Xlt] 0.NLw~haEwN!óf.&{KO2}L>U >ˮR]qc89KWhV9C3@mc" )kPwu6OZT2lWzVX1QUV"Ǔ Mtl^Fz,5<|fc:'O/݊]&s֨p/,c C}nC{   6Vǀ&Wx8{w%=*5i{ݹ M7g[Um\z~y+bTR+HTW)5vRڶc\ڶxM`' |ȷ00\O|2cDZH=#5X34zj8fVM~ : %;їΫmu w|půSS1Qc&Zs0ՎGCi`. $1Ec ?D.WA΢c XBGkZ^wm!?YR\=[P z1cP9}]$\Y=4eW%Kljj+ÜOgbHb|l* ~5?":I ~*%we@gsHg,f-;^V[9Xc[u슮䐧(žmO%sX).07L(Z凴F>yhڝwSo7?\V9vSG)x?‰!vo%YX"?ƈ}ӧ"mϛ.a4@DxXlRo0YSGúhZş9ָ*B[.IqleuH)gZmVq"..^7;ҐVV>; zm0j/!)(^Fq K`p]!/(Zd\el\8u=m'qg['ƨ`eUGaqw .Âm  >Ćp;`\ela=ʮzd2^1a$d複P>ZI)#ˋheQlҊ Rmc鳫i^u812s3XR8~>caPUDPs0w[Tھ ?/Y.AE+L +) Vʁ3ʹ)#X{H'=+Vfo{⸶$gzhmJatR mcΜ~y"$NT%6Ff% )TYpN xsl8GV T c!3q9S=Y_(?QI8vL 5& $r#*s,FPf FTuY8њ%V LjDeN a,3,gAJ Cf $,\2. лֳQyQvz:RVJmg*j^daA|r2@przht9uqg u}}^ErQ[($M-e[ /c?J)ٷ]:Ɋw>RzlғOkiPUQ#bruO-d8Rpg (GMhUbj0RlA;$(a@UF a&E²;rSμvɈF{4YE\<#yh&}n)FdM|䧘UӬLve#2 Ų zس S3) mB۠F( m4 lb6(m@Vm#pX /l&/ze/3nbVmżf M/XB>f.W)ϟ^NU'j+RqaD xaM1.a 9.ynKRy`WbAi5`On8 J]cx(ǂdX1(.i-W%xn9⩩!mA8;yf׹8,P2=X"IO4Yxk tRǛz}=ꬱ:}SU\a*4t8w<ޛzFs`jʣ+3zx^.݉?SG'i?5> endobj 121 0 obj << /ProcSet [ /PDF /Text ] /Font << /F5 213 0 R /F8 123 0 R >> /ExtGState << /GS1 222 0 R >> /ColorSpace << /Cs8 189 0 R >> >> endobj 122 0 obj << /Length 3309 /Filter /FlateDecode >> stream Ho9ռQҴ7/2,tmfW[>U,987~n*5x]s¿ϟ~8yU'4{ɛύ3N?y}ߟx 5V~,!P{='vߓWuC?؛3_}׎tS4k{v}{Awm:ޞ ǃLVyM) ZˍKY1<>Q?5*+݌gltP7R='SL(g s6TiwnG˅x~7WBto u8;?x!Cѯ݆歹rjixg'?6zG4U,Bj0Y~ku?P ~W . *VλP*8y.B VϽ+:/;OhS&Vbh!dYgqkiWtwjM=hyi~ڟʛR~-waMhi.BAFZfPd n~'3Nxԩ=,V,9j^Szy]T4M'Qg7MG; -;=N8oc=3-\xv5$5\*guۙS N-a0E]-!ŧ~v䬾G2X,jmjקV+S#-Sǩmc LmQצF1jVyPYj -]i˅HHeo7 -ֆlFg-%|Ԋo|;d LGDڗ@kF0iFg,N_f  ~wH.ȓ߳w ~Gj_Bߑ:;ۭwUvUҏ*^ ^EMxJ]/]CtZ\>v'o!+\]Y%C-C[vuo<=|GMT<-{ȣbO#u`i O򺧑Z<-{}984FO ŞFzl`vutʋҔ:_^Ei|nAw7pGn6ȭڷVc;?id}!(~L;/'2@PL(|]- v:=܍g‹_uK(69q42CR8<&P H3A0 OX@j8ڗhژ Bq8 u4V| ߈[xj "~0轕]|0)Ci'a9`n߭O:DC45bhW$F b׈]q7-=mu@ڏ휶ˇ|7UN̛=ѭFnԧ$75| @RI8 |P_҅q_u|;ཧMJݹmηN3l=tדYN_:R  vxH}/[ȓH- Rrp@@(KvZ0 ^ΗVyѲ:_RK٫(m/|? N>s\@WiwqKl{Cpzqj U|G+NoR<{Z5z4L5`eC+<AXQ0xZ'b@XX[i~n3.CK-BVGm@S0g endstream endobj 123 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 97 /Widths [ 746 281 675 843 563 337 281 563 225 563 506 563 281 563 563 563 337 675 563 563 563 563 281 563 563 675 618 730 787 563 225 506 563 675 506 675 281 675 899 591 618 506 563 394 563 563 675 843 563 730 730 506 730 563 563 730 281 281 591 563 675 337 563 337 506 281 591 591 563 506 618 955 787 225 225 281 730 675 281 337 337 281 1027 730 675 787 563 563 281 281 263 338 338 1012 498 996 221 ] /Encoding 144 0 R /BaseFont /ANLCHH+MSTT31c23700 /FontDescriptor 130 0 R >> endobj 124 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 2 /Widths [ 250 460 ] /Encoding 145 0 R /BaseFont /ANLDNP+Symbol /FontDescriptor 132 0 R /ToUnicode 146 0 R >> endobj 125 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 1 /Widths [ 281 ] /Encoding 147 0 R /BaseFont /ANLJAA+MSTT31c32200 /FontDescriptor 134 0 R >> endobj 126 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 20 /Widths [ 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 ] /Encoding 148 0 R /BaseFont /ANMDOE+MSTT31c32d00 /FontDescriptor 136 0 R >> endobj 127 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 53 /Widths [ 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 598 ] /Encoding 149 0 R /BaseFont /ANMDPK+MSTT31c33900 /FontDescriptor 138 0 R >> endobj 128 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 45 /Widths [ 331 496 248 496 440 331 248 331 440 496 386 496 276 496 331 276 496 496 440 331 716 331 496 496 440 496 496 772 476 476 716 606 882 552 496 716 716 496 276 248 331 496 716 496 496 ] /Encoding 150 0 R /BaseFont /ANMPGJ+MSTT31c34500 /FontDescriptor 140 0 R >> endobj 129 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 6 /Widths [ 598 598 598 598 598 598 ] /Encoding 151 0 R /BaseFont /ANNCEL+MSTT31c35200 /FontDescriptor 142 0 R >> endobj 130 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -46 -210 990 729 ] /FontName /ANLCHH+MSTT31c23700 /ItalicAngle 0 /StemV 0 /CharSet (/G4F/G2A/G3D/G18/GB5/G50/G2B/G06/G19/G3E/GB6/G51/G2C/G3F/G1A/G52/G08/G2D\ /G1B/G40/G09/G53/G2E/G8B/G1C/G54/G2F/G1D/G42/G8C/G55/G30/G0B/G1E/G56/G0C\ /G31/G44/G1F/G57/G32/G0D/G45/G20/G58/G33/G0E/G46/G21/G59/G0F/G34/G47/G22\ /G5A/G35/G10/G48/G23/G5B/G36/G11/G49/G24/G5C/G37/G12/G4A/G25/G5D/G38/G13\ /G4B/G26/G39/G14/G5E/GB1/G4C/G27/G3A/G15/G5F/G03/G28/G4D/G3B/G16/GB3/G4E\ /G29/G04/G60/G17/G3C/GAB/GB4) /FontFile3 131 0 R >> endobj 131 0 obj << /Filter /FlateDecode /Length 9598 /Subtype /Type1C >> stream Hd{XWݎJ~~[2f_m2콫UGA.GF4..hNeLMɭ$TJQrIIBa`֮,<9k}w}~=ZE""~4iA7Goj_]D5GF] qY8r`bzNHJ$PKt\i#+Y{Z{B(Rx7`&f܋0 Ÿ65p =a>a x a-^«؊wp-~[?n,x+8،7>~œxElxq3np;܏X4Vc^l\܉?c#MZZw~#qN9;vLs̓ySSbTT|j=fI.[z\LUy55[קn݆w^gGξ}\:D8/ {:x>W{!ءZjRǨ?OZ*]hb4ycX|#|v6hKoe203GF[R2G 4vR>K(:Δ_d,vrm6mfcCX|{%yXwP> o2~E oJcuz"<}dxk5Ȃ!2qRQ:nh'TeIɲM塃aYRރieܒMAqV?__H)S⿏UWw-:O2/yLIe?@Jط75)OH^7@$}eҮdj##%*C?L7PrCLx!ϿyQ:^K{hYzT͗ꤺ^~/ZF߉fJe)uiEspxi~E^QfaXziRT4'{jz\zr&1)=>V\iqf-5gю z,ݵ9y4Oy 1zǸc1G/$N.:9WTqd)̞m{ !p2ZiHtTCCi?i&/~b?|澜>"k5X()<46>I+|&-y8IOtr ԰ 6x^d5H d~~]ZއB{|KRBeu '*/+/+`L ̫%c)?O6tr۫љE{#+K>۟ttݏtuvSmQ+-)-qi׼)-Zu c=J*wᩎvZw[]}e; Ṕҁ'o4UT]OAz)=FST[]IgƜ{"$H >SFNPL-`bXY3*g4_ўlf@6U*MUk>5"]3'J'"MD钙jtBBgILAN/6_8UWXre>O|8tg}iӵMڨzR|vYQռؐZS)UD Vh,/L*U>/>5(#Љ- r/DE)@T03À030hǦV+U)"AAy? ,TKe5Y=34c*O[:UNwu9>`{KmI.8ҎH7Rsf#c LPcb5xyKvRn+4u o2Flb VQ<L wݴr#%ȏa6Y\9}3*^S@iql\̐,zXx5&k0ߜ5xKddTE{Q¨d)#ܓv3`gK%,ࣷINwm,H80o,y̑xM[3֠ <8GBu-A?aM78P撂0yMt:#"LD_=Ь@m9{LWߍg o*Zws;2Ba.[";af^oa7dxu:&OcK0Jخ~px 6Ofֽgѡ&vdm(5>P7xVC̸gݶOH,,E{yĆ%$^+vvīb%-񇍓ä俰WD20|Q@E^5IiiS/#&F16pn G 3bF,ط܈tIt͡4ҞMM˺{IrRBr''U$bDT_W8n72ƎA%z#XzXuE Gp&Lɐ,WoPN0.ӱ`# [`4󂞝?IͤE3}^6*Xp o+iV{]XIYd3'!m"y*TxP;|x|p@#=#)+Wu2'$e5;A2O-AbƎ uExX[1^׾%}Q]-'&غIKN7ZWbҒX:L+yȅvrmIݭe-TXy9AwvRxLD|O&/^_"3Я)(cP`}2([@]Ϗ~e_#x#sNEp%QQ ;Nx;U;ej$n,t-] CO;QǓ1;[t*u!U`xΉsti2\v~.7Tݢ3w_9f#aeʼtclB* k1CaG1 0SolX%óoc 5f5"$sJ^0b`jVAW+vv"Ĉ1Ba+L0xm-^QW kS,Ipa lB| ̡9fH0y hJDx?ލilEt]vŇ2)NJrUu h)Jbel=C_,n`jʮ!T274DfܗҭR%=E!&>S&EˢSQg~kŜs\ͼgpFѭb%R5oY.X2&>MMg}*MjM!p^Tԅ 2@F'"~ٴaIsk%._NB@dil-Ѿ `;}^ Ӛ_[ZZW5ͧd5(_[h8/e~RE+eEըB]39N/*@m)<5־47\$ rdjjM?&^Ef* Lr0.$^1]%@QdgxAA"8ݢ b@#, "`F@ eAl6nR1jU9CnVER뵺TOV}ǯ%bE1On2݊|sk-m dC-G5kݞ#dєI1NW{J?.眕9@K:87ddMj+֪B2mdg=Q{""}3Lt36)`,'{N~ciMl, _v, 2Ft=8}ʘ>c-G|3\f"w}GZ.kY[_&`e ce34-u~`LqƎ\^cS%{,Q*1|5=&v)E;BdžߍVWFJs\3N "cl-EhI 2hr4N;cөůW~Q2>fnY~d.k?B0 fz)g (VwNMymFۏ[/WӷWdbHwd|D/*I+mLG SM!k7E4<}L0C~oʱ>d.@"]pǵ_y@xNSk#|Tۣ3k-LUVT d)2l6,cg0y5֯kS&faӮ{^]i;pWo^|nk`{OkP?fNq%O'&v~"u?bք][Ãx2k lքY< Q#/%^>)Q_,9\Et?u\nVަ+oj ZTtAѐ<{EXUY{(::1!( y*yOj45GdS'YHQL8G:o5$DDZƿ';6)${PSW5ܫ2c(ȣ[*ŸB$Wh@!Y@Eny+DGxKVdGY j]= '8{3w~8zp,'53+JKQiS<ԕ=+fzjUntG8a}#4.<|?C9LfIֿ\@V SH9XV( &%w:6\b@N+Aķ\q?aؔulODfGl]x<X# Y G˅cy4-{}9IwH]%2J85;4~ 2=Ђ; gbZg76MK@&={},}H@m,1!ni 5Zc36jAԙfN2+8H=c5LI+4,6i޳}?F;(gdnqAr[d4um5dGn!& 9.E DiiLZ0o "ҷn V!hд 7AkM鋦9i{?7-w͐@.Fѱ@7))us@kbrnoEHFw{k'g:\a4?g7g [TT/qSg~٭ Q!w;℄z'yHMTT-8,I0dЙ2Lf YȆR(DR 9^EВw6|El8lv:_(MՅU%LIO7a@e9ĊiA{_r|Լйp?S~5Sj%yws2TH9r9z$L( G9 *Z )qpNr()&3κRvgd 4d4ҟtJC ؋~6\\OQDW1O" `&#exHx}k1]_u*hJdڒD↑{qAfP@Asĩ9ȧSq`~J1> ׾5f^“p?a/fQhMQMV:<`&&_ar7"+ZgV׽iGTxCHKe-*F[p{ i/x xaKs 7s .+/ݗqOnTJt׈D4^L&O\L:kt)<=빟2t l(,#ObMF(kQS*:`uD5UUE*[ɤ흔\EWj򲖒;Wɫw:STM\mD]Dxyiudm8$0OPӋNE%O=Kc'w*YMY^$>D9L?,`jkύ7idaA' q#8<.K> O)&J%vfKXL@!\27Fqr˧sȿ]-P ʪccl32A;*\$e2.\CJ t*)LjRݝWxMedY{yJ7Ѽt@77^*2+*=,c530Oϱ>1=65 {(bA ,~Z> n:A2]mLSW#'[[خ6a1d YcNnj0WAkq0ޑB+-)nad,Ӝ{=iI<99ﲫuPJBl1S ņ&ơݮgQ[*a /x ^r;h0! ƉPcV{wxWybonx<%D wbn*'"Zɔ]Q^29my Ϛu P8 flDGrƔشM u,P^rVxbvK0KR`q!x0v3MWe[YRYRU bLiRXr1S0%+0a/AxKʐCc䤽98 ^Ƭ9ɨXNk>_l՟Lu!jM2pkBƱaE9 endstream endobj 132 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -180 -293 1090 1010 ] /FontName /ANLDNP+Symbol /ItalicAngle 0 /StemV 85 /CharSet (/space/bullet) /FontFile3 133 0 R >> endobj 133 0 obj << /Filter /FlateDecode /Length 255 /Subtype /Type1C >> stream Hbd`ab`ddsq MXf!C,q> endobj 135 0 obj << /Filter /FlateDecode /Length 127 /Subtype /Type1C >> stream Hbd`ad`ddqrt  16L66220k=UnGSn8{OS1012(dq;6YS~''1 ϊ(\ endstream endobj 136 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -22 -209 623 633 ] /FontName /ANMDOE+MSTT31c32d00 /ItalicAngle 0 /StemV 0 /CharSet (/G5C/G4C/G44/G55/G24/G03/G56/G35/G57/G36/G4F/G47/G37/G58/G50/G48/G52/G4A\ /G5B/G53) /FontFile3 137 0 R >> endobj 137 0 obj << /Filter /FlateDecode /Length 2917 /Subtype /Type1C >> stream HU{Tggjk:ַBI0 < * &HBw Ix;`x4wcbwjm`)n=_`ݑU+9s̙;{?ia/ƹ;fͳk-4Й;Qh:̅M691_%.ݥ-_c&]\׃<ww;up9\\a=Y\i9q<{B"Y 0<ٌ(+Π6!VSXNEȝqWU/p}h5Ǟ%**BW{ix~vG I+BcdZUfv TayfH*VfYeڧ7l659i2 Ɩy%+)Gg>㾆t 1v;׏[۠3?"uX-ljepZ IPHB\34Uy)GSU:\Ck^ EP24}&hxe^( DIAGʾrgg“LO0GF*R2N[JHVLl?2҈xFDx>J7b41+\;o(AgcS/IW!Y>ؙàۈ$ˣ#/_7 ָ3wPB$2Q tjdX`?AmdOfGۇ/Ŏ&cUm1^\X `CF^dnh64-EeY\ܸCLF3/4M\#N!јo.&ΤTy~J $Dk:%/OCi!f+LInF*LH~<>s =~+Im̘$Nr^IIf"MF{ Dќ`:zZv_ƣ#wn_E^54m;~UI=x/ 6/˰i#AJ> x V #\/bOo0 9<W?"Xh9荙׬ Y f~vFg/)+~c+F%rpw{5+BZV%h?Y-62-%ˆ#e~`[y06D.' !P2v]|ܻ^c*,j[ڡCВOL|\NeSkaMD D}=}pj|M2Uw4Ea8iguM٘@Ÿ0ƸA7FHK1hi:Sc i )}NmZD\%ʅ Wĥ:8Mޜ{=#\O43uvT /=W6FZfm3`3덙Du2æ5ֱ$jD-e(SЍa\K0f-B#?J M8hv ʹ>:H:c mǾ@cHgJFAq_м[7_A/Y8m{fAn3 y6 ncztC j](*UЖ_2_㧣Up2 H߮g? SCWbn:s`W:aS̀]Ť4vwFtH8nMJn#H2BӏB`%6 ˎ|=rƬAHܝBy$8"!?Dz#. %0 7f}DEX@1|<Ć&b E 2*4Dl?vZk Κ~+;EԱg> endobj 139 0 obj << /Filter /FlateDecode /Length 6704 /Subtype /Type1C >> stream Ht}Pgl+D| .ݵw $ V R@PAhDMHP /ރ@@7X̝vnZf;io:0 k>X+>.qB'BC#$}+`,7ru?\ ?0~|*cEMFJN eI))%Cv,B%d˳c׏%14 TFCH x"%%+p!gw? ^JX>nrpx +,ٱ߼˼üF$+OK=/.ۻ\dX3 f|ܪի[ď׼]Ah2?Spu"tt"S@9SmMYuTGQ8W:?gTҤ ʠ3iK䒓GkSSҙtEGDŕ4Ei u[{a$N;N7Xi:V'VoBt ʙD`⏄epau&~8#y4,>&Gk d ̇M+gqixjZB~,r7H}2><+Fh4!pNV/ޣ`ʬ,B(:j8ڛ+zcz{;c(|26Ĭ3\6af$Jmf;*V;^i-nt-p+lf6@2C7($,-YP*ލW6?*n3wS}X=8UŢoJ;?Lɞo@d 'B;80s1_-j0L`Qgn12?aPfaGt& pj$= >NN)8R])Ǖ- dy71βP"7j-4ACP 䢐 9( MnG] sZܘa2DKA1;p{_m 6lg6ac>Z/ezKec3HiJpSTV &?sz6uã&P`ԈR֫_XsQvp,f_Zd9> YfrpT [0 |LUluk X] 4M3~s~W(P޼꜓B)9eOTy\oIGSŽU71Ln0Q<z~"p5WyS`樯!?ũjRbsJ.λj߼ygrT+3b:b|nY;pe EL<sZf[tn`$| F@ Чݽv:V;$wE`Q ">|)Τ*MB70hÅv t];?/OF?%FDU59xINaYɉ;#40#c2 EӿrG} oC7gDD7e1",zWM{$y=lP,u-N/Ņ9ݥ*";&>xsC m¶8LPE{|yipl7>K‡R4G`):"]8:*5 Fe-m7Џ}յo'sOojj]rsNfvqvޫnmuD+ "WK|<G #D^ B!A Ru+juQǮ:e焜% j+3s~}ٲL9K A'*? /1]Dnbew/" -9Lҧk$(_`g=LXK-$l5jIK^z%21^K +>CKDG`K>l;Jq^c*RJsQYaZJ!e~??榆ܬ-Q#^jRXPx^:Fh.ݿfGA#Sv爪\qM^5d`MkpkzW}w`WU7tq#/ʿzms7kO[S6QDJLH=!PEQ$b=2jABVМ@ g..w4jթyN<&{|k(/w@ng_Kn2gWՌ|f"Ltj0=Q$9MeR-]yٴsBaݍ³t 2x?ȭ_\Vs e;+btlV 75Մw% CڇG۴vb5|lg} (Ë}>ds1\oʇq$=:H?Սػލv Dj<]5:(o+e+aWIzFpM!Xz ?];n ˳fOa ~X|kxS\3J[!-HL l$/.,18L J<=B r)^5žZaԅ8Z+ ]8EB#;tY7yG^^O>A" ML^YDN&:F\@~d-s D!Ӂ/*FKu1Bqaz>8t_aUSÌAH D:P2XP%v/Lp83~diFwDݼgōA;r$"+곋@+-胧֤@{kW4xPRNzspm"n~ߊX5Z {0~Z5\&]&zúbkC@"oz0J6d8fV =Y,|6 < v,c^xGgz\`癧ji#cLC L׃.1xk+Xډr:vP}7F@+X哖d^{T @gTl 's%RqB72Y'QTFdt\ݦ[JmfǤ0 mr6Ȓ]A}hK>oʚ悎3jjeBQ9馻)L´tQ%J8FSulC!2Ϧr.`z>/BНXFZO, >ɜa"܋Ad(e7I'kg߾;Cz~"U?̮dtĄC&3fw v\cit!¤hRU~l٤'O n p79AzgmBr1k ,;\,Q+nm[[ĭ'ďi5v~HECG)Fnk> %f #h>zA(~af('t Y4%n9^J&kbR3;0XDr3$x$S*%bȊd!YADGI2ssDx([$$ zZEÚ0.BFqqVfAźT( (&;"VeQ VED-" X;O[$d9Ik}W0)-'&dj]ND } qjw4dI lxe sd0t+Γo~IwM N8@m}m_,9DZTTh >;& !QI n|piٙLqIn lmie4$ǫ^IXrKx_k7m7@Sఞut ܳv<*fj@Ͻ ;P\2%Oy&Ng쳥 hGdX,3sƉ EW& X9z3ҍ8fIw zR,c<| ^?=w*J4Ds1IӨZƚ~M T6M[n9ʗ?FUumK/w;sNuNݬv<>cc}<\.d/4 V\D8d^" )Ɯ2)[{/Ϭja:_?]5'8~y -;Ȣ u1]V.k6رv|V-_Xyý~W`Qe'oh.|Qa*m r-{-&m :Du*@+O"|qtxZ/Lsub+!R;|J)+PQGF+F3l68!!NW xR, I_%w͕oO)'ב~ְ' m}}X"-q^ LRZο >Y;bؚeLW&5,ɾPttƫd*ͩ7/WKw|A+t s">:)yOL7jG)>М| K!%LE0qaA=.=(X?t*.OGɎ+uJm9N{TVZ}v/uno,AvRX]u)&x?lz<5زNF<4M\MtFV<5%&MGRΊ * -ϦGHGA}J*'H}nDzG3bZ2.$dcyZ\Å9c! ^Mq\\($;'` Ez_ d·݈z.OWD 6ol07d&\dR"QbJK6:9E,u(/+0?9+ Bފh_TƶI44WvgvLlv:sWY`UeLA=S5԰+ߌ(߭uܭN>֗&\UvPY,Ï($$@*pU5Xf{־w:2'M1DѸhcc84Cak͖&WvG_kո_U$йʋl oUƴ[H9V> ;bbl6%hRbv(J8nNSW Ώܤf sfk=%VSp"wӕNYAr2NItbSuB~` O؉N3wYYVYiYY8JgR|^~ΡHMJMLeQq-O i%Y->QZDJnskRE8ې"kspTPD;`PH.J_ njn6"D$4 endstream endobj 140 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -3 -216 861 694 ] /FontName /ANMPGJ+MSTT31c34500 /ItalicAngle 0 /StemV 0 /CharSet (/G4B/G5C/G54/G4C/G2B/G44/G5D/G55/G13/G0B/G03/G45/G5E/G1C/G56/G14/G0C/G24\ /G46/G3E/G57/G4F/G0D/G47/G60/G58/G37/G50/G48/G27/G40/G06/G0F/G51/G49/G30\ /G5A/G39/G52/G10/G29/G4A/G5B/G53/G11) /FontFile3 141 0 R >> endobj 141 0 obj << /Filter /FlateDecode /Length 6529 /Subtype /Type1C >> stream HT{PSw5Z42bE$ >rm<  (BMyC  ]n]c]t:n-vev7qf~Ϝ9 ,ڸc{4Y{xc\_[_N=6a[U>u\ص>XΗxb+pz[k/tيA°57lt/bSefJ+Xa$+Ċp h3+A! B+P6H \ eC0V 606TV!aH W(V  gEl gYK= 1pcs-G?1 0,6`j`E΂F4z) ̠ @8 @ @+;' PT@LzA8[F:qw{j׬w/132r9Ssu\p,ω=Gyey{7>˜kG"EL}/`+8938עmxzÁQ [?S͇=λ==ǹvo"!}x-p) S]?->&nxq֥\B#OMaiew؁Kq%ۃ4%۽/?~#țې/ZJh?xhu$aN}yDЇK+!zů M:3~E;uC!BrrBv+FhhnhLFLdJq&-O)e1 k൮.P 3e6VR̫Jhi"aQ|EJyFE٥aQYH5bZVZFRR6Lαevv9H#ZשcrjIeT)֘;IW7HUg g i⌣G:WFTˎ(IB_” M^aiѤoWq퀲_g8dܯMPꋴDFz fRSXʬG)=)^ [wы+J뤺X}xmq<9VQ^WNe4]$o&m VbUP v3 (e^wPS0V)51&i8̪K@\MeUFjl$;fdjkxpe \<鯠^>#.}|u$3DR8.۵v^bo9KPf\t06v!ڿF]oczmcO +0$? 4k,Fs3Ө}3_#͑وK"N/?OA&@Iү̯I"Ɨh v} 7r,hr$;de w7QQO3К㹻轂HOou7f[I$NďAcC W\7ѫ\k2jȔIu8-2 nWǩ)D\+Dy-r?DB%.m~IwRqv yՕIlʣÛq@$=#F`u!nA'4]S"v!fr26`R~`TN qvP^MjJI0P%uDOD5:q1R8KEbXl KnG-Nr轈1+囤IjU6/쨮_&[׹Qx=/ʛ 2RyQh /0ɸyRJ٦ll6v6@ֆ]-MgJ.]WTMC2 @# !c;vlbqC&+_I'~$1GiHn@6 j[f/ah~}s,k#MlnB槛h2p//.ۭ`;@! ~5%G7WNOd>yI)LqadƲra&]遼<ȫ8֍ M.ܦnkbivF:@$վ8J6un{eN9xgcTh&]ak[Sϊ$wg5MlWЬ )20`,RJM0J` 7t9*A{q{֋fI ^\NFCw<#㨣|_W:FSu/\^dah`KYU_']=dV60L "_^det6K-󙢓Dsh7Fa! N|V=|~&4$3=Kx ^?}4-H@IPՉLgˬK;B n7o{}̀U,R`y9a S3an:S83 L!dώ ,-".]$L I)#:HXslhz lOx,UBGzNVOW1XE$amPL(LdWͼ{B r:F}naz u/9U!@ge=#wW?xxlHAcjȈ_'JPwI'4kt>)oh%rTninN~P6tL}>bWZ UY ߀&r\[hȧ> (I.aҨiiPkrj,LZC^&JlB?0N+KL.G=CoSY Z)5Dm˸e'ޥ6Sboeyـ6цbHotIhwaNp *RR9GD,5&3ɝJ©?DYT t=`w2um\j/,vid[SLZrRl5awl58ȱvb6HM:ʀԒs/6:N.kʪz*3NJE\T2,>pw,)&qW?vR+C,$k+\*֙3ۗ`r\_gPS*$Lli/ r2LZѓWڭN{ ڽ^gc3݂xRv;Po\BV`9<7bؤruIXQe.8DGGc),K S߯a1щ4gU*SX餳p8)b((o(WW"xsZ!R-W"17f}#97*@,Ú-;s͓ZKEWtDeHEϏۜ(9Pѥ&$vƐDhIQ@g2ȴpssV|5o;jV[/e?C[:r{N]f:g8"O=/:o[+}\U8~}GoQU endstream endobj 142 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ 0 -15 591 627 ] /FontName /ANNCEL+MSTT31c35200 /ItalicAngle 0 /StemV 0 /CharSet (/G24/G15/G16/G27/G17/G19) /FontFile3 143 0 R >> endobj 143 0 obj << /Filter /FlateDecode /Length 1110 /Subtype /Type1C >> stream Ht{L[U{YP){ȽLcnE0mcO`]xPp)-e62l { #,\4()err89'ㇱN, ܂CE=Qqq||6}ot`p8T++\N.tq\WM_cq1t_@o`a~|[aZ ư*v:䰜Y7N|M`O}_uzaF`k ͨtrqrҝQsзvt1YB"ΞLO(*֔WVjV FMm}}awv]SM6CZ2r]MV+ٲY|BPڃ\< j!%DUA'R eBM]BZx9;P5z]4J#-b2O^3+s⡬A*s0LQ9DW鍤Ag6!F]X#c׈ce|p7HloA8 97ŴƱd-nГ/P ǚX!z= ( &%SZL*[*TrR)hc^f] @|#=iOĖ7~ ]Ռh8@$,%[=> endobj 145 0 obj << /Type /Encoding /Differences [ 1 /space /bullet ] >> endobj 146 0 obj << /Filter /FlateDecode /Length 218 >> stream HTP=o \ Pv'DHA $=d??62̈fG6d&\A':Ϭ:/q_3}W!לvE\$-;z 37ߵBV΅iAE HH?䡘#=[)kR2⯹N=͘-,VSbP=l endstream endobj 147 0 obj << /Type /Encoding /Differences [ 1 /G11 ] >> endobj 148 0 obj << /Type /Encoding /Differences [ 1 /G37 /G48 /G56 /G57 /G50 /G52 /G47 /G24 /G58 /G5B /G4C /G4F /G44 /G55 /G5C /G35 /G4A /G03 /G36 /G53 ] >> endobj 149 0 obj << /Type /Encoding /Differences [ 1 /G08 /G37 /G15 /G16 /G03 /G10 /G17 /G18 /G1B /G1C /G13 /G14 /G2A /G48 /G51 /G55 /G44 /G57 /G27 /G30 /G29 /G0D /G06 /G24 /G39 /G11 /G56 /G5A /G52 /G0B /G2B /G5D /G0C /G26 /G4F /G4C /G4A /G5B /G58 /G47 /G4B /G50 /G4E /G36 /G20 /G0F /G45 /G12 /G1F /G19 /G1A /G46 /G21 ] >> endobj 150 0 obj << /Type /Encoding /Differences [ 1 /G3E /G5B /G0F /G5C /G5D /G40 /G03 /G55 /G48 /G53 /G56 /G51 /G57 /G4B /G49 /G4C /G54 /G58 /G46 /G0B /G2B /G0C /G52 /G47 /G44 /G14 /G13 /G50 /G5E /G60 /G27 /G37 /G30 /G29 /G4A /G5A /G39 /G45 /G4F /G11 /G10 /G1C /G24 /G0D /G06 ] >> endobj 151 0 obj << /Type /Encoding /Differences [ 1 /G15 /G24 /G17 /G27 /G16 /G19 ] >> endobj 152 0 obj << /Count 14 /First 153 0 R /Last 154 0 R >> endobj 153 0 obj << /Title (AT Commands\t3) /Dest [ 18 0 R /XYZ null null null ] /Parent 152 0 R /Next 154 0 R /First 157 0 R /Last 158 0 R /Count 10 >> endobj 154 0 obj << /Title (S-Registers) /Dest [ 117 0 R /XYZ null null null ] /Parent 152 0 R /Prev 153 0 R /First 155 0 R /Last 156 0 R /Count 2 >> endobj 155 0 obj << /Title (Factory defaults) /Dest [ 117 0 R /XYZ null null null ] /Parent 154 0 R /Next 156 0 R >> endobj 156 0 obj << /Title (S-Register Summary) /Dest [ 117 0 R /XYZ null null null ] /Parent 154 0 R /Prev 155 0 R >> endobj 157 0 obj << /Title (AT Command Guidelines) /Dest [ 18 0 R /XYZ null null null ] /Parent 153 0 R /Next 166 0 R >> endobj 158 0 obj << /Title (AT#UD Command \205 Modem Diagnostics Support) /Dest [ 102 0 R /XYZ null null null ] /Parent 153 0 R /Prev 159 0 R >> endobj 159 0 obj << /Title (AT# Commands - Voice Modem Support) /Dest [ 87 0 R /XYZ null null null ] /Parent 153 0 R /Prev 160 0 R /Next 158 0 R >> endobj 160 0 obj << /Title (AT* Commands \205 Black List Support) /Dest [ 84 0 R /XYZ null null null ] /Parent 153 0 R /Prev 161 0 R /Next 159 0 R >> endobj 161 0 obj << /Title (AT+F Commands - Fax Support) /Dest [ 78 0 R /XYZ null null null ] /Parent 153 0 R /Prev 162 0 R /Next 160 0 R >> endobj 162 0 obj << /Title (AT% Commands) /Dest [ 66 0 R /XYZ null null null ] /Parent 153 0 R /Prev 163 0 R /Next 161 0 R >> endobj 163 0 obj << /Title (AT\\ Commands - Error correction control) /Dest [ 60 0 R /XYZ null null null ] /Parent 153 0 R /Prev 164 0 R /Next 162 0 R >> endobj 164 0 obj << /Title (AT& Commands) /Dest [ 51 0 R /XYZ null null null ] /Parent 153 0 R /Prev 165 0 R /Next 163 0 R >> endobj 165 0 obj << /Title (Basic AT Commands) /Dest [ 21 0 R /XYZ null null null ] /Parent 153 0 R /Prev 166 0 R /Next 164 0 R >> endobj 166 0 obj << /Title (AT Command Set) /Dest [ 21 0 R /XYZ null null null ] /Parent 153 0 R /Prev 157 0 R /Next 165 0 R >> endobj 167 0 obj << /S /D >> endobj 168 0 obj << /Nums [ 0 167 0 R ] >> endobj 169 0 obj << /Type /Pages /Kids [ 187 0 R 1 0 R 18 0 R 21 0 R 24 0 R 27 0 R 30 0 R 33 0 R 36 0 R 39 0 R ] /Count 10 /Parent 170 0 R >> endobj 170 0 obj << /Type /Pages /Kids [ 169 0 R 171 0 R 172 0 R 173 0 R ] /Count 37 >> endobj 171 0 obj << /Type /Pages /Kids [ 42 0 R 45 0 R 48 0 R 51 0 R 54 0 R 57 0 R 60 0 R 63 0 R 66 0 R 69 0 R ] /Count 10 /Parent 170 0 R >> endobj 172 0 obj << /Type /Pages /Kids [ 72 0 R 75 0 R 78 0 R 81 0 R 84 0 R 87 0 R 90 0 R 93 0 R 96 0 R 99 0 R ] /Count 10 /Parent 170 0 R >> endobj 173 0 obj << /Type /Pages /Kids [ 102 0 R 105 0 R 108 0 R 111 0 R 114 0 R 117 0 R 120 0 R ] /Count 7 /Parent 170 0 R >> endobj 174 0 obj << /Dt (D:19991128173958) /JTM (Distiller) >> endobj 175 0 obj /This endobj 176 0 obj << /CP (Distiller) /Fi 175 0 R >> endobj 177 0 obj << /R [ 1200 1200 ] >> endobj 178 0 obj << /JTF 0 /MB [ 0 0 595 842 ] /R 177 0 R /W [ 0 36 ] >> endobj 179 0 obj << /Fi [ 176 0 R ] /P [ 178 0 R ] >> endobj 180 0 obj << /Dm [ 595 842 595 842 ] >> endobj 181 0 obj << /MF false /Me 180 0 R >> endobj 182 0 obj << /D [ 179 0 R ] /MS 181 0 R /Type /JobTicketContents >> endobj 183 0 obj << /A [ 174 0 R ] /Cn [ 182 0 R ] /V 1.10001 >> endobj 184 0 obj << /CreationDate (D:19991128173958) /Producer (Acrobat Distiller 4.0 for Windows) /Creator (PSCRIPT.DRV Version 4.0) /Title (Microsoft Word - Smart Link Modems AT Commands - user version.rtf) /ModDate (D:19991128174001+02'00') >> endobj xref 0 185 0000000000 65535 f 0000030095 00000 n 0000030353 00000 n 0000030511 00000 n 0000030669 00000 n 0000030827 00000 n 0000030985 00000 n 0000031143 00000 n 0000031301 00000 n 0000031459 00000 n 0000031617 00000 n 0000031776 00000 n 0000031935 00000 n 0000032095 00000 n 0000032255 00000 n 0000032415 00000 n 0000032575 00000 n 0000032724 00000 n 0000033967 00000 n 0000034122 00000 n 0000034284 00000 n 0000037147 00000 n 0000037302 00000 n 0000037464 00000 n 0000040294 00000 n 0000040449 00000 n 0000040598 00000 n 0000042911 00000 n 0000043066 00000 n 0000043215 00000 n 0000045362 00000 n 0000045517 00000 n 0000045666 00000 n 0000047094 00000 n 0000047249 00000 n 0000047411 00000 n 0000049275 00000 n 0000049430 00000 n 0000049579 00000 n 0000051345 00000 n 0000051500 00000 n 0000051649 00000 n 0000053006 00000 n 0000053161 00000 n 0000053310 00000 n 0000054971 00000 n 0000055126 00000 n 0000055275 00000 n 0000057107 00000 n 0000057262 00000 n 0000057411 00000 n 0000059099 00000 n 0000059254 00000 n 0000059403 00000 n 0000061467 00000 n 0000061622 00000 n 0000061771 00000 n 0000063464 00000 n 0000063619 00000 n 0000063768 00000 n 0000065371 00000 n 0000065526 00000 n 0000065675 00000 n 0000067470 00000 n 0000067625 00000 n 0000067774 00000 n 0000068972 00000 n 0000069127 00000 n 0000069302 00000 n 0000070968 00000 n 0000071123 00000 n 0000071285 00000 n 0000072436 00000 n 0000072591 00000 n 0000072740 00000 n 0000074800 00000 n 0000074955 00000 n 0000075104 00000 n 0000076189 00000 n 0000076344 00000 n 0000076493 00000 n 0000078330 00000 n 0000078485 00000 n 0000078634 00000 n 0000079701 00000 n 0000079856 00000 n 0000080017 00000 n 0000082017 00000 n 0000082172 00000 n 0000082321 00000 n 0000084406 00000 n 0000084561 00000 n 0000084710 00000 n 0000086532 00000 n 0000086687 00000 n 0000086836 00000 n 0000088656 00000 n 0000088811 00000 n 0000088974 00000 n 0000090893 00000 n 0000091050 00000 n 0000091200 00000 n 0000092241 00000 n 0000092399 00000 n 0000092563 00000 n 0000094753 00000 n 0000094911 00000 n 0000095061 00000 n 0000102379 00000 n 0000102537 00000 n 0000102687 00000 n 0000106482 00000 n 0000106640 00000 n 0000106790 00000 n 0000110672 00000 n 0000110830 00000 n 0000110980 00000 n 0000116906 00000 n 0000117064 00000 n 0000117214 00000 n 0000121345 00000 n 0000121503 00000 n 0000121653 00000 n 0000125038 00000 n 0000125606 00000 n 0000125799 00000 n 0000125974 00000 n 0000126227 00000 n 0000126614 00000 n 0000126968 00000 n 0000127163 00000 n 0000127778 00000 n 0000137469 00000 n 0000137697 00000 n 0000138044 00000 n 0000138260 00000 n 0000138479 00000 n 0000138778 00000 n 0000141788 00000 n 0000142219 00000 n 0000149016 00000 n 0000149416 00000 n 0000156038 00000 n 0000156276 00000 n 0000157479 00000 n 0000158033 00000 n 0000158110 00000 n 0000158403 00000 n 0000158470 00000 n 0000158633 00000 n 0000158964 00000 n 0000159254 00000 n 0000159346 00000 n 0000159413 00000 n 0000159574 00000 n 0000159732 00000 n 0000159854 00000 n 0000159978 00000 n 0000160104 00000 n 0000160254 00000 n 0000160408 00000 n 0000160564 00000 n 0000160711 00000 n 0000160843 00000 n 0000161003 00000 n 0000161135 00000 n 0000161272 00000 n 0000161406 00000 n 0000161438 00000 n 0000161484 00000 n 0000161633 00000 n 0000161726 00000 n 0000161875 00000 n 0000162024 00000 n 0000162157 00000 n 0000162222 00000 n 0000162246 00000 n 0000162300 00000 n 0000162343 00000 n 0000162422 00000 n 0000162480 00000 n 0000162530 00000 n 0000162579 00000 n 0000162659 00000 n 0000162729 00000 n trailer << /Size 185 /ID[] >> startxref 173 %%EOF 153 0 obj << /Title (AT Commands) /Dest [ 18 0 R /XYZ null null null ] /Parent 152 0 R /Next 154 0 R /First 157 0 R /Last 158 0 R /Count 10 >> endobj 184 0 obj << /CreationDate (D:19991128173958) /Producer (Acrobat Distiller 4.0 for Windows) /Creator (PSCRIPT.DRV Version 4.0) /Title (Smart Link Modems AT Commands) /ModDate (D:19991128174319+02'00') /Subject (End-user version) >> endobj xref 153 1 0000166808 00000 n 184 1 0000166966 00000 n trailer << /Size 226 /Info 184 0 R /Root 186 0 R /Prev 173 /ID[<5b73649b5d6a35b46bcc4849c0c42746>] >> startxref 167207 %%EOF 00032724 00000 n 0000033967 00000 n 0000034122 00000 n 0000034284 00000 n 0000037147 00000 n 0000037302 00000 n 0000037464 00000 n 0000040294 00000 n 0000040449 00000 n 0000040598 00000 n 0000042911 00000 n 0000043066 00000 n 0000043215 00000 n 0000045362 00000 n 0000045517 00000 n 0000045666 00000 n 0000047094 00000 n 0000047249 00000 n 0000047411 00000 n 0000049275 00000 n 0000049430 00000 n 0000049579 00000 n 0000051345 00000 n 0000051500 00000 n 0000051649 00000 n 0000053006slmodem-2.9.11-20110321/faxing/1stRead.txt0000644000175000000620000000443210772070434016307 0ustar marvstaff The scripts in this folder were provided by Jean-Pierre Demailly. The test modem is on a High Definition Audio card: Class 0403: 8086:284b Audio device: Intel Corporation 82801H Primary PCI_id 8086:284b Subsystem PCI_id 103c:30cc hosting Motorola chip 0x1057305 The software for Microsoft provided by Motorola has a sm56 designation. However the applicability of the Jean-Pierre's scripts most likely extends to any modem supportable with the slmodemd helper utility. Some modifications of the scripts may be necessary for these other modems. -------------- http://linmodems.technion.ac.il/bigarch/archive-eighth/msg00594.html Hi: Thanks to your previous help, I have been able to get my winmodem Smartlink SM56 to work at least partially on my x86_64 laptop (with a 64 bit kernel). However, some tweaks were necessary : 1. The slmodem package fails to compile properly from scratch because * the Makefile forgets to uses the -m32 option to force compilation in 32 bit (necessary because of needed ld with 32 bit blobs) * the slamr driver which is pure 32 bit cannot be compiled on a a 64 bit machine, and so the Makefile should disable this automatically. I enclose a Makefile which includes this test. 2. After tweaking as in 1), compilation of slmodemd in 32bit mode is successful and I could call slmodem -c FRANCE --alsa hw:0,6 (as this seems to be appropriate in my case). Then device /dev/ttySL0 is created However, when trying using to use the modem, I first got an error period size 48 not supported by playback (64) (already reported by many people). Things improved a lot by using the "Hell labs patch" enclosed - it seems that a test fax (class 1) was succesfully sent. Maybe the change should be implemented in the next iteration of slmodemd and enabled/disabled through the use of an ad hoc option. I also got French Minitel (V23 mode) almost working - the initializing escape code is probably still not OK as the echo of keys was garbled. In addition, there is not sound on dialing - maybe the hell labs patch simply disables error after failure of using ALSA. Alsa support obviously has to be fixed for SM56 on 64 bit machines. Here is where I am - it seems pretty close to be made to work, but not there yet ! Regards, Jean-Pierre Demailly slmodem-2.9.11-20110321/faxing/modem.sh0000755000175000000620000000165010772066107015704 0ustar marvstaff#!/bin/sh if test "$1" = "" then if test `ps aux | grep -c -e "[s]lmodemd"` = "1" then killall -9 slmodemd fi rm -f /dev/modem rm -f /etc/wvdial.conf exit fi if test "$1" = "sm56" then if test `ps aux | grep -c -e "[s]lmodemd"` = "1" then killall -9 slmodemd fi /usr/sbin/slmodemd -c FRANCE --alsa hw:0,6 & cd /etc rm -f /etc/wvdial.conf ln -s wvdial/wvdial.conf.sm56 wvdial.conf cd /dev rm -f /dev/modem sleep 1 FILE=`ls -al ttySL0 | cut -d">" -f 2` FILE=`echo $FILE` echo "chmod a+rw $FILE" chmod a+rw $FILE ; ln -s ttySL0 modem exit fi if test "$1" = "olitec" then if test `ps aux | grep -c -e "[s]lmodemd"` = "1" then killall -9 slmodemd fi cd /etc rm -f /etc/wvdial.conf ln -s wvdial/wvdial.conf.olitec wvdial.conf cd /dev rm -f /dev/modem chmod a+rw ttyUSB0 ; ln -s ttyUSB0 modem exit fi if test "$1" = "ppp" then /sbin/ifconfig wlan0 down fi slmodem-2.9.11-20110321/faxing/xtel.lignes0000444000175000000620000000234410772066107016422 0ustar marvstaff# # Fichier xtel.lignes # # Config V.23, modem OLITEC generique #modem0,/dev/modem,1200,7,E,\dat\r OK atm0b2\r OK atdt\T\r CONNECT,30 # Config V.23, modem Motorola SM56 modem0,/dev/modem,1200,7,E,\dat\r OK atm0x3+ms=23\r OK atdt\T\r CONNECT,30 # Config V.23, modem HAYES generique #modem0,/dev/modem,1200,7,E,\dat\r OK atm1b2\r OK atdt\T\r CONNECT,30 # Config TVR, Djinn-Flash 9600 #le_tvr,/dev/modem,9600,8,N,\dat&fm1e0&k3+xm3\r OK atdt\T\r CONNECT,30 # Ce meme Djinn-Flash en mode V.23 #modem0,/dev/modem,38400,7,E,\dat&fm1e0&k3f3\r OK atdt\T\r CONNECT,30 # Modems USR 28800/33600 (a choisir) #modem0,/dev/modem,1200,7,E,\dat\r OK ATM1S34=8&N2\r OK atdt\T\r CONNECT,30 #modem0,/dev/modem,1200,7,E,\dat\r OK ATM1S34=14&N2\r OK atdt\T\r CONNECT,3 #modem0,/dev/modem,1200,7,E,\dat\r OK ATM1S27.4=1&N2\r OK atdt\T\r CONNECT,3 #modem0,/dev/modem,1200,7,E,\dat\r OK ATM1S27=16&N2S40=1S9=100&N2\r OK atdt\T\r CONNECT,30 # Modem USR Sporter 56K #modem0,/dev/modem,1200,7,E,\dat\r OK AT&F1M1S27=16S34=8S40=6&N2S9=100&B2\r OK atdt\T\r CONNECT,30 #Modem USR Courier I-modem externe bios 2.50 #modem0,/dev/modem,38400,7,E,\dat\r OK AT&f1m1l1b0*v2=3s34=8&n2s27=16s40=1s9=100&b2\r OK atdt\T\r CONNECT,30 # Minitel 1 #modem0,/dev/modem,1200,7,E,minitel1,30 slmodem-2.9.11-20110321/faxing/modem0000755000175000000620000000150310772066107015270 0ustar marvstaff#!/bin/sh if test "$1" = "" then echo "Usage du script 'modem' :" echo "Configuration : modem [sm56] [olitec]" echo "Appel PPP : modem ppp" echo "" echo "En l'état, suppression de la configuration du modem ..." sudo /usr/bin/modem.sh echo "" exit fi if test "$1" = "sm56" then echo "Configuration 'sm56' comme modem de Classe 1 ..." echo "CLASS=1" > ~/.xfaxcfg echo "RESET=\"-kZ -kX3\"" >> ~/.xfaxcfg sudo /usr/bin/modem.sh sm56 exit fi if test "$1" = "olitec" then echo "Configuration 'olitec' comme modem de Classe 2 ..." echo "CLASS=2" > ~/.xfaxcfg sudo /usr/bin/modem.sh olitec exit fi if test "$1" = "ppp" then if [ -r /etc/wvdial.conf ] then sudo /usr/bin/modem.sh ppp wvdial else echo "Sélectionner d'abord le modem : modem [sm56] [olitec] !!" fi exit fi slmodem-2.9.11-20110321/faxing/sm56_initstrings0000644000175000000620000002710410772066107017420 0ustar marvstaffMotorola Modem Init Strings motorola 56 Command Option Description *DD Dial WaitSpecifies the time interval to wait when the modem encounters a W or w while processing a dial string *DD0 2 Seconds *DD1 3 Seconds *DD2 4 Seconds *DD3 6 Seconds *DD4 12 Seconds *DD5 15 Seconds *DD6 20 Seconds *DD7 30 Seconds *DD8 40 Seconds *LS Low-Speed Operation ProtocolLets you select a communications protocol to communicate with very low-speed or older modems. *LS0 Bell 103 *LS1 ITU-T V.21 (international standard) *LS2 Bell 103 or ITU-T V.21 (Auto determination) *MM Modulation Mode *MM0 V.34 Auto Modulation *MM1 V.21 *MM2 Bell 103 *MM4 V.22/Bell 212 *MM5 V.22bis *MM6 V.23 *MM10 V.32 Only *MM11 V.32 bis *MM12 V.34 Only *MM13 K56flex™ Only *MM14 K56flex™ Auto-modulation *MM15 V.90 OnlyCommand Option Description A (none) Answer incoming call A/ (none) Repeat Last CommandRe-issues the previous command to the modem.(Do not press Return; the command executes as soon as the / is pressed.) D (none) Dial a NumberInstructs the modem to dial the telephone number that you enter immediately after the ATD command. Example: ATD5554678. Note: if multiple ATD commands are used in voice mode, the modem must be forced to blind-dial after dial-tone detection. E Echo Async (Keyboard) Input to TerminalDetermines whether the characters you type at the keyboard are displayed (echoed) to the terminal-emulation window (if it is active) or to the communications application. E0 Disable E1 Enable H Hook H0 Go on Hook (disconnect from the telephone line; hang up) H1 Go off Hook (connect to the telephone line) I Request Information From Modem I0 “960” I1 “000” I2 “OK” I3 Software Version I4 “OK” I5 Disconnect Reason I6 Country Code I7 Product Code L Speaker VolumeThis parameter determines the volume, for call-progress monitor only, of sounds such as dialing, ringing, busy, negotiation.This parameter is not supported in the SM56 Modem for ISA. It is supported in the SM56 for PCI as follows. L0, L1 Low L2 Medium L3 High M Speaker Control M0 Off M1 On During Training Only M2 Always On M3 Off during dialing; on during call progress; off during data transfer O Return to On-Line ModeThis parameter determines whether the modem initiates a retrain after changing from escape mode to data mode, or after a semi-colon in dial strings. O0 No Retrain O1 Retrain O2 Initiate Rate Renegotiation O3 Rate Renegotiation with silence P P Pulse Dial Q Result-Code DisplayThe modem can send result codes and connect messages to the computer as a result of connecting or failing to connect; establishing a data rate; and establishing error-correction and data-compression protocols. Refer to: ATV; AT\V; ATX. Q0 Enable display Q1 Disable display T T Tone DialThis command instructs the modem to use DTMF tone dialing. V Result-Code FormatDetermines whether the modem sends short- or long-form messages to the communications application, indicating the connection status, rate, and mode. V0 Return Numeric Code (Short Form) V1 Return Text (Long Form) X Select Call-Progress Result Codes to Return X0 No Carrier; Connect. Modem reports lack of a carrier signal; connection success/failure; modem dials without waiting for a dial tone X1 No Carrier; Connect; Connect . Modem reports lack of a carrier signal; connection success/failure, and the computer data rate established X2 No Carrier; Connect; Connect ; No Dial Tone. Modem reports lack of a carrier signal; connection success/failure; the computer data rate established; and the lack of a dial tone X3 No Carrier; Connect; Connect ; Busy-tone. Modem reports lack of a carrier signal; connection success/failure; the computer data rate established; and the presence of a busy signal X4 No Carrier; Connect; Connect ; No Dial-tone; Busy-tone. Modem reports lack of a carrier signal; connection success/failure; the computer data rate established; the lack of a dial tone; and the presence of a busy signal Z Z Reset Modem Parameters to Default Configuration &C DCD Control &C0 Always Asserted &C1 Asserted in Data Mode Only &D DTR ControlDetermines how modem responds to DTR signal from DTE. &D0 Ignore DTR &D1 Enter Command mode when DTR transitions from asserted to de-asserted &D2 Disconnect call when DTR transitions from asserted to de-asserted &D3 Reset modem parameters to default configuration when DTR transitions from asserted-to-de-asserted &G Guard Tone &G0 Off &G1 550 Hz Guard Tone &G2 1800 Hz Guard Tone &I Dial TX Level &In Level n; n = 0 to 15. Default = 9 &I99 Automatic Level &P Pulse CycleUsed when the modem is instructed to pulse dial. &P0 40/60 Make/Break Ratio &P1 33/67 Make/Break Ratio &P2 38/62 Make/Break Ratio &R CTS Control &R0 Normal &R1 Always On &S DSR Control &S0 Always On &S1 On When Modem Recognizes Remote &T Test &T0 Terminate Test &T1 Initiate Local Analog Loopback TestDisconnect the telephone line from the SM56 modem line input connector before using this command.With SM56 Build 50 or later, set S-Register 46 = 23 (ATS46=23) before executing &T1. &TD Dial TX Level &TDn Level n; n = 0 to 15 &TD99 Automatic Level &V Modem Status &V0 Short Form Report &V1 Current or Last Connection Report &V2 Long Form Report Copyright© Motorola ISG 1998 *MM16 V.90 Auto Command Option Description %B Maximum Modulation RateSets the rate that the modem uses when connecting in a data modulation mode for performing functions such as Internet access or file transfer %B0 Maximum modem rate that the modem supports %B1 300 BPS %B2 1.2 KBPS %B3 2.4 KBPS %B4 4.8 KBPS %B6 9.6 KBPS %B7 7.2 KBPS %B8 12.0 KBPS %B9 14.4 KBPS %B11 16.8 KBPS %B12 19.2 KBPS %B13 21.6 KBPS %B14 24.0 KBPS %B15 26.4 KBPS %B16 28.8 KBPS %B17 31.2 KBPS %B18 33.6 KBPS %B19 32.0 KBPS %B20 34.0 KBPS %B21 36.0 KBPS %B22 38.0 KBPS %B23 40.0 KBPS %B24 42.0 KBPS %B25 44.0 KBPS %B26 46.0 KBPS %B27 48.0 KBPS %B28 50.0 KBPS %B29 52.0 KBPS %B30 54.0 KBPS %B31 56.0 KBPS %B32 58.0 KBPS %B33 60.0 KBPS %B34 28000 BPS %B35 29333 BPS %B36 30666 BPS %B37 33333 BPS %B38 34666 BPS %B39 37333 BPS %B40 38666 BPS %B41 41333 BPS %B42 42666 BPS %B43 45333 BPS %B44 46666 BPS %B45 49333 BPS %B46 50666 BPS %B47 53333 BPS %B48 54666 BPS %C Data CompressionDetermines whether the modem implements methods of increasing the effective data rate by reducing the number of bits used to represent data %C0 Disable Compression %C1 Enable Compression %D Disconnect Buffer DelayControls the delay after detection of a disconnect request before the modem disconnects from the telephone line %D0 Disable Delay %Dn Delay for n Seconds (n = 1 to 255) %L Minimum Modulation Rate %L0 Minimum modem rate that the modem supports %L1 300 BPS %L2 1.2 KBPS %L3 2.4 KBPS %L4 4.8 KBPS %L7 7.2 KBPS %L6 9.6 KBPS %L8 12.0 KBPS %L9 14.4 KBPS %L11 16.8 KBPS %L12 19.2 KBPS %L13 21.6 KBPS %L14 24.0 KBPS %L15 26.4 KBPS %L16 28.8 KBPS %L17 31.2 KBPS %L18 33.6 KBPS %L19 32.0 KBPS %L20 34.0 KBPS %L21 36.0 KBPS %L22 38.0 KBPS %L23 40.0 KBPS %L24 42.0 KBPS %L25 44.0 KBPS %L26 46.0 KBPS %L27 48.0 KBPS %L28 50.0 KBPS %L29 52.0 KBPS %L30 54.0 KBPS %L31 56.0 KBPS %L32 58.0 KBPS %L33 60.0 KBPS %L34 28000 BPS %L35 29333 BPS %L36 30666 BPS %L37 33333 BPS %L38 34666 BPS %L39 37333 BPS %L40 38666 BPS %L41 41333 BPS %L42 42666 BPS %L43 60.0 KBPS %L44 46666 BPS %L45 49333 BPS %L46 50666 BPS %L47 53333 BPS %L48 54666 BPS \K Break Handling Method \K1 Destructive Expedited \K3 Non-destructive Expedited \K5 Non-destructive Non-expedited \N Error-Correction Mode \N0 Normal \N1 Direct \N4 LAP-M Only \N6 Reliable \N7 Auto-Reliable \Q DTE Flow Control \Q0 Disable \Q1 XON/XOFF (software flow control) \Q3 RTS/CTS (hardware flow control) \T Disconnect on DTE Inactivity \T0 Disable \Tn Disconnect after n minutes of inactivity by the computer; n = 0 to 255 \V Connect Message FormatDetermines which messages the modem generates at connection time \V0 Display DTE Rate \V1 DTE with EC/DC Message \V2 Display DCE Rate \V3 DCE with EC/DC Message \V4 DCE with Modulation & EC/DC Message Copyright© Motorola ISG 1998 Copyright© Motorola ISG 1998 -Register Option Description S0 Auto-Answer on Ring Number S0=0 Disable S0=n Answer on Ring n; n=0 to 255 S1 Ring Count S1=n Counts the number of rings in an incoming call. If the modem is configured to auto-answer (S0 set to a non-zero option), when S1=S0, the modem answers the call. S2 Select Escape Character S2=n Specifies ASCII character for Escape; n=0 to 255. Default = 43 (+) S3 Select Carriage-Return Character S3=n Specifies ASCII character for Carriage-Return; n=0 to 127. Default = 13 (CR) S4 Select Line-Feed Character S4=n Specifies ASCII character for Line-Feed; n=0 to 127. Default = 10 (LF) S5 Select Backspace Character S5=n Specifies ASCII Character for Backspace; n=0 to 127. Default = 8 (BS) S6 Blind Dial S6=n Before dialing, the modem goes off-hook and waits n seconds; n=0 to 255. Note: When the ATX2 or ATX4 option is in effect, the S6 value is disregarded.Default = 2 S7 Call Time-out S7=n Pause for n seconds; n=0 to 255; before dialing. Default = 60 S8 Pause Delay S8=n Pause for n seconds; n=0 to 255; for dial modifier in a dial string. Default = 2 S10 DCD Loss Disconnect S10=n Disconnect after n seconds; n=0 to 255 in 0.1 second increments; after DCD signal is de-asserted. Default = 14 S11 Tone Length S11=n Specifies duration, in 0.001 second increments, of DTMF tone when it is generated; n=60 to 255. Default =72 S12 Escape Code Guard Time S12=n Specifies the interval, in 0.02-second increments, that must be present on either side of the escape code (+++) for the modem to recognize the escape command and enter command mode. If S12=0, the speed at which you enter the escape sequence is not a factor. Default = 50 S18 Test Timer S18=n Specifies test execution duration; n=0 to 255. Default = 0 Copyright© Motorola ISG 1998 Sent to me by: Sharad Hirjee slmodem-2.9.11-20110321/faxing/wvdial.conf0000644000175000000620000000044510772066107016402 0ustar marvstaff [Dialer Defaults] Init1 = ATZ Init2 = ATQ0 M0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 Dial Command = "ATDT" Modem Type = Analog Modem ISDN = 0 New PPPD = yes Carrier Check = no Modem = /dev/ttySL0 Phone = 0123456789 Username = Password = ;Baud = 460800 ;Baud = 115200 Baud = 57600 slmodem-2.9.11-20110321/README0000644000175000000620000001613011150026505013634 0ustar marvstaffSmart Link Ltd. http://www.smlink.com Sep 30, 2003 Smart Link Soft Modem for Linux ------------------------------- Introduction ============ This is Smart Link Soft Modem for Linux version 2.9. It provides full-featured 56K Voice Fax Modem. This is implemented as generic application (slmodemd) and set of hardware specific kernel-space drivers (slamr, slusb). ALSA modem drivers may be used instead of proprietary ones (see ALSA mode). Features ======== Modem: V.92, V.90, V.34, V.32bis, V.32, V.23, V.22, V.21, Bell 103/212. Flow control: V.42. Compression: V.44, V.42bis. Fax: Class 1. Voice: V253 like modem. Multiple modems are supported. Supported Hardware ================== HAMR5600 based AMR/CNR/MDC/ACR modem cards on the following Southbridge chips: - Intel ICH0,ICH2, ICH3, ICH4 - Via 686A, 686B, 8231, 8233 - SiS 630 - ALI 1535. SmartPCI56/561/562/563 based PCI modem cards. SmartUSB56 based USB modem. Requirements ============ CPU: Intel Pentium II, Celron. AMD K6, Cyrix 500MHz or higher. Memory: 64MB. OS: Linux 2.4. You need the kernel header files at least (or full kernel source tree) installed and configured. Linux 2.6. You need the full kernel source tree installed and configured. Note: Most Linux Distributions have 'ready to use' kernel source package - be sure that this is installed. Installation ============ 1. Unpack tar.gz package file: $ gzip -dc slmodem-2.9.X.tar.gz | tar xf - 2. 'cd' to package directory: $ cd slmodem-2.9.X 3. Review and edit 'Makefile' (if need): In many cases you will need to correct path to your local kernel source tree: KERNEL_DIR=/path/to/linux Default KERNEL_DIR is '/lib/modules//build'. Many Linux Distributions use directory '/usr/src/linux-' also. Note: If you are using Linux kernel 2.4, only header files should be available for build in $(KERNEL_DIR)/include Another way to pass right value KERNEL_DIR is to use command line parameter while running 'make': $ make KERNEL_DIR=/path/to/linux ... 4. Run 'make' command to compile package: $ make 5. Install. As 'root' user run: # make install It will install: - application 'slmodemd' under '/usr/sbin' directory - hardware specific drivers (kernel modules) 'slamr' and 'slusb' under conventional kernel modules directory - character device nodes '/dev/slamr0-3' with major number 212 (for pci modems) and '/dev/slusb0-3' with major number 213 (for usb modems). - config modules for autoloading (by editing file '/etc/modules.conf') (only with 2.4 kernels) 6. Config modem country. Use AT+GCI= command to setup country. Also you can setup default modem country by passing command line parameter '--country=MY_COUNTRY' to program 'slmodemd'. See output of 'slmodemd --countrylist' for a list of supported country names and T.35 country codes (see also 'slmodemd --help'). Note: Command ATI7 shows currently installed country setting. 8. Uninstallation. In package directory just type: # make uninstall Getting Started =============== After successful installation and configuration: 1. Load modem driver. Load your modem hardware specific kernel module: # modprobe slamr if you are using AMR/CNR/PCI modem, or # modprobe slusb if you are using SmartUSB56 Modem. Note: this will be done automatically when modules were configured for 'loading on demand' Note: this is safe to load both 'slamr' and 'slusb' modules. 2. Run soft modem application. # /usr/sbin/slmodemd [options] Where device name is appropriate device node for your modem (look at output of 'dmesg' command). Run '/usr/sbin/slmodemd --help' for details. Examples: # /usr/sbin/slmodemd --country=USA /dev/slamr0 , or for SmartUSB56 Modems: # /usr/sbin/slmodemd --country=ITALY /dev/slusb0 3. Using the modem. When 'slmodemd' is running this creates PTY (pseudo-terminal) to emulate modem port device, also this creates symbolic link like '/dev/ttySL0' (shown at startup). Config your application to use this link '/dev/ttySL0' (or PTY node itself) as modem port. Note: Some application want 'to know' that they are working with pseudo-terminal and may require additional configurations. Known application notes: - 'wvdial' requires option 'Carrier Check = no' in config file - some versions of 'kppp' may not work properly with devices named like '/dev/ttySL0'. To workaround this you may create symbolic link '/dev/modem' ( # ln -s /dev/ttySL0 /dev/modem ) and use this link as modem device with 'kppp' - some pci modem devices are declared as COMMUNICATION_MODEM class and might be caught by other standard drivers - you will see "grabbed by another driver" warning in dmesg buffer. There is no good way to "release" it, but as silly workaround you may use 'ungrab-winmodem' pseudo-driver from http://linmodems.technion.ac.il/packages/smartlink. Note that you should load it before 'slamr' module. 4. Startup automation. There are examples of startup scripts in 'scripts' directory. ALSA mode ========= ALSA has the built-in modem drivers included in 'alsa-driver' >= 1.0.2 and in Linux kernel >= 2.6.5. Currently there is 'intel8x0m' (snd-intel8x0m) modem driver, which supports ICH based AC97 modems (MC97). Recent 'alsa-driver' (>=1.0.8) has also support for NVidia NForce, SiS 630 (snd-intel8x0m), VIA686 (snd-via82xx-modem) and ATI IXP (snd-atiixp-modem) based modems. 1. Configure your kernel and enable ALSA and ICH based modem support ( 'Device Drivers' -> 'Sound' -> 'Advanced Linux Sound Architecture' -> 'PCI devices' -> 'Intel i8x0/MX440; AMD768/8111 modems' ) . 2. Build and install kernel and modules as usual (make , make modules_install, etc.). ICH modem driver modem module name is 'snd-intel8x0m' (if was configured as module). 3. Build application 'slmodemd' with ALSA support. For this in slmodem-2.9.x dir: $ cd modem $ make SUPPORT_ALSA=1 This will build 'slmodemd' with ALSA support. If compilation is failed review Makefile (near ALSA_SUPPORT condition) and define right library and/or CFLAGS . Note: For above you need ALSA library and header files installed. 4. Use option '--alsa' when running 'slmodemd' and ALSA conventional device name ('hw:0' or 'hw:1' for instance). If modem support in the kernel was enabled as module module 'snd-intel8x0m' should be loaded. Note: Recent version of 'alsa-lib' (>= 1.0.6) has built-in "modem" device name support ('modem:0', 'modem:1', etc). It is recommended to use those names with modems (mandatory with ATI IXP modems). Note: When using ALSA modem driver you don't need to load other modules ('slamr'). Feedback ======== This software has been originaly created and distributed by Smart Link. However, Smart Link stopped supported them and apparently left the modem business. See http://www.smlink.com/smlink.asp for further information and contact data. --- File modified by Eduard Bloch , 2006 slmodem-2.9.11-20110321/Makefile0000644000175000000620000000245110773430100014415 0ustar marvstaff########################################################################### # # # Makefile -- modem Makefile. # # Copyright(c) 2003, Smart Link Ltd. (www.smlink.com) # All rights reserved. # # Author: Sasha K (sashak@smlink.com) # # ########################################################################### # ########################################################################### KERNEL_DIR:=/lib/modules/$(shell uname -r)/build # tools INSTALL:=install all: modem modem: $(MAKE) -C $@ all install: all ifndef SUPPORT_ALSA all: drivers install: install-drivers uninstall: uninstall-drivers endif install: $(INSTALL) -D -m 755 modem/slmodemd ${DESTDIR}/usr/sbin/slmodemd $(RM) -rf ${DESTDIR}/var/lib/slmodem $(INSTALL) -d -D -m 755 ${DESTDIR}/var/lib/slmodem uninstall:uninstall-drivers $(RM) ${DESTDIR}/usr/sbin/slmodemd $(RM) -rf ${DESTDIR}/var/lib/slmodem drivers: $(MAKE) -C drivers KERNEL_DIR=$(KERNEL_DIR) install-drivers: drivers $(MAKE) install -C drivers KERNEL_DIR=$(KERNEL_DIR) uninstall-drivers: $(MAKE) uninstall -C drivers KERNEL_DIR=$(KERNEL_DIR) # misc rules sub-dirs:= modem drivers .PHONY: $(sub-dirs) all old clean dep install clean dep: %: %-sub-dirs %-sub-dirs: $(foreach dir,$(sub-dirs),$(MAKE) -C $(dir) $(patsubst %-sub-dirs,%,$@) && ) echo "done."